@prisma-next/family-sql 0.3.0-pr.93.5 → 0.3.0-pr.94.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/control-adapter.d.mts +47 -0
  2. package/dist/control-adapter.d.mts.map +1 -0
  3. package/dist/control-adapter.mjs +1 -0
  4. package/dist/control.d.mts +65 -0
  5. package/dist/control.d.mts.map +1 -0
  6. package/dist/control.mjs +136 -0
  7. package/dist/control.mjs.map +1 -0
  8. package/dist/instance-B_PdDN4y.mjs +525 -0
  9. package/dist/instance-B_PdDN4y.mjs.map +1 -0
  10. package/dist/instance-wm4TrZN0.d.mts +130 -0
  11. package/dist/instance-wm4TrZN0.d.mts.map +1 -0
  12. package/dist/runtime.d.mts +70 -0
  13. package/dist/runtime.d.mts.map +1 -0
  14. package/dist/runtime.mjs +74 -0
  15. package/dist/runtime.mjs.map +1 -0
  16. package/dist/schema-verify.d.mts +85 -0
  17. package/dist/schema-verify.d.mts.map +1 -0
  18. package/dist/schema-verify.mjs +3 -0
  19. package/dist/test-utils.d.mts +31 -0
  20. package/dist/test-utils.d.mts.map +1 -0
  21. package/dist/test-utils.mjs +5 -0
  22. package/dist/types-D5CPT9N4.d.mts +270 -0
  23. package/dist/types-D5CPT9N4.d.mts.map +1 -0
  24. package/dist/verify-DhFytkFC.mjs +108 -0
  25. package/dist/verify-DhFytkFC.mjs.map +1 -0
  26. package/dist/verify-sql-schema-BnLVoeWI.mjs +686 -0
  27. package/dist/verify-sql-schema-BnLVoeWI.mjs.map +1 -0
  28. package/dist/verify.d.mts +31 -0
  29. package/dist/verify.d.mts.map +1 -0
  30. package/dist/verify.mjs +3 -0
  31. package/package.json +30 -43
  32. package/dist/chunk-F27CR6XZ.js +0 -589
  33. package/dist/chunk-F27CR6XZ.js.map +0 -1
  34. package/dist/chunk-SU7LN2UH.js +0 -96
  35. package/dist/chunk-SU7LN2UH.js.map +0 -1
  36. package/dist/chunk-XH2Y5NTD.js +0 -715
  37. package/dist/chunk-XH2Y5NTD.js.map +0 -1
  38. package/dist/core/assembly.d.ts +0 -25
  39. package/dist/core/assembly.d.ts.map +0 -1
  40. package/dist/core/control-adapter.d.ts +0 -42
  41. package/dist/core/control-adapter.d.ts.map +0 -1
  42. package/dist/core/descriptor.d.ts +0 -24
  43. package/dist/core/descriptor.d.ts.map +0 -1
  44. package/dist/core/instance.d.ts +0 -140
  45. package/dist/core/instance.d.ts.map +0 -1
  46. package/dist/core/migrations/plan-helpers.d.ts +0 -20
  47. package/dist/core/migrations/plan-helpers.d.ts.map +0 -1
  48. package/dist/core/migrations/policies.d.ts +0 -6
  49. package/dist/core/migrations/policies.d.ts.map +0 -1
  50. package/dist/core/migrations/types.d.ts +0 -280
  51. package/dist/core/migrations/types.d.ts.map +0 -1
  52. package/dist/core/runtime-descriptor.d.ts +0 -19
  53. package/dist/core/runtime-descriptor.d.ts.map +0 -1
  54. package/dist/core/runtime-instance.d.ts +0 -54
  55. package/dist/core/runtime-instance.d.ts.map +0 -1
  56. package/dist/core/schema-verify/verify-helpers.d.ts +0 -96
  57. package/dist/core/schema-verify/verify-helpers.d.ts.map +0 -1
  58. package/dist/core/schema-verify/verify-sql-schema.d.ts +0 -45
  59. package/dist/core/schema-verify/verify-sql-schema.d.ts.map +0 -1
  60. package/dist/core/verify.d.ts +0 -39
  61. package/dist/core/verify.d.ts.map +0 -1
  62. package/dist/exports/control-adapter.d.ts +0 -2
  63. package/dist/exports/control-adapter.d.ts.map +0 -1
  64. package/dist/exports/control-adapter.js +0 -1
  65. package/dist/exports/control-adapter.js.map +0 -1
  66. package/dist/exports/control.d.ts +0 -13
  67. package/dist/exports/control.d.ts.map +0 -1
  68. package/dist/exports/control.js +0 -149
  69. package/dist/exports/control.js.map +0 -1
  70. package/dist/exports/runtime.d.ts +0 -8
  71. package/dist/exports/runtime.d.ts.map +0 -1
  72. package/dist/exports/runtime.js +0 -64
  73. package/dist/exports/runtime.js.map +0 -1
  74. package/dist/exports/schema-verify.d.ts +0 -11
  75. package/dist/exports/schema-verify.d.ts.map +0 -1
  76. package/dist/exports/schema-verify.js +0 -15
  77. package/dist/exports/schema-verify.js.map +0 -1
  78. package/dist/exports/test-utils.d.ts +0 -7
  79. package/dist/exports/test-utils.d.ts.map +0 -1
  80. package/dist/exports/test-utils.js +0 -17
  81. package/dist/exports/test-utils.js.map +0 -1
  82. package/dist/exports/verify.d.ts +0 -2
  83. package/dist/exports/verify.d.ts.map +0 -1
  84. package/dist/exports/verify.js +0 -11
  85. package/dist/exports/verify.js.map +0 -1
@@ -1,715 +0,0 @@
1
- // src/core/schema-verify/verify-helpers.ts
2
- function arraysEqual(a, b) {
3
- if (a.length !== b.length) {
4
- return false;
5
- }
6
- for (let i = 0; i < a.length; i++) {
7
- if (a[i] !== b[i]) {
8
- return false;
9
- }
10
- }
11
- return true;
12
- }
13
- function isUniqueConstraintSatisfied(uniques, indexes, columns) {
14
- const hasConstraint = uniques.some((unique) => arraysEqual(unique.columns, columns));
15
- if (hasConstraint) {
16
- return true;
17
- }
18
- return indexes.some((index) => index.unique && arraysEqual(index.columns, columns));
19
- }
20
- function isIndexSatisfied(indexes, uniques, columns) {
21
- const hasMatchingIndex = indexes.some((index) => arraysEqual(index.columns, columns));
22
- if (hasMatchingIndex) {
23
- return true;
24
- }
25
- return uniques.some((unique) => arraysEqual(unique.columns, columns));
26
- }
27
- function verifyPrimaryKey(contractPK, schemaPK, tableName, issues) {
28
- if (!schemaPK) {
29
- issues.push({
30
- kind: "primary_key_mismatch",
31
- table: tableName,
32
- expected: contractPK.columns.join(", "),
33
- message: `Table "${tableName}" is missing primary key`
34
- });
35
- return "fail";
36
- }
37
- if (!arraysEqual(contractPK.columns, schemaPK.columns)) {
38
- issues.push({
39
- kind: "primary_key_mismatch",
40
- table: tableName,
41
- expected: contractPK.columns.join(", "),
42
- actual: schemaPK.columns.join(", "),
43
- message: `Table "${tableName}" has primary key mismatch: expected columns [${contractPK.columns.join(", ")}], got [${schemaPK.columns.join(", ")}]`
44
- });
45
- return "fail";
46
- }
47
- return "pass";
48
- }
49
- function verifyForeignKeys(contractFKs, schemaFKs, tableName, tablePath, issues, strict) {
50
- const nodes = [];
51
- for (const contractFK of contractFKs) {
52
- const fkPath = `${tablePath}.foreignKeys[${contractFK.columns.join(",")}]`;
53
- const matchingFK = schemaFKs.find((fk) => {
54
- return arraysEqual(fk.columns, contractFK.columns) && fk.referencedTable === contractFK.references.table && arraysEqual(fk.referencedColumns, contractFK.references.columns);
55
- });
56
- if (!matchingFK) {
57
- issues.push({
58
- kind: "foreign_key_mismatch",
59
- table: tableName,
60
- expected: `${contractFK.columns.join(", ")} -> ${contractFK.references.table}(${contractFK.references.columns.join(", ")})`,
61
- message: `Table "${tableName}" is missing foreign key: ${contractFK.columns.join(", ")} -> ${contractFK.references.table}(${contractFK.references.columns.join(", ")})`
62
- });
63
- nodes.push({
64
- status: "fail",
65
- kind: "foreignKey",
66
- name: `foreignKey(${contractFK.columns.join(", ")})`,
67
- contractPath: fkPath,
68
- code: "foreign_key_mismatch",
69
- message: "Foreign key missing",
70
- expected: contractFK,
71
- actual: void 0,
72
- children: []
73
- });
74
- } else {
75
- nodes.push({
76
- status: "pass",
77
- kind: "foreignKey",
78
- name: `foreignKey(${contractFK.columns.join(", ")})`,
79
- contractPath: fkPath,
80
- code: "",
81
- message: "",
82
- expected: void 0,
83
- actual: void 0,
84
- children: []
85
- });
86
- }
87
- }
88
- if (strict) {
89
- for (const schemaFK of schemaFKs) {
90
- const matchingFK = contractFKs.find((fk) => {
91
- return arraysEqual(fk.columns, schemaFK.columns) && fk.references.table === schemaFK.referencedTable && arraysEqual(fk.references.columns, schemaFK.referencedColumns);
92
- });
93
- if (!matchingFK) {
94
- issues.push({
95
- kind: "extra_foreign_key",
96
- table: tableName,
97
- message: `Extra foreign key found in database (not in contract): ${schemaFK.columns.join(", ")} -> ${schemaFK.referencedTable}(${schemaFK.referencedColumns.join(", ")})`
98
- });
99
- nodes.push({
100
- status: "fail",
101
- kind: "foreignKey",
102
- name: `foreignKey(${schemaFK.columns.join(", ")})`,
103
- contractPath: `${tablePath}.foreignKeys[${schemaFK.columns.join(",")}]`,
104
- code: "extra_foreign_key",
105
- message: "Extra foreign key found",
106
- expected: void 0,
107
- actual: schemaFK,
108
- children: []
109
- });
110
- }
111
- }
112
- }
113
- return nodes;
114
- }
115
- function verifyUniqueConstraints(contractUniques, schemaUniques, schemaIndexes, tableName, tablePath, issues, strict) {
116
- const nodes = [];
117
- for (const contractUnique of contractUniques) {
118
- const uniquePath = `${tablePath}.uniques[${contractUnique.columns.join(",")}]`;
119
- const matchingUnique = schemaUniques.find(
120
- (u) => arraysEqual(u.columns, contractUnique.columns)
121
- );
122
- const matchingUniqueIndex = !matchingUnique && schemaIndexes.find((idx) => idx.unique && arraysEqual(idx.columns, contractUnique.columns));
123
- if (!matchingUnique && !matchingUniqueIndex) {
124
- issues.push({
125
- kind: "unique_constraint_mismatch",
126
- table: tableName,
127
- expected: contractUnique.columns.join(", "),
128
- message: `Table "${tableName}" is missing unique constraint: ${contractUnique.columns.join(", ")}`
129
- });
130
- nodes.push({
131
- status: "fail",
132
- kind: "unique",
133
- name: `unique(${contractUnique.columns.join(", ")})`,
134
- contractPath: uniquePath,
135
- code: "unique_constraint_mismatch",
136
- message: "Unique constraint missing",
137
- expected: contractUnique,
138
- actual: void 0,
139
- children: []
140
- });
141
- } else {
142
- nodes.push({
143
- status: "pass",
144
- kind: "unique",
145
- name: `unique(${contractUnique.columns.join(", ")})`,
146
- contractPath: uniquePath,
147
- code: "",
148
- message: "",
149
- expected: void 0,
150
- actual: void 0,
151
- children: []
152
- });
153
- }
154
- }
155
- if (strict) {
156
- for (const schemaUnique of schemaUniques) {
157
- const matchingUnique = contractUniques.find(
158
- (u) => arraysEqual(u.columns, schemaUnique.columns)
159
- );
160
- if (!matchingUnique) {
161
- issues.push({
162
- kind: "extra_unique_constraint",
163
- table: tableName,
164
- message: `Extra unique constraint found in database (not in contract): ${schemaUnique.columns.join(", ")}`
165
- });
166
- nodes.push({
167
- status: "fail",
168
- kind: "unique",
169
- name: `unique(${schemaUnique.columns.join(", ")})`,
170
- contractPath: `${tablePath}.uniques[${schemaUnique.columns.join(",")}]`,
171
- code: "extra_unique_constraint",
172
- message: "Extra unique constraint found",
173
- expected: void 0,
174
- actual: schemaUnique,
175
- children: []
176
- });
177
- }
178
- }
179
- }
180
- return nodes;
181
- }
182
- function verifyIndexes(contractIndexes, schemaIndexes, schemaUniques, tableName, tablePath, issues, strict) {
183
- const nodes = [];
184
- for (const contractIndex of contractIndexes) {
185
- const indexPath = `${tablePath}.indexes[${contractIndex.columns.join(",")}]`;
186
- const matchingIndex = schemaIndexes.find(
187
- (idx) => arraysEqual(idx.columns, contractIndex.columns)
188
- );
189
- const matchingUniqueConstraint = !matchingIndex && schemaUniques.find((u) => arraysEqual(u.columns, contractIndex.columns));
190
- if (!matchingIndex && !matchingUniqueConstraint) {
191
- issues.push({
192
- kind: "index_mismatch",
193
- table: tableName,
194
- expected: contractIndex.columns.join(", "),
195
- message: `Table "${tableName}" is missing index: ${contractIndex.columns.join(", ")}`
196
- });
197
- nodes.push({
198
- status: "fail",
199
- kind: "index",
200
- name: `index(${contractIndex.columns.join(", ")})`,
201
- contractPath: indexPath,
202
- code: "index_mismatch",
203
- message: "Index missing",
204
- expected: contractIndex,
205
- actual: void 0,
206
- children: []
207
- });
208
- } else {
209
- nodes.push({
210
- status: "pass",
211
- kind: "index",
212
- name: `index(${contractIndex.columns.join(", ")})`,
213
- contractPath: indexPath,
214
- code: "",
215
- message: "",
216
- expected: void 0,
217
- actual: void 0,
218
- children: []
219
- });
220
- }
221
- }
222
- if (strict) {
223
- for (const schemaIndex of schemaIndexes) {
224
- if (schemaIndex.unique) {
225
- continue;
226
- }
227
- const matchingIndex = contractIndexes.find(
228
- (idx) => arraysEqual(idx.columns, schemaIndex.columns)
229
- );
230
- if (!matchingIndex) {
231
- issues.push({
232
- kind: "extra_index",
233
- table: tableName,
234
- message: `Extra index found in database (not in contract): ${schemaIndex.columns.join(", ")}`
235
- });
236
- nodes.push({
237
- status: "fail",
238
- kind: "index",
239
- name: `index(${schemaIndex.columns.join(", ")})`,
240
- contractPath: `${tablePath}.indexes[${schemaIndex.columns.join(",")}]`,
241
- code: "extra_index",
242
- message: "Extra index found",
243
- expected: void 0,
244
- actual: schemaIndex,
245
- children: []
246
- });
247
- }
248
- }
249
- }
250
- return nodes;
251
- }
252
- function verifyDatabaseDependencies(dependencies, schema, issues) {
253
- const nodes = [];
254
- for (const dependency of dependencies) {
255
- const depIssues = dependency.verifyDatabaseDependencyInstalled(schema);
256
- const depPath = `dependencies.${dependency.id}`;
257
- if (depIssues.length > 0) {
258
- issues.push(...depIssues);
259
- const issuesMessage = depIssues.map((i) => i.message).join("; ");
260
- const nodeMessage = issuesMessage ? `${dependency.id}: ${issuesMessage}` : dependency.id;
261
- nodes.push({
262
- status: "fail",
263
- kind: "databaseDependency",
264
- name: dependency.label,
265
- contractPath: depPath,
266
- code: "dependency_missing",
267
- message: nodeMessage,
268
- expected: void 0,
269
- actual: void 0,
270
- children: []
271
- });
272
- } else {
273
- nodes.push({
274
- status: "pass",
275
- kind: "databaseDependency",
276
- name: dependency.label,
277
- contractPath: depPath,
278
- code: "",
279
- message: "",
280
- expected: void 0,
281
- actual: void 0,
282
- children: []
283
- });
284
- }
285
- }
286
- return nodes;
287
- }
288
- function computeCounts(node) {
289
- let pass = 0;
290
- let warn = 0;
291
- let fail = 0;
292
- function traverse(n) {
293
- if (n.status === "pass") {
294
- pass++;
295
- } else if (n.status === "warn") {
296
- warn++;
297
- } else if (n.status === "fail") {
298
- fail++;
299
- }
300
- if (n.children) {
301
- for (const child of n.children) {
302
- traverse(child);
303
- }
304
- }
305
- }
306
- traverse(node);
307
- return {
308
- pass,
309
- warn,
310
- fail,
311
- totalNodes: pass + warn + fail
312
- };
313
- }
314
-
315
- // src/core/schema-verify/verify-sql-schema.ts
316
- import { ifDefined } from "@prisma-next/utils/defined";
317
- function verifySqlSchema(options) {
318
- const { contract, schema, strict, context, typeMetadataRegistry } = options;
319
- const startTime = Date.now();
320
- const contractCoreHash = contract.coreHash;
321
- const contractProfileHash = "profileHash" in contract && typeof contract.profileHash === "string" ? contract.profileHash : void 0;
322
- const contractTarget = contract.target;
323
- const issues = [];
324
- const rootChildren = [];
325
- const contractTables = contract.storage.tables;
326
- const schemaTables = schema.tables;
327
- for (const [tableName, contractTable] of Object.entries(contractTables)) {
328
- const schemaTable = schemaTables[tableName];
329
- const tablePath = `storage.tables.${tableName}`;
330
- if (!schemaTable) {
331
- issues.push({
332
- kind: "missing_table",
333
- table: tableName,
334
- message: `Table "${tableName}" is missing from database`
335
- });
336
- rootChildren.push({
337
- status: "fail",
338
- kind: "table",
339
- name: `table ${tableName}`,
340
- contractPath: tablePath,
341
- code: "missing_table",
342
- message: `Table "${tableName}" is missing`,
343
- expected: void 0,
344
- actual: void 0,
345
- children: []
346
- });
347
- continue;
348
- }
349
- const tableChildren = [];
350
- const columnNodes = [];
351
- for (const [columnName, contractColumn] of Object.entries(contractTable.columns)) {
352
- const schemaColumn = schemaTable.columns[columnName];
353
- const columnPath = `${tablePath}.columns.${columnName}`;
354
- if (!schemaColumn) {
355
- issues.push({
356
- kind: "missing_column",
357
- table: tableName,
358
- column: columnName,
359
- message: `Column "${tableName}"."${columnName}" is missing from database`
360
- });
361
- columnNodes.push({
362
- status: "fail",
363
- kind: "column",
364
- name: `${columnName}: missing`,
365
- contractPath: columnPath,
366
- code: "missing_column",
367
- message: `Column "${columnName}" is missing`,
368
- expected: void 0,
369
- actual: void 0,
370
- children: []
371
- });
372
- continue;
373
- }
374
- const columnChildren = [];
375
- let columnStatus = "pass";
376
- const contractNativeType = contractColumn.nativeType;
377
- const schemaNativeType = schemaColumn.nativeType;
378
- if (contractNativeType !== schemaNativeType) {
379
- issues.push({
380
- kind: "type_mismatch",
381
- table: tableName,
382
- column: columnName,
383
- expected: contractNativeType,
384
- actual: schemaNativeType,
385
- message: `Column "${tableName}"."${columnName}" has type mismatch: expected "${contractNativeType}", got "${schemaNativeType}"`
386
- });
387
- columnChildren.push({
388
- status: "fail",
389
- kind: "type",
390
- name: "type",
391
- contractPath: `${columnPath}.nativeType`,
392
- code: "type_mismatch",
393
- message: `Type mismatch: expected ${contractNativeType}, got ${schemaNativeType}`,
394
- expected: contractNativeType,
395
- actual: schemaNativeType,
396
- children: []
397
- });
398
- columnStatus = "fail";
399
- }
400
- if (contractColumn.codecId) {
401
- const typeMetadata = typeMetadataRegistry.get(contractColumn.codecId);
402
- if (!typeMetadata) {
403
- columnChildren.push({
404
- status: "warn",
405
- kind: "type",
406
- name: "type_metadata_missing",
407
- contractPath: `${columnPath}.codecId`,
408
- code: "type_metadata_missing",
409
- message: `codecId "${contractColumn.codecId}" not found in type metadata registry`,
410
- expected: contractColumn.codecId,
411
- actual: void 0,
412
- children: []
413
- });
414
- } else if (typeMetadata.nativeType && typeMetadata.nativeType !== contractNativeType) {
415
- columnChildren.push({
416
- status: "warn",
417
- kind: "type",
418
- name: "type_consistency",
419
- contractPath: `${columnPath}.codecId`,
420
- code: "type_consistency_warning",
421
- message: `codecId "${contractColumn.codecId}" maps to nativeType "${typeMetadata.nativeType}" in registry, but contract has "${contractNativeType}"`,
422
- expected: typeMetadata.nativeType,
423
- actual: contractNativeType,
424
- children: []
425
- });
426
- }
427
- }
428
- if (contractColumn.nullable !== schemaColumn.nullable) {
429
- issues.push({
430
- kind: "nullability_mismatch",
431
- table: tableName,
432
- column: columnName,
433
- expected: String(contractColumn.nullable),
434
- actual: String(schemaColumn.nullable),
435
- message: `Column "${tableName}"."${columnName}" has nullability mismatch: expected ${contractColumn.nullable ? "nullable" : "not null"}, got ${schemaColumn.nullable ? "nullable" : "not null"}`
436
- });
437
- columnChildren.push({
438
- status: "fail",
439
- kind: "nullability",
440
- name: "nullability",
441
- contractPath: `${columnPath}.nullable`,
442
- code: "nullability_mismatch",
443
- message: `Nullability mismatch: expected ${contractColumn.nullable ? "nullable" : "not null"}, got ${schemaColumn.nullable ? "nullable" : "not null"}`,
444
- expected: contractColumn.nullable,
445
- actual: schemaColumn.nullable,
446
- children: []
447
- });
448
- columnStatus = "fail";
449
- }
450
- const computedColumnStatus = columnChildren.some((c) => c.status === "fail") ? "fail" : columnChildren.some((c) => c.status === "warn") ? "warn" : "pass";
451
- const finalColumnStatus = columnChildren.length > 0 ? computedColumnStatus : columnStatus;
452
- const nullableText = contractColumn.nullable ? "nullable" : "not nullable";
453
- const columnTypeDisplay = contractColumn.codecId ? `${contractNativeType} (${contractColumn.codecId})` : contractNativeType;
454
- const failureMessages = columnChildren.filter((child) => child.status === "fail" && child.message).map((child) => child.message).filter((msg) => typeof msg === "string" && msg.length > 0);
455
- const columnMessage = finalColumnStatus === "fail" && failureMessages.length > 0 ? failureMessages.join("; ") : "";
456
- const columnCode = (finalColumnStatus === "fail" || finalColumnStatus === "warn") && columnChildren[0] ? columnChildren[0].code : "";
457
- columnNodes.push({
458
- status: finalColumnStatus,
459
- kind: "column",
460
- name: `${columnName}: ${columnTypeDisplay} (${nullableText})`,
461
- contractPath: columnPath,
462
- code: columnCode,
463
- message: columnMessage,
464
- expected: void 0,
465
- actual: void 0,
466
- children: columnChildren
467
- });
468
- }
469
- if (columnNodes.length > 0) {
470
- const columnsStatus = columnNodes.some((c) => c.status === "fail") ? "fail" : columnNodes.some((c) => c.status === "warn") ? "warn" : "pass";
471
- tableChildren.push({
472
- status: columnsStatus,
473
- kind: "columns",
474
- name: "columns",
475
- contractPath: `${tablePath}.columns`,
476
- code: "",
477
- message: "",
478
- expected: void 0,
479
- actual: void 0,
480
- children: columnNodes
481
- });
482
- }
483
- if (strict) {
484
- for (const [columnName, { nativeType }] of Object.entries(schemaTable.columns)) {
485
- if (!contractTable.columns[columnName]) {
486
- issues.push({
487
- kind: "extra_column",
488
- table: tableName,
489
- column: columnName,
490
- message: `Extra column "${tableName}"."${columnName}" found in database (not in contract)`
491
- });
492
- columnNodes.push({
493
- status: "fail",
494
- kind: "column",
495
- name: `${columnName}: extra`,
496
- contractPath: `${tablePath}.columns.${columnName}`,
497
- code: "extra_column",
498
- message: `Extra column "${columnName}" found`,
499
- expected: void 0,
500
- actual: nativeType,
501
- children: []
502
- });
503
- }
504
- }
505
- }
506
- if (contractTable.primaryKey) {
507
- const pkStatus = verifyPrimaryKey(
508
- contractTable.primaryKey,
509
- schemaTable.primaryKey,
510
- tableName,
511
- issues
512
- );
513
- if (pkStatus === "fail") {
514
- tableChildren.push({
515
- status: "fail",
516
- kind: "primaryKey",
517
- name: `primary key: ${contractTable.primaryKey.columns.join(", ")}`,
518
- contractPath: `${tablePath}.primaryKey`,
519
- code: "primary_key_mismatch",
520
- message: "Primary key mismatch",
521
- expected: contractTable.primaryKey,
522
- actual: schemaTable.primaryKey,
523
- children: []
524
- });
525
- } else {
526
- tableChildren.push({
527
- status: "pass",
528
- kind: "primaryKey",
529
- name: `primary key: ${contractTable.primaryKey.columns.join(", ")}`,
530
- contractPath: `${tablePath}.primaryKey`,
531
- code: "",
532
- message: "",
533
- expected: void 0,
534
- actual: void 0,
535
- children: []
536
- });
537
- }
538
- } else if (schemaTable.primaryKey && strict) {
539
- issues.push({
540
- kind: "extra_primary_key",
541
- table: tableName,
542
- message: "Extra primary key found in database (not in contract)"
543
- });
544
- tableChildren.push({
545
- status: "fail",
546
- kind: "primaryKey",
547
- name: `primary key: ${schemaTable.primaryKey.columns.join(", ")}`,
548
- contractPath: `${tablePath}.primaryKey`,
549
- code: "extra_primary_key",
550
- message: "Extra primary key found",
551
- expected: void 0,
552
- actual: schemaTable.primaryKey,
553
- children: []
554
- });
555
- }
556
- const fkStatuses = verifyForeignKeys(
557
- contractTable.foreignKeys,
558
- schemaTable.foreignKeys,
559
- tableName,
560
- tablePath,
561
- issues,
562
- strict
563
- );
564
- tableChildren.push(...fkStatuses);
565
- const uniqueStatuses = verifyUniqueConstraints(
566
- contractTable.uniques,
567
- schemaTable.uniques,
568
- schemaTable.indexes,
569
- tableName,
570
- tablePath,
571
- issues,
572
- strict
573
- );
574
- tableChildren.push(...uniqueStatuses);
575
- const indexStatuses = verifyIndexes(
576
- contractTable.indexes,
577
- schemaTable.indexes,
578
- schemaTable.uniques,
579
- tableName,
580
- tablePath,
581
- issues,
582
- strict
583
- );
584
- tableChildren.push(...indexStatuses);
585
- const tableStatus = tableChildren.some((c) => c.status === "fail") ? "fail" : tableChildren.some((c) => c.status === "warn") ? "warn" : "pass";
586
- const tableFailureMessages = tableChildren.filter((child) => child.status === "fail" && child.message).map((child) => child.message).filter((msg) => typeof msg === "string" && msg.length > 0);
587
- const tableMessage = tableStatus === "fail" && tableFailureMessages.length > 0 ? `${tableFailureMessages.length} issue${tableFailureMessages.length === 1 ? "" : "s"}` : "";
588
- const tableCode = tableStatus === "fail" && tableChildren.length > 0 && tableChildren[0] ? tableChildren[0].code : "";
589
- rootChildren.push({
590
- status: tableStatus,
591
- kind: "table",
592
- name: `table ${tableName}`,
593
- contractPath: tablePath,
594
- code: tableCode,
595
- message: tableMessage,
596
- expected: void 0,
597
- actual: void 0,
598
- children: tableChildren
599
- });
600
- }
601
- if (strict) {
602
- for (const tableName of Object.keys(schemaTables)) {
603
- if (!contractTables[tableName]) {
604
- issues.push({
605
- kind: "extra_table",
606
- table: tableName,
607
- message: `Extra table "${tableName}" found in database (not in contract)`
608
- });
609
- rootChildren.push({
610
- status: "fail",
611
- kind: "table",
612
- name: `table ${tableName}`,
613
- contractPath: `storage.tables.${tableName}`,
614
- code: "extra_table",
615
- message: `Extra table "${tableName}" found`,
616
- expected: void 0,
617
- actual: void 0,
618
- children: []
619
- });
620
- }
621
- }
622
- }
623
- const contractExtensionPacks = contract.extensionPacks ?? {};
624
- for (const extensionNamespace of Object.keys(contractExtensionPacks)) {
625
- const hasComponent = options.frameworkComponents.some(
626
- (component) => component.id === extensionNamespace && (component.kind === "extension" || component.kind === "adapter" || component.kind === "target")
627
- );
628
- if (!hasComponent) {
629
- throw new Error(
630
- `Extension pack '${extensionNamespace}' is declared in the contract but not found in framework components. This indicates a configuration mismatch - the contract was emitted with this extension pack, but it is not provided in the current configuration.`
631
- );
632
- }
633
- }
634
- const databaseDependencies = collectDependenciesFromFrameworkComponents(
635
- options.frameworkComponents
636
- );
637
- const dependencyStatuses = verifyDatabaseDependencies(databaseDependencies, schema, issues);
638
- rootChildren.push(...dependencyStatuses);
639
- const rootStatus = rootChildren.some((c) => c.status === "fail") ? "fail" : rootChildren.some((c) => c.status === "warn") ? "warn" : "pass";
640
- const root = {
641
- status: rootStatus,
642
- kind: "contract",
643
- name: "contract",
644
- contractPath: "",
645
- code: "",
646
- message: "",
647
- expected: void 0,
648
- actual: void 0,
649
- children: rootChildren
650
- };
651
- const counts = computeCounts(root);
652
- const ok = counts.fail === 0;
653
- const code = ok ? void 0 : "PN-SCHEMA-0001";
654
- const summary = ok ? "Database schema satisfies contract" : `Database schema does not satisfy contract (${counts.fail} failure${counts.fail === 1 ? "" : "s"})`;
655
- const totalTime = Date.now() - startTime;
656
- return {
657
- ok,
658
- ...ifDefined("code", code),
659
- summary,
660
- contract: {
661
- coreHash: contractCoreHash,
662
- ...ifDefined("profileHash", contractProfileHash)
663
- },
664
- target: {
665
- expected: contractTarget,
666
- actual: contractTarget
667
- },
668
- schema: {
669
- issues,
670
- root,
671
- counts
672
- },
673
- meta: {
674
- strict,
675
- ...ifDefined("contractPath", context?.contractPath),
676
- ...ifDefined("configPath", context?.configPath)
677
- },
678
- timings: {
679
- total: totalTime
680
- }
681
- };
682
- }
683
- function hasDatabaseDependenciesInit(component) {
684
- if (!("databaseDependencies" in component)) {
685
- return false;
686
- }
687
- const dbDeps = component["databaseDependencies"];
688
- if (dbDeps === void 0 || dbDeps === null || typeof dbDeps !== "object") {
689
- return false;
690
- }
691
- const depsRecord = dbDeps;
692
- const init = depsRecord["init"];
693
- if (init === void 0 || !Array.isArray(init)) {
694
- return false;
695
- }
696
- return true;
697
- }
698
- function collectDependenciesFromFrameworkComponents(components) {
699
- const dependencies = [];
700
- for (const component of components) {
701
- if (hasDatabaseDependenciesInit(component)) {
702
- dependencies.push(...component.databaseDependencies.init);
703
- }
704
- }
705
- return dependencies;
706
- }
707
-
708
- export {
709
- arraysEqual,
710
- isUniqueConstraintSatisfied,
711
- isIndexSatisfied,
712
- verifyDatabaseDependencies,
713
- verifySqlSchema
714
- };
715
- //# sourceMappingURL=chunk-XH2Y5NTD.js.map