@prisma-next/sql-contract-psl 0.3.0-dev.55 → 0.3.0-dev.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"interpreter-_6-Xk1_m.mjs","names":["DEFAULT_POSTGRES_TARGET: TargetPackRef<'sql', 'postgres'>","SCALAR_COLUMN_MAP: Record<string, ColumnDescriptor>","resolvedFields: ResolvedField[]","columns: string[]","diagnostics: ContractSourceDiagnostic[]","descriptor: ColumnDescriptor","options: {\n type: ColumnDescriptor;\n nullable?: true;\n default?: ColumnDefault;\n }"],"sources":["../src/interpreter.ts"],"sourcesContent":["import type { TargetPackRef } from '@prisma-next/contract/framework-components';\nimport type { ContractIR } from '@prisma-next/contract/ir';\nimport type { ColumnDefault } from '@prisma-next/contract/types';\nimport type {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/core-control-plane/config-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 { notOk, ok, type Result } from '@prisma-next/utils/result';\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}\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 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 isId: boolean;\n readonly isUnique: boolean;\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 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};\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 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 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 parseDefaultValueExpression(expression: string): ColumnDefault | undefined {\n const trimmed = expression.trim();\n if (trimmed === 'autoincrement()') {\n return { kind: 'function', expression: 'autoincrement()' };\n }\n if (trimmed === 'now()') {\n return { kind: 'function', expression: 'now()' };\n }\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 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 diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n): ResolvedField[] {\n const resolvedFields: ResolvedField[] = [];\n\n for (const field of model.fields) {\n if (field.list) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_LIST',\n message: `Field \"${model.name}.${field.name}\" uses list types, which are not supported in SQL PSL provider v1`,\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 defaultValueRaw = defaultAttribute ? getPositionalArgument(defaultAttribute) : undefined;\n const defaultValue = defaultValueRaw ? parseDefaultValueExpression(defaultValueRaw) : undefined;\n if (defaultAttribute && defaultValueRaw && !defaultValue) {\n diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_VALUE',\n message: `Unsupported default value \"${defaultValueRaw}\"`,\n sourceId,\n span: defaultAttribute.span,\n });\n }\n const mappedColumnName = mapping.fieldColumns.get(field.name) ?? field.name;\n resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...(defaultValue ? { defaultValue } : {}),\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 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 parseRelationAttribute(input: {\n readonly attribute: PslAttribute;\n readonly modelName: string;\n readonly fieldName: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}):\n | {\n readonly fields: readonly string[];\n readonly references: readonly string[];\n readonly onDelete?: string;\n readonly onUpdate?: string;\n }\n | undefined {\n for (const arg of input.attribute.args) {\n if (arg.kind === 'positional') {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" must use named arguments`,\n sourceId: input.sourceId,\n span: arg.span,\n });\n return undefined;\n }\n if (\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 fieldsRaw = getNamedArgument(input.attribute, 'fields');\n const referencesRaw = getNamedArgument(input.attribute, 'references');\n if (!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 const fields = parseFieldList(fieldsRaw);\n const references = parseFieldList(referencesRaw);\n if (!fields || !references || fields.length === 0 || references.length === 0) {\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\n return {\n fields,\n references,\n ...(getNamedArgument(input.attribute, 'onDelete')\n ? { onDelete: unquoteStringLiteral(getNamedArgument(input.attribute, 'onDelete') ?? '') }\n : {}),\n ...(getNamedArgument(input.attribute, 'onUpdate')\n ? { onUpdate: unquoteStringLiteral(getNamedArgument(input.attribute, 'onUpdate') ?? '') }\n : {}),\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\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\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 diagnostics,\n sourceId,\n );\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 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 const options: {\n type: ColumnDescriptor;\n nullable?: true;\n default?: ColumnDefault;\n } = {\n type: resolvedField.descriptor,\n ...(resolvedField.field.optional ? { nullable: true as const } : {}),\n ...(resolvedField.defaultValue ? { default: resolvedField.defaultValue } : {}),\n };\n table = table.column(resolvedField.columnName, options);\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 (!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\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\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 ...(onDelete ? { onDelete } : {}),\n ...(onUpdate ? { onUpdate } : {}),\n },\n );\n }\n\n return table;\n });\n\n builder = builder.model(model.name, tableName, (modelBuilder: DynamicModelBuilder) => {\n let next = modelBuilder;\n for (const resolvedField of resolvedFields) {\n next = next.field(resolvedField.field.name, resolvedField.columnName);\n }\n return next;\n });\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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"}