@prisma-next/sql-contract-psl 0.5.0-dev.66 → 0.5.0-dev.68

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/psl-column-resolution.ts","../src/interpreter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;KAuCY,gBAAA;;;;EAAA,SAAA,UAAgB,CAAA,EAIJ,MAJI,CAAA,MAIJ,EAAM,OAAA,CAAA,GAAA,SAAA;;;;UCoCb,sCAAA;EDxCL,SAAA,QAAA,ECyCS,sBDrCS;mBCsCX;kCACe,oBAAoB;;EAHrC,SAAA,yBAAA,CAAA,EAAA,SAK+B,gBALO,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA;EAClC,SAAA,uBAAA,CAAA,EAKgB,yBALhB;EACF,SAAA,sBAAA,CAAA,EAKiB,sBALjB;;AACe,iBAylClB,iCAAA,CAzlCkB,KAAA,EA0lCzB,sCA1lCyB,CAAA,EA2lC/B,MA3lC+B,CA2lCxB,QA3lCwB,EA2lCd,yBA3lCc,CAAA"}
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-g4FDWENY.mjs";
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$1 = Number(raw);
412
- if (!Number.isFinite(parsed$1)) return INVALID_AUTHORING_ARGUMENT;
408
+ const parsed = Number(raw);
409
+ if (!Number.isFinite(parsed)) return INVALID_AUTHORING_ARGUMENT;
413
410
  index += raw.length;
414
- return parsed$1;
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$1) => descriptor$1.name === argument.name);
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$1 = instantiatePslFieldPreset({
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$1) return {
802
+ if (!instantiated) return {
807
803
  ok: false,
808
804
  alreadyReported: true
809
805
  };
810
806
  const presetContributions = {
811
- nullable: instantiated$1.nullable,
812
- id: instantiated$1.id,
813
- unique: instantiated$1.unique,
814
- ...instantiated$1.default !== void 0 ? { default: instantiated$1.default } : {},
815
- ...instantiated$1.executionDefaults !== void 0 ? { executionDefaults: instantiated$1.executionDefaults } : {}
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$1.descriptor,
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$1 = typeDescriptor ?? resolvePslTypeConstructorDescriptor({
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$1) return {
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: descriptor$1,
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: hasUnsupportedNamedTypeAttribute$1 } = validateNamedTypeAttributes({
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$1) continue;
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$1 = resolveDbNativeTypeAttribute({
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$1) continue;
1841
- namedTypeDescriptors.set(declaration.name, toNamedTypeFieldDescriptor(declaration.name, descriptor$1));
1833
+ if (!descriptor) continue;
1834
+ namedTypeDescriptors.set(declaration.name, toNamedTypeFieldDescriptor(declaration.name, descriptor));
1842
1835
  storageTypes[declaration.name] = {
1843
- codecId: descriptor$1.codecId,
1844
- nativeType: descriptor$1.nativeType,
1845
- typeParams: descriptor$1.typeParams ?? {}
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
- //# sourceMappingURL=interpreter-g4FDWENY.mjs.map
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"sourcesContent":[],"mappings":";;;;UAUiB,qBAAA;;EAAA,SAAA,MAAA,EAEE,aAFmB,CAAA,KAEnB,EAAA,MAAA,CAAA;EAiBH,SAAA,yBAA4C,CAAA,EAAA,SAhBZ,gBAgBoC,CAAA,KAAc,EAAA,MAAA,CAAA,EAAA;;iBAAlF,cAAA,8BAA4C,wBAAwB"}
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-g4FDWENY.mjs";
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
@@ -1 +1 @@
1
- {"version":3,"file":"provider.mjs","names":["schema: string"],"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;AAClD,MAAK,MAAM,CAAC,UAAU,YAAY,uBAAuB;EACvD,MAAM,aAAa,YAAY,eAAe,QAAQ,GAAG;AACzD,MAAI,eAAe,OAAW;AAC9B,SAAO,IAAI,UAAU;GAAE;GAAS;GAAY,CAAC;;AAE/C,QAAO;;AAGT,SAAgB,eAAe,YAAoB,SAAgD;AACjG,QAAO;EACL,QAAQ;GACN,QAAQ,CAAC,WAAW;GACpB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,sBAAsB,QAAQ;AACrC,QAAI,uBAAuB,OACzB,OAAM,IAAI,MACR,mIACD;IAEH,IAAIA;AACJ,QAAI;AACF,cAAS,MAAM,SAAS,oBAAoB,QAAQ;aAC7C,OAAO;KACd,MAAM,UAAU,OAAO,MAAM;AAC7B,YAAO,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,OACL;KACD,GAAG,UACD,6BACA,QAAQ,2BAA2B,SAC/B,QAAQ,4BACR,OACL;KACD,yBAAyB,QAAQ;KAClC,CAAC;AACF,QAAI,CAAC,YAAY,GACf,QAAO;AAGT,WAAO,GAAG,YAAY,MAAM;;GAE/B;EACD,GAAG,UAAU,UAAU,QAAQ,OAAO;EACvC"}
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.66",
3
+ "version": "0.5.0-dev.68",
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.66",
11
- "@prisma-next/contract": "0.5.0-dev.66",
12
- "@prisma-next/framework-components": "0.5.0-dev.66",
13
- "@prisma-next/sql-contract-ts": "0.5.0-dev.66",
14
- "@prisma-next/utils": "0.5.0-dev.66",
15
- "@prisma-next/sql-contract": "0.5.0-dev.66",
16
- "@prisma-next/psl-parser": "0.5.0-dev.66"
10
+ "@prisma-next/config": "0.5.0-dev.68",
11
+ "@prisma-next/contract": "0.5.0-dev.68",
12
+ "@prisma-next/psl-parser": "0.5.0-dev.68",
13
+ "@prisma-next/framework-components": "0.5.0-dev.68",
14
+ "@prisma-next/sql-contract": "0.5.0-dev.68",
15
+ "@prisma-next/utils": "0.5.0-dev.68",
16
+ "@prisma-next/sql-contract-ts": "0.5.0-dev.68"
17
17
  },
18
18
  "devDependencies": {
19
- "tsdown": "0.18.4",
19
+ "tsdown": "0.22.0",
20
20
  "typescript": "5.9.3",
21
- "vitest": "4.0.17",
22
- "@prisma-next/contract-authoring": "0.5.0-dev.66",
21
+ "vitest": "4.1.5",
23
22
  "@prisma-next/tsconfig": "0.0.0",
24
- "@prisma-next/test-utils": "0.0.1",
25
- "@prisma-next/tsdown": "0.0.0"
23
+ "@prisma-next/contract-authoring": "0.5.0-dev.68",
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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"}