@prisma-next/driver-sqlite 0.5.0-dev.65 → 0.5.0-dev.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +4 -5
- package/dist/control.mjs.map +1 -1
- package/dist/{descriptor-meta-DJTTyPb-.mjs → descriptor-meta-BN3Vu2l_.mjs} +2 -4
- package/dist/descriptor-meta-BN3Vu2l_.mjs.map +1 -0
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +3 -6
- package/dist/runtime.mjs.map +1 -1
- package/package.json +11 -11
- package/dist/descriptor-meta-DJTTyPb-.mjs.map +0 -1
package/dist/control.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-driver.ts"],"
|
|
1
|
+
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-driver.ts"],"mappings":";;;;cAUa,mBAAA,YAA+B,qBAAA;EAAA,iBAIb,EAAA;EAAA,SAHpB,QAAA;EAAA,SACA,QAAA;cAEoB,EAAA,EAAI,YAAA;EAE3B,KAAA,OAAY,MAAA,kBAAA,CAChB,GAAA,UACA,MAAA,wBACC,OAAA;IAAA,SAAmB,IAAA,EAAM,GAAA;EAAA;EAUtB,KAAA,CAAA,GAAS,OAAA;AAAA;AAAA,cAKX,sBAAA,EAAwB,uBAAA,kBAAyC,mBAAA"}
|
package/dist/control.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as normalizeSqliteError, t as sqliteDriverDescriptorMeta } from "./descriptor-meta-
|
|
1
|
+
import { n as normalizeSqliteError, t as sqliteDriverDescriptorMeta } from "./descriptor-meta-BN3Vu2l_.mjs";
|
|
2
2
|
import { DatabaseSync } from "node:sqlite";
|
|
3
3
|
import { errorRuntime } from "@prisma-next/errors/execution";
|
|
4
|
-
|
|
5
4
|
//#region src/core/control-driver.ts
|
|
6
5
|
var SqliteControlDriver = class {
|
|
6
|
+
db;
|
|
7
7
|
familyId = "sql";
|
|
8
8
|
targetId = "sqlite";
|
|
9
9
|
constructor(db) {
|
|
@@ -36,8 +36,7 @@ const sqliteDriverDescriptor = {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
-
var control_driver_default = sqliteDriverDescriptor;
|
|
40
|
-
|
|
41
39
|
//#endregion
|
|
42
|
-
export { SqliteControlDriver,
|
|
40
|
+
export { SqliteControlDriver, sqliteDriverDescriptor as default };
|
|
41
|
+
|
|
43
42
|
//# sourceMappingURL=control.mjs.map
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":[
|
|
1
|
+
{"version":3,"file":"control.mjs","names":[],"sources":["../src/core/control-driver.ts"],"sourcesContent":["import type { SQLInputValue } from 'node:sqlite';\nimport { DatabaseSync } from 'node:sqlite';\nimport { errorRuntime } from '@prisma-next/errors/execution';\nimport type {\n ControlDriverDescriptor,\n ControlDriverInstance,\n} from '@prisma-next/framework-components/control';\nimport { normalizeSqliteError } from '../normalize-error';\nimport { sqliteDriverDescriptorMeta } from './descriptor-meta';\n\nexport class SqliteControlDriver implements ControlDriverInstance<'sql', 'sqlite'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n constructor(private readonly db: DatabaseSync) {}\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<{ readonly rows: Row[] }> {\n try {\n const stmt = this.db.prepare(sql);\n const rows = stmt.all(...((params ?? []) as SQLInputValue[])) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n}\n\nconst sqliteDriverDescriptor: ControlDriverDescriptor<'sql', 'sqlite', SqliteControlDriver> = {\n ...sqliteDriverDescriptorMeta,\n async create(pathOrMemory: string): Promise<SqliteControlDriver> {\n try {\n const db = new DatabaseSync(pathOrMemory);\n db.exec('PRAGMA foreign_keys = ON');\n return new SqliteControlDriver(db);\n } catch (error) {\n throw errorRuntime('Database connection failed', {\n why: error instanceof Error ? error.message : String(error),\n fix: 'Verify the database file path exists and is accessible',\n meta: {\n path: pathOrMemory,\n },\n });\n }\n },\n};\n\nexport default sqliteDriverDescriptor;\n"],"mappings":";;;;AAUA,IAAa,sBAAb,MAAmF;CAIpD;CAH7B,WAAoB;CACpB,WAAoB;CAEpB,YAAY,IAAmC;EAAlB,KAAA,KAAA;;CAE7B,MAAM,MACJ,KACA,QACmC;EACnC,IAAI;GAGF,OAAO,EAAE,MAFI,KAAK,GAAG,QAAQ,IACZ,CAAC,IAAI,GAAK,UAAU,EAAE,CAC1B,EAAE;WACR,OAAO;GACd,MAAM,qBAAqB,MAAM;;;CAIrC,MAAM,QAAuB;EAC3B,KAAK,GAAG,OAAO;;;AAInB,MAAM,yBAAwF;CAC5F,GAAG;CACH,MAAM,OAAO,cAAoD;EAC/D,IAAI;GACF,MAAM,KAAK,IAAI,aAAa,aAAa;GACzC,GAAG,KAAK,2BAA2B;GACnC,OAAO,IAAI,oBAAoB,GAAG;WAC3B,OAAO;GACd,MAAM,aAAa,8BAA8B;IAC/C,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC3D,KAAK;IACL,MAAM,EACJ,MAAM,cACP;IACF,CAAC;;;CAGP"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SqlConnectionError, SqlQueryError } from "@prisma-next/sql-errors";
|
|
2
|
-
|
|
3
2
|
//#region src/normalize-error.ts
|
|
4
3
|
const SQLITE_CONSTRAINT_BASE = 19;
|
|
5
4
|
const SQLITE_CONSTRAINT_UNIQUE = 2067;
|
|
@@ -57,7 +56,6 @@ function normalizeSqliteError(error) {
|
|
|
57
56
|
});
|
|
58
57
|
return error;
|
|
59
58
|
}
|
|
60
|
-
|
|
61
59
|
//#endregion
|
|
62
60
|
//#region src/core/descriptor-meta.ts
|
|
63
61
|
const sqliteDriverDescriptorMeta = {
|
|
@@ -68,7 +66,7 @@ const sqliteDriverDescriptorMeta = {
|
|
|
68
66
|
version: "0.0.1",
|
|
69
67
|
capabilities: {}
|
|
70
68
|
};
|
|
71
|
-
|
|
72
69
|
//#endregion
|
|
73
70
|
export { normalizeSqliteError as n, sqliteDriverDescriptorMeta as t };
|
|
74
|
-
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=descriptor-meta-BN3Vu2l_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-meta-BN3Vu2l_.mjs","names":["sqliteErr"],"sources":["../src/normalize-error.ts","../src/core/descriptor-meta.ts"],"sourcesContent":["import { SqlConnectionError, SqlQueryError } from '@prisma-next/sql-errors';\n\ninterface SqliteError extends Error {\n readonly code?: string;\n readonly errcode?: number;\n readonly errstr?: string;\n}\n\n// SQLite extended error code ranges (base code * 256 + extended)\n// Base code 19 = SQLITE_CONSTRAINT\nconst SQLITE_CONSTRAINT_BASE = 19;\nconst SQLITE_CONSTRAINT_UNIQUE = 2067; // 19 + 8*256\nconst SQLITE_CONSTRAINT_PRIMARYKEY = 1555; // 19 + 6*256\nconst SQLITE_CONSTRAINT_FOREIGNKEY = 787; // 19 + 3*256\nconst SQLITE_CONSTRAINT_NOTNULL = 1299; // 19 + 5*256\nconst SQLITE_CONSTRAINT_CHECK = 275; // 19 + 1*256\n\n// Base code 5 = SQLITE_BUSY\nconst SQLITE_BUSY = 5;\n// Base code 6 = SQLITE_LOCKED\nconst SQLITE_LOCKED = 6;\n\nfunction isConstraintError(errcode: number): boolean {\n return (errcode & 0xff) === SQLITE_CONSTRAINT_BASE;\n}\n\nfunction isBusyOrLocked(errcode: number): boolean {\n const base = errcode & 0xff;\n return base === SQLITE_BUSY || base === SQLITE_LOCKED;\n}\n\nexport function isSqliteError(error: unknown): error is SqliteError {\n if (!(error instanceof Error)) {\n return false;\n }\n return (error as SqliteError).code === 'ERR_SQLITE_ERROR';\n}\n\nfunction constraintNameFromMessage(message: string): string | undefined {\n // SQLite constraint messages follow patterns like:\n // \"UNIQUE constraint failed: table.column\"\n // \"FOREIGN KEY constraint failed\"\n // \"NOT NULL constraint failed: table.column\"\n const match = /constraint failed: (.+)/.exec(message);\n return match?.[1];\n}\n\nfunction mapErrCodeToSqlState(errcode: number): string {\n switch (errcode) {\n case SQLITE_CONSTRAINT_UNIQUE:\n case SQLITE_CONSTRAINT_PRIMARYKEY:\n return '23505'; // unique_violation\n case SQLITE_CONSTRAINT_FOREIGNKEY:\n return '23503'; // foreign_key_violation\n case SQLITE_CONSTRAINT_NOTNULL:\n return '23502'; // not_null_violation\n case SQLITE_CONSTRAINT_CHECK:\n return '23514'; // check_violation\n default:\n if (isConstraintError(errcode)) {\n return '23000'; // integrity_constraint_violation\n }\n return 'HY000'; // general error\n }\n}\n\nexport function normalizeSqliteError(error: unknown): SqlQueryError | SqlConnectionError | Error {\n if (!(error instanceof Error)) {\n return new Error(String(error));\n }\n\n if (isSqliteError(error)) {\n const sqliteErr = error as SqliteError;\n const errcode = sqliteErr.errcode ?? 0;\n\n if (isBusyOrLocked(errcode)) {\n return new SqlConnectionError(error.message, {\n cause: error,\n transient: true,\n });\n }\n\n const sqlState = mapErrCodeToSqlState(errcode);\n const constraint = constraintNameFromMessage(error.message);\n\n return new SqlQueryError(error.message, {\n cause: error,\n sqlState,\n ...(constraint !== undefined ? { constraint } : {}),\n });\n }\n\n // Connection-related Node.js errors\n if (\n error.message.includes('database is locked') ||\n error.message.includes('unable to open database')\n ) {\n return new SqlConnectionError(error.message, {\n cause: error,\n transient: false,\n });\n }\n\n return error;\n}\n","export const sqliteDriverDescriptorMeta = {\n kind: 'driver',\n familyId: 'sql',\n targetId: 'sqlite',\n id: 'sqlite',\n version: '0.0.1',\n capabilities: {},\n} as const;\n"],"mappings":";;AAUA,MAAM,yBAAyB;AAC/B,MAAM,2BAA2B;AACjC,MAAM,+BAA+B;AACrC,MAAM,+BAA+B;AACrC,MAAM,4BAA4B;AAClC,MAAM,0BAA0B;AAGhC,MAAM,cAAc;AAEpB,MAAM,gBAAgB;AAEtB,SAAS,kBAAkB,SAA0B;CACnD,QAAQ,UAAU,SAAU;;AAG9B,SAAS,eAAe,SAA0B;CAChD,MAAM,OAAO,UAAU;CACvB,OAAO,SAAS,eAAe,SAAS;;AAG1C,SAAgB,cAAc,OAAsC;CAClE,IAAI,EAAE,iBAAiB,QACrB,OAAO;CAET,OAAQ,MAAsB,SAAS;;AAGzC,SAAS,0BAA0B,SAAqC;CAMtE,OADc,0BAA0B,KAAK,QACjC,GAAG;;AAGjB,SAAS,qBAAqB,SAAyB;CACrD,QAAQ,SAAR;EACE,KAAK;EACL,KAAK,8BACH,OAAO;EACT,KAAK,8BACH,OAAO;EACT,KAAK,2BACH,OAAO;EACT,KAAK,yBACH,OAAO;EACT;GACE,IAAI,kBAAkB,QAAQ,EAC5B,OAAO;GAET,OAAO;;;AAIb,SAAgB,qBAAqB,OAA4D;CAC/F,IAAI,EAAE,iBAAiB,QACrB,OAAO,IAAI,MAAM,OAAO,MAAM,CAAC;CAGjC,IAAI,cAAc,MAAM,EAAE;EAExB,MAAM,UAAUA,MAAU,WAAW;EAErC,IAAI,eAAe,QAAQ,EACzB,OAAO,IAAI,mBAAmB,MAAM,SAAS;GAC3C,OAAO;GACP,WAAW;GACZ,CAAC;EAGJ,MAAM,WAAW,qBAAqB,QAAQ;EAC9C,MAAM,aAAa,0BAA0B,MAAM,QAAQ;EAE3D,OAAO,IAAI,cAAc,MAAM,SAAS;GACtC,OAAO;GACP;GACA,GAAI,eAAe,KAAA,IAAY,EAAE,YAAY,GAAG,EAAE;GACnD,CAAC;;CAIJ,IACE,MAAM,QAAQ,SAAS,qBAAqB,IAC5C,MAAM,QAAQ,SAAS,0BAA0B,EAEjD,OAAO,IAAI,mBAAmB,MAAM,SAAS;EAC3C,OAAO;EACP,WAAW;EACZ,CAAC;CAGJ,OAAO;;;;ACvGT,MAAa,6BAA6B;CACxC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EAAE;CACjB"}
|
package/dist/runtime.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"
|
|
1
|
+
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"mappings":";;;;;KAcY,aAAA;EAAA,SAA2B,IAAA;EAAA,SAAuB,IAAA;AAAA;AAAA,KAElD,mBAAA,GAAsB,qBAAA,oBAAyC,SAAA,CAAU,aAAA;;;cCV/E,6BAAA,EAA+B,uBAAA,wBAInC,mBAAA"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { n as normalizeSqliteError, t as sqliteDriverDescriptorMeta } from "./descriptor-meta-
|
|
1
|
+
import { n as normalizeSqliteError, t as sqliteDriverDescriptorMeta } from "./descriptor-meta-BN3Vu2l_.mjs";
|
|
2
2
|
import { DatabaseSync } from "node:sqlite";
|
|
3
|
-
|
|
4
3
|
//#region src/sqlite-driver.ts
|
|
5
4
|
function driverError(code, message, details) {
|
|
6
5
|
const error = new Error(message);
|
|
@@ -166,7 +165,6 @@ var SqliteDriver = class {
|
|
|
166
165
|
return this.#requireConnected().conn.query(sql, params);
|
|
167
166
|
}
|
|
168
167
|
};
|
|
169
|
-
|
|
170
168
|
//#endregion
|
|
171
169
|
//#region src/core/runtime-driver.ts
|
|
172
170
|
const sqliteRuntimeDriverDescriptor = {
|
|
@@ -175,8 +173,7 @@ const sqliteRuntimeDriverDescriptor = {
|
|
|
175
173
|
return new SqliteDriver();
|
|
176
174
|
}
|
|
177
175
|
};
|
|
178
|
-
var runtime_driver_default = sqliteRuntimeDriverDescriptor;
|
|
179
|
-
|
|
180
176
|
//#endregion
|
|
181
|
-
export {
|
|
177
|
+
export { sqliteRuntimeDriverDescriptor as default };
|
|
178
|
+
|
|
182
179
|
//# sourceMappingURL=runtime.mjs.map
|
package/dist/runtime.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":["#db","#state","#requireConnected","sqliteRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n 'sql',\n 'sqlite',\n void,\n SqliteRuntimeDriver\n>"],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"sourcesContent":["import type { SQLInputValue } from 'node:sqlite';\nimport { DatabaseSync } from 'node:sqlite';\nimport type { RuntimeDriverInstance } from '@prisma-next/framework-components/execution';\nimport type {\n SqlConnection,\n SqlDriver,\n SqlDriverState,\n SqlExecuteRequest,\n SqlExplainResult,\n SqlQueryResult,\n SqlTransaction,\n} from '@prisma-next/sql-relational-core/ast';\nimport { normalizeSqliteError } from './normalize-error';\n\nexport type SqliteBinding = { readonly kind: 'path'; readonly path: string };\n\nexport type SqliteRuntimeDriver = RuntimeDriverInstance<'sql', 'sqlite'> & SqlDriver<SqliteBinding>;\n\ninterface DriverRuntimeError extends Error {\n readonly code:\n | 'DRIVER.NOT_CONNECTED'\n | 'DRIVER.ALREADY_CONNECTED'\n | 'DRIVER.EXPLAIN_NOT_SUPPORTED';\n readonly category: 'RUNTIME';\n readonly severity: 'error';\n readonly details?: Record<string, unknown>;\n}\n\nfunction driverError(\n code: DriverRuntimeError['code'],\n message: string,\n details?: Record<string, unknown>,\n): DriverRuntimeError {\n const error = new Error(message) as DriverRuntimeError;\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'RUNTIME' as const,\n severity: 'error' as const,\n message,\n details,\n });\n}\n\nconst NOT_CONNECTED_MESSAGE =\n 'SQLite driver not connected. Call connect(binding) before acquireConnection or execute.';\nconst ALREADY_CONNECTED_MESSAGE =\n 'SQLite driver already connected. Call close() before reconnecting with a new binding.';\n\nfunction toSqliteParams(params: readonly unknown[] | undefined): SQLInputValue[] {\n return (params ?? []) as SQLInputValue[];\n}\n\nfunction openConnection(path: string): DatabaseSync {\n try {\n const db = new DatabaseSync(path);\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA busy_timeout = 5000');\n return db;\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n}\n\nexport class SqliteConnectionImpl implements SqlConnection {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async beginTransaction(): Promise<SqlTransaction> {\n try {\n this.#db.exec('BEGIN');\n return new SqliteTransactionImpl(this.#db);\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async release(): Promise<void> {\n // SQLite connections are not pooled — release is equivalent to destroy\n // (close the underlying DatabaseSync handle).\n return this.destroy();\n }\n\n async destroy(_reason?: unknown): Promise<void> {\n try {\n this.#db.close();\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\nclass SqliteTransactionImpl implements SqlTransaction {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async commit(): Promise<void> {\n try {\n this.#db.exec('COMMIT');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async rollback(): Promise<void> {\n try {\n this.#db.exec('ROLLBACK');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\ninterface ConnectedState {\n readonly kind: 'connected';\n readonly path: string;\n readonly conn: SqliteConnectionImpl;\n}\n\ntype DriverState = { readonly kind: 'unbound' } | ConnectedState | { readonly kind: 'closed' };\n\nexport class SqliteDriver implements SqliteRuntimeDriver {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n #state: DriverState;\n\n constructor(initialState?: ConnectedState) {\n this.#state = initialState ?? { kind: 'unbound' };\n }\n\n #requireConnected(): ConnectedState {\n if (this.#state.kind !== 'connected') {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n }\n return this.#state;\n }\n\n get state(): SqlDriverState {\n return this.#state.kind;\n }\n\n async connect(binding: SqliteBinding): Promise<void> {\n if (this.#state.kind === 'connected') {\n throw driverError('DRIVER.ALREADY_CONNECTED', ALREADY_CONNECTED_MESSAGE, {\n bindingKind: binding.kind,\n });\n }\n this.#state = {\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n };\n }\n\n async acquireConnection(): Promise<SqliteConnectionImpl> {\n const { path } = this.#requireConnected();\n return new SqliteConnectionImpl(openConnection(path));\n }\n\n async close(): Promise<void> {\n if (this.#state.kind !== 'connected') return;\n const { conn } = this.#state;\n this.#state = { kind: 'closed' };\n await conn.release();\n }\n\n execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n if (this.#state.kind !== 'connected') {\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n },\n };\n },\n };\n }\n return this.#state.conn.execute<Row>(request);\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n return this.#requireConnected().conn.explain(request);\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n return this.#requireConnected().conn.query<Row>(sql, params);\n }\n}\n\nexport function createBoundDriverFromBinding(binding: SqliteBinding): SqliteDriver {\n return new SqliteDriver({\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n });\n}\n","import type { RuntimeDriverDescriptor } from '@prisma-next/framework-components/execution';\nimport { SqliteDriver, type SqliteRuntimeDriver } from '../sqlite-driver';\nimport { sqliteDriverDescriptorMeta } from './descriptor-meta';\n\nexport type { SqliteRuntimeDriver } from '../sqlite-driver';\n\nconst sqliteRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n 'sql',\n 'sqlite',\n void,\n SqliteRuntimeDriver\n> = {\n ...sqliteDriverDescriptorMeta,\n create(): SqliteRuntimeDriver {\n return new SqliteDriver();\n },\n};\n\nexport default sqliteRuntimeDriverDescriptor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":["#db","#state","#requireConnected"],"sources":["../src/sqlite-driver.ts","../src/core/runtime-driver.ts"],"sourcesContent":["import type { SQLInputValue } from 'node:sqlite';\nimport { DatabaseSync } from 'node:sqlite';\nimport type { RuntimeDriverInstance } from '@prisma-next/framework-components/execution';\nimport type {\n SqlConnection,\n SqlDriver,\n SqlDriverState,\n SqlExecuteRequest,\n SqlExplainResult,\n SqlQueryResult,\n SqlTransaction,\n} from '@prisma-next/sql-relational-core/ast';\nimport { normalizeSqliteError } from './normalize-error';\n\nexport type SqliteBinding = { readonly kind: 'path'; readonly path: string };\n\nexport type SqliteRuntimeDriver = RuntimeDriverInstance<'sql', 'sqlite'> & SqlDriver<SqliteBinding>;\n\ninterface DriverRuntimeError extends Error {\n readonly code:\n | 'DRIVER.NOT_CONNECTED'\n | 'DRIVER.ALREADY_CONNECTED'\n | 'DRIVER.EXPLAIN_NOT_SUPPORTED';\n readonly category: 'RUNTIME';\n readonly severity: 'error';\n readonly details?: Record<string, unknown>;\n}\n\nfunction driverError(\n code: DriverRuntimeError['code'],\n message: string,\n details?: Record<string, unknown>,\n): DriverRuntimeError {\n const error = new Error(message) as DriverRuntimeError;\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'RUNTIME' as const,\n severity: 'error' as const,\n message,\n details,\n });\n}\n\nconst NOT_CONNECTED_MESSAGE =\n 'SQLite driver not connected. Call connect(binding) before acquireConnection or execute.';\nconst ALREADY_CONNECTED_MESSAGE =\n 'SQLite driver already connected. Call close() before reconnecting with a new binding.';\n\nfunction toSqliteParams(params: readonly unknown[] | undefined): SQLInputValue[] {\n return (params ?? []) as SQLInputValue[];\n}\n\nfunction openConnection(path: string): DatabaseSync {\n try {\n const db = new DatabaseSync(path);\n db.exec('PRAGMA foreign_keys = ON');\n db.exec('PRAGMA busy_timeout = 5000');\n return db;\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n}\n\nexport class SqliteConnectionImpl implements SqlConnection {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async beginTransaction(): Promise<SqlTransaction> {\n try {\n this.#db.exec('BEGIN');\n return new SqliteTransactionImpl(this.#db);\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async release(): Promise<void> {\n // SQLite connections are not pooled — release is equivalent to destroy\n // (close the underlying DatabaseSync handle).\n return this.destroy();\n }\n\n async destroy(_reason?: unknown): Promise<void> {\n try {\n this.#db.close();\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\nclass SqliteTransactionImpl implements SqlTransaction {\n readonly #db: DatabaseSync;\n\n constructor(db: DatabaseSync) {\n this.#db = db;\n }\n\n async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n try {\n const stmt = this.#db.prepare(request.sql);\n for (const row of stmt.iterate(...toSqliteParams(request.params))) {\n yield row as Row;\n }\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n try {\n const stmt = this.#db.prepare(`EXPLAIN QUERY PLAN ${request.sql}`);\n const rows = stmt.all(...toSqliteParams(request.params)) as ReadonlyArray<\n Record<string, unknown>\n >;\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n try {\n const stmt = this.#db.prepare(sql);\n const rows = stmt.all(...toSqliteParams(params)) as Row[];\n return { rows };\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async commit(): Promise<void> {\n try {\n this.#db.exec('COMMIT');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n\n async rollback(): Promise<void> {\n try {\n this.#db.exec('ROLLBACK');\n } catch (error) {\n throw normalizeSqliteError(error);\n }\n }\n}\n\ninterface ConnectedState {\n readonly kind: 'connected';\n readonly path: string;\n readonly conn: SqliteConnectionImpl;\n}\n\ntype DriverState = { readonly kind: 'unbound' } | ConnectedState | { readonly kind: 'closed' };\n\nexport class SqliteDriver implements SqliteRuntimeDriver {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n #state: DriverState;\n\n constructor(initialState?: ConnectedState) {\n this.#state = initialState ?? { kind: 'unbound' };\n }\n\n #requireConnected(): ConnectedState {\n if (this.#state.kind !== 'connected') {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n }\n return this.#state;\n }\n\n get state(): SqlDriverState {\n return this.#state.kind;\n }\n\n async connect(binding: SqliteBinding): Promise<void> {\n if (this.#state.kind === 'connected') {\n throw driverError('DRIVER.ALREADY_CONNECTED', ALREADY_CONNECTED_MESSAGE, {\n bindingKind: binding.kind,\n });\n }\n this.#state = {\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n };\n }\n\n async acquireConnection(): Promise<SqliteConnectionImpl> {\n const { path } = this.#requireConnected();\n return new SqliteConnectionImpl(openConnection(path));\n }\n\n async close(): Promise<void> {\n if (this.#state.kind !== 'connected') return;\n const { conn } = this.#state;\n this.#state = { kind: 'closed' };\n await conn.release();\n }\n\n execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n if (this.#state.kind !== 'connected') {\n return {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n throw driverError('DRIVER.NOT_CONNECTED', NOT_CONNECTED_MESSAGE);\n },\n };\n },\n };\n }\n return this.#state.conn.execute<Row>(request);\n }\n\n async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n return this.#requireConnected().conn.explain(request);\n }\n\n async query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<SqlQueryResult<Row>> {\n return this.#requireConnected().conn.query<Row>(sql, params);\n }\n}\n\nexport function createBoundDriverFromBinding(binding: SqliteBinding): SqliteDriver {\n return new SqliteDriver({\n kind: 'connected',\n path: binding.path,\n conn: new SqliteConnectionImpl(openConnection(binding.path)),\n });\n}\n","import type { RuntimeDriverDescriptor } from '@prisma-next/framework-components/execution';\nimport { SqliteDriver, type SqliteRuntimeDriver } from '../sqlite-driver';\nimport { sqliteDriverDescriptorMeta } from './descriptor-meta';\n\nexport type { SqliteRuntimeDriver } from '../sqlite-driver';\n\nconst sqliteRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n 'sql',\n 'sqlite',\n void,\n SqliteRuntimeDriver\n> = {\n ...sqliteDriverDescriptorMeta,\n create(): SqliteRuntimeDriver {\n return new SqliteDriver();\n },\n};\n\nexport default sqliteRuntimeDriverDescriptor;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/driver-sqlite",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.67",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/contract": "0.5.0-dev.
|
|
9
|
-
"@prisma-next/errors": "0.5.0-dev.
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/sql-
|
|
13
|
-
"@prisma-next/sql-
|
|
14
|
-
"@prisma-next/sql-
|
|
15
|
-
"@prisma-next/utils": "0.5.0-dev.
|
|
8
|
+
"@prisma-next/contract": "0.5.0-dev.67",
|
|
9
|
+
"@prisma-next/errors": "0.5.0-dev.67",
|
|
10
|
+
"@prisma-next/framework-components": "0.5.0-dev.67",
|
|
11
|
+
"@prisma-next/sql-errors": "0.5.0-dev.67",
|
|
12
|
+
"@prisma-next/sql-contract": "0.5.0-dev.67",
|
|
13
|
+
"@prisma-next/sql-relational-core": "0.5.0-dev.67",
|
|
14
|
+
"@prisma-next/sql-operations": "0.5.0-dev.67",
|
|
15
|
+
"@prisma-next/utils": "0.5.0-dev.67"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"tsdown": "0.
|
|
18
|
+
"tsdown": "0.22.0",
|
|
19
19
|
"typescript": "5.9.3",
|
|
20
|
-
"vitest": "4.
|
|
20
|
+
"vitest": "4.1.5",
|
|
21
21
|
"@prisma-next/test-utils": "0.0.1",
|
|
22
22
|
"@prisma-next/tsconfig": "0.0.0",
|
|
23
23
|
"@prisma-next/tsdown": "0.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor-meta-DJTTyPb-.mjs","names":[],"sources":["../src/normalize-error.ts","../src/core/descriptor-meta.ts"],"sourcesContent":["import { SqlConnectionError, SqlQueryError } from '@prisma-next/sql-errors';\n\ninterface SqliteError extends Error {\n readonly code?: string;\n readonly errcode?: number;\n readonly errstr?: string;\n}\n\n// SQLite extended error code ranges (base code * 256 + extended)\n// Base code 19 = SQLITE_CONSTRAINT\nconst SQLITE_CONSTRAINT_BASE = 19;\nconst SQLITE_CONSTRAINT_UNIQUE = 2067; // 19 + 8*256\nconst SQLITE_CONSTRAINT_PRIMARYKEY = 1555; // 19 + 6*256\nconst SQLITE_CONSTRAINT_FOREIGNKEY = 787; // 19 + 3*256\nconst SQLITE_CONSTRAINT_NOTNULL = 1299; // 19 + 5*256\nconst SQLITE_CONSTRAINT_CHECK = 275; // 19 + 1*256\n\n// Base code 5 = SQLITE_BUSY\nconst SQLITE_BUSY = 5;\n// Base code 6 = SQLITE_LOCKED\nconst SQLITE_LOCKED = 6;\n\nfunction isConstraintError(errcode: number): boolean {\n return (errcode & 0xff) === SQLITE_CONSTRAINT_BASE;\n}\n\nfunction isBusyOrLocked(errcode: number): boolean {\n const base = errcode & 0xff;\n return base === SQLITE_BUSY || base === SQLITE_LOCKED;\n}\n\nexport function isSqliteError(error: unknown): error is SqliteError {\n if (!(error instanceof Error)) {\n return false;\n }\n return (error as SqliteError).code === 'ERR_SQLITE_ERROR';\n}\n\nfunction constraintNameFromMessage(message: string): string | undefined {\n // SQLite constraint messages follow patterns like:\n // \"UNIQUE constraint failed: table.column\"\n // \"FOREIGN KEY constraint failed\"\n // \"NOT NULL constraint failed: table.column\"\n const match = /constraint failed: (.+)/.exec(message);\n return match?.[1];\n}\n\nfunction mapErrCodeToSqlState(errcode: number): string {\n switch (errcode) {\n case SQLITE_CONSTRAINT_UNIQUE:\n case SQLITE_CONSTRAINT_PRIMARYKEY:\n return '23505'; // unique_violation\n case SQLITE_CONSTRAINT_FOREIGNKEY:\n return '23503'; // foreign_key_violation\n case SQLITE_CONSTRAINT_NOTNULL:\n return '23502'; // not_null_violation\n case SQLITE_CONSTRAINT_CHECK:\n return '23514'; // check_violation\n default:\n if (isConstraintError(errcode)) {\n return '23000'; // integrity_constraint_violation\n }\n return 'HY000'; // general error\n }\n}\n\nexport function normalizeSqliteError(error: unknown): SqlQueryError | SqlConnectionError | Error {\n if (!(error instanceof Error)) {\n return new Error(String(error));\n }\n\n if (isSqliteError(error)) {\n const sqliteErr = error as SqliteError;\n const errcode = sqliteErr.errcode ?? 0;\n\n if (isBusyOrLocked(errcode)) {\n return new SqlConnectionError(error.message, {\n cause: error,\n transient: true,\n });\n }\n\n const sqlState = mapErrCodeToSqlState(errcode);\n const constraint = constraintNameFromMessage(error.message);\n\n return new SqlQueryError(error.message, {\n cause: error,\n sqlState,\n ...(constraint !== undefined ? { constraint } : {}),\n });\n }\n\n // Connection-related Node.js errors\n if (\n error.message.includes('database is locked') ||\n error.message.includes('unable to open database')\n ) {\n return new SqlConnectionError(error.message, {\n cause: error,\n transient: false,\n });\n }\n\n return error;\n}\n","export const sqliteDriverDescriptorMeta = {\n kind: 'driver',\n familyId: 'sql',\n targetId: 'sqlite',\n id: 'sqlite',\n version: '0.0.1',\n capabilities: {},\n} as const;\n"],"mappings":";;;AAUA,MAAM,yBAAyB;AAC/B,MAAM,2BAA2B;AACjC,MAAM,+BAA+B;AACrC,MAAM,+BAA+B;AACrC,MAAM,4BAA4B;AAClC,MAAM,0BAA0B;AAGhC,MAAM,cAAc;AAEpB,MAAM,gBAAgB;AAEtB,SAAS,kBAAkB,SAA0B;AACnD,SAAQ,UAAU,SAAU;;AAG9B,SAAS,eAAe,SAA0B;CAChD,MAAM,OAAO,UAAU;AACvB,QAAO,SAAS,eAAe,SAAS;;AAG1C,SAAgB,cAAc,OAAsC;AAClE,KAAI,EAAE,iBAAiB,OACrB,QAAO;AAET,QAAQ,MAAsB,SAAS;;AAGzC,SAAS,0BAA0B,SAAqC;AAMtE,QADc,0BAA0B,KAAK,QAAQ,GACtC;;AAGjB,SAAS,qBAAqB,SAAyB;AACrD,SAAQ,SAAR;EACE,KAAK;EACL,KAAK,6BACH,QAAO;EACT,KAAK,6BACH,QAAO;EACT,KAAK,0BACH,QAAO;EACT,KAAK,wBACH,QAAO;EACT;AACE,OAAI,kBAAkB,QAAQ,CAC5B,QAAO;AAET,UAAO;;;AAIb,SAAgB,qBAAqB,OAA4D;AAC/F,KAAI,EAAE,iBAAiB,OACrB,QAAO,IAAI,MAAM,OAAO,MAAM,CAAC;AAGjC,KAAI,cAAc,MAAM,EAAE;EAExB,MAAM,UADY,MACQ,WAAW;AAErC,MAAI,eAAe,QAAQ,CACzB,QAAO,IAAI,mBAAmB,MAAM,SAAS;GAC3C,OAAO;GACP,WAAW;GACZ,CAAC;EAGJ,MAAM,WAAW,qBAAqB,QAAQ;EAC9C,MAAM,aAAa,0BAA0B,MAAM,QAAQ;AAE3D,SAAO,IAAI,cAAc,MAAM,SAAS;GACtC,OAAO;GACP;GACA,GAAI,eAAe,SAAY,EAAE,YAAY,GAAG,EAAE;GACnD,CAAC;;AAIJ,KACE,MAAM,QAAQ,SAAS,qBAAqB,IAC5C,MAAM,QAAQ,SAAS,0BAA0B,CAEjD,QAAO,IAAI,mBAAmB,MAAM,SAAS;EAC3C,OAAO;EACP,WAAW;EACZ,CAAC;AAGJ,QAAO;;;;;ACvGT,MAAa,6BAA6B;CACxC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EAAE;CACjB"}
|