@prisma-next/target-sqlite 0.16.0-dev.3 → 0.16.0-dev.31
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/codecs-DGgo--O0.d.mts.map +1 -1
- package/dist/codecs.mjs +25 -6
- package/dist/codecs.mjs.map +1 -1
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +10 -5
- package/dist/control.mjs.map +1 -1
- package/dist/errors-B1JPoWDh.mjs +38 -0
- package/dist/errors-B1JPoWDh.mjs.map +1 -0
- package/dist/migration.d.mts +1 -1
- package/dist/migration.mjs +2 -2
- package/dist/{op-factory-call-8pTnIHhR.mjs → op-factory-call-BkqsWGiy.mjs} +39 -13
- package/dist/op-factory-call-BkqsWGiy.mjs.map +1 -0
- package/dist/op-factory-call.d.mts.map +1 -1
- package/dist/op-factory-call.mjs +1 -1
- package/dist/{planner-D4B8Rugz.mjs → planner-Cdl1Lziz.mjs} +19 -15
- package/dist/planner-Cdl1Lziz.mjs.map +1 -0
- package/dist/{planner-produced-sqlite-migration-hyDa7QK-.mjs → planner-produced-sqlite-migration-BGcreGfL.mjs} +22 -12
- package/dist/planner-produced-sqlite-migration-BGcreGfL.mjs.map +1 -0
- package/dist/{planner-produced-sqlite-migration-C9k0q8Il.d.mts → planner-produced-sqlite-migration-fd_Jw-mL.d.mts} +3 -3
- package/dist/planner-produced-sqlite-migration-fd_Jw-mL.d.mts.map +1 -0
- package/dist/planner-produced-sqlite-migration.d.mts +1 -1
- package/dist/planner-produced-sqlite-migration.mjs +1 -1
- package/dist/planner.d.mts +7 -1
- package/dist/planner.d.mts.map +1 -1
- package/dist/planner.mjs +1 -1
- package/dist/{render-ops-BDW2tUeR.mjs → render-ops-BAw6MQWl.mjs} +7 -2
- package/dist/render-ops-BAw6MQWl.mjs.map +1 -0
- package/dist/render-ops.d.mts.map +1 -1
- package/dist/render-ops.mjs +1 -1
- package/dist/runtime.mjs +1 -1
- package/dist/{sql-utils-CV8Bdgtc.mjs → sql-utils-BMteAbKH.mjs} +15 -15
- package/dist/sql-utils-BMteAbKH.mjs.map +1 -0
- package/dist/sql-utils.d.mts +1 -6
- package/dist/sql-utils.d.mts.map +1 -1
- package/dist/sql-utils.mjs +2 -2
- package/dist/{sqlite-contract-view-B8qeCczc.mjs → sqlite-contract-view-DthhfCpb.mjs} +3 -2
- package/dist/sqlite-contract-view-DthhfCpb.mjs.map +1 -0
- package/dist/{sqlite-migration-BbSrmBAa.d.mts → sqlite-migration-CBXynqeE.d.mts} +4 -3
- package/dist/sqlite-migration-CBXynqeE.d.mts.map +1 -0
- package/dist/{sqlite-migration-BcFf2OFa.mjs → sqlite-migration-DrZIdg3i.mjs} +7 -36
- package/dist/sqlite-migration-DrZIdg3i.mjs.map +1 -0
- package/package.json +18 -18
- package/src/core/codecs.ts +33 -6
- package/src/core/control-target.ts +3 -1
- package/src/core/errors.ts +24 -0
- package/src/core/migrations/column-ddl-rendering.ts +4 -2
- package/src/core/migrations/issue-planner.ts +5 -6
- package/src/core/migrations/op-factory-call.ts +41 -8
- package/src/core/migrations/planner-ddl-builders.ts +10 -3
- package/src/core/migrations/planner-produced-sqlite-migration.ts +4 -0
- package/src/core/migrations/planner-strategies.ts +2 -3
- package/src/core/migrations/planner.ts +8 -0
- package/src/core/migrations/render-ops.ts +4 -1
- package/src/core/migrations/render-typescript.ts +20 -8
- package/src/core/migrations/runner.ts +6 -2
- package/src/core/migrations/sqlite-migration.ts +3 -2
- package/src/core/sql-utils.ts +10 -21
- package/src/core/sqlite-unbound-database.ts +4 -1
- package/src/exports/sql-utils.ts +1 -1
- package/dist/op-factory-call-8pTnIHhR.mjs.map +0 -1
- package/dist/planner-D4B8Rugz.mjs.map +0 -1
- package/dist/planner-produced-sqlite-migration-C9k0q8Il.d.mts.map +0 -1
- package/dist/planner-produced-sqlite-migration-hyDa7QK-.mjs.map +0 -1
- package/dist/render-ops-BDW2tUeR.mjs.map +0 -1
- package/dist/sql-utils-CV8Bdgtc.mjs.map +0 -1
- package/dist/sqlite-contract-view-B8qeCczc.mjs.map +0 -1
- package/dist/sqlite-migration-BbSrmBAa.d.mts.map +0 -1
- package/dist/sqlite-migration-BcFf2OFa.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codecs-DGgo--O0.d.mts","names":[],"sources":["../src/core/codec-helpers.ts","../src/core/codecs.ts","../src/core/registry.ts"],"mappings":";;;;;;;;KAIY;YAKI,cAAc;aACjB;;;
|
|
1
|
+
{"version":3,"file":"codecs-DGgo--O0.d.mts","names":[],"sources":["../src/core/codec-helpers.ts","../src/core/codecs.ts","../src/core/registry.ts"],"mappings":";;;;;;;;KAIY;YAKI,cAAc;aACjB;;;cCgCA,wBAAwB,iBAC5B;EAKD,OAAO,eAAe,MAAM,mBAAmB;EAG/C,OAAO,cAAc,MAAM,mBAAmB;EAGpD,WAAW,gBAAgB;EAG3B,WAAW,MAAM;;cAKN,6BAA6B;WACtB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,0EAAgB,WAAA;cAMhB,2BAA2B,iBAC/B;EAKD,OAAO,eAAe,MAAM,mBAAmB;EAG/C,OAAO,cAAc,MAAM,mBAAmB;EAGpD,WAAW,gBAAgB;EAG3B,WAAW,MAAM;;cAKN,gCAAgC;WACzB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,6EAAmB,WAAA;cAMnB,wBAAwB,iBAC5B;EAKD,OAAO,eAAe,MAAM,mBAAmB;EAG/C,OAAO,cAAc,MAAM,mBAAmB;EAGpD,WAAW,gBAAgB;EAG3B,WAAW,MAAM;;cAKN,6BAA6B;WACtB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,0EAAgB,WAAA;cAMhB,wBAAwB,iBAC5B,6CAEP,YACA;EAEM,OAAO,OAAO,YAAY,MAAM,mBAAmB,QAAQ;EAG3D,OAAO,MAAM,YAAY,MAAM,mBAAmB,QAAQ;EAGhE,WAAW,OAAO,aAAa;EAG/B,WAAW,MAAM,YAAY;;cAclB,6BAA6B;WACtB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,0EAAgB,WAAA;cAMhB,4BAA4B,iBAChC,kEAGP;UAGQ;EAWF,OAAO,OAAO,MAAM,MAAM,mBAAmB;EAG7C,OAAO,cAAc,MAAM,mBAAmB,QAAQ;EAG5D,WAAW,OAAO,OAAO;EAGzB,WAAW,MAAM,YAAY;;cAYlB,iCAAiC;WAC1B;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,8EAAoB,WAAA;cAMpB,wBAAwB,iBAC5B,sDAEE,WACT;EAEM,OAAO,OAAO,WAAW,MAAM,mBAAmB;EAGlD,OAAO,eAAe,WAAW,MAAM,mBAAmB,QAAQ;EAGxE,WAAW,OAAO,YAAY;EAG9B,WAAW,MAAM,YAAY;;cAKlB,6BAA6B;WACtB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,0EAAgB,WAAA;cAMhB,0BAA0B,iBAC9B;EAKD,OAAO,eAAe,MAAM,mBAAmB;EAG/C,OAAO,uBAAuB,MAAM,mBAAmB;EAG7D,WAAW,gBAAgB;EAW3B,WAAW,MAAM;;cAmBN,+BAA+B;WACxB;WACA;WACA;WACA,8CAAY;EACrB,YAAY,KAAK,yBAAyB;;cAOxC,4EAAkB,WAAA;;;;;;;;cCvVlB,qBAAqB"}
|
package/dist/codecs.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { a as SQLITE_JSON_CODEC_ID, i as SQLITE_INTEGER_CODEC_ID, n as SQLITE_BLOB_CODEC_ID, o as SQLITE_REAL_CODEC_ID, r as SQLITE_DATETIME_CODEC_ID, s as SQLITE_TEXT_CODEC_ID, t as SQLITE_BIGINT_CODEC_ID } from "./codec-ids-DSU7S2Li.mjs";
|
|
2
|
+
import { n as sqliteError } from "./errors-B1JPoWDh.mjs";
|
|
2
3
|
import { sqlCharDescriptor, sqlFloatDescriptor, sqlIntDescriptor, sqlVarcharDescriptor } from "@prisma-next/sql-relational-core/ast";
|
|
3
4
|
import { CodecDescriptorImpl, CodecImpl, column, voidParamsSchema } from "@prisma-next/framework-components/codec";
|
|
4
5
|
import { buildCodecDescriptorRegistry } from "@prisma-next/sql-relational-core/codec-descriptor-registry";
|
|
@@ -101,7 +102,10 @@ var SqliteBlobCodec = class extends CodecImpl {
|
|
|
101
102
|
return Buffer.from(value).toString("base64");
|
|
102
103
|
}
|
|
103
104
|
decodeJson(json) {
|
|
104
|
-
if (typeof json !== "string") throw
|
|
105
|
+
if (typeof json !== "string") throw sqliteError("RUNTIME.DECODE_FAILED", "sqlite/blob@1 contract value must be a base64 string", { meta: {
|
|
106
|
+
codecId: SQLITE_BLOB_CODEC_ID,
|
|
107
|
+
received: typeof json
|
|
108
|
+
} });
|
|
105
109
|
return new Uint8Array(Buffer.from(json, "base64"));
|
|
106
110
|
}
|
|
107
111
|
};
|
|
@@ -119,7 +123,10 @@ const sqliteBlobColumn = () => column(sqliteBlobDescriptor.factory(), sqliteBlob
|
|
|
119
123
|
var SqliteDatetimeCodec = class extends CodecImpl {
|
|
120
124
|
parseDate(value) {
|
|
121
125
|
const date = new Date(value);
|
|
122
|
-
if (Number.isNaN(date.getTime())) throw
|
|
126
|
+
if (Number.isNaN(date.getTime())) throw sqliteError("RUNTIME.DECODE_FAILED", `sqlite/datetime@1 value must be a valid ISO-8601 string: ${value}`, { meta: {
|
|
127
|
+
codecId: SQLITE_DATETIME_CODEC_ID,
|
|
128
|
+
received: value
|
|
129
|
+
} });
|
|
123
130
|
return date;
|
|
124
131
|
}
|
|
125
132
|
async encode(value, _ctx) {
|
|
@@ -132,7 +139,10 @@ var SqliteDatetimeCodec = class extends CodecImpl {
|
|
|
132
139
|
return value.toISOString();
|
|
133
140
|
}
|
|
134
141
|
decodeJson(json) {
|
|
135
|
-
if (typeof json !== "string") throw
|
|
142
|
+
if (typeof json !== "string") throw sqliteError("RUNTIME.DECODE_FAILED", "sqlite/datetime@1 contract value must be an ISO-8601 string", { meta: {
|
|
143
|
+
codecId: SQLITE_DATETIME_CODEC_ID,
|
|
144
|
+
received: typeof json
|
|
145
|
+
} });
|
|
136
146
|
return this.parseDate(json);
|
|
137
147
|
}
|
|
138
148
|
};
|
|
@@ -181,12 +191,21 @@ var SqliteBigintCodec = class extends CodecImpl {
|
|
|
181
191
|
}
|
|
182
192
|
encodeJson(value) {
|
|
183
193
|
const number = Number(value);
|
|
184
|
-
if (!Number.isSafeInteger(number)) throw
|
|
194
|
+
if (!Number.isSafeInteger(number)) throw sqliteError("RUNTIME.ENCODE_FAILED", "sqlite/bigint@1 database JSON value must be a safe integer", { meta: {
|
|
195
|
+
codecId: SQLITE_BIGINT_CODEC_ID,
|
|
196
|
+
received: String(value)
|
|
197
|
+
} });
|
|
185
198
|
return number;
|
|
186
199
|
}
|
|
187
200
|
decodeJson(json) {
|
|
188
|
-
if (typeof json !== "number") throw
|
|
189
|
-
|
|
201
|
+
if (typeof json !== "number") throw sqliteError("RUNTIME.DECODE_FAILED", "sqlite/bigint@1 database JSON value must be a number", { meta: {
|
|
202
|
+
codecId: SQLITE_BIGINT_CODEC_ID,
|
|
203
|
+
received: typeof json
|
|
204
|
+
} });
|
|
205
|
+
if (!Number.isSafeInteger(json)) throw sqliteError("RUNTIME.DECODE_FAILED", "sqlite/bigint@1 database JSON value must be a safe integer", { meta: {
|
|
206
|
+
codecId: SQLITE_BIGINT_CODEC_ID,
|
|
207
|
+
received: json
|
|
208
|
+
} });
|
|
190
209
|
return BigInt(json);
|
|
191
210
|
}
|
|
192
211
|
};
|
package/dist/codecs.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codecs.mjs","names":[],"sources":["../src/core/codecs.ts","../src/core/registry.ts"],"sourcesContent":["/**\n * Native SQLite target codecs (TML-2357). Mirrors the Postgres codec class form in `packages/3-targets/3-targets/postgres/src/core/codecs.ts`.\n *\n * Each codec ships as three artifacts:\n *\n * 1. A `SqliteXCodec` class extending {@link CodecImpl} that wraps the encode/decode/encodeJson/decodeJson conversions inline. SQLite's runtime conversions are simple enough that there is no shared helper module; the class bodies are the single source of truth. 2. A `SqliteXDescriptor` class extending {@link CodecDescriptorImpl} declaring the codec id, traits, target types, and params schema. SQLite codecs do not carry\n * `meta` (no per-target native-type meta today) and are all non-parameterized. 3. A per-codec column helper (`sqliteXColumn`) that calls `descriptor.factory()` directly and packages the result into a {@link ColumnSpec} via the framework {@link column} packager. The helper is tied to its descriptor with `satisfies ColumnHelperFor` + `ColumnHelperForStrict` (every SQLite codec's resolved type is well-defined).\n *\n * After TML-2357 this is the canonical source of SQLite codec metadata and runtime behaviour — the legacy `mkCodec` / `defineCodec` carriers (and the parallel `byScalar` / `codecDescriptorDefinitions` collection exports) retired with the deletion sweep.\n *\n * Audit: every SQLite codec is non-parameterized and parameter-stateless; `factory()` takes no params (`P = void`) and returns a fresh codec constructed solely from `this`.\n */\n\nimport type { JsonValue } from '@prisma-next/contract/types';\nimport {\n type AnyCodecDescriptor,\n type CodecCallContext,\n CodecDescriptorImpl,\n CodecImpl,\n type CodecInstanceContext,\n type ColumnHelperFor,\n type ColumnHelperForStrict,\n column,\n voidParamsSchema,\n} from '@prisma-next/framework-components/codec';\nimport {\n sqlCharDescriptor,\n sqlFloatDescriptor,\n sqlIntDescriptor,\n sqlVarcharDescriptor,\n} from '@prisma-next/sql-relational-core/ast';\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 './codec-ids';\n\nexport class SqliteTextCodec extends CodecImpl<\n typeof SQLITE_TEXT_CODEC_ID,\n readonly ['equality', 'order', 'textual'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class SqliteTextDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_TEXT_CODEC_ID;\n override readonly traits = ['equality', 'order', 'textual'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteTextCodec {\n return () => new SqliteTextCodec(this);\n }\n}\n\nexport const sqliteTextDescriptor = new SqliteTextDescriptor();\n\nexport const sqliteTextColumn = () =>\n column(sqliteTextDescriptor.factory(), sqliteTextDescriptor.codecId, undefined, 'text');\n\nsqliteTextColumn satisfies ColumnHelperFor<SqliteTextDescriptor>;\nsqliteTextColumn satisfies ColumnHelperForStrict<SqliteTextDescriptor>;\n\nexport class SqliteIntegerCodec extends CodecImpl<\n typeof SQLITE_INTEGER_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class SqliteIntegerDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_INTEGER_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['integer'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteIntegerCodec {\n return () => new SqliteIntegerCodec(this);\n }\n}\n\nexport const sqliteIntegerDescriptor = new SqliteIntegerDescriptor();\n\nexport const sqliteIntegerColumn = () =>\n column(sqliteIntegerDescriptor.factory(), sqliteIntegerDescriptor.codecId, undefined, 'integer');\n\nsqliteIntegerColumn satisfies ColumnHelperFor<SqliteIntegerDescriptor>;\nsqliteIntegerColumn satisfies ColumnHelperForStrict<SqliteIntegerDescriptor>;\n\nexport class SqliteRealCodec extends CodecImpl<\n typeof SQLITE_REAL_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class SqliteRealDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_REAL_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['real'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteRealCodec {\n return () => new SqliteRealCodec(this);\n }\n}\n\nexport const sqliteRealDescriptor = new SqliteRealDescriptor();\n\nexport const sqliteRealColumn = () =>\n column(sqliteRealDescriptor.factory(), sqliteRealDescriptor.codecId, undefined, 'real');\n\nsqliteRealColumn satisfies ColumnHelperFor<SqliteRealDescriptor>;\nsqliteRealColumn satisfies ColumnHelperForStrict<SqliteRealDescriptor>;\n\nexport class SqliteBlobCodec extends CodecImpl<\n typeof SQLITE_BLOB_CODEC_ID,\n readonly ['equality'],\n Uint8Array,\n Uint8Array\n> {\n async encode(value: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n return value;\n }\n async decode(wire: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n return wire;\n }\n encodeJson(value: Uint8Array): JsonValue {\n return Buffer.from(value).toString('base64');\n }\n decodeJson(json: JsonValue): Uint8Array {\n if (typeof json !== 'string') {\n throw new TypeError('sqlite/blob@1 contract value must be a base64 string');\n }\n return new Uint8Array(Buffer.from(json, 'base64'));\n }\n}\n\nexport class SqliteBlobDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_BLOB_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['blob'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteBlobCodec {\n return () => new SqliteBlobCodec(this);\n }\n}\n\nexport const sqliteBlobDescriptor = new SqliteBlobDescriptor();\n\nexport const sqliteBlobColumn = () =>\n column(sqliteBlobDescriptor.factory(), sqliteBlobDescriptor.codecId, undefined, 'blob');\n\nsqliteBlobColumn satisfies ColumnHelperFor<SqliteBlobDescriptor>;\nsqliteBlobColumn satisfies ColumnHelperForStrict<SqliteBlobDescriptor>;\n\nexport class SqliteDatetimeCodec extends CodecImpl<\n typeof SQLITE_DATETIME_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n Date\n> {\n // Reject `Invalid Date` (NaN-time) at every decode ingress so consumers never receive a Date object whose downstream operations silently produce NaN. Mirrors the stricter ISO-8601 validation on the postgres timestamp helpers.\n private parseDate(value: string): Date {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new TypeError(`sqlite/datetime@1 value must be a valid ISO-8601 string: ${value}`);\n }\n return date;\n }\n async encode(value: Date, _ctx: CodecCallContext): Promise<string> {\n return value.toISOString();\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<Date> {\n return this.parseDate(wire);\n }\n encodeJson(value: Date): JsonValue {\n return value.toISOString();\n }\n decodeJson(json: JsonValue): Date {\n if (typeof json !== 'string') {\n throw new TypeError('sqlite/datetime@1 contract value must be an ISO-8601 string');\n }\n return this.parseDate(json);\n }\n}\n\nexport class SqliteDatetimeDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_DATETIME_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteDatetimeCodec {\n return () => new SqliteDatetimeCodec(this);\n }\n}\n\nexport const sqliteDatetimeDescriptor = new SqliteDatetimeDescriptor();\n\nexport const sqliteDatetimeColumn = () =>\n column(sqliteDatetimeDescriptor.factory(), sqliteDatetimeDescriptor.codecId, undefined, 'text');\n\nsqliteDatetimeColumn satisfies ColumnHelperFor<SqliteDatetimeDescriptor>;\nsqliteDatetimeColumn satisfies ColumnHelperForStrict<SqliteDatetimeDescriptor>;\n\nexport class SqliteJsonCodec extends CodecImpl<\n typeof SQLITE_JSON_CODEC_ID,\n readonly ['equality'],\n string | JsonValue,\n JsonValue\n> {\n async encode(value: JsonValue, _ctx: CodecCallContext): Promise<string> {\n return JSON.stringify(value);\n }\n async decode(wire: string | JsonValue, _ctx: CodecCallContext): Promise<JsonValue> {\n return typeof wire === 'string' ? (JSON.parse(wire) as JsonValue) : wire;\n }\n encodeJson(value: JsonValue): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): JsonValue {\n return json;\n }\n}\n\nexport class SqliteJsonDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_JSON_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteJsonCodec {\n return () => new SqliteJsonCodec(this);\n }\n}\n\nexport const sqliteJsonDescriptor = new SqliteJsonDescriptor();\n\nexport const sqliteJsonColumn = () =>\n column(sqliteJsonDescriptor.factory(), sqliteJsonDescriptor.codecId, undefined, 'text');\n\nsqliteJsonColumn satisfies ColumnHelperFor<SqliteJsonDescriptor>;\nsqliteJsonColumn satisfies ColumnHelperForStrict<SqliteJsonDescriptor>;\n\nexport class SqliteBigintCodec extends CodecImpl<\n typeof SQLITE_BIGINT_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number | bigint,\n bigint\n> {\n async encode(value: bigint, _ctx: CodecCallContext): Promise<number | bigint> {\n return value;\n }\n async decode(wire: number | bigint, _ctx: CodecCallContext): Promise<bigint> {\n return BigInt(wire);\n }\n encodeJson(value: bigint): JsonValue {\n const number = Number(value);\n if (!Number.isSafeInteger(number)) {\n throw new TypeError('sqlite/bigint@1 database JSON value must be a safe integer');\n }\n return number;\n }\n decodeJson(json: JsonValue): bigint {\n if (typeof json !== 'number') {\n throw new TypeError('sqlite/bigint@1 database JSON value must be a number');\n }\n if (!Number.isSafeInteger(json)) {\n throw new TypeError('sqlite/bigint@1 database JSON value must be a safe integer');\n }\n return BigInt(json);\n }\n}\n\nexport class SqliteBigintDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_BIGINT_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['integer'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteBigintCodec {\n return () => new SqliteBigintCodec(this);\n }\n}\n\nexport const sqliteBigintDescriptor = new SqliteBigintDescriptor();\n\nexport const sqliteBigintColumn = () =>\n column(sqliteBigintDescriptor.factory(), sqliteBigintDescriptor.codecId, undefined, 'integer');\n\nsqliteBigintColumn satisfies ColumnHelperFor<SqliteBigintDescriptor>;\nsqliteBigintColumn satisfies ColumnHelperForStrict<SqliteBigintDescriptor>;\n\nexport const codecDescriptors: readonly AnyCodecDescriptor[] = [\n sqlCharDescriptor,\n sqlVarcharDescriptor,\n sqlIntDescriptor,\n sqlFloatDescriptor,\n sqliteTextDescriptor,\n sqliteIntegerDescriptor,\n sqliteRealDescriptor,\n sqliteBlobDescriptor,\n sqliteDatetimeDescriptor,\n sqliteJsonDescriptor,\n sqliteBigintDescriptor,\n];\n","import { buildCodecDescriptorRegistry } from '@prisma-next/sql-relational-core/codec-descriptor-registry';\nimport type { CodecDescriptorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { codecDescriptors } from './codecs';\n\n/**\n * Registry of every codec descriptor shipped by `@prisma-next/target-sqlite`.\n *\n * Public consumer surface for the sqlite codec set: the sqlite adapter and any other consumer that needs to enumerate or look up a sqlite codec by id consumes this rather than the raw descriptor array. See ADR 208.\n */\nexport const sqliteCodecRegistry: CodecDescriptorRegistry =\n buildCodecDescriptorRegistry(codecDescriptors);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codecs.mjs","names":[],"sources":["../src/core/codecs.ts","../src/core/registry.ts"],"sourcesContent":["/**\n * Native SQLite target codecs (TML-2357). Mirrors the Postgres codec class form in `packages/3-targets/3-targets/postgres/src/core/codecs.ts`.\n *\n * Each codec ships as three artifacts:\n *\n * 1. A `SqliteXCodec` class extending {@link CodecImpl} that wraps the encode/decode/encodeJson/decodeJson conversions inline. SQLite's runtime conversions are simple enough that there is no shared helper module; the class bodies are the single source of truth. 2. A `SqliteXDescriptor` class extending {@link CodecDescriptorImpl} declaring the codec id, traits, target types, and params schema. SQLite codecs do not carry\n * `meta` (no per-target native-type meta today) and are all non-parameterized. 3. A per-codec column helper (`sqliteXColumn`) that calls `descriptor.factory()` directly and packages the result into a {@link ColumnSpec} via the framework {@link column} packager. The helper is tied to its descriptor with `satisfies ColumnHelperFor` + `ColumnHelperForStrict` (every SQLite codec's resolved type is well-defined).\n *\n * After TML-2357 this is the canonical source of SQLite codec metadata and runtime behaviour — the legacy `mkCodec` / `defineCodec` carriers (and the parallel `byScalar` / `codecDescriptorDefinitions` collection exports) retired with the deletion sweep.\n *\n * Audit: every SQLite codec is non-parameterized and parameter-stateless; `factory()` takes no params (`P = void`) and returns a fresh codec constructed solely from `this`.\n */\n\nimport type { JsonValue } from '@prisma-next/contract/types';\nimport {\n type AnyCodecDescriptor,\n type CodecCallContext,\n CodecDescriptorImpl,\n CodecImpl,\n type CodecInstanceContext,\n type ColumnHelperFor,\n type ColumnHelperForStrict,\n column,\n voidParamsSchema,\n} from '@prisma-next/framework-components/codec';\nimport {\n sqlCharDescriptor,\n sqlFloatDescriptor,\n sqlIntDescriptor,\n sqlVarcharDescriptor,\n} from '@prisma-next/sql-relational-core/ast';\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 './codec-ids';\nimport { sqliteError } from './errors';\n\nexport class SqliteTextCodec extends CodecImpl<\n typeof SQLITE_TEXT_CODEC_ID,\n readonly ['equality', 'order', 'textual'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class SqliteTextDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_TEXT_CODEC_ID;\n override readonly traits = ['equality', 'order', 'textual'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteTextCodec {\n return () => new SqliteTextCodec(this);\n }\n}\n\nexport const sqliteTextDescriptor = new SqliteTextDescriptor();\n\nexport const sqliteTextColumn = () =>\n column(sqliteTextDescriptor.factory(), sqliteTextDescriptor.codecId, undefined, 'text');\n\nsqliteTextColumn satisfies ColumnHelperFor<SqliteTextDescriptor>;\nsqliteTextColumn satisfies ColumnHelperForStrict<SqliteTextDescriptor>;\n\nexport class SqliteIntegerCodec extends CodecImpl<\n typeof SQLITE_INTEGER_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class SqliteIntegerDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_INTEGER_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['integer'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteIntegerCodec {\n return () => new SqliteIntegerCodec(this);\n }\n}\n\nexport const sqliteIntegerDescriptor = new SqliteIntegerDescriptor();\n\nexport const sqliteIntegerColumn = () =>\n column(sqliteIntegerDescriptor.factory(), sqliteIntegerDescriptor.codecId, undefined, 'integer');\n\nsqliteIntegerColumn satisfies ColumnHelperFor<SqliteIntegerDescriptor>;\nsqliteIntegerColumn satisfies ColumnHelperForStrict<SqliteIntegerDescriptor>;\n\nexport class SqliteRealCodec extends CodecImpl<\n typeof SQLITE_REAL_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class SqliteRealDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_REAL_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['real'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteRealCodec {\n return () => new SqliteRealCodec(this);\n }\n}\n\nexport const sqliteRealDescriptor = new SqliteRealDescriptor();\n\nexport const sqliteRealColumn = () =>\n column(sqliteRealDescriptor.factory(), sqliteRealDescriptor.codecId, undefined, 'real');\n\nsqliteRealColumn satisfies ColumnHelperFor<SqliteRealDescriptor>;\nsqliteRealColumn satisfies ColumnHelperForStrict<SqliteRealDescriptor>;\n\nexport class SqliteBlobCodec extends CodecImpl<\n typeof SQLITE_BLOB_CODEC_ID,\n readonly ['equality'],\n Uint8Array,\n Uint8Array\n> {\n async encode(value: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n return value;\n }\n async decode(wire: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n return wire;\n }\n encodeJson(value: Uint8Array): JsonValue {\n return Buffer.from(value).toString('base64');\n }\n decodeJson(json: JsonValue): Uint8Array {\n if (typeof json !== 'string') {\n throw sqliteError(\n 'RUNTIME.DECODE_FAILED',\n 'sqlite/blob@1 contract value must be a base64 string',\n {\n meta: { codecId: SQLITE_BLOB_CODEC_ID, received: typeof json },\n },\n );\n }\n return new Uint8Array(Buffer.from(json, 'base64'));\n }\n}\n\nexport class SqliteBlobDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_BLOB_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['blob'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteBlobCodec {\n return () => new SqliteBlobCodec(this);\n }\n}\n\nexport const sqliteBlobDescriptor = new SqliteBlobDescriptor();\n\nexport const sqliteBlobColumn = () =>\n column(sqliteBlobDescriptor.factory(), sqliteBlobDescriptor.codecId, undefined, 'blob');\n\nsqliteBlobColumn satisfies ColumnHelperFor<SqliteBlobDescriptor>;\nsqliteBlobColumn satisfies ColumnHelperForStrict<SqliteBlobDescriptor>;\n\nexport class SqliteDatetimeCodec extends CodecImpl<\n typeof SQLITE_DATETIME_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n Date\n> {\n // Reject `Invalid Date` (NaN-time) at every decode ingress so consumers never receive a Date object whose downstream operations silently produce NaN. Mirrors the stricter ISO-8601 validation on the postgres timestamp helpers.\n private parseDate(value: string): Date {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw sqliteError(\n 'RUNTIME.DECODE_FAILED',\n `sqlite/datetime@1 value must be a valid ISO-8601 string: ${value}`,\n { meta: { codecId: SQLITE_DATETIME_CODEC_ID, received: value } },\n );\n }\n return date;\n }\n async encode(value: Date, _ctx: CodecCallContext): Promise<string> {\n return value.toISOString();\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<Date> {\n return this.parseDate(wire);\n }\n encodeJson(value: Date): JsonValue {\n return value.toISOString();\n }\n decodeJson(json: JsonValue): Date {\n if (typeof json !== 'string') {\n throw sqliteError(\n 'RUNTIME.DECODE_FAILED',\n 'sqlite/datetime@1 contract value must be an ISO-8601 string',\n { meta: { codecId: SQLITE_DATETIME_CODEC_ID, received: typeof json } },\n );\n }\n return this.parseDate(json);\n }\n}\n\nexport class SqliteDatetimeDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_DATETIME_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteDatetimeCodec {\n return () => new SqliteDatetimeCodec(this);\n }\n}\n\nexport const sqliteDatetimeDescriptor = new SqliteDatetimeDescriptor();\n\nexport const sqliteDatetimeColumn = () =>\n column(sqliteDatetimeDescriptor.factory(), sqliteDatetimeDescriptor.codecId, undefined, 'text');\n\nsqliteDatetimeColumn satisfies ColumnHelperFor<SqliteDatetimeDescriptor>;\nsqliteDatetimeColumn satisfies ColumnHelperForStrict<SqliteDatetimeDescriptor>;\n\nexport class SqliteJsonCodec extends CodecImpl<\n typeof SQLITE_JSON_CODEC_ID,\n readonly ['equality'],\n string | JsonValue,\n JsonValue\n> {\n async encode(value: JsonValue, _ctx: CodecCallContext): Promise<string> {\n return JSON.stringify(value);\n }\n async decode(wire: string | JsonValue, _ctx: CodecCallContext): Promise<JsonValue> {\n return typeof wire === 'string' ? (JSON.parse(wire) as JsonValue) : wire;\n }\n encodeJson(value: JsonValue): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): JsonValue {\n return json;\n }\n}\n\nexport class SqliteJsonDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_JSON_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteJsonCodec {\n return () => new SqliteJsonCodec(this);\n }\n}\n\nexport const sqliteJsonDescriptor = new SqliteJsonDescriptor();\n\nexport const sqliteJsonColumn = () =>\n column(sqliteJsonDescriptor.factory(), sqliteJsonDescriptor.codecId, undefined, 'text');\n\nsqliteJsonColumn satisfies ColumnHelperFor<SqliteJsonDescriptor>;\nsqliteJsonColumn satisfies ColumnHelperForStrict<SqliteJsonDescriptor>;\n\nexport class SqliteBigintCodec extends CodecImpl<\n typeof SQLITE_BIGINT_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number | bigint,\n bigint\n> {\n async encode(value: bigint, _ctx: CodecCallContext): Promise<number | bigint> {\n return value;\n }\n async decode(wire: number | bigint, _ctx: CodecCallContext): Promise<bigint> {\n return BigInt(wire);\n }\n encodeJson(value: bigint): JsonValue {\n const number = Number(value);\n if (!Number.isSafeInteger(number)) {\n throw sqliteError(\n 'RUNTIME.ENCODE_FAILED',\n 'sqlite/bigint@1 database JSON value must be a safe integer',\n { meta: { codecId: SQLITE_BIGINT_CODEC_ID, received: String(value) } },\n );\n }\n return number;\n }\n decodeJson(json: JsonValue): bigint {\n if (typeof json !== 'number') {\n throw sqliteError(\n 'RUNTIME.DECODE_FAILED',\n 'sqlite/bigint@1 database JSON value must be a number',\n { meta: { codecId: SQLITE_BIGINT_CODEC_ID, received: typeof json } },\n );\n }\n if (!Number.isSafeInteger(json)) {\n throw sqliteError(\n 'RUNTIME.DECODE_FAILED',\n 'sqlite/bigint@1 database JSON value must be a safe integer',\n { meta: { codecId: SQLITE_BIGINT_CODEC_ID, received: json } },\n );\n }\n return BigInt(json);\n }\n}\n\nexport class SqliteBigintDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = SQLITE_BIGINT_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['integer'] as const;\n override readonly paramsSchema = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => SqliteBigintCodec {\n return () => new SqliteBigintCodec(this);\n }\n}\n\nexport const sqliteBigintDescriptor = new SqliteBigintDescriptor();\n\nexport const sqliteBigintColumn = () =>\n column(sqliteBigintDescriptor.factory(), sqliteBigintDescriptor.codecId, undefined, 'integer');\n\nsqliteBigintColumn satisfies ColumnHelperFor<SqliteBigintDescriptor>;\nsqliteBigintColumn satisfies ColumnHelperForStrict<SqliteBigintDescriptor>;\n\nexport const codecDescriptors: readonly AnyCodecDescriptor[] = [\n sqlCharDescriptor,\n sqlVarcharDescriptor,\n sqlIntDescriptor,\n sqlFloatDescriptor,\n sqliteTextDescriptor,\n sqliteIntegerDescriptor,\n sqliteRealDescriptor,\n sqliteBlobDescriptor,\n sqliteDatetimeDescriptor,\n sqliteJsonDescriptor,\n sqliteBigintDescriptor,\n];\n","import { buildCodecDescriptorRegistry } from '@prisma-next/sql-relational-core/codec-descriptor-registry';\nimport type { CodecDescriptorRegistry } from '@prisma-next/sql-relational-core/query-lane-context';\nimport { codecDescriptors } from './codecs';\n\n/**\n * Registry of every codec descriptor shipped by `@prisma-next/target-sqlite`.\n *\n * Public consumer surface for the sqlite codec set: the sqlite adapter and any other consumer that needs to enumerate or look up a sqlite codec by id consumes this rather than the raw descriptor array. See ADR 208.\n */\nexport const sqliteCodecRegistry: CodecDescriptorRegistry =\n buildCodecDescriptorRegistry(codecDescriptors);\n"],"mappings":"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"}
|
package/dist/control.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-target.ts","../src/core/sqlite-unbound-database.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/control-target.ts","../src/core/sqlite-unbound-database.ts"],"mappings":";;;;cA0BM,+BAA+B,qCAAqC;;;KCX9D;WACD;WACA,SAAS;;;;;;;cAUP,uBAAuB;WACjB;WAER;WACA,SAAS;cAEN,OAAO;MAyBf,SAAS,SAAS,eAAe;EAIrC;EAIA,aAAa;;;;;;;;;;;;;;;;;;;cAsBF,8BAA8B;kBACzB,UAAU;UAEnB;;;;;;;;;;;;iBAkCO,sBACd,OAAO,oBACN,iBAAiB"}
|
package/dist/control.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { n as sqliteError } from "./errors-B1JPoWDh.mjs";
|
|
1
2
|
import { t as sqliteTargetDescriptorMeta } from "./descriptor-meta-BPrgV878.mjs";
|
|
2
|
-
import { a as verifySqliteDatabaseSchema, i as sqliteContractToSchema, n as createSqliteMigrationPlanner, r as diffSqliteSchema } from "./planner-
|
|
3
|
+
import { a as verifySqliteDatabaseSchema, i as sqliteContractToSchema, n as createSqliteMigrationPlanner, r as diffSqliteSchema } from "./planner-Cdl1Lziz.mjs";
|
|
3
4
|
import { r as MARKER_TABLE_NAME } from "./control-tables-D_o8dKRB.mjs";
|
|
4
|
-
import { i as sqliteCreateNamespace, n as SqliteContractSerializer, r as SqliteUnboundDatabase } from "./sqlite-contract-view-
|
|
5
|
+
import { i as sqliteCreateNamespace, n as SqliteContractSerializer, r as SqliteUnboundDatabase } from "./sqlite-contract-view-DthhfCpb.mjs";
|
|
5
6
|
import { SqlStorage } from "@prisma-next/sql-contract/types";
|
|
6
7
|
import { relationalNodeEntityKind, relationalNodeGranularity } from "@prisma-next/sql-schema-ir/types";
|
|
7
8
|
import { runnerFailure, runnerSuccess } from "@prisma-next/family-sql/control";
|
|
@@ -9,6 +10,7 @@ import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
|
|
|
9
10
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
10
11
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
11
12
|
import { notOk, ok, okVoid } from "@prisma-next/utils/result";
|
|
13
|
+
import { InternalError } from "@prisma-next/utils/internal-error";
|
|
12
14
|
import { SqlSchemaVerifierBase } from "@prisma-next/family-sql/ir";
|
|
13
15
|
//#region src/core/migrations/runner.ts
|
|
14
16
|
function createSqliteMigrationRunner(family) {
|
|
@@ -27,7 +29,10 @@ var SqliteMigrationRunner = class {
|
|
|
27
29
|
*/
|
|
28
30
|
async executeOnConnection(options) {
|
|
29
31
|
const driver = options.driver;
|
|
30
|
-
if (options.space !== void 0 && options.space !== options.plan.spaceId) throw
|
|
32
|
+
if (options.space !== void 0 && options.space !== options.plan.spaceId) throw sqliteError("MIGRATION.CONTRACT_SPACE_VIOLATION", `SqlMigrationRunner: options.space (${options.space}) does not match plan.spaceId (${options.plan.spaceId})`, { meta: {
|
|
33
|
+
space: options.space,
|
|
34
|
+
planSpaceId: options.plan.spaceId
|
|
35
|
+
} });
|
|
31
36
|
const space = options.plan.spaceId;
|
|
32
37
|
const planOps = blindCast(await Promise.all(options.plan.operations));
|
|
33
38
|
const destinationCheck = this.ensurePlanMatchesDestinationContract(options.plan.destination, options.destinationContract);
|
|
@@ -339,7 +344,7 @@ var SqliteMigrationRunner = class {
|
|
|
339
344
|
const space = plan.spaceId;
|
|
340
345
|
const edges = options.migrationEdges;
|
|
341
346
|
const totalEdgeOps = edges.reduce((sum, edge) => sum + edge.operationCount, 0);
|
|
342
|
-
if (totalEdgeOps !== plan.operations.length) throw new
|
|
347
|
+
if (totalEdgeOps !== plan.operations.length) throw new InternalError(`Ledger write: plan.operations length (${plan.operations.length}) does not match sum of migrationEdges operationCount (${totalEdgeOps})`);
|
|
343
348
|
let offset = 0;
|
|
344
349
|
for (const edge of edges) {
|
|
345
350
|
const edgeOps = executedOperations.slice(offset, offset + edge.operationCount);
|
|
@@ -408,7 +413,7 @@ const sqliteControlTargetDescriptor = {
|
|
|
408
413
|
return createSqliteMigrationRunner(family);
|
|
409
414
|
},
|
|
410
415
|
contractToSchema(contract, _frameworkComponents) {
|
|
411
|
-
if (!isSqlContract(contract)) throw
|
|
416
|
+
if (!isSqlContract(contract)) throw sqliteError("CONTRACT.TARGET_MISMATCH", "sqliteControlTargetDescriptor.contractToSchema received a non-SQL contract; expected Contract<SqlStorage>");
|
|
412
417
|
return sqliteContractToSchema(contract);
|
|
413
418
|
}
|
|
414
419
|
},
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":[],"sources":["../src/core/migrations/runner.ts","../src/core/sqlite-schema-verifier.ts","../src/core/control-target.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type {\n MigrationOperationPolicy,\n SqlControlFamilyInstance,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationRunner,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n} from '@prisma-next/family-sql/control';\nimport { runnerFailure, runnerSuccess } from '@prisma-next/family-sql/control';\nimport type { MigrationRunnerResult } from '@prisma-next/framework-components/control';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type { SqlControlDriverInstance, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlExecuteRequest } from '@prisma-next/sql-relational-core/ast';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { Result } from '@prisma-next/utils/result';\nimport { notOk, ok, okVoid } from '@prisma-next/utils/result';\nimport { MARKER_TABLE_NAME } from '../control-tables';\nimport { verifySqliteDatabaseSchema } from './diff-database-schema';\nimport type { SqlitePlanTargetDetails } from './planner-target-details';\n\nexport function createSqliteMigrationRunner(\n family: SqlControlFamilyInstance,\n): SqlMigrationRunner<SqlitePlanTargetDetails> {\n return new SqliteMigrationRunner(family);\n}\n\nclass SqliteMigrationRunner implements SqlMigrationRunner<SqlitePlanTargetDetails> {\n constructor(private readonly family: SqlControlFamilyInstance) {}\n\n /**\n * Apply the plan against an already-open connection without managing\n * the transaction lifecycle. The caller ({@link SqliteMigrationRunner.execute})\n * owns BEGIN/COMMIT/ROLLBACK and any connection-level setup (FK pragma\n * toggle, FK integrity check).\n */\n async executeOnConnection(\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n ): Promise<SqlMigrationRunnerResult> {\n const driver = options.driver;\n if (options.space !== undefined && options.space !== options.plan.spaceId) {\n throw new Error(\n `SqlMigrationRunner: options.space (${options.space}) does not match plan.spaceId (${options.plan.spaceId})`,\n );\n }\n const space = options.plan.spaceId;\n\n // Materialize any async ops before running checks or executing.\n const planOps = blindCast<\n readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n 'ops were produced by the SQLite planner and are SqlMigrationPlanOperation<SqlitePlanTargetDetails>; MigrationPlan.operations uses the wider framework type to accommodate Promise covariance'\n >(await Promise.all(options.plan.operations));\n\n const destinationCheck = this.ensurePlanMatchesDestinationContract(\n options.plan.destination,\n options.destinationContract,\n );\n if (!destinationCheck.ok) return destinationCheck;\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, planOps);\n if (!policyCheck.ok) return policyCheck;\n\n const ensureResult = await this.ensureControlTables(driver, options.destinationContract);\n if (!ensureResult.ok) return ensureResult;\n const existingMarker = await this.family.readMarker({ driver, space });\n\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (!markerCheck.ok) return markerCheck;\n\n const markerAtDestination = this.markerMatchesDestination(existingMarker, options.plan);\n const isSelfEdge = options.plan.origin?.storageHash === options.plan.destination.storageHash;\n const skipOperations = markerAtDestination && options.plan.origin != null && !isSelfEdge;\n\n let operationsExecuted: number;\n let executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[];\n\n if (skipOperations) {\n operationsExecuted = 0;\n executedOperations = [];\n } else {\n const applyResult = await this.applyPlan(driver, options, planOps);\n if (!applyResult.ok) return applyResult;\n operationsExecuted = applyResult.value.operationsExecuted;\n executedOperations = applyResult.value.executedOperations;\n }\n\n if (space === APP_SPACE_ID) {\n const schemaNode = await this.family.introspect({\n driver,\n contract: options.destinationContract,\n });\n const schemaVerifyResult = verifySqliteDatabaseSchema({\n contract: options.destinationContract,\n actualSchema: schemaNode,\n strict: options.strictVerification ?? true,\n typeMetadataRegistry: this.family.typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n });\n if (!schemaVerifyResult.ok) {\n return runnerFailure('MIGRATION.SCHEMA_VERIFY_FAILED', schemaVerifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: { issues: schemaVerifyResult.schema.issues },\n });\n }\n }\n\n // Self-edge no-op detection: see Postgres runner for the rationale\n // (kept symmetric across both targets).\n const incomingInvariants = options.plan.providedInvariants;\n const existingInvariants = new Set(existingMarker?.invariants ?? []);\n const incomingIsSubsetOfExisting = incomingInvariants.every((id) => existingInvariants.has(id));\n const isSelfEdgeNoOp = isSelfEdge && operationsExecuted === 0 && incomingIsSubsetOfExisting;\n\n if (!isSelfEdgeNoOp) {\n const markerResult = await this.upsertMarker(driver, options, existingMarker, space);\n if (!markerResult.ok) return markerResult;\n await this.recordLedgerEntries(driver, options, executedOperations);\n }\n\n return runnerSuccess({\n operationsPlanned: planOps.length,\n operationsExecuted,\n });\n }\n\n async execute(options: {\n readonly driver: SqlControlDriverInstance<string>;\n readonly perSpaceOptions: ReadonlyArray<\n SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>\n >;\n }): Promise<MigrationRunnerResult> {\n const driver = options.driver;\n const perSpaceOptions = options.perSpaceOptions;\n\n if (perSpaceOptions.length === 0) {\n return ok({ perSpaceResults: [] });\n }\n\n // FK pragma toggle and the FK integrity check both span the outer\n // transaction: PRAGMA foreign_keys is a no-op inside a transaction, so the\n // toggle has to wrap BEGIN/COMMIT.\n const fkWasEnabled = await this.readForeignKeysEnabled(driver);\n if (fkWasEnabled) {\n await driver.query('PRAGMA foreign_keys = OFF');\n }\n\n try {\n await this.beginExclusiveTransaction(driver);\n let committed = false;\n try {\n const perSpaceResults: Array<{\n space: string;\n value: SqlMigrationRunnerSuccessValue;\n }> = [];\n let lastProcessedSpace: string | undefined;\n for (const spaceOptions of perSpaceOptions) {\n const space = spaceOptions.space ?? spaceOptions.plan.spaceId;\n const result = await this.executeOnConnection({ ...spaceOptions, driver, space });\n if (!result.ok) {\n return notOk({ ...result.failure, failingSpace: space });\n }\n perSpaceResults.push({ space, value: result.value });\n lastProcessedSpace = space;\n }\n\n if (fkWasEnabled) {\n const fkIntegrityCheck = await this.verifyForeignKeyIntegrity(driver);\n if (!fkIntegrityCheck.ok) {\n // Post-loop integrity violations cannot be attributed to a\n // single per-space step (the cumulative effect of all\n // applied plans was needed to reveal the broken\n // reference). Surface the last successfully-applied space\n // so operators can investigate from the most recent\n // migration first.\n return notOk({\n ...fkIntegrityCheck.failure,\n failingSpace: lastProcessedSpace ?? APP_SPACE_ID,\n });\n }\n }\n\n await this.commitTransaction(driver);\n committed = true;\n return ok({ perSpaceResults });\n } finally {\n if (!committed) {\n await this.rollbackTransaction(driver);\n }\n }\n } finally {\n if (fkWasEnabled) {\n await driver.query('PRAGMA foreign_keys = ON');\n }\n }\n }\n\n private async readForeignKeysEnabled(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<boolean> {\n const result = await driver.query<{ foreign_keys: number }>('PRAGMA foreign_keys');\n const row = result.rows[0];\n return row?.foreign_keys === 1;\n }\n\n private async verifyForeignKeyIntegrity(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const result = await driver.query<Record<string, unknown>>('PRAGMA foreign_key_check');\n if (result.rows.length === 0) {\n return okVoid();\n }\n return runnerFailure(\n 'MIGRATION.FOREIGN_KEY_VIOLATION',\n `Foreign key integrity check failed after migration: ${result.rows.length} violation(s).`,\n {\n why: 'PRAGMA foreign_key_check reported violations after applying recreate-table operations.',\n meta: { violations: result.rows },\n },\n );\n }\n\n private async applyPlan(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n ops: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Promise<\n Result<\n {\n readonly operationsExecuted: number;\n readonly executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[];\n },\n SqlMigrationRunnerFailure\n >\n > {\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false;\n const runPostchecks = checks?.postchecks !== false;\n const runIdempotency = checks?.idempotencyChecks !== false;\n\n let operationsExecuted = 0;\n const executedOperations: Array<SqlMigrationPlanOperation<SqlitePlanTargetDetails>> = [];\n\n for (const operation of ops) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n if (runPostchecks && runIdempotency) {\n const postcheckAlreadySatisfied = await this.expectationsAreSatisfied(\n driver,\n operation.postcheck,\n );\n if (postcheckAlreadySatisfied) {\n executedOperations.push(this.createSkipRecord(operation));\n continue;\n }\n }\n\n if (runPrechecks) {\n const precheckResult = await this.runExpectationSteps(\n driver,\n operation.precheck,\n operation,\n 'precheck',\n );\n if (!precheckResult.ok) {\n return precheckResult;\n }\n }\n\n const executeResult = await this.runExecuteSteps(driver, operation.execute, operation);\n if (!executeResult.ok) {\n return executeResult;\n }\n\n if (runPostchecks) {\n const postcheckResult = await this.runExpectationSteps(\n driver,\n operation.postcheck,\n operation,\n 'postcheck',\n );\n if (!postcheckResult.ok) {\n return postcheckResult;\n }\n }\n\n executedOperations.push(operation);\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n return ok({ operationsExecuted, executedOperations });\n }\n\n private async ensureControlTables(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n contract: Contract<SqlStorage>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const legacyDetection = await this.detectLegacyMarkerShape(driver);\n if (!legacyDetection.ok) {\n return legacyDetection;\n }\n const lowererContext = { contract };\n for (const query of this.family.bootstrapControlTableQueries()) {\n await this.executeStatement(driver, await this.family.lowerAst(query, lowererContext));\n }\n return okVoid();\n }\n\n private async detectLegacyMarkerShape(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const tableInfo = await driver.query<{ name: string }>(\n `PRAGMA table_info(\"${MARKER_TABLE_NAME}\")`,\n );\n if (tableInfo.rows.length === 0) {\n return okVoid();\n }\n const columns = new Set(tableInfo.rows.map((row) => row.name));\n if (columns.has('space')) {\n return okVoid();\n }\n return runnerFailure(\n 'MIGRATION.LEGACY_MARKER_SHAPE',\n `Legacy marker-table shape detected on ${MARKER_TABLE_NAME} (no \\`space\\` column). ` +\n 'Prisma Next is in pre-1.0; the previous transitional auto-migration to the per-space-row schema has been removed. ' +\n `Drop \\`${MARKER_TABLE_NAME}\\` and re-run \\`dbInit\\` to reinitialise from a clean baseline.`,\n {\n meta: {\n table: MARKER_TABLE_NAME,\n columns: [...columns].sort(),\n },\n },\n );\n }\n\n private async runExpectationSteps(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n phase: 'precheck' | 'postcheck',\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n const code =\n phase === 'precheck' ? 'MIGRATION.PRECHECK_FAILED' : 'MIGRATION.POSTCHECK_FAILED';\n return runnerFailure(\n code,\n `Operation ${operation.id} failed during ${phase}: ${step.description}`,\n {\n meta: {\n operationId: operation.id,\n phase,\n stepDescription: step.description,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private async runExecuteSteps(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n try {\n await driver.query(step.sql, step.params ?? []);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return runnerFailure(\n 'MIGRATION.EXECUTION_FAILED',\n `Operation ${operation.id} failed during execution: ${step.description}`,\n {\n why: message,\n meta: {\n operationId: operation.id,\n stepDescription: step.description,\n sql: step.sql,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private stepResultIsTrue(rows: readonly Record<string, unknown>[]): boolean {\n if (!rows || rows.length === 0) {\n return false;\n }\n const firstRow = rows[0];\n const firstValue = firstRow ? Object.values(firstRow)[0] : undefined;\n if (typeof firstValue === 'number') {\n return firstValue !== 0;\n }\n if (typeof firstValue === 'boolean') {\n return firstValue;\n }\n if (typeof firstValue === 'string') {\n const lower = firstValue.toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n return firstValue.length > 0;\n }\n return Boolean(firstValue);\n }\n\n private async expectationsAreSatisfied(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n ): Promise<boolean> {\n if (steps.length === 0) {\n return false;\n }\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n return false;\n }\n }\n return true;\n }\n\n private createSkipRecord(\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n ): SqlMigrationPlanOperation<SqlitePlanTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...ifDefined('summary', operation.summary),\n operationClass: operation.operationClass,\n target: operation.target,\n precheck: Object.freeze([]),\n execute: Object.freeze([]),\n postcheck: Object.freeze([...operation.postcheck]),\n meta: Object.freeze({\n ...(operation.meta ?? {}),\n runner: Object.freeze({ skipped: true, reason: 'postcheck_pre_satisfied' }),\n }),\n });\n }\n\n private markerMatchesDestination(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['plan'],\n ): boolean {\n if (!marker) return false;\n if (marker.storageHash !== plan.destination.storageHash) return false;\n if (plan.destination.profileHash && marker.profileHash !== plan.destination.profileHash) {\n return false;\n }\n return true;\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Result<void, SqlMigrationRunnerFailure> {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'MIGRATION.POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${policy.allowedOperationClasses.join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n allowedClasses: policy.allowedOperationClasses,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['plan'],\n ): Result<void, SqlMigrationRunnerFailure> {\n const origin = plan.origin ?? null;\n if (!origin) {\n return okVoid();\n }\n if (!marker) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n { meta: { expectedOriginStorageHash: origin.storageHash } },\n );\n }\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (origin.profileHash && marker.profileHash !== origin.profileHash) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Existing contract marker profile hash (${marker.profileHash}) does not match plan origin profile hash (${origin.profileHash}).`,\n {\n meta: {\n markerProfileHash: marker.profileHash,\n expectedOriginProfileHash: origin.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private ensurePlanMatchesDestinationContract(\n destination: SqlMigrationPlanContractInfo,\n contract: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['destinationContract'],\n ): Result<void, SqlMigrationRunnerFailure> {\n if (destination.storageHash !== contract.storage.storageHash) {\n return runnerFailure(\n 'MIGRATION.DESTINATION_CONTRACT_MISMATCH',\n `Plan destination storage hash (${destination.storageHash}) does not match provided contract storage hash (${contract.storage.storageHash}).`,\n {\n meta: {\n planStorageHash: destination.storageHash,\n contractStorageHash: contract.storage.storageHash,\n },\n },\n );\n }\n if (\n destination.profileHash &&\n contract.profileHash &&\n destination.profileHash !== contract.profileHash\n ) {\n return runnerFailure(\n 'MIGRATION.DESTINATION_CONTRACT_MISMATCH',\n `Plan destination profile hash (${destination.profileHash}) does not match provided contract profile hash (${contract.profileHash}).`,\n {\n meta: {\n planProfileHash: destination.profileHash,\n contractProfileHash: contract.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async upsertMarker(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n space: string,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n // Pass the plan's incoming invariants verbatim; `updateMarker` unions them\n // with the stored set (TS-side, dialect-uniform) under the runner's\n // BEGIN EXCLUSIVE — no client-side pre-merge here, so there is no\n // double-merge with the SPI's internal accumulate-dedupe.\n const destination = {\n storageHash: options.plan.destination.storageHash,\n profileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n invariants: options.plan.providedInvariants ?? [],\n };\n if (!existingMarker) {\n await this.family.initMarker({ driver, space, destination });\n return okVoid();\n }\n const updated = await this.family.updateMarker({\n driver,\n space,\n expectedFrom: existingMarker.storageHash,\n destination,\n });\n if (!updated) {\n return runnerFailure(\n 'MIGRATION.MARKER_CAS_FAILURE',\n 'Marker was modified by another process during migration execution.',\n {\n meta: {\n space,\n expectedStorageHash: existingMarker.storageHash,\n destinationStorageHash: options.plan.destination.storageHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async recordLedgerEntries(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Promise<void> {\n const plan = options.plan;\n const space = plan.spaceId;\n const edges = options.migrationEdges;\n const totalEdgeOps = edges.reduce((sum, edge) => sum + edge.operationCount, 0);\n if (totalEdgeOps !== plan.operations.length) {\n throw new Error(\n `Ledger write: plan.operations length (${plan.operations.length}) does not match sum of migrationEdges operationCount (${totalEdgeOps})`,\n );\n }\n // The ledger records the operations as executed — idempotency-skipped ops\n // are substituted with skip records (empty `execute`) by `applyPlan`, so the\n // journal reflects what actually ran rather than the raw plan.\n let offset = 0;\n for (const edge of edges) {\n const edgeOps = executedOperations.slice(offset, offset + edge.operationCount);\n offset += edge.operationCount;\n await this.family.writeLedgerEntry({\n driver,\n space,\n entry: {\n edgeId: `${edge.from}->${edge.to}`,\n from: edge.from,\n to: edge.to,\n migrationName: edge.dirName,\n migrationHash: edge.migrationHash,\n operations: edgeOps,\n },\n });\n }\n }\n\n private async beginExclusiveTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('BEGIN EXCLUSIVE');\n }\n\n private async commitTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('COMMIT');\n }\n\n private async rollbackTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('ROLLBACK');\n }\n\n private async executeStatement(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n statement: SqlExecuteRequest,\n ): Promise<void> {\n await driver.query(statement.sql, statement.params);\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport { SqlSchemaVerifierBase } from '@prisma-next/family-sql/ir';\nimport type {\n SchemaDiffIssue,\n SchemaVerifyOptions,\n} from '@prisma-next/framework-components/control';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';\n\n/**\n * SQLite target `SchemaVerifier` concretion. Mirrors the Postgres\n * shape: hooks return the empty list pending the call-site migration\n * that routes the existing verifier behaviour through the SPI.\n */\nexport class SqliteSchemaVerifier extends SqlSchemaVerifierBase<Contract<SqlStorage>, SqlSchemaIR> {\n protected verifyCommonSqlSchema(\n _options: SchemaVerifyOptions<Contract<SqlStorage>, SqlSchemaIR>,\n ): readonly SchemaDiffIssue[] {\n return [];\n }\n\n protected verifyTargetExtensions(\n _options: SchemaVerifyOptions<Contract<SqlStorage>, SqlSchemaIR>,\n ): readonly SchemaDiffIssue[] {\n return [];\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { SqlControlTargetDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport type {\n ControlTargetInstance,\n MigrationPlanner,\n MigrationRunner,\n} from '@prisma-next/framework-components/control';\nimport { SqlStorage } from '@prisma-next/sql-contract/types';\nimport {\n relationalNodeEntityKind,\n relationalNodeGranularity,\n} from '@prisma-next/sql-schema-ir/types';\nimport { sqliteTargetDescriptorMeta } from './descriptor-meta';\nimport { diffSqliteSchema, sqliteContractToSchema } from './migrations/diff-database-schema';\nimport { createSqliteMigrationPlanner } from './migrations/planner';\nimport type { SqlitePlanTargetDetails } from './migrations/planner-target-details';\nimport { createSqliteMigrationRunner } from './migrations/runner';\nimport { SqliteContractSerializer } from './sqlite-contract-serializer';\nimport { SqliteSchemaVerifier } from './sqlite-schema-verifier';\n\nfunction isSqlContract(contract: Contract | null): contract is Contract<SqlStorage> | null {\n return contract === null || contract.storage instanceof SqlStorage;\n}\n\nconst sqliteControlTargetDescriptor: SqlControlTargetDescriptor<'sqlite', SqlitePlanTargetDetails> =\n {\n ...sqliteTargetDescriptorMeta,\n contractSerializer: new SqliteContractSerializer(),\n schemaVerifier: new SqliteSchemaVerifier(),\n diffSchema(input) {\n return diffSqliteSchema(input);\n },\n classifySubjectGranularity: relationalNodeGranularity,\n classifyEntityKind: relationalNodeEntityKind,\n migrations: {\n createPlanner(adapter: SqlControlAdapter<'sqlite'>): MigrationPlanner<'sql', 'sqlite'> {\n return createSqliteMigrationPlanner(adapter);\n },\n createRunner(family) {\n return createSqliteMigrationRunner(family) as MigrationRunner<'sql', 'sqlite'>;\n },\n contractToSchema(contract, _frameworkComponents) {\n // The framework SPI types `contract` as the generic\n // `Contract | null`. Any contract reaching the sqlite\n // target descriptor is SQL-family by construction (the\n // family contract resolver would have refused to bind a\n // sqlite target otherwise); the `isSqlContract` predicate\n // encodes that invariant at runtime + narrows the generic\n // to `Contract<SqlStorage>` without a blind cast.\n if (!isSqlContract(contract)) {\n throw new Error(\n 'sqliteControlTargetDescriptor.contractToSchema received a non-SQL contract; expected Contract<SqlStorage>',\n );\n }\n return sqliteContractToSchema(contract);\n },\n },\n create(): ControlTargetInstance<'sql', 'sqlite'> {\n return {\n familyId: 'sql',\n targetId: 'sqlite',\n };\n },\n createPlanner(adapter: SqlControlAdapter<'sqlite'>) {\n return createSqliteMigrationPlanner(adapter);\n },\n createRunner(family) {\n return createSqliteMigrationRunner(family);\n },\n };\n\nexport default sqliteControlTargetDescriptor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":[],"sources":["../src/core/migrations/runner.ts","../src/core/sqlite-schema-verifier.ts","../src/core/control-target.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type {\n MigrationOperationPolicy,\n SqlControlFamilyInstance,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationRunner,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n} from '@prisma-next/family-sql/control';\nimport { runnerFailure, runnerSuccess } from '@prisma-next/family-sql/control';\nimport type { MigrationRunnerResult } from '@prisma-next/framework-components/control';\nimport { APP_SPACE_ID } from '@prisma-next/framework-components/control';\nimport type { SqlControlDriverInstance, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlExecuteRequest } from '@prisma-next/sql-relational-core/ast';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { InternalError } from '@prisma-next/utils/internal-error';\nimport type { Result } from '@prisma-next/utils/result';\nimport { notOk, ok, okVoid } from '@prisma-next/utils/result';\nimport { MARKER_TABLE_NAME } from '../control-tables';\nimport { sqliteError } from '../errors';\nimport { verifySqliteDatabaseSchema } from './diff-database-schema';\nimport type { SqlitePlanTargetDetails } from './planner-target-details';\n\nexport function createSqliteMigrationRunner(\n family: SqlControlFamilyInstance,\n): SqlMigrationRunner<SqlitePlanTargetDetails> {\n return new SqliteMigrationRunner(family);\n}\n\nclass SqliteMigrationRunner implements SqlMigrationRunner<SqlitePlanTargetDetails> {\n constructor(private readonly family: SqlControlFamilyInstance) {}\n\n /**\n * Apply the plan against an already-open connection without managing\n * the transaction lifecycle. The caller ({@link SqliteMigrationRunner.execute})\n * owns BEGIN/COMMIT/ROLLBACK and any connection-level setup (FK pragma\n * toggle, FK integrity check).\n */\n async executeOnConnection(\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n ): Promise<SqlMigrationRunnerResult> {\n const driver = options.driver;\n if (options.space !== undefined && options.space !== options.plan.spaceId) {\n throw sqliteError(\n 'MIGRATION.CONTRACT_SPACE_VIOLATION',\n `SqlMigrationRunner: options.space (${options.space}) does not match plan.spaceId (${options.plan.spaceId})`,\n { meta: { space: options.space, planSpaceId: options.plan.spaceId } },\n );\n }\n const space = options.plan.spaceId;\n\n // Materialize any async ops before running checks or executing.\n const planOps = blindCast<\n readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n 'ops were produced by the SQLite planner and are SqlMigrationPlanOperation<SqlitePlanTargetDetails>; MigrationPlan.operations uses the wider framework type to accommodate Promise covariance'\n >(await Promise.all(options.plan.operations));\n\n const destinationCheck = this.ensurePlanMatchesDestinationContract(\n options.plan.destination,\n options.destinationContract,\n );\n if (!destinationCheck.ok) return destinationCheck;\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, planOps);\n if (!policyCheck.ok) return policyCheck;\n\n const ensureResult = await this.ensureControlTables(driver, options.destinationContract);\n if (!ensureResult.ok) return ensureResult;\n const existingMarker = await this.family.readMarker({ driver, space });\n\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (!markerCheck.ok) return markerCheck;\n\n const markerAtDestination = this.markerMatchesDestination(existingMarker, options.plan);\n const isSelfEdge = options.plan.origin?.storageHash === options.plan.destination.storageHash;\n const skipOperations = markerAtDestination && options.plan.origin != null && !isSelfEdge;\n\n let operationsExecuted: number;\n let executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[];\n\n if (skipOperations) {\n operationsExecuted = 0;\n executedOperations = [];\n } else {\n const applyResult = await this.applyPlan(driver, options, planOps);\n if (!applyResult.ok) return applyResult;\n operationsExecuted = applyResult.value.operationsExecuted;\n executedOperations = applyResult.value.executedOperations;\n }\n\n if (space === APP_SPACE_ID) {\n const schemaNode = await this.family.introspect({\n driver,\n contract: options.destinationContract,\n });\n const schemaVerifyResult = verifySqliteDatabaseSchema({\n contract: options.destinationContract,\n actualSchema: schemaNode,\n strict: options.strictVerification ?? true,\n typeMetadataRegistry: this.family.typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n });\n if (!schemaVerifyResult.ok) {\n return runnerFailure('MIGRATION.SCHEMA_VERIFY_FAILED', schemaVerifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: { issues: schemaVerifyResult.schema.issues },\n });\n }\n }\n\n // Self-edge no-op detection: see Postgres runner for the rationale\n // (kept symmetric across both targets).\n const incomingInvariants = options.plan.providedInvariants;\n const existingInvariants = new Set(existingMarker?.invariants ?? []);\n const incomingIsSubsetOfExisting = incomingInvariants.every((id) => existingInvariants.has(id));\n const isSelfEdgeNoOp = isSelfEdge && operationsExecuted === 0 && incomingIsSubsetOfExisting;\n\n if (!isSelfEdgeNoOp) {\n const markerResult = await this.upsertMarker(driver, options, existingMarker, space);\n if (!markerResult.ok) return markerResult;\n await this.recordLedgerEntries(driver, options, executedOperations);\n }\n\n return runnerSuccess({\n operationsPlanned: planOps.length,\n operationsExecuted,\n });\n }\n\n async execute(options: {\n readonly driver: SqlControlDriverInstance<string>;\n readonly perSpaceOptions: ReadonlyArray<\n SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>\n >;\n }): Promise<MigrationRunnerResult> {\n const driver = options.driver;\n const perSpaceOptions = options.perSpaceOptions;\n\n if (perSpaceOptions.length === 0) {\n return ok({ perSpaceResults: [] });\n }\n\n // FK pragma toggle and the FK integrity check both span the outer\n // transaction: PRAGMA foreign_keys is a no-op inside a transaction, so the\n // toggle has to wrap BEGIN/COMMIT.\n const fkWasEnabled = await this.readForeignKeysEnabled(driver);\n if (fkWasEnabled) {\n await driver.query('PRAGMA foreign_keys = OFF');\n }\n\n try {\n await this.beginExclusiveTransaction(driver);\n let committed = false;\n try {\n const perSpaceResults: Array<{\n space: string;\n value: SqlMigrationRunnerSuccessValue;\n }> = [];\n let lastProcessedSpace: string | undefined;\n for (const spaceOptions of perSpaceOptions) {\n const space = spaceOptions.space ?? spaceOptions.plan.spaceId;\n const result = await this.executeOnConnection({ ...spaceOptions, driver, space });\n if (!result.ok) {\n return notOk({ ...result.failure, failingSpace: space });\n }\n perSpaceResults.push({ space, value: result.value });\n lastProcessedSpace = space;\n }\n\n if (fkWasEnabled) {\n const fkIntegrityCheck = await this.verifyForeignKeyIntegrity(driver);\n if (!fkIntegrityCheck.ok) {\n // Post-loop integrity violations cannot be attributed to a\n // single per-space step (the cumulative effect of all\n // applied plans was needed to reveal the broken\n // reference). Surface the last successfully-applied space\n // so operators can investigate from the most recent\n // migration first.\n return notOk({\n ...fkIntegrityCheck.failure,\n failingSpace: lastProcessedSpace ?? APP_SPACE_ID,\n });\n }\n }\n\n await this.commitTransaction(driver);\n committed = true;\n return ok({ perSpaceResults });\n } finally {\n if (!committed) {\n await this.rollbackTransaction(driver);\n }\n }\n } finally {\n if (fkWasEnabled) {\n await driver.query('PRAGMA foreign_keys = ON');\n }\n }\n }\n\n private async readForeignKeysEnabled(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<boolean> {\n const result = await driver.query<{ foreign_keys: number }>('PRAGMA foreign_keys');\n const row = result.rows[0];\n return row?.foreign_keys === 1;\n }\n\n private async verifyForeignKeyIntegrity(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const result = await driver.query<Record<string, unknown>>('PRAGMA foreign_key_check');\n if (result.rows.length === 0) {\n return okVoid();\n }\n return runnerFailure(\n 'MIGRATION.FOREIGN_KEY_VIOLATION',\n `Foreign key integrity check failed after migration: ${result.rows.length} violation(s).`,\n {\n why: 'PRAGMA foreign_key_check reported violations after applying recreate-table operations.',\n meta: { violations: result.rows },\n },\n );\n }\n\n private async applyPlan(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n ops: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Promise<\n Result<\n {\n readonly operationsExecuted: number;\n readonly executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[];\n },\n SqlMigrationRunnerFailure\n >\n > {\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false;\n const runPostchecks = checks?.postchecks !== false;\n const runIdempotency = checks?.idempotencyChecks !== false;\n\n let operationsExecuted = 0;\n const executedOperations: Array<SqlMigrationPlanOperation<SqlitePlanTargetDetails>> = [];\n\n for (const operation of ops) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n if (runPostchecks && runIdempotency) {\n const postcheckAlreadySatisfied = await this.expectationsAreSatisfied(\n driver,\n operation.postcheck,\n );\n if (postcheckAlreadySatisfied) {\n executedOperations.push(this.createSkipRecord(operation));\n continue;\n }\n }\n\n if (runPrechecks) {\n const precheckResult = await this.runExpectationSteps(\n driver,\n operation.precheck,\n operation,\n 'precheck',\n );\n if (!precheckResult.ok) {\n return precheckResult;\n }\n }\n\n const executeResult = await this.runExecuteSteps(driver, operation.execute, operation);\n if (!executeResult.ok) {\n return executeResult;\n }\n\n if (runPostchecks) {\n const postcheckResult = await this.runExpectationSteps(\n driver,\n operation.postcheck,\n operation,\n 'postcheck',\n );\n if (!postcheckResult.ok) {\n return postcheckResult;\n }\n }\n\n executedOperations.push(operation);\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n return ok({ operationsExecuted, executedOperations });\n }\n\n private async ensureControlTables(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n contract: Contract<SqlStorage>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const legacyDetection = await this.detectLegacyMarkerShape(driver);\n if (!legacyDetection.ok) {\n return legacyDetection;\n }\n const lowererContext = { contract };\n for (const query of this.family.bootstrapControlTableQueries()) {\n await this.executeStatement(driver, await this.family.lowerAst(query, lowererContext));\n }\n return okVoid();\n }\n\n private async detectLegacyMarkerShape(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n const tableInfo = await driver.query<{ name: string }>(\n `PRAGMA table_info(\"${MARKER_TABLE_NAME}\")`,\n );\n if (tableInfo.rows.length === 0) {\n return okVoid();\n }\n const columns = new Set(tableInfo.rows.map((row) => row.name));\n if (columns.has('space')) {\n return okVoid();\n }\n return runnerFailure(\n 'MIGRATION.LEGACY_MARKER_SHAPE',\n `Legacy marker-table shape detected on ${MARKER_TABLE_NAME} (no \\`space\\` column). ` +\n 'Prisma Next is in pre-1.0; the previous transitional auto-migration to the per-space-row schema has been removed. ' +\n `Drop \\`${MARKER_TABLE_NAME}\\` and re-run \\`dbInit\\` to reinitialise from a clean baseline.`,\n {\n meta: {\n table: MARKER_TABLE_NAME,\n columns: [...columns].sort(),\n },\n },\n );\n }\n\n private async runExpectationSteps(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n phase: 'precheck' | 'postcheck',\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n const code =\n phase === 'precheck' ? 'MIGRATION.PRECHECK_FAILED' : 'MIGRATION.POSTCHECK_FAILED';\n return runnerFailure(\n code,\n `Operation ${operation.id} failed during ${phase}: ${step.description}`,\n {\n meta: {\n operationId: operation.id,\n phase,\n stepDescription: step.description,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private async runExecuteSteps(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n try {\n await driver.query(step.sql, step.params ?? []);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return runnerFailure(\n 'MIGRATION.EXECUTION_FAILED',\n `Operation ${operation.id} failed during execution: ${step.description}`,\n {\n why: message,\n meta: {\n operationId: operation.id,\n stepDescription: step.description,\n sql: step.sql,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private stepResultIsTrue(rows: readonly Record<string, unknown>[]): boolean {\n if (!rows || rows.length === 0) {\n return false;\n }\n const firstRow = rows[0];\n const firstValue = firstRow ? Object.values(firstRow)[0] : undefined;\n if (typeof firstValue === 'number') {\n return firstValue !== 0;\n }\n if (typeof firstValue === 'boolean') {\n return firstValue;\n }\n if (typeof firstValue === 'string') {\n const lower = firstValue.toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n return firstValue.length > 0;\n }\n return Boolean(firstValue);\n }\n\n private async expectationsAreSatisfied(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n ): Promise<boolean> {\n if (steps.length === 0) {\n return false;\n }\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n return false;\n }\n }\n return true;\n }\n\n private createSkipRecord(\n operation: SqlMigrationPlanOperation<SqlitePlanTargetDetails>,\n ): SqlMigrationPlanOperation<SqlitePlanTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...ifDefined('summary', operation.summary),\n operationClass: operation.operationClass,\n target: operation.target,\n precheck: Object.freeze([]),\n execute: Object.freeze([]),\n postcheck: Object.freeze([...operation.postcheck]),\n meta: Object.freeze({\n ...(operation.meta ?? {}),\n runner: Object.freeze({ skipped: true, reason: 'postcheck_pre_satisfied' }),\n }),\n });\n }\n\n private markerMatchesDestination(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['plan'],\n ): boolean {\n if (!marker) return false;\n if (marker.storageHash !== plan.destination.storageHash) return false;\n if (plan.destination.profileHash && marker.profileHash !== plan.destination.profileHash) {\n return false;\n }\n return true;\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Result<void, SqlMigrationRunnerFailure> {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'MIGRATION.POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${policy.allowedOperationClasses.join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n allowedClasses: policy.allowedOperationClasses,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['plan'],\n ): Result<void, SqlMigrationRunnerFailure> {\n const origin = plan.origin ?? null;\n if (!origin) {\n return okVoid();\n }\n if (!marker) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n { meta: { expectedOriginStorageHash: origin.storageHash } },\n );\n }\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (origin.profileHash && marker.profileHash !== origin.profileHash) {\n return runnerFailure(\n 'MIGRATION.MARKER_ORIGIN_MISMATCH',\n `Existing contract marker profile hash (${marker.profileHash}) does not match plan origin profile hash (${origin.profileHash}).`,\n {\n meta: {\n markerProfileHash: marker.profileHash,\n expectedOriginProfileHash: origin.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private ensurePlanMatchesDestinationContract(\n destination: SqlMigrationPlanContractInfo,\n contract: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['destinationContract'],\n ): Result<void, SqlMigrationRunnerFailure> {\n if (destination.storageHash !== contract.storage.storageHash) {\n return runnerFailure(\n 'MIGRATION.DESTINATION_CONTRACT_MISMATCH',\n `Plan destination storage hash (${destination.storageHash}) does not match provided contract storage hash (${contract.storage.storageHash}).`,\n {\n meta: {\n planStorageHash: destination.storageHash,\n contractStorageHash: contract.storage.storageHash,\n },\n },\n );\n }\n if (\n destination.profileHash &&\n contract.profileHash &&\n destination.profileHash !== contract.profileHash\n ) {\n return runnerFailure(\n 'MIGRATION.DESTINATION_CONTRACT_MISMATCH',\n `Plan destination profile hash (${destination.profileHash}) does not match provided contract profile hash (${contract.profileHash}).`,\n {\n meta: {\n planProfileHash: destination.profileHash,\n contractProfileHash: contract.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async upsertMarker(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n space: string,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n // Pass the plan's incoming invariants verbatim; `updateMarker` unions them\n // with the stored set (TS-side, dialect-uniform) under the runner's\n // BEGIN EXCLUSIVE — no client-side pre-merge here, so there is no\n // double-merge with the SPI's internal accumulate-dedupe.\n const destination = {\n storageHash: options.plan.destination.storageHash,\n profileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n invariants: options.plan.providedInvariants ?? [],\n };\n if (!existingMarker) {\n await this.family.initMarker({ driver, space, destination });\n return okVoid();\n }\n const updated = await this.family.updateMarker({\n driver,\n space,\n expectedFrom: existingMarker.storageHash,\n destination,\n });\n if (!updated) {\n return runnerFailure(\n 'MIGRATION.MARKER_CAS_FAILURE',\n 'Marker was modified by another process during migration execution.',\n {\n meta: {\n space,\n expectedStorageHash: existingMarker.storageHash,\n destinationStorageHash: options.plan.destination.storageHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async recordLedgerEntries(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>,\n executedOperations: readonly SqlMigrationPlanOperation<SqlitePlanTargetDetails>[],\n ): Promise<void> {\n const plan = options.plan;\n const space = plan.spaceId;\n const edges = options.migrationEdges;\n const totalEdgeOps = edges.reduce((sum, edge) => sum + edge.operationCount, 0);\n if (totalEdgeOps !== plan.operations.length) {\n throw new InternalError(\n `Ledger write: plan.operations length (${plan.operations.length}) does not match sum of migrationEdges operationCount (${totalEdgeOps})`,\n );\n }\n // The ledger records the operations as executed — idempotency-skipped ops\n // are substituted with skip records (empty `execute`) by `applyPlan`, so the\n // journal reflects what actually ran rather than the raw plan.\n let offset = 0;\n for (const edge of edges) {\n const edgeOps = executedOperations.slice(offset, offset + edge.operationCount);\n offset += edge.operationCount;\n await this.family.writeLedgerEntry({\n driver,\n space,\n entry: {\n edgeId: `${edge.from}->${edge.to}`,\n from: edge.from,\n to: edge.to,\n migrationName: edge.dirName,\n migrationHash: edge.migrationHash,\n operations: edgeOps,\n },\n });\n }\n }\n\n private async beginExclusiveTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('BEGIN EXCLUSIVE');\n }\n\n private async commitTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('COMMIT');\n }\n\n private async rollbackTransaction(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('ROLLBACK');\n }\n\n private async executeStatement(\n driver: SqlMigrationRunnerExecuteOptions<SqlitePlanTargetDetails>['driver'],\n statement: SqlExecuteRequest,\n ): Promise<void> {\n await driver.query(statement.sql, statement.params);\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport { SqlSchemaVerifierBase } from '@prisma-next/family-sql/ir';\nimport type {\n SchemaDiffIssue,\n SchemaVerifyOptions,\n} from '@prisma-next/framework-components/control';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';\n\n/**\n * SQLite target `SchemaVerifier` concretion. Mirrors the Postgres\n * shape: hooks return the empty list pending the call-site migration\n * that routes the existing verifier behaviour through the SPI.\n */\nexport class SqliteSchemaVerifier extends SqlSchemaVerifierBase<Contract<SqlStorage>, SqlSchemaIR> {\n protected verifyCommonSqlSchema(\n _options: SchemaVerifyOptions<Contract<SqlStorage>, SqlSchemaIR>,\n ): readonly SchemaDiffIssue[] {\n return [];\n }\n\n protected verifyTargetExtensions(\n _options: SchemaVerifyOptions<Contract<SqlStorage>, SqlSchemaIR>,\n ): readonly SchemaDiffIssue[] {\n return [];\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { SqlControlTargetDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport type {\n ControlTargetInstance,\n MigrationPlanner,\n MigrationRunner,\n} from '@prisma-next/framework-components/control';\nimport { SqlStorage } from '@prisma-next/sql-contract/types';\nimport {\n relationalNodeEntityKind,\n relationalNodeGranularity,\n} from '@prisma-next/sql-schema-ir/types';\nimport { sqliteTargetDescriptorMeta } from './descriptor-meta';\nimport { sqliteError } from './errors';\nimport { diffSqliteSchema, sqliteContractToSchema } from './migrations/diff-database-schema';\nimport { createSqliteMigrationPlanner } from './migrations/planner';\nimport type { SqlitePlanTargetDetails } from './migrations/planner-target-details';\nimport { createSqliteMigrationRunner } from './migrations/runner';\nimport { SqliteContractSerializer } from './sqlite-contract-serializer';\nimport { SqliteSchemaVerifier } from './sqlite-schema-verifier';\n\nfunction isSqlContract(contract: Contract | null): contract is Contract<SqlStorage> | null {\n return contract === null || contract.storage instanceof SqlStorage;\n}\n\nconst sqliteControlTargetDescriptor: SqlControlTargetDescriptor<'sqlite', SqlitePlanTargetDetails> =\n {\n ...sqliteTargetDescriptorMeta,\n contractSerializer: new SqliteContractSerializer(),\n schemaVerifier: new SqliteSchemaVerifier(),\n diffSchema(input) {\n return diffSqliteSchema(input);\n },\n classifySubjectGranularity: relationalNodeGranularity,\n classifyEntityKind: relationalNodeEntityKind,\n migrations: {\n createPlanner(adapter: SqlControlAdapter<'sqlite'>): MigrationPlanner<'sql', 'sqlite'> {\n return createSqliteMigrationPlanner(adapter);\n },\n createRunner(family) {\n return createSqliteMigrationRunner(family) as MigrationRunner<'sql', 'sqlite'>;\n },\n contractToSchema(contract, _frameworkComponents) {\n // The framework SPI types `contract` as the generic\n // `Contract | null`. Any contract reaching the sqlite\n // target descriptor is SQL-family by construction (the\n // family contract resolver would have refused to bind a\n // sqlite target otherwise); the `isSqlContract` predicate\n // encodes that invariant at runtime + narrows the generic\n // to `Contract<SqlStorage>` without a blind cast.\n if (!isSqlContract(contract)) {\n throw sqliteError(\n 'CONTRACT.TARGET_MISMATCH',\n 'sqliteControlTargetDescriptor.contractToSchema received a non-SQL contract; expected Contract<SqlStorage>',\n );\n }\n return sqliteContractToSchema(contract);\n },\n },\n create(): ControlTargetInstance<'sql', 'sqlite'> {\n return {\n familyId: 'sql',\n targetId: 'sqlite',\n };\n },\n createPlanner(adapter: SqlControlAdapter<'sqlite'>) {\n return createSqliteMigrationPlanner(adapter);\n },\n createRunner(family) {\n return createSqliteMigrationRunner(family);\n },\n };\n\nexport default sqliteControlTargetDescriptor;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CliStructuredError } from "@prisma-next/errors/control";
|
|
2
|
+
import { structuredError } from "@prisma-next/utils/structured-error";
|
|
3
|
+
//#region src/core/errors.ts
|
|
4
|
+
function sqliteError(code, message, options) {
|
|
5
|
+
return structuredError(code, message, options);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A `SqliteMigration` operation that needs the materialized control adapter
|
|
9
|
+
* — named by `operation` (e.g. `createTable`, `dropColumn`, `recreateTable`) —
|
|
10
|
+
* was invoked, but the migration was constructed without a `ControlStack`.
|
|
11
|
+
* Concrete authoring usage always goes through the migration CLI entrypoint,
|
|
12
|
+
* which assembles a stack from the loaded `prisma-next.config.ts`; reaching this
|
|
13
|
+
* error means a test fixture or ad-hoc consumer instantiated `SqliteMigration`
|
|
14
|
+
* with the no-arg form (legal for `operations` / `describe` introspection only).
|
|
15
|
+
*
|
|
16
|
+
* The `operation` argument is required so every throw site names the operation
|
|
17
|
+
* that actually failed; a new operation cannot inherit a misattributed message.
|
|
18
|
+
*
|
|
19
|
+
* Distinct from `MIGRATION.UNFILLED_PLACEHOLDER` (placeholder not filled)
|
|
20
|
+
* because the missing input is the stack itself, not the per-operation
|
|
21
|
+
* contract.
|
|
22
|
+
*
|
|
23
|
+
* Lives in `@prisma-next/target-sqlite/errors` rather than the shared
|
|
24
|
+
* framework migration errors module because the failure is target-specific:
|
|
25
|
+
* the contract it talks about (`SqliteMigration`, the SQLite control
|
|
26
|
+
* adapter, the SQLite-target stack) only exists in this package.
|
|
27
|
+
*/
|
|
28
|
+
function errorSqliteMigrationStackMissing(operation) {
|
|
29
|
+
return new CliStructuredError("MIGRATION.SQLITE_CONTROL_STACK_MISSING", `SqliteMigration.${operation} requires a control adapter`, {
|
|
30
|
+
why: `SqliteMigration.${operation} was invoked on an instance constructed without a ControlStack, so the stored controlAdapter is undefined and the operation cannot lower its DDL node.`,
|
|
31
|
+
fix: "Construct the migration via the migration CLI entrypoint (which assembles a ControlStack from the loaded prisma-next.config.ts), or pass a ControlStack containing a SQLite adapter to the migration constructor in test fixtures.",
|
|
32
|
+
meta: { operation }
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { sqliteError as n, errorSqliteMigrationStackMissing as t };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=errors-B1JPoWDh.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-B1JPoWDh.mjs","names":[],"sources":["../src/core/errors.ts"],"sourcesContent":["import { CliStructuredError } from '@prisma-next/errors/control';\nimport type { StructuredError, StructuredErrorOptions } from '@prisma-next/utils/structured-error';\nimport { structuredError } from '@prisma-next/utils/structured-error';\n\nexport type SqliteTargetErrorCode =\n | 'CONTRACT.CONSTRAINT_INVALID'\n | 'CONTRACT.DEFAULT_INVALID'\n | 'CONTRACT.IDENTIFIER_INVALID'\n | 'CONTRACT.NAMESPACE_INVALID'\n | 'CONTRACT.NATIVE_TYPE_INVALID'\n | 'CONTRACT.TARGET_MISMATCH'\n | 'CONTRACT.TYPE_UNKNOWN'\n | 'MIGRATION.CONTRACT_SPACE_VIOLATION'\n | 'MIGRATION.SQLITE_CONTROL_STACK_MISSING'\n | 'MIGRATION.TARGET_MISMATCH'\n | 'RUNTIME.DECODE_FAILED'\n | 'RUNTIME.ENCODE_FAILED';\n\nexport function sqliteError(\n code: SqliteTargetErrorCode,\n message: string,\n options?: StructuredErrorOptions,\n): StructuredError {\n return structuredError(code, message, options);\n}\n\n/**\n * A `SqliteMigration` operation that needs the materialized control adapter\n * — named by `operation` (e.g. `createTable`, `dropColumn`, `recreateTable`) —\n * was invoked, but the migration was constructed without a `ControlStack`.\n * Concrete authoring usage always goes through the migration CLI entrypoint,\n * which assembles a stack from the loaded `prisma-next.config.ts`; reaching this\n * error means a test fixture or ad-hoc consumer instantiated `SqliteMigration`\n * with the no-arg form (legal for `operations` / `describe` introspection only).\n *\n * The `operation` argument is required so every throw site names the operation\n * that actually failed; a new operation cannot inherit a misattributed message.\n *\n * Distinct from `MIGRATION.UNFILLED_PLACEHOLDER` (placeholder not filled)\n * because the missing input is the stack itself, not the per-operation\n * contract.\n *\n * Lives in `@prisma-next/target-sqlite/errors` rather than the shared\n * framework migration errors module because the failure is target-specific:\n * the contract it talks about (`SqliteMigration`, the SQLite control\n * adapter, the SQLite-target stack) only exists in this package.\n */\nexport function errorSqliteMigrationStackMissing(operation: string): CliStructuredError {\n return new CliStructuredError(\n 'MIGRATION.SQLITE_CONTROL_STACK_MISSING',\n `SqliteMigration.${operation} requires a control adapter`,\n {\n why: `SqliteMigration.${operation} was invoked on an instance constructed without a ControlStack, so the stored controlAdapter is undefined and the operation cannot lower its DDL node.`,\n fix: 'Construct the migration via the migration CLI entrypoint (which assembles a ControlStack from the loaded prisma-next.config.ts), or pass a ControlStack containing a SQLite adapter to the migration constructor in test fixtures.',\n meta: { operation },\n },\n );\n}\n"],"mappings":";;;AAkBA,SAAgB,YACd,MACA,SACA,SACiB;CACjB,OAAO,gBAAgB,MAAM,SAAS,OAAO;AAC/C;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,iCAAiC,WAAuC;CACtF,OAAO,IAAI,mBACT,0CACA,mBAAmB,UAAU,8BAC7B;EACE,KAAK,mBAAmB,UAAU;EAClC,KAAK;EACL,MAAM,EAAE,UAAU;CACpB,CACF;AACF"}
|
package/dist/migration.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as Op } from "./shared-DLUM4Ae2.mjs";
|
|
2
|
-
import { t as SqliteMigration } from "./sqlite-migration-
|
|
2
|
+
import { t as SqliteMigration } from "./sqlite-migration-CBXynqeE.mjs";
|
|
3
3
|
import { placeholder } from "@prisma-next/errors/migration";
|
|
4
4
|
import { col, fn, foreignKey, lit, primaryKey, unique } from "@prisma-next/sql-relational-core/contract-free";
|
|
5
5
|
import { MigrationCLI } from "@prisma-next/cli/migration-cli";
|
package/dist/migration.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { f as step } from "./op-factory-call-
|
|
1
|
+
import { f as step } from "./op-factory-call-BkqsWGiy.mjs";
|
|
2
2
|
import { t as buildTargetDetails } from "./planner-target-details-H8z9TFDg.mjs";
|
|
3
|
-
import { t as SqliteMigration } from "./sqlite-migration-
|
|
3
|
+
import { t as SqliteMigration } from "./sqlite-migration-DrZIdg3i.mjs";
|
|
4
4
|
import { placeholder } from "@prisma-next/errors/migration";
|
|
5
5
|
import { col, fn, foreignKey, lit, primaryKey, unique } from "@prisma-next/sql-relational-core/contract-free";
|
|
6
6
|
import { MigrationCLI } from "@prisma-next/cli/migration-cli";
|