@prisma-next/adapter-sqlite 0.13.0-dev.3 → 0.13.0-dev.31

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.
@@ -1,87 +1,47 @@
1
- import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
1
+ import { APP_SPACE_ID, extractCodecLookup } from "@prisma-next/framework-components/control";
2
2
  import { RawExpr, isDdlNode } from "@prisma-next/sql-relational-core/ast";
3
3
  import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
4
+ import { sqliteCodecRegistry } from "@prisma-next/target-sqlite/codecs";
4
5
  import { parseMarkerRowSafely, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
5
6
  import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
7
+ import { REFERENTIAL_ACTION_SQL } from "@prisma-next/sql-contract/referential-action-sql";
6
8
  import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries, datetime, integer, jsonText, sqliteTable, text } from "@prisma-next/target-sqlite/contract-free";
7
9
  import { parseSqliteDefault } from "@prisma-next/target-sqlite/default-normalizer";
8
10
  import { normalizeSqliteNativeType } from "@prisma-next/target-sqlite/native-type-normalizer";
9
11
  import { blindCast } from "@prisma-next/utils/casts";
10
12
  import { ifDefined } from "@prisma-next/utils/defined";
11
- import { REFERENTIAL_ACTION_SQL } from "@prisma-next/sql-contract/referential-action-sql";
12
13
  import { createAstCodecRegistry, deriveParamMetadata, encodeParamsWithMetadata } from "@prisma-next/sql-runtime";
13
14
  import { SQLITE_DATETIME_CODEC_ID } from "@prisma-next/target-sqlite/codec-ids";
14
- import { sqliteCodecRegistry } from "@prisma-next/target-sqlite/codecs";
15
+ //#region src/core/codec-lookup.ts
16
+ /**
17
+ * Build a {@link CodecRegistry} populated with the SQLite-builtin codec definitions only.
18
+ *
19
+ * Used by `createSqliteAdapter()` and `new SqliteControlAdapter()` when called without a
20
+ * stack-derived registry (e.g. from tests, or one-off scripts that don't compose a full stack).
21
+ *
22
+ * Extension codecs are intentionally NOT included: a bare adapter cannot see extensions.
23
+ * Stack-composed paths supply the broader, extension-inclusive registry at construction time.
24
+ */
25
+ function createSqliteBuiltinCodecLookup() {
26
+ return extractCodecLookup([{
27
+ id: "sqlite-builtin-codecs",
28
+ types: { codecTypes: { codecDescriptors: Array.from(sqliteCodecRegistry.values()) } }
29
+ }]);
30
+ }
31
+ //#endregion
15
32
  //#region ../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs
16
33
  function ledgerOriginFromStored(originCoreHash) {
17
34
  if (originCoreHash === null || originCoreHash === "" || originCoreHash === "sha256:empty") return null;
18
35
  return originCoreHash;
19
36
  }
20
37
  //#endregion
21
- //#region src/core/ddl-renderer.ts
22
- function renderPrimaryKeyConstraint(constraint) {
23
- const cols = constraint.columns.join(", ");
24
- if (constraint.name !== void 0) return `CONSTRAINT ${constraint.name} PRIMARY KEY (${cols})`;
25
- return `PRIMARY KEY (${cols})`;
26
- }
27
- function renderForeignKeyConstraint(constraint) {
28
- const cols = constraint.columns.join(", ");
29
- const refCols = constraint.refColumns.join(", ");
30
- let sql = `FOREIGN KEY (${cols}) REFERENCES ${constraint.refTable} (${refCols})`;
31
- if (constraint.onDelete !== void 0) sql += ` ON DELETE ${REFERENTIAL_ACTION_SQL[constraint.onDelete]}`;
32
- if (constraint.onUpdate !== void 0) sql += ` ON UPDATE ${REFERENTIAL_ACTION_SQL[constraint.onUpdate]}`;
33
- if (constraint.name !== void 0) sql = `CONSTRAINT ${constraint.name} ${sql}`;
34
- return sql;
35
- }
36
- function renderUniqueConstraint(constraint) {
37
- const cols = constraint.columns.join(", ");
38
- if (constraint.name !== void 0) return `CONSTRAINT ${constraint.name} UNIQUE (${cols})`;
39
- return `UNIQUE (${cols})`;
40
- }
41
- function renderTableConstraint(constraint) {
42
- switch (constraint.kind) {
43
- case "primary-key": return renderPrimaryKeyConstraint(constraint);
44
- case "foreign-key": return renderForeignKeyConstraint(constraint);
45
- case "unique": return renderUniqueConstraint(constraint);
46
- }
47
- }
48
- var SqliteDdlVisitorImpl = class {
49
- createTable(node) {
50
- const ifNotExists = node.ifNotExists ? "IF NOT EXISTS " : "";
51
- const tableRef = node.table;
52
- const columnDefs = node.columns.map((column) => renderColumn$1(column));
53
- const constraintDefs = node.constraints !== void 0 ? node.constraints.map(renderTableConstraint) : [];
54
- return `CREATE TABLE ${ifNotExists}${tableRef} (\n ${[...columnDefs, ...constraintDefs].join(",\n ")}\n )`;
55
- }
56
- };
57
- const defaultVisitor = {
58
- literal(node, _ctx) {
59
- const { value } = node;
60
- if (typeof value === "string") return `DEFAULT '${escapeLiteral(value)}'`;
61
- if (typeof value === "number" || typeof value === "boolean") return `DEFAULT ${String(value)}`;
62
- if (value === null) return "DEFAULT NULL";
63
- return `DEFAULT '${JSON.stringify(value)}'`;
64
- },
65
- function(node, _ctx) {
66
- if (node.expression === "autoincrement()") return "";
67
- return `DEFAULT (${node.expression})`;
68
- }
69
- };
70
- function renderColumn$1(column) {
71
- if (column.type.includes("AUTOINCREMENT")) return `${column.name} ${column.type}`;
72
- const parts = [column.name, column.type];
73
- if (column.notNull) parts.push("NOT NULL");
74
- if (column.primaryKey) parts.push("PRIMARY KEY");
75
- const defaultClause = column.default ? column.default.accept(defaultVisitor, { nativeType: column.type }) : "";
76
- if (defaultClause.length > 0) parts.push(defaultClause);
77
- return parts.join(" ");
78
- }
79
- function renderLoweredDdl(ast) {
80
- const sql = ast.accept(new SqliteDdlVisitorImpl());
81
- return Object.freeze({
82
- sql,
83
- params: Object.freeze([])
84
- });
38
+ //#region src/core/control-codecs.ts
39
+ const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);
40
+ async function encodeControlQueryParams(lowered, ast, codecs = CONTROL_CODECS) {
41
+ return encodeParamsWithMetadata(lowered.params.map((slot) => {
42
+ if (slot.kind === "literal") return slot.value;
43
+ throw new Error(`control query lowered to a bind slot '${slot.name}', which is unsupported`);
44
+ }), deriveParamMetadata(ast), {}, codecs);
85
45
  }
86
46
  //#endregion
87
47
  //#region src/core/ledger-decode.ts
@@ -103,7 +63,6 @@ function operationCountFromStored(operations) {
103
63
  }
104
64
  //#endregion
105
65
  //#region src/core/marker-ledger.ts
106
- const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);
107
66
  const marker = sqliteTable("_prisma_marker", {
108
67
  space: text(),
109
68
  core_hash: text(),
@@ -158,10 +117,7 @@ function mergeInvariants(current, incoming) {
158
117
  }
159
118
  async function execute(lower, driver, query) {
160
119
  const lowered = lower(query);
161
- const encoded = await encodeParamsWithMetadata(lowered.params.map((slot) => {
162
- if (slot.kind === "literal") return slot.value;
163
- throw new Error("SQLite control DML lowered to a bind parameter, which is unsupported");
164
- }), deriveParamMetadata(query), {}, CONTROL_CODECS);
120
+ const encoded = await encodeControlQueryParams(lowered, query);
165
121
  return (await driver.query(lowered.sql, encoded)).rows;
166
122
  }
167
123
  function decodeSqliteMarkerRow(row) {
@@ -187,6 +143,10 @@ const SQLITE_LEDGER_TABLE = "_prisma_ledger";
187
143
  var SqliteControlAdapter = class {
188
144
  familyId = "sql";
189
145
  targetId = "sqlite";
146
+ codecRegistry;
147
+ constructor(codecRegistry) {
148
+ this.codecRegistry = codecRegistry;
149
+ }
190
150
  normalizeDefault = parseSqliteDefault;
191
151
  normalizeNativeType = normalizeSqliteNativeType;
192
152
  bootstrapControlTableQueries() {
@@ -204,8 +164,24 @@ var SqliteControlAdapter = class {
204
164
  * without instantiating the runtime adapter.
205
165
  */
206
166
  lower(ast, context) {
207
- if (isDdlNode(ast)) return renderLoweredDdl(ast);
208
- return renderLoweredSql(ast, context.contract);
167
+ if (isDdlNode(ast)) throw new Error("lower() cannot lower DDL: DDL default literals require inline codec encoding, which is async. Use lowerToExecuteRequest().");
168
+ return renderLoweredSql(ast, blindCast(context.contract));
169
+ }
170
+ /**
171
+ * Lower an AST all the way to a driver-ready statement. For DDL nodes,
172
+ * literal column defaults are formatted as inline SQL with SQLite-specific
173
+ * literal syntax (no cast suffix, boolean as 0/1, blob via X'hex'). For
174
+ * query ASTs, params are kept as `?` placeholders; wire values go in
175
+ * `params`. Does NOT call `this.lower()` — independent implementation.
176
+ */
177
+ async lowerToExecuteRequest(ast, context) {
178
+ if (isDdlNode(ast)) return sqliteRenderDdlExecuteRequest(blindCast(ast), this.codecRegistry);
179
+ const lowered = renderLoweredSql(ast, blindCast(context?.contract));
180
+ const params = await encodeControlQueryParams(lowered, ast, blindCast(this.codecRegistry));
181
+ return {
182
+ sql: lowered.sql,
183
+ params
184
+ };
209
185
  }
210
186
  /**
211
187
  * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`
@@ -438,6 +414,74 @@ function mapSqliteReferentialAction(rule) {
438
414
  if (mapped === "noAction") return void 0;
439
415
  return mapped;
440
416
  }
417
+ function sqliteInlineLiteral(wire) {
418
+ if (wire === null) return "NULL";
419
+ if (typeof wire === "boolean") return wire ? "1" : "0";
420
+ if (typeof wire === "number") {
421
+ if (!Number.isFinite(wire)) throw new Error(`sqliteRenderDdlExecuteRequest: non-finite number wire value ${String(wire)} cannot be emitted as a DEFAULT literal`);
422
+ return String(wire);
423
+ }
424
+ if (typeof wire === "bigint") return String(wire);
425
+ if (wire instanceof Date) {
426
+ if (Number.isNaN(wire.getTime())) throw new Error("sqliteRenderDdlExecuteRequest: invalid Date value cannot be emitted as a DEFAULT literal");
427
+ return `'${escapeLiteral(wire.toISOString())}'`;
428
+ }
429
+ if (typeof wire === "string") return `'${escapeLiteral(wire)}'`;
430
+ if (wire instanceof Uint8Array) return `X'${Array.from(wire).map((b) => b.toString(16).padStart(2, "0")).join("")}'`;
431
+ if (typeof wire === "object") return `'${escapeLiteral(JSON.stringify(wire))}'`;
432
+ throw new Error(`sqliteRenderDdlExecuteRequest: unexpected wire type "${typeof wire}"`);
433
+ }
434
+ async function sqliteRenderDdlColumnDefault(def, codecLookup, codecRef) {
435
+ if (def.kind === "function") {
436
+ if (def.expression === "autoincrement()") return "";
437
+ if (def.expression === "now()") return "DEFAULT (datetime('now'))";
438
+ return `DEFAULT (${def.expression})`;
439
+ }
440
+ if (codecRef !== void 0) {
441
+ const codec = codecLookup.get(codecRef.codecId);
442
+ if (codec !== void 0) return `DEFAULT ${sqliteInlineLiteral(await codec.encode(def.value, {}))}`;
443
+ }
444
+ return `DEFAULT ${sqliteInlineLiteral(def.value)}`;
445
+ }
446
+ async function sqliteRenderDdlColumn(column, codecLookup) {
447
+ if (column.type.includes("AUTOINCREMENT")) return `${quoteIdentifier(column.name)} ${column.type}`;
448
+ const parts = [quoteIdentifier(column.name), column.type];
449
+ if (column.notNull) parts.push("NOT NULL");
450
+ if (column.primaryKey) parts.push("PRIMARY KEY");
451
+ if (column.default) {
452
+ const clause = await sqliteRenderDdlColumnDefault(column.default, codecLookup, column.codecRef);
453
+ if (clause.length > 0) parts.push(clause);
454
+ }
455
+ return parts.join(" ");
456
+ }
457
+ function sqliteRenderDdlConstraint(constraint) {
458
+ if (constraint.kind === "primary-key") {
459
+ const cols = constraint.columns.map(quoteIdentifier).join(", ");
460
+ if (constraint.name !== void 0) return `CONSTRAINT ${quoteIdentifier(constraint.name)} PRIMARY KEY (${cols})`;
461
+ return `PRIMARY KEY (${cols})`;
462
+ }
463
+ if (constraint.kind === "foreign-key") {
464
+ let sql = `FOREIGN KEY (${constraint.columns.map(quoteIdentifier).join(", ")}) REFERENCES ${constraint.refTable.split(".").map(quoteIdentifier).join(".")} (${constraint.refColumns.map(quoteIdentifier).join(", ")})`;
465
+ if (constraint.onDelete !== void 0) sql += ` ON DELETE ${REFERENTIAL_ACTION_SQL[constraint.onDelete]}`;
466
+ if (constraint.onUpdate !== void 0) sql += ` ON UPDATE ${REFERENTIAL_ACTION_SQL[constraint.onUpdate]}`;
467
+ if (constraint.name !== void 0) sql = `CONSTRAINT ${quoteIdentifier(constraint.name)} ${sql}`;
468
+ return sql;
469
+ }
470
+ const cols = constraint.columns.map(quoteIdentifier).join(", ");
471
+ if (constraint.name !== void 0) return `CONSTRAINT ${quoteIdentifier(constraint.name)} UNIQUE (${cols})`;
472
+ return `UNIQUE (${cols})`;
473
+ }
474
+ async function sqliteRenderDdlExecuteRequest(ast, codecLookup) {
475
+ const node = blindCast(ast);
476
+ const ifNotExists = node.ifNotExists ? "IF NOT EXISTS " : "";
477
+ const tableRef = quoteIdentifier(node.table);
478
+ const columnDefs = await Promise.all(node.columns.map((col) => sqliteRenderDdlColumn(col, codecLookup)));
479
+ const constraintDefs = node.constraints !== void 0 ? node.constraints.map(sqliteRenderDdlConstraint) : [];
480
+ return {
481
+ sql: `CREATE TABLE ${ifNotExists}${tableRef} (\n ${[...columnDefs, ...constraintDefs].join(",\n ")}\n)`,
482
+ params: []
483
+ };
484
+ }
441
485
  //#endregion
442
486
  //#region src/core/adapter.ts
443
487
  const defaultCapabilities = Object.freeze({ sql: {
@@ -453,7 +497,7 @@ var SqliteAdapterImpl = class {
453
497
  targetId = "sqlite";
454
498
  profile;
455
499
  constructor(options) {
456
- const controlAdapter = new SqliteControlAdapter();
500
+ const controlAdapter = new SqliteControlAdapter(createSqliteBuiltinCodecLookup());
457
501
  this.profile = Object.freeze({
458
502
  id: options?.profileId ?? "sqlite/default@1",
459
503
  target: "sqlite",
@@ -469,7 +513,7 @@ var SqliteAdapterImpl = class {
469
513
  });
470
514
  }
471
515
  lower(ast, context) {
472
- if (isDdlNode(ast)) return renderLoweredDdl(ast);
516
+ if (isDdlNode(ast)) throw new Error("lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.");
473
517
  return renderLoweredSql(ast, context.contract);
474
518
  }
475
519
  };
@@ -790,6 +834,6 @@ function createSqliteAdapter(options) {
790
834
  return Object.freeze(new SqliteAdapterImpl(options));
791
835
  }
792
836
  //#endregion
793
- export { sqliteRawCodecInferer as n, SqliteControlAdapter as r, createSqliteAdapter as t };
837
+ export { createSqliteBuiltinCodecLookup as i, sqliteRawCodecInferer as n, SqliteControlAdapter as r, createSqliteAdapter as t };
794
838
 
795
- //# sourceMappingURL=adapter-DCwhDr2I.mjs.map
839
+ //# sourceMappingURL=adapter-C1w7dvmO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-C1w7dvmO.mjs","names":[],"sources":["../src/core/codec-lookup.ts","../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/control-codecs.ts","../src/core/ledger-decode.ts","../src/core/marker-ledger.ts","../src/core/control-adapter.ts","../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { extractCodecLookup } from '@prisma-next/framework-components/control';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\n/**\n * Build a {@link CodecRegistry} populated with the SQLite-builtin codec definitions only.\n *\n * Used by `createSqliteAdapter()` and `new SqliteControlAdapter()` when called without a\n * stack-derived registry (e.g. from tests, or one-off scripts that don't compose a full stack).\n *\n * Extension codecs are intentionally NOT included: a bare adapter cannot see extensions.\n * Stack-composed paths supply the broader, extension-inclusive registry at construction time.\n */\nexport function createSqliteBuiltinCodecLookup(): CodecRegistry {\n return extractCodecLookup([\n {\n id: 'sqlite-builtin-codecs',\n types: { codecTypes: { codecDescriptors: Array.from(sqliteCodecRegistry.values()) } },\n },\n ]);\n}\n","import \"../constants-YnG8_EGO.mjs\";\n//#region src/ledger-origin.ts\nfunction ledgerOriginFromStored(originCoreHash) {\n\tif (originCoreHash === null || originCoreHash === \"\" || originCoreHash === \"sha256:empty\") return null;\n\treturn originCoreHash;\n}\n//#endregion\nexport { ledgerOriginFromStored };\n\n//# sourceMappingURL=ledger-origin.mjs.map","import type {\n AnyQueryAst,\n ContractCodecRegistry,\n LoweredStatement,\n} from '@prisma-next/sql-relational-core/ast';\nimport {\n createAstCodecRegistry,\n deriveParamMetadata,\n encodeParamsWithMetadata,\n} from '@prisma-next/sql-runtime';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\nexport const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);\n\nexport async function encodeControlQueryParams(\n lowered: LoweredStatement,\n ast: AnyQueryAst,\n codecs: ContractCodecRegistry = CONTROL_CODECS,\n): Promise<readonly unknown[]> {\n const values = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error(`control query lowered to a bind slot '${slot.name}', which is unsupported`);\n });\n return encodeParamsWithMetadata(values, deriveParamMetadata(ast), {}, codecs);\n}\n","const DESIGNATOR_LESS_UTC_DATETIME = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$/;\n\nexport function coerceLedgerAppliedAt(value: Date | string): Date {\n if (value instanceof Date) {\n return value;\n }\n if (DESIGNATOR_LESS_UTC_DATETIME.test(value)) {\n return new Date(`${value.replace(' ', 'T')}Z`);\n }\n return new Date(value);\n}\n\nexport function operationCountFromStored(operations: unknown): number {\n if (Array.isArray(operations)) {\n return operations.length;\n }\n if (typeof operations === 'string') {\n try {\n const parsed: unknown = JSON.parse(operations);\n return Array.isArray(parsed) ? parsed.length : 0;\n } catch {\n return 0;\n }\n }\n return 0;\n}\n","import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport {\n type AnyQueryAst,\n type LoweredStatement,\n RawExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';\nimport {\n datetime,\n integer,\n jsonText,\n sqliteTable,\n text,\n} from '@prisma-next/target-sqlite/contract-free';\nimport { encodeControlQueryParams } from './control-codecs';\n\nexport const marker = sqliteTable('_prisma_marker', {\n space: text(),\n core_hash: text(),\n profile_hash: text(),\n contract_json: jsonText({ nullable: true }),\n canonical_version: integer({ nullable: true }),\n updated_at: datetime(),\n app_tag: text({ nullable: true }),\n meta: jsonText({ nullable: true }),\n invariants: jsonText(),\n});\n\n/**\n * Writeable subset of `_prisma_ledger`. Omits the DB-generated `id`\n * (`INTEGER PRIMARY KEY AUTOINCREMENT`) and `created_at` (default\n * `strftime(...)`).\n */\nexport const ledger = sqliteTable('_prisma_ledger', {\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n});\n\n/**\n * Read-side handle covering every column of `_prisma_ledger`, including\n * the DB-generated `id` (for ORDER BY) and `created_at`.\n */\nexport const ledgerReadShape = sqliteTable('_prisma_ledger', {\n id: integer(),\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n created_at: text(),\n});\n\nexport const sqliteCatalog = sqliteTable('sqlite_master', { type: text(), name: text() });\n\nexport const NOW = new RawExpr({\n parts: [\"datetime('now')\"],\n returns: { codecId: SQLITE_DATETIME_CODEC_ID, nullable: false },\n});\n\ntype Lower = (query: AnyQueryAst) => LoweredStatement;\n\ntype MarkerDriver = {\n query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<{ readonly rows: ReadonlyArray<Row> }>;\n};\n\nexport function mergeInvariants(\n current: readonly string[],\n incoming: readonly string[],\n): readonly string[] {\n return [...new Set([...current, ...incoming])].sort();\n}\n\nexport async function execute(\n lower: Lower,\n driver: MarkerDriver,\n query: AnyQueryAst,\n): Promise<readonly Record<string, unknown>[]> {\n const lowered = lower(query);\n const encoded = await encodeControlQueryParams(lowered, query);\n const result = await driver.query(lowered.sql, encoded);\n return result.rows;\n}\n\nexport function decodeSqliteMarkerRow(row: unknown): unknown {\n if (typeof row !== 'object' || row === null || !('invariants' in row)) {\n return row;\n }\n const record = row as { invariants: unknown };\n if (typeof record.invariants !== 'string') return row;\n let parsed: unknown;\n try {\n parsed = JSON.parse(record.invariants);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid contract marker row: invariants is not valid JSON: ${detail}`);\n }\n return { ...record, invariants: parsed };\n}\n\nexport type SqliteMarkerWriteDriver = SqlControlDriverInstance<'sqlite'>;\n","import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { parseContractMarkerRow } from '@prisma-next/family-sql/verify';\nimport type { CodecLookup, CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport { REFERENTIAL_ACTION_SQL } from '@prisma-next/sql-contract/referential-action-sql';\nimport type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n CodecRef,\n ContractCodecRegistry,\n DdlColumn,\n DdlNode,\n DdlTableConstraint,\n FunctionColumnDefault,\n LiteralColumnDefault,\n LoweredStatement,\n LowererContext,\n MarkerReadResult,\n SqlExecuteRequest,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type {\n PrimaryKey,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlReferentialAction,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport {\n buildControlTableBootstrapQueries,\n buildSignMarkerBootstrapQueries,\n} from '@prisma-next/target-sqlite/contract-free';\nimport type { SqliteCreateTable, SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nimport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { encodeControlQueryParams } from './control-codecs';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport {\n decodeSqliteMarkerRow,\n execute,\n ledger,\n ledgerReadShape,\n marker,\n mergeInvariants,\n NOW,\n sqliteCatalog,\n} from './marker-ledger';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\ntype SqliteLedgerRow = {\n readonly space: string;\n readonly migration_name: string;\n readonly migration_hash: string;\n readonly origin_core_hash: string | null;\n readonly destination_core_hash: string;\n readonly operations: unknown;\n readonly created_at: Date | string;\n};\n\n// PRAGMA result row types\ntype PragmaTableInfoRow = {\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n};\n\ntype PragmaForeignKeyRow = {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string;\n on_delete: string;\n};\n\ntype PragmaIndexListRow = {\n seq: number;\n name: string;\n unique: number;\n origin: string;\n partial: number;\n};\n\ntype PragmaIndexInfoRow = {\n seqno: number;\n cid: number;\n name: string;\n};\n\ntype FkAccumulator = {\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n onDelete: string;\n onUpdate: string;\n};\n\nexport class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n private readonly codecRegistry: CodecRegistry;\n\n constructor(codecRegistry: CodecRegistry) {\n this.codecRegistry = codecRegistry;\n }\n\n readonly normalizeDefault = parseSqliteDefault;\n readonly normalizeNativeType = normalizeSqliteNativeType;\n\n bootstrapControlTableQueries(): readonly DdlNode[] {\n return buildControlTableBootstrapQueries();\n }\n\n bootstrapSignMarkerQueries(): readonly DdlNode[] {\n return buildSignMarkerBootstrapQueries();\n }\n\n /**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Delegates to the shared `renderLoweredSql` renderer so the control adapter\n * emits byte-identical SQL to `SqliteAdapterImpl.lower()` for the same AST\n * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)\n * without instantiating the runtime adapter.\n */\n lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() cannot lower DDL: DDL default literals require inline codec encoding, which is async. Use lowerToExecuteRequest().',\n );\n }\n return renderLoweredSql(\n ast,\n blindCast<SqliteContract, 'caller must supply a matching SqliteContract'>(context.contract),\n );\n }\n\n /**\n * Lower an AST all the way to a driver-ready statement. For DDL nodes,\n * literal column defaults are formatted as inline SQL with SQLite-specific\n * literal syntax (no cast suffix, boolean as 0/1, blob via X'hex'). For\n * query ASTs, params are kept as `?` placeholders; wire values go in\n * `params`. Does NOT call `this.lower()` — independent implementation.\n */\n async lowerToExecuteRequest(\n ast: AnyQueryAst | SqliteDdlNode,\n context?: LowererContext<unknown>,\n ): Promise<SqlExecuteRequest> {\n if (isDdlNode(ast)) {\n return sqliteRenderDdlExecuteRequest(\n blindCast<SqliteDdlNode, 'isDdlNode guard'>(ast),\n this.codecRegistry,\n );\n }\n const contract = blindCast<SqliteContract, 'Caller must supply matching contract'>(\n context?.contract,\n );\n const lowered = renderLoweredSql(ast, contract);\n const codecRegistry = blindCast<\n ContractCodecRegistry,\n 'framework CodecRegistry: its descriptors materialise SQL codecs; the framework Codec type erases to BaseCodec at this boundary'\n >(this.codecRegistry);\n const params = await encodeControlQueryParams(lowered, ast, codecRegistry);\n return { sql: lowered.sql, params };\n }\n\n /**\n * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`\n * first so a fresh database (no marker table) returns `null` instead of a\n * \"no such table\" error.\n */\n async readMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const result = await this.readMarkerDiscriminated(driver, space);\n return result.kind === 'present' ? result.record : null;\n }\n\n async readMarkerDiscriminated(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<MarkerReadResult> {\n const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readMarkerResult(driver, space), markerContext);\n }\n\n /**\n * Reads every row from `_prisma_marker` and returns them keyed by\n * `space`. Mirrors the existence probe in {@link readMarker}: a\n * fresh database without the marker table returns an empty map.\n */\n async readAllMarkers(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readAllMarkersResult(driver), markerContext);\n }\n\n private async readAllMarkersResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return new Map();\n }\n\n const fetch = marker\n .select(\n marker.space,\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .build();\n const rawRows = await execute(lower, driver, fetch);\n const rows = blindCast<\n ReadonlyArray<{ space: string } & Record<string, unknown>>,\n 'Driver returns rows shaped by SELECT'\n >(rawRows);\n\n const out = new Map<string, ContractMarkerRecord>();\n for (const row of rows) {\n out.set(\n row.space,\n parseMarkerRowSafely(row, (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)), {\n space: row.space,\n markerLocation: SQLITE_MARKER_TABLE,\n }),\n );\n }\n return out;\n }\n\n /**\n * Reads per-migration ledger rows from `_prisma_ledger` in apply order.\n * Probes `sqlite_master` first so a fresh database without the ledger\n * table returns `[]` instead of raising \"no such table\".\n */\n async readLedger(\n driver: SqlControlDriverInstance<'sqlite'>,\n space?: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space: space ?? '*', markerLocation: SQLITE_LEDGER_TABLE };\n return withMarkerReadErrorHandling(() => this.readLedgerResult(driver, space), ledgerContext);\n }\n\n private async readLedgerResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string | undefined,\n ): Promise<readonly LedgerEntryRecord[]> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_ledger')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return [];\n }\n\n const base = ledgerReadShape.select(\n ledgerReadShape.space,\n ledgerReadShape.migration_name,\n ledgerReadShape.migration_hash,\n ledgerReadShape.origin_core_hash,\n ledgerReadShape.destination_core_hash,\n ledgerReadShape.operations,\n ledgerReadShape.created_at,\n );\n const filtered = space !== undefined ? base.where(ledgerReadShape.space.eq(space)) : base;\n const rawRows = await execute(lower, driver, filtered.orderBy(ledgerReadShape.id).build());\n const rows = blindCast<readonly SqliteLedgerRow[], 'Driver returns rows shaped by SELECT'>(\n rawRows,\n );\n\n return rows.map((row) => ({\n space: row.space,\n migrationName: row.migration_name,\n migrationHash: row.migration_hash,\n from: ledgerOriginFromStored(row.origin_core_hash),\n to: row.destination_core_hash,\n appliedAt: coerceLedgerAppliedAt(row.created_at),\n operationCount: operationCountFromStored(row.operations),\n }));\n }\n\n /**\n * Stamps the initial marker row for `space` via the shared contract-free DML\n * builder, lowered through {@link lower} and executed on the driver. See the\n * `SqlControlAdapter.initMarker` contract.\n */\n async insertMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .insert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .build(),\n );\n }\n\n async initMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .upsert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .onConflict(marker.space)\n .doUpdate((excluded) => ({\n core_hash: excluded.core_hash,\n profile_hash: excluded.profile_hash,\n contract_json: excluded.contract_json,\n canonical_version: excluded.canonical_version,\n updated_at: NOW,\n app_tag: excluded.app_tag,\n meta: excluded.meta,\n invariants: excluded.invariants,\n }))\n .build(),\n );\n }\n\n /**\n * Compare-and-swap advance of the marker row for `space`. See the\n * `SqlControlAdapter.updateMarker` contract.\n */\n async updateMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean> {\n const currentInvariants =\n destination.invariants === undefined\n ? []\n : ((await this.readMarker(driver, space))?.invariants ?? []);\n const mergedInvariants =\n destination.invariants === undefined\n ? undefined\n : mergeInvariants(currentInvariants, destination.invariants);\n\n const query = marker\n .update()\n .set({\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n updated_at: NOW,\n ...(mergedInvariants !== undefined ? { invariants: mergedInvariants } : {}),\n })\n .where(marker.space.eq(space).and(marker.core_hash.eq(expectedFrom)))\n .returning(marker.space)\n .build();\n\n const rows = await execute((q) => this.lower(q, { contract: undefined }), driver, query);\n return rows.length > 0;\n }\n\n /**\n * Appends a ledger entry for `space`. See the\n * `SqlControlAdapter.writeLedgerEntry` contract.\n */\n async writeLedgerEntry(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n ledger\n .insert({\n space,\n migration_name: entry.migrationName,\n migration_hash: entry.migrationHash,\n origin_core_hash: entry.from,\n destination_core_hash: entry.to,\n operations: entry.operations,\n })\n .build(),\n );\n }\n\n private async readMarkerResult(driver: SqlControlDriverInstance<'sqlite'>, space: string) {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) return { kind: 'no-table' as const };\n\n const fetch = marker\n .select(\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .where(marker.space.eq(space))\n .build();\n const result = await execute(lower, driver, fetch);\n const row = result[0];\n if (!row) return { kind: 'absent' as const };\n return {\n kind: 'present' as const,\n record: parseContractMarkerRow(decodeSqliteMarkerRow(row)),\n };\n }\n\n async introspect(\n driver: SqlControlDriverInstance<'sqlite'>,\n _contract?: unknown,\n ): Promise<SqlSchemaIR> {\n // Filter out runner-managed control tables (`_prisma_marker`,\n // `_prisma_ledger`) — they're an implementation detail of the migration\n // runner, not part of the user-authored contract, so they must not\n // appear in introspection output (otherwise strict schema verification\n // flags them as `extra_table`).\n const tablesResult = await driver.query<{ name: string }>(\n `SELECT name FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT IN ('_prisma_marker', '_prisma_ledger')\n ORDER BY name`,\n );\n\n const tables: Record<string, SqlTableIR> = {};\n\n for (const tableRow of tablesResult.rows) {\n const tableName = tableRow.name;\n\n // SQLite's synchronous driver serializes reads — no benefit from Promise.all\n const columnsResult = await driver.query<PragmaTableInfoRow>(\n `PRAGMA table_info(\"${escapePragmaArg(tableName)}\")`,\n );\n const fkResult = await driver.query<PragmaForeignKeyRow>(\n `PRAGMA foreign_key_list(\"${escapePragmaArg(tableName)}\")`,\n );\n const indexListResult = await driver.query<PragmaIndexListRow>(\n `PRAGMA index_list(\"${escapePragmaArg(tableName)}\")`,\n );\n\n const columns: Record<string, SqlColumnIR> = {};\n const pkColumns: Array<{ name: string; pk: number }> = [];\n\n for (const col of columnsResult.rows) {\n columns[col.name] = {\n name: col.name,\n nativeType: col.type.toLowerCase(),\n nullable: col.notnull === 0 && col.pk === 0,\n ...ifDefined('default', col.dflt_value ?? undefined),\n };\n if (col.pk > 0) {\n pkColumns.push({ name: col.name, pk: col.pk });\n }\n }\n\n pkColumns.sort((a, b) => a.pk - b.pk);\n const primaryKey: PrimaryKey | undefined =\n pkColumns.length > 0 ? { columns: pkColumns.map((c) => c.name) } : undefined;\n\n const fkMap = new Map<number, FkAccumulator>();\n for (const fk of fkResult.rows) {\n const existing = fkMap.get(fk.id);\n if (existing) {\n existing.columns.push(fk.from);\n existing.referencedColumns.push(fk.to);\n } else {\n fkMap.set(fk.id, {\n columns: [fk.from],\n referencedTable: fk.table,\n referencedColumns: [fk.to],\n onDelete: fk.on_delete,\n onUpdate: fk.on_update,\n });\n }\n }\n const foreignKeys: readonly SqlForeignKeyIR[] = Array.from(fkMap.values()).map((fk) => ({\n columns: Object.freeze([...fk.columns]) as readonly string[],\n referencedTable: fk.referencedTable,\n referencedColumns: Object.freeze([...fk.referencedColumns]) as readonly string[],\n ...ifDefined('onDelete', mapSqliteReferentialAction(fk.onDelete)),\n ...ifDefined('onUpdate', mapSqliteReferentialAction(fk.onUpdate)),\n }));\n\n const uniques: SqlUniqueIR[] = [];\n const indexes: SqlIndexIR[] = [];\n\n for (const idx of indexListResult.rows) {\n // origin: 'c' = CREATE INDEX, 'u' = UNIQUE constraint, 'pk' = PRIMARY KEY\n const idxInfoResult = await driver.query<PragmaIndexInfoRow>(\n `PRAGMA index_info(\"${escapePragmaArg(idx.name)}\")`,\n );\n\n const idxColumns = idxInfoResult.rows.sort((a, b) => a.seqno - b.seqno).map((r) => r.name);\n\n if (idx.origin === 'u') {\n uniques.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n });\n } else if (idx.origin === 'c') {\n indexes.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n unique: idx.unique === 1,\n });\n }\n // Skip 'pk' origin — already captured in primaryKey\n }\n\n tables[tableName] = {\n name: tableName,\n columns,\n ...ifDefined('primaryKey', primaryKey),\n foreignKeys,\n uniques,\n indexes,\n };\n }\n\n return {\n tables,\n };\n }\n}\n\n// PRAGMA queries use the function-argument form (`PRAGMA table_info(\"name\")`)\n// which doesn't support `?` placeholders — the argument is part of the\n// statement name, not a bound parameter. We quote-escape the table name instead.\nfunction escapePragmaArg(name: string): string {\n return name.replace(/\"/g, '\"\"');\n}\n\nconst SQLITE_REFERENTIAL_ACTION_MAP: Record<string, SqlReferentialAction> = {\n 'NO ACTION': 'noAction',\n RESTRICT: 'restrict',\n CASCADE: 'cascade',\n 'SET NULL': 'setNull',\n 'SET DEFAULT': 'setDefault',\n};\n\nfunction mapSqliteReferentialAction(rule: string): SqlReferentialAction | undefined {\n const normalized = rule.toUpperCase();\n const mapped = SQLITE_REFERENTIAL_ACTION_MAP[normalized];\n if (mapped === undefined) {\n throw new Error(\n `Unknown SQLite referential action rule: \"${rule}\". ` +\n 'Expected one of: NO ACTION, RESTRICT, CASCADE, SET NULL, SET DEFAULT.',\n );\n }\n if (mapped === 'noAction') return undefined;\n return mapped;\n}\n\n// ---------------------------------------------------------------------------\n// sqliteRenderDdlExecuteRequest — independent DDL walker for lowerToExecuteRequest\n// ---------------------------------------------------------------------------\n\nfunction sqliteInlineLiteral(wire: unknown): string {\n if (wire === null) return 'NULL';\n if (typeof wire === 'boolean') return wire ? '1' : '0';\n if (typeof wire === 'number') {\n if (!Number.isFinite(wire)) {\n throw new Error(\n `sqliteRenderDdlExecuteRequest: non-finite number wire value ${String(wire)} cannot be emitted as a DEFAULT literal`,\n );\n }\n return String(wire);\n }\n if (typeof wire === 'bigint') return String(wire);\n if (wire instanceof Date) {\n if (Number.isNaN(wire.getTime())) {\n throw new Error(\n 'sqliteRenderDdlExecuteRequest: invalid Date value cannot be emitted as a DEFAULT literal',\n );\n }\n return `'${escapeLiteral(wire.toISOString())}'`;\n }\n if (typeof wire === 'string') return `'${escapeLiteral(wire)}'`;\n if (wire instanceof Uint8Array) {\n const hex = Array.from(wire)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return `X'${hex}'`;\n }\n if (typeof wire === 'object') return `'${escapeLiteral(JSON.stringify(wire))}'`;\n throw new Error(`sqliteRenderDdlExecuteRequest: unexpected wire type \"${typeof wire}\"`);\n}\n\nasync function sqliteRenderDdlColumnDefault(\n def: LiteralColumnDefault | FunctionColumnDefault,\n codecLookup: CodecLookup,\n codecRef: CodecRef | undefined,\n): Promise<string> {\n if (def.kind === 'function') {\n if (def.expression === 'autoincrement()') return '';\n // SQLite has no `now()` function; the contract canonicalizes\n // `CURRENT_TIMESTAMP` / `datetime('now')` to `now()`, so map it back to a\n // valid SQLite expression on the way out.\n if (def.expression === 'now()') return \"DEFAULT (datetime('now'))\";\n return `DEFAULT (${def.expression})`;\n }\n if (codecRef !== undefined) {\n const codec = codecLookup.get(codecRef.codecId);\n if (codec !== undefined) {\n const wire = await codec.encode(def.value, {});\n return `DEFAULT ${sqliteInlineLiteral(wire)}`;\n }\n }\n // Fallback: codec-less literal defaults follow RawSqlLiteral wire-scalar semantics.\n return `DEFAULT ${sqliteInlineLiteral(def.value)}`;\n}\n\nasync function sqliteRenderDdlColumn(column: DdlColumn, codecLookup: CodecLookup): Promise<string> {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${quoteIdentifier(column.name)} ${column.type}`;\n }\n const parts = [quoteIdentifier(column.name), column.type];\n if (column.notNull) parts.push('NOT NULL');\n if (column.primaryKey) parts.push('PRIMARY KEY');\n if (column.default) {\n const clause = await sqliteRenderDdlColumnDefault(column.default, codecLookup, column.codecRef);\n if (clause.length > 0) parts.push(clause);\n }\n return parts.join(' ');\n}\n\nfunction sqliteRenderDdlConstraint(constraint: DdlTableConstraint): string {\n if (constraint.kind === 'primary-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} PRIMARY KEY (${cols})`;\n }\n return `PRIMARY KEY (${cols})`;\n }\n if (constraint.kind === 'foreign-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n const refTable = constraint.refTable.split('.').map(quoteIdentifier).join('.');\n const refCols = constraint.refColumns.map(quoteIdentifier).join(', ');\n let sql = `FOREIGN KEY (${cols}) REFERENCES ${refTable} (${refCols})`;\n if (constraint.onDelete !== undefined) {\n sql += ` ON DELETE ${REFERENTIAL_ACTION_SQL[constraint.onDelete]}`;\n }\n if (constraint.onUpdate !== undefined) {\n sql += ` ON UPDATE ${REFERENTIAL_ACTION_SQL[constraint.onUpdate]}`;\n }\n if (constraint.name !== undefined) {\n sql = `CONSTRAINT ${quoteIdentifier(constraint.name)} ${sql}`;\n }\n return sql;\n }\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} UNIQUE (${cols})`;\n }\n return `UNIQUE (${cols})`;\n}\n\nasync function sqliteRenderDdlExecuteRequest(\n ast: SqliteDdlNode,\n codecLookup: CodecLookup,\n): Promise<SqlExecuteRequest> {\n const node = blindCast<SqliteCreateTable, 'SQLite DDL only has create-table'>(ast);\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = quoteIdentifier(node.table);\n const columnDefs = await Promise.all(\n node.columns.map((col) => sqliteRenderDdlColumn(col, codecLookup)),\n );\n const constraintDefs =\n node.constraints !== undefined ? node.constraints.map(sqliteRenderDdlConstraint) : [];\n const allDefs = [...columnDefs, ...constraintDefs].join(',\\n ');\n return {\n sql: `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${allDefs}\\n)`,\n params: [],\n };\n}\n","import { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AggregateExpr,\n AnyExpression,\n AnyFromSource,\n AnyQueryAst,\n BinaryExpr,\n ColumnRef,\n DeleteAst,\n InsertAst,\n InsertValue,\n JoinAst,\n JoinOnExpr,\n JsonArrayAggExpr,\n JsonObjectExpr,\n ListExpression,\n LiteralExpr,\n LoweredParam,\n LowererContext,\n NullCheckExpr,\n OperationExpr,\n OrderByItem,\n ProjectionItem,\n RawExpr,\n RawSqlLiteral,\n SelectAst,\n SqlQueryable,\n SubqueryExpr,\n TableSource,\n UpdateAst,\n WindowFuncExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { createSqliteBuiltinCodecLookup } from './codec-lookup';\nimport { SqliteControlAdapter } from './control-adapter';\nimport type { SqliteAdapterOptions, SqliteContract, SqliteLoweredStatement } from './types';\n\nconst defaultCapabilities = Object.freeze({\n sql: {\n orderBy: true,\n limit: true,\n lateral: false,\n jsonAgg: true,\n returning: true,\n enums: false,\n },\n});\n\nclass SqliteAdapterImpl implements Adapter<AnyQueryAst, SqliteContract, SqliteLoweredStatement> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n readonly profile: AdapterProfile<'sqlite'>;\n\n constructor(options?: SqliteAdapterOptions) {\n const codecLookup = createSqliteBuiltinCodecLookup();\n const controlAdapter = new SqliteControlAdapter(codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'sqlite',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | SqliteDdlNode,\n context: LowererContext<SqliteContract>,\n ): SqliteLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a sqlite client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const sqliteRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0\n ? 'sqlite/integer@1'\n : 'sqlite/real@1';\n case 'bigint':\n return 'sqlite/bigint@1';\n case 'string':\n return 'sqlite/text@1';\n case 'boolean':\n return 'sqlite/integer@1';\n case 'object':\n if (value instanceof Uint8Array) return 'sqlite/blob@1';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\n/**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the control adapter (`SqliteControlAdapter.lower`) so both produce byte-identical SQL for the same AST and contract.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: SqliteContract,\n): SqliteLoweredStatement {\n const collectedParamRefs = ast.collectParamRefs();\n const params: LoweredParam[] = [];\n for (const ref of collectedParamRefs) {\n params.push(\n ref.kind === 'prepared-param-ref'\n ? { kind: 'bind', name: ref.name }\n : { kind: 'literal', value: ref.value },\n );\n }\n\n let sql: string;\n\n const node = ast;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract);\n break;\n case 'insert':\n sql = renderInsert(node, contract);\n break;\n case 'update':\n sql = renderUpdate(node, contract);\n break;\n case 'delete':\n sql = renderDelete(node, contract);\n break;\n default:\n throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);\n }\n\n return Object.freeze({ sql, params });\n}\n\nfunction renderLimitOffset(\n keyword: 'LIMIT' | 'OFFSET',\n value: SelectAst['limit'] | SelectAst['offset'],\n contract?: SqliteContract,\n): string {\n if (value === undefined) return '';\n if (typeof value === 'number') return `${keyword} ${value}`;\n return `${keyword} ${renderExpr(value, contract)}`;\n}\n\nfunction renderSelect(ast: SelectAst, contract: SqliteContract): string {\n const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';\n const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;\n const fromClause = `FROM ${renderSource(ast.from, contract)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`)\n .join(', ')}`\n : '';\n const limitClause = renderLimitOffset('LIMIT', ast.limit, contract);\n const offsetClause = renderLimitOffset('OFFSET', ast.offset, contract);\n\n return [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ')\n .trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract?: SqliteContract,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction qualifyTableFromNamespaceCoordinate(\n table: Pick<TableSource, 'name' | 'namespaceId'>,\n contract: SqliteContract,\n): string {\n if (table.namespaceId === undefined) {\n return quoteIdentifier(table.name);\n }\n const namespace = contract.storage.namespaces[table.namespaceId];\n if (namespace === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not present on the contract`,\n );\n }\n const qualifyTable = namespace.qualifyTable;\n if (qualifyTable === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not materialised for SQL rendering on the contract`,\n );\n }\n return qualifyTable.call(namespace, table.name);\n}\n\nfunction renderTableSource(source: TableSource, contract: SqliteContract): string {\n const qualified = qualifyTableFromNamespaceCoordinate(source, contract);\n if (!source.alias) {\n return qualified;\n }\n return `${qualified} AS ${quoteIdentifier(source.alias)}`;\n}\n\nfunction renderSource(source: AnyFromSource, contract: SqliteContract): string {\n const node = source;\n switch (node.kind) {\n case 'table-source':\n return renderTableSource(node, contract);\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;\n default:\n throw new Error(`Unsupported source node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderExpr(expr: AnyExpression, contract?: SqliteContract): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract);\n case 'subquery':\n return renderSubqueryExpr(node, contract);\n case 'aggregate':\n return renderAggregateExpr(node, contract);\n case 'window-func':\n return renderWindowFuncExpr(node, contract);\n case 'json-object':\n return renderJsonObjectExpr(node, contract);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract);\n case 'binary':\n return renderBinary(node, contract);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;\n case 'exists': {\n if (contract === undefined) {\n throw new Error('EXISTS subquery rendering requires a Sqlite contract');\n }\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract)})`;\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node);\n case 'raw-expr':\n return renderRawExpr(node, contract);\n default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderRawExpr(node: RawExpr, contract?: SqliteContract): string {\n return node.parts\n .map((part) => (typeof part === 'string' ? part : renderExpr(part, contract)))\n .join('');\n}\n\n// `excluded` is a pseudo-table in ON CONFLICT DO UPDATE that references the row proposed for insertion. It is not quoted because it's a keyword.\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null || expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: SqliteContract): string {\n const self = renderExpr(expr.self, contract);\n const args = expr.args.map((arg) => renderExpr(arg, contract));\n\n let result = expr.lowering.template;\n result = result.replace(/\\{\\{self\\}\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\{\\\\{arg${i}\\\\}\\\\}`, 'g'), args[i] ?? '');\n }\n\n return result;\n}\n\nfunction renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): string {\n if (expr.query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n if (contract === undefined) {\n throw new Error('Subquery expression rendering requires a Sqlite contract');\n }\n return `(${renderSelect(expr.query, contract)})`;\n}\n\nfunction renderNullCheck(expr: NullCheckExpr, contract?: SqliteContract): string {\n const rendered = renderExpr(expr.expr, contract);\n const renderedExpr =\n expr.expr.kind === 'operation' || expr.expr.kind === 'subquery' ? `(${rendered})` : rendered;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: SqliteContract): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n case 'prepared-param-ref':\n right = '?';\n break;\n default:\n right = renderExpr(rightNode, contract);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(expr: ListExpression): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref' || v.kind === 'prepared-param-ref') return '?';\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderAggregateExpr(expr: AggregateExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract)})`;\n}\n\nfunction renderWindowFuncExpr(expr: WindowFuncExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n const args = expr.args.map((arg) => renderExpr(arg, contract)).join(', ');\n const partitionClause =\n expr.partitionBy && expr.partitionBy.length > 0\n ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract)).join(', ')}`\n : '';\n const orderClause =\n expr.orderBy && expr.orderBy.length > 0\n ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const over = [partitionClause, orderClause].filter((part) => part.length > 0).join(' ');\n return `${fn}(${args}) OVER (${over})`;\n}\n\nfunction renderJsonObjectExpr(expr: JsonObjectExpr, contract?: SqliteContract): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract)];\n })\n .join(', ');\n return `json_object(${args})`;\n}\n\nfunction renderOrderByItems(items: ReadonlyArray<OrderByItem>, contract?: SqliteContract): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContract): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const aggregated = `json_group_array(${renderExpr(expr.expr, contract)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, '[]')`;\n }\n return aggregated;\n}\n\nfunction renderJoin(join: JoinAst, contract?: SqliteContract): string {\n if (contract === undefined) {\n throw new Error('JOIN rendering requires a Sqlite contract');\n }\n const joinType = join.joinType.toUpperCase();\n const source = renderSource(join.source, contract);\n const onClause = renderJoinOn(join.on, contract);\n return `${joinType} JOIN ${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract?: SqliteContract): string {\n if (on.kind === 'eq-col-join-on') {\n return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;\n }\n return renderExpr(on, contract);\n}\n\nfunction renderInsertValue(value: InsertValue): string {\n switch (value.kind) {\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'column-ref':\n return renderColumn(value);\n case 'raw-expr':\n return renderExpr(value);\n case 'default-value':\n throw new Error('SQLite does not support DEFAULT as a value in INSERT ... VALUES');\n default:\n throw new Error(`Unsupported value node in INSERT: ${(value as { kind: string }).kind}`);\n }\n}\n\nfunction renderInsert(ast: InsertAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n\n const firstRow = rows[0] as Readonly<Record<string, InsertValue>>;\n const columnOrder = Object.keys(firstRow);\n\n let insertClause: string;\n if (columnOrder.length === 0) {\n insertClause = `INSERT INTO ${table} DEFAULT VALUES`;\n } else {\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => {\n const value = row[column];\n if (value === undefined) {\n throw new Error(`Missing value for column \"${column}\" in INSERT row`);\n }\n return renderInsertValue(value);\n });\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n }\n\n let onConflictClause = '';\n if (ast.onConflict) {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n break;\n case 'do-update-set': {\n const updates = Object.entries(action.set).map(([colName, value]) => {\n return `${quoteIdentifier(colName)} = ${renderExpr(value, contract)}`;\n });\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n break;\n }\n default:\n throw new Error(`Unsupported onConflict action: ${(action as { kind: string }).kind}`);\n }\n }\n\n const returningClause = renderReturning(ast.returning);\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where, contract)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nfunction renderReturning(returning: ReadonlyArray<ProjectionItem> | undefined): string {\n if (!returning?.length) {\n return '';\n }\n return ` RETURNING ${returning\n .map((item) => {\n if (item.expr.kind === 'column-ref') {\n const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;\n return item.expr.column === item.alias\n ? rendered\n : `${rendered} AS ${quoteIdentifier(item.alias)}`;\n }\n return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ')}`;\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-CPydDe3Y.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAqDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EAyBtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,EAAS,cAAA,CAAe,cAAA,IACvB,sBAAA;AAAA;;cASQ,qBAAA,EAAuB,eAoBnC;AAAA,iBAygBe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
1
+ {"version":3,"file":"adapter-CPydDe3Y.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAqDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EA0BtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,EAAS,cAAA,CAAe,cAAA,IACvB,sBAAA;AAAA;;cAWQ,qBAAA,EAAuB,eAoBnC;AAAA,iBAygBe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
package/dist/adapter.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-DCwhDr2I.mjs";
1
+ import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-C1w7dvmO.mjs";
2
2
  export { createSqliteAdapter, sqliteRawCodecInferer };
@@ -1,4 +1,4 @@
1
- import { AnyQueryAst, DdlNode, LoweredStatement, LowererContext, MarkerReadResult } from "@prisma-next/sql-relational-core/ast";
1
+ import { AnyQueryAst, DdlNode, LoweredStatement, LowererContext, MarkerReadResult, SqlExecuteRequest } from "@prisma-next/sql-relational-core/ast";
2
2
  import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
3
3
  import { parseSqliteDefault, parseSqliteDefault as parseSqliteDefault$1 } from "@prisma-next/target-sqlite/default-normalizer";
4
4
  import { normalizeSqliteNativeType, normalizeSqliteNativeType as normalizeSqliteNativeType$1 } from "@prisma-next/target-sqlite/native-type-normalizer";
@@ -6,13 +6,28 @@ import { SqlControlAdapterDescriptor } from "@prisma-next/family-sql/control";
6
6
  import { SqliteDdlNode } from "@prisma-next/target-sqlite/ddl";
7
7
  import { ContractMarkerRecord, LedgerEntryRecord } from "@prisma-next/contract/types";
8
8
  import { SqlControlDriverInstance } from "@prisma-next/sql-contract/types";
9
+ import { CodecRegistry } from "@prisma-next/framework-components/codec";
9
10
  import { SqlControlAdapter } from "@prisma-next/family-sql/control-adapter";
10
11
  import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
11
12
 
13
+ //#region src/core/codec-lookup.d.ts
14
+ /**
15
+ * Build a {@link CodecRegistry} populated with the SQLite-builtin codec definitions only.
16
+ *
17
+ * Used by `createSqliteAdapter()` and `new SqliteControlAdapter()` when called without a
18
+ * stack-derived registry (e.g. from tests, or one-off scripts that don't compose a full stack).
19
+ *
20
+ * Extension codecs are intentionally NOT included: a bare adapter cannot see extensions.
21
+ * Stack-composed paths supply the broader, extension-inclusive registry at construction time.
22
+ */
23
+ declare function createSqliteBuiltinCodecLookup(): CodecRegistry;
24
+ //#endregion
12
25
  //#region src/core/control-adapter.d.ts
13
26
  declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
14
27
  readonly familyId: "sql";
15
28
  readonly targetId: "sqlite";
29
+ private readonly codecRegistry;
30
+ constructor(codecRegistry: CodecRegistry);
16
31
  readonly normalizeDefault: typeof parseSqliteDefault$1;
17
32
  readonly normalizeNativeType: typeof normalizeSqliteNativeType$1;
18
33
  bootstrapControlTableQueries(): readonly DdlNode[];
@@ -26,6 +41,14 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
26
41
  * without instantiating the runtime adapter.
27
42
  */
28
43
  lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement;
44
+ /**
45
+ * Lower an AST all the way to a driver-ready statement. For DDL nodes,
46
+ * literal column defaults are formatted as inline SQL with SQLite-specific
47
+ * literal syntax (no cast suffix, boolean as 0/1, blob via X'hex'). For
48
+ * query ASTs, params are kept as `?` placeholders; wire values go in
49
+ * `params`. Does NOT call `this.lower()` — independent implementation.
50
+ */
51
+ lowerToExecuteRequest(ast: AnyQueryAst | SqliteDdlNode, context?: LowererContext<unknown>): Promise<SqlExecuteRequest>;
29
52
  /**
30
53
  * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`
31
54
  * first so a fresh database (no marker table) returns `null` instead of a
@@ -90,5 +113,5 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
90
113
  //#region src/exports/control.d.ts
91
114
  declare const sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'>;
92
115
  //#endregion
93
- export { SqlEscapeError, SqliteControlAdapter, sqliteAdapterDescriptor as default, escapeLiteral, normalizeSqliteNativeType, parseSqliteDefault, quoteIdentifier };
116
+ export { SqlEscapeError, SqliteControlAdapter, createSqliteBuiltinCodecLookup, sqliteAdapterDescriptor as default, escapeLiteral, normalizeSqliteNativeType, parseSqliteDefault, quoteIdentifier };
94
117
  //# sourceMappingURL=control.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cAwGa,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EAE5B,4BAAA,aAAyC,OAAA;EAIzC,0BAAA,aAAuC,OAAA;EAPd;;;;;;;;EAmBzB,KAAA,CAAM,GAAA,EAAK,WAAA,GAAc,aAAA,EAAe,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAehE;;;;;EAHL,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAKL,uBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,gBAAA;EAYA;;;;;EAFL,cAAA,CACJ,MAAA,EAAQ,wBAAA,aACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAAA,QAKjB,oBAAA;EAoIJ;;;;;EAlFJ,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAAA,QAKN,gBAAA;EAyNH;;;;;EA5KL,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAoBG,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EA/LoC;;;;EAkOjC,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAlNO;;;;EAgPJ,gBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAAA,QAiBW,gBAAA;EA+BR,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cChbP,uBAAA,EAAyB,2BAA2B"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/codec-lookup.ts","../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;iBAagB,8BAAA,IAAkC,aAAa;;;cCqGlD,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,iBAEQ,aAAA;cAEL,aAAA,EAAe,aAAA;EAAA,SAIlB,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EAE5B,4BAAA,aAAyC,OAAA;EAIzC,0BAAA,aAAuC,OAAA;;;;AAjBzC;;;;;EA6BE,KAAA,CAAM,GAAA,EAAK,WAAA,GAAc,aAAA,EAAe,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAhBlC;;;;;;;EAmCnC,qBAAA,CACJ,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,GAAU,cAAA,YACT,OAAA,CAAQ,iBAAA;EADC;;;;;EAyBN,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAKL,uBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,gBAAA;EAAA;;;;;EAUL,cAAA,CACJ,MAAA,EAAQ,wBAAA,aACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAAA,QAKjB,oBAAA;EAqDM;;;;;EAHd,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAAA,QAKN,gBAAA;EA6HX;;;;;EAhFG,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAoBG,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EA5OS;;;;EA+QN,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAjQH;;;;EA+RM,gBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAAA,QAiBW,gBAAA;EA+BR,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cCleP,uBAAA,EAAyB,2BAA2B"}
package/dist/control.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { r as SqliteControlAdapter } from "./adapter-DCwhDr2I.mjs";
1
+ import { i as createSqliteBuiltinCodecLookup, r as SqliteControlAdapter } from "./adapter-C1w7dvmO.mjs";
2
2
  import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-Du5OgSxS.mjs";
3
3
  import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
4
4
  import { parseSqliteDefault } from "@prisma-next/target-sqlite/default-normalizer";
@@ -271,11 +271,11 @@ const sqliteAdapterDescriptor = {
271
271
  defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),
272
272
  generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors()
273
273
  },
274
- create() {
275
- return new SqliteControlAdapter();
274
+ create(stack) {
275
+ return new SqliteControlAdapter(stack.codecLookup);
276
276
  }
277
277
  };
278
278
  //#endregion
279
- export { SqlEscapeError, SqliteControlAdapter, sqliteAdapterDescriptor as default, escapeLiteral, normalizeSqliteNativeType, parseSqliteDefault, quoteIdentifier };
279
+ export { SqlEscapeError, SqliteControlAdapter, createSqliteBuiltinCodecLookup, sqliteAdapterDescriptor as default, escapeLiteral, normalizeSqliteNativeType, parseSqliteDefault, quoteIdentifier };
280
280
 
281
281
  //# sourceMappingURL=control.mjs.map