@prisma-next/adapter-sqlite 0.12.0-dev.17 → 0.12.0-dev.3

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/README.md CHANGED
@@ -20,7 +20,7 @@ Provide SQLite-specific adapter implementation, codecs, and capabilities. Enable
20
20
 
21
21
  - **Adapter Implementation**: Implement `Adapter` SPI for SQLite
22
22
  - Lower SQL ASTs to SQLite dialect SQL
23
- - Render JSON aggregation (`json_group_array`, `json_object`) and scalar subqueries
23
+ - Render `includeMany` as correlated subquery with `json_group_array(json_object(...))` for nested array includes
24
24
  - Advertise SQLite capabilities (`jsonAgg`, `returning`; no `lateral`, no `enums`)
25
25
  - Provide target-specific marker SQL via `readMarkerStatement()` on `AdapterProfile`
26
26
  - Map SQLite errors to `RuntimeError` envelope
@@ -91,7 +91,7 @@ flowchart TD
91
91
  - Main adapter implementation
92
92
  - Lowers SQL ASTs to SQLite SQL with `?` positional parameters
93
93
  - Renders joins (INNER, LEFT, RIGHT, FULL) with ON conditions
94
- - Renders JSON aggregation (`json_group_array`, `json_object`) and scalar subqueries
94
+ - Renders `includeMany` as correlated subquery with `json_group_array(json_object(...))` for nested array includes
95
95
  - Renders DML operations (INSERT, UPDATE, DELETE) with RETURNING clauses
96
96
  - Renders ON CONFLICT (DO NOTHING / DO UPDATE SET) for upserts
97
97
  - Uses `CAST(expr AS type)` instead of Postgres `::type` syntax
@@ -148,18 +148,18 @@ The adapter declares the following SQLite capabilities:
148
148
 
149
149
  - **`sql.orderBy: true`** -- Supports ORDER BY clauses
150
150
  - **`sql.limit: true`** -- Supports LIMIT clauses
151
- - **`sql.lateral: false`** -- No LATERAL join support
152
- - **`sql.jsonAgg: true`** -- Supports JSON aggregation via `json_group_array()`
151
+ - **`sql.lateral: false`** -- No LATERAL join support; `includeMany` uses correlated subquery fallback
152
+ - **`sql.jsonAgg: true`** -- Supports JSON aggregation via `json_group_array()` for `includeMany`
153
153
  - **`sql.returning: true`** -- Supports RETURNING clauses for DML operations (SQLite 3.35+)
154
154
  - **`sql.enums: false`** -- No native enum support
155
155
 
156
- ## JSON Aggregation
156
+ ## includeMany Support
157
157
 
158
- The renderer lowers JSON-aggregation AST nodes using SQLite's `json_group_array()` and `json_object()`:
158
+ The adapter supports `includeMany` for nested array includes using SQLite's `json_group_array()` and `json_object()`:
159
159
 
160
- - `json_group_array(json_object(...))` inside a scalar subquery aggregates a row set into a JSON array of objects
161
- - The scalar subquery correlates against the outer row through its WHERE clause
162
- - `COALESCE(..., '[]')` yields an empty array when the row set is empty
160
+ **Lowering Strategy:**
161
+ - Renders `includeMany` as a correlated subquery with `json_group_array(json_object(...))` to aggregate child rows into a JSON array
162
+ - Uses `COALESCE(..., '[]')` to handle empty results
163
163
 
164
164
  **Example SQL Output:**
165
165
  ```sql
@@ -1,43 +1,6 @@
1
1
  import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
2
- import { isDdlNode } from "@prisma-next/sql-relational-core/ast";
3
2
  import { parseContractMarkerRow } from "@prisma-next/sql-runtime";
4
3
  import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
5
- //#region src/core/ddl-renderer.ts
6
- var SqliteDdlVisitorImpl = class {
7
- createTable(node) {
8
- return `CREATE TABLE ${node.ifNotExists ? "IF NOT EXISTS " : ""}${node.table} (\n ${node.columns.map((column) => renderColumn$1(column)).join(",\n ")}\n )`;
9
- }
10
- };
11
- const defaultVisitor = {
12
- literal(node) {
13
- const { value } = node;
14
- if (typeof value === "string") return `DEFAULT '${escapeLiteral(value)}'`;
15
- if (typeof value === "number" || typeof value === "boolean") return `DEFAULT ${String(value)}`;
16
- if (value === null) return "DEFAULT NULL";
17
- return `DEFAULT '${JSON.stringify(value)}'`;
18
- },
19
- function(node) {
20
- if (node.expression === "autoincrement()") return "";
21
- return `DEFAULT (${node.expression})`;
22
- }
23
- };
24
- function renderColumn$1(column) {
25
- if (column.type.includes("AUTOINCREMENT")) return `${column.name} ${column.type}`;
26
- const parts = [column.name, column.type];
27
- if (column.notNull) parts.push("NOT NULL");
28
- if (column.primaryKey) parts.push("PRIMARY KEY");
29
- const defaultClause = column.default ? column.default.accept(defaultVisitor) : "";
30
- if (defaultClause.length > 0) parts.push(defaultClause);
31
- return parts.join(" ");
32
- }
33
- function renderLoweredDdl(ast) {
34
- const sql = ast.accept(new SqliteDdlVisitorImpl());
35
- return Object.freeze({
36
- sql,
37
- params: Object.freeze([])
38
- });
39
- }
40
- //#endregion
41
4
  //#region src/core/adapter.ts
42
5
  const defaultCapabilities = Object.freeze({ sql: {
43
6
  orderBy: true,
@@ -60,7 +23,6 @@ var SqliteAdapterImpl = class {
60
23
  });
61
24
  }
62
25
  lower(ast, context) {
63
- if (isDdlNode(ast)) return renderLoweredDdl(ast);
64
26
  return renderLoweredSql(ast, context.contract);
65
27
  }
66
28
  };
@@ -103,7 +65,7 @@ function renderLoweredSql(ast, contract) {
103
65
  sql = renderUpdate(node, contract);
104
66
  break;
105
67
  case "delete":
106
- sql = renderDelete(node, contract);
68
+ sql = renderDelete(node);
107
69
  break;
108
70
  default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
109
71
  }
@@ -137,23 +99,14 @@ function renderProjection(projection, contract) {
137
99
  return `${renderExpr(item.expr, contract)} AS ${alias}`;
138
100
  }).join(", ");
139
101
  }
140
- function qualifyTableFromNamespaceCoordinate(table, contract) {
141
- if (table.namespaceId === void 0) return quoteIdentifier(table.name);
142
- const namespace = contract.storage.namespaces[table.namespaceId];
143
- if (namespace === void 0) throw new Error(`Table "${table.name}" references namespace "${table.namespaceId}" which is not present on the contract`);
144
- const qualifyTable = namespace.qualifyTable;
145
- if (qualifyTable === void 0) throw new Error(`Table "${table.name}" references namespace "${table.namespaceId}" which is not materialised for SQL rendering on the contract`);
146
- return qualifyTable.call(namespace, table.name);
147
- }
148
- function renderTableSource(source, contract) {
149
- const qualified = qualifyTableFromNamespaceCoordinate(source, contract);
150
- if (!source.alias) return qualified;
151
- return `${qualified} AS ${quoteIdentifier(source.alias)}`;
152
- }
153
102
  function renderSource(source, contract) {
154
103
  const node = source;
155
104
  switch (node.kind) {
156
- case "table-source": return renderTableSource(node, contract);
105
+ case "table-source": {
106
+ const table = quoteIdentifier(node.name);
107
+ if (!node.alias) return table;
108
+ return `${table} AS ${quoteIdentifier(node.alias)}`;
109
+ }
157
110
  case "derived-table-source": return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
158
111
  default: throw new Error(`Unsupported source node kind: ${node.kind}`);
159
112
  }
@@ -176,9 +129,7 @@ function renderExpr(expr, contract) {
176
129
  case "or":
177
130
  if (node.exprs.length === 0) return "FALSE";
178
131
  return `(${node.exprs.map((part) => renderExpr(part, contract)).join(" OR ")})`;
179
- case "exists":
180
- if (contract === void 0) throw new Error("EXISTS subquery rendering requires a Sqlite contract");
181
- return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract)})`;
132
+ case "exists": return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract)})`;
182
133
  case "null-check": return renderNullCheck(node, contract);
183
134
  case "not": return `NOT (${renderExpr(node.expr, contract)})`;
184
135
  case "param-ref":
@@ -216,7 +167,6 @@ function renderOperation(expr, contract) {
216
167
  }
217
168
  function renderSubqueryExpr(expr, contract) {
218
169
  if (expr.query.projection.length !== 1) throw new Error("Subquery expressions must project exactly one column");
219
- if (contract === void 0) throw new Error("Subquery expression rendering requires a Sqlite contract");
220
170
  return `(${renderSelect(expr.query, contract)})`;
221
171
  }
222
172
  function renderNullCheck(expr, contract) {
@@ -297,7 +247,6 @@ function renderJsonArrayAggExpr(expr, contract) {
297
247
  return aggregated;
298
248
  }
299
249
  function renderJoin(join, contract) {
300
- if (contract === void 0) throw new Error("JOIN rendering requires a Sqlite contract");
301
250
  return `${join.joinType.toUpperCase()} JOIN ${renderSource(join.source, contract)} ON ${renderJoinOn(join.on, contract)}`;
302
251
  }
303
252
  function renderJoinOn(on, contract) {
@@ -314,7 +263,7 @@ function renderInsertValue(value) {
314
263
  }
315
264
  }
316
265
  function renderInsert(ast, contract) {
317
- const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
266
+ const table = quoteIdentifier(ast.table.name);
318
267
  const rows = ast.rows;
319
268
  if (rows.length === 0) throw new Error("INSERT requires at least one row");
320
269
  const firstRow = rows[0];
@@ -355,7 +304,7 @@ function renderInsert(ast, contract) {
355
304
  return `${insertClause}${onConflictClause}${returningClause}`;
356
305
  }
357
306
  function renderUpdate(ast, contract) {
358
- const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
307
+ const table = quoteIdentifier(ast.table.name);
359
308
  const setClauses = Object.entries(ast.set).map(([col, val]) => {
360
309
  return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;
361
310
  });
@@ -363,8 +312,8 @@ function renderUpdate(ast, contract) {
363
312
  const returningClause = renderReturning(ast.returning);
364
313
  return `UPDATE ${table} SET ${setClauses.join(", ")}${whereClause}${returningClause}`;
365
314
  }
366
- function renderDelete(ast, contract) {
367
- return `DELETE FROM ${qualifyTableFromNamespaceCoordinate(ast.table, contract)}${ast.where ? ` WHERE ${renderExpr(ast.where)}` : ""}${renderReturning(ast.returning)}`;
315
+ function renderDelete(ast) {
316
+ return `DELETE FROM ${quoteIdentifier(ast.table.name)}${ast.where ? ` WHERE ${renderExpr(ast.where)}` : ""}${renderReturning(ast.returning)}`;
368
317
  }
369
318
  function renderReturning(returning) {
370
319
  if (!returning?.length) return "";
@@ -394,6 +343,6 @@ function createSqliteAdapter(options) {
394
343
  return Object.freeze(new SqliteAdapterImpl(options));
395
344
  }
396
345
  //#endregion
397
- export { renderLoweredDdl as i, renderLoweredSql as n, sqliteRawCodecInferer as r, createSqliteAdapter as t };
346
+ export { renderLoweredSql as n, sqliteRawCodecInferer as r, createSqliteAdapter as t };
398
347
 
399
- //# sourceMappingURL=adapter-oxTARI-j.mjs.map
348
+ //# sourceMappingURL=adapter-BOg2xl4V.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-BOg2xl4V.mjs","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":["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 MarkerReadResult,\n NullCheckExpr,\n OperationExpr,\n OrderByItem,\n ProjectionItem,\n RawExpr,\n RawSqlLiteral,\n SelectAst,\n SqlQueryable,\n SubqueryExpr,\n UpdateAst,\n WindowFuncExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport { parseContractMarkerRow } from '@prisma-next/sql-runtime';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\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 this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) => readSqliteMarker(queryable),\n });\n }\n\n lower(ast: AnyQueryAst, context: LowererContext<SqliteContract>): SqliteLoweredStatement {\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);\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 renderSource(source: AnyFromSource, contract?: SqliteContract): string {\n const node = source;\n switch (node.kind) {\n case 'table-source': {\n const table = quoteIdentifier(node.name);\n if (!node.alias) {\n return table;\n }\n return `${table} AS ${quoteIdentifier(node.alias)}`;\n }\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 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 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 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 '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 = quoteIdentifier(ast.table.name);\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 = quoteIdentifier(ast.table.name);\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): string {\n const table = quoteIdentifier(ast.table.name);\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\nasync function readSqliteMarker(queryable: SqlQueryable): Promise<MarkerReadResult> {\n const exists = await queryable.query(\n \"select 1 from sqlite_master where type = 'table' and name = ?\",\n ['_prisma_marker'],\n );\n if (exists.rows.length === 0) {\n return { kind: 'no-table' };\n }\n\n const result = await queryable.query(\n 'select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from _prisma_marker where space = ?',\n [APP_SPACE_ID],\n );\n const row = result.rows[0];\n if (!row) {\n return { kind: 'absent' };\n }\n // SQLite stores arrays as JSON-encoded TEXT (no native array type), so the driver returns `invariants` as a string. Decode before delegating to the shared row schema, which expects `string[]`.\n const raw = row as Record<string, unknown>;\n const invariants =\n typeof raw['invariants'] === 'string'\n ? (JSON.parse(raw['invariants']) as unknown)\n : raw['invariants'];\n return { kind: 'present', record: parseContractMarkerRow({ ...raw, invariants }) };\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { n as SqliteContract, r as SqliteLoweredStatement, t as SqliteAdapterOptions } from "./types-bTlW__XL.mjs";
2
2
  import { Adapter, AdapterProfile, AnyQueryAst, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
3
  import { RawCodecInferer } from "@prisma-next/sql-relational-core/expression";
4
- import { SqliteDdlNode } from "@prisma-next/target-sqlite/ddl";
5
4
 
6
5
  //#region src/core/adapter.d.ts
7
6
  declare class SqliteAdapterImpl implements Adapter<AnyQueryAst, SqliteContract, SqliteLoweredStatement> {
@@ -9,11 +8,11 @@ declare class SqliteAdapterImpl implements Adapter<AnyQueryAst, SqliteContract,
9
8
  readonly targetId: "sqlite";
10
9
  readonly profile: AdapterProfile<'sqlite'>;
11
10
  constructor(options?: SqliteAdapterOptions);
12
- lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<SqliteContract>): SqliteLoweredStatement;
11
+ lower(ast: AnyQueryAst, context: LowererContext<SqliteContract>): SqliteLoweredStatement;
13
12
  }
14
13
  /** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a sqlite client. Contributed as the descriptor's static `rawCodecInferer` slot. */
15
14
  declare const sqliteRawCodecInferer: RawCodecInferer;
16
15
  declare function createSqliteAdapter(options?: SqliteAdapterOptions): Readonly<SqliteAdapterImpl>;
17
16
  //#endregion
18
17
  export { sqliteRawCodecInferer as n, createSqliteAdapter as t };
19
- //# sourceMappingURL=adapter-DJmACrLG.d.mts.map
18
+ //# sourceMappingURL=adapter-Cn_t9TdZ.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-Cn_t9TdZ.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;cAkDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EAStB,KAAA,CAAM,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,cAAA,CAAe,cAAA,IAAkB,sBAAA;AAAA;;cAMvD,qBAAA,EAAuB,eAoBnC;AAAA,iBA+fe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
@@ -1,2 +1,2 @@
1
- import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-DJmACrLG.mjs";
1
+ import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-Cn_t9TdZ.mjs";
2
2
  export { createSqliteAdapter, sqliteRawCodecInferer };
package/dist/adapter.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-oxTARI-j.mjs";
1
+ import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-BOg2xl4V.mjs";
2
2
  export { createSqliteAdapter, sqliteRawCodecInferer };
@@ -1,11 +1,10 @@
1
1
  import { ControlDriverInstance } from "@prisma-next/framework-components/control";
2
- import { AnyQueryAst, DdlNode, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
2
  import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
4
3
  import { parseSqliteDefault, parseSqliteDefault as parseSqliteDefault$1 } from "@prisma-next/target-sqlite/default-normalizer";
5
4
  import { normalizeSqliteNativeType, normalizeSqliteNativeType as normalizeSqliteNativeType$1 } from "@prisma-next/target-sqlite/native-type-normalizer";
6
5
  import { SqlControlAdapterDescriptor } from "@prisma-next/family-sql/control";
7
- import { SqliteDdlNode } from "@prisma-next/target-sqlite/ddl";
8
- import { ContractMarkerRecord, LedgerEntryRecord } from "@prisma-next/contract/types";
6
+ import { AnyQueryAst, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
7
+ import { ContractMarkerRecord } from "@prisma-next/contract/types";
9
8
  import { SqlControlAdapter } from "@prisma-next/family-sql/control-adapter";
10
9
  import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
11
10
 
@@ -15,8 +14,6 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
15
14
  readonly targetId: "sqlite";
16
15
  readonly normalizeDefault: typeof parseSqliteDefault$1;
17
16
  readonly normalizeNativeType: typeof normalizeSqliteNativeType$1;
18
- bootstrapControlTableQueries(): readonly DdlNode[];
19
- bootstrapSignMarkerQueries(): readonly DdlNode[];
20
17
  /**
21
18
  * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
22
19
  *
@@ -25,7 +22,7 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
25
22
  * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)
26
23
  * without instantiating the runtime adapter.
27
24
  */
28
- lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement;
25
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;
29
26
  /**
30
27
  * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`
31
28
  * first so a fresh database (no marker table) returns `null` instead of a
@@ -38,12 +35,6 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
38
35
  * fresh database without the marker table returns an empty map.
39
36
  */
40
37
  readAllMarkers(driver: ControlDriverInstance<'sql', 'sqlite'>): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
41
- /**
42
- * Reads per-migration ledger rows for `space` from `_prisma_ledger` in
43
- * apply order. Probes `sqlite_master` first so a fresh database without
44
- * the ledger table returns `[]` instead of raising "no such table".
45
- */
46
- readLedger(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string): Promise<readonly LedgerEntryRecord[]>;
47
38
  introspect(driver: ControlDriverInstance<'sql', 'sqlite'>, _contract?: unknown): Promise<SqlSchemaIR>;
48
39
  }
49
40
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cA2Ga,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EAE5B,4BAAA,CAAA,YAAyC,OAAA;EAIzC,0BAAA,CAAA,YAAuC,OAAA;EAPd;;;;;;;;EAmBzB,KAAA,CAAM,GAAA,EAAK,WAAA,GAAc,aAAA,EAAe,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAehE;;;;;EAHL,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAqHD;;;;;EA9DJ,cAAA,CACJ,MAAA,EAAQ,qBAAA,oBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EA/FY;;;;;EA0JrC,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,WACC,OAAA,UAAiB,iBAAA;EAmDd,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cCpTP,uBAAA,EAAyB,2BAA2B"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;cAgGa,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EALI;;;;;;;;EAehC,KAAA,CAAM,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAYxD;;;;;EAHG,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAkHA;;;;;EA3DL,cAAA,CACJ,MAAA,EAAQ,qBAAA,oBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAsDzB,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cCnOP,uBAAA,EAAyB,2BAA2B"}
package/dist/control.mjs CHANGED
@@ -1,44 +1,17 @@
1
- import { i as renderLoweredDdl, n as renderLoweredSql } from "./adapter-oxTARI-j.mjs";
1
+ import { n as renderLoweredSql } from "./adapter-BOg2xl4V.mjs";
2
2
  import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-yjlqZvLC.mjs";
3
3
  import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
4
- import { isDdlNode } from "@prisma-next/sql-relational-core/ast";
5
4
  import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
6
5
  import { SQLITE_BIGINT_CODEC_ID, SQLITE_BLOB_CODEC_ID, SQLITE_DATETIME_CODEC_ID, SQLITE_INTEGER_CODEC_ID, SQLITE_JSON_CODEC_ID, SQLITE_REAL_CODEC_ID, SQLITE_TEXT_CODEC_ID } from "@prisma-next/target-sqlite/codec-ids";
7
6
  import { parseMarkerRowSafely, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
8
7
  import { parseContractMarkerRow } from "@prisma-next/family-sql/verify";
9
- import { buildControlTableBootstrapQueries, buildSignMarkerBootstrapQueries } from "@prisma-next/target-sqlite/contract-free";
10
8
  import { parseSqliteDefault, parseSqliteDefault as parseSqliteDefault$1 } from "@prisma-next/target-sqlite/default-normalizer";
11
9
  import { normalizeSqliteNativeType, normalizeSqliteNativeType as normalizeSqliteNativeType$1 } from "@prisma-next/target-sqlite/native-type-normalizer";
12
10
  import { ifDefined } from "@prisma-next/utils/defined";
13
11
  import { timestampNowControlDescriptor } from "@prisma-next/family-sql/control";
14
12
  import { builtinGeneratorRegistryMetadata, resolveBuiltinGeneratedColumnDescriptor } from "@prisma-next/ids";
15
- //#region ../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs
16
- function ledgerOriginFromStored(originCoreHash) {
17
- if (originCoreHash === null || originCoreHash === "" || originCoreHash === "sha256:empty") return null;
18
- return originCoreHash;
19
- }
20
- //#endregion
21
- //#region src/core/ledger-decode.ts
22
- const DESIGNATOR_LESS_UTC_DATETIME = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(\.\d+)?$/;
23
- function coerceLedgerAppliedAt(value) {
24
- if (value instanceof Date) return value;
25
- if (DESIGNATOR_LESS_UTC_DATETIME.test(value)) return /* @__PURE__ */ new Date(`${value.replace(" ", "T")}Z`);
26
- return new Date(value);
27
- }
28
- function operationCountFromStored(operations) {
29
- if (Array.isArray(operations)) return operations.length;
30
- if (typeof operations === "string") try {
31
- const parsed = JSON.parse(operations);
32
- return Array.isArray(parsed) ? parsed.length : 0;
33
- } catch {
34
- return 0;
35
- }
36
- return 0;
37
- }
38
- //#endregion
39
13
  //#region src/core/control-adapter.ts
40
14
  const SQLITE_MARKER_TABLE = "_prisma_marker";
41
- const SQLITE_LEDGER_TABLE = "_prisma_ledger";
42
15
  /**
43
16
  * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the
44
17
  * driver returns `invariants` as a string. Decode before delegating to the
@@ -67,12 +40,6 @@ var SqliteControlAdapter = class {
67
40
  targetId = "sqlite";
68
41
  normalizeDefault = parseSqliteDefault$1;
69
42
  normalizeNativeType = normalizeSqliteNativeType$1;
70
- bootstrapControlTableQueries() {
71
- return buildControlTableBootstrapQueries();
72
- }
73
- bootstrapSignMarkerQueries() {
74
- return buildSignMarkerBootstrapQueries();
75
- }
76
43
  /**
77
44
  * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
78
45
  *
@@ -82,7 +49,6 @@ var SqliteControlAdapter = class {
82
49
  * without instantiating the runtime adapter.
83
50
  */
84
51
  lower(ast, context) {
85
- if (isDdlNode(ast)) return renderLoweredDdl(ast);
86
52
  return renderLoweredSql(ast, context.contract);
87
53
  }
88
54
  /**
@@ -139,37 +105,6 @@ var SqliteControlAdapter = class {
139
105
  }));
140
106
  return rows;
141
107
  }
142
- /**
143
- * Reads per-migration ledger rows for `space` from `_prisma_ledger` in
144
- * apply order. Probes `sqlite_master` first so a fresh database without
145
- * the ledger table returns `[]` instead of raising "no such table".
146
- */
147
- async readLedger(driver, space) {
148
- const ledgerContext = {
149
- space,
150
- markerLocation: SQLITE_LEDGER_TABLE
151
- };
152
- if ((await withMarkerReadErrorHandling(() => driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, ["_prisma_ledger"]), ledgerContext)).rows.length === 0) return [];
153
- return (await withMarkerReadErrorHandling(() => driver.query(`SELECT
154
- space,
155
- migration_name,
156
- migration_hash,
157
- origin_core_hash,
158
- destination_core_hash,
159
- operations,
160
- created_at
161
- FROM _prisma_ledger
162
- WHERE space = ?
163
- ORDER BY id`, [space]), ledgerContext)).rows.map((row) => ({
164
- space: row.space,
165
- migrationName: row.migration_name,
166
- migrationHash: row.migration_hash,
167
- from: ledgerOriginFromStored(row.origin_core_hash),
168
- to: row.destination_core_hash,
169
- appliedAt: coerceLedgerAppliedAt(row.created_at),
170
- operationCount: operationCountFromStored(row.operations)
171
- }));
172
- }
173
108
  async introspect(driver, _contract) {
174
109
  const tablesResult = await driver.query(`SELECT name FROM sqlite_master
175
110
  WHERE type = 'table'
@@ -1 +1 @@
1
- {"version":3,"file":"control.mjs","names":["parseSqliteDefault","normalizeSqliteNativeType"],"sources":["../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/ledger-decode.ts","../src/core/control-adapter.ts","../src/core/control-mutation-defaults.ts","../src/exports/control.ts"],"sourcesContent":["import \"../constants-DWV9_o2Z.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","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 { 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 {\n APP_SPACE_ID,\n type ControlDriverInstance,\n} from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport type {\n AnyQueryAst,\n DdlNode,\n LoweredStatement,\n LowererContext,\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 { 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 { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\n/**\n * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the\n * driver returns `invariants` as a string. Decode before delegating to the\n * shared row schema, which expects `string[]`. A non-JSON value here is a\n * corrupt row and surfaces as `Invalid contract marker row: …` via the\n * typed-envelope wrapper.\n */\nfunction 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\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 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 return renderLoweredDdl(ast);\n }\n return renderLoweredSql(ast, context.contract as SqliteContract);\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: ControlDriverInstance<'sql', 'sqlite'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return null;\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker\n WHERE space = ?`,\n [space],\n ),\n markerContext,\n );\n\n const row = result.rows[0];\n if (!row) return null;\n return parseMarkerRowSafely(\n row,\n (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)),\n markerContext,\n );\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: ControlDriverInstance<'sql', 'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return new Map();\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n space,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker`,\n ),\n markerContext,\n );\n\n const rows = new Map<string, ContractMarkerRecord>();\n for (const row of result.rows) {\n rows.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 rows;\n }\n\n /**\n * Reads per-migration ledger rows for `space` from `_prisma_ledger` in\n * apply order. Probes `sqlite_master` first so a fresh database without\n * the ledger table returns `[]` instead of raising \"no such table\".\n */\n async readLedger(\n driver: ControlDriverInstance<'sql', 'sqlite'>,\n space: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space, markerLocation: SQLITE_LEDGER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_ledger',\n ]),\n ledgerContext,\n );\n if (exists.rows.length === 0) {\n return [];\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n migration_name: string;\n migration_hash: string;\n origin_core_hash: string | null;\n destination_core_hash: string;\n operations: unknown;\n created_at: Date | string;\n }>(\n `SELECT\n space,\n migration_name,\n migration_hash,\n origin_core_hash,\n destination_core_hash,\n operations,\n created_at\n FROM _prisma_ledger\n WHERE space = ?\n ORDER BY id`,\n [space],\n ),\n ledgerContext,\n );\n\n return result.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 async introspect(\n driver: ControlDriverInstance<'sql', '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","import type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { timestampNowControlDescriptor } from '@prisma-next/family-sql/control';\nimport type {\n ControlMutationDefaultEntry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport {\n builtinGeneratorRegistryMetadata,\n resolveBuiltinGeneratedColumnDescriptor,\n} from '@prisma-next/ids';\nimport type {\n DefaultFunctionLoweringContext,\n DefaultFunctionLoweringHandler,\n} from '@prisma-next/sql-contract-psl';\nimport {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\ntype LoweredDefaultResult = ReturnType<DefaultFunctionLoweringHandler>;\ntype ParsedDefaultFunctionCall = Parameters<DefaultFunctionLoweringHandler>[0]['call'];\n\nfunction invalidArgumentDiagnostic(input: {\n readonly context: DefaultFunctionLoweringContext;\n readonly span: ParsedDefaultFunctionCall['span'];\n readonly message: string;\n}): LoweredDefaultResult {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: input.message,\n sourceId: input.context.sourceId,\n span: input.span,\n },\n };\n}\n\nfunction executionGenerator(\n id: ExecutionMutationDefaultValue['id'],\n params?: Record<string, unknown>,\n): LoweredDefaultResult {\n return {\n ok: true,\n value: {\n kind: 'execution',\n generated: {\n kind: 'generator',\n id,\n ...(params ? { params } : {}),\n },\n },\n };\n}\n\nfunction expectNoArgs(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n readonly usage: string;\n}): LoweredDefaultResult | undefined {\n if (input.call.args.length === 0) {\n return undefined;\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: `Default function \"${input.call.name}\" does not accept arguments. Use ${input.usage}.`,\n });\n}\n\nfunction parseIntegerArgument(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!/^-?\\d+$/.test(trimmed)) {\n return undefined;\n }\n const value = Number(trimmed);\n if (!Number.isInteger(value)) {\n return undefined;\n }\n return value;\n}\n\nfunction parseStringLiteral(raw: string): string | undefined {\n const match = raw.trim().match(/^(['\"])(.*)\\1$/s);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction lowerAutoincrement(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`autoincrement()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'autoincrement()',\n },\n },\n };\n}\n\nfunction lowerNow(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`now()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'now()',\n },\n },\n };\n}\n\nfunction lowerUuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('uuidv4');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"uuid\" accepts at most one version argument: `uuid()`, `uuid(4)`, or `uuid(7)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 4) {\n return executionGenerator('uuidv4');\n }\n if (version === 7) {\n return executionGenerator('uuidv7');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message:\n 'Default function \"uuid\" supports only `uuid()`, `uuid(4)`, or `uuid(7)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerCuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message:\n 'Default function \"cuid()\" is not supported in SQL PSL provider v1. Use `cuid(2)` instead.',\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: 'Default function \"cuid\" accepts exactly one version argument: `cuid(2)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 2) {\n return executionGenerator('cuid2');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"cuid\" supports only `cuid(2)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerUlid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`ulid()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return executionGenerator('ulid');\n}\n\nfunction lowerNanoid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('nanoid');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"nanoid\" accepts at most one size argument: `nanoid()` or `nanoid(<2-255>)`.',\n });\n }\n const size = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (size !== undefined && size >= 2 && size <= 255) {\n return executionGenerator('nanoid', { size });\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"nanoid\" size argument must be an integer between 2 and 255.',\n });\n}\n\n/**\n * SQLite spellings that all denote the same wall-clock-now value. Anything\n * matching this set when passed through `dbgenerated(\"...\")` is rewritten\n * to the canonical `now()` form before entering the contract — symmetric\n * with `parseSqliteDefault` on the introspection side, so the verifier\n * compares canonical-vs-canonical and a contract using\n * `dbgenerated(\"CURRENT_TIMESTAMP\")` doesn't drift against the schema it\n * just produced.\n */\nconst NOW_SYNONYMS = new Set(['current_timestamp', \"datetime('now')\", 'datetime(\"now\")', 'now()']);\n\nfunction lowerDbgenerated(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"dbgenerated\" requires exactly one string argument: `dbgenerated(\"...\")`.',\n });\n }\n const rawExpression = parseStringLiteral(input.call.args[0]?.raw ?? '');\n if (rawExpression === undefined) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument must be a string literal.',\n });\n }\n const trimmed = rawExpression.trim();\n if (trimmed.length === 0) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument cannot be empty.',\n });\n }\n const expression = NOW_SYNONYMS.has(trimmed.toLowerCase()) ? 'now()' : trimmed;\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression,\n },\n },\n };\n}\n\nconst sqliteDefaultFunctionRegistryEntries = [\n ['autoincrement', { lower: lowerAutoincrement, usageSignatures: ['autoincrement()'] }],\n ['now', { lower: lowerNow, usageSignatures: ['now()'] }],\n ['uuid', { lower: lowerUuid, usageSignatures: ['uuid()', 'uuid(4)', 'uuid(7)'] }],\n ['cuid', { lower: lowerCuid, usageSignatures: ['cuid(2)'] }],\n ['ulid', { lower: lowerUlid, usageSignatures: ['ulid()'] }],\n ['nanoid', { lower: lowerNanoid, usageSignatures: ['nanoid()', 'nanoid(<2-255>)'] }],\n ['dbgenerated', { lower: lowerDbgenerated, usageSignatures: ['dbgenerated(\"...\")'] }],\n] satisfies ReadonlyArray<readonly [string, ControlMutationDefaultEntry]>;\n\nconst sqliteScalarTypeDescriptors = new Map<string, string>([\n ['String', SQLITE_TEXT_CODEC_ID],\n ['Int', SQLITE_INTEGER_CODEC_ID],\n ['BigInt', SQLITE_BIGINT_CODEC_ID],\n ['Float', SQLITE_REAL_CODEC_ID],\n ['Decimal', SQLITE_TEXT_CODEC_ID],\n ['DateTime', SQLITE_DATETIME_CODEC_ID],\n ['Json', SQLITE_JSON_CODEC_ID],\n ['Bytes', SQLITE_BLOB_CODEC_ID],\n]);\n\nexport function createSqliteDefaultFunctionRegistry(): ReadonlyMap<\n string,\n ControlMutationDefaultEntry\n> {\n return new Map(sqliteDefaultFunctionRegistryEntries);\n}\n\nexport function createSqliteMutationDefaultGeneratorDescriptors(): readonly MutationDefaultGeneratorDescriptor[] {\n return [\n ...builtinGeneratorRegistryMetadata.map(\n ({ id, applicableCodecIds }): MutationDefaultGeneratorDescriptor => ({\n id,\n applicableCodecIds,\n resolveGeneratedColumnDescriptor: ({ generated }) => {\n if (generated.kind !== 'generator' || generated.id !== id) {\n return undefined;\n }\n const descriptor = resolveBuiltinGeneratedColumnDescriptor({\n id,\n ...(generated.params ? { params: generated.params } : {}),\n });\n return {\n codecId: descriptor.type.codecId,\n nativeType: descriptor.type.nativeType,\n ...(descriptor.type.typeRef ? { typeRef: descriptor.type.typeRef } : {}),\n ...(descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}),\n };\n },\n }),\n ),\n timestampNowControlDescriptor(),\n ];\n}\n\nexport function createSqliteScalarTypeDescriptors(): ReadonlyMap<string, string> {\n return new Map(sqliteScalarTypeDescriptors);\n}\n","import type { SqlControlAdapterDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { SqliteControlAdapter } from '../core/control-adapter';\nimport {\n createSqliteDefaultFunctionRegistry,\n createSqliteMutationDefaultGeneratorDescriptors,\n createSqliteScalarTypeDescriptors,\n} from '../core/control-mutation-defaults';\nimport { sqliteAdapterDescriptorMeta } from '../core/descriptor-meta';\n\nconst sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'> = {\n ...sqliteAdapterDescriptorMeta,\n scalarTypeDescriptors: createSqliteScalarTypeDescriptors(),\n controlMutationDefaults: {\n defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),\n generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors(),\n },\n create(): SqlControlAdapter<'sqlite'> {\n return new SqliteControlAdapter();\n },\n};\n\nexport default sqliteAdapterDescriptor;\n\n// `parseSqliteDefault`, `normalizeSqliteNativeType`, `quoteIdentifier`,\n// `escapeLiteral`, and `SqlEscapeError` live target-side (one-way\n// `adapter → target` edge, matching Postgres). Re-exported from the\n// adapter so consumers — both internal and downstream — see the same\n// adapter-shaped surface across SQL targets.\nexport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nexport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nexport {\n escapeLiteral,\n quoteIdentifier,\n SqlEscapeError,\n} from '@prisma-next/target-sqlite/sql-utils';\n\n// `SqlControlAdapterDescriptor` is declared in two places in the codebase\n// (`family-sql/control-adapter` and `family-sql/migrations/types`); the\n// migrations-side declaration narrows `create()`'s return type to the base\n// `ControlAdapterInstance`, hiding `introspect`/`readMarker`. Until that's\n// reconciled upstream, downstream consumers (e2e harness, integration\n// tests) need direct access to the concrete class. Mirrors how Postgres'\n// own package tests import `PostgresControlAdapter` directly.\nexport { SqliteControlAdapter } from '../core/control-adapter';\n"],"mappings":"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"}
1
+ {"version":3,"file":"control.mjs","names":["parseSqliteDefault","normalizeSqliteNativeType"],"sources":["../src/core/control-adapter.ts","../src/core/control-mutation-defaults.ts","../src/exports/control.ts"],"sourcesContent":["import type { ContractMarkerRecord } 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 {\n APP_SPACE_ID,\n type ControlDriverInstance,\n} from '@prisma-next/framework-components/control';\nimport type {\n AnyQueryAst,\n LoweredStatement,\n LowererContext,\n} 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 { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nimport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\n\n/**\n * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the\n * driver returns `invariants` as a string. Decode before delegating to the\n * shared row schema, which expects `string[]`. A non-JSON value here is a\n * corrupt row and surfaces as `Invalid contract marker row: …` via the\n * typed-envelope wrapper.\n */\nfunction 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\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 readonly normalizeDefault = parseSqliteDefault;\n readonly normalizeNativeType = normalizeSqliteNativeType;\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, context: LowererContext<unknown>): LoweredStatement {\n return renderLoweredSql(ast, context.contract as SqliteContract);\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: ControlDriverInstance<'sql', 'sqlite'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return null;\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker\n WHERE space = ?`,\n [space],\n ),\n markerContext,\n );\n\n const row = result.rows[0];\n if (!row) return null;\n return parseMarkerRowSafely(\n row,\n (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)),\n markerContext,\n );\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: ControlDriverInstance<'sql', 'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return new Map();\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n space,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker`,\n ),\n markerContext,\n );\n\n const rows = new Map<string, ContractMarkerRecord>();\n for (const row of result.rows) {\n rows.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 rows;\n }\n\n async introspect(\n driver: ControlDriverInstance<'sql', '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","import type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { timestampNowControlDescriptor } from '@prisma-next/family-sql/control';\nimport type {\n ControlMutationDefaultEntry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport {\n builtinGeneratorRegistryMetadata,\n resolveBuiltinGeneratedColumnDescriptor,\n} from '@prisma-next/ids';\nimport type {\n DefaultFunctionLoweringContext,\n DefaultFunctionLoweringHandler,\n} from '@prisma-next/sql-contract-psl';\nimport {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\ntype LoweredDefaultResult = ReturnType<DefaultFunctionLoweringHandler>;\ntype ParsedDefaultFunctionCall = Parameters<DefaultFunctionLoweringHandler>[0]['call'];\n\nfunction invalidArgumentDiagnostic(input: {\n readonly context: DefaultFunctionLoweringContext;\n readonly span: ParsedDefaultFunctionCall['span'];\n readonly message: string;\n}): LoweredDefaultResult {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: input.message,\n sourceId: input.context.sourceId,\n span: input.span,\n },\n };\n}\n\nfunction executionGenerator(\n id: ExecutionMutationDefaultValue['id'],\n params?: Record<string, unknown>,\n): LoweredDefaultResult {\n return {\n ok: true,\n value: {\n kind: 'execution',\n generated: {\n kind: 'generator',\n id,\n ...(params ? { params } : {}),\n },\n },\n };\n}\n\nfunction expectNoArgs(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n readonly usage: string;\n}): LoweredDefaultResult | undefined {\n if (input.call.args.length === 0) {\n return undefined;\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: `Default function \"${input.call.name}\" does not accept arguments. Use ${input.usage}.`,\n });\n}\n\nfunction parseIntegerArgument(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!/^-?\\d+$/.test(trimmed)) {\n return undefined;\n }\n const value = Number(trimmed);\n if (!Number.isInteger(value)) {\n return undefined;\n }\n return value;\n}\n\nfunction parseStringLiteral(raw: string): string | undefined {\n const match = raw.trim().match(/^(['\"])(.*)\\1$/s);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction lowerAutoincrement(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`autoincrement()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'autoincrement()',\n },\n },\n };\n}\n\nfunction lowerNow(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`now()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'now()',\n },\n },\n };\n}\n\nfunction lowerUuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('uuidv4');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"uuid\" accepts at most one version argument: `uuid()`, `uuid(4)`, or `uuid(7)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 4) {\n return executionGenerator('uuidv4');\n }\n if (version === 7) {\n return executionGenerator('uuidv7');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message:\n 'Default function \"uuid\" supports only `uuid()`, `uuid(4)`, or `uuid(7)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerCuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message:\n 'Default function \"cuid()\" is not supported in SQL PSL provider v1. Use `cuid(2)` instead.',\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: 'Default function \"cuid\" accepts exactly one version argument: `cuid(2)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 2) {\n return executionGenerator('cuid2');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"cuid\" supports only `cuid(2)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerUlid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`ulid()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return executionGenerator('ulid');\n}\n\nfunction lowerNanoid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('nanoid');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"nanoid\" accepts at most one size argument: `nanoid()` or `nanoid(<2-255>)`.',\n });\n }\n const size = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (size !== undefined && size >= 2 && size <= 255) {\n return executionGenerator('nanoid', { size });\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"nanoid\" size argument must be an integer between 2 and 255.',\n });\n}\n\n/**\n * SQLite spellings that all denote the same wall-clock-now value. Anything\n * matching this set when passed through `dbgenerated(\"...\")` is rewritten\n * to the canonical `now()` form before entering the contract — symmetric\n * with `parseSqliteDefault` on the introspection side, so the verifier\n * compares canonical-vs-canonical and a contract using\n * `dbgenerated(\"CURRENT_TIMESTAMP\")` doesn't drift against the schema it\n * just produced.\n */\nconst NOW_SYNONYMS = new Set(['current_timestamp', \"datetime('now')\", 'datetime(\"now\")', 'now()']);\n\nfunction lowerDbgenerated(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"dbgenerated\" requires exactly one string argument: `dbgenerated(\"...\")`.',\n });\n }\n const rawExpression = parseStringLiteral(input.call.args[0]?.raw ?? '');\n if (rawExpression === undefined) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument must be a string literal.',\n });\n }\n const trimmed = rawExpression.trim();\n if (trimmed.length === 0) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument cannot be empty.',\n });\n }\n const expression = NOW_SYNONYMS.has(trimmed.toLowerCase()) ? 'now()' : trimmed;\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression,\n },\n },\n };\n}\n\nconst sqliteDefaultFunctionRegistryEntries = [\n ['autoincrement', { lower: lowerAutoincrement, usageSignatures: ['autoincrement()'] }],\n ['now', { lower: lowerNow, usageSignatures: ['now()'] }],\n ['uuid', { lower: lowerUuid, usageSignatures: ['uuid()', 'uuid(4)', 'uuid(7)'] }],\n ['cuid', { lower: lowerCuid, usageSignatures: ['cuid(2)'] }],\n ['ulid', { lower: lowerUlid, usageSignatures: ['ulid()'] }],\n ['nanoid', { lower: lowerNanoid, usageSignatures: ['nanoid()', 'nanoid(<2-255>)'] }],\n ['dbgenerated', { lower: lowerDbgenerated, usageSignatures: ['dbgenerated(\"...\")'] }],\n] satisfies ReadonlyArray<readonly [string, ControlMutationDefaultEntry]>;\n\nconst sqliteScalarTypeDescriptors = new Map<string, string>([\n ['String', SQLITE_TEXT_CODEC_ID],\n ['Int', SQLITE_INTEGER_CODEC_ID],\n ['BigInt', SQLITE_BIGINT_CODEC_ID],\n ['Float', SQLITE_REAL_CODEC_ID],\n ['Decimal', SQLITE_TEXT_CODEC_ID],\n ['DateTime', SQLITE_DATETIME_CODEC_ID],\n ['Json', SQLITE_JSON_CODEC_ID],\n ['Bytes', SQLITE_BLOB_CODEC_ID],\n]);\n\nexport function createSqliteDefaultFunctionRegistry(): ReadonlyMap<\n string,\n ControlMutationDefaultEntry\n> {\n return new Map(sqliteDefaultFunctionRegistryEntries);\n}\n\nexport function createSqliteMutationDefaultGeneratorDescriptors(): readonly MutationDefaultGeneratorDescriptor[] {\n return [\n ...builtinGeneratorRegistryMetadata.map(\n ({ id, applicableCodecIds }): MutationDefaultGeneratorDescriptor => ({\n id,\n applicableCodecIds,\n resolveGeneratedColumnDescriptor: ({ generated }) => {\n if (generated.kind !== 'generator' || generated.id !== id) {\n return undefined;\n }\n const descriptor = resolveBuiltinGeneratedColumnDescriptor({\n id,\n ...(generated.params ? { params: generated.params } : {}),\n });\n return {\n codecId: descriptor.type.codecId,\n nativeType: descriptor.type.nativeType,\n ...(descriptor.type.typeRef ? { typeRef: descriptor.type.typeRef } : {}),\n ...(descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}),\n };\n },\n }),\n ),\n timestampNowControlDescriptor(),\n ];\n}\n\nexport function createSqliteScalarTypeDescriptors(): ReadonlyMap<string, string> {\n return new Map(sqliteScalarTypeDescriptors);\n}\n","import type { SqlControlAdapterDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { SqliteControlAdapter } from '../core/control-adapter';\nimport {\n createSqliteDefaultFunctionRegistry,\n createSqliteMutationDefaultGeneratorDescriptors,\n createSqliteScalarTypeDescriptors,\n} from '../core/control-mutation-defaults';\nimport { sqliteAdapterDescriptorMeta } from '../core/descriptor-meta';\n\nconst sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'> = {\n ...sqliteAdapterDescriptorMeta,\n scalarTypeDescriptors: createSqliteScalarTypeDescriptors(),\n controlMutationDefaults: {\n defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),\n generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors(),\n },\n create(): SqlControlAdapter<'sqlite'> {\n return new SqliteControlAdapter();\n },\n};\n\nexport default sqliteAdapterDescriptor;\n\n// `parseSqliteDefault`, `normalizeSqliteNativeType`, `quoteIdentifier`,\n// `escapeLiteral`, and `SqlEscapeError` live target-side (one-way\n// `adapter → target` edge, matching Postgres). Re-exported from the\n// adapter so consumers — both internal and downstream — see the same\n// adapter-shaped surface across SQL targets.\nexport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nexport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nexport {\n escapeLiteral,\n quoteIdentifier,\n SqlEscapeError,\n} from '@prisma-next/target-sqlite/sql-utils';\n\n// `SqlControlAdapterDescriptor` is declared in two places in the codebase\n// (`family-sql/control-adapter` and `family-sql/migrations/types`); the\n// migrations-side declaration narrows `create()`'s return type to the base\n// `ControlAdapterInstance`, hiding `introspect`/`readMarker`. Until that's\n// reconciled upstream, downstream consumers (e2e harness, integration\n// tests) need direct access to the concrete class. Mirrors how Postgres'\n// own package tests import `PostgresControlAdapter` directly.\nexport { SqliteControlAdapter } from '../core/control-adapter';\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as createSqliteAdapter } from "./adapter-DJmACrLG.mjs";
1
+ import { t as createSqliteAdapter } from "./adapter-Cn_t9TdZ.mjs";
2
2
  import { SqlRuntimeAdapterDescriptor } from "@prisma-next/sql-runtime";
3
3
  import { RuntimeAdapterInstance } from "@prisma-next/framework-components/execution";
4
4
 
package/dist/runtime.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-oxTARI-j.mjs";
1
+ import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-BOg2xl4V.mjs";
2
2
  import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-yjlqZvLC.mjs";
3
3
  import { builtinGeneratorIds } from "@prisma-next/ids";
4
4
  import { timestampNowRuntimeGenerator } from "@prisma-next/family-sql/runtime";
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-sqlite",
3
- "version": "0.12.0-dev.17",
3
+ "version": "0.12.0-dev.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "dependencies": {
8
- "@prisma-next/cli": "0.12.0-dev.17",
9
- "@prisma-next/contract": "0.12.0-dev.17",
10
- "@prisma-next/contract-authoring": "0.12.0-dev.17",
11
- "@prisma-next/errors": "0.12.0-dev.17",
12
- "@prisma-next/framework-components": "0.12.0-dev.17",
13
- "@prisma-next/family-sql": "0.12.0-dev.17",
14
- "@prisma-next/ids": "0.12.0-dev.17",
15
- "@prisma-next/sql-contract": "0.12.0-dev.17",
16
- "@prisma-next/sql-contract-psl": "0.12.0-dev.17",
17
- "@prisma-next/sql-contract-ts": "0.12.0-dev.17",
18
- "@prisma-next/sql-operations": "0.12.0-dev.17",
19
- "@prisma-next/sql-relational-core": "0.12.0-dev.17",
20
- "@prisma-next/sql-runtime": "0.12.0-dev.17",
21
- "@prisma-next/sql-schema-ir": "0.12.0-dev.17",
22
- "@prisma-next/target-sqlite": "0.12.0-dev.17",
23
- "@prisma-next/utils": "0.12.0-dev.17",
8
+ "@prisma-next/cli": "0.12.0-dev.3",
9
+ "@prisma-next/contract": "0.12.0-dev.3",
10
+ "@prisma-next/contract-authoring": "0.12.0-dev.3",
11
+ "@prisma-next/errors": "0.12.0-dev.3",
12
+ "@prisma-next/framework-components": "0.12.0-dev.3",
13
+ "@prisma-next/family-sql": "0.12.0-dev.3",
14
+ "@prisma-next/ids": "0.12.0-dev.3",
15
+ "@prisma-next/sql-contract": "0.12.0-dev.3",
16
+ "@prisma-next/sql-contract-psl": "0.12.0-dev.3",
17
+ "@prisma-next/sql-contract-ts": "0.12.0-dev.3",
18
+ "@prisma-next/sql-operations": "0.12.0-dev.3",
19
+ "@prisma-next/sql-relational-core": "0.12.0-dev.3",
20
+ "@prisma-next/sql-runtime": "0.12.0-dev.3",
21
+ "@prisma-next/sql-schema-ir": "0.12.0-dev.3",
22
+ "@prisma-next/target-sqlite": "0.12.0-dev.3",
23
+ "@prisma-next/utils": "0.12.0-dev.3",
24
24
  "arktype": "^2.2.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@prisma-next/driver-sqlite": "0.12.0-dev.17",
28
- "@prisma-next/migration-tools": "0.12.0-dev.17",
29
- "@prisma-next/test-utils": "0.12.0-dev.17",
30
- "@prisma-next/tsconfig": "0.12.0-dev.17",
31
- "@prisma-next/tsdown": "0.12.0-dev.17",
27
+ "@prisma-next/driver-sqlite": "0.12.0-dev.3",
28
+ "@prisma-next/migration-tools": "0.12.0-dev.3",
29
+ "@prisma-next/test-utils": "0.12.0-dev.3",
30
+ "@prisma-next/tsconfig": "0.12.0-dev.3",
31
+ "@prisma-next/tsdown": "0.12.0-dev.3",
32
32
  "pathe": "^2.0.3",
33
33
  "tsdown": "0.22.0",
34
34
  "typescript": "5.9.3",
@@ -29,16 +29,12 @@ import type {
29
29
  SelectAst,
30
30
  SqlQueryable,
31
31
  SubqueryExpr,
32
- TableSource,
33
32
  UpdateAst,
34
33
  WindowFuncExpr,
35
34
  } from '@prisma-next/sql-relational-core/ast';
36
- import { isDdlNode } from '@prisma-next/sql-relational-core/ast';
37
35
  import type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';
38
36
  import { parseContractMarkerRow } from '@prisma-next/sql-runtime';
39
- import type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';
40
37
  import { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';
41
- import { renderLoweredDdl } from './ddl-renderer';
42
38
  import type { SqliteAdapterOptions, SqliteContract, SqliteLoweredStatement } from './types';
43
39
 
44
40
  const defaultCapabilities = Object.freeze({
@@ -67,13 +63,7 @@ class SqliteAdapterImpl implements Adapter<AnyQueryAst, SqliteContract, SqliteLo
67
63
  });
68
64
  }
69
65
 
70
- lower(
71
- ast: AnyQueryAst | SqliteDdlNode,
72
- context: LowererContext<SqliteContract>,
73
- ): SqliteLoweredStatement {
74
- if (isDdlNode(ast)) {
75
- return renderLoweredDdl(ast);
76
- }
66
+ lower(ast: AnyQueryAst, context: LowererContext<SqliteContract>): SqliteLoweredStatement {
77
67
  return renderLoweredSql(ast, context.contract);
78
68
  }
79
69
  }
@@ -134,7 +124,7 @@ export function renderLoweredSql(
134
124
  sql = renderUpdate(node, contract);
135
125
  break;
136
126
  case 'delete':
137
- sql = renderDelete(node, contract);
127
+ sql = renderDelete(node);
138
128
  break;
139
129
  default:
140
130
  throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);
@@ -153,7 +143,7 @@ function renderLimitOffset(
153
143
  return `${keyword} ${renderExpr(value, contract)}`;
154
144
  }
155
145
 
156
- function renderSelect(ast: SelectAst, contract: SqliteContract): string {
146
+ function renderSelect(ast: SelectAst, contract?: SqliteContract): string {
157
147
  const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';
158
148
  const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;
159
149
  const fromClause = `FROM ${renderSource(ast.from, contract)}`;
@@ -206,41 +196,16 @@ function renderProjection(
206
196
  .join(', ');
207
197
  }
208
198
 
209
- function qualifyTableFromNamespaceCoordinate(
210
- table: Pick<TableSource, 'name' | 'namespaceId'>,
211
- contract: SqliteContract,
212
- ): string {
213
- if (table.namespaceId === undefined) {
214
- return quoteIdentifier(table.name);
215
- }
216
- const namespace = contract.storage.namespaces[table.namespaceId];
217
- if (namespace === undefined) {
218
- throw new Error(
219
- `Table "${table.name}" references namespace "${table.namespaceId}" which is not present on the contract`,
220
- );
221
- }
222
- const qualifyTable = namespace.qualifyTable;
223
- if (qualifyTable === undefined) {
224
- throw new Error(
225
- `Table "${table.name}" references namespace "${table.namespaceId}" which is not materialised for SQL rendering on the contract`,
226
- );
227
- }
228
- return qualifyTable.call(namespace, table.name);
229
- }
230
-
231
- function renderTableSource(source: TableSource, contract: SqliteContract): string {
232
- const qualified = qualifyTableFromNamespaceCoordinate(source, contract);
233
- if (!source.alias) {
234
- return qualified;
235
- }
236
- return `${qualified} AS ${quoteIdentifier(source.alias)}`;
237
- }
238
-
239
- function renderSource(source: AnyFromSource, contract: SqliteContract): string {
199
+ function renderSource(source: AnyFromSource, contract?: SqliteContract): string {
240
200
  const node = source;
241
201
  switch (node.kind) {
242
- case 'table-source':
243
- return renderTableSource(node, contract);
202
+ case 'table-source': {
203
+ const table = quoteIdentifier(node.name);
204
+ if (!node.alias) {
205
+ return table;
206
+ }
207
+ return `${table} AS ${quoteIdentifier(node.alias)}`;
208
+ }
244
209
  case 'derived-table-source':
245
210
  return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
246
211
  default:
@@ -280,9 +245,6 @@ function renderExpr(expr: AnyExpression, contract?: SqliteContract): string {
280
245
  }
281
246
  return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;
282
247
  case 'exists': {
283
- if (contract === undefined) {
284
- throw new Error('EXISTS subquery rendering requires a Sqlite contract');
285
- }
286
248
  const notKeyword = node.notExists ? 'NOT ' : '';
287
249
  const subquery = renderSelect(node.subquery, contract);
288
250
  return `${notKeyword}EXISTS (${subquery})`;
@@ -359,9 +321,6 @@ function renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): stri
359
321
  if (expr.query.projection.length !== 1) {
360
322
  throw new Error('Subquery expressions must project exactly one column');
361
323
  }
362
- if (contract === undefined) {
363
- throw new Error('Subquery expression rendering requires a Sqlite contract');
364
- }
365
324
  return `(${renderSelect(expr.query, contract)})`;
366
325
  }
367
326
 
@@ -492,9 +451,6 @@ function renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContrac
492
451
  }
493
452
 
494
453
  function renderJoin(join: JoinAst, contract?: SqliteContract): string {
495
- if (contract === undefined) {
496
- throw new Error('JOIN rendering requires a Sqlite contract');
497
- }
498
454
  const joinType = join.joinType.toUpperCase();
499
455
  const source = renderSource(join.source, contract);
500
456
  const onClause = renderJoinOn(join.on, contract);
@@ -523,7 +479,7 @@ function renderInsertValue(value: InsertValue): string {
523
479
  }
524
480
 
525
481
  function renderInsert(ast: InsertAst, contract: SqliteContract): string {
526
- const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
482
+ const table = quoteIdentifier(ast.table.name);
527
483
  const rows = ast.rows;
528
484
  if (rows.length === 0) {
529
485
  throw new Error('INSERT requires at least one row');
@@ -582,7 +538,7 @@ function renderInsert(ast: InsertAst, contract: SqliteContract): string {
582
538
  }
583
539
 
584
540
  function renderUpdate(ast: UpdateAst, contract: SqliteContract): string {
585
- const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
541
+ const table = quoteIdentifier(ast.table.name);
586
542
  const setClauses = Object.entries(ast.set).map(([col, val]) => {
587
543
  return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;
588
544
  });
@@ -593,8 +549,8 @@ function renderUpdate(ast: UpdateAst, contract: SqliteContract): string {
593
549
  return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;
594
550
  }
595
551
 
596
- function renderDelete(ast: DeleteAst, contract: SqliteContract): string {
597
- const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
552
+ function renderDelete(ast: DeleteAst): string {
553
+ const table = quoteIdentifier(ast.table.name);
598
554
  const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';
599
555
  const returningClause = renderReturning(ast.returning);
600
556
 
@@ -1,4 +1,4 @@
1
- import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';
1
+ import type { ContractMarkerRecord } from '@prisma-next/contract/types';
2
2
  import { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';
3
3
  import type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';
4
4
  import { parseContractMarkerRow } from '@prisma-next/family-sql/verify';
@@ -6,14 +6,11 @@ import {
6
6
  APP_SPACE_ID,
7
7
  type ControlDriverInstance,
8
8
  } from '@prisma-next/framework-components/control';
9
- import { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';
10
9
  import type {
11
10
  AnyQueryAst,
12
- DdlNode,
13
11
  LoweredStatement,
14
12
  LowererContext,
15
13
  } from '@prisma-next/sql-relational-core/ast';
16
- import { isDdlNode } from '@prisma-next/sql-relational-core/ast';
17
14
  import type {
18
15
  PrimaryKey,
19
16
  SqlColumnIR,
@@ -24,21 +21,13 @@ import type {
24
21
  SqlTableIR,
25
22
  SqlUniqueIR,
26
23
  } from '@prisma-next/sql-schema-ir/types';
27
- import {
28
- buildControlTableBootstrapQueries,
29
- buildSignMarkerBootstrapQueries,
30
- } from '@prisma-next/target-sqlite/contract-free';
31
- import type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';
32
24
  import { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';
33
25
  import { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';
34
26
  import { ifDefined } from '@prisma-next/utils/defined';
35
27
  import { renderLoweredSql } from './adapter';
36
- import { renderLoweredDdl } from './ddl-renderer';
37
- import { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';
38
28
  import type { SqliteContract } from './types';
39
29
 
40
30
  const SQLITE_MARKER_TABLE = '_prisma_marker';
41
- const SQLITE_LEDGER_TABLE = '_prisma_ledger';
42
31
 
43
32
  /**
44
33
  * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the
@@ -112,14 +101,6 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
112
101
  readonly normalizeDefault = parseSqliteDefault;
113
102
  readonly normalizeNativeType = normalizeSqliteNativeType;
114
103
 
115
- bootstrapControlTableQueries(): readonly DdlNode[] {
116
- return buildControlTableBootstrapQueries();
117
- }
118
-
119
- bootstrapSignMarkerQueries(): readonly DdlNode[] {
120
- return buildSignMarkerBootstrapQueries();
121
- }
122
-
123
104
  /**
124
105
  * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
125
106
  *
@@ -128,10 +109,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
128
109
  * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)
129
110
  * without instantiating the runtime adapter.
130
111
  */
131
- lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement {
132
- if (isDdlNode(ast)) {
133
- return renderLoweredDdl(ast);
134
- }
112
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement {
135
113
  return renderLoweredSql(ast, context.contract as SqliteContract);
136
114
  }
137
115
 
@@ -254,65 +232,6 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
254
232
  return rows;
255
233
  }
256
234
 
257
- /**
258
- * Reads per-migration ledger rows for `space` from `_prisma_ledger` in
259
- * apply order. Probes `sqlite_master` first so a fresh database without
260
- * the ledger table returns `[]` instead of raising "no such table".
261
- */
262
- async readLedger(
263
- driver: ControlDriverInstance<'sql', 'sqlite'>,
264
- space: string,
265
- ): Promise<readonly LedgerEntryRecord[]> {
266
- const ledgerContext = { space, markerLocation: SQLITE_LEDGER_TABLE };
267
- const exists = await withMarkerReadErrorHandling(
268
- () =>
269
- driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [
270
- '_prisma_ledger',
271
- ]),
272
- ledgerContext,
273
- );
274
- if (exists.rows.length === 0) {
275
- return [];
276
- }
277
-
278
- const result = await withMarkerReadErrorHandling(
279
- () =>
280
- driver.query<{
281
- space: string;
282
- migration_name: string;
283
- migration_hash: string;
284
- origin_core_hash: string | null;
285
- destination_core_hash: string;
286
- operations: unknown;
287
- created_at: Date | string;
288
- }>(
289
- `SELECT
290
- space,
291
- migration_name,
292
- migration_hash,
293
- origin_core_hash,
294
- destination_core_hash,
295
- operations,
296
- created_at
297
- FROM _prisma_ledger
298
- WHERE space = ?
299
- ORDER BY id`,
300
- [space],
301
- ),
302
- ledgerContext,
303
- );
304
-
305
- return result.rows.map((row) => ({
306
- space: row.space,
307
- migrationName: row.migration_name,
308
- migrationHash: row.migration_hash,
309
- from: ledgerOriginFromStored(row.origin_core_hash),
310
- to: row.destination_core_hash,
311
- appliedAt: coerceLedgerAppliedAt(row.created_at),
312
- operationCount: operationCountFromStored(row.operations),
313
- }));
314
- }
315
-
316
235
  async introspect(
317
236
  driver: ControlDriverInstance<'sql', 'sqlite'>,
318
237
  _contract?: unknown,
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter-DJmACrLG.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAsDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EAStB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,EAAS,cAAA,CAAe,cAAA,IACvB,sBAAA;AAAA;;cASQ,qBAAA,EAAuB,eAoBnC;AAAA,iBAiiBe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter-oxTARI-j.mjs","names":["renderColumn"],"sources":["../src/core/ddl-renderer.ts","../src/core/adapter.ts"],"sourcesContent":["import type {\n DdlColumn,\n DdlColumnDefaultVisitor,\n FunctionColumnDefault,\n LiteralColumnDefault,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n SqliteCreateTable,\n SqliteDdlNode,\n SqliteDdlVisitor,\n} from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral } from '@prisma-next/target-sqlite/sql-utils';\nimport type { SqliteLoweredStatement } from './types';\n\nclass SqliteDdlVisitorImpl implements SqliteDdlVisitor<string> {\n createTable(node: SqliteCreateTable): string {\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = node.table;\n const columnDefs = node.columns.map((column) => renderColumn(column)).join(',\\n ');\n return `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${columnDefs}\\n )`;\n }\n}\n\nconst defaultVisitor: DdlColumnDefaultVisitor<string> = {\n literal(node: LiteralColumnDefault): string {\n const { value } = node;\n if (typeof value === 'string') {\n return `DEFAULT '${escapeLiteral(value)}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `DEFAULT ${String(value)}`;\n }\n if (value === null) {\n return 'DEFAULT NULL';\n }\n return `DEFAULT '${JSON.stringify(value)}'`;\n },\n function(node: FunctionColumnDefault): string {\n if (node.expression === 'autoincrement()') {\n return '';\n }\n return `DEFAULT (${node.expression})`;\n },\n};\n\nfunction renderColumn(column: DdlColumn): string {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${column.name} ${column.type}`;\n }\n const parts = [column.name, column.type];\n if (column.notNull) {\n parts.push('NOT NULL');\n }\n if (column.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n const defaultClause = column.default ? column.default.accept(defaultVisitor) : '';\n if (defaultClause.length > 0) {\n parts.push(defaultClause);\n }\n return parts.join(' ');\n}\n\nexport function renderLoweredDdl(ast: SqliteDdlNode): SqliteLoweredStatement {\n const sql = ast.accept(new SqliteDdlVisitorImpl());\n return Object.freeze({ sql, params: Object.freeze([]) });\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 MarkerReadResult,\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 { parseContractMarkerRow } from '@prisma-next/sql-runtime';\nimport type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { renderLoweredDdl } from './ddl-renderer';\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 this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) => readSqliteMarker(queryable),\n });\n }\n\n lower(\n ast: AnyQueryAst | SqliteDdlNode,\n context: LowererContext<SqliteContract>,\n ): SqliteLoweredStatement {\n if (isDdlNode(ast)) {\n return renderLoweredDdl(ast);\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 '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\nasync function readSqliteMarker(queryable: SqlQueryable): Promise<MarkerReadResult> {\n const exists = await queryable.query(\n \"select 1 from sqlite_master where type = 'table' and name = ?\",\n ['_prisma_marker'],\n );\n if (exists.rows.length === 0) {\n return { kind: 'no-table' };\n }\n\n const result = await queryable.query(\n 'select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from _prisma_marker where space = ?',\n [APP_SPACE_ID],\n );\n const row = result.rows[0];\n if (!row) {\n return { kind: 'absent' };\n }\n // SQLite stores arrays as JSON-encoded TEXT (no native array type), so the driver returns `invariants` as a string. Decode before delegating to the shared row schema, which expects `string[]`.\n const raw = row as Record<string, unknown>;\n const invariants =\n typeof raw['invariants'] === 'string'\n ? (JSON.parse(raw['invariants']) as unknown)\n : raw['invariants'];\n return { kind: 'present', record: parseContractMarkerRow({ ...raw, invariants }) };\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":";;;;;AAcA,IAAM,uBAAN,MAA+D;CAC7D,YAAY,MAAiC;EAI3C,OAAO,gBAHa,KAAK,cAAc,mBAAmB,KACzC,KAAK,MAEwB,UAD3B,KAAK,QAAQ,KAAK,WAAWA,eAAa,MAAM,CAAC,EAAE,KAAK,SACV,EAAE;CACrE;AACF;AAEA,MAAM,iBAAkD;CACtD,QAAQ,MAAoC;EAC1C,MAAM,EAAE,UAAU;EAClB,IAAI,OAAO,UAAU,UACnB,OAAO,YAAY,cAAc,KAAK,EAAE;EAE1C,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAChD,OAAO,WAAW,OAAO,KAAK;EAEhC,IAAI,UAAU,MACZ,OAAO;EAET,OAAO,YAAY,KAAK,UAAU,KAAK,EAAE;CAC3C;CACA,SAAS,MAAqC;EAC5C,IAAI,KAAK,eAAe,mBACtB,OAAO;EAET,OAAO,YAAY,KAAK,WAAW;CACrC;AACF;AAEA,SAASA,eAAa,QAA2B;CAC/C,IAAI,OAAO,KAAK,SAAS,eAAe,GACtC,OAAO,GAAG,OAAO,KAAK,GAAG,OAAO;CAElC,MAAM,QAAQ,CAAC,OAAO,MAAM,OAAO,IAAI;CACvC,IAAI,OAAO,SACT,MAAM,KAAK,UAAU;CAEvB,IAAI,OAAO,YACT,MAAM,KAAK,aAAa;CAE1B,MAAM,gBAAgB,OAAO,UAAU,OAAO,QAAQ,OAAO,cAAc,IAAI;CAC/E,IAAI,cAAc,SAAS,GACzB,MAAM,KAAK,aAAa;CAE1B,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAgB,iBAAiB,KAA4C;CAC3E,MAAM,MAAM,IAAI,OAAO,IAAI,qBAAqB,CAAC;CACjD,OAAO,OAAO,OAAO;EAAE;EAAK,QAAQ,OAAO,OAAO,CAAC,CAAC;CAAE,CAAC;AACzD;;;ACvBA,MAAM,sBAAsB,OAAO,OAAO,EACxC,KAAK;CACH,SAAS;CACT,OAAO;CACP,SAAS;CACT,SAAS;CACT,WAAW;CACX,OAAO;AACT,EACF,CAAC;AAED,IAAM,oBAAN,MAAgG;CAC9F,WAAoB;CACpB,WAAoB;CAEpB;CAEA,YAAY,SAAgC;EAC1C,KAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,aAAa,cAA4B,iBAAiB,SAAS;EACrE,CAAC;CACH;CAEA,MACE,KACA,SACwB;EACxB,IAAI,UAAU,GAAG,GACf,OAAO,iBAAiB,GAAG;EAE7B,OAAO,iBAAiB,KAAK,QAAQ,QAAQ;CAC/C;AACF;;AAGA,MAAa,wBAAyC,EACpD,WAAW,OAA8B;CACvC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,MAAM,IAChD,qBACA;EACN,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,YAAY,OAAO;CAC5C;CACA,MAAM,IAAI,MACR,6GACF;AACF,EACF;;;;;;AAOA,SAAgB,iBACd,KACA,UACwB;CACxB,MAAM,qBAAqB,IAAI,iBAAiB;CAChD,MAAM,SAAyB,CAAC;CAChC,KAAK,MAAM,OAAO,oBAChB,OAAO,KACL,IAAI,SAAS,uBACT;EAAE,MAAM;EAAQ,MAAM,IAAI;CAAK,IAC/B;EAAE,MAAM;EAAW,OAAO,IAAI;CAAM,CAC1C;CAGF,IAAI;CAEJ,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,SACE,MAAM,IAAI,MAAM,8BAA+B,KAA0B,MAAM;CACnF;CAEA,OAAO,OAAO,OAAO;EAAE;EAAK;CAAO,CAAC;AACtC;AAEA,SAAS,kBACP,SACA,OACA,UACQ;CACR,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,OAAO,UAAU,UAAU,OAAO,GAAG,QAAQ,GAAG;CACpD,OAAO,GAAG,QAAQ,GAAG,WAAW,OAAO,QAAQ;AACjD;AAEA,SAAS,aAAa,KAAgB,UAAkC;CAsBtE,OAAO;EACL,UAtBqB,IAAI,WAAW,cAAc,KACJ,iBAAiB,IAAI,YAAY,QAAQ;EAsBvF,QArByB,aAAa,IAAI,MAAM,QAAQ;EAEtC,IAAI,OAAO,SAC3B,IAAI,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,GAAG,IAC5D;EAEgB,IAAI,QAAQ,SAAS,WAAW,IAAI,OAAO,QAAQ,MAAM;EACvD,IAAI,SAAS,SAC/B,YAAY,IAAI,QAAQ,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI,MAC3E;EACiB,IAAI,SAAS,UAAU,WAAW,IAAI,QAAQ,QAAQ,MAAM;EAC7D,IAAI,SAAS,SAC7B,YAAY,IAAI,QACb,KAAK,UAAU,GAAG,WAAW,MAAM,MAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,YAAY,GAAG,EAC/E,KAAK,IAAI,MACZ;EACgB,kBAAkB,SAAS,IAAI,OAAO,QAW9C;EAVS,kBAAkB,UAAU,IAAI,QAAQ,QAWhD;CACb,EACG,QAAQ,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,GAAG,EACR,KAAK;AACV;AAEA,SAAS,iBACP,YACA,UACQ;CACR,OAAO,WACJ,KAAK,SAAS;EACb,MAAM,QAAQ,gBAAgB,KAAK,KAAK;EACxC,IAAI,KAAK,KAAK,SAAS,WACrB,OAAO,GAAG,cAAc,KAAK,IAAI,EAAE,MAAM;EAE3C,OAAO,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE,MAAM;CAClD,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAAS,oCACP,OACA,UACQ;CACR,IAAI,MAAM,gBAAgB,KAAA,GACxB,OAAO,gBAAgB,MAAM,IAAI;CAEnC,MAAM,YAAY,SAAS,QAAQ,WAAW,MAAM;CACpD,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MACR,UAAU,MAAM,KAAK,0BAA0B,MAAM,YAAY,uCACnE;CAEF,MAAM,eAAe,UAAU;CAC/B,IAAI,iBAAiB,KAAA,GACnB,MAAM,IAAI,MACR,UAAU,MAAM,KAAK,0BAA0B,MAAM,YAAY,8DACnE;CAEF,OAAO,aAAa,KAAK,WAAW,MAAM,IAAI;AAChD;AAEA,SAAS,kBAAkB,QAAqB,UAAkC;CAChF,MAAM,YAAY,oCAAoC,QAAQ,QAAQ;CACtE,IAAI,CAAC,OAAO,OACV,OAAO;CAET,OAAO,GAAG,UAAU,MAAM,gBAAgB,OAAO,KAAK;AACxD;AAEA,SAAS,aAAa,QAAuB,UAAkC;CAC7E,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK,gBACH,OAAO,kBAAkB,MAAM,QAAQ;EACzC,KAAK,wBACH,OAAO,IAAI,aAAa,KAAK,OAAO,QAAQ,EAAE,OAAO,gBAAgB,KAAK,KAAK;EACjF,SACE,MAAM,IAAI,MAAM,iCAAkC,KAA0B,MAAM;CACtF;AACF;AAEA,SAAS,WAAW,MAAqB,UAAmC;CAC1E,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK,cACH,OAAO,aAAa,IAAI;EAC1B,KAAK,kBACH,OAAO,gBAAgB,KAAK,IAAI;EAClC,KAAK,aACH,OAAO,gBAAgB,MAAM,QAAQ;EACvC,KAAK,YACH,OAAO,mBAAmB,MAAM,QAAQ;EAC1C,KAAK,aACH,OAAO,oBAAoB,MAAM,QAAQ;EAC3C,KAAK,eACH,OAAO,qBAAqB,MAAM,QAAQ;EAC5C,KAAK,eACH,OAAO,qBAAqB,MAAM,QAAQ;EAC5C,KAAK,kBACH,OAAO,uBAAuB,MAAM,QAAQ;EAC9C,KAAK,UACH,OAAO,aAAa,MAAM,QAAQ;EACpC,KAAK;GACH,IAAI,KAAK,MAAM,WAAW,GACxB,OAAO;GAET,OAAO,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE;EAChF,KAAK;GACH,IAAI,KAAK,MAAM,WAAW,GACxB,OAAO;GAET,OAAO,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,EAAE;EAC/E,KAAK;GACH,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,sDAAsD;GAIxE,OAAO,GAFY,KAAK,YAAY,SAAS,GAExB,UADJ,aAAa,KAAK,UAAU,QACP,EAAE;EAE1C,KAAK,cACH,OAAO,gBAAgB,MAAM,QAAQ;EACvC,KAAK,OACH,OAAO,QAAQ,WAAW,KAAK,MAAM,QAAQ,EAAE;EACjD,KAAK;EACL,KAAK,sBACH,OAAO;EACT,KAAK,WACH,OAAO,cAAc,IAAI;EAC3B,KAAK,QACH,OAAO,kBAAkB,IAAI;EAC/B,KAAK,YACH,OAAO,cAAc,MAAM,QAAQ;EACrC,SACE,MAAM,IAAI,MAAM,qCAAsC,KAA0B,MAAM;CAC1F;AACF;AAEA,SAAS,cAAc,MAAe,UAAmC;CACvE,OAAO,KAAK,MACT,KAAK,SAAU,OAAO,SAAS,WAAW,OAAO,WAAW,MAAM,QAAQ,CAAE,EAC5E,KAAK,EAAE;AACZ;AAGA,SAAS,aAAa,KAAwB;CAC5C,IAAI,IAAI,UAAU,YAChB,OAAO,YAAY,gBAAgB,IAAI,MAAM;CAE/C,OAAO,GAAG,gBAAgB,IAAI,KAAK,EAAE,GAAG,gBAAgB,IAAI,MAAM;AACpE;AAEA,SAAS,cAAc,MAA2B;CAChD,IAAI,OAAO,KAAK,UAAU,UACxB,OAAO,IAAI,cAAc,KAAK,KAAK,EAAE;CAEvC,IAAI,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,UAAU,WAC1D,OAAO,OAAO,KAAK,KAAK;CAE1B,IAAI,OAAO,KAAK,UAAU,UACxB,OAAO,OAAO,KAAK,KAAK;CAE1B,IAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,GACxC,OAAO;CAET,IAAI,KAAK,iBAAiB,MACxB,OAAO,IAAI,cAAc,KAAK,MAAM,YAAY,CAAC,EAAE;CAErD,MAAM,OAAO,KAAK,UAAU,KAAK,KAAK;CACtC,IAAI,SAAS,KAAA,GACX,OAAO;CAET,OAAO,IAAI,cAAc,IAAI,EAAE;AACjC;AAEA,SAAS,gBAAgB,MAAqB,UAAmC;CAC/E,MAAM,OAAO,WAAW,KAAK,MAAM,QAAQ;CAC3C,MAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC;CAE7D,IAAI,SAAS,KAAK,SAAS;CAC3B,SAAS,OAAO,QAAQ,iBAAiB,IAAI;CAC7C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,SAAS,OAAO,QAAQ,IAAI,OAAO,YAAY,EAAE,SAAS,GAAG,GAAG,KAAK,MAAM,EAAE;CAG/E,OAAO;AACT;AAEA,SAAS,mBAAmB,MAAoB,UAAmC;CACjF,IAAI,KAAK,MAAM,WAAW,WAAW,GACnC,MAAM,IAAI,MAAM,sDAAsD;CAExE,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,0DAA0D;CAE5E,OAAO,IAAI,aAAa,KAAK,OAAO,QAAQ,EAAE;AAChD;AAEA,SAAS,gBAAgB,MAAqB,UAAmC;CAC/E,MAAM,WAAW,WAAW,KAAK,MAAM,QAAQ;CAC/C,MAAM,eACJ,KAAK,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,aAAa,IAAI,SAAS,KAAK;CACtF,OAAO,KAAK,SAAS,GAAG,aAAa,YAAY,GAAG,aAAa;AACnE;AAEA,SAAS,aAAa,MAAkB,UAAmC;CACzE,IAAI,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,OAAO,WAAW,GAAG;EAChE,IAAI,KAAK,OAAO,MACd,OAAO;EAET,IAAI,KAAK,OAAO,SACd,OAAO;CAEX;CAEA,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,WAAW,UAAU,QAAQ;CAC1C,MAAM,eACJ,SAAS,SAAS,eAAe,SAAS,SAAS,aAAa,IAAI,KAAK,KAAK;CAEhF,MAAM,YAAY,KAAK;CACvB,IAAI;CACJ,QAAQ,UAAU,MAAlB;EACE,KAAK;GACH,QAAQ,kBAAkB,SAAS;GACnC;EACF,KAAK;GACH,QAAQ,cAAc,SAAS;GAC/B;EACF,KAAK;GACH,QAAQ,aAAa,SAAS;GAC9B;EACF,KAAK;EACL,KAAK;GACH,QAAQ;GACR;EACF;GACE,QAAQ,WAAW,WAAW,QAAQ;GACtC;CACJ;CAcA,OAAO,GAAG,aAAa,GAAG;EAXxB,IAAI;EACJ,KAAK;EACL,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,KAAK;EACL,MAAM;EACN,IAAI;EACJ,OAAO;CAG2B,EAAE,KAAK,IAAI,GAAG;AACpD;AAEA,SAAS,kBAAkB,MAA8B;CACvD,IAAI,KAAK,OAAO,WAAW,GACzB,OAAO;CAST,OAAO,IAPQ,KAAK,OACjB,KAAK,MAAM;EACV,IAAI,EAAE,SAAS,eAAe,EAAE,SAAS,sBAAsB,OAAO;EACtE,IAAI,EAAE,SAAS,WAAW,OAAO,cAAc,CAAC;EAChD,OAAO,WAAW,CAAC;CACrB,CAAC,EACA,KAAK,IACQ,EAAE;AACpB;AAEA,SAAS,oBAAoB,MAAqB,UAAmC;CACnF,MAAM,KAAK,KAAK,GAAG,YAAY;CAC/B,IAAI,CAAC,KAAK,MACR,OAAO,GAAG,GAAG;CAEf,OAAO,GAAG,GAAG,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE;AAClD;AAEA,SAAS,qBAAqB,MAAsB,UAAmC;CAYrF,OAAO,GAXI,KAAK,GAAG,YAWR,EAAE,GAVA,KAAK,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,KAAK,IAUjD,EAAE,UADR,CAPX,KAAK,eAAe,KAAK,YAAY,SAAS,IAC1C,gBAAgB,KAAK,YAAY,KAAK,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,KAAK,IAAI,MAC9E,IAEJ,KAAK,WAAW,KAAK,QAAQ,SAAS,IAClC,YAAY,mBAAmB,KAAK,SAAS,QAAQ,MACrD,EACoC,EAAE,QAAQ,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,GACjD,EAAE;AACtC;AAEA,SAAS,qBAAqB,MAAsB,UAAmC;CAUrF,OAAO,eATM,KAAK,QACf,SAAS,UAA4B;EACpC,MAAM,MAAM,IAAI,cAAc,MAAM,GAAG,EAAE;EACzC,IAAI,MAAM,MAAM,SAAS,WACvB,OAAO,CAAC,KAAK,cAAc,MAAM,KAAK,CAAC;EAEzC,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,QAAQ,CAAC;CAChD,CAAC,EACA,KAAK,IACiB,EAAE;AAC7B;AAEA,SAAS,mBAAmB,OAAmC,UAAmC;CAChG,OAAO,MACJ,KAAK,SAAS,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE,GAAG,KAAK,IAAI,YAAY,GAAG,EAC5E,KAAK,IAAI;AACd;AAEA,SAAS,uBAAuB,MAAwB,UAAmC;CACzF,MAAM,mBACJ,KAAK,WAAW,KAAK,QAAQ,SAAS,IAClC,aAAa,mBAAmB,KAAK,SAAS,QAAQ,MACtD;CACN,MAAM,aAAa,oBAAoB,WAAW,KAAK,MAAM,QAAQ,IAAI,iBAAiB;CAC1F,IAAI,KAAK,YAAY,cACnB,OAAO,YAAY,WAAW;CAEhC,OAAO;AACT;AAEA,SAAS,WAAW,MAAe,UAAmC;CACpE,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,2CAA2C;CAK7D,OAAO,GAHU,KAAK,SAAS,YAGd,EAAE,QAFJ,aAAa,KAAK,QAAQ,QAET,EAAE,MADjB,aAAa,KAAK,IAAI,QACQ;AACjD;AAEA,SAAS,aAAa,IAAgB,UAAmC;CACvE,IAAI,GAAG,SAAS,kBACd,OAAO,GAAG,aAAa,GAAG,IAAI,EAAE,KAAK,aAAa,GAAG,KAAK;CAE5D,OAAO,WAAW,IAAI,QAAQ;AAChC;AAEA,SAAS,kBAAkB,OAA4B;CACrD,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK,sBACH,OAAO;EACT,KAAK,cACH,OAAO,aAAa,KAAK;EAC3B,KAAK,iBACH,MAAM,IAAI,MAAM,iEAAiE;EACnF,SACE,MAAM,IAAI,MAAM,qCAAsC,MAA2B,MAAM;CAC3F;AACF;AAEA,SAAS,aAAa,KAAgB,UAAkC;CACtE,MAAM,QAAQ,oCAAoC,IAAI,OAAO,QAAQ;CACrE,MAAM,OAAO,IAAI;CACjB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,kCAAkC;CAGpD,MAAM,WAAW,KAAK;CACtB,MAAM,cAAc,OAAO,KAAK,QAAQ;CAExC,IAAI;CACJ,IAAI,YAAY,WAAW,GACzB,eAAe,eAAe,MAAM;MAC/B;EACL,MAAM,UAAU,YAAY,KAAK,WAAW,gBAAgB,MAAM,CAAC;EACnE,MAAM,SAAS,KACZ,KAAK,QAAQ;GAQZ,OAAO,IAPa,YAAY,KAAK,WAAW;IAC9C,MAAM,QAAQ,IAAI;IAClB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,6BAA6B,OAAO,gBAAgB;IAEtE,OAAO,kBAAkB,KAAK;GAChC,CACqB,EAAE,KAAK,IAAI,EAAE;EACpC,CAAC,EACA,KAAK,IAAI;EACZ,eAAe,eAAe,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,WAAW;CACxE;CAEA,IAAI,mBAAmB;CACvB,IAAI,IAAI,YAAY;EAClB,MAAM,kBAAkB,IAAI,WAAW,QAAQ,KAAK,QAAQ,gBAAgB,IAAI,MAAM,CAAC;EACvF,IAAI,gBAAgB,WAAW,GAC7B,MAAM,IAAI,MAAM,yDAAyD;EAG3E,MAAM,SAAS,IAAI,WAAW;EAC9B,QAAQ,OAAO,MAAf;GACE,KAAK;IACH,mBAAmB,iBAAiB,gBAAgB,KAAK,IAAI,EAAE;IAC/D;GACF,KAAK,iBAAiB;IACpB,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG,EAAE,KAAK,CAAC,SAAS,WAAW;KACnE,OAAO,GAAG,gBAAgB,OAAO,EAAE,KAAK,WAAW,OAAO,QAAQ;IACpE,CAAC;IACD,mBAAmB,iBAAiB,gBAAgB,KAAK,IAAI,EAAE,kBAAkB,QAAQ,KAAK,IAAI;IAClG;GACF;GACA,SACE,MAAM,IAAI,MAAM,kCAAmC,OAA4B,MAAM;EACzF;CACF;CAEA,MAAM,kBAAkB,gBAAgB,IAAI,SAAS;CAErD,OAAO,GAAG,eAAe,mBAAmB;AAC9C;AAEA,SAAS,aAAa,KAAgB,UAAkC;CACtE,MAAM,QAAQ,oCAAoC,IAAI,OAAO,QAAQ;CACrE,MAAM,aAAa,OAAO,QAAQ,IAAI,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS;EAC7D,OAAO,GAAG,gBAAgB,GAAG,EAAE,KAAK,WAAW,KAAK,QAAQ;CAC9D,CAAC;CAED,MAAM,cAAc,IAAI,QAAQ,UAAU,WAAW,IAAI,OAAO,QAAQ,MAAM;CAC9E,MAAM,kBAAkB,gBAAgB,IAAI,SAAS;CAErD,OAAO,UAAU,MAAM,OAAO,WAAW,KAAK,IAAI,IAAI,cAAc;AACtE;AAEA,SAAS,aAAa,KAAgB,UAAkC;CAKtE,OAAO,eAJO,oCAAoC,IAAI,OAAO,QAInC,IAHN,IAAI,QAAQ,UAAU,WAAW,IAAI,KAAK,MAAM,KAC5C,gBAAgB,IAAI,SAEc;AAC5D;AAEA,SAAS,gBAAgB,WAA8D;CACrF,IAAI,CAAC,WAAW,QACd,OAAO;CAET,OAAO,cAAc,UAClB,KAAK,SAAS;EACb,IAAI,KAAK,KAAK,SAAS,cAAc;GACnC,MAAM,WAAW,GAAG,gBAAgB,KAAK,KAAK,KAAK,EAAE,GAAG,gBAAgB,KAAK,KAAK,MAAM;GACxF,OAAO,KAAK,KAAK,WAAW,KAAK,QAC7B,WACA,GAAG,SAAS,MAAM,gBAAgB,KAAK,KAAK;EAClD;EACA,OAAO,GAAG,WAAW,KAAK,IAAI,EAAE,MAAM,gBAAgB,KAAK,KAAK;CAClE,CAAC,EACA,KAAK,IAAI;AACd;AAEA,eAAe,iBAAiB,WAAoD;CAKlF,KAAI,MAJiB,UAAU,MAC7B,iEACA,CAAC,gBAAgB,CACnB,GACW,KAAK,WAAW,GACzB,OAAO,EAAE,MAAM,WAAW;CAO5B,MAAM,OAAM,MAJS,UAAU,MAC7B,+IACA,CAAC,YAAY,CACf,GACmB,KAAK;CACxB,IAAI,CAAC,KACH,OAAO,EAAE,MAAM,SAAS;CAG1B,MAAM,MAAM;CACZ,MAAM,aACJ,OAAO,IAAI,kBAAkB,WACxB,KAAK,MAAM,IAAI,aAAa,IAC7B,IAAI;CACV,OAAO;EAAE,MAAM;EAAW,QAAQ,uBAAuB;GAAE,GAAG;GAAK;EAAW,CAAC;CAAE;AACnF;AAEA,SAAgB,oBAAoB,SAAgC;CAClE,OAAO,OAAO,OAAO,IAAI,kBAAkB,OAAO,CAAC;AACrD"}
@@ -1,67 +0,0 @@
1
- import type {
2
- DdlColumn,
3
- DdlColumnDefaultVisitor,
4
- FunctionColumnDefault,
5
- LiteralColumnDefault,
6
- } from '@prisma-next/sql-relational-core/ast';
7
- import type {
8
- SqliteCreateTable,
9
- SqliteDdlNode,
10
- SqliteDdlVisitor,
11
- } from '@prisma-next/target-sqlite/ddl';
12
- import { escapeLiteral } from '@prisma-next/target-sqlite/sql-utils';
13
- import type { SqliteLoweredStatement } from './types';
14
-
15
- class SqliteDdlVisitorImpl implements SqliteDdlVisitor<string> {
16
- createTable(node: SqliteCreateTable): string {
17
- const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';
18
- const tableRef = node.table;
19
- const columnDefs = node.columns.map((column) => renderColumn(column)).join(',\n ');
20
- return `CREATE TABLE ${ifNotExists}${tableRef} (\n ${columnDefs}\n )`;
21
- }
22
- }
23
-
24
- const defaultVisitor: DdlColumnDefaultVisitor<string> = {
25
- literal(node: LiteralColumnDefault): string {
26
- const { value } = node;
27
- if (typeof value === 'string') {
28
- return `DEFAULT '${escapeLiteral(value)}'`;
29
- }
30
- if (typeof value === 'number' || typeof value === 'boolean') {
31
- return `DEFAULT ${String(value)}`;
32
- }
33
- if (value === null) {
34
- return 'DEFAULT NULL';
35
- }
36
- return `DEFAULT '${JSON.stringify(value)}'`;
37
- },
38
- function(node: FunctionColumnDefault): string {
39
- if (node.expression === 'autoincrement()') {
40
- return '';
41
- }
42
- return `DEFAULT (${node.expression})`;
43
- },
44
- };
45
-
46
- function renderColumn(column: DdlColumn): string {
47
- if (column.type.includes('AUTOINCREMENT')) {
48
- return `${column.name} ${column.type}`;
49
- }
50
- const parts = [column.name, column.type];
51
- if (column.notNull) {
52
- parts.push('NOT NULL');
53
- }
54
- if (column.primaryKey) {
55
- parts.push('PRIMARY KEY');
56
- }
57
- const defaultClause = column.default ? column.default.accept(defaultVisitor) : '';
58
- if (defaultClause.length > 0) {
59
- parts.push(defaultClause);
60
- }
61
- return parts.join(' ');
62
- }
63
-
64
- export function renderLoweredDdl(ast: SqliteDdlNode): SqliteLoweredStatement {
65
- const sql = ast.accept(new SqliteDdlVisitorImpl());
66
- return Object.freeze({ sql, params: Object.freeze([]) });
67
- }
@@ -1,26 +0,0 @@
1
- const DESIGNATOR_LESS_UTC_DATETIME = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(\.\d+)?$/;
2
-
3
- export function coerceLedgerAppliedAt(value: Date | string): Date {
4
- if (value instanceof Date) {
5
- return value;
6
- }
7
- if (DESIGNATOR_LESS_UTC_DATETIME.test(value)) {
8
- return new Date(`${value.replace(' ', 'T')}Z`);
9
- }
10
- return new Date(value);
11
- }
12
-
13
- export function operationCountFromStored(operations: unknown): number {
14
- if (Array.isArray(operations)) {
15
- return operations.length;
16
- }
17
- if (typeof operations === 'string') {
18
- try {
19
- const parsed: unknown = JSON.parse(operations);
20
- return Array.isArray(parsed) ? parsed.length : 0;
21
- } catch {
22
- return 0;
23
- }
24
- }
25
- return 0;
26
- }