diff --git a/.gitignore b/.gitignore index f5c6eb666..4f7233c47 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,4 @@ CLAUDE.md .gemini/* docs_old +apps/docs/package-lock.json diff --git a/apps/docs/scripts/fetch-remote-content.mjs b/apps/docs/scripts/fetch-remote-content.mjs index 1c7d67639..329fb00f5 100644 --- a/apps/docs/scripts/fetch-remote-content.mjs +++ b/apps/docs/scripts/fetch-remote-content.mjs @@ -108,7 +108,10 @@ export function filterVersions(tags) { const valid = semver.valid(v); if (!valid) return false; // Strict cutoff: Do not fetch or build anything older (including that version) - return semver.gt(v, CUTOFF); + const isAboveCutoff = semver.gt(v, CUTOFF); + if (!isAboveCutoff) return false; + + return semver.prerelease(v) === null; }) .sort((a, b) => semver.rcompare(a, b)); diff --git a/apps/docs/scripts/fetch-remote-content.test.mjs b/apps/docs/scripts/fetch-remote-content.test.mjs index fc0bb2810..b77da3d97 100644 --- a/apps/docs/scripts/fetch-remote-content.test.mjs +++ b/apps/docs/scripts/fetch-remote-content.test.mjs @@ -128,22 +128,34 @@ describe('fetch-remote-content', () => { const { filterVersions } = await import('./fetch-remote-content.mjs'); const tags = [ { name: 'v4.9.0' }, - { name: 'v4.10.0' }, // Matches cutoff strictly > 4.10.0? No, gt is strict. + { name: 'v4.10.0' }, // Equal to cutoff — excluded (gt is strict) { name: 'v4.11.0' }, - { name: 'v5.0.0-alpha' }, { name: 'invalid' } ]; const result = filterVersions(tags); - // Expect only v4.11.0 and v5.0.0-alpha, but slice(0, 3) logic applies - // If gt(4.10.0), then 4.10.0 is excluded. - // sort is rcompare (descending). - // 5.0.0-alpha, 4.11.0 - assert.ok(result.includes('v4.11.0')); assert.ok(!result.includes('v4.10.0')); assert.ok(!result.includes('v4.9.0')); }); + + test('excludes prerelease tags', async () => { + const { filterVersions } = await import('./fetch-remote-content.mjs'); + const tags = [ + { name: 'v5.0.0' }, + { name: 'v5.0.0-alpha' }, + { name: 'v5.0.0-beta.1' }, + { name: 'v4.11.0-rc.1' }, + { name: 'v4.11.0' }, + ]; + + const result = filterVersions(tags); + assert.ok(result.includes('v5.0.0'), 'stable release should be included'); + assert.ok(result.includes('v4.11.0'), 'stable release should be included'); + assert.ok(!result.includes('v5.0.0-alpha'), 'alpha prerelease should be excluded'); + assert.ok(!result.includes('v5.0.0-beta.1'), 'beta prerelease should be excluded'); + assert.ok(!result.includes('v4.11.0-rc.1'), 'rc prerelease should be excluded'); + }); }); });