From 0ff3e67568d75bfe74b6cf147b5610fe8827f513 Mon Sep 17 00:00:00 2001 From: JB Date: Sat, 19 Sep 2026 09:57:24 -0400 Subject: [PATCH] fix(reference): rebuild pre-index artifacts --- src/lib/server/reference/compiler.ts | 2 +- tests/reference.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/server/reference/compiler.ts b/src/lib/server/reference/compiler.ts index 8401ad3..e505dd1 100644 --- a/src/lib/server/reference/compiler.ts +++ b/src/lib/server/reference/compiler.ts @@ -26,7 +26,7 @@ export const MANIFEST_FILE = 'manifest.json'; export const DATABASE_DIRECTORY = 'databases'; export const CACHE_DIRECTORY = 'sources'; export const LOCK_DIRECTORY = '.reference-build.lock'; -const DEFAULT_IMPORTER_VERSION = `reference-compiler/${SCHEMA_VERSION}-5`; +const DEFAULT_IMPORTER_VERSION = `reference-compiler/${SCHEMA_VERSION}-6`; const emptyManifest = (): ReferenceManifest => ({ format: 1, sources: {} }); const iso = (date: Date): string => date.toISOString(); diff --git a/tests/reference.test.ts b/tests/reference.test.ts index d89ae47..4f18a1d 100644 --- a/tests/reference.test.ts +++ b/tests/reference.test.ts @@ -321,6 +321,28 @@ describe('fixture reference compiler', () => { } finally { await rm(root, { recursive: true, force: true }); } }); + test('rebuilds a prior 3-5 artifact missing the verified-station index', async () => { + const { root, sources } = await fixtureDirectory(); + const directory = join(root, 'reference'); + try { + const first = await new ReferenceCompiler({ directory, profile: 'fixture', importerVersion: 'reference-compiler/3-5', sources: fixtureSources(sources) }).compile(); + expect(first.status).toBe('success'); + if (first.status !== 'success' || !first.version) throw new Error('initial fixture build did not publish a version'); + const databasePath = join(directory, 'databases', `${first.version}.sqlite`); + const malformed = new Database(databasePath); + malformed.run('DROP INDEX stations_source_verified_idx'); + malformed.close(); + const rebuilt = await new ReferenceCompiler({ directory, profile: 'fixture', sources: fixtureSources(sources) }).compile(); + expect(rebuilt.status).toBe('success'); + expect(rebuilt.status).not.toBe('noop'); + const rebuiltManifest = await readReferenceManifest(directory); + expect(rebuiltManifest.active?.importerVersion).toBe('reference-compiler/3-6'); + const rebuiltDb = new Database(join(directory, 'databases', `${rebuiltManifest.active!.version}.sqlite`), { readonly: true }); + try { expect(rebuiltDb.query<{ n: number }, []>("SELECT COUNT(*) AS n FROM sqlite_master WHERE type='index' AND name='stations_source_verified_idx'").get()?.n).toBe(1); } + finally { rebuiltDb.close(); } + } finally { await rm(root, { recursive: true, force: true }); } + }); + test('rejects incomplete PREVIOUS count metadata before rollback', async () => { const { root, sources } = await fixtureDirectory(); const directory = join(root, 'reference');