@prisma-next/family-sql 0.13.0-dev.4 → 0.13.0-dev.40
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/authoring-type-constructors-CjFfO6LM.mjs +342 -0
- package/dist/authoring-type-constructors-CjFfO6LM.mjs.map +1 -0
- package/dist/{control-adapter-CgIL9Vtx.d.mts → control-adapter-Cmw9LvEP.d.mts} +16 -33
- package/dist/control-adapter-Cmw9LvEP.d.mts.map +1 -0
- package/dist/control-adapter.d.mts +2 -2
- package/dist/control.d.mts +36 -34
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +24 -77
- package/dist/control.mjs.map +1 -1
- package/dist/ir.d.mts +6 -4
- package/dist/ir.d.mts.map +1 -1
- package/dist/ir.mjs +1 -1
- package/dist/migration.d.mts +1 -1
- package/dist/migration.d.mts.map +1 -1
- package/dist/migration.mjs +2 -1
- package/dist/migration.mjs.map +1 -1
- package/dist/pack.d.mts +16 -3
- package/dist/pack.d.mts.map +1 -1
- package/dist/pack.mjs +4 -2
- package/dist/pack.mjs.map +1 -1
- package/dist/schema-verify.d.mts +1 -1
- package/dist/schema-verify.mjs +1 -1
- package/dist/{sql-contract-serializer-CY7qnms7.mjs → sql-contract-serializer-BR2vC7Z-.mjs} +27 -27
- package/dist/sql-contract-serializer-BR2vC7Z-.mjs.map +1 -0
- package/dist/{types-CbwQCzXY.d.mts → types-kgstZ_Zd.d.mts} +5 -5
- package/dist/types-kgstZ_Zd.d.mts.map +1 -0
- package/dist/{verify-sql-schema-DcMaT5Zj.d.mts → verify-sql-schema-thU-jKpf.d.mts} +2 -14
- package/dist/verify-sql-schema-thU-jKpf.d.mts.map +1 -0
- package/dist/{verify-sql-schema-DlAgBiT_.mjs → verify-sql-schema-xT4udQLQ.mjs} +25 -118
- package/dist/verify-sql-schema-xT4udQLQ.mjs.map +1 -0
- package/package.json +21 -21
- package/src/core/authoring-entity-types.ts +178 -0
- package/src/core/authoring-field-presets.ts +8 -3
- package/src/core/control-adapter.ts +18 -49
- package/src/core/control-descriptor.ts +3 -0
- package/src/core/control-instance.ts +13 -11
- package/src/core/ir/sql-contract-serializer-base.ts +44 -75
- package/src/core/ir/sql-contract-serializer.ts +7 -0
- package/src/core/migrations/contract-to-schema-ir.ts +47 -112
- package/src/core/migrations/types.ts +4 -1
- package/src/core/psl-contract-infer/postgres-type-map.ts +5 -13
- package/src/core/psl-contract-infer/sql-schema-ir-to-psl-ast.ts +17 -70
- package/src/core/schema-verify/verify-sql-schema.ts +10 -146
- package/src/core/sql-migration.ts +5 -1
- package/src/exports/control-adapter.ts +1 -0
- package/src/exports/control.ts +1 -1
- package/src/exports/pack.ts +3 -0
- package/dist/authoring-type-constructors-D4lQ-qpj.mjs +0 -192
- package/dist/authoring-type-constructors-D4lQ-qpj.mjs.map +0 -1
- package/dist/control-adapter-CgIL9Vtx.d.mts.map +0 -1
- package/dist/sql-contract-serializer-CY7qnms7.mjs.map +0 -1
- package/dist/types-CbwQCzXY.d.mts.map +0 -1
- package/dist/verify-sql-schema-DcMaT5Zj.d.mts.map +0 -1
- package/dist/verify-sql-schema-DlAgBiT_.mjs.map +0 -1
|
@@ -2,8 +2,7 @@ import { assertUniqueCodecOwner, dispositionForCategory } from "@prisma-next/fra
|
|
|
2
2
|
import { defaultIndexName } from "@prisma-next/sql-schema-ir/naming";
|
|
3
3
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
4
4
|
import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
|
|
5
|
-
import { StorageTable,
|
|
6
|
-
import { blindCast } from "@prisma-next/utils/casts";
|
|
5
|
+
import { StorageTable, isStorageTypeInstance } from "@prisma-next/sql-contract/types";
|
|
7
6
|
import { effectiveControlPolicy } from "@prisma-next/contract/types";
|
|
8
7
|
import { canonicalStringify } from "@prisma-next/utils/canonical-stringify";
|
|
9
8
|
//#region src/core/assembly.ts
|
|
@@ -52,17 +51,12 @@ function resolveColumnTypeMetadata(column, storageTypes) {
|
|
|
52
51
|
if (!column.typeRef) return column;
|
|
53
52
|
const referenced = storageTypes[column.typeRef];
|
|
54
53
|
if (!referenced) throw new Error(`Column references storage type "${column.typeRef}" but it is not defined in storage.types.`);
|
|
55
|
-
if (isPostgresEnumStorageEntry(referenced)) return {
|
|
56
|
-
codecId: referenced.codecId,
|
|
57
|
-
nativeType: referenced.nativeType,
|
|
58
|
-
typeParams: { values: referenced.values }
|
|
59
|
-
};
|
|
60
54
|
if (isStorageTypeInstance(referenced)) return {
|
|
61
55
|
codecId: referenced.codecId,
|
|
62
56
|
nativeType: referenced.nativeType,
|
|
63
57
|
typeParams: referenced.typeParams
|
|
64
58
|
};
|
|
65
|
-
throw new Error(`Storage type "${column.typeRef}" has an unknown polymorphic kind; expected codec-
|
|
59
|
+
throw new Error(`Storage type "${column.typeRef}" has an unknown polymorphic kind; expected a codec-typed StorageTypeInstance.`);
|
|
66
60
|
}
|
|
67
61
|
/**
|
|
68
62
|
* Resolves a `ValueSetRef` to its permitted values from the contract storage.
|
|
@@ -74,12 +68,17 @@ function resolveColumnTypeMetadata(column, storageTypes) {
|
|
|
74
68
|
* `checkConstraintPlanCallStrategy` (migration planning) so all three agree on
|
|
75
69
|
* the resolved values and the error behavior on a missing reference.
|
|
76
70
|
*/
|
|
71
|
+
function allStrings(values) {
|
|
72
|
+
return values.every((value) => typeof value === "string");
|
|
73
|
+
}
|
|
77
74
|
function resolveValueSetValues(ref, storage, contextLabel) {
|
|
78
75
|
const ns = storage.namespaces[ref.namespaceId];
|
|
79
76
|
if (!ns) throw new Error(`resolveValueSetValues: namespace "${ref.namespaceId}" not found in storage (${contextLabel})`);
|
|
80
|
-
const valueSet = ns.entries.valueSet?.[ref.
|
|
81
|
-
if (!valueSet) throw new Error(`resolveValueSetValues: value-set "${ref.
|
|
82
|
-
|
|
77
|
+
const valueSet = ns.entries.valueSet?.[ref.entityName];
|
|
78
|
+
if (!valueSet) throw new Error(`resolveValueSetValues: value-set "${ref.entityName}" not found in namespace "${ref.namespaceId}" (${contextLabel})`);
|
|
79
|
+
const values = valueSet.values;
|
|
80
|
+
if (!allStrings(values)) throw new Error(`resolveValueSetValues: value-set "${ref.entityName}" in namespace "${ref.namespaceId}" has a non-string value; numeric-enum CHECK constraints are not yet supported (${contextLabel})`);
|
|
81
|
+
return values;
|
|
83
82
|
}
|
|
84
83
|
/**
|
|
85
84
|
* Projects a `CheckConstraint` IR into an `SqlCheckConstraintIRInput` by
|
|
@@ -177,7 +176,7 @@ function detectDestructiveChanges(from, to) {
|
|
|
177
176
|
const fromTables = fromNs?.entries.table;
|
|
178
177
|
if (!fromTables) continue;
|
|
179
178
|
for (const tableName of Object.keys(fromTables)) {
|
|
180
|
-
const toTableRaw = toNs?.entries.table[tableName];
|
|
179
|
+
const toTableRaw = toNs?.entries.table?.[tableName];
|
|
181
180
|
if (!(toTableRaw instanceof StorageTable)) {
|
|
182
181
|
conflicts.push({
|
|
183
182
|
kind: "tableRemoved",
|
|
@@ -215,14 +214,9 @@ function contractToSchemaIR(contract, options) {
|
|
|
215
214
|
if (options.annotationNamespace.length === 0) throw new Error("annotationNamespace must be a non-empty string");
|
|
216
215
|
if (!contract) return { tables: {} };
|
|
217
216
|
const storage = contract.storage;
|
|
218
|
-
const
|
|
219
|
-
for (const ns of Object.values(storage.namespaces)) {
|
|
220
|
-
const nsEnums = ns.entries["type"];
|
|
221
|
-
if (nsEnums) for (const [k, v] of Object.entries(nsEnums)) allTypes[k] = blindCast(v);
|
|
222
|
-
}
|
|
223
|
-
const storageTypes = allTypes;
|
|
217
|
+
const storageTypes = { ...storage.types ?? {} };
|
|
224
218
|
const tables = {};
|
|
225
|
-
for (const ns of Object.values(storage.namespaces)) for (const [tableName, tableDefRaw] of Object.entries(ns.entries.table)) {
|
|
219
|
+
for (const ns of Object.values(storage.namespaces)) for (const [tableName, tableDefRaw] of Object.entries(ns.entries.table ?? {})) {
|
|
226
220
|
if (!(tableDefRaw instanceof StorageTable)) throw new Error(`contractToSchemaIR: expected StorageTable at namespaces.${ns.id}.entries.table.${tableName}`);
|
|
227
221
|
const tableDef = tableDefRaw;
|
|
228
222
|
if (tables[tableName] !== void 0) throw new Error(`contractToSchemaIR: duplicate SQL table name "${tableName}" across namespaces (ambiguous for flat SqlSchemaIR.tables).`);
|
|
@@ -230,44 +224,15 @@ function contractToSchemaIR(contract, options) {
|
|
|
230
224
|
}
|
|
231
225
|
return {
|
|
232
226
|
tables,
|
|
233
|
-
...ifDefined("annotations", deriveAnnotations(storage, options.annotationNamespace, options.
|
|
227
|
+
...ifDefined("annotations", deriveAnnotations(storage, options.annotationNamespace, options.resolveEnumNamespaceSchema))
|
|
234
228
|
};
|
|
235
229
|
}
|
|
236
|
-
|
|
237
|
-
* Normalises a native enum storage entry to the codec-typed annotation shape
|
|
238
|
-
* `{codecId, nativeType, typeParams}` the introspector writes and
|
|
239
|
-
* `readExistingEnumValues` reads (`existing.codecId` + `existing.typeParams.values`).
|
|
240
|
-
* Without this the projector would emit the raw `PostgresEnumStorageEntry`
|
|
241
|
-
* shape (top-level `values`, no `typeParams`) and the enum would read as new.
|
|
242
|
-
*/
|
|
243
|
-
function normalizeEnumAnnotation(entry) {
|
|
244
|
-
return toStorageTypeInstance({
|
|
245
|
-
codecId: entry.codecId,
|
|
246
|
-
nativeType: entry.nativeType,
|
|
247
|
-
typeParams: { values: entry.values }
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
function deriveAnnotations(storage, annotationNamespace, resolveEnumStorageKey) {
|
|
230
|
+
function deriveAnnotations(storage, annotationNamespace, _resolveEnumNamespaceSchema) {
|
|
251
231
|
const storageTypes = {};
|
|
252
|
-
for (const typeInstance of Object.values(storage.types ?? {}))
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
if (isStorageTypeInstance(typeInstance)) storageTypes[typeInstance.nativeType] = typeInstance;
|
|
259
|
-
}
|
|
260
|
-
for (const [namespaceId, ns] of Object.entries(storage.namespaces)) {
|
|
261
|
-
const nsEnums = ns.entries["type"];
|
|
262
|
-
if (!nsEnums) continue;
|
|
263
|
-
for (const entry of Object.values(nsEnums)) {
|
|
264
|
-
if (!isPostgresEnumStorageEntry(entry)) continue;
|
|
265
|
-
const key = resolveEnumStorageKey ? resolveEnumStorageKey(storage, namespaceId, entry.nativeType) : entry.nativeType;
|
|
266
|
-
storageTypes[key] = normalizeEnumAnnotation(entry);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
if (Object.keys(storageTypes).length === 0) return void 0;
|
|
270
|
-
return { [annotationNamespace]: { storageTypes } };
|
|
232
|
+
for (const typeInstance of Object.values(storage.types ?? {})) if (isStorageTypeInstance(typeInstance)) storageTypes[typeInstance.nativeType] = typeInstance;
|
|
233
|
+
const envelope = { ...Object.keys(storageTypes).length > 0 ? { storageTypes } : {} };
|
|
234
|
+
if (Object.keys(envelope).length === 0) return void 0;
|
|
235
|
+
return { [annotationNamespace]: envelope };
|
|
271
236
|
}
|
|
272
237
|
//#endregion
|
|
273
238
|
//#region src/core/schema-verify/verifier-disposition.ts
|
|
@@ -824,22 +789,17 @@ function verifyCheckConstraints(contractChecks, schemaChecks, tableName, namespa
|
|
|
824
789
|
* @returns VerifyDatabaseSchemaResult with verification tree and issues
|
|
825
790
|
*/
|
|
826
791
|
function verifySqlSchema(options) {
|
|
827
|
-
const { contract, schema, strict, context, typeMetadataRegistry, normalizeDefault, normalizeNativeType
|
|
792
|
+
const { contract, schema, strict, context, typeMetadataRegistry, normalizeDefault, normalizeNativeType } = options;
|
|
828
793
|
const startTime = Date.now();
|
|
829
794
|
const codecHooks = extractCodecControlHooks(options.frameworkComponents);
|
|
830
795
|
const { contractStorageHash, contractProfileHash, contractTarget } = extractContractMetadata(contract);
|
|
831
|
-
const allStorageTypesMap = { ...contract.storage.types ?? {} };
|
|
832
|
-
for (const ns of Object.values(contract.storage.namespaces)) {
|
|
833
|
-
const nsEnums = blindCast(ns.entries).type;
|
|
834
|
-
if (nsEnums) for (const [k, v] of Object.entries(nsEnums)) allStorageTypesMap[k] = v;
|
|
835
|
-
}
|
|
836
796
|
const { issues, rootChildren } = verifySchemaTables({
|
|
837
797
|
contract,
|
|
838
798
|
schema,
|
|
839
799
|
strict,
|
|
840
800
|
typeMetadataRegistry,
|
|
841
801
|
codecHooks,
|
|
842
|
-
storageTypes:
|
|
802
|
+
storageTypes: contract.storage.types ?? {},
|
|
843
803
|
...ifDefined("normalizeDefault", normalizeDefault),
|
|
844
804
|
...ifDefined("normalizeNativeType", normalizeNativeType)
|
|
845
805
|
});
|
|
@@ -878,22 +838,6 @@ function verifySqlSchema(options) {
|
|
|
878
838
|
schema
|
|
879
839
|
}) : [], effectiveControlPolicy(void 0, contract.defaultControlPolicy));
|
|
880
840
|
}
|
|
881
|
-
for (const nsId of Object.keys(contract.storage.namespaces)) {
|
|
882
|
-
const ns = contract.storage.namespaces[nsId];
|
|
883
|
-
if (!ns) continue;
|
|
884
|
-
const nsEnums = ns.entries["type"];
|
|
885
|
-
if (!nsEnums) continue;
|
|
886
|
-
for (const [typeName, entry] of Object.entries(nsEnums)) {
|
|
887
|
-
if (!isPostgresEnumStorageEntry(entry)) continue;
|
|
888
|
-
pushTypeNode(typeName, `storage.namespaces.${nsId}.entries.type.${typeName}`, verifyEnumType({
|
|
889
|
-
typeName,
|
|
890
|
-
typeInstance: entry,
|
|
891
|
-
schema,
|
|
892
|
-
resolveExistingEnumValues,
|
|
893
|
-
namespaceId: nsId
|
|
894
|
-
}), effectiveControlPolicy(entry.control, contract.defaultControlPolicy));
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
841
|
if (typeNodes.length > 0) {
|
|
898
842
|
const typesStatus = typeNodes.some((n) => n.status === "fail") ? "fail" : typeNodes.some((n) => n.status === "warn") ? "warn" : "pass";
|
|
899
843
|
rootChildren.push({
|
|
@@ -939,38 +883,6 @@ function verifySqlSchema(options) {
|
|
|
939
883
|
timings: { total: totalTime }
|
|
940
884
|
};
|
|
941
885
|
}
|
|
942
|
-
/**
|
|
943
|
-
* Native verification walk for `PostgresEnumStorageEntry` instances (no codec hook).
|
|
944
|
-
*
|
|
945
|
-
* Bridges the native `PostgresEnumStorageEntry.values` against the introspected schema
|
|
946
|
-
* IR via the target-supplied `resolveExistingEnumValues` adapter. Without an
|
|
947
|
-
* adapter, the verifier conservatively reports the enum as missing — there
|
|
948
|
-
* is no other way for the family layer to learn about live enum types.
|
|
949
|
-
*/
|
|
950
|
-
function verifyEnumType(options) {
|
|
951
|
-
const { typeName, typeInstance, schema, namespaceId, resolveExistingEnumValues } = options;
|
|
952
|
-
const desired = typeInstance.values;
|
|
953
|
-
const existing = resolveExistingEnumValues?.(schema, typeInstance, namespaceId) ?? null;
|
|
954
|
-
if (!existing) return [{
|
|
955
|
-
kind: "type_missing",
|
|
956
|
-
typeName,
|
|
957
|
-
namespaceId,
|
|
958
|
-
message: `Type "${typeName}" is missing from database`
|
|
959
|
-
}];
|
|
960
|
-
if (arraysEqual(existing, desired)) return [];
|
|
961
|
-
const existingSet = new Set(existing);
|
|
962
|
-
const desiredSet = new Set(desired);
|
|
963
|
-
const addedValues = desired.filter((v) => !existingSet.has(v));
|
|
964
|
-
const removedValues = existing.filter((v) => !desiredSet.has(v));
|
|
965
|
-
return [{
|
|
966
|
-
kind: "enum_values_changed",
|
|
967
|
-
namespaceId,
|
|
968
|
-
typeName,
|
|
969
|
-
addedValues,
|
|
970
|
-
removedValues,
|
|
971
|
-
message: removedValues.length === 0 ? `Enum type "${typeName}" needs new values: ${addedValues.join(", ")}` : `Enum type "${typeName}" values changed (requires rebuild): +[${addedValues.join(", ")}] -[${removedValues.join(", ")}]`
|
|
972
|
-
}];
|
|
973
|
-
}
|
|
974
886
|
function extractContractMetadata(contract) {
|
|
975
887
|
return {
|
|
976
888
|
contractStorageHash: contract.storage.storageHash,
|
|
@@ -988,7 +900,7 @@ function verifySchemaTables(options) {
|
|
|
988
900
|
for (const namespaceId of namespaceIds) {
|
|
989
901
|
const ns = contract.storage.namespaces[namespaceId];
|
|
990
902
|
if (!ns) continue;
|
|
991
|
-
for (const [tableName, contractTableRaw] of Object.entries(ns.entries.table)) {
|
|
903
|
+
for (const [tableName, contractTableRaw] of Object.entries(ns.entries.table ?? {})) {
|
|
992
904
|
if (!(contractTableRaw instanceof StorageTable)) throw new Error(`verifySqlSchema: expected StorageTable at storage.namespaces.${namespaceId}.entries.table.${tableName}`);
|
|
993
905
|
const contractTable = contractTableRaw;
|
|
994
906
|
const tableControlPolicy = effectiveControlPolicy(contractTable.control, contractDefaultControl);
|
|
@@ -1033,7 +945,7 @@ function verifySchemaTables(options) {
|
|
|
1033
945
|
}
|
|
1034
946
|
}
|
|
1035
947
|
if (strict) {
|
|
1036
|
-
for (const tableName of Object.keys(schemaTables)) if (!namespaceIds.some((namespaceId) => contract.storage.namespaces[namespaceId]?.entries.table[tableName] !== void 0)) emitIssueAndNodeUnderControlPolicy(effectiveControlPolicy(void 0, contractDefaultControl), {
|
|
948
|
+
for (const tableName of Object.keys(schemaTables)) if (!namespaceIds.some((namespaceId) => contract.storage.namespaces[namespaceId]?.entries.table?.[tableName] !== void 0)) emitIssueAndNodeUnderControlPolicy(effectiveControlPolicy(void 0, contractDefaultControl), {
|
|
1037
949
|
kind: "extra_table",
|
|
1038
950
|
table: tableName,
|
|
1039
951
|
message: `Extra table "${tableName}" found in database (not in contract)`
|
|
@@ -1505,17 +1417,12 @@ function resolveContractColumnTypeMetadata(contractColumn, storageTypes, context
|
|
|
1505
1417
|
const columnLabel = context ? `Column "${context.tableName}"."${context.columnName}"` : "Column";
|
|
1506
1418
|
throw new Error(`${columnLabel} references storage type "${contractColumn.typeRef}" but it is not defined in storage.types.`);
|
|
1507
1419
|
}
|
|
1508
|
-
if (isPostgresEnumStorageEntry(referencedType)) return {
|
|
1509
|
-
codecId: referencedType.codecId,
|
|
1510
|
-
nativeType: referencedType.nativeType,
|
|
1511
|
-
typeParams: { values: referencedType.values }
|
|
1512
|
-
};
|
|
1513
1420
|
if (isStorageTypeInstance(referencedType)) return {
|
|
1514
1421
|
codecId: referencedType.codecId,
|
|
1515
1422
|
nativeType: referencedType.nativeType,
|
|
1516
1423
|
typeParams: referencedType.typeParams
|
|
1517
1424
|
};
|
|
1518
|
-
throw new Error(`Storage type "${contractColumn.typeRef}" has an unknown
|
|
1425
|
+
throw new Error(`Storage type "${contractColumn.typeRef}" has an unknown kind; expected a codec-typed StorageTypeInstance.`);
|
|
1519
1426
|
}
|
|
1520
1427
|
/**
|
|
1521
1428
|
* Describes a column default for display purposes.
|
|
@@ -1591,4 +1498,4 @@ function formatLiteralValue(value) {
|
|
|
1591
1498
|
//#endregion
|
|
1592
1499
|
export { contractToSchemaIR as a, extractCodecControlHooks as c, isUniqueConstraintSatisfied as i, arraysEqual as n, detectDestructiveChanges as o, isIndexSatisfied as r, resolveValueSetValues as s, verifySqlSchema as t };
|
|
1593
1500
|
|
|
1594
|
-
//# sourceMappingURL=verify-sql-schema-
|
|
1501
|
+
//# sourceMappingURL=verify-sql-schema-xT4udQLQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-sql-schema-xT4udQLQ.mjs","names":["d"],"sources":["../src/core/assembly.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/schema-verify/verifier-disposition.ts","../src/core/schema-verify/control-verify-emit.ts","../src/core/schema-verify/verify-helpers.ts","../src/core/schema-verify/verify-sql-schema.ts"],"sourcesContent":["import type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport { assertUniqueCodecOwner } from '@prisma-next/framework-components/control';\nimport type { CodecControlHooks } from './migrations/types';\n\ntype CodecControlHooksMap = Record<string, CodecControlHooks>;\n\nfunction hasCodecControlHooks(descriptor: unknown): descriptor is {\n readonly id: string;\n readonly types: {\n readonly codecTypes: {\n readonly controlPlaneHooks: CodecControlHooksMap;\n };\n };\n} {\n if (typeof descriptor !== 'object' || descriptor === null) {\n return false;\n }\n const d = descriptor as { types?: { codecTypes?: { controlPlaneHooks?: unknown } } };\n const hooks = d.types?.codecTypes?.controlPlaneHooks;\n return hooks !== null && hooks !== undefined && typeof hooks === 'object';\n}\n\nexport function extractCodecControlHooks(\n descriptors: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>,\n): Map<string, CodecControlHooks> {\n const hooks = new Map<string, CodecControlHooks>();\n const owners = new Map<string, string>();\n\n for (const descriptor of descriptors) {\n if (typeof descriptor !== 'object' || descriptor === null) {\n continue;\n }\n if (!hasCodecControlHooks(descriptor)) {\n continue;\n }\n const controlPlaneHooks = descriptor.types.codecTypes.controlPlaneHooks;\n for (const [codecId, hook] of Object.entries(controlPlaneHooks)) {\n assertUniqueCodecOwner({\n codecId,\n owners,\n descriptorId: descriptor.id,\n entityLabel: 'control hooks',\n entityOwnershipLabel: 'owner',\n });\n hooks.set(codecId, hook);\n owners.set(codecId, descriptor.id);\n }\n }\n\n return hooks;\n}\n","import type { ColumnDefault, Contract, JsonValue } from '@prisma-next/contract/types';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport {\n type CheckConstraint,\n type ForeignKey,\n type Index,\n isStorageTypeInstance,\n type SqlStorage,\n type StorageColumn,\n StorageTable,\n type StorageTypeInstance,\n type UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n SqlAnnotations,\n SqlCheckConstraintIRInput,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\n/**\n * Target-supplied callback that resolves a contract namespace to the live\n * database schema its enums are stored under.\n *\n * The projected enum annotations are nested by schema\n * (`storageTypes[schema][nativeType]`) so two namespaces holding an enum with\n * the same native type resolve to distinct live-database types. Mapping a\n * namespace to its DDL schema is target-specific (Postgres schemas;\n * SQLite/MySQL differ), so the target injects it here rather than the family\n * importing a concrete `ddlSchemaName`. This keeps the family layer\n * target-agnostic while the projection nests under the same schema the\n * target's read side (`readExistingEnumValues`) looks up.\n */\nexport type EnumNamespaceSchemaResolver = (storage: SqlStorage, namespaceId: string) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: ResolvedStorageTypes,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\ntype ResolvedStorageTypes = Readonly<Record<string, StorageTypeInstance>>;\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: ResolvedStorageTypes,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n if (isStorageTypeInstance(referenced)) {\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n }\n throw new Error(\n `Storage type \"${column.typeRef}\" has an unknown polymorphic kind; expected a codec-typed StorageTypeInstance.`,\n );\n}\n\n/**\n * Resolves a `ValueSetRef` to its permitted values from the contract storage.\n *\n * Throws when the referenced namespace or value-set is absent — this indicates\n * the contract was built incorrectly (the check and the value-set must be\n * co-emitted by the lowering step). Used by `convertCheck` (schema-IR\n * projection), `verifyCheckConstraints` (verification), and\n * `checkConstraintPlanCallStrategy` (migration planning) so all three agree on\n * the resolved values and the error behavior on a missing reference.\n */\nfunction allStrings(values: readonly JsonValue[]): values is readonly string[] {\n return values.every((value) => typeof value === 'string');\n}\n\nexport function resolveValueSetValues(\n ref: { readonly namespaceId: string; readonly entityName: string },\n storage: SqlStorage,\n contextLabel: string,\n): readonly string[] {\n const ns = storage.namespaces[ref.namespaceId];\n if (!ns) {\n throw new Error(\n `resolveValueSetValues: namespace \"${ref.namespaceId}\" not found in storage (${contextLabel})`,\n );\n }\n const valueSet = ns.entries.valueSet?.[ref.entityName];\n if (!valueSet) {\n throw new Error(\n `resolveValueSetValues: value-set \"${ref.entityName}\" not found in namespace \"${ref.namespaceId}\" (${contextLabel})`,\n );\n }\n // Only TEXT enums ship a CHECK-constraint round-trip in this slice. A\n // non-string value-set is a numeric enum, whose CHECK rendering/verification\n // is future work; fail loudly rather than emit a wrong numeric-as-text check.\n const values = valueSet.values;\n if (!allStrings(values)) {\n throw new Error(\n `resolveValueSetValues: value-set \"${ref.entityName}\" in namespace \"${ref.namespaceId}\" has a non-string value; numeric-enum CHECK constraints are not yet supported (${contextLabel})`,\n );\n }\n return values;\n}\n\n/**\n * Projects a `CheckConstraint` IR into an `SqlCheckConstraintIRInput` by\n * resolving the permitted values from the storage value-set it references.\n *\n * The `CheckConstraint.valueSet` ref points to\n * `storage.namespaces[namespaceId].entries.valueSet[name]`. The resolved\n * values are lifted directly from `StorageValueSet.values` so verification\n * compares value sets, not SQL predicate strings.\n *\n * Throws if the referenced namespace or value-set is absent — this\n * indicates the contract was built incorrectly (the check and the\n * value-set must be co-emitted by the lowering step).\n */\nfunction convertCheck(check: CheckConstraint, storage: SqlStorage): SqlCheckConstraintIRInput {\n const permittedValues = resolveValueSetValues(check.valueSet, storage, `check \"${check.name}\"`);\n return {\n name: check.name,\n column: check.column,\n permittedValues,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.source.columns,\n referencedTable: fk.target.tableName,\n referencedSchema: fk.target.namespaceId,\n referencedColumns: fk.target.columns,\n ...ifDefined('name', fk.name),\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: ResolvedStorageTypes,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n storage: SqlStorage,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.source.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.source.columns,\n unique: false,\n name: defaultIndexName(name, fk.source.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n const checks: SqlCheckConstraintIRInput[] | undefined =\n table.checks && table.checks.length > 0\n ? table.checks.map((c) => convertCheck(c, storage))\n : undefined;\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.filter((fk) => fk.constraint !== false).map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n ...ifDefined('checks', checks),\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n const namespaceIds = [\n ...new Set([...Object.keys(from.namespaces), ...Object.keys(to.namespaces)]),\n ].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n\n for (const namespaceId of namespaceIds) {\n const fromNs = from.namespaces[namespaceId];\n const toNs = to.namespaces[namespaceId];\n const fromTables = fromNs?.entries.table;\n if (!fromTables) continue;\n\n for (const tableName of Object.keys(fromTables)) {\n const toTableRaw = toNs?.entries.table?.[tableName];\n if (!(toTableRaw instanceof StorageTable)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n const toTable = toTableRaw;\n\n const fromTableRaw = fromTables[tableName];\n if (!(fromTableRaw instanceof StorageTable)) continue;\n const fromTable = fromTableRaw;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n /**\n * Target-supplied resolver mapping a namespace to the live database schema\n * its enums are stored under. When provided (Postgres), namespace-scoped\n * enums are nested by that schema in `enumTypes` so the projection matches\n * the target's `readExistingEnumValues` lookup. Targets without\n * schema-scoped enum storage (SQLite) omit it; enums are absent there.\n */\n readonly resolveEnumNamespaceSchema?: EnumNamespaceSchemaResolver;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables and `contract.storage.types` for type\n * annotations. Storage-type annotations are written under\n * `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {} };\n }\n\n const storage = contract.storage;\n const storageTypes: ResolvedStorageTypes = {\n ...((storage.types ?? {}) as ResolvedStorageTypes),\n };\n const tables: Record<string, SqlTableIR> = {};\n for (const ns of Object.values(storage.namespaces)) {\n for (const [tableName, tableDefRaw] of Object.entries(ns.entries.table ?? {})) {\n if (!(tableDefRaw instanceof StorageTable)) {\n throw new Error(\n `contractToSchemaIR: expected StorageTable at namespaces.${ns.id}.entries.table.${tableName}`,\n );\n }\n const tableDef = tableDefRaw;\n if (tables[tableName] !== undefined) {\n throw new Error(\n `contractToSchemaIR: duplicate SQL table name \"${tableName}\" across namespaces (ambiguous for flat SqlSchemaIR.tables).`,\n );\n }\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n storage,\n );\n }\n }\n\n const annotations = deriveAnnotations(\n storage,\n options.annotationNamespace,\n options.resolveEnumNamespaceSchema,\n );\n\n return {\n tables,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n _resolveEnumNamespaceSchema: EnumNamespaceSchemaResolver | undefined,\n): SqlAnnotations | undefined {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n\n for (const typeInstance of Object.values((storage.types ?? {}) as ResolvedStorageTypes)) {\n if (isStorageTypeInstance(typeInstance)) {\n storageTypes[typeInstance.nativeType] = typeInstance;\n }\n }\n\n const envelope = {\n ...(Object.keys(storageTypes).length > 0 ? { storageTypes } : {}),\n };\n if (Object.keys(envelope).length === 0) return undefined;\n return { [annotationNamespace]: envelope };\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n VerifierIssueCategory,\n VerifierOutcome,\n} from '@prisma-next/framework-components/control';\nimport { dispositionForCategory } from '@prisma-next/framework-components/control';\n\n/**\n * Classifies the relational verifier issue kinds the SQL family emits (tables,\n * columns, constraints, indexes, defaults, enum types) into the target-neutral\n * categories the framework grades. The relational vocabulary lives here, in the\n * SQL domain — the framework never switches over `extra_foreign_key` and friends.\n */\nexport function classifySqlVerifierIssueKind(kind: SchemaIssue['kind']): VerifierIssueCategory {\n switch (kind) {\n case 'extra_column':\n return 'extraNestedElement';\n case 'extra_primary_key':\n case 'extra_foreign_key':\n case 'extra_unique_constraint':\n case 'extra_index':\n case 'extra_validator':\n case 'extra_default':\n return 'extraAuxiliary';\n case 'extra_table':\n return 'extraTopLevelObject';\n case 'missing_schema':\n case 'missing_table':\n case 'missing_column':\n case 'type_missing':\n case 'default_missing':\n return 'declaredMissing';\n case 'type_values_mismatch':\n case 'enum_values_changed':\n case 'check_mismatch':\n return 'valueDrift';\n case 'type_mismatch':\n case 'nullability_mismatch':\n case 'primary_key_mismatch':\n case 'foreign_key_mismatch':\n case 'unique_constraint_mismatch':\n case 'index_mismatch':\n case 'default_mismatch':\n return 'declaredIncompatible';\n case 'check_missing':\n return 'declaredMissing';\n case 'check_removed':\n return 'extraAuxiliary';\n }\n}\n\nexport function verifierDisposition(\n controlPolicy: ControlPolicy,\n issueKind: SchemaIssue['kind'],\n): VerifierOutcome {\n return dispositionForCategory(controlPolicy, classifySqlVerifierIssueKind(issueKind));\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n SchemaVerificationNode,\n VerifierOutcome,\n} from '@prisma-next/framework-components/control';\nimport { verifierDisposition } from './verifier-disposition';\n\n/**\n * Grades `issue` under `controlPolicy` and, unless suppressed, pushes both the\n * issue and a status-stamped verification node. Returns the resolved outcome so\n * the caller never re-grades the same issue.\n */\nexport function emitIssueAndNodeUnderControlPolicy(\n controlPolicy: ControlPolicy,\n issue: SchemaIssue,\n node: SchemaVerificationNode,\n issues: SchemaIssue[],\n nodes: SchemaVerificationNode[],\n): VerifierOutcome {\n const disposition = verifierDisposition(controlPolicy, issue.kind);\n if (disposition === 'suppress') {\n return disposition;\n }\n issues.push(issue);\n nodes.push({ ...node, status: disposition });\n return disposition;\n}\n\n/**\n * Grades `issue` under `controlPolicy` and, unless suppressed, pushes the issue\n * (no verification node). Returns the resolved outcome so the caller maps it to\n * a node status itself without re-grading.\n */\nexport function emitIssueUnderControlPolicy(\n controlPolicy: ControlPolicy,\n issue: SchemaIssue,\n issues: SchemaIssue[],\n): VerifierOutcome {\n const disposition = verifierDisposition(controlPolicy, issue.kind);\n if (disposition === 'suppress') {\n return disposition;\n }\n issues.push(issue);\n return disposition;\n}\n","/**\n * Pure verification helper functions for SQL schema verification.\n * These functions verify schema IR against contract requirements.\n */\n\nimport type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n SchemaVerificationNode,\n} from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type {\n ForeignKey,\n Index,\n PrimaryKey,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport type {\n SqlCheckConstraintIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport {\n emitIssueAndNodeUnderControlPolicy,\n emitIssueUnderControlPolicy,\n} from './control-verify-emit';\n\nfunction indexOptionsLooselyEqual(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean {\n const aKeys = a ? Object.keys(a).sort() : [];\n const bKeys = b ? Object.keys(b).sort() : [];\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i += 1) {\n if (aKeys[i] !== bKeys[i]) return false;\n }\n if (aKeys.length === 0) return true;\n for (const key of aKeys) {\n // Postgres introspection returns reloptions values as raw strings (e.g.\n // `'70'`, `'false'`), while contract option leaves are typed (number,\n // boolean, string). Compare via String() so a contract `fillfactor: 70`\n // matches an introspected `fillfactor: '70'` without a spurious mismatch.\n if (\n String((a as Record<string, unknown>)[key]) !== String((b as Record<string, unknown>)[key])\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction indexExtrasMatch(\n contractIndex: Index,\n schemaIndex: { readonly type?: string; readonly options?: Record<string, unknown> },\n): boolean {\n if ((contractIndex.type ?? null) !== (schemaIndex.type ?? null)) return false;\n return indexOptionsLooselyEqual(contractIndex.options, schemaIndex.options);\n}\n\n/**\n * Compares two arrays of strings for equality (order-sensitive).\n */\nexport function arraysEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// ============================================================================\n// Semantic Satisfaction Predicates\n// ============================================================================\n// These predicates implement the \"stronger satisfies weaker\" logic for storage\n// objects. They are used by both verification and migration planning to ensure\n// consistent behavior across the control plane.\n\n/**\n * Checks if a unique constraint requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a unique constraint requirement can be satisfied by:\n * - A unique constraint with the same columns, OR\n * - A unique index with the same columns\n *\n * @param uniques - The unique constraints in the schema table\n * @param indexes - The indexes in the schema table\n * @param columns - The columns required by the unique constraint\n * @returns true if the requirement is satisfied\n */\nexport function isUniqueConstraintSatisfied(\n uniques: readonly SqlUniqueIR[],\n indexes: readonly SqlIndexIR[],\n columns: readonly string[],\n): boolean {\n // Check for matching unique constraint\n const hasConstraint = uniques.some((unique) => arraysEqual(unique.columns, columns));\n if (hasConstraint) {\n return true;\n }\n // Check for matching unique index (semantic satisfaction)\n return indexes.some((index) => index.unique && arraysEqual(index.columns, columns));\n}\n\n/**\n * Checks if an index requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a non-unique index requirement can be satisfied by:\n * - Any index (unique or non-unique) with the same columns, OR\n * - A unique constraint with the same columns (stronger satisfies weaker)\n *\n * @param indexes - The indexes in the schema table\n * @param uniques - The unique constraints in the schema table\n * @param columns - The columns required by the index\n * @returns true if the requirement is satisfied\n */\nexport function isIndexSatisfied(\n indexes: readonly SqlIndexIR[],\n uniques: readonly SqlUniqueIR[],\n columns: readonly string[],\n): boolean {\n // Check for any matching index (unique or non-unique)\n const hasMatchingIndex = indexes.some((index) => arraysEqual(index.columns, columns));\n if (hasMatchingIndex) {\n return true;\n }\n // Check for matching unique constraint (semantic satisfaction)\n return uniques.some((unique) => arraysEqual(unique.columns, columns));\n}\n\n/**\n * Verifies primary key matches between contract and schema.\n * Returns 'pass' or 'fail'.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyPrimaryKey(\n contractPK: PrimaryKey,\n schemaPK: PrimaryKey | undefined,\n tableName: string,\n namespaceId: string,\n tableControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n): 'pass' | 'warn' | 'fail' {\n if (!schemaPK) {\n const issue: SchemaIssue = {\n kind: 'primary_key_mismatch',\n table: tableName,\n namespaceId,\n expected: contractPK.columns.join(', '),\n message: `Table \"${tableName}\" is missing primary key`,\n };\n const outcome = emitIssueUnderControlPolicy(tableControlPolicy, issue, issues);\n return outcome === 'suppress' ? 'pass' : outcome;\n }\n\n if (!arraysEqual(contractPK.columns, schemaPK.columns)) {\n const issue: SchemaIssue = {\n kind: 'primary_key_mismatch',\n table: tableName,\n namespaceId,\n expected: contractPK.columns.join(', '),\n actual: schemaPK.columns.join(', '),\n message: `Table \"${tableName}\" has primary key mismatch: expected columns [${contractPK.columns.join(', ')}], got [${schemaPK.columns.join(', ')}]`,\n };\n const outcome = emitIssueUnderControlPolicy(tableControlPolicy, issue, issues);\n return outcome === 'suppress' ? 'pass' : outcome;\n }\n\n return 'pass';\n}\n\n/**\n * Verifies foreign keys match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + columns + referenced table + referenced columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyForeignKeys(\n contractFKs: readonly ForeignKey[],\n schemaFKs: readonly SqlForeignKeyIR[],\n tableName: string,\n namespaceId: string,\n tablePath: string,\n tableControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract FK exists in schema\n for (const contractFK of contractFKs) {\n const fkPath = `${tablePath}.foreignKeys[${contractFK.source.columns.join(',')}]`;\n const matchingFK = schemaFKs.find((fk) => {\n // When the schema FK carries referencedSchema (populated by the Postgres\n // adapter for cross-schema FKs), compare the full (namespace, table) pair\n // against the contract FK's target coordinate. When referencedSchema is\n // absent (same-schema FKs, older introspection, or hand-crafted test\n // fixtures), fall back to table-name-only comparison so same-namespace\n // contracts continue to verify correctly.\n const tablesMatch =\n fk.referencedSchema !== undefined && contractFK.target.namespaceId !== UNBOUND_NAMESPACE_ID\n ? fk.referencedSchema === contractFK.target.namespaceId &&\n fk.referencedTable === contractFK.target.tableName\n : fk.referencedTable === contractFK.target.tableName;\n return (\n arraysEqual(fk.columns, contractFK.source.columns) &&\n tablesMatch &&\n arraysEqual(fk.referencedColumns, contractFK.target.columns)\n );\n });\n\n if (!matchingFK) {\n const issue: SchemaIssue = {\n kind: 'foreign_key_mismatch',\n table: tableName,\n namespaceId,\n expected: `${contractFK.source.columns.join(', ')} -> ${contractFK.target.tableName}(${contractFK.target.columns.join(', ')})`,\n message: `Table \"${tableName}\" is missing foreign key: ${contractFK.source.columns.join(', ')} -> ${contractFK.target.tableName}(${contractFK.target.columns.join(', ')})`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.source.columns.join(', ')})`,\n contractPath: fkPath,\n code: 'foreign_key_mismatch',\n message: 'Foreign key missing',\n expected: contractFK,\n actual: undefined,\n children: [],\n },\n issues,\n nodes,\n );\n } else {\n const actionMismatches = getReferentialActionMismatches(contractFK, matchingFK);\n if (actionMismatches.length > 0) {\n const combinedMessage = actionMismatches.map((m) => m.message).join('; ');\n const combinedExpected = actionMismatches.map((m) => m.expected).join(', ');\n const combinedActual = actionMismatches.map((m) => m.actual).join(', ');\n const issue: SchemaIssue = {\n kind: 'foreign_key_mismatch',\n table: tableName,\n namespaceId,\n indexOrConstraint: matchingFK.name ?? `fk(${contractFK.source.columns.join(',')})`,\n expected: combinedExpected,\n actual: combinedActual,\n message: `Table \"${tableName}\" foreign key ${contractFK.source.columns.join(', ')} -> ${contractFK.target.tableName}: ${combinedMessage}`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.source.columns.join(', ')})`,\n contractPath: fkPath,\n code: 'foreign_key_mismatch',\n message: combinedMessage,\n expected: contractFK,\n actual: matchingFK,\n children: [],\n },\n issues,\n nodes,\n );\n } else {\n nodes.push({\n status: 'pass',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.source.columns.join(', ')})`,\n contractPath: fkPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n }\n\n // Check for extra FKs in strict mode\n if (strict) {\n for (const schemaFK of schemaFKs) {\n const matchingFK = contractFKs.find((fk) => {\n const tablesMatch =\n schemaFK.referencedSchema !== undefined && fk.target.namespaceId !== UNBOUND_NAMESPACE_ID\n ? schemaFK.referencedSchema === fk.target.namespaceId &&\n schemaFK.referencedTable === fk.target.tableName\n : schemaFK.referencedTable === fk.target.tableName;\n return (\n arraysEqual(fk.source.columns, schemaFK.columns) &&\n tablesMatch &&\n arraysEqual(fk.target.columns, schemaFK.referencedColumns)\n );\n });\n\n if (!matchingFK) {\n const issue: SchemaIssue = {\n kind: 'extra_foreign_key',\n table: tableName,\n namespaceId,\n indexOrConstraint: schemaFK.name ?? `fk(${schemaFK.columns.join(',')})`,\n message: `Extra foreign key found in database (not in contract): ${schemaFK.columns.join(', ')} -> ${schemaFK.referencedTable}(${schemaFK.referencedColumns.join(', ')})`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${schemaFK.columns.join(', ')})`,\n contractPath: `${tablePath}.foreignKeys[${schemaFK.columns.join(',')}]`,\n code: 'extra_foreign_key',\n message: 'Extra foreign key found',\n expected: undefined,\n actual: schemaFK,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies unique constraints match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A unique constraint requirement can be satisfied by either:\n * - A unique constraint with the same columns, or\n * - A unique index with the same columns\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyUniqueConstraints(\n contractUniques: readonly UniqueConstraint[],\n schemaUniques: readonly SqlUniqueIR[],\n schemaIndexes: readonly SqlIndexIR[],\n tableName: string,\n namespaceId: string,\n tablePath: string,\n tableControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract unique exists in schema\n for (const contractUnique of contractUniques) {\n const uniquePath = `${tablePath}.uniques[${contractUnique.columns.join(',')}]`;\n\n // First check for a matching unique constraint\n const matchingUnique = schemaUniques.find((u) =>\n arraysEqual(u.columns, contractUnique.columns),\n );\n\n // If no matching constraint, check for a unique index with the same columns\n const matchingUniqueIndex =\n !matchingUnique &&\n schemaIndexes.find((idx) => idx.unique && arraysEqual(idx.columns, contractUnique.columns));\n\n if (!matchingUnique && !matchingUniqueIndex) {\n const issue: SchemaIssue = {\n kind: 'unique_constraint_mismatch',\n table: tableName,\n namespaceId,\n expected: contractUnique.columns.join(', '),\n message: `Table \"${tableName}\" is missing unique constraint: ${contractUnique.columns.join(', ')}`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: 'unique_constraint_mismatch',\n message: 'Unique constraint missing',\n expected: contractUnique,\n actual: undefined,\n children: [],\n },\n issues,\n nodes,\n );\n } else {\n nodes.push({\n status: 'pass',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n if (strict) {\n for (const schemaUnique of schemaUniques) {\n const matchingUnique = contractUniques.find((u) =>\n arraysEqual(u.columns, schemaUnique.columns),\n );\n\n if (!matchingUnique) {\n const issue: SchemaIssue = {\n kind: 'extra_unique_constraint',\n table: tableName,\n namespaceId,\n indexOrConstraint: schemaUnique.name ?? `unique(${schemaUnique.columns.join(',')})`,\n message: `Extra unique constraint found in database (not in contract): ${schemaUnique.columns.join(', ')}`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'unique',\n name: `unique(${schemaUnique.columns.join(', ')})`,\n contractPath: `${tablePath}.uniques[${schemaUnique.columns.join(',')}]`,\n code: 'extra_unique_constraint',\n message: 'Extra unique constraint found',\n expected: undefined,\n actual: schemaUnique,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies indexes match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A non-unique index requirement can be satisfied by either:\n * - A non-unique index with the same columns, or\n * - A unique index with the same columns (stronger satisfies weaker)\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyIndexes(\n contractIndexes: readonly Index[],\n schemaIndexes: readonly SqlIndexIR[],\n schemaUniques: readonly SqlUniqueIR[],\n tableName: string,\n namespaceId: string,\n tablePath: string,\n tableControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract index exists in schema\n for (const contractIndex of contractIndexes) {\n const indexPath = `${tablePath}.indexes[${contractIndex.columns.join(',')}]`;\n\n // Check for any matching index (unique or non-unique)\n // A unique index can satisfy a non-unique index requirement (stronger satisfies weaker)\n const matchingIndex = schemaIndexes.find(\n (idx) =>\n arraysEqual(idx.columns, contractIndex.columns) && indexExtrasMatch(contractIndex, idx),\n );\n\n // Also check if a unique constraint satisfies the index requirement.\n // Unique constraints carry no type/options of their own, so they can only\n // satisfy a contract index that doesn't request a specific type/options.\n const matchingUniqueConstraint =\n !matchingIndex &&\n contractIndex.type === undefined &&\n contractIndex.options === undefined &&\n schemaUniques.find((u) => arraysEqual(u.columns, contractIndex.columns));\n\n if (!matchingIndex && !matchingUniqueConstraint) {\n const issue: SchemaIssue = {\n kind: 'index_mismatch',\n table: tableName,\n namespaceId,\n expected: contractIndex.columns.join(', '),\n message: `Table \"${tableName}\" is missing index: ${contractIndex.columns.join(', ')}`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: 'index_mismatch',\n message: 'Index missing',\n expected: contractIndex,\n actual: undefined,\n children: [],\n },\n issues,\n nodes,\n );\n } else {\n nodes.push({\n status: 'pass',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n if (strict) {\n for (const schemaIndex of schemaIndexes) {\n if (schemaIndex.unique) {\n continue;\n }\n\n const matchingIndex = contractIndexes.find(\n (idx) =>\n arraysEqual(idx.columns, schemaIndex.columns) && indexExtrasMatch(idx, schemaIndex),\n );\n\n if (!matchingIndex) {\n const issue: SchemaIssue = {\n kind: 'extra_index',\n table: tableName,\n namespaceId,\n indexOrConstraint: schemaIndex.name ?? `idx(${schemaIndex.columns.join(',')})`,\n message: `Extra index found in database (not in contract): ${schemaIndex.columns.join(', ')}`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'index',\n name: `index(${schemaIndex.columns.join(', ')})`,\n contractPath: `${tablePath}.indexes[${schemaIndex.columns.join(',')}]`,\n code: 'extra_index',\n message: 'Extra index found',\n expected: undefined,\n actual: schemaIndex,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Computes counts of pass/warn/fail nodes by traversing the tree.\n */\nexport function computeCounts(node: SchemaVerificationNode): {\n pass: number;\n warn: number;\n fail: number;\n totalNodes: number;\n} {\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n function traverse(n: SchemaVerificationNode): void {\n if (n.status === 'pass') {\n pass++;\n } else if (n.status === 'warn') {\n warn++;\n } else if (n.status === 'fail') {\n fail++;\n }\n\n if (n.children) {\n for (const child of n.children) {\n traverse(child);\n }\n }\n }\n\n traverse(node);\n\n return {\n pass,\n warn,\n fail,\n totalNodes: pass + warn + fail,\n };\n}\n\n/**\n * Compares referential actions between a contract FK and a schema FK.\n * Only compares when the contract FK explicitly specifies onDelete or onUpdate.\n * Returns all mismatches (both onDelete and onUpdate) so both are reported at once.\n *\n * Note: 'noAction' in the contract is semantically equivalent to undefined in the\n * schema IR, because the introspection adapter omits 'NO ACTION' (the database default)\n * to keep the IR sparse. We normalize both sides before comparing.\n */\nfunction getReferentialActionMismatches(\n contractFK: ForeignKey,\n schemaFK: SqlForeignKeyIR,\n): ReadonlyArray<{ expected: string; actual: string; message: string }> {\n const mismatches: Array<{ expected: string; actual: string; message: string }> = [];\n\n const contractOnDelete = normalizeReferentialAction(contractFK.onDelete);\n const schemaOnDelete = normalizeReferentialAction(schemaFK.onDelete);\n if (contractOnDelete !== undefined && contractOnDelete !== schemaOnDelete) {\n mismatches.push({\n expected: `onDelete: ${contractFK.onDelete}`,\n actual: `onDelete: ${schemaFK.onDelete ?? 'noAction (default)'}`,\n message: `onDelete mismatch: expected ${contractFK.onDelete}, got ${schemaFK.onDelete ?? 'noAction (default)'}`,\n });\n }\n\n const contractOnUpdate = normalizeReferentialAction(contractFK.onUpdate);\n const schemaOnUpdate = normalizeReferentialAction(schemaFK.onUpdate);\n if (contractOnUpdate !== undefined && contractOnUpdate !== schemaOnUpdate) {\n mismatches.push({\n expected: `onUpdate: ${contractFK.onUpdate}`,\n actual: `onUpdate: ${schemaFK.onUpdate ?? 'noAction (default)'}`,\n message: `onUpdate mismatch: expected ${contractFK.onUpdate}, got ${schemaFK.onUpdate ?? 'noAction (default)'}`,\n });\n }\n\n return mismatches;\n}\n\n/**\n * Normalizes a referential action value for comparison.\n * 'noAction' is the database default and equivalent to undefined (omitted) in the sparse IR.\n */\nfunction normalizeReferentialAction(action: string | undefined): string | undefined {\n return action === 'noAction' ? undefined : action;\n}\n\n/**\n * Compares two value arrays as unordered sets.\n * Returns true when both sides contain exactly the same values.\n */\nfunction valueSetsEqual(a: readonly string[], b: readonly string[]): boolean {\n const aSet = new Set(a);\n const bSet = new Set(b);\n if (aSet.size !== bSet.size) return false;\n return [...aSet].every((v) => bSet.has(v));\n}\n\n/**\n * Verifies check constraints match between contract-projected checks and\n * introspected live checks.\n *\n * Comparison is value-set-based, not SQL-string-based. Postgres rewrites\n * `col IN ('a','b')` as `col = ANY (ARRAY['a','b'])` in\n * `pg_get_constraintdef`, so comparing the extracted value sets (after\n * the introspection adapter parses the predicate) avoids false mismatches\n * from the `IN`-vs-`= ANY (ARRAY…)` rendering difference.\n *\n * Issues emitted:\n * - `check_missing` — check expected by contract but absent from live DB\n * - `check_removed` — check present in live DB but not in contract\n * - `check_mismatch` — check present on both sides but permitted values differ\n *\n * `check_removed` is emitted only when `strict` is true so non-strict\n * verification (the normal path) does not complain about extra constraints.\n */\nexport function verifyCheckConstraints(\n contractChecks: ReadonlyArray<{\n readonly name: string;\n readonly column: string;\n readonly permittedValues: readonly string[];\n }>,\n schemaChecks: ReadonlyArray<SqlCheckConstraintIR>,\n tableName: string,\n namespaceId: string,\n tablePath: string,\n tableControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n for (const contractCheck of contractChecks) {\n const checkPath = `${tablePath}.checks[${contractCheck.name}]`;\n const liveCheck = schemaChecks.find((c) => c.name === contractCheck.name);\n\n if (!liveCheck) {\n const issue: SchemaIssue = {\n kind: 'check_missing',\n table: tableName,\n namespaceId,\n indexOrConstraint: contractCheck.name,\n expected: contractCheck.permittedValues.join(', '),\n message: `Table \"${tableName}\" is missing check constraint \"${contractCheck.name}\" (column \"${contractCheck.column}\" IN (${contractCheck.permittedValues.join(', ')}))`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'checkConstraint',\n name: `check(${contractCheck.name})`,\n contractPath: checkPath,\n code: 'check_missing',\n message: `Check constraint \"${contractCheck.name}\" missing`,\n expected: contractCheck,\n actual: undefined,\n children: [],\n },\n issues,\n nodes,\n );\n } else if (!valueSetsEqual(contractCheck.permittedValues, liveCheck.permittedValues)) {\n const issue: SchemaIssue = {\n kind: 'check_mismatch',\n table: tableName,\n namespaceId,\n indexOrConstraint: contractCheck.name,\n expected: contractCheck.permittedValues.join(', '),\n actual: liveCheck.permittedValues.join(', '),\n message: `Table \"${tableName}\" check constraint \"${contractCheck.name}\" has different permitted values: expected [${contractCheck.permittedValues.join(', ')}], got [${liveCheck.permittedValues.join(', ')}]`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'checkConstraint',\n name: `check(${contractCheck.name})`,\n contractPath: checkPath,\n code: 'check_mismatch',\n message: `Check constraint \"${contractCheck.name}\" values mismatch`,\n expected: contractCheck,\n actual: liveCheck,\n children: [],\n },\n issues,\n nodes,\n );\n } else {\n nodes.push({\n status: 'pass',\n kind: 'checkConstraint',\n name: `check(${contractCheck.name})`,\n contractPath: checkPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n if (strict) {\n for (const liveCheck of schemaChecks) {\n const matchingContract = contractChecks.find((c) => c.name === liveCheck.name);\n if (!matchingContract) {\n const issue: SchemaIssue = {\n kind: 'check_removed',\n table: tableName,\n namespaceId,\n indexOrConstraint: liveCheck.name,\n actual: liveCheck.permittedValues.join(', '),\n message: `Table \"${tableName}\" has extra check constraint \"${liveCheck.name}\" in database (not in contract)`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'checkConstraint',\n name: `check(${liveCheck.name})`,\n contractPath: `${tablePath}.checks[${liveCheck.name}]`,\n code: 'check_removed',\n message: `Extra check constraint \"${liveCheck.name}\" found`,\n expected: undefined,\n actual: liveCheck,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n }\n\n return nodes;\n}\n","/**\n * Pure SQL schema verification function.\n *\n * This module provides a pure function that verifies a SqlSchemaIR against\n * a Contract without requiring a database connection. It can be reused\n * by migration planners and other tools that need to compare schema states.\n */\n\nimport type { ColumnDefault, Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport { effectiveControlPolicy } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n OperationContext,\n SchemaIssue,\n SchemaVerificationNode,\n VerificationStatus,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\n\nimport {\n isStorageTypeInstance,\n type SqlStorage,\n type StorageColumn,\n StorageTable,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';\nimport { canonicalStringify } from '@prisma-next/utils/canonical-stringify';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { extractCodecControlHooks } from '../assembly';\nimport { resolveValueSetValues } from '../migrations/contract-to-schema-ir';\nimport type { CodecControlHooks } from '../migrations/types';\nimport { emitIssueAndNodeUnderControlPolicy } from './control-verify-emit';\nimport { verifierDisposition } from './verifier-disposition';\nimport {\n arraysEqual,\n computeCounts,\n verifyCheckConstraints,\n verifyForeignKeys,\n verifyIndexes,\n verifyPrimaryKey,\n verifyUniqueConstraints,\n} from './verify-helpers';\n\n/**\n * Function type for normalizing raw database default expressions into ColumnDefault.\n * Target-specific implementations handle database dialect differences.\n */\nexport type DefaultNormalizer = (\n rawDefault: string,\n nativeType: string,\n) => ColumnDefault | undefined;\n\n/**\n * Function type for normalizing schema native types to canonical form for comparison.\n * Target-specific implementations handle dialect-specific type name variations\n * (e.g., Postgres 'varchar' → 'character varying', 'timestamptz' normalization).\n */\nexport type NativeTypeNormalizer = (nativeType: string) => string;\n\n/**\n * Options for the pure schema verification function.\n */\nexport interface VerifySqlSchemaOptions {\n /** The validated SQL contract to verify against */\n readonly contract: Contract<SqlStorage>;\n /** The schema IR from introspection (or another source) */\n readonly schema: SqlSchemaIR;\n /** Whether to run in strict mode (detects extra tables/columns) */\n readonly strict: boolean;\n /** Optional operation context for metadata */\n readonly context?: OperationContext;\n /** Type metadata registry for codec consistency warnings */\n readonly typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n /**\n * Optional target-specific normalizer for raw database default expressions.\n * When provided, schema defaults (raw strings) are normalized before comparison\n * with contract defaults (ColumnDefault objects).\n */\n readonly normalizeDefault?: DefaultNormalizer;\n /**\n * Optional target-specific normalizer for schema native type names.\n * When provided, schema native types are normalized before comparison\n * with contract native types (e.g., Postgres 'varchar' → 'character varying').\n */\n readonly normalizeNativeType?: NativeTypeNormalizer;\n}\n\n/**\n * Verifies that a SqlSchemaIR matches a Contract.\n *\n * This is a pure function that does NOT perform any database I/O.\n * It takes an already-introspected schema IR and compares it against\n * the contract requirements.\n *\n * @param options - Verification options\n * @returns VerifyDatabaseSchemaResult with verification tree and issues\n */\nexport function verifySqlSchema(options: VerifySqlSchemaOptions): VerifyDatabaseSchemaResult {\n const {\n contract,\n schema,\n strict,\n context,\n typeMetadataRegistry,\n normalizeDefault,\n normalizeNativeType,\n } = options;\n const startTime = Date.now();\n\n // Extract codec control hooks once at entry point for reuse\n const codecHooks = extractCodecControlHooks(options.frameworkComponents);\n\n const { contractStorageHash, contractProfileHash, contractTarget } =\n extractContractMetadata(contract);\n const storageTypes: Readonly<Record<string, StorageTypeInstance>> = contract.storage.types ?? {};\n const { issues, rootChildren } = verifySchemaTables({\n contract,\n schema,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n ...ifDefined('normalizeDefault', normalizeDefault),\n ...ifDefined('normalizeNativeType', normalizeNativeType),\n });\n\n validateFrameworkComponentsForExtensions(contract, options.frameworkComponents);\n\n const typeNodes: SchemaVerificationNode[] = [];\n // Storage-type findings dispatch through the same control policy as tables\n // and columns: each issue's disposition (fail / warn / suppress) is resolved\n // from the type's effective control so an `external`/`observed` enum no longer\n // hard-fails on value drift. `suppress` drops the issue entirely; the node\n // status is the worst surviving disposition.\n const pushTypeNode = (\n typeName: string,\n contractPath: string,\n typeIssues: readonly SchemaIssue[],\n controlPolicy: ControlPolicy,\n ): void => {\n let status: VerificationStatus = 'pass';\n let code = '';\n let emitted = 0;\n for (const issue of typeIssues) {\n const disposition = verifierDisposition(controlPolicy, issue.kind);\n if (disposition === 'suppress') continue;\n issues.push(issue);\n emitted += 1;\n if (code === '') code = issue.kind;\n if (disposition === 'fail') {\n status = 'fail';\n } else if (disposition === 'warn' && status !== 'fail') {\n status = 'warn';\n }\n }\n typeNodes.push({\n status,\n kind: 'storageType',\n name: `type ${typeName}`,\n contractPath,\n code: status === 'pass' ? '' : code,\n message: emitted > 0 ? `${emitted} issue${emitted === 1 ? '' : 's'}` : '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n };\n\n // Top-level `storage.types`: codec-typed entries via codec hooks.\n for (const [typeName, typeInstance] of Object.entries(contract.storage.types ?? {})) {\n if (isStorageTypeInstance(typeInstance)) {\n const hook = codecHooks.get(typeInstance.codecId);\n pushTypeNode(\n typeName,\n `storage.types.${typeName}`,\n hook?.verifyType ? hook.verifyType({ typeName, typeInstance, schema }) : [],\n effectiveControlPolicy(undefined, contract.defaultControlPolicy),\n );\n }\n }\n\n if (typeNodes.length > 0) {\n const typesStatus: VerificationStatus = typeNodes.some((n) => n.status === 'fail')\n ? 'fail'\n : typeNodes.some((n) => n.status === 'warn')\n ? 'warn'\n : 'pass';\n rootChildren.push({\n status: typesStatus,\n kind: 'storageTypes',\n name: 'types',\n contractPath: 'storage.types',\n code: typesStatus === 'fail' ? 'type_mismatch' : '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: typeNodes,\n });\n }\n\n const root = buildRootNode(rootChildren);\n\n // Compute counts\n const counts = computeCounts(root);\n\n // Set ok flag\n const ok = counts.fail === 0;\n\n // Set code\n const code = ok ? undefined : 'PN-SCHEMA-0001';\n\n // Set summary\n const summary = ok\n ? 'Database schema satisfies contract'\n : `Database schema does not satisfy contract (${counts.fail} failure${counts.fail === 1 ? '' : 's'})`;\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok,\n ...ifDefined('code', code),\n summary,\n contract: {\n storageHash: contractStorageHash,\n ...ifDefined('profileHash', contractProfileHash),\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n schema: {\n issues,\n root,\n counts,\n },\n meta: {\n strict,\n ...ifDefined('contractPath', context?.contractPath),\n ...ifDefined('configPath', context?.configPath),\n },\n timings: {\n total: totalTime,\n },\n };\n}\n\nfunction extractContractMetadata(contract: Contract<SqlStorage>): {\n contractStorageHash: SqlStorage['storageHash'];\n contractProfileHash?: Contract<SqlStorage>['profileHash'] | undefined;\n contractTarget: Contract<SqlStorage>['target'];\n} {\n return {\n contractStorageHash: contract.storage.storageHash,\n contractProfileHash:\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : undefined,\n contractTarget: contract.target,\n };\n}\n\nfunction verifySchemaTables(options: {\n contract: Contract<SqlStorage>;\n schema: SqlSchemaIR;\n strict: boolean;\n typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\n codecHooks: Map<string, CodecControlHooks>;\n storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n normalizeDefault?: DefaultNormalizer;\n normalizeNativeType?: NativeTypeNormalizer;\n}): { issues: SchemaIssue[]; rootChildren: SchemaVerificationNode[] } {\n const {\n contract,\n schema,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n normalizeDefault,\n normalizeNativeType,\n } = options;\n const contractDefaultControl = contract.defaultControlPolicy;\n const issues: SchemaIssue[] = [];\n const rootChildren: SchemaVerificationNode[] = [];\n const schemaTables = schema.tables;\n const namespaceIds = Object.keys(contract.storage.namespaces).sort((a, b) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n\n for (const namespaceId of namespaceIds) {\n const ns = contract.storage.namespaces[namespaceId];\n if (!ns) continue;\n for (const [tableName, contractTableRaw] of Object.entries(ns.entries.table ?? {})) {\n if (!(contractTableRaw instanceof StorageTable)) {\n throw new Error(\n `verifySqlSchema: expected StorageTable at storage.namespaces.${namespaceId}.entries.table.${tableName}`,\n );\n }\n const contractTable = contractTableRaw;\n const tableControlPolicy = effectiveControlPolicy(\n contractTable.control,\n contractDefaultControl,\n );\n const schemaTable = schemaTables[tableName];\n const tablePath = `storage.namespaces.${namespaceId}.entries.table.${tableName}`;\n\n if (!schemaTable) {\n const issue: SchemaIssue = {\n kind: 'missing_table',\n table: tableName,\n namespaceId,\n message: `Table \"${tableName}\" is missing from database`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: 'missing_table',\n message: `Table \"${tableName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n },\n issues,\n rootChildren,\n );\n continue;\n }\n\n const tableChildren = verifyTableChildren({\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n contractStorage: contract.storage,\n ...ifDefined('normalizeDefault', normalizeDefault),\n ...ifDefined('normalizeNativeType', normalizeNativeType),\n });\n rootChildren.push(buildTableNode(tableName, tablePath, tableChildren));\n }\n }\n\n if (strict) {\n for (const tableName of Object.keys(schemaTables)) {\n const claimed = namespaceIds.some(\n (namespaceId) =>\n contract.storage.namespaces[namespaceId]?.entries.table?.[tableName] !== undefined,\n );\n if (!claimed) {\n const extraTableControlPolicy = effectiveControlPolicy(undefined, contractDefaultControl);\n const issue: SchemaIssue = {\n kind: 'extra_table',\n table: tableName,\n message: `Extra table \"${tableName}\" found in database (not in contract)`,\n };\n emitIssueAndNodeUnderControlPolicy(\n extraTableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: `storage.namespaces.*.entries.table.${tableName}`,\n code: 'extra_table',\n message: `Extra table \"${tableName}\" found`,\n expected: undefined,\n actual: undefined,\n children: [],\n },\n issues,\n rootChildren,\n );\n }\n }\n }\n\n return { issues, rootChildren };\n}\n\nfunction verifyTableChildren(options: {\n contractTable: StorageTable;\n schemaTable: SqlSchemaIR['tables'][string];\n tableName: string;\n namespaceId: string;\n tablePath: string;\n tableControlPolicy: ControlPolicy;\n issues: SchemaIssue[];\n strict: boolean;\n typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\n codecHooks: Map<string, CodecControlHooks>;\n storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n normalizeDefault?: DefaultNormalizer;\n normalizeNativeType?: NativeTypeNormalizer;\n contractStorage: SqlStorage;\n}): SchemaVerificationNode[] {\n const {\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n normalizeDefault,\n normalizeNativeType,\n contractStorage,\n } = options;\n const tableChildren: SchemaVerificationNode[] = [];\n const columnNodes = collectContractColumnNodes({\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n ...ifDefined('normalizeDefault', normalizeDefault),\n ...ifDefined('normalizeNativeType', normalizeNativeType),\n });\n if (columnNodes.length > 0) {\n tableChildren.push(buildColumnsNode(tablePath, columnNodes));\n }\n if (strict) {\n appendExtraColumnNodes({\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n columnNodes,\n });\n }\n\n if (contractTable.primaryKey) {\n const pkStatus = verifyPrimaryKey(\n contractTable.primaryKey,\n schemaTable.primaryKey,\n tableName,\n namespaceId,\n tableControlPolicy,\n issues,\n );\n if (pkStatus === 'fail') {\n tableChildren.push({\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'primary_key_mismatch',\n message: 'Primary key mismatch',\n expected: contractTable.primaryKey,\n actual: schemaTable.primaryKey,\n children: [],\n });\n } else if (pkStatus === 'warn') {\n tableChildren.push({\n status: 'warn',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'primary_key_mismatch',\n message: 'Primary key mismatch',\n expected: contractTable.primaryKey,\n actual: schemaTable.primaryKey,\n children: [],\n });\n } else {\n tableChildren.push({\n status: 'pass',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n } else if (schemaTable.primaryKey && strict) {\n const issue: SchemaIssue = {\n kind: 'extra_primary_key',\n table: tableName,\n namespaceId,\n message: 'Extra primary key found in database (not in contract)',\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${schemaTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'extra_primary_key',\n message: 'Extra primary key found',\n expected: undefined,\n actual: schemaTable.primaryKey,\n children: [],\n },\n issues,\n tableChildren,\n );\n }\n\n // Verify FK constraints only for FKs with constraint: true.\n // Always call when strict mode is on so extra-FK detection runs even if\n // the contract has no FKs for this table.\n const constraintFks = contractTable.foreignKeys.filter((fk) => fk.constraint === true);\n if (constraintFks.length > 0 || strict) {\n const fkStatuses = verifyForeignKeys(\n constraintFks,\n schemaTable.foreignKeys,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n );\n tableChildren.push(...fkStatuses);\n }\n\n const uniqueStatuses = verifyUniqueConstraints(\n contractTable.uniques,\n schemaTable.uniques,\n schemaTable.indexes,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n );\n tableChildren.push(...uniqueStatuses);\n\n // Combine user-declared indexes with FK-backing indexes (from FKs with index: true)\n // so the verifier treats FK-backing indexes as expected, not \"extra\".\n // Deduplicate: skip FK-backing indexes already covered by a user-declared index.\n const fkBackingIndexes = contractTable.foreignKeys\n .filter(\n (fk) =>\n fk.index === true &&\n !contractTable.indexes.some((idx) => arraysEqual(idx.columns, fk.source.columns)),\n )\n .map((fk) => ({ columns: fk.source.columns }));\n const allExpectedIndexes = [...contractTable.indexes, ...fkBackingIndexes];\n\n const indexStatuses = verifyIndexes(\n allExpectedIndexes,\n schemaTable.indexes,\n schemaTable.uniques,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n );\n tableChildren.push(...indexStatuses);\n\n // Verify check constraints when the contract declares checks for this table OR\n // when strict mode is on (so extra live checks on zero-check tables are detected).\n // schemaTable.checks carries the introspected live checks (parsed value sets).\n const contractCheckIRs = (contractTable.checks ?? []).map((c) => ({\n name: c.name,\n column: c.column,\n permittedValues: resolveValueSetValues(c.valueSet, contractStorage, `check \"${c.name}\"`),\n }));\n if (strict || contractCheckIRs.length > 0) {\n const checkStatuses = verifyCheckConstraints(\n contractCheckIRs,\n schemaTable.checks ?? [],\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n );\n tableChildren.push(...checkStatuses);\n }\n\n return tableChildren;\n}\n\nfunction collectContractColumnNodes(options: {\n contractTable: StorageTable;\n schemaTable: SqlSchemaIR['tables'][string];\n tableName: string;\n namespaceId: string;\n tablePath: string;\n tableControlPolicy: ControlPolicy;\n issues: SchemaIssue[];\n strict: boolean;\n typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\n codecHooks: Map<string, CodecControlHooks>;\n storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n normalizeDefault?: DefaultNormalizer;\n normalizeNativeType?: NativeTypeNormalizer;\n}): SchemaVerificationNode[] {\n const {\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n normalizeDefault,\n normalizeNativeType,\n } = options;\n const columnNodes: SchemaVerificationNode[] = [];\n\n for (const [columnName, contractColumn] of Object.entries(contractTable.columns)) {\n const schemaColumn = schemaTable.columns[columnName];\n const columnPath = `${tablePath}.columns.${columnName}`;\n\n if (!schemaColumn) {\n const issue: SchemaIssue = {\n kind: 'missing_column',\n table: tableName,\n namespaceId,\n column: columnName,\n message: `Column \"${tableName}\".\"${columnName}\" is missing from database`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'column',\n name: `${columnName}: missing`,\n contractPath: columnPath,\n code: 'missing_column',\n message: `Column \"${columnName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n },\n issues,\n columnNodes,\n );\n continue;\n }\n\n columnNodes.push(\n verifyColumn({\n tableName,\n namespaceId,\n columnName,\n contractColumn,\n schemaColumn,\n columnPath,\n tableControlPolicy,\n issues,\n strict,\n typeMetadataRegistry,\n codecHooks,\n storageTypes,\n ...ifDefined('normalizeDefault', normalizeDefault),\n ...ifDefined('normalizeNativeType', normalizeNativeType),\n }),\n );\n }\n\n return columnNodes;\n}\n\nfunction appendExtraColumnNodes(options: {\n contractTable: StorageTable;\n schemaTable: SqlSchemaIR['tables'][string];\n tableName: string;\n namespaceId: string;\n tablePath: string;\n tableControlPolicy: ControlPolicy;\n issues: SchemaIssue[];\n columnNodes: SchemaVerificationNode[];\n}): void {\n const {\n contractTable,\n schemaTable,\n tableName,\n namespaceId,\n tablePath,\n tableControlPolicy,\n issues,\n columnNodes,\n } = options;\n for (const [columnName, { nativeType }] of Object.entries(schemaTable.columns)) {\n if (!contractTable.columns[columnName]) {\n const issue: SchemaIssue = {\n kind: 'extra_column',\n table: tableName,\n namespaceId,\n column: columnName,\n message: `Extra column \"${tableName}\".\"${columnName}\" found in database (not in contract)`,\n };\n emitIssueAndNodeUnderControlPolicy(\n tableControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'column',\n name: `${columnName}: extra`,\n contractPath: `${tablePath}.columns.${columnName}`,\n code: 'extra_column',\n message: `Extra column \"${columnName}\" found`,\n expected: undefined,\n actual: nativeType,\n children: [],\n },\n issues,\n columnNodes,\n );\n }\n }\n}\n\nfunction verifyColumn(options: {\n tableName: string;\n namespaceId: string;\n columnName: string;\n contractColumn: StorageTable['columns'][string];\n schemaColumn: SqlSchemaIR['tables'][string]['columns'][string];\n columnPath: string;\n tableControlPolicy: ControlPolicy;\n issues: SchemaIssue[];\n strict: boolean;\n typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\n codecHooks: Map<string, CodecControlHooks>;\n storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n normalizeDefault?: DefaultNormalizer;\n normalizeNativeType?: NativeTypeNormalizer;\n}): SchemaVerificationNode {\n const {\n tableName,\n namespaceId,\n columnName,\n contractColumn,\n schemaColumn,\n columnPath,\n tableControlPolicy,\n issues,\n strict,\n codecHooks,\n storageTypes,\n normalizeDefault,\n normalizeNativeType,\n } = options;\n const columnChildren: SchemaVerificationNode[] = [];\n let columnStatus: VerificationStatus = 'pass';\n\n const resolvedContractColumn = resolveContractColumnTypeMetadata(contractColumn, storageTypes, {\n tableName,\n columnName,\n });\n const contractNativeType = renderExpectedNativeType(contractColumn, storageTypes, codecHooks, {\n tableName,\n columnName,\n });\n const schemaNativeType =\n normalizeNativeType?.(schemaColumn.nativeType) ?? schemaColumn.nativeType;\n\n const typesMatch = contractNativeType === schemaNativeType;\n\n if (!typesMatch) {\n const issue: SchemaIssue = {\n kind: 'type_mismatch',\n table: tableName,\n namespaceId,\n column: columnName,\n expected: contractNativeType,\n actual: schemaNativeType,\n message: `Column \"${tableName}\".\"${columnName}\" has type mismatch: expected \"${contractNativeType}\", got \"${schemaNativeType}\"`,\n };\n const disposition = verifierDisposition(tableControlPolicy, issue.kind);\n if (disposition !== 'suppress') {\n issues.push(issue);\n columnChildren.push({\n status: disposition,\n kind: 'type',\n name: 'type',\n contractPath: `${columnPath}.nativeType`,\n code: 'type_mismatch',\n message: `Type mismatch: expected ${contractNativeType}, got ${schemaNativeType}`,\n expected: contractNativeType,\n actual: schemaNativeType,\n children: [],\n });\n columnStatus = disposition;\n }\n }\n\n if (resolvedContractColumn.codecId) {\n const typeMetadata = options.typeMetadataRegistry.get(resolvedContractColumn.codecId);\n if (!typeMetadata) {\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_metadata_missing',\n contractPath: `${columnPath}.codecId`,\n code: 'type_metadata_missing',\n message: `codecId \"${resolvedContractColumn.codecId}\" not found in type metadata registry`,\n expected: resolvedContractColumn.codecId,\n actual: undefined,\n children: [],\n });\n } else if (\n typeMetadata.nativeType &&\n typeMetadata.nativeType !== resolvedContractColumn.nativeType\n ) {\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_consistency',\n contractPath: `${columnPath}.codecId`,\n code: 'type_consistency_warning',\n message: `codecId \"${resolvedContractColumn.codecId}\" maps to nativeType \"${typeMetadata.nativeType}\" in registry, but contract has \"${resolvedContractColumn.nativeType}\"`,\n expected: typeMetadata.nativeType,\n actual: resolvedContractColumn.nativeType,\n children: [],\n });\n }\n }\n\n if (contractColumn.nullable !== schemaColumn.nullable) {\n const issue: SchemaIssue = {\n kind: 'nullability_mismatch',\n table: tableName,\n namespaceId,\n column: columnName,\n expected: String(contractColumn.nullable),\n actual: String(schemaColumn.nullable),\n message: `Column \"${tableName}\".\"${columnName}\" has nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n };\n const disposition = verifierDisposition(tableControlPolicy, issue.kind);\n if (disposition !== 'suppress') {\n issues.push(issue);\n columnChildren.push({\n status: disposition,\n kind: 'nullability',\n name: 'nullability',\n contractPath: `${columnPath}.nullable`,\n code: 'nullability_mismatch',\n message: `Nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n expected: contractColumn.nullable,\n actual: schemaColumn.nullable,\n children: [],\n });\n columnStatus = disposition;\n }\n }\n\n if (contractColumn.default) {\n if (!schemaColumn.default) {\n const defaultDescription = describeColumnDefault(contractColumn.default);\n const issue: SchemaIssue = {\n kind: 'default_missing',\n table: tableName,\n namespaceId,\n column: columnName,\n expected: defaultDescription,\n message: `Column \"${tableName}\".\"${columnName}\" should have default ${defaultDescription} but database has no default`,\n };\n const disposition = verifierDisposition(tableControlPolicy, issue.kind);\n if (disposition !== 'suppress') {\n issues.push(issue);\n columnChildren.push({\n status: disposition,\n kind: 'default',\n name: 'default',\n contractPath: `${columnPath}.default`,\n code: 'default_missing',\n message: `Default missing: expected ${defaultDescription}`,\n expected: defaultDescription,\n actual: undefined,\n children: [],\n });\n columnStatus = disposition;\n }\n } else if (\n !columnDefaultsEqual(\n contractColumn.default,\n schemaColumn.default,\n normalizeDefault,\n schemaNativeType,\n )\n ) {\n const expectedDescription = describeColumnDefault(contractColumn.default);\n const actualDescription = schemaColumn.default;\n const issue: SchemaIssue = {\n kind: 'default_mismatch',\n table: tableName,\n namespaceId,\n column: columnName,\n expected: expectedDescription,\n actual: actualDescription,\n message: `Column \"${tableName}\".\"${columnName}\" has default mismatch: expected ${expectedDescription}, got ${actualDescription}`,\n };\n const disposition = verifierDisposition(tableControlPolicy, issue.kind);\n if (disposition !== 'suppress') {\n issues.push(issue);\n columnChildren.push({\n status: disposition,\n kind: 'default',\n name: 'default',\n contractPath: `${columnPath}.default`,\n code: 'default_mismatch',\n message: `Default mismatch: expected ${expectedDescription}, got ${actualDescription}`,\n expected: expectedDescription,\n actual: actualDescription,\n children: [],\n });\n columnStatus = disposition;\n }\n }\n } else if (strict && schemaColumn.default) {\n const issue: SchemaIssue = {\n kind: 'extra_default',\n table: tableName,\n namespaceId,\n column: columnName,\n actual: schemaColumn.default,\n message: `Column \"${tableName}\".\"${columnName}\" has default ${schemaColumn.default} in database but contract specifies no default`,\n };\n const disposition = verifierDisposition(tableControlPolicy, issue.kind);\n if (disposition !== 'suppress') {\n issues.push(issue);\n columnChildren.push({\n status: disposition,\n kind: 'default',\n name: 'default',\n contractPath: `${columnPath}.default`,\n code: 'extra_default',\n message: `Extra default: ${schemaColumn.default}`,\n expected: undefined,\n actual: schemaColumn.default,\n children: [],\n });\n columnStatus = disposition;\n }\n }\n\n // Single-pass aggregation for better performance\n const aggregated = aggregateChildState(columnChildren, columnStatus);\n const nullableText = contractColumn.nullable ? 'nullable' : 'not nullable';\n const columnTypeDisplay = resolvedContractColumn.codecId\n ? `${contractNativeType} (${resolvedContractColumn.codecId})`\n : contractNativeType;\n const columnMessage = aggregated.failureMessages.join('; ');\n\n return {\n status: aggregated.status,\n kind: 'column',\n name: `${columnName}: ${columnTypeDisplay} (${nullableText})`,\n contractPath: columnPath,\n code: aggregated.firstCode,\n message: columnMessage,\n expected: undefined,\n actual: undefined,\n children: columnChildren,\n };\n}\n\nfunction buildColumnsNode(\n tablePath: string,\n columnNodes: SchemaVerificationNode[],\n): SchemaVerificationNode {\n return {\n status: aggregateChildState(columnNodes, 'pass').status,\n kind: 'columns',\n name: 'columns',\n contractPath: `${tablePath}.columns`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: columnNodes,\n };\n}\n\nfunction buildTableNode(\n tableName: string,\n tablePath: string,\n tableChildren: SchemaVerificationNode[],\n): SchemaVerificationNode {\n const tableStatus = aggregateChildState(tableChildren, 'pass').status;\n const tableFailureMessages = tableChildren\n .filter((child) => child.status === 'fail' && child.message)\n .map((child) => child.message)\n .filter((msg): msg is string => typeof msg === 'string' && msg.length > 0);\n const tableMessage =\n tableStatus === 'fail' && tableFailureMessages.length > 0\n ? `${tableFailureMessages.length} issue${tableFailureMessages.length === 1 ? '' : 's'}`\n : '';\n const tableCode =\n tableStatus === 'fail' && tableChildren.length > 0 && tableChildren[0]\n ? tableChildren[0].code\n : '';\n\n return {\n status: tableStatus,\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: tableCode,\n message: tableMessage,\n expected: undefined,\n actual: undefined,\n children: tableChildren,\n };\n}\n\nfunction buildRootNode(rootChildren: SchemaVerificationNode[]): SchemaVerificationNode {\n return {\n status: aggregateChildState(rootChildren, 'pass').status,\n kind: 'contract',\n name: 'contract',\n contractPath: '',\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: rootChildren,\n };\n}\n\n/**\n * Aggregated state from child nodes, computed in a single pass.\n */\ninterface AggregatedChildState {\n readonly status: VerificationStatus;\n readonly failureMessages: readonly string[];\n readonly firstCode: string;\n}\n\n/**\n * Aggregates status, failure messages, and code from children in a single pass.\n * This is more efficient than calling separate functions that each iterate the array.\n */\nfunction aggregateChildState(\n children: SchemaVerificationNode[],\n fallback: VerificationStatus,\n): AggregatedChildState {\n let status: VerificationStatus = fallback;\n const failureMessages: string[] = [];\n let firstCode = '';\n\n for (const child of children) {\n if (child.status === 'fail') {\n status = 'fail';\n if (!firstCode) {\n firstCode = child.code;\n }\n if (child.message && typeof child.message === 'string' && child.message.length > 0) {\n failureMessages.push(child.message);\n }\n } else if (child.status === 'warn' && status !== 'fail') {\n status = 'warn';\n if (!firstCode) {\n firstCode = child.code;\n }\n }\n }\n\n return { status, failureMessages, firstCode };\n}\n\nfunction validateFrameworkComponentsForExtensions(\n contract: Contract<SqlStorage>,\n frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>,\n): void {\n const contractExtensionPacks = contract.extensionPacks ?? {};\n for (const extensionNamespace of Object.keys(contractExtensionPacks)) {\n const hasComponent = frameworkComponents.some(\n (component) =>\n component.id === extensionNamespace &&\n (component.kind === 'extension' ||\n component.kind === 'adapter' ||\n component.kind === 'target'),\n );\n if (!hasComponent) {\n throw new Error(\n `Extension pack '${extensionNamespace}' is declared in the contract but not found in framework components. ` +\n 'This indicates a configuration mismatch - the contract was emitted with this extension pack, ' +\n 'but it is not provided in the current configuration.',\n );\n }\n }\n}\n\n/**\n * Renders the expected native type for a contract column, expanding parameterized types\n * using codec control hooks when available.\n *\n * This function delegates to the `expandNativeType` hook if the codec provides one,\n * ensuring that the SQL family layer remains dialect-agnostic while allowing\n * target-specific adapters (like Postgres) to provide their own expansion logic.\n */\nfunction renderExpectedNativeType(\n contractColumn: StorageColumn,\n storageTypes: Readonly<Record<string, StorageTypeInstance>>,\n codecHooks: Map<string, CodecControlHooks>,\n context?: {\n readonly tableName: string;\n readonly columnName: string;\n },\n): string {\n const { codecId, nativeType, typeParams } = resolveContractColumnTypeMetadata(\n contractColumn,\n storageTypes,\n context,\n );\n\n // If no typeParams or codecId, return the base native type\n if (!typeParams || !codecId) {\n return nativeType;\n }\n\n // Try to use the codec's expandNativeType hook if available\n const hooks = codecHooks.get(codecId);\n if (hooks?.expandNativeType) {\n return hooks.expandNativeType({ nativeType, codecId, typeParams });\n }\n\n // Fallback: return base native type if no hook is available\n return nativeType;\n}\n\nfunction resolveContractColumnTypeMetadata(\n contractColumn: StorageColumn,\n storageTypes: Readonly<Record<string, StorageTypeInstance>>,\n context?: {\n readonly tableName: string;\n readonly columnName: string;\n },\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!contractColumn.typeRef) {\n return contractColumn;\n }\n\n const referencedType = storageTypes[contractColumn.typeRef];\n if (!referencedType) {\n const columnLabel = context\n ? `Column \"${context.tableName}\".\"${context.columnName}\"`\n : 'Column';\n throw new Error(\n `${columnLabel} references storage type \"${contractColumn.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n\n if (isStorageTypeInstance(referencedType)) {\n return {\n codecId: referencedType.codecId,\n nativeType: referencedType.nativeType,\n typeParams: referencedType.typeParams,\n };\n }\n throw new Error(\n `Storage type \"${contractColumn.typeRef}\" has an unknown kind; expected a codec-typed StorageTypeInstance.`,\n );\n}\n\n/**\n * Describes a column default for display purposes.\n */\nfunction describeColumnDefault(columnDefault: ColumnDefault): string {\n switch (columnDefault.kind) {\n case 'literal':\n return `literal(${formatLiteralValue(columnDefault.value)})`;\n case 'function':\n return columnDefault.expression;\n }\n}\n\n/**\n * Compares a contract ColumnDefault against a schema raw default string for semantic equality.\n *\n * When a normalizer is provided, the raw schema default is first normalized to a ColumnDefault\n * before comparison. Without a normalizer, falls back to direct string comparison against\n * the contract expression.\n *\n * @param contractDefault - The expected default from the contract (normalized ColumnDefault)\n * @param schemaDefault - The raw default expression from the database (string)\n * @param normalizer - Optional target-specific normalizer to convert raw defaults\n * @param nativeType - The column's native type, passed to normalizer for context\n */\nfunction columnDefaultsEqual(\n contractDefault: ColumnDefault,\n schemaDefault: string,\n normalizer?: DefaultNormalizer,\n nativeType?: string,\n): boolean {\n // If no normalizer provided, fall back to direct string comparison\n if (!normalizer) {\n if (contractDefault.kind === 'function') {\n return contractDefault.expression === schemaDefault;\n }\n const normalizedValue = normalizeLiteralValue(contractDefault.value, nativeType);\n if (typeof normalizedValue === 'string') {\n return normalizedValue === schemaDefault || `'${normalizedValue}'` === schemaDefault;\n }\n return String(normalizedValue) === schemaDefault;\n }\n\n // Normalize the raw schema default using target-specific logic\n const normalizedSchema = normalizer(schemaDefault, nativeType ?? '');\n if (!normalizedSchema) {\n // Normalizer couldn't parse the expression - treat as mismatch\n return false;\n }\n\n // Compare normalized defaults\n if (contractDefault.kind !== normalizedSchema.kind) {\n return false;\n }\n if (contractDefault.kind === 'literal' && normalizedSchema.kind === 'literal') {\n const contractValue = normalizeLiteralValue(contractDefault.value, nativeType);\n const schemaValue = normalizeLiteralValue(normalizedSchema.value, nativeType);\n return literalValuesEqual(contractValue, schemaValue);\n }\n if (contractDefault.kind === 'function' && normalizedSchema.kind === 'function') {\n // Normalize function expressions for comparison (case-insensitive, whitespace-tolerant)\n const normalizeExpr = (expr: string) => expr.toLowerCase().replace(/\\s+/g, '');\n return normalizeExpr(contractDefault.expression) === normalizeExpr(normalizedSchema.expression);\n }\n return false;\n}\n\nfunction isTemporalNativeType(nativeType?: string): boolean {\n if (!nativeType) return false;\n const normalized = nativeType.toLowerCase();\n return normalized.includes('timestamp') || normalized === 'date';\n}\n\nfunction normalizeLiteralValue(value: unknown, nativeType?: string): unknown {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'string' && isTemporalNativeType(nativeType)) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n return value;\n}\n\nfunction literalValuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n return canonicalStringify(a) === canonicalStringify(b);\n }\n if (typeof a === 'object' && a !== null && typeof b === 'string') {\n try {\n return canonicalStringify(a) === canonicalStringify(JSON.parse(b));\n } catch {\n return false;\n }\n }\n if (typeof a === 'string' && typeof b === 'object' && b !== null) {\n try {\n return canonicalStringify(JSON.parse(a)) === canonicalStringify(b);\n } catch {\n return false;\n }\n }\n return false;\n}\n\nfunction formatLiteralValue(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/family-sql",
|
|
3
|
-
"version": "0.13.0-dev.
|
|
3
|
+
"version": "0.13.0-dev.40",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "SQL family descriptor for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/contract": "0.13.0-dev.
|
|
10
|
-
"@prisma-next/emitter": "0.13.0-dev.
|
|
11
|
-
"@prisma-next/framework-components": "0.13.0-dev.
|
|
12
|
-
"@prisma-next/migration-tools": "0.13.0-dev.
|
|
13
|
-
"@prisma-next/operations": "0.13.0-dev.
|
|
14
|
-
"@prisma-next/sql-contract": "0.13.0-dev.
|
|
15
|
-
"@prisma-next/sql-contract-emitter": "0.13.0-dev.
|
|
16
|
-
"@prisma-next/sql-contract-ts": "0.13.0-dev.
|
|
17
|
-
"@prisma-next/sql-operations": "0.13.0-dev.
|
|
18
|
-
"@prisma-next/sql-relational-core": "0.13.0-dev.
|
|
19
|
-
"@prisma-next/sql-runtime": "0.13.0-dev.
|
|
20
|
-
"@prisma-next/sql-schema-ir": "0.13.0-dev.
|
|
21
|
-
"@prisma-next/utils": "0.13.0-dev.
|
|
9
|
+
"@prisma-next/contract": "0.13.0-dev.40",
|
|
10
|
+
"@prisma-next/emitter": "0.13.0-dev.40",
|
|
11
|
+
"@prisma-next/framework-components": "0.13.0-dev.40",
|
|
12
|
+
"@prisma-next/migration-tools": "0.13.0-dev.40",
|
|
13
|
+
"@prisma-next/operations": "0.13.0-dev.40",
|
|
14
|
+
"@prisma-next/sql-contract": "0.13.0-dev.40",
|
|
15
|
+
"@prisma-next/sql-contract-emitter": "0.13.0-dev.40",
|
|
16
|
+
"@prisma-next/sql-contract-ts": "0.13.0-dev.40",
|
|
17
|
+
"@prisma-next/sql-operations": "0.13.0-dev.40",
|
|
18
|
+
"@prisma-next/sql-relational-core": "0.13.0-dev.40",
|
|
19
|
+
"@prisma-next/sql-runtime": "0.13.0-dev.40",
|
|
20
|
+
"@prisma-next/sql-schema-ir": "0.13.0-dev.40",
|
|
21
|
+
"@prisma-next/utils": "0.13.0-dev.40",
|
|
22
22
|
"arktype": "^2.2.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@prisma-next/driver-postgres": "0.13.0-dev.
|
|
26
|
-
"@prisma-next/psl-parser": "0.13.0-dev.
|
|
27
|
-
"@prisma-next/psl-printer": "0.13.0-dev.
|
|
28
|
-
"@prisma-next/sql-contract-psl": "0.13.0-dev.
|
|
29
|
-
"@prisma-next/test-utils": "0.13.0-dev.
|
|
30
|
-
"@prisma-next/tsconfig": "0.13.0-dev.
|
|
31
|
-
"@prisma-next/tsdown": "0.13.0-dev.
|
|
25
|
+
"@prisma-next/driver-postgres": "0.13.0-dev.40",
|
|
26
|
+
"@prisma-next/psl-parser": "0.13.0-dev.40",
|
|
27
|
+
"@prisma-next/psl-printer": "0.13.0-dev.40",
|
|
28
|
+
"@prisma-next/sql-contract-psl": "0.13.0-dev.40",
|
|
29
|
+
"@prisma-next/test-utils": "0.13.0-dev.40",
|
|
30
|
+
"@prisma-next/tsconfig": "0.13.0-dev.40",
|
|
31
|
+
"@prisma-next/tsdown": "0.13.0-dev.40",
|
|
32
32
|
"tsdown": "0.22.1",
|
|
33
33
|
"typescript": "5.9.3",
|
|
34
34
|
"vitest": "4.1.8"
|