@prisma-next/adapter-sqlite 0.9.0-dev.1 → 0.9.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/dist/{adapter-NxKQDxOd.mjs → adapter-BZ5KHlDs.mjs} +23 -8
- package/dist/adapter-BZ5KHlDs.mjs.map +1 -0
- package/dist/adapter-DswQk5bT.d.mts.map +1 -1
- package/dist/adapter.mjs +1 -1
- package/dist/control.mjs +1 -1
- package/dist/runtime.mjs +1 -1
- package/package.json +21 -21
- package/src/core/adapter.ts +25 -6
- package/dist/adapter-NxKQDxOd.mjs.map +0 -1
|
@@ -34,7 +34,13 @@ var SqliteAdapterImpl = class {
|
|
|
34
34
|
function renderLoweredSql(ast, contract) {
|
|
35
35
|
const collectedParamRefs = ast.collectParamRefs();
|
|
36
36
|
const params = [];
|
|
37
|
-
for (const ref of collectedParamRefs) params.push(ref.
|
|
37
|
+
for (const ref of collectedParamRefs) params.push(ref.kind === "prepared-param-ref" ? {
|
|
38
|
+
kind: "bind",
|
|
39
|
+
name: ref.name
|
|
40
|
+
} : {
|
|
41
|
+
kind: "literal",
|
|
42
|
+
value: ref.value
|
|
43
|
+
});
|
|
38
44
|
let sql;
|
|
39
45
|
const node = ast;
|
|
40
46
|
switch (node.kind) {
|
|
@@ -57,6 +63,11 @@ function renderLoweredSql(ast, contract) {
|
|
|
57
63
|
params
|
|
58
64
|
});
|
|
59
65
|
}
|
|
66
|
+
function renderLimitOffset(keyword, value, contract) {
|
|
67
|
+
if (value === void 0) return "";
|
|
68
|
+
if (typeof value === "number") return `${keyword} ${value}`;
|
|
69
|
+
return `${keyword} ${renderExpr(value, contract)}`;
|
|
70
|
+
}
|
|
60
71
|
function renderSelect(ast, contract) {
|
|
61
72
|
return [
|
|
62
73
|
`SELECT ${ast.distinct ? "DISTINCT " : ""}${renderProjection(ast.projection, contract)}`,
|
|
@@ -66,8 +77,8 @@ function renderSelect(ast, contract) {
|
|
|
66
77
|
ast.groupBy?.length ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(", ")}` : "",
|
|
67
78
|
ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : "",
|
|
68
79
|
ast.orderBy?.length ? `ORDER BY ${ast.orderBy.map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`).join(", ")}` : "",
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
renderLimitOffset("LIMIT", ast.limit, contract),
|
|
81
|
+
renderLimitOffset("OFFSET", ast.offset, contract)
|
|
71
82
|
].filter((part) => part.length > 0).join(" ").trim();
|
|
72
83
|
}
|
|
73
84
|
function renderProjection(projection, contract) {
|
|
@@ -109,7 +120,8 @@ function renderExpr(expr, contract) {
|
|
|
109
120
|
case "exists": return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract)})`;
|
|
110
121
|
case "null-check": return renderNullCheck(node, contract);
|
|
111
122
|
case "not": return `NOT (${renderExpr(node.expr, contract)})`;
|
|
112
|
-
case "param-ref":
|
|
123
|
+
case "param-ref":
|
|
124
|
+
case "prepared-param-ref": return "?";
|
|
113
125
|
case "literal": return renderLiteral(node);
|
|
114
126
|
case "list": return renderListLiteral(node);
|
|
115
127
|
default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
|
|
@@ -167,6 +179,7 @@ function renderBinary(expr, contract) {
|
|
|
167
179
|
right = renderColumn(rightNode);
|
|
168
180
|
break;
|
|
169
181
|
case "param-ref":
|
|
182
|
+
case "prepared-param-ref":
|
|
170
183
|
right = "?";
|
|
171
184
|
break;
|
|
172
185
|
default:
|
|
@@ -188,7 +201,7 @@ function renderBinary(expr, contract) {
|
|
|
188
201
|
function renderListLiteral(expr) {
|
|
189
202
|
if (expr.values.length === 0) return "(NULL)";
|
|
190
203
|
return `(${expr.values.map((v) => {
|
|
191
|
-
if (v.kind === "param-ref") return "?";
|
|
204
|
+
if (v.kind === "param-ref" || v.kind === "prepared-param-ref") return "?";
|
|
192
205
|
if (v.kind === "literal") return renderLiteral(v);
|
|
193
206
|
return renderExpr(v);
|
|
194
207
|
}).join(", ")})`;
|
|
@@ -223,7 +236,8 @@ function renderJoinOn(on, contract) {
|
|
|
223
236
|
}
|
|
224
237
|
function renderInsertValue(value) {
|
|
225
238
|
switch (value.kind) {
|
|
226
|
-
case "param-ref":
|
|
239
|
+
case "param-ref":
|
|
240
|
+
case "prepared-param-ref": return "?";
|
|
227
241
|
case "column-ref": return renderColumn(value);
|
|
228
242
|
case "default-value": throw new Error("SQLite does not support DEFAULT as a value in INSERT ... VALUES");
|
|
229
243
|
default: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);
|
|
@@ -260,7 +274,7 @@ function renderInsert(ast) {
|
|
|
260
274
|
case "do-update-set": {
|
|
261
275
|
const updates = Object.entries(action.set).map(([colName, value]) => {
|
|
262
276
|
const target = quoteIdentifier(colName);
|
|
263
|
-
if (value.kind === "param-ref") return `${target} = ?`;
|
|
277
|
+
if (value.kind === "param-ref" || value.kind === "prepared-param-ref") return `${target} = ?`;
|
|
264
278
|
return `${target} = ${renderColumn(value)}`;
|
|
265
279
|
});
|
|
266
280
|
onConflictClause = ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
|
|
@@ -279,6 +293,7 @@ function renderUpdate(ast, contract) {
|
|
|
279
293
|
let value;
|
|
280
294
|
switch (val.kind) {
|
|
281
295
|
case "param-ref":
|
|
296
|
+
case "prepared-param-ref":
|
|
282
297
|
value = "?";
|
|
283
298
|
break;
|
|
284
299
|
case "column-ref":
|
|
@@ -325,4 +340,4 @@ function createSqliteAdapter(options) {
|
|
|
325
340
|
//#endregion
|
|
326
341
|
export { renderLoweredSql as n, createSqliteAdapter as t };
|
|
327
342
|
|
|
328
|
-
//# sourceMappingURL=adapter-
|
|
343
|
+
//# sourceMappingURL=adapter-BZ5KHlDs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-BZ5KHlDs.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 SelectAst,\n SqlQueryable,\n SubqueryExpr,\n UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\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/**\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);\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 '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 default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\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 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): 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 const target = quoteIdentifier(colName);\n if (value.kind === 'param-ref' || value.kind === 'prepared-param-ref') {\n return `${target} = ?`;\n }\n return `${target} = ${renderColumn(value)}`;\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 const column = quoteIdentifier(col);\n let value: string;\n switch (val.kind) {\n case 'param-ref':\n case 'prepared-param-ref':\n value = '?';\n break;\n case 'column-ref':\n value = renderColumn(val);\n break;\n default:\n throw new Error(`Unsupported value node in UPDATE: ${(val as { kind: string }).kind}`);\n }\n return `${column} = ${value}`;\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-DswQk5bT.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"adapter-DswQk5bT.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;cA8CM,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;;;;;;iBA0fpD,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
|
package/dist/adapter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as createSqliteAdapter } from "./adapter-
|
|
1
|
+
import { t as createSqliteAdapter } from "./adapter-BZ5KHlDs.mjs";
|
|
2
2
|
export { createSqliteAdapter };
|
package/dist/control.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as renderLoweredSql } from "./adapter-
|
|
1
|
+
import { n as renderLoweredSql } from "./adapter-BZ5KHlDs.mjs";
|
|
2
2
|
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-DA4lgWT_.mjs";
|
|
3
3
|
import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
|
|
4
4
|
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";
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createSqliteAdapter } from "./adapter-
|
|
1
|
+
import { t as createSqliteAdapter } from "./adapter-BZ5KHlDs.mjs";
|
|
2
2
|
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-DA4lgWT_.mjs";
|
|
3
3
|
import { builtinGeneratorIds } from "@prisma-next/ids";
|
|
4
4
|
import { timestampNowRuntimeGenerator } from "@prisma-next/family-sql/runtime";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/adapter-sqlite",
|
|
3
|
-
"version": "0.9.0-dev.
|
|
3
|
+
"version": "0.9.0-dev.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -9,29 +9,29 @@
|
|
|
9
9
|
"src"
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@prisma-next/cli": "0.9.0-dev.
|
|
13
|
-
"@prisma-next/contract": "0.9.0-dev.
|
|
14
|
-
"@prisma-next/contract-authoring": "0.9.0-dev.
|
|
15
|
-
"@prisma-next/framework-components": "0.9.0-dev.
|
|
16
|
-
"@prisma-next/family-sql": "0.9.0-dev.
|
|
17
|
-
"@prisma-next/ids": "0.9.0-dev.
|
|
18
|
-
"@prisma-next/sql-contract": "0.9.0-dev.
|
|
19
|
-
"@prisma-next/sql-contract-psl": "0.9.0-dev.
|
|
20
|
-
"@prisma-next/sql-contract-ts": "0.9.0-dev.
|
|
21
|
-
"@prisma-next/sql-operations": "0.9.0-dev.
|
|
22
|
-
"@prisma-next/sql-relational-core": "0.9.0-dev.
|
|
23
|
-
"@prisma-next/sql-runtime": "0.9.0-dev.
|
|
24
|
-
"@prisma-next/sql-schema-ir": "0.9.0-dev.
|
|
25
|
-
"@prisma-next/target-sqlite": "0.9.0-dev.
|
|
26
|
-
"@prisma-next/utils": "0.9.0-dev.
|
|
12
|
+
"@prisma-next/cli": "0.9.0-dev.3",
|
|
13
|
+
"@prisma-next/contract": "0.9.0-dev.3",
|
|
14
|
+
"@prisma-next/contract-authoring": "0.9.0-dev.3",
|
|
15
|
+
"@prisma-next/framework-components": "0.9.0-dev.3",
|
|
16
|
+
"@prisma-next/family-sql": "0.9.0-dev.3",
|
|
17
|
+
"@prisma-next/ids": "0.9.0-dev.3",
|
|
18
|
+
"@prisma-next/sql-contract": "0.9.0-dev.3",
|
|
19
|
+
"@prisma-next/sql-contract-psl": "0.9.0-dev.3",
|
|
20
|
+
"@prisma-next/sql-contract-ts": "0.9.0-dev.3",
|
|
21
|
+
"@prisma-next/sql-operations": "0.9.0-dev.3",
|
|
22
|
+
"@prisma-next/sql-relational-core": "0.9.0-dev.3",
|
|
23
|
+
"@prisma-next/sql-runtime": "0.9.0-dev.3",
|
|
24
|
+
"@prisma-next/sql-schema-ir": "0.9.0-dev.3",
|
|
25
|
+
"@prisma-next/target-sqlite": "0.9.0-dev.3",
|
|
26
|
+
"@prisma-next/utils": "0.9.0-dev.3",
|
|
27
27
|
"arktype": "^2.1.29"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@prisma-next/driver-sqlite": "0.9.0-dev.
|
|
31
|
-
"@prisma-next/migration-tools": "0.9.0-dev.
|
|
32
|
-
"@prisma-next/test-utils": "0.9.0-dev.
|
|
33
|
-
"@prisma-next/tsconfig": "0.9.0-dev.
|
|
34
|
-
"@prisma-next/tsdown": "0.9.0-dev.
|
|
30
|
+
"@prisma-next/driver-sqlite": "0.9.0-dev.3",
|
|
31
|
+
"@prisma-next/migration-tools": "0.9.0-dev.3",
|
|
32
|
+
"@prisma-next/test-utils": "0.9.0-dev.3",
|
|
33
|
+
"@prisma-next/tsconfig": "0.9.0-dev.3",
|
|
34
|
+
"@prisma-next/tsdown": "0.9.0-dev.3",
|
|
35
35
|
"pathe": "^2.0.3",
|
|
36
36
|
"tsdown": "0.22.0",
|
|
37
37
|
"typescript": "5.9.3",
|
package/src/core/adapter.ts
CHANGED
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
JsonObjectExpr,
|
|
18
18
|
ListExpression,
|
|
19
19
|
LiteralExpr,
|
|
20
|
+
LoweredParam,
|
|
20
21
|
LowererContext,
|
|
21
22
|
MarkerReadResult,
|
|
22
23
|
NullCheckExpr,
|
|
@@ -73,9 +74,13 @@ export function renderLoweredSql(
|
|
|
73
74
|
contract: SqliteContract,
|
|
74
75
|
): SqliteLoweredStatement {
|
|
75
76
|
const collectedParamRefs = ast.collectParamRefs();
|
|
76
|
-
const params:
|
|
77
|
+
const params: LoweredParam[] = [];
|
|
77
78
|
for (const ref of collectedParamRefs) {
|
|
78
|
-
params.push(
|
|
79
|
+
params.push(
|
|
80
|
+
ref.kind === 'prepared-param-ref'
|
|
81
|
+
? { kind: 'bind', name: ref.name }
|
|
82
|
+
: { kind: 'literal', value: ref.value },
|
|
83
|
+
);
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
let sql: string;
|
|
@@ -101,6 +106,16 @@ export function renderLoweredSql(
|
|
|
101
106
|
return Object.freeze({ sql, params });
|
|
102
107
|
}
|
|
103
108
|
|
|
109
|
+
function renderLimitOffset(
|
|
110
|
+
keyword: 'LIMIT' | 'OFFSET',
|
|
111
|
+
value: SelectAst['limit'] | SelectAst['offset'],
|
|
112
|
+
contract?: SqliteContract,
|
|
113
|
+
): string {
|
|
114
|
+
if (value === undefined) return '';
|
|
115
|
+
if (typeof value === 'number') return `${keyword} ${value}`;
|
|
116
|
+
return `${keyword} ${renderExpr(value, contract)}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
104
119
|
function renderSelect(ast: SelectAst, contract?: SqliteContract): string {
|
|
105
120
|
const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';
|
|
106
121
|
const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;
|
|
@@ -120,8 +135,8 @@ function renderSelect(ast: SelectAst, contract?: SqliteContract): string {
|
|
|
120
135
|
.map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`)
|
|
121
136
|
.join(', ')}`
|
|
122
137
|
: '';
|
|
123
|
-
const limitClause =
|
|
124
|
-
const offsetClause =
|
|
138
|
+
const limitClause = renderLimitOffset('LIMIT', ast.limit, contract);
|
|
139
|
+
const offsetClause = renderLimitOffset('OFFSET', ast.offset, contract);
|
|
125
140
|
|
|
126
141
|
return [
|
|
127
142
|
selectClause,
|
|
@@ -210,6 +225,7 @@ function renderExpr(expr: AnyExpression, contract?: SqliteContract): string {
|
|
|
210
225
|
case 'not':
|
|
211
226
|
return `NOT (${renderExpr(node.expr, contract)})`;
|
|
212
227
|
case 'param-ref':
|
|
228
|
+
case 'prepared-param-ref':
|
|
213
229
|
return '?';
|
|
214
230
|
case 'literal':
|
|
215
231
|
return renderLiteral(node);
|
|
@@ -306,6 +322,7 @@ function renderBinary(expr: BinaryExpr, contract?: SqliteContract): string {
|
|
|
306
322
|
right = renderColumn(rightNode);
|
|
307
323
|
break;
|
|
308
324
|
case 'param-ref':
|
|
325
|
+
case 'prepared-param-ref':
|
|
309
326
|
right = '?';
|
|
310
327
|
break;
|
|
311
328
|
default:
|
|
@@ -334,7 +351,7 @@ function renderListLiteral(expr: ListExpression): string {
|
|
|
334
351
|
}
|
|
335
352
|
const values = expr.values
|
|
336
353
|
.map((v) => {
|
|
337
|
-
if (v.kind === 'param-ref') return '?';
|
|
354
|
+
if (v.kind === 'param-ref' || v.kind === 'prepared-param-ref') return '?';
|
|
338
355
|
if (v.kind === 'literal') return renderLiteral(v);
|
|
339
356
|
return renderExpr(v);
|
|
340
357
|
})
|
|
@@ -398,6 +415,7 @@ function renderJoinOn(on: JoinOnExpr, contract?: SqliteContract): string {
|
|
|
398
415
|
function renderInsertValue(value: InsertValue): string {
|
|
399
416
|
switch (value.kind) {
|
|
400
417
|
case 'param-ref':
|
|
418
|
+
case 'prepared-param-ref':
|
|
401
419
|
return '?';
|
|
402
420
|
case 'column-ref':
|
|
403
421
|
return renderColumn(value);
|
|
@@ -453,7 +471,7 @@ function renderInsert(ast: InsertAst): string {
|
|
|
453
471
|
case 'do-update-set': {
|
|
454
472
|
const updates = Object.entries(action.set).map(([colName, value]) => {
|
|
455
473
|
const target = quoteIdentifier(colName);
|
|
456
|
-
if (value.kind === 'param-ref') {
|
|
474
|
+
if (value.kind === 'param-ref' || value.kind === 'prepared-param-ref') {
|
|
457
475
|
return `${target} = ?`;
|
|
458
476
|
}
|
|
459
477
|
return `${target} = ${renderColumn(value)}`;
|
|
@@ -478,6 +496,7 @@ function renderUpdate(ast: UpdateAst, contract: SqliteContract): string {
|
|
|
478
496
|
let value: string;
|
|
479
497
|
switch (val.kind) {
|
|
480
498
|
case 'param-ref':
|
|
499
|
+
case 'prepared-param-ref':
|
|
481
500
|
value = '?';
|
|
482
501
|
break;
|
|
483
502
|
case 'column-ref':
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-NxKQDxOd.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 LowererContext,\n MarkerReadResult,\n NullCheckExpr,\n OperationExpr,\n OrderByItem,\n ProjectionItem,\n SelectAst,\n SqlQueryable,\n SubqueryExpr,\n UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\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/**\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: unknown[] = [];\n for (const ref of collectedParamRefs) {\n params.push(ref.value);\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);\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 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 = typeof ast.limit === 'number' ? `LIMIT ${ast.limit}` : '';\n const offsetClause = typeof ast.offset === 'number' ? `OFFSET ${ast.offset}` : '';\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 '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 return '?';\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node);\n default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\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 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') 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 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 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): 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 const target = quoteIdentifier(colName);\n if (value.kind === 'param-ref') {\n return `${target} = ?`;\n }\n return `${target} = ${renderColumn(value)}`;\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 const column = quoteIdentifier(col);\n let value: string;\n switch (val.kind) {\n case 'param-ref':\n value = '?';\n break;\n case 'column-ref':\n value = renderColumn(val);\n break;\n default:\n throw new Error(`Unsupported value node in UPDATE: ${(val as { kind: string }).kind}`);\n }\n return `${column} = ${value}`;\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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"}
|