Convert the app's main and preload source from .js to .ts (git mv preserves history), adding types where they carry value: the core-consumption seam (BuildIndexOptions/BuildIndexResult, FileInfo), the indexer service/worker factories, and the preload IPC bridge. Module-to-module specifiers use the real .ts extension (mirroring scripts/, since Node type-stripping does not rewrite .js->.ts); the worker's runtime path stays indexer-worker.js because that is the built output. Toolchain: - Add app/tsconfig.json: strict but noImplicitAny:false (the app orchestrates the already-strict core; annotating every SQLite-handle helper is low-value churn) + allowImportingTsExtensions (safe under noEmit). - Add @types/better-sqlite3 for the injected binding. - electron.vite.config.ts inputs -> .ts; refresh the stale CommonJS comment. - typecheck script runs root + app projects. Root tsconfig excludes the app-importing tests (app-*.test.mjs, recap-capture-query.test.mjs) so the lenient app files are not dragged into the strict root program; the app source is covered by app/tsconfig.json instead. See docs/adr/0005. Verified: npm run typecheck (root + app) clean; suite 121/121; electron-vite build emits all 6 main entries + preload with no .ts/node:sqlite residue in the bundles. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
29 lines
943 B
JavaScript
29 lines
943 B
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { createRequire } from 'node:module';
|
|
|
|
const require = createRequire(import.meta.url);
|
|
import { buildRecapExportQuery, cleanRecapFilename } from '../app/src/main/recap-capture-query.ts';
|
|
|
|
test('recap export query includes the selected recap filename', () => {
|
|
const query = buildRecapExportQuery({
|
|
cardIdx: 3,
|
|
archetype: 'shipper',
|
|
filename: 'recap-2026-06.json',
|
|
});
|
|
|
|
assert.equal(query, 'card=3&arch=shipper&file=recap-2026-06.json');
|
|
});
|
|
|
|
test('recap export query strips paths before passing filename to renderer', () => {
|
|
assert.equal(cleanRecapFilename('/tmp/recap-2026-W24.json'), 'recap-2026-W24.json');
|
|
assert.equal(
|
|
buildRecapExportQuery({
|
|
cardIdx: '2',
|
|
archetype: 'architect',
|
|
filename: '/Users/dev/.obelisk/recap/recap-2026-W24.json',
|
|
}),
|
|
'card=2&arch=architect&file=recap-2026-W24.json',
|
|
);
|
|
});
|