@prisma-next/adapter-sqlite 0.12.0-dev.21 → 0.12.0-dev.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control.d.mts +4 -4
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +11 -8
- package/dist/control.mjs.map +1 -1
- package/package.json +22 -22
- package/src/core/control-adapter.ts +25 -22
package/dist/control.d.mts
CHANGED
|
@@ -39,11 +39,11 @@ declare class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
|
|
|
39
39
|
*/
|
|
40
40
|
readAllMarkers(driver: ControlDriverInstance<'sql', 'sqlite'>): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
|
|
41
41
|
/**
|
|
42
|
-
* Reads per-migration ledger rows
|
|
43
|
-
*
|
|
44
|
-
*
|
|
42
|
+
* Reads per-migration ledger rows from `_prisma_ledger` in apply order.
|
|
43
|
+
* Probes `sqlite_master` first so a fresh database without the ledger
|
|
44
|
+
* table returns `[]` instead of raising "no such table".
|
|
45
45
|
*/
|
|
46
|
-
readLedger(driver: ControlDriverInstance<'sql', 'sqlite'>, space
|
|
46
|
+
readLedger(driver: ControlDriverInstance<'sql', 'sqlite'>, space?: string): Promise<readonly LedgerEntryRecord[]>;
|
|
47
47
|
introspect(driver: ControlDriverInstance<'sql', 'sqlite'>, _contract?: unknown): Promise<SqlSchemaIR>;
|
|
48
48
|
}
|
|
49
49
|
//#endregion
|
package/dist/control.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cA2Ga,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;EAqHD;;;;;EA9DJ,cAAA,CACJ,MAAA,EAAQ,qBAAA,oBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EA/FY;;;;;EA0JrC,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,
|
|
1
|
+
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-adapter.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;cA2Ga,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;EAqHD;;;;;EA9DJ,cAAA,CACJ,MAAA,EAAQ,qBAAA,oBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EA/FY;;;;;EA0JrC,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAsDd,UAAA,CACJ,MAAA,EAAQ,qBAAA,mBACR,SAAA,aACC,OAAA,CAAQ,WAAA;AAAA;;;cCvTP,uBAAA,EAAyB,2BAA2B"}
|
package/dist/control.mjs
CHANGED
|
@@ -140,17 +140,17 @@ var SqliteControlAdapter = class {
|
|
|
140
140
|
return rows;
|
|
141
141
|
}
|
|
142
142
|
/**
|
|
143
|
-
* Reads per-migration ledger rows
|
|
144
|
-
*
|
|
145
|
-
*
|
|
143
|
+
* Reads per-migration ledger rows from `_prisma_ledger` in apply order.
|
|
144
|
+
* Probes `sqlite_master` first so a fresh database without the ledger
|
|
145
|
+
* table returns `[]` instead of raising "no such table".
|
|
146
146
|
*/
|
|
147
147
|
async readLedger(driver, space) {
|
|
148
148
|
const ledgerContext = {
|
|
149
|
-
space,
|
|
149
|
+
space: space ?? "*",
|
|
150
150
|
markerLocation: SQLITE_LEDGER_TABLE
|
|
151
151
|
};
|
|
152
152
|
if ((await withMarkerReadErrorHandling(() => driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, ["_prisma_ledger"]), ledgerContext)).rows.length === 0) return [];
|
|
153
|
-
|
|
153
|
+
let sql = `SELECT
|
|
154
154
|
space,
|
|
155
155
|
migration_name,
|
|
156
156
|
migration_hash,
|
|
@@ -158,9 +158,12 @@ var SqliteControlAdapter = class {
|
|
|
158
158
|
destination_core_hash,
|
|
159
159
|
operations,
|
|
160
160
|
created_at
|
|
161
|
-
FROM _prisma_ledger
|
|
162
|
-
|
|
163
|
-
|
|
161
|
+
FROM _prisma_ledger`;
|
|
162
|
+
if (space !== void 0) sql += `
|
|
163
|
+
WHERE space = ?`;
|
|
164
|
+
sql += `
|
|
165
|
+
ORDER BY id`;
|
|
166
|
+
return (await withMarkerReadErrorHandling(() => driver.query(sql, space === void 0 ? void 0 : [space]), ledgerContext)).rows.map((row) => ({
|
|
164
167
|
space: row.space,
|
|
165
168
|
migrationName: row.migration_name,
|
|
166
169
|
migrationHash: row.migration_hash,
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["parseSqliteDefault","normalizeSqliteNativeType"],"sources":["../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/ledger-decode.ts","../src/core/control-adapter.ts","../src/core/control-mutation-defaults.ts","../src/exports/control.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","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 { 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} 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 { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\n/**\n * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the\n * driver returns `invariants` as a string. Decode before delegating to the\n * shared row schema, which expects `string[]`. A non-JSON value here is a\n * corrupt row and surfaces as `Invalid contract marker row: …` via the\n * typed-envelope wrapper.\n */\nfunction 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\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 markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return null;\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker\n WHERE space = ?`,\n [space],\n ),\n markerContext,\n );\n\n const row = result.rows[0];\n if (!row) return null;\n return parseMarkerRowSafely(\n row,\n (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)),\n markerContext,\n );\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 const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return new Map();\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n space,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker`,\n ),\n markerContext,\n );\n\n const rows = new Map<string, ContractMarkerRecord>();\n for (const row of result.rows) {\n rows.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 rows;\n }\n\n /**\n * Reads per-migration ledger rows for `space` from `_prisma_ledger` in\n * apply order. Probes `sqlite_master` first so a fresh database without\n * the ledger 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, markerLocation: SQLITE_LEDGER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_ledger',\n ]),\n ledgerContext,\n );\n if (exists.rows.length === 0) {\n return [];\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n migration_name: string;\n migration_hash: string;\n origin_core_hash: string | null;\n destination_core_hash: string;\n operations: unknown;\n created_at: Date | string;\n }>(\n `SELECT\n space,\n migration_name,\n migration_hash,\n origin_core_hash,\n destination_core_hash,\n operations,\n created_at\n FROM _prisma_ledger\n WHERE space = ?\n ORDER BY id`,\n [space],\n ),\n ledgerContext,\n );\n\n return result.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 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 type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { timestampNowControlDescriptor } from '@prisma-next/family-sql/control';\nimport type {\n ControlMutationDefaultEntry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport {\n builtinGeneratorRegistryMetadata,\n resolveBuiltinGeneratedColumnDescriptor,\n} from '@prisma-next/ids';\nimport type {\n DefaultFunctionLoweringContext,\n DefaultFunctionLoweringHandler,\n} from '@prisma-next/sql-contract-psl';\nimport {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\ntype LoweredDefaultResult = ReturnType<DefaultFunctionLoweringHandler>;\ntype ParsedDefaultFunctionCall = Parameters<DefaultFunctionLoweringHandler>[0]['call'];\n\nfunction invalidArgumentDiagnostic(input: {\n readonly context: DefaultFunctionLoweringContext;\n readonly span: ParsedDefaultFunctionCall['span'];\n readonly message: string;\n}): LoweredDefaultResult {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: input.message,\n sourceId: input.context.sourceId,\n span: input.span,\n },\n };\n}\n\nfunction executionGenerator(\n id: ExecutionMutationDefaultValue['id'],\n params?: Record<string, unknown>,\n): LoweredDefaultResult {\n return {\n ok: true,\n value: {\n kind: 'execution',\n generated: {\n kind: 'generator',\n id,\n ...(params ? { params } : {}),\n },\n },\n };\n}\n\nfunction expectNoArgs(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n readonly usage: string;\n}): LoweredDefaultResult | undefined {\n if (input.call.args.length === 0) {\n return undefined;\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: `Default function \"${input.call.name}\" does not accept arguments. Use ${input.usage}.`,\n });\n}\n\nfunction parseIntegerArgument(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!/^-?\\d+$/.test(trimmed)) {\n return undefined;\n }\n const value = Number(trimmed);\n if (!Number.isInteger(value)) {\n return undefined;\n }\n return value;\n}\n\nfunction parseStringLiteral(raw: string): string | undefined {\n const match = raw.trim().match(/^(['\"])(.*)\\1$/s);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction lowerAutoincrement(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`autoincrement()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'autoincrement()',\n },\n },\n };\n}\n\nfunction lowerNow(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`now()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'now()',\n },\n },\n };\n}\n\nfunction lowerUuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('uuidv4');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"uuid\" accepts at most one version argument: `uuid()`, `uuid(4)`, or `uuid(7)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 4) {\n return executionGenerator('uuidv4');\n }\n if (version === 7) {\n return executionGenerator('uuidv7');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message:\n 'Default function \"uuid\" supports only `uuid()`, `uuid(4)`, or `uuid(7)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerCuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message:\n 'Default function \"cuid()\" is not supported in SQL PSL provider v1. Use `cuid(2)` instead.',\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: 'Default function \"cuid\" accepts exactly one version argument: `cuid(2)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 2) {\n return executionGenerator('cuid2');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"cuid\" supports only `cuid(2)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerUlid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`ulid()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return executionGenerator('ulid');\n}\n\nfunction lowerNanoid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('nanoid');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"nanoid\" accepts at most one size argument: `nanoid()` or `nanoid(<2-255>)`.',\n });\n }\n const size = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (size !== undefined && size >= 2 && size <= 255) {\n return executionGenerator('nanoid', { size });\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"nanoid\" size argument must be an integer between 2 and 255.',\n });\n}\n\n/**\n * SQLite spellings that all denote the same wall-clock-now value. Anything\n * matching this set when passed through `dbgenerated(\"...\")` is rewritten\n * to the canonical `now()` form before entering the contract — symmetric\n * with `parseSqliteDefault` on the introspection side, so the verifier\n * compares canonical-vs-canonical and a contract using\n * `dbgenerated(\"CURRENT_TIMESTAMP\")` doesn't drift against the schema it\n * just produced.\n */\nconst NOW_SYNONYMS = new Set(['current_timestamp', \"datetime('now')\", 'datetime(\"now\")', 'now()']);\n\nfunction lowerDbgenerated(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"dbgenerated\" requires exactly one string argument: `dbgenerated(\"...\")`.',\n });\n }\n const rawExpression = parseStringLiteral(input.call.args[0]?.raw ?? '');\n if (rawExpression === undefined) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument must be a string literal.',\n });\n }\n const trimmed = rawExpression.trim();\n if (trimmed.length === 0) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument cannot be empty.',\n });\n }\n const expression = NOW_SYNONYMS.has(trimmed.toLowerCase()) ? 'now()' : trimmed;\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression,\n },\n },\n };\n}\n\nconst sqliteDefaultFunctionRegistryEntries = [\n ['autoincrement', { lower: lowerAutoincrement, usageSignatures: ['autoincrement()'] }],\n ['now', { lower: lowerNow, usageSignatures: ['now()'] }],\n ['uuid', { lower: lowerUuid, usageSignatures: ['uuid()', 'uuid(4)', 'uuid(7)'] }],\n ['cuid', { lower: lowerCuid, usageSignatures: ['cuid(2)'] }],\n ['ulid', { lower: lowerUlid, usageSignatures: ['ulid()'] }],\n ['nanoid', { lower: lowerNanoid, usageSignatures: ['nanoid()', 'nanoid(<2-255>)'] }],\n ['dbgenerated', { lower: lowerDbgenerated, usageSignatures: ['dbgenerated(\"...\")'] }],\n] satisfies ReadonlyArray<readonly [string, ControlMutationDefaultEntry]>;\n\nconst sqliteScalarTypeDescriptors = new Map<string, string>([\n ['String', SQLITE_TEXT_CODEC_ID],\n ['Int', SQLITE_INTEGER_CODEC_ID],\n ['BigInt', SQLITE_BIGINT_CODEC_ID],\n ['Float', SQLITE_REAL_CODEC_ID],\n ['Decimal', SQLITE_TEXT_CODEC_ID],\n ['DateTime', SQLITE_DATETIME_CODEC_ID],\n ['Json', SQLITE_JSON_CODEC_ID],\n ['Bytes', SQLITE_BLOB_CODEC_ID],\n]);\n\nexport function createSqliteDefaultFunctionRegistry(): ReadonlyMap<\n string,\n ControlMutationDefaultEntry\n> {\n return new Map(sqliteDefaultFunctionRegistryEntries);\n}\n\nexport function createSqliteMutationDefaultGeneratorDescriptors(): readonly MutationDefaultGeneratorDescriptor[] {\n return [\n ...builtinGeneratorRegistryMetadata.map(\n ({ id, applicableCodecIds }): MutationDefaultGeneratorDescriptor => ({\n id,\n applicableCodecIds,\n resolveGeneratedColumnDescriptor: ({ generated }) => {\n if (generated.kind !== 'generator' || generated.id !== id) {\n return undefined;\n }\n const descriptor = resolveBuiltinGeneratedColumnDescriptor({\n id,\n ...(generated.params ? { params: generated.params } : {}),\n });\n return {\n codecId: descriptor.type.codecId,\n nativeType: descriptor.type.nativeType,\n ...(descriptor.type.typeRef ? { typeRef: descriptor.type.typeRef } : {}),\n ...(descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}),\n };\n },\n }),\n ),\n timestampNowControlDescriptor(),\n ];\n}\n\nexport function createSqliteScalarTypeDescriptors(): ReadonlyMap<string, string> {\n return new Map(sqliteScalarTypeDescriptors);\n}\n","import type { SqlControlAdapterDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { SqliteControlAdapter } from '../core/control-adapter';\nimport {\n createSqliteDefaultFunctionRegistry,\n createSqliteMutationDefaultGeneratorDescriptors,\n createSqliteScalarTypeDescriptors,\n} from '../core/control-mutation-defaults';\nimport { sqliteAdapterDescriptorMeta } from '../core/descriptor-meta';\n\nconst sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'> = {\n ...sqliteAdapterDescriptorMeta,\n scalarTypeDescriptors: createSqliteScalarTypeDescriptors(),\n controlMutationDefaults: {\n defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),\n generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors(),\n },\n create(): SqlControlAdapter<'sqlite'> {\n return new SqliteControlAdapter();\n },\n};\n\nexport default sqliteAdapterDescriptor;\n\n// `parseSqliteDefault`, `normalizeSqliteNativeType`, `quoteIdentifier`,\n// `escapeLiteral`, and `SqlEscapeError` live target-side (one-way\n// `adapter → target` edge, matching Postgres). Re-exported from the\n// adapter so consumers — both internal and downstream — see the same\n// adapter-shaped surface across SQL targets.\nexport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nexport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nexport {\n escapeLiteral,\n quoteIdentifier,\n SqlEscapeError,\n} from '@prisma-next/target-sqlite/sql-utils';\n\n// `SqlControlAdapterDescriptor` is declared in two places in the codebase\n// (`family-sql/control-adapter` and `family-sql/migrations/types`); the\n// migrations-side declaration narrows `create()`'s return type to the base\n// `ControlAdapterInstance`, hiding `introspect`/`readMarker`. Until that's\n// reconciled upstream, downstream consumers (e2e harness, integration\n// tests) need direct access to the concrete class. Mirrors how Postgres'\n// own package tests import `PostgresControlAdapter` directly.\nexport { SqliteControlAdapter } from '../core/control-adapter';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":["parseSqliteDefault","normalizeSqliteNativeType"],"sources":["../../../../1-framework/3-tooling/migration/dist/exports/ledger-origin.mjs","../src/core/ledger-decode.ts","../src/core/control-adapter.ts","../src/core/control-mutation-defaults.ts","../src/exports/control.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","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 { 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} 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 { ifDefined } from '@prisma-next/utils/defined';\nimport { renderLoweredSql } from './adapter';\nimport { renderLoweredDdl } from './ddl-renderer';\nimport { coerceLedgerAppliedAt, operationCountFromStored } from './ledger-decode';\nimport type { SqliteContract } from './types';\n\nconst SQLITE_MARKER_TABLE = '_prisma_marker';\nconst SQLITE_LEDGER_TABLE = '_prisma_ledger';\n\n/**\n * SQLite stores arrays as JSON-encoded TEXT (no native array type), so the\n * driver returns `invariants` as a string. Decode before delegating to the\n * shared row schema, which expects `string[]`. A non-JSON value here is a\n * corrupt row and surfaces as `Invalid contract marker row: …` via the\n * typed-envelope wrapper.\n */\nfunction 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\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 markerContext = { space, markerLocation: SQLITE_MARKER_TABLE };\n const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return null;\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker\n WHERE space = ?`,\n [space],\n ),\n markerContext,\n );\n\n const row = result.rows[0];\n if (!row) return null;\n return parseMarkerRowSafely(\n row,\n (raw) => parseContractMarkerRow(decodeSqliteMarkerRow(raw)),\n markerContext,\n );\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 const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_marker',\n ]),\n markerContext,\n );\n if (exists.rows.length === 0) {\n return new Map();\n }\n\n const result = await withMarkerReadErrorHandling(\n () =>\n driver.query<{\n space: string;\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date | string;\n app_tag: string | null;\n meta: unknown | null;\n invariants: unknown;\n }>(\n `SELECT\n space,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n FROM _prisma_marker`,\n ),\n markerContext,\n );\n\n const rows = new Map<string, ContractMarkerRecord>();\n for (const row of result.rows) {\n rows.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 rows;\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 const exists = await withMarkerReadErrorHandling(\n () =>\n driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [\n '_prisma_ledger',\n ]),\n ledgerContext,\n );\n if (exists.rows.length === 0) {\n return [];\n }\n\n type LedgerQueryRow = {\n space: string;\n migration_name: string;\n migration_hash: string;\n origin_core_hash: string | null;\n destination_core_hash: string;\n operations: unknown;\n created_at: Date | string;\n };\n let sql = `SELECT\n space,\n migration_name,\n migration_hash,\n origin_core_hash,\n destination_core_hash,\n operations,\n created_at\n FROM _prisma_ledger`;\n if (space !== undefined) {\n sql += `\n WHERE space = ?`;\n }\n sql += `\n ORDER BY id`;\n\n const result = await withMarkerReadErrorHandling(\n () => driver.query<LedgerQueryRow>(sql, space === undefined ? undefined : [space]),\n ledgerContext,\n );\n\n return result.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 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 type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { timestampNowControlDescriptor } from '@prisma-next/family-sql/control';\nimport type {\n ControlMutationDefaultEntry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport {\n builtinGeneratorRegistryMetadata,\n resolveBuiltinGeneratedColumnDescriptor,\n} from '@prisma-next/ids';\nimport type {\n DefaultFunctionLoweringContext,\n DefaultFunctionLoweringHandler,\n} from '@prisma-next/sql-contract-psl';\nimport {\n SQLITE_BIGINT_CODEC_ID,\n SQLITE_BLOB_CODEC_ID,\n SQLITE_DATETIME_CODEC_ID,\n SQLITE_INTEGER_CODEC_ID,\n SQLITE_JSON_CODEC_ID,\n SQLITE_REAL_CODEC_ID,\n SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\ntype LoweredDefaultResult = ReturnType<DefaultFunctionLoweringHandler>;\ntype ParsedDefaultFunctionCall = Parameters<DefaultFunctionLoweringHandler>[0]['call'];\n\nfunction invalidArgumentDiagnostic(input: {\n readonly context: DefaultFunctionLoweringContext;\n readonly span: ParsedDefaultFunctionCall['span'];\n readonly message: string;\n}): LoweredDefaultResult {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: input.message,\n sourceId: input.context.sourceId,\n span: input.span,\n },\n };\n}\n\nfunction executionGenerator(\n id: ExecutionMutationDefaultValue['id'],\n params?: Record<string, unknown>,\n): LoweredDefaultResult {\n return {\n ok: true,\n value: {\n kind: 'execution',\n generated: {\n kind: 'generator',\n id,\n ...(params ? { params } : {}),\n },\n },\n };\n}\n\nfunction expectNoArgs(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n readonly usage: string;\n}): LoweredDefaultResult | undefined {\n if (input.call.args.length === 0) {\n return undefined;\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: `Default function \"${input.call.name}\" does not accept arguments. Use ${input.usage}.`,\n });\n}\n\nfunction parseIntegerArgument(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!/^-?\\d+$/.test(trimmed)) {\n return undefined;\n }\n const value = Number(trimmed);\n if (!Number.isInteger(value)) {\n return undefined;\n }\n return value;\n}\n\nfunction parseStringLiteral(raw: string): string | undefined {\n const match = raw.trim().match(/^(['\"])(.*)\\1$/s);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction lowerAutoincrement(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`autoincrement()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'autoincrement()',\n },\n },\n };\n}\n\nfunction lowerNow(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`now()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'now()',\n },\n },\n };\n}\n\nfunction lowerUuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('uuidv4');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"uuid\" accepts at most one version argument: `uuid()`, `uuid(4)`, or `uuid(7)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 4) {\n return executionGenerator('uuidv4');\n }\n if (version === 7) {\n return executionGenerator('uuidv7');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message:\n 'Default function \"uuid\" supports only `uuid()`, `uuid(4)`, or `uuid(7)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerCuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message:\n 'Default function \"cuid()\" is not supported in SQL PSL provider v1. Use `cuid(2)` instead.',\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: 'Default function \"cuid\" accepts exactly one version argument: `cuid(2)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 2) {\n return executionGenerator('cuid2');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"cuid\" supports only `cuid(2)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerUlid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`ulid()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return executionGenerator('ulid');\n}\n\nfunction lowerNanoid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('nanoid');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"nanoid\" accepts at most one size argument: `nanoid()` or `nanoid(<2-255>)`.',\n });\n }\n const size = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (size !== undefined && size >= 2 && size <= 255) {\n return executionGenerator('nanoid', { size });\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"nanoid\" size argument must be an integer between 2 and 255.',\n });\n}\n\n/**\n * SQLite spellings that all denote the same wall-clock-now value. Anything\n * matching this set when passed through `dbgenerated(\"...\")` is rewritten\n * to the canonical `now()` form before entering the contract — symmetric\n * with `parseSqliteDefault` on the introspection side, so the verifier\n * compares canonical-vs-canonical and a contract using\n * `dbgenerated(\"CURRENT_TIMESTAMP\")` doesn't drift against the schema it\n * just produced.\n */\nconst NOW_SYNONYMS = new Set(['current_timestamp', \"datetime('now')\", 'datetime(\"now\")', 'now()']);\n\nfunction lowerDbgenerated(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"dbgenerated\" requires exactly one string argument: `dbgenerated(\"...\")`.',\n });\n }\n const rawExpression = parseStringLiteral(input.call.args[0]?.raw ?? '');\n if (rawExpression === undefined) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument must be a string literal.',\n });\n }\n const trimmed = rawExpression.trim();\n if (trimmed.length === 0) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument cannot be empty.',\n });\n }\n const expression = NOW_SYNONYMS.has(trimmed.toLowerCase()) ? 'now()' : trimmed;\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression,\n },\n },\n };\n}\n\nconst sqliteDefaultFunctionRegistryEntries = [\n ['autoincrement', { lower: lowerAutoincrement, usageSignatures: ['autoincrement()'] }],\n ['now', { lower: lowerNow, usageSignatures: ['now()'] }],\n ['uuid', { lower: lowerUuid, usageSignatures: ['uuid()', 'uuid(4)', 'uuid(7)'] }],\n ['cuid', { lower: lowerCuid, usageSignatures: ['cuid(2)'] }],\n ['ulid', { lower: lowerUlid, usageSignatures: ['ulid()'] }],\n ['nanoid', { lower: lowerNanoid, usageSignatures: ['nanoid()', 'nanoid(<2-255>)'] }],\n ['dbgenerated', { lower: lowerDbgenerated, usageSignatures: ['dbgenerated(\"...\")'] }],\n] satisfies ReadonlyArray<readonly [string, ControlMutationDefaultEntry]>;\n\nconst sqliteScalarTypeDescriptors = new Map<string, string>([\n ['String', SQLITE_TEXT_CODEC_ID],\n ['Int', SQLITE_INTEGER_CODEC_ID],\n ['BigInt', SQLITE_BIGINT_CODEC_ID],\n ['Float', SQLITE_REAL_CODEC_ID],\n ['Decimal', SQLITE_TEXT_CODEC_ID],\n ['DateTime', SQLITE_DATETIME_CODEC_ID],\n ['Json', SQLITE_JSON_CODEC_ID],\n ['Bytes', SQLITE_BLOB_CODEC_ID],\n]);\n\nexport function createSqliteDefaultFunctionRegistry(): ReadonlyMap<\n string,\n ControlMutationDefaultEntry\n> {\n return new Map(sqliteDefaultFunctionRegistryEntries);\n}\n\nexport function createSqliteMutationDefaultGeneratorDescriptors(): readonly MutationDefaultGeneratorDescriptor[] {\n return [\n ...builtinGeneratorRegistryMetadata.map(\n ({ id, applicableCodecIds }): MutationDefaultGeneratorDescriptor => ({\n id,\n applicableCodecIds,\n resolveGeneratedColumnDescriptor: ({ generated }) => {\n if (generated.kind !== 'generator' || generated.id !== id) {\n return undefined;\n }\n const descriptor = resolveBuiltinGeneratedColumnDescriptor({\n id,\n ...(generated.params ? { params: generated.params } : {}),\n });\n return {\n codecId: descriptor.type.codecId,\n nativeType: descriptor.type.nativeType,\n ...(descriptor.type.typeRef ? { typeRef: descriptor.type.typeRef } : {}),\n ...(descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}),\n };\n },\n }),\n ),\n timestampNowControlDescriptor(),\n ];\n}\n\nexport function createSqliteScalarTypeDescriptors(): ReadonlyMap<string, string> {\n return new Map(sqliteScalarTypeDescriptors);\n}\n","import type { SqlControlAdapterDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { SqliteControlAdapter } from '../core/control-adapter';\nimport {\n createSqliteDefaultFunctionRegistry,\n createSqliteMutationDefaultGeneratorDescriptors,\n createSqliteScalarTypeDescriptors,\n} from '../core/control-mutation-defaults';\nimport { sqliteAdapterDescriptorMeta } from '../core/descriptor-meta';\n\nconst sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'> = {\n ...sqliteAdapterDescriptorMeta,\n scalarTypeDescriptors: createSqliteScalarTypeDescriptors(),\n controlMutationDefaults: {\n defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),\n generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors(),\n },\n create(): SqlControlAdapter<'sqlite'> {\n return new SqliteControlAdapter();\n },\n};\n\nexport default sqliteAdapterDescriptor;\n\n// `parseSqliteDefault`, `normalizeSqliteNativeType`, `quoteIdentifier`,\n// `escapeLiteral`, and `SqlEscapeError` live target-side (one-way\n// `adapter → target` edge, matching Postgres). Re-exported from the\n// adapter so consumers — both internal and downstream — see the same\n// adapter-shaped surface across SQL targets.\nexport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nexport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nexport {\n escapeLiteral,\n quoteIdentifier,\n SqlEscapeError,\n} from '@prisma-next/target-sqlite/sql-utils';\n\n// `SqlControlAdapterDescriptor` is declared in two places in the codebase\n// (`family-sql/control-adapter` and `family-sql/migrations/types`); the\n// migrations-side declaration narrows `create()`'s return type to the base\n// `ControlAdapterInstance`, hiding `introspect`/`readMarker`. Until that's\n// reconciled upstream, downstream consumers (e2e harness, integration\n// tests) need direct access to the concrete class. Mirrors how Postgres'\n// own package tests import `PostgresControlAdapter` directly.\nexport { SqliteControlAdapter } from '../core/control-adapter';\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/adapter-sqlite",
|
|
3
|
-
"version": "0.12.0-dev.
|
|
3
|
+
"version": "0.12.0-dev.22",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@prisma-next/cli": "0.12.0-dev.
|
|
9
|
-
"@prisma-next/contract": "0.12.0-dev.
|
|
10
|
-
"@prisma-next/contract-authoring": "0.12.0-dev.
|
|
11
|
-
"@prisma-next/errors": "0.12.0-dev.
|
|
12
|
-
"@prisma-next/framework-components": "0.12.0-dev.
|
|
13
|
-
"@prisma-next/family-sql": "0.12.0-dev.
|
|
14
|
-
"@prisma-next/ids": "0.12.0-dev.
|
|
15
|
-
"@prisma-next/sql-contract": "0.12.0-dev.
|
|
16
|
-
"@prisma-next/sql-contract-psl": "0.12.0-dev.
|
|
17
|
-
"@prisma-next/sql-contract-ts": "0.12.0-dev.
|
|
18
|
-
"@prisma-next/sql-operations": "0.12.0-dev.
|
|
19
|
-
"@prisma-next/sql-relational-core": "0.12.0-dev.
|
|
20
|
-
"@prisma-next/sql-runtime": "0.12.0-dev.
|
|
21
|
-
"@prisma-next/sql-schema-ir": "0.12.0-dev.
|
|
22
|
-
"@prisma-next/target-sqlite": "0.12.0-dev.
|
|
23
|
-
"@prisma-next/utils": "0.12.0-dev.
|
|
8
|
+
"@prisma-next/cli": "0.12.0-dev.22",
|
|
9
|
+
"@prisma-next/contract": "0.12.0-dev.22",
|
|
10
|
+
"@prisma-next/contract-authoring": "0.12.0-dev.22",
|
|
11
|
+
"@prisma-next/errors": "0.12.0-dev.22",
|
|
12
|
+
"@prisma-next/framework-components": "0.12.0-dev.22",
|
|
13
|
+
"@prisma-next/family-sql": "0.12.0-dev.22",
|
|
14
|
+
"@prisma-next/ids": "0.12.0-dev.22",
|
|
15
|
+
"@prisma-next/sql-contract": "0.12.0-dev.22",
|
|
16
|
+
"@prisma-next/sql-contract-psl": "0.12.0-dev.22",
|
|
17
|
+
"@prisma-next/sql-contract-ts": "0.12.0-dev.22",
|
|
18
|
+
"@prisma-next/sql-operations": "0.12.0-dev.22",
|
|
19
|
+
"@prisma-next/sql-relational-core": "0.12.0-dev.22",
|
|
20
|
+
"@prisma-next/sql-runtime": "0.12.0-dev.22",
|
|
21
|
+
"@prisma-next/sql-schema-ir": "0.12.0-dev.22",
|
|
22
|
+
"@prisma-next/target-sqlite": "0.12.0-dev.22",
|
|
23
|
+
"@prisma-next/utils": "0.12.0-dev.22",
|
|
24
24
|
"arktype": "^2.2.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@prisma-next/driver-sqlite": "0.12.0-dev.
|
|
28
|
-
"@prisma-next/migration-tools": "0.12.0-dev.
|
|
29
|
-
"@prisma-next/test-utils": "0.12.0-dev.
|
|
30
|
-
"@prisma-next/tsconfig": "0.12.0-dev.
|
|
31
|
-
"@prisma-next/tsdown": "0.12.0-dev.
|
|
27
|
+
"@prisma-next/driver-sqlite": "0.12.0-dev.22",
|
|
28
|
+
"@prisma-next/migration-tools": "0.12.0-dev.22",
|
|
29
|
+
"@prisma-next/test-utils": "0.12.0-dev.22",
|
|
30
|
+
"@prisma-next/tsconfig": "0.12.0-dev.22",
|
|
31
|
+
"@prisma-next/tsdown": "0.12.0-dev.22",
|
|
32
32
|
"pathe": "^2.0.3",
|
|
33
33
|
"tsdown": "0.22.0",
|
|
34
34
|
"typescript": "5.9.3",
|
|
@@ -255,15 +255,15 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
/**
|
|
258
|
-
* Reads per-migration ledger rows
|
|
259
|
-
*
|
|
260
|
-
*
|
|
258
|
+
* Reads per-migration ledger rows from `_prisma_ledger` in apply order.
|
|
259
|
+
* Probes `sqlite_master` first so a fresh database without the ledger
|
|
260
|
+
* table returns `[]` instead of raising "no such table".
|
|
261
261
|
*/
|
|
262
262
|
async readLedger(
|
|
263
263
|
driver: ControlDriverInstance<'sql', 'sqlite'>,
|
|
264
|
-
space
|
|
264
|
+
space?: string,
|
|
265
265
|
): Promise<readonly LedgerEntryRecord[]> {
|
|
266
|
-
const ledgerContext = { space, markerLocation: SQLITE_LEDGER_TABLE };
|
|
266
|
+
const ledgerContext = { space: space ?? '*', markerLocation: SQLITE_LEDGER_TABLE };
|
|
267
267
|
const exists = await withMarkerReadErrorHandling(
|
|
268
268
|
() =>
|
|
269
269
|
driver.query(`SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?`, [
|
|
@@ -275,18 +275,16 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
|
|
|
275
275
|
return [];
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
}>(
|
|
289
|
-
`SELECT
|
|
278
|
+
type LedgerQueryRow = {
|
|
279
|
+
space: string;
|
|
280
|
+
migration_name: string;
|
|
281
|
+
migration_hash: string;
|
|
282
|
+
origin_core_hash: string | null;
|
|
283
|
+
destination_core_hash: string;
|
|
284
|
+
operations: unknown;
|
|
285
|
+
created_at: Date | string;
|
|
286
|
+
};
|
|
287
|
+
let sql = `SELECT
|
|
290
288
|
space,
|
|
291
289
|
migration_name,
|
|
292
290
|
migration_hash,
|
|
@@ -294,11 +292,16 @@ export class SqliteControlAdapter implements SqlControlAdapter<'sqlite'> {
|
|
|
294
292
|
destination_core_hash,
|
|
295
293
|
operations,
|
|
296
294
|
created_at
|
|
297
|
-
FROM _prisma_ledger
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
295
|
+
FROM _prisma_ledger`;
|
|
296
|
+
if (space !== undefined) {
|
|
297
|
+
sql += `
|
|
298
|
+
WHERE space = ?`;
|
|
299
|
+
}
|
|
300
|
+
sql += `
|
|
301
|
+
ORDER BY id`;
|
|
302
|
+
|
|
303
|
+
const result = await withMarkerReadErrorHandling(
|
|
304
|
+
() => driver.query<LedgerQueryRow>(sql, space === undefined ? undefined : [space]),
|
|
302
305
|
ledgerContext,
|
|
303
306
|
);
|
|
304
307
|
|