@prisma-next/adapter-sqlite 0.12.0-dev.11 → 0.12.0-dev.12
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-BOg2xl4V.mjs → adapter-BRKmR33P.mjs} +25 -12
- package/dist/adapter-BRKmR33P.mjs.map +1 -0
- package/dist/adapter-Cn_t9TdZ.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 +22 -22
- package/src/core/adapter.ts +49 -14
- package/dist/adapter-BOg2xl4V.mjs.map +0 -1
|
@@ -65,7 +65,7 @@ function renderLoweredSql(ast, contract) {
|
|
|
65
65
|
sql = renderUpdate(node, contract);
|
|
66
66
|
break;
|
|
67
67
|
case "delete":
|
|
68
|
-
sql = renderDelete(node);
|
|
68
|
+
sql = renderDelete(node, contract);
|
|
69
69
|
break;
|
|
70
70
|
default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
|
|
71
71
|
}
|
|
@@ -99,14 +99,23 @@ function renderProjection(projection, contract) {
|
|
|
99
99
|
return `${renderExpr(item.expr, contract)} AS ${alias}`;
|
|
100
100
|
}).join(", ");
|
|
101
101
|
}
|
|
102
|
+
function qualifyTableFromNamespaceCoordinate(table, contract) {
|
|
103
|
+
if (table.namespaceId === void 0) return quoteIdentifier(table.name);
|
|
104
|
+
const namespace = contract.storage.namespaces[table.namespaceId];
|
|
105
|
+
if (namespace === void 0) throw new Error(`Table "${table.name}" references namespace "${table.namespaceId}" which is not present on the contract`);
|
|
106
|
+
const qualifyTable = namespace.qualifyTable;
|
|
107
|
+
if (qualifyTable === void 0) throw new Error(`Table "${table.name}" references namespace "${table.namespaceId}" which is not materialised for SQL rendering on the contract`);
|
|
108
|
+
return qualifyTable.call(namespace, table.name);
|
|
109
|
+
}
|
|
110
|
+
function renderTableSource(source, contract) {
|
|
111
|
+
const qualified = qualifyTableFromNamespaceCoordinate(source, contract);
|
|
112
|
+
if (!source.alias) return qualified;
|
|
113
|
+
return `${qualified} AS ${quoteIdentifier(source.alias)}`;
|
|
114
|
+
}
|
|
102
115
|
function renderSource(source, contract) {
|
|
103
116
|
const node = source;
|
|
104
117
|
switch (node.kind) {
|
|
105
|
-
case "table-source":
|
|
106
|
-
const table = quoteIdentifier(node.name);
|
|
107
|
-
if (!node.alias) return table;
|
|
108
|
-
return `${table} AS ${quoteIdentifier(node.alias)}`;
|
|
109
|
-
}
|
|
118
|
+
case "table-source": return renderTableSource(node, contract);
|
|
110
119
|
case "derived-table-source": return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
|
|
111
120
|
default: throw new Error(`Unsupported source node kind: ${node.kind}`);
|
|
112
121
|
}
|
|
@@ -129,7 +138,9 @@ function renderExpr(expr, contract) {
|
|
|
129
138
|
case "or":
|
|
130
139
|
if (node.exprs.length === 0) return "FALSE";
|
|
131
140
|
return `(${node.exprs.map((part) => renderExpr(part, contract)).join(" OR ")})`;
|
|
132
|
-
case "exists":
|
|
141
|
+
case "exists":
|
|
142
|
+
if (contract === void 0) throw new Error("EXISTS subquery rendering requires a Sqlite contract");
|
|
143
|
+
return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract)})`;
|
|
133
144
|
case "null-check": return renderNullCheck(node, contract);
|
|
134
145
|
case "not": return `NOT (${renderExpr(node.expr, contract)})`;
|
|
135
146
|
case "param-ref":
|
|
@@ -167,6 +178,7 @@ function renderOperation(expr, contract) {
|
|
|
167
178
|
}
|
|
168
179
|
function renderSubqueryExpr(expr, contract) {
|
|
169
180
|
if (expr.query.projection.length !== 1) throw new Error("Subquery expressions must project exactly one column");
|
|
181
|
+
if (contract === void 0) throw new Error("Subquery expression rendering requires a Sqlite contract");
|
|
170
182
|
return `(${renderSelect(expr.query, contract)})`;
|
|
171
183
|
}
|
|
172
184
|
function renderNullCheck(expr, contract) {
|
|
@@ -247,6 +259,7 @@ function renderJsonArrayAggExpr(expr, contract) {
|
|
|
247
259
|
return aggregated;
|
|
248
260
|
}
|
|
249
261
|
function renderJoin(join, contract) {
|
|
262
|
+
if (contract === void 0) throw new Error("JOIN rendering requires a Sqlite contract");
|
|
250
263
|
return `${join.joinType.toUpperCase()} JOIN ${renderSource(join.source, contract)} ON ${renderJoinOn(join.on, contract)}`;
|
|
251
264
|
}
|
|
252
265
|
function renderJoinOn(on, contract) {
|
|
@@ -263,7 +276,7 @@ function renderInsertValue(value) {
|
|
|
263
276
|
}
|
|
264
277
|
}
|
|
265
278
|
function renderInsert(ast, contract) {
|
|
266
|
-
const table =
|
|
279
|
+
const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
|
|
267
280
|
const rows = ast.rows;
|
|
268
281
|
if (rows.length === 0) throw new Error("INSERT requires at least one row");
|
|
269
282
|
const firstRow = rows[0];
|
|
@@ -304,7 +317,7 @@ function renderInsert(ast, contract) {
|
|
|
304
317
|
return `${insertClause}${onConflictClause}${returningClause}`;
|
|
305
318
|
}
|
|
306
319
|
function renderUpdate(ast, contract) {
|
|
307
|
-
const table =
|
|
320
|
+
const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
|
|
308
321
|
const setClauses = Object.entries(ast.set).map(([col, val]) => {
|
|
309
322
|
return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;
|
|
310
323
|
});
|
|
@@ -312,8 +325,8 @@ function renderUpdate(ast, contract) {
|
|
|
312
325
|
const returningClause = renderReturning(ast.returning);
|
|
313
326
|
return `UPDATE ${table} SET ${setClauses.join(", ")}${whereClause}${returningClause}`;
|
|
314
327
|
}
|
|
315
|
-
function renderDelete(ast) {
|
|
316
|
-
return `DELETE FROM ${
|
|
328
|
+
function renderDelete(ast, contract) {
|
|
329
|
+
return `DELETE FROM ${qualifyTableFromNamespaceCoordinate(ast.table, contract)}${ast.where ? ` WHERE ${renderExpr(ast.where)}` : ""}${renderReturning(ast.returning)}`;
|
|
317
330
|
}
|
|
318
331
|
function renderReturning(returning) {
|
|
319
332
|
if (!returning?.length) return "";
|
|
@@ -345,4 +358,4 @@ function createSqliteAdapter(options) {
|
|
|
345
358
|
//#endregion
|
|
346
359
|
export { renderLoweredSql as n, sqliteRawCodecInferer as r, createSqliteAdapter as t };
|
|
347
360
|
|
|
348
|
-
//# sourceMappingURL=adapter-
|
|
361
|
+
//# sourceMappingURL=adapter-BRKmR33P.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-BRKmR33P.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 TableSource,\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, 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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-Cn_t9TdZ.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"adapter-Cn_t9TdZ.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;cAmDM,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,iBAiiBe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
|
package/dist/adapter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-
|
|
1
|
+
import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-BRKmR33P.mjs";
|
|
2
2
|
export { createSqliteAdapter, sqliteRawCodecInferer };
|
package/dist/control.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as renderLoweredSql } from "./adapter-
|
|
1
|
+
import { n as renderLoweredSql } from "./adapter-BRKmR33P.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
4
|
import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-
|
|
1
|
+
import { r as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-BRKmR33P.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.
|
|
3
|
+
"version": "0.12.0-dev.12",
|
|
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.
|
|
9
|
-
"@prisma-next/contract": "0.12.0-dev.
|
|
10
|
-
"@prisma-next/contract-authoring": "0.12.0-dev.
|
|
11
|
-
"@prisma-next/errors": "0.12.0-dev.
|
|
12
|
-
"@prisma-next/framework-components": "0.12.0-dev.
|
|
13
|
-
"@prisma-next/family-sql": "0.12.0-dev.
|
|
14
|
-
"@prisma-next/ids": "0.12.0-dev.
|
|
15
|
-
"@prisma-next/sql-contract": "0.12.0-dev.
|
|
16
|
-
"@prisma-next/sql-contract-psl": "0.12.0-dev.
|
|
17
|
-
"@prisma-next/sql-contract-ts": "0.12.0-dev.
|
|
18
|
-
"@prisma-next/sql-operations": "0.12.0-dev.
|
|
19
|
-
"@prisma-next/sql-relational-core": "0.12.0-dev.
|
|
20
|
-
"@prisma-next/sql-runtime": "0.12.0-dev.
|
|
21
|
-
"@prisma-next/sql-schema-ir": "0.12.0-dev.
|
|
22
|
-
"@prisma-next/target-sqlite": "0.12.0-dev.
|
|
23
|
-
"@prisma-next/utils": "0.12.0-dev.
|
|
8
|
+
"@prisma-next/cli": "0.12.0-dev.12",
|
|
9
|
+
"@prisma-next/contract": "0.12.0-dev.12",
|
|
10
|
+
"@prisma-next/contract-authoring": "0.12.0-dev.12",
|
|
11
|
+
"@prisma-next/errors": "0.12.0-dev.12",
|
|
12
|
+
"@prisma-next/framework-components": "0.12.0-dev.12",
|
|
13
|
+
"@prisma-next/family-sql": "0.12.0-dev.12",
|
|
14
|
+
"@prisma-next/ids": "0.12.0-dev.12",
|
|
15
|
+
"@prisma-next/sql-contract": "0.12.0-dev.12",
|
|
16
|
+
"@prisma-next/sql-contract-psl": "0.12.0-dev.12",
|
|
17
|
+
"@prisma-next/sql-contract-ts": "0.12.0-dev.12",
|
|
18
|
+
"@prisma-next/sql-operations": "0.12.0-dev.12",
|
|
19
|
+
"@prisma-next/sql-relational-core": "0.12.0-dev.12",
|
|
20
|
+
"@prisma-next/sql-runtime": "0.12.0-dev.12",
|
|
21
|
+
"@prisma-next/sql-schema-ir": "0.12.0-dev.12",
|
|
22
|
+
"@prisma-next/target-sqlite": "0.12.0-dev.12",
|
|
23
|
+
"@prisma-next/utils": "0.12.0-dev.12",
|
|
24
24
|
"arktype": "^2.2.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@prisma-next/driver-sqlite": "0.12.0-dev.
|
|
28
|
-
"@prisma-next/migration-tools": "0.12.0-dev.
|
|
29
|
-
"@prisma-next/test-utils": "0.12.0-dev.
|
|
30
|
-
"@prisma-next/tsconfig": "0.12.0-dev.
|
|
31
|
-
"@prisma-next/tsdown": "0.12.0-dev.
|
|
27
|
+
"@prisma-next/driver-sqlite": "0.12.0-dev.12",
|
|
28
|
+
"@prisma-next/migration-tools": "0.12.0-dev.12",
|
|
29
|
+
"@prisma-next/test-utils": "0.12.0-dev.12",
|
|
30
|
+
"@prisma-next/tsconfig": "0.12.0-dev.12",
|
|
31
|
+
"@prisma-next/tsdown": "0.12.0-dev.12",
|
|
32
32
|
"pathe": "^2.0.3",
|
|
33
33
|
"tsdown": "0.22.0",
|
|
34
34
|
"typescript": "5.9.3",
|
package/src/core/adapter.ts
CHANGED
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
SelectAst,
|
|
30
30
|
SqlQueryable,
|
|
31
31
|
SubqueryExpr,
|
|
32
|
+
TableSource,
|
|
32
33
|
UpdateAst,
|
|
33
34
|
WindowFuncExpr,
|
|
34
35
|
} from '@prisma-next/sql-relational-core/ast';
|
|
@@ -124,7 +125,7 @@ export function renderLoweredSql(
|
|
|
124
125
|
sql = renderUpdate(node, contract);
|
|
125
126
|
break;
|
|
126
127
|
case 'delete':
|
|
127
|
-
sql = renderDelete(node);
|
|
128
|
+
sql = renderDelete(node, contract);
|
|
128
129
|
break;
|
|
129
130
|
default:
|
|
130
131
|
throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);
|
|
@@ -143,7 +144,7 @@ function renderLimitOffset(
|
|
|
143
144
|
return `${keyword} ${renderExpr(value, contract)}`;
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
function renderSelect(ast: SelectAst, contract
|
|
147
|
+
function renderSelect(ast: SelectAst, contract: SqliteContract): string {
|
|
147
148
|
const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';
|
|
148
149
|
const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;
|
|
149
150
|
const fromClause = `FROM ${renderSource(ast.from, contract)}`;
|
|
@@ -196,16 +197,41 @@ function renderProjection(
|
|
|
196
197
|
.join(', ');
|
|
197
198
|
}
|
|
198
199
|
|
|
199
|
-
function
|
|
200
|
+
function qualifyTableFromNamespaceCoordinate(
|
|
201
|
+
table: Pick<TableSource, 'name' | 'namespaceId'>,
|
|
202
|
+
contract: SqliteContract,
|
|
203
|
+
): string {
|
|
204
|
+
if (table.namespaceId === undefined) {
|
|
205
|
+
return quoteIdentifier(table.name);
|
|
206
|
+
}
|
|
207
|
+
const namespace = contract.storage.namespaces[table.namespaceId];
|
|
208
|
+
if (namespace === undefined) {
|
|
209
|
+
throw new Error(
|
|
210
|
+
`Table "${table.name}" references namespace "${table.namespaceId}" which is not present on the contract`,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
const qualifyTable = namespace.qualifyTable;
|
|
214
|
+
if (qualifyTable === undefined) {
|
|
215
|
+
throw new Error(
|
|
216
|
+
`Table "${table.name}" references namespace "${table.namespaceId}" which is not materialised for SQL rendering on the contract`,
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
return qualifyTable.call(namespace, table.name);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function renderTableSource(source: TableSource, contract: SqliteContract): string {
|
|
223
|
+
const qualified = qualifyTableFromNamespaceCoordinate(source, contract);
|
|
224
|
+
if (!source.alias) {
|
|
225
|
+
return qualified;
|
|
226
|
+
}
|
|
227
|
+
return `${qualified} AS ${quoteIdentifier(source.alias)}`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function renderSource(source: AnyFromSource, contract: SqliteContract): string {
|
|
200
231
|
const node = source;
|
|
201
232
|
switch (node.kind) {
|
|
202
|
-
case 'table-source':
|
|
203
|
-
|
|
204
|
-
if (!node.alias) {
|
|
205
|
-
return table;
|
|
206
|
-
}
|
|
207
|
-
return `${table} AS ${quoteIdentifier(node.alias)}`;
|
|
208
|
-
}
|
|
233
|
+
case 'table-source':
|
|
234
|
+
return renderTableSource(node, contract);
|
|
209
235
|
case 'derived-table-source':
|
|
210
236
|
return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
|
|
211
237
|
default:
|
|
@@ -245,6 +271,9 @@ function renderExpr(expr: AnyExpression, contract?: SqliteContract): string {
|
|
|
245
271
|
}
|
|
246
272
|
return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;
|
|
247
273
|
case 'exists': {
|
|
274
|
+
if (contract === undefined) {
|
|
275
|
+
throw new Error('EXISTS subquery rendering requires a Sqlite contract');
|
|
276
|
+
}
|
|
248
277
|
const notKeyword = node.notExists ? 'NOT ' : '';
|
|
249
278
|
const subquery = renderSelect(node.subquery, contract);
|
|
250
279
|
return `${notKeyword}EXISTS (${subquery})`;
|
|
@@ -321,6 +350,9 @@ function renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): stri
|
|
|
321
350
|
if (expr.query.projection.length !== 1) {
|
|
322
351
|
throw new Error('Subquery expressions must project exactly one column');
|
|
323
352
|
}
|
|
353
|
+
if (contract === undefined) {
|
|
354
|
+
throw new Error('Subquery expression rendering requires a Sqlite contract');
|
|
355
|
+
}
|
|
324
356
|
return `(${renderSelect(expr.query, contract)})`;
|
|
325
357
|
}
|
|
326
358
|
|
|
@@ -451,6 +483,9 @@ function renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContrac
|
|
|
451
483
|
}
|
|
452
484
|
|
|
453
485
|
function renderJoin(join: JoinAst, contract?: SqliteContract): string {
|
|
486
|
+
if (contract === undefined) {
|
|
487
|
+
throw new Error('JOIN rendering requires a Sqlite contract');
|
|
488
|
+
}
|
|
454
489
|
const joinType = join.joinType.toUpperCase();
|
|
455
490
|
const source = renderSource(join.source, contract);
|
|
456
491
|
const onClause = renderJoinOn(join.on, contract);
|
|
@@ -479,7 +514,7 @@ function renderInsertValue(value: InsertValue): string {
|
|
|
479
514
|
}
|
|
480
515
|
|
|
481
516
|
function renderInsert(ast: InsertAst, contract: SqliteContract): string {
|
|
482
|
-
const table =
|
|
517
|
+
const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
|
|
483
518
|
const rows = ast.rows;
|
|
484
519
|
if (rows.length === 0) {
|
|
485
520
|
throw new Error('INSERT requires at least one row');
|
|
@@ -538,7 +573,7 @@ function renderInsert(ast: InsertAst, contract: SqliteContract): string {
|
|
|
538
573
|
}
|
|
539
574
|
|
|
540
575
|
function renderUpdate(ast: UpdateAst, contract: SqliteContract): string {
|
|
541
|
-
const table =
|
|
576
|
+
const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
|
|
542
577
|
const setClauses = Object.entries(ast.set).map(([col, val]) => {
|
|
543
578
|
return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;
|
|
544
579
|
});
|
|
@@ -549,8 +584,8 @@ function renderUpdate(ast: UpdateAst, contract: SqliteContract): string {
|
|
|
549
584
|
return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;
|
|
550
585
|
}
|
|
551
586
|
|
|
552
|
-
function renderDelete(ast: DeleteAst): string {
|
|
553
|
-
const table =
|
|
587
|
+
function renderDelete(ast: DeleteAst, contract: SqliteContract): string {
|
|
588
|
+
const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);
|
|
554
589
|
const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';
|
|
555
590
|
const returningClause = renderReturning(ast.returning);
|
|
556
591
|
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|