'use strict'; const path = require('path'); const fs = require('fs'); const RELEASES_DIR = path.join(__dirname, '../public/releases'); const MANIFEST_FILE = path.join(RELEASES_DIR, 'releases-manifest.json'); function semverCompare(a, b) { const aParts = (a || '0').split('.').map(Number); const bParts = (b || '0').split('.').map(Number); for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) { const diff = (bParts[i] || 0) - (aParts[i] || 0); // descending: highest first if (diff !== 0) return diff; } return 0; } module.exports = function (app) { const router = require('express').Router(); /** * GET /api/releases * Returns the sorted list of release entries (no markdown content). * Sorted by `ver` descending — highest version first (latest). */ router.get('/', (req, res) => { fs.readFile(MANIFEST_FILE, 'utf8', (err, data) => { if (err) { return res.status(500).json({ error: 'Could not read releases manifest.' }); } let manifest; try { manifest = JSON.parse(data); } catch (parseErr) { return res.status(500).json({ error: 'Releases manifest is malformed.' }); } const revisions = (manifest && Array.isArray(manifest.revisions)) ? manifest.revisions : []; const sorted = [...revisions].sort((a, b) => semverCompare(a.ver, b.ver)); res.json(sorted); }); }); app.use('/api/releases', router); };