@prisma-next/adapter-sqlite 0.12.0-dev.9 → 0.13.0-dev.1
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-Cn_t9TdZ.d.mts → adapter-CPydDe3Y.d.mts} +4 -3
- package/dist/adapter-CPydDe3Y.d.mts.map +1 -0
- package/dist/adapter-DCwhDr2I.mjs +795 -0
- package/dist/adapter-DCwhDr2I.mjs.map +1 -0
- package/dist/adapter.d.mts +1 -1
- package/dist/adapter.mjs +1 -1
- package/dist/codec-types.d.mts +1 -1
- package/dist/control.d.mts +56 -7
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +4 -195
- package/dist/control.mjs.map +1 -1
- package/dist/{descriptor-meta-yjlqZvLC.mjs → descriptor-meta-Du5OgSxS.mjs} +1 -1
- package/dist/{descriptor-meta-yjlqZvLC.mjs.map → descriptor-meta-Du5OgSxS.mjs.map} +1 -1
- package/dist/runtime.d.mts +1 -1
- package/dist/runtime.mjs +3 -3
- package/dist/{types-bTlW__XL.d.mts → types-rMUNtvF6.d.mts} +1 -1
- package/dist/{types-bTlW__XL.d.mts.map → types-rMUNtvF6.d.mts.map} +1 -1
- package/dist/types.d.mts +2 -2
- package/package.json +24 -24
- package/src/core/adapter.ts +79 -44
- package/src/core/control-adapter.ts +323 -118
- package/src/core/ddl-renderer.ts +123 -0
- package/src/core/ledger-decode.ts +26 -0
- package/src/core/marker-ledger.ts +124 -0
- package/dist/adapter-BOg2xl4V.mjs +0 -348
- package/dist/adapter-BOg2xl4V.mjs.map +0 -1
- package/dist/adapter-Cn_t9TdZ.d.mts.map +0 -1
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';
|
|
2
|
+
import {
|
|
3
|
+
type AnyQueryAst,
|
|
4
|
+
type LoweredStatement,
|
|
5
|
+
RawExpr,
|
|
6
|
+
} from '@prisma-next/sql-relational-core/ast';
|
|
7
|
+
import {
|
|
8
|
+
createAstCodecRegistry,
|
|
9
|
+
deriveParamMetadata,
|
|
10
|
+
encodeParamsWithMetadata,
|
|
11
|
+
} from '@prisma-next/sql-runtime';
|
|
12
|
+
import { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';
|
|
13
|
+
import { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';
|
|
14
|
+
import {
|
|
15
|
+
datetime,
|
|
16
|
+
integer,
|
|
17
|
+
jsonText,
|
|
18
|
+
sqliteTable,
|
|
19
|
+
text,
|
|
20
|
+
} from '@prisma-next/target-sqlite/contract-free';
|
|
21
|
+
|
|
22
|
+
const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);
|
|
23
|
+
|
|
24
|
+
export const marker = sqliteTable('_prisma_marker', {
|
|
25
|
+
space: text(),
|
|
26
|
+
core_hash: text(),
|
|
27
|
+
profile_hash: text(),
|
|
28
|
+
contract_json: jsonText({ nullable: true }),
|
|
29
|
+
canonical_version: integer({ nullable: true }),
|
|
30
|
+
updated_at: datetime(),
|
|
31
|
+
app_tag: text({ nullable: true }),
|
|
32
|
+
meta: jsonText({ nullable: true }),
|
|
33
|
+
invariants: jsonText(),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Writeable subset of `_prisma_ledger`. Omits the DB-generated `id`
|
|
38
|
+
* (`INTEGER PRIMARY KEY AUTOINCREMENT`) and `created_at` (default
|
|
39
|
+
* `strftime(...)`).
|
|
40
|
+
*/
|
|
41
|
+
export const ledger = sqliteTable('_prisma_ledger', {
|
|
42
|
+
space: text(),
|
|
43
|
+
migration_name: text(),
|
|
44
|
+
migration_hash: text(),
|
|
45
|
+
origin_core_hash: text({ nullable: true }),
|
|
46
|
+
destination_core_hash: text(),
|
|
47
|
+
operations: jsonText(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Read-side handle covering every column of `_prisma_ledger`, including
|
|
52
|
+
* the DB-generated `id` (for ORDER BY) and `created_at`.
|
|
53
|
+
*/
|
|
54
|
+
export const ledgerReadShape = sqliteTable('_prisma_ledger', {
|
|
55
|
+
id: integer(),
|
|
56
|
+
space: text(),
|
|
57
|
+
migration_name: text(),
|
|
58
|
+
migration_hash: text(),
|
|
59
|
+
origin_core_hash: text({ nullable: true }),
|
|
60
|
+
destination_core_hash: text(),
|
|
61
|
+
operations: jsonText(),
|
|
62
|
+
created_at: text(),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
export const sqliteCatalog = sqliteTable('sqlite_master', { type: text(), name: text() });
|
|
66
|
+
|
|
67
|
+
export const NOW = new RawExpr({
|
|
68
|
+
parts: ["datetime('now')"],
|
|
69
|
+
returns: { codecId: SQLITE_DATETIME_CODEC_ID, nullable: false },
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
type Lower = (query: AnyQueryAst) => LoweredStatement;
|
|
73
|
+
|
|
74
|
+
type MarkerDriver = {
|
|
75
|
+
query<Row = Record<string, unknown>>(
|
|
76
|
+
sql: string,
|
|
77
|
+
params?: readonly unknown[],
|
|
78
|
+
): Promise<{ readonly rows: ReadonlyArray<Row> }>;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export function mergeInvariants(
|
|
82
|
+
current: readonly string[],
|
|
83
|
+
incoming: readonly string[],
|
|
84
|
+
): readonly string[] {
|
|
85
|
+
return [...new Set([...current, ...incoming])].sort();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export async function execute(
|
|
89
|
+
lower: Lower,
|
|
90
|
+
driver: MarkerDriver,
|
|
91
|
+
query: AnyQueryAst,
|
|
92
|
+
): Promise<readonly Record<string, unknown>[]> {
|
|
93
|
+
const lowered = lower(query);
|
|
94
|
+
const values = lowered.params.map((slot) => {
|
|
95
|
+
if (slot.kind === 'literal') return slot.value;
|
|
96
|
+
throw new Error('SQLite control DML lowered to a bind parameter, which is unsupported');
|
|
97
|
+
});
|
|
98
|
+
const encoded = await encodeParamsWithMetadata(
|
|
99
|
+
values,
|
|
100
|
+
deriveParamMetadata(query),
|
|
101
|
+
{},
|
|
102
|
+
CONTROL_CODECS,
|
|
103
|
+
);
|
|
104
|
+
const result = await driver.query(lowered.sql, encoded);
|
|
105
|
+
return result.rows;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function decodeSqliteMarkerRow(row: unknown): unknown {
|
|
109
|
+
if (typeof row !== 'object' || row === null || !('invariants' in row)) {
|
|
110
|
+
return row;
|
|
111
|
+
}
|
|
112
|
+
const record = row as { invariants: unknown };
|
|
113
|
+
if (typeof record.invariants !== 'string') return row;
|
|
114
|
+
let parsed: unknown;
|
|
115
|
+
try {
|
|
116
|
+
parsed = JSON.parse(record.invariants);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
119
|
+
throw new Error(`Invalid contract marker row: invariants is not valid JSON: ${detail}`);
|
|
120
|
+
}
|
|
121
|
+
return { ...record, invariants: parsed };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export type SqliteMarkerWriteDriver = SqlControlDriverInstance<'sqlite'>;
|
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
|
|
2
|
-
import { parseContractMarkerRow } from "@prisma-next/sql-runtime";
|
|
3
|
-
import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
|
|
4
|
-
//#region src/core/adapter.ts
|
|
5
|
-
const defaultCapabilities = Object.freeze({ sql: {
|
|
6
|
-
orderBy: true,
|
|
7
|
-
limit: true,
|
|
8
|
-
lateral: false,
|
|
9
|
-
jsonAgg: true,
|
|
10
|
-
returning: true,
|
|
11
|
-
enums: false
|
|
12
|
-
} });
|
|
13
|
-
var SqliteAdapterImpl = class {
|
|
14
|
-
familyId = "sql";
|
|
15
|
-
targetId = "sqlite";
|
|
16
|
-
profile;
|
|
17
|
-
constructor(options) {
|
|
18
|
-
this.profile = Object.freeze({
|
|
19
|
-
id: options?.profileId ?? "sqlite/default@1",
|
|
20
|
-
target: "sqlite",
|
|
21
|
-
capabilities: defaultCapabilities,
|
|
22
|
-
readMarker: (queryable) => readSqliteMarker(queryable)
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
lower(ast, context) {
|
|
26
|
-
return renderLoweredSql(ast, context.contract);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a sqlite client. Contributed as the descriptor's static `rawCodecInferer` slot. */
|
|
30
|
-
const sqliteRawCodecInferer = { inferCodec(value) {
|
|
31
|
-
switch (typeof value) {
|
|
32
|
-
case "number": return Number.isSafeInteger(value) && value % 1 === 0 ? "sqlite/integer@1" : "sqlite/real@1";
|
|
33
|
-
case "bigint": return "sqlite/bigint@1";
|
|
34
|
-
case "string": return "sqlite/text@1";
|
|
35
|
-
case "boolean": return "sqlite/integer@1";
|
|
36
|
-
case "object": if (value instanceof Uint8Array) return "sqlite/blob@1";
|
|
37
|
-
}
|
|
38
|
-
throw new Error("unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec");
|
|
39
|
-
} };
|
|
40
|
-
/**
|
|
41
|
-
* Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
|
|
42
|
-
*
|
|
43
|
-
* 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.
|
|
44
|
-
*/
|
|
45
|
-
function renderLoweredSql(ast, contract) {
|
|
46
|
-
const collectedParamRefs = ast.collectParamRefs();
|
|
47
|
-
const params = [];
|
|
48
|
-
for (const ref of collectedParamRefs) params.push(ref.kind === "prepared-param-ref" ? {
|
|
49
|
-
kind: "bind",
|
|
50
|
-
name: ref.name
|
|
51
|
-
} : {
|
|
52
|
-
kind: "literal",
|
|
53
|
-
value: ref.value
|
|
54
|
-
});
|
|
55
|
-
let sql;
|
|
56
|
-
const node = ast;
|
|
57
|
-
switch (node.kind) {
|
|
58
|
-
case "select":
|
|
59
|
-
sql = renderSelect(node, contract);
|
|
60
|
-
break;
|
|
61
|
-
case "insert":
|
|
62
|
-
sql = renderInsert(node, contract);
|
|
63
|
-
break;
|
|
64
|
-
case "update":
|
|
65
|
-
sql = renderUpdate(node, contract);
|
|
66
|
-
break;
|
|
67
|
-
case "delete":
|
|
68
|
-
sql = renderDelete(node);
|
|
69
|
-
break;
|
|
70
|
-
default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
|
|
71
|
-
}
|
|
72
|
-
return Object.freeze({
|
|
73
|
-
sql,
|
|
74
|
-
params
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
function renderLimitOffset(keyword, value, contract) {
|
|
78
|
-
if (value === void 0) return "";
|
|
79
|
-
if (typeof value === "number") return `${keyword} ${value}`;
|
|
80
|
-
return `${keyword} ${renderExpr(value, contract)}`;
|
|
81
|
-
}
|
|
82
|
-
function renderSelect(ast, contract) {
|
|
83
|
-
return [
|
|
84
|
-
`SELECT ${ast.distinct ? "DISTINCT " : ""}${renderProjection(ast.projection, contract)}`,
|
|
85
|
-
`FROM ${renderSource(ast.from, contract)}`,
|
|
86
|
-
ast.joins?.length ? ast.joins.map((join) => renderJoin(join, contract)).join(" ") : "",
|
|
87
|
-
ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : "",
|
|
88
|
-
ast.groupBy?.length ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(", ")}` : "",
|
|
89
|
-
ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : "",
|
|
90
|
-
ast.orderBy?.length ? `ORDER BY ${ast.orderBy.map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`).join(", ")}` : "",
|
|
91
|
-
renderLimitOffset("LIMIT", ast.limit, contract),
|
|
92
|
-
renderLimitOffset("OFFSET", ast.offset, contract)
|
|
93
|
-
].filter((part) => part.length > 0).join(" ").trim();
|
|
94
|
-
}
|
|
95
|
-
function renderProjection(projection, contract) {
|
|
96
|
-
return projection.map((item) => {
|
|
97
|
-
const alias = quoteIdentifier(item.alias);
|
|
98
|
-
if (item.expr.kind === "literal") return `${renderLiteral(item.expr)} AS ${alias}`;
|
|
99
|
-
return `${renderExpr(item.expr, contract)} AS ${alias}`;
|
|
100
|
-
}).join(", ");
|
|
101
|
-
}
|
|
102
|
-
function renderSource(source, contract) {
|
|
103
|
-
const node = source;
|
|
104
|
-
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
|
-
}
|
|
110
|
-
case "derived-table-source": return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
|
|
111
|
-
default: throw new Error(`Unsupported source node kind: ${node.kind}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
function renderExpr(expr, contract) {
|
|
115
|
-
const node = expr;
|
|
116
|
-
switch (node.kind) {
|
|
117
|
-
case "column-ref": return renderColumn(node);
|
|
118
|
-
case "identifier-ref": return quoteIdentifier(node.name);
|
|
119
|
-
case "operation": return renderOperation(node, contract);
|
|
120
|
-
case "subquery": return renderSubqueryExpr(node, contract);
|
|
121
|
-
case "aggregate": return renderAggregateExpr(node, contract);
|
|
122
|
-
case "window-func": return renderWindowFuncExpr(node, contract);
|
|
123
|
-
case "json-object": return renderJsonObjectExpr(node, contract);
|
|
124
|
-
case "json-array-agg": return renderJsonArrayAggExpr(node, contract);
|
|
125
|
-
case "binary": return renderBinary(node, contract);
|
|
126
|
-
case "and":
|
|
127
|
-
if (node.exprs.length === 0) return "TRUE";
|
|
128
|
-
return `(${node.exprs.map((part) => renderExpr(part, contract)).join(" AND ")})`;
|
|
129
|
-
case "or":
|
|
130
|
-
if (node.exprs.length === 0) return "FALSE";
|
|
131
|
-
return `(${node.exprs.map((part) => renderExpr(part, contract)).join(" OR ")})`;
|
|
132
|
-
case "exists": return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract)})`;
|
|
133
|
-
case "null-check": return renderNullCheck(node, contract);
|
|
134
|
-
case "not": return `NOT (${renderExpr(node.expr, contract)})`;
|
|
135
|
-
case "param-ref":
|
|
136
|
-
case "prepared-param-ref": return "?";
|
|
137
|
-
case "literal": return renderLiteral(node);
|
|
138
|
-
case "list": return renderListLiteral(node);
|
|
139
|
-
case "raw-expr": return renderRawExpr(node, contract);
|
|
140
|
-
default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function renderRawExpr(node, contract) {
|
|
144
|
-
return node.parts.map((part) => typeof part === "string" ? part : renderExpr(part, contract)).join("");
|
|
145
|
-
}
|
|
146
|
-
function renderColumn(ref) {
|
|
147
|
-
if (ref.table === "excluded") return `excluded.${quoteIdentifier(ref.column)}`;
|
|
148
|
-
return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;
|
|
149
|
-
}
|
|
150
|
-
function renderLiteral(expr) {
|
|
151
|
-
if (typeof expr.value === "string") return `'${escapeLiteral(expr.value)}'`;
|
|
152
|
-
if (typeof expr.value === "number" || typeof expr.value === "boolean") return String(expr.value);
|
|
153
|
-
if (typeof expr.value === "bigint") return String(expr.value);
|
|
154
|
-
if (expr.value === null || expr.value === void 0) return "NULL";
|
|
155
|
-
if (expr.value instanceof Date) return `'${escapeLiteral(expr.value.toISOString())}'`;
|
|
156
|
-
const json = JSON.stringify(expr.value);
|
|
157
|
-
if (json === void 0) return "NULL";
|
|
158
|
-
return `'${escapeLiteral(json)}'`;
|
|
159
|
-
}
|
|
160
|
-
function renderOperation(expr, contract) {
|
|
161
|
-
const self = renderExpr(expr.self, contract);
|
|
162
|
-
const args = expr.args.map((arg) => renderExpr(arg, contract));
|
|
163
|
-
let result = expr.lowering.template;
|
|
164
|
-
result = result.replace(/\{\{self\}\}/g, self);
|
|
165
|
-
for (let i = 0; i < args.length; i++) result = result.replace(new RegExp(`\\{\\{arg${i}\\}\\}`, "g"), args[i] ?? "");
|
|
166
|
-
return result;
|
|
167
|
-
}
|
|
168
|
-
function renderSubqueryExpr(expr, contract) {
|
|
169
|
-
if (expr.query.projection.length !== 1) throw new Error("Subquery expressions must project exactly one column");
|
|
170
|
-
return `(${renderSelect(expr.query, contract)})`;
|
|
171
|
-
}
|
|
172
|
-
function renderNullCheck(expr, contract) {
|
|
173
|
-
const rendered = renderExpr(expr.expr, contract);
|
|
174
|
-
const renderedExpr = expr.expr.kind === "operation" || expr.expr.kind === "subquery" ? `(${rendered})` : rendered;
|
|
175
|
-
return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;
|
|
176
|
-
}
|
|
177
|
-
function renderBinary(expr, contract) {
|
|
178
|
-
if (expr.right.kind === "list" && expr.right.values.length === 0) {
|
|
179
|
-
if (expr.op === "in") return "FALSE";
|
|
180
|
-
if (expr.op === "notIn") return "TRUE";
|
|
181
|
-
}
|
|
182
|
-
const leftExpr = expr.left;
|
|
183
|
-
const left = renderExpr(leftExpr, contract);
|
|
184
|
-
const leftRendered = leftExpr.kind === "operation" || leftExpr.kind === "subquery" ? `(${left})` : left;
|
|
185
|
-
const rightNode = expr.right;
|
|
186
|
-
let right;
|
|
187
|
-
switch (rightNode.kind) {
|
|
188
|
-
case "list":
|
|
189
|
-
right = renderListLiteral(rightNode);
|
|
190
|
-
break;
|
|
191
|
-
case "literal":
|
|
192
|
-
right = renderLiteral(rightNode);
|
|
193
|
-
break;
|
|
194
|
-
case "column-ref":
|
|
195
|
-
right = renderColumn(rightNode);
|
|
196
|
-
break;
|
|
197
|
-
case "param-ref":
|
|
198
|
-
case "prepared-param-ref":
|
|
199
|
-
right = "?";
|
|
200
|
-
break;
|
|
201
|
-
default:
|
|
202
|
-
right = renderExpr(rightNode, contract);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
return `${leftRendered} ${{
|
|
206
|
-
eq: "=",
|
|
207
|
-
neq: "!=",
|
|
208
|
-
gt: ">",
|
|
209
|
-
lt: "<",
|
|
210
|
-
gte: ">=",
|
|
211
|
-
lte: "<=",
|
|
212
|
-
like: "LIKE",
|
|
213
|
-
in: "IN",
|
|
214
|
-
notIn: "NOT IN"
|
|
215
|
-
}[expr.op]} ${right}`;
|
|
216
|
-
}
|
|
217
|
-
function renderListLiteral(expr) {
|
|
218
|
-
if (expr.values.length === 0) return "(NULL)";
|
|
219
|
-
return `(${expr.values.map((v) => {
|
|
220
|
-
if (v.kind === "param-ref" || v.kind === "prepared-param-ref") return "?";
|
|
221
|
-
if (v.kind === "literal") return renderLiteral(v);
|
|
222
|
-
return renderExpr(v);
|
|
223
|
-
}).join(", ")})`;
|
|
224
|
-
}
|
|
225
|
-
function renderAggregateExpr(expr, contract) {
|
|
226
|
-
const fn = expr.fn.toUpperCase();
|
|
227
|
-
if (!expr.expr) return `${fn}(*)`;
|
|
228
|
-
return `${fn}(${renderExpr(expr.expr, contract)})`;
|
|
229
|
-
}
|
|
230
|
-
function renderWindowFuncExpr(expr, contract) {
|
|
231
|
-
return `${expr.fn.toUpperCase()}(${expr.args.map((arg) => renderExpr(arg, contract)).join(", ")}) OVER (${[expr.partitionBy && expr.partitionBy.length > 0 ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract)).join(", ")}` : "", expr.orderBy && expr.orderBy.length > 0 ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract)}` : ""].filter((part) => part.length > 0).join(" ")})`;
|
|
232
|
-
}
|
|
233
|
-
function renderJsonObjectExpr(expr, contract) {
|
|
234
|
-
return `json_object(${expr.entries.flatMap((entry) => {
|
|
235
|
-
const key = `'${escapeLiteral(entry.key)}'`;
|
|
236
|
-
if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
|
|
237
|
-
return [key, renderExpr(entry.value, contract)];
|
|
238
|
-
}).join(", ")})`;
|
|
239
|
-
}
|
|
240
|
-
function renderOrderByItems(items, contract) {
|
|
241
|
-
return items.map((item) => `${renderExpr(item.expr, contract)} ${item.dir.toUpperCase()}`).join(", ");
|
|
242
|
-
}
|
|
243
|
-
function renderJsonArrayAggExpr(expr, contract) {
|
|
244
|
-
const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract)}` : "";
|
|
245
|
-
const aggregated = `json_group_array(${renderExpr(expr.expr, contract)}${aggregateOrderBy})`;
|
|
246
|
-
if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, '[]')`;
|
|
247
|
-
return aggregated;
|
|
248
|
-
}
|
|
249
|
-
function renderJoin(join, contract) {
|
|
250
|
-
return `${join.joinType.toUpperCase()} JOIN ${renderSource(join.source, contract)} ON ${renderJoinOn(join.on, contract)}`;
|
|
251
|
-
}
|
|
252
|
-
function renderJoinOn(on, contract) {
|
|
253
|
-
if (on.kind === "eq-col-join-on") return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;
|
|
254
|
-
return renderExpr(on, contract);
|
|
255
|
-
}
|
|
256
|
-
function renderInsertValue(value) {
|
|
257
|
-
switch (value.kind) {
|
|
258
|
-
case "param-ref":
|
|
259
|
-
case "prepared-param-ref": return "?";
|
|
260
|
-
case "column-ref": return renderColumn(value);
|
|
261
|
-
case "default-value": throw new Error("SQLite does not support DEFAULT as a value in INSERT ... VALUES");
|
|
262
|
-
default: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function renderInsert(ast, contract) {
|
|
266
|
-
const table = quoteIdentifier(ast.table.name);
|
|
267
|
-
const rows = ast.rows;
|
|
268
|
-
if (rows.length === 0) throw new Error("INSERT requires at least one row");
|
|
269
|
-
const firstRow = rows[0];
|
|
270
|
-
const columnOrder = Object.keys(firstRow);
|
|
271
|
-
let insertClause;
|
|
272
|
-
if (columnOrder.length === 0) insertClause = `INSERT INTO ${table} DEFAULT VALUES`;
|
|
273
|
-
else {
|
|
274
|
-
const columns = columnOrder.map((column) => quoteIdentifier(column));
|
|
275
|
-
const values = rows.map((row) => {
|
|
276
|
-
return `(${columnOrder.map((column) => {
|
|
277
|
-
const value = row[column];
|
|
278
|
-
if (value === void 0) throw new Error(`Missing value for column "${column}" in INSERT row`);
|
|
279
|
-
return renderInsertValue(value);
|
|
280
|
-
}).join(", ")})`;
|
|
281
|
-
}).join(", ");
|
|
282
|
-
insertClause = `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${values}`;
|
|
283
|
-
}
|
|
284
|
-
let onConflictClause = "";
|
|
285
|
-
if (ast.onConflict) {
|
|
286
|
-
const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));
|
|
287
|
-
if (conflictColumns.length === 0) throw new Error("INSERT onConflict requires at least one conflict column");
|
|
288
|
-
const action = ast.onConflict.action;
|
|
289
|
-
switch (action.kind) {
|
|
290
|
-
case "do-nothing":
|
|
291
|
-
onConflictClause = ` ON CONFLICT (${conflictColumns.join(", ")}) DO NOTHING`;
|
|
292
|
-
break;
|
|
293
|
-
case "do-update-set": {
|
|
294
|
-
const updates = Object.entries(action.set).map(([colName, value]) => {
|
|
295
|
-
return `${quoteIdentifier(colName)} = ${renderExpr(value, contract)}`;
|
|
296
|
-
});
|
|
297
|
-
onConflictClause = ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
default: throw new Error(`Unsupported onConflict action: ${action.kind}`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
const returningClause = renderReturning(ast.returning);
|
|
304
|
-
return `${insertClause}${onConflictClause}${returningClause}`;
|
|
305
|
-
}
|
|
306
|
-
function renderUpdate(ast, contract) {
|
|
307
|
-
const table = quoteIdentifier(ast.table.name);
|
|
308
|
-
const setClauses = Object.entries(ast.set).map(([col, val]) => {
|
|
309
|
-
return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;
|
|
310
|
-
});
|
|
311
|
-
const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where, contract)}` : "";
|
|
312
|
-
const returningClause = renderReturning(ast.returning);
|
|
313
|
-
return `UPDATE ${table} SET ${setClauses.join(", ")}${whereClause}${returningClause}`;
|
|
314
|
-
}
|
|
315
|
-
function renderDelete(ast) {
|
|
316
|
-
return `DELETE FROM ${quoteIdentifier(ast.table.name)}${ast.where ? ` WHERE ${renderExpr(ast.where)}` : ""}${renderReturning(ast.returning)}`;
|
|
317
|
-
}
|
|
318
|
-
function renderReturning(returning) {
|
|
319
|
-
if (!returning?.length) return "";
|
|
320
|
-
return ` RETURNING ${returning.map((item) => {
|
|
321
|
-
if (item.expr.kind === "column-ref") {
|
|
322
|
-
const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;
|
|
323
|
-
return item.expr.column === item.alias ? rendered : `${rendered} AS ${quoteIdentifier(item.alias)}`;
|
|
324
|
-
}
|
|
325
|
-
return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;
|
|
326
|
-
}).join(", ")}`;
|
|
327
|
-
}
|
|
328
|
-
async function readSqliteMarker(queryable) {
|
|
329
|
-
if ((await queryable.query("select 1 from sqlite_master where type = 'table' and name = ?", ["_prisma_marker"])).rows.length === 0) return { kind: "no-table" };
|
|
330
|
-
const row = (await queryable.query("select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from _prisma_marker where space = ?", [APP_SPACE_ID])).rows[0];
|
|
331
|
-
if (!row) return { kind: "absent" };
|
|
332
|
-
const raw = row;
|
|
333
|
-
const invariants = typeof raw["invariants"] === "string" ? JSON.parse(raw["invariants"]) : raw["invariants"];
|
|
334
|
-
return {
|
|
335
|
-
kind: "present",
|
|
336
|
-
record: parseContractMarkerRow({
|
|
337
|
-
...raw,
|
|
338
|
-
invariants
|
|
339
|
-
})
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
function createSqliteAdapter(options) {
|
|
343
|
-
return Object.freeze(new SqliteAdapterImpl(options));
|
|
344
|
-
}
|
|
345
|
-
//#endregion
|
|
346
|
-
export { renderLoweredSql as n, sqliteRawCodecInferer as r, createSqliteAdapter as t };
|
|
347
|
-
|
|
348
|
-
//# sourceMappingURL=adapter-BOg2xl4V.mjs.map
|
|
@@ -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":";;;;AAuCA,MAAM,sBAAsB,OAAO,OAAO,EACxC,KAAK;CACH,SAAS;CACT,OAAO;CACP,SAAS;CACT,SAAS;CACT,WAAW;CACX,OAAO;AACT,EACF,CAAC;AAED,IAAM,oBAAN,MAAgG;CAC9F,WAAoB;CACpB,WAAoB;CAEpB;CAEA,YAAY,SAAgC;EAC1C,KAAK,UAAU,OAAO,OAAO;GAC3B,IAAI,SAAS,aAAa;GAC1B,QAAQ;GACR,cAAc;GACd,aAAa,cAA4B,iBAAiB,SAAS;EACrE,CAAC;CACH;CAEA,MAAM,KAAkB,SAAiE;EACvF,OAAO,iBAAiB,KAAK,QAAQ,QAAQ;CAC/C;AACF;;AAGA,MAAa,wBAAyC,EACpD,WAAW,OAA8B;CACvC,QAAQ,OAAO,OAAf;EACE,KAAK,UACH,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,MAAM,IAChD,qBACA;EACN,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,IAAI,iBAAiB,YAAY,OAAO;CAC5C;CACA,MAAM,IAAI,MACR,6GACF;AACF,EACF;;;;;;AAOA,SAAgB,iBACd,KACA,UACwB;CACxB,MAAM,qBAAqB,IAAI,iBAAiB;CAChD,MAAM,SAAyB,CAAC;CAChC,KAAK,MAAM,OAAO,oBAChB,OAAO,KACL,IAAI,SAAS,uBACT;EAAE,MAAM;EAAQ,MAAM,IAAI;CAAK,IAC/B;EAAE,MAAM;EAAW,OAAO,IAAI;CAAM,CAC1C;CAGF,IAAI;CAEJ,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,MAAM,QAAQ;GACjC;EACF,KAAK;GACH,MAAM,aAAa,IAAI;GACvB;EACF,SACE,MAAM,IAAI,MAAM,8BAA+B,KAA0B,MAAM;CACnF;CAEA,OAAO,OAAO,OAAO;EAAE;EAAK;CAAO,CAAC;AACtC;AAEA,SAAS,kBACP,SACA,OACA,UACQ;CACR,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,OAAO,UAAU,UAAU,OAAO,GAAG,QAAQ,GAAG;CACpD,OAAO,GAAG,QAAQ,GAAG,WAAW,OAAO,QAAQ;AACjD;AAEA,SAAS,aAAa,KAAgB,UAAmC;CAsBvE,OAAO;EACL,UAtBqB,IAAI,WAAW,cAAc,KACJ,iBAAiB,IAAI,YAAY,QAAQ;EAsBvF,QArByB,aAAa,IAAI,MAAM,QAAQ;EAEtC,IAAI,OAAO,SAC3B,IAAI,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,GAAG,IAC5D;EAEgB,IAAI,QAAQ,SAAS,WAAW,IAAI,OAAO,QAAQ,MAAM;EACvD,IAAI,SAAS,SAC/B,YAAY,IAAI,QAAQ,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI,MAC3E;EACiB,IAAI,SAAS,UAAU,WAAW,IAAI,QAAQ,QAAQ,MAAM;EAC7D,IAAI,SAAS,SAC7B,YAAY,IAAI,QACb,KAAK,UAAU,GAAG,WAAW,MAAM,MAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,YAAY,GAAG,EAC/E,KAAK,IAAI,MACZ;EACgB,kBAAkB,SAAS,IAAI,OAAO,QAW9C;EAVS,kBAAkB,UAAU,IAAI,QAAQ,QAWhD;CACb,EACG,QAAQ,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,GAAG,EACR,KAAK;AACV;AAEA,SAAS,iBACP,YACA,UACQ;CACR,OAAO,WACJ,KAAK,SAAS;EACb,MAAM,QAAQ,gBAAgB,KAAK,KAAK;EACxC,IAAI,KAAK,KAAK,SAAS,WACrB,OAAO,GAAG,cAAc,KAAK,IAAI,EAAE,MAAM;EAE3C,OAAO,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE,MAAM;CAClD,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAAS,aAAa,QAAuB,UAAmC;CAC9E,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK,gBAAgB;GACnB,MAAM,QAAQ,gBAAgB,KAAK,IAAI;GACvC,IAAI,CAAC,KAAK,OACR,OAAO;GAET,OAAO,GAAG,MAAM,MAAM,gBAAgB,KAAK,KAAK;EAClD;EACA,KAAK,wBACH,OAAO,IAAI,aAAa,KAAK,OAAO,QAAQ,EAAE,OAAO,gBAAgB,KAAK,KAAK;EACjF,SACE,MAAM,IAAI,MAAM,iCAAkC,KAA0B,MAAM;CACtF;AACF;AAEA,SAAS,WAAW,MAAqB,UAAmC;CAC1E,MAAM,OAAO;CACb,QAAQ,KAAK,MAAb;EACE,KAAK,cACH,OAAO,aAAa,IAAI;EAC1B,KAAK,kBACH,OAAO,gBAAgB,KAAK,IAAI;EAClC,KAAK,aACH,OAAO,gBAAgB,MAAM,QAAQ;EACvC,KAAK,YACH,OAAO,mBAAmB,MAAM,QAAQ;EAC1C,KAAK,aACH,OAAO,oBAAoB,MAAM,QAAQ;EAC3C,KAAK,eACH,OAAO,qBAAqB,MAAM,QAAQ;EAC5C,KAAK,eACH,OAAO,qBAAqB,MAAM,QAAQ;EAC5C,KAAK,kBACH,OAAO,uBAAuB,MAAM,QAAQ;EAC9C,KAAK,UACH,OAAO,aAAa,MAAM,QAAQ;EACpC,KAAK;GACH,IAAI,KAAK,MAAM,WAAW,GACxB,OAAO;GAET,OAAO,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,OAAO,EAAE;EAChF,KAAK;GACH,IAAI,KAAK,MAAM,WAAW,GACxB,OAAO;GAET,OAAO,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW,MAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,EAAE;EAC/E,KAAK,UAGH,OAAO,GAFY,KAAK,YAAY,SAAS,GAExB,UADJ,aAAa,KAAK,UAAU,QACP,EAAE;EAE1C,KAAK,cACH,OAAO,gBAAgB,MAAM,QAAQ;EACvC,KAAK,OACH,OAAO,QAAQ,WAAW,KAAK,MAAM,QAAQ,EAAE;EACjD,KAAK;EACL,KAAK,sBACH,OAAO;EACT,KAAK,WACH,OAAO,cAAc,IAAI;EAC3B,KAAK,QACH,OAAO,kBAAkB,IAAI;EAC/B,KAAK,YACH,OAAO,cAAc,MAAM,QAAQ;EACrC,SACE,MAAM,IAAI,MAAM,qCAAsC,KAA0B,MAAM;CAC1F;AACF;AAEA,SAAS,cAAc,MAAe,UAAmC;CACvE,OAAO,KAAK,MACT,KAAK,SAAU,OAAO,SAAS,WAAW,OAAO,WAAW,MAAM,QAAQ,CAAE,EAC5E,KAAK,EAAE;AACZ;AAGA,SAAS,aAAa,KAAwB;CAC5C,IAAI,IAAI,UAAU,YAChB,OAAO,YAAY,gBAAgB,IAAI,MAAM;CAE/C,OAAO,GAAG,gBAAgB,IAAI,KAAK,EAAE,GAAG,gBAAgB,IAAI,MAAM;AACpE;AAEA,SAAS,cAAc,MAA2B;CAChD,IAAI,OAAO,KAAK,UAAU,UACxB,OAAO,IAAI,cAAc,KAAK,KAAK,EAAE;CAEvC,IAAI,OAAO,KAAK,UAAU,YAAY,OAAO,KAAK,UAAU,WAC1D,OAAO,OAAO,KAAK,KAAK;CAE1B,IAAI,OAAO,KAAK,UAAU,UACxB,OAAO,OAAO,KAAK,KAAK;CAE1B,IAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAA,GACxC,OAAO;CAET,IAAI,KAAK,iBAAiB,MACxB,OAAO,IAAI,cAAc,KAAK,MAAM,YAAY,CAAC,EAAE;CAErD,MAAM,OAAO,KAAK,UAAU,KAAK,KAAK;CACtC,IAAI,SAAS,KAAA,GACX,OAAO;CAET,OAAO,IAAI,cAAc,IAAI,EAAE;AACjC;AAEA,SAAS,gBAAgB,MAAqB,UAAmC;CAC/E,MAAM,OAAO,WAAW,KAAK,MAAM,QAAQ;CAC3C,MAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC;CAE7D,IAAI,SAAS,KAAK,SAAS;CAC3B,SAAS,OAAO,QAAQ,iBAAiB,IAAI;CAC7C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,SAAS,OAAO,QAAQ,IAAI,OAAO,YAAY,EAAE,SAAS,GAAG,GAAG,KAAK,MAAM,EAAE;CAG/E,OAAO;AACT;AAEA,SAAS,mBAAmB,MAAoB,UAAmC;CACjF,IAAI,KAAK,MAAM,WAAW,WAAW,GACnC,MAAM,IAAI,MAAM,sDAAsD;CAExE,OAAO,IAAI,aAAa,KAAK,OAAO,QAAQ,EAAE;AAChD;AAEA,SAAS,gBAAgB,MAAqB,UAAmC;CAC/E,MAAM,WAAW,WAAW,KAAK,MAAM,QAAQ;CAC/C,MAAM,eACJ,KAAK,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,aAAa,IAAI,SAAS,KAAK;CACtF,OAAO,KAAK,SAAS,GAAG,aAAa,YAAY,GAAG,aAAa;AACnE;AAEA,SAAS,aAAa,MAAkB,UAAmC;CACzE,IAAI,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,OAAO,WAAW,GAAG;EAChE,IAAI,KAAK,OAAO,MACd,OAAO;EAET,IAAI,KAAK,OAAO,SACd,OAAO;CAEX;CAEA,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,WAAW,UAAU,QAAQ;CAC1C,MAAM,eACJ,SAAS,SAAS,eAAe,SAAS,SAAS,aAAa,IAAI,KAAK,KAAK;CAEhF,MAAM,YAAY,KAAK;CACvB,IAAI;CACJ,QAAQ,UAAU,MAAlB;EACE,KAAK;GACH,QAAQ,kBAAkB,SAAS;GACnC;EACF,KAAK;GACH,QAAQ,cAAc,SAAS;GAC/B;EACF,KAAK;GACH,QAAQ,aAAa,SAAS;GAC9B;EACF,KAAK;EACL,KAAK;GACH,QAAQ;GACR;EACF;GACE,QAAQ,WAAW,WAAW,QAAQ;GACtC;CACJ;CAcA,OAAO,GAAG,aAAa,GAAG;EAXxB,IAAI;EACJ,KAAK;EACL,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,KAAK;EACL,MAAM;EACN,IAAI;EACJ,OAAO;CAG2B,EAAE,KAAK,IAAI,GAAG;AACpD;AAEA,SAAS,kBAAkB,MAA8B;CACvD,IAAI,KAAK,OAAO,WAAW,GACzB,OAAO;CAST,OAAO,IAPQ,KAAK,OACjB,KAAK,MAAM;EACV,IAAI,EAAE,SAAS,eAAe,EAAE,SAAS,sBAAsB,OAAO;EACtE,IAAI,EAAE,SAAS,WAAW,OAAO,cAAc,CAAC;EAChD,OAAO,WAAW,CAAC;CACrB,CAAC,EACA,KAAK,IACQ,EAAE;AACpB;AAEA,SAAS,oBAAoB,MAAqB,UAAmC;CACnF,MAAM,KAAK,KAAK,GAAG,YAAY;CAC/B,IAAI,CAAC,KAAK,MACR,OAAO,GAAG,GAAG;CAEf,OAAO,GAAG,GAAG,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE;AAClD;AAEA,SAAS,qBAAqB,MAAsB,UAAmC;CAYrF,OAAO,GAXI,KAAK,GAAG,YAWR,EAAE,GAVA,KAAK,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,KAAK,IAUjD,EAAE,UADR,CAPX,KAAK,eAAe,KAAK,YAAY,SAAS,IAC1C,gBAAgB,KAAK,YAAY,KAAK,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,KAAK,IAAI,MAC9E,IAEJ,KAAK,WAAW,KAAK,QAAQ,SAAS,IAClC,YAAY,mBAAmB,KAAK,SAAS,QAAQ,MACrD,EACoC,EAAE,QAAQ,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,GACjD,EAAE;AACtC;AAEA,SAAS,qBAAqB,MAAsB,UAAmC;CAUrF,OAAO,eATM,KAAK,QACf,SAAS,UAA4B;EACpC,MAAM,MAAM,IAAI,cAAc,MAAM,GAAG,EAAE;EACzC,IAAI,MAAM,MAAM,SAAS,WACvB,OAAO,CAAC,KAAK,cAAc,MAAM,KAAK,CAAC;EAEzC,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,QAAQ,CAAC;CAChD,CAAC,EACA,KAAK,IACiB,EAAE;AAC7B;AAEA,SAAS,mBAAmB,OAAmC,UAAmC;CAChG,OAAO,MACJ,KAAK,SAAS,GAAG,WAAW,KAAK,MAAM,QAAQ,EAAE,GAAG,KAAK,IAAI,YAAY,GAAG,EAC5E,KAAK,IAAI;AACd;AAEA,SAAS,uBAAuB,MAAwB,UAAmC;CACzF,MAAM,mBACJ,KAAK,WAAW,KAAK,QAAQ,SAAS,IAClC,aAAa,mBAAmB,KAAK,SAAS,QAAQ,MACtD;CACN,MAAM,aAAa,oBAAoB,WAAW,KAAK,MAAM,QAAQ,IAAI,iBAAiB;CAC1F,IAAI,KAAK,YAAY,cACnB,OAAO,YAAY,WAAW;CAEhC,OAAO;AACT;AAEA,SAAS,WAAW,MAAe,UAAmC;CAIpE,OAAO,GAHU,KAAK,SAAS,YAGd,EAAE,QAFJ,aAAa,KAAK,QAAQ,QAET,EAAE,MADjB,aAAa,KAAK,IAAI,QACQ;AACjD;AAEA,SAAS,aAAa,IAAgB,UAAmC;CACvE,IAAI,GAAG,SAAS,kBACd,OAAO,GAAG,aAAa,GAAG,IAAI,EAAE,KAAK,aAAa,GAAG,KAAK;CAE5D,OAAO,WAAW,IAAI,QAAQ;AAChC;AAEA,SAAS,kBAAkB,OAA4B;CACrD,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK,sBACH,OAAO;EACT,KAAK,cACH,OAAO,aAAa,KAAK;EAC3B,KAAK,iBACH,MAAM,IAAI,MAAM,iEAAiE;EACnF,SACE,MAAM,IAAI,MAAM,qCAAsC,MAA2B,MAAM;CAC3F;AACF;AAEA,SAAS,aAAa,KAAgB,UAAkC;CACtE,MAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;CAC5C,MAAM,OAAO,IAAI;CACjB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,kCAAkC;CAGpD,MAAM,WAAW,KAAK;CACtB,MAAM,cAAc,OAAO,KAAK,QAAQ;CAExC,IAAI;CACJ,IAAI,YAAY,WAAW,GACzB,eAAe,eAAe,MAAM;MAC/B;EACL,MAAM,UAAU,YAAY,KAAK,WAAW,gBAAgB,MAAM,CAAC;EACnE,MAAM,SAAS,KACZ,KAAK,QAAQ;GAQZ,OAAO,IAPa,YAAY,KAAK,WAAW;IAC9C,MAAM,QAAQ,IAAI;IAClB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,6BAA6B,OAAO,gBAAgB;IAEtE,OAAO,kBAAkB,KAAK;GAChC,CACqB,EAAE,KAAK,IAAI,EAAE;EACpC,CAAC,EACA,KAAK,IAAI;EACZ,eAAe,eAAe,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,WAAW;CACxE;CAEA,IAAI,mBAAmB;CACvB,IAAI,IAAI,YAAY;EAClB,MAAM,kBAAkB,IAAI,WAAW,QAAQ,KAAK,QAAQ,gBAAgB,IAAI,MAAM,CAAC;EACvF,IAAI,gBAAgB,WAAW,GAC7B,MAAM,IAAI,MAAM,yDAAyD;EAG3E,MAAM,SAAS,IAAI,WAAW;EAC9B,QAAQ,OAAO,MAAf;GACE,KAAK;IACH,mBAAmB,iBAAiB,gBAAgB,KAAK,IAAI,EAAE;IAC/D;GACF,KAAK,iBAAiB;IACpB,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG,EAAE,KAAK,CAAC,SAAS,WAAW;KACnE,OAAO,GAAG,gBAAgB,OAAO,EAAE,KAAK,WAAW,OAAO,QAAQ;IACpE,CAAC;IACD,mBAAmB,iBAAiB,gBAAgB,KAAK,IAAI,EAAE,kBAAkB,QAAQ,KAAK,IAAI;IAClG;GACF;GACA,SACE,MAAM,IAAI,MAAM,kCAAmC,OAA4B,MAAM;EACzF;CACF;CAEA,MAAM,kBAAkB,gBAAgB,IAAI,SAAS;CAErD,OAAO,GAAG,eAAe,mBAAmB;AAC9C;AAEA,SAAS,aAAa,KAAgB,UAAkC;CACtE,MAAM,QAAQ,gBAAgB,IAAI,MAAM,IAAI;CAC5C,MAAM,aAAa,OAAO,QAAQ,IAAI,GAAG,EAAE,KAAK,CAAC,KAAK,SAAS;EAC7D,OAAO,GAAG,gBAAgB,GAAG,EAAE,KAAK,WAAW,KAAK,QAAQ;CAC9D,CAAC;CAED,MAAM,cAAc,IAAI,QAAQ,UAAU,WAAW,IAAI,OAAO,QAAQ,MAAM;CAC9E,MAAM,kBAAkB,gBAAgB,IAAI,SAAS;CAErD,OAAO,UAAU,MAAM,OAAO,WAAW,KAAK,IAAI,IAAI,cAAc;AACtE;AAEA,SAAS,aAAa,KAAwB;CAK5C,OAAO,eAJO,gBAAgB,IAAI,MAAM,IAId,IAHN,IAAI,QAAQ,UAAU,WAAW,IAAI,KAAK,MAAM,KAC5C,gBAAgB,IAAI,SAEc;AAC5D;AAEA,SAAS,gBAAgB,WAA8D;CACrF,IAAI,CAAC,WAAW,QACd,OAAO;CAET,OAAO,cAAc,UAClB,KAAK,SAAS;EACb,IAAI,KAAK,KAAK,SAAS,cAAc;GACnC,MAAM,WAAW,GAAG,gBAAgB,KAAK,KAAK,KAAK,EAAE,GAAG,gBAAgB,KAAK,KAAK,MAAM;GACxF,OAAO,KAAK,KAAK,WAAW,KAAK,QAC7B,WACA,GAAG,SAAS,MAAM,gBAAgB,KAAK,KAAK;EAClD;EACA,OAAO,GAAG,WAAW,KAAK,IAAI,EAAE,MAAM,gBAAgB,KAAK,KAAK;CAClE,CAAC,EACA,KAAK,IAAI;AACd;AAEA,eAAe,iBAAiB,WAAoD;CAKlF,KAAI,MAJiB,UAAU,MAC7B,iEACA,CAAC,gBAAgB,CACnB,GACW,KAAK,WAAW,GACzB,OAAO,EAAE,MAAM,WAAW;CAO5B,MAAM,OAAM,MAJS,UAAU,MAC7B,+IACA,CAAC,YAAY,CACf,GACmB,KAAK;CACxB,IAAI,CAAC,KACH,OAAO,EAAE,MAAM,SAAS;CAG1B,MAAM,MAAM;CACZ,MAAM,aACJ,OAAO,IAAI,kBAAkB,WACxB,KAAK,MAAM,IAAI,aAAa,IAC7B,IAAI;CACV,OAAO;EAAE,MAAM;EAAW,QAAQ,uBAAuB;GAAE,GAAG;GAAK;EAAW,CAAC;CAAE;AACnF;AAEA,SAAgB,oBAAoB,SAAgC;CAClE,OAAO,OAAO,OAAO,IAAI,kBAAkB,OAAO,CAAC;AACrD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-Cn_t9TdZ.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;cAkDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EAStB,KAAA,CAAM,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,cAAA,CAAe,cAAA,IAAkB,sBAAA;AAAA;;cAMvD,qBAAA,EAAuB,eAoBnC;AAAA,iBA+fe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
|