@prisma-next/sql-contract-psl 0.3.0-dev.71 → 0.4.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -17
- package/dist/default-function-registry-DUMRIhJH.d.mts +71 -0
- package/dist/default-function-registry-DUMRIhJH.d.mts.map +1 -0
- package/dist/index.d.mts +18 -42
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/interpreter-iFCRN9nb.mjs +2343 -0
- package/dist/interpreter-iFCRN9nb.mjs.map +1 -0
- package/dist/provider.d.mts +14 -12
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +20 -13
- package/dist/provider.mjs.map +1 -1
- package/package.json +9 -6
- package/src/default-function-registry.ts +52 -300
- package/src/exports/index.ts +10 -2
- package/src/interpreter.ts +1074 -1326
- package/src/provider.ts +44 -25
- package/src/psl-attribute-parsing.ts +303 -0
- package/src/psl-authoring-arguments.ts +454 -0
- package/src/psl-column-resolution.ts +600 -0
- package/src/psl-field-resolution.ts +335 -0
- package/src/psl-relation-resolution.ts +371 -0
- package/dist/interpreter-IXr5c7s7.mjs +0 -1376
- package/dist/interpreter-IXr5c7s7.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter-iFCRN9nb.mjs","names":["columns: string[]","parts: Array<{ raw: string; start: number; end: number }>","quote: '\"' | \"'\" | null","args: DefaultFunctionArgument[]","parsed","result: ParsedPslLiteral[]","result: { [key: string]: ParsedPslLiteral }","parsed: unknown","mappedArgs: unknown[]","descriptor","current: unknown","descriptor","NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>>","BUILTIN_FIELD_ATTRIBUTE_NAMES: ReadonlySet<string>","resolvedFields: ResolvedField[]","descriptor: ColumnDescriptor | undefined","scalarCodecId: string | undefined","relationNameFromPositional: string | undefined","fields: readonly string[] | undefined","references: readonly string[] | undefined","storageTypes: Record<string, StorageTypeInstance>","descriptor: ColumnDescriptor","hasUnsupportedNamedTypeAttribute","descriptor","resultBackrelationCandidates: ModelBackrelationCandidate[]","relationName: string | undefined","uniqueConstraints: UniqueConstraintNode[]","indexNodes: IndexNode[]","foreignKeyNodes: ForeignKeyNode[]","resultFkRelationMetadata: FkRelationMetadata[]","valueObjects: Record<string, ContractValueObject>","fields: Record<string, ContractField>","result: ContractField","scalarField: ContractField","patchedFields: Record<string, ContractField>","variants: Record<string, { readonly value: string }>","diagnostics: ContractSourceDiagnostic[]","defaultFunctionRegistry: ControlMutationDefaultRegistry","modelNodes: ModelNode[]","fkRelationMetadata: FkRelationMetadata[]","backrelationCandidates: ModelBackrelationCandidate[]","polyDiagnostics: ContractSourceDiagnostic[]"],"sources":["../src/psl-attribute-parsing.ts","../src/default-function-registry.ts","../src/psl-authoring-arguments.ts","../src/psl-column-resolution.ts","../src/psl-field-resolution.ts","../src/psl-relation-resolution.ts","../src/interpreter.ts"],"sourcesContent":["import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { PslAttribute, PslSpan } from '@prisma-next/psl-parser';\nimport { getPositionalArgument, parseQuotedStringLiteral } from '@prisma-next/psl-parser';\n\nexport { getPositionalArgument, parseQuotedStringLiteral };\n\nexport function lowerFirst(value: string): string {\n if (value.length === 0) return value;\n return value[0]?.toLowerCase() + value.slice(1);\n}\n\nexport function getAttribute(\n attributes: readonly PslAttribute[] | undefined,\n name: string,\n): PslAttribute | undefined {\n return attributes?.find((attribute) => attribute.name === name);\n}\n\nexport function getNamedArgument(attribute: PslAttribute, name: string): string | undefined {\n const entry = attribute.args.find((arg) => arg.kind === 'named' && arg.name === name);\n if (!entry || entry.kind !== 'named') {\n return undefined;\n }\n return entry.value;\n}\n\nexport function getPositionalArgumentEntry(\n attribute: PslAttribute,\n index = 0,\n): { value: string; span: PslSpan } | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n const entry = entries[index];\n if (!entry || entry.kind !== 'positional') {\n return undefined;\n }\n return {\n value: entry.value,\n span: entry.span,\n };\n}\n\nexport function unquoteStringLiteral(value: string): string {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) {\n return trimmed;\n }\n return match[2] ?? '';\n}\n\nexport function parseFieldList(value: string): readonly string[] | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n return undefined;\n }\n const body = trimmed.slice(1, -1);\n const parts = body\n .split(',')\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n return parts;\n}\n\nexport function parseMapName(input: {\n readonly attribute: PslAttribute | undefined;\n readonly defaultValue: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n}): string {\n if (!input.attribute) {\n return input.defaultValue;\n }\n\n const value = getPositionalArgument(input.attribute);\n if (!value) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n const parsed = parseQuotedStringLiteral(value);\n if (parsed === undefined) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} @map requires a positional quoted string literal argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return input.defaultValue;\n }\n return parsed;\n}\n\nexport function parseConstraintMapArgument(input: {\n readonly attribute: PslAttribute | undefined;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly entityLabel: string;\n readonly span: PslSpan;\n readonly code: string;\n}): string | undefined {\n if (!input.attribute) {\n return undefined;\n }\n\n const raw = getNamedArgument(input.attribute, 'map');\n if (!raw) {\n return undefined;\n }\n\n const parsed = parseQuotedStringLiteral(raw);\n if (parsed !== undefined) {\n return parsed;\n }\n\n input.diagnostics.push({\n code: input.code,\n message: `${input.entityLabel} map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function getPositionalArguments(attribute: PslAttribute): readonly string[] {\n return attribute.args\n .filter((arg) => arg.kind === 'positional')\n .map((arg) => (arg.kind === 'positional' ? arg.value : ''));\n}\n\nexport function pushInvalidAttributeArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseOptionalSingleIntegerArgument(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n readonly minimum: number;\n readonly valueLabel: string;\n}): number | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero or one positional integer argument.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const parsed = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(parsed) || parsed < input.minimum) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a ${input.valueLabel}.`,\n });\n }\n\n return parsed;\n}\n\nexport function parseOptionalNumericArguments(input: {\n readonly attribute: PslAttribute;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): { precision: number; scale?: number } | null | undefined {\n if (input.attribute.args.some((arg) => arg.kind === 'named')) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n\n const positionalArguments = getPositionalArguments(input.attribute);\n if (positionalArguments.length > 2) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} accepts zero, one, or two positional integer arguments.`,\n });\n }\n if (positionalArguments.length === 0) {\n return null;\n }\n\n const precision = Number(unquoteStringLiteral(positionalArguments[0] ?? ''));\n if (!Number.isInteger(precision) || precision < 1) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a positive integer precision.`,\n });\n }\n\n if (positionalArguments.length === 1) {\n return { precision };\n }\n\n const scale = Number(unquoteStringLiteral(positionalArguments[1] ?? ''));\n if (!Number.isInteger(scale) || scale < 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} requires a non-negative integer scale.`,\n });\n }\n\n return { precision, scale };\n}\n\nexport function parseAttributeFieldList(input: {\n readonly attribute: PslAttribute;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly code: string;\n readonly messagePrefix: string;\n}): readonly string[] | undefined {\n const raw = getNamedArgument(input.attribute, 'fields') ?? getPositionalArgument(input.attribute);\n if (!raw) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.messagePrefix} requires fields list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const fields = parseFieldList(raw);\n if (!fields || fields.length === 0) {\n input.diagnostics.push({\n code: input.code,\n message: `${input.messagePrefix} requires bracketed field list argument`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n return fields;\n}\n\nexport function mapFieldNamesToColumns(input: {\n readonly modelName: string;\n readonly fieldNames: readonly string[];\n readonly mapping: { readonly fieldColumns: Map<string, string> };\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly span: PslSpan;\n readonly contextLabel: string;\n}): readonly string[] | undefined {\n const columns: string[] = [];\n for (const fieldName of input.fieldNames) {\n const columnName = input.mapping.fieldColumns.get(fieldName);\n if (!columnName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.contextLabel} references unknown field \"${input.modelName}.${fieldName}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n }\n columns.push(columnName);\n }\n return columns;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { PslSpan } from '@prisma-next/psl-parser';\n\ninterface DefaultFunctionArgument {\n readonly raw: string;\n readonly span: PslSpan;\n}\n\nexport interface ParsedDefaultFunctionCall {\n readonly name: string;\n readonly raw: string;\n readonly args: readonly DefaultFunctionArgument[];\n readonly span: PslSpan;\n}\n\nexport interface DefaultFunctionLoweringContext {\n readonly sourceId: string;\n readonly modelName: string;\n readonly fieldName: string;\n readonly columnCodecId?: string;\n}\n\nexport type LoweredDefaultValue =\n | { readonly kind: 'storage'; readonly defaultValue: ColumnDefault }\n | { readonly kind: 'execution'; readonly generated: ExecutionMutationDefaultValue };\n\nexport type LoweredDefaultResult =\n | { readonly ok: true; readonly value: LoweredDefaultValue }\n | { readonly ok: false; readonly diagnostic: ContractSourceDiagnostic };\n\nexport type DefaultFunctionLoweringHandler = (input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n}) => LoweredDefaultResult;\n\nexport interface DefaultFunctionRegistryEntry {\n readonly lower: DefaultFunctionLoweringHandler;\n readonly usageSignatures?: readonly string[];\n}\n\nexport type DefaultFunctionRegistry = ReadonlyMap<string, DefaultFunctionRegistryEntry>;\n\nexport interface MutationDefaultGeneratorDescriptor {\n readonly id: string;\n readonly applicableCodecIds: readonly string[];\n readonly resolveGeneratedColumnDescriptor?: (input: {\n readonly generated: ExecutionMutationDefaultValue;\n }) =>\n | {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n }\n | undefined;\n}\n\nexport interface ControlMutationDefaultEntry {\n readonly lower: (input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly context: DefaultFunctionLoweringContext;\n }) => LoweredDefaultResult;\n readonly usageSignatures?: readonly string[];\n}\n\nexport type ControlMutationDefaultRegistry = ReadonlyMap<string, ControlMutationDefaultEntry>;\n\nexport interface ControlMutationDefaults {\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptors: readonly MutationDefaultGeneratorDescriptor[];\n}\n\nfunction resolveSpanPositionFromBase(\n base: PslSpan,\n text: string,\n offset: number,\n): PslSpan['start'] {\n const safeOffset = Math.min(Math.max(0, offset), text.length);\n let line = base.start.line;\n let column = base.start.column;\n\n for (let index = 0; index < safeOffset; index += 1) {\n const character = text[index] ?? '';\n if (character === '\\r') {\n if (text[index + 1] === '\\n' && index + 1 < safeOffset) {\n index += 1;\n }\n line += 1;\n column = 1;\n continue;\n }\n if (character === '\\n') {\n line += 1;\n column = 1;\n continue;\n }\n column += 1;\n }\n\n return {\n offset: base.start.offset + safeOffset,\n line,\n column,\n };\n}\n\nfunction createSpanFromBase(\n base: PslSpan,\n startOffset: number,\n endOffset: number,\n text: string,\n): PslSpan {\n const safeStart = Math.max(0, Math.min(startOffset, text.length));\n const safeEnd = Math.max(safeStart, Math.min(endOffset, text.length));\n return {\n start: resolveSpanPositionFromBase(base, text, safeStart),\n end: resolveSpanPositionFromBase(base, text, safeEnd),\n };\n}\n\nfunction splitTopLevelArgs(raw: string): Array<{ raw: string; start: number; end: number }> {\n if (raw.trim().length === 0) {\n return [];\n }\n\n const parts: Array<{ raw: string; start: number; end: number }> = [];\n let depthParen = 0;\n let depthBracket = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n\n for (let index = 0; index < raw.length; index += 1) {\n const character = raw[index] ?? '';\n if (quote) {\n if (character === quote && raw[index - 1] !== '\\\\') {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n\n if (character === ',' && depthParen === 0 && depthBracket === 0) {\n parts.push({\n raw: raw.slice(start, index),\n start,\n end: index,\n });\n start = index + 1;\n }\n }\n\n parts.push({\n raw: raw.slice(start),\n start,\n end: raw.length,\n });\n\n return parts;\n}\n\nexport function parseDefaultFunctionCall(\n expression: string,\n expressionSpan: PslSpan,\n): ParsedDefaultFunctionCall | undefined {\n const trimmed = expression.trim();\n const leadingWhitespace = expression.length - expression.trimStart().length;\n const trailingWhitespace = expression.length - expression.trimEnd().length;\n const contentEnd = expression.length - trailingWhitespace;\n\n const openParen = trimmed.indexOf('(');\n const closeParen = trimmed.lastIndexOf(')');\n if (openParen <= 0 || closeParen !== trimmed.length - 1) {\n return undefined;\n }\n\n const functionName = trimmed.slice(0, openParen).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(functionName)) {\n return undefined;\n }\n\n const functionArgsRaw = trimmed.slice(openParen + 1, closeParen);\n const parts = splitTopLevelArgs(functionArgsRaw);\n const args: DefaultFunctionArgument[] = [];\n for (const part of parts) {\n const raw = part.raw.trim();\n if (raw.length === 0) {\n return undefined;\n }\n const leadingPartWhitespace = part.raw.length - part.raw.trimStart().length;\n const argStart = leadingWhitespace + openParen + 1 + part.start + leadingPartWhitespace;\n const argEnd = argStart + raw.length;\n args.push({\n raw,\n span: createSpanFromBase(expressionSpan, argStart, argEnd, expression),\n });\n }\n\n const functionStart = leadingWhitespace;\n const functionEnd = contentEnd;\n return {\n name: functionName,\n raw: trimmed,\n args,\n span: createSpanFromBase(expressionSpan, functionStart, functionEnd, expression),\n };\n}\n\nfunction formatSupportedFunctionList(registry: ControlMutationDefaultRegistry): string {\n const signatures = Array.from(registry.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .flatMap(([functionName, entry]) => {\n const usageSignatures = entry.usageSignatures?.filter((signature) => signature.length > 0);\n return usageSignatures && usageSignatures.length > 0\n ? usageSignatures\n : [`${functionName}()`];\n });\n return signatures.length > 0 ? signatures.join(', ') : 'none';\n}\n\nexport function lowerDefaultFunctionWithRegistry(input: {\n readonly call: ParsedDefaultFunctionCall;\n readonly registry: ControlMutationDefaultRegistry;\n readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n const entry = input.registry.get(input.call.name);\n if (entry) {\n return entry.lower({ call: input.call, context: input.context });\n }\n const supportedFunctionList = formatSupportedFunctionList(input.registry);\n\n return {\n ok: false,\n diagnostic: {\n code: 'PSL_UNKNOWN_DEFAULT_FUNCTION',\n message: `Default function \"${input.call.name}\" is not supported in SQL PSL provider v1. Supported functions: ${supportedFunctionList}.`,\n sourceId: input.context.sourceId,\n span: input.call.span,\n },\n };\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { AuthoringArgumentDescriptor } from '@prisma-next/framework-components/authoring';\nimport type { PslAttributeArgument, PslSpan } from '@prisma-next/psl-parser';\nimport { unquoteStringLiteral } from './psl-attribute-parsing';\n\nconst INVALID_AUTHORING_ARGUMENT = Symbol('invalidAuthoringArgument');\n\ntype ParsedPslLiteral =\n | string\n | number\n | boolean\n | null\n | ParsedPslLiteral[]\n | { [key: string]: ParsedPslLiteral };\n\nfunction isIdentifierStartCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z_$]/.test(character);\n}\n\nfunction isIdentifierCharacter(character: string | undefined): boolean {\n return character !== undefined && /[A-Za-z0-9_$]/.test(character);\n}\n\nfunction parseJsLikeLiteral(value: string): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n let index = 0;\n\n function skipWhitespace() {\n while (/\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n }\n\n function parseIdentifier(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const first = value[index];\n if (!isIdentifierStartCharacter(first)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let end = index + 1;\n while (isIdentifierCharacter(value[end])) {\n end += 1;\n }\n\n const identifier = value.slice(index, end);\n index = end;\n return identifier;\n }\n\n function parseString(): string | typeof INVALID_AUTHORING_ARGUMENT {\n const quote = value[index];\n if (quote !== '\"' && quote !== \"'\") {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n let result = '';\n\n while (index < value.length) {\n const character = value[index];\n index += 1;\n\n if (character === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n if (character === quote) {\n return result;\n }\n\n if (character !== '\\\\') {\n result += character;\n continue;\n }\n\n const escaped = value[index];\n index += 1;\n\n if (escaped === undefined) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n switch (escaped) {\n case \"'\":\n case '\"':\n case '\\\\':\n case '/':\n result += escaped;\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'u': {\n const hex = value.slice(index, index + 4);\n if (!/^[0-9A-Fa-f]{4}$/.test(hex)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result += String.fromCharCode(Number.parseInt(hex, 16));\n index += 4;\n break;\n }\n default:\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseNumber(): number | typeof INVALID_AUTHORING_ARGUMENT {\n const match = value.slice(index).match(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/);\n const raw = match?.[0];\n if (!raw) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n const parsed = Number(raw);\n if (!Number.isFinite(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += raw.length;\n return parsed;\n }\n\n function parseArray(): ParsedPslLiteral[] | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '[') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: ParsedPslLiteral[] = [];\n\n skipWhitespace();\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result.push(entry);\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === ']') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseObject(): { [key: string]: ParsedPslLiteral } | typeof INVALID_AUTHORING_ARGUMENT {\n if (value[index] !== '{') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const result: { [key: string]: ParsedPslLiteral } = {};\n\n skipWhitespace();\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n\n while (index < value.length) {\n skipWhitespace();\n const key = value[index] === '\"' || value[index] === \"'\" ? parseString() : parseIdentifier();\n if (key === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n if (value[index] !== ':') {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n index += 1;\n const entry = parseValue();\n if (entry === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n result[key] = entry;\n\n skipWhitespace();\n if (value[index] === ',') {\n index += 1;\n skipWhitespace();\n continue;\n }\n if (value[index] === '}') {\n index += 1;\n return result;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n function parseValue(): ParsedPslLiteral | typeof INVALID_AUTHORING_ARGUMENT {\n skipWhitespace();\n const character = value[index];\n if (character === '{') {\n return parseObject();\n }\n if (character === '[') {\n return parseArray();\n }\n if (character === '\"' || character === \"'\") {\n return parseString();\n }\n if (character === '-' || /\\d/.test(character ?? '')) {\n return parseNumber();\n }\n\n const identifier = parseIdentifier();\n if (identifier === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (identifier === 'true') {\n return true;\n }\n if (identifier === 'false') {\n return false;\n }\n if (identifier === 'null') {\n return null;\n }\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n skipWhitespace();\n const parsed = parseValue();\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return parsed;\n }\n\n skipWhitespace();\n return index === value.length ? parsed : INVALID_AUTHORING_ARGUMENT;\n}\n\nfunction parseStringArrayLiteral(\n value: string,\n): readonly string[] | typeof INVALID_AUTHORING_ARGUMENT {\n const parsed = parseJsLikeLiteral(value);\n if (parsed === INVALID_AUTHORING_ARGUMENT || !Array.isArray(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n if (!parsed.every((item): item is string => typeof item === 'string')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n return parsed;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parsePslObjectLiteral(\n value: string,\n): Record<string, unknown> | typeof INVALID_AUTHORING_ARGUMENT {\n const trimmed = value.trim();\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n parsed = parseJsLikeLiteral(trimmed);\n if (parsed === INVALID_AUTHORING_ARGUMENT) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n\n if (!isPlainObject(parsed)) {\n return INVALID_AUTHORING_ARGUMENT;\n }\n\n return parsed;\n}\n\nfunction parsePslAuthoringArgumentValue(\n descriptor: AuthoringArgumentDescriptor,\n rawValue: string,\n): unknown | typeof INVALID_AUTHORING_ARGUMENT {\n switch (descriptor.kind) {\n case 'string':\n return unquoteStringLiteral(rawValue);\n case 'number': {\n const parsed = Number(unquoteStringLiteral(rawValue));\n return Number.isNaN(parsed) ? INVALID_AUTHORING_ARGUMENT : parsed;\n }\n case 'stringArray':\n return parseStringArrayLiteral(rawValue);\n case 'object':\n return parsePslObjectLiteral(rawValue);\n default: {\n const _exhaustive: never = descriptor;\n void _exhaustive;\n return INVALID_AUTHORING_ARGUMENT;\n }\n }\n}\n\nfunction pushInvalidPslHelperArgument(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly entityLabel: string;\n readonly helperLabel: string;\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} ${input.helperLabel} ${input.message}`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function mapPslHelperArgs(input: {\n readonly args: readonly PslAttributeArgument[];\n readonly descriptors: readonly AuthoringArgumentDescriptor[];\n readonly helperLabel: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): readonly unknown[] | undefined {\n const mappedArgs: unknown[] = input.descriptors.map(() => undefined);\n\n const positionalArgs = input.args.filter((arg) => arg.kind === 'positional');\n const namedArgs = input.args.filter((arg) => arg.kind === 'named');\n\n if (positionalArgs.length > input.descriptors.length) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `accepts at most ${input.descriptors.length} argument(s), received ${positionalArgs.length}.`,\n });\n }\n\n for (const [index, argument] of positionalArgs.entries()) {\n const descriptor = input.descriptors[index];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define positional argument #${index + 1}.`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse argument #${index + 1} for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[index] = value;\n }\n\n for (const argument of namedArgs) {\n const descriptorIndex = input.descriptors.findIndex(\n (descriptor) => descriptor.name === argument.name,\n );\n if (descriptorIndex < 0) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received unknown named argument \"${argument.name}\".`,\n });\n }\n\n if (mappedArgs[descriptorIndex] !== undefined) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `received duplicate value for argument \"${argument.name}\".`,\n });\n }\n\n const descriptor = input.descriptors[descriptorIndex];\n if (!descriptor) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `does not define named argument \"${argument.name}\".`,\n });\n }\n\n const value = parsePslAuthoringArgumentValue(descriptor, argument.value);\n if (value === INVALID_AUTHORING_ARGUMENT) {\n return pushInvalidPslHelperArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: argument.span,\n entityLabel: input.entityLabel,\n helperLabel: input.helperLabel,\n message: `cannot parse named argument \"${argument.name}\" for descriptor kind \"${descriptor.kind}\".`,\n });\n }\n\n mappedArgs[descriptorIndex] = value;\n }\n\n return mappedArgs;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n instantiateAuthoringTypeConstructor,\n isAuthoringTypeConstructorDescriptor,\n validateAuthoringHelperArguments,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n PslAttribute,\n PslField,\n PslSpan,\n PslTypeConstructorCall,\n} from '@prisma-next/psl-parser';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n lowerDefaultFunctionWithRegistry,\n parseDefaultFunctionCall,\n} from './default-function-registry';\nimport {\n getPositionalArgumentEntry,\n getPositionalArguments,\n parseOptionalNumericArguments,\n parseOptionalSingleIntegerArgument,\n pushInvalidAttributeArgument,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { mapPslHelperArgs } from './psl-authoring-arguments';\n\nexport type ColumnDescriptor = {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n};\n\nexport function toNamedTypeFieldDescriptor(\n typeRef: string,\n descriptor: Pick<ColumnDescriptor, 'codecId' | 'nativeType'>,\n): ColumnDescriptor {\n return {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeRef,\n };\n}\n\nexport function getAuthoringTypeConstructor(\n contributions: AuthoringContributions | undefined,\n path: readonly string[],\n): AuthoringTypeConstructorDescriptor | undefined {\n let current: unknown = contributions?.type;\n\n for (const segment of path) {\n if (typeof current !== 'object' || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n return isAuthoringTypeConstructorDescriptor(current) ? current : undefined;\n}\n\n/**\n * Returns the namespace prefix of `attributeName` if it references an\n * unrecognized extension namespace, otherwise `undefined`. A namespace is\n * considered recognized when it is:\n *\n * - `db` (native-type spec, always allowed),\n * - the active family id (e.g. `sql`),\n * - the active target id (e.g. `postgres`),\n * - present in `composedExtensions`.\n *\n * Family/target namespaces are exempted so that e.g. `@sql.foo` surfaces as\n * PSL_UNSUPPORTED_*_ATTRIBUTE (the attribute isn't defined) rather than\n * PSL_EXTENSION_NAMESPACE_NOT_COMPOSED (the namespace is already composed).\n */\nexport function checkUncomposedNamespace(\n attributeName: string,\n composedExtensions: ReadonlySet<string>,\n context?: { readonly familyId?: string; readonly targetId?: string },\n): string | undefined {\n const dotIndex = attributeName.indexOf('.');\n if (dotIndex <= 0 || dotIndex === attributeName.length - 1) {\n return undefined;\n }\n const namespace = attributeName.slice(0, dotIndex);\n if (\n namespace === 'db' ||\n namespace === context?.familyId ||\n namespace === context?.targetId ||\n composedExtensions.has(namespace)\n ) {\n return undefined;\n }\n return namespace;\n}\n\n/**\n * Pushes the canonical `PSL_EXTENSION_NAMESPACE_NOT_COMPOSED` diagnostic for a\n * subject (attribute, model attribute, or type constructor) that references an\n * extension namespace which is not composed in the current contract.\n *\n * The `data` payload carries the missing namespace so machine consumers\n * (agents, IDE extensions, CLI auto-fix) don't have to parse the prose.\n */\nexport function reportUncomposedNamespace(input: {\n readonly subjectLabel: string;\n readonly namespace: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): void {\n input.diagnostics.push({\n code: 'PSL_EXTENSION_NAMESPACE_NOT_COMPOSED',\n message: `${input.subjectLabel} uses unrecognized namespace \"${input.namespace}\". Add extension pack \"${input.namespace}\" to extensionPacks in prisma-next.config.ts.`,\n sourceId: input.sourceId,\n span: input.span,\n data: { namespace: input.namespace, suggestedPack: input.namespace },\n });\n}\n\nexport function instantiatePslTypeConstructor(input: {\n readonly call: PslTypeConstructorCall;\n readonly descriptor: AuthoringTypeConstructorDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}):\n | {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n }\n | undefined {\n const helperPath = input.call.path.join('.');\n const args = mapPslHelperArgs({\n args: input.call.args,\n descriptors: input.descriptor.args ?? [],\n helperLabel: `constructor \"${helperPath}\"`,\n span: input.call.span,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!args) {\n return undefined;\n }\n\n try {\n validateAuthoringHelperArguments(helperPath, input.descriptor.args, args);\n return instantiateAuthoringTypeConstructor(input.descriptor, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `${input.entityLabel} constructor \"${helperPath}\" ${message}`,\n sourceId: input.sourceId,\n span: input.call.span,\n });\n return undefined;\n }\n}\n\nfunction pushUnsupportedTypeConstructorDiagnostic(input: {\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly code: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly message: string;\n}): undefined {\n input.diagnostics.push({\n code: input.code,\n message: input.message,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function resolvePslTypeConstructorDescriptor(input: {\n readonly call: PslTypeConstructorCall;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE' | 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR';\n readonly unsupportedMessage: string;\n}): AuthoringTypeConstructorDescriptor | undefined {\n const descriptor = getAuthoringTypeConstructor(input.authoringContributions, input.call.path);\n if (descriptor) {\n return descriptor;\n }\n\n const namespace = input.call.path.length > 1 ? input.call.path[0] : undefined;\n if (\n namespace &&\n namespace !== 'db' &&\n namespace !== input.familyId &&\n namespace !== input.targetId &&\n !input.composedExtensions.has(namespace)\n ) {\n reportUncomposedNamespace({\n subjectLabel: `Type constructor \"${input.call.path.join('.')}\"`,\n namespace,\n sourceId: input.sourceId,\n span: input.call.span,\n diagnostics: input.diagnostics,\n });\n return undefined;\n }\n\n return pushUnsupportedTypeConstructorDiagnostic({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.call.span,\n code: input.unsupportedCode,\n message: input.unsupportedMessage,\n });\n}\n\nexport type ResolveFieldTypeResult =\n | { readonly ok: true; readonly descriptor: ColumnDescriptor }\n | { readonly ok: false; readonly alreadyReported: boolean };\n\nexport function resolveFieldTypeDescriptor(input: {\n readonly field: PslField;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ResolveFieldTypeResult {\n if (input.field.typeConstructor) {\n const helperPath = input.field.typeConstructor.path.join('.');\n const descriptor = resolvePslTypeConstructorDescriptor({\n call: input.field.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_FIELD_TYPE',\n unsupportedMessage: `${input.entityLabel} type constructor \"${helperPath}\" is not supported in SQL PSL provider v1`,\n });\n if (!descriptor) {\n return { ok: false, alreadyReported: true };\n }\n\n const instantiated = instantiatePslTypeConstructor({\n call: input.field.typeConstructor,\n descriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (!instantiated) {\n return { ok: false, alreadyReported: true };\n }\n return { ok: true, descriptor: instantiated };\n }\n\n const descriptor = resolveColumnDescriptor(\n input.field,\n input.enumTypeDescriptors,\n input.namedTypeDescriptors,\n input.scalarTypeDescriptors,\n );\n if (!descriptor) {\n return { ok: false, alreadyReported: false };\n }\n return { ok: true, descriptor };\n}\n\n/**\n * Declarative specification for @db.* native type attributes.\n *\n * Argument kinds:\n * - `noArgs`: No arguments accepted; `codecId: null` means inherit from baseDescriptor.\n * - `optionalLength`: Zero or one positional integer (minimum 1), stored as `{ length }`.\n * - `optionalPrecision`: Zero or one positional integer (minimum 0), stored as `{ precision }`.\n * - `optionalNumeric`: Zero, one, or two positional integers (precision + scale).\n */\nexport type NativeTypeSpec =\n | {\n readonly args: 'noArgs';\n readonly baseType: string;\n readonly codecId: string | null;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalLength';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalPrecision';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n }\n | {\n readonly args: 'optionalNumeric';\n readonly baseType: string;\n readonly codecId: string;\n readonly nativeType: string;\n };\n\nexport const NATIVE_TYPE_SPECS: Readonly<Record<string, NativeTypeSpec>> = {\n 'db.VarChar': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/varchar@1',\n nativeType: 'character varying',\n },\n 'db.Char': {\n args: 'optionalLength',\n baseType: 'String',\n codecId: 'sql/char@1',\n nativeType: 'character',\n },\n 'db.Uuid': { args: 'noArgs', baseType: 'String', codecId: null, nativeType: 'uuid' },\n 'db.SmallInt': { args: 'noArgs', baseType: 'Int', codecId: 'pg/int2@1', nativeType: 'int2' },\n 'db.Real': { args: 'noArgs', baseType: 'Float', codecId: 'pg/float4@1', nativeType: 'float4' },\n 'db.Numeric': {\n args: 'optionalNumeric',\n baseType: 'Decimal',\n codecId: 'pg/numeric@1',\n nativeType: 'numeric',\n },\n 'db.Timestamp': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamp@1',\n nativeType: 'timestamp',\n },\n 'db.Timestamptz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timestamptz@1',\n nativeType: 'timestamptz',\n },\n 'db.Date': { args: 'noArgs', baseType: 'DateTime', codecId: null, nativeType: 'date' },\n 'db.Time': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/time@1',\n nativeType: 'time',\n },\n 'db.Timetz': {\n args: 'optionalPrecision',\n baseType: 'DateTime',\n codecId: 'pg/timetz@1',\n nativeType: 'timetz',\n },\n 'db.Json': { args: 'noArgs', baseType: 'Json', codecId: 'pg/json@1', nativeType: 'json' },\n};\n\nexport function resolveDbNativeTypeAttribute(input: {\n readonly attribute: PslAttribute;\n readonly baseType: string;\n readonly baseDescriptor: ColumnDescriptor;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly entityLabel: string;\n}): ColumnDescriptor | undefined {\n const spec = NATIVE_TYPE_SPECS[input.attribute.name];\n if (!spec) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `${input.entityLabel} uses unsupported attribute \"@${input.attribute.name}\"`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (input.baseType !== spec.baseType) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} uses @${input.attribute.name} on unsupported base type \"${input.baseType}\". Expected \"${spec.baseType}\".`,\n });\n }\n\n switch (spec.args) {\n case 'noArgs': {\n if (getPositionalArguments(input.attribute).length > 0 || input.attribute.args.length > 0) {\n return pushInvalidAttributeArgument({\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n span: input.attribute.span,\n message: `${input.entityLabel} @${input.attribute.name} does not accept arguments.`,\n });\n }\n return {\n codecId: spec.codecId ?? input.baseDescriptor.codecId,\n nativeType: spec.nativeType,\n };\n }\n case 'optionalLength': {\n const length = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 1,\n valueLabel: 'positive integer length',\n });\n if (length === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(length === null ? {} : { typeParams: { length } }),\n };\n }\n case 'optionalPrecision': {\n const precision = parseOptionalSingleIntegerArgument({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n minimum: 0,\n valueLabel: 'non-negative integer precision',\n });\n if (precision === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(precision === null ? {} : { typeParams: { precision } }),\n };\n }\n case 'optionalNumeric': {\n const numeric = parseOptionalNumericArguments({\n attribute: input.attribute,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: input.entityLabel,\n });\n if (numeric === undefined) {\n return undefined;\n }\n return {\n codecId: spec.codecId,\n nativeType: spec.nativeType,\n ...(numeric === null ? {} : { typeParams: numeric }),\n };\n }\n }\n}\n\nexport function parseDefaultLiteralValue(expression: string): ColumnDefault | undefined {\n const trimmed = expression.trim();\n if (trimmed === 'true' || trimmed === 'false') {\n return { kind: 'literal', value: trimmed === 'true' };\n }\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue) && trimmed.length > 0 && !/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: numericValue };\n }\n if (/^(['\"]).*\\1$/.test(trimmed)) {\n return { kind: 'literal', value: unquoteStringLiteral(trimmed) };\n }\n return undefined;\n}\n\nexport function lowerDefaultForField(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly defaultAttribute: PslAttribute;\n readonly columnDescriptor: ColumnDescriptor;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly sourceId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly defaultValue?: ColumnDefault;\n readonly executionDefault?: ExecutionMutationDefaultValue;\n} {\n const positionalEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'positional');\n const namedEntries = input.defaultAttribute.args.filter((arg) => arg.kind === 'named');\n\n if (namedEntries.length > 0 || positionalEntries.length !== 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires exactly one positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const expressionEntry = getPositionalArgumentEntry(input.defaultAttribute);\n if (!expressionEntry) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${input.modelName}.${input.fieldName}\" requires a positional @default(...) expression.`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const literalDefault = parseDefaultLiteralValue(expressionEntry.value);\n if (literalDefault) {\n return { defaultValue: literalDefault };\n }\n\n const defaultFunctionCall = parseDefaultFunctionCall(expressionEntry.value, expressionEntry.span);\n if (!defaultFunctionCall) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_VALUE',\n message: `Unsupported default value \"${expressionEntry.value}\"`,\n sourceId: input.sourceId,\n span: input.defaultAttribute.span,\n });\n return {};\n }\n\n const lowered = lowerDefaultFunctionWithRegistry({\n call: defaultFunctionCall,\n registry: input.defaultFunctionRegistry,\n context: {\n sourceId: input.sourceId,\n modelName: input.modelName,\n fieldName: input.fieldName,\n columnCodecId: input.columnDescriptor.codecId,\n },\n });\n\n if (!lowered.ok) {\n input.diagnostics.push(lowered.diagnostic);\n return {};\n }\n\n if (lowered.value.kind === 'storage') {\n return { defaultValue: lowered.value.defaultValue };\n }\n\n const generatorDescriptor = input.generatorDescriptorById.get(lowered.value.generated.id);\n if (!generatorDescriptor) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${lowered.value.generated.id}\" is not available in the composed mutation default registry.`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n if (!generatorDescriptor.applicableCodecIds.includes(input.columnDescriptor.codecId)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_APPLICABILITY',\n message: `Default generator \"${generatorDescriptor.id}\" is not applicable to \"${input.modelName}.${input.fieldName}\" with codecId \"${input.columnDescriptor.codecId}\".`,\n sourceId: input.sourceId,\n span: expressionEntry.span,\n });\n return {};\n }\n\n return { executionDefault: lowered.value.generated };\n}\n\nexport function resolveColumnDescriptor(\n field: PslField,\n enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>,\n): ColumnDescriptor | undefined {\n if (field.typeRef && namedTypeDescriptors.has(field.typeRef)) {\n return namedTypeDescriptors.get(field.typeRef);\n }\n if (namedTypeDescriptors.has(field.typeName)) {\n return namedTypeDescriptors.get(field.typeName);\n }\n if (enumTypeDescriptors.has(field.typeName)) {\n return enumTypeDescriptors.get(field.typeName);\n }\n return scalarTypeDescriptors.get(field.typeName);\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { ColumnDefault, ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type { PslAttribute, PslField, PslModel } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type {\n ControlMutationDefaultRegistry,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n getAttribute,\n lowerFirst,\n parseConstraintMapArgument,\n parseMapName,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n lowerDefaultForField,\n reportUncomposedNamespace,\n resolveFieldTypeDescriptor,\n} from './psl-column-resolution';\n\nexport type ResolvedField = {\n readonly field: PslField;\n readonly columnName: string;\n readonly descriptor: ColumnDescriptor;\n readonly defaultValue?: ColumnDefault;\n readonly executionDefault?: ExecutionMutationDefaultValue;\n readonly isId: boolean;\n readonly isUnique: boolean;\n readonly idName?: string;\n readonly uniqueName?: string;\n readonly many?: true;\n readonly valueObjectTypeName?: string;\n readonly scalarCodecId?: string;\n};\n\nexport type ModelNameMapping = {\n readonly model: PslModel;\n readonly tableName: string;\n readonly fieldColumns: Map<string, string>;\n};\n\nexport interface CollectResolvedFieldsInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly composedExtensions: Set<string>;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly familyId: string;\n readonly targetId: string;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n}\n\nconst BUILTIN_FIELD_ATTRIBUTE_NAMES: ReadonlySet<string> = new Set([\n 'id',\n 'unique',\n 'default',\n 'relation',\n 'map',\n]);\n\nfunction validateFieldAttributes(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly composedExtensions: ReadonlySet<string>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n readonly familyId: string;\n readonly targetId: string;\n}): void {\n for (const attribute of input.field.attributes) {\n if (BUILTIN_FIELD_ATTRIBUTE_NAMES.has(attribute.name)) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n continue;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${input.model.name}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n }\n}\n\nfunction extractFieldConstraintNames(input: {\n readonly model: PslModel;\n readonly field: PslField;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): {\n readonly idAttribute: PslAttribute | undefined;\n readonly uniqueAttribute: PslAttribute | undefined;\n readonly idName: string | undefined;\n readonly uniqueName: string | undefined;\n} {\n const idAttribute = getAttribute(input.field.attributes, 'id');\n const uniqueAttribute = getAttribute(input.field.attributes, 'unique');\n const idName = parseConstraintMapArgument({\n attribute: idAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @id`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n const uniqueName = parseConstraintMapArgument({\n attribute: uniqueAttribute,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Field \"${input.model.name}.${input.field.name}\" @unique`,\n span: input.field.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n return { idAttribute, uniqueAttribute, idName, uniqueName };\n}\n\nexport function collectResolvedFields(input: CollectResolvedFieldsInput): ResolvedField[] {\n const {\n model,\n mapping,\n enumTypeDescriptors,\n namedTypeDescriptors,\n modelNames,\n compositeTypeNames,\n composedExtensions,\n authoringContributions,\n familyId,\n targetId,\n defaultFunctionRegistry,\n generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors,\n } = input;\n const resolvedFields: ResolvedField[] = [];\n\n for (const field of model.fields) {\n if (field.list && modelNames.has(field.typeName)) {\n continue;\n }\n\n validateFieldAttributes({\n model,\n field,\n composedExtensions,\n diagnostics,\n sourceId,\n familyId,\n targetId,\n });\n\n const relationAttribute = getAttribute(field.attributes, 'relation');\n if (relationAttribute && modelNames.has(field.typeName)) {\n continue;\n }\n\n const isValueObjectField = compositeTypeNames.has(field.typeName);\n const isListField = field.list;\n\n let descriptor: ColumnDescriptor | undefined;\n let scalarCodecId: string | undefined;\n const resolveInput = {\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n };\n\n if (isValueObjectField) {\n descriptor = scalarTypeDescriptors.get('Json');\n } else if (isListField) {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n scalarCodecId = resolved.descriptor.codecId;\n descriptor = scalarTypeDescriptors.get('Json');\n } else {\n const resolved = resolveFieldTypeDescriptor(resolveInput);\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${model.name}.${field.name}\" type \"${field.typeName}\" is not supported in SQL PSL provider v1`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n descriptor = resolved.descriptor;\n }\n\n if (!descriptor) {\n continue;\n }\n\n const defaultAttribute = getAttribute(field.attributes, 'default');\n const loweredDefault = defaultAttribute\n ? lowerDefaultForField({\n modelName: model.name,\n fieldName: field.name,\n defaultAttribute,\n columnDescriptor: descriptor,\n generatorDescriptorById,\n sourceId,\n defaultFunctionRegistry,\n diagnostics,\n })\n : {};\n if (field.optional && loweredDefault.executionDefault) {\n const generatorDescription =\n loweredDefault.executionDefault.kind === 'generator'\n ? `\"${loweredDefault.executionDefault.id}\"`\n : 'for this field';\n diagnostics.push({\n code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n message: `Field \"${model.name}.${field.name}\" cannot be optional when using execution default ${generatorDescription}. Remove \"?\" or use a storage default.`,\n sourceId,\n span: defaultAttribute?.span ?? field.span,\n });\n continue;\n }\n if (loweredDefault.executionDefault) {\n const generatorDescriptor = generatorDescriptorById.get(loweredDefault.executionDefault.id);\n const generatedDescriptor = generatorDescriptor?.resolveGeneratedColumnDescriptor?.({\n generated: loweredDefault.executionDefault,\n });\n if (generatedDescriptor) {\n descriptor = generatedDescriptor;\n }\n }\n const mappedColumnName = mapping.fieldColumns.get(field.name) ?? field.name;\n const { idAttribute, uniqueAttribute, idName, uniqueName } = extractFieldConstraintNames({\n model,\n field,\n sourceId,\n diagnostics,\n });\n\n resolvedFields.push({\n field,\n columnName: mappedColumnName,\n descriptor,\n ...ifDefined('defaultValue', loweredDefault.defaultValue),\n ...ifDefined('executionDefault', loweredDefault.executionDefault),\n isId: Boolean(idAttribute),\n isUnique: Boolean(uniqueAttribute),\n ...ifDefined('idName', idName),\n ...ifDefined('uniqueName', uniqueName),\n ...ifDefined('many', isListField ? (true as const) : undefined),\n ...ifDefined('valueObjectTypeName', isValueObjectField ? field.typeName : undefined),\n ...ifDefined('scalarCodecId', scalarCodecId),\n });\n }\n\n return resolvedFields;\n}\n\nexport function buildModelMappings(\n models: readonly PslModel[],\n diagnostics: ContractSourceDiagnostic[],\n sourceId: string,\n): Map<string, ModelNameMapping> {\n const result = new Map<string, ModelNameMapping>();\n for (const model of models) {\n const mapAttribute = getAttribute(model.attributes, 'map');\n const tableName = parseMapName({\n attribute: mapAttribute,\n defaultValue: lowerFirst(model.name),\n sourceId,\n diagnostics,\n entityLabel: `Model \"${model.name}\"`,\n span: model.span,\n });\n const fieldColumns = new Map<string, string>();\n for (const field of model.fields) {\n const fieldMapAttribute = getAttribute(field.attributes, 'map');\n const columnName = parseMapName({\n attribute: fieldMapAttribute,\n defaultValue: field.name,\n sourceId,\n diagnostics,\n entityLabel: `Field \"${model.name}.${field.name}\"`,\n span: field.span,\n });\n fieldColumns.set(field.name, columnName);\n }\n result.set(model.name, {\n model,\n tableName,\n fieldColumns,\n });\n }\n return result;\n}\n","import type { ContractSourceDiagnostic } from '@prisma-next/config/config-types';\nimport type { PslAttribute, PslField, PslSpan } from '@prisma-next/psl-parser';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport type { RelationNode } from '@prisma-next/sql-contract-ts/contract-builder';\nimport { assertDefined, invariant } from '@prisma-next/utils/assertions';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n getNamedArgument,\n getPositionalArgumentEntry,\n parseFieldList,\n parseQuotedStringLiteral,\n unquoteStringLiteral,\n} from './psl-attribute-parsing';\nimport { checkUncomposedNamespace, reportUncomposedNamespace } from './psl-column-resolution';\n\nexport const REFERENTIAL_ACTION_MAP = {\n NoAction: 'noAction',\n Restrict: 'restrict',\n Cascade: 'cascade',\n SetNull: 'setNull',\n SetDefault: 'setDefault',\n noAction: 'noAction',\n restrict: 'restrict',\n cascade: 'cascade',\n setNull: 'setNull',\n setDefault: 'setDefault',\n} as const;\n\nexport type ParsedRelationAttribute = {\n readonly relationName?: string;\n readonly fields?: readonly string[];\n readonly references?: readonly string[];\n readonly constraintName?: string;\n readonly onDelete?: string;\n readonly onUpdate?: string;\n};\n\nexport type FkRelationMetadata = {\n readonly declaringModelName: string;\n readonly declaringFieldName: string;\n readonly declaringTableName: string;\n readonly targetModelName: string;\n readonly targetTableName: string;\n readonly relationName?: string;\n readonly localColumns: readonly string[];\n readonly referencedColumns: readonly string[];\n};\n\nexport type ModelBackrelationCandidate = {\n readonly modelName: string;\n readonly tableName: string;\n readonly field: PslField;\n readonly targetModelName: string;\n readonly relationName?: string;\n};\n\ntype ModelRelationMetadata = RelationNode;\n\nexport function fkRelationPairKey(declaringModelName: string, targetModelName: string): string {\n // NOTE: We assume PSL model identifiers do not contain the `::` separator.\n return `${declaringModelName}::${targetModelName}`;\n}\n\nexport function normalizeReferentialAction(input: {\n readonly modelName: string;\n readonly fieldName: string;\n readonly actionName: 'onDelete' | 'onUpdate';\n readonly actionToken: string;\n readonly sourceId: string;\n readonly span: PslSpan;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ReferentialAction | undefined {\n const normalized =\n REFERENTIAL_ACTION_MAP[input.actionToken as keyof typeof REFERENTIAL_ACTION_MAP];\n if (normalized) {\n return normalized;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_REFERENTIAL_ACTION',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported ${input.actionName} action \"${input.actionToken}\"`,\n sourceId: input.sourceId,\n span: input.span,\n });\n return undefined;\n}\n\nexport function parseRelationAttribute(input: {\n readonly attribute: PslAttribute;\n readonly modelName: string;\n readonly fieldName: string;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}): ParsedRelationAttribute | undefined {\n const positionalEntries = input.attribute.args.filter((arg) => arg.kind === 'positional');\n if (positionalEntries.length > 1) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has too many positional arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let relationNameFromPositional: string | undefined;\n const positionalNameEntry = getPositionalArgumentEntry(input.attribute);\n if (positionalNameEntry) {\n const parsedName = parseQuotedStringLiteral(positionalNameEntry.value);\n if (!parsedName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" positional relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: positionalNameEntry.span,\n });\n return undefined;\n }\n relationNameFromPositional = parsedName;\n }\n\n for (const arg of input.attribute.args) {\n if (arg.kind === 'positional') {\n continue;\n }\n if (\n arg.name !== 'name' &&\n arg.name !== 'fields' &&\n arg.name !== 'references' &&\n arg.name !== 'map' &&\n arg.name !== 'onDelete' &&\n arg.name !== 'onUpdate'\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has unsupported argument \"${arg.name}\"`,\n sourceId: input.sourceId,\n span: arg.span,\n });\n return undefined;\n }\n }\n\n const namedRelationNameRaw = getNamedArgument(input.attribute, 'name');\n const namedRelationName = namedRelationNameRaw\n ? parseQuotedStringLiteral(namedRelationNameRaw)\n : undefined;\n if (namedRelationNameRaw && !namedRelationName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" named relation name must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n if (\n relationNameFromPositional &&\n namedRelationName &&\n relationNameFromPositional !== namedRelationName\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" has conflicting positional and named relation names`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n const relationName = namedRelationName ?? relationNameFromPositional;\n\n const constraintNameRaw = getNamedArgument(input.attribute, 'map');\n const constraintName = constraintNameRaw\n ? parseQuotedStringLiteral(constraintNameRaw)\n : undefined;\n if (constraintNameRaw && !constraintName) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" map argument must be a quoted string literal`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n const fieldsRaw = getNamedArgument(input.attribute, 'fields');\n const referencesRaw = getNamedArgument(input.attribute, 'references');\n if ((fieldsRaw && !referencesRaw) || (!fieldsRaw && referencesRaw)) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires fields and references arguments`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n\n let fields: readonly string[] | undefined;\n let references: readonly string[] | undefined;\n if (fieldsRaw && referencesRaw) {\n const parsedFields = parseFieldList(fieldsRaw);\n const parsedReferences = parseFieldList(referencesRaw);\n if (\n !parsedFields ||\n !parsedReferences ||\n parsedFields.length === 0 ||\n parsedReferences.length === 0\n ) {\n input.diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${input.modelName}.${input.fieldName}\" requires bracketed fields and references lists`,\n sourceId: input.sourceId,\n span: input.attribute.span,\n });\n return undefined;\n }\n fields = parsedFields;\n references = parsedReferences;\n }\n\n const onDeleteArgument = getNamedArgument(input.attribute, 'onDelete');\n const onUpdateArgument = getNamedArgument(input.attribute, 'onUpdate');\n\n return {\n ...ifDefined('relationName', relationName),\n ...ifDefined('fields', fields),\n ...ifDefined('references', references),\n ...ifDefined('constraintName', constraintName),\n ...ifDefined('onDelete', onDeleteArgument ? unquoteStringLiteral(onDeleteArgument) : undefined),\n ...ifDefined('onUpdate', onUpdateArgument ? unquoteStringLiteral(onUpdateArgument) : undefined),\n };\n}\n\nexport function indexFkRelations(input: {\n readonly fkRelationMetadata: readonly FkRelationMetadata[];\n}): {\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly fkRelationsByPair: Map<string, FkRelationMetadata[]>;\n} {\n const modelRelations = new Map<string, ModelRelationMetadata[]>();\n const fkRelationsByPair = new Map<string, FkRelationMetadata[]>();\n\n for (const relation of input.fkRelationMetadata) {\n const existing = modelRelations.get(relation.declaringModelName);\n const current = existing ?? [];\n if (!existing) {\n modelRelations.set(relation.declaringModelName, current);\n }\n current.push({\n fieldName: relation.declaringFieldName,\n toModel: relation.targetModelName,\n toTable: relation.targetTableName,\n cardinality: 'N:1',\n on: {\n parentTable: relation.declaringTableName,\n parentColumns: relation.localColumns,\n childTable: relation.targetTableName,\n childColumns: relation.referencedColumns,\n },\n });\n\n const pairKey = fkRelationPairKey(relation.declaringModelName, relation.targetModelName);\n const pairRelations = fkRelationsByPair.get(pairKey);\n if (!pairRelations) {\n fkRelationsByPair.set(pairKey, [relation]);\n continue;\n }\n pairRelations.push(relation);\n }\n\n return { modelRelations, fkRelationsByPair };\n}\n\nexport function applyBackrelationCandidates(input: {\n readonly backrelationCandidates: readonly ModelBackrelationCandidate[];\n readonly fkRelationsByPair: Map<string, readonly FkRelationMetadata[]>;\n readonly modelRelations: Map<string, ModelRelationMetadata[]>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}): void {\n for (const candidate of input.backrelationCandidates) {\n const pairKey = fkRelationPairKey(candidate.targetModelName, candidate.modelName);\n const pairMatches = input.fkRelationsByPair.get(pairKey) ?? [];\n const matches = candidate.relationName\n ? pairMatches.filter((relation) => relation.relationName === candidate.relationName)\n : [...pairMatches];\n\n if (matches.length === 0) {\n input.diagnostics.push({\n code: 'PSL_ORPHANED_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" has no matching FK-side relation on model \"${candidate.targetModelName}\". Add @relation(fields: [...], references: [...]) on the FK-side relation or use an explicit join model for many-to-many.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n if (matches.length > 1) {\n input.diagnostics.push({\n code: 'PSL_AMBIGUOUS_BACKRELATION_LIST',\n message: `Backrelation list field \"${candidate.modelName}.${candidate.field.name}\" matches multiple FK-side relations on model \"${candidate.targetModelName}\". Add @relation(name: \"...\") (or @relation(\"...\")) to both sides to disambiguate.`,\n sourceId: input.sourceId,\n span: candidate.field.span,\n });\n continue;\n }\n\n invariant(matches.length === 1, 'Backrelation matching requires exactly one match');\n const matched = matches[0];\n assertDefined(matched, 'Backrelation matching requires a defined relation match');\n\n const existing = input.modelRelations.get(candidate.modelName);\n const current = existing ?? [];\n if (!existing) {\n input.modelRelations.set(candidate.modelName, current);\n }\n current.push({\n fieldName: candidate.field.name,\n toModel: matched.declaringModelName,\n toTable: matched.declaringTableName,\n cardinality: '1:N',\n on: {\n parentTable: candidate.tableName,\n parentColumns: matched.referencedColumns,\n childTable: matched.declaringTableName,\n childColumns: matched.localColumns,\n },\n });\n }\n}\n\nexport function validateNavigationListFieldAttributes(input: {\n readonly modelName: string;\n readonly field: PslField;\n readonly sourceId: string;\n readonly composedExtensions: Set<string>;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly familyId: string;\n readonly targetId: string;\n}): boolean {\n let valid = true;\n for (const attribute of input.field.attributes) {\n if (attribute.name === 'relation') {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n valid = false;\n continue;\n }\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_ATTRIBUTE',\n message: `Field \"${input.modelName}.${input.field.name}\" uses unsupported attribute \"@${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n valid = false;\n }\n return valid;\n}\n","import type {\n ContractSourceDiagnostic,\n ContractSourceDiagnosticSpan,\n ContractSourceDiagnostics,\n} from '@prisma-next/config/config-types';\nimport type {\n Contract,\n ContractField,\n ContractModel,\n ContractValueObject,\n} from '@prisma-next/contract/types';\nimport type {\n AuthoringContributions,\n AuthoringTypeConstructorDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport { instantiateAuthoringTypeConstructor } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport type {\n ParsePslDocumentResult,\n PslAttribute,\n PslCompositeType,\n PslEnum,\n PslField,\n PslModel,\n PslNamedTypeDeclaration,\n} from '@prisma-next/psl-parser';\nimport type { StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport {\n buildSqlContractFromDefinition,\n type ForeignKeyNode,\n type IndexNode,\n type ModelNode,\n type UniqueConstraintNode,\n} from '@prisma-next/sql-contract-ts/contract-builder';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport type {\n ControlMutationDefaultRegistry,\n ControlMutationDefaults,\n MutationDefaultGeneratorDescriptor,\n} from './default-function-registry';\nimport {\n getAttribute,\n getPositionalArgument,\n mapFieldNamesToColumns,\n parseAttributeFieldList,\n parseConstraintMapArgument,\n parseMapName,\n parseQuotedStringLiteral,\n} from './psl-attribute-parsing';\nimport type { ColumnDescriptor } from './psl-column-resolution';\nimport {\n checkUncomposedNamespace,\n getAuthoringTypeConstructor,\n instantiatePslTypeConstructor,\n reportUncomposedNamespace,\n resolveDbNativeTypeAttribute,\n resolveFieldTypeDescriptor,\n resolvePslTypeConstructorDescriptor,\n toNamedTypeFieldDescriptor,\n} from './psl-column-resolution';\nimport {\n buildModelMappings,\n collectResolvedFields,\n type ModelNameMapping,\n type ResolvedField,\n} from './psl-field-resolution';\nimport {\n applyBackrelationCandidates,\n type FkRelationMetadata,\n indexFkRelations,\n type ModelBackrelationCandidate,\n normalizeReferentialAction,\n parseRelationAttribute,\n validateNavigationListFieldAttributes,\n} from './psl-relation-resolution';\n\nexport interface InterpretPslDocumentToSqlContractInput {\n readonly document: ParsePslDocumentResult;\n readonly target: TargetPackRef<'sql', 'postgres'>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly authoringContributions?: AuthoringContributions;\n}\n\nfunction buildComposedExtensionPackRefs(\n target: TargetPackRef<'sql', 'postgres'>,\n extensionIds: readonly string[],\n extensionPackRefs: readonly ExtensionPackRef<'sql', 'postgres'>[] = [],\n): Record<string, ExtensionPackRef<'sql', 'postgres'>> | undefined {\n if (extensionIds.length === 0) {\n return undefined;\n }\n\n const extensionPackRefById = new Map(extensionPackRefs.map((packRef) => [packRef.id, packRef]));\n\n return Object.fromEntries(\n extensionIds.map((extensionId) => [\n extensionId,\n extensionPackRefById.get(extensionId) ??\n ({\n kind: 'extension',\n id: extensionId,\n familyId: target.familyId,\n targetId: target.targetId,\n version: '0.0.1',\n } satisfies ExtensionPackRef<'sql', 'postgres'>),\n ]),\n );\n}\n\nfunction diagnosticDedupKey(diagnostic: ContractSourceDiagnostic): string {\n const span = diagnostic.span;\n const spanKey = span\n ? `${span.start.offset}:${span.end.offset}:${span.start.line}:${span.end.line}`\n : '';\n return `${diagnostic.code}\\u0000${diagnostic.sourceId}\\u0000${spanKey}\\u0000${diagnostic.message}`;\n}\n\nfunction dedupeDiagnostics(\n diagnostics: readonly ContractSourceDiagnostic[],\n): ContractSourceDiagnostic[] {\n const seen = new Map<string, ContractSourceDiagnostic>();\n for (const diagnostic of diagnostics) {\n const key = diagnosticDedupKey(diagnostic);\n if (!seen.has(key)) {\n seen.set(key, diagnostic);\n }\n }\n return [...seen.values()];\n}\n\nfunction compareStrings(left: string, right: string): -1 | 0 | 1 {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction mapParserDiagnostics(document: ParsePslDocumentResult): ContractSourceDiagnostic[] {\n return document.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n message: diagnostic.message,\n sourceId: diagnostic.sourceId,\n span: diagnostic.span,\n }));\n}\n\ninterface ProcessEnumDeclarationsInput {\n readonly enums: readonly PslEnum[];\n readonly sourceId: string;\n readonly enumTypeConstructor: AuthoringTypeConstructorDescriptor | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction processEnumDeclarations(input: ProcessEnumDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const enumTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const enumDeclaration of input.enums) {\n const nativeType = parseMapName({\n attribute: getAttribute(enumDeclaration.attributes, 'map'),\n defaultValue: enumDeclaration.name,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n entityLabel: `Enum \"${enumDeclaration.name}\"`,\n span: enumDeclaration.span,\n });\n const enumStorageType = input.enumTypeConstructor\n ? instantiateAuthoringTypeConstructor(input.enumTypeConstructor, [\n nativeType,\n enumDeclaration.values.map((value) => value.name),\n ])\n : {\n codecId: 'pg/enum@1',\n nativeType,\n typeParams: { values: enumDeclaration.values.map((value) => value.name) },\n };\n const descriptor: ColumnDescriptor = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeRef: enumDeclaration.name,\n };\n enumTypeDescriptors.set(enumDeclaration.name, descriptor);\n storageTypes[enumDeclaration.name] = {\n codecId: enumStorageType.codecId,\n nativeType: enumStorageType.nativeType,\n typeParams: enumStorageType.typeParams ?? {\n values: enumDeclaration.values.map((value) => value.name),\n },\n };\n }\n\n return { storageTypes, enumTypeDescriptors };\n}\n\ninterface ResolveNamedTypeDeclarationsInput {\n readonly declarations: readonly PslNamedTypeDeclaration[];\n readonly sourceId: string;\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\nfunction validateNamedTypeAttributes(input: {\n readonly declaration: PslNamedTypeDeclaration;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly composedExtensions: ReadonlySet<string>;\n readonly allowDbNativeType: boolean;\n readonly familyId: string;\n readonly targetId: string;\n}): {\n readonly dbNativeTypeAttribute: PslAttribute | undefined;\n readonly hasUnsupportedNamedTypeAttribute: boolean;\n} {\n const dbNativeTypeAttributes = input.allowDbNativeType\n ? input.declaration.attributes.filter((attribute) => attribute.name.startsWith('db.'))\n : [];\n const [dbNativeTypeAttribute, ...extraDbNativeTypeAttributes] = dbNativeTypeAttributes;\n let hasUnsupportedNamedTypeAttribute = false;\n\n for (const extra of extraDbNativeTypeAttributes) {\n input.diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Named type \"${input.declaration.name}\" can declare at most one @db.* attribute`,\n sourceId: input.sourceId,\n span: extra.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n for (const attribute of input.declaration.attributes) {\n if (input.allowDbNativeType && attribute.name.startsWith('db.')) {\n continue;\n }\n\n const uncomposedNamespace = checkUncomposedNamespace(attribute.name, input.composedExtensions, {\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@${attribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId: input.sourceId,\n span: attribute.span,\n diagnostics: input.diagnostics,\n });\n hasUnsupportedNamedTypeAttribute = true;\n continue;\n }\n\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_ATTRIBUTE',\n message: `Named type \"${input.declaration.name}\" uses unsupported attribute \"${attribute.name}\"`,\n sourceId: input.sourceId,\n span: attribute.span,\n });\n hasUnsupportedNamedTypeAttribute = true;\n }\n\n return { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute };\n}\n\nfunction resolveNamedTypeDeclarations(input: ResolveNamedTypeDeclarationsInput): {\n readonly storageTypes: Record<string, StorageTypeInstance>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n} {\n const storageTypes: Record<string, StorageTypeInstance> = {};\n const namedTypeDescriptors = new Map<string, ColumnDescriptor>();\n\n for (const declaration of input.declarations) {\n if (declaration.typeConstructor) {\n const { hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes({\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n allowDbNativeType: false,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n const helperPath = declaration.typeConstructor.path.join('.');\n const typeConstructor = resolvePslTypeConstructorDescriptor({\n call: declaration.typeConstructor,\n authoringContributions: input.authoringContributions,\n composedExtensions: input.composedExtensions,\n familyId: input.familyId,\n targetId: input.targetId,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n unsupportedCode: 'PSL_UNSUPPORTED_NAMED_TYPE_CONSTRUCTOR',\n unsupportedMessage: `Named type \"${declaration.name}\" references unsupported constructor \"${helperPath}\"`,\n });\n if (!typeConstructor) {\n continue;\n }\n\n const storageType = instantiatePslTypeConstructor({\n call: declaration.typeConstructor,\n descriptor: typeConstructor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!storageType) {\n continue;\n }\n\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, storageType),\n );\n storageTypes[declaration.name] = {\n codecId: storageType.codecId,\n nativeType: storageType.nativeType,\n typeParams: storageType.typeParams ?? {},\n };\n continue;\n }\n\n // Parser invariant: when typeConstructor is absent, baseType is defined.\n // The check below narrows `baseType` for TypeScript and guards against a\n // parser regression; it is unreachable under a correct parser.\n if (declaration.baseType === undefined) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" must declare a base type or constructor`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n const { baseType } = declaration;\n const baseDescriptor =\n input.enumTypeDescriptors.get(baseType) ?? input.scalarTypeDescriptors.get(baseType);\n if (!baseDescriptor) {\n input.diagnostics.push({\n code: 'PSL_UNSUPPORTED_NAMED_TYPE_BASE',\n message: `Named type \"${declaration.name}\" references unsupported base type \"${baseType}\"`,\n sourceId: input.sourceId,\n span: declaration.span,\n });\n continue;\n }\n\n const { dbNativeTypeAttribute, hasUnsupportedNamedTypeAttribute } = validateNamedTypeAttributes(\n {\n declaration,\n sourceId: input.sourceId,\n diagnostics: input.diagnostics,\n composedExtensions: input.composedExtensions,\n allowDbNativeType: true,\n familyId: input.familyId,\n targetId: input.targetId,\n },\n );\n if (hasUnsupportedNamedTypeAttribute) {\n continue;\n }\n\n if (dbNativeTypeAttribute) {\n const descriptor = resolveDbNativeTypeAttribute({\n attribute: dbNativeTypeAttribute,\n baseType,\n baseDescriptor,\n diagnostics: input.diagnostics,\n sourceId: input.sourceId,\n entityLabel: `Named type \"${declaration.name}\"`,\n });\n if (!descriptor) {\n continue;\n }\n namedTypeDescriptors.set(\n declaration.name,\n toNamedTypeFieldDescriptor(declaration.name, descriptor),\n );\n storageTypes[declaration.name] = {\n codecId: descriptor.codecId,\n nativeType: descriptor.nativeType,\n typeParams: descriptor.typeParams ?? {},\n };\n continue;\n }\n\n const descriptor = toNamedTypeFieldDescriptor(declaration.name, baseDescriptor);\n namedTypeDescriptors.set(declaration.name, descriptor);\n storageTypes[declaration.name] = {\n codecId: baseDescriptor.codecId,\n nativeType: baseDescriptor.nativeType,\n typeParams: {},\n };\n }\n\n return { storageTypes, namedTypeDescriptors };\n}\n\ninterface BuildModelNodeInput {\n readonly model: PslModel;\n readonly mapping: ModelNameMapping;\n readonly modelMappings: ReadonlyMap<string, ModelNameMapping>;\n readonly modelNames: Set<string>;\n readonly compositeTypeNames: ReadonlySet<string>;\n readonly enumTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: Map<string, ColumnDescriptor>;\n readonly composedExtensions: Set<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly defaultFunctionRegistry: ControlMutationDefaultRegistry;\n readonly generatorDescriptorById: ReadonlyMap<string, MutationDefaultGeneratorDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly sourceId: string;\n readonly diagnostics: ContractSourceDiagnostic[];\n}\n\ninterface BuildModelNodeResult {\n readonly modelNode: ModelNode;\n readonly fkRelationMetadata: FkRelationMetadata[];\n readonly backrelationCandidates: ModelBackrelationCandidate[];\n readonly resolvedFields: readonly ResolvedField[];\n}\n\nfunction buildModelNodeFromPsl(input: BuildModelNodeInput): BuildModelNodeResult {\n const { model, mapping, sourceId, diagnostics } = input;\n const tableName = mapping.tableName;\n\n const resolvedFields = collectResolvedFields({\n model,\n mapping,\n enumTypeDescriptors: input.enumTypeDescriptors,\n namedTypeDescriptors: input.namedTypeDescriptors,\n modelNames: input.modelNames,\n compositeTypeNames: input.compositeTypeNames,\n composedExtensions: input.composedExtensions,\n authoringContributions: input.authoringContributions,\n familyId: input.familyId,\n targetId: input.targetId,\n defaultFunctionRegistry: input.defaultFunctionRegistry,\n generatorDescriptorById: input.generatorDescriptorById,\n diagnostics,\n sourceId,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n });\n\n const primaryKeyFields = resolvedFields.filter((field) => field.isId);\n const primaryKeyColumns = primaryKeyFields.map((field) => field.columnName);\n const primaryKeyName = primaryKeyFields.length === 1 ? primaryKeyFields[0]?.idName : undefined;\n const isVariantModel = model.attributes.some((attr) => attr.name === 'base');\n if (primaryKeyColumns.length === 0 && !isVariantModel) {\n diagnostics.push({\n code: 'PSL_MISSING_PRIMARY_KEY',\n message: `Model \"${model.name}\" must declare at least one @id field for SQL provider`,\n sourceId,\n span: model.span,\n });\n }\n\n const resultBackrelationCandidates: ModelBackrelationCandidate[] = [];\n for (const field of model.fields) {\n if (!field.list || !input.modelNames.has(field.typeName)) {\n continue;\n }\n const attributesValid = validateNavigationListFieldAttributes({\n modelName: model.name,\n field,\n sourceId,\n composedExtensions: input.composedExtensions,\n diagnostics,\n familyId: input.familyId,\n targetId: input.targetId,\n });\n const relationAttribute = getAttribute(field.attributes, 'relation');\n let relationName: string | undefined;\n if (relationAttribute) {\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute,\n modelName: model.name,\n fieldName: field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (parsedRelation.fields || parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare fields/references; define them on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n if (parsedRelation.onDelete || parsedRelation.onUpdate) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Backrelation list field \"${model.name}.${field.name}\" cannot declare onDelete/onUpdate; define referential actions on the FK-side relation field`,\n sourceId,\n span: relationAttribute.span,\n });\n continue;\n }\n relationName = parsedRelation.relationName;\n }\n if (!attributesValid) {\n continue;\n }\n\n resultBackrelationCandidates.push({\n modelName: model.name,\n tableName,\n field,\n targetModelName: field.typeName,\n ...ifDefined('relationName', relationName),\n });\n }\n\n const relationAttributes = model.fields\n .map((field) => ({\n field,\n relation: getAttribute(field.attributes, 'relation'),\n }))\n .filter((entry): entry is { field: PslField; relation: PslAttribute } =>\n Boolean(entry.relation),\n );\n const uniqueConstraints: UniqueConstraintNode[] = resolvedFields\n .filter((field) => field.isUnique)\n .map((field) => ({\n columns: [field.columnName],\n ...ifDefined('name', field.uniqueName),\n }));\n const indexNodes: IndexNode[] = [];\n const foreignKeyNodes: ForeignKeyNode[] = [];\n\n for (const modelAttribute of model.attributes) {\n if (modelAttribute.name === 'map') {\n continue;\n }\n if (modelAttribute.name === 'discriminator' || modelAttribute.name === 'base') {\n continue;\n }\n if (modelAttribute.name === 'unique' || modelAttribute.name === 'index') {\n const fieldNames = parseAttributeFieldList({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n messagePrefix: `Model \"${model.name}\" @@${modelAttribute.name}`,\n });\n if (!fieldNames) {\n continue;\n }\n const columnNames = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames,\n mapping,\n sourceId,\n diagnostics,\n span: modelAttribute.span,\n contextLabel: `Model \"${model.name}\" @@${modelAttribute.name}`,\n });\n if (!columnNames) {\n continue;\n }\n const constraintName = parseConstraintMapArgument({\n attribute: modelAttribute,\n sourceId,\n diagnostics,\n entityLabel: `Model \"${model.name}\" @@${modelAttribute.name}`,\n span: modelAttribute.span,\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n });\n if (modelAttribute.name === 'unique') {\n uniqueConstraints.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n } else {\n indexNodes.push({\n columns: columnNames,\n ...ifDefined('name', constraintName),\n });\n }\n continue;\n }\n const uncomposedNamespace = checkUncomposedNamespace(\n modelAttribute.name,\n input.composedExtensions,\n { familyId: input.familyId, targetId: input.targetId },\n );\n if (uncomposedNamespace) {\n reportUncomposedNamespace({\n subjectLabel: `Attribute \"@@${modelAttribute.name}\"`,\n namespace: uncomposedNamespace,\n sourceId,\n span: modelAttribute.span,\n diagnostics,\n });\n continue;\n }\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_MODEL_ATTRIBUTE',\n message: `Model \"${model.name}\" uses unsupported attribute \"@@${modelAttribute.name}\"`,\n sourceId,\n span: modelAttribute.span,\n });\n }\n\n const resultFkRelationMetadata: FkRelationMetadata[] = [];\n for (const relationAttribute of relationAttributes) {\n if (relationAttribute.field.list) {\n continue;\n }\n\n if (!input.modelNames.has(relationAttribute.field.typeName)) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const parsedRelation = parseRelationAttribute({\n attribute: relationAttribute.relation,\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n sourceId,\n diagnostics,\n });\n if (!parsedRelation) {\n continue;\n }\n if (!parsedRelation.fields || !parsedRelation.references) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" requires fields and references arguments`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const targetMapping = input.modelMappings.get(relationAttribute.field.typeName);\n if (!targetMapping) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_TARGET',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" references unknown model \"${relationAttribute.field.typeName}\"`,\n sourceId,\n span: relationAttribute.field.span,\n });\n continue;\n }\n\n const localColumns = mapFieldNamesToColumns({\n modelName: model.name,\n fieldNames: parsedRelation.fields,\n mapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n contextLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!localColumns) {\n continue;\n }\n const referencedColumns = mapFieldNamesToColumns({\n modelName: targetMapping.model.name,\n fieldNames: parsedRelation.references,\n mapping: targetMapping,\n sourceId,\n diagnostics,\n span: relationAttribute.relation.span,\n contextLabel: `Relation field \"${model.name}.${relationAttribute.field.name}\"`,\n });\n if (!referencedColumns) {\n continue;\n }\n if (localColumns.length !== referencedColumns.length) {\n diagnostics.push({\n code: 'PSL_INVALID_RELATION_ATTRIBUTE',\n message: `Relation field \"${model.name}.${relationAttribute.field.name}\" must provide the same number of fields and references`,\n sourceId,\n span: relationAttribute.relation.span,\n });\n continue;\n }\n\n const onDelete = parsedRelation.onDelete\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onDelete',\n actionToken: parsedRelation.onDelete,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n const onUpdate = parsedRelation.onUpdate\n ? normalizeReferentialAction({\n modelName: model.name,\n fieldName: relationAttribute.field.name,\n actionName: 'onUpdate',\n actionToken: parsedRelation.onUpdate,\n sourceId,\n span: relationAttribute.field.span,\n diagnostics,\n })\n : undefined;\n\n foreignKeyNodes.push({\n columns: localColumns,\n references: {\n model: targetMapping.model.name,\n table: targetMapping.tableName,\n columns: referencedColumns,\n },\n ...ifDefined('name', parsedRelation.constraintName),\n ...ifDefined('onDelete', onDelete),\n ...ifDefined('onUpdate', onUpdate),\n });\n\n resultFkRelationMetadata.push({\n declaringModelName: model.name,\n declaringFieldName: relationAttribute.field.name,\n declaringTableName: tableName,\n targetModelName: targetMapping.model.name,\n targetTableName: targetMapping.tableName,\n ...ifDefined('relationName', parsedRelation.relationName),\n localColumns,\n referencedColumns,\n });\n }\n\n return {\n modelNode: {\n modelName: model.name,\n tableName,\n fields: resolvedFields.map((resolvedField) => ({\n fieldName: resolvedField.field.name,\n columnName: resolvedField.columnName,\n descriptor: resolvedField.descriptor,\n nullable: resolvedField.field.optional,\n ...ifDefined('default', resolvedField.defaultValue),\n ...ifDefined('executionDefault', resolvedField.executionDefault),\n })),\n ...(primaryKeyColumns.length > 0\n ? {\n id: {\n columns: primaryKeyColumns,\n ...ifDefined('name', primaryKeyName),\n },\n }\n : {}),\n ...(uniqueConstraints.length > 0 ? { uniques: uniqueConstraints } : {}),\n ...(indexNodes.length > 0 ? { indexes: indexNodes } : {}),\n ...(foreignKeyNodes.length > 0 ? { foreignKeys: foreignKeyNodes } : {}),\n },\n fkRelationMetadata: resultFkRelationMetadata,\n backrelationCandidates: resultBackrelationCandidates,\n resolvedFields,\n };\n}\n\ninterface BuildValueObjectsInput {\n readonly compositeTypes: readonly PslCompositeType[];\n readonly enumTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly namedTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly scalarTypeDescriptors: ReadonlyMap<string, ColumnDescriptor>;\n readonly composedExtensions: ReadonlySet<string>;\n readonly familyId: string;\n readonly targetId: string;\n readonly authoringContributions: AuthoringContributions | undefined;\n readonly diagnostics: ContractSourceDiagnostic[];\n readonly sourceId: string;\n}\n\nfunction buildValueObjects(input: BuildValueObjectsInput): Record<string, ContractValueObject> {\n const {\n compositeTypes,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n composedExtensions,\n familyId,\n targetId,\n authoringContributions,\n diagnostics,\n sourceId,\n } = input;\n const valueObjects: Record<string, ContractValueObject> = {};\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n\n for (const compositeType of compositeTypes) {\n const fields: Record<string, ContractField> = {};\n for (const field of compositeType.fields) {\n if (compositeTypeNames.has(field.typeName)) {\n const result: ContractField = {\n type: { kind: 'valueObject', name: field.typeName },\n nullable: field.optional,\n };\n fields[field.name] = field.list ? { ...result, many: true } : result;\n continue;\n }\n const resolved = resolveFieldTypeDescriptor({\n field,\n enumTypeDescriptors,\n namedTypeDescriptors,\n scalarTypeDescriptors,\n authoringContributions,\n composedExtensions,\n familyId,\n targetId,\n diagnostics,\n sourceId,\n entityLabel: `Field \"${compositeType.name}.${field.name}\"`,\n });\n if (!resolved.ok) {\n if (!resolved.alreadyReported) {\n diagnostics.push({\n code: 'PSL_UNSUPPORTED_FIELD_TYPE',\n message: `Field \"${compositeType.name}.${field.name}\" type \"${field.typeName}\" is not supported`,\n sourceId,\n span: field.span,\n });\n }\n continue;\n }\n const scalarField: ContractField = {\n nullable: field.optional,\n type: { kind: 'scalar', codecId: resolved.descriptor.codecId },\n };\n fields[field.name] = field.list ? { ...scalarField, many: true } : scalarField;\n }\n valueObjects[compositeType.name] = { fields };\n }\n\n return valueObjects;\n}\n\nfunction patchModelDomainFields(\n models: Record<string, ContractModel>,\n modelResolvedFields: ReadonlyMap<string, readonly ResolvedField[]>,\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, resolvedFields] of modelResolvedFields) {\n const model = patched[modelName];\n if (!model) continue;\n\n let needsPatch = false;\n const patchedFields: Record<string, ContractField> = { ...model.fields };\n\n for (const rf of resolvedFields) {\n if (rf.valueObjectTypeName) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'valueObject', name: rf.valueObjectTypeName },\n ...(rf.many ? { many: true as const } : {}),\n };\n } else if (rf.many && rf.scalarCodecId) {\n needsPatch = true;\n patchedFields[rf.field.name] = {\n nullable: rf.field.optional,\n type: { kind: 'scalar', codecId: rf.scalarCodecId },\n many: true as const,\n };\n }\n }\n\n if (needsPatch) {\n patched = { ...patched, [modelName]: { ...model, fields: patchedFields } };\n }\n }\n\n return patched;\n}\n\ntype DiscriminatorDeclaration = {\n readonly fieldName: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\ntype BaseDeclaration = {\n readonly baseName: string;\n readonly value: string;\n readonly span: ContractSourceDiagnosticSpan;\n};\n\nfunction collectPolymorphismDeclarations(\n models: readonly PslModel[],\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): {\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>;\n baseDeclarations: Map<string, BaseDeclaration>;\n} {\n const discriminatorDeclarations = new Map<string, DiscriminatorDeclaration>();\n const baseDeclarations = new Map<string, BaseDeclaration>();\n\n for (const model of models) {\n for (const attr of model.attributes) {\n if (attr.name === 'discriminator') {\n const fieldName = getPositionalArgument(attr);\n if (!fieldName) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@discriminator requires a field name argument`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const discField = model.fields.find((f) => f.name === fieldName);\n if (discField && discField.typeName !== 'String') {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Discriminator field \"${fieldName}\" on model \"${model.name}\" must be of type String, but is \"${discField.typeName}\"`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n discriminatorDeclarations.set(model.name, { fieldName, span: attr.span });\n }\n\n if (attr.name === 'base') {\n const baseName = getPositionalArgument(attr, 0);\n const rawValue = getPositionalArgument(attr, 1);\n if (!baseName || !rawValue) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base requires two arguments: base model name and discriminator value`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n const value = parseQuotedStringLiteral(rawValue);\n if (value === undefined) {\n diagnostics.push({\n code: 'PSL_INVALID_ATTRIBUTE_ARGUMENT',\n message: `Model \"${model.name}\" @@base discriminator value must be a quoted string literal`,\n sourceId,\n span: attr.span,\n });\n continue;\n }\n baseDeclarations.set(model.name, { baseName, value, span: attr.span });\n }\n }\n }\n\n return { discriminatorDeclarations, baseDeclarations };\n}\n\nfunction resolvePolymorphism(\n models: Record<string, ContractModel>,\n discriminatorDeclarations: Map<string, DiscriminatorDeclaration>,\n baseDeclarations: Map<string, BaseDeclaration>,\n modelNames: Set<string>,\n modelMappings: ReadonlyMap<string, ModelNameMapping>,\n sourceId: string,\n diagnostics: ContractSourceDiagnostic[],\n): Record<string, ContractModel> {\n let patched = models;\n\n for (const [modelName, decl] of discriminatorDeclarations) {\n if (baseDeclarations.has(modelName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_AND_BASE',\n message: `Model \"${modelName}\" cannot have both @@discriminator and @@base`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const model = patched[modelName];\n if (!model) continue;\n\n if (!Object.hasOwn(model.fields, decl.fieldName)) {\n diagnostics.push({\n code: 'PSL_DISCRIMINATOR_FIELD_NOT_FOUND',\n message: `Discriminator field \"${decl.fieldName}\" is not a field on model \"${modelName}\"`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n const variants: Record<string, { readonly value: string }> = {};\n const seenValues = new Map<string, string>();\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (baseDecl.baseName !== modelName) continue;\n\n const existingVariant = seenValues.get(baseDecl.value);\n if (existingVariant) {\n diagnostics.push({\n code: 'PSL_DUPLICATE_DISCRIMINATOR_VALUE',\n message: `Discriminator value \"${baseDecl.value}\" is used by both \"${existingVariant}\" and \"${variantName}\" on base model \"${modelName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n seenValues.set(baseDecl.value, variantName);\n variants[variantName] = { value: baseDecl.value };\n }\n\n if (Object.keys(variants).length === 0) {\n diagnostics.push({\n code: 'PSL_ORPHANED_DISCRIMINATOR',\n message: `Model \"${modelName}\" has @@discriminator but no variant models declare @@base(${modelName}, ...)`,\n sourceId,\n span: decl.span,\n });\n continue;\n }\n\n patched = {\n ...patched,\n [modelName]: { ...model, discriminator: { field: decl.fieldName }, variants },\n };\n }\n\n for (const [variantName, baseDecl] of baseDeclarations) {\n if (!modelNames.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_BASE_TARGET_NOT_FOUND',\n message: `Model \"${variantName}\" @@base references non-existent model \"${baseDecl.baseName}\"`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (!discriminatorDeclarations.has(baseDecl.baseName)) {\n diagnostics.push({\n code: 'PSL_ORPHANED_BASE',\n message: `Model \"${variantName}\" declares @@base(${baseDecl.baseName}, ...) but \"${baseDecl.baseName}\" has no @@discriminator`,\n sourceId,\n span: baseDecl.span,\n });\n continue;\n }\n\n if (discriminatorDeclarations.has(variantName)) {\n continue;\n }\n\n const variantModel = patched[variantName];\n if (!variantModel) continue;\n\n const baseMapping = modelMappings.get(baseDecl.baseName);\n const variantMapping = modelMappings.get(variantName);\n const hasExplicitMap =\n variantMapping?.model.attributes.some((attr) => attr.name === 'map') ?? false;\n const resolvedTable = hasExplicitMap ? variantMapping?.tableName : baseMapping?.tableName;\n\n patched = {\n ...patched,\n [variantName]: {\n ...variantModel,\n base: baseDecl.baseName,\n ...(resolvedTable ? { storage: { ...variantModel.storage, table: resolvedTable } } : {}),\n },\n };\n }\n\n return patched;\n}\n\nexport function interpretPslDocumentToSqlContract(\n input: InterpretPslDocumentToSqlContractInput,\n): Result<Contract, ContractSourceDiagnostics> {\n const sourceId = input.document.ast.sourceId;\n if (!input.target) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_TARGET_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires an explicit target context from composition.',\n sourceId,\n },\n ],\n });\n }\n if (!input.scalarTypeDescriptors) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: [\n {\n code: 'PSL_SCALAR_TYPE_CONTEXT_REQUIRED',\n message: 'PSL interpretation requires composed scalar type descriptors.',\n sourceId,\n },\n ],\n });\n }\n\n const diagnostics: ContractSourceDiagnostic[] = mapParserDiagnostics(input.document);\n const models = input.document.ast.models ?? [];\n const enums = input.document.ast.enums ?? [];\n const compositeTypes = input.document.ast.compositeTypes ?? [];\n const modelNames = new Set(models.map((model) => model.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n const composedExtensions = new Set(input.composedExtensionPacks ?? []);\n const defaultFunctionRegistry: ControlMutationDefaultRegistry =\n input.controlMutationDefaults?.defaultFunctionRegistry ?? new Map();\n const generatorDescriptors = input.controlMutationDefaults?.generatorDescriptors ?? [];\n const generatorDescriptorById = new Map<string, MutationDefaultGeneratorDescriptor>();\n for (const descriptor of generatorDescriptors) {\n generatorDescriptorById.set(descriptor.id, descriptor);\n }\n\n const enumResult = processEnumDeclarations({\n enums,\n sourceId,\n enumTypeConstructor: getAuthoringTypeConstructor(input.authoringContributions, ['enum']),\n diagnostics,\n });\n\n const namedTypeResult = resolveNamedTypeDeclarations({\n declarations: input.document.ast.types?.declarations ?? [],\n sourceId,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n });\n\n const storageTypes = { ...enumResult.storageTypes, ...namedTypeResult.storageTypes };\n\n const modelMappings = buildModelMappings(models, diagnostics, sourceId);\n const modelNodes: ModelNode[] = [];\n const fkRelationMetadata: FkRelationMetadata[] = [];\n const backrelationCandidates: ModelBackrelationCandidate[] = [];\n const modelResolvedFields = new Map<string, readonly ResolvedField[]>();\n\n for (const model of models) {\n const mapping = modelMappings.get(model.name);\n if (!mapping) {\n continue;\n }\n const result = buildModelNodeFromPsl({\n model,\n mapping,\n modelMappings,\n modelNames,\n compositeTypeNames,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n defaultFunctionRegistry,\n generatorDescriptorById,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n sourceId,\n diagnostics,\n });\n modelNodes.push(result.modelNode);\n fkRelationMetadata.push(...result.fkRelationMetadata);\n backrelationCandidates.push(...result.backrelationCandidates);\n modelResolvedFields.set(model.name, result.resolvedFields);\n }\n\n const { modelRelations, fkRelationsByPair } = indexFkRelations({ fkRelationMetadata });\n applyBackrelationCandidates({\n backrelationCandidates,\n fkRelationsByPair,\n modelRelations,\n diagnostics,\n sourceId,\n });\n\n const { discriminatorDeclarations, baseDeclarations } = collectPolymorphismDeclarations(\n models,\n sourceId,\n diagnostics,\n );\n\n const valueObjects = buildValueObjects({\n compositeTypes,\n enumTypeDescriptors: enumResult.enumTypeDescriptors,\n namedTypeDescriptors: namedTypeResult.namedTypeDescriptors,\n scalarTypeDescriptors: input.scalarTypeDescriptors,\n composedExtensions,\n familyId: input.target.familyId,\n targetId: input.target.targetId,\n authoringContributions: input.authoringContributions,\n diagnostics,\n sourceId,\n });\n\n if (diagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: dedupeDiagnostics(diagnostics),\n });\n }\n\n const contract = buildSqlContractFromDefinition({\n target: input.target,\n ...ifDefined(\n 'extensionPacks',\n buildComposedExtensionPackRefs(\n input.target,\n [...composedExtensions].sort(compareStrings),\n input.composedExtensionPackRefs,\n ),\n ),\n ...(Object.keys(storageTypes).length > 0 ? { storageTypes } : {}),\n models: modelNodes.map((model) => ({\n ...model,\n ...(modelRelations.has(model.modelName)\n ? {\n relations: [...(modelRelations.get(model.modelName) ?? [])].sort((left, right) =>\n compareStrings(left.fieldName, right.fieldName),\n ),\n }\n : {}),\n })),\n });\n\n let patchedModels = patchModelDomainFields(\n contract.models as Record<string, ContractModel>,\n modelResolvedFields,\n );\n\n const polyDiagnostics: ContractSourceDiagnostic[] = [];\n patchedModels = resolvePolymorphism(\n patchedModels,\n discriminatorDeclarations,\n baseDeclarations,\n modelNames,\n modelMappings,\n sourceId,\n polyDiagnostics,\n );\n\n if (polyDiagnostics.length > 0) {\n return notOk({\n summary: 'PSL to SQL contract interpretation failed',\n diagnostics: polyDiagnostics,\n });\n }\n\n const variantModelNames = new Set(baseDeclarations.keys());\n const filteredRoots = Object.fromEntries(\n Object.entries(contract.roots).filter(([, modelName]) => !variantModelNames.has(modelName)),\n );\n\n const patchedContract: Contract = {\n ...contract,\n roots: filteredRoots,\n models: patchedModels,\n ...(Object.keys(valueObjects).length > 0 ? { valueObjects } : {}),\n };\n\n return ok(patchedContract);\n}\n"],"mappings":";;;;;;;;AAMA,SAAgB,WAAW,OAAuB;AAChD,KAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAO,MAAM,IAAI,aAAa,GAAG,MAAM,MAAM,EAAE;;AAGjD,SAAgB,aACd,YACA,MAC0B;AAC1B,QAAO,YAAY,MAAM,cAAc,UAAU,SAAS,KAAK;;AAGjE,SAAgB,iBAAiB,WAAyB,MAAkC;CAC1F,MAAM,QAAQ,UAAU,KAAK,MAAM,QAAQ,IAAI,SAAS,WAAW,IAAI,SAAS,KAAK;AACrF,KAAI,CAAC,SAAS,MAAM,SAAS,QAC3B;AAEF,QAAO,MAAM;;AAGf,SAAgB,2BACd,WACA,QAAQ,GACsC;CAE9C,MAAM,QADU,UAAU,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAAa,CACnD;AACtB,KAAI,CAAC,SAAS,MAAM,SAAS,aAC3B;AAEF,QAAO;EACL,OAAO,MAAM;EACb,MAAM,MAAM;EACb;;AAGH,SAAgB,qBAAqB,OAAuB;CAC1D,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAC7C,KAAI,CAAC,MACH,QAAO;AAET,QAAO,MAAM,MAAM;;AAGrB,SAAgB,eAAe,OAA8C;CAC3E,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CACpD;AAOF,QALa,QAAQ,MAAM,GAAG,GAAG,CAE9B,MAAM,IAAI,CACV,KAAK,UAAU,MAAM,MAAM,CAAC,CAC5B,QAAQ,UAAU,MAAM,SAAS,EAAE;;AAIxC,SAAgB,aAAa,OAOlB;AACT,KAAI,CAAC,MAAM,UACT,QAAO,MAAM;CAGf,MAAM,QAAQ,sBAAsB,MAAM,UAAU;AACpD,KAAI,CAAC,OAAO;AACV,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,GAAG,MAAM,YAAY;GAC9B,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF,SAAO,MAAM;;CAEf,MAAM,SAAS,yBAAyB,MAAM;AAC9C,KAAI,WAAW,QAAW;AACxB,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,GAAG,MAAM,YAAY;GAC9B,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF,SAAO,MAAM;;AAEf,QAAO;;AAGT,SAAgB,2BAA2B,OAOpB;AACrB,KAAI,CAAC,MAAM,UACT;CAGF,MAAM,MAAM,iBAAiB,MAAM,WAAW,MAAM;AACpD,KAAI,CAAC,IACH;CAGF,MAAM,SAAS,yBAAyB,IAAI;AAC5C,KAAI,WAAW,OACb,QAAO;AAGT,OAAM,YAAY,KAAK;EACrB,MAAM,MAAM;EACZ,SAAS,GAAG,MAAM,YAAY;EAC9B,UAAU,MAAM;EAChB,MAAM,MAAM;EACb,CAAC;;AAIJ,SAAgB,uBAAuB,WAA4C;AACjF,QAAO,UAAU,KACd,QAAQ,QAAQ,IAAI,SAAS,aAAa,CAC1C,KAAK,QAAS,IAAI,SAAS,eAAe,IAAI,QAAQ,GAAI;;AAG/D,SAAgB,6BAA6B,OAK/B;AACZ,OAAM,YAAY,KAAK;EACrB,MAAM;EACN,SAAS,MAAM;EACf,UAAU,MAAM;EAChB,MAAM,MAAM;EACb,CAAC;;AAIJ,SAAgB,mCAAmC,OAOrB;AAC5B,KAAI,MAAM,UAAU,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,CAC1D,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;CAGJ,MAAM,sBAAsB,uBAAuB,MAAM,UAAU;AACnE,KAAI,oBAAoB,SAAS,EAC/B,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;AAEJ,KAAI,oBAAoB,WAAW,EACjC,QAAO;CAGT,MAAM,SAAS,OAAO,qBAAqB,oBAAoB,MAAM,GAAG,CAAC;AACzE,KAAI,CAAC,OAAO,UAAU,OAAO,IAAI,SAAS,MAAM,QAC9C,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK,cAAc,MAAM,WAAW;EACvF,CAAC;AAGJ,QAAO;;AAGT,SAAgB,8BAA8B,OAKe;AAC3D,KAAI,MAAM,UAAU,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,CAC1D,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;CAGJ,MAAM,sBAAsB,uBAAuB,MAAM,UAAU;AACnE,KAAI,oBAAoB,SAAS,EAC/B,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;AAEJ,KAAI,oBAAoB,WAAW,EACjC,QAAO;CAGT,MAAM,YAAY,OAAO,qBAAqB,oBAAoB,MAAM,GAAG,CAAC;AAC5E,KAAI,CAAC,OAAO,UAAU,UAAU,IAAI,YAAY,EAC9C,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;AAGJ,KAAI,oBAAoB,WAAW,EACjC,QAAO,EAAE,WAAW;CAGtB,MAAM,QAAQ,OAAO,qBAAqB,oBAAoB,MAAM,GAAG,CAAC;AACxE,KAAI,CAAC,OAAO,UAAU,MAAM,IAAI,QAAQ,EACtC,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;EACxD,CAAC;AAGJ,QAAO;EAAE;EAAW;EAAO;;AAG7B,SAAgB,wBAAwB,OAMN;CAChC,MAAM,MAAM,iBAAiB,MAAM,WAAW,SAAS,IAAI,sBAAsB,MAAM,UAAU;AACjG,KAAI,CAAC,KAAK;AACR,QAAM,YAAY,KAAK;GACrB,MAAM,MAAM;GACZ,SAAS,GAAG,MAAM,cAAc;GAChC,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;CAEF,MAAM,SAAS,eAAe,IAAI;AAClC,KAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,QAAM,YAAY,KAAK;GACrB,MAAM,MAAM;GACZ,SAAS,GAAG,MAAM,cAAc;GAChC,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;AAEF,QAAO;;AAGT,SAAgB,uBAAuB,OAQL;CAChC,MAAMA,UAAoB,EAAE;AAC5B,MAAK,MAAM,aAAa,MAAM,YAAY;EACxC,MAAM,aAAa,MAAM,QAAQ,aAAa,IAAI,UAAU;AAC5D,MAAI,CAAC,YAAY;AACf,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,GAAG,MAAM,aAAa,6BAA6B,MAAM,UAAU,GAAG,UAAU;IACzF,UAAU,MAAM;IAChB,MAAM,MAAM;IACb,CAAC;AACF;;AAEF,UAAQ,KAAK,WAAW;;AAE1B,QAAO;;;;;ACpOT,SAAS,4BACP,MACA,MACA,QACkB;CAClB,MAAM,aAAa,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,EAAE,KAAK,OAAO;CAC7D,IAAI,OAAO,KAAK,MAAM;CACtB,IAAI,SAAS,KAAK,MAAM;AAExB,MAAK,IAAI,QAAQ,GAAG,QAAQ,YAAY,SAAS,GAAG;EAClD,MAAM,YAAY,KAAK,UAAU;AACjC,MAAI,cAAc,MAAM;AACtB,OAAI,KAAK,QAAQ,OAAO,QAAQ,QAAQ,IAAI,WAC1C,UAAS;AAEX,WAAQ;AACR,YAAS;AACT;;AAEF,MAAI,cAAc,MAAM;AACtB,WAAQ;AACR,YAAS;AACT;;AAEF,YAAU;;AAGZ,QAAO;EACL,QAAQ,KAAK,MAAM,SAAS;EAC5B;EACA;EACD;;AAGH,SAAS,mBACP,MACA,aACA,WACA,MACS;CACT,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,KAAK,OAAO,CAAC;CACjE,MAAM,UAAU,KAAK,IAAI,WAAW,KAAK,IAAI,WAAW,KAAK,OAAO,CAAC;AACrE,QAAO;EACL,OAAO,4BAA4B,MAAM,MAAM,UAAU;EACzD,KAAK,4BAA4B,MAAM,MAAM,QAAQ;EACtD;;AAGH,SAAS,kBAAkB,KAAiE;AAC1F,KAAI,IAAI,MAAM,CAAC,WAAW,EACxB,QAAO,EAAE;CAGX,MAAMC,QAA4D,EAAE;CACpE,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAIC,QAA0B;CAC9B,IAAI,QAAQ;AAEZ,MAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS,GAAG;EAClD,MAAM,YAAY,IAAI,UAAU;AAChC,MAAI,OAAO;AACT,OAAI,cAAc,SAAS,IAAI,QAAQ,OAAO,KAC5C,SAAQ;AAEV;;AAGF,MAAI,cAAc,QAAO,cAAc,KAAK;AAC1C,WAAQ;AACR;;AAGF,MAAI,cAAc,KAAK;AACrB,iBAAc;AACd;;AAEF,MAAI,cAAc,KAAK;AACrB,gBAAa,KAAK,IAAI,GAAG,aAAa,EAAE;AACxC;;AAEF,MAAI,cAAc,KAAK;AACrB,mBAAgB;AAChB;;AAEF,MAAI,cAAc,KAAK;AACrB,kBAAe,KAAK,IAAI,GAAG,eAAe,EAAE;AAC5C;;AAGF,MAAI,cAAc,OAAO,eAAe,KAAK,iBAAiB,GAAG;AAC/D,SAAM,KAAK;IACT,KAAK,IAAI,MAAM,OAAO,MAAM;IAC5B;IACA,KAAK;IACN,CAAC;AACF,WAAQ,QAAQ;;;AAIpB,OAAM,KAAK;EACT,KAAK,IAAI,MAAM,MAAM;EACrB;EACA,KAAK,IAAI;EACV,CAAC;AAEF,QAAO;;AAGT,SAAgB,yBACd,YACA,gBACuC;CACvC,MAAM,UAAU,WAAW,MAAM;CACjC,MAAM,oBAAoB,WAAW,SAAS,WAAW,WAAW,CAAC;CACrE,MAAM,qBAAqB,WAAW,SAAS,WAAW,SAAS,CAAC;CACpE,MAAM,aAAa,WAAW,SAAS;CAEvC,MAAM,YAAY,QAAQ,QAAQ,IAAI;CACtC,MAAM,aAAa,QAAQ,YAAY,IAAI;AAC3C,KAAI,aAAa,KAAK,eAAe,QAAQ,SAAS,EACpD;CAGF,MAAM,eAAe,QAAQ,MAAM,GAAG,UAAU,CAAC,MAAM;AACvD,KAAI,CAAC,2BAA2B,KAAK,aAAa,CAChD;CAIF,MAAM,QAAQ,kBADU,QAAQ,MAAM,YAAY,GAAG,WAAW,CAChB;CAChD,MAAMC,OAAkC,EAAE;AAC1C,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,MAAI,IAAI,WAAW,EACjB;EAEF,MAAM,wBAAwB,KAAK,IAAI,SAAS,KAAK,IAAI,WAAW,CAAC;EACrE,MAAM,WAAW,oBAAoB,YAAY,IAAI,KAAK,QAAQ;EAClE,MAAM,SAAS,WAAW,IAAI;AAC9B,OAAK,KAAK;GACR;GACA,MAAM,mBAAmB,gBAAgB,UAAU,QAAQ,WAAW;GACvE,CAAC;;AAKJ,QAAO;EACL,MAAM;EACN,KAAK;EACL;EACA,MAAM,mBAAmB,gBANL,mBACF,YAKmD,WAAW;EACjF;;AAGH,SAAS,4BAA4B,UAAkD;CACrF,MAAM,aAAa,MAAM,KAAK,SAAS,SAAS,CAAC,CAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CACtC,SAAS,CAAC,cAAc,WAAW;EAClC,MAAM,kBAAkB,MAAM,iBAAiB,QAAQ,cAAc,UAAU,SAAS,EAAE;AAC1F,SAAO,mBAAmB,gBAAgB,SAAS,IAC/C,kBACA,CAAC,GAAG,aAAa,IAAI;GACzB;AACJ,QAAO,WAAW,SAAS,IAAI,WAAW,KAAK,KAAK,GAAG;;AAGzD,SAAgB,iCAAiC,OAIxB;CACvB,MAAM,QAAQ,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK;AACjD,KAAI,MACF,QAAO,MAAM,MAAM;EAAE,MAAM,MAAM;EAAM,SAAS,MAAM;EAAS,CAAC;CAElE,MAAM,wBAAwB,4BAA4B,MAAM,SAAS;AAEzE,QAAO;EACL,IAAI;EACJ,YAAY;GACV,MAAM;GACN,SAAS,qBAAqB,MAAM,KAAK,KAAK,kEAAkE,sBAAsB;GACtI,UAAU,MAAM,QAAQ;GACxB,MAAM,MAAM,KAAK;GAClB;EACF;;;;;AC/PH,MAAM,6BAA6B,OAAO,2BAA2B;AAUrE,SAAS,2BAA2B,WAAwC;AAC1E,QAAO,cAAc,UAAa,aAAa,KAAK,UAAU;;AAGhE,SAAS,sBAAsB,WAAwC;AACrE,QAAO,cAAc,UAAa,gBAAgB,KAAK,UAAU;;AAGnE,SAAS,mBAAmB,OAAqE;CAC/F,IAAI,QAAQ;CAEZ,SAAS,iBAAiB;AACxB,SAAO,KAAK,KAAK,MAAM,UAAU,GAAG,CAClC,UAAS;;CAIb,SAAS,kBAA8D;EACrE,MAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,2BAA2B,MAAM,CACpC,QAAO;EAGT,IAAI,MAAM,QAAQ;AAClB,SAAO,sBAAsB,MAAM,KAAK,CACtC,QAAO;EAGT,MAAM,aAAa,MAAM,MAAM,OAAO,IAAI;AAC1C,UAAQ;AACR,SAAO;;CAGT,SAAS,cAA0D;EACjE,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,QAAO,UAAU,IAC7B,QAAO;AAGT,WAAS;EACT,IAAI,SAAS;AAEb,SAAO,QAAQ,MAAM,QAAQ;GAC3B,MAAM,YAAY,MAAM;AACxB,YAAS;AAET,OAAI,cAAc,OAChB,QAAO;AAGT,OAAI,cAAc,MAChB,QAAO;AAGT,OAAI,cAAc,MAAM;AACtB,cAAU;AACV;;GAGF,MAAM,UAAU,MAAM;AACtB,YAAS;AAET,OAAI,YAAY,OACd,QAAO;AAGT,WAAQ,SAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,eAAU;AACV;IACF,KAAK;AACH,eAAU;AACV;IACF,KAAK;AACH,eAAU;AACV;IACF,KAAK;AACH,eAAU;AACV;IACF,KAAK;AACH,eAAU;AACV;IACF,KAAK;AACH,eAAU;AACV;IACF,KAAK,KAAK;KACR,MAAM,MAAM,MAAM,MAAM,OAAO,QAAQ,EAAE;AACzC,SAAI,CAAC,mBAAmB,KAAK,IAAI,CAC/B,QAAO;AAET,eAAU,OAAO,aAAa,OAAO,SAAS,KAAK,GAAG,CAAC;AACvD,cAAS;AACT;;IAEF,QACE,QAAO;;;AAIb,SAAO;;CAGT,SAAS,cAA0D;EAEjE,MAAM,MADQ,MAAM,MAAM,MAAM,CAAC,MAAM,+CAA+C,GAClE;AACpB,MAAI,CAAC,IACH,QAAO;EAGT,MAAMC,WAAS,OAAO,IAAI;AAC1B,MAAI,CAAC,OAAO,SAASA,SAAO,CAC1B,QAAO;AAGT,WAAS,IAAI;AACb,SAAOA;;CAGT,SAAS,aAAqE;AAC5E,MAAI,MAAM,WAAW,IACnB,QAAO;AAGT,WAAS;EACT,MAAMC,SAA6B,EAAE;AAErC,kBAAgB;AAChB,MAAI,MAAM,WAAW,KAAK;AACxB,YAAS;AACT,UAAO;;AAGT,SAAO,QAAQ,MAAM,QAAQ;GAC3B,MAAM,QAAQ,YAAY;AAC1B,OAAI,UAAU,2BACZ,QAAO;AAET,UAAO,KAAK,MAAM;AAElB,mBAAgB;AAChB,OAAI,MAAM,WAAW,KAAK;AACxB,aAAS;AACT,oBAAgB;AAChB;;AAEF,OAAI,MAAM,WAAW,KAAK;AACxB,aAAS;AACT,WAAO;;AAET,UAAO;;AAGT,SAAO;;CAGT,SAAS,cAAuF;AAC9F,MAAI,MAAM,WAAW,IACnB,QAAO;AAGT,WAAS;EACT,MAAMC,SAA8C,EAAE;AAEtD,kBAAgB;AAChB,MAAI,MAAM,WAAW,KAAK;AACxB,YAAS;AACT,UAAO;;AAGT,SAAO,QAAQ,MAAM,QAAQ;AAC3B,mBAAgB;GAChB,MAAM,MAAM,MAAM,WAAW,QAAO,MAAM,WAAW,MAAM,aAAa,GAAG,iBAAiB;AAC5F,OAAI,QAAQ,2BACV,QAAO;AAGT,mBAAgB;AAChB,OAAI,MAAM,WAAW,IACnB,QAAO;AAGT,YAAS;GACT,MAAM,QAAQ,YAAY;AAC1B,OAAI,UAAU,2BACZ,QAAO;AAET,UAAO,OAAO;AAEd,mBAAgB;AAChB,OAAI,MAAM,WAAW,KAAK;AACxB,aAAS;AACT,oBAAgB;AAChB;;AAEF,OAAI,MAAM,WAAW,KAAK;AACxB,aAAS;AACT,WAAO;;AAET,UAAO;;AAGT,SAAO;;CAGT,SAAS,aAAmE;AAC1E,kBAAgB;EAChB,MAAM,YAAY,MAAM;AACxB,MAAI,cAAc,IAChB,QAAO,aAAa;AAEtB,MAAI,cAAc,IAChB,QAAO,YAAY;AAErB,MAAI,cAAc,QAAO,cAAc,IACrC,QAAO,aAAa;AAEtB,MAAI,cAAc,OAAO,KAAK,KAAK,aAAa,GAAG,CACjD,QAAO,aAAa;EAGtB,MAAM,aAAa,iBAAiB;AACpC,MAAI,eAAe,2BACjB,QAAO;AAET,MAAI,eAAe,OACjB,QAAO;AAET,MAAI,eAAe,QACjB,QAAO;AAET,MAAI,eAAe,OACjB,QAAO;AAET,SAAO;;AAGT,iBAAgB;CAChB,MAAM,SAAS,YAAY;AAC3B,KAAI,WAAW,2BACb,QAAO;AAGT,iBAAgB;AAChB,QAAO,UAAU,MAAM,SAAS,SAAS;;AAG3C,SAAS,wBACP,OACuD;CACvD,MAAM,SAAS,mBAAmB,MAAM;AACxC,KAAI,WAAW,8BAA8B,CAAC,MAAM,QAAQ,OAAO,CACjE,QAAO;AAET,KAAI,CAAC,OAAO,OAAO,SAAyB,OAAO,SAAS,SAAS,CACnE,QAAO;AAET,QAAO;;AAGT,SAAS,cAAc,OAAkD;AACvE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,sBACP,OAC6D;CAC7D,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CACpD,QAAO;CAGT,IAAIC;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,QAAQ;SACtB;AACN,WAAS,mBAAmB,QAAQ;AACpC,MAAI,WAAW,2BACb,QAAO;;AAIX,KAAI,CAAC,cAAc,OAAO,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,+BACP,YACA,UAC6C;AAC7C,SAAQ,WAAW,MAAnB;EACE,KAAK,SACH,QAAO,qBAAqB,SAAS;EACvC,KAAK,UAAU;GACb,MAAM,SAAS,OAAO,qBAAqB,SAAS,CAAC;AACrD,UAAO,OAAO,MAAM,OAAO,GAAG,6BAA6B;;EAE7D,KAAK,cACH,QAAO,wBAAwB,SAAS;EAC1C,KAAK,SACH,QAAO,sBAAsB,SAAS;EACxC,QAGE,QAAO;;;AAKb,SAAS,6BAA6B,OAOxB;AACZ,OAAM,YAAY,KAAK;EACrB,MAAM;EACN,SAAS,GAAG,MAAM,YAAY,GAAG,MAAM,YAAY,GAAG,MAAM;EAC5D,UAAU,MAAM;EAChB,MAAM,MAAM;EACb,CAAC;;AAIJ,SAAgB,iBAAiB,OAQE;CACjC,MAAMC,aAAwB,MAAM,YAAY,UAAU,OAAU;CAEpE,MAAM,iBAAiB,MAAM,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAAa;CAC5E,MAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ,IAAI,SAAS,QAAQ;AAElE,KAAI,eAAe,SAAS,MAAM,YAAY,OAC5C,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,aAAa,MAAM;EACnB,SAAS,mBAAmB,MAAM,YAAY,OAAO,yBAAyB,eAAe,OAAO;EACrG,CAAC;AAGJ,MAAK,MAAM,CAAC,OAAO,aAAa,eAAe,SAAS,EAAE;EACxD,MAAM,aAAa,MAAM,YAAY;AACrC,MAAI,CAAC,WACH,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,wCAAwC,QAAQ,EAAE;GAC5D,CAAC;EAGJ,MAAM,QAAQ,+BAA+B,YAAY,SAAS,MAAM;AACxE,MAAI,UAAU,2BACZ,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,0BAA0B,QAAQ,EAAE,wBAAwB,WAAW,KAAK;GACtF,CAAC;AAGJ,aAAW,SAAS;;AAGtB,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,kBAAkB,MAAM,YAAY,WACvC,iBAAeC,aAAW,SAAS,SAAS,KAC9C;AACD,MAAI,kBAAkB,EACpB,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,oCAAoC,SAAS,KAAK;GAC5D,CAAC;AAGJ,MAAI,WAAW,qBAAqB,OAClC,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,0CAA0C,SAAS,KAAK;GAClE,CAAC;EAGJ,MAAM,aAAa,MAAM,YAAY;AACrC,MAAI,CAAC,WACH,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,mCAAmC,SAAS,KAAK;GAC3D,CAAC;EAGJ,MAAM,QAAQ,+BAA+B,YAAY,SAAS,MAAM;AACxE,MAAI,UAAU,2BACZ,QAAO,6BAA6B;GAClC,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,MAAM,SAAS;GACf,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,SAAS,gCAAgC,SAAS,KAAK,yBAAyB,WAAW,KAAK;GACjG,CAAC;AAGJ,aAAW,mBAAmB;;AAGhC,QAAO;;;;;AC1ZT,SAAgB,2BACd,SACA,YACkB;AAClB,QAAO;EACL,SAAS,WAAW;EACpB,YAAY,WAAW;EACvB;EACD;;AAGH,SAAgB,4BACd,eACA,MACgD;CAChD,IAAIC,UAAmB,eAAe;AAEtC,MAAK,MAAM,WAAW,MAAM;AAC1B,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,QAAQ,CAC3E;AAEF,YAAW,QAAoC;;AAGjD,QAAO,qCAAqC,QAAQ,GAAG,UAAU;;;;;;;;;;;;;;;;AAiBnE,SAAgB,yBACd,eACA,oBACA,SACoB;CACpB,MAAM,WAAW,cAAc,QAAQ,IAAI;AAC3C,KAAI,YAAY,KAAK,aAAa,cAAc,SAAS,EACvD;CAEF,MAAM,YAAY,cAAc,MAAM,GAAG,SAAS;AAClD,KACE,cAAc,QACd,cAAc,SAAS,YACvB,cAAc,SAAS,YACvB,mBAAmB,IAAI,UAAU,CAEjC;AAEF,QAAO;;;;;;;;;;AAWT,SAAgB,0BAA0B,OAMjC;AACP,OAAM,YAAY,KAAK;EACrB,MAAM;EACN,SAAS,GAAG,MAAM,aAAa,gCAAgC,MAAM,UAAU,yBAAyB,MAAM,UAAU;EACxH,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,MAAM;GAAE,WAAW,MAAM;GAAW,eAAe,MAAM;GAAW;EACrE,CAAC;;AAGJ,SAAgB,8BAA8B,OAYhC;CACZ,MAAM,aAAa,MAAM,KAAK,KAAK,KAAK,IAAI;CAC5C,MAAM,OAAO,iBAAiB;EAC5B,MAAM,MAAM,KAAK;EACjB,aAAa,MAAM,WAAW,QAAQ,EAAE;EACxC,aAAa,gBAAgB,WAAW;EACxC,MAAM,MAAM,KAAK;EACjB,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,aAAa,MAAM;EACpB,CAAC;AACF,KAAI,CAAC,KACH;AAGF,KAAI;AACF,mCAAiC,YAAY,MAAM,WAAW,MAAM,KAAK;AACzE,SAAO,oCAAoC,MAAM,YAAY,KAAK;UAC3D,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,GAAG,MAAM,YAAY,gBAAgB,WAAW,IAAI;GAC7D,UAAU,MAAM;GAChB,MAAM,MAAM,KAAK;GAClB,CAAC;AACF;;;AAIJ,SAAS,yCAAyC,OAMpC;AACZ,OAAM,YAAY,KAAK;EACrB,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,UAAU,MAAM;EAChB,MAAM,MAAM;EACb,CAAC;;AAIJ,SAAgB,oCAAoC,OAUD;CACjD,MAAM,aAAa,4BAA4B,MAAM,wBAAwB,MAAM,KAAK,KAAK;AAC7F,KAAI,WACF,QAAO;CAGT,MAAM,YAAY,MAAM,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,KAAK;AACpE,KACE,aACA,cAAc,QACd,cAAc,MAAM,YACpB,cAAc,MAAM,YACpB,CAAC,MAAM,mBAAmB,IAAI,UAAU,EACxC;AACA,4BAA0B;GACxB,cAAc,qBAAqB,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;GAC7D;GACA,UAAU,MAAM;GAChB,MAAM,MAAM,KAAK;GACjB,aAAa,MAAM;GACpB,CAAC;AACF;;AAGF,QAAO,yCAAyC;EAC9C,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,KAAK;EACjB,MAAM,MAAM;EACZ,SAAS,MAAM;EAChB,CAAC;;AAOJ,SAAgB,2BAA2B,OAYhB;AACzB,KAAI,MAAM,MAAM,iBAAiB;EAC/B,MAAM,aAAa,MAAM,MAAM,gBAAgB,KAAK,KAAK,IAAI;EAC7D,MAAMC,eAAa,oCAAoC;GACrD,MAAM,MAAM,MAAM;GAClB,wBAAwB,MAAM;GAC9B,oBAAoB,MAAM;GAC1B,UAAU,MAAM;GAChB,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,iBAAiB;GACjB,oBAAoB,GAAG,MAAM,YAAY,qBAAqB,WAAW;GAC1E,CAAC;AACF,MAAI,CAACA,aACH,QAAO;GAAE,IAAI;GAAO,iBAAiB;GAAM;EAG7C,MAAM,eAAe,8BAA8B;GACjD,MAAM,MAAM,MAAM;GAClB;GACA,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,aAAa,MAAM;GACpB,CAAC;AACF,MAAI,CAAC,aACH,QAAO;GAAE,IAAI;GAAO,iBAAiB;GAAM;AAE7C,SAAO;GAAE,IAAI;GAAM,YAAY;GAAc;;CAG/C,MAAM,aAAa,wBACjB,MAAM,OACN,MAAM,qBACN,MAAM,sBACN,MAAM,sBACP;AACD,KAAI,CAAC,WACH,QAAO;EAAE,IAAI;EAAO,iBAAiB;EAAO;AAE9C,QAAO;EAAE,IAAI;EAAM;EAAY;;AAsCjC,MAAaC,oBAA8D;CACzE,cAAc;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,WAAW;EACT,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,WAAW;EAAE,MAAM;EAAU,UAAU;EAAU,SAAS;EAAM,YAAY;EAAQ;CACpF,eAAe;EAAE,MAAM;EAAU,UAAU;EAAO,SAAS;EAAa,YAAY;EAAQ;CAC5F,WAAW;EAAE,MAAM;EAAU,UAAU;EAAS,SAAS;EAAe,YAAY;EAAU;CAC9F,cAAc;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,gBAAgB;EACd,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,kBAAkB;EAChB,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,WAAW;EAAE,MAAM;EAAU,UAAU;EAAY,SAAS;EAAM,YAAY;EAAQ;CACtF,WAAW;EACT,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,aAAa;EACX,MAAM;EACN,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,WAAW;EAAE,MAAM;EAAU,UAAU;EAAQ,SAAS;EAAa,YAAY;EAAQ;CAC1F;AAED,SAAgB,6BAA6B,OAOZ;CAC/B,MAAM,OAAO,kBAAkB,MAAM,UAAU;AAC/C,KAAI,CAAC,MAAM;AACT,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,GAAG,MAAM,YAAY,gCAAgC,MAAM,UAAU,KAAK;GACnF,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;AAGF,KAAI,MAAM,aAAa,KAAK,SAC1B,QAAO,6BAA6B;EAClC,aAAa,MAAM;EACnB,UAAU,MAAM;EAChB,MAAM,MAAM,UAAU;EACtB,SAAS,GAAG,MAAM,YAAY,SAAS,MAAM,UAAU,KAAK,6BAA6B,MAAM,SAAS,eAAe,KAAK,SAAS;EACtI,CAAC;AAGJ,SAAQ,KAAK,MAAb;EACE,KAAK;AACH,OAAI,uBAAuB,MAAM,UAAU,CAAC,SAAS,KAAK,MAAM,UAAU,KAAK,SAAS,EACtF,QAAO,6BAA6B;IAClC,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,MAAM,MAAM,UAAU;IACtB,SAAS,GAAG,MAAM,YAAY,IAAI,MAAM,UAAU,KAAK;IACxD,CAAC;AAEJ,UAAO;IACL,SAAS,KAAK,WAAW,MAAM,eAAe;IAC9C,YAAY,KAAK;IAClB;EAEH,KAAK,kBAAkB;GACrB,MAAM,SAAS,mCAAmC;IAChD,WAAW,MAAM;IACjB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,SAAS;IACT,YAAY;IACb,CAAC;AACF,OAAI,WAAW,OACb;AAEF,UAAO;IACL,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,GAAI,WAAW,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE;IACtD;;EAEH,KAAK,qBAAqB;GACxB,MAAM,YAAY,mCAAmC;IACnD,WAAW,MAAM;IACjB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,SAAS;IACT,YAAY;IACb,CAAC;AACF,OAAI,cAAc,OAChB;AAEF,UAAO;IACL,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,GAAI,cAAc,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE;IAC5D;;EAEH,KAAK,mBAAmB;GACtB,MAAM,UAAU,8BAA8B;IAC5C,WAAW,MAAM;IACjB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,aAAa,MAAM;IACpB,CAAC;AACF,OAAI,YAAY,OACd;AAEF,UAAO;IACL,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,GAAI,YAAY,OAAO,EAAE,GAAG,EAAE,YAAY,SAAS;IACpD;;;;AAKP,SAAgB,yBAAyB,YAA+C;CACtF,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,YAAY,UAAU,YAAY,QACpC,QAAO;EAAE,MAAM;EAAW,OAAO,YAAY;EAAQ;CAEvD,MAAM,eAAe,OAAO,QAAQ;AACpC,KAAI,CAAC,OAAO,MAAM,aAAa,IAAI,QAAQ,SAAS,KAAK,CAAC,eAAe,KAAK,QAAQ,CACpF,QAAO;EAAE,MAAM;EAAW,OAAO;EAAc;AAEjD,KAAI,eAAe,KAAK,QAAQ,CAC9B,QAAO;EAAE,MAAM;EAAW,OAAO,qBAAqB,QAAQ;EAAE;;AAKpE,SAAgB,qBAAqB,OAYnC;CACA,MAAM,oBAAoB,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAAa;AAGhG,KAFqB,MAAM,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,SAAS,QAAQ,CAErE,SAAS,KAAK,kBAAkB,WAAW,GAAG;AAC7D,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,UAAU,MAAM,UAAU,GAAG,MAAM,UAAU;GACtD,UAAU,MAAM;GAChB,MAAM,MAAM,iBAAiB;GAC9B,CAAC;AACF,SAAO,EAAE;;CAGX,MAAM,kBAAkB,2BAA2B,MAAM,iBAAiB;AAC1E,KAAI,CAAC,iBAAiB;AACpB,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,UAAU,MAAM,UAAU,GAAG,MAAM,UAAU;GACtD,UAAU,MAAM;GAChB,MAAM,MAAM,iBAAiB;GAC9B,CAAC;AACF,SAAO,EAAE;;CAGX,MAAM,iBAAiB,yBAAyB,gBAAgB,MAAM;AACtE,KAAI,eACF,QAAO,EAAE,cAAc,gBAAgB;CAGzC,MAAM,sBAAsB,yBAAyB,gBAAgB,OAAO,gBAAgB,KAAK;AACjG,KAAI,CAAC,qBAAqB;AACxB,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,8BAA8B,gBAAgB,MAAM;GAC7D,UAAU,MAAM;GAChB,MAAM,MAAM,iBAAiB;GAC9B,CAAC;AACF,SAAO,EAAE;;CAGX,MAAM,UAAU,iCAAiC;EAC/C,MAAM;EACN,UAAU,MAAM;EAChB,SAAS;GACP,UAAU,MAAM;GAChB,WAAW,MAAM;GACjB,WAAW,MAAM;GACjB,eAAe,MAAM,iBAAiB;GACvC;EACF,CAAC;AAEF,KAAI,CAAC,QAAQ,IAAI;AACf,QAAM,YAAY,KAAK,QAAQ,WAAW;AAC1C,SAAO,EAAE;;AAGX,KAAI,QAAQ,MAAM,SAAS,UACzB,QAAO,EAAE,cAAc,QAAQ,MAAM,cAAc;CAGrD,MAAM,sBAAsB,MAAM,wBAAwB,IAAI,QAAQ,MAAM,UAAU,GAAG;AACzF,KAAI,CAAC,qBAAqB;AACxB,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,sBAAsB,QAAQ,MAAM,UAAU,GAAG;GAC1D,UAAU,MAAM;GAChB,MAAM,gBAAgB;GACvB,CAAC;AACF,SAAO,EAAE;;AAGX,KAAI,CAAC,oBAAoB,mBAAmB,SAAS,MAAM,iBAAiB,QAAQ,EAAE;AACpF,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,sBAAsB,oBAAoB,GAAG,0BAA0B,MAAM,UAAU,GAAG,MAAM,UAAU,kBAAkB,MAAM,iBAAiB,QAAQ;GACpK,UAAU,MAAM;GAChB,MAAM,gBAAgB;GACvB,CAAC;AACF,SAAO,EAAE;;AAGX,QAAO,EAAE,kBAAkB,QAAQ,MAAM,WAAW;;AAGtD,SAAgB,wBACd,OACA,qBACA,sBACA,uBAC8B;AAC9B,KAAI,MAAM,WAAW,qBAAqB,IAAI,MAAM,QAAQ,CAC1D,QAAO,qBAAqB,IAAI,MAAM,QAAQ;AAEhD,KAAI,qBAAqB,IAAI,MAAM,SAAS,CAC1C,QAAO,qBAAqB,IAAI,MAAM,SAAS;AAEjD,KAAI,oBAAoB,IAAI,MAAM,SAAS,CACzC,QAAO,oBAAoB,IAAI,MAAM,SAAS;AAEhD,QAAO,sBAAsB,IAAI,MAAM,SAAS;;;;;ACxhBlD,MAAMC,gCAAqD,IAAI,IAAI;CACjE;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,wBAAwB,OAQxB;AACP,MAAK,MAAM,aAAa,MAAM,MAAM,YAAY;AAC9C,MAAI,8BAA8B,IAAI,UAAU,KAAK,CACnD;EAGF,MAAM,sBAAsB,yBAAyB,UAAU,MAAM,MAAM,oBAAoB;GAC7F,UAAU,MAAM;GAChB,UAAU,MAAM;GACjB,CAAC;AACF,MAAI,qBAAqB;AACvB,6BAA0B;IACxB,cAAc,eAAe,UAAU,KAAK;IAC5C,WAAW;IACX,UAAU,MAAM;IAChB,MAAM,UAAU;IAChB,aAAa,MAAM;IACpB,CAAC;AACF;;AAGF,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,UAAU,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,KAAK,iCAAiC,UAAU,KAAK;GACxG,UAAU,MAAM;GAChB,MAAM,UAAU;GACjB,CAAC;;;AAIN,SAAS,4BAA4B,OAUnC;CACA,MAAM,cAAc,aAAa,MAAM,MAAM,YAAY,KAAK;CAC9D,MAAM,kBAAkB,aAAa,MAAM,MAAM,YAAY,SAAS;AAiBtE,QAAO;EAAE;EAAa;EAAiB,QAhBxB,2BAA2B;GACxC,WAAW;GACX,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,aAAa,UAAU,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,KAAK;GAC5D,MAAM,MAAM,MAAM;GAClB,MAAM;GACP,CAAC;EAS6C,YAR5B,2BAA2B;GAC5C,WAAW;GACX,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,aAAa,UAAU,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,KAAK;GAC5D,MAAM,MAAM,MAAM;GAClB,MAAM;GACP,CAAC;EACyD;;AAG7D,SAAgB,sBAAsB,OAAoD;CACxF,MAAM,EACJ,OACA,SACA,qBACA,sBACA,YACA,oBACA,oBACA,wBACA,UACA,UACA,yBACA,yBACA,aACA,UACA,0BACE;CACJ,MAAMC,iBAAkC,EAAE;AAE1C,MAAK,MAAM,SAAS,MAAM,QAAQ;AAChC,MAAI,MAAM,QAAQ,WAAW,IAAI,MAAM,SAAS,CAC9C;AAGF,0BAAwB;GACtB;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;AAGF,MAD0B,aAAa,MAAM,YAAY,WAAW,IAC3C,WAAW,IAAI,MAAM,SAAS,CACrD;EAGF,MAAM,qBAAqB,mBAAmB,IAAI,MAAM,SAAS;EACjE,MAAM,cAAc,MAAM;EAE1B,IAAIC;EACJ,IAAIC;EACJ,MAAM,eAAe;GACnB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,aAAa,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK;GACjD;AAED,MAAI,mBACF,cAAa,sBAAsB,IAAI,OAAO;WACrC,aAAa;GACtB,MAAM,WAAW,2BAA2B,aAAa;AACzD,OAAI,CAAC,SAAS,IAAI;AAChB,QAAI,CAAC,SAAS,gBACZ,aAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,UAAU,MAAM,SAAS;KACrE;KACA,MAAM,MAAM;KACb,CAAC;AAEJ;;AAEF,mBAAgB,SAAS,WAAW;AACpC,gBAAa,sBAAsB,IAAI,OAAO;SACzC;GACL,MAAM,WAAW,2BAA2B,aAAa;AACzD,OAAI,CAAC,SAAS,IAAI;AAChB,QAAI,CAAC,SAAS,gBACZ,aAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,UAAU,MAAM,SAAS;KACrE;KACA,MAAM,MAAM;KACb,CAAC;AAEJ;;AAEF,gBAAa,SAAS;;AAGxB,MAAI,CAAC,WACH;EAGF,MAAM,mBAAmB,aAAa,MAAM,YAAY,UAAU;EAClE,MAAM,iBAAiB,mBACnB,qBAAqB;GACnB,WAAW,MAAM;GACjB,WAAW,MAAM;GACjB;GACA,kBAAkB;GAClB;GACA;GACA;GACA;GACD,CAAC,GACF,EAAE;AACN,MAAI,MAAM,YAAY,eAAe,kBAAkB;GACrD,MAAM,uBACJ,eAAe,iBAAiB,SAAS,cACrC,IAAI,eAAe,iBAAiB,GAAG,KACvC;AACN,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,oDAAoD,qBAAqB;IACrH;IACA,MAAM,kBAAkB,QAAQ,MAAM;IACvC,CAAC;AACF;;AAEF,MAAI,eAAe,kBAAkB;GAEnC,MAAM,sBADsB,wBAAwB,IAAI,eAAe,iBAAiB,GAAG,EAC1C,mCAAmC,EAClF,WAAW,eAAe,kBAC3B,CAAC;AACF,OAAI,oBACF,cAAa;;EAGjB,MAAM,mBAAmB,QAAQ,aAAa,IAAI,MAAM,KAAK,IAAI,MAAM;EACvE,MAAM,EAAE,aAAa,iBAAiB,QAAQ,eAAe,4BAA4B;GACvF;GACA;GACA;GACA;GACD,CAAC;AAEF,iBAAe,KAAK;GAClB;GACA,YAAY;GACZ;GACA,GAAG,UAAU,gBAAgB,eAAe,aAAa;GACzD,GAAG,UAAU,oBAAoB,eAAe,iBAAiB;GACjE,MAAM,QAAQ,YAAY;GAC1B,UAAU,QAAQ,gBAAgB;GAClC,GAAG,UAAU,UAAU,OAAO;GAC9B,GAAG,UAAU,cAAc,WAAW;GACtC,GAAG,UAAU,QAAQ,cAAe,OAAiB,OAAU;GAC/D,GAAG,UAAU,uBAAuB,qBAAqB,MAAM,WAAW,OAAU;GACpF,GAAG,UAAU,iBAAiB,cAAc;GAC7C,CAAC;;AAGJ,QAAO;;AAGT,SAAgB,mBACd,QACA,aACA,UAC+B;CAC/B,MAAM,yBAAS,IAAI,KAA+B;AAClD,MAAK,MAAM,SAAS,QAAQ;EAE1B,MAAM,YAAY,aAAa;GAC7B,WAFmB,aAAa,MAAM,YAAY,MAAM;GAGxD,cAAc,WAAW,MAAM,KAAK;GACpC;GACA;GACA,aAAa,UAAU,MAAM,KAAK;GAClC,MAAM,MAAM;GACb,CAAC;EACF,MAAM,+BAAe,IAAI,KAAqB;AAC9C,OAAK,MAAM,SAAS,MAAM,QAAQ;GAEhC,MAAM,aAAa,aAAa;IAC9B,WAFwB,aAAa,MAAM,YAAY,MAAM;IAG7D,cAAc,MAAM;IACpB;IACA;IACA,aAAa,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK;IAChD,MAAM,MAAM;IACb,CAAC;AACF,gBAAa,IAAI,MAAM,MAAM,WAAW;;AAE1C,SAAO,IAAI,MAAM,MAAM;GACrB;GACA;GACA;GACD,CAAC;;AAEJ,QAAO;;;;;AC9TT,MAAa,yBAAyB;CACpC,UAAU;CACV,UAAU;CACV,SAAS;CACT,SAAS;CACT,YAAY;CACZ,UAAU;CACV,UAAU;CACV,SAAS;CACT,SAAS;CACT,YAAY;CACb;AAgCD,SAAgB,kBAAkB,oBAA4B,iBAAiC;AAE7F,QAAO,GAAG,mBAAmB,IAAI;;AAGnC,SAAgB,2BAA2B,OAQT;CAChC,MAAM,aACJ,uBAAuB,MAAM;AAC/B,KAAI,WACF,QAAO;AAGT,OAAM,YAAY,KAAK;EACrB,MAAM;EACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU,oBAAoB,MAAM,WAAW,WAAW,MAAM,YAAY;EACjI,UAAU,MAAM;EAChB,MAAM,MAAM;EACb,CAAC;;AAIJ,SAAgB,uBAAuB,OAMC;AAEtC,KAD0B,MAAM,UAAU,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAAa,CACnE,SAAS,GAAG;AAChC,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;GAC/D,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;CAGF,IAAIC;CACJ,MAAM,sBAAsB,2BAA2B,MAAM,UAAU;AACvE,KAAI,qBAAqB;EACvB,MAAM,aAAa,yBAAyB,oBAAoB,MAAM;AACtE,MAAI,CAAC,YAAY;AACf,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;IAC/D,UAAU,MAAM;IAChB,MAAM,oBAAoB;IAC3B,CAAC;AACF;;AAEF,+BAA6B;;AAG/B,MAAK,MAAM,OAAO,MAAM,UAAU,MAAM;AACtC,MAAI,IAAI,SAAS,aACf;AAEF,MACE,IAAI,SAAS,UACb,IAAI,SAAS,YACb,IAAI,SAAS,gBACb,IAAI,SAAS,SACb,IAAI,SAAS,cACb,IAAI,SAAS,YACb;AACA,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU,8BAA8B,IAAI,KAAK;IACtG,UAAU,MAAM;IAChB,MAAM,IAAI;IACX,CAAC;AACF;;;CAIJ,MAAM,uBAAuB,iBAAiB,MAAM,WAAW,OAAO;CACtE,MAAM,oBAAoB,uBACtB,yBAAyB,qBAAqB,GAC9C;AACJ,KAAI,wBAAwB,CAAC,mBAAmB;AAC9C,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;GAC/D,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;AAGF,KACE,8BACA,qBACA,+BAA+B,mBAC/B;AACA,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;GAC/D,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;CAEF,MAAM,eAAe,qBAAqB;CAE1C,MAAM,oBAAoB,iBAAiB,MAAM,WAAW,MAAM;CAClE,MAAM,iBAAiB,oBACnB,yBAAyB,kBAAkB,GAC3C;AACJ,KAAI,qBAAqB,CAAC,gBAAgB;AACxC,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;GAC/D,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;CAGF,MAAM,YAAY,iBAAiB,MAAM,WAAW,SAAS;CAC7D,MAAM,gBAAgB,iBAAiB,MAAM,WAAW,aAAa;AACrE,KAAK,aAAa,CAAC,iBAAmB,CAAC,aAAa,eAAgB;AAClE,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;GAC/D,UAAU,MAAM;GAChB,MAAM,MAAM,UAAU;GACvB,CAAC;AACF;;CAGF,IAAIC;CACJ,IAAIC;AACJ,KAAI,aAAa,eAAe;EAC9B,MAAM,eAAe,eAAe,UAAU;EAC9C,MAAM,mBAAmB,eAAe,cAAc;AACtD,MACE,CAAC,gBACD,CAAC,oBACD,aAAa,WAAW,KACxB,iBAAiB,WAAW,GAC5B;AACA,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,mBAAmB,MAAM,UAAU,GAAG,MAAM,UAAU;IAC/D,UAAU,MAAM;IAChB,MAAM,MAAM,UAAU;IACvB,CAAC;AACF;;AAEF,WAAS;AACT,eAAa;;CAGf,MAAM,mBAAmB,iBAAiB,MAAM,WAAW,WAAW;CACtE,MAAM,mBAAmB,iBAAiB,MAAM,WAAW,WAAW;AAEtE,QAAO;EACL,GAAG,UAAU,gBAAgB,aAAa;EAC1C,GAAG,UAAU,UAAU,OAAO;EAC9B,GAAG,UAAU,cAAc,WAAW;EACtC,GAAG,UAAU,kBAAkB,eAAe;EAC9C,GAAG,UAAU,YAAY,mBAAmB,qBAAqB,iBAAiB,GAAG,OAAU;EAC/F,GAAG,UAAU,YAAY,mBAAmB,qBAAqB,iBAAiB,GAAG,OAAU;EAChG;;AAGH,SAAgB,iBAAiB,OAK/B;CACA,MAAM,iCAAiB,IAAI,KAAsC;CACjE,MAAM,oCAAoB,IAAI,KAAmC;AAEjE,MAAK,MAAM,YAAY,MAAM,oBAAoB;EAC/C,MAAM,WAAW,eAAe,IAAI,SAAS,mBAAmB;EAChE,MAAM,UAAU,YAAY,EAAE;AAC9B,MAAI,CAAC,SACH,gBAAe,IAAI,SAAS,oBAAoB,QAAQ;AAE1D,UAAQ,KAAK;GACX,WAAW,SAAS;GACpB,SAAS,SAAS;GAClB,SAAS,SAAS;GAClB,aAAa;GACb,IAAI;IACF,aAAa,SAAS;IACtB,eAAe,SAAS;IACxB,YAAY,SAAS;IACrB,cAAc,SAAS;IACxB;GACF,CAAC;EAEF,MAAM,UAAU,kBAAkB,SAAS,oBAAoB,SAAS,gBAAgB;EACxF,MAAM,gBAAgB,kBAAkB,IAAI,QAAQ;AACpD,MAAI,CAAC,eAAe;AAClB,qBAAkB,IAAI,SAAS,CAAC,SAAS,CAAC;AAC1C;;AAEF,gBAAc,KAAK,SAAS;;AAG9B,QAAO;EAAE;EAAgB;EAAmB;;AAG9C,SAAgB,4BAA4B,OAMnC;AACP,MAAK,MAAM,aAAa,MAAM,wBAAwB;EACpD,MAAM,UAAU,kBAAkB,UAAU,iBAAiB,UAAU,UAAU;EACjF,MAAM,cAAc,MAAM,kBAAkB,IAAI,QAAQ,IAAI,EAAE;EAC9D,MAAM,UAAU,UAAU,eACtB,YAAY,QAAQ,aAAa,SAAS,iBAAiB,UAAU,aAAa,GAClF,CAAC,GAAG,YAAY;AAEpB,MAAI,QAAQ,WAAW,GAAG;AACxB,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,MAAM,KAAK,+CAA+C,UAAU,gBAAgB;IAC1J,UAAU,MAAM;IAChB,MAAM,UAAU,MAAM;IACvB,CAAC;AACF;;AAEF,MAAI,QAAQ,SAAS,GAAG;AACtB,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,4BAA4B,UAAU,UAAU,GAAG,UAAU,MAAM,KAAK,iDAAiD,UAAU,gBAAgB;IAC5J,UAAU,MAAM;IAChB,MAAM,UAAU,MAAM;IACvB,CAAC;AACF;;AAGF,YAAU,QAAQ,WAAW,GAAG,mDAAmD;EACnF,MAAM,UAAU,QAAQ;AACxB,gBAAc,SAAS,0DAA0D;EAEjF,MAAM,WAAW,MAAM,eAAe,IAAI,UAAU,UAAU;EAC9D,MAAM,UAAU,YAAY,EAAE;AAC9B,MAAI,CAAC,SACH,OAAM,eAAe,IAAI,UAAU,WAAW,QAAQ;AAExD,UAAQ,KAAK;GACX,WAAW,UAAU,MAAM;GAC3B,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,aAAa;GACb,IAAI;IACF,aAAa,UAAU;IACvB,eAAe,QAAQ;IACvB,YAAY,QAAQ;IACpB,cAAc,QAAQ;IACvB;GACF,CAAC;;;AAIN,SAAgB,sCAAsC,OAQ1C;CACV,IAAI,QAAQ;AACZ,MAAK,MAAM,aAAa,MAAM,MAAM,YAAY;AAC9C,MAAI,UAAU,SAAS,WACrB;EAGF,MAAM,sBAAsB,yBAAyB,UAAU,MAAM,MAAM,oBAAoB;GAC7F,UAAU,MAAM;GAChB,UAAU,MAAM;GACjB,CAAC;AACF,MAAI,qBAAqB;AACvB,6BAA0B;IACxB,cAAc,eAAe,UAAU,KAAK;IAC5C,WAAW;IACX,UAAU,MAAM;IAChB,MAAM,UAAU;IAChB,aAAa,MAAM;IACpB,CAAC;AACF,WAAQ;AACR;;AAEF,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,UAAU,MAAM,UAAU,GAAG,MAAM,MAAM,KAAK,iCAAiC,UAAU,KAAK;GACvG,UAAU,MAAM;GAChB,MAAM,UAAU;GACjB,CAAC;AACF,UAAQ;;AAEV,QAAO;;;;;AC1RT,SAAS,+BACP,QACA,cACA,oBAAoE,EAAE,EACL;AACjE,KAAI,aAAa,WAAW,EAC1B;CAGF,MAAM,uBAAuB,IAAI,IAAI,kBAAkB,KAAK,YAAY,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAE/F,QAAO,OAAO,YACZ,aAAa,KAAK,gBAAgB,CAChC,aACA,qBAAqB,IAAI,YAAY,IAClC;EACC,MAAM;EACN,IAAI;EACJ,UAAU,OAAO;EACjB,UAAU,OAAO;EACjB,SAAS;EACV,CACJ,CAAC,CACH;;AAGH,SAAS,mBAAmB,YAA8C;CACxE,MAAM,OAAO,WAAW;CACxB,MAAM,UAAU,OACZ,GAAG,KAAK,MAAM,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,KAAK,MAAM,KAAK,GAAG,KAAK,IAAI,SACvE;AACJ,QAAO,GAAG,WAAW,KAAK,QAAQ,WAAW,SAAS,QAAQ,QAAQ,QAAQ,WAAW;;AAG3F,SAAS,kBACP,aAC4B;CAC5B,MAAM,uBAAO,IAAI,KAAuC;AACxD,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,MAAM,mBAAmB,WAAW;AAC1C,MAAI,CAAC,KAAK,IAAI,IAAI,CAChB,MAAK,IAAI,KAAK,WAAW;;AAG7B,QAAO,CAAC,GAAG,KAAK,QAAQ,CAAC;;AAG3B,SAAS,eAAe,MAAc,OAA2B;AAC/D,KAAI,OAAO,MACT,QAAO;AAET,KAAI,OAAO,MACT,QAAO;AAET,QAAO;;AAGT,SAAS,qBAAqB,UAA8D;AAC1F,QAAO,SAAS,YAAY,KAAK,gBAAgB;EAC/C,MAAM,WAAW;EACjB,SAAS,WAAW;EACpB,UAAU,WAAW;EACrB,MAAM,WAAW;EAClB,EAAE;;AAUL,SAAS,wBAAwB,OAG/B;CACA,MAAMC,eAAoD,EAAE;CAC5D,MAAM,sCAAsB,IAAI,KAA+B;AAE/D,MAAK,MAAM,mBAAmB,MAAM,OAAO;EACzC,MAAM,aAAa,aAAa;GAC9B,WAAW,aAAa,gBAAgB,YAAY,MAAM;GAC1D,cAAc,gBAAgB;GAC9B,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,aAAa,SAAS,gBAAgB,KAAK;GAC3C,MAAM,gBAAgB;GACvB,CAAC;EACF,MAAM,kBAAkB,MAAM,sBAC1B,oCAAoC,MAAM,qBAAqB,CAC7D,YACA,gBAAgB,OAAO,KAAK,UAAU,MAAM,KAAK,CAClD,CAAC,GACF;GACE,SAAS;GACT;GACA,YAAY,EAAE,QAAQ,gBAAgB,OAAO,KAAK,UAAU,MAAM,KAAK,EAAE;GAC1E;EACL,MAAMC,aAA+B;GACnC,SAAS,gBAAgB;GACzB,YAAY,gBAAgB;GAC5B,SAAS,gBAAgB;GAC1B;AACD,sBAAoB,IAAI,gBAAgB,MAAM,WAAW;AACzD,eAAa,gBAAgB,QAAQ;GACnC,SAAS,gBAAgB;GACzB,YAAY,gBAAgB;GAC5B,YAAY,gBAAgB,cAAc,EACxC,QAAQ,gBAAgB,OAAO,KAAK,UAAU,MAAM,KAAK,EAC1D;GACF;;AAGH,QAAO;EAAE;EAAc;EAAqB;;AAe9C,SAAS,4BAA4B,OAWnC;CAIA,MAAM,CAAC,uBAAuB,GAAG,+BAHF,MAAM,oBACjC,MAAM,YAAY,WAAW,QAAQ,cAAc,UAAU,KAAK,WAAW,MAAM,CAAC,GACpF,EAAE;CAEN,IAAI,mCAAmC;AAEvC,MAAK,MAAM,SAAS,6BAA6B;AAC/C,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,eAAe,MAAM,YAAY,KAAK;GAC/C,UAAU,MAAM;GAChB,MAAM,MAAM;GACb,CAAC;AACF,qCAAmC;;AAGrC,MAAK,MAAM,aAAa,MAAM,YAAY,YAAY;AACpD,MAAI,MAAM,qBAAqB,UAAU,KAAK,WAAW,MAAM,CAC7D;EAGF,MAAM,sBAAsB,yBAAyB,UAAU,MAAM,MAAM,oBAAoB;GAC7F,UAAU,MAAM;GAChB,UAAU,MAAM;GACjB,CAAC;AACF,MAAI,qBAAqB;AACvB,6BAA0B;IACxB,cAAc,eAAe,UAAU,KAAK;IAC5C,WAAW;IACX,UAAU,MAAM;IAChB,MAAM,UAAU;IAChB,aAAa,MAAM;IACpB,CAAC;AACF,sCAAmC;AACnC;;AAGF,QAAM,YAAY,KAAK;GACrB,MAAM;GACN,SAAS,eAAe,MAAM,YAAY,KAAK,gCAAgC,UAAU,KAAK;GAC9F,UAAU,MAAM;GAChB,MAAM,UAAU;GACjB,CAAC;AACF,qCAAmC;;AAGrC,QAAO;EAAE;EAAuB;EAAkC;;AAGpE,SAAS,6BAA6B,OAGpC;CACA,MAAMD,eAAoD,EAAE;CAC5D,MAAM,uCAAuB,IAAI,KAA+B;AAEhE,MAAK,MAAM,eAAe,MAAM,cAAc;AAC5C,MAAI,YAAY,iBAAiB;GAC/B,MAAM,EAAE,yEAAqC,4BAA4B;IACvE;IACA,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,oBAAoB,MAAM;IAC1B,mBAAmB;IACnB,UAAU,MAAM;IAChB,UAAU,MAAM;IACjB,CAAC;AACF,OAAIE,mCACF;GAGF,MAAM,aAAa,YAAY,gBAAgB,KAAK,KAAK,IAAI;GAC7D,MAAM,kBAAkB,oCAAoC;IAC1D,MAAM,YAAY;IAClB,wBAAwB,MAAM;IAC9B,oBAAoB,MAAM;IAC1B,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,iBAAiB;IACjB,oBAAoB,eAAe,YAAY,KAAK,wCAAwC,WAAW;IACxG,CAAC;AACF,OAAI,CAAC,gBACH;GAGF,MAAM,cAAc,8BAA8B;IAChD,MAAM,YAAY;IAClB,YAAY;IACZ,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,aAAa,eAAe,YAAY,KAAK;IAC9C,CAAC;AACF,OAAI,CAAC,YACH;AAGF,wBAAqB,IACnB,YAAY,MACZ,2BAA2B,YAAY,MAAM,YAAY,CAC1D;AACD,gBAAa,YAAY,QAAQ;IAC/B,SAAS,YAAY;IACrB,YAAY,YAAY;IACxB,YAAY,YAAY,cAAc,EAAE;IACzC;AACD;;AAMF,MAAI,YAAY,aAAa,QAAW;AACtC,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,eAAe,YAAY,KAAK;IACzC,UAAU,MAAM;IAChB,MAAM,YAAY;IACnB,CAAC;AACF;;EAEF,MAAM,EAAE,aAAa;EACrB,MAAM,iBACJ,MAAM,oBAAoB,IAAI,SAAS,IAAI,MAAM,sBAAsB,IAAI,SAAS;AACtF,MAAI,CAAC,gBAAgB;AACnB,SAAM,YAAY,KAAK;IACrB,MAAM;IACN,SAAS,eAAe,YAAY,KAAK,sCAAsC,SAAS;IACxF,UAAU,MAAM;IAChB,MAAM,YAAY;IACnB,CAAC;AACF;;EAGF,MAAM,EAAE,uBAAuB,qCAAqC,4BAClE;GACE;GACA,UAAU,MAAM;GAChB,aAAa,MAAM;GACnB,oBAAoB,MAAM;GAC1B,mBAAmB;GACnB,UAAU,MAAM;GAChB,UAAU,MAAM;GACjB,CACF;AACD,MAAI,iCACF;AAGF,MAAI,uBAAuB;GACzB,MAAMC,eAAa,6BAA6B;IAC9C,WAAW;IACX;IACA;IACA,aAAa,MAAM;IACnB,UAAU,MAAM;IAChB,aAAa,eAAe,YAAY,KAAK;IAC9C,CAAC;AACF,OAAI,CAACA,aACH;AAEF,wBAAqB,IACnB,YAAY,MACZ,2BAA2B,YAAY,MAAMA,aAAW,CACzD;AACD,gBAAa,YAAY,QAAQ;IAC/B,SAASA,aAAW;IACpB,YAAYA,aAAW;IACvB,YAAYA,aAAW,cAAc,EAAE;IACxC;AACD;;EAGF,MAAM,aAAa,2BAA2B,YAAY,MAAM,eAAe;AAC/E,uBAAqB,IAAI,YAAY,MAAM,WAAW;AACtD,eAAa,YAAY,QAAQ;GAC/B,SAAS,eAAe;GACxB,YAAY,eAAe;GAC3B,YAAY,EAAE;GACf;;AAGH,QAAO;EAAE;EAAc;EAAsB;;AA6B/C,SAAS,sBAAsB,OAAkD;CAC/E,MAAM,EAAE,OAAO,SAAS,UAAU,gBAAgB;CAClD,MAAM,YAAY,QAAQ;CAE1B,MAAM,iBAAiB,sBAAsB;EAC3C;EACA;EACA,qBAAqB,MAAM;EAC3B,sBAAsB,MAAM;EAC5B,YAAY,MAAM;EAClB,oBAAoB,MAAM;EAC1B,oBAAoB,MAAM;EAC1B,wBAAwB,MAAM;EAC9B,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,yBAAyB,MAAM;EAC/B,yBAAyB,MAAM;EAC/B;EACA;EACA,uBAAuB,MAAM;EAC9B,CAAC;CAEF,MAAM,mBAAmB,eAAe,QAAQ,UAAU,MAAM,KAAK;CACrE,MAAM,oBAAoB,iBAAiB,KAAK,UAAU,MAAM,WAAW;CAC3E,MAAM,iBAAiB,iBAAiB,WAAW,IAAI,iBAAiB,IAAI,SAAS;CACrF,MAAM,iBAAiB,MAAM,WAAW,MAAM,SAAS,KAAK,SAAS,OAAO;AAC5E,KAAI,kBAAkB,WAAW,KAAK,CAAC,eACrC,aAAY,KAAK;EACf,MAAM;EACN,SAAS,UAAU,MAAM,KAAK;EAC9B;EACA,MAAM,MAAM;EACb,CAAC;CAGJ,MAAMC,+BAA6D,EAAE;AACrE,MAAK,MAAM,SAAS,MAAM,QAAQ;AAChC,MAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,WAAW,IAAI,MAAM,SAAS,CACtD;EAEF,MAAM,kBAAkB,sCAAsC;GAC5D,WAAW,MAAM;GACjB;GACA;GACA,oBAAoB,MAAM;GAC1B;GACA,UAAU,MAAM;GAChB,UAAU,MAAM;GACjB,CAAC;EACF,MAAM,oBAAoB,aAAa,MAAM,YAAY,WAAW;EACpE,IAAIC;AACJ,MAAI,mBAAmB;GACrB,MAAM,iBAAiB,uBAAuB;IAC5C,WAAW;IACX,WAAW,MAAM;IACjB,WAAW,MAAM;IACjB;IACA;IACD,CAAC;AACF,OAAI,CAAC,eACH;AAEF,OAAI,eAAe,UAAU,eAAe,YAAY;AACtD,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,4BAA4B,MAAM,KAAK,GAAG,MAAM,KAAK;KAC9D;KACA,MAAM,kBAAkB;KACzB,CAAC;AACF;;AAEF,OAAI,eAAe,YAAY,eAAe,UAAU;AACtD,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,4BAA4B,MAAM,KAAK,GAAG,MAAM,KAAK;KAC9D;KACA,MAAM,kBAAkB;KACzB,CAAC;AACF;;AAEF,kBAAe,eAAe;;AAEhC,MAAI,CAAC,gBACH;AAGF,+BAA6B,KAAK;GAChC,WAAW,MAAM;GACjB;GACA;GACA,iBAAiB,MAAM;GACvB,GAAG,UAAU,gBAAgB,aAAa;GAC3C,CAAC;;CAGJ,MAAM,qBAAqB,MAAM,OAC9B,KAAK,WAAW;EACf;EACA,UAAU,aAAa,MAAM,YAAY,WAAW;EACrD,EAAE,CACF,QAAQ,UACP,QAAQ,MAAM,SAAS,CACxB;CACH,MAAMC,oBAA4C,eAC/C,QAAQ,UAAU,MAAM,SAAS,CACjC,KAAK,WAAW;EACf,SAAS,CAAC,MAAM,WAAW;EAC3B,GAAG,UAAU,QAAQ,MAAM,WAAW;EACvC,EAAE;CACL,MAAMC,aAA0B,EAAE;CAClC,MAAMC,kBAAoC,EAAE;AAE5C,MAAK,MAAM,kBAAkB,MAAM,YAAY;AAC7C,MAAI,eAAe,SAAS,MAC1B;AAEF,MAAI,eAAe,SAAS,mBAAmB,eAAe,SAAS,OACrE;AAEF,MAAI,eAAe,SAAS,YAAY,eAAe,SAAS,SAAS;GACvE,MAAM,aAAa,wBAAwB;IACzC,WAAW;IACX;IACA;IACA,MAAM;IACN,eAAe,UAAU,MAAM,KAAK,MAAM,eAAe;IAC1D,CAAC;AACF,OAAI,CAAC,WACH;GAEF,MAAM,cAAc,uBAAuB;IACzC,WAAW,MAAM;IACjB;IACA;IACA;IACA;IACA,MAAM,eAAe;IACrB,cAAc,UAAU,MAAM,KAAK,MAAM,eAAe;IACzD,CAAC;AACF,OAAI,CAAC,YACH;GAEF,MAAM,iBAAiB,2BAA2B;IAChD,WAAW;IACX;IACA;IACA,aAAa,UAAU,MAAM,KAAK,MAAM,eAAe;IACvD,MAAM,eAAe;IACrB,MAAM;IACP,CAAC;AACF,OAAI,eAAe,SAAS,SAC1B,mBAAkB,KAAK;IACrB,SAAS;IACT,GAAG,UAAU,QAAQ,eAAe;IACrC,CAAC;OAEF,YAAW,KAAK;IACd,SAAS;IACT,GAAG,UAAU,QAAQ,eAAe;IACrC,CAAC;AAEJ;;EAEF,MAAM,sBAAsB,yBAC1B,eAAe,MACf,MAAM,oBACN;GAAE,UAAU,MAAM;GAAU,UAAU,MAAM;GAAU,CACvD;AACD,MAAI,qBAAqB;AACvB,6BAA0B;IACxB,cAAc,gBAAgB,eAAe,KAAK;IAClD,WAAW;IACX;IACA,MAAM,eAAe;IACrB;IACD,CAAC;AACF;;AAEF,cAAY,KAAK;GACf,MAAM;GACN,SAAS,UAAU,MAAM,KAAK,kCAAkC,eAAe,KAAK;GACpF;GACA,MAAM,eAAe;GACtB,CAAC;;CAGJ,MAAMC,2BAAiD,EAAE;AACzD,MAAK,MAAM,qBAAqB,oBAAoB;AAClD,MAAI,kBAAkB,MAAM,KAC1B;AAGF,MAAI,CAAC,MAAM,WAAW,IAAI,kBAAkB,MAAM,SAAS,EAAE;AAC3D,eAAY,KAAK;IACf,MAAM;IACN,SAAS,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK,8BAA8B,kBAAkB,MAAM,SAAS;IACtI;IACA,MAAM,kBAAkB,MAAM;IAC/B,CAAC;AACF;;EAGF,MAAM,iBAAiB,uBAAuB;GAC5C,WAAW,kBAAkB;GAC7B,WAAW,MAAM;GACjB,WAAW,kBAAkB,MAAM;GACnC;GACA;GACD,CAAC;AACF,MAAI,CAAC,eACH;AAEF,MAAI,CAAC,eAAe,UAAU,CAAC,eAAe,YAAY;AACxD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK;IACvE;IACA,MAAM,kBAAkB,SAAS;IAClC,CAAC;AACF;;EAGF,MAAM,gBAAgB,MAAM,cAAc,IAAI,kBAAkB,MAAM,SAAS;AAC/E,MAAI,CAAC,eAAe;AAClB,eAAY,KAAK;IACf,MAAM;IACN,SAAS,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK,8BAA8B,kBAAkB,MAAM,SAAS;IACtI;IACA,MAAM,kBAAkB,MAAM;IAC/B,CAAC;AACF;;EAGF,MAAM,eAAe,uBAAuB;GAC1C,WAAW,MAAM;GACjB,YAAY,eAAe;GAC3B;GACA;GACA;GACA,MAAM,kBAAkB,SAAS;GACjC,cAAc,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK;GAC7E,CAAC;AACF,MAAI,CAAC,aACH;EAEF,MAAM,oBAAoB,uBAAuB;GAC/C,WAAW,cAAc,MAAM;GAC/B,YAAY,eAAe;GAC3B,SAAS;GACT;GACA;GACA,MAAM,kBAAkB,SAAS;GACjC,cAAc,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK;GAC7E,CAAC;AACF,MAAI,CAAC,kBACH;AAEF,MAAI,aAAa,WAAW,kBAAkB,QAAQ;AACpD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,mBAAmB,MAAM,KAAK,GAAG,kBAAkB,MAAM,KAAK;IACvE;IACA,MAAM,kBAAkB,SAAS;IAClC,CAAC;AACF;;EAGF,MAAM,WAAW,eAAe,WAC5B,2BAA2B;GACzB,WAAW,MAAM;GACjB,WAAW,kBAAkB,MAAM;GACnC,YAAY;GACZ,aAAa,eAAe;GAC5B;GACA,MAAM,kBAAkB,MAAM;GAC9B;GACD,CAAC,GACF;EACJ,MAAM,WAAW,eAAe,WAC5B,2BAA2B;GACzB,WAAW,MAAM;GACjB,WAAW,kBAAkB,MAAM;GACnC,YAAY;GACZ,aAAa,eAAe;GAC5B;GACA,MAAM,kBAAkB,MAAM;GAC9B;GACD,CAAC,GACF;AAEJ,kBAAgB,KAAK;GACnB,SAAS;GACT,YAAY;IACV,OAAO,cAAc,MAAM;IAC3B,OAAO,cAAc;IACrB,SAAS;IACV;GACD,GAAG,UAAU,QAAQ,eAAe,eAAe;GACnD,GAAG,UAAU,YAAY,SAAS;GAClC,GAAG,UAAU,YAAY,SAAS;GACnC,CAAC;AAEF,2BAAyB,KAAK;GAC5B,oBAAoB,MAAM;GAC1B,oBAAoB,kBAAkB,MAAM;GAC5C,oBAAoB;GACpB,iBAAiB,cAAc,MAAM;GACrC,iBAAiB,cAAc;GAC/B,GAAG,UAAU,gBAAgB,eAAe,aAAa;GACzD;GACA;GACD,CAAC;;AAGJ,QAAO;EACL,WAAW;GACT,WAAW,MAAM;GACjB;GACA,QAAQ,eAAe,KAAK,mBAAmB;IAC7C,WAAW,cAAc,MAAM;IAC/B,YAAY,cAAc;IAC1B,YAAY,cAAc;IAC1B,UAAU,cAAc,MAAM;IAC9B,GAAG,UAAU,WAAW,cAAc,aAAa;IACnD,GAAG,UAAU,oBAAoB,cAAc,iBAAiB;IACjE,EAAE;GACH,GAAI,kBAAkB,SAAS,IAC3B,EACE,IAAI;IACF,SAAS;IACT,GAAG,UAAU,QAAQ,eAAe;IACrC,EACF,GACD,EAAE;GACN,GAAI,kBAAkB,SAAS,IAAI,EAAE,SAAS,mBAAmB,GAAG,EAAE;GACtE,GAAI,WAAW,SAAS,IAAI,EAAE,SAAS,YAAY,GAAG,EAAE;GACxD,GAAI,gBAAgB,SAAS,IAAI,EAAE,aAAa,iBAAiB,GAAG,EAAE;GACvE;EACD,oBAAoB;EACpB,wBAAwB;EACxB;EACD;;AAgBH,SAAS,kBAAkB,OAAoE;CAC7F,MAAM,EACJ,gBACA,qBACA,sBACA,uBACA,oBACA,UACA,UACA,wBACA,aACA,aACE;CACJ,MAAMC,eAAoD,EAAE;CAC5D,MAAM,qBAAqB,IAAI,IAAI,eAAe,KAAK,OAAO,GAAG,KAAK,CAAC;AAEvE,MAAK,MAAM,iBAAiB,gBAAgB;EAC1C,MAAMC,SAAwC,EAAE;AAChD,OAAK,MAAM,SAAS,cAAc,QAAQ;AACxC,OAAI,mBAAmB,IAAI,MAAM,SAAS,EAAE;IAC1C,MAAMC,SAAwB;KAC5B,MAAM;MAAE,MAAM;MAAe,MAAM,MAAM;MAAU;KACnD,UAAU,MAAM;KACjB;AACD,WAAO,MAAM,QAAQ,MAAM,OAAO;KAAE,GAAG;KAAQ,MAAM;KAAM,GAAG;AAC9D;;GAEF,MAAM,WAAW,2BAA2B;IAC1C;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,aAAa,UAAU,cAAc,KAAK,GAAG,MAAM,KAAK;IACzD,CAAC;AACF,OAAI,CAAC,SAAS,IAAI;AAChB,QAAI,CAAC,SAAS,gBACZ,aAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,cAAc,KAAK,GAAG,MAAM,KAAK,UAAU,MAAM,SAAS;KAC7E;KACA,MAAM,MAAM;KACb,CAAC;AAEJ;;GAEF,MAAMC,cAA6B;IACjC,UAAU,MAAM;IAChB,MAAM;KAAE,MAAM;KAAU,SAAS,SAAS,WAAW;KAAS;IAC/D;AACD,UAAO,MAAM,QAAQ,MAAM,OAAO;IAAE,GAAG;IAAa,MAAM;IAAM,GAAG;;AAErE,eAAa,cAAc,QAAQ,EAAE,QAAQ;;AAG/C,QAAO;;AAGT,SAAS,uBACP,QACA,qBAC+B;CAC/B,IAAI,UAAU;AAEd,MAAK,MAAM,CAAC,WAAW,mBAAmB,qBAAqB;EAC7D,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MAAO;EAEZ,IAAI,aAAa;EACjB,MAAMC,gBAA+C,EAAE,GAAG,MAAM,QAAQ;AAExE,OAAK,MAAM,MAAM,eACf,KAAI,GAAG,qBAAqB;AAC1B,gBAAa;AACb,iBAAc,GAAG,MAAM,QAAQ;IAC7B,UAAU,GAAG,MAAM;IACnB,MAAM;KAAE,MAAM;KAAe,MAAM,GAAG;KAAqB;IAC3D,GAAI,GAAG,OAAO,EAAE,MAAM,MAAe,GAAG,EAAE;IAC3C;aACQ,GAAG,QAAQ,GAAG,eAAe;AACtC,gBAAa;AACb,iBAAc,GAAG,MAAM,QAAQ;IAC7B,UAAU,GAAG,MAAM;IACnB,MAAM;KAAE,MAAM;KAAU,SAAS,GAAG;KAAe;IACnD,MAAM;IACP;;AAIL,MAAI,WACF,WAAU;GAAE,GAAG;IAAU,YAAY;IAAE,GAAG;IAAO,QAAQ;IAAe;GAAE;;AAI9E,QAAO;;AAcT,SAAS,gCACP,QACA,UACA,aAIA;CACA,MAAM,4CAA4B,IAAI,KAAuC;CAC7E,MAAM,mCAAmB,IAAI,KAA8B;AAE3D,MAAK,MAAM,SAAS,OAClB,MAAK,MAAM,QAAQ,MAAM,YAAY;AACnC,MAAI,KAAK,SAAS,iBAAiB;GACjC,MAAM,YAAY,sBAAsB,KAAK;AAC7C,OAAI,CAAC,WAAW;AACd,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;GAEF,MAAM,YAAY,MAAM,OAAO,MAAM,MAAM,EAAE,SAAS,UAAU;AAChE,OAAI,aAAa,UAAU,aAAa,UAAU;AAChD,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,wBAAwB,UAAU,cAAc,MAAM,KAAK,oCAAoC,UAAU,SAAS;KAC3H;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;AAEF,6BAA0B,IAAI,MAAM,MAAM;IAAE;IAAW,MAAM,KAAK;IAAM,CAAC;;AAG3E,MAAI,KAAK,SAAS,QAAQ;GACxB,MAAM,WAAW,sBAAsB,MAAM,EAAE;GAC/C,MAAM,WAAW,sBAAsB,MAAM,EAAE;AAC/C,OAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;GAEF,MAAM,QAAQ,yBAAyB,SAAS;AAChD,OAAI,UAAU,QAAW;AACvB,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,UAAU,MAAM,KAAK;KAC9B;KACA,MAAM,KAAK;KACZ,CAAC;AACF;;AAEF,oBAAiB,IAAI,MAAM,MAAM;IAAE;IAAU;IAAO,MAAM,KAAK;IAAM,CAAC;;;AAK5E,QAAO;EAAE;EAA2B;EAAkB;;AAGxD,SAAS,oBACP,QACA,2BACA,kBACA,YACA,eACA,UACA,aAC+B;CAC/B,IAAI,UAAU;AAEd,MAAK,MAAM,CAAC,WAAW,SAAS,2BAA2B;AACzD,MAAI,iBAAiB,IAAI,UAAU,EAAE;AACnC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU;IAC7B;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;EAGF,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MAAO;AAEZ,MAAI,CAAC,OAAO,OAAO,MAAM,QAAQ,KAAK,UAAU,EAAE;AAChD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,wBAAwB,KAAK,UAAU,6BAA6B,UAAU;IACvF;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;EAGF,MAAMC,WAAuD,EAAE;EAC/D,MAAM,6BAAa,IAAI,KAAqB;AAE5C,OAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;AACtD,OAAI,SAAS,aAAa,UAAW;GAErC,MAAM,kBAAkB,WAAW,IAAI,SAAS,MAAM;AACtD,OAAI,iBAAiB;AACnB,gBAAY,KAAK;KACf,MAAM;KACN,SAAS,wBAAwB,SAAS,MAAM,qBAAqB,gBAAgB,SAAS,YAAY,mBAAmB,UAAU;KACvI;KACA,MAAM,SAAS;KAChB,CAAC;AACF;;AAEF,cAAW,IAAI,SAAS,OAAO,YAAY;AAC3C,YAAS,eAAe,EAAE,OAAO,SAAS,OAAO;;AAGnD,MAAI,OAAO,KAAK,SAAS,CAAC,WAAW,GAAG;AACtC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,UAAU,6DAA6D,UAAU;IACpG;IACA,MAAM,KAAK;IACZ,CAAC;AACF;;AAGF,YAAU;GACR,GAAG;IACF,YAAY;IAAE,GAAG;IAAO,eAAe,EAAE,OAAO,KAAK,WAAW;IAAE;IAAU;GAC9E;;AAGH,MAAK,MAAM,CAAC,aAAa,aAAa,kBAAkB;AACtD,MAAI,CAAC,WAAW,IAAI,SAAS,SAAS,EAAE;AACtC,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,0CAA0C,SAAS,SAAS;IAC3F;IACA,MAAM,SAAS;IAChB,CAAC;AACF;;AAGF,MAAI,CAAC,0BAA0B,IAAI,SAAS,SAAS,EAAE;AACrD,eAAY,KAAK;IACf,MAAM;IACN,SAAS,UAAU,YAAY,oBAAoB,SAAS,SAAS,cAAc,SAAS,SAAS;IACrG;IACA,MAAM,SAAS;IAChB,CAAC;AACF;;AAGF,MAAI,0BAA0B,IAAI,YAAY,CAC5C;EAGF,MAAM,eAAe,QAAQ;AAC7B,MAAI,CAAC,aAAc;EAEnB,MAAM,cAAc,cAAc,IAAI,SAAS,SAAS;EACxD,MAAM,iBAAiB,cAAc,IAAI,YAAY;EAGrD,MAAM,gBADJ,gBAAgB,MAAM,WAAW,MAAM,SAAS,KAAK,SAAS,MAAM,IAAI,QACnC,gBAAgB,YAAY,aAAa;AAEhF,YAAU;GACR,GAAG;IACF,cAAc;IACb,GAAG;IACH,MAAM,SAAS;IACf,GAAI,gBAAgB,EAAE,SAAS;KAAE,GAAG,aAAa;KAAS,OAAO;KAAe,EAAE,GAAG,EAAE;IACxF;GACF;;AAGH,QAAO;;AAGT,SAAgB,kCACd,OAC6C;CAC7C,MAAM,WAAW,MAAM,SAAS,IAAI;AACpC,KAAI,CAAC,MAAM,OACT,QAAO,MAAM;EACX,SAAS;EACT,aAAa,CACX;GACE,MAAM;GACN,SAAS;GACT;GACD,CACF;EACF,CAAC;AAEJ,KAAI,CAAC,MAAM,sBACT,QAAO,MAAM;EACX,SAAS;EACT,aAAa,CACX;GACE,MAAM;GACN,SAAS;GACT;GACD,CACF;EACF,CAAC;CAGJ,MAAMC,cAA0C,qBAAqB,MAAM,SAAS;CACpF,MAAM,SAAS,MAAM,SAAS,IAAI,UAAU,EAAE;CAC9C,MAAM,QAAQ,MAAM,SAAS,IAAI,SAAS,EAAE;CAC5C,MAAM,iBAAiB,MAAM,SAAS,IAAI,kBAAkB,EAAE;CAC9D,MAAM,aAAa,IAAI,IAAI,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC;CAC7D,MAAM,qBAAqB,IAAI,IAAI,eAAe,KAAK,OAAO,GAAG,KAAK,CAAC;CACvE,MAAM,qBAAqB,IAAI,IAAI,MAAM,0BAA0B,EAAE,CAAC;CACtE,MAAMC,0BACJ,MAAM,yBAAyB,2CAA2B,IAAI,KAAK;CACrE,MAAM,uBAAuB,MAAM,yBAAyB,wBAAwB,EAAE;CACtF,MAAM,0CAA0B,IAAI,KAAiD;AACrF,MAAK,MAAM,cAAc,qBACvB,yBAAwB,IAAI,WAAW,IAAI,WAAW;CAGxD,MAAM,aAAa,wBAAwB;EACzC;EACA;EACA,qBAAqB,4BAA4B,MAAM,wBAAwB,CAAC,OAAO,CAAC;EACxF;EACD,CAAC;CAEF,MAAM,kBAAkB,6BAA6B;EACnD,cAAc,MAAM,SAAS,IAAI,OAAO,gBAAgB,EAAE;EAC1D;EACA,qBAAqB,WAAW;EAChC,uBAAuB,MAAM;EAC7B;EACA,UAAU,MAAM,OAAO;EACvB,UAAU,MAAM,OAAO;EACvB,wBAAwB,MAAM;EAC9B;EACD,CAAC;CAEF,MAAM,eAAe;EAAE,GAAG,WAAW;EAAc,GAAG,gBAAgB;EAAc;CAEpF,MAAM,gBAAgB,mBAAmB,QAAQ,aAAa,SAAS;CACvE,MAAMC,aAA0B,EAAE;CAClC,MAAMC,qBAA2C,EAAE;CACnD,MAAMC,yBAAuD,EAAE;CAC/D,MAAM,sCAAsB,IAAI,KAAuC;AAEvE,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,UAAU,cAAc,IAAI,MAAM,KAAK;AAC7C,MAAI,CAAC,QACH;EAEF,MAAM,SAAS,sBAAsB;GACnC;GACA;GACA;GACA;GACA;GACA,qBAAqB,WAAW;GAChC,sBAAsB,gBAAgB;GACtC;GACA,UAAU,MAAM,OAAO;GACvB,UAAU,MAAM,OAAO;GACvB,wBAAwB,MAAM;GAC9B;GACA;GACA,uBAAuB,MAAM;GAC7B;GACA;GACD,CAAC;AACF,aAAW,KAAK,OAAO,UAAU;AACjC,qBAAmB,KAAK,GAAG,OAAO,mBAAmB;AACrD,yBAAuB,KAAK,GAAG,OAAO,uBAAuB;AAC7D,sBAAoB,IAAI,MAAM,MAAM,OAAO,eAAe;;CAG5D,MAAM,EAAE,gBAAgB,sBAAsB,iBAAiB,EAAE,oBAAoB,CAAC;AACtF,6BAA4B;EAC1B;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,2BAA2B,qBAAqB,gCACtD,QACA,UACA,YACD;CAED,MAAM,eAAe,kBAAkB;EACrC;EACA,qBAAqB,WAAW;EAChC,sBAAsB,gBAAgB;EACtC,uBAAuB,MAAM;EAC7B;EACA,UAAU,MAAM,OAAO;EACvB,UAAU,MAAM,OAAO;EACvB,wBAAwB,MAAM;EAC9B;EACA;EACD,CAAC;AAEF,KAAI,YAAY,SAAS,EACvB,QAAO,MAAM;EACX,SAAS;EACT,aAAa,kBAAkB,YAAY;EAC5C,CAAC;CAGJ,MAAM,WAAW,+BAA+B;EAC9C,QAAQ,MAAM;EACd,GAAG,UACD,kBACA,+BACE,MAAM,QACN,CAAC,GAAG,mBAAmB,CAAC,KAAK,eAAe,EAC5C,MAAM,0BACP,CACF;EACD,GAAI,OAAO,KAAK,aAAa,CAAC,SAAS,IAAI,EAAE,cAAc,GAAG,EAAE;EAChE,QAAQ,WAAW,KAAK,WAAW;GACjC,GAAG;GACH,GAAI,eAAe,IAAI,MAAM,UAAU,GACnC,EACE,WAAW,CAAC,GAAI,eAAe,IAAI,MAAM,UAAU,IAAI,EAAE,CAAE,CAAC,MAAM,MAAM,UACtE,eAAe,KAAK,WAAW,MAAM,UAAU,CAChD,EACF,GACD,EAAE;GACP,EAAE;EACJ,CAAC;CAEF,IAAI,gBAAgB,uBAClB,SAAS,QACT,oBACD;CAED,MAAMC,kBAA8C,EAAE;AACtD,iBAAgB,oBACd,eACA,2BACA,kBACA,YACA,eACA,UACA,gBACD;AAED,KAAI,gBAAgB,SAAS,EAC3B,QAAO,MAAM;EACX,SAAS;EACT,aAAa;EACd,CAAC;CAGJ,MAAM,oBAAoB,IAAI,IAAI,iBAAiB,MAAM,CAAC;CAC1D,MAAM,gBAAgB,OAAO,YAC3B,OAAO,QAAQ,SAAS,MAAM,CAAC,QAAQ,GAAG,eAAe,CAAC,kBAAkB,IAAI,UAAU,CAAC,CAC5F;AASD,QAAO,GAP2B;EAChC,GAAG;EACH,OAAO;EACP,QAAQ;EACR,GAAI,OAAO,KAAK,aAAa,CAAC,SAAS,IAAI,EAAE,cAAc,GAAG,EAAE;EACjE,CAEyB"}
|
package/dist/provider.d.mts
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
import { t as ControlMutationDefaults } from "./default-function-registry-DUMRIhJH.mjs";
|
|
2
|
+
import { AuthoringContributions } from "@prisma-next/framework-components/authoring";
|
|
1
3
|
import { ContractConfig } from "@prisma-next/config/config-types";
|
|
2
|
-
import { TargetPackRef } from "@prisma-next/
|
|
4
|
+
import { ExtensionPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
|
|
3
5
|
|
|
4
6
|
//#region src/provider.d.ts
|
|
5
7
|
interface PrismaContractOptions {
|
|
6
8
|
readonly output?: string;
|
|
7
|
-
readonly target
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*/
|
|
9
|
+
readonly target: TargetPackRef<'sql', 'postgres'>;
|
|
10
|
+
readonly authoringContributions?: AuthoringContributions;
|
|
11
|
+
readonly scalarTypeDescriptors: ReadonlyMap<string, {
|
|
12
|
+
readonly codecId: string;
|
|
13
|
+
readonly nativeType: string;
|
|
14
|
+
readonly typeRef?: string;
|
|
15
|
+
readonly typeParams?: Record<string, unknown>;
|
|
16
|
+
}>;
|
|
17
|
+
readonly controlMutationDefaults?: ControlMutationDefaults;
|
|
17
18
|
readonly composedExtensionPacks?: readonly string[];
|
|
19
|
+
readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];
|
|
18
20
|
}
|
|
19
|
-
declare function prismaContract(schemaPath: string, options
|
|
21
|
+
declare function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig;
|
|
20
22
|
//#endregion
|
|
21
23
|
export { type PrismaContractOptions, prismaContract };
|
|
22
24
|
//# sourceMappingURL=provider.d.mts.map
|
package/dist/provider.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.mts","names":[],"sources":["../src/provider.ts"],"sourcesContent":[],"mappings":";;;;;;UAWiB,qBAAA;;EAAA,SAAA,MAAA,EAEE,aAFmB,CAAA,KAAA,EAAA,UAAA,CAAA;EAEnB,SAAA,sBAAA,CAAA,EACiB,sBADjB;EACiB,SAAA,qBAAA,EACF,WADE,CAAA,MAAA,EAAA;IAOR,SAAA,OAAA,EAAA,MAAA;IANM,SAAA,UAAA,EAAA,MAAA;IASG,SAAA,OAAA,CAAA,EAAA,MAAA;IAEW,SAAA,UAAA,CAAA,EALpB,MAKoB,CAAA,MAAA,EAAA,OAAA,CAAA;EAAgB,CAAA,CAAA;EAGhD,SAAA,uBAA4C,CAAA,EALvB,uBAK+C;;gDAHpC;;iBAGhC,cAAA,8BAA4C,wBAAwB"}
|
package/dist/provider.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t as interpretPslDocumentToSqlContract } from "./interpreter-iFCRN9nb.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma-next/utils/defined";
|
|
3
|
-
import { notOk } from "@prisma-next/utils/result";
|
|
4
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { notOk, ok } from "@prisma-next/utils/result";
|
|
5
4
|
import { parsePslDocument } from "@prisma-next/psl-parser";
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
6
|
import { resolve } from "pathe";
|
|
7
7
|
|
|
8
8
|
//#region src/provider.ts
|
|
9
9
|
function prismaContract(schemaPath, options) {
|
|
10
10
|
return {
|
|
11
|
-
source: async () => {
|
|
11
|
+
source: async (context) => {
|
|
12
12
|
const absoluteSchemaPath = resolve(schemaPath);
|
|
13
13
|
let schema;
|
|
14
14
|
try {
|
|
@@ -29,17 +29,24 @@ function prismaContract(schemaPath, options) {
|
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const document = parsePslDocument({
|
|
33
|
+
schema,
|
|
34
|
+
sourceId: schemaPath
|
|
35
|
+
});
|
|
36
|
+
const composedExtensionPacks = [...context.composedExtensionPacks ?? [], ...options.composedExtensionPacks ?? []];
|
|
37
|
+
const interpreted = interpretPslDocumentToSqlContract({
|
|
38
|
+
document,
|
|
39
|
+
target: options.target,
|
|
40
|
+
...ifDefined("authoringContributions", options.authoringContributions),
|
|
41
|
+
scalarTypeDescriptors: options.scalarTypeDescriptors,
|
|
42
|
+
...ifDefined("composedExtensionPacks", composedExtensionPacks.length > 0 ? composedExtensionPacks : void 0),
|
|
43
|
+
...ifDefined("composedExtensionPackRefs", options.composedExtensionPackRefs?.length ? options.composedExtensionPackRefs : void 0),
|
|
44
|
+
...ifDefined("controlMutationDefaults", options.controlMutationDefaults)
|
|
40
45
|
});
|
|
46
|
+
if (!interpreted.ok) return interpreted;
|
|
47
|
+
return ok(interpreted.value);
|
|
41
48
|
},
|
|
42
|
-
...ifDefined("output", options
|
|
49
|
+
...ifDefined("output", options.output)
|
|
43
50
|
};
|
|
44
51
|
}
|
|
45
52
|
|
package/dist/provider.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.mjs","names":["schema: string"],"sources":["../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport type { TargetPackRef } from '@prisma-next/
|
|
1
|
+
{"version":3,"file":"provider.mjs","names":["schema: string"],"sources":["../src/provider.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport type { ContractConfig, ContractSourceContext } from '@prisma-next/config/config-types';\nimport type { AuthoringContributions } from '@prisma-next/framework-components/authoring';\nimport type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';\nimport { parsePslDocument } from '@prisma-next/psl-parser';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { resolve } from 'pathe';\nimport type { ControlMutationDefaults } from './default-function-registry';\nimport { interpretPslDocumentToSqlContract } from './interpreter';\n\nexport interface PrismaContractOptions {\n readonly output?: string;\n readonly target: TargetPackRef<'sql', 'postgres'>;\n readonly authoringContributions?: AuthoringContributions;\n readonly scalarTypeDescriptors: ReadonlyMap<\n string,\n {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeRef?: string;\n readonly typeParams?: Record<string, unknown>;\n }\n >;\n readonly controlMutationDefaults?: ControlMutationDefaults;\n readonly composedExtensionPacks?: readonly string[];\n readonly composedExtensionPackRefs?: readonly ExtensionPackRef<'sql', 'postgres'>[];\n}\n\nexport function prismaContract(schemaPath: string, options: PrismaContractOptions): ContractConfig {\n return {\n source: async (context: ContractSourceContext) => {\n const absoluteSchemaPath = resolve(schemaPath);\n let schema: string;\n try {\n schema = await readFile(absoluteSchemaPath, 'utf-8');\n } catch (error) {\n const message = String(error);\n return notOk({\n summary: `Failed to read Prisma schema at \"${schemaPath}\"`,\n diagnostics: [\n {\n code: 'PSL_SCHEMA_READ_FAILED',\n message,\n sourceId: schemaPath,\n },\n ],\n meta: { schemaPath, absoluteSchemaPath, cause: message },\n });\n }\n\n const document = parsePslDocument({\n schema,\n sourceId: schemaPath,\n });\n const composedExtensionPacks = [\n ...(context.composedExtensionPacks ?? []),\n ...(options.composedExtensionPacks ?? []),\n ];\n\n const interpreted = interpretPslDocumentToSqlContract({\n document,\n target: options.target,\n ...ifDefined('authoringContributions', options.authoringContributions),\n scalarTypeDescriptors: options.scalarTypeDescriptors,\n ...ifDefined(\n 'composedExtensionPacks',\n composedExtensionPacks.length > 0 ? composedExtensionPacks : undefined,\n ),\n ...ifDefined(\n 'composedExtensionPackRefs',\n options.composedExtensionPackRefs?.length ? options.composedExtensionPackRefs : undefined,\n ),\n ...ifDefined('controlMutationDefaults', options.controlMutationDefaults),\n });\n if (!interpreted.ok) {\n return interpreted;\n }\n\n return ok(interpreted.value);\n },\n ...ifDefined('output', options.output),\n };\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,eAAe,YAAoB,SAAgD;AACjG,QAAO;EACL,QAAQ,OAAO,YAAmC;GAChD,MAAM,qBAAqB,QAAQ,WAAW;GAC9C,IAAIA;AACJ,OAAI;AACF,aAAS,MAAM,SAAS,oBAAoB,QAAQ;YAC7C,OAAO;IACd,MAAM,UAAU,OAAO,MAAM;AAC7B,WAAO,MAAM;KACX,SAAS,oCAAoC,WAAW;KACxD,aAAa,CACX;MACE,MAAM;MACN;MACA,UAAU;MACX,CACF;KACD,MAAM;MAAE;MAAY;MAAoB,OAAO;MAAS;KACzD,CAAC;;GAGJ,MAAM,WAAW,iBAAiB;IAChC;IACA,UAAU;IACX,CAAC;GACF,MAAM,yBAAyB,CAC7B,GAAI,QAAQ,0BAA0B,EAAE,EACxC,GAAI,QAAQ,0BAA0B,EAAE,CACzC;GAED,MAAM,cAAc,kCAAkC;IACpD;IACA,QAAQ,QAAQ;IAChB,GAAG,UAAU,0BAA0B,QAAQ,uBAAuB;IACtE,uBAAuB,QAAQ;IAC/B,GAAG,UACD,0BACA,uBAAuB,SAAS,IAAI,yBAAyB,OAC9D;IACD,GAAG,UACD,6BACA,QAAQ,2BAA2B,SAAS,QAAQ,4BAA4B,OACjF;IACD,GAAG,UAAU,2BAA2B,QAAQ,wBAAwB;IACzE,CAAC;AACF,OAAI,CAAC,YAAY,GACf,QAAO;AAGT,UAAO,GAAG,YAAY,MAAM;;EAE9B,GAAG,UAAU,UAAU,QAAQ,OAAO;EACvC"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-psl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-dev.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "PSL-to-SQL ContractIR interpreter for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"pathe": "^2.0.3",
|
|
9
|
-
"@prisma-next/config": "0.
|
|
10
|
-
"@prisma-next/contract": "0.
|
|
11
|
-
"@prisma-next/psl-parser": "0.
|
|
12
|
-
"@prisma-next/sql-contract
|
|
13
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/config": "0.4.0-dev.1",
|
|
10
|
+
"@prisma-next/contract": "0.4.0-dev.1",
|
|
11
|
+
"@prisma-next/psl-parser": "0.4.0-dev.1",
|
|
12
|
+
"@prisma-next/sql-contract": "0.4.0-dev.1",
|
|
13
|
+
"@prisma-next/sql-contract-ts": "0.4.0-dev.1",
|
|
14
|
+
"@prisma-next/framework-components": "0.4.0-dev.1",
|
|
15
|
+
"@prisma-next/utils": "0.4.0-dev.1"
|
|
14
16
|
},
|
|
15
17
|
"devDependencies": {
|
|
16
18
|
"tsdown": "0.18.4",
|
|
17
19
|
"typescript": "5.9.3",
|
|
18
20
|
"vitest": "4.0.17",
|
|
19
21
|
"@prisma-next/tsconfig": "0.0.0",
|
|
22
|
+
"@prisma-next/contract-authoring": "0.4.0-dev.1",
|
|
20
23
|
"@prisma-next/tsdown": "0.0.0"
|
|
21
24
|
},
|
|
22
25
|
"files": [
|