@prisma-next/adapter-sqlite 0.13.0-dev.34 → 0.13.0-dev.36
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-CPydDe3Y.d.mts.map +1 -1
- package/dist/{adapter-C1w7dvmO.mjs → adapter-eo1yL7gA.mjs} +7 -2
- package/dist/{adapter-C1w7dvmO.mjs.map → adapter-eo1yL7gA.mjs.map} +1 -1
- package/dist/adapter.mjs +1 -1
- package/dist/control.mjs +2 -2
- package/dist/descriptor-meta-pA9TOBa7.mjs +29 -0
- package/dist/descriptor-meta-pA9TOBa7.mjs.map +1 -0
- package/dist/runtime.mjs +2 -2
- package/package.json +22 -22
- package/src/core/adapter.ts +9 -2
- package/src/core/descriptor-meta.ts +12 -0
- package/dist/descriptor-meta-Du5OgSxS.mjs +0 -26
- package/dist/descriptor-meta-Du5OgSxS.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-CPydDe3Y.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAqDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EA0BtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,EAAS,cAAA,CAAe,cAAA,IACvB,sBAAA;AAAA;;cAWQ,qBAAA,EAAuB,eAoBnC;AAAA,
|
|
1
|
+
{"version":3,"file":"adapter-CPydDe3Y.d.mts","names":[],"sources":["../src/core/adapter.ts"],"mappings":";;;;;;cAqDM,iBAAA,YAA6B,OAAA,CAAQ,WAAA,EAAa,cAAA,EAAgB,sBAAA;EAAA,SAC7D,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,OAAA,EAAS,cAAA;cAEN,OAAA,GAAU,oBAAA;EA0BtB,KAAA,CACE,GAAA,EAAK,WAAA,GAAc,aAAA,EACnB,OAAA,EAAS,cAAA,CAAe,cAAA,IACvB,sBAAA;AAAA;;cAWQ,qBAAA,EAAuB,eAoBnC;AAAA,iBAghBe,mBAAA,CAAoB,OAAA,GAAU,oBAAA,GAAoB,QAAA,CAAA,iBAAA"}
|
|
@@ -573,7 +573,7 @@ function renderLimitOffset(keyword, value, contract) {
|
|
|
573
573
|
function renderSelect(ast, contract) {
|
|
574
574
|
return [
|
|
575
575
|
`SELECT ${ast.distinct ? "DISTINCT " : ""}${renderProjection(ast.projection, contract)}`,
|
|
576
|
-
`FROM ${renderSource(ast.from, contract)}
|
|
576
|
+
ast.from !== void 0 ? `FROM ${renderSource(ast.from, contract)}` : "",
|
|
577
577
|
ast.joins?.length ? ast.joins.map((join) => renderJoin(join, contract)).join(" ") : "",
|
|
578
578
|
ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : "",
|
|
579
579
|
ast.groupBy?.length ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(", ")}` : "",
|
|
@@ -608,6 +608,11 @@ function renderSource(source, contract) {
|
|
|
608
608
|
switch (node.kind) {
|
|
609
609
|
case "table-source": return renderTableSource(node, contract);
|
|
610
610
|
case "derived-table-source": return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
|
|
611
|
+
case "function-source": {
|
|
612
|
+
const args = node.args.map((arg) => renderExpr(arg, contract)).join(", ");
|
|
613
|
+
const call = `${node.fn}(${args})`;
|
|
614
|
+
return node.alias !== void 0 ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
|
|
615
|
+
}
|
|
611
616
|
default: throw new Error(`Unsupported source node kind: ${node.kind}`);
|
|
612
617
|
}
|
|
613
618
|
}
|
|
@@ -836,4 +841,4 @@ function createSqliteAdapter(options) {
|
|
|
836
841
|
//#endregion
|
|
837
842
|
export { createSqliteBuiltinCodecLookup as i, sqliteRawCodecInferer as n, SqliteControlAdapter as r, createSqliteAdapter as t };
|
|
838
843
|
|
|
839
|
-
//# sourceMappingURL=adapter-
|
|
844
|
+
//# sourceMappingURL=adapter-eo1yL7gA.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-C1w7dvmO.mjs","names":[],"sources":["../src/core/codec-lookup.ts","../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/control-codecs.ts","../src/core/ledger-decode.ts","../src/core/marker-ledger.ts","../src/core/control-adapter.ts","../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { extractCodecLookup } from '@prisma-next/framework-components/control';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\n/**\n * Build a {@link CodecRegistry} populated with the SQLite-builtin codec definitions only.\n *\n * Used by `createSqliteAdapter()` and `new SqliteControlAdapter()` when called without a\n * stack-derived registry (e.g. from tests, or one-off scripts that don't compose a full stack).\n *\n * Extension codecs are intentionally NOT included: a bare adapter cannot see extensions.\n * Stack-composed paths supply the broader, extension-inclusive registry at construction time.\n */\nexport function createSqliteBuiltinCodecLookup(): CodecRegistry {\n return extractCodecLookup([\n {\n id: 'sqlite-builtin-codecs',\n types: { codecTypes: { codecDescriptors: Array.from(sqliteCodecRegistry.values()) } },\n },\n ]);\n}\n","import \"../constants-YnG8_EGO.mjs\";\n//#region src/ledger-origin.ts\nfunction ledgerOriginFromStored(originCoreHash) {\n\tif (originCoreHash === null || originCoreHash === \"\" || originCoreHash === \"sha256:empty\") return null;\n\treturn originCoreHash;\n}\n//#endregion\nexport { ledgerOriginFromStored };\n\n//# sourceMappingURL=ledger-origin.mjs.map","import type {\n AnyQueryAst,\n ContractCodecRegistry,\n LoweredStatement,\n} from '@prisma-next/sql-relational-core/ast';\nimport {\n createAstCodecRegistry,\n deriveParamMetadata,\n encodeParamsWithMetadata,\n} from '@prisma-next/sql-runtime';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\nexport const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);\n\nexport async function encodeControlQueryParams(\n lowered: LoweredStatement,\n ast: AnyQueryAst,\n codecs: ContractCodecRegistry = CONTROL_CODECS,\n): Promise<readonly unknown[]> {\n const values = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error(`control query lowered to a bind slot '${slot.name}', which is unsupported`);\n });\n return encodeParamsWithMetadata(values, deriveParamMetadata(ast), {}, codecs);\n}\n","const DESIGNATOR_LESS_UTC_DATETIME = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$/;\n\nexport function coerceLedgerAppliedAt(value: Date | string): Date {\n if (value instanceof Date) {\n return value;\n }\n if (DESIGNATOR_LESS_UTC_DATETIME.test(value)) {\n return new Date(`${value.replace(' ', 'T')}Z`);\n }\n return new Date(value);\n}\n\nexport function operationCountFromStored(operations: unknown): number {\n if (Array.isArray(operations)) {\n return operations.length;\n }\n if (typeof operations === 'string') {\n try {\n const parsed: unknown = JSON.parse(operations);\n return Array.isArray(parsed) ? parsed.length : 0;\n } catch {\n return 0;\n }\n }\n return 0;\n}\n","import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport {\n type AnyQueryAst,\n type LoweredStatement,\n RawExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';\nimport {\n datetime,\n integer,\n jsonText,\n sqliteTable,\n text,\n} from '@prisma-next/target-sqlite/contract-free';\nimport { encodeControlQueryParams } from './control-codecs';\n\nexport const marker = sqliteTable('_prisma_marker', {\n space: text(),\n core_hash: text(),\n profile_hash: text(),\n contract_json: jsonText({ nullable: true }),\n canonical_version: integer({ nullable: true }),\n updated_at: datetime(),\n app_tag: text({ nullable: true }),\n meta: jsonText({ nullable: true }),\n invariants: jsonText(),\n});\n\n/**\n * Writeable subset of `_prisma_ledger`. Omits the DB-generated `id`\n * (`INTEGER PRIMARY KEY AUTOINCREMENT`) and `created_at` (default\n * `strftime(...)`).\n */\nexport const ledger = sqliteTable('_prisma_ledger', {\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n});\n\n/**\n * Read-side handle covering every column of `_prisma_ledger`, including\n * the DB-generated `id` (for ORDER BY) and `created_at`.\n */\nexport const ledgerReadShape = sqliteTable('_prisma_ledger', {\n id: integer(),\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n created_at: text(),\n});\n\nexport const sqliteCatalog = sqliteTable('sqlite_master', { type: text(), name: text() });\n\nexport const NOW = new RawExpr({\n parts: [\"datetime('now')\"],\n returns: { codecId: SQLITE_DATETIME_CODEC_ID, nullable: false },\n});\n\ntype Lower = (query: AnyQueryAst) => LoweredStatement;\n\ntype MarkerDriver = {\n query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<{ readonly rows: ReadonlyArray<Row> }>;\n};\n\nexport function mergeInvariants(\n current: readonly string[],\n incoming: readonly string[],\n): readonly string[] {\n return [...new Set([...current, ...incoming])].sort();\n}\n\nexport async function execute(\n lower: Lower,\n driver: MarkerDriver,\n query: AnyQueryAst,\n): Promise<readonly Record<string, unknown>[]> {\n const lowered = lower(query);\n const encoded = await encodeControlQueryParams(lowered, query);\n const result = await driver.query(lowered.sql, encoded);\n return result.rows;\n}\n\nexport function decodeSqliteMarkerRow(row: unknown): unknown {\n if (typeof row !== 'object' || row === null || !('invariants' in row)) {\n return row;\n }\n const record = row as { invariants: unknown };\n if (typeof record.invariants !== 'string') return row;\n let parsed: unknown;\n try {\n parsed = JSON.parse(record.invariants);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid contract marker row: invariants is not valid JSON: ${detail}`);\n }\n return { ...record, invariants: parsed };\n}\n\nexport type SqliteMarkerWriteDriver = SqlControlDriverInstance<'sqlite'>;\n","import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { parseContractMarkerRow } from '@prisma-next/family-sql/verify';\nimport type { CodecLookup, CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport { REFERENTIAL_ACTION_SQL } from '@prisma-next/sql-contract/referential-action-sql';\nimport type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n CodecRef,\n ContractCodecRegistry,\n DdlColumn,\n DdlNode,\n DdlTableConstraint,\n FunctionColumnDefault,\n LiteralColumnDefault,\n LoweredStatement,\n LowererContext,\n MarkerReadResult,\n SqlExecuteRequest,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type {\n PrimaryKey,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlReferentialAction,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport {\n buildControlTableBootstrapQueries,\n buildSignMarkerBootstrapQueries,\n} from '@prisma-next/target-sqlite/contract-free';\nimport type { SqliteCreateTable, SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nimport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { encodeControlQueryParams } from './control-codecs';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport {\n decodeSqliteMarkerRow,\n execute,\n ledger,\n ledgerReadShape,\n marker,\n mergeInvariants,\n NOW,\n sqliteCatalog,\n} from './marker-ledger';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\ntype SqliteLedgerRow = {\n readonly space: string;\n readonly migration_name: string;\n readonly migration_hash: string;\n readonly origin_core_hash: string | null;\n readonly destination_core_hash: string;\n readonly operations: unknown;\n readonly created_at: Date | string;\n};\n\n// PRAGMA result row types\ntype PragmaTableInfoRow = {\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n};\n\ntype PragmaForeignKeyRow = {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string;\n on_delete: string;\n};\n\ntype PragmaIndexListRow = {\n seq: number;\n name: string;\n unique: number;\n origin: string;\n partial: number;\n};\n\ntype PragmaIndexInfoRow = {\n seqno: number;\n cid: number;\n name: string;\n};\n\ntype FkAccumulator = {\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n onDelete: string;\n onUpdate: string;\n};\n\nexport class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n private readonly codecRegistry: CodecRegistry;\n\n constructor(codecRegistry: CodecRegistry) {\n this.codecRegistry = codecRegistry;\n }\n\n readonly normalizeDefault = parseSqliteDefault;\n readonly normalizeNativeType = normalizeSqliteNativeType;\n\n bootstrapControlTableQueries(): readonly DdlNode[] {\n return buildControlTableBootstrapQueries();\n }\n\n bootstrapSignMarkerQueries(): readonly DdlNode[] {\n return buildSignMarkerBootstrapQueries();\n }\n\n /**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Delegates to the shared `renderLoweredSql` renderer so the control adapter\n * emits byte-identical SQL to `SqliteAdapterImpl.lower()` for the same AST\n * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)\n * without instantiating the runtime adapter.\n */\n lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() cannot lower DDL: DDL default literals require inline codec encoding, which is async. Use lowerToExecuteRequest().',\n );\n }\n return renderLoweredSql(\n ast,\n blindCast<SqliteContract, 'caller must supply a matching SqliteContract'>(context.contract),\n );\n }\n\n /**\n * Lower an AST all the way to a driver-ready statement. For DDL nodes,\n * literal column defaults are formatted as inline SQL with SQLite-specific\n * literal syntax (no cast suffix, boolean as 0/1, blob via X'hex'). For\n * query ASTs, params are kept as `?` placeholders; wire values go in\n * `params`. Does NOT call `this.lower()` — independent implementation.\n */\n async lowerToExecuteRequest(\n ast: AnyQueryAst | SqliteDdlNode,\n context?: LowererContext<unknown>,\n ): Promise<SqlExecuteRequest> {\n if (isDdlNode(ast)) {\n return sqliteRenderDdlExecuteRequest(\n blindCast<SqliteDdlNode, 'isDdlNode guard'>(ast),\n this.codecRegistry,\n );\n }\n const contract = blindCast<SqliteContract, 'Caller must supply matching contract'>(\n context?.contract,\n );\n const lowered = renderLoweredSql(ast, contract);\n const codecRegistry = blindCast<\n ContractCodecRegistry,\n 'framework CodecRegistry: its descriptors materialise SQL codecs; the framework Codec type erases to BaseCodec at this boundary'\n >(this.codecRegistry);\n const params = await encodeControlQueryParams(lowered, ast, codecRegistry);\n return { sql: lowered.sql, params };\n }\n\n /**\n * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`\n * first so a fresh database (no marker table) returns `null` instead of a\n * \"no such table\" error.\n */\n async readMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const result = await this.readMarkerDiscriminated(driver, space);\n return result.kind === 'present' ? result.record : null;\n }\n\n async readMarkerDiscriminated(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<MarkerReadResult> {\n const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readMarkerResult(driver, space), markerContext);\n }\n\n /**\n * Reads every row from `_prisma_marker` and returns them keyed by\n * `space`. Mirrors the existence probe in {@link readMarker}: a\n * fresh database without the marker table returns an empty map.\n */\n async readAllMarkers(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readAllMarkersResult(driver), markerContext);\n }\n\n private async readAllMarkersResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return new Map();\n }\n\n const fetch = marker\n .select(\n marker.space,\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .build();\n const rawRows = await execute(lower, driver, fetch);\n const rows = blindCast<\n ReadonlyArray<{ space: string } & Record<string, unknown>>,\n 'Driver returns rows shaped by SELECT'\n >(rawRows);\n\n const out = new Map<string, ContractMarkerRecord>();\n for (const row of rows) {\n out.set(\n row.space,\n parseMarkerRowSafely(row, (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)), {\n space: row.space,\n markerLocation: SQLITE_MARKER_TABLE,\n }),\n );\n }\n return out;\n }\n\n /**\n * Reads per-migration ledger rows from `_prisma_ledger` in apply order.\n * Probes `sqlite_master` first so a fresh database without the ledger\n * table returns `[]` instead of raising \"no such table\".\n */\n async readLedger(\n driver: SqlControlDriverInstance<'sqlite'>,\n space?: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space: space ?? '*', markerLocation: SQLITE_LEDGER_TABLE };\n return withMarkerReadErrorHandling(() => this.readLedgerResult(driver, space), ledgerContext);\n }\n\n private async readLedgerResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string | undefined,\n ): Promise<readonly LedgerEntryRecord[]> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_ledger')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return [];\n }\n\n const base = ledgerReadShape.select(\n ledgerReadShape.space,\n ledgerReadShape.migration_name,\n ledgerReadShape.migration_hash,\n ledgerReadShape.origin_core_hash,\n ledgerReadShape.destination_core_hash,\n ledgerReadShape.operations,\n ledgerReadShape.created_at,\n );\n const filtered = space !== undefined ? base.where(ledgerReadShape.space.eq(space)) : base;\n const rawRows = await execute(lower, driver, filtered.orderBy(ledgerReadShape.id).build());\n const rows = blindCast<readonly SqliteLedgerRow[], 'Driver returns rows shaped by SELECT'>(\n rawRows,\n );\n\n return rows.map((row) => ({\n space: row.space,\n migrationName: row.migration_name,\n migrationHash: row.migration_hash,\n from: ledgerOriginFromStored(row.origin_core_hash),\n to: row.destination_core_hash,\n appliedAt: coerceLedgerAppliedAt(row.created_at),\n operationCount: operationCountFromStored(row.operations),\n }));\n }\n\n /**\n * Stamps the initial marker row for `space` via the shared contract-free DML\n * builder, lowered through {@link lower} and executed on the driver. See the\n * `SqlControlAdapter.initMarker` contract.\n */\n async insertMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .insert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .build(),\n );\n }\n\n async initMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .upsert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .onConflict(marker.space)\n .doUpdate((excluded) => ({\n core_hash: excluded.core_hash,\n profile_hash: excluded.profile_hash,\n contract_json: excluded.contract_json,\n canonical_version: excluded.canonical_version,\n updated_at: NOW,\n app_tag: excluded.app_tag,\n meta: excluded.meta,\n invariants: excluded.invariants,\n }))\n .build(),\n );\n }\n\n /**\n * Compare-and-swap advance of the marker row for `space`. See the\n * `SqlControlAdapter.updateMarker` contract.\n */\n async updateMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean> {\n const currentInvariants =\n destination.invariants === undefined\n ? []\n : ((await this.readMarker(driver, space))?.invariants ?? []);\n const mergedInvariants =\n destination.invariants === undefined\n ? undefined\n : mergeInvariants(currentInvariants, destination.invariants);\n\n const query = marker\n .update()\n .set({\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n updated_at: NOW,\n ...(mergedInvariants !== undefined ? { invariants: mergedInvariants } : {}),\n })\n .where(marker.space.eq(space).and(marker.core_hash.eq(expectedFrom)))\n .returning(marker.space)\n .build();\n\n const rows = await execute((q) => this.lower(q, { contract: undefined }), driver, query);\n return rows.length > 0;\n }\n\n /**\n * Appends a ledger entry for `space`. See the\n * `SqlControlAdapter.writeLedgerEntry` contract.\n */\n async writeLedgerEntry(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n ledger\n .insert({\n space,\n migration_name: entry.migrationName,\n migration_hash: entry.migrationHash,\n origin_core_hash: entry.from,\n destination_core_hash: entry.to,\n operations: entry.operations,\n })\n .build(),\n );\n }\n\n private async readMarkerResult(driver: SqlControlDriverInstance<'sqlite'>, space: string) {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) return { kind: 'no-table' as const };\n\n const fetch = marker\n .select(\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .where(marker.space.eq(space))\n .build();\n const result = await execute(lower, driver, fetch);\n const row = result[0];\n if (!row) return { kind: 'absent' as const };\n return {\n kind: 'present' as const,\n record: parseContractMarkerRow(decodeSqliteMarkerRow(row)),\n };\n }\n\n async introspect(\n driver: SqlControlDriverInstance<'sqlite'>,\n _contract?: unknown,\n ): Promise<SqlSchemaIR> {\n // Filter out runner-managed control tables (`_prisma_marker`,\n // `_prisma_ledger`) — they're an implementation detail of the migration\n // runner, not part of the user-authored contract, so they must not\n // appear in introspection output (otherwise strict schema verification\n // flags them as `extra_table`).\n const tablesResult = await driver.query<{ name: string }>(\n `SELECT name FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT IN ('_prisma_marker', '_prisma_ledger')\n ORDER BY name`,\n );\n\n const tables: Record<string, SqlTableIR> = {};\n\n for (const tableRow of tablesResult.rows) {\n const tableName = tableRow.name;\n\n // SQLite's synchronous driver serializes reads — no benefit from Promise.all\n const columnsResult = await driver.query<PragmaTableInfoRow>(\n `PRAGMA table_info(\"${escapePragmaArg(tableName)}\")`,\n );\n const fkResult = await driver.query<PragmaForeignKeyRow>(\n `PRAGMA foreign_key_list(\"${escapePragmaArg(tableName)}\")`,\n );\n const indexListResult = await driver.query<PragmaIndexListRow>(\n `PRAGMA index_list(\"${escapePragmaArg(tableName)}\")`,\n );\n\n const columns: Record<string, SqlColumnIR> = {};\n const pkColumns: Array<{ name: string; pk: number }> = [];\n\n for (const col of columnsResult.rows) {\n columns[col.name] = {\n name: col.name,\n nativeType: col.type.toLowerCase(),\n nullable: col.notnull === 0 && col.pk === 0,\n ...ifDefined('default', col.dflt_value ?? undefined),\n };\n if (col.pk > 0) {\n pkColumns.push({ name: col.name, pk: col.pk });\n }\n }\n\n pkColumns.sort((a, b) => a.pk - b.pk);\n const primaryKey: PrimaryKey | undefined =\n pkColumns.length > 0 ? { columns: pkColumns.map((c) => c.name) } : undefined;\n\n const fkMap = new Map<number, FkAccumulator>();\n for (const fk of fkResult.rows) {\n const existing = fkMap.get(fk.id);\n if (existing) {\n existing.columns.push(fk.from);\n existing.referencedColumns.push(fk.to);\n } else {\n fkMap.set(fk.id, {\n columns: [fk.from],\n referencedTable: fk.table,\n referencedColumns: [fk.to],\n onDelete: fk.on_delete,\n onUpdate: fk.on_update,\n });\n }\n }\n const foreignKeys: readonly SqlForeignKeyIR[] = Array.from(fkMap.values()).map((fk) => ({\n columns: Object.freeze([...fk.columns]) as readonly string[],\n referencedTable: fk.referencedTable,\n referencedColumns: Object.freeze([...fk.referencedColumns]) as readonly string[],\n ...ifDefined('onDelete', mapSqliteReferentialAction(fk.onDelete)),\n ...ifDefined('onUpdate', mapSqliteReferentialAction(fk.onUpdate)),\n }));\n\n const uniques: SqlUniqueIR[] = [];\n const indexes: SqlIndexIR[] = [];\n\n for (const idx of indexListResult.rows) {\n // origin: 'c' = CREATE INDEX, 'u' = UNIQUE constraint, 'pk' = PRIMARY KEY\n const idxInfoResult = await driver.query<PragmaIndexInfoRow>(\n `PRAGMA index_info(\"${escapePragmaArg(idx.name)}\")`,\n );\n\n const idxColumns = idxInfoResult.rows.sort((a, b) => a.seqno - b.seqno).map((r) => r.name);\n\n if (idx.origin === 'u') {\n uniques.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n });\n } else if (idx.origin === 'c') {\n indexes.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n unique: idx.unique === 1,\n });\n }\n // Skip 'pk' origin — already captured in primaryKey\n }\n\n tables[tableName] = {\n name: tableName,\n columns,\n ...ifDefined('primaryKey', primaryKey),\n foreignKeys,\n uniques,\n indexes,\n };\n }\n\n return {\n tables,\n };\n }\n}\n\n// PRAGMA queries use the function-argument form (`PRAGMA table_info(\"name\")`)\n// which doesn't support `?` placeholders — the argument is part of the\n// statement name, not a bound parameter. We quote-escape the table name instead.\nfunction escapePragmaArg(name: string): string {\n return name.replace(/\"/g, '\"\"');\n}\n\nconst SQLITE_REFERENTIAL_ACTION_MAP: Record<string, SqlReferentialAction> = {\n 'NO ACTION': 'noAction',\n RESTRICT: 'restrict',\n CASCADE: 'cascade',\n 'SET NULL': 'setNull',\n 'SET DEFAULT': 'setDefault',\n};\n\nfunction mapSqliteReferentialAction(rule: string): SqlReferentialAction | undefined {\n const normalized = rule.toUpperCase();\n const mapped = SQLITE_REFERENTIAL_ACTION_MAP[normalized];\n if (mapped === undefined) {\n throw new Error(\n `Unknown SQLite referential action rule: \"${rule}\". ` +\n 'Expected one of: NO ACTION, RESTRICT, CASCADE, SET NULL, SET DEFAULT.',\n );\n }\n if (mapped === 'noAction') return undefined;\n return mapped;\n}\n\n// ---------------------------------------------------------------------------\n// sqliteRenderDdlExecuteRequest — independent DDL walker for lowerToExecuteRequest\n// ---------------------------------------------------------------------------\n\nfunction sqliteInlineLiteral(wire: unknown): string {\n if (wire === null) return 'NULL';\n if (typeof wire === 'boolean') return wire ? '1' : '0';\n if (typeof wire === 'number') {\n if (!Number.isFinite(wire)) {\n throw new Error(\n `sqliteRenderDdlExecuteRequest: non-finite number wire value ${String(wire)} cannot be emitted as a DEFAULT literal`,\n );\n }\n return String(wire);\n }\n if (typeof wire === 'bigint') return String(wire);\n if (wire instanceof Date) {\n if (Number.isNaN(wire.getTime())) {\n throw new Error(\n 'sqliteRenderDdlExecuteRequest: invalid Date value cannot be emitted as a DEFAULT literal',\n );\n }\n return `'${escapeLiteral(wire.toISOString())}'`;\n }\n if (typeof wire === 'string') return `'${escapeLiteral(wire)}'`;\n if (wire instanceof Uint8Array) {\n const hex = Array.from(wire)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return `X'${hex}'`;\n }\n if (typeof wire === 'object') return `'${escapeLiteral(JSON.stringify(wire))}'`;\n throw new Error(`sqliteRenderDdlExecuteRequest: unexpected wire type \"${typeof wire}\"`);\n}\n\nasync function sqliteRenderDdlColumnDefault(\n def: LiteralColumnDefault | FunctionColumnDefault,\n codecLookup: CodecLookup,\n codecRef: CodecRef | undefined,\n): Promise<string> {\n if (def.kind === 'function') {\n if (def.expression === 'autoincrement()') return '';\n // SQLite has no `now()` function; the contract canonicalizes\n // `CURRENT_TIMESTAMP` / `datetime('now')` to `now()`, so map it back to a\n // valid SQLite expression on the way out.\n if (def.expression === 'now()') return \"DEFAULT (datetime('now'))\";\n return `DEFAULT (${def.expression})`;\n }\n if (codecRef !== undefined) {\n const codec = codecLookup.get(codecRef.codecId);\n if (codec !== undefined) {\n const wire = await codec.encode(def.value, {});\n return `DEFAULT ${sqliteInlineLiteral(wire)}`;\n }\n }\n // Fallback: codec-less literal defaults follow RawSqlLiteral wire-scalar semantics.\n return `DEFAULT ${sqliteInlineLiteral(def.value)}`;\n}\n\nasync function sqliteRenderDdlColumn(column: DdlColumn, codecLookup: CodecLookup): Promise<string> {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${quoteIdentifier(column.name)} ${column.type}`;\n }\n const parts = [quoteIdentifier(column.name), column.type];\n if (column.notNull) parts.push('NOT NULL');\n if (column.primaryKey) parts.push('PRIMARY KEY');\n if (column.default) {\n const clause = await sqliteRenderDdlColumnDefault(column.default, codecLookup, column.codecRef);\n if (clause.length > 0) parts.push(clause);\n }\n return parts.join(' ');\n}\n\nfunction sqliteRenderDdlConstraint(constraint: DdlTableConstraint): string {\n if (constraint.kind === 'primary-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} PRIMARY KEY (${cols})`;\n }\n return `PRIMARY KEY (${cols})`;\n }\n if (constraint.kind === 'foreign-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n const refTable = constraint.refTable.split('.').map(quoteIdentifier).join('.');\n const refCols = constraint.refColumns.map(quoteIdentifier).join(', ');\n let sql = `FOREIGN KEY (${cols}) REFERENCES ${refTable} (${refCols})`;\n if (constraint.onDelete !== undefined) {\n sql += ` ON DELETE ${REFERENTIAL_ACTION_SQL[constraint.onDelete]}`;\n }\n if (constraint.onUpdate !== undefined) {\n sql += ` ON UPDATE ${REFERENTIAL_ACTION_SQL[constraint.onUpdate]}`;\n }\n if (constraint.name !== undefined) {\n sql = `CONSTRAINT ${quoteIdentifier(constraint.name)} ${sql}`;\n }\n return sql;\n }\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} UNIQUE (${cols})`;\n }\n return `UNIQUE (${cols})`;\n}\n\nasync function sqliteRenderDdlExecuteRequest(\n ast: SqliteDdlNode,\n codecLookup: CodecLookup,\n): Promise<SqlExecuteRequest> {\n const node = blindCast<SqliteCreateTable, 'SQLite DDL only has create-table'>(ast);\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = quoteIdentifier(node.table);\n const columnDefs = await Promise.all(\n node.columns.map((col) => sqliteRenderDdlColumn(col, codecLookup)),\n );\n const constraintDefs =\n node.constraints !== undefined ? node.constraints.map(sqliteRenderDdlConstraint) : [];\n const allDefs = [...columnDefs, ...constraintDefs].join(',\\n ');\n return {\n sql: `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${allDefs}\\n)`,\n params: [],\n };\n}\n","import { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AggregateExpr,\n AnyExpression,\n AnyFromSource,\n AnyQueryAst,\n BinaryExpr,\n ColumnRef,\n DeleteAst,\n InsertAst,\n InsertValue,\n JoinAst,\n JoinOnExpr,\n JsonArrayAggExpr,\n JsonObjectExpr,\n ListExpression,\n LiteralExpr,\n LoweredParam,\n LowererContext,\n NullCheckExpr,\n OperationExpr,\n OrderByItem,\n ProjectionItem,\n RawExpr,\n RawSqlLiteral,\n SelectAst,\n SqlQueryable,\n SubqueryExpr,\n TableSource,\n UpdateAst,\n WindowFuncExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { createSqliteBuiltinCodecLookup } from './codec-lookup';\nimport { SqliteControlAdapter } from './control-adapter';\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 const codecLookup = createSqliteBuiltinCodecLookup();\n const controlAdapter = new SqliteControlAdapter(codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'sqlite',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | SqliteDdlNode,\n context: LowererContext<SqliteContract>,\n ): SqliteLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a sqlite client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const sqliteRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0\n ? 'sqlite/integer@1'\n : 'sqlite/real@1';\n case 'bigint':\n return 'sqlite/bigint@1';\n case 'string':\n return 'sqlite/text@1';\n case 'boolean':\n return 'sqlite/integer@1';\n case 'object':\n if (value instanceof Uint8Array) return 'sqlite/blob@1';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\n/**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the control adapter (`SqliteControlAdapter.lower`) so both produce byte-identical SQL for the same AST and contract.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: SqliteContract,\n): SqliteLoweredStatement {\n const collectedParamRefs = ast.collectParamRefs();\n const params: LoweredParam[] = [];\n for (const ref of collectedParamRefs) {\n params.push(\n ref.kind === 'prepared-param-ref'\n ? { kind: 'bind', name: ref.name }\n : { kind: 'literal', value: ref.value },\n );\n }\n\n let sql: string;\n\n const node = ast;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract);\n break;\n case 'insert':\n sql = renderInsert(node, contract);\n break;\n case 'update':\n sql = renderUpdate(node, contract);\n break;\n case 'delete':\n sql = renderDelete(node, contract);\n break;\n default:\n throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);\n }\n\n return Object.freeze({ sql, params });\n}\n\nfunction renderLimitOffset(\n keyword: 'LIMIT' | 'OFFSET',\n value: SelectAst['limit'] | SelectAst['offset'],\n contract?: SqliteContract,\n): string {\n if (value === undefined) return '';\n if (typeof value === 'number') return `${keyword} ${value}`;\n return `${keyword} ${renderExpr(value, contract)}`;\n}\n\nfunction renderSelect(ast: SelectAst, contract: SqliteContract): string {\n const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';\n const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;\n const fromClause = `FROM ${renderSource(ast.from, contract)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`)\n .join(', ')}`\n : '';\n const limitClause = renderLimitOffset('LIMIT', ast.limit, contract);\n const offsetClause = renderLimitOffset('OFFSET', ast.offset, contract);\n\n return [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ')\n .trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract?: SqliteContract,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction qualifyTableFromNamespaceCoordinate(\n table: Pick<TableSource, 'name' | 'namespaceId'>,\n contract: SqliteContract,\n): string {\n if (table.namespaceId === undefined) {\n return quoteIdentifier(table.name);\n }\n const namespace = contract.storage.namespaces[table.namespaceId];\n if (namespace === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not present on the contract`,\n );\n }\n const qualifyTable = namespace.qualifyTable;\n if (qualifyTable === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not materialised for SQL rendering on the contract`,\n );\n }\n return qualifyTable.call(namespace, table.name);\n}\n\nfunction renderTableSource(source: TableSource, contract: SqliteContract): string {\n const qualified = qualifyTableFromNamespaceCoordinate(source, contract);\n if (!source.alias) {\n return qualified;\n }\n return `${qualified} AS ${quoteIdentifier(source.alias)}`;\n}\n\nfunction renderSource(source: AnyFromSource, contract: SqliteContract): string {\n const node = source;\n switch (node.kind) {\n case 'table-source':\n return renderTableSource(node, contract);\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;\n default:\n throw new Error(`Unsupported source node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderExpr(expr: AnyExpression, contract?: SqliteContract): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract);\n case 'subquery':\n return renderSubqueryExpr(node, contract);\n case 'aggregate':\n return renderAggregateExpr(node, contract);\n case 'window-func':\n return renderWindowFuncExpr(node, contract);\n case 'json-object':\n return renderJsonObjectExpr(node, contract);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract);\n case 'binary':\n return renderBinary(node, contract);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;\n case 'exists': {\n if (contract === undefined) {\n throw new Error('EXISTS subquery rendering requires a Sqlite contract');\n }\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract)})`;\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node);\n case 'raw-expr':\n return renderRawExpr(node, contract);\n default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderRawExpr(node: RawExpr, contract?: SqliteContract): string {\n return node.parts\n .map((part) => (typeof part === 'string' ? part : renderExpr(part, contract)))\n .join('');\n}\n\n// `excluded` is a pseudo-table in ON CONFLICT DO UPDATE that references the row proposed for insertion. It is not quoted because it's a keyword.\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null || expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: SqliteContract): string {\n const self = renderExpr(expr.self, contract);\n const args = expr.args.map((arg) => renderExpr(arg, contract));\n\n let result = expr.lowering.template;\n result = result.replace(/\\{\\{self\\}\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\{\\\\{arg${i}\\\\}\\\\}`, 'g'), args[i] ?? '');\n }\n\n return result;\n}\n\nfunction renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): string {\n if (expr.query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n if (contract === undefined) {\n throw new Error('Subquery expression rendering requires a Sqlite contract');\n }\n return `(${renderSelect(expr.query, contract)})`;\n}\n\nfunction renderNullCheck(expr: NullCheckExpr, contract?: SqliteContract): string {\n const rendered = renderExpr(expr.expr, contract);\n const renderedExpr =\n expr.expr.kind === 'operation' || expr.expr.kind === 'subquery' ? `(${rendered})` : rendered;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: SqliteContract): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n case 'prepared-param-ref':\n right = '?';\n break;\n default:\n right = renderExpr(rightNode, contract);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(expr: ListExpression): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref' || v.kind === 'prepared-param-ref') return '?';\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderAggregateExpr(expr: AggregateExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract)})`;\n}\n\nfunction renderWindowFuncExpr(expr: WindowFuncExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n const args = expr.args.map((arg) => renderExpr(arg, contract)).join(', ');\n const partitionClause =\n expr.partitionBy && expr.partitionBy.length > 0\n ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract)).join(', ')}`\n : '';\n const orderClause =\n expr.orderBy && expr.orderBy.length > 0\n ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const over = [partitionClause, orderClause].filter((part) => part.length > 0).join(' ');\n return `${fn}(${args}) OVER (${over})`;\n}\n\nfunction renderJsonObjectExpr(expr: JsonObjectExpr, contract?: SqliteContract): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract)];\n })\n .join(', ');\n return `json_object(${args})`;\n}\n\nfunction renderOrderByItems(items: ReadonlyArray<OrderByItem>, contract?: SqliteContract): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContract): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const aggregated = `json_group_array(${renderExpr(expr.expr, contract)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, '[]')`;\n }\n return aggregated;\n}\n\nfunction renderJoin(join: JoinAst, contract?: SqliteContract): string {\n if (contract === undefined) {\n throw new Error('JOIN rendering requires a Sqlite contract');\n }\n const joinType = join.joinType.toUpperCase();\n const source = renderSource(join.source, contract);\n const onClause = renderJoinOn(join.on, contract);\n return `${joinType} JOIN ${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract?: SqliteContract): string {\n if (on.kind === 'eq-col-join-on') {\n return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;\n }\n return renderExpr(on, contract);\n}\n\nfunction renderInsertValue(value: InsertValue): string {\n switch (value.kind) {\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'column-ref':\n return renderColumn(value);\n case 'raw-expr':\n return renderExpr(value);\n case 'default-value':\n throw new Error('SQLite does not support DEFAULT as a value in INSERT ... VALUES');\n default:\n throw new Error(`Unsupported value node in INSERT: ${(value as { kind: string }).kind}`);\n }\n}\n\nfunction renderInsert(ast: InsertAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n\n const firstRow = rows[0] as Readonly<Record<string, InsertValue>>;\n const columnOrder = Object.keys(firstRow);\n\n let insertClause: string;\n if (columnOrder.length === 0) {\n insertClause = `INSERT INTO ${table} DEFAULT VALUES`;\n } else {\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => {\n const value = row[column];\n if (value === undefined) {\n throw new Error(`Missing value for column \"${column}\" in INSERT row`);\n }\n return renderInsertValue(value);\n });\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n }\n\n let onConflictClause = '';\n if (ast.onConflict) {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n break;\n case 'do-update-set': {\n const updates = Object.entries(action.set).map(([colName, value]) => {\n return `${quoteIdentifier(colName)} = ${renderExpr(value, contract)}`;\n });\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n break;\n }\n default:\n throw new Error(`Unsupported onConflict action: ${(action as { kind: string }).kind}`);\n }\n }\n\n const returningClause = renderReturning(ast.returning);\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where, contract)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nfunction renderReturning(returning: ReadonlyArray<ProjectionItem> | undefined): string {\n if (!returning?.length) {\n return '';\n }\n return ` RETURNING ${returning\n .map((item) => {\n if (item.expr.kind === 'column-ref') {\n const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;\n return item.expr.column === item.alias\n ? rendered\n : `${rendered} AS ${quoteIdentifier(item.alias)}`;\n }\n return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ')}`;\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adapter-eo1yL7gA.mjs","names":[],"sources":["../src/core/codec-lookup.ts","../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/control-codecs.ts","../src/core/ledger-decode.ts","../src/core/marker-ledger.ts","../src/core/control-adapter.ts","../src/core/adapter.ts"],"sourcesContent":["import type { CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { extractCodecLookup } from '@prisma-next/framework-components/control';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\n/**\n * Build a {@link CodecRegistry} populated with the SQLite-builtin codec definitions only.\n *\n * Used by `createSqliteAdapter()` and `new SqliteControlAdapter()` when called without a\n * stack-derived registry (e.g. from tests, or one-off scripts that don't compose a full stack).\n *\n * Extension codecs are intentionally NOT included: a bare adapter cannot see extensions.\n * Stack-composed paths supply the broader, extension-inclusive registry at construction time.\n */\nexport function createSqliteBuiltinCodecLookup(): CodecRegistry {\n return extractCodecLookup([\n {\n id: 'sqlite-builtin-codecs',\n types: { codecTypes: { codecDescriptors: Array.from(sqliteCodecRegistry.values()) } },\n },\n ]);\n}\n","import \"../constants-YnG8_EGO.mjs\";\n//#region src/ledger-origin.ts\nfunction ledgerOriginFromStored(originCoreHash) {\n\tif (originCoreHash === null || originCoreHash === \"\" || originCoreHash === \"sha256:empty\") return null;\n\treturn originCoreHash;\n}\n//#endregion\nexport { ledgerOriginFromStored };\n\n//# sourceMappingURL=ledger-origin.mjs.map","import type {\n AnyQueryAst,\n ContractCodecRegistry,\n LoweredStatement,\n} from '@prisma-next/sql-relational-core/ast';\nimport {\n createAstCodecRegistry,\n deriveParamMetadata,\n encodeParamsWithMetadata,\n} from '@prisma-next/sql-runtime';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\nexport const CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);\n\nexport async function encodeControlQueryParams(\n lowered: LoweredStatement,\n ast: AnyQueryAst,\n codecs: ContractCodecRegistry = CONTROL_CODECS,\n): Promise<readonly unknown[]> {\n const values = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error(`control query lowered to a bind slot '${slot.name}', which is unsupported`);\n });\n return encodeParamsWithMetadata(values, deriveParamMetadata(ast), {}, codecs);\n}\n","const DESIGNATOR_LESS_UTC_DATETIME = /^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$/;\n\nexport function coerceLedgerAppliedAt(value: Date | string): Date {\n if (value instanceof Date) {\n return value;\n }\n if (DESIGNATOR_LESS_UTC_DATETIME.test(value)) {\n return new Date(`${value.replace(' ', 'T')}Z`);\n }\n return new Date(value);\n}\n\nexport function operationCountFromStored(operations: unknown): number {\n if (Array.isArray(operations)) {\n return operations.length;\n }\n if (typeof operations === 'string') {\n try {\n const parsed: unknown = JSON.parse(operations);\n return Array.isArray(parsed) ? parsed.length : 0;\n } catch {\n return 0;\n }\n }\n return 0;\n}\n","import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport {\n type AnyQueryAst,\n type LoweredStatement,\n RawExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';\nimport {\n datetime,\n integer,\n jsonText,\n sqliteTable,\n text,\n} from '@prisma-next/target-sqlite/contract-free';\nimport { encodeControlQueryParams } from './control-codecs';\n\nexport const marker = sqliteTable('_prisma_marker', {\n space: text(),\n core_hash: text(),\n profile_hash: text(),\n contract_json: jsonText({ nullable: true }),\n canonical_version: integer({ nullable: true }),\n updated_at: datetime(),\n app_tag: text({ nullable: true }),\n meta: jsonText({ nullable: true }),\n invariants: jsonText(),\n});\n\n/**\n * Writeable subset of `_prisma_ledger`. Omits the DB-generated `id`\n * (`INTEGER PRIMARY KEY AUTOINCREMENT`) and `created_at` (default\n * `strftime(...)`).\n */\nexport const ledger = sqliteTable('_prisma_ledger', {\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n});\n\n/**\n * Read-side handle covering every column of `_prisma_ledger`, including\n * the DB-generated `id` (for ORDER BY) and `created_at`.\n */\nexport const ledgerReadShape = sqliteTable('_prisma_ledger', {\n id: integer(),\n space: text(),\n migration_name: text(),\n migration_hash: text(),\n origin_core_hash: text({ nullable: true }),\n destination_core_hash: text(),\n operations: jsonText(),\n created_at: text(),\n});\n\nexport const sqliteCatalog = sqliteTable('sqlite_master', { type: text(), name: text() });\n\nexport const NOW = new RawExpr({\n parts: [\"datetime('now')\"],\n returns: { codecId: SQLITE_DATETIME_CODEC_ID, nullable: false },\n});\n\ntype Lower = (query: AnyQueryAst) => LoweredStatement;\n\ntype MarkerDriver = {\n query<Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ): Promise<{ readonly rows: ReadonlyArray<Row> }>;\n};\n\nexport function mergeInvariants(\n current: readonly string[],\n incoming: readonly string[],\n): readonly string[] {\n return [...new Set([...current, ...incoming])].sort();\n}\n\nexport async function execute(\n lower: Lower,\n driver: MarkerDriver,\n query: AnyQueryAst,\n): Promise<readonly Record<string, unknown>[]> {\n const lowered = lower(query);\n const encoded = await encodeControlQueryParams(lowered, query);\n const result = await driver.query(lowered.sql, encoded);\n return result.rows;\n}\n\nexport function decodeSqliteMarkerRow(row: unknown): unknown {\n if (typeof row !== 'object' || row === null || !('invariants' in row)) {\n return row;\n }\n const record = row as { invariants: unknown };\n if (typeof record.invariants !== 'string') return row;\n let parsed: unknown;\n try {\n parsed = JSON.parse(record.invariants);\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Invalid contract marker row: invariants is not valid JSON: ${detail}`);\n }\n return { ...record, invariants: parsed };\n}\n\nexport type SqliteMarkerWriteDriver = SqlControlDriverInstance<'sqlite'>;\n","import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { parseContractMarkerRow } from '@prisma-next/family-sql/verify';\nimport type { CodecLookup, CodecRegistry } from '@prisma-next/framework-components/codec';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport { REFERENTIAL_ACTION_SQL } from '@prisma-next/sql-contract/referential-action-sql';\nimport type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n CodecRef,\n ContractCodecRegistry,\n DdlColumn,\n DdlNode,\n DdlTableConstraint,\n FunctionColumnDefault,\n LiteralColumnDefault,\n LoweredStatement,\n LowererContext,\n MarkerReadResult,\n SqlExecuteRequest,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type {\n PrimaryKey,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlReferentialAction,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport {\n buildControlTableBootstrapQueries,\n buildSignMarkerBootstrapQueries,\n} from '@prisma-next/target-sqlite/contract-free';\nimport type { SqliteCreateTable, SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nimport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { encodeControlQueryParams } from './control-codecs';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport {\n decodeSqliteMarkerRow,\n execute,\n ledger,\n ledgerReadShape,\n marker,\n mergeInvariants,\n NOW,\n sqliteCatalog,\n} from './marker-ledger';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\ntype SqliteLedgerRow = {\n readonly space: string;\n readonly migration_name: string;\n readonly migration_hash: string;\n readonly origin_core_hash: string | null;\n readonly destination_core_hash: string;\n readonly operations: unknown;\n readonly created_at: Date | string;\n};\n\n// PRAGMA result row types\ntype PragmaTableInfoRow = {\n cid: number;\n name: string;\n type: string;\n notnull: number;\n dflt_value: string | null;\n pk: number;\n};\n\ntype PragmaForeignKeyRow = {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string;\n on_delete: string;\n};\n\ntype PragmaIndexListRow = {\n seq: number;\n name: string;\n unique: number;\n origin: string;\n partial: number;\n};\n\ntype PragmaIndexInfoRow = {\n seqno: number;\n cid: number;\n name: string;\n};\n\ntype FkAccumulator = {\n columns: string[];\n referencedTable: string;\n referencedColumns: string[];\n onDelete: string;\n onUpdate: string;\n};\n\nexport class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {\n readonly familyId = 'sql' as const;\n readonly targetId = 'sqlite' as const;\n\n private readonly codecRegistry: CodecRegistry;\n\n constructor(codecRegistry: CodecRegistry) {\n this.codecRegistry = codecRegistry;\n }\n\n readonly normalizeDefault = parseSqliteDefault;\n readonly normalizeNativeType = normalizeSqliteNativeType;\n\n bootstrapControlTableQueries(): readonly DdlNode[] {\n return buildControlTableBootstrapQueries();\n }\n\n bootstrapSignMarkerQueries(): readonly DdlNode[] {\n return buildSignMarkerBootstrapQueries();\n }\n\n /**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Delegates to the shared `renderLoweredSql` renderer so the control adapter\n * emits byte-identical SQL to `SqliteAdapterImpl.lower()` for the same AST\n * and contract. Used at migration plan/emit time (e.g. by `dataTransform`)\n * without instantiating the runtime adapter.\n */\n lower(ast: AnyQueryAst | SqliteDdlNode, context: LowererContext<unknown>): LoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() cannot lower DDL: DDL default literals require inline codec encoding, which is async. Use lowerToExecuteRequest().',\n );\n }\n return renderLoweredSql(\n ast,\n blindCast<SqliteContract, 'caller must supply a matching SqliteContract'>(context.contract),\n );\n }\n\n /**\n * Lower an AST all the way to a driver-ready statement. For DDL nodes,\n * literal column defaults are formatted as inline SQL with SQLite-specific\n * literal syntax (no cast suffix, boolean as 0/1, blob via X'hex'). For\n * query ASTs, params are kept as `?` placeholders; wire values go in\n * `params`. Does NOT call `this.lower()` — independent implementation.\n */\n async lowerToExecuteRequest(\n ast: AnyQueryAst | SqliteDdlNode,\n context?: LowererContext<unknown>,\n ): Promise<SqlExecuteRequest> {\n if (isDdlNode(ast)) {\n return sqliteRenderDdlExecuteRequest(\n blindCast<SqliteDdlNode, 'isDdlNode guard'>(ast),\n this.codecRegistry,\n );\n }\n const contract = blindCast<SqliteContract, 'Caller must supply matching contract'>(\n context?.contract,\n );\n const lowered = renderLoweredSql(ast, contract);\n const codecRegistry = blindCast<\n ContractCodecRegistry,\n 'framework CodecRegistry: its descriptors materialise SQL codecs; the framework Codec type erases to BaseCodec at this boundary'\n >(this.codecRegistry);\n const params = await encodeControlQueryParams(lowered, ast, codecRegistry);\n return { sql: lowered.sql, params };\n }\n\n /**\n * Reads the contract marker from `_prisma_marker`. Probes `sqlite_master`\n * first so a fresh database (no marker table) returns `null` instead of a\n * \"no such table\" error.\n */\n async readMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const result = await this.readMarkerDiscriminated(driver, space);\n return result.kind === 'present' ? result.record : null;\n }\n\n async readMarkerDiscriminated(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n ): Promise<MarkerReadResult> {\n const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readMarkerResult(driver, space), markerContext);\n }\n\n /**\n * Reads every row from `_prisma_marker` and returns them keyed by\n * `space`. Mirrors the existence probe in {@link readMarker}: a\n * fresh database without the marker table returns an empty map.\n */\n async readAllMarkers(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };\n return withMarkerReadErrorHandling(() => this.readAllMarkersResult(driver), markerContext);\n }\n\n private async readAllMarkersResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return new Map();\n }\n\n const fetch = marker\n .select(\n marker.space,\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .build();\n const rawRows = await execute(lower, driver, fetch);\n const rows = blindCast<\n ReadonlyArray<{ space: string } & Record<string, unknown>>,\n 'Driver returns rows shaped by SELECT'\n >(rawRows);\n\n const out = new Map<string, ContractMarkerRecord>();\n for (const row of rows) {\n out.set(\n row.space,\n parseMarkerRowSafely(row, (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)), {\n space: row.space,\n markerLocation: SQLITE_MARKER_TABLE,\n }),\n );\n }\n return out;\n }\n\n /**\n * Reads per-migration ledger rows from `_prisma_ledger` in apply order.\n * Probes `sqlite_master` first so a fresh database without the ledger\n * table returns `[]` instead of raising \"no such table\".\n */\n async readLedger(\n driver: SqlControlDriverInstance<'sqlite'>,\n space?: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space: space ?? '*', markerLocation: SQLITE_LEDGER_TABLE };\n return withMarkerReadErrorHandling(() => this.readLedgerResult(driver, space), ledgerContext);\n }\n\n private async readLedgerResult(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string | undefined,\n ): Promise<readonly LedgerEntryRecord[]> {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_ledger')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) {\n return [];\n }\n\n const base = ledgerReadShape.select(\n ledgerReadShape.space,\n ledgerReadShape.migration_name,\n ledgerReadShape.migration_hash,\n ledgerReadShape.origin_core_hash,\n ledgerReadShape.destination_core_hash,\n ledgerReadShape.operations,\n ledgerReadShape.created_at,\n );\n const filtered = space !== undefined ? base.where(ledgerReadShape.space.eq(space)) : base;\n const rawRows = await execute(lower, driver, filtered.orderBy(ledgerReadShape.id).build());\n const rows = blindCast<readonly SqliteLedgerRow[], 'Driver returns rows shaped by SELECT'>(\n rawRows,\n );\n\n return rows.map((row) => ({\n space: row.space,\n migrationName: row.migration_name,\n migrationHash: row.migration_hash,\n from: ledgerOriginFromStored(row.origin_core_hash),\n to: row.destination_core_hash,\n appliedAt: coerceLedgerAppliedAt(row.created_at),\n operationCount: operationCountFromStored(row.operations),\n }));\n }\n\n /**\n * Stamps the initial marker row for `space` via the shared contract-free DML\n * builder, lowered through {@link lower} and executed on the driver. See the\n * `SqlControlAdapter.initMarker` contract.\n */\n async insertMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .insert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .build(),\n );\n }\n\n async initMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n marker\n .upsert({\n space,\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n contract_json: null,\n canonical_version: null,\n updated_at: NOW,\n app_tag: null,\n meta: {},\n invariants: destination.invariants ?? [],\n })\n .onConflict(marker.space)\n .doUpdate((excluded) => ({\n core_hash: excluded.core_hash,\n profile_hash: excluded.profile_hash,\n contract_json: excluded.contract_json,\n canonical_version: excluded.canonical_version,\n updated_at: NOW,\n app_tag: excluded.app_tag,\n meta: excluded.meta,\n invariants: excluded.invariants,\n }))\n .build(),\n );\n }\n\n /**\n * Compare-and-swap advance of the marker row for `space`. See the\n * `SqlControlAdapter.updateMarker` contract.\n */\n async updateMarker(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean> {\n const currentInvariants =\n destination.invariants === undefined\n ? []\n : ((await this.readMarker(driver, space))?.invariants ?? []);\n const mergedInvariants =\n destination.invariants === undefined\n ? undefined\n : mergeInvariants(currentInvariants, destination.invariants);\n\n const query = marker\n .update()\n .set({\n core_hash: destination.storageHash,\n profile_hash: destination.profileHash,\n updated_at: NOW,\n ...(mergedInvariants !== undefined ? { invariants: mergedInvariants } : {}),\n })\n .where(marker.space.eq(space).and(marker.core_hash.eq(expectedFrom)))\n .returning(marker.space)\n .build();\n\n const rows = await execute((q) => this.lower(q, { contract: undefined }), driver, query);\n return rows.length > 0;\n }\n\n /**\n * Appends a ledger entry for `space`. See the\n * `SqlControlAdapter.writeLedgerEntry` contract.\n */\n async writeLedgerEntry(\n driver: SqlControlDriverInstance<'sqlite'>,\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void> {\n await execute(\n (query) => this.lower(query, { contract: undefined }),\n driver,\n ledger\n .insert({\n space,\n migration_name: entry.migrationName,\n migration_hash: entry.migrationHash,\n origin_core_hash: entry.from,\n destination_core_hash: entry.to,\n operations: entry.operations,\n })\n .build(),\n );\n }\n\n private async readMarkerResult(driver: SqlControlDriverInstance<'sqlite'>, space: string) {\n const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });\n const probe = sqliteCatalog\n .select(sqliteCatalog.name)\n .where(sqliteCatalog.type.eq('table').and(sqliteCatalog.name.eq('_prisma_marker')))\n .build();\n const exists = await execute(lower, driver, probe);\n if (exists.length === 0) return { kind: 'no-table' as const };\n\n const fetch = marker\n .select(\n marker.core_hash,\n marker.profile_hash,\n marker.contract_json,\n marker.canonical_version,\n marker.updated_at,\n marker.app_tag,\n marker.meta,\n marker.invariants,\n )\n .where(marker.space.eq(space))\n .build();\n const result = await execute(lower, driver, fetch);\n const row = result[0];\n if (!row) return { kind: 'absent' as const };\n return {\n kind: 'present' as const,\n record: parseContractMarkerRow(decodeSqliteMarkerRow(row)),\n };\n }\n\n async introspect(\n driver: SqlControlDriverInstance<'sqlite'>,\n _contract?: unknown,\n ): Promise<SqlSchemaIR> {\n // Filter out runner-managed control tables (`_prisma_marker`,\n // `_prisma_ledger`) — they're an implementation detail of the migration\n // runner, not part of the user-authored contract, so they must not\n // appear in introspection output (otherwise strict schema verification\n // flags them as `extra_table`).\n const tablesResult = await driver.query<{ name: string }>(\n `SELECT name FROM sqlite_master\n WHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\n AND name NOT IN ('_prisma_marker', '_prisma_ledger')\n ORDER BY name`,\n );\n\n const tables: Record<string, SqlTableIR> = {};\n\n for (const tableRow of tablesResult.rows) {\n const tableName = tableRow.name;\n\n // SQLite's synchronous driver serializes reads — no benefit from Promise.all\n const columnsResult = await driver.query<PragmaTableInfoRow>(\n `PRAGMA table_info(\"${escapePragmaArg(tableName)}\")`,\n );\n const fkResult = await driver.query<PragmaForeignKeyRow>(\n `PRAGMA foreign_key_list(\"${escapePragmaArg(tableName)}\")`,\n );\n const indexListResult = await driver.query<PragmaIndexListRow>(\n `PRAGMA index_list(\"${escapePragmaArg(tableName)}\")`,\n );\n\n const columns: Record<string, SqlColumnIR> = {};\n const pkColumns: Array<{ name: string; pk: number }> = [];\n\n for (const col of columnsResult.rows) {\n columns[col.name] = {\n name: col.name,\n nativeType: col.type.toLowerCase(),\n nullable: col.notnull === 0 && col.pk === 0,\n ...ifDefined('default', col.dflt_value ?? undefined),\n };\n if (col.pk > 0) {\n pkColumns.push({ name: col.name, pk: col.pk });\n }\n }\n\n pkColumns.sort((a, b) => a.pk - b.pk);\n const primaryKey: PrimaryKey | undefined =\n pkColumns.length > 0 ? { columns: pkColumns.map((c) => c.name) } : undefined;\n\n const fkMap = new Map<number, FkAccumulator>();\n for (const fk of fkResult.rows) {\n const existing = fkMap.get(fk.id);\n if (existing) {\n existing.columns.push(fk.from);\n existing.referencedColumns.push(fk.to);\n } else {\n fkMap.set(fk.id, {\n columns: [fk.from],\n referencedTable: fk.table,\n referencedColumns: [fk.to],\n onDelete: fk.on_delete,\n onUpdate: fk.on_update,\n });\n }\n }\n const foreignKeys: readonly SqlForeignKeyIR[] = Array.from(fkMap.values()).map((fk) => ({\n columns: Object.freeze([...fk.columns]) as readonly string[],\n referencedTable: fk.referencedTable,\n referencedColumns: Object.freeze([...fk.referencedColumns]) as readonly string[],\n ...ifDefined('onDelete', mapSqliteReferentialAction(fk.onDelete)),\n ...ifDefined('onUpdate', mapSqliteReferentialAction(fk.onUpdate)),\n }));\n\n const uniques: SqlUniqueIR[] = [];\n const indexes: SqlIndexIR[] = [];\n\n for (const idx of indexListResult.rows) {\n // origin: 'c' = CREATE INDEX, 'u' = UNIQUE constraint, 'pk' = PRIMARY KEY\n const idxInfoResult = await driver.query<PragmaIndexInfoRow>(\n `PRAGMA index_info(\"${escapePragmaArg(idx.name)}\")`,\n );\n\n const idxColumns = idxInfoResult.rows.sort((a, b) => a.seqno - b.seqno).map((r) => r.name);\n\n if (idx.origin === 'u') {\n uniques.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n });\n } else if (idx.origin === 'c') {\n indexes.push({\n columns: Object.freeze([...idxColumns]) as readonly string[],\n name: idx.name,\n unique: idx.unique === 1,\n });\n }\n // Skip 'pk' origin — already captured in primaryKey\n }\n\n tables[tableName] = {\n name: tableName,\n columns,\n ...ifDefined('primaryKey', primaryKey),\n foreignKeys,\n uniques,\n indexes,\n };\n }\n\n return {\n tables,\n };\n }\n}\n\n// PRAGMA queries use the function-argument form (`PRAGMA table_info(\"name\")`)\n// which doesn't support `?` placeholders — the argument is part of the\n// statement name, not a bound parameter. We quote-escape the table name instead.\nfunction escapePragmaArg(name: string): string {\n return name.replace(/\"/g, '\"\"');\n}\n\nconst SQLITE_REFERENTIAL_ACTION_MAP: Record<string, SqlReferentialAction> = {\n 'NO ACTION': 'noAction',\n RESTRICT: 'restrict',\n CASCADE: 'cascade',\n 'SET NULL': 'setNull',\n 'SET DEFAULT': 'setDefault',\n};\n\nfunction mapSqliteReferentialAction(rule: string): SqlReferentialAction | undefined {\n const normalized = rule.toUpperCase();\n const mapped = SQLITE_REFERENTIAL_ACTION_MAP[normalized];\n if (mapped === undefined) {\n throw new Error(\n `Unknown SQLite referential action rule: \"${rule}\". ` +\n 'Expected one of: NO ACTION, RESTRICT, CASCADE, SET NULL, SET DEFAULT.',\n );\n }\n if (mapped === 'noAction') return undefined;\n return mapped;\n}\n\n// ---------------------------------------------------------------------------\n// sqliteRenderDdlExecuteRequest — independent DDL walker for lowerToExecuteRequest\n// ---------------------------------------------------------------------------\n\nfunction sqliteInlineLiteral(wire: unknown): string {\n if (wire === null) return 'NULL';\n if (typeof wire === 'boolean') return wire ? '1' : '0';\n if (typeof wire === 'number') {\n if (!Number.isFinite(wire)) {\n throw new Error(\n `sqliteRenderDdlExecuteRequest: non-finite number wire value ${String(wire)} cannot be emitted as a DEFAULT literal`,\n );\n }\n return String(wire);\n }\n if (typeof wire === 'bigint') return String(wire);\n if (wire instanceof Date) {\n if (Number.isNaN(wire.getTime())) {\n throw new Error(\n 'sqliteRenderDdlExecuteRequest: invalid Date value cannot be emitted as a DEFAULT literal',\n );\n }\n return `'${escapeLiteral(wire.toISOString())}'`;\n }\n if (typeof wire === 'string') return `'${escapeLiteral(wire)}'`;\n if (wire instanceof Uint8Array) {\n const hex = Array.from(wire)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return `X'${hex}'`;\n }\n if (typeof wire === 'object') return `'${escapeLiteral(JSON.stringify(wire))}'`;\n throw new Error(`sqliteRenderDdlExecuteRequest: unexpected wire type \"${typeof wire}\"`);\n}\n\nasync function sqliteRenderDdlColumnDefault(\n def: LiteralColumnDefault | FunctionColumnDefault,\n codecLookup: CodecLookup,\n codecRef: CodecRef | undefined,\n): Promise<string> {\n if (def.kind === 'function') {\n if (def.expression === 'autoincrement()') return '';\n // SQLite has no `now()` function; the contract canonicalizes\n // `CURRENT_TIMESTAMP` / `datetime('now')` to `now()`, so map it back to a\n // valid SQLite expression on the way out.\n if (def.expression === 'now()') return \"DEFAULT (datetime('now'))\";\n return `DEFAULT (${def.expression})`;\n }\n if (codecRef !== undefined) {\n const codec = codecLookup.get(codecRef.codecId);\n if (codec !== undefined) {\n const wire = await codec.encode(def.value, {});\n return `DEFAULT ${sqliteInlineLiteral(wire)}`;\n }\n }\n // Fallback: codec-less literal defaults follow RawSqlLiteral wire-scalar semantics.\n return `DEFAULT ${sqliteInlineLiteral(def.value)}`;\n}\n\nasync function sqliteRenderDdlColumn(column: DdlColumn, codecLookup: CodecLookup): Promise<string> {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${quoteIdentifier(column.name)} ${column.type}`;\n }\n const parts = [quoteIdentifier(column.name), column.type];\n if (column.notNull) parts.push('NOT NULL');\n if (column.primaryKey) parts.push('PRIMARY KEY');\n if (column.default) {\n const clause = await sqliteRenderDdlColumnDefault(column.default, codecLookup, column.codecRef);\n if (clause.length > 0) parts.push(clause);\n }\n return parts.join(' ');\n}\n\nfunction sqliteRenderDdlConstraint(constraint: DdlTableConstraint): string {\n if (constraint.kind === 'primary-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} PRIMARY KEY (${cols})`;\n }\n return `PRIMARY KEY (${cols})`;\n }\n if (constraint.kind === 'foreign-key') {\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n const refTable = constraint.refTable.split('.').map(quoteIdentifier).join('.');\n const refCols = constraint.refColumns.map(quoteIdentifier).join(', ');\n let sql = `FOREIGN KEY (${cols}) REFERENCES ${refTable} (${refCols})`;\n if (constraint.onDelete !== undefined) {\n sql += ` ON DELETE ${REFERENTIAL_ACTION_SQL[constraint.onDelete]}`;\n }\n if (constraint.onUpdate !== undefined) {\n sql += ` ON UPDATE ${REFERENTIAL_ACTION_SQL[constraint.onUpdate]}`;\n }\n if (constraint.name !== undefined) {\n sql = `CONSTRAINT ${quoteIdentifier(constraint.name)} ${sql}`;\n }\n return sql;\n }\n const cols = constraint.columns.map(quoteIdentifier).join(', ');\n if (constraint.name !== undefined) {\n return `CONSTRAINT ${quoteIdentifier(constraint.name)} UNIQUE (${cols})`;\n }\n return `UNIQUE (${cols})`;\n}\n\nasync function sqliteRenderDdlExecuteRequest(\n ast: SqliteDdlNode,\n codecLookup: CodecLookup,\n): Promise<SqlExecuteRequest> {\n const node = blindCast<SqliteCreateTable, 'SQLite DDL only has create-table'>(ast);\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = quoteIdentifier(node.table);\n const columnDefs = await Promise.all(\n node.columns.map((col) => sqliteRenderDdlColumn(col, codecLookup)),\n );\n const constraintDefs =\n node.constraints !== undefined ? node.constraints.map(sqliteRenderDdlConstraint) : [];\n const allDefs = [...columnDefs, ...constraintDefs].join(',\\n ');\n return {\n sql: `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${allDefs}\\n)`,\n params: [],\n };\n}\n","import { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type {\n Adapter,\n AdapterProfile,\n AggregateExpr,\n AnyExpression,\n AnyFromSource,\n AnyQueryAst,\n BinaryExpr,\n ColumnRef,\n DeleteAst,\n InsertAst,\n InsertValue,\n JoinAst,\n JoinOnExpr,\n JsonArrayAggExpr,\n JsonObjectExpr,\n ListExpression,\n LiteralExpr,\n LoweredParam,\n LowererContext,\n NullCheckExpr,\n OperationExpr,\n OrderByItem,\n ProjectionItem,\n RawExpr,\n RawSqlLiteral,\n SelectAst,\n SqlQueryable,\n SubqueryExpr,\n TableSource,\n UpdateAst,\n WindowFuncExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport { isDdlNode } from '@prisma-next/sql-relational-core/ast';\nimport type { RawCodecInferer } from '@prisma-next/sql-relational-core/expression';\nimport type { SqliteDdlNode } from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-sqlite/sql-utils';\nimport { createSqliteBuiltinCodecLookup } from './codec-lookup';\nimport { SqliteControlAdapter } from './control-adapter';\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 const codecLookup = createSqliteBuiltinCodecLookup();\n const controlAdapter = new SqliteControlAdapter(codecLookup);\n this.profile = Object.freeze({\n id: options?.profileId ?? 'sqlite/default@1',\n target: 'sqlite',\n capabilities: defaultCapabilities,\n readMarker: (queryable: SqlQueryable) =>\n controlAdapter.readMarkerDiscriminated(\n {\n familyId: 'sql',\n targetId: 'sqlite',\n query: async <Row = Record<string, unknown>>(\n sql: string,\n params?: readonly unknown[],\n ) => {\n const result = await queryable.query<Row>(sql, params);\n return { rows: [...result.rows] };\n },\n close: async () => {},\n },\n APP_SPACE_ID,\n ),\n });\n }\n\n lower(\n ast: AnyQueryAst | SqliteDdlNode,\n context: LowererContext<SqliteContract>,\n ): SqliteLoweredStatement {\n if (isDdlNode(ast)) {\n throw new Error(\n 'lower() does not lower DDL on the runtime adapter — DDL lowering is a control-plane concern handled by the control adapter.',\n );\n }\n return renderLoweredSql(ast, context.contract);\n }\n}\n\n/** Codec-id lookup for bare-literal interpolations used by `fns.raw` on a sqlite client. Contributed as the descriptor's static `rawCodecInferer` slot. */\nexport const sqliteRawCodecInferer: RawCodecInferer = {\n inferCodec(value: RawSqlLiteral): string {\n switch (typeof value) {\n case 'number':\n return Number.isSafeInteger(value) && value % 1 === 0\n ? 'sqlite/integer@1'\n : 'sqlite/real@1';\n case 'bigint':\n return 'sqlite/bigint@1';\n case 'string':\n return 'sqlite/text@1';\n case 'boolean':\n return 'sqlite/integer@1';\n case 'object':\n if (value instanceof Uint8Array) return 'sqlite/blob@1';\n }\n throw new Error(\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n },\n};\n\n/**\n * Lower a SQL query AST into a SQLite-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime adapter (`SqliteAdapterImpl.lower`) and the control adapter (`SqliteControlAdapter.lower`) so both produce byte-identical SQL for the same AST and contract.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: SqliteContract,\n): SqliteLoweredStatement {\n const collectedParamRefs = ast.collectParamRefs();\n const params: LoweredParam[] = [];\n for (const ref of collectedParamRefs) {\n params.push(\n ref.kind === 'prepared-param-ref'\n ? { kind: 'bind', name: ref.name }\n : { kind: 'literal', value: ref.value },\n );\n }\n\n let sql: string;\n\n const node = ast;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract);\n break;\n case 'insert':\n sql = renderInsert(node, contract);\n break;\n case 'update':\n sql = renderUpdate(node, contract);\n break;\n case 'delete':\n sql = renderDelete(node, contract);\n break;\n default:\n throw new Error(`Unsupported AST node kind: ${(node as { kind: string }).kind}`);\n }\n\n return Object.freeze({ sql, params });\n}\n\nfunction renderLimitOffset(\n keyword: 'LIMIT' | 'OFFSET',\n value: SelectAst['limit'] | SelectAst['offset'],\n contract?: SqliteContract,\n): string {\n if (value === undefined) return '';\n if (typeof value === 'number') return `${keyword} ${value}`;\n return `${keyword} ${renderExpr(value, contract)}`;\n}\n\nfunction renderSelect(ast: SelectAst, contract: SqliteContract): string {\n const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';\n const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;\n const fromClause = ast.from !== undefined ? `FROM ${renderSource(ast.from, contract)}` : '';\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderExpr(ast.where, contract)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderExpr(ast.having, contract)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => `${renderExpr(order.expr, contract)} ${order.dir.toUpperCase()}`)\n .join(', ')}`\n : '';\n const limitClause = renderLimitOffset('LIMIT', ast.limit, contract);\n const offsetClause = renderLimitOffset('OFFSET', ast.offset, contract);\n\n return [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ')\n .trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract?: SqliteContract,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction qualifyTableFromNamespaceCoordinate(\n table: Pick<TableSource, 'name' | 'namespaceId'>,\n contract: SqliteContract,\n): string {\n if (table.namespaceId === undefined) {\n return quoteIdentifier(table.name);\n }\n const namespace = contract.storage.namespaces[table.namespaceId];\n if (namespace === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not present on the contract`,\n );\n }\n const qualifyTable = namespace.qualifyTable;\n if (qualifyTable === undefined) {\n throw new Error(\n `Table \"${table.name}\" references namespace \"${table.namespaceId}\" which is not materialised for SQL rendering on the contract`,\n );\n }\n return qualifyTable.call(namespace, table.name);\n}\n\nfunction renderTableSource(source: TableSource, contract: SqliteContract): string {\n const qualified = qualifyTableFromNamespaceCoordinate(source, contract);\n if (!source.alias) {\n return qualified;\n }\n return `${qualified} AS ${quoteIdentifier(source.alias)}`;\n}\n\nfunction renderSource(source: AnyFromSource, contract: SqliteContract): string {\n const node = source;\n switch (node.kind) {\n case 'table-source':\n return renderTableSource(node, contract);\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;\n case 'function-source': {\n const args = node.args.map((arg) => renderExpr(arg, contract)).join(', ');\n const call = `${node.fn}(${args})`;\n return node.alias !== undefined ? `${call} AS ${quoteIdentifier(node.alias)}` : call;\n }\n default:\n throw new Error(\n `Unsupported source node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction renderExpr(expr: AnyExpression, contract?: SqliteContract): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract);\n case 'subquery':\n return renderSubqueryExpr(node, contract);\n case 'aggregate':\n return renderAggregateExpr(node, contract);\n case 'window-func':\n return renderWindowFuncExpr(node, contract);\n case 'json-object':\n return renderJsonObjectExpr(node, contract);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract);\n case 'binary':\n return renderBinary(node, contract);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract)).join(' OR ')})`;\n case 'exists': {\n if (contract === undefined) {\n throw new Error('EXISTS subquery rendering requires a Sqlite contract');\n }\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract)})`;\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node);\n case 'raw-expr':\n return renderRawExpr(node, contract);\n default:\n throw new Error(`Unsupported expression node kind: ${(node as { kind: string }).kind}`);\n }\n}\n\nfunction renderRawExpr(node: RawExpr, contract?: SqliteContract): string {\n return node.parts\n .map((part) => (typeof part === 'string' ? part : renderExpr(part, contract)))\n .join('');\n}\n\n// `excluded` is a pseudo-table in ON CONFLICT DO UPDATE that references the row proposed for insertion. It is not quoted because it's a keyword.\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null || expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(expr: OperationExpr, contract?: SqliteContract): string {\n const self = renderExpr(expr.self, contract);\n const args = expr.args.map((arg) => renderExpr(arg, contract));\n\n let result = expr.lowering.template;\n result = result.replace(/\\{\\{self\\}\\}/g, self);\n for (let i = 0; i < args.length; i++) {\n result = result.replace(new RegExp(`\\\\{\\\\{arg${i}\\\\}\\\\}`, 'g'), args[i] ?? '');\n }\n\n return result;\n}\n\nfunction renderSubqueryExpr(expr: SubqueryExpr, contract?: SqliteContract): string {\n if (expr.query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n if (contract === undefined) {\n throw new Error('Subquery expression rendering requires a Sqlite contract');\n }\n return `(${renderSelect(expr.query, contract)})`;\n}\n\nfunction renderNullCheck(expr: NullCheckExpr, contract?: SqliteContract): string {\n const rendered = renderExpr(expr.expr, contract);\n const renderedExpr =\n expr.expr.kind === 'operation' || expr.expr.kind === 'subquery' ? `(${rendered})` : rendered;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\nfunction renderBinary(expr: BinaryExpr, contract?: SqliteContract): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n case 'prepared-param-ref':\n right = '?';\n break;\n default:\n right = renderExpr(rightNode, contract);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(expr: ListExpression): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref' || v.kind === 'prepared-param-ref') return '?';\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderAggregateExpr(expr: AggregateExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract)})`;\n}\n\nfunction renderWindowFuncExpr(expr: WindowFuncExpr, contract?: SqliteContract): string {\n const fn = expr.fn.toUpperCase();\n const args = expr.args.map((arg) => renderExpr(arg, contract)).join(', ');\n const partitionClause =\n expr.partitionBy && expr.partitionBy.length > 0\n ? `PARTITION BY ${expr.partitionBy.map((e) => renderExpr(e, contract)).join(', ')}`\n : '';\n const orderClause =\n expr.orderBy && expr.orderBy.length > 0\n ? `ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const over = [partitionClause, orderClause].filter((part) => part.length > 0).join(' ');\n return `${fn}(${args}) OVER (${over})`;\n}\n\nfunction renderJsonObjectExpr(expr: JsonObjectExpr, contract?: SqliteContract): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract)];\n })\n .join(', ');\n return `json_object(${args})`;\n}\n\nfunction renderOrderByItems(items: ReadonlyArray<OrderByItem>, contract?: SqliteContract): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(expr: JsonArrayAggExpr, contract?: SqliteContract): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract)}`\n : '';\n const aggregated = `json_group_array(${renderExpr(expr.expr, contract)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, '[]')`;\n }\n return aggregated;\n}\n\nfunction renderJoin(join: JoinAst, contract?: SqliteContract): string {\n if (contract === undefined) {\n throw new Error('JOIN rendering requires a Sqlite contract');\n }\n const joinType = join.joinType.toUpperCase();\n const source = renderSource(join.source, contract);\n const onClause = renderJoinOn(join.on, contract);\n return `${joinType} JOIN ${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract?: SqliteContract): string {\n if (on.kind === 'eq-col-join-on') {\n return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;\n }\n return renderExpr(on, contract);\n}\n\nfunction renderInsertValue(value: InsertValue): string {\n switch (value.kind) {\n case 'param-ref':\n case 'prepared-param-ref':\n return '?';\n case 'column-ref':\n return renderColumn(value);\n case 'raw-expr':\n return renderExpr(value);\n case 'default-value':\n throw new Error('SQLite does not support DEFAULT as a value in INSERT ... VALUES');\n default:\n throw new Error(`Unsupported value node in INSERT: ${(value as { kind: string }).kind}`);\n }\n}\n\nfunction renderInsert(ast: InsertAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n\n const firstRow = rows[0] as Readonly<Record<string, InsertValue>>;\n const columnOrder = Object.keys(firstRow);\n\n let insertClause: string;\n if (columnOrder.length === 0) {\n insertClause = `INSERT INTO ${table} DEFAULT VALUES`;\n } else {\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => {\n const value = row[column];\n if (value === undefined) {\n throw new Error(`Missing value for column \"${column}\" in INSERT row`);\n }\n return renderInsertValue(value);\n });\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n insertClause = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n }\n\n let onConflictClause = '';\n if (ast.onConflict) {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n break;\n case 'do-update-set': {\n const updates = Object.entries(action.set).map(([colName, value]) => {\n return `${quoteIdentifier(colName)} = ${renderExpr(value, contract)}`;\n });\n onConflictClause = ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n break;\n }\n default:\n throw new Error(`Unsupported onConflict action: ${(action as { kind: string }).kind}`);\n }\n }\n\n const returningClause = renderReturning(ast.returning);\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const setClauses = Object.entries(ast.set).map(([col, val]) => {\n return `${quoteIdentifier(col)} = ${renderExpr(val, contract)}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where, contract)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract: SqliteContract): string {\n const table = qualifyTableFromNamespaceCoordinate(ast.table, contract);\n const whereClause = ast.where ? ` WHERE ${renderExpr(ast.where)}` : '';\n const returningClause = renderReturning(ast.returning);\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n\nfunction renderReturning(returning: ReadonlyArray<ProjectionItem> | undefined): string {\n if (!returning?.length) {\n return '';\n }\n return ` RETURNING ${returning\n .map((item) => {\n if (item.expr.kind === 'column-ref') {\n const rendered = `${quoteIdentifier(item.expr.table)}.${quoteIdentifier(item.expr.column)}`;\n return item.expr.column === item.alias\n ? rendered\n : `${rendered} AS ${quoteIdentifier(item.alias)}`;\n }\n return `${renderExpr(item.expr)} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ')}`;\n}\n\nexport function createSqliteAdapter(options?: SqliteAdapterOptions) {\n return Object.freeze(new SqliteAdapterImpl(options));\n}\n"],"mappings":"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"}
|
package/dist/adapter.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-
|
|
1
|
+
import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-eo1yL7gA.mjs";
|
|
2
2
|
export { createSqliteAdapter, sqliteRawCodecInferer };
|
package/dist/control.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as createSqliteBuiltinCodecLookup, r as SqliteControlAdapter } from "./adapter-
|
|
2
|
-
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-
|
|
1
|
+
import { i as createSqliteBuiltinCodecLookup, r as SqliteControlAdapter } from "./adapter-eo1yL7gA.mjs";
|
|
2
|
+
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-pA9TOBa7.mjs";
|
|
3
3
|
import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
|
|
4
4
|
import { parseSqliteDefault } from "@prisma-next/target-sqlite/default-normalizer";
|
|
5
5
|
import { normalizeSqliteNativeType } from "@prisma-next/target-sqlite/native-type-normalizer";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { sqliteCodecRegistry } from "@prisma-next/target-sqlite/codecs";
|
|
2
|
+
const sqliteAdapterDescriptorMeta = {
|
|
3
|
+
kind: "adapter",
|
|
4
|
+
familyId: "sql",
|
|
5
|
+
targetId: "sqlite",
|
|
6
|
+
id: "sqlite",
|
|
7
|
+
version: "0.0.1",
|
|
8
|
+
capabilities: { sql: {
|
|
9
|
+
orderBy: true,
|
|
10
|
+
limit: true,
|
|
11
|
+
lateral: false,
|
|
12
|
+
jsonAgg: true,
|
|
13
|
+
returning: true,
|
|
14
|
+
foreignKeys: true,
|
|
15
|
+
enums: false
|
|
16
|
+
} },
|
|
17
|
+
types: { codecTypes: {
|
|
18
|
+
codecDescriptors: Array.from(sqliteCodecRegistry.values()).filter((d) => d.renderOutputType === void 0),
|
|
19
|
+
import: {
|
|
20
|
+
package: "@prisma-next/adapter-sqlite/codec-types",
|
|
21
|
+
named: "CodecTypes",
|
|
22
|
+
alias: "SqliteTypes"
|
|
23
|
+
}
|
|
24
|
+
} }
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { sqliteAdapterDescriptorMeta as t };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=descriptor-meta-pA9TOBa7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor-meta-pA9TOBa7.mjs","names":[],"sources":["../src/core/descriptor-meta.ts"],"sourcesContent":["import { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\n\n// Exclude codecs that carry a renderOutputType: those emit named TypeScript types (e.g.\n// Char<N>, Varchar<N>) that are not listed in this adapter's typeImports and would\n// produce unresolvable references in contract.d.ts. All other codecs — including the\n// sql/ identity encoders (sql/int@1, sql/float@1) — are kept so execution codec\n// lookup works and DDL lowering has access to the full codec set.\nconst executionCodecDescriptors = Array.from(sqliteCodecRegistry.values()).filter(\n (d) => d.renderOutputType === undefined,\n);\n\nexport const sqliteAdapterDescriptorMeta = {\n kind: 'adapter',\n familyId: 'sql',\n targetId: 'sqlite',\n id: 'sqlite',\n version: '0.0.1',\n capabilities: {\n sql: {\n orderBy: true,\n limit: true,\n lateral: false,\n jsonAgg: true,\n returning: true,\n foreignKeys: true,\n enums: false,\n },\n },\n types: {\n codecTypes: {\n codecDescriptors: executionCodecDescriptors,\n import: {\n package: '@prisma-next/adapter-sqlite/codec-types',\n named: 'CodecTypes',\n alias: 'SqliteTypes',\n },\n },\n },\n} as const;\n"],"mappings":";AAWA,MAAa,8BAA8B;CACzC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EACZ,KAAK;EACH,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACX,aAAa;EACb,OAAO;CACT,EACF;CACA,OAAO,EACL,YAAY;EACV,kBAvB4B,MAAM,KAAK,oBAAoB,OAAO,CAAC,CAAC,CAAC,QACxE,MAAM,EAAE,qBAAqB,KAAA,CAsBR;EAClB,QAAQ;GACN,SAAS;GACT,OAAO;GACP,OAAO;EACT;CACF,EACF;AACF"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-
|
|
2
|
-
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-
|
|
1
|
+
import { n as sqliteRawCodecInferer, t as createSqliteAdapter } from "./adapter-eo1yL7gA.mjs";
|
|
2
|
+
import { t as sqliteAdapterDescriptorMeta } from "./descriptor-meta-pA9TOBa7.mjs";
|
|
3
3
|
import { sqliteCodecRegistry } from "@prisma-next/target-sqlite/codecs";
|
|
4
4
|
import { builtinGeneratorIds } from "@prisma-next/ids";
|
|
5
5
|
import { timestampNowRuntimeGenerator } from "@prisma-next/family-sql/runtime";
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/adapter-sqlite",
|
|
3
|
-
"version": "0.13.0-dev.
|
|
3
|
+
"version": "0.13.0-dev.36",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/cli": "0.13.0-dev.
|
|
9
|
-
"@prisma-next/contract": "0.13.0-dev.
|
|
10
|
-
"@prisma-next/contract-authoring": "0.13.0-dev.
|
|
11
|
-
"@prisma-next/errors": "0.13.0-dev.
|
|
12
|
-
"@prisma-next/framework-components": "0.13.0-dev.
|
|
13
|
-
"@prisma-next/family-sql": "0.13.0-dev.
|
|
14
|
-
"@prisma-next/ids": "0.13.0-dev.
|
|
15
|
-
"@prisma-next/sql-contract": "0.13.0-dev.
|
|
16
|
-
"@prisma-next/sql-contract-psl": "0.13.0-dev.
|
|
17
|
-
"@prisma-next/sql-contract-ts": "0.13.0-dev.
|
|
18
|
-
"@prisma-next/sql-operations": "0.13.0-dev.
|
|
19
|
-
"@prisma-next/sql-relational-core": "0.13.0-dev.
|
|
20
|
-
"@prisma-next/sql-runtime": "0.13.0-dev.
|
|
21
|
-
"@prisma-next/sql-schema-ir": "0.13.0-dev.
|
|
22
|
-
"@prisma-next/target-sqlite": "0.13.0-dev.
|
|
23
|
-
"@prisma-next/utils": "0.13.0-dev.
|
|
8
|
+
"@prisma-next/cli": "0.13.0-dev.36",
|
|
9
|
+
"@prisma-next/contract": "0.13.0-dev.36",
|
|
10
|
+
"@prisma-next/contract-authoring": "0.13.0-dev.36",
|
|
11
|
+
"@prisma-next/errors": "0.13.0-dev.36",
|
|
12
|
+
"@prisma-next/framework-components": "0.13.0-dev.36",
|
|
13
|
+
"@prisma-next/family-sql": "0.13.0-dev.36",
|
|
14
|
+
"@prisma-next/ids": "0.13.0-dev.36",
|
|
15
|
+
"@prisma-next/sql-contract": "0.13.0-dev.36",
|
|
16
|
+
"@prisma-next/sql-contract-psl": "0.13.0-dev.36",
|
|
17
|
+
"@prisma-next/sql-contract-ts": "0.13.0-dev.36",
|
|
18
|
+
"@prisma-next/sql-operations": "0.13.0-dev.36",
|
|
19
|
+
"@prisma-next/sql-relational-core": "0.13.0-dev.36",
|
|
20
|
+
"@prisma-next/sql-runtime": "0.13.0-dev.36",
|
|
21
|
+
"@prisma-next/sql-schema-ir": "0.13.0-dev.36",
|
|
22
|
+
"@prisma-next/target-sqlite": "0.13.0-dev.36",
|
|
23
|
+
"@prisma-next/utils": "0.13.0-dev.36",
|
|
24
24
|
"arktype": "^2.2.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@prisma-next/driver-sqlite": "0.13.0-dev.
|
|
28
|
-
"@prisma-next/migration-tools": "0.13.0-dev.
|
|
29
|
-
"@prisma-next/test-utils": "0.13.0-dev.
|
|
30
|
-
"@prisma-next/tsconfig": "0.13.0-dev.
|
|
31
|
-
"@prisma-next/tsdown": "0.13.0-dev.
|
|
27
|
+
"@prisma-next/driver-sqlite": "0.13.0-dev.36",
|
|
28
|
+
"@prisma-next/migration-tools": "0.13.0-dev.36",
|
|
29
|
+
"@prisma-next/test-utils": "0.13.0-dev.36",
|
|
30
|
+
"@prisma-next/tsconfig": "0.13.0-dev.36",
|
|
31
|
+
"@prisma-next/tsdown": "0.13.0-dev.36",
|
|
32
32
|
"pathe": "^2.0.3",
|
|
33
33
|
"tsdown": "0.22.1",
|
|
34
34
|
"typescript": "5.9.3",
|
package/src/core/adapter.ts
CHANGED
|
@@ -174,7 +174,7 @@ function renderLimitOffset(
|
|
|
174
174
|
function renderSelect(ast: SelectAst, contract: SqliteContract): string {
|
|
175
175
|
const distinctPrefix = ast.distinct ? 'DISTINCT ' : '';
|
|
176
176
|
const selectClause = `SELECT ${distinctPrefix}${renderProjection(ast.projection, contract)}`;
|
|
177
|
-
const fromClause = `FROM ${renderSource(ast.from, contract)}
|
|
177
|
+
const fromClause = ast.from !== undefined ? `FROM ${renderSource(ast.from, contract)}` : '';
|
|
178
178
|
|
|
179
179
|
const joinsClause = ast.joins?.length
|
|
180
180
|
? ast.joins.map((join) => renderJoin(join, contract)).join(' ')
|
|
@@ -261,8 +261,15 @@ function renderSource(source: AnyFromSource, contract: SqliteContract): string {
|
|
|
261
261
|
return renderTableSource(node, contract);
|
|
262
262
|
case 'derived-table-source':
|
|
263
263
|
return `(${renderSelect(node.query, contract)}) AS ${quoteIdentifier(node.alias)}`;
|
|
264
|
+
case 'function-source': {
|
|
265
|
+
const args = node.args.map((arg) => renderExpr(arg, contract)).join(', ');
|
|
266
|
+
const call = `${node.fn}(${args})`;
|
|
267
|
+
return node.alias !== undefined ? `${call} AS ${quoteIdentifier(node.alias)}` : call;
|
|
268
|
+
}
|
|
264
269
|
default:
|
|
265
|
-
throw new Error(
|
|
270
|
+
throw new Error(
|
|
271
|
+
`Unsupported source node kind: ${(node satisfies never as { kind: string }).kind}`,
|
|
272
|
+
);
|
|
266
273
|
}
|
|
267
274
|
}
|
|
268
275
|
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
import { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';
|
|
2
|
+
|
|
3
|
+
// Exclude codecs that carry a renderOutputType: those emit named TypeScript types (e.g.
|
|
4
|
+
// Char<N>, Varchar<N>) that are not listed in this adapter's typeImports and would
|
|
5
|
+
// produce unresolvable references in contract.d.ts. All other codecs — including the
|
|
6
|
+
// sql/ identity encoders (sql/int@1, sql/float@1) — are kept so execution codec
|
|
7
|
+
// lookup works and DDL lowering has access to the full codec set.
|
|
8
|
+
const executionCodecDescriptors = Array.from(sqliteCodecRegistry.values()).filter(
|
|
9
|
+
(d) => d.renderOutputType === undefined,
|
|
10
|
+
);
|
|
11
|
+
|
|
1
12
|
export const sqliteAdapterDescriptorMeta = {
|
|
2
13
|
kind: 'adapter',
|
|
3
14
|
familyId: 'sql',
|
|
@@ -17,6 +28,7 @@ export const sqliteAdapterDescriptorMeta = {
|
|
|
17
28
|
},
|
|
18
29
|
types: {
|
|
19
30
|
codecTypes: {
|
|
31
|
+
codecDescriptors: executionCodecDescriptors,
|
|
20
32
|
import: {
|
|
21
33
|
package: '@prisma-next/adapter-sqlite/codec-types',
|
|
22
34
|
named: 'CodecTypes',
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
//#region src/core/descriptor-meta.ts
|
|
2
|
-
const sqliteAdapterDescriptorMeta = {
|
|
3
|
-
kind: "adapter",
|
|
4
|
-
familyId: "sql",
|
|
5
|
-
targetId: "sqlite",
|
|
6
|
-
id: "sqlite",
|
|
7
|
-
version: "0.0.1",
|
|
8
|
-
capabilities: { sql: {
|
|
9
|
-
orderBy: true,
|
|
10
|
-
limit: true,
|
|
11
|
-
lateral: false,
|
|
12
|
-
jsonAgg: true,
|
|
13
|
-
returning: true,
|
|
14
|
-
foreignKeys: true,
|
|
15
|
-
enums: false
|
|
16
|
-
} },
|
|
17
|
-
types: { codecTypes: { import: {
|
|
18
|
-
package: "@prisma-next/adapter-sqlite/codec-types",
|
|
19
|
-
named: "CodecTypes",
|
|
20
|
-
alias: "SqliteTypes"
|
|
21
|
-
} } }
|
|
22
|
-
};
|
|
23
|
-
//#endregion
|
|
24
|
-
export { sqliteAdapterDescriptorMeta as t };
|
|
25
|
-
|
|
26
|
-
//# sourceMappingURL=descriptor-meta-Du5OgSxS.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"descriptor-meta-Du5OgSxS.mjs","names":[],"sources":["../src/core/descriptor-meta.ts"],"sourcesContent":["export const sqliteAdapterDescriptorMeta = {\n kind: 'adapter',\n familyId: 'sql',\n targetId: 'sqlite',\n id: 'sqlite',\n version: '0.0.1',\n capabilities: {\n sql: {\n orderBy: true,\n limit: true,\n lateral: false,\n jsonAgg: true,\n returning: true,\n foreignKeys: true,\n enums: false,\n },\n },\n types: {\n codecTypes: {\n import: {\n package: '@prisma-next/adapter-sqlite/codec-types',\n named: 'CodecTypes',\n alias: 'SqliteTypes',\n },\n },\n },\n} as const;\n"],"mappings":";AAAA,MAAa,8BAA8B;CACzC,MAAM;CACN,UAAU;CACV,UAAU;CACV,IAAI;CACJ,SAAS;CACT,cAAc,EACZ,KAAK;EACH,SAAS;EACT,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;EACX,aAAa;EACb,OAAO;CACT,EACF;CACA,OAAO,EACL,YAAY,EACV,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;CACT,EACF,EACF;AACF"}
|