@prisma-next/adapter-sqlite 0.12.0-dev.49 → 0.12.0-dev.50

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.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-CwTpH1kL.mjs","names":["renderColumn"],"sources":["../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/ddl-renderer.ts","../src/core/ledger-decode.ts","../src/core/marker-ledger.ts","../src/core/control-adapter.ts","../src/core/adapter.ts"],"sourcesContent":["import \"../constants-DWV9_o2Z.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 DdlColumn,\n DdlColumnDefaultVisitor,\n FunctionColumnDefault,\n LiteralColumnDefault,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n SqliteCreateTable,\n SqliteDdlNode,\n SqliteDdlVisitor,\n} from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral } from '@prisma-next/target-sqlite/sql-utils';\nimport type { SqliteLoweredStatement } from './types';\n\nclass SqliteDdlVisitorImpl implements SqliteDdlVisitor<string> {\n createTable(node: SqliteCreateTable): string {\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = node.table;\n const columnDefs = node.columns.map((column) => renderColumn(column)).join(',\\n ');\n return `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${columnDefs}\\n )`;\n }\n}\n\nconst defaultVisitor: DdlColumnDefaultVisitor<string> = {\n literal(node: LiteralColumnDefault): string {\n const { value } = node;\n if (typeof value === 'string') {\n return `DEFAULT '${escapeLiteral(value)}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `DEFAULT ${String(value)}`;\n }\n if (value === null) {\n return 'DEFAULT NULL';\n }\n return `DEFAULT '${JSON.stringify(value)}'`;\n },\n function(node: FunctionColumnDefault): string {\n if (node.expression === 'autoincrement()') {\n return '';\n }\n return `DEFAULT (${node.expression})`;\n },\n};\n\nfunction renderColumn(column: DdlColumn): string {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${column.name} ${column.type}`;\n }\n const parts = [column.name, column.type];\n if (column.notNull) {\n parts.push('NOT NULL');\n }\n if (column.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n const defaultClause = column.default ? column.default.accept(defaultVisitor) : '';\n if (defaultClause.length > 0) {\n parts.push(defaultClause);\n }\n return parts.join(' ');\n}\n\nexport function renderLoweredDdl(ast: SqliteDdlNode): SqliteLoweredStatement {\n const sql = ast.accept(new SqliteDdlVisitorImpl());\n return Object.freeze({ sql, params: Object.freeze([]) });\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 { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport {\n type AnyQueryAst,\n type LoweredStatement,\n RawExpr,\n} from '@prisma-next/sql-relational-core/ast';\nimport {\n createAstCodecRegistry,\n deriveParamMetadata,\n encodeParamsWithMetadata,\n} from '@prisma-next/sql-runtime';\nimport { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\nimport {\n datetime,\n integer,\n jsonText,\n sqliteTable,\n text,\n} from '@prisma-next/target-sqlite/contract-free';\n\nconst CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);\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 values = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error('SQLite control DML lowered to a bind parameter, which is unsupported');\n });\n const encoded = await encodeParamsWithMetadata(\n values,\n deriveParamMetadata(query),\n {},\n CONTROL_CODECS,\n );\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 = ControlDriverInstance<'sql', '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 {\n APP_SPACE_ID,\n type ControlDriverInstance,\n} from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport type {\n AnyQueryAst,\n DdlNode,\n LoweredStatement,\n LowererContext,\n MarkerReadResult,\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 { 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 { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\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 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 return renderLoweredDdl(ast);\n }\n return renderLoweredSql(ast, context.contract as SqliteContract);\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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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: ControlDriverInstance<'sql', '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","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 { SqliteControlAdapter } from './control-adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\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 controlAdapter = new SqliteControlAdapter();\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 return renderLoweredDdl(ast);\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-CwTpH1kL.mjs","names":["renderColumn"],"sources":["../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/ddl-renderer.ts","../src/core/ledger-decode.ts","../src/core/marker-ledger.ts","../src/core/control-adapter.ts","../src/core/adapter.ts"],"sourcesContent":["import \"../constants-DWV9_o2Z.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 DdlColumn,\n DdlColumnDefaultVisitor,\n FunctionColumnDefault,\n LiteralColumnDefault,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n SqliteCreateTable,\n SqliteDdlNode,\n SqliteDdlVisitor,\n} from '@prisma-next/target-sqlite/ddl';\nimport { escapeLiteral } from '@prisma-next/target-sqlite/sql-utils';\nimport type { SqliteLoweredStatement } from './types';\n\nclass SqliteDdlVisitorImpl implements SqliteDdlVisitor<string> {\n createTable(node: SqliteCreateTable): string {\n const ifNotExists = node.ifNotExists ? 'IF NOT EXISTS ' : '';\n const tableRef = node.table;\n const columnDefs = node.columns.map((column) => renderColumn(column)).join(',\\n ');\n return `CREATE TABLE ${ifNotExists}${tableRef} (\\n ${columnDefs}\\n )`;\n }\n}\n\nconst defaultVisitor: DdlColumnDefaultVisitor<string> = {\n literal(node: LiteralColumnDefault): string {\n const { value } = node;\n if (typeof value === 'string') {\n return `DEFAULT '${escapeLiteral(value)}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `DEFAULT ${String(value)}`;\n }\n if (value === null) {\n return 'DEFAULT NULL';\n }\n return `DEFAULT '${JSON.stringify(value)}'`;\n },\n function(node: FunctionColumnDefault): string {\n if (node.expression === 'autoincrement()') {\n return '';\n }\n return `DEFAULT (${node.expression})`;\n },\n};\n\nfunction renderColumn(column: DdlColumn): string {\n if (column.type.includes('AUTOINCREMENT')) {\n return `${column.name} ${column.type}`;\n }\n const parts = [column.name, column.type];\n if (column.notNull) {\n parts.push('NOT NULL');\n }\n if (column.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n const defaultClause = column.default ? column.default.accept(defaultVisitor) : '';\n if (defaultClause.length > 0) {\n parts.push(defaultClause);\n }\n return parts.join(' ');\n}\n\nexport function renderLoweredDdl(ast: SqliteDdlNode): SqliteLoweredStatement {\n const sql = ast.accept(new SqliteDdlVisitorImpl());\n return Object.freeze({ sql, params: Object.freeze([]) });\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 {\n createAstCodecRegistry,\n deriveParamMetadata,\n encodeParamsWithMetadata,\n} from '@prisma-next/sql-runtime';\nimport { SQLITE_DATETIME_CODEC_ID } from '@prisma-next/target-sqlite/codec-ids';\nimport { sqliteCodecRegistry } from '@prisma-next/target-sqlite/codecs';\nimport {\n datetime,\n integer,\n jsonText,\n sqliteTable,\n text,\n} from '@prisma-next/target-sqlite/contract-free';\n\nconst CONTROL_CODECS = createAstCodecRegistry(sqliteCodecRegistry);\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 values = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error('SQLite control DML lowered to a bind parameter, which is unsupported');\n });\n const encoded = await encodeParamsWithMetadata(\n values,\n deriveParamMetadata(query),\n {},\n CONTROL_CODECS,\n );\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 { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n DdlNode,\n LoweredStatement,\n LowererContext,\n MarkerReadResult,\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 { 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 { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\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 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 return renderLoweredDdl(ast);\n }\n return renderLoweredSql(ast, context.contract as SqliteContract);\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","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 { SqliteControlAdapter } from './control-adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\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 controlAdapter = new SqliteControlAdapter();\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 return renderLoweredDdl(ast);\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,4 +1,3 @@
1
- import { ControlDriverInstance } from "@prisma-next/framework-components/control";
2
1
  import { AnyQueryAst, DdlNode, LoweredStatement, LowererContext, MarkerReadResult } from "@prisma-next/sql-relational-core/ast";
3
2
  import { SqlEscapeError, escapeLiteral, quoteIdentifier } from "@prisma-next/target-sqlite/sql-utils";
4
3
  import { parseSqliteDefault, parseSqliteDefault as parseSqliteDefault$1 } from "@prisma-next/target-sqlite/default-normalizer";
@@ -6,6 +5,7 @@ import { normalizeSqliteNativeType, normalizeSqliteNativeType as normalizeSqlite
6
5
  import { SqlControlAdapterDescriptor } from "@prisma-next/family-sql/control";
7
6
  import { SqliteDdlNode } from "@prisma-next/target-sqlite/ddl";
8
7
  import { ContractMarkerRecord, LedgerEntryRecord } from "@prisma-next/contract/types";
8
+ import { SqlControlDriverInstance } from "@prisma-next/sql-contract/types";
9
9
  import { SqlControlAdapter } from "@prisma-next/family-sql/control-adapter";
10
10
  import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
11
11
 
@@ -31,33 +31,33 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
31
31
  * first so a fresh database (no marker table) returns `null` instead of a
32
32
  * "no such table" error.
33
33
  */
34
- readMarker(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string): Promise<ContractMarkerRecord | null>;
35
- readMarkerDiscriminated(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string): Promise<MarkerReadResult>;
34
+ readMarker(driver: SqlControlDriverInstance<'sqlite'>, space: string): Promise<ContractMarkerRecord | null>;
35
+ readMarkerDiscriminated(driver: SqlControlDriverInstance<'sqlite'>, space: string): Promise<MarkerReadResult>;
36
36
  /**
37
37
  * Reads every row from `_prisma_marker` and returns them keyed by
38
38
  * `space`. Mirrors the existence probe in {@link readMarker}: a
39
39
  * fresh database without the marker table returns an empty map.
40
40
  */
41
- readAllMarkers(driver: ControlDriverInstance<'sql', 'sqlite'>): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
41
+ readAllMarkers(driver: SqlControlDriverInstance<'sqlite'>): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
42
42
  private readAllMarkersResult;
43
43
  /**
44
44
  * Reads per-migration ledger rows from `_prisma_ledger` in apply order.
45
45
  * Probes `sqlite_master` first so a fresh database without the ledger
46
46
  * table returns `[]` instead of raising "no such table".
47
47
  */
48
- readLedger(driver: ControlDriverInstance<'sql', 'sqlite'>, space?: string): Promise<readonly LedgerEntryRecord[]>;
48
+ readLedger(driver: SqlControlDriverInstance<'sqlite'>, space?: string): Promise<readonly LedgerEntryRecord[]>;
49
49
  private readLedgerResult;
50
50
  /**
51
51
  * Stamps the initial marker row for `space` via the shared contract-free DML
52
52
  * builder, lowered through {@link lower} and executed on the driver. See the
53
53
  * `SqlControlAdapter.initMarker` contract.
54
54
  */
55
- insertMarker(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string, destination: {
55
+ insertMarker(driver: SqlControlDriverInstance<'sqlite'>, space: string, destination: {
56
56
  readonly storageHash: string;
57
57
  readonly profileHash: string;
58
58
  readonly invariants?: readonly string[];
59
59
  }): Promise<void>;
60
- initMarker(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string, destination: {
60
+ initMarker(driver: SqlControlDriverInstance<'sqlite'>, space: string, destination: {
61
61
  readonly storageHash: string;
62
62
  readonly profileHash: string;
63
63
  readonly invariants?: readonly string[];
@@ -66,7 +66,7 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
66
66
  * Compare-and-swap advance of the marker row for `space`. See the
67
67
  * `SqlControlAdapter.updateMarker` contract.
68
68
  */
69
- updateMarker(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string, expectedFrom: string, destination: {
69
+ updateMarker(driver: SqlControlDriverInstance<'sqlite'>, space: string, expectedFrom: string, destination: {
70
70
  readonly storageHash: string;
71
71
  readonly profileHash: string;
72
72
  readonly invariants?: readonly string[];
@@ -75,7 +75,7 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
75
75
  * Appends a ledger entry for `space`. See the
76
76
  * `SqlControlAdapter.writeLedgerEntry` contract.
77
77
  */
78
- writeLedgerEntry(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string, entry: {
78
+ writeLedgerEntry(driver: SqlControlDriverInstance<'sqlite'>, space: string, entry: {
79
79
  readonly edgeId: string;
80
80
  readonly from: string;
81
81
  readonly to: string;
@@ -84,7 +84,7 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
84
84
  readonly operations: readonly unknown[];
85
85
  }): Promise<void>;
86
86
  private readMarkerResult;
87
- introspect(driver: ControlDriverInstance<'sql', 'sqlite'>, _contract?: unknown): Promise<SqlSchemaIR>;
87
+ introspect(driver: SqlControlDriverInstance<'sqlite'>, _contract?: unknown): Promise<SqlSchemaIR>;
88
88
  }
89
89
  //#endregion
90
90
  //#region src/exports/control.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cA0Ga,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EAE5B,4BAAA,CAAA,YAAyC,OAAA;EAIzC,0BAAA,CAAA,YAAuC,OAAA;EAPd;;;;;;;;EAmBzB,KAAA,CAAM,GAAA,EAAK,WAAA,GAAc,aAAA,EAAe,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAehE;;;;;EAHL,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAKL,uBAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,WACC,OAAA,CAAQ,gBAAA;EAYA;;;;;EAFL,cAAA,CACJ,MAAA,EAAQ,qBAAA,oBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAAA,QAKjB,oBAAA;EAoIJ;;;;;EAlFJ,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAAA,QAKN,gBAAA;EAyNH;;;;;EA5KL,YAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAoBG,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EA/LoC;;;;EAkOjC,YAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAlNO;;;;EAgPJ,gBAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAAA,QAiBW,gBAAA;EA+BR,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cClbP,uBAAA,EAAyB,2BAA2B"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cAwGa,oBAAA,YAAgC,iBAAA;EAAA,SAClC,QAAA;EAAA,SACA,QAAA;EAAA,SAEA,gBAAA,SAAgB,oBAAA;EAAA,SAChB,mBAAA,SAAmB,2BAAA;EAE5B,4BAAA,CAAA,YAAyC,OAAA;EAIzC,0BAAA,CAAA,YAAuC,OAAA;EAPd;;;;;;;;EAmBzB,KAAA,CAAM,GAAA,EAAK,WAAA,GAAc,aAAA,EAAe,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAehE;;;;;EAHL,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAKL,uBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,WACC,OAAA,CAAQ,gBAAA;EAYA;;;;;EAFL,cAAA,CACJ,MAAA,EAAQ,wBAAA,aACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAAA,QAKjB,oBAAA;EAoIJ;;;;;EAlFJ,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAAA,QAKN,gBAAA;EAyNH;;;;;EA5KL,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAoBG,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EA/LoC;;;;EAkOjC,YAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAlNO;;;;EAgPJ,gBAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAAA,QAiBW,gBAAA;EA+BR,UAAA,CACJ,MAAA,EAAQ,wBAAA,YACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cChbP,uBAAA,EAAyB,2BAA2B"}
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-sqlite",
3
- "version": "0.12.0-dev.49",
3
+ "version": "0.12.0-dev.50",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "dependencies": {
8
- "@prisma-next/cli": "0.12.0-dev.49",
9
- "@prisma-next/contract": "0.12.0-dev.49",
10
- "@prisma-next/contract-authoring": "0.12.0-dev.49",
11
- "@prisma-next/errors": "0.12.0-dev.49",
12
- "@prisma-next/framework-components": "0.12.0-dev.49",
13
- "@prisma-next/family-sql": "0.12.0-dev.49",
14
- "@prisma-next/ids": "0.12.0-dev.49",
15
- "@prisma-next/sql-contract": "0.12.0-dev.49",
16
- "@prisma-next/sql-contract-psl": "0.12.0-dev.49",
17
- "@prisma-next/sql-contract-ts": "0.12.0-dev.49",
18
- "@prisma-next/sql-operations": "0.12.0-dev.49",
19
- "@prisma-next/sql-relational-core": "0.12.0-dev.49",
20
- "@prisma-next/sql-runtime": "0.12.0-dev.49",
21
- "@prisma-next/sql-schema-ir": "0.12.0-dev.49",
22
- "@prisma-next/target-sqlite": "0.12.0-dev.49",
23
- "@prisma-next/utils": "0.12.0-dev.49",
8
+ "@prisma-next/cli": "0.12.0-dev.50",
9
+ "@prisma-next/contract": "0.12.0-dev.50",
10
+ "@prisma-next/contract-authoring": "0.12.0-dev.50",
11
+ "@prisma-next/errors": "0.12.0-dev.50",
12
+ "@prisma-next/framework-components": "0.12.0-dev.50",
13
+ "@prisma-next/family-sql": "0.12.0-dev.50",
14
+ "@prisma-next/ids": "0.12.0-dev.50",
15
+ "@prisma-next/sql-contract": "0.12.0-dev.50",
16
+ "@prisma-next/sql-contract-psl": "0.12.0-dev.50",
17
+ "@prisma-next/sql-contract-ts": "0.12.0-dev.50",
18
+ "@prisma-next/sql-operations": "0.12.0-dev.50",
19
+ "@prisma-next/sql-relational-core": "0.12.0-dev.50",
20
+ "@prisma-next/sql-runtime": "0.12.0-dev.50",
21
+ "@prisma-next/sql-schema-ir": "0.12.0-dev.50",
22
+ "@prisma-next/target-sqlite": "0.12.0-dev.50",
23
+ "@prisma-next/utils": "0.12.0-dev.50",
24
24
  "arktype": "^2.2.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@prisma-next/driver-sqlite": "0.12.0-dev.49",
28
- "@prisma-next/migration-tools": "0.12.0-dev.49",
29
- "@prisma-next/test-utils": "0.12.0-dev.49",
30
- "@prisma-next/tsconfig": "0.12.0-dev.49",
31
- "@prisma-next/tsdown": "0.12.0-dev.49",
27
+ "@prisma-next/driver-sqlite": "0.12.0-dev.50",
28
+ "@prisma-next/migration-tools": "0.12.0-dev.50",
29
+ "@prisma-next/test-utils": "0.12.0-dev.50",
30
+ "@prisma-next/tsconfig": "0.12.0-dev.50",
31
+ "@prisma-next/tsdown": "0.12.0-dev.50",
32
32
  "pathe": "^2.0.3",
33
33
  "tsdown": "0.22.0",
34
34
  "typescript": "5.9.3",
@@ -2,11 +2,9 @@ import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contr
2
2
  import { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';
3
3
  import type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';
4
4
  import { parseContractMarkerRow } from '@prisma-next/family-sql/verify';
5
- import {
6
- APP_SPACE_ID,
7
- type ControlDriverInstance,
8
- } from '@prisma-next/framework-components/control';
5
+ import { APP_SPACE_ID } from '@prisma-next/framework-components/control';
9
6
  import { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';
7
+ import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';
10
8
  import type {
11
9
  AnyQueryAst,
12
10
  DdlNode,
@@ -140,7 +138,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
140
138
  * "no such table" error.
141
139
  */
142
140
  async readMarker(
143
- driver: ControlDriverInstance<'sql', 'sqlite'>,
141
+ driver: SqlControlDriverInstance<'sqlite'>,
144
142
  space: string,
145
143
  ): Promise<ContractMarkerRecord | null> {
146
144
  const result = await this.readMarkerDiscriminated(driver, space);
@@ -148,7 +146,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
148
146
  }
149
147
 
150
148
  async readMarkerDiscriminated(
151
- driver: ControlDriverInstance<'sql', 'sqlite'>,
149
+ driver: SqlControlDriverInstance<'sqlite'>,
152
150
  space: string,
153
151
  ): Promise<MarkerReadResult> {
154
152
  const markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };
@@ -161,14 +159,14 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
161
159
  * fresh database without the marker table returns an empty map.
162
160
  */
163
161
  async readAllMarkers(
164
- driver: ControlDriverInstance<'sql', 'sqlite'>,
162
+ driver: SqlControlDriverInstance<'sqlite'>,
165
163
  ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {
166
164
  const markerContext = { space: APP_SPACE_ID, markerLocation: SQLITE_MARKER_TABLE };
167
165
  return withMarkerReadErrorHandling(() => this.readAllMarkersResult(driver), markerContext);
168
166
  }
169
167
 
170
168
  private async readAllMarkersResult(
171
- driver: ControlDriverInstance<'sql', 'sqlite'>,
169
+ driver: SqlControlDriverInstance<'sqlite'>,
172
170
  ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {
173
171
  const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });
174
172
  const probe = sqliteCatalog
@@ -218,7 +216,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
218
216
  * table returns `[]` instead of raising "no such table".
219
217
  */
220
218
  async readLedger(
221
- driver: ControlDriverInstance<'sql', 'sqlite'>,
219
+ driver: SqlControlDriverInstance<'sqlite'>,
222
220
  space?: string,
223
221
  ): Promise<readonly LedgerEntryRecord[]> {
224
222
  const ledgerContext = { space: space ?? '*', markerLocation: SQLITE_LEDGER_TABLE };
@@ -226,7 +224,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
226
224
  }
227
225
 
228
226
  private async readLedgerResult(
229
- driver: ControlDriverInstance<'sql', 'sqlite'>,
227
+ driver: SqlControlDriverInstance<'sqlite'>,
230
228
  space: string | undefined,
231
229
  ): Promise<readonly LedgerEntryRecord[]> {
232
230
  const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });
@@ -271,7 +269,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
271
269
  * `SqlControlAdapter.initMarker` contract.
272
270
  */
273
271
  async insertMarker(
274
- driver: ControlDriverInstance<'sql', 'sqlite'>,
272
+ driver: SqlControlDriverInstance<'sqlite'>,
275
273
  space: string,
276
274
  destination: {
277
275
  readonly storageHash: string;
@@ -299,7 +297,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
299
297
  }
300
298
 
301
299
  async initMarker(
302
- driver: ControlDriverInstance<'sql', 'sqlite'>,
300
+ driver: SqlControlDriverInstance<'sqlite'>,
303
301
  space: string,
304
302
  destination: {
305
303
  readonly storageHash: string;
@@ -342,7 +340,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
342
340
  * `SqlControlAdapter.updateMarker` contract.
343
341
  */
344
342
  async updateMarker(
345
- driver: ControlDriverInstance<'sql', 'sqlite'>,
343
+ driver: SqlControlDriverInstance<'sqlite'>,
346
344
  space: string,
347
345
  expectedFrom: string,
348
346
  destination: {
@@ -381,7 +379,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
381
379
  * `SqlControlAdapter.writeLedgerEntry` contract.
382
380
  */
383
381
  async writeLedgerEntry(
384
- driver: ControlDriverInstance<'sql', 'sqlite'>,
382
+ driver: SqlControlDriverInstance<'sqlite'>,
385
383
  space: string,
386
384
  entry: {
387
385
  readonly edgeId: string;
@@ -408,7 +406,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
408
406
  );
409
407
  }
410
408
 
411
- private async readMarkerResult(driver: ControlDriverInstance<'sql', 'sqlite'>, space: string) {
409
+ private async readMarkerResult(driver: SqlControlDriverInstance<'sqlite'>, space: string) {
412
410
  const lower = (query: AnyQueryAst) => this.lower(query, { contract: undefined });
413
411
  const probe = sqliteCatalog
414
412
  .select(sqliteCatalog.name)
@@ -440,7 +438,7 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
440
438
  }
441
439
 
442
440
  async introspect(
443
- driver: ControlDriverInstance<'sql', 'sqlite'>,
441
+ driver: SqlControlDriverInstance<'sqlite'>,
444
442
  _contract?: unknown,
445
443
  ): Promise<SqlSchemaIR> {
446
444
  // Filter out runner-managed control tables (`_prisma_marker`,
@@ -1,4 +1,4 @@
1
- import type { ControlDriverInstance } from '@prisma-next/framework-components/control';
1
+ import type { SqlControlDriverInstance } from '@prisma-next/sql-contract/types';
2
2
  import {
3
3
  type AnyQueryAst,
4
4
  type LoweredStatement,
@@ -121,4 +121,4 @@ export function decodeSqliteMarkerRow(row: unknown): unknown {
121
121
  return { ...record, invariants: parsed };
122
122
  }
123
123
 
124
- export type SqliteMarkerWriteDriver = ControlDriverInstance<'sql', 'sqlite'>;
124
+ export type SqliteMarkerWriteDriver = SqlControlDriverInstance<'sqlite'>;