diff --git a/docs/screenshots/issue-1257/sqlite-import-after.png b/docs/screenshots/issue-1257/sqlite-import-after.png new file mode 100644 index 0000000000..d78c14186d Binary files /dev/null and b/docs/screenshots/issue-1257/sqlite-import-after.png differ diff --git a/packages/storage/src/__tests__/package-import.test.ts b/packages/storage/src/__tests__/package-import.test.ts new file mode 100644 index 0000000000..d47f130bb6 --- /dev/null +++ b/packages/storage/src/__tests__/package-import.test.ts @@ -0,0 +1,15 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { test } from 'node:test'; + +test('top-level package import does not initialize node:sqlite', () => { + const packageEntry = new URL('../index.js', import.meta.url).href; + const result = spawnSync( + process.execPath, + ['--input-type=module', '--eval', `await import(${JSON.stringify(packageEntry)})`], + { encoding: 'utf8' }, + ); + + assert.equal(result.status, 0, result.stderr); + assert.equal(result.stderr, ''); +}); diff --git a/packages/storage/src/sqlite-runtime-store.ts b/packages/storage/src/sqlite-runtime-store.ts index 7a71758131..38a5e5c96b 100644 --- a/packages/storage/src/sqlite-runtime-store.ts +++ b/packages/storage/src/sqlite-runtime-store.ts @@ -1,7 +1,8 @@ import { createHash } from 'node:crypto'; import { mkdirSync } from 'node:fs'; +import { createRequire } from 'node:module'; import { dirname } from 'node:path'; -import { DatabaseSync } from 'node:sqlite'; +import type { DatabaseSync } from 'node:sqlite'; import { isDeepStrictEqual } from 'node:util'; import { isPartialRuntimeEvent, @@ -20,6 +21,12 @@ export { SQLITE_RUNTIME_SCHEMA_VERSION } from './sqlite-runtime-schema.js'; export type { ToolRecoveryMode } from '@maka/core'; +const require = createRequire(import.meta.url); + +function loadDatabaseSync(): typeof import('node:sqlite').DatabaseSync { + return (require('node:sqlite') as typeof import('node:sqlite')).DatabaseSync; +} + export type ToolJournalState = 'prepared' | 'outcome_committed'; export type SqliteRuntimeStoreFailpoint = @@ -113,6 +120,7 @@ export class SqliteRuntimeStore implements RuntimeEventStore { private readonly options: SqliteRuntimeStoreOptions = {}, ) { if (path !== ':memory:') mkdirSync(dirname(path), { recursive: true }); + const DatabaseSync = loadDatabaseSync(); this.db = new DatabaseSync(path); configureSqliteRuntimeDatabase(this.db); migrateSqliteRuntimeDatabase(this.db);