@prisma-next/sql-contract-psl 0.3.0-dev.54 → 0.3.0-dev.63
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 +24 -0
- package/dist/index.d.mts +40 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/interpreter-IXr5c7s7.mjs +1376 -0
- package/dist/interpreter-IXr5c7s7.mjs.map +1 -0
- package/dist/provider.d.mts +1 -1
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +4 -3
- package/dist/provider.mjs.map +1 -1
- package/package.json +8 -8
- package/src/default-function-registry.ts +510 -0
- package/src/interpreter.ts +629 -67
- package/src/provider.ts +3 -1
- 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-IXr5c7s7.mjs","names":["parts: Array<{ raw: string; start: number; end: number }>","quote: '\"' | \"'\" | null","args: DefaultFunctionArgument[]","supportedFunctionUsageByName: Readonly<Record<string, readonly string[]>>","unknownFunctionSuggestionsByName: Readonly<Record<string, string>>","DEFAULT_POSTGRES_TARGET: TargetPackRef<'sql', 'postgres'>","SCALAR_COLUMN_MAP: Record<string, ColumnDescriptor>","GENERATED_ID_COLUMN_MAP: Partial<Record<string, ColumnDescriptor>>","resolvedFields: ResolvedField[]","columns: string[]","relationNameFromPositional: string | undefined","fields: readonly string[] | undefined","references: readonly string[] | undefined","diagnostics: ContractSourceDiagnostic[]","descriptor: ColumnDescriptor","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}\n\ntype LoweredDefaultValue =\n | { readonly kind: 'storage'; readonly defaultValue: ColumnDefault }\n | { readonly kind: 'execution'; readonly generated: ExecutionMutationDefaultValue };\n\ntype 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 type DefaultFunctionRegistry = ReadonlyMap<string, DefaultFunctionLoweringHandler>;\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 invalidArgumentDiagnostic(input: {\n readonly context: DefaultFunctionLoweringContext;\n readonly span: PslSpan;\n readonly message: string;\n}): LoweredDefaultResult {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: input.message,\n sourceId: input.context.sourceId,\n span: input.span,\n },\n };\n}\n\nfunction executionGenerator(\n id: ExecutionMutationDefaultValue['id'],\n params?: Record<string, unknown>,\n): LoweredDefaultResult {\n return {\n ok: true,\n value: {\n kind: 'execution',\n generated: {\n kind: 'generator',\n id,\n ...(params ? { params } : {}),\n },\n },\n };\n}\n\nfunction expectNoArgs(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n readonly usage: string;\n}): LoweredDefaultResult | undefined {\n if (input.call.args.length === 0) {\n return undefined;\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: `Default function \"${input.call.name}\" does not accept arguments. Use ${input.usage}.`,\n });\n}\n\nfunction parseIntegerArgument(raw: string): number | undefined {\n const trimmed = raw.trim();\n if (!/^-?\\d+$/.test(trimmed)) {\n return undefined;\n }\n const value = Number(trimmed);\n if (!Number.isInteger(value)) {\n return undefined;\n }\n return value;\n}\n\nfunction parseStringLiteral(raw: string): string | undefined {\n const match = raw.trim().match(/^(['\"])(.*)\\1$/s);\n if (!match) {\n return undefined;\n }\n return match[2] ?? '';\n}\n\nfunction lowerAutoincrement(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`autoincrement()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'autoincrement()',\n },\n },\n };\n}\n\nfunction lowerNow(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`now()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: 'now()',\n },\n },\n };\n}\n\nfunction lowerUuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('uuidv4');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"uuid\" accepts at most one version argument: `uuid()`, `uuid(4)`, or `uuid(7)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 4) {\n return executionGenerator('uuidv4');\n }\n if (version === 7) {\n return executionGenerator('uuidv7');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message:\n 'Default function \"uuid\" supports only `uuid()`, `uuid(4)`, or `uuid(7)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerCuid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message:\n 'Default function \"cuid()\" is not supported in SQL PSL provider v1. Use `cuid(2)` instead.',\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message: 'Default function \"cuid\" accepts exactly one version argument: `cuid(2)`.',\n });\n }\n const version = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (version === 2) {\n return executionGenerator('cuid2');\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"cuid\" supports only `cuid(2)` in SQL PSL provider v1.',\n });\n}\n\nfunction lowerUlid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const maybeNoArgs = expectNoArgs({\n call: input.call,\n context: input.context,\n usage: '`ulid()`',\n });\n if (maybeNoArgs) {\n return maybeNoArgs;\n }\n return executionGenerator('ulid');\n}\n\nfunction lowerNanoid(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length === 0) {\n return executionGenerator('nanoid');\n }\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"nanoid\" accepts at most one size argument: `nanoid()` or `nanoid(<2-255>)`.',\n });\n }\n const size = parseIntegerArgument(input.call.args[0]?.raw ?? '');\n if (size !== undefined && size >= 2 && size <= 255) {\n return executionGenerator('nanoid', { size });\n }\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"nanoid\" size argument must be an integer between 2 and 255.',\n });\n}\n\nfunction lowerDbgenerated(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n if (input.call.args.length !== 1) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.span,\n message:\n 'Default function \"dbgenerated\" requires exactly one string argument: `dbgenerated(\"...\")`.',\n });\n }\n const rawExpression = parseStringLiteral(input.call.args[0]?.raw ?? '');\n if (rawExpression === undefined) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument must be a string literal.',\n });\n }\n if (rawExpression.trim().length === 0) {\n return invalidArgumentDiagnostic({\n context: input.context,\n span: input.call.args[0]?.span ?? input.call.span,\n message: 'Default function \"dbgenerated\" argument cannot be empty.',\n });\n }\n return {\n ok: true,\n value: {\n kind: 'storage',\n defaultValue: {\n kind: 'function',\n expression: rawExpression,\n },\n },\n };\n}\n\nconst supportedFunctionUsageByName: Readonly<Record<string, readonly string[]>> = {\n autoincrement: ['autoincrement()'],\n now: ['now()'],\n uuid: ['uuid()', 'uuid(4)', 'uuid(7)'],\n cuid: ['cuid(2)'],\n ulid: ['ulid()'],\n nanoid: ['nanoid()', 'nanoid(n)'],\n dbgenerated: ['dbgenerated(\"...\")'],\n};\n\nconst unknownFunctionSuggestionsByName: Readonly<Record<string, string>> = {\n cuid2: 'Use `cuid(2)`.',\n uuidv4: 'Use `uuid()` or `uuid(4)`.',\n uuidv7: 'Use `uuid(7)`.',\n};\n\nfunction formatSupportedFunctionList(registry: DefaultFunctionRegistry): string {\n const signatures = Array.from(registry.keys())\n .sort()\n .flatMap((functionName) => supportedFunctionUsageByName[functionName] ?? [`${functionName}()`]);\n return signatures.length > 0 ? signatures.join(', ') : 'none';\n}\n\nexport function createBuiltinDefaultFunctionRegistry(): DefaultFunctionRegistry {\n return new Map<string, DefaultFunctionLoweringHandler>([\n ['autoincrement', lowerAutoincrement],\n ['now', lowerNow],\n ['uuid', lowerUuid],\n ['cuid', lowerCuid],\n ['ulid', lowerUlid],\n ['nanoid', lowerNanoid],\n ['dbgenerated', lowerDbgenerated],\n ]);\n}\n\nexport function lowerDefaultFunctionWithRegistry(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly registry: DefaultFunctionRegistry;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const handler = input.registry.get(input.call.name);\n if (handler) {\n return handler({ call: input.call, context: input.context });\n }\n const supportedFunctionList = formatSupportedFunctionList(input.registry);\n const suggestion = unknownFunctionSuggestionsByName[input.call.name];\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}.${suggestion ? ` ${suggestion}` : ''}`,\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 createBuiltinDefaultFunctionRegistry,\n type DefaultFunctionRegistry,\n lowerDefaultFunctionWithRegistry,\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 composedExtensionPacks?: readonly string[];\n readonly defaultFunctionRegistry?: DefaultFunctionRegistry;\n}\n\nconst DEFAULT_POSTGRES_TARGET: TargetPackRef<'sql', 'postgres'> = {\n kind: 'target',\n familyId: 'sql',\n targetId: 'postgres',\n id: 'postgres',\n version: '0.0.1',\n capabilities: {},\n};\n\nconst SCALAR_COLUMN_MAP: Record<string, ColumnDescriptor> = {\n String: { codecId: 'pg/text@1', nativeType: 'text' },\n Boolean: { codecId: 'pg/bool@1', nativeType: 'bool' },\n Int: { codecId: 'pg/int4@1', nativeType: 'int4' },\n BigInt: { codecId: 'pg/int8@1', nativeType: 'int8' },\n Float: { codecId: 'pg/float8@1', nativeType: 'float8' },\n Decimal: { codecId: 'pg/numeric@1', nativeType: 'numeric' },\n DateTime: { codecId: 'pg/timestamptz@1', nativeType: 'timestamptz' },\n Json: { codecId: 'pg/jsonb@1', nativeType: 'jsonb' },\n Bytes: { codecId: 'pg/bytea@1', nativeType: 'bytea' },\n};\n\nconst GENERATED_ID_COLUMN_MAP: Partial<Record<string, ColumnDescriptor>> = {\n ulid: { codecId: 'sql/char@1', nativeType: 'character', typeParams: { length: 26 } },\n uuidv7: { codecId: 'sql/char@1', nativeType: 'character', typeParams: { length: 36 } },\n uuidv4: { codecId: 'sql/char@1', nativeType: 'character', typeParams: { length: 36 } },\n cuid2: { codecId: 'sql/char@1', nativeType: 'character', typeParams: { length: 24 } },\n};\n\nfunction resolveGeneratedColumnDescriptor(\n executionDefault: ExecutionMutationDefaultValue,\n): ColumnDescriptor | undefined {\n if (executionDefault.kind !== 'generator') {\n return undefined;\n }\n\n if (executionDefault.id === 'nanoid') {\n const rawSize = executionDefault.params?.['size'];\n const length =\n typeof rawSize === 'number' && Number.isInteger(rawSize) && rawSize >= 2 && rawSize <= 255\n ? rawSize\n : 21;\n return { codecId: 'sql/char@1', nativeType: 'character', typeParams: { length } };\n }\n\n return GENERATED_ID_COLUMN_MAP[executionDefault.id];\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 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?: { 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(attributes: readonly PslAttribute[], name: string): 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 sourceId: string;\n readonly defaultFunctionRegistry: DefaultFunctionRegistry;\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 },\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 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 resolveColumnDescriptor(\n field: PslField,\n enumTypeDescriptors: Map<string, ColumnDescriptor>,\n namedTypeDescriptors: Map<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 SCALAR_COLUMN_MAP[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: DefaultFunctionRegistry,\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\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(field, enumTypeDescriptors, namedTypeDescriptors);\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(${length})`,\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 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 generatedDescriptor = resolveGeneratedColumnDescriptor(loweredDefault.executionDefault);\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 !== '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 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('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 diagnostics: ContractSourceDiagnostic[] = mapParserDiagnostics(input.document);\n const modelNames = new Set(input.document.ast.models.map((model) => model.name));\n const sourceId = input.document.ast.sourceId;\n const composedExtensions = new Set(input.composedExtensionPacks ?? []);\n const defaultFunctionRegistry =\n input.defaultFunctionRegistry ?? createBuiltinDefaultFunctionRegistry();\n\n let builder = defineContract().target(\n input.target ?? DEFAULT_POSTGRES_TARGET,\n ) as unknown 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 = enumDeclaration.name.toLowerCase();\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) ?? SCALAR_COLUMN_MAP[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 unsupportedNamedTypeAttribute = declaration.attributes.find(\n (attribute) => attribute.name !== 'pgvector.column',\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) {\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(${length})`,\n typeRef: declaration.name,\n });\n builder = builder.storageType(declaration.name, {\n codecId: 'pg/vector@1',\n nativeType: `vector(${length})`,\n typeParams: { length },\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 diagnostics,\n sourceId,\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('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,5 +1,5 @@
|
|
|
1
|
+
import { ContractConfig } from "@prisma-next/config/config-types";
|
|
1
2
|
import { TargetPackRef } from "@prisma-next/contract/framework-components";
|
|
2
|
-
import { ContractConfig } from "@prisma-next/core-control-plane/config-types";
|
|
3
3
|
|
|
4
4
|
//#region src/provider.d.ts
|
|
5
5
|
interface PrismaContractOptions {
|
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,CAAA,EAEG,aAFkB,CAAA,KAElB,EAAA,UAAa,CAAA;EAajB;;;;;;;;;;;iBAAA,cAAA,+BAEJ,wBACT"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as interpretPslDocumentToSqlContractIR } from "./interpreter-
|
|
1
|
+
import { n as createBuiltinDefaultFunctionRegistry, t as interpretPslDocumentToSqlContractIR } from "./interpreter-IXr5c7s7.mjs";
|
|
2
|
+
import { ifDefined } from "@prisma-next/utils/defined";
|
|
2
3
|
import { notOk } 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
|
|
@@ -35,7 +35,8 @@ function prismaContract(schemaPath, options) {
|
|
|
35
35
|
sourceId: schemaPath
|
|
36
36
|
}),
|
|
37
37
|
...ifDefined("target", options?.target),
|
|
38
|
-
...ifDefined("composedExtensionPacks", options?.composedExtensionPacks)
|
|
38
|
+
...ifDefined("composedExtensionPacks", options?.composedExtensionPacks),
|
|
39
|
+
defaultFunctionRegistry: createBuiltinDefaultFunctionRegistry()
|
|
39
40
|
});
|
|
40
41
|
},
|
|
41
42
|
...ifDefined("output", options?.output)
|
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 {
|
|
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 { createBuiltinDefaultFunctionRegistry } from './default-function-registry';\nimport { interpretPslDocumentToSqlContractIR } from './interpreter';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target?: TargetPackRef<'sql', 'postgres'>;\n /**\n * Milestone-local namespace availability hook.\n *\n * This currently models composed extension packs by id only (for example `[\"pgvector\"]`),\n * and is sufficient for namespace presence checks in the PSL interpreter.\n *\n * Future milestones can evolve this to richer composed pack metadata/manifests when\n * attribute-level schema/argument validation needs to move beyond namespace existence.\n */\n readonly composedExtensionPacks?: readonly string[];\n}\n\nexport function prismaContract(\n schemaPath: string,\n options?: PrismaContractOptions,\n): ContractConfig {\n return {\n source: async () => {\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\n return interpretPslDocumentToSqlContractIR({\n document,\n ...ifDefined('target', options?.target),\n ...ifDefined('composedExtensionPacks', options?.composedExtensionPacks),\n defaultFunctionRegistry: createBuiltinDefaultFunctionRegistry(),\n });\n },\n ...ifDefined('output', options?.output),\n };\n}\n"],"mappings":";;;;;;;;AAyBA,SAAgB,eACd,YACA,SACgB;AAChB,QAAO;EACL,QAAQ,YAAY;GAClB,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;;AAQJ,UAAO,oCAAoC;IACzC,UANe,iBAAiB;KAChC;KACA,UAAU;KACX,CAAC;IAIA,GAAG,UAAU,UAAU,SAAS,OAAO;IACvC,GAAG,UAAU,0BAA0B,SAAS,uBAAuB;IACvE,yBAAyB,sCAAsC;IAChE,CAAC;;EAEJ,GAAG,UAAU,UAAU,SAAS,OAAO;EACxC"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-psl",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
3
|
+
"version": "0.3.0-dev.63",
|
|
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/
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/utils": "0.3.0-dev.
|
|
13
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/psl-parser": "0.3.0-dev.63",
|
|
10
|
+
"@prisma-next/sql-contract-ts": "0.3.0-dev.63",
|
|
11
|
+
"@prisma-next/config": "0.3.0-dev.63",
|
|
12
|
+
"@prisma-next/utils": "0.3.0-dev.63",
|
|
13
|
+
"@prisma-next/contract": "0.3.0-dev.63"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"tsdown": "0.18.4",
|
|
17
17
|
"typescript": "5.9.3",
|
|
18
18
|
"vitest": "4.0.17",
|
|
19
|
-
"@prisma-next/
|
|
20
|
-
"@prisma-next/
|
|
19
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
20
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|