87 lines
2.3 KiB
JavaScript
87 lines
2.3 KiB
JavaScript
import { NextResponse } from 'next/server';
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
|
|
// Get current version
|
|
function getCurrentVersion() {
|
|
try {
|
|
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
return packageJson.version;
|
|
} catch (error) {
|
|
console.error('Failed to read version from package.json:', String(error));
|
|
return '1.0.0';
|
|
}
|
|
}
|
|
|
|
// Get latest version from GitHub
|
|
async function getLatestVersion() {
|
|
try {
|
|
const owner = 'ConardLi';
|
|
const repo = 'easy-dataset';
|
|
const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases/latest`);
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`GitHub API request failed: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
return data.tag_name.replace('v', '');
|
|
} catch (error) {
|
|
console.error('Failed to fetch latest version:', String(error));
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Check for updates
|
|
export async function GET() {
|
|
try {
|
|
const currentVersion = getCurrentVersion();
|
|
const latestVersion = await getLatestVersion();
|
|
|
|
if (!latestVersion) {
|
|
return NextResponse.json({
|
|
hasUpdate: false,
|
|
currentVersion,
|
|
latestVersion: null,
|
|
error: 'Failed to fetch latest version'
|
|
});
|
|
}
|
|
|
|
// Simple semver-like comparison
|
|
const hasUpdate = compareVersions(latestVersion, currentVersion) > 0;
|
|
|
|
return NextResponse.json({
|
|
hasUpdate,
|
|
currentVersion,
|
|
latestVersion,
|
|
releaseUrl: hasUpdate ? `https://github.com/ConardLi/easy-dataset/releases/tag/v${latestVersion}` : null
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to check for updates:', String(error));
|
|
return NextResponse.json(
|
|
{
|
|
hasUpdate: false,
|
|
error: 'Failed to check for updates'
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// Simple version comparison
|
|
function compareVersions(a, b) {
|
|
const partsA = a.split('.').map(Number);
|
|
const partsB = b.split('.').map(Number);
|
|
|
|
for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
|
|
const numA = i < partsA.length ? partsA[i] : 0;
|
|
const numB = i < partsB.length ? partsB[i] : 0;
|
|
|
|
if (numA > numB) return 1;
|
|
if (numA < numB) return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|