@prisma-next/sql-contract-psl 0.5.0-dev.65 → 0.5.0-dev.67
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/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -3
- package/dist/{interpreter-g4FDWENY.mjs → interpreter-C9EP3HJr.mjs} +25 -32
- package/dist/interpreter-C9EP3HJr.mjs.map +1 -0
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +2 -3
- package/dist/provider.mjs.map +1 -1
- package/package.json +13 -13
- package/dist/interpreter-g4FDWENY.mjs.map +0 -1
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/psl-column-resolution.ts","../src/interpreter.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/psl-column-resolution.ts","../src/interpreter.ts"],"mappings":";;;;;;;;;KAuCY,gBAAA;EAAA,SACD,OAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,MAAA;AAAA;;;UCoCP,sCAAA;EAAA,SACN,QAAA,EAAU,sBAAA;EAAA,SACV,MAAA,EAAQ,aAAA;EAAA,SACR,qBAAA,EAAuB,WAAA,SAAoB,gBAAA;EAAA,SAC3C,sBAAA;EAAA,SACA,yBAAA,YAAqC,gBAAA;EAAA,SACrC,uBAAA,GAA0B,yBAAA;EAAA,SAC1B,sBAAA,GAAyB,sBAAA;AAAA;AAAA,iBAqlCpB,iCAAA,CACd,KAAA,EAAO,sCAAA,GACN,MAAA,CAAO,QAAA,EAAU,yBAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { t as interpretPslDocumentToSqlContract } from "./interpreter-
|
|
2
|
-
|
|
3
|
-
export { interpretPslDocumentToSqlContract };
|
|
1
|
+
import { t as interpretPslDocumentToSqlContract } from "./interpreter-C9EP3HJr.mjs";
|
|
2
|
+
export { interpretPslDocumentToSqlContract };
|
|
@@ -4,7 +4,6 @@ import { ifDefined } from "@prisma-next/utils/defined";
|
|
|
4
4
|
import { notOk, ok } from "@prisma-next/utils/result";
|
|
5
5
|
import { getPositionalArgument, parseQuotedStringLiteral } from "@prisma-next/psl-parser";
|
|
6
6
|
import { assertDefined, invariant } from "@prisma-next/utils/assertions";
|
|
7
|
-
|
|
8
7
|
//#region src/psl-attribute-parsing.ts
|
|
9
8
|
function lowerFirst(value) {
|
|
10
9
|
if (value.length === 0) return value;
|
|
@@ -191,7 +190,6 @@ function mapFieldNamesToColumns(input) {
|
|
|
191
190
|
}
|
|
192
191
|
return columns;
|
|
193
192
|
}
|
|
194
|
-
|
|
195
193
|
//#endregion
|
|
196
194
|
//#region src/default-function-registry.ts
|
|
197
195
|
function resolveSpanPositionFromBase(base, text, offset) {
|
|
@@ -330,7 +328,6 @@ function lowerDefaultFunctionWithRegistry(input) {
|
|
|
330
328
|
}
|
|
331
329
|
};
|
|
332
330
|
}
|
|
333
|
-
|
|
334
331
|
//#endregion
|
|
335
332
|
//#region src/psl-authoring-arguments.ts
|
|
336
333
|
const INVALID_AUTHORING_ARGUMENT = Symbol("invalidAuthoringArgument");
|
|
@@ -408,10 +405,10 @@ function parseJsLikeLiteral(value) {
|
|
|
408
405
|
function parseNumber() {
|
|
409
406
|
const raw = value.slice(index).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/)?.[0];
|
|
410
407
|
if (!raw) return INVALID_AUTHORING_ARGUMENT;
|
|
411
|
-
const parsed
|
|
412
|
-
if (!Number.isFinite(parsed
|
|
408
|
+
const parsed = Number(raw);
|
|
409
|
+
if (!Number.isFinite(parsed)) return INVALID_AUTHORING_ARGUMENT;
|
|
413
410
|
index += raw.length;
|
|
414
|
-
return parsed
|
|
411
|
+
return parsed;
|
|
415
412
|
}
|
|
416
413
|
function parseArray() {
|
|
417
414
|
if (value[index] !== "[") return INVALID_AUTHORING_ARGUMENT;
|
|
@@ -569,7 +566,7 @@ function mapPslHelperArgs(input) {
|
|
|
569
566
|
mappedArgs[index] = value;
|
|
570
567
|
}
|
|
571
568
|
for (const argument of namedArgs) {
|
|
572
|
-
const descriptorIndex = input.descriptors.findIndex((descriptor
|
|
569
|
+
const descriptorIndex = input.descriptors.findIndex((descriptor) => descriptor.name === argument.name);
|
|
573
570
|
if (descriptorIndex < 0) return pushInvalidPslHelperArgument({
|
|
574
571
|
diagnostics: input.diagnostics,
|
|
575
572
|
sourceId: input.sourceId,
|
|
@@ -608,7 +605,6 @@ function mapPslHelperArgs(input) {
|
|
|
608
605
|
}
|
|
609
606
|
return mappedArgs;
|
|
610
607
|
}
|
|
611
|
-
|
|
612
608
|
//#endregion
|
|
613
609
|
//#region src/psl-column-resolution.ts
|
|
614
610
|
function toNamedTypeFieldDescriptor(typeRef, descriptor) {
|
|
@@ -796,27 +792,27 @@ function resolveFieldTypeDescriptor(input) {
|
|
|
796
792
|
if (input.field.typeConstructor) {
|
|
797
793
|
const presetDescriptor = getAuthoringFieldPreset(input.authoringContributions, input.field.typeConstructor.path);
|
|
798
794
|
if (presetDescriptor) {
|
|
799
|
-
const instantiated
|
|
795
|
+
const instantiated = instantiatePslFieldPreset({
|
|
800
796
|
call: input.field.typeConstructor,
|
|
801
797
|
descriptor: presetDescriptor,
|
|
802
798
|
diagnostics: input.diagnostics,
|
|
803
799
|
sourceId: input.sourceId,
|
|
804
800
|
entityLabel: input.entityLabel
|
|
805
801
|
});
|
|
806
|
-
if (!instantiated
|
|
802
|
+
if (!instantiated) return {
|
|
807
803
|
ok: false,
|
|
808
804
|
alreadyReported: true
|
|
809
805
|
};
|
|
810
806
|
const presetContributions = {
|
|
811
|
-
nullable: instantiated
|
|
812
|
-
id: instantiated
|
|
813
|
-
unique: instantiated
|
|
814
|
-
...instantiated
|
|
815
|
-
...instantiated
|
|
807
|
+
nullable: instantiated.nullable,
|
|
808
|
+
id: instantiated.id,
|
|
809
|
+
unique: instantiated.unique,
|
|
810
|
+
...instantiated.default !== void 0 ? { default: instantiated.default } : {},
|
|
811
|
+
...instantiated.executionDefaults !== void 0 ? { executionDefaults: instantiated.executionDefaults } : {}
|
|
816
812
|
};
|
|
817
813
|
return {
|
|
818
814
|
ok: true,
|
|
819
|
-
descriptor: instantiated
|
|
815
|
+
descriptor: instantiated.descriptor,
|
|
820
816
|
presetContributions
|
|
821
817
|
};
|
|
822
818
|
}
|
|
@@ -837,7 +833,7 @@ function resolveFieldTypeDescriptor(input) {
|
|
|
837
833
|
alreadyReported: true
|
|
838
834
|
};
|
|
839
835
|
}
|
|
840
|
-
const descriptor
|
|
836
|
+
const descriptor = typeDescriptor ?? resolvePslTypeConstructorDescriptor({
|
|
841
837
|
call: input.field.typeConstructor,
|
|
842
838
|
authoringContributions: input.authoringContributions,
|
|
843
839
|
composedExtensions: input.composedExtensions,
|
|
@@ -848,13 +844,13 @@ function resolveFieldTypeDescriptor(input) {
|
|
|
848
844
|
unsupportedCode: "PSL_UNSUPPORTED_FIELD_TYPE",
|
|
849
845
|
unsupportedMessage: `${input.entityLabel} type constructor "${helperPath}" is not supported in SQL PSL provider v1`
|
|
850
846
|
});
|
|
851
|
-
if (!descriptor
|
|
847
|
+
if (!descriptor) return {
|
|
852
848
|
ok: false,
|
|
853
849
|
alreadyReported: true
|
|
854
850
|
};
|
|
855
851
|
const instantiated = instantiatePslTypeConstructor({
|
|
856
852
|
call: input.field.typeConstructor,
|
|
857
|
-
descriptor
|
|
853
|
+
descriptor,
|
|
858
854
|
diagnostics: input.diagnostics,
|
|
859
855
|
sourceId: input.sourceId,
|
|
860
856
|
entityLabel: input.entityLabel
|
|
@@ -1129,7 +1125,6 @@ function resolveColumnDescriptor(field, enumTypeDescriptors, namedTypeDescriptor
|
|
|
1129
1125
|
if (enumTypeDescriptors.has(field.typeName)) return enumTypeDescriptors.get(field.typeName);
|
|
1130
1126
|
return scalarTypeDescriptors.get(field.typeName);
|
|
1131
1127
|
}
|
|
1132
|
-
|
|
1133
1128
|
//#endregion
|
|
1134
1129
|
//#region src/psl-field-resolution.ts
|
|
1135
1130
|
const BUILTIN_FIELD_ATTRIBUTE_NAMES = new Set([
|
|
@@ -1394,7 +1389,6 @@ function buildModelMappings(models, diagnostics, sourceId) {
|
|
|
1394
1389
|
}
|
|
1395
1390
|
return result;
|
|
1396
1391
|
}
|
|
1397
|
-
|
|
1398
1392
|
//#endregion
|
|
1399
1393
|
//#region src/psl-relation-resolution.ts
|
|
1400
1394
|
const REFERENTIAL_ACTION_MAP = {
|
|
@@ -1635,7 +1629,6 @@ function validateNavigationListFieldAttributes(input) {
|
|
|
1635
1629
|
}
|
|
1636
1630
|
return valid;
|
|
1637
1631
|
}
|
|
1638
|
-
|
|
1639
1632
|
//#endregion
|
|
1640
1633
|
//#region src/interpreter.ts
|
|
1641
1634
|
function buildComposedExtensionPackRefs(target, extensionIds, extensionPackRefs = []) {
|
|
@@ -1757,7 +1750,7 @@ function resolveNamedTypeDeclarations(input) {
|
|
|
1757
1750
|
const namedTypeDescriptors = /* @__PURE__ */ new Map();
|
|
1758
1751
|
for (const declaration of input.declarations) {
|
|
1759
1752
|
if (declaration.typeConstructor) {
|
|
1760
|
-
const { hasUnsupportedNamedTypeAttribute
|
|
1753
|
+
const { hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes({
|
|
1761
1754
|
declaration,
|
|
1762
1755
|
sourceId: input.sourceId,
|
|
1763
1756
|
diagnostics: input.diagnostics,
|
|
@@ -1767,7 +1760,7 @@ function resolveNamedTypeDeclarations(input) {
|
|
|
1767
1760
|
familyId: input.familyId,
|
|
1768
1761
|
targetId: input.targetId
|
|
1769
1762
|
});
|
|
1770
|
-
if (hasUnsupportedNamedTypeAttribute
|
|
1763
|
+
if (hasUnsupportedNamedTypeAttribute) continue;
|
|
1771
1764
|
const helperPath = declaration.typeConstructor.path.join(".");
|
|
1772
1765
|
const typeConstructor = resolvePslTypeConstructorDescriptor({
|
|
1773
1766
|
call: declaration.typeConstructor,
|
|
@@ -1829,7 +1822,7 @@ function resolveNamedTypeDeclarations(input) {
|
|
|
1829
1822
|
});
|
|
1830
1823
|
if (hasUnsupportedNamedTypeAttribute) continue;
|
|
1831
1824
|
if (dbNativeTypeAttribute) {
|
|
1832
|
-
const descriptor
|
|
1825
|
+
const descriptor = resolveDbNativeTypeAttribute({
|
|
1833
1826
|
attribute: dbNativeTypeAttribute,
|
|
1834
1827
|
baseType,
|
|
1835
1828
|
baseDescriptor,
|
|
@@ -1837,12 +1830,12 @@ function resolveNamedTypeDeclarations(input) {
|
|
|
1837
1830
|
sourceId: input.sourceId,
|
|
1838
1831
|
entityLabel: `Named type "${declaration.name}"`
|
|
1839
1832
|
});
|
|
1840
|
-
if (!descriptor
|
|
1841
|
-
namedTypeDescriptors.set(declaration.name, toNamedTypeFieldDescriptor(declaration.name, descriptor
|
|
1833
|
+
if (!descriptor) continue;
|
|
1834
|
+
namedTypeDescriptors.set(declaration.name, toNamedTypeFieldDescriptor(declaration.name, descriptor));
|
|
1842
1835
|
storageTypes[declaration.name] = {
|
|
1843
|
-
codecId: descriptor
|
|
1844
|
-
nativeType: descriptor
|
|
1845
|
-
typeParams: descriptor
|
|
1836
|
+
codecId: descriptor.codecId,
|
|
1837
|
+
nativeType: descriptor.nativeType,
|
|
1838
|
+
typeParams: descriptor.typeParams ?? {}
|
|
1846
1839
|
};
|
|
1847
1840
|
continue;
|
|
1848
1841
|
}
|
|
@@ -2620,7 +2613,7 @@ function interpretPslDocumentToSqlContract(input) {
|
|
|
2620
2613
|
...Object.keys(valueObjects).length > 0 ? { valueObjects } : {}
|
|
2621
2614
|
});
|
|
2622
2615
|
}
|
|
2623
|
-
|
|
2624
2616
|
//#endregion
|
|
2625
2617
|
export { interpretPslDocumentToSqlContract as t };
|
|
2626
|
-
|
|
2618
|
+
|
|
2619
|
+
//# sourceMappingURL=interpreter-C9EP3HJr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter-C9EP3HJr.mjs","names":["functionStart","functionEnd"],"sources":["../src/psl-attribute-parsing.ts","../src/default-function-registry.ts","../src/psl-authoring-arguments.ts","../src/psl-column-resolution.ts","../src/psl-field-resolution.ts","../src/psl-relation-resolution.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { PslAttribute, PslSpan } from '@prisma-next/psl-parser';\nimport { getPositionalArgument, parseQuotedStringLiteral } from '@prisma-next/psl-parser';\n\nexport { getPositionalArgument, parseQuotedStringLiteral };\n\nexport function lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nexport function getAttribute(\n attributes: readonly PslAttribute[] | undefined,\n name: string,\n): PslAttribute | undefined {\n return attributes?.find((attribute) => attribute.name === name);\n}\n\nexport function getNamedArgument(attribute: PslAttribute, name: string): string | undefined {\n const entry = attribute.args.find((arg) => arg.kind === 'named' && arg.name === name);\n if (!entry || entry.kind !== 'named') {\n return undefined;\n }\n return entry.value;\n}\n\nexport function getPositionalArgumentEntry(\n attribute: PslAttribute,\n index = 0,\n): { value: string; span: PslSpan } | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n const entry = entries[index];\n if (!entry || entry.kind !== 'positional') {\n return undefined;\n }\n return {\n value: entry.value,\n span: entry.span,\n };\n}\n\nexport function unquoteStringLiteral(value: string): string {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) {\n return trimmed;\n }\n return match[2] ?? '';\n}\n\nexport function parseFieldList(value: string): readonly string[] | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n return undefined;\n }\n const body = trimmed.slice(1, -1);\n const parts = body\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n return parts;\n}\n\nexport function parseMapName(input: {\n readonly attribute: PslAttribute | undefined;\n readonly defaultValue: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n}): string {\n if (!input.attribute) {\n return input.defaultValue;\n }\n\n const value = getPositionalArgument(input.attribute);\n if (!value) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n const parsed = parseQuotedStringLiteral(value);\n if (parsed === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n return parsed;\n}\n\nexport function parseConstraintMapArgument(input: {\n readonly attribute: PslAttribute | undefined;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n readonly code: string;\n}): string | undefined {\n if (!input.attribute) {\n return undefined;\n }\n\n const raw = getNamedArgument(input.attribute, 'map');\n if (!raw) {\n return undefined;\n }\n\n const parsed = parseQuotedStringLiteral(raw);\n if (parsed !== undefined) {\n return parsed;\n }\n\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function getPositionalArguments(attribute: PslAttribute): readonly string[] {\n return attribute.args\n .filter((arg) => arg.kind === 'positional')\n .map((arg) => (arg.kind === 'positional' ? arg.value : ''));\n}\n\nexport function pushInvalidAttributeArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseOptionalSingleIntegerArgument(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n readonly minimum: number;\n readonly valueLabel: string;\n}): number | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const parsed = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(parsed) || parsed < input.minimum) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a ${input.valueLabel}.`,\n });\n }\n\n return parsed;\n}\n\nexport function parseOptionalNumericArguments(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): { precision: number; scale?: number } | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 2) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const precision = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(precision) || precision < 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a positive integer precision.`,\n });\n }\n\n if (positionalArguments.length === 1) {\n return { precision };\n }\n\n const scale = Number(unquoteStringLiteral(positionalArguments[1] ?? ''));\n if (!Number.isInteger(scale) || scale < 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a non-negative integer scale.`,\n });\n }\n\n return { precision, scale };\n}\n\nexport function parseAttributeFieldList(input: {\n readonly attribute: PslAttribute;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly code: string;\n readonly entityLabel: string;\n}): readonly string[] | undefined {\n const raw = getNamedArgument(input.attribute, 'fields') ?? getPositionalArgument(input.attribute);\n if (!raw) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} requires fields list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const fields = parseFieldList(raw);\n if (!fields || fields.length === 0) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} requires bracketed field list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n return fields;\n}\n\nexport function findDuplicateFieldName(fieldNames: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const name of fieldNames) {\n if (seen.has(name)) return name;\n seen.add(name);\n }\n return undefined;\n}\n\nexport function mapFieldNamesToColumns(input: {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly mapping: { readonly fieldColumns: Map<string, string> };\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly span: PslSpan;\n readonly entityLabel: string;\n}): readonly string[] | undefined {\n const columns: string[] = [];\n for (const fieldName of input.fieldNames) {\n const columnName = input.mapping.fieldColumns.get(fieldName);\n if (!columnName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} references unknown field \"${input.modelName}.${fieldName}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n }\n columns.push(columnName);\n }\n return columns;\n}\n","import type {\n ControlMutationDefaultRegistry,\n DefaultFunctionLoweringContext,\n LoweredDefaultResult,\n ParsedDefaultFunctionCall,\n} from '@prisma-next/framework-components/control';\nimport type { PslSpan } from '@prisma-next/psl-parser';\n\ninterface DefaultFunctionArgument {\n readonly raw: string;\n readonly span: PslSpan;\n}\n\nfunction resolveSpanPositionFromBase(\n base: PslSpan,\n text: string,\n offset: number,\n): PslSpan['start'] {\n const safeOffset = Math.min(Math.max(0, offset), text.length);\n let line = base.start.line;\n let column = base.start.column;\n\n for (let index = 0; index < safeOffset; index += 1) {\n const character = text[index] ?? '';\n if (character === '\\r') {\n if (text[index + 1] === '\\n' && index + 1 < safeOffset) {\n index += 1;\n }\n line += 1;\n column = 1;\n continue;\n }\n if (character === '\\n') {\n line += 1;\n column = 1;\n continue;\n }\n column += 1;\n }\n\n return {\n offset: base.start.offset + safeOffset,\n line,\n column,\n };\n}\n\nfunction createSpanFromBase(\n base: PslSpan,\n startOffset: number,\n endOffset: number,\n text: string,\n): PslSpan {\n const safeStart = Math.max(0, Math.min(startOffset, text.length));\n const safeEnd = Math.max(safeStart, Math.min(endOffset, text.length));\n return {\n start: resolveSpanPositionFromBase(base, text, safeStart),\n end: resolveSpanPositionFromBase(base, text, safeEnd),\n };\n}\n\nfunction splitTopLevelArgs(raw: string): Array<{ raw: string; start: number; end: number }> {\n if (raw.trim().length === 0) {\n return [];\n }\n\n const parts: Array<{ raw: string; start: number; end: number }> = [];\n let depthParen = 0;\n let depthBracket = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n\n for (let index = 0; index < raw.length; index += 1) {\n const character = raw[index] ?? '';\n if (quote) {\n if (character === quote && raw[index - 1] !== '\\\\') {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n\n if (character === ',' && depthParen === 0 && depthBracket === 0) {\n parts.push({\n raw: raw.slice(start, index),\n start,\n end: index,\n });\n start = index + 1;\n }\n }\n\n parts.push({\n raw: raw.slice(start),\n start,\n end: raw.length,\n });\n\n return parts;\n}\n\nexport function parseDefaultFunctionCall(\n expression: string,\n expressionSpan: PslSpan,\n): ParsedDefaultFunctionCall | undefined {\n const trimmed = expression.trim();\n const leadingWhitespace = expression.length - expression.trimStart().length;\n const trailingWhitespace = expression.length - expression.trimEnd().length;\n const contentEnd = expression.length - trailingWhitespace;\n\n const openParen = trimmed.indexOf('(');\n const closeParen = trimmed.lastIndexOf(')');\n if (openParen <= 0 || closeParen !== trimmed.length - 1) {\n return undefined;\n }\n\n const functionName = trimmed.slice(0, openParen).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(functionName)) {\n return undefined;\n }\n\n const functionArgsRaw = trimmed.slice(openParen + 1, closeParen);\n const parts = splitTopLevelArgs(functionArgsRaw);\n const args: DefaultFunctionArgument[] = [];\n for (const part of parts) {\n const raw = part.raw.trim();\n if (raw.length === 0) {\n return undefined;\n }\n const leadingPartWhitespace = part.raw.length - part.raw.trimStart().length;\n const argStart = leadingWhitespace + openParen + 1 + part.start + leadingPartWhitespace;\n const argEnd = argStart + raw.length;\n args.push({\n raw,\n span: createSpanFromBase(expressionSpan, argStart, argEnd, expression),\n });\n }\n\n const functionStart = leadingWhitespace;\n const functionEnd = contentEnd;\n return {\n name: functionName,\n raw: trimmed,\n args,\n span: createSpanFromBase(expressionSpan, functionStart, functionEnd, expression),\n };\n}\n\nfunction formatSupportedFunctionList(registry: ControlMutationDefaultRegistry): string {\n const signatures = Array.from(registry.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .flatMap(([functionName, entry]) => {\n const usageSignatures = entry.usageSignatures?.filter((signature) => signature.length > 0);\n return usageSignatures && usageSignatures.length > 0\n ? usageSignatures\n : [`${functionName}()`];\n });\n return signatures.length > 0 ? signatures.join(', ') : 'none';\n}\n\nexport function lowerDefaultFunctionWithRegistry(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly registry: ControlMutationDefaultRegistry;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const entry = input.registry.get(input.call.name);\n if (entry) {\n return entry.lower({ call: input.call, context: input.context });\n }\n const supportedFunctionList = formatSupportedFunctionList(input.registry);\n\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message: `Default function \"${input.call.name}\" is not supported in SQL PSL provider v1. Supported functions: ${supportedFunctionList}.`,\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { AuthoringArgumentDescriptor } from '@prisma-next/framework-components/authoring';\nimport type { PslAttributeArgument, PslSpan } from '@prisma-next/psl-parser';\nimport { unquoteStringLiteral } from './psl-attribute-parsing';\n\nconst INVALID_AUTHORING_ARGUMENT = Symbol('invalidAuthoringArgument');\n\ntype ParsedPslLiteral =\n | string\n | number\n | boolean\n | null\n | ParsedPslLiteral[]\n | { [key: string]: ParsedPslLiteral };\n\nfunction isIdentifierStartCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z_$]/.test(character);\n}\n\nfunction isIdentifierCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z0-9_$]/.test(character);\n}\n\nfunction parseJsLikeLiteral(value: string): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n let index = 0;\n\n function skipWhitespace() {\n while (/\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n }\n\n function parseIdentifier(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const first = value[index];\n if (!isIdentifierStartCharacter(first)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let end = index + 1;\n while (isIdentifierCharacter(value[end])) {\n end += 1;\n }\n\n const identifier = value.slice(index, end);\n index = end;\n return identifier;\n }\n\n function parseString(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const quote = value[index];\n if (quote !== '\"' && quote !== \"'\") {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n let result = '';\n\n while (index < value.length) {\n const character = value[index];\n index += 1;\n\n if (character === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n if (character === quote) {\n return result;\n }\n\n if (character !== '\\\\') {\n result += character;\n continue;\n }\n\n const escaped = value[index];\n index += 1;\n\n if (escaped === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n switch (escaped) {\n case \"'\":\n case '\"':\n case '\\\\':\n case '/':\n result += escaped;\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'u': {\n const hex = value.slice(index, index + 4);\n if (!/^[0-9A-Fa-f]{4}$/.test(hex)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result += String.fromCharCode(Number.parseInt(hex, 16));\n index += 4;\n break;\n }\n default:\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseNumber(): number | typeof INVALID_AUTHORING_ARGUMENT {\n const match = value.slice(index).match(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/);\n const raw = match?.[0];\n if (!raw) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += raw.length;\n return parsed;\n }\n\n function parseArray(): ParsedPslLiteral[] | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '[') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: ParsedPslLiteral[] = [];\n\n skipWhitespace();\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result.push(entry);\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseObject(): { [key: string]: ParsedPslLiteral } | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '{') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: { [key: string]: ParsedPslLiteral } = {};\n\n skipWhitespace();\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n skipWhitespace();\n const key = value[index] === '\"' || value[index] === \"'\" ? parseString() : parseIdentifier();\n if (key === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n if (value[index] !== ':') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result[key] = entry;\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseValue(): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n skipWhitespace();\n const character = value[index];\n if (character === '{') {\n return parseObject();\n }\n if (character === '[') {\n return parseArray();\n }\n if (character === '\"' || character === \"'\") {\n return parseString();\n }\n if (character === '-' || /\\d/.test(character ?? '')) {\n return parseNumber();\n }\n\n const identifier = parseIdentifier();\n if (identifier === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (identifier === 'true') {\n return true;\n }\n if (identifier === 'false') {\n return false;\n }\n if (identifier === 'null') {\n return null;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n const parsed = parseValue();\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return parsed;\n }\n\n skipWhitespace();\n return index === value.length ? parsed : INVALID_AUTHORING_ARGUMENT;\n}\n\nfunction parseStringArrayLiteral(\n value: string,\n): readonly string[] | typeof INVALID_AUTHORING_ARGUMENT {\n const parsed = parseJsLikeLiteral(value);\n if (parsed === INVALID_AUTHORING_ARGUMENT || !Array.isArray(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (!parsed.every((item): item is string => typeof item === 'string')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n return parsed;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parsePslObjectLiteral(\n value: string,\n): Record<string, unknown> | typeof INVALID_AUTHORING_ARGUMENT {\n const trimmed = value.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n parsed = parseJsLikeLiteral(trimmed);\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n if (!isPlainObject(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return parsed;\n}\n\nfunction parsePslAuthoringArgumentValue(\n descriptor: AuthoringArgumentDescriptor,\n rawValue: string,\n): unknown | typeof INVALID_AUTHORING_ARGUMENT {\n switch (descriptor.kind) {\n case 'string':\n return unquoteStringLiteral(rawValue);\n case 'number': {\n const parsed = Number(unquoteStringLiteral(rawValue));\n return Number.isNaN(parsed) ? INVALID_AUTHORING_ARGUMENT : parsed;\n }\n case 'stringArray':\n return parseStringArrayLiteral(rawValue);\n case 'object':\n return parsePslObjectLiteral(rawValue);\n default: {\n const _exhaustive: never = descriptor;\n void _exhaustive;\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n}\n\nfunction pushInvalidPslHelperArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly entityLabel: string;\n readonly helperLabel: string;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} ${input.helperLabel} ${input.message}`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function mapPslHelperArgs(input: {\n readonly args: readonly PslAttributeArgument[];\n readonly descriptors: readonly AuthoringArgumentDescriptor[];\n readonly helperLabel: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): readonly unknown[] | undefined {\n const mappedArgs: unknown[] = input.descriptors.map(() => undefined);\n\n const positionalArgs = input.args.filter((arg) => arg.kind === 'positional');\n const namedArgs = input.args.filter((arg) => arg.kind === 'named');\n\n if (positionalArgs.length > input.descriptors.length) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `accepts at most ${input.descriptors.length} argument(s), received ${positionalArgs.length}.`,\n });\n }\n\n for (const [index, argument] of positionalArgs.entries()) {\n const descriptor = input.descriptors[index];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define positional argument #${index + 1}.`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse argument #${index + 1} for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[index] = value;\n }\n\n for (const argument of namedArgs) {\n const descriptorIndex = input.descriptors.findIndex(\n (descriptor) => descriptor.name === argument.name,\n );\n if (descriptorIndex < 0) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received unknown named argument \"${argument.name}\".`,\n });\n }\n\n if (mappedArgs[descriptorIndex] !== undefined) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received duplicate value for argument \"${argument.name}\".`,\n });\n }\n\n const descriptor = input.descriptors[descriptorIndex];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define named argument \"${argument.name}\".`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse named argument \"${argument.name}\" for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[descriptorIndex] = value;\n }\n\n return mappedArgs;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultPhases } from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringFieldPresetDescriptor,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n hasRegisteredFieldNamespace,\n instantiateAuthoringFieldPreset,\n instantiateAuthoringTypeConstructor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n validateAuthoringHelperArguments,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type {\n PslAttribute,\n PslField,\n PslSpan,\n PslTypeConstructorCall,\n} from '@prisma-next/psl-parser';\nimport {\n lowerDefaultFunctionWithRegistry,\n parseDefaultFunctionCall,\n} from './default-function-registry';\nimport {\n getPositionalArgumentEntry,\n getPositionalArguments,\n parseOptionalNumericArguments,\n parseOptionalSingleIntegerArgument,\n pushInvalidAttributeArgument,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { mapPslHelperArgs } from './psl-authoring-arguments';\n\nexport type ColumnDescriptor = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown> | undefined;\n};\n\nexport function toNamedTypeFieldDescriptor(\n typeRef: string,\n descriptor: Pick<ColumnDescriptor, 'codecId' | 'nativeType'>,\n): ColumnDescriptor {\n return {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeRef,\n };\n}\n\nexport function getAuthoringTypeConstructor(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringTypeConstructorDescriptor | undefined {\n let current: unknown = contributions?.type;\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return isAuthoringTypeConstructorDescriptor(current) ? current : undefined;\n}\n\n/**\n * Walks `authoringContributions.field` segment-by-segment and returns the field-preset descriptor at the resolved path, or `undefined` if no descriptor is registered.\n *\n * Symmetric with `getAuthoringTypeConstructor`. Field presets are strictly richer than type constructors — they can contribute `default` / `executionDefaults` / `id` / `unique` / `nullable` in addition to the `codecId` / `nativeType` / `typeParams` triple. PSL resolution tries field presets first, then falls back to type constructors on miss (see `resolveFieldTypeDescriptor`).\n */\nexport function getAuthoringFieldPreset(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringFieldPresetDescriptor | undefined {\n let current: unknown = contributions?.field;\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return isAuthoringFieldPresetDescriptor(current) ? current : undefined;\n}\n\n/**\n * Returns the namespace prefix of `attributeName` if it references an unrecognized extension namespace, otherwise `undefined`. A namespace is considered recognized when it is:\n *\n * - `db` (native-type spec, always allowed),\n * - the active family id (e.g. `sql`),\n * - the active target id (e.g. `postgres`),\n * - a registered field-preset namespace (e.g. `temporal`),\n * - present in `composedExtensions`.\n *\n * Family/target/field-preset namespaces are exempted so that e.g. `@sql.foo` surfaces as PSL_UNSUPPORTED_*_ATTRIBUTE (the attribute isn't defined) rather than PSL_EXTENSION_NAMESPACE_NOT_COMPOSED (the namespace is already composed).\n */\nexport function checkUncomposedNamespace(\n attributeName: string,\n composedExtensions: ReadonlySet<string>,\n context?: {\n readonly familyId?: string;\n readonly targetId?: string;\n readonly authoringContributions?: AuthoringContributions | undefined;\n },\n): string | undefined {\n const dotIndex = attributeName.indexOf('.');\n if (dotIndex <= 0 || dotIndex === attributeName.length - 1) {\n return undefined;\n }\n const namespace = attributeName.slice(0, dotIndex);\n if (\n namespace === 'db' ||\n namespace === context?.familyId ||\n namespace === context?.targetId ||\n hasRegisteredFieldNamespace(context?.authoringContributions, namespace) ||\n composedExtensions.has(namespace)\n ) {\n return undefined;\n }\n return namespace;\n}\n\n/**\n * Pushes the canonical `PSL_EXTENSION_NAMESPACE_NOT_COMPOSED` diagnostic for a subject (attribute, model attribute, or type constructor) that references an extension namespace which is not composed in the current contract.\n *\n * The `data` payload carries the missing namespace so machine consumers (agents, IDE extensions, CLI auto-fix) don't have to parse the prose.\n */\nexport function reportUncomposedNamespace(input: {\n readonly subjectLabel: string;\n readonly namespace: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n input.diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `${input.subjectLabel} uses unrecognized namespace \"${input.namespace}\". Add extension pack \"${input.namespace}\" to extensionPacks in prisma-next.config.ts.`,\n sourceId: input.sourceId,\n span: input.span,\n data: { namespace: input.namespace, suggestedPack: input.namespace },\n });\n}\n\n/**\n * Pushes the canonical `PSL_UNKNOWN_FIELD_PRESET` diagnostic when a typoed preset name is referenced inside a registered field-preset namespace. The `data` payload exposes the namespace and full helper path so machine consumers (agents, IDE extensions) don't have to parse the prose.\n */\nexport function reportUnknownFieldPreset(input: {\n readonly entityLabel: string;\n readonly namespace: string;\n readonly helperPath: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n input.diagnostics.push({\n code: 'PSL_UNKNOWN_FIELD_PRESET',\n message: `${input.entityLabel} references unknown field preset \"${input.helperPath}\". Check the spelling against the available presets in the \"${input.namespace}\" namespace.`,\n sourceId: input.sourceId,\n span: input.span,\n data: { namespace: input.namespace, helperPath: input.helperPath },\n });\n}\n\nexport function instantiatePslTypeConstructor(input: {\n readonly call: PslTypeConstructorCall;\n readonly descriptor: AuthoringTypeConstructorDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}):\n | {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n }\n | undefined {\n const helperPath = input.call.path.join('.');\n const args = mapPslHelperArgs({\n args: input.call.args,\n descriptors: input.descriptor.args ?? [],\n helperLabel: `constructor \"${helperPath}\"`,\n span: input.call.span,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!args) {\n return undefined;\n }\n\n try {\n validateAuthoringHelperArguments(helperPath, input.descriptor.args, args);\n return instantiateAuthoringTypeConstructor(input.descriptor, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} constructor \"${helperPath}\" ${message}`,\n sourceId: input.sourceId,\n span: input.call.span,\n });\n return undefined;\n }\n}\n\nfunction pushUnsupportedTypeConstructorDiagnostic(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly code: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: input.code,\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function resolvePslTypeConstructorDescriptor(input: {\n readonly call: PslTypeConstructorCall;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly unsupportedMessage: string;\n}): AuthoringTypeConstructorDescriptor | undefined {\n const descriptor = getAuthoringTypeConstructor(input.authoringContributions, input.call.path);\n if (descriptor) {\n return descriptor;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(\n input.call.path.join('.'),\n input.composedExtensions,\n {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n },\n );\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Type constructor \"${input.call.path.join('.')}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: input.call.span,\n diagnostics: input.diagnostics,\n });\n return undefined;\n }\n\n return pushUnsupportedTypeConstructorDiagnostic({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.call.span,\n code: input.unsupportedCode,\n message: input.unsupportedMessage,\n });\n}\n\n/**\n * Instantiates a field-preset call against its descriptor, coercing PSL AST arguments into the descriptor's typed argument shape and returning the preset's full set of contract contributions.\n *\n * Symmetric with `instantiatePslTypeConstructor` but richer: a field preset can contribute `default`, `executionDefaults`, `id`, `unique`, and `nullable` in addition to the storage-type triple. PSL → typed-args coercion happens here (via `mapPslHelperArgs`) so that `instantiateAuthoringFieldPreset` itself stays typed-input-only and TS keeps its zero-runtime-validation cost.\n */\nexport function instantiatePslFieldPreset(input: {\n readonly call: PslTypeConstructorCall;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}):\n | {\n readonly descriptor: ColumnDescriptor;\n readonly nullable: boolean;\n readonly default?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n readonly id: boolean;\n readonly unique: boolean;\n }\n | undefined {\n const helperPath = input.call.path.join('.');\n const args = mapPslHelperArgs({\n args: input.call.args,\n descriptors: input.descriptor.args ?? [],\n helperLabel: `preset \"${helperPath}\"`,\n span: input.call.span,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!args) {\n return undefined;\n }\n\n try {\n validateAuthoringHelperArguments(helperPath, input.descriptor.args, args);\n const instantiated = instantiateAuthoringFieldPreset(input.descriptor, args);\n return {\n descriptor: {\n codecId: instantiated.descriptor.codecId,\n nativeType: instantiated.descriptor.nativeType,\n ...(instantiated.descriptor.typeParams !== undefined\n ? { typeParams: instantiated.descriptor.typeParams }\n : {}),\n },\n nullable: instantiated.nullable,\n ...(instantiated.default !== undefined ? { default: instantiated.default } : {}),\n ...(instantiated.executionDefaults !== undefined\n ? { executionDefaults: instantiated.executionDefaults }\n : {}),\n id: instantiated.id,\n unique: instantiated.unique,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} preset \"${helperPath}\" ${message}`,\n sourceId: input.sourceId,\n span: input.call.span,\n });\n return undefined;\n }\n}\n\n/**\n * Contract contributions a field preset adds beyond the bare storage-type triple. Set when a field is resolved through the field-preset dispatch path; absent when resolved through the type-constructor path or as a scalar/enum/named-type lookup.\n */\nexport type FieldPresetContributions = {\n readonly nullable: boolean;\n readonly id: boolean;\n readonly unique: boolean;\n readonly default?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n};\n\nexport type ResolveFieldTypeResult =\n | {\n readonly ok: true;\n readonly descriptor: ColumnDescriptor;\n readonly presetContributions?: FieldPresetContributions;\n }\n | { readonly ok: false; readonly alreadyReported: boolean };\n\nexport function resolveFieldTypeDescriptor(input: {\n readonly field: PslField;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ResolveFieldTypeResult {\n if (input.field.typeConstructor) {\n // Field presets carry richer semantics than type constructors, so a field preset match is the complete answer. Shared composition rejects exact cross-registry collisions before PSL resolution can observe them.\n const presetDescriptor = getAuthoringFieldPreset(\n input.authoringContributions,\n input.field.typeConstructor.path,\n );\n if (presetDescriptor) {\n const instantiated = instantiatePslFieldPreset({\n call: input.field.typeConstructor,\n descriptor: presetDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!instantiated) {\n return { ok: false, alreadyReported: true };\n }\n const presetContributions: FieldPresetContributions = {\n nullable: instantiated.nullable,\n id: instantiated.id,\n unique: instantiated.unique,\n ...(instantiated.default !== undefined ? { default: instantiated.default } : {}),\n ...(instantiated.executionDefaults !== undefined\n ? { executionDefaults: instantiated.executionDefaults }\n : {}),\n };\n return { ok: true, descriptor: instantiated.descriptor, presetContributions };\n }\n\n const helperPath = input.field.typeConstructor.path.join('.');\n const namespacePrefix =\n input.field.typeConstructor.path.length > 1 ? input.field.typeConstructor.path[0] : undefined;\n const typeDescriptor = getAuthoringTypeConstructor(\n input.authoringContributions,\n input.field.typeConstructor.path,\n );\n\n if (\n !typeDescriptor &&\n namespacePrefix &&\n hasRegisteredFieldNamespace(input.authoringContributions, namespacePrefix)\n ) {\n reportUnknownFieldPreset({\n entityLabel: input.entityLabel,\n namespace: namespacePrefix,\n helperPath,\n sourceId: input.sourceId,\n span: input.field.typeConstructor.span,\n diagnostics: input.diagnostics,\n });\n return { ok: false, alreadyReported: true };\n }\n\n const descriptor =\n typeDescriptor ??\n resolvePslTypeConstructorDescriptor({\n call: input.field.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE',\n unsupportedMessage: `${input.entityLabel} type constructor \"${helperPath}\" is not supported in SQL PSL provider v1`,\n });\n if (!descriptor) {\n return { ok: false, alreadyReported: true };\n }\n\n const instantiated = instantiatePslTypeConstructor({\n call: input.field.typeConstructor,\n descriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!instantiated) {\n return { ok: false, alreadyReported: true };\n }\n return { ok: true, descriptor: instantiated };\n }\n\n const descriptor = resolveColumnDescriptor(\n input.field,\n input.enumTypeDescriptors,\n input.namedTypeDescriptors,\n input.scalarTypeDescriptors,\n );\n if (!descriptor) {\n return { ok: false, alreadyReported: false };\n }\n return { ok: true, descriptor };\n}\n\n/**\n * Declarative specification for @db.* native type attributes.\n *\n * Argument kinds:\n * - `noArgs`: No arguments accepted; `codecId: null` means inherit from baseDescriptor.\n * - `optionalLength`: Zero or one positional integer (minimum 1), stored as `{ length }`.\n * - `optionalPrecision`: Zero or one positional integer (minimum 0), stored as `{ precision }`.\n * - `optionalNumeric`: Zero, one, or two positional integers (precision + scale).\n */\nexport type NativeTypeSpec =\n | {\n readonly args: 'noArgs';\n readonly baseType: string;\n readonly codecId: string | null;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalLength';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalPrecision';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalNumeric';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n };\n\nexport const NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>> = {\n 'db.VarChar': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/varchar@1',\n nativeType: 'character varying',\n },\n 'db.Char': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/char@1',\n nativeType: 'character',\n },\n 'db.Uuid': { args: 'noArgs', baseType: 'String', codecId: null, nativeType: 'uuid' },\n 'db.SmallInt': { args: 'noArgs', baseType: 'Int', codecId: 'pg/int2@1', nativeType: 'int2' },\n 'db.Real': { args: 'noArgs', baseType: 'Float', codecId: 'pg/float4@1', nativeType: 'float4' },\n 'db.Numeric': {\n args: 'optionalNumeric',\n baseType: 'Decimal',\n codecId: 'pg/numeric@1',\n nativeType: 'numeric',\n },\n 'db.Timestamp': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamp@1',\n nativeType: 'timestamp',\n },\n 'db.Timestamptz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamptz@1',\n nativeType: 'timestamptz',\n },\n 'db.Date': { args: 'noArgs', baseType: 'DateTime', codecId: null, nativeType: 'date' },\n 'db.Time': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/time@1',\n nativeType: 'time',\n },\n 'db.Timetz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timetz@1',\n nativeType: 'timetz',\n },\n 'db.Json': { args: 'noArgs', baseType: 'Json', codecId: 'pg/json@1', nativeType: 'json' },\n};\n\nexport function resolveDbNativeTypeAttribute(input: {\n readonly attribute: PslAttribute;\n readonly baseType: string;\n readonly baseDescriptor: ColumnDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ColumnDescriptor | undefined {\n const spec = NATIVE_TYPE_SPECS[input.attribute.name];\n if (!spec) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `${input.entityLabel} uses unsupported attribute \"@${input.attribute.name}\"`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (input.baseType !== spec.baseType) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} uses @${input.attribute.name} on unsupported base type \"${input.baseType}\". Expected \"${spec.baseType}\".`,\n });\n }\n\n switch (spec.args) {\n case 'noArgs': {\n if (getPositionalArguments(input.attribute).length > 0 || input.attribute.args.length > 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} does not accept arguments.`,\n });\n }\n return {\n codecId: spec.codecId ?? input.baseDescriptor.codecId,\n nativeType: spec.nativeType,\n };\n }\n case 'optionalLength': {\n const length = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 1,\n valueLabel: 'positive integer length',\n });\n if (length === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(length === null ? {} : { typeParams: { length } }),\n };\n }\n case 'optionalPrecision': {\n const precision = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 0,\n valueLabel: 'non-negative integer precision',\n });\n if (precision === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(precision === null ? {} : { typeParams: { precision } }),\n };\n }\n case 'optionalNumeric': {\n const numeric = parseOptionalNumericArguments({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (numeric === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(numeric === null ? {} : { typeParams: numeric }),\n };\n }\n }\n}\n\nexport function parseDefaultLiteralValue(expression: string): ColumnDefault | undefined {\n const trimmed = expression.trim();\n if (trimmed === 'true' || trimmed === 'false') {\n return { kind: 'literal', value: trimmed === 'true' };\n }\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue) && trimmed.length > 0 && !/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: numericValue };\n }\n if (/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: unquoteStringLiteral(trimmed) };\n }\n return undefined;\n}\n\nexport function lowerDefaultForField(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly defaultAttribute: PslAttribute;\n readonly columnDescriptor: ColumnDescriptor;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly sourceId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly defaultValue?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n} {\n const positionalEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'positional');\n const namedEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'named');\n\n if (namedEntries.length > 0 || positionalEntries.length !== 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires exactly one positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const expressionEntry = getPositionalArgumentEntry(input.defaultAttribute);\n if (!expressionEntry) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires a positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const literalDefault = parseDefaultLiteralValue(expressionEntry.value);\n if (literalDefault) {\n return { defaultValue: literalDefault };\n }\n\n const defaultFunctionCall = parseDefaultFunctionCall(expressionEntry.value, expressionEntry.span);\n if (!defaultFunctionCall) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_VALUE',\n message: `Unsupported default value \"${expressionEntry.value}\"`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const lowered = lowerDefaultFunctionWithRegistry({\n call: defaultFunctionCall,\n registry: input.defaultFunctionRegistry,\n context: {\n sourceId: input.sourceId,\n modelName: input.modelName,\n fieldName: input.fieldName,\n columnCodecId: input.columnDescriptor.codecId,\n },\n });\n\n if (!lowered.ok) {\n input.diagnostics.push(lowered.diagnostic);\n return {};\n }\n\n if (lowered.value.kind === 'storage') {\n return { defaultValue: lowered.value.defaultValue };\n }\n\n const generatorDescriptor = input.generatorDescriptorById.get(lowered.value.generated.id);\n if (!generatorDescriptor) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${lowered.value.generated.id}\" is not available in the composed mutation default registry.`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n // Preset-only generators (e.g. `timestampNow`) co-register their codec through the preset descriptor, so they don't carry an `applicableCodecIds` list. Such a generator surfacing on the `@default(...)` lowering path is itself the bug — emit a diagnostic pointing the user at the correct authoring surface.\n if (generatorDescriptor.applicableCodecIds === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${generatorDescriptor.id}\" is not applicable to \"@default(...)\" lowering. Use the corresponding field preset (e.g. \\`temporal.${generatorDescriptor.id === 'timestampNow' ? 'updatedAt' : generatorDescriptor.id}()\\`) instead.`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n if (!generatorDescriptor.applicableCodecIds.includes(input.columnDescriptor.codecId)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${generatorDescriptor.id}\" is not applicable to \"${input.modelName}.${input.fieldName}\" with codecId \"${input.columnDescriptor.codecId}\".`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n return { executionDefaults: { onCreate: lowered.value.generated } };\n}\n\nexport function resolveColumnDescriptor(\n field: PslField,\n enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n): ColumnDescriptor | undefined {\n if (field.typeRef && namedTypeDescriptors.has(field.typeRef)) {\n return namedTypeDescriptors.get(field.typeRef);\n }\n if (namedTypeDescriptors.has(field.typeName)) {\n return namedTypeDescriptors.get(field.typeName);\n }\n if (enumTypeDescriptors.has(field.typeName)) {\n return enumTypeDescriptors.get(field.typeName);\n }\n return scalarTypeDescriptors.get(field.typeName);\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultPhases } from '@prisma-next/contract/types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type { PslAttribute, PslField, PslModel } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n getAttribute,\n lowerFirst,\n parseConstraintMapArgument,\n parseMapName,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor, FieldPresetContributions } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n lowerDefaultForField,\n reportUncomposedNamespace,\n resolveFieldTypeDescriptor,\n} from './psl-column-resolution';\n\nexport type ResolvedField = {\n readonly field: PslField;\n readonly columnName: string;\n readonly descriptor: ColumnDescriptor;\n readonly defaultValue?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n readonly isId: boolean;\n readonly isUnique: boolean;\n readonly idName?: string;\n readonly uniqueName?: string;\n readonly many?: true;\n readonly valueObjectTypeName?: string;\n readonly scalarCodecId?: string;\n};\n\nexport type ModelNameMapping = {\n readonly model: PslModel;\n readonly tableName: string;\n readonly fieldColumns: Map<string, string>;\n};\n\nexport interface CollectResolvedFieldsInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly familyId: string;\n readonly targetId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n}\n\nconst BUILTIN_FIELD_ATTRIBUTE_NAMES: ReadonlySet<string> = new Set([\n 'id',\n 'unique',\n 'default',\n 'relation',\n 'map',\n]);\n\n/**\n * Per-attribute migration rule for attributes that have been removed\n * from PSL in favor of the field-preset surface. The `hint` text is\n * appended to the `PSL_UNSUPPORTED_FIELD_ATTRIBUTE` message so users\n * porting Prisma 6 schemas see \"use this preset instead\" inline; the\n * `suppressWhen` predicate skips the hint when the user has already\n * migrated (so they don't get told to do what they just did).\n *\n * Pairing the suppression predicate with the hint makes each entry\n * self-contained: a future entry for, say, `@id` ↔ `id.uuidv7()` cannot\n * silently inherit the wrong predicate when added.\n */\ninterface RemovedAttributeRule {\n readonly hint: string;\n readonly suppressWhen: (field: PslField) => boolean;\n}\n\nconst REMOVED_ATTRIBUTE_RULES: ReadonlyMap<string, RemovedAttributeRule> = new Map([\n [\n 'updatedAt',\n {\n hint: 'Use `temporal.updatedAt()` as a field-preset call instead.',\n suppressWhen: (field) => field.typeConstructor?.path[0] === 'temporal',\n },\n ],\n]);\n\n// `validateFieldAttributes` short-circuits on `BUILTIN_FIELD_ATTRIBUTE_NAMES`\n// before consulting `REMOVED_ATTRIBUTE_RULES`. A name appearing in both sets\n// would silently suppress its migration hint, defeating the purpose of the\n// hint table. Fail at module load with a clear message — the table is\n// designed to grow and this is the cheap insurance against future drift.\n{\n const overlap = [...REMOVED_ATTRIBUTE_RULES.keys()].filter((name) =>\n BUILTIN_FIELD_ATTRIBUTE_NAMES.has(name),\n );\n if (overlap.length > 0) {\n throw new Error(\n `BUILTIN_FIELD_ATTRIBUTE_NAMES and REMOVED_ATTRIBUTE_RULES must not overlap. Names in both: ${overlap.join(', ')}`,\n );\n }\n}\n\nfunction validateFieldAttributes(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly composedExtensions: ReadonlySet<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly familyId: string;\n readonly targetId: string;\n}): void {\n for (const attribute of input.field.attributes) {\n if (BUILTIN_FIELD_ATTRIBUTE_NAMES.has(attribute.name)) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n continue;\n }\n\n const baseMessage = `Field \"${input.model.name}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`;\n const removedRule = REMOVED_ATTRIBUTE_RULES.get(attribute.name);\n const message =\n removedRule && !removedRule.suppressWhen(input.field)\n ? `${baseMessage}. ${removedRule.hint}`\n : baseMessage;\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n }\n}\n\nfunction extractFieldConstraintNames(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly idAttribute: PslAttribute | undefined;\n readonly uniqueAttribute: PslAttribute | undefined;\n readonly idName: string | undefined;\n readonly uniqueName: string | undefined;\n} {\n const idAttribute = getAttribute(input.field.attributes, 'id');\n const uniqueAttribute = getAttribute(input.field.attributes, 'unique');\n const idName = parseConstraintMapArgument({\n attribute: idAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @id`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n const uniqueName = parseConstraintMapArgument({\n attribute: uniqueAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @unique`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n return { idAttribute, uniqueAttribute, idName, uniqueName };\n}\n\nexport function collectResolvedFields(input: CollectResolvedFieldsInput): ResolvedField[] {\n const {\n model,\n mapping,\n enumTypeDescriptors,\n namedTypeDescriptors,\n modelNames,\n compositeTypeNames,\n composedExtensions,\n authoringContributions,\n familyId,\n targetId,\n defaultFunctionRegistry,\n generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors,\n } = input;\n const resolvedFields: ResolvedField[] = [];\n\n for (const field of model.fields) {\n const isModelField = modelNames.has(field.typeName);\n\n if (field.list && isModelField) {\n continue;\n }\n\n validateFieldAttributes({\n model,\n field,\n composedExtensions,\n authoringContributions,\n diagnostics,\n sourceId,\n familyId,\n targetId,\n });\n\n const relationAttribute = getAttribute(field.attributes, 'relation');\n if (isModelField && relationAttribute) {\n continue;\n }\n\n const isValueObjectField = compositeTypeNames.has(field.typeName);\n const isListField = field.list;\n\n let descriptor: ColumnDescriptor | undefined;\n let scalarCodecId: string | undefined;\n let presetContributions: FieldPresetContributions | undefined;\n const resolveInput = {\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n };\n\n if (isValueObjectField) {\n descriptor = scalarTypeDescriptors.get('Json');\n } else if (isListField) {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n // Field presets are complete declarations — they carry their own codec\n // and do not compose with `[]` list-of semantics. Reject early.\n if (resolved.presetContributions) {\n diagnostics.push({\n code: 'PSL_PRESET_NOT_LIST',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call as a list element type. Presets cannot be list elements; remove \"[]\" or use a scalar type.`,\n sourceId,\n span: field.span,\n });\n continue;\n }\n scalarCodecId = resolved.descriptor.codecId;\n descriptor = scalarTypeDescriptors.get('Json');\n } else {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n descriptor = resolved.descriptor;\n presetContributions = resolved.presetContributions;\n }\n\n if (!descriptor) {\n continue;\n }\n\n // Field presets are complete declarations: the preset names its own codec\n // and contributes any combination of default / executionDefaults / id /\n // unique. Optional and `@default(...)` modifiers contradict that, so they\n // are hard errors per spec FR7.\n if (presetContributions && field.optional) {\n diagnostics.push({\n code: 'PSL_PRESET_NOT_OPTIONAL',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot be optional. Remove \"?\" or use a different field type.`,\n sourceId,\n span: field.span,\n });\n continue;\n }\n\n const defaultAttribute = getAttribute(field.attributes, 'default');\n if (presetContributions && defaultAttribute) {\n diagnostics.push({\n code: 'PSL_PRESET_AND_DEFAULT_CONFLICT',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot also declare @default(...). The preset already specifies the default value.`,\n sourceId,\n span: defaultAttribute.span,\n });\n continue;\n }\n const loweredDefault = defaultAttribute\n ? lowerDefaultForField({\n modelName: model.name,\n fieldName: field.name,\n defaultAttribute,\n columnDescriptor: descriptor,\n generatorDescriptorById,\n sourceId,\n defaultFunctionRegistry,\n diagnostics,\n })\n : {};\n const loweredOnCreate = loweredDefault.executionDefaults?.onCreate;\n if (field.optional && loweredOnCreate) {\n const generatorDescription =\n loweredOnCreate.kind === 'generator' ? `\"${loweredOnCreate.id}\"` : 'for this field';\n diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" cannot be optional when using execution default ${generatorDescription}. Remove \"?\" or use a storage default.`,\n sourceId,\n span: defaultAttribute?.span ?? field.span,\n });\n continue;\n }\n if (loweredOnCreate) {\n const generatorDescriptor = generatorDescriptorById.get(loweredOnCreate.id);\n const generatedDescriptor = generatorDescriptor?.resolveGeneratedColumnDescriptor?.({\n generated: loweredOnCreate,\n });\n if (generatedDescriptor) {\n descriptor = generatedDescriptor;\n }\n }\n const mappedColumnName = mapping.fieldColumns.get(field.name) ?? field.name;\n const { idAttribute, uniqueAttribute, idName, uniqueName } = extractFieldConstraintNames({\n model,\n field,\n sourceId,\n diagnostics,\n });\n let isIdField = Boolean(idAttribute);\n if (idAttribute && field.optional) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" @id cannot be optional; primary key columns must be NOT NULL`,\n sourceId,\n span: idAttribute.span,\n });\n isIdField = false;\n }\n\n // Field presets contribute their own default / executionDefaults / id /\n // unique. They take precedence over attribute-derived contributions for\n // this field, since a preset *is* the field declaration. Conflicts with\n // `@default` and optional are already rejected above; explicit `@id`\n // would be redundant noise on the resolved field, so we surface it as\n // a hard error here for symmetry.\n if (presetContributions && idAttribute && !presetContributions.id) {\n diagnostics.push({\n code: 'PSL_PRESET_AND_ID_CONFLICT',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot also declare @id. Use a preset that contributes id semantics, or drop @id.`,\n sourceId,\n span: idAttribute.span,\n });\n continue;\n }\n\n // Field-preset contributions take precedence over attribute-derived\n // sources when present.\n const fieldExecutionDefaults =\n presetContributions?.executionDefaults ?? loweredDefault.executionDefaults;\n const fieldDefaultValue = presetContributions?.default ?? loweredDefault.defaultValue;\n resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...ifDefined('defaultValue', fieldDefaultValue),\n ...ifDefined('executionDefaults', fieldExecutionDefaults),\n isId: isIdField || Boolean(presetContributions?.id),\n isUnique: Boolean(uniqueAttribute) || Boolean(presetContributions?.unique),\n ...ifDefined('idName', idName),\n ...ifDefined('uniqueName', uniqueName),\n ...ifDefined('many', isListField ? (true as const) : undefined),\n ...ifDefined('valueObjectTypeName', isValueObjectField ? field.typeName : undefined),\n ...ifDefined('scalarCodecId', scalarCodecId),\n });\n }\n\n return resolvedFields;\n}\n\nexport function buildModelMappings(\n models: readonly PslModel[],\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n): Map<string, ModelNameMapping> {\n const result = new Map<string, ModelNameMapping>();\n for (const model of models) {\n const mapAttribute = getAttribute(model.attributes, 'map');\n const tableName = parseMapName({\n attribute: mapAttribute,\n defaultValue: lowerFirst(model.name),\n sourceId,\n diagnostics,\n entityLabel: `Model \"${model.name}\"`,\n span: model.span,\n });\n const fieldColumns = new Map<string, string>();\n for (const field of model.fields) {\n const fieldMapAttribute = getAttribute(field.attributes, 'map');\n const columnName = parseMapName({\n attribute: fieldMapAttribute,\n defaultValue: field.name,\n sourceId,\n diagnostics,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n span: field.span,\n });\n fieldColumns.set(field.name, columnName);\n }\n result.set(model.name, {\n model,\n tableName,\n fieldColumns,\n });\n }\n return result;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type { PslAttribute, PslField, PslSpan } from '@prisma-next/psl-parser';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport type { RelationNode } from '@prisma-next/sql-contract-ts/contract-builder';\nimport { assertDefined, invariant } from '@prisma-next/utils/assertions';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n getNamedArgument,\n getPositionalArgumentEntry,\n parseFieldList,\n parseQuotedStringLiteral,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { checkUncomposedNamespace, reportUncomposedNamespace } from './psl-column-resolution';\n\nexport const REFERENTIAL_ACTION_MAP = {\n NoAction: 'noAction',\n Restrict: 'restrict',\n Cascade: 'cascade',\n SetNull: 'setNull',\n SetDefault: 'setDefault',\n noAction: 'noAction',\n restrict: 'restrict',\n cascade: 'cascade',\n setNull: 'setNull',\n setDefault: 'setDefault',\n} as const;\n\nexport type ParsedRelationAttribute = {\n readonly relationName?: string;\n readonly fields?: readonly string[];\n readonly references?: readonly string[];\n readonly constraintName?: string;\n readonly onDelete?: string;\n readonly onUpdate?: string;\n};\n\nexport type FkRelationMetadata = {\n readonly declaringModelName: string;\n readonly declaringFieldName: string;\n readonly declaringTableName: string;\n readonly targetModelName: string;\n readonly targetTableName: string;\n readonly relationName?: string;\n readonly localColumns: readonly string[];\n readonly referencedColumns: readonly string[];\n};\n\nexport type ModelBackrelationCandidate = {\n readonly modelName: string;\n readonly tableName: string;\n readonly field: PslField;\n readonly targetModelName: string;\n readonly relationName?: string;\n};\n\ntype ModelRelationMetadata = RelationNode;\n\nexport function fkRelationPairKey(declaringModelName: string, targetModelName: string): string {\n // NOTE: We assume PSL model identifiers do not contain the `::` separator.\n return `${declaringModelName}::${targetModelName}`;\n}\n\nexport function normalizeReferentialAction(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly actionName: 'onDelete' | 'onUpdate';\n readonly actionToken: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ReferentialAction | undefined {\n const normalized =\n REFERENTIAL_ACTION_MAP[input.actionToken as keyof typeof REFERENTIAL_ACTION_MAP];\n if (normalized) {\n return normalized;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_REFERENTIAL_ACTION',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported ${input.actionName} action \"${input.actionToken}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseRelationAttribute(input: {\n readonly attribute: PslAttribute;\n readonly modelName: string;\n readonly fieldName: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ParsedRelationAttribute | undefined {\n const positionalEntries = input.attribute.args.filter((arg) => arg.kind === 'positional');\n if (positionalEntries.length > 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has too many positional arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let relationNameFromPositional: string | undefined;\n const positionalNameEntry = getPositionalArgumentEntry(input.attribute);\n if (positionalNameEntry) {\n const parsedName = parseQuotedStringLiteral(positionalNameEntry.value);\n if (!parsedName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" positional relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: positionalNameEntry.span,\n });\n return undefined;\n }\n relationNameFromPositional = parsedName;\n }\n\n for (const arg of input.attribute.args) {\n if (arg.kind === 'positional') {\n continue;\n }\n if (\n arg.name !== 'name' &&\n arg.name !== 'fields' &&\n arg.name !== 'references' &&\n arg.name !== 'map' &&\n arg.name !== 'onDelete' &&\n arg.name !== 'onUpdate'\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported argument \"${arg.name}\"`,\n sourceId: input.sourceId,\n span: arg.span,\n });\n return undefined;\n }\n }\n\n const namedRelationNameRaw = getNamedArgument(input.attribute, 'name');\n const namedRelationName = namedRelationNameRaw\n ? parseQuotedStringLiteral(namedRelationNameRaw)\n : undefined;\n if (namedRelationNameRaw && !namedRelationName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" named relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (\n relationNameFromPositional &&\n namedRelationName &&\n relationNameFromPositional !== namedRelationName\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has conflicting positional and named relation names`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const relationName = namedRelationName ?? relationNameFromPositional;\n\n const constraintNameRaw = getNamedArgument(input.attribute, 'map');\n const constraintName = constraintNameRaw\n ? parseQuotedStringLiteral(constraintNameRaw)\n : undefined;\n if (constraintNameRaw && !constraintName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n const fieldsRaw = getNamedArgument(input.attribute, 'fields');\n const referencesRaw = getNamedArgument(input.attribute, 'references');\n if ((fieldsRaw && !referencesRaw) || (!fieldsRaw && referencesRaw)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires fields and references arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let fields: readonly string[] | undefined;\n let references: readonly string[] | undefined;\n if (fieldsRaw && referencesRaw) {\n const parsedFields = parseFieldList(fieldsRaw);\n const parsedReferences = parseFieldList(referencesRaw);\n if (\n !parsedFields ||\n !parsedReferences ||\n parsedFields.length === 0 ||\n parsedReferences.length === 0\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires bracketed fields and references lists`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n fields = parsedFields;\n references = parsedReferences;\n }\n\n const onDeleteArgument = getNamedArgument(input.attribute, 'onDelete');\n const onUpdateArgument = getNamedArgument(input.attribute, 'onUpdate');\n\n return {\n ...ifDefined('relationName', relationName),\n ...ifDefined('fields', fields),\n ...ifDefined('references', references),\n ...ifDefined('constraintName', constraintName),\n ...ifDefined('onDelete', onDeleteArgument ? unquoteStringLiteral(onDeleteArgument) : undefined),\n ...ifDefined('onUpdate', onUpdateArgument ? unquoteStringLiteral(onUpdateArgument) : undefined),\n };\n}\n\nexport function indexFkRelations(input: {\n readonly fkRelationMetadata: readonly FkRelationMetadata[];\n}): {\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly fkRelationsByPair: Map<string, FkRelationMetadata[]>;\n} {\n const modelRelations = new Map<string, ModelRelationMetadata[]>();\n const fkRelationsByPair = new Map<string, FkRelationMetadata[]>();\n\n for (const relation of input.fkRelationMetadata) {\n const existing = modelRelations.get(relation.declaringModelName);\n const current = existing ?? [];\n if (!existing) {\n modelRelations.set(relation.declaringModelName, current);\n }\n current.push({\n fieldName: relation.declaringFieldName,\n toModel: relation.targetModelName,\n toTable: relation.targetTableName,\n cardinality: 'N:1',\n on: {\n parentTable: relation.declaringTableName,\n parentColumns: relation.localColumns,\n childTable: relation.targetTableName,\n childColumns: relation.referencedColumns,\n },\n });\n\n const pairKey = fkRelationPairKey(relation.declaringModelName, relation.targetModelName);\n const pairRelations = fkRelationsByPair.get(pairKey);\n if (!pairRelations) {\n fkRelationsByPair.set(pairKey, [relation]);\n continue;\n }\n pairRelations.push(relation);\n }\n\n return { modelRelations, fkRelationsByPair };\n}\n\nexport function applyBackrelationCandidates(input: {\n readonly backrelationCandidates: readonly ModelBackrelationCandidate[];\n readonly fkRelationsByPair: Map<string, readonly FkRelationMetadata[]>;\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}): void {\n for (const candidate of input.backrelationCandidates) {\n const pairKey = fkRelationPairKey(candidate.targetModelName, candidate.modelName);\n const pairMatches = input.fkRelationsByPair.get(pairKey) ?? [];\n const matches = candidate.relationName\n ? pairMatches.filter((relation) => relation.relationName === candidate.relationName)\n : [...pairMatches];\n\n if (matches.length === 0) {\n input.diagnostics.push({\n code: 'PSL_ORPHANED_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" has no matching FK-side relation on model \"${candidate.targetModelName}\". Add @relation(fields: [...], references: [...]) on the FK-side relation or use an explicit join model for many-to-many.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n if (matches.length > 1) {\n input.diagnostics.push({\n code: 'PSL_AMBIGUOUS_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" matches multiple FK-side relations on model \"${candidate.targetModelName}\". Add @relation(name: \"...\") (or @relation(\"...\")) to both sides to disambiguate.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n\n invariant(matches.length === 1, 'Backrelation matching requires exactly one match');\n const matched = matches[0];\n assertDefined(matched, 'Backrelation matching requires a defined relation match');\n\n const existing = input.modelRelations.get(candidate.modelName);\n const current = existing ?? [];\n if (!existing) {\n input.modelRelations.set(candidate.modelName, current);\n }\n current.push({\n fieldName: candidate.field.name,\n toModel: matched.declaringModelName,\n toTable: matched.declaringTableName,\n cardinality: '1:N',\n on: {\n parentTable: candidate.tableName,\n parentColumns: matched.referencedColumns,\n childTable: matched.declaringTableName,\n childColumns: matched.localColumns,\n },\n });\n }\n}\n\nexport function validateNavigationListFieldAttributes(input: {\n readonly modelName: string;\n readonly field: PslField;\n readonly sourceId: string;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly familyId: string;\n readonly targetId: string;\n}): boolean {\n let valid = true;\n for (const attribute of input.field.attributes) {\n if (attribute.name === 'relation') {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n valid = false;\n continue;\n }\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${input.modelName}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n valid = false;\n }\n return valid;\n}\n","import type {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport type {\n Contract,\n ContractField,\n ContractModel,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringTypeConstructor } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport type {\n ControlMutationDefaultRegistry,\n ControlMutationDefaults,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslCompositeType,\n PslEnum,\n PslField,\n PslModel,\n PslNamedTypeDeclaration,\n} from '@prisma-next/psl-parser';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n buildSqlContractFromDefinition,\n type ForeignKeyNode,\n type IndexNode,\n type ModelNode,\n type PrimaryKeyNode,\n type UniqueConstraintNode,\n} from '@prisma-next/sql-contract-ts/contract-builder';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport {\n findDuplicateFieldName,\n getAttribute,\n getPositionalArgument,\n mapFieldNamesToColumns,\n parseAttributeFieldList,\n parseConstraintMapArgument,\n parseMapName,\n parseQuotedStringLiteral,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n getAuthoringTypeConstructor,\n instantiatePslTypeConstructor,\n reportUncomposedNamespace,\n resolveDbNativeTypeAttribute,\n resolveFieldTypeDescriptor,\n resolvePslTypeConstructorDescriptor,\n toNamedTypeFieldDescriptor,\n} from './psl-column-resolution';\nimport {\n buildModelMappings,\n collectResolvedFields,\n type ModelNameMapping,\n type ResolvedField,\n} from './psl-field-resolution';\nimport {\n applyBackrelationCandidates,\n type FkRelationMetadata,\n indexFkRelations,\n type ModelBackrelationCandidate,\n normalizeReferentialAction,\n parseRelationAttribute,\n validateNavigationListFieldAttributes,\n} from './psl-relation-resolution';\n\nexport interface InterpretPslDocumentToSqlContractInput {\n readonly document: ParsePslDocumentResult;\n readonly target: TargetPackRef<'sql', string>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', string>[];\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly authoringContributions?: AuthoringContributions;\n}\n\nfunction buildComposedExtensionPackRefs(\n target: TargetPackRef<'sql', string>,\n extensionIds: readonly string[],\n extensionPackRefs: readonly ExtensionPackRef<'sql', string>[] = [],\n): Record<string, ExtensionPackRef<'sql', string>> | undefined {\n if (extensionIds.length === 0) {\n return undefined;\n }\n\n const extensionPackRefById = new Map(extensionPackRefs.map((packRef) => [packRef.id, packRef]));\n\n return Object.fromEntries(\n extensionIds.map((extensionId) => [\n extensionId,\n extensionPackRefById.get(extensionId) ??\n ({\n kind: 'extension',\n id: extensionId,\n familyId: target.familyId,\n targetId: target.targetId,\n version: '0.0.1',\n } satisfies ExtensionPackRef<'sql', string>),\n ]),\n );\n}\n\nfunction diagnosticDedupKey(diagnostic: ContractSourceDiagnostic): string {\n const span = diagnostic.span;\n const spanKey = span\n ? `${span.start.offset}:${span.end.offset}:${span.start.line}:${span.end.line}`\n : '';\n return `${diagnostic.code}\\u0000${diagnostic.sourceId}\\u0000${spanKey}\\u0000${diagnostic.message}`;\n}\n\nfunction dedupeDiagnostics(\n diagnostics: readonly ContractSourceDiagnostic[],\n): ContractSourceDiagnostic[] {\n const seen = new Map<string, ContractSourceDiagnostic>();\n for (const diagnostic of diagnostics) {\n const key = diagnosticDedupKey(diagnostic);\n if (!seen.has(key)) {\n seen.set(key, diagnostic);\n }\n }\n return [...seen.values()];\n}\n\nfunction compareStrings(left: string, right: string): -1 | 0 | 1 {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction mapParserDiagnostics(document: ParsePslDocumentResult): ContractSourceDiagnostic[] {\n return document.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId: diagnostic.sourceId,\n span: diagnostic.span,\n }));\n}\n\ninterface ProcessEnumDeclarationsInput {\n readonly enums: readonly PslEnum[];\n readonly sourceId: string;\n readonly enumTypeConstructor: AuthoringTypeConstructorDescriptor | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction processEnumDeclarations(input: ProcessEnumDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const enumDeclaration of input.enums) {\n const nativeType = parseMapName({\n attribute: getAttribute(enumDeclaration.attributes, 'map'),\n defaultValue: enumDeclaration.name,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Enum \"${enumDeclaration.name}\"`,\n span: enumDeclaration.span,\n });\n const enumStorageType = input.enumTypeConstructor\n ? instantiateAuthoringTypeConstructor(input.enumTypeConstructor, [\n nativeType,\n enumDeclaration.values.map((value) => value.name),\n ])\n : {\n codecId: 'pg/enum@1',\n nativeType,\n typeParams: { values: enumDeclaration.values.map((value) => value.name) },\n };\n const descriptor: ColumnDescriptor = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n storageTypes[enumDeclaration.name] = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeParams: enumStorageType.typeParams ?? {\n values: enumDeclaration.values.map((value) => value.name),\n },\n };\n }\n\n return { storageTypes, enumTypeDescriptors };\n}\n\ninterface ResolveNamedTypeDeclarationsInput {\n readonly declarations: readonly PslNamedTypeDeclaration[];\n readonly sourceId: string;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction validateNamedTypeAttributes(input: {\n readonly declaration: PslNamedTypeDeclaration;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly composedExtensions: ReadonlySet<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly allowDbNativeType: boolean;\n readonly familyId: string;\n readonly targetId: string;\n}): {\n readonly dbNativeTypeAttribute: PslAttribute | undefined;\n readonly hasUnsupportedNamedTypeAttribute: boolean;\n} {\n const dbNativeTypeAttributes = input.allowDbNativeType\n ? input.declaration.attributes.filter((attribute) => attribute.name.startsWith('db.'))\n : [];\n const [dbNativeTypeAttribute, ...extraDbNativeTypeAttributes] = dbNativeTypeAttributes;\n let hasUnsupportedNamedTypeAttribute = false;\n\n for (const extra of extraDbNativeTypeAttributes) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Named type \"${input.declaration.name}\" can declare at most one @db.* attribute`,\n sourceId: input.sourceId,\n span: extra.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n for (const attribute of input.declaration.attributes) {\n if (input.allowDbNativeType && attribute.name.startsWith('db.')) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n hasUnsupportedNamedTypeAttribute = true;\n continue;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${input.declaration.name}\" uses unsupported attribute \"${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n return { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute };\n}\n\nfunction resolveNamedTypeDeclarations(input: ResolveNamedTypeDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const namedTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const declaration of input.declarations) {\n if (declaration.typeConstructor) {\n const { hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes({\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n allowDbNativeType: false,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n const helperPath = declaration.typeConstructor.path.join('.');\n const typeConstructor = resolvePslTypeConstructorDescriptor({\n call: declaration.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR',\n unsupportedMessage: `Named type \"${declaration.name}\" references unsupported constructor \"${helperPath}\"`,\n });\n if (!typeConstructor) {\n continue;\n }\n\n const storageType = instantiatePslTypeConstructor({\n call: declaration.typeConstructor,\n descriptor: typeConstructor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!storageType) {\n continue;\n }\n\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, storageType),\n );\n storageTypes[declaration.name] = {\n codecId: storageType.codecId,\n nativeType: storageType.nativeType,\n typeParams: storageType.typeParams ?? {},\n };\n continue;\n }\n\n // Parser invariant: when typeConstructor is absent, baseType is defined.\n // The check below narrows `baseType` for TypeScript and guards against a\n // parser regression; it is unreachable under a correct parser.\n if (declaration.baseType === undefined) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" must declare a base type or constructor`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n const { baseType } = declaration;\n const baseDescriptor =\n input.enumTypeDescriptors.get(baseType) ?? input.scalarTypeDescriptors.get(baseType);\n if (!baseDescriptor) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" references unsupported base type \"${baseType}\"`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n\n const { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes(\n {\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n allowDbNativeType: true,\n familyId: input.familyId,\n targetId: input.targetId,\n },\n );\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n if (dbNativeTypeAttribute) {\n const descriptor = resolveDbNativeTypeAttribute({\n attribute: dbNativeTypeAttribute,\n baseType,\n baseDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!descriptor) {\n continue;\n }\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, descriptor),\n );\n storageTypes[declaration.name] = {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeParams: descriptor.typeParams ?? {},\n };\n continue;\n }\n\n const descriptor = toNamedTypeFieldDescriptor(declaration.name, baseDescriptor);\n namedTypeDescriptors.set(declaration.name, descriptor);\n storageTypes[declaration.name] = {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeParams: {},\n };\n }\n\n return { storageTypes, namedTypeDescriptors };\n}\n\ninterface BuildModelNodeInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly modelMappings: ReadonlyMap<string, ModelNameMapping>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly composedExtensions: Set<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\ninterface BuildModelNodeResult {\n readonly modelNode: ModelNode;\n readonly fkRelationMetadata: FkRelationMetadata[];\n readonly backrelationCandidates: ModelBackrelationCandidate[];\n readonly resolvedFields: readonly ResolvedField[];\n}\n\nfunction buildModelNodeFromPsl(input: BuildModelNodeInput): BuildModelNodeResult {\n const { model, mapping, sourceId, diagnostics } = input;\n const tableName = mapping.tableName;\n\n const resolvedFields = collectResolvedFields({\n model,\n mapping,\n enumTypeDescriptors: input.enumTypeDescriptors,\n namedTypeDescriptors: input.namedTypeDescriptors,\n modelNames: input.modelNames,\n compositeTypeNames: input.compositeTypeNames,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n familyId: input.familyId,\n targetId: input.targetId,\n defaultFunctionRegistry: input.defaultFunctionRegistry,\n generatorDescriptorById: input.generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n });\n\n const inlineIdFields = resolvedFields.filter((field) => field.isId);\n if (inlineIdFields.length > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" cannot declare inline @id on multiple fields; use model-level @@id([...]) for composite identity`,\n sourceId,\n span: model.span,\n });\n }\n const singleInlineIdField = inlineIdFields.length === 1 ? inlineIdFields[0] : undefined;\n let primaryKey: PrimaryKeyNode | undefined = singleInlineIdField\n ? {\n columns: [singleInlineIdField.columnName],\n ...ifDefined('name', singleInlineIdField.idName),\n }\n : undefined;\n const hasInlinePrimaryKey = primaryKey !== undefined;\n let blockPrimaryKeyDeclared = false;\n\n const resultBackrelationCandidates: ModelBackrelationCandidate[] = [];\n for (const field of model.fields) {\n if (!field.list || !input.modelNames.has(field.typeName)) {\n continue;\n }\n const attributesValid = validateNavigationListFieldAttributes({\n modelName: model.name,\n field,\n sourceId,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n diagnostics,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n const relationAttribute = getAttribute(field.attributes, 'relation');\n let relationName: string | undefined;\n if (relationAttribute) {\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute,\n modelName: model.name,\n fieldName: field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (parsedRelation.fields || parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare fields/references; define them on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n if (parsedRelation.onDelete || parsedRelation.onUpdate) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare onDelete/onUpdate; define referential actions on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n relationName = parsedRelation.relationName;\n }\n if (!attributesValid) {\n continue;\n }\n\n resultBackrelationCandidates.push({\n modelName: model.name,\n tableName,\n field,\n targetModelName: field.typeName,\n ...ifDefined('relationName', relationName),\n });\n }\n\n const relationAttributes = model.fields\n .map((field) => ({\n field,\n relation: getAttribute(field.attributes, 'relation'),\n }))\n .filter((entry): entry is { field: PslField; relation: PslAttribute } =>\n Boolean(entry.relation),\n );\n const uniqueConstraints: UniqueConstraintNode[] = resolvedFields\n .filter((field) => field.isUnique)\n .map((field) => ({\n columns: [field.columnName],\n ...ifDefined('name', field.uniqueName),\n }));\n const indexNodes: IndexNode[] = [];\n const foreignKeyNodes: ForeignKeyNode[] = [];\n\n for (const modelAttribute of model.attributes) {\n if (modelAttribute.name === 'map') {\n continue;\n }\n if (modelAttribute.name === 'discriminator' || modelAttribute.name === 'base') {\n continue;\n }\n const attributeLabel = `Model \"${model.name}\" @@${modelAttribute.name}`;\n if (modelAttribute.name === 'id') {\n if (blockPrimaryKeyDeclared) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" declares @@id more than once`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n if (hasInlinePrimaryKey) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" cannot declare both field-level @id and model-level @@id`,\n sourceId,\n span: modelAttribute.span,\n });\n blockPrimaryKeyDeclared = true;\n continue;\n }\n const fieldNames = parseAttributeFieldList({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n entityLabel: attributeLabel,\n });\n if (!fieldNames) {\n continue;\n }\n const duplicateFieldName = findDuplicateFieldName(fieldNames);\n if (duplicateFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} list contains duplicate field \"${duplicateFieldName}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const nullableFieldName = fieldNames.find(\n (name) => model.fields.find((f) => f.name === name)?.optional === true,\n );\n if (nullableFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} cannot include optional field \"${nullableFieldName}\"; primary key columns must be NOT NULL`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n entityLabel: attributeLabel,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: attributeLabel,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n primaryKey = {\n columns: columnNames,\n ...ifDefined('name', constraintName),\n };\n blockPrimaryKeyDeclared = true;\n continue;\n }\n if (modelAttribute.name === 'unique' || modelAttribute.name === 'index') {\n const fieldNames = parseAttributeFieldList({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n entityLabel: attributeLabel,\n });\n if (!fieldNames) {\n continue;\n }\n const duplicateFieldName = findDuplicateFieldName(fieldNames);\n if (duplicateFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} list contains duplicate field \"${duplicateFieldName}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n entityLabel: attributeLabel,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: attributeLabel,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n if (modelAttribute.name === 'unique') {\n uniqueConstraints.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n } else {\n indexNodes.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n }\n continue;\n }\n const uncomposedNamespace = checkUncomposedNamespace(\n modelAttribute.name,\n input.composedExtensions,\n {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n },\n );\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@@${modelAttribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId,\n span: modelAttribute.span,\n diagnostics,\n });\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_MODEL_ATTRIBUTE',\n message: `Model \"${model.name}\" uses unsupported attribute \"@@${modelAttribute.name}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n }\n\n const resultFkRelationMetadata: FkRelationMetadata[] = [];\n for (const relationAttribute of relationAttributes) {\n if (relationAttribute.field.list) {\n continue;\n }\n\n if (!input.modelNames.has(relationAttribute.field.typeName)) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute.relation,\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (!parsedRelation.fields || !parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" requires fields and references arguments`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const targetMapping = input.modelMappings.get(relationAttribute.field.typeName);\n if (!targetMapping) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const localColumns = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames: parsedRelation.fields,\n mapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n entityLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!localColumns) {\n continue;\n }\n const referencedColumns = mapFieldNamesToColumns({\n modelName: targetMapping.model.name,\n fieldNames: parsedRelation.references,\n mapping: targetMapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n entityLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!referencedColumns) {\n continue;\n }\n if (localColumns.length !== referencedColumns.length) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" must provide the same number of fields and references`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const onDelete = parsedRelation.onDelete\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onDelete',\n actionToken: parsedRelation.onDelete,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n const onUpdate = parsedRelation.onUpdate\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onUpdate',\n actionToken: parsedRelation.onUpdate,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n\n foreignKeyNodes.push({\n columns: localColumns,\n references: {\n model: targetMapping.model.name,\n table: targetMapping.tableName,\n columns: referencedColumns,\n },\n ...ifDefined('name', parsedRelation.constraintName),\n ...ifDefined('onDelete', onDelete),\n ...ifDefined('onUpdate', onUpdate),\n });\n\n resultFkRelationMetadata.push({\n declaringModelName: model.name,\n declaringFieldName: relationAttribute.field.name,\n declaringTableName: tableName,\n targetModelName: targetMapping.model.name,\n targetTableName: targetMapping.tableName,\n ...ifDefined('relationName', parsedRelation.relationName),\n localColumns,\n referencedColumns,\n });\n }\n\n return {\n modelNode: {\n modelName: model.name,\n tableName,\n fields: resolvedFields.map((resolvedField) => ({\n fieldName: resolvedField.field.name,\n columnName: resolvedField.columnName,\n descriptor: resolvedField.descriptor,\n nullable: resolvedField.field.optional,\n ...ifDefined('default', resolvedField.defaultValue),\n ...ifDefined('executionDefaults', resolvedField.executionDefaults),\n })),\n ...ifDefined('id', primaryKey),\n ...(uniqueConstraints.length > 0 ? { uniques: uniqueConstraints } : {}),\n ...(indexNodes.length > 0 ? { indexes: indexNodes } : {}),\n ...(foreignKeyNodes.length > 0 ? { foreignKeys: foreignKeyNodes } : {}),\n },\n fkRelationMetadata: resultFkRelationMetadata,\n backrelationCandidates: resultBackrelationCandidates,\n resolvedFields,\n };\n}\n\ninterface BuildValueObjectsInput {\n readonly compositeTypes: readonly PslCompositeType[];\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}\n\nfunction buildValueObjects(input: BuildValueObjectsInput): Record<string, ContractValueObject> {\n const {\n compositeTypes,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n composedExtensions,\n familyId,\n targetId,\n authoringContributions,\n diagnostics,\n sourceId,\n } = input;\n const valueObjects: Record<string, ContractValueObject> = {};\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n\n for (const compositeType of compositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of compositeType.fields) {\n if (compositeTypeNames.has(field.typeName)) {\n const result: ContractField = {\n type: { kind: 'valueObject', name: field.typeName },\n nullable: field.optional,\n };\n fields[field.name] = field.list ? { ...result, many: true } : result;\n continue;\n }\n const resolved = resolveFieldTypeDescriptor({\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${compositeType.name}.${field.name}\"`,\n });\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${compositeType.name}.${field.name}\" type \"${field.typeName}\" is not supported`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n const scalarField: ContractField = {\n nullable: field.optional,\n type: { kind: 'scalar', codecId: resolved.descriptor.codecId },\n };\n fields[field.name] = field.list ? { ...scalarField, many: true } : scalarField;\n }\n valueObjects[compositeType.name] = { fields };\n }\n\n return valueObjects;\n}\n\nfunction patchModelDomainFields(\n models: Record<string, ContractModel>,\n modelResolvedFields: ReadonlyMap<string, readonly ResolvedField[]>,\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, resolvedFields] of modelResolvedFields) {\n const model = patched[modelName];\n if (!model) continue;\n\n let needsPatch = false;\n const patchedFields: Record<string, ContractField> = { ...model.fields };\n\n for (const rf of resolvedFields) {\n if (rf.valueObjectTypeName) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'valueObject', name: rf.valueObjectTypeName },\n ...(rf.many ? { many: true as const } : {}),\n };\n } else if (rf.many && rf.scalarCodecId) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'scalar', codecId: rf.scalarCodecId },\n many: true as const,\n };\n }\n }\n\n if (needsPatch) {\n patched = { ...patched, [modelName]: { ...model, fields: patchedFields } };\n }\n }\n\n return patched;\n}\n\ntype DiscriminatorDeclaration = {\n readonly fieldName: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\nfunction collectPolymorphismDeclarations(\n models: readonly PslModel[],\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): {\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n} {\n const discriminatorDeclarations = new Map<string, DiscriminatorDeclaration>();\n const baseDeclarations = new Map<string, BaseDeclaration>();\n\n for (const model of models) {\n for (const attr of model.attributes) {\n if (attr.name === 'discriminator') {\n const fieldName = getPositionalArgument(attr);\n if (!fieldName) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields.find((f) => f.name === fieldName);\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.name, { fieldName, span: attr.span });\n }\n\n if (attr.name === 'base') {\n const baseName = getPositionalArgument(attr, 0);\n const rawValue = getPositionalArgument(attr, 1);\n if (!baseName || !rawValue) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base requires two arguments: base model name and discriminator value`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const value = parseQuotedStringLiteral(rawValue);\n if (value === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n baseDeclarations.set(model.name, { baseName, value, span: attr.span });\n }\n }\n }\n\n return { discriminatorDeclarations, baseDeclarations };\n}\n\nfunction resolvePolymorphism(\n models: Record<string, ContractModel>,\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>,\n baseDeclarations: Map<string, BaseDeclaration>,\n modelNames: Set<string>,\n modelMappings: ReadonlyMap<string, ModelNameMapping>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, decl] of discriminatorDeclarations) {\n if (baseDeclarations.has(modelName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_AND_BASE',\n message: `Model \"${modelName}\" cannot have both @@discriminator and @@base`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const model = patched[modelName];\n if (!model) continue;\n\n if (!Object.hasOwn(model.fields, decl.fieldName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_FIELD_NOT_FOUND',\n message: `Discriminator field \"${decl.fieldName}\" is not a field on model \"${modelName}\"`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const variants: Record<string, { readonly value: string }> = {};\n const seenValues = new Map<string, string>();\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (baseDecl.baseName !== modelName) continue;\n\n const existingVariant = seenValues.get(baseDecl.value);\n if (existingVariant) {\n diagnostics.push({\n code: 'PSL_DUPLICATE_DISCRIMINATOR_VALUE',\n message: `Discriminator value \"${baseDecl.value}\" is used by both \"${existingVariant}\" and \"${variantName}\" on base model \"${modelName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n seenValues.set(baseDecl.value, variantName);\n variants[variantName] = { value: baseDecl.value };\n }\n\n if (Object.keys(variants).length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_DISCRIMINATOR',\n message: `Model \"${modelName}\" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n patched = {\n ...patched,\n [modelName]: { ...model, discriminator: { field: decl.fieldName }, variants },\n };\n }\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (!modelNames.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_BASE_TARGET_NOT_FOUND',\n message: `Model \"${variantName}\" @@base references non-existent model \"${baseDecl.baseName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (!discriminatorDeclarations.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BASE',\n message: `Model \"${variantName}\" declares @@base(${baseDecl.baseName}, ...) but \"${baseDecl.baseName}\" has no @@discriminator`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (discriminatorDeclarations.has(variantName)) {\n continue;\n }\n\n const variantModel = patched[variantName];\n if (!variantModel) continue;\n\n const baseMapping = modelMappings.get(baseDecl.baseName);\n const variantMapping = modelMappings.get(variantName);\n const hasExplicitMap =\n variantMapping?.model.attributes.some((attr) => attr.name === 'map') ?? false;\n const resolvedTable = hasExplicitMap ? variantMapping?.tableName : baseMapping?.tableName;\n\n patched = {\n ...patched,\n [variantName]: {\n ...variantModel,\n base: baseDecl.baseName,\n ...(resolvedTable ? { storage: { ...variantModel.storage, table: resolvedTable } } : {}),\n },\n };\n }\n\n return patched;\n}\n\nexport function interpretPslDocumentToSqlContract(\n input: InterpretPslDocumentToSqlContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const sourceId = input.document.ast.sourceId;\n if (!input.target) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_TARGET_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires an explicit target context from composition.',\n sourceId,\n },\n ],\n });\n }\n if (!input.scalarTypeDescriptors) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_SCALAR_TYPE_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires composed scalar type descriptors.',\n sourceId,\n },\n ],\n });\n }\n\n const diagnostics: ContractSourceDiagnostic[] = mapParserDiagnostics(input.document);\n const models = input.document.ast.models ?? [];\n const enums = input.document.ast.enums ?? [];\n const compositeTypes = input.document.ast.compositeTypes ?? [];\n const modelNames = new Set(models.map((model) => model.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n const composedExtensions = new Set(input.composedExtensionPacks ?? []);\n const defaultFunctionRegistry: ControlMutationDefaultRegistry =\n input.controlMutationDefaults?.defaultFunctionRegistry ?? new Map();\n const generatorDescriptors = input.controlMutationDefaults?.generatorDescriptors ?? [];\n const generatorDescriptorById = new Map<string, MutationDefaultGeneratorDescriptor>();\n for (const descriptor of generatorDescriptors) {\n generatorDescriptorById.set(descriptor.id, descriptor);\n }\n\n const enumResult = processEnumDeclarations({\n enums,\n sourceId,\n enumTypeConstructor: getAuthoringTypeConstructor(input.authoringContributions, ['enum']),\n diagnostics,\n });\n\n const namedTypeResult = resolveNamedTypeDeclarations({\n declarations: input.document.ast.types?.declarations ?? [],\n sourceId,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n });\n\n const storageTypes = { ...enumResult.storageTypes, ...namedTypeResult.storageTypes };\n\n const modelMappings = buildModelMappings(models, diagnostics, sourceId);\n const modelNodes: ModelNode[] = [];\n const fkRelationMetadata: FkRelationMetadata[] = [];\n const backrelationCandidates: ModelBackrelationCandidate[] = [];\n const modelResolvedFields = new Map<string, readonly ResolvedField[]>();\n\n for (const model of models) {\n const mapping = modelMappings.get(model.name);\n if (!mapping) {\n continue;\n }\n const result = buildModelNodeFromPsl({\n model,\n mapping,\n modelMappings,\n modelNames,\n compositeTypeNames,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n defaultFunctionRegistry,\n generatorDescriptorById,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n sourceId,\n diagnostics,\n });\n modelNodes.push(result.modelNode);\n fkRelationMetadata.push(...result.fkRelationMetadata);\n backrelationCandidates.push(...result.backrelationCandidates);\n modelResolvedFields.set(model.name, result.resolvedFields);\n }\n\n const { modelRelations, fkRelationsByPair } = indexFkRelations({ fkRelationMetadata });\n applyBackrelationCandidates({\n backrelationCandidates,\n fkRelationsByPair,\n modelRelations,\n diagnostics,\n sourceId,\n });\n\n const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(\n models,\n sourceId,\n diagnostics,\n );\n\n const valueObjects = buildValueObjects({\n compositeTypes,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n sourceId,\n });\n\n if (diagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: dedupeDiagnostics(diagnostics),\n });\n }\n\n const contract = buildSqlContractFromDefinition({\n target: input.target,\n ...ifDefined(\n 'extensionPacks',\n buildComposedExtensionPackRefs(\n input.target,\n [...composedExtensions].sort(compareStrings),\n input.composedExtensionPackRefs,\n ),\n ),\n ...(Object.keys(storageTypes).length > 0 ? { storageTypes } : {}),\n models: modelNodes.map((model) => ({\n ...model,\n ...(modelRelations.has(model.modelName)\n ? {\n relations: [...(modelRelations.get(model.modelName) ?? [])].sort((left, right) =>\n compareStrings(left.fieldName, right.fieldName),\n ),\n }\n : {}),\n })),\n });\n\n let patchedModels = patchModelDomainFields(\n contract.models as Record<string, ContractModel>,\n modelResolvedFields,\n );\n\n const polyDiagnostics: ContractSourceDiagnostic[] = [];\n patchedModels = resolvePolymorphism(\n patchedModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n modelMappings,\n sourceId,\n polyDiagnostics,\n );\n\n if (polyDiagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: polyDiagnostics,\n });\n }\n\n const variantModelNames = new Set(baseDeclarations.keys());\n const filteredRoots = Object.fromEntries(\n Object.entries(contract.roots).filter(([, modelName]) => !variantModelNames.has(modelName)),\n );\n\n const patchedContract: Contract = {\n ...contract,\n roots: filteredRoots,\n models: patchedModels,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n };\n\n return ok(patchedContract);\n}\n"],"mappings":"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"}
|
package/dist/provider.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"mappings":";;;;UAUiB,qBAAA;EAAA,SACN,MAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EAAA,SACR,yBAAA,YAAqC,gBAAA;AAAA;AAAA,iBAgBhC,cAAA,CAAe,UAAA,UAAoB,OAAA,EAAS,qBAAA,GAAwB,cAAA"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { t as interpretPslDocumentToSqlContract } from "./interpreter-
|
|
1
|
+
import { t as interpretPslDocumentToSqlContract } from "./interpreter-C9EP3HJr.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
3
|
import { notOk, ok } from "@prisma-next/utils/result";
|
|
4
4
|
import { parsePslDocument } from "@prisma-next/psl-parser";
|
|
5
5
|
import { readFile } from "node:fs/promises";
|
|
6
|
-
|
|
7
6
|
//#region src/provider.ts
|
|
8
7
|
function buildColumnDescriptorMap(scalarTypeDescriptors, codecLookup) {
|
|
9
8
|
const result = /* @__PURE__ */ new Map();
|
|
@@ -64,7 +63,7 @@ function prismaContract(schemaPath, options) {
|
|
|
64
63
|
...ifDefined("output", options.output)
|
|
65
64
|
};
|
|
66
65
|
}
|
|
67
|
-
|
|
68
66
|
//#endregion
|
|
69
67
|
export { prismaContract };
|
|
68
|
+
|
|
70
69
|
//# sourceMappingURL=provider.mjs.map
|
package/dist/provider.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":[
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":[],"sources":["../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport { parsePslDocument } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { interpretPslDocumentToSqlContract } from './interpreter';\nimport type { ColumnDescriptor } from './psl-column-resolution';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', string>;\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', string>[];\n}\n\nfunction buildColumnDescriptorMap(\n scalarTypeDescriptors: ReadonlyMap<string, string>,\n codecLookup: CodecLookup,\n): ReadonlyMap<string, ColumnDescriptor> {\n const result = new Map<string, ColumnDescriptor>();\n for (const [typeName, codecId] of scalarTypeDescriptors) {\n const nativeType = codecLookup.targetTypesFor(codecId)?.[0];\n if (nativeType === undefined) continue;\n result.set(typeName, { codecId, nativeType });\n }\n return result;\n}\n\nexport function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig {\n return {\n source: {\n inputs: [schemaPath],\n load: async (context) => {\n const [absoluteSchemaPath] = context.resolvedInputs;\n if (absoluteSchemaPath === undefined) {\n throw new Error(\n 'prismaContract: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\n let schema: string;\n try {\n schema = await readFile(absoluteSchemaPath, 'utf-8');\n } catch (error) {\n const message = String(error);\n return notOk({\n summary: `Failed to read Prisma schema at \"${schemaPath}\"`,\n diagnostics: [\n {\n code: 'PSL_SCHEMA_READ_FAILED',\n message,\n sourceId: schemaPath,\n },\n ],\n meta: { schemaPath, absoluteSchemaPath, cause: message },\n });\n }\n\n const document = parsePslDocument({\n schema,\n sourceId: schemaPath,\n });\n\n const scalarTypeDescriptors = buildColumnDescriptorMap(\n context.scalarTypeDescriptors,\n context.codecLookup,\n );\n\n const interpreted = interpretPslDocumentToSqlContract({\n document,\n target: options.target,\n authoringContributions: context.authoringContributions,\n scalarTypeDescriptors,\n ...ifDefined(\n 'composedExtensionPacks',\n context.composedExtensionPacks.length > 0\n ? [...context.composedExtensionPacks]\n : undefined,\n ),\n ...ifDefined(\n 'composedExtensionPackRefs',\n options.composedExtensionPackRefs?.length\n ? options.composedExtensionPackRefs\n : undefined,\n ),\n controlMutationDefaults: context.controlMutationDefaults,\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n },\n ...ifDefined('output', options.output),\n };\n}\n"],"mappings":";;;;;;AAgBA,SAAS,yBACP,uBACA,aACuC;CACvC,MAAM,yBAAS,IAAI,KAA+B;CAClD,KAAK,MAAM,CAAC,UAAU,YAAY,uBAAuB;EACvD,MAAM,aAAa,YAAY,eAAe,QAAQ,GAAG;EACzD,IAAI,eAAe,KAAA,GAAW;EAC9B,OAAO,IAAI,UAAU;GAAE;GAAS;GAAY,CAAC;;CAE/C,OAAO;;AAGT,SAAgB,eAAe,YAAoB,SAAgD;CACjG,OAAO;EACL,QAAQ;GACN,QAAQ,CAAC,WAAW;GACpB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,sBAAsB,QAAQ;IACrC,IAAI,uBAAuB,KAAA,GACzB,MAAM,IAAI,MACR,mIACD;IAEH,IAAI;IACJ,IAAI;KACF,SAAS,MAAM,SAAS,oBAAoB,QAAQ;aAC7C,OAAO;KACd,MAAM,UAAU,OAAO,MAAM;KAC7B,OAAO,MAAM;MACX,SAAS,oCAAoC,WAAW;MACxD,aAAa,CACX;OACE,MAAM;OACN;OACA,UAAU;OACX,CACF;MACD,MAAM;OAAE;OAAY;OAAoB,OAAO;OAAS;MACzD,CAAC;;IAGJ,MAAM,WAAW,iBAAiB;KAChC;KACA,UAAU;KACX,CAAC;IAEF,MAAM,wBAAwB,yBAC5B,QAAQ,uBACR,QAAQ,YACT;IAED,MAAM,cAAc,kCAAkC;KACpD;KACA,QAAQ,QAAQ;KAChB,wBAAwB,QAAQ;KAChC;KACA,GAAG,UACD,0BACA,QAAQ,uBAAuB,SAAS,IACpC,CAAC,GAAG,QAAQ,uBAAuB,GACnC,KAAA,EACL;KACD,GAAG,UACD,6BACA,QAAQ,2BAA2B,SAC/B,QAAQ,4BACR,KAAA,EACL;KACD,yBAAyB,QAAQ;KAClC,CAAC;IACF,IAAI,CAAC,YAAY,IACf,OAAO;IAGT,OAAO,GAAG,YAAY,MAAM;;GAE/B;EACD,GAAG,UAAU,UAAU,QAAQ,OAAO;EACvC"}
|
package/package.json
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-psl",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.67",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "PSL-to-SQL ContractIR interpreter for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"pathe": "^2.0.3",
|
|
10
|
-
"@prisma-next/config": "0.5.0-dev.
|
|
11
|
-
"@prisma-next/contract": "0.5.0-dev.
|
|
12
|
-
"@prisma-next/
|
|
13
|
-
"@prisma-next/
|
|
14
|
-
"@prisma-next/
|
|
15
|
-
"@prisma-next/
|
|
16
|
-
"@prisma-next/
|
|
10
|
+
"@prisma-next/config": "0.5.0-dev.67",
|
|
11
|
+
"@prisma-next/contract": "0.5.0-dev.67",
|
|
12
|
+
"@prisma-next/sql-contract": "0.5.0-dev.67",
|
|
13
|
+
"@prisma-next/sql-contract-ts": "0.5.0-dev.67",
|
|
14
|
+
"@prisma-next/utils": "0.5.0-dev.67",
|
|
15
|
+
"@prisma-next/framework-components": "0.5.0-dev.67",
|
|
16
|
+
"@prisma-next/psl-parser": "0.5.0-dev.67"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"tsdown": "0.
|
|
19
|
+
"tsdown": "0.22.0",
|
|
20
20
|
"typescript": "5.9.3",
|
|
21
|
-
"vitest": "4.
|
|
22
|
-
"@prisma-next/
|
|
23
|
-
"@prisma-next/contract-authoring": "0.5.0-dev.65",
|
|
21
|
+
"vitest": "4.1.5",
|
|
22
|
+
"@prisma-next/contract-authoring": "0.5.0-dev.67",
|
|
24
23
|
"@prisma-next/tsconfig": "0.0.0",
|
|
25
|
-
"@prisma-next/tsdown": "0.0.0"
|
|
24
|
+
"@prisma-next/tsdown": "0.0.0",
|
|
25
|
+
"@prisma-next/test-utils": "0.0.1"
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
28
|
"dist",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interpreter-g4FDWENY.mjs","names":["columns: string[]","parts: Array<{ raw: string; start: number; end: number }>","quote: '\"' | \"'\" | null","args: DefaultFunctionArgument[]","parsed","result: ParsedPslLiteral[]","result: { [key: string]: ParsedPslLiteral }","parsed: unknown","mappedArgs: unknown[]","descriptor","current: unknown","instantiated","presetContributions: FieldPresetContributions","descriptor","NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>>","BUILTIN_FIELD_ATTRIBUTE_NAMES: ReadonlySet<string>","REMOVED_ATTRIBUTE_RULES: ReadonlyMap<string, RemovedAttributeRule>","resolvedFields: ResolvedField[]","descriptor: ColumnDescriptor | undefined","scalarCodecId: string | undefined","presetContributions: FieldPresetContributions | undefined","relationNameFromPositional: string | undefined","fields: readonly string[] | undefined","references: readonly string[] | undefined","storageTypes: Record<string, StorageTypeInstance>","descriptor: ColumnDescriptor","hasUnsupportedNamedTypeAttribute","descriptor","primaryKey: PrimaryKeyNode | undefined","resultBackrelationCandidates: ModelBackrelationCandidate[]","relationName: string | undefined","uniqueConstraints: UniqueConstraintNode[]","indexNodes: IndexNode[]","foreignKeyNodes: ForeignKeyNode[]","resultFkRelationMetadata: FkRelationMetadata[]","valueObjects: Record<string, ContractValueObject>","fields: Record<string, ContractField>","result: ContractField","scalarField: ContractField","patchedFields: Record<string, ContractField>","variants: Record<string, { readonly value: string }>","diagnostics: ContractSourceDiagnostic[]","defaultFunctionRegistry: ControlMutationDefaultRegistry","modelNodes: ModelNode[]","fkRelationMetadata: FkRelationMetadata[]","backrelationCandidates: ModelBackrelationCandidate[]","polyDiagnostics: ContractSourceDiagnostic[]"],"sources":["../src/psl-attribute-parsing.ts","../src/default-function-registry.ts","../src/psl-authoring-arguments.ts","../src/psl-column-resolution.ts","../src/psl-field-resolution.ts","../src/psl-relation-resolution.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { PslAttribute, PslSpan } from '@prisma-next/psl-parser';\nimport { getPositionalArgument, parseQuotedStringLiteral } from '@prisma-next/psl-parser';\n\nexport { getPositionalArgument, parseQuotedStringLiteral };\n\nexport function lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nexport function getAttribute(\n attributes: readonly PslAttribute[] | undefined,\n name: string,\n): PslAttribute | undefined {\n return attributes?.find((attribute) => attribute.name === name);\n}\n\nexport function getNamedArgument(attribute: PslAttribute, name: string): string | undefined {\n const entry = attribute.args.find((arg) => arg.kind === 'named' && arg.name === name);\n if (!entry || entry.kind !== 'named') {\n return undefined;\n }\n return entry.value;\n}\n\nexport function getPositionalArgumentEntry(\n attribute: PslAttribute,\n index = 0,\n): { value: string; span: PslSpan } | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n const entry = entries[index];\n if (!entry || entry.kind !== 'positional') {\n return undefined;\n }\n return {\n value: entry.value,\n span: entry.span,\n };\n}\n\nexport function unquoteStringLiteral(value: string): string {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) {\n return trimmed;\n }\n return match[2] ?? '';\n}\n\nexport function parseFieldList(value: string): readonly string[] | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n return undefined;\n }\n const body = trimmed.slice(1, -1);\n const parts = body\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n return parts;\n}\n\nexport function parseMapName(input: {\n readonly attribute: PslAttribute | undefined;\n readonly defaultValue: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n}): string {\n if (!input.attribute) {\n return input.defaultValue;\n }\n\n const value = getPositionalArgument(input.attribute);\n if (!value) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n const parsed = parseQuotedStringLiteral(value);\n if (parsed === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n return parsed;\n}\n\nexport function parseConstraintMapArgument(input: {\n readonly attribute: PslAttribute | undefined;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n readonly code: string;\n}): string | undefined {\n if (!input.attribute) {\n return undefined;\n }\n\n const raw = getNamedArgument(input.attribute, 'map');\n if (!raw) {\n return undefined;\n }\n\n const parsed = parseQuotedStringLiteral(raw);\n if (parsed !== undefined) {\n return parsed;\n }\n\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function getPositionalArguments(attribute: PslAttribute): readonly string[] {\n return attribute.args\n .filter((arg) => arg.kind === 'positional')\n .map((arg) => (arg.kind === 'positional' ? arg.value : ''));\n}\n\nexport function pushInvalidAttributeArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseOptionalSingleIntegerArgument(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n readonly minimum: number;\n readonly valueLabel: string;\n}): number | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const parsed = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(parsed) || parsed < input.minimum) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a ${input.valueLabel}.`,\n });\n }\n\n return parsed;\n}\n\nexport function parseOptionalNumericArguments(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): { precision: number; scale?: number } | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 2) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const precision = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(precision) || precision < 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a positive integer precision.`,\n });\n }\n\n if (positionalArguments.length === 1) {\n return { precision };\n }\n\n const scale = Number(unquoteStringLiteral(positionalArguments[1] ?? ''));\n if (!Number.isInteger(scale) || scale < 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a non-negative integer scale.`,\n });\n }\n\n return { precision, scale };\n}\n\nexport function parseAttributeFieldList(input: {\n readonly attribute: PslAttribute;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly code: string;\n readonly entityLabel: string;\n}): readonly string[] | undefined {\n const raw = getNamedArgument(input.attribute, 'fields') ?? getPositionalArgument(input.attribute);\n if (!raw) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} requires fields list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const fields = parseFieldList(raw);\n if (!fields || fields.length === 0) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} requires bracketed field list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n return fields;\n}\n\nexport function findDuplicateFieldName(fieldNames: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const name of fieldNames) {\n if (seen.has(name)) return name;\n seen.add(name);\n }\n return undefined;\n}\n\nexport function mapFieldNamesToColumns(input: {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly mapping: { readonly fieldColumns: Map<string, string> };\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly span: PslSpan;\n readonly entityLabel: string;\n}): readonly string[] | undefined {\n const columns: string[] = [];\n for (const fieldName of input.fieldNames) {\n const columnName = input.mapping.fieldColumns.get(fieldName);\n if (!columnName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} references unknown field \"${input.modelName}.${fieldName}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n }\n columns.push(columnName);\n }\n return columns;\n}\n","import type {\n ControlMutationDefaultRegistry,\n DefaultFunctionLoweringContext,\n LoweredDefaultResult,\n ParsedDefaultFunctionCall,\n} from '@prisma-next/framework-components/control';\nimport type { PslSpan } from '@prisma-next/psl-parser';\n\ninterface DefaultFunctionArgument {\n readonly raw: string;\n readonly span: PslSpan;\n}\n\nfunction resolveSpanPositionFromBase(\n base: PslSpan,\n text: string,\n offset: number,\n): PslSpan['start'] {\n const safeOffset = Math.min(Math.max(0, offset), text.length);\n let line = base.start.line;\n let column = base.start.column;\n\n for (let index = 0; index < safeOffset; index += 1) {\n const character = text[index] ?? '';\n if (character === '\\r') {\n if (text[index + 1] === '\\n' && index + 1 < safeOffset) {\n index += 1;\n }\n line += 1;\n column = 1;\n continue;\n }\n if (character === '\\n') {\n line += 1;\n column = 1;\n continue;\n }\n column += 1;\n }\n\n return {\n offset: base.start.offset + safeOffset,\n line,\n column,\n };\n}\n\nfunction createSpanFromBase(\n base: PslSpan,\n startOffset: number,\n endOffset: number,\n text: string,\n): PslSpan {\n const safeStart = Math.max(0, Math.min(startOffset, text.length));\n const safeEnd = Math.max(safeStart, Math.min(endOffset, text.length));\n return {\n start: resolveSpanPositionFromBase(base, text, safeStart),\n end: resolveSpanPositionFromBase(base, text, safeEnd),\n };\n}\n\nfunction splitTopLevelArgs(raw: string): Array<{ raw: string; start: number; end: number }> {\n if (raw.trim().length === 0) {\n return [];\n }\n\n const parts: Array<{ raw: string; start: number; end: number }> = [];\n let depthParen = 0;\n let depthBracket = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n\n for (let index = 0; index < raw.length; index += 1) {\n const character = raw[index] ?? '';\n if (quote) {\n if (character === quote && raw[index - 1] !== '\\\\') {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n\n if (character === ',' && depthParen === 0 && depthBracket === 0) {\n parts.push({\n raw: raw.slice(start, index),\n start,\n end: index,\n });\n start = index + 1;\n }\n }\n\n parts.push({\n raw: raw.slice(start),\n start,\n end: raw.length,\n });\n\n return parts;\n}\n\nexport function parseDefaultFunctionCall(\n expression: string,\n expressionSpan: PslSpan,\n): ParsedDefaultFunctionCall | undefined {\n const trimmed = expression.trim();\n const leadingWhitespace = expression.length - expression.trimStart().length;\n const trailingWhitespace = expression.length - expression.trimEnd().length;\n const contentEnd = expression.length - trailingWhitespace;\n\n const openParen = trimmed.indexOf('(');\n const closeParen = trimmed.lastIndexOf(')');\n if (openParen <= 0 || closeParen !== trimmed.length - 1) {\n return undefined;\n }\n\n const functionName = trimmed.slice(0, openParen).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(functionName)) {\n return undefined;\n }\n\n const functionArgsRaw = trimmed.slice(openParen + 1, closeParen);\n const parts = splitTopLevelArgs(functionArgsRaw);\n const args: DefaultFunctionArgument[] = [];\n for (const part of parts) {\n const raw = part.raw.trim();\n if (raw.length === 0) {\n return undefined;\n }\n const leadingPartWhitespace = part.raw.length - part.raw.trimStart().length;\n const argStart = leadingWhitespace + openParen + 1 + part.start + leadingPartWhitespace;\n const argEnd = argStart + raw.length;\n args.push({\n raw,\n span: createSpanFromBase(expressionSpan, argStart, argEnd, expression),\n });\n }\n\n const functionStart = leadingWhitespace;\n const functionEnd = contentEnd;\n return {\n name: functionName,\n raw: trimmed,\n args,\n span: createSpanFromBase(expressionSpan, functionStart, functionEnd, expression),\n };\n}\n\nfunction formatSupportedFunctionList(registry: ControlMutationDefaultRegistry): string {\n const signatures = Array.from(registry.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .flatMap(([functionName, entry]) => {\n const usageSignatures = entry.usageSignatures?.filter((signature) => signature.length > 0);\n return usageSignatures && usageSignatures.length > 0\n ? usageSignatures\n : [`${functionName}()`];\n });\n return signatures.length > 0 ? signatures.join(', ') : 'none';\n}\n\nexport function lowerDefaultFunctionWithRegistry(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly registry: ControlMutationDefaultRegistry;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const entry = input.registry.get(input.call.name);\n if (entry) {\n return entry.lower({ call: input.call, context: input.context });\n }\n const supportedFunctionList = formatSupportedFunctionList(input.registry);\n\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message: `Default function \"${input.call.name}\" is not supported in SQL PSL provider v1. Supported functions: ${supportedFunctionList}.`,\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { AuthoringArgumentDescriptor } from '@prisma-next/framework-components/authoring';\nimport type { PslAttributeArgument, PslSpan } from '@prisma-next/psl-parser';\nimport { unquoteStringLiteral } from './psl-attribute-parsing';\n\nconst INVALID_AUTHORING_ARGUMENT = Symbol('invalidAuthoringArgument');\n\ntype ParsedPslLiteral =\n | string\n | number\n | boolean\n | null\n | ParsedPslLiteral[]\n | { [key: string]: ParsedPslLiteral };\n\nfunction isIdentifierStartCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z_$]/.test(character);\n}\n\nfunction isIdentifierCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z0-9_$]/.test(character);\n}\n\nfunction parseJsLikeLiteral(value: string): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n let index = 0;\n\n function skipWhitespace() {\n while (/\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n }\n\n function parseIdentifier(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const first = value[index];\n if (!isIdentifierStartCharacter(first)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let end = index + 1;\n while (isIdentifierCharacter(value[end])) {\n end += 1;\n }\n\n const identifier = value.slice(index, end);\n index = end;\n return identifier;\n }\n\n function parseString(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const quote = value[index];\n if (quote !== '\"' && quote !== \"'\") {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n let result = '';\n\n while (index < value.length) {\n const character = value[index];\n index += 1;\n\n if (character === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n if (character === quote) {\n return result;\n }\n\n if (character !== '\\\\') {\n result += character;\n continue;\n }\n\n const escaped = value[index];\n index += 1;\n\n if (escaped === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n switch (escaped) {\n case \"'\":\n case '\"':\n case '\\\\':\n case '/':\n result += escaped;\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'u': {\n const hex = value.slice(index, index + 4);\n if (!/^[0-9A-Fa-f]{4}$/.test(hex)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result += String.fromCharCode(Number.parseInt(hex, 16));\n index += 4;\n break;\n }\n default:\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseNumber(): number | typeof INVALID_AUTHORING_ARGUMENT {\n const match = value.slice(index).match(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/);\n const raw = match?.[0];\n if (!raw) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += raw.length;\n return parsed;\n }\n\n function parseArray(): ParsedPslLiteral[] | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '[') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: ParsedPslLiteral[] = [];\n\n skipWhitespace();\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result.push(entry);\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseObject(): { [key: string]: ParsedPslLiteral } | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '{') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: { [key: string]: ParsedPslLiteral } = {};\n\n skipWhitespace();\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n skipWhitespace();\n const key = value[index] === '\"' || value[index] === \"'\" ? parseString() : parseIdentifier();\n if (key === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n if (value[index] !== ':') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result[key] = entry;\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseValue(): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n skipWhitespace();\n const character = value[index];\n if (character === '{') {\n return parseObject();\n }\n if (character === '[') {\n return parseArray();\n }\n if (character === '\"' || character === \"'\") {\n return parseString();\n }\n if (character === '-' || /\\d/.test(character ?? '')) {\n return parseNumber();\n }\n\n const identifier = parseIdentifier();\n if (identifier === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (identifier === 'true') {\n return true;\n }\n if (identifier === 'false') {\n return false;\n }\n if (identifier === 'null') {\n return null;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n const parsed = parseValue();\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return parsed;\n }\n\n skipWhitespace();\n return index === value.length ? parsed : INVALID_AUTHORING_ARGUMENT;\n}\n\nfunction parseStringArrayLiteral(\n value: string,\n): readonly string[] | typeof INVALID_AUTHORING_ARGUMENT {\n const parsed = parseJsLikeLiteral(value);\n if (parsed === INVALID_AUTHORING_ARGUMENT || !Array.isArray(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (!parsed.every((item): item is string => typeof item === 'string')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n return parsed;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parsePslObjectLiteral(\n value: string,\n): Record<string, unknown> | typeof INVALID_AUTHORING_ARGUMENT {\n const trimmed = value.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n parsed = parseJsLikeLiteral(trimmed);\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n if (!isPlainObject(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return parsed;\n}\n\nfunction parsePslAuthoringArgumentValue(\n descriptor: AuthoringArgumentDescriptor,\n rawValue: string,\n): unknown | typeof INVALID_AUTHORING_ARGUMENT {\n switch (descriptor.kind) {\n case 'string':\n return unquoteStringLiteral(rawValue);\n case 'number': {\n const parsed = Number(unquoteStringLiteral(rawValue));\n return Number.isNaN(parsed) ? INVALID_AUTHORING_ARGUMENT : parsed;\n }\n case 'stringArray':\n return parseStringArrayLiteral(rawValue);\n case 'object':\n return parsePslObjectLiteral(rawValue);\n default: {\n const _exhaustive: never = descriptor;\n void _exhaustive;\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n}\n\nfunction pushInvalidPslHelperArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly entityLabel: string;\n readonly helperLabel: string;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} ${input.helperLabel} ${input.message}`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function mapPslHelperArgs(input: {\n readonly args: readonly PslAttributeArgument[];\n readonly descriptors: readonly AuthoringArgumentDescriptor[];\n readonly helperLabel: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): readonly unknown[] | undefined {\n const mappedArgs: unknown[] = input.descriptors.map(() => undefined);\n\n const positionalArgs = input.args.filter((arg) => arg.kind === 'positional');\n const namedArgs = input.args.filter((arg) => arg.kind === 'named');\n\n if (positionalArgs.length > input.descriptors.length) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `accepts at most ${input.descriptors.length} argument(s), received ${positionalArgs.length}.`,\n });\n }\n\n for (const [index, argument] of positionalArgs.entries()) {\n const descriptor = input.descriptors[index];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define positional argument #${index + 1}.`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse argument #${index + 1} for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[index] = value;\n }\n\n for (const argument of namedArgs) {\n const descriptorIndex = input.descriptors.findIndex(\n (descriptor) => descriptor.name === argument.name,\n );\n if (descriptorIndex < 0) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received unknown named argument \"${argument.name}\".`,\n });\n }\n\n if (mappedArgs[descriptorIndex] !== undefined) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received duplicate value for argument \"${argument.name}\".`,\n });\n }\n\n const descriptor = input.descriptors[descriptorIndex];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define named argument \"${argument.name}\".`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse named argument \"${argument.name}\" for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[descriptorIndex] = value;\n }\n\n return mappedArgs;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultPhases } from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringFieldPresetDescriptor,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n hasRegisteredFieldNamespace,\n instantiateAuthoringFieldPreset,\n instantiateAuthoringTypeConstructor,\n isAuthoringFieldPresetDescriptor,\n isAuthoringTypeConstructorDescriptor,\n validateAuthoringHelperArguments,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type {\n PslAttribute,\n PslField,\n PslSpan,\n PslTypeConstructorCall,\n} from '@prisma-next/psl-parser';\nimport {\n lowerDefaultFunctionWithRegistry,\n parseDefaultFunctionCall,\n} from './default-function-registry';\nimport {\n getPositionalArgumentEntry,\n getPositionalArguments,\n parseOptionalNumericArguments,\n parseOptionalSingleIntegerArgument,\n pushInvalidAttributeArgument,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { mapPslHelperArgs } from './psl-authoring-arguments';\n\nexport type ColumnDescriptor = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown> | undefined;\n};\n\nexport function toNamedTypeFieldDescriptor(\n typeRef: string,\n descriptor: Pick<ColumnDescriptor, 'codecId' | 'nativeType'>,\n): ColumnDescriptor {\n return {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeRef,\n };\n}\n\nexport function getAuthoringTypeConstructor(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringTypeConstructorDescriptor | undefined {\n let current: unknown = contributions?.type;\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return isAuthoringTypeConstructorDescriptor(current) ? current : undefined;\n}\n\n/**\n * Walks `authoringContributions.field` segment-by-segment and returns the field-preset descriptor at the resolved path, or `undefined` if no descriptor is registered.\n *\n * Symmetric with `getAuthoringTypeConstructor`. Field presets are strictly richer than type constructors — they can contribute `default` / `executionDefaults` / `id` / `unique` / `nullable` in addition to the `codecId` / `nativeType` / `typeParams` triple. PSL resolution tries field presets first, then falls back to type constructors on miss (see `resolveFieldTypeDescriptor`).\n */\nexport function getAuthoringFieldPreset(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringFieldPresetDescriptor | undefined {\n let current: unknown = contributions?.field;\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return isAuthoringFieldPresetDescriptor(current) ? current : undefined;\n}\n\n/**\n * Returns the namespace prefix of `attributeName` if it references an unrecognized extension namespace, otherwise `undefined`. A namespace is considered recognized when it is:\n *\n * - `db` (native-type spec, always allowed),\n * - the active family id (e.g. `sql`),\n * - the active target id (e.g. `postgres`),\n * - a registered field-preset namespace (e.g. `temporal`),\n * - present in `composedExtensions`.\n *\n * Family/target/field-preset namespaces are exempted so that e.g. `@sql.foo` surfaces as PSL_UNSUPPORTED_*_ATTRIBUTE (the attribute isn't defined) rather than PSL_EXTENSION_NAMESPACE_NOT_COMPOSED (the namespace is already composed).\n */\nexport function checkUncomposedNamespace(\n attributeName: string,\n composedExtensions: ReadonlySet<string>,\n context?: {\n readonly familyId?: string;\n readonly targetId?: string;\n readonly authoringContributions?: AuthoringContributions | undefined;\n },\n): string | undefined {\n const dotIndex = attributeName.indexOf('.');\n if (dotIndex <= 0 || dotIndex === attributeName.length - 1) {\n return undefined;\n }\n const namespace = attributeName.slice(0, dotIndex);\n if (\n namespace === 'db' ||\n namespace === context?.familyId ||\n namespace === context?.targetId ||\n hasRegisteredFieldNamespace(context?.authoringContributions, namespace) ||\n composedExtensions.has(namespace)\n ) {\n return undefined;\n }\n return namespace;\n}\n\n/**\n * Pushes the canonical `PSL_EXTENSION_NAMESPACE_NOT_COMPOSED` diagnostic for a subject (attribute, model attribute, or type constructor) that references an extension namespace which is not composed in the current contract.\n *\n * The `data` payload carries the missing namespace so machine consumers (agents, IDE extensions, CLI auto-fix) don't have to parse the prose.\n */\nexport function reportUncomposedNamespace(input: {\n readonly subjectLabel: string;\n readonly namespace: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n input.diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `${input.subjectLabel} uses unrecognized namespace \"${input.namespace}\". Add extension pack \"${input.namespace}\" to extensionPacks in prisma-next.config.ts.`,\n sourceId: input.sourceId,\n span: input.span,\n data: { namespace: input.namespace, suggestedPack: input.namespace },\n });\n}\n\n/**\n * Pushes the canonical `PSL_UNKNOWN_FIELD_PRESET` diagnostic when a typoed preset name is referenced inside a registered field-preset namespace. The `data` payload exposes the namespace and full helper path so machine consumers (agents, IDE extensions) don't have to parse the prose.\n */\nexport function reportUnknownFieldPreset(input: {\n readonly entityLabel: string;\n readonly namespace: string;\n readonly helperPath: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n input.diagnostics.push({\n code: 'PSL_UNKNOWN_FIELD_PRESET',\n message: `${input.entityLabel} references unknown field preset \"${input.helperPath}\". Check the spelling against the available presets in the \"${input.namespace}\" namespace.`,\n sourceId: input.sourceId,\n span: input.span,\n data: { namespace: input.namespace, helperPath: input.helperPath },\n });\n}\n\nexport function instantiatePslTypeConstructor(input: {\n readonly call: PslTypeConstructorCall;\n readonly descriptor: AuthoringTypeConstructorDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}):\n | {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n }\n | undefined {\n const helperPath = input.call.path.join('.');\n const args = mapPslHelperArgs({\n args: input.call.args,\n descriptors: input.descriptor.args ?? [],\n helperLabel: `constructor \"${helperPath}\"`,\n span: input.call.span,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!args) {\n return undefined;\n }\n\n try {\n validateAuthoringHelperArguments(helperPath, input.descriptor.args, args);\n return instantiateAuthoringTypeConstructor(input.descriptor, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} constructor \"${helperPath}\" ${message}`,\n sourceId: input.sourceId,\n span: input.call.span,\n });\n return undefined;\n }\n}\n\nfunction pushUnsupportedTypeConstructorDiagnostic(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly code: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: input.code,\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function resolvePslTypeConstructorDescriptor(input: {\n readonly call: PslTypeConstructorCall;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly unsupportedMessage: string;\n}): AuthoringTypeConstructorDescriptor | undefined {\n const descriptor = getAuthoringTypeConstructor(input.authoringContributions, input.call.path);\n if (descriptor) {\n return descriptor;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(\n input.call.path.join('.'),\n input.composedExtensions,\n {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n },\n );\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Type constructor \"${input.call.path.join('.')}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: input.call.span,\n diagnostics: input.diagnostics,\n });\n return undefined;\n }\n\n return pushUnsupportedTypeConstructorDiagnostic({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.call.span,\n code: input.unsupportedCode,\n message: input.unsupportedMessage,\n });\n}\n\n/**\n * Instantiates a field-preset call against its descriptor, coercing PSL AST arguments into the descriptor's typed argument shape and returning the preset's full set of contract contributions.\n *\n * Symmetric with `instantiatePslTypeConstructor` but richer: a field preset can contribute `default`, `executionDefaults`, `id`, `unique`, and `nullable` in addition to the storage-type triple. PSL → typed-args coercion happens here (via `mapPslHelperArgs`) so that `instantiateAuthoringFieldPreset` itself stays typed-input-only and TS keeps its zero-runtime-validation cost.\n */\nexport function instantiatePslFieldPreset(input: {\n readonly call: PslTypeConstructorCall;\n readonly descriptor: AuthoringFieldPresetDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}):\n | {\n readonly descriptor: ColumnDescriptor;\n readonly nullable: boolean;\n readonly default?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n readonly id: boolean;\n readonly unique: boolean;\n }\n | undefined {\n const helperPath = input.call.path.join('.');\n const args = mapPslHelperArgs({\n args: input.call.args,\n descriptors: input.descriptor.args ?? [],\n helperLabel: `preset \"${helperPath}\"`,\n span: input.call.span,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!args) {\n return undefined;\n }\n\n try {\n validateAuthoringHelperArguments(helperPath, input.descriptor.args, args);\n const instantiated = instantiateAuthoringFieldPreset(input.descriptor, args);\n return {\n descriptor: {\n codecId: instantiated.descriptor.codecId,\n nativeType: instantiated.descriptor.nativeType,\n ...(instantiated.descriptor.typeParams !== undefined\n ? { typeParams: instantiated.descriptor.typeParams }\n : {}),\n },\n nullable: instantiated.nullable,\n ...(instantiated.default !== undefined ? { default: instantiated.default } : {}),\n ...(instantiated.executionDefaults !== undefined\n ? { executionDefaults: instantiated.executionDefaults }\n : {}),\n id: instantiated.id,\n unique: instantiated.unique,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} preset \"${helperPath}\" ${message}`,\n sourceId: input.sourceId,\n span: input.call.span,\n });\n return undefined;\n }\n}\n\n/**\n * Contract contributions a field preset adds beyond the bare storage-type triple. Set when a field is resolved through the field-preset dispatch path; absent when resolved through the type-constructor path or as a scalar/enum/named-type lookup.\n */\nexport type FieldPresetContributions = {\n readonly nullable: boolean;\n readonly id: boolean;\n readonly unique: boolean;\n readonly default?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n};\n\nexport type ResolveFieldTypeResult =\n | {\n readonly ok: true;\n readonly descriptor: ColumnDescriptor;\n readonly presetContributions?: FieldPresetContributions;\n }\n | { readonly ok: false; readonly alreadyReported: boolean };\n\nexport function resolveFieldTypeDescriptor(input: {\n readonly field: PslField;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ResolveFieldTypeResult {\n if (input.field.typeConstructor) {\n // Field presets carry richer semantics than type constructors, so a field preset match is the complete answer. Shared composition rejects exact cross-registry collisions before PSL resolution can observe them.\n const presetDescriptor = getAuthoringFieldPreset(\n input.authoringContributions,\n input.field.typeConstructor.path,\n );\n if (presetDescriptor) {\n const instantiated = instantiatePslFieldPreset({\n call: input.field.typeConstructor,\n descriptor: presetDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!instantiated) {\n return { ok: false, alreadyReported: true };\n }\n const presetContributions: FieldPresetContributions = {\n nullable: instantiated.nullable,\n id: instantiated.id,\n unique: instantiated.unique,\n ...(instantiated.default !== undefined ? { default: instantiated.default } : {}),\n ...(instantiated.executionDefaults !== undefined\n ? { executionDefaults: instantiated.executionDefaults }\n : {}),\n };\n return { ok: true, descriptor: instantiated.descriptor, presetContributions };\n }\n\n const helperPath = input.field.typeConstructor.path.join('.');\n const namespacePrefix =\n input.field.typeConstructor.path.length > 1 ? input.field.typeConstructor.path[0] : undefined;\n const typeDescriptor = getAuthoringTypeConstructor(\n input.authoringContributions,\n input.field.typeConstructor.path,\n );\n\n if (\n !typeDescriptor &&\n namespacePrefix &&\n hasRegisteredFieldNamespace(input.authoringContributions, namespacePrefix)\n ) {\n reportUnknownFieldPreset({\n entityLabel: input.entityLabel,\n namespace: namespacePrefix,\n helperPath,\n sourceId: input.sourceId,\n span: input.field.typeConstructor.span,\n diagnostics: input.diagnostics,\n });\n return { ok: false, alreadyReported: true };\n }\n\n const descriptor =\n typeDescriptor ??\n resolvePslTypeConstructorDescriptor({\n call: input.field.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE',\n unsupportedMessage: `${input.entityLabel} type constructor \"${helperPath}\" is not supported in SQL PSL provider v1`,\n });\n if (!descriptor) {\n return { ok: false, alreadyReported: true };\n }\n\n const instantiated = instantiatePslTypeConstructor({\n call: input.field.typeConstructor,\n descriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!instantiated) {\n return { ok: false, alreadyReported: true };\n }\n return { ok: true, descriptor: instantiated };\n }\n\n const descriptor = resolveColumnDescriptor(\n input.field,\n input.enumTypeDescriptors,\n input.namedTypeDescriptors,\n input.scalarTypeDescriptors,\n );\n if (!descriptor) {\n return { ok: false, alreadyReported: false };\n }\n return { ok: true, descriptor };\n}\n\n/**\n * Declarative specification for @db.* native type attributes.\n *\n * Argument kinds:\n * - `noArgs`: No arguments accepted; `codecId: null` means inherit from baseDescriptor.\n * - `optionalLength`: Zero or one positional integer (minimum 1), stored as `{ length }`.\n * - `optionalPrecision`: Zero or one positional integer (minimum 0), stored as `{ precision }`.\n * - `optionalNumeric`: Zero, one, or two positional integers (precision + scale).\n */\nexport type NativeTypeSpec =\n | {\n readonly args: 'noArgs';\n readonly baseType: string;\n readonly codecId: string | null;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalLength';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalPrecision';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalNumeric';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n };\n\nexport const NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>> = {\n 'db.VarChar': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/varchar@1',\n nativeType: 'character varying',\n },\n 'db.Char': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/char@1',\n nativeType: 'character',\n },\n 'db.Uuid': { args: 'noArgs', baseType: 'String', codecId: null, nativeType: 'uuid' },\n 'db.SmallInt': { args: 'noArgs', baseType: 'Int', codecId: 'pg/int2@1', nativeType: 'int2' },\n 'db.Real': { args: 'noArgs', baseType: 'Float', codecId: 'pg/float4@1', nativeType: 'float4' },\n 'db.Numeric': {\n args: 'optionalNumeric',\n baseType: 'Decimal',\n codecId: 'pg/numeric@1',\n nativeType: 'numeric',\n },\n 'db.Timestamp': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamp@1',\n nativeType: 'timestamp',\n },\n 'db.Timestamptz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamptz@1',\n nativeType: 'timestamptz',\n },\n 'db.Date': { args: 'noArgs', baseType: 'DateTime', codecId: null, nativeType: 'date' },\n 'db.Time': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/time@1',\n nativeType: 'time',\n },\n 'db.Timetz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timetz@1',\n nativeType: 'timetz',\n },\n 'db.Json': { args: 'noArgs', baseType: 'Json', codecId: 'pg/json@1', nativeType: 'json' },\n};\n\nexport function resolveDbNativeTypeAttribute(input: {\n readonly attribute: PslAttribute;\n readonly baseType: string;\n readonly baseDescriptor: ColumnDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ColumnDescriptor | undefined {\n const spec = NATIVE_TYPE_SPECS[input.attribute.name];\n if (!spec) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `${input.entityLabel} uses unsupported attribute \"@${input.attribute.name}\"`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (input.baseType !== spec.baseType) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} uses @${input.attribute.name} on unsupported base type \"${input.baseType}\". Expected \"${spec.baseType}\".`,\n });\n }\n\n switch (spec.args) {\n case 'noArgs': {\n if (getPositionalArguments(input.attribute).length > 0 || input.attribute.args.length > 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} does not accept arguments.`,\n });\n }\n return {\n codecId: spec.codecId ?? input.baseDescriptor.codecId,\n nativeType: spec.nativeType,\n };\n }\n case 'optionalLength': {\n const length = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 1,\n valueLabel: 'positive integer length',\n });\n if (length === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(length === null ? {} : { typeParams: { length } }),\n };\n }\n case 'optionalPrecision': {\n const precision = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 0,\n valueLabel: 'non-negative integer precision',\n });\n if (precision === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(precision === null ? {} : { typeParams: { precision } }),\n };\n }\n case 'optionalNumeric': {\n const numeric = parseOptionalNumericArguments({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (numeric === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(numeric === null ? {} : { typeParams: numeric }),\n };\n }\n }\n}\n\nexport function parseDefaultLiteralValue(expression: string): ColumnDefault | undefined {\n const trimmed = expression.trim();\n if (trimmed === 'true' || trimmed === 'false') {\n return { kind: 'literal', value: trimmed === 'true' };\n }\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue) && trimmed.length > 0 && !/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: numericValue };\n }\n if (/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: unquoteStringLiteral(trimmed) };\n }\n return undefined;\n}\n\nexport function lowerDefaultForField(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly defaultAttribute: PslAttribute;\n readonly columnDescriptor: ColumnDescriptor;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly sourceId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly defaultValue?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n} {\n const positionalEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'positional');\n const namedEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'named');\n\n if (namedEntries.length > 0 || positionalEntries.length !== 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires exactly one positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const expressionEntry = getPositionalArgumentEntry(input.defaultAttribute);\n if (!expressionEntry) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires a positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const literalDefault = parseDefaultLiteralValue(expressionEntry.value);\n if (literalDefault) {\n return { defaultValue: literalDefault };\n }\n\n const defaultFunctionCall = parseDefaultFunctionCall(expressionEntry.value, expressionEntry.span);\n if (!defaultFunctionCall) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_VALUE',\n message: `Unsupported default value \"${expressionEntry.value}\"`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const lowered = lowerDefaultFunctionWithRegistry({\n call: defaultFunctionCall,\n registry: input.defaultFunctionRegistry,\n context: {\n sourceId: input.sourceId,\n modelName: input.modelName,\n fieldName: input.fieldName,\n columnCodecId: input.columnDescriptor.codecId,\n },\n });\n\n if (!lowered.ok) {\n input.diagnostics.push(lowered.diagnostic);\n return {};\n }\n\n if (lowered.value.kind === 'storage') {\n return { defaultValue: lowered.value.defaultValue };\n }\n\n const generatorDescriptor = input.generatorDescriptorById.get(lowered.value.generated.id);\n if (!generatorDescriptor) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${lowered.value.generated.id}\" is not available in the composed mutation default registry.`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n // Preset-only generators (e.g. `timestampNow`) co-register their codec through the preset descriptor, so they don't carry an `applicableCodecIds` list. Such a generator surfacing on the `@default(...)` lowering path is itself the bug — emit a diagnostic pointing the user at the correct authoring surface.\n if (generatorDescriptor.applicableCodecIds === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${generatorDescriptor.id}\" is not applicable to \"@default(...)\" lowering. Use the corresponding field preset (e.g. \\`temporal.${generatorDescriptor.id === 'timestampNow' ? 'updatedAt' : generatorDescriptor.id}()\\`) instead.`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n if (!generatorDescriptor.applicableCodecIds.includes(input.columnDescriptor.codecId)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${generatorDescriptor.id}\" is not applicable to \"${input.modelName}.${input.fieldName}\" with codecId \"${input.columnDescriptor.codecId}\".`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n return { executionDefaults: { onCreate: lowered.value.generated } };\n}\n\nexport function resolveColumnDescriptor(\n field: PslField,\n enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n): ColumnDescriptor | undefined {\n if (field.typeRef && namedTypeDescriptors.has(field.typeRef)) {\n return namedTypeDescriptors.get(field.typeRef);\n }\n if (namedTypeDescriptors.has(field.typeName)) {\n return namedTypeDescriptors.get(field.typeName);\n }\n if (enumTypeDescriptors.has(field.typeName)) {\n return enumTypeDescriptors.get(field.typeName);\n }\n return scalarTypeDescriptors.get(field.typeName);\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultPhases } from '@prisma-next/contract/types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type { PslAttribute, PslField, PslModel } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n getAttribute,\n lowerFirst,\n parseConstraintMapArgument,\n parseMapName,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor, FieldPresetContributions } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n lowerDefaultForField,\n reportUncomposedNamespace,\n resolveFieldTypeDescriptor,\n} from './psl-column-resolution';\n\nexport type ResolvedField = {\n readonly field: PslField;\n readonly columnName: string;\n readonly descriptor: ColumnDescriptor;\n readonly defaultValue?: ColumnDefault;\n readonly executionDefaults?: ExecutionMutationDefaultPhases;\n readonly isId: boolean;\n readonly isUnique: boolean;\n readonly idName?: string;\n readonly uniqueName?: string;\n readonly many?: true;\n readonly valueObjectTypeName?: string;\n readonly scalarCodecId?: string;\n};\n\nexport type ModelNameMapping = {\n readonly model: PslModel;\n readonly tableName: string;\n readonly fieldColumns: Map<string, string>;\n};\n\nexport interface CollectResolvedFieldsInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly familyId: string;\n readonly targetId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n}\n\nconst BUILTIN_FIELD_ATTRIBUTE_NAMES: ReadonlySet<string> = new Set([\n 'id',\n 'unique',\n 'default',\n 'relation',\n 'map',\n]);\n\n/**\n * Per-attribute migration rule for attributes that have been removed\n * from PSL in favor of the field-preset surface. The `hint` text is\n * appended to the `PSL_UNSUPPORTED_FIELD_ATTRIBUTE` message so users\n * porting Prisma 6 schemas see \"use this preset instead\" inline; the\n * `suppressWhen` predicate skips the hint when the user has already\n * migrated (so they don't get told to do what they just did).\n *\n * Pairing the suppression predicate with the hint makes each entry\n * self-contained: a future entry for, say, `@id` ↔ `id.uuidv7()` cannot\n * silently inherit the wrong predicate when added.\n */\ninterface RemovedAttributeRule {\n readonly hint: string;\n readonly suppressWhen: (field: PslField) => boolean;\n}\n\nconst REMOVED_ATTRIBUTE_RULES: ReadonlyMap<string, RemovedAttributeRule> = new Map([\n [\n 'updatedAt',\n {\n hint: 'Use `temporal.updatedAt()` as a field-preset call instead.',\n suppressWhen: (field) => field.typeConstructor?.path[0] === 'temporal',\n },\n ],\n]);\n\n// `validateFieldAttributes` short-circuits on `BUILTIN_FIELD_ATTRIBUTE_NAMES`\n// before consulting `REMOVED_ATTRIBUTE_RULES`. A name appearing in both sets\n// would silently suppress its migration hint, defeating the purpose of the\n// hint table. Fail at module load with a clear message — the table is\n// designed to grow and this is the cheap insurance against future drift.\n{\n const overlap = [...REMOVED_ATTRIBUTE_RULES.keys()].filter((name) =>\n BUILTIN_FIELD_ATTRIBUTE_NAMES.has(name),\n );\n if (overlap.length > 0) {\n throw new Error(\n `BUILTIN_FIELD_ATTRIBUTE_NAMES and REMOVED_ATTRIBUTE_RULES must not overlap. Names in both: ${overlap.join(', ')}`,\n );\n }\n}\n\nfunction validateFieldAttributes(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly composedExtensions: ReadonlySet<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly familyId: string;\n readonly targetId: string;\n}): void {\n for (const attribute of input.field.attributes) {\n if (BUILTIN_FIELD_ATTRIBUTE_NAMES.has(attribute.name)) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n continue;\n }\n\n const baseMessage = `Field \"${input.model.name}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`;\n const removedRule = REMOVED_ATTRIBUTE_RULES.get(attribute.name);\n const message =\n removedRule && !removedRule.suppressWhen(input.field)\n ? `${baseMessage}. ${removedRule.hint}`\n : baseMessage;\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n }\n}\n\nfunction extractFieldConstraintNames(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly idAttribute: PslAttribute | undefined;\n readonly uniqueAttribute: PslAttribute | undefined;\n readonly idName: string | undefined;\n readonly uniqueName: string | undefined;\n} {\n const idAttribute = getAttribute(input.field.attributes, 'id');\n const uniqueAttribute = getAttribute(input.field.attributes, 'unique');\n const idName = parseConstraintMapArgument({\n attribute: idAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @id`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n const uniqueName = parseConstraintMapArgument({\n attribute: uniqueAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @unique`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n return { idAttribute, uniqueAttribute, idName, uniqueName };\n}\n\nexport function collectResolvedFields(input: CollectResolvedFieldsInput): ResolvedField[] {\n const {\n model,\n mapping,\n enumTypeDescriptors,\n namedTypeDescriptors,\n modelNames,\n compositeTypeNames,\n composedExtensions,\n authoringContributions,\n familyId,\n targetId,\n defaultFunctionRegistry,\n generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors,\n } = input;\n const resolvedFields: ResolvedField[] = [];\n\n for (const field of model.fields) {\n const isModelField = modelNames.has(field.typeName);\n\n if (field.list && isModelField) {\n continue;\n }\n\n validateFieldAttributes({\n model,\n field,\n composedExtensions,\n authoringContributions,\n diagnostics,\n sourceId,\n familyId,\n targetId,\n });\n\n const relationAttribute = getAttribute(field.attributes, 'relation');\n if (isModelField && relationAttribute) {\n continue;\n }\n\n const isValueObjectField = compositeTypeNames.has(field.typeName);\n const isListField = field.list;\n\n let descriptor: ColumnDescriptor | undefined;\n let scalarCodecId: string | undefined;\n let presetContributions: FieldPresetContributions | undefined;\n const resolveInput = {\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n };\n\n if (isValueObjectField) {\n descriptor = scalarTypeDescriptors.get('Json');\n } else if (isListField) {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n // Field presets are complete declarations — they carry their own codec\n // and do not compose with `[]` list-of semantics. Reject early.\n if (resolved.presetContributions) {\n diagnostics.push({\n code: 'PSL_PRESET_NOT_LIST',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call as a list element type. Presets cannot be list elements; remove \"[]\" or use a scalar type.`,\n sourceId,\n span: field.span,\n });\n continue;\n }\n scalarCodecId = resolved.descriptor.codecId;\n descriptor = scalarTypeDescriptors.get('Json');\n } else {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n descriptor = resolved.descriptor;\n presetContributions = resolved.presetContributions;\n }\n\n if (!descriptor) {\n continue;\n }\n\n // Field presets are complete declarations: the preset names its own codec\n // and contributes any combination of default / executionDefaults / id /\n // unique. Optional and `@default(...)` modifiers contradict that, so they\n // are hard errors per spec FR7.\n if (presetContributions && field.optional) {\n diagnostics.push({\n code: 'PSL_PRESET_NOT_OPTIONAL',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot be optional. Remove \"?\" or use a different field type.`,\n sourceId,\n span: field.span,\n });\n continue;\n }\n\n const defaultAttribute = getAttribute(field.attributes, 'default');\n if (presetContributions && defaultAttribute) {\n diagnostics.push({\n code: 'PSL_PRESET_AND_DEFAULT_CONFLICT',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot also declare @default(...). The preset already specifies the default value.`,\n sourceId,\n span: defaultAttribute.span,\n });\n continue;\n }\n const loweredDefault = defaultAttribute\n ? lowerDefaultForField({\n modelName: model.name,\n fieldName: field.name,\n defaultAttribute,\n columnDescriptor: descriptor,\n generatorDescriptorById,\n sourceId,\n defaultFunctionRegistry,\n diagnostics,\n })\n : {};\n const loweredOnCreate = loweredDefault.executionDefaults?.onCreate;\n if (field.optional && loweredOnCreate) {\n const generatorDescription =\n loweredOnCreate.kind === 'generator' ? `\"${loweredOnCreate.id}\"` : 'for this field';\n diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" cannot be optional when using execution default ${generatorDescription}. Remove \"?\" or use a storage default.`,\n sourceId,\n span: defaultAttribute?.span ?? field.span,\n });\n continue;\n }\n if (loweredOnCreate) {\n const generatorDescriptor = generatorDescriptorById.get(loweredOnCreate.id);\n const generatedDescriptor = generatorDescriptor?.resolveGeneratedColumnDescriptor?.({\n generated: loweredOnCreate,\n });\n if (generatedDescriptor) {\n descriptor = generatedDescriptor;\n }\n }\n const mappedColumnName = mapping.fieldColumns.get(field.name) ?? field.name;\n const { idAttribute, uniqueAttribute, idName, uniqueName } = extractFieldConstraintNames({\n model,\n field,\n sourceId,\n diagnostics,\n });\n let isIdField = Boolean(idAttribute);\n if (idAttribute && field.optional) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" @id cannot be optional; primary key columns must be NOT NULL`,\n sourceId,\n span: idAttribute.span,\n });\n isIdField = false;\n }\n\n // Field presets contribute their own default / executionDefaults / id /\n // unique. They take precedence over attribute-derived contributions for\n // this field, since a preset *is* the field declaration. Conflicts with\n // `@default` and optional are already rejected above; explicit `@id`\n // would be redundant noise on the resolved field, so we surface it as\n // a hard error here for symmetry.\n if (presetContributions && idAttribute && !presetContributions.id) {\n diagnostics.push({\n code: 'PSL_PRESET_AND_ID_CONFLICT',\n message: `Field \"${model.name}.${field.name}\" uses a field-preset call and cannot also declare @id. Use a preset that contributes id semantics, or drop @id.`,\n sourceId,\n span: idAttribute.span,\n });\n continue;\n }\n\n // Field-preset contributions take precedence over attribute-derived\n // sources when present.\n const fieldExecutionDefaults =\n presetContributions?.executionDefaults ?? loweredDefault.executionDefaults;\n const fieldDefaultValue = presetContributions?.default ?? loweredDefault.defaultValue;\n resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...ifDefined('defaultValue', fieldDefaultValue),\n ...ifDefined('executionDefaults', fieldExecutionDefaults),\n isId: isIdField || Boolean(presetContributions?.id),\n isUnique: Boolean(uniqueAttribute) || Boolean(presetContributions?.unique),\n ...ifDefined('idName', idName),\n ...ifDefined('uniqueName', uniqueName),\n ...ifDefined('many', isListField ? (true as const) : undefined),\n ...ifDefined('valueObjectTypeName', isValueObjectField ? field.typeName : undefined),\n ...ifDefined('scalarCodecId', scalarCodecId),\n });\n }\n\n return resolvedFields;\n}\n\nexport function buildModelMappings(\n models: readonly PslModel[],\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n): Map<string, ModelNameMapping> {\n const result = new Map<string, ModelNameMapping>();\n for (const model of models) {\n const mapAttribute = getAttribute(model.attributes, 'map');\n const tableName = parseMapName({\n attribute: mapAttribute,\n defaultValue: lowerFirst(model.name),\n sourceId,\n diagnostics,\n entityLabel: `Model \"${model.name}\"`,\n span: model.span,\n });\n const fieldColumns = new Map<string, string>();\n for (const field of model.fields) {\n const fieldMapAttribute = getAttribute(field.attributes, 'map');\n const columnName = parseMapName({\n attribute: fieldMapAttribute,\n defaultValue: field.name,\n sourceId,\n diagnostics,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n span: field.span,\n });\n fieldColumns.set(field.name, columnName);\n }\n result.set(model.name, {\n model,\n tableName,\n fieldColumns,\n });\n }\n return result;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type { PslAttribute, PslField, PslSpan } from '@prisma-next/psl-parser';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport type { RelationNode } from '@prisma-next/sql-contract-ts/contract-builder';\nimport { assertDefined, invariant } from '@prisma-next/utils/assertions';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n getNamedArgument,\n getPositionalArgumentEntry,\n parseFieldList,\n parseQuotedStringLiteral,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { checkUncomposedNamespace, reportUncomposedNamespace } from './psl-column-resolution';\n\nexport const REFERENTIAL_ACTION_MAP = {\n NoAction: 'noAction',\n Restrict: 'restrict',\n Cascade: 'cascade',\n SetNull: 'setNull',\n SetDefault: 'setDefault',\n noAction: 'noAction',\n restrict: 'restrict',\n cascade: 'cascade',\n setNull: 'setNull',\n setDefault: 'setDefault',\n} as const;\n\nexport type ParsedRelationAttribute = {\n readonly relationName?: string;\n readonly fields?: readonly string[];\n readonly references?: readonly string[];\n readonly constraintName?: string;\n readonly onDelete?: string;\n readonly onUpdate?: string;\n};\n\nexport type FkRelationMetadata = {\n readonly declaringModelName: string;\n readonly declaringFieldName: string;\n readonly declaringTableName: string;\n readonly targetModelName: string;\n readonly targetTableName: string;\n readonly relationName?: string;\n readonly localColumns: readonly string[];\n readonly referencedColumns: readonly string[];\n};\n\nexport type ModelBackrelationCandidate = {\n readonly modelName: string;\n readonly tableName: string;\n readonly field: PslField;\n readonly targetModelName: string;\n readonly relationName?: string;\n};\n\ntype ModelRelationMetadata = RelationNode;\n\nexport function fkRelationPairKey(declaringModelName: string, targetModelName: string): string {\n // NOTE: We assume PSL model identifiers do not contain the `::` separator.\n return `${declaringModelName}::${targetModelName}`;\n}\n\nexport function normalizeReferentialAction(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly actionName: 'onDelete' | 'onUpdate';\n readonly actionToken: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ReferentialAction | undefined {\n const normalized =\n REFERENTIAL_ACTION_MAP[input.actionToken as keyof typeof REFERENTIAL_ACTION_MAP];\n if (normalized) {\n return normalized;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_REFERENTIAL_ACTION',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported ${input.actionName} action \"${input.actionToken}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseRelationAttribute(input: {\n readonly attribute: PslAttribute;\n readonly modelName: string;\n readonly fieldName: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ParsedRelationAttribute | undefined {\n const positionalEntries = input.attribute.args.filter((arg) => arg.kind === 'positional');\n if (positionalEntries.length > 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has too many positional arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let relationNameFromPositional: string | undefined;\n const positionalNameEntry = getPositionalArgumentEntry(input.attribute);\n if (positionalNameEntry) {\n const parsedName = parseQuotedStringLiteral(positionalNameEntry.value);\n if (!parsedName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" positional relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: positionalNameEntry.span,\n });\n return undefined;\n }\n relationNameFromPositional = parsedName;\n }\n\n for (const arg of input.attribute.args) {\n if (arg.kind === 'positional') {\n continue;\n }\n if (\n arg.name !== 'name' &&\n arg.name !== 'fields' &&\n arg.name !== 'references' &&\n arg.name !== 'map' &&\n arg.name !== 'onDelete' &&\n arg.name !== 'onUpdate'\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported argument \"${arg.name}\"`,\n sourceId: input.sourceId,\n span: arg.span,\n });\n return undefined;\n }\n }\n\n const namedRelationNameRaw = getNamedArgument(input.attribute, 'name');\n const namedRelationName = namedRelationNameRaw\n ? parseQuotedStringLiteral(namedRelationNameRaw)\n : undefined;\n if (namedRelationNameRaw && !namedRelationName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" named relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (\n relationNameFromPositional &&\n namedRelationName &&\n relationNameFromPositional !== namedRelationName\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has conflicting positional and named relation names`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const relationName = namedRelationName ?? relationNameFromPositional;\n\n const constraintNameRaw = getNamedArgument(input.attribute, 'map');\n const constraintName = constraintNameRaw\n ? parseQuotedStringLiteral(constraintNameRaw)\n : undefined;\n if (constraintNameRaw && !constraintName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n const fieldsRaw = getNamedArgument(input.attribute, 'fields');\n const referencesRaw = getNamedArgument(input.attribute, 'references');\n if ((fieldsRaw && !referencesRaw) || (!fieldsRaw && referencesRaw)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires fields and references arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let fields: readonly string[] | undefined;\n let references: readonly string[] | undefined;\n if (fieldsRaw && referencesRaw) {\n const parsedFields = parseFieldList(fieldsRaw);\n const parsedReferences = parseFieldList(referencesRaw);\n if (\n !parsedFields ||\n !parsedReferences ||\n parsedFields.length === 0 ||\n parsedReferences.length === 0\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires bracketed fields and references lists`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n fields = parsedFields;\n references = parsedReferences;\n }\n\n const onDeleteArgument = getNamedArgument(input.attribute, 'onDelete');\n const onUpdateArgument = getNamedArgument(input.attribute, 'onUpdate');\n\n return {\n ...ifDefined('relationName', relationName),\n ...ifDefined('fields', fields),\n ...ifDefined('references', references),\n ...ifDefined('constraintName', constraintName),\n ...ifDefined('onDelete', onDeleteArgument ? unquoteStringLiteral(onDeleteArgument) : undefined),\n ...ifDefined('onUpdate', onUpdateArgument ? unquoteStringLiteral(onUpdateArgument) : undefined),\n };\n}\n\nexport function indexFkRelations(input: {\n readonly fkRelationMetadata: readonly FkRelationMetadata[];\n}): {\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly fkRelationsByPair: Map<string, FkRelationMetadata[]>;\n} {\n const modelRelations = new Map<string, ModelRelationMetadata[]>();\n const fkRelationsByPair = new Map<string, FkRelationMetadata[]>();\n\n for (const relation of input.fkRelationMetadata) {\n const existing = modelRelations.get(relation.declaringModelName);\n const current = existing ?? [];\n if (!existing) {\n modelRelations.set(relation.declaringModelName, current);\n }\n current.push({\n fieldName: relation.declaringFieldName,\n toModel: relation.targetModelName,\n toTable: relation.targetTableName,\n cardinality: 'N:1',\n on: {\n parentTable: relation.declaringTableName,\n parentColumns: relation.localColumns,\n childTable: relation.targetTableName,\n childColumns: relation.referencedColumns,\n },\n });\n\n const pairKey = fkRelationPairKey(relation.declaringModelName, relation.targetModelName);\n const pairRelations = fkRelationsByPair.get(pairKey);\n if (!pairRelations) {\n fkRelationsByPair.set(pairKey, [relation]);\n continue;\n }\n pairRelations.push(relation);\n }\n\n return { modelRelations, fkRelationsByPair };\n}\n\nexport function applyBackrelationCandidates(input: {\n readonly backrelationCandidates: readonly ModelBackrelationCandidate[];\n readonly fkRelationsByPair: Map<string, readonly FkRelationMetadata[]>;\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}): void {\n for (const candidate of input.backrelationCandidates) {\n const pairKey = fkRelationPairKey(candidate.targetModelName, candidate.modelName);\n const pairMatches = input.fkRelationsByPair.get(pairKey) ?? [];\n const matches = candidate.relationName\n ? pairMatches.filter((relation) => relation.relationName === candidate.relationName)\n : [...pairMatches];\n\n if (matches.length === 0) {\n input.diagnostics.push({\n code: 'PSL_ORPHANED_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" has no matching FK-side relation on model \"${candidate.targetModelName}\". Add @relation(fields: [...], references: [...]) on the FK-side relation or use an explicit join model for many-to-many.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n if (matches.length > 1) {\n input.diagnostics.push({\n code: 'PSL_AMBIGUOUS_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" matches multiple FK-side relations on model \"${candidate.targetModelName}\". Add @relation(name: \"...\") (or @relation(\"...\")) to both sides to disambiguate.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n\n invariant(matches.length === 1, 'Backrelation matching requires exactly one match');\n const matched = matches[0];\n assertDefined(matched, 'Backrelation matching requires a defined relation match');\n\n const existing = input.modelRelations.get(candidate.modelName);\n const current = existing ?? [];\n if (!existing) {\n input.modelRelations.set(candidate.modelName, current);\n }\n current.push({\n fieldName: candidate.field.name,\n toModel: matched.declaringModelName,\n toTable: matched.declaringTableName,\n cardinality: '1:N',\n on: {\n parentTable: candidate.tableName,\n parentColumns: matched.referencedColumns,\n childTable: matched.declaringTableName,\n childColumns: matched.localColumns,\n },\n });\n }\n}\n\nexport function validateNavigationListFieldAttributes(input: {\n readonly modelName: string;\n readonly field: PslField;\n readonly sourceId: string;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly familyId: string;\n readonly targetId: string;\n}): boolean {\n let valid = true;\n for (const attribute of input.field.attributes) {\n if (attribute.name === 'relation') {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n valid = false;\n continue;\n }\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${input.modelName}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n valid = false;\n }\n return valid;\n}\n","import type {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport type {\n Contract,\n ContractField,\n ContractModel,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringTypeConstructor } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport type {\n ControlMutationDefaultRegistry,\n ControlMutationDefaults,\n MutationDefaultGeneratorDescriptor,\n} from '@prisma-next/framework-components/control';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslCompositeType,\n PslEnum,\n PslField,\n PslModel,\n PslNamedTypeDeclaration,\n} from '@prisma-next/psl-parser';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n buildSqlContractFromDefinition,\n type ForeignKeyNode,\n type IndexNode,\n type ModelNode,\n type PrimaryKeyNode,\n type UniqueConstraintNode,\n} from '@prisma-next/sql-contract-ts/contract-builder';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport {\n findDuplicateFieldName,\n getAttribute,\n getPositionalArgument,\n mapFieldNamesToColumns,\n parseAttributeFieldList,\n parseConstraintMapArgument,\n parseMapName,\n parseQuotedStringLiteral,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n getAuthoringTypeConstructor,\n instantiatePslTypeConstructor,\n reportUncomposedNamespace,\n resolveDbNativeTypeAttribute,\n resolveFieldTypeDescriptor,\n resolvePslTypeConstructorDescriptor,\n toNamedTypeFieldDescriptor,\n} from './psl-column-resolution';\nimport {\n buildModelMappings,\n collectResolvedFields,\n type ModelNameMapping,\n type ResolvedField,\n} from './psl-field-resolution';\nimport {\n applyBackrelationCandidates,\n type FkRelationMetadata,\n indexFkRelations,\n type ModelBackrelationCandidate,\n normalizeReferentialAction,\n parseRelationAttribute,\n validateNavigationListFieldAttributes,\n} from './psl-relation-resolution';\n\nexport interface InterpretPslDocumentToSqlContractInput {\n readonly document: ParsePslDocumentResult;\n readonly target: TargetPackRef<'sql', string>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', string>[];\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly authoringContributions?: AuthoringContributions;\n}\n\nfunction buildComposedExtensionPackRefs(\n target: TargetPackRef<'sql', string>,\n extensionIds: readonly string[],\n extensionPackRefs: readonly ExtensionPackRef<'sql', string>[] = [],\n): Record<string, ExtensionPackRef<'sql', string>> | undefined {\n if (extensionIds.length === 0) {\n return undefined;\n }\n\n const extensionPackRefById = new Map(extensionPackRefs.map((packRef) => [packRef.id, packRef]));\n\n return Object.fromEntries(\n extensionIds.map((extensionId) => [\n extensionId,\n extensionPackRefById.get(extensionId) ??\n ({\n kind: 'extension',\n id: extensionId,\n familyId: target.familyId,\n targetId: target.targetId,\n version: '0.0.1',\n } satisfies ExtensionPackRef<'sql', string>),\n ]),\n );\n}\n\nfunction diagnosticDedupKey(diagnostic: ContractSourceDiagnostic): string {\n const span = diagnostic.span;\n const spanKey = span\n ? `${span.start.offset}:${span.end.offset}:${span.start.line}:${span.end.line}`\n : '';\n return `${diagnostic.code}\\u0000${diagnostic.sourceId}\\u0000${spanKey}\\u0000${diagnostic.message}`;\n}\n\nfunction dedupeDiagnostics(\n diagnostics: readonly ContractSourceDiagnostic[],\n): ContractSourceDiagnostic[] {\n const seen = new Map<string, ContractSourceDiagnostic>();\n for (const diagnostic of diagnostics) {\n const key = diagnosticDedupKey(diagnostic);\n if (!seen.has(key)) {\n seen.set(key, diagnostic);\n }\n }\n return [...seen.values()];\n}\n\nfunction compareStrings(left: string, right: string): -1 | 0 | 1 {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction mapParserDiagnostics(document: ParsePslDocumentResult): ContractSourceDiagnostic[] {\n return document.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId: diagnostic.sourceId,\n span: diagnostic.span,\n }));\n}\n\ninterface ProcessEnumDeclarationsInput {\n readonly enums: readonly PslEnum[];\n readonly sourceId: string;\n readonly enumTypeConstructor: AuthoringTypeConstructorDescriptor | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction processEnumDeclarations(input: ProcessEnumDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const enumDeclaration of input.enums) {\n const nativeType = parseMapName({\n attribute: getAttribute(enumDeclaration.attributes, 'map'),\n defaultValue: enumDeclaration.name,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Enum \"${enumDeclaration.name}\"`,\n span: enumDeclaration.span,\n });\n const enumStorageType = input.enumTypeConstructor\n ? instantiateAuthoringTypeConstructor(input.enumTypeConstructor, [\n nativeType,\n enumDeclaration.values.map((value) => value.name),\n ])\n : {\n codecId: 'pg/enum@1',\n nativeType,\n typeParams: { values: enumDeclaration.values.map((value) => value.name) },\n };\n const descriptor: ColumnDescriptor = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n storageTypes[enumDeclaration.name] = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeParams: enumStorageType.typeParams ?? {\n values: enumDeclaration.values.map((value) => value.name),\n },\n };\n }\n\n return { storageTypes, enumTypeDescriptors };\n}\n\ninterface ResolveNamedTypeDeclarationsInput {\n readonly declarations: readonly PslNamedTypeDeclaration[];\n readonly sourceId: string;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction validateNamedTypeAttributes(input: {\n readonly declaration: PslNamedTypeDeclaration;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly composedExtensions: ReadonlySet<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly allowDbNativeType: boolean;\n readonly familyId: string;\n readonly targetId: string;\n}): {\n readonly dbNativeTypeAttribute: PslAttribute | undefined;\n readonly hasUnsupportedNamedTypeAttribute: boolean;\n} {\n const dbNativeTypeAttributes = input.allowDbNativeType\n ? input.declaration.attributes.filter((attribute) => attribute.name.startsWith('db.'))\n : [];\n const [dbNativeTypeAttribute, ...extraDbNativeTypeAttributes] = dbNativeTypeAttributes;\n let hasUnsupportedNamedTypeAttribute = false;\n\n for (const extra of extraDbNativeTypeAttributes) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Named type \"${input.declaration.name}\" can declare at most one @db.* attribute`,\n sourceId: input.sourceId,\n span: extra.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n for (const attribute of input.declaration.attributes) {\n if (input.allowDbNativeType && attribute.name.startsWith('db.')) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n hasUnsupportedNamedTypeAttribute = true;\n continue;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${input.declaration.name}\" uses unsupported attribute \"${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n return { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute };\n}\n\nfunction resolveNamedTypeDeclarations(input: ResolveNamedTypeDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const namedTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const declaration of input.declarations) {\n if (declaration.typeConstructor) {\n const { hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes({\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n allowDbNativeType: false,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n const helperPath = declaration.typeConstructor.path.join('.');\n const typeConstructor = resolvePslTypeConstructorDescriptor({\n call: declaration.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR',\n unsupportedMessage: `Named type \"${declaration.name}\" references unsupported constructor \"${helperPath}\"`,\n });\n if (!typeConstructor) {\n continue;\n }\n\n const storageType = instantiatePslTypeConstructor({\n call: declaration.typeConstructor,\n descriptor: typeConstructor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!storageType) {\n continue;\n }\n\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, storageType),\n );\n storageTypes[declaration.name] = {\n codecId: storageType.codecId,\n nativeType: storageType.nativeType,\n typeParams: storageType.typeParams ?? {},\n };\n continue;\n }\n\n // Parser invariant: when typeConstructor is absent, baseType is defined.\n // The check below narrows `baseType` for TypeScript and guards against a\n // parser regression; it is unreachable under a correct parser.\n if (declaration.baseType === undefined) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" must declare a base type or constructor`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n const { baseType } = declaration;\n const baseDescriptor =\n input.enumTypeDescriptors.get(baseType) ?? input.scalarTypeDescriptors.get(baseType);\n if (!baseDescriptor) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" references unsupported base type \"${baseType}\"`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n\n const { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes(\n {\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n allowDbNativeType: true,\n familyId: input.familyId,\n targetId: input.targetId,\n },\n );\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n if (dbNativeTypeAttribute) {\n const descriptor = resolveDbNativeTypeAttribute({\n attribute: dbNativeTypeAttribute,\n baseType,\n baseDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!descriptor) {\n continue;\n }\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, descriptor),\n );\n storageTypes[declaration.name] = {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeParams: descriptor.typeParams ?? {},\n };\n continue;\n }\n\n const descriptor = toNamedTypeFieldDescriptor(declaration.name, baseDescriptor);\n namedTypeDescriptors.set(declaration.name, descriptor);\n storageTypes[declaration.name] = {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeParams: {},\n };\n }\n\n return { storageTypes, namedTypeDescriptors };\n}\n\ninterface BuildModelNodeInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly modelMappings: ReadonlyMap<string, ModelNameMapping>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly composedExtensions: Set<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\ninterface BuildModelNodeResult {\n readonly modelNode: ModelNode;\n readonly fkRelationMetadata: FkRelationMetadata[];\n readonly backrelationCandidates: ModelBackrelationCandidate[];\n readonly resolvedFields: readonly ResolvedField[];\n}\n\nfunction buildModelNodeFromPsl(input: BuildModelNodeInput): BuildModelNodeResult {\n const { model, mapping, sourceId, diagnostics } = input;\n const tableName = mapping.tableName;\n\n const resolvedFields = collectResolvedFields({\n model,\n mapping,\n enumTypeDescriptors: input.enumTypeDescriptors,\n namedTypeDescriptors: input.namedTypeDescriptors,\n modelNames: input.modelNames,\n compositeTypeNames: input.compositeTypeNames,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n familyId: input.familyId,\n targetId: input.targetId,\n defaultFunctionRegistry: input.defaultFunctionRegistry,\n generatorDescriptorById: input.generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n });\n\n const inlineIdFields = resolvedFields.filter((field) => field.isId);\n if (inlineIdFields.length > 1) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" cannot declare inline @id on multiple fields; use model-level @@id([...]) for composite identity`,\n sourceId,\n span: model.span,\n });\n }\n const singleInlineIdField = inlineIdFields.length === 1 ? inlineIdFields[0] : undefined;\n let primaryKey: PrimaryKeyNode | undefined = singleInlineIdField\n ? {\n columns: [singleInlineIdField.columnName],\n ...ifDefined('name', singleInlineIdField.idName),\n }\n : undefined;\n const hasInlinePrimaryKey = primaryKey !== undefined;\n let blockPrimaryKeyDeclared = false;\n\n const resultBackrelationCandidates: ModelBackrelationCandidate[] = [];\n for (const field of model.fields) {\n if (!field.list || !input.modelNames.has(field.typeName)) {\n continue;\n }\n const attributesValid = validateNavigationListFieldAttributes({\n modelName: model.name,\n field,\n sourceId,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n diagnostics,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n const relationAttribute = getAttribute(field.attributes, 'relation');\n let relationName: string | undefined;\n if (relationAttribute) {\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute,\n modelName: model.name,\n fieldName: field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (parsedRelation.fields || parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare fields/references; define them on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n if (parsedRelation.onDelete || parsedRelation.onUpdate) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare onDelete/onUpdate; define referential actions on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n relationName = parsedRelation.relationName;\n }\n if (!attributesValid) {\n continue;\n }\n\n resultBackrelationCandidates.push({\n modelName: model.name,\n tableName,\n field,\n targetModelName: field.typeName,\n ...ifDefined('relationName', relationName),\n });\n }\n\n const relationAttributes = model.fields\n .map((field) => ({\n field,\n relation: getAttribute(field.attributes, 'relation'),\n }))\n .filter((entry): entry is { field: PslField; relation: PslAttribute } =>\n Boolean(entry.relation),\n );\n const uniqueConstraints: UniqueConstraintNode[] = resolvedFields\n .filter((field) => field.isUnique)\n .map((field) => ({\n columns: [field.columnName],\n ...ifDefined('name', field.uniqueName),\n }));\n const indexNodes: IndexNode[] = [];\n const foreignKeyNodes: ForeignKeyNode[] = [];\n\n for (const modelAttribute of model.attributes) {\n if (modelAttribute.name === 'map') {\n continue;\n }\n if (modelAttribute.name === 'discriminator' || modelAttribute.name === 'base') {\n continue;\n }\n const attributeLabel = `Model \"${model.name}\" @@${modelAttribute.name}`;\n if (modelAttribute.name === 'id') {\n if (blockPrimaryKeyDeclared) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" declares @@id more than once`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n if (hasInlinePrimaryKey) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" cannot declare both field-level @id and model-level @@id`,\n sourceId,\n span: modelAttribute.span,\n });\n blockPrimaryKeyDeclared = true;\n continue;\n }\n const fieldNames = parseAttributeFieldList({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n entityLabel: attributeLabel,\n });\n if (!fieldNames) {\n continue;\n }\n const duplicateFieldName = findDuplicateFieldName(fieldNames);\n if (duplicateFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} list contains duplicate field \"${duplicateFieldName}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const nullableFieldName = fieldNames.find(\n (name) => model.fields.find((f) => f.name === name)?.optional === true,\n );\n if (nullableFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} cannot include optional field \"${nullableFieldName}\"; primary key columns must be NOT NULL`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n entityLabel: attributeLabel,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: attributeLabel,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n primaryKey = {\n columns: columnNames,\n ...ifDefined('name', constraintName),\n };\n blockPrimaryKeyDeclared = true;\n continue;\n }\n if (modelAttribute.name === 'unique' || modelAttribute.name === 'index') {\n const fieldNames = parseAttributeFieldList({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n entityLabel: attributeLabel,\n });\n if (!fieldNames) {\n continue;\n }\n const duplicateFieldName = findDuplicateFieldName(fieldNames);\n if (duplicateFieldName !== undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${attributeLabel} list contains duplicate field \"${duplicateFieldName}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n entityLabel: attributeLabel,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: attributeLabel,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n if (modelAttribute.name === 'unique') {\n uniqueConstraints.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n } else {\n indexNodes.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n }\n continue;\n }\n const uncomposedNamespace = checkUncomposedNamespace(\n modelAttribute.name,\n input.composedExtensions,\n {\n familyId: input.familyId,\n targetId: input.targetId,\n authoringContributions: input.authoringContributions,\n },\n );\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@@${modelAttribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId,\n span: modelAttribute.span,\n diagnostics,\n });\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_MODEL_ATTRIBUTE',\n message: `Model \"${model.name}\" uses unsupported attribute \"@@${modelAttribute.name}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n }\n\n const resultFkRelationMetadata: FkRelationMetadata[] = [];\n for (const relationAttribute of relationAttributes) {\n if (relationAttribute.field.list) {\n continue;\n }\n\n if (!input.modelNames.has(relationAttribute.field.typeName)) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute.relation,\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (!parsedRelation.fields || !parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" requires fields and references arguments`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const targetMapping = input.modelMappings.get(relationAttribute.field.typeName);\n if (!targetMapping) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const localColumns = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames: parsedRelation.fields,\n mapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n entityLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!localColumns) {\n continue;\n }\n const referencedColumns = mapFieldNamesToColumns({\n modelName: targetMapping.model.name,\n fieldNames: parsedRelation.references,\n mapping: targetMapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n entityLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!referencedColumns) {\n continue;\n }\n if (localColumns.length !== referencedColumns.length) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" must provide the same number of fields and references`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const onDelete = parsedRelation.onDelete\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onDelete',\n actionToken: parsedRelation.onDelete,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n const onUpdate = parsedRelation.onUpdate\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onUpdate',\n actionToken: parsedRelation.onUpdate,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n\n foreignKeyNodes.push({\n columns: localColumns,\n references: {\n model: targetMapping.model.name,\n table: targetMapping.tableName,\n columns: referencedColumns,\n },\n ...ifDefined('name', parsedRelation.constraintName),\n ...ifDefined('onDelete', onDelete),\n ...ifDefined('onUpdate', onUpdate),\n });\n\n resultFkRelationMetadata.push({\n declaringModelName: model.name,\n declaringFieldName: relationAttribute.field.name,\n declaringTableName: tableName,\n targetModelName: targetMapping.model.name,\n targetTableName: targetMapping.tableName,\n ...ifDefined('relationName', parsedRelation.relationName),\n localColumns,\n referencedColumns,\n });\n }\n\n return {\n modelNode: {\n modelName: model.name,\n tableName,\n fields: resolvedFields.map((resolvedField) => ({\n fieldName: resolvedField.field.name,\n columnName: resolvedField.columnName,\n descriptor: resolvedField.descriptor,\n nullable: resolvedField.field.optional,\n ...ifDefined('default', resolvedField.defaultValue),\n ...ifDefined('executionDefaults', resolvedField.executionDefaults),\n })),\n ...ifDefined('id', primaryKey),\n ...(uniqueConstraints.length > 0 ? { uniques: uniqueConstraints } : {}),\n ...(indexNodes.length > 0 ? { indexes: indexNodes } : {}),\n ...(foreignKeyNodes.length > 0 ? { foreignKeys: foreignKeyNodes } : {}),\n },\n fkRelationMetadata: resultFkRelationMetadata,\n backrelationCandidates: resultBackrelationCandidates,\n resolvedFields,\n };\n}\n\ninterface BuildValueObjectsInput {\n readonly compositeTypes: readonly PslCompositeType[];\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}\n\nfunction buildValueObjects(input: BuildValueObjectsInput): Record<string, ContractValueObject> {\n const {\n compositeTypes,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n composedExtensions,\n familyId,\n targetId,\n authoringContributions,\n diagnostics,\n sourceId,\n } = input;\n const valueObjects: Record<string, ContractValueObject> = {};\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n\n for (const compositeType of compositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of compositeType.fields) {\n if (compositeTypeNames.has(field.typeName)) {\n const result: ContractField = {\n type: { kind: 'valueObject', name: field.typeName },\n nullable: field.optional,\n };\n fields[field.name] = field.list ? { ...result, many: true } : result;\n continue;\n }\n const resolved = resolveFieldTypeDescriptor({\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${compositeType.name}.${field.name}\"`,\n });\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${compositeType.name}.${field.name}\" type \"${field.typeName}\" is not supported`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n const scalarField: ContractField = {\n nullable: field.optional,\n type: { kind: 'scalar', codecId: resolved.descriptor.codecId },\n };\n fields[field.name] = field.list ? { ...scalarField, many: true } : scalarField;\n }\n valueObjects[compositeType.name] = { fields };\n }\n\n return valueObjects;\n}\n\nfunction patchModelDomainFields(\n models: Record<string, ContractModel>,\n modelResolvedFields: ReadonlyMap<string, readonly ResolvedField[]>,\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, resolvedFields] of modelResolvedFields) {\n const model = patched[modelName];\n if (!model) continue;\n\n let needsPatch = false;\n const patchedFields: Record<string, ContractField> = { ...model.fields };\n\n for (const rf of resolvedFields) {\n if (rf.valueObjectTypeName) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'valueObject', name: rf.valueObjectTypeName },\n ...(rf.many ? { many: true as const } : {}),\n };\n } else if (rf.many && rf.scalarCodecId) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'scalar', codecId: rf.scalarCodecId },\n many: true as const,\n };\n }\n }\n\n if (needsPatch) {\n patched = { ...patched, [modelName]: { ...model, fields: patchedFields } };\n }\n }\n\n return patched;\n}\n\ntype DiscriminatorDeclaration = {\n readonly fieldName: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\nfunction collectPolymorphismDeclarations(\n models: readonly PslModel[],\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): {\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n} {\n const discriminatorDeclarations = new Map<string, DiscriminatorDeclaration>();\n const baseDeclarations = new Map<string, BaseDeclaration>();\n\n for (const model of models) {\n for (const attr of model.attributes) {\n if (attr.name === 'discriminator') {\n const fieldName = getPositionalArgument(attr);\n if (!fieldName) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields.find((f) => f.name === fieldName);\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.name, { fieldName, span: attr.span });\n }\n\n if (attr.name === 'base') {\n const baseName = getPositionalArgument(attr, 0);\n const rawValue = getPositionalArgument(attr, 1);\n if (!baseName || !rawValue) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base requires two arguments: base model name and discriminator value`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const value = parseQuotedStringLiteral(rawValue);\n if (value === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n baseDeclarations.set(model.name, { baseName, value, span: attr.span });\n }\n }\n }\n\n return { discriminatorDeclarations, baseDeclarations };\n}\n\nfunction resolvePolymorphism(\n models: Record<string, ContractModel>,\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>,\n baseDeclarations: Map<string, BaseDeclaration>,\n modelNames: Set<string>,\n modelMappings: ReadonlyMap<string, ModelNameMapping>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, decl] of discriminatorDeclarations) {\n if (baseDeclarations.has(modelName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_AND_BASE',\n message: `Model \"${modelName}\" cannot have both @@discriminator and @@base`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const model = patched[modelName];\n if (!model) continue;\n\n if (!Object.hasOwn(model.fields, decl.fieldName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_FIELD_NOT_FOUND',\n message: `Discriminator field \"${decl.fieldName}\" is not a field on model \"${modelName}\"`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const variants: Record<string, { readonly value: string }> = {};\n const seenValues = new Map<string, string>();\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (baseDecl.baseName !== modelName) continue;\n\n const existingVariant = seenValues.get(baseDecl.value);\n if (existingVariant) {\n diagnostics.push({\n code: 'PSL_DUPLICATE_DISCRIMINATOR_VALUE',\n message: `Discriminator value \"${baseDecl.value}\" is used by both \"${existingVariant}\" and \"${variantName}\" on base model \"${modelName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n seenValues.set(baseDecl.value, variantName);\n variants[variantName] = { value: baseDecl.value };\n }\n\n if (Object.keys(variants).length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_DISCRIMINATOR',\n message: `Model \"${modelName}\" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n patched = {\n ...patched,\n [modelName]: { ...model, discriminator: { field: decl.fieldName }, variants },\n };\n }\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (!modelNames.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_BASE_TARGET_NOT_FOUND',\n message: `Model \"${variantName}\" @@base references non-existent model \"${baseDecl.baseName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (!discriminatorDeclarations.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BASE',\n message: `Model \"${variantName}\" declares @@base(${baseDecl.baseName}, ...) but \"${baseDecl.baseName}\" has no @@discriminator`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (discriminatorDeclarations.has(variantName)) {\n continue;\n }\n\n const variantModel = patched[variantName];\n if (!variantModel) continue;\n\n const baseMapping = modelMappings.get(baseDecl.baseName);\n const variantMapping = modelMappings.get(variantName);\n const hasExplicitMap =\n variantMapping?.model.attributes.some((attr) => attr.name === 'map') ?? false;\n const resolvedTable = hasExplicitMap ? variantMapping?.tableName : baseMapping?.tableName;\n\n patched = {\n ...patched,\n [variantName]: {\n ...variantModel,\n base: baseDecl.baseName,\n ...(resolvedTable ? { storage: { ...variantModel.storage, table: resolvedTable } } : {}),\n },\n };\n }\n\n return patched;\n}\n\nexport function interpretPslDocumentToSqlContract(\n input: InterpretPslDocumentToSqlContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const sourceId = input.document.ast.sourceId;\n if (!input.target) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_TARGET_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires an explicit target context from composition.',\n sourceId,\n },\n ],\n });\n }\n if (!input.scalarTypeDescriptors) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_SCALAR_TYPE_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires composed scalar type descriptors.',\n sourceId,\n },\n ],\n });\n }\n\n const diagnostics: ContractSourceDiagnostic[] = mapParserDiagnostics(input.document);\n const models = input.document.ast.models ?? [];\n const enums = input.document.ast.enums ?? [];\n const compositeTypes = input.document.ast.compositeTypes ?? [];\n const modelNames = new Set(models.map((model) => model.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n const composedExtensions = new Set(input.composedExtensionPacks ?? []);\n const defaultFunctionRegistry: ControlMutationDefaultRegistry =\n input.controlMutationDefaults?.defaultFunctionRegistry ?? new Map();\n const generatorDescriptors = input.controlMutationDefaults?.generatorDescriptors ?? [];\n const generatorDescriptorById = new Map<string, MutationDefaultGeneratorDescriptor>();\n for (const descriptor of generatorDescriptors) {\n generatorDescriptorById.set(descriptor.id, descriptor);\n }\n\n const enumResult = processEnumDeclarations({\n enums,\n sourceId,\n enumTypeConstructor: getAuthoringTypeConstructor(input.authoringContributions, ['enum']),\n diagnostics,\n });\n\n const namedTypeResult = resolveNamedTypeDeclarations({\n declarations: input.document.ast.types?.declarations ?? [],\n sourceId,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n });\n\n const storageTypes = { ...enumResult.storageTypes, ...namedTypeResult.storageTypes };\n\n const modelMappings = buildModelMappings(models, diagnostics, sourceId);\n const modelNodes: ModelNode[] = [];\n const fkRelationMetadata: FkRelationMetadata[] = [];\n const backrelationCandidates: ModelBackrelationCandidate[] = [];\n const modelResolvedFields = new Map<string, readonly ResolvedField[]>();\n\n for (const model of models) {\n const mapping = modelMappings.get(model.name);\n if (!mapping) {\n continue;\n }\n const result = buildModelNodeFromPsl({\n model,\n mapping,\n modelMappings,\n modelNames,\n compositeTypeNames,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n defaultFunctionRegistry,\n generatorDescriptorById,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n sourceId,\n diagnostics,\n });\n modelNodes.push(result.modelNode);\n fkRelationMetadata.push(...result.fkRelationMetadata);\n backrelationCandidates.push(...result.backrelationCandidates);\n modelResolvedFields.set(model.name, result.resolvedFields);\n }\n\n const { modelRelations, fkRelationsByPair } = indexFkRelations({ fkRelationMetadata });\n applyBackrelationCandidates({\n backrelationCandidates,\n fkRelationsByPair,\n modelRelations,\n diagnostics,\n sourceId,\n });\n\n const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(\n models,\n sourceId,\n diagnostics,\n );\n\n const valueObjects = buildValueObjects({\n compositeTypes,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n sourceId,\n });\n\n if (diagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: dedupeDiagnostics(diagnostics),\n });\n }\n\n const contract = buildSqlContractFromDefinition({\n target: input.target,\n ...ifDefined(\n 'extensionPacks',\n buildComposedExtensionPackRefs(\n input.target,\n [...composedExtensions].sort(compareStrings),\n input.composedExtensionPackRefs,\n ),\n ),\n ...(Object.keys(storageTypes).length > 0 ? { storageTypes } : {}),\n models: modelNodes.map((model) => ({\n ...model,\n ...(modelRelations.has(model.modelName)\n ? {\n relations: [...(modelRelations.get(model.modelName) ?? [])].sort((left, right) =>\n compareStrings(left.fieldName, right.fieldName),\n ),\n }\n : {}),\n })),\n });\n\n let patchedModels = patchModelDomainFields(\n contract.models as Record<string, ContractModel>,\n modelResolvedFields,\n );\n\n const polyDiagnostics: ContractSourceDiagnostic[] = [];\n patchedModels = resolvePolymorphism(\n patchedModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n modelMappings,\n sourceId,\n polyDiagnostics,\n );\n\n if (polyDiagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: polyDiagnostics,\n });\n }\n\n const variantModelNames = new Set(baseDeclarations.keys());\n const filteredRoots = Object.fromEntries(\n Object.entries(contract.roots).filter(([, modelName]) => !variantModelNames.has(modelName)),\n );\n\n const patchedContract: Contract = {\n ...contract,\n roots: filteredRoots,\n models: patchedModels,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n };\n\n return ok(patchedContract);\n}\n"],"mappings":"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"}
|