@prisma-next/adapter-sqlite 0.5.0-dev.3 → 0.5.0-dev.30

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.
Files changed (45) hide show
  1. package/README.md +2 -2
  2. package/dist/{adapter-BG7_o_3h.d.mts → adapter-CjuvmCVF.d.mts} +10 -2
  3. package/dist/adapter-CjuvmCVF.d.mts.map +1 -0
  4. package/dist/{adapter-lwcslPF8.mjs → adapter-DjLhS34S.mjs} +56 -50
  5. package/dist/adapter-DjLhS34S.mjs.map +1 -0
  6. package/dist/adapter.d.mts +2 -2
  7. package/dist/adapter.mjs +1 -2
  8. package/dist/codec-types.d.mts +2 -40
  9. package/dist/codec-types.mjs +1 -1
  10. package/dist/column-types.d.mts +1 -5
  11. package/dist/column-types.d.mts.map +1 -1
  12. package/dist/column-types.mjs +2 -6
  13. package/dist/column-types.mjs.map +1 -1
  14. package/dist/control.d.mts +35 -3
  15. package/dist/control.d.mts.map +1 -1
  16. package/dist/control.mjs +414 -8
  17. package/dist/control.mjs.map +1 -1
  18. package/dist/{descriptor-meta-Bg-c1LmL.mjs → descriptor-meta-DYT9Gt_F.mjs} +1 -1
  19. package/dist/{descriptor-meta-Bg-c1LmL.mjs.map → descriptor-meta-DYT9Gt_F.mjs.map} +1 -1
  20. package/dist/runtime.d.mts +3 -3
  21. package/dist/runtime.d.mts.map +1 -1
  22. package/dist/runtime.mjs +17 -4
  23. package/dist/runtime.mjs.map +1 -1
  24. package/dist/{types-gAqc4ucF.d.mts → types-BFRXGAgd.d.mts} +1 -1
  25. package/dist/{types-gAqc4ucF.d.mts.map → types-BFRXGAgd.d.mts.map} +1 -1
  26. package/dist/types.d.mts +1 -1
  27. package/package.json +19 -16
  28. package/src/core/adapter.ts +65 -29
  29. package/src/core/column-types.ts +1 -7
  30. package/src/core/control-adapter.ts +279 -15
  31. package/src/core/control-mutation-defaults.ts +352 -0
  32. package/src/core/runtime-adapter.ts +15 -2
  33. package/src/exports/codec-types.ts +8 -6
  34. package/src/exports/column-types.ts +0 -1
  35. package/src/exports/control.ts +45 -1
  36. package/dist/adapter-BG7_o_3h.d.mts.map +0 -1
  37. package/dist/adapter-lwcslPF8.mjs.map +0 -1
  38. package/dist/codec-ids-o_Z8i4nt.mjs +0 -15
  39. package/dist/codec-ids-o_Z8i4nt.mjs.map +0 -1
  40. package/dist/codec-types.d.mts.map +0 -1
  41. package/dist/codecs-Bhz0W5Xm.mjs +0 -87
  42. package/dist/codecs-Bhz0W5Xm.mjs.map +0 -1
  43. package/src/core/codec-ids.ts +0 -14
  44. package/src/core/codecs.ts +0 -108
  45. package/src/core/sql-utils.ts +0 -35
package/README.md CHANGED
@@ -118,7 +118,7 @@ flowchart TD
118
118
  - Used in `contract.d.ts` generation
119
119
 
120
120
  **Column Types Export (`column-types.ts`)**
121
- - Exports column descriptors for built-in types: `textColumn`, `integerColumn`, `realColumn`, `blobColumn`, `booleanColumn`, `datetimeColumn`, `jsonColumn`, `bigintColumn`
121
+ - Exports column descriptors for built-in types: `textColumn`, `integerColumn`, `realColumn`, `blobColumn`, `datetimeColumn`, `jsonColumn`, `bigintColumn`
122
122
  - Uses `as const` to preserve literal `codecId` types through the type system
123
123
 
124
124
  **Types Export (`types.ts`)**
@@ -188,7 +188,7 @@ DELETE FROM "user" WHERE "user"."id" = ? RETURNING "user"."id", "user"."email"
188
188
  ## Exports
189
189
 
190
190
  - `./codec-types`: SQLite codec types (`CodecTypes`, `JsonValue`, `dataTypes`)
191
- - `./column-types`: Column type descriptors (`textColumn`, `integerColumn`, `realColumn`, `blobColumn`, `booleanColumn`, `datetimeColumn`, `jsonColumn`, `bigintColumn`)
191
+ - `./column-types`: Column type descriptors (`textColumn`, `integerColumn`, `realColumn`, `blobColumn`, `datetimeColumn`, `jsonColumn`, `bigintColumn`)
192
192
  - `./types`: SQLite-specific types
193
193
  - `./control`: Control-plane entry point (stubbed for future migration support)
194
194
  - `./runtime`: Runtime-plane entry point (runtime adapter descriptor)
@@ -1,4 +1,4 @@
1
- import { n as SqliteContract, r as SqliteLoweredStatement, t as SqliteAdapterOptions } from "./types-gAqc4ucF.mjs";
1
+ import { n as SqliteContract, r as SqliteLoweredStatement, t as SqliteAdapterOptions } from "./types-BFRXGAgd.mjs";
2
2
  import { Adapter, AdapterProfile, AnyQueryAst, CodecParamsDescriptor, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
3
 
4
4
  //#region src/core/adapter.d.ts
@@ -11,7 +11,15 @@ declare class SqliteAdapterImpl implements Adapter<AnyQueryAst, SqliteContract,
11
11
  parameterizedCodecs(): ReadonlyArray<CodecParamsDescriptor>;
12
12
  lower(ast: AnyQueryAst, context: LowererContext<SqliteContract>): SqliteLoweredStatement;
13
13
  }
14
+ /**
15
+ * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
16
+ *
17
+ * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the
18
+ * control adapter (`SqliteControlAdapter.lower`) so both produce
19
+ * byte-identical SQL for the same AST and contract.
20
+ */
21
+
14
22
  declare function createSqliteAdapter(options?: SqliteAdapterOptions): Readonly<SqliteAdapterImpl>;
15
23
  //#endregion
16
24
  export { createSqliteAdapter as t };
17
- //# sourceMappingURL=adapter-BG7_o_3h.d.mts.map
25
+ //# sourceMappingURL=adapter-CjuvmCVF.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-CjuvmCVF.d.mts","names":[],"sources":["../src/core/adapter.ts"],"sourcesContent":[],"mappings":";;;;cA6CM,iBAAA,YAA6B,QAAQ,aAAa,gBAAgB;;EAAlE,SAAA,QAAA,EAAA,QAAkB;EAAmB,SAAA,OAAA,EAIvB,cAJuB,CAAA,QAAA,CAAA;EAAa,iBAAA,aAAA;EAAgB,WAAA,CAAA,OAAA,CAAA,EAahD,oBAbgD;EAIpD,mBAAA,CAAA,CAAA,EAiCK,aAjCL,CAiCmB,qBAjCnB,CAAA;EASI,KAAA,CAAA,GAAA,EA4BX,WA5BW,EAAA,OAAA,EA4BW,cA5BX,CA4B0B,cA5B1B,CAAA,CAAA,EA4B4C,sBA5B5C;;;;;;;;;;AA6esB,iBAA9B,mBAAA,CAA8B,OAAA,CAAA,EAAA,oBAAA,CAAA,EAAoB,QAApB,CAAoB,iBAApB,CAAA"}
@@ -1,26 +1,8 @@
1
- import { t as codecDefinitions } from "./codecs-Bhz0W5Xm.mjs";
2
1
  import { createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
2
+ import { parseContractMarkerRow } from "@prisma-next/sql-runtime";
3
+ import { codecDefinitions } from "@prisma-next/target-sqlite/codecs";
4
+ import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
3
5
 
4
- //#region src/core/sql-utils.ts
5
- var SqlEscapeError = class extends Error {
6
- constructor(message, value, kind) {
7
- super(message);
8
- this.value = value;
9
- this.kind = kind;
10
- this.name = "SqlEscapeError";
11
- }
12
- };
13
- function quoteIdentifier(identifier) {
14
- if (identifier.length === 0) throw new SqlEscapeError("Identifier cannot be empty", identifier, "identifier");
15
- if (identifier.includes("\0")) throw new SqlEscapeError("Identifier cannot contain null bytes", identifier.replace(/\0/g, "\\0"), "identifier");
16
- return `"${identifier.replace(/"/g, "\"\"")}"`;
17
- }
18
- function escapeLiteral(value) {
19
- if (value.includes("\0")) throw new SqlEscapeError("Literal value cannot contain null bytes", value.replace(/\0/g, "\\0"), "literal");
20
- return value.replace(/'/g, "''");
21
- }
22
-
23
- //#endregion
24
6
  //#region src/core/adapter.ts
25
7
  const defaultCapabilities = Object.freeze({ sql: {
26
8
  orderBy: true,
@@ -46,41 +28,59 @@ var SqliteAdapterImpl = class {
46
28
  capabilities: defaultCapabilities,
47
29
  codecs: () => this.codecRegistry,
48
30
  readMarkerStatement: () => ({
49
- sql: "select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta from prisma_contract_marker where id = ?",
31
+ sql: "select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from _prisma_marker where id = ?",
50
32
  params: [1]
51
- })
33
+ }),
34
+ parseMarkerRow: (row) => {
35
+ const raw = row;
36
+ const invariants = typeof raw["invariants"] === "string" ? JSON.parse(raw["invariants"]) : raw["invariants"];
37
+ return parseContractMarkerRow({
38
+ ...raw,
39
+ invariants
40
+ });
41
+ }
52
42
  });
53
43
  }
54
44
  parameterizedCodecs() {
55
45
  return [];
56
46
  }
57
47
  lower(ast, context) {
58
- const collectedParamRefs = ast.collectParamRefs();
59
- const params = [];
60
- for (const ref of collectedParamRefs) params.push(ref.value);
61
- let sql;
62
- const node = ast;
63
- switch (node.kind) {
64
- case "select":
65
- sql = renderSelect(node, context.contract);
66
- break;
67
- case "insert":
68
- sql = renderInsert(node);
69
- break;
70
- case "update":
71
- sql = renderUpdate(node, context.contract);
72
- break;
73
- case "delete":
74
- sql = renderDelete(node);
75
- break;
76
- default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
77
- }
78
- return Object.freeze({
79
- sql,
80
- params
81
- });
48
+ return renderLoweredSql(ast, context.contract);
82
49
  }
83
50
  };
51
+ /**
52
+ * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
53
+ *
54
+ * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the
55
+ * control adapter (`SqliteControlAdapter.lower`) so both produce
56
+ * byte-identical SQL for the same AST and contract.
57
+ */
58
+ function renderLoweredSql(ast, contract) {
59
+ const collectedParamRefs = ast.collectParamRefs();
60
+ const params = [];
61
+ for (const ref of collectedParamRefs) params.push(ref.value);
62
+ let sql;
63
+ const node = ast;
64
+ switch (node.kind) {
65
+ case "select":
66
+ sql = renderSelect(node, contract);
67
+ break;
68
+ case "insert":
69
+ sql = renderInsert(node);
70
+ break;
71
+ case "update":
72
+ sql = renderUpdate(node, contract);
73
+ break;
74
+ case "delete":
75
+ sql = renderDelete(node);
76
+ break;
77
+ default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
78
+ }
79
+ return Object.freeze({
80
+ sql,
81
+ params
82
+ });
83
+ }
84
84
  function renderSelect(ast, contract) {
85
85
  return [
86
86
  `SELECT ${ast.distinct ? "DISTINCT " : ""}${renderProjection(ast.projection, contract)}`,
@@ -321,12 +321,18 @@ function renderDelete(ast) {
321
321
  }
322
322
  function renderReturning(returning) {
323
323
  if (!returning?.length) return "";
324
- return ` RETURNING ${returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(", ")}`;
324
+ return ` RETURNING ${returning.map((item) => {
325
+ if (item.expr.kind === "column-ref") {
326
+ const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;
327
+ return item.expr.column === item.alias ? rendered : `${rendered} AS ${quoteIdentifier(item.alias)}`;
328
+ }
329
+ return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;
330
+ }).join(", ")}`;
325
331
  }
326
332
  function createSqliteAdapter(options) {
327
333
  return Object.freeze(new SqliteAdapterImpl(options));
328
334
  }
329
335
 
330
336
  //#endregion
331
- export { createSqliteAdapter as t };
332
- //# sourceMappingURL=adapter-lwcslPF8.mjs.map
337
+ export { renderLoweredSql as n, createSqliteAdapter as t };
338
+ //# sourceMappingURL=adapter-DjLhS34S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-DjLhS34S.mjs","names":["params: unknown[]","sql: string","right: string","insertClause: string","value: string"],"sources":["../src/core/adapter.ts"],"sourcesContent":["import {\n type Adapter,\n type AdapterProfile,\n type AggregateExpr,\n type AnyExpression,\n type AnyFromSource,\n type AnyQueryAst,\n type BinaryExpr,\n type CodecParamsDescriptor,\n type ColumnRef,\n createCodecRegistry,\n type DeleteAst,\n type InsertAst,\n type InsertValue,\n type JoinAst,\n type JoinOnExpr,\n type JsonArrayAggExpr,\n type JsonObjectExpr,\n type ListExpression,\n type LiteralExpr,\n type LowererContext,\n type NullCheckExpr,\n type OperationExpr,\n type OrderByItem,\n type ProjectionItem,\n type SelectAst,\n type SubqueryExpr,\n type UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { parseContractMarkerRow } from '@prisma-next/sql-runtime';\nimport { codecDefinitions } from '@prisma-next/target-sqlite/codecs';\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 private readonly codecRegistry = (() => {\n const registry = createCodecRegistry();\n for (const definition of Object.values(codecDefinitions)) {\n registry.register(definition.codec);\n }\n return registry;\n })();\n\n constructor(options?: SqliteAdapterOptions) {\n this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n codecs: () => this.codecRegistry,\n readMarkerStatement: () => ({\n sql: 'select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta, invariants from _prisma_marker where id = ?',\n params: [1],\n }),\n // SQLite stores arrays as JSON-encoded TEXT (no native array type),\n // so the driver returns `invariants` as a string. Decode before\n // delegating to the shared row schema, which expects `string[]`.\n parseMarkerRow: (row: unknown) => {\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 parseContractMarkerRow({ ...raw, invariants });\n },\n });\n }\n\n parameterizedCodecs(): ReadonlyArray<CodecParamsDescriptor> {\n return [];\n }\n\n lower(ast: AnyQueryAst, context: LowererContext<SqliteContract>): SqliteLoweredStatement {\n return renderLoweredSql(ast, context.contract);\n }\n}\n\n/**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the\n * control adapter (`SqliteControlAdapter.lower`) so both produce\n * byte-identical SQL for the same AST and contract.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: SqliteContract,\n): SqliteLoweredStatement {\n const collectedParamRefs = ast.collectParamRefs();\n const params: unknown[] = [];\n for (const ref of collectedParamRefs) {\n params.push(ref.value);\n }\n\n let sql: string;\n\n const node = ast;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract);\n break;\n case 'insert':\n sql = renderInsert(node);\n break;\n case 'update':\n sql = renderUpdate(node, contract);\n break;\n case 'delete':\n sql = renderDelete(node);\n break;\n default:\n throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);\n }\n\n return Object.freeze({ sql, params });\n}\n\nfunction renderSelect(ast: SelectAst, contract?: SqliteContract): string {\n const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';\n const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;\n const fromClause = `FROM ${renderSource(ast.from, contract)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`)\n .join(', ')}`\n : '';\n const limitClause = typeof ast.limit === 'number' ? `LIMIT ${ast.limit}` : '';\n const offsetClause = typeof ast.offset === 'number' ? `OFFSET ${ast.offset}` : '';\n\n return [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ')\n .trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract?: SqliteContract,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction renderSource(source: AnyFromSource, contract?: SqliteContract): string {\n const node = source;\n switch (node.kind) {\n case 'table-source': {\n const table = quoteIdentifier(node.name);\n if (!node.alias) {\n return table;\n }\n return `${table} AS ${quoteIdentifier(node.alias)}`;\n }\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;\n default:\n throw new Error(`Unsupported source node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderExpr(expr: AnyExpression, contract?: SqliteContract): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract);\n case 'subquery':\n return renderSubqueryExpr(node, contract);\n case 'aggregate':\n return renderAggregateExpr(node, contract);\n case 'json-object':\n return renderJsonObjectExpr(node, contract);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract);\n case 'binary':\n return renderBinary(node, contract);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;\n case 'exists': {\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract)})`;\n case 'param-ref':\n return '?';\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node);\n default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\n// `excluded` is a pseudo-table in ON CONFLICT DO UPDATE that references the\n// row proposed for insertion. It is not quoted because it's a keyword.\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null || expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: SqliteContract): string {\n const self = renderExpr(expr.self, contract);\n const args = expr.args.map((arg) => renderExpr(arg, contract));\n\n let result = expr.lowering.template;\n result = result.replace(/\\{\\{self\\}\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\{\\\\{arg${i}\\\\}\\\\}`, 'g'), args[i] ?? '');\n }\n\n return result;\n}\n\nfunction renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): string {\n if (expr.query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n return `(${renderSelect(expr.query, contract)})`;\n}\n\nfunction renderNullCheck(expr: NullCheckExpr, contract?: SqliteContract): string {\n const rendered = renderExpr(expr.expr, contract);\n const renderedExpr =\n expr.expr.kind === 'operation' || expr.expr.kind === 'subquery' ? `(${rendered})` : rendered;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: SqliteContract): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n right = '?';\n break;\n default:\n right = renderExpr(rightNode, contract);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(expr: ListExpression): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref') return '?';\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderAggregateExpr(expr: AggregateExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract)})`;\n}\n\nfunction renderJsonObjectExpr(expr: JsonObjectExpr, contract?: SqliteContract): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract)];\n })\n .join(', ');\n return `json_object(${args})`;\n}\n\nfunction renderOrderByItems(items: ReadonlyArray<OrderByItem>, contract?: SqliteContract): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContract): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const aggregated = `json_group_array(${renderExpr(expr.expr, contract)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, '[]')`;\n }\n return aggregated;\n}\n\nfunction renderJoin(join: JoinAst, contract?: SqliteContract): string {\n const joinType = join.joinType.toUpperCase();\n const source = renderSource(join.source, contract);\n const onClause = renderJoinOn(join.on, contract);\n return `${joinType} JOIN ${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract?: SqliteContract): string {\n if (on.kind === 'eq-col-join-on') {\n return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;\n }\n return renderExpr(on, contract);\n}\n\nfunction renderInsertValue(value: InsertValue): string {\n switch (value.kind) {\n case 'param-ref':\n return '?';\n case 'column-ref':\n return renderColumn(value);\n case 'default-value':\n throw new Error('SQLite does not support DEFAULT as a value in INSERT ... VALUES');\n default:\n throw new Error(`Unsupported value node in INSERT: ${(value as { kind: string }).kind}`);\n }\n}\n\nfunction renderInsert(ast: InsertAst): string {\n const table = quoteIdentifier(ast.table.name);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n\n const firstRow = rows[0] as Readonly<Record<string, InsertValue>>;\n const columnOrder = Object.keys(firstRow);\n\n let insertClause: string;\n if (columnOrder.length === 0) {\n insertClause = `INSERT INTO ${table} DEFAULT VALUES`;\n } else {\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => {\n const value = row[column];\n if (value === undefined) {\n throw new Error(`Missing value for column \"${column}\" in INSERT row`);\n }\n return renderInsertValue(value);\n });\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n }\n\n let onConflictClause = '';\n if (ast.onConflict) {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n break;\n case 'do-update-set': {\n const updates = Object.entries(action.set).map(([colName, value]) => {\n const target = quoteIdentifier(colName);\n if (value.kind === 'param-ref') {\n return `${target} = ?`;\n }\n return `${target} = ${renderColumn(value)}`;\n });\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n break;\n }\n default:\n throw new Error(`Unsupported onConflict action: ${(action as { kind: string }).kind}`);\n }\n }\n\n const returningClause = renderReturning(ast.returning);\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: SqliteContract): string {\n const table = quoteIdentifier(ast.table.name);\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n const column = quoteIdentifier(col);\n let value: string;\n switch (val.kind) {\n case 'param-ref':\n value = '?';\n break;\n case 'column-ref':\n value = renderColumn(val);\n break;\n default:\n throw new Error(`Unsupported value node in UPDATE: ${(val as { kind: string }).kind}`);\n }\n return `${column} = ${value}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where, contract)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst): string {\n const table = quoteIdentifier(ast.table.name);\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nfunction renderReturning(returning: ReadonlyArray<ProjectionItem> | undefined): string {\n if (!returning?.length) {\n return '';\n }\n return ` RETURNING ${returning\n .map((item) => {\n if (item.expr.kind === 'column-ref') {\n const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;\n return item.expr.column === item.alias\n ? rendered\n : `${rendered} AS ${quoteIdentifier(item.alias)}`;\n }\n return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ')}`;\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import "./types-gAqc4ucF.mjs";
2
- import { t as createSqliteAdapter } from "./adapter-BG7_o_3h.mjs";
1
+ import "./types-BFRXGAgd.mjs";
2
+ import { t as createSqliteAdapter } from "./adapter-CjuvmCVF.mjs";
3
3
  export { createSqliteAdapter };
package/dist/adapter.mjs CHANGED
@@ -1,4 +1,3 @@
1
- import "./codecs-Bhz0W5Xm.mjs";
2
- import { t as createSqliteAdapter } from "./adapter-lwcslPF8.mjs";
1
+ import { t as createSqliteAdapter } from "./adapter-DjLhS34S.mjs";
3
2
 
4
3
  export { createSqliteAdapter };
@@ -1,40 +1,2 @@
1
- import * as _prisma_next_sql_relational_core_ast0 from "@prisma-next/sql-relational-core/ast";
2
-
3
- //#region src/core/codecs.d.ts
4
- type JsonValue = string | number | boolean | null | {
5
- readonly [key: string]: JsonValue;
6
- } | readonly JsonValue[];
7
- declare const codecs: _prisma_next_sql_relational_core_ast0.CodecDefBuilder<{
8
- char: _prisma_next_sql_relational_core_ast0.Codec<"sql/char@1", readonly ["equality", "order", "textual"], string, string, Record<string, unknown>, unknown>;
9
- varchar: _prisma_next_sql_relational_core_ast0.Codec<"sql/varchar@1", readonly ["equality", "order", "textual"], string, string, Record<string, unknown>, unknown>;
10
- int: _prisma_next_sql_relational_core_ast0.Codec<"sql/int@1", readonly ["equality", "order", "numeric"], number, number, Record<string, unknown>, unknown>;
11
- float: _prisma_next_sql_relational_core_ast0.Codec<"sql/float@1", readonly ["equality", "order", "numeric"], number, number, Record<string, unknown>, unknown>;
12
- text: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/text@1", readonly ["equality", "order", "textual"], string, string, Record<string, unknown>, unknown>;
13
- integer: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/integer@1", readonly ["equality", "order", "numeric"], number, number, Record<string, unknown>, unknown>;
14
- real: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/real@1", readonly ["equality", "order", "numeric"], number, number, Record<string, unknown>, unknown>;
15
- blob: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/blob@1", readonly ["equality"], Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, Record<string, unknown>, unknown>;
16
- boolean: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/boolean@1", readonly ["equality", "boolean"], number, boolean, Record<string, unknown>, unknown>;
17
- datetime: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/datetime@1", readonly ["equality", "order"], string, Date, Record<string, unknown>, unknown>;
18
- json: _prisma_next_sql_relational_core_ast0.Codec<"sqlite/json@1", readonly ["equality"], string, JsonValue, Record<string, unknown>, unknown>;
19
- } & Record<"bigint", _prisma_next_sql_relational_core_ast0.Codec<"sqlite/bigint@1", readonly ["equality", "order", "numeric"], number | bigint, bigint, Record<string, unknown>, unknown>>>;
20
- declare const dataTypes: {
21
- readonly char: "sql/char@1";
22
- readonly varchar: "sql/varchar@1";
23
- readonly int: "sql/int@1";
24
- readonly float: "sql/float@1";
25
- readonly text: "sqlite/text@1";
26
- readonly integer: "sqlite/integer@1";
27
- readonly real: "sqlite/real@1";
28
- readonly blob: "sqlite/blob@1";
29
- readonly boolean: "sqlite/boolean@1";
30
- readonly datetime: "sqlite/datetime@1";
31
- readonly json: "sqlite/json@1";
32
- readonly bigint: "sqlite/bigint@1";
33
- };
34
- type CodecTypes$1 = typeof codecs.CodecTypes;
35
- //#endregion
36
- //#region src/exports/codec-types.d.ts
37
- type CodecTypes = CodecTypes$1;
38
- //#endregion
39
- export { CodecTypes, type JsonValue, dataTypes };
40
- //# sourceMappingURL=codec-types.d.mts.map
1
+ import { CodecTypes, JsonValue, dataTypes } from "@prisma-next/target-sqlite/codec-types";
2
+ export { type CodecTypes, type JsonValue, dataTypes };
@@ -1,3 +1,3 @@
1
- import { n as dataTypes } from "./codecs-Bhz0W5Xm.mjs";
1
+ import { dataTypes } from "@prisma-next/target-sqlite/codec-types";
2
2
 
3
3
  export { dataTypes };
@@ -15,10 +15,6 @@ declare const blobColumn: {
15
15
  readonly codecId: "sqlite/blob@1";
16
16
  readonly nativeType: "blob";
17
17
  };
18
- declare const booleanColumn: {
19
- readonly codecId: "sqlite/boolean@1";
20
- readonly nativeType: "integer";
21
- };
22
18
  declare const datetimeColumn: {
23
19
  readonly codecId: "sqlite/datetime@1";
24
20
  readonly nativeType: "text";
@@ -32,5 +28,5 @@ declare const bigintColumn: {
32
28
  readonly nativeType: "integer";
33
29
  };
34
30
  //#endregion
35
- export { bigintColumn, blobColumn, booleanColumn, datetimeColumn, integerColumn, jsonColumn, realColumn, textColumn };
31
+ export { bigintColumn, blobColumn, datetimeColumn, integerColumn, jsonColumn, realColumn, textColumn };
36
32
  //# sourceMappingURL=column-types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/core/column-types.ts"],"sourcesContent":[],"mappings":";cAWa;EAAA,SAAA,OAGH,EAAA,eAAA;EAEG,SAAA,UAGH,EAAA,MAAA;AAEV,CAAA;AAKa,cAVA,aAaH,EAAA;EAEG,SAAA,OAGH,EAAA,kBAAA;EAEG,SAAA,UAGH,EAAA,SAAA;AAEV,CAAA;AAKa,cAzBA,UA4BH,EAAA;;;;cAvBG;;;;cAKA;;;;cAKA;;;;cAKA;;;;cAKA"}
1
+ {"version":3,"file":"column-types.d.mts","names":[],"sources":["../src/core/column-types.ts"],"sourcesContent":[],"mappings":";cAUa;EAAA,SAAA,OAGH,EAAA,eAAA;EAEG,SAAA,UAGH,EAAA,MAAA;AAEV,CAAA;AAKa,cAVA,aAaH,EAAA;EAEG,SAAA,OAAA,EAGH,kBAAA;EAEG,SAAA,UAGH,EAAA,SAAA;AAEV,CAAA;cApBa;;;;cAKA;;;;cAKA;;;;cAKA;;;;cAKA"}
@@ -1,4 +1,4 @@
1
- import { a as SQLITE_INTEGER_CODEC_ID, c as SQLITE_TEXT_CODEC_ID, i as SQLITE_DATETIME_CODEC_ID, n as SQLITE_BLOB_CODEC_ID, o as SQLITE_JSON_CODEC_ID, r as SQLITE_BOOLEAN_CODEC_ID, s as SQLITE_REAL_CODEC_ID, t as SQLITE_BIGINT_CODEC_ID } from "./codec-ids-o_Z8i4nt.mjs";
1
+ import { SQLITE_BIGINT_CODEC_ID, SQLITE_BLOB_CODEC_ID, SQLITE_DATETIME_CODEC_ID, SQLITE_INTEGER_CODEC_ID, SQLITE_JSON_CODEC_ID, SQLITE_REAL_CODEC_ID, SQLITE_TEXT_CODEC_ID } from "@prisma-next/target-sqlite/codec-ids";
2
2
 
3
3
  //#region src/core/column-types.ts
4
4
  const textColumn = {
@@ -17,10 +17,6 @@ const blobColumn = {
17
17
  codecId: SQLITE_BLOB_CODEC_ID,
18
18
  nativeType: "blob"
19
19
  };
20
- const booleanColumn = {
21
- codecId: SQLITE_BOOLEAN_CODEC_ID,
22
- nativeType: "integer"
23
- };
24
20
  const datetimeColumn = {
25
21
  codecId: SQLITE_DATETIME_CODEC_ID,
26
22
  nativeType: "text"
@@ -35,5 +31,5 @@ const bigintColumn = {
35
31
  };
36
32
 
37
33
  //#endregion
38
- export { bigintColumn, blobColumn, booleanColumn, datetimeColumn, integerColumn, jsonColumn, realColumn, textColumn };
34
+ export { bigintColumn, blobColumn, datetimeColumn, integerColumn, jsonColumn, realColumn, textColumn };
39
35
  //# sourceMappingURL=column-types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"column-types.mjs","names":[],"sources":["../src/core/column-types.ts"],"sourcesContent":["import {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_BOOLEAN_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from './codec-ids';\n\nexport const textColumn = {\n codecId: SQLITE_TEXT_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const integerColumn = {\n codecId: SQLITE_INTEGER_CODEC_ID,\n nativeType: 'integer',\n} as const;\n\nexport const realColumn = {\n codecId: SQLITE_REAL_CODEC_ID,\n nativeType: 'real',\n} as const;\n\nexport const blobColumn = {\n codecId: SQLITE_BLOB_CODEC_ID,\n nativeType: 'blob',\n} as const;\n\nexport const booleanColumn = {\n codecId: SQLITE_BOOLEAN_CODEC_ID,\n nativeType: 'integer',\n} as const;\n\nexport const datetimeColumn = {\n codecId: SQLITE_DATETIME_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const jsonColumn = {\n codecId: SQLITE_JSON_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const bigintColumn = {\n codecId: SQLITE_BIGINT_CODEC_ID,\n nativeType: 'integer',\n} as const;\n"],"mappings":";;;AAWA,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,gBAAgB;CAC3B,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,gBAAgB;CAC3B,SAAS;CACT,YAAY;CACb;AAED,MAAa,iBAAiB;CAC5B,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,eAAe;CAC1B,SAAS;CACT,YAAY;CACb"}
1
+ {"version":3,"file":"column-types.mjs","names":[],"sources":["../src/core/column-types.ts"],"sourcesContent":["import {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\nexport const textColumn = {\n codecId: SQLITE_TEXT_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const integerColumn = {\n codecId: SQLITE_INTEGER_CODEC_ID,\n nativeType: 'integer',\n} as const;\n\nexport const realColumn = {\n codecId: SQLITE_REAL_CODEC_ID,\n nativeType: 'real',\n} as const;\n\nexport const blobColumn = {\n codecId: SQLITE_BLOB_CODEC_ID,\n nativeType: 'blob',\n} as const;\n\nexport const datetimeColumn = {\n codecId: SQLITE_DATETIME_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const jsonColumn = {\n codecId: SQLITE_JSON_CODEC_ID,\n nativeType: 'text',\n} as const;\n\nexport const bigintColumn = {\n codecId: SQLITE_BIGINT_CODEC_ID,\n nativeType: 'integer',\n} as const;\n"],"mappings":";;;AAUA,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,gBAAgB;CAC3B,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,iBAAiB;CAC5B,SAAS;CACT,YAAY;CACb;AAED,MAAa,aAAa;CACxB,SAAS;CACT,YAAY;CACb;AAED,MAAa,eAAe;CAC1B,SAAS;CACT,YAAY;CACb"}
@@ -1,7 +1,39 @@
1
- import { ControlAdapterDescriptor, ControlAdapterInstance } from "@prisma-next/framework-components/control";
1
+ import { AnyQueryAst, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
2
+ import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
3
+ import { parseSqliteDefault, parseSqliteDefault as parseSqliteDefault$1 } from "@prisma-next/target-sqlite/default-normalizer";
4
+ import { normalizeSqliteNativeType, normalizeSqliteNativeType as normalizeSqliteNativeType$1 } from "@prisma-next/target-sqlite/native-type-normalizer";
5
+ import { ContractMarkerRecord } from "@prisma-next/contract/types";
6
+ import { SqlControlAdapterDescriptor } from "@prisma-next/family-sql/control";
7
+ import { SqlControlAdapter } from "@prisma-next/family-sql/control-adapter";
8
+ import { ControlDriverInstance } from "@prisma-next/framework-components/control";
9
+ import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
2
10
 
3
11
  //#region src/core/control-adapter.d.ts
4
- declare const sqliteControlAdapterDescriptor: ControlAdapterDescriptor<'sql', 'sqlite', ControlAdapterInstance<'sql', 'sqlite'>>;
12
+ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
13
+ readonly familyId: "sql";
14
+ readonly targetId: "sqlite";
15
+ readonly normalizeDefault: typeof parseSqliteDefault$1;
16
+ readonly normalizeNativeType: typeof normalizeSqliteNativeType$1;
17
+ /**
18
+ * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.
19
+ *
20
+ * Delegates to the shared `renderLoweredSql` renderer so the control adapter
21
+ * emits byte-identical SQL to `SqliteAdapterImpl.lower()` for the same AST
22
+ * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)
23
+ * without instantiating the runtime adapter.
24
+ */
25
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;
26
+ /**
27
+ * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`
28
+ * first so a fresh database (no marker table) returns `null` instead of a
29
+ * "no such table" error.
30
+ */
31
+ readMarker(driver: ControlDriverInstance<'sql', 'sqlite'>): Promise<ContractMarkerRecord | null>;
32
+ introspect(driver: ControlDriverInstance<'sql', 'sqlite'>, _contract?: unknown): Promise<SqlSchemaIR>;
33
+ }
5
34
  //#endregion
6
- export { sqliteControlAdapterDescriptor as default };
35
+ //#region src/exports/control.d.ts
36
+ declare const sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'>;
37
+ //#endregion
38
+ export { SqlEscapeError, SqliteControlAdapter, sqliteAdapterDescriptor as default, escapeLiteral, normalizeSqliteNativeType, parseSqliteDefault, quoteIdentifier };
7
39
  //# sourceMappingURL=control.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts"],"sourcesContent":[],"mappings":";;;cAMM,gCAAgC,0CAGpC"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;cAmEa,oBAAA,YAAgC;;;oCAIlB;EAJd,SAAA,mBAAqB,EAAA,OAKJ,2BALI;EAIP;;;;;;;;EAkEf,KAAA,CAAA,GAAA,EAvDC,WAuDD,EAAA,OAAA,EAvDuB,cAuDvB,CAAA,OAAA,CAAA,CAAA,EAvDiD,gBAuDjD;EAEC;;;;;qBA/CD,yCACP,QAAQ;qBA4CD,8DAEP,QAAQ;AC3IsE;;;cAU7E,yBAAyB"}