@prisma-next/sql-contract-psl 0.11.0-dev.4 → 0.11.0-dev.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpreter-fVwMptxi.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\n/**\n * Parses a PSL object-literal attribute argument value of the form\n * `{ key1: \"value1\", key2: \"value2\" }` into a `Record<string, string>`.\n *\n * V1 admits string literals only as leaf values. Boolean and number\n * literals are rejected. Trailing commas are allowed.\n *\n * Returns the parsed record, or pushes a diagnostic and returns undefined\n * on malformed input or non-string leaves.\n */\nexport function parseObjectLiteralStringMap(input: {\n readonly raw: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly entityLabel: string;\n}): Record<string, string> | undefined {\n const trimmed = input.raw.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n message: `${input.entityLabel} expected an object literal value of the form { key: \"value\", ... }`,\n });\n }\n const body = trimmed.slice(1, -1).trim();\n if (body.length === 0) {\n return {};\n }\n const result: Record<string, string> = {};\n for (const part of splitObjectLiteralEntries(body)) {\n const colonAt = findTopLevelColon(part);\n if (colonAt === -1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n message: `${input.entityLabel} object-literal entry \"${part}\" is missing a \"key: value\" colon`,\n });\n }\n const key = part.slice(0, colonAt).trim();\n const rawValue = part.slice(colonAt + 1).trim();\n if (key.length === 0 || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n message: `${input.entityLabel} object-literal key \"${key}\" must be a bare identifier`,\n });\n }\n const parsedString = parseQuotedStringLiteral(rawValue);\n if (parsedString === undefined) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n message: `${input.entityLabel} object-literal value for \"${key}\" must be a quoted string literal (V1 PSL @@index options support string leaves only; use the TS authoring surface for non-string options)`,\n });\n }\n if (Object.hasOwn(result, key)) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n message: `${input.entityLabel} object-literal key \"${key}\" appears more than once`,\n });\n }\n result[key] = parsedString;\n }\n return result;\n}\n\nfunction splitObjectLiteralEntries(body: string): readonly string[] {\n const parts: string[] = [];\n let depthBrace = 0;\n let depthBracket = 0;\n let depthParen = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n for (let index = 0; index < body.length; index += 1) {\n const ch = body[index] ?? '';\n if (quote) {\n if (ch === quote && body[index - 1] !== '\\\\') {\n quote = null;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === '{') depthBrace += 1;\n else if (ch === '}') depthBrace = Math.max(0, depthBrace - 1);\n else if (ch === '[') depthBracket += 1;\n else if (ch === ']') depthBracket = Math.max(0, depthBracket - 1);\n else if (ch === '(') depthParen += 1;\n else if (ch === ')') depthParen = Math.max(0, depthParen - 1);\n else if (ch === ',' && depthBrace === 0 && depthBracket === 0 && depthParen === 0) {\n const segment = body.slice(start, index).trim();\n if (segment.length > 0) parts.push(segment);\n start = index + 1;\n }\n }\n const tail = body.slice(start).trim();\n if (tail.length > 0) parts.push(tail);\n return parts;\n}\n\nfunction findTopLevelColon(entry: string): number {\n let quote: '\"' | \"'\" | null = null;\n for (let index = 0; index < entry.length; index += 1) {\n const ch = entry[index] ?? '';\n if (quote) {\n if (ch === quote && entry[index - 1] !== '\\\\') quote = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === ':') return index;\n }\n return -1;\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 'boolean': {\n const trimmed = rawValue.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n return INVALID_AUTHORING_ARGUMENT;\n }\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 AuthoringEntityTypeDescriptor,\n AuthoringFieldPresetDescriptor,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n hasRegisteredFieldNamespace,\n instantiateAuthoringFieldPreset,\n instantiateAuthoringTypeConstructor,\n isAuthoringEntityTypeDescriptor,\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.entityTypes` segment-by-segment and returns\n * the entity type descriptor at the resolved path, or `undefined` if no\n * descriptor is registered.\n *\n * Used by the PSL interpreter to dispatch declarative entity-shaped\n * declarations (`enum`, future `namespace { … }`, …) through the\n * pack entity-type mechanism — the descriptor's `factory` (or\n * `template`) materialises the IR-class instance without the\n * interpreter knowing target-specific construction.\n */\nexport function getAuthoringEntity(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringEntityTypeDescriptor | undefined {\n let current: unknown = contributions?.entityTypes;\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 isAuthoringEntityTypeDescriptor(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 AuthoringEntityContext,\n AuthoringEntityTypeDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringEntityType } 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 { Namespace } from '@prisma-next/framework-components/ir';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslCompositeType,\n PslEnum,\n PslField,\n PslModel,\n PslNamedTypeDeclaration,\n PslNamespace,\n} from '@prisma-next/psl-parser';\nimport {\n isPostgresEnumStorageEntry,\n type PostgresEnumStorageEntry,\n type SqlNamespaceTablesInput,\n type StorageTypeInstance,\n} 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 getNamedArgument,\n getPositionalArgument,\n mapFieldNamesToColumns,\n parseAttributeFieldList,\n parseConstraintMapArgument,\n parseMapName,\n parseObjectLiteralStringMap,\n parseQuotedStringLiteral,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n getAuthoringEntity,\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 * Target-supplied `Namespace` factory threaded into\n * `buildSqlContractFromDefinition` for the contract's\n * `SqlStorage.namespaces` population. Required when the document\n * contains any explicit `namespace { … }` block on Postgres; the\n * single-namespace path (top-level declarations only) stays valid\n * without the factory and falls back to the family\n * `SqlUnboundNamespace` singleton.\n */\n readonly createNamespace?: (input: SqlNamespaceTablesInput) => Namespace;\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\n/**\n * Name of the framework-parser synthesised bucket for top-level\n * declarations. Re-declared here so the per-target dispatch does not\n * have to import from `@prisma-next/framework-components/psl-ast`\n * (which would cross a layer that the interpreter does not otherwise\n * import from). The value is part of the framework parser's contract;\n * if it changes there, the matching test in this package's\n * `interpreter.diagnostics.test.ts` flips first.\n */\nconst UNSPECIFIED_PSL_NAMESPACE_NAME = '__unspecified__';\n\n/**\n * Per-target namespace-block validation: walk the AST's namespace buckets and\n * emit diagnostics for syntactic constructs the target does not accept.\n *\n * - **SQLite** has no schema concept and rejects every explicit\n * `namespace { … }` block. The implicit `__unspecified__` bucket\n * (produced by the parser for top-level declarations outside any\n * block) is the only namespace SQLite accepts.\n * - **Postgres** accepts every explicit block — `namespace unbound { … }`\n * is the late-binding opt-in (lowers to the IR `__unbound__` slot in\n * a follow-on commit), `namespace public { … }` reopen-merges with\n * the implicit bucket, and any other name lowers to a named schema.\n *\n * Storage-side lowering of these buckets to IR namespace slots is not\n * yet wired; this helper closes only the diagnostic surface.\n */\n/**\n * Per-target namespace lowering: map a PSL AST namespace bucket name to the\n * resolved IR namespace id (the key downstream consumers use against\n * `SqlStorage.namespaces`).\n *\n * - **Postgres**: an explicit `namespace unbound { … }` block lowers\n * to the framework sentinel `__unbound__` — the slot whose binding\n * the connection's `search_path` resolves at runtime. Every other\n * explicit bucket name (e.g. `auth`, `public`) passes through as a\n * named schema id. The implicit `__unspecified__` bucket — top-level\n * declarations outside any `namespace { … }` block — leaves the\n * coordinate unset; downstream consumers treat unset as the\n * late-bound default, and TS / PSL authoring stay byte-identical\n * on single-namespace contracts. (A future round will add a\n * target-default-namespace surface so `__unspecified__` lowers to\n * `public` consistently on both authoring paths.)\n * - **SQLite**: SQLite has no schema concept; every namespace\n * collapses to the late-bound default. The namespace-block\n * validation step (above) has already rejected any explicit\n * `namespace { … }` block on SQLite, so the only bucket the\n * lowering ever sees there is `__unspecified__`.\n *\n * Returns `undefined` for targets / bucket names with no explicit\n * namespaceId to assign — callers leave the model's `namespaceId`\n * slot empty (which means the late-bound default at the `StorageTable`\n * layer; emitted JSON omits the field).\n */\nfunction resolveNamespaceIdForSqlTarget(input: {\n readonly bucketName: string;\n readonly targetId: string;\n}): string | undefined {\n if (input.targetId !== 'postgres') {\n return undefined;\n }\n if (input.bucketName === UNSPECIFIED_PSL_NAMESPACE_NAME) {\n return undefined;\n }\n if (input.bucketName === 'unbound') {\n return '__unbound__';\n }\n return input.bucketName;\n}\n\nfunction validateNamespaceBlocksForSqlTarget(input: {\n readonly namespaces: readonly PslNamespace[];\n readonly targetId: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n if (input.targetId === 'sqlite') {\n for (const namespace of input.namespaces) {\n if (namespace.name === UNSPECIFIED_PSL_NAMESPACE_NAME) {\n continue;\n }\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMESPACE_BLOCK',\n message: `SQLite does not support \\`namespace ${namespace.name} { … }\\` blocks (SQLite has no schema concept; declare models at the document top level instead).`,\n sourceId: input.sourceId,\n span: namespace.span,\n });\n }\n return;\n }\n\n if (input.targetId === 'postgres') {\n const namedBlocks = input.namespaces.filter((ns) => ns.name !== UNSPECIFIED_PSL_NAMESPACE_NAME);\n const hasUnbound = namedBlocks.some((ns) => ns.name === 'unbound');\n const hasSibling = namedBlocks.some((ns) => ns.name !== 'unbound');\n if (hasUnbound && hasSibling) {\n const unboundBlock = namedBlocks.find((ns) => ns.name === 'unbound');\n input.diagnostics.push({\n code: 'PSL_RESERVED_NAMESPACE_NAME',\n message:\n 'Namespace \"unbound\" is reserved for the late-binding sentinel mapping and cannot appear alongside other named namespace blocks. ' +\n 'Use `namespace unbound { … }` alone (no sibling named namespaces) for late-binding multi-tenant contracts.',\n sourceId: input.sourceId,\n ...ifDefined('span', unboundBlock?.span),\n });\n }\n }\n}\n\ninterface ProcessEnumDeclarationsInput {\n readonly enums: readonly PslEnum[];\n readonly sourceId: string;\n readonly enumEntityDescriptor: AuthoringEntityTypeDescriptor | undefined;\n readonly entityContext: AuthoringEntityContext;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction processEnumDeclarations(input: ProcessEnumDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry> = {};\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n if (input.enums.length === 0) {\n return { storageTypes, enumTypeDescriptors };\n }\n\n if (!input.enumEntityDescriptor) {\n // The PSL `enum X { … }` syntax only resolves when the active\n // pack composition contributes an `enum` entity-type factory (the\n // Postgres target pack does so today via\n // `authoring.entityTypes.enum`). Without the contribution we\n // surface a diagnostic per declaration rather than silently\n // swallowing the syntax.\n for (const enumDeclaration of input.enums) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Enum \"${enumDeclaration.name}\" requires the active target pack to contribute an enum entity-type helper`,\n sourceId: input.sourceId,\n span: enumDeclaration.span,\n });\n }\n return { storageTypes, enumTypeDescriptors };\n }\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 values = enumDeclaration.values.map((value) => value.name);\n const constructed = instantiateAuthoringEntityType(\n 'enum',\n input.enumEntityDescriptor,\n [{ name: enumDeclaration.name, nativeType, values }],\n input.entityContext,\n );\n if (!isPostgresEnumStorageEntry(constructed)) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Enum \"${enumDeclaration.name}\": enum entity-type factory must return a PostgresEnumStorageEntry-shaped value (kind: 'postgres-enum')`,\n sourceId: input.sourceId,\n span: enumDeclaration.span,\n });\n continue;\n }\n const descriptor: ColumnDescriptor = {\n codecId: constructed.codecId,\n nativeType: constructed.nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n storageTypes[enumDeclaration.name] = constructed;\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 | PostgresEnumStorageEntry>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance | PostgresEnumStorageEntry> = {};\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 kind: 'codec-instance',\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 kind: 'codec-instance',\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 kind: 'codec-instance',\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 /** Resolved namespace id keyed by model name — used to stamp the target namespace on FKs. */\n readonly modelNamespaceIds: ReadonlyMap<string, string>;\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 const indexEntityLabel = `Model \"${model.name}\" @@index`;\n const rawTypeArg = getNamedArgument(modelAttribute, 'type');\n let indexType: string | undefined;\n if (rawTypeArg !== undefined) {\n const parsed = parseQuotedStringLiteral(rawTypeArg);\n if (parsed === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${indexEntityLabel} type argument must be a quoted string literal`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n indexType = parsed;\n }\n const rawOptionsArg = getNamedArgument(modelAttribute, 'options');\n let indexOptions: Record<string, string> | undefined;\n if (rawOptionsArg !== undefined) {\n if (indexType === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${indexEntityLabel} options argument requires a type argument`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n const parsed = parseObjectLiteralStringMap({\n raw: rawOptionsArg,\n diagnostics,\n sourceId,\n span: modelAttribute.span,\n entityLabel: indexEntityLabel,\n });\n if (parsed === undefined) {\n continue;\n }\n indexOptions = parsed;\n }\n indexNodes.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n ...ifDefined('type', indexType),\n ...ifDefined('options', indexOptions),\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 const { typeName: fieldTypeName, typeNamespaceId: fieldTypeNamespaceId } =\n relationAttribute.field;\n const qualifiedTypeName = fieldTypeNamespaceId\n ? `${fieldTypeNamespaceId}.${fieldTypeName}`\n : fieldTypeName;\n\n if (!input.modelNames.has(fieldTypeName)) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${qualifiedTypeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n if (fieldTypeNamespaceId !== undefined) {\n const resolvedTargetNamespaceId = input.modelNamespaceIds.get(fieldTypeName);\n const normalizedQualifier =\n fieldTypeNamespaceId === 'unbound' ? '__unbound__' : fieldTypeNamespaceId;\n if (resolvedTargetNamespaceId !== normalizedQualifier) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${qualifiedTypeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\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(fieldTypeName);\n if (!targetMapping) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${qualifiedTypeName}\"`,\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 const targetNamespaceId = input.modelNamespaceIds.get(targetMapping.model.name);\n foreignKeyNodes.push({\n columns: localColumns,\n references: {\n model: targetMapping.model.name,\n table: targetMapping.tableName,\n columns: referencedColumns,\n ...ifDefined('namespaceId', targetNamespaceId),\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 validateNamespaceBlocksForSqlTarget({\n namespaces: input.document.ast.namespaces,\n targetId: input.target.targetId,\n sourceId,\n diagnostics,\n });\n // Per-target namespace resolution: walk each AST bucket once,\n // recording every model's resolved `namespaceId` for later threading\n // into the `ModelNode` build. The resolution rules are target-local\n // (see `resolveNamespaceIdForSqlTarget`); the flattened model list\n // remains the input to the rest of the interpreter so non-namespace\n // concerns stay structurally identical to before.\n const models: PslModel[] = [];\n const modelNamespaceIds = new Map<string, string>();\n for (const namespace of input.document.ast.namespaces) {\n const resolvedNamespaceId = resolveNamespaceIdForSqlTarget({\n bucketName: namespace.name,\n targetId: input.target.targetId,\n });\n for (const model of namespace.models) {\n models.push(model);\n if (resolvedNamespaceId !== undefined) {\n modelNamespaceIds.set(model.name, resolvedNamespaceId);\n }\n }\n }\n // Top-level enums (the __unspecified__ bucket) route to `storageTypes`;\n // enums inside a named namespace block route to `namespaceTypes[nsId]`.\n const topLevelEnums = input.document.ast.namespaces\n .filter((ns) => ns.name === UNSPECIFIED_PSL_NAMESPACE_NAME)\n .flatMap((ns) => ns.enums);\n const namedNamespaceEnumsByNsId = new Map<string, readonly PslEnum[]>();\n for (const ns of input.document.ast.namespaces) {\n if (ns.name === UNSPECIFIED_PSL_NAMESPACE_NAME || ns.enums.length === 0) {\n continue;\n }\n const resolvedId = resolveNamespaceIdForSqlTarget({\n bucketName: ns.name,\n targetId: input.target.targetId,\n });\n if (resolvedId === undefined) {\n continue;\n }\n // Read-then-merge so that any future change to the PSL parser (or to\n // `resolveNamespaceIdForSqlTarget`) that produces two AST entries\n // resolving to the same `resolvedId` would accumulate their enums\n // rather than silently dropping the earlier set. Today the parser\n // already merges duplicate `namespace <name> { … }` blocks into a\n // single AST entry per name, so this loop sees one `ns` per\n // resolvedId and the merge degrades to a plain set.\n const existing = namedNamespaceEnumsByNsId.get(resolvedId) ?? [];\n namedNamespaceEnumsByNsId.set(resolvedId, [...existing, ...ns.enums]);\n }\n\n const compositeTypes = input.document.ast.namespaces.flatMap((ns) => ns.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 enumEntityDescriptor = getAuthoringEntity(input.authoringContributions, ['enum']);\n const enumEntityContext = {\n family: input.target.familyId,\n target: input.target.targetId,\n };\n\n const enumResult = processEnumDeclarations({\n enums: topLevelEnums,\n sourceId,\n enumEntityDescriptor,\n entityContext: enumEntityContext,\n diagnostics,\n });\n\n // Process enums declared in named namespace blocks and collect them into\n // `namespaceTypes` keyed by the resolved namespace id.\n const allEnumTypeDescriptors = new Map(enumResult.enumTypeDescriptors);\n const namespaceEnumStorageTypes: Record<string, Record<string, PostgresEnumStorageEntry>> = {};\n for (const [nsId, nsEnums] of namedNamespaceEnumsByNsId) {\n const nsEnumResult = processEnumDeclarations({\n enums: nsEnums,\n sourceId,\n enumEntityDescriptor,\n entityContext: enumEntityContext,\n diagnostics,\n });\n for (const [name, descriptor] of nsEnumResult.enumTypeDescriptors) {\n allEnumTypeDescriptors.set(name, descriptor);\n }\n const nsEntries: Record<string, PostgresEnumStorageEntry> = {};\n for (const [name, entry] of Object.entries(nsEnumResult.storageTypes)) {\n if (isPostgresEnumStorageEntry(entry)) {\n nsEntries[name] = entry;\n }\n }\n if (Object.keys(nsEntries).length > 0) {\n namespaceEnumStorageTypes[nsId] = nsEntries;\n }\n }\n\n const namedTypeResult = resolveNamedTypeDeclarations({\n declarations: input.document.ast.types?.declarations ?? [],\n sourceId,\n enumTypeDescriptors: allEnumTypeDescriptors,\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: allEnumTypeDescriptors,\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 modelNamespaceIds,\n });\n const resolvedNamespaceId = modelNamespaceIds.get(model.name);\n modelNodes.push(\n resolvedNamespaceId !== undefined\n ? { ...result.modelNode, namespaceId: resolvedNamespaceId }\n : result.modelNode,\n );\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: allEnumTypeDescriptors,\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 ...(Object.keys(namespaceEnumStorageTypes).length > 0\n ? { namespaceTypes: namespaceEnumStorageTypes }\n : {}),\n ...ifDefined('createNamespace', input.createNamespace),\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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"}