@prisma-next/sql-contract-psl 0.0.1 → 0.3.0-dev.114
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/LICENSE +201 -0
- package/README.md +34 -8
- package/dist/default-function-registry-DUMRIhJH.d.mts +71 -0
- package/dist/default-function-registry-DUMRIhJH.d.mts.map +1 -0
- package/dist/index.d.mts +11 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/interpreter-D7gLmaHz.mjs +1412 -0
- package/dist/interpreter-D7gLmaHz.mjs.map +1 -0
- package/dist/provider.d.mts +10 -11
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +18 -12
- package/dist/provider.mjs.map +1 -1
- package/package.json +23 -23
- package/src/default-function-registry.ts +262 -0
- package/src/exports/index.ts +8 -0
- package/src/interpreter.ts +1055 -102
- package/src/provider.ts +34 -21
- package/dist/interpreter-_6-Xk1_m.mjs +0 -661
- package/dist/interpreter-_6-Xk1_m.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter-D7gLmaHz.mjs","names":["parts: Array<{ raw: string; start: number; end: number }>","quote: '\"' | \"'\" | null","args: DefaultFunctionArgument[]","NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>>","resolvedFields: ResolvedField[]","columns: string[]","relationNameFromPositional: string | undefined","fields: readonly string[] | undefined","references: readonly string[] | undefined","diagnostics: ContractSourceDiagnostic[]","descriptor: ColumnDescriptor","descriptor","resolvedModels: Array<{\n model: PslModel;\n mapping: ModelNameMapping;\n resolvedFields: ResolvedField[];\n }>","fkRelationMetadata: FkRelationMetadata[]","backrelationCandidates: ModelBackrelationCandidate[]","relationName: string | undefined","options: {\n type: ColumnDescriptor;\n nullable?: true;\n default?: ColumnDefault;\n }"],"sources":["../src/default-function-registry.ts","../src/interpreter.ts"],"sourcesContent":["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 {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport type { TargetPackRef } from '@prisma-next/contract/framework-components';\nimport type { ContractIR } from '@prisma-next/contract/ir';\nimport type { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslField,\n PslModel,\n PslSpan,\n} from '@prisma-next/psl-parser';\nimport { defineContract } from '@prisma-next/sql-contract-ts/contract-builder';\nimport { assertDefined, invariant } from '@prisma-next/utils/assertions';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport {\n type ControlMutationDefaultRegistry,\n type ControlMutationDefaults,\n lowerDefaultFunctionWithRegistry,\n type MutationDefaultGeneratorDescriptor,\n parseDefaultFunctionCall,\n} from './default-function-registry';\n\ntype ColumnDescriptor = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n};\n\nexport interface InterpretPslDocumentToSqlContractIRInput {\n readonly document: ParsePslDocumentResult;\n readonly target: TargetPackRef<'sql', 'postgres'>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensionPacks?: readonly string[];\n readonly controlMutationDefaults?: ControlMutationDefaults;\n}\n\nconst 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\ntype 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};\n\ntype 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\ntype 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\ntype 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 = {\n readonly fieldName: string;\n readonly toModel: string;\n readonly toTable: string;\n readonly cardinality: '1:N' | 'N:1';\n readonly parentTable: string;\n readonly parentColumns: readonly string[];\n readonly childTable: string;\n readonly childColumns: readonly string[];\n};\n\ntype ResolvedModelEntry = {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly resolvedFields: readonly ResolvedField[];\n};\n\nfunction fkRelationPairKey(declaringModelName: string, targetModelName: string): string {\n // NOTE: We assume PSL model identifiers do not contain the `::` separator.\n return `${declaringModelName}::${targetModelName}`;\n}\n\ntype ModelNameMapping = {\n readonly model: PslModel;\n readonly tableName: string;\n readonly fieldColumns: Map<string, string>;\n};\n\ntype DynamicTableBuilder = {\n column(\n name: string,\n options: { type: ColumnDescriptor; nullable?: true; default?: ColumnDefault },\n ): DynamicTableBuilder;\n generated(\n name: string,\n options: { type: ColumnDescriptor; generated: ExecutionMutationDefaultValue },\n ): DynamicTableBuilder;\n unique(columns: readonly string[]): DynamicTableBuilder;\n primaryKey(columns: readonly string[]): DynamicTableBuilder;\n index(columns: readonly string[]): DynamicTableBuilder;\n foreignKey(\n columns: readonly string[],\n references: { table: string; columns: readonly string[] },\n options?: { name?: string; onDelete?: string; onUpdate?: string },\n ): DynamicTableBuilder;\n};\n\ntype DynamicModelBuilder = {\n field(name: string, column: string): DynamicModelBuilder;\n relation(\n name: string,\n options: {\n toModel: string;\n toTable: string;\n cardinality: '1:1' | '1:N' | 'N:1';\n on: {\n parentTable: string;\n parentColumns: readonly string[];\n childTable: string;\n childColumns: readonly string[];\n };\n },\n ): DynamicModelBuilder;\n};\n\ntype DynamicContractBuilder = {\n target(target: TargetPackRef<'sql', 'postgres'>): DynamicContractBuilder;\n storageType(\n name: string,\n typeInstance: {\n codecId: string;\n nativeType: string;\n typeParams: Record<string, unknown>;\n },\n ): DynamicContractBuilder;\n table(\n name: string,\n callback: (tableBuilder: DynamicTableBuilder) => DynamicTableBuilder,\n ): DynamicContractBuilder;\n model(\n name: string,\n table: string,\n callback: (modelBuilder: DynamicModelBuilder) => DynamicModelBuilder,\n ): DynamicContractBuilder;\n build(): ContractIR;\n};\n\nfunction lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nfunction getAttribute(\n attributes: readonly PslAttribute[] | undefined,\n name: string,\n): PslAttribute | undefined {\n return attributes?.find((attribute) => attribute.name === name);\n}\n\nfunction 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\nfunction getPositionalArgument(attribute: PslAttribute, index = 0): string | 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 entry.value;\n}\n\nfunction 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\nfunction 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\nfunction parseQuotedStringLiteral(value: string): string | undefined {\n const trimmed = value.trim();\n // This intentionally accepts either '...' or \"...\" and relies on PSL's\n // own string literal rules to disallow unescaped interior delimiters.\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\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 */\ntype 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\nconst 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\nfunction 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\nfunction 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\nfunction 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 composedExtensions: Set<string>,\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\n for (const field of model.fields) {\n if (field.list) {\n if (modelNames.has(field.typeName)) {\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_LIST',\n message: `Field \"${model.name}.${field.name}\" uses a scalar/storage list type, which is not supported in SQL PSL provider v1. Model-typed lists are only supported as backrelation navigation fields when they match an FK-side relation.`,\n sourceId,\n span: field.span,\n });\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 let descriptor = resolveColumnDescriptor(\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\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 = {\n codecId: 'pg/vector@1',\n nativeType: 'vector',\n typeParams: { length },\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 resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...ifDefined('defaultValue', loweredDefault.defaultValue),\n ...ifDefined('executionDefault', loweredDefault.executionDefault),\n isId: Boolean(getAttribute(field.attributes, 'id')),\n isUnique: Boolean(getAttribute(field.attributes, 'unique')),\n });\n }\n\n return resolvedFields;\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 indexFkRelations(input: { readonly fkRelationMetadata: readonly FkRelationMetadata[] }): {\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 parentTable: relation.declaringTableName,\n parentColumns: relation.localColumns,\n childTable: relation.targetTableName,\n childColumns: relation.referencedColumns,\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\nfunction 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 parentTable: candidate.tableName,\n parentColumns: matched.referencedColumns,\n childTable: matched.declaringTableName,\n childColumns: matched.localColumns,\n });\n }\n}\n\nfunction emitModelsWithRelations(input: {\n readonly builder: DynamicContractBuilder;\n readonly resolvedModels: ResolvedModelEntry[];\n readonly modelRelations: Map<string, readonly ModelRelationMetadata[]>;\n}): DynamicContractBuilder {\n let nextBuilder = input.builder;\n\n const sortedModels = input.resolvedModels.sort((left, right) => {\n const tableComparison = compareStrings(left.mapping.tableName, right.mapping.tableName);\n if (tableComparison === 0) {\n return compareStrings(left.model.name, right.model.name);\n }\n return tableComparison;\n });\n\n for (const entry of sortedModels) {\n const relationEntries = [...(input.modelRelations.get(entry.model.name) ?? [])].sort(\n (left, right) => compareStrings(left.fieldName, right.fieldName),\n );\n nextBuilder = nextBuilder.model(\n entry.model.name,\n entry.mapping.tableName,\n (modelBuilder: DynamicModelBuilder) => {\n let next = modelBuilder;\n for (const resolvedField of entry.resolvedFields) {\n next = next.field(resolvedField.field.name, resolvedField.columnName);\n }\n for (const relation of relationEntries) {\n next = next.relation(relation.fieldName, {\n toModel: relation.toModel,\n toTable: relation.toTable,\n cardinality: relation.cardinality,\n on: {\n parentTable: relation.parentTable,\n parentColumns: relation.parentColumns,\n childTable: relation.childTable,\n childColumns: relation.childColumns,\n },\n });\n }\n return next;\n },\n );\n }\n\n return nextBuilder;\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\nfunction 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}): string | 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\nfunction 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\nfunction mapFieldNamesToColumns(input: {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly mapping: ModelNameMapping;\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\nfunction 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\nfunction 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\nfunction 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 interpretPslDocumentToSqlContractIR(\n input: InterpretPslDocumentToSqlContractIRInput,\n): Result<ContractIR, ContractSourceDiagnostics> {\n const sourceId = input.document.ast.sourceId;\n if (!input.target) {\n return notOk({\n summary: 'PSL to SQL Contract IR normalization 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 IR normalization 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 modelNames = new Set(input.document.ast.models.map((model) => model.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 let builder = defineContract().target(input.target) as DynamicContractBuilder;\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n const namedTypeDescriptors = new Map<string, ColumnDescriptor>();\n const namedTypeBaseTypes = new Map<string, string>();\n\n for (const enumDeclaration of input.document.ast.enums) {\n const nativeType = parseMapName({\n attribute: getAttribute(enumDeclaration.attributes, 'map'),\n defaultValue: enumDeclaration.name,\n sourceId,\n diagnostics,\n entityLabel: `Enum \"${enumDeclaration.name}\"`,\n span: enumDeclaration.span,\n });\n const descriptor: ColumnDescriptor = {\n codecId: 'pg/enum@1',\n nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n builder = builder.storageType(enumDeclaration.name, {\n codecId: 'pg/enum@1',\n nativeType,\n typeParams: { values: enumDeclaration.values.map((value) => value.name) },\n });\n }\n\n for (const declaration of input.document.ast.types?.declarations ?? []) {\n const baseDescriptor =\n enumTypeDescriptors.get(declaration.baseType) ??\n input.scalarTypeDescriptors.get(declaration.baseType);\n if (!baseDescriptor) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" references unsupported base type \"${declaration.baseType}\"`,\n 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 diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${declaration.name}\" uses unsupported attribute \"${unsupportedNamedTypeAttribute.name}\"`,\n sourceId,\n span: unsupportedNamedTypeAttribute.span,\n });\n continue;\n }\n\n if (pgvectorAttribute && dbNativeTypeAttribute) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${declaration.name}\" cannot combine @pgvector.column with @${dbNativeTypeAttribute.name}.`,\n sourceId,\n span: dbNativeTypeAttribute.span,\n });\n continue;\n }\n\n if (pgvectorAttribute) {\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: pgvectorAttribute.span,\n });\n continue;\n }\n if (declaration.baseType !== 'Bytes') {\n 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,\n span: pgvectorAttribute.span,\n });\n continue;\n }\n const length = parsePgvectorLength({\n attribute: pgvectorAttribute,\n diagnostics,\n sourceId,\n });\n if (length === undefined) {\n continue;\n }\n namedTypeDescriptors.set(declaration.name, {\n codecId: 'pg/vector@1',\n nativeType: 'vector',\n typeParams: { length },\n });\n builder = builder.storageType(declaration.name, {\n codecId: 'pg/vector@1',\n nativeType: 'vector',\n 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,\n sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!descriptor) {\n continue;\n }\n namedTypeDescriptors.set(declaration.name, {\n ...descriptor,\n typeRef: declaration.name,\n });\n builder = builder.storageType(declaration.name, {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeParams: descriptor.typeParams ?? {},\n });\n continue;\n }\n\n const descriptor: ColumnDescriptor = {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeRef: declaration.name,\n };\n namedTypeDescriptors.set(declaration.name, descriptor);\n builder = builder.storageType(declaration.name, {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeParams: {},\n });\n }\n\n const modelMappings = buildModelMappings(input.document.ast.models, diagnostics, sourceId);\n const resolvedModels: Array<{\n model: PslModel;\n mapping: ModelNameMapping;\n resolvedFields: ResolvedField[];\n }> = [];\n const fkRelationMetadata: FkRelationMetadata[] = [];\n const backrelationCandidates: ModelBackrelationCandidate[] = [];\n\n for (const model of input.document.ast.models) {\n const mapping = modelMappings.get(model.name);\n if (!mapping) {\n continue;\n }\n const tableName = mapping.tableName;\n const resolvedFields = collectResolvedFields(\n model,\n mapping,\n enumTypeDescriptors,\n namedTypeDescriptors,\n namedTypeBaseTypes,\n modelNames,\n composedExtensions,\n defaultFunctionRegistry,\n generatorDescriptorById,\n diagnostics,\n sourceId,\n input.scalarTypeDescriptors,\n );\n resolvedModels.push({ model, mapping, resolvedFields });\n\n const primaryKeyColumns = resolvedFields\n .filter((field) => field.isId)\n .map((field) => field.columnName);\n if (primaryKeyColumns.length === 0) {\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 for (const field of model.fields) {\n if (!field.list || !modelNames.has(field.typeName)) {\n continue;\n }\n const attributesValid = validateNavigationListFieldAttributes({\n modelName: model.name,\n field,\n sourceId,\n 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 backrelationCandidates.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\n builder = builder.table(tableName, (tableBuilder: DynamicTableBuilder) => {\n let table = tableBuilder;\n\n for (const resolvedField of resolvedFields) {\n if (resolvedField.executionDefault) {\n table = table.generated(resolvedField.columnName, {\n type: resolvedField.descriptor,\n generated: resolvedField.executionDefault,\n });\n } else {\n const options: {\n type: ColumnDescriptor;\n nullable?: true;\n default?: ColumnDefault;\n } = {\n type: resolvedField.descriptor,\n ...ifDefined('nullable', resolvedField.field.optional ? (true as const) : undefined),\n ...ifDefined('default', resolvedField.defaultValue),\n };\n table = table.column(resolvedField.columnName, options);\n }\n\n if (resolvedField.isUnique) {\n table = table.unique([resolvedField.columnName]);\n }\n }\n\n if (primaryKeyColumns.length > 0) {\n table = table.primaryKey(primaryKeyColumns);\n }\n\n for (const modelAttribute of model.attributes) {\n if (modelAttribute.name === 'map') {\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 if (modelAttribute.name === 'unique') {\n table = table.unique(columnNames);\n } else {\n table = table.index(columnNames);\n }\n continue;\n }\n if (modelAttribute.name.startsWith('pgvector.') && !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 for (const relationAttribute of relationAttributes) {\n if (relationAttribute.field.list) {\n continue;\n }\n\n if (!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 = 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 table = table.foreignKey(\n localColumns,\n {\n table: targetMapping.tableName,\n columns: referencedColumns,\n },\n {\n ...ifDefined('name', parsedRelation.constraintName),\n ...ifDefined('onDelete', onDelete),\n ...ifDefined('onUpdate', onUpdate),\n },\n );\n\n fkRelationMetadata.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 table;\n });\n }\n\n const { modelRelations, fkRelationsByPair } = indexFkRelations({ fkRelationMetadata });\n applyBackrelationCandidates({\n backrelationCandidates,\n fkRelationsByPair,\n modelRelations,\n diagnostics,\n sourceId,\n });\n builder = emitModelsWithRelations({\n builder,\n resolvedModels,\n modelRelations,\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 IR normalization failed',\n diagnostics: dedupedDiagnostics,\n });\n }\n\n const contract = builder.build() as ContractIR;\n return ok(contract);\n}\n"],"mappings":"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"}
|
package/dist/provider.d.mts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
|
+
import { t as ControlMutationDefaults } from "./default-function-registry-DUMRIhJH.mjs";
|
|
1
2
|
import { ContractConfig } from "@prisma-next/config/config-types";
|
|
2
3
|
import { TargetPackRef } from "@prisma-next/contract/framework-components";
|
|
3
4
|
|
|
4
5
|
//#region src/provider.d.ts
|
|
5
6
|
interface PrismaContractOptions {
|
|
6
7
|
readonly output?: string;
|
|
7
|
-
readonly target
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* attribute-level schema/argument validation needs to move beyond namespace existence.
|
|
16
|
-
*/
|
|
8
|
+
readonly target: TargetPackRef<'sql', 'postgres'>;
|
|
9
|
+
readonly scalarTypeDescriptors: ReadonlyMap<string, {
|
|
10
|
+
readonly codecId: string;
|
|
11
|
+
readonly nativeType: string;
|
|
12
|
+
readonly typeRef?: string;
|
|
13
|
+
readonly typeParams?: Record<string, unknown>;
|
|
14
|
+
}>;
|
|
15
|
+
readonly controlMutationDefaults?: ControlMutationDefaults;
|
|
17
16
|
readonly composedExtensionPacks?: readonly string[];
|
|
18
17
|
}
|
|
19
|
-
declare function prismaContract(schemaPath: string, options
|
|
18
|
+
declare function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig;
|
|
20
19
|
//#endregion
|
|
21
20
|
export { type PrismaContractOptions, prismaContract };
|
|
22
21
|
//# sourceMappingURL=provider.d.mts.map
|
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":";;;;;UAUiB,qBAAA;;EAAA,SAAA,MAAA,EAEE,aAFmB,CAAA,KAAA,EAAA,UAAA,CAAA;EAEnB,SAAA,qBAAA,EACe,WADf,CAAA,MAAA,EAAA;IAOS,SAAA,OAAA,EAAA,MAAA;IANM,SAAA,UAAA,EAAA,MAAA;IASG,SAAA,OAAA,CAAA,EAAA,MAAA;IAAuB,SAAA,UAAA,CAAA,EAHhC,MAGgC,CAAA,MAAA,EAAA,OAAA,CAAA;EAI5C,CAAA,CAAA;qCAJqB;;;iBAIrB,cAAA,8BAA4C,wBAAwB"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { t as interpretPslDocumentToSqlContractIR } from "./interpreter-
|
|
2
|
-
import {
|
|
1
|
+
import { t as interpretPslDocumentToSqlContractIR } from "./interpreter-D7gLmaHz.mjs";
|
|
2
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
|
+
import { notOk, ok } from "@prisma-next/utils/result";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
5
|
import { parsePslDocument } from "@prisma-next/psl-parser";
|
|
5
|
-
import { ifDefined } from "@prisma-next/utils/defined";
|
|
6
6
|
import { resolve } from "pathe";
|
|
7
7
|
|
|
8
8
|
//#region src/provider.ts
|
|
9
9
|
function prismaContract(schemaPath, options) {
|
|
10
10
|
return {
|
|
11
|
-
source: async () => {
|
|
11
|
+
source: async (context) => {
|
|
12
12
|
const absoluteSchemaPath = resolve(schemaPath);
|
|
13
13
|
let schema;
|
|
14
14
|
try {
|
|
@@ -29,16 +29,22 @@ function prismaContract(schemaPath, options) {
|
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
const document = parsePslDocument({
|
|
33
|
+
schema,
|
|
34
|
+
sourceId: schemaPath
|
|
35
|
+
});
|
|
36
|
+
const composedExtensionPacks = [...context.composedExtensionPacks ?? [], ...options.composedExtensionPacks ?? []];
|
|
37
|
+
const interpreted = interpretPslDocumentToSqlContractIR({
|
|
38
|
+
document,
|
|
39
|
+
target: options.target,
|
|
40
|
+
scalarTypeDescriptors: options.scalarTypeDescriptors,
|
|
41
|
+
...ifDefined("composedExtensionPacks", composedExtensionPacks.length > 0 ? composedExtensionPacks : void 0),
|
|
42
|
+
...ifDefined("controlMutationDefaults", options.controlMutationDefaults)
|
|
39
43
|
});
|
|
44
|
+
if (!interpreted.ok) return interpreted;
|
|
45
|
+
return ok(interpreted.value);
|
|
40
46
|
},
|
|
41
|
-
...ifDefined("output", options
|
|
47
|
+
...ifDefined("output", options.output)
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
50
|
|
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 } from '@prisma-next/config/config-types';\nimport type { TargetPackRef } from '@prisma-next/contract/framework-components';\nimport { parsePslDocument } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk } from '@prisma-next/utils/result';\nimport { resolve } from 'pathe';\nimport { interpretPslDocumentToSqlContractIR } from './interpreter';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target
|
|
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/contract/framework-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 { interpretPslDocumentToSqlContractIR } from './interpreter';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', 'postgres'>;\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}\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 = interpretPslDocumentToSqlContractIR({\n document,\n target: options.target,\n scalarTypeDescriptors: options.scalarTypeDescriptors,\n ...ifDefined(\n 'composedExtensionPacks',\n composedExtensionPacks.length > 0 ? composedExtensionPacks : 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":";;;;;;;;AA0BA,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,oCAAoC;IACtD;IACA,QAAQ,QAAQ;IAChB,uBAAuB,QAAQ;IAC/B,GAAG,UACD,0BACA,uBAAuB,SAAS,IAAI,yBAAyB,OAC9D;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,33 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-psl",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.3.0-dev.114",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "PSL-to-SQL ContractIR interpreter for Prisma Next",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"build": "tsdown",
|
|
9
|
-
"test": "vitest run",
|
|
10
|
-
"test:coverage": "vitest run --coverage",
|
|
11
|
-
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
12
|
-
"lint": "biome check . --error-on-warnings",
|
|
13
|
-
"lint:fix": "biome check --write .",
|
|
14
|
-
"lint:fix:unsafe": "biome check --write --unsafe .",
|
|
15
|
-
"clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output"
|
|
16
|
-
},
|
|
17
7
|
"dependencies": {
|
|
18
|
-
"
|
|
19
|
-
"@prisma-next/
|
|
20
|
-
"@prisma-next/psl-parser": "
|
|
21
|
-
"@prisma-next/
|
|
22
|
-
"@prisma-next/utils": "
|
|
23
|
-
"
|
|
8
|
+
"pathe": "^2.0.3",
|
|
9
|
+
"@prisma-next/config": "0.3.0-dev.114",
|
|
10
|
+
"@prisma-next/psl-parser": "0.3.0-dev.114",
|
|
11
|
+
"@prisma-next/contract": "0.3.0-dev.114",
|
|
12
|
+
"@prisma-next/utils": "0.3.0-dev.114",
|
|
13
|
+
"@prisma-next/sql-contract-ts": "0.3.0-dev.114"
|
|
24
14
|
},
|
|
25
15
|
"devDependencies": {
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
16
|
+
"tsdown": "0.18.4",
|
|
17
|
+
"typescript": "5.9.3",
|
|
18
|
+
"vitest": "4.0.17",
|
|
19
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
20
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
31
21
|
},
|
|
32
22
|
"files": [
|
|
33
23
|
"dist",
|
|
@@ -45,5 +35,15 @@
|
|
|
45
35
|
"type": "git",
|
|
46
36
|
"url": "https://github.com/prisma/prisma-next.git",
|
|
47
37
|
"directory": "packages/2-sql/2-authoring/contract-psl"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsdown",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:coverage": "vitest run --coverage",
|
|
43
|
+
"typecheck": "tsc --project tsconfig.json --noEmit",
|
|
44
|
+
"lint": "biome check . --error-on-warnings",
|
|
45
|
+
"lint:fix": "biome check --write .",
|
|
46
|
+
"lint:fix:unsafe": "biome check --write --unsafe .",
|
|
47
|
+
"clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output"
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
}
|