diff --git a/scripts/build-milestones.js b/scripts/build-milestones.js index 561ce12..a4fbf96 100644 --- a/scripts/build-milestones.js +++ b/scripts/build-milestones.js @@ -63,8 +63,20 @@ milestones.forEach((m, i) => { console.error(`ERROR: milestone[${i}] (id="${m.id}") reference must be a string URL.`); process.exit(1); } + + if (m.extinctionMarker !== undefined && m.extinctionMarker !== true) { + console.error(`ERROR: milestone[${i}] (id="${m.id}") extinctionMarker must be true if set.`); + process.exit(1); + } }); +const extinctionMarkers = milestones.filter((m) => m.extinctionMarker === true); +if (extinctionMarkers.length > 1) { + const ids = extinctionMarkers.map((m) => `"${m.id}"`).join(', '); + console.error(`ERROR: exactly one milestone may have extinctionMarker: true, but found ${extinctionMarkers.length}: ${ids}`); + process.exit(1); +} + // ── Generate JS ─────────────────────────────────────────────────────────────── function jsString(s) { // Emit as a template-literal-safe single-quoted JS string. diff --git a/tests/death-clock.test.js b/tests/death-clock.test.js index 5cee049..3ab889e 100644 --- a/tests/death-clock.test.js +++ b/tests/death-clock.test.js @@ -447,6 +447,11 @@ describe('Constants', () => { } }); + test('at most one milestone has extinctionMarker: true', () => { + const marked = MILESTONES.filter((m) => m.extinctionMarker === true); + expect(marked.length).toBeLessThanOrEqual(1); + }); + test('HISTORICAL_DATA is a non-empty array', () => { expect(Array.isArray(HISTORICAL_DATA)).toBe(true); expect(HISTORICAL_DATA.length).toBeGreaterThan(0);