@prisma-next/sql-contract-psl 0.3.0-dev.128 → 0.3.0-dev.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -6
- package/dist/index.d.mts +12 -7
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{interpreter-D7gLmaHz.mjs → interpreter-qjtea3zY.mjs} +1238 -824
- package/dist/interpreter-qjtea3zY.mjs.map +1 -0
- package/dist/provider.d.mts +4 -1
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +5 -3
- package/dist/provider.mjs.map +1 -1
- package/package.json +9 -6
- package/src/exports/index.ts +2 -2
- package/src/interpreter.ts +978 -1731
- package/src/provider.ts +11 -3
- package/src/psl-attribute-parsing.ts +303 -0
- package/src/psl-column-resolution.ts +404 -0
- package/src/psl-field-resolution.ts +312 -0
- package/src/psl-relation-resolution.ts +362 -0
- package/dist/interpreter-D7gLmaHz.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter-qjtea3zY.mjs","names":["columns: string[]","parts: Array<{ raw: string; start: number; end: number }>","quote: '\"' | \"'\" | null","args: DefaultFunctionArgument[]","current: unknown","NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>>","resolvedFields: ResolvedField[]","descriptor: ColumnDescriptor | undefined","scalarCodecId: string | undefined","relationNameFromPositional: string | undefined","fields: readonly string[] | undefined","references: readonly string[] | undefined","storageTypes: Record<string, StorageTypeInstance>","descriptor: ColumnDescriptor","descriptor","resultBackrelationCandidates: ModelBackrelationCandidate[]","relationName: string | undefined","uniqueConstraints: UniqueConstraintNode[]","indexNodes: IndexNode[]","foreignKeyNodes: ForeignKeyNode[]","resultFkRelationMetadata: FkRelationMetadata[]","valueObjects: Record<string, ContractValueObject>","fields: Record<string, ContractField>","result: ContractField","patchedFields: Record<string, ContractField>","variants: Record<string, { readonly value: string }>","diagnostics: ContractSourceDiagnostic[]","modelNodes: ModelNode[]","fkRelationMetadata: FkRelationMetadata[]","backrelationCandidates: ModelBackrelationCandidate[]","polyDiagnostics: ContractSourceDiagnostic[]"],"sources":["../src/psl-attribute-parsing.ts","../src/default-function-registry.ts","../src/psl-column-resolution.ts","../src/psl-field-resolution.ts","../src/psl-relation-resolution.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { PslAttribute, PslSpan } from '@prisma-next/psl-parser';\nimport { getPositionalArgument, parseQuotedStringLiteral } from '@prisma-next/psl-parser';\n\nexport { getPositionalArgument, parseQuotedStringLiteral };\n\nexport function lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nexport function getAttribute(\n attributes: readonly PslAttribute[] | undefined,\n name: string,\n): PslAttribute | undefined {\n return attributes?.find((attribute) => attribute.name === name);\n}\n\nexport function getNamedArgument(attribute: PslAttribute, name: string): string | undefined {\n const entry = attribute.args.find((arg) => arg.kind === 'named' && arg.name === name);\n if (!entry || entry.kind !== 'named') {\n return undefined;\n }\n return entry.value;\n}\n\nexport function getPositionalArgumentEntry(\n attribute: PslAttribute,\n index = 0,\n): { value: string; span: PslSpan } | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n const entry = entries[index];\n if (!entry || entry.kind !== 'positional') {\n return undefined;\n }\n return {\n value: entry.value,\n span: entry.span,\n };\n}\n\nexport function unquoteStringLiteral(value: string): string {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) {\n return trimmed;\n }\n return match[2] ?? '';\n}\n\nexport function parseFieldList(value: string): readonly string[] | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n return undefined;\n }\n const body = trimmed.slice(1, -1);\n const parts = body\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n return parts;\n}\n\nexport function parseMapName(input: {\n readonly attribute: PslAttribute | undefined;\n readonly defaultValue: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n}): string {\n if (!input.attribute) {\n return input.defaultValue;\n }\n\n const value = getPositionalArgument(input.attribute);\n if (!value) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n const parsed = parseQuotedStringLiteral(value);\n if (parsed === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n return parsed;\n}\n\nexport function parseConstraintMapArgument(input: {\n readonly attribute: PslAttribute | undefined;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n readonly code: string;\n}): string | undefined {\n if (!input.attribute) {\n return undefined;\n }\n\n const raw = getNamedArgument(input.attribute, 'map');\n if (!raw) {\n return undefined;\n }\n\n const parsed = parseQuotedStringLiteral(raw);\n if (parsed !== undefined) {\n return parsed;\n }\n\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function getPositionalArguments(attribute: PslAttribute): readonly string[] {\n return attribute.args\n .filter((arg) => arg.kind === 'positional')\n .map((arg) => (arg.kind === 'positional' ? arg.value : ''));\n}\n\nexport function pushInvalidAttributeArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseOptionalSingleIntegerArgument(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n readonly minimum: number;\n readonly valueLabel: string;\n}): number | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const parsed = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(parsed) || parsed < input.minimum) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a ${input.valueLabel}.`,\n });\n }\n\n return parsed;\n}\n\nexport function parseOptionalNumericArguments(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): { precision: number; scale?: number } | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 2) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const precision = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(precision) || precision < 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a positive integer precision.`,\n });\n }\n\n if (positionalArguments.length === 1) {\n return { precision };\n }\n\n const scale = Number(unquoteStringLiteral(positionalArguments[1] ?? ''));\n if (!Number.isInteger(scale) || scale < 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a non-negative integer scale.`,\n });\n }\n\n return { precision, scale };\n}\n\nexport function parseAttributeFieldList(input: {\n readonly attribute: PslAttribute;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly code: string;\n readonly messagePrefix: 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.messagePrefix} 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.messagePrefix} 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 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 contextLabel: 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.contextLabel} 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 { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { PslSpan } from '@prisma-next/psl-parser';\n\ninterface DefaultFunctionArgument {\n readonly raw: string;\n readonly span: PslSpan;\n}\n\nexport interface ParsedDefaultFunctionCall {\n readonly name: string;\n readonly raw: string;\n readonly args: readonly DefaultFunctionArgument[];\n readonly span: PslSpan;\n}\n\nexport interface DefaultFunctionLoweringContext {\n readonly sourceId: string;\n readonly modelName: string;\n readonly fieldName: string;\n readonly columnCodecId?: string;\n}\n\nexport type LoweredDefaultValue =\n | { readonly kind: 'storage'; readonly defaultValue: ColumnDefault }\n | { readonly kind: 'execution'; readonly generated: ExecutionMutationDefaultValue };\n\nexport type LoweredDefaultResult =\n | { readonly ok: true; readonly value: LoweredDefaultValue }\n | { readonly ok: false; readonly diagnostic: ContractSourceDiagnostic };\n\nexport type DefaultFunctionLoweringHandler = (input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}) => LoweredDefaultResult;\n\nexport interface DefaultFunctionRegistryEntry {\n readonly lower: DefaultFunctionLoweringHandler;\n readonly usageSignatures?: readonly string[];\n}\n\nexport type DefaultFunctionRegistry = ReadonlyMap<string, DefaultFunctionRegistryEntry>;\n\nexport interface MutationDefaultGeneratorDescriptor {\n readonly id: string;\n readonly applicableCodecIds: readonly string[];\n readonly resolveGeneratedColumnDescriptor?: (input: {\n readonly generated: ExecutionMutationDefaultValue;\n }) =>\n | {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n }\n | undefined;\n}\n\nexport interface ControlMutationDefaultEntry {\n readonly lower: (input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n }) => LoweredDefaultResult;\n readonly usageSignatures?: readonly string[];\n}\n\nexport type ControlMutationDefaultRegistry = ReadonlyMap<string, ControlMutationDefaultEntry>;\n\nexport interface ControlMutationDefaults {\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptors: readonly MutationDefaultGeneratorDescriptor[];\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 { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { isAuthoringTypeConstructorDescriptor } from '@prisma-next/framework-components/authoring';\nimport type { PslAttribute, PslField } from '@prisma-next/psl-parser';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n lowerDefaultFunctionWithRegistry,\n parseDefaultFunctionCall,\n} from './default-function-registry';\nimport {\n getNamedArgument,\n getPositionalArgument,\n getPositionalArgumentEntry,\n getPositionalArguments,\n parseOptionalNumericArguments,\n parseOptionalSingleIntegerArgument,\n pushInvalidAttributeArgument,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\n\nexport type ColumnDescriptor = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\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 * 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 parsePgvectorLength(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}): number | undefined {\n const namedLength = getNamedArgument(input.attribute, 'length');\n const namedDim = getNamedArgument(input.attribute, 'dim');\n const positional = getPositionalArgument(input.attribute);\n const raw = namedLength ?? namedDim ?? positional;\n if (!raw) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: '@pgvector.column requires length/dim argument',\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const parsed = Number(unquoteStringLiteral(raw));\n if (!Number.isInteger(parsed) || parsed < 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: '@pgvector.column length/dim must be a positive integer',\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n return parsed;\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 executionDefault?: ExecutionMutationDefaultValue;\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 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 { executionDefault: lowered.value.generated };\n}\n\nexport function resolveColumnDescriptor(\n field: PslField,\n enumTypeDescriptors: Map<string, ColumnDescriptor>,\n namedTypeDescriptors: Map<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, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringTypeConstructor } from '@prisma-next/framework-components/authoring';\nimport type { PslField, PslModel } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n getAttribute,\n lowerFirst,\n parseConstraintMapArgument,\n parseMapName,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n getAuthoringTypeConstructor,\n lowerDefaultForField,\n parsePgvectorLength,\n resolveColumnDescriptor,\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 executionDefault?: ExecutionMutationDefaultValue;\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 function collectResolvedFields(\n model: PslModel,\n mapping: ModelNameMapping,\n enumTypeDescriptors: Map<string, ColumnDescriptor>,\n namedTypeDescriptors: Map<string, ColumnDescriptor>,\n namedTypeBaseTypes: Map<string, string>,\n modelNames: Set<string>,\n compositeTypeNames: ReadonlySet<string>,\n composedExtensions: Set<string>,\n authoringContributions: AuthoringContributions | undefined,\n defaultFunctionRegistry: ControlMutationDefaultRegistry,\n generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>,\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n): ResolvedField[] {\n const resolvedFields: ResolvedField[] = [];\n const pgvectorVectorConstructor = getAuthoringTypeConstructor(authoringContributions, [\n 'pgvector',\n 'vector',\n ]);\n\n for (const field of model.fields) {\n if (field.list && modelNames.has(field.typeName)) {\n continue;\n }\n\n for (const attribute of field.attributes) {\n if (\n attribute.name === 'id' ||\n attribute.name === 'unique' ||\n attribute.name === 'default' ||\n attribute.name === 'relation' ||\n attribute.name === 'map' ||\n attribute.name === 'pgvector.column'\n ) {\n continue;\n }\n if (attribute.name.startsWith('pgvector.') && !composedExtensions.has('pgvector')) {\n diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `Attribute \"@${attribute.name}\" uses unrecognized namespace \"pgvector\". Add extension pack \"pgvector\" to extensionPacks in prisma-next.config.ts.`,\n sourceId,\n span: attribute.span,\n });\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${model.name}.${field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId,\n span: attribute.span,\n });\n }\n\n const relationAttribute = getAttribute(field.attributes, 'relation');\n if (relationAttribute && modelNames.has(field.typeName)) {\n continue;\n }\n\n const isValueObjectField = compositeTypeNames.has(field.typeName);\n const isListField = field.list;\n\n const pgvectorOnJsonField = getAttribute(field.attributes, 'pgvector.column');\n if (pgvectorOnJsonField && (isValueObjectField || isListField)) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" uses @pgvector.column on a JSON-backed field (${isValueObjectField ? 'value object' : 'list'}). @pgvector.column is only supported on scalar Bytes fields.`,\n sourceId,\n span: pgvectorOnJsonField.span,\n });\n continue;\n }\n\n let descriptor: ColumnDescriptor | undefined;\n let scalarCodecId: string | undefined;\n\n if (isValueObjectField) {\n descriptor = scalarTypeDescriptors.get('Json');\n } else if (isListField) {\n const originalDescriptor = resolveColumnDescriptor(\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n );\n if (!originalDescriptor) {\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 continue;\n }\n scalarCodecId = originalDescriptor.codecId;\n descriptor = scalarTypeDescriptors.get('Json');\n } else {\n descriptor = resolveColumnDescriptor(\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n );\n\n const pgvectorColumnAttribute = getAttribute(field.attributes, 'pgvector.column');\n if (pgvectorColumnAttribute) {\n if (!composedExtensions.has('pgvector')) {\n diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message:\n 'Attribute \"@pgvector.column\" uses unrecognized namespace \"pgvector\". Add extension pack \"pgvector\" to extensionPacks in prisma-next.config.ts.',\n sourceId,\n span: pgvectorColumnAttribute.span,\n });\n } else {\n const isBytesBase =\n field.typeName === 'Bytes' ||\n namedTypeBaseTypes.get(field.typeRef ?? field.typeName) === 'Bytes';\n if (!isBytesBase) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" uses @pgvector.column on unsupported base type \"${field.typeName}\"`,\n sourceId,\n span: pgvectorColumnAttribute.span,\n });\n } else {\n const length = parsePgvectorLength({\n attribute: pgvectorColumnAttribute,\n diagnostics,\n sourceId,\n });\n if (length !== undefined) {\n descriptor = pgvectorVectorConstructor\n ? instantiateAuthoringTypeConstructor(pgvectorVectorConstructor, [length])\n : {\n codecId: 'pg/vector@1',\n nativeType: 'vector',\n typeParams: { length },\n };\n }\n }\n }\n }\n }\n\n if (!descriptor) {\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 continue;\n }\n\n const defaultAttribute = getAttribute(field.attributes, 'default');\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 if (field.optional && loweredDefault.executionDefault) {\n const generatorDescription =\n loweredDefault.executionDefault.kind === 'generator'\n ? `\"${loweredDefault.executionDefault.id}\"`\n : '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 (loweredDefault.executionDefault) {\n const generatorDescriptor = generatorDescriptorById.get(loweredDefault.executionDefault.id);\n const generatedDescriptor = generatorDescriptor?.resolveGeneratedColumnDescriptor?.({\n generated: loweredDefault.executionDefault,\n });\n if (generatedDescriptor) {\n descriptor = generatedDescriptor;\n }\n }\n const mappedColumnName = mapping.fieldColumns.get(field.name) ?? field.name;\n const idAttribute = getAttribute(field.attributes, 'id');\n const uniqueAttribute = getAttribute(field.attributes, 'unique');\n const idName = parseConstraintMapArgument({\n attribute: idAttribute,\n sourceId,\n diagnostics,\n entityLabel: `Field \"${model.name}.${field.name}\" @id`,\n span: field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n const uniqueName = parseConstraintMapArgument({\n attribute: uniqueAttribute,\n sourceId,\n diagnostics,\n entityLabel: `Field \"${model.name}.${field.name}\" @unique`,\n span: field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n\n resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...ifDefined('defaultValue', loweredDefault.defaultValue),\n ...ifDefined('executionDefault', loweredDefault.executionDefault),\n isId: Boolean(idAttribute),\n isUnique: Boolean(uniqueAttribute),\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 { 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';\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 diagnostics: ContractSourceDiagnostic[];\n}): boolean {\n let valid = true;\n for (const attribute of input.field.attributes) {\n if (attribute.name === 'relation') {\n continue;\n }\n if (attribute.name.startsWith('pgvector.') && !input.composedExtensions.has('pgvector')) {\n input.diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `Attribute \"@${attribute.name}\" uses unrecognized namespace \"pgvector\". Add extension pack \"pgvector\" to extensionPacks in prisma-next.config.ts.`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n valid = false;\n continue;\n }\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${input.modelName}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n valid = false;\n }\n return valid;\n}\n","import type {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport type {\n Contract,\n ContractField,\n ContractModel,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringTypeConstructor } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslCompositeType,\n PslEnum,\n PslField,\n PslModel,\n PslNamedTypeDeclaration,\n PslSpan,\n} from '@prisma-next/psl-parser';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n buildSqlContractFromDefinition,\n type ForeignKeyNode,\n type IndexNode,\n type ModelNode,\n type 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 type {\n ControlMutationDefaultRegistry,\n ControlMutationDefaults,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n getAttribute,\n getPositionalArgument,\n mapFieldNamesToColumns,\n parseAttributeFieldList,\n parseConstraintMapArgument,\n parseMapName,\n parseQuotedStringLiteral,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n getAuthoringTypeConstructor,\n parsePgvectorLength,\n resolveColumnDescriptor,\n resolveDbNativeTypeAttribute,\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', 'postgres'>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly authoringContributions?: AuthoringContributions;\n}\n\nfunction buildComposedExtensionPackRefs(\n target: TargetPackRef<'sql', 'postgres'>,\n extensionIds: readonly string[],\n extensionPackRefs: readonly ExtensionPackRef<'sql', 'postgres'>[] = [],\n): Record<string, ExtensionPackRef<'sql', 'postgres'>> | 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', 'postgres'>),\n ]),\n );\n}\n\nfunction hasSameSpan(a: PslSpan, b: ContractSourceDiagnosticSpan): boolean {\n return (\n a.start.offset === b.start.offset &&\n a.end.offset === b.end.offset &&\n a.start.line === b.start.line &&\n a.end.line === b.end.line\n );\n}\n\nfunction compareStrings(left: string, right: string): -1 | 0 | 1 {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction mapParserDiagnostics(document: ParsePslDocumentResult): ContractSourceDiagnostic[] {\n return document.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId: diagnostic.sourceId,\n span: diagnostic.span,\n }));\n}\n\ninterface ProcessEnumDeclarationsInput {\n readonly enums: readonly PslEnum[];\n readonly sourceId: string;\n readonly enumTypeConstructor: AuthoringTypeConstructorDescriptor | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction processEnumDeclarations(input: ProcessEnumDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const enumDeclaration of input.enums) {\n const nativeType = parseMapName({\n attribute: getAttribute(enumDeclaration.attributes, 'map'),\n defaultValue: enumDeclaration.name,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Enum \"${enumDeclaration.name}\"`,\n span: enumDeclaration.span,\n });\n const enumStorageType = input.enumTypeConstructor\n ? instantiateAuthoringTypeConstructor(input.enumTypeConstructor, [\n nativeType,\n enumDeclaration.values.map((value) => value.name),\n ])\n : {\n codecId: 'pg/enum@1',\n nativeType,\n typeParams: { values: enumDeclaration.values.map((value) => value.name) },\n };\n const descriptor: ColumnDescriptor = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n storageTypes[enumDeclaration.name] = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeParams: enumStorageType.typeParams ?? {\n values: enumDeclaration.values.map((value) => value.name),\n },\n };\n }\n\n return { storageTypes, enumTypeDescriptors };\n}\n\ninterface ResolveNamedTypeDeclarationsInput {\n readonly declarations: readonly PslNamedTypeDeclaration[];\n readonly sourceId: string;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly pgvectorVectorConstructor: AuthoringTypeConstructorDescriptor | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction resolveNamedTypeDeclarations(input: ResolveNamedTypeDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeBaseTypes: Map<string, string>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const namedTypeDescriptors = new Map<string, ColumnDescriptor>();\n const namedTypeBaseTypes = new Map<string, string>();\n\n for (const declaration of input.declarations) {\n const baseDescriptor =\n input.enumTypeDescriptors.get(declaration.baseType) ??\n input.scalarTypeDescriptors.get(declaration.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 \"${declaration.baseType}\"`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n namedTypeBaseTypes.set(declaration.name, declaration.baseType);\n\n const pgvectorAttribute = getAttribute(declaration.attributes, 'pgvector.column');\n const dbNativeTypeAttribute = declaration.attributes.find((attribute) =>\n attribute.name.startsWith('db.'),\n );\n const unsupportedNamedTypeAttribute = declaration.attributes.find(\n (attribute) => attribute.name !== 'pgvector.column' && !attribute.name.startsWith('db.'),\n );\n if (unsupportedNamedTypeAttribute) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${declaration.name}\" uses unsupported attribute \"${unsupportedNamedTypeAttribute.name}\"`,\n sourceId: input.sourceId,\n span: unsupportedNamedTypeAttribute.span,\n });\n continue;\n }\n\n if (pgvectorAttribute && dbNativeTypeAttribute) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${declaration.name}\" cannot combine @pgvector.column with @${dbNativeTypeAttribute.name}.`,\n sourceId: input.sourceId,\n span: dbNativeTypeAttribute.span,\n });\n continue;\n }\n\n if (pgvectorAttribute) {\n if (!input.composedExtensions.has('pgvector')) {\n input.diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message:\n 'Attribute \"@pgvector.column\" uses unrecognized namespace \"pgvector\". Add extension pack \"pgvector\" to extensionPacks in prisma-next.config.ts.',\n sourceId: input.sourceId,\n span: pgvectorAttribute.span,\n });\n continue;\n }\n if (declaration.baseType !== 'Bytes') {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Named type \"${declaration.name}\" uses @pgvector.column on unsupported base type \"${declaration.baseType}\"`,\n sourceId: input.sourceId,\n span: pgvectorAttribute.span,\n });\n continue;\n }\n const length = parsePgvectorLength({\n attribute: pgvectorAttribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n });\n if (length === undefined) {\n continue;\n }\n const pgvectorStorageType = input.pgvectorVectorConstructor\n ? instantiateAuthoringTypeConstructor(input.pgvectorVectorConstructor, [length])\n : {\n codecId: 'pg/vector@1',\n nativeType: 'vector',\n typeParams: { length },\n };\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, pgvectorStorageType),\n );\n storageTypes[declaration.name] = {\n codecId: pgvectorStorageType.codecId,\n nativeType: pgvectorStorageType.nativeType,\n typeParams: pgvectorStorageType.typeParams ?? { length },\n };\n continue;\n }\n\n if (dbNativeTypeAttribute) {\n const descriptor = resolveDbNativeTypeAttribute({\n attribute: dbNativeTypeAttribute,\n baseType: declaration.baseType,\n baseDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!descriptor) {\n continue;\n }\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, descriptor),\n );\n storageTypes[declaration.name] = {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeParams: descriptor.typeParams ?? {},\n };\n continue;\n }\n\n const descriptor = toNamedTypeFieldDescriptor(declaration.name, baseDescriptor);\n namedTypeDescriptors.set(declaration.name, descriptor);\n storageTypes[declaration.name] = {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeParams: {},\n };\n }\n\n return { storageTypes, namedTypeDescriptors, namedTypeBaseTypes };\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 namedTypeBaseTypes: Map<string, string>;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\ninterface BuildModelNodeResult {\n readonly modelNode: ModelNode;\n readonly fkRelationMetadata: FkRelationMetadata[];\n readonly backrelationCandidates: ModelBackrelationCandidate[];\n readonly resolvedFields: readonly ResolvedField[];\n}\n\nfunction buildModelNodeFromPsl(input: BuildModelNodeInput): BuildModelNodeResult {\n const { model, mapping, sourceId, diagnostics } = input;\n const tableName = mapping.tableName;\n\n const resolvedFields = collectResolvedFields(\n model,\n mapping,\n input.enumTypeDescriptors,\n input.namedTypeDescriptors,\n input.namedTypeBaseTypes,\n input.modelNames,\n input.compositeTypeNames,\n input.composedExtensions,\n input.authoringContributions,\n input.defaultFunctionRegistry,\n input.generatorDescriptorById,\n diagnostics,\n sourceId,\n input.scalarTypeDescriptors,\n );\n\n const primaryKeyFields = resolvedFields.filter((field) => field.isId);\n const primaryKeyColumns = primaryKeyFields.map((field) => field.columnName);\n const primaryKeyName = primaryKeyFields.length === 1 ? primaryKeyFields[0]?.idName : undefined;\n const isVariantModel = model.attributes.some((attr) => attr.name === 'base');\n if (primaryKeyColumns.length === 0 && !isVariantModel) {\n diagnostics.push({\n code: 'PSL_MISSING_PRIMARY_KEY',\n message: `Model \"${model.name}\" must declare at least one @id field for SQL provider`,\n sourceId,\n span: model.span,\n });\n }\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 diagnostics,\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 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 messagePrefix: `Model \"${model.name}\" @@${modelAttribute.name}`,\n });\n if (!fieldNames) {\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n contextLabel: `Model \"${model.name}\" @@${modelAttribute.name}`,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: `Model \"${model.name}\" @@${modelAttribute.name}`,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n if (modelAttribute.name === 'unique') {\n uniqueConstraints.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n } else {\n indexNodes.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n }\n continue;\n }\n if (modelAttribute.name.startsWith('pgvector.') && !input.composedExtensions.has('pgvector')) {\n diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `Attribute \"@@${modelAttribute.name}\" uses unrecognized namespace \"pgvector\". Add extension pack \"pgvector\" to extensionPacks in prisma-next.config.ts.`,\n sourceId,\n span: modelAttribute.span,\n });\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_MODEL_ATTRIBUTE',\n message: `Model \"${model.name}\" uses unsupported attribute \"@@${modelAttribute.name}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n }\n\n const resultFkRelationMetadata: FkRelationMetadata[] = [];\n for (const relationAttribute of relationAttributes) {\n if (relationAttribute.field.list) {\n continue;\n }\n\n if (!input.modelNames.has(relationAttribute.field.typeName)) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute.relation,\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (!parsedRelation.fields || !parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" requires fields and references arguments`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const targetMapping = input.modelMappings.get(relationAttribute.field.typeName);\n if (!targetMapping) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const localColumns = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames: parsedRelation.fields,\n mapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n contextLabel: `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 contextLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!referencedColumns) {\n continue;\n }\n if (localColumns.length !== referencedColumns.length) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" must provide the same number of fields and references`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const onDelete = parsedRelation.onDelete\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onDelete',\n actionToken: parsedRelation.onDelete,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n const onUpdate = parsedRelation.onUpdate\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onUpdate',\n actionToken: parsedRelation.onUpdate,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n\n foreignKeyNodes.push({\n columns: localColumns,\n references: {\n model: targetMapping.model.name,\n table: targetMapping.tableName,\n columns: referencedColumns,\n },\n ...ifDefined('name', parsedRelation.constraintName),\n ...ifDefined('onDelete', onDelete),\n ...ifDefined('onUpdate', onUpdate),\n });\n\n resultFkRelationMetadata.push({\n declaringModelName: model.name,\n declaringFieldName: relationAttribute.field.name,\n declaringTableName: tableName,\n targetModelName: targetMapping.model.name,\n targetTableName: targetMapping.tableName,\n ...ifDefined('relationName', parsedRelation.relationName),\n localColumns,\n referencedColumns,\n });\n }\n\n return {\n modelNode: {\n modelName: model.name,\n tableName,\n fields: resolvedFields.map((resolvedField) => ({\n fieldName: resolvedField.field.name,\n columnName: resolvedField.columnName,\n descriptor: resolvedField.descriptor,\n nullable: resolvedField.field.optional,\n ...ifDefined('default', resolvedField.defaultValue),\n ...ifDefined('executionDefault', resolvedField.executionDefault),\n })),\n ...(primaryKeyColumns.length > 0\n ? {\n id: {\n columns: primaryKeyColumns,\n ...ifDefined('name', primaryKeyName),\n },\n }\n : {}),\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\nfunction buildValueObjects(\n compositeTypes: readonly PslCompositeType[],\n enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n): Record<string, ContractValueObject> {\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 descriptor = resolveColumnDescriptor(\n field,\n enumTypeDescriptors as Map<string, ColumnDescriptor>,\n namedTypeDescriptors as Map<string, ColumnDescriptor>,\n scalarTypeDescriptors,\n );\n if (!descriptor) {\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 continue;\n }\n fields[field.name] = {\n nullable: field.optional,\n type: { kind: 'scalar', codecId: descriptor.codecId },\n };\n }\n valueObjects[compositeType.name] = { fields };\n }\n\n return valueObjects;\n}\n\nfunction patchModelDomainFields(\n models: Record<string, ContractModel>,\n modelResolvedFields: ReadonlyMap<string, readonly ResolvedField[]>,\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, resolvedFields] of modelResolvedFields) {\n const model = patched[modelName];\n if (!model) continue;\n\n let needsPatch = false;\n const patchedFields: Record<string, ContractField> = { ...model.fields };\n\n for (const rf of resolvedFields) {\n if (rf.valueObjectTypeName) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'valueObject', name: rf.valueObjectTypeName },\n ...(rf.many ? { many: true as const } : {}),\n };\n } else if (rf.many && rf.scalarCodecId) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'scalar', codecId: rf.scalarCodecId },\n many: true as const,\n };\n }\n }\n\n if (needsPatch) {\n patched = { ...patched, [modelName]: { ...model, fields: patchedFields } };\n }\n }\n\n return patched;\n}\n\ntype DiscriminatorDeclaration = {\n readonly fieldName: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\nfunction collectPolymorphismDeclarations(\n models: readonly PslModel[],\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): {\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n} {\n const discriminatorDeclarations = new Map<string, DiscriminatorDeclaration>();\n const baseDeclarations = new Map<string, BaseDeclaration>();\n\n for (const model of models) {\n for (const attr of model.attributes) {\n if (attr.name === 'discriminator') {\n const fieldName = getPositionalArgument(attr);\n if (!fieldName) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields.find((f) => f.name === fieldName);\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.name, { fieldName, span: attr.span });\n }\n\n if (attr.name === 'base') {\n const baseName = getPositionalArgument(attr, 0);\n const rawValue = getPositionalArgument(attr, 1);\n if (!baseName || !rawValue) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base requires two arguments: base model name and discriminator value`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const value = parseQuotedStringLiteral(rawValue);\n if (value === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n baseDeclarations.set(model.name, { baseName, value, span: attr.span });\n }\n }\n }\n\n return { discriminatorDeclarations, baseDeclarations };\n}\n\nfunction resolvePolymorphism(\n models: Record<string, ContractModel>,\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>,\n baseDeclarations: Map<string, BaseDeclaration>,\n modelNames: Set<string>,\n modelMappings: ReadonlyMap<string, ModelNameMapping>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, decl] of discriminatorDeclarations) {\n if (baseDeclarations.has(modelName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_AND_BASE',\n message: `Model \"${modelName}\" cannot have both @@discriminator and @@base`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const model = patched[modelName];\n if (!model) continue;\n\n if (!Object.hasOwn(model.fields, decl.fieldName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_FIELD_NOT_FOUND',\n message: `Discriminator field \"${decl.fieldName}\" is not a field on model \"${modelName}\"`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const variants: Record<string, { readonly value: string }> = {};\n const seenValues = new Map<string, string>();\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (baseDecl.baseName !== modelName) continue;\n\n const existingVariant = seenValues.get(baseDecl.value);\n if (existingVariant) {\n diagnostics.push({\n code: 'PSL_DUPLICATE_DISCRIMINATOR_VALUE',\n message: `Discriminator value \"${baseDecl.value}\" is used by both \"${existingVariant}\" and \"${variantName}\" on base model \"${modelName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n seenValues.set(baseDecl.value, variantName);\n variants[variantName] = { value: baseDecl.value };\n }\n\n if (Object.keys(variants).length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_DISCRIMINATOR',\n message: `Model \"${modelName}\" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n patched = {\n ...patched,\n [modelName]: { ...model, discriminator: { field: decl.fieldName }, variants },\n };\n }\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (!modelNames.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_BASE_TARGET_NOT_FOUND',\n message: `Model \"${variantName}\" @@base references non-existent model \"${baseDecl.baseName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (!discriminatorDeclarations.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BASE',\n message: `Model \"${variantName}\" declares @@base(${baseDecl.baseName}, ...) but \"${baseDecl.baseName}\" has no @@discriminator`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (discriminatorDeclarations.has(variantName)) {\n continue;\n }\n\n const variantModel = patched[variantName];\n if (!variantModel) continue;\n\n const baseMapping = modelMappings.get(baseDecl.baseName);\n const variantMapping = modelMappings.get(variantName);\n const hasExplicitMap =\n variantMapping?.model.attributes.some((attr) => attr.name === 'map') ?? false;\n const resolvedTable = hasExplicitMap ? variantMapping?.tableName : baseMapping?.tableName;\n\n patched = {\n ...patched,\n [variantName]: {\n ...variantModel,\n base: baseDecl.baseName,\n ...(resolvedTable ? { storage: { ...variantModel.storage, table: resolvedTable } } : {}),\n },\n };\n }\n\n return patched;\n}\n\nexport function interpretPslDocumentToSqlContract(\n input: InterpretPslDocumentToSqlContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const sourceId = input.document.ast.sourceId;\n if (!input.target) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_TARGET_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires an explicit target context from composition.',\n sourceId,\n },\n ],\n });\n }\n if (!input.scalarTypeDescriptors) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_SCALAR_TYPE_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires composed scalar type descriptors.',\n sourceId,\n },\n ],\n });\n }\n\n const diagnostics: ContractSourceDiagnostic[] = mapParserDiagnostics(input.document);\n const models = input.document.ast.models ?? [];\n const enums = input.document.ast.enums ?? [];\n const compositeTypes = input.document.ast.compositeTypes ?? [];\n const modelNames = new Set(models.map((model) => model.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n const composedExtensions = new Set(input.composedExtensionPacks ?? []);\n const defaultFunctionRegistry =\n input.controlMutationDefaults?.defaultFunctionRegistry ?? new Map<string, never>();\n const generatorDescriptors = input.controlMutationDefaults?.generatorDescriptors ?? [];\n const generatorDescriptorById = new Map<string, MutationDefaultGeneratorDescriptor>();\n for (const descriptor of generatorDescriptors) {\n generatorDescriptorById.set(descriptor.id, descriptor);\n }\n\n const enumResult = processEnumDeclarations({\n enums,\n sourceId,\n enumTypeConstructor: getAuthoringTypeConstructor(input.authoringContributions, ['enum']),\n diagnostics,\n });\n\n const namedTypeResult = resolveNamedTypeDeclarations({\n declarations: input.document.ast.types?.declarations ?? [],\n sourceId,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n pgvectorVectorConstructor: getAuthoringTypeConstructor(input.authoringContributions, [\n 'pgvector',\n 'vector',\n ]),\n diagnostics,\n });\n\n const storageTypes = { ...enumResult.storageTypes, ...namedTypeResult.storageTypes };\n\n const modelMappings = buildModelMappings(models, diagnostics, sourceId);\n const modelNodes: ModelNode[] = [];\n const fkRelationMetadata: FkRelationMetadata[] = [];\n const backrelationCandidates: ModelBackrelationCandidate[] = [];\n const modelResolvedFields = new Map<string, readonly ResolvedField[]>();\n\n for (const model of models) {\n const mapping = modelMappings.get(model.name);\n if (!mapping) {\n continue;\n }\n const result = buildModelNodeFromPsl({\n model,\n mapping,\n modelMappings,\n modelNames,\n compositeTypeNames,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n namedTypeBaseTypes: namedTypeResult.namedTypeBaseTypes,\n composedExtensions,\n authoringContributions: input.authoringContributions,\n defaultFunctionRegistry,\n generatorDescriptorById,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n sourceId,\n diagnostics,\n });\n modelNodes.push(result.modelNode);\n fkRelationMetadata.push(...result.fkRelationMetadata);\n backrelationCandidates.push(...result.backrelationCandidates);\n modelResolvedFields.set(model.name, result.resolvedFields);\n }\n\n const { modelRelations, fkRelationsByPair } = indexFkRelations({ fkRelationMetadata });\n applyBackrelationCandidates({\n backrelationCandidates,\n fkRelationsByPair,\n modelRelations,\n diagnostics,\n sourceId,\n });\n\n const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(\n models,\n sourceId,\n diagnostics,\n );\n\n if (diagnostics.length > 0) {\n const dedupedDiagnostics = diagnostics.filter(\n (diagnostic, index, allDiagnostics) =>\n allDiagnostics.findIndex(\n (candidate) =>\n candidate.code === diagnostic.code &&\n candidate.message === diagnostic.message &&\n candidate.sourceId === diagnostic.sourceId &&\n ((candidate.span && diagnostic.span && hasSameSpan(candidate.span, diagnostic.span)) ||\n (!candidate.span && !diagnostic.span)),\n ) === index,\n );\n\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: dedupedDiagnostics,\n });\n }\n\n const contract = buildSqlContractFromDefinition({\n target: input.target,\n ...ifDefined(\n 'extensionPacks',\n buildComposedExtensionPackRefs(\n input.target,\n [...composedExtensions].sort(compareStrings),\n input.composedExtensionPackRefs,\n ),\n ),\n ...(Object.keys(storageTypes).length > 0 ? { storageTypes } : {}),\n models: modelNodes.map((model) => ({\n ...model,\n ...(modelRelations.has(model.modelName)\n ? {\n relations: [...(modelRelations.get(model.modelName) ?? [])].sort((left, right) =>\n compareStrings(left.fieldName, right.fieldName),\n ),\n }\n : {}),\n })),\n });\n\n const valueObjects = buildValueObjects(\n compositeTypes,\n enumResult.enumTypeDescriptors,\n namedTypeResult.namedTypeDescriptors,\n input.scalarTypeDescriptors,\n diagnostics,\n sourceId,\n );\n\n let patchedModels = patchModelDomainFields(\n contract.models as Record<string, ContractModel>,\n modelResolvedFields,\n );\n\n const polyDiagnostics: ContractSourceDiagnostic[] = [];\n patchedModels = resolvePolymorphism(\n patchedModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n modelMappings,\n sourceId,\n polyDiagnostics,\n );\n\n if (polyDiagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: polyDiagnostics,\n });\n }\n\n const variantModelNames = new Set(baseDeclarations.keys());\n const filteredRoots = Object.fromEntries(\n Object.entries(contract.roots).filter(([, modelName]) => !variantModelNames.has(modelName)),\n );\n\n const patchedContract: Contract = {\n ...contract,\n roots: filteredRoots,\n models: patchedModels,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n };\n\n return ok(patchedContract);\n}\n"],"mappings":"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"}
|
package/dist/provider.d.mts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { t as ControlMutationDefaults } from "./default-function-registry-DUMRIhJH.mjs";
|
|
2
|
+
import { AuthoringContributions } from "@prisma-next/framework-components/authoring";
|
|
2
3
|
import { ContractConfig } from "@prisma-next/config/config-types";
|
|
3
|
-
import { TargetPackRef } from "@prisma-next/
|
|
4
|
+
import { ExtensionPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
|
|
4
5
|
|
|
5
6
|
//#region src/provider.d.ts
|
|
6
7
|
interface PrismaContractOptions {
|
|
7
8
|
readonly output?: string;
|
|
8
9
|
readonly target: TargetPackRef<'sql', 'postgres'>;
|
|
10
|
+
readonly authoringContributions?: AuthoringContributions;
|
|
9
11
|
readonly scalarTypeDescriptors: ReadonlyMap<string, {
|
|
10
12
|
readonly codecId: string;
|
|
11
13
|
readonly nativeType: string;
|
|
@@ -14,6 +16,7 @@ interface PrismaContractOptions {
|
|
|
14
16
|
}>;
|
|
15
17
|
readonly controlMutationDefaults?: ControlMutationDefaults;
|
|
16
18
|
readonly composedExtensionPacks?: readonly string[];
|
|
19
|
+
readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];
|
|
17
20
|
}
|
|
18
21
|
declare function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig;
|
|
19
22
|
//#endregion
|
package/dist/provider.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"sourcesContent":[],"mappings":";;;;;;UAWiB,qBAAA;;EAAA,SAAA,MAAA,EAEE,aAFmB,CAAA,KAAA,EAAA,UAAA,CAAA;EAEnB,SAAA,sBAAA,CAAA,EACiB,sBADjB;EACiB,SAAA,qBAAA,EACF,WADE,CAAA,MAAA,EAAA;IAOR,SAAA,OAAA,EAAA,MAAA;IANM,SAAA,UAAA,EAAA,MAAA;IASG,SAAA,OAAA,CAAA,EAAA,MAAA;IAEW,SAAA,UAAA,CAAA,EALpB,MAKoB,CAAA,MAAA,EAAA,OAAA,CAAA;EAAgB,CAAA,CAAA;EAGhD,SAAA,uBAA4C,CAAA,EALvB,uBAK+C;;gDAHpC;;iBAGhC,cAAA,8BAA4C,wBAAwB"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as
|
|
1
|
+
import { t as interpretPslDocumentToSqlContract } from "./interpreter-qjtea3zY.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
3
|
import { notOk, ok } from "@prisma-next/utils/result";
|
|
4
|
-
import { readFile } from "node:fs/promises";
|
|
5
4
|
import { parsePslDocument } from "@prisma-next/psl-parser";
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
6
|
import { resolve } from "pathe";
|
|
7
7
|
|
|
8
8
|
//#region src/provider.ts
|
|
@@ -34,11 +34,13 @@ function prismaContract(schemaPath, options) {
|
|
|
34
34
|
sourceId: schemaPath
|
|
35
35
|
});
|
|
36
36
|
const composedExtensionPacks = [...context.composedExtensionPacks ?? [], ...options.composedExtensionPacks ?? []];
|
|
37
|
-
const interpreted =
|
|
37
|
+
const interpreted = interpretPslDocumentToSqlContract({
|
|
38
38
|
document,
|
|
39
39
|
target: options.target,
|
|
40
|
+
...ifDefined("authoringContributions", options.authoringContributions),
|
|
40
41
|
scalarTypeDescriptors: options.scalarTypeDescriptors,
|
|
41
42
|
...ifDefined("composedExtensionPacks", composedExtensionPacks.length > 0 ? composedExtensionPacks : void 0),
|
|
43
|
+
...ifDefined("composedExtensionPackRefs", options.composedExtensionPackRefs?.length ? options.composedExtensionPackRefs : void 0),
|
|
42
44
|
...ifDefined("controlMutationDefaults", options.controlMutationDefaults)
|
|
43
45
|
});
|
|
44
46
|
if (!interpreted.ok) return interpreted;
|
package/dist/provider.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":["schema: string"],"sources":["../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceContext } from '@prisma-next/config/config-types';\nimport type { TargetPackRef } from '@prisma-next/
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":["schema: string"],"sources":["../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceContext } from '@prisma-next/config/config-types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport { parsePslDocument } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { resolve } from 'pathe';\nimport type { ControlMutationDefaults } from './default-function-registry';\nimport { interpretPslDocumentToSqlContract } from './interpreter';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', 'postgres'>;\n readonly authoringContributions?: AuthoringContributions;\n readonly scalarTypeDescriptors: ReadonlyMap<\n string,\n {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n }\n >;\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];\n}\n\nexport function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig {\n return {\n source: async (context: ContractSourceContext) => {\n const absoluteSchemaPath = resolve(schemaPath);\n let schema: string;\n try {\n schema = await readFile(absoluteSchemaPath, 'utf-8');\n } catch (error) {\n const message = String(error);\n return notOk({\n summary: `Failed to read Prisma schema at \"${schemaPath}\"`,\n diagnostics: [\n {\n code: 'PSL_SCHEMA_READ_FAILED',\n message,\n sourceId: schemaPath,\n },\n ],\n meta: { schemaPath, absoluteSchemaPath, cause: message },\n });\n }\n\n const document = parsePslDocument({\n schema,\n sourceId: schemaPath,\n });\n const composedExtensionPacks = [\n ...(context.composedExtensionPacks ?? []),\n ...(options.composedExtensionPacks ?? []),\n ];\n\n const interpreted = interpretPslDocumentToSqlContract({\n document,\n target: options.target,\n ...ifDefined('authoringContributions', options.authoringContributions),\n scalarTypeDescriptors: options.scalarTypeDescriptors,\n ...ifDefined(\n 'composedExtensionPacks',\n composedExtensionPacks.length > 0 ? composedExtensionPacks : undefined,\n ),\n ...ifDefined(\n 'composedExtensionPackRefs',\n options.composedExtensionPackRefs?.length ? options.composedExtensionPackRefs : undefined,\n ),\n ...ifDefined('controlMutationDefaults', options.controlMutationDefaults),\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n ...ifDefined('output', options.output),\n };\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,eAAe,YAAoB,SAAgD;AACjG,QAAO;EACL,QAAQ,OAAO,YAAmC;GAChD,MAAM,qBAAqB,QAAQ,WAAW;GAC9C,IAAIA;AACJ,OAAI;AACF,aAAS,MAAM,SAAS,oBAAoB,QAAQ;YAC7C,OAAO;IACd,MAAM,UAAU,OAAO,MAAM;AAC7B,WAAO,MAAM;KACX,SAAS,oCAAoC,WAAW;KACxD,aAAa,CACX;MACE,MAAM;MACN;MACA,UAAU;MACX,CACF;KACD,MAAM;MAAE;MAAY;MAAoB,OAAO;MAAS;KACzD,CAAC;;GAGJ,MAAM,WAAW,iBAAiB;IAChC;IACA,UAAU;IACX,CAAC;GACF,MAAM,yBAAyB,CAC7B,GAAI,QAAQ,0BAA0B,EAAE,EACxC,GAAI,QAAQ,0BAA0B,EAAE,CACzC;GAED,MAAM,cAAc,kCAAkC;IACpD;IACA,QAAQ,QAAQ;IAChB,GAAG,UAAU,0BAA0B,QAAQ,uBAAuB;IACtE,uBAAuB,QAAQ;IAC/B,GAAG,UACD,0BACA,uBAAuB,SAAS,IAAI,yBAAyB,OAC9D;IACD,GAAG,UACD,6BACA,QAAQ,2BAA2B,SAAS,QAAQ,4BAA4B,OACjF;IACD,GAAG,UAAU,2BAA2B,QAAQ,wBAAwB;IACzE,CAAC;AACF,OAAI,CAAC,YAAY,GACf,QAAO;AAGT,UAAO,GAAG,YAAY,MAAM;;EAE9B,GAAG,UAAU,UAAU,QAAQ,OAAO;EACvC"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-psl",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.147",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "PSL-to-SQL ContractIR interpreter for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"pathe": "^2.0.3",
|
|
9
|
-
"@prisma-next/config": "0.3.0-dev.
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/
|
|
13
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/config": "0.3.0-dev.147",
|
|
10
|
+
"@prisma-next/contract": "0.3.0-dev.147",
|
|
11
|
+
"@prisma-next/framework-components": "0.3.0-dev.147",
|
|
12
|
+
"@prisma-next/psl-parser": "0.3.0-dev.147",
|
|
13
|
+
"@prisma-next/sql-contract": "0.3.0-dev.147",
|
|
14
|
+
"@prisma-next/sql-contract-ts": "0.3.0-dev.147",
|
|
15
|
+
"@prisma-next/utils": "0.3.0-dev.147"
|
|
14
16
|
},
|
|
15
17
|
"devDependencies": {
|
|
16
18
|
"tsdown": "0.18.4",
|
|
17
19
|
"typescript": "5.9.3",
|
|
18
20
|
"vitest": "4.0.17",
|
|
21
|
+
"@prisma-next/contract-authoring": "0.3.0-dev.147",
|
|
19
22
|
"@prisma-next/tsconfig": "0.0.0",
|
|
20
23
|
"@prisma-next/tsdown": "0.0.0"
|
|
21
24
|
},
|
package/src/exports/index.ts
CHANGED
|
@@ -7,6 +7,6 @@ export type {
|
|
|
7
7
|
MutationDefaultGeneratorDescriptor,
|
|
8
8
|
} from '../default-function-registry';
|
|
9
9
|
export {
|
|
10
|
-
type
|
|
11
|
-
|
|
10
|
+
type InterpretPslDocumentToSqlContractInput,
|
|
11
|
+
interpretPslDocumentToSqlContract,
|
|
12
12
|
} from '../interpreter';
|