diff --git a/apps/server/package.json b/apps/server/package.json index 546a2c3b68..a6ffd53b8b 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -44,6 +44,6 @@ "vitest": "catalog:" }, "engines": { - "node": "^22.13 || ^23.4 || >=24.10" + "node": "^22.16 || ^23.11 || >=24.10" } } diff --git a/apps/server/src/persistence/NodeSqliteClient.ts b/apps/server/src/persistence/NodeSqliteClient.ts index b121764fcc..1d6e22d9b0 100644 --- a/apps/server/src/persistence/NodeSqliteClient.ts +++ b/apps/server/src/persistence/NodeSqliteClient.ts @@ -50,11 +50,35 @@ export interface SqliteMemoryClientConfig extends Omit< "filename" | "readonly" > {} +/** + * Verify that the current Node.js version includes the `node:sqlite` APIs + * used by `NodeSqliteClient` — specifically `StatementSync.columns()` (added + * in Node 22.16.0 / 23.11.0). + * + * @see https://github.com/nodejs/node/pull/57490 + */ +const checkNodeSqliteCompat = () => { + const parts = process.versions.node.split(".").map(Number); + const major = parts[0] ?? 0; + const minor = parts[1] ?? 0; + const supported = (major === 22 && minor >= 16) || (major === 23 && minor >= 11) || major >= 24; + + if (!supported) { + return Effect.die( + `Node.js ${process.versions.node} is missing required node:sqlite APIs ` + + `(StatementSync.columns). Upgrade to Node.js >=22.16, >=23.11, or >=24.`, + ); + } + return Effect.void; +}; + const makeWithDatabase = ( options: SqliteClientConfig, openDatabase: () => DatabaseSync, ): Effect.Effect => Effect.gen(function* () { + yield* checkNodeSqliteCompat(); + const compiler = Statement.makeCompilerSqlite(options.transformQueryNames); const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array