@prisma-next/family-sql 0.5.0-dev.36 → 0.5.0-dev.38
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/dist/control.d.mts +1 -1
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +1 -0
- package/dist/control.mjs.map +1 -1
- package/dist/migration.d.mts +14 -2
- package/dist/migration.d.mts.map +1 -1
- package/dist/migration.mjs +16 -1
- package/dist/migration.mjs.map +1 -1
- package/dist/schema-verify.d.mts +1 -1
- package/dist/{types-DhhBX-xv.d.mts → types-gLyIyd2X.d.mts} +16 -7
- package/dist/types-gLyIyd2X.d.mts.map +1 -0
- package/dist/verify-sql-schema-Ovz7RXR5.mjs.map +1 -1
- package/package.json +20 -20
- package/src/core/migrations/plan-helpers.ts +1 -0
- package/src/core/migrations/types.ts +15 -6
- package/src/core/sql-migration.ts +16 -1
- package/dist/types-DhhBX-xv.d.mts.map +0 -1
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["statements: string[]","DEFAULT_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>>","name: string","POSTGRES_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>>","POSTGRES_TO_PSL: Record<string, string>","PRESERVED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n>","PARAMETERIZED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n>","REFERENTIAL_ACTION_PSL: Record<string, string>","SYNTHETIC_SPAN: PslSpan","models: PslModel[]","enums: PslEnum[]","types: PslTypesBlock | undefined","fields: PslField[]","modelAttributes: PslModelAttribute[]","attrs: PslFieldAttribute[]","attributes: PslFieldAttribute[]","args: PslAttributeArgument[]","attrs: PslAttribute[]","registry: NamedTypeRegistry","result: PslModel[]","contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/operation-preview.ts","../src/core/psl-contract-infer/default-mapping.ts","../src/core/psl-contract-infer/name-transforms.ts","../src/core/psl-contract-infer/postgres-default-mapping.ts","../src/core/psl-contract-infer/postgres-type-map.ts","../src/core/psl-contract-infer/raw-default-parser.ts","../src/core/psl-contract-infer/relation-inference.ts","../src/core/psl-contract-infer/sql-schema-ir-to-psl-ast.ts","../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n MigrationPlanOperation,\n OperationPreview,\n} from '@prisma-next/framework-components/control';\n\n/**\n * Shape of an SQL execute step on `SqlMigrationPlanOperation`. Used for runtime\n * type narrowing without importing the concrete SQL type.\n */\ninterface SqlExecuteStep {\n readonly sql: string;\n}\n\nfunction isDdlStatement(sqlStatement: string): boolean {\n const trimmed = sqlStatement.trim().toLowerCase();\n return (\n trimmed.startsWith('create ') || trimmed.startsWith('alter ') || trimmed.startsWith('drop ')\n );\n}\n\nfunction hasExecuteSteps(\n operation: MigrationPlanOperation,\n): operation is MigrationPlanOperation & { readonly execute: readonly SqlExecuteStep[] } {\n const candidate = operation as unknown as Record<string, unknown>;\n if (!('execute' in candidate) || !Array.isArray(candidate['execute'])) {\n return false;\n }\n return candidate['execute'].every(\n (step: unknown) => typeof step === 'object' && step !== null && 'sql' in step,\n );\n}\n\n/**\n * Extracts a best-effort SQL DDL preview for CLI plan output.\n * Presentation-only: never used to decide migration correctness.\n */\nexport function extractSqlDdl(operations: readonly MigrationPlanOperation[]): string[] {\n const statements: string[] = [];\n for (const operation of operations) {\n if (!hasExecuteSteps(operation)) {\n continue;\n }\n for (const step of operation.execute) {\n if (typeof step.sql === 'string' && isDdlStatement(step.sql)) {\n statements.push(step.sql.trim());\n }\n }\n }\n return statements;\n}\n\n/**\n * Wraps `extractSqlDdl` into the family-agnostic `OperationPreview` shape.\n * Each statement carries `language: 'sql'`.\n */\nexport function sqlOperationsToPreview(\n operations: readonly MigrationPlanOperation[],\n): OperationPreview {\n return {\n statements: extractSqlDdl(operations).map((text) => ({ text, language: 'sql' })),\n };\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\n\nconst DEFAULT_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>> = {\n 'autoincrement()': '@default(autoincrement())',\n 'now()': '@default(now())',\n};\n\nexport interface DefaultMappingOptions {\n readonly functionAttributes?: Readonly<Record<string, string>>;\n readonly fallbackFunctionAttribute?: ((expression: string) => string | undefined) | undefined;\n}\n\nexport type DefaultMappingResult = { readonly attribute: string } | { readonly comment: string };\n\nexport function mapDefault(\n columnDefault: ColumnDefault,\n options?: DefaultMappingOptions,\n): DefaultMappingResult {\n switch (columnDefault.kind) {\n case 'literal':\n return { attribute: `@default(${formatLiteralValue(columnDefault.value)})` };\n case 'function': {\n const attribute =\n options?.functionAttributes?.[columnDefault.expression] ??\n DEFAULT_FUNCTION_ATTRIBUTES[columnDefault.expression] ??\n options?.fallbackFunctionAttribute?.(columnDefault.expression);\n return attribute\n ? { attribute }\n : { comment: `// Raw default: ${columnDefault.expression.replace(/[\\r\\n]+/g, ' ')}` };\n }\n }\n}\n\nfunction formatLiteralValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n switch (typeof value) {\n case 'boolean':\n case 'number':\n return String(value);\n case 'string':\n return quoteString(value);\n default:\n return quoteString(JSON.stringify(value));\n }\n}\n\nfunction quoteString(str: string): string {\n return `\"${escapeString(str)}\"`;\n}\n\nfunction escapeString(str: string): string {\n return JSON.stringify(str).slice(1, -1);\n}\n","const PSL_RESERVED_WORDS = new Set(['model', 'enum', 'types', 'type', 'generator', 'datasource']);\n\nconst IDENTIFIER_PART_PATTERN = /[A-Za-z0-9]+/g;\n\ntype NameResult = {\n readonly name: string;\n readonly map?: string;\n};\n\nfunction hasSeparators(input: string): boolean {\n return /[^A-Za-z0-9]/.test(input);\n}\n\nfunction extractIdentifierParts(input: string): string[] {\n return input.match(IDENTIFIER_PART_PATTERN) ?? [];\n}\n\nfunction createSyntheticIdentifier(input: string): string {\n let hash = 2166136261;\n\n for (const char of input) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n\n return `x${(hash >>> 0).toString(16)}`;\n}\n\nfunction sanitizeIdentifierCharacters(input: string): string {\n const sanitized = input.replace(/[^\\w]/g, '');\n return sanitized.length > 0 ? sanitized : createSyntheticIdentifier(input);\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction snakeToPascalCase(input: string): string {\n const parts = extractIdentifierParts(input);\n if (parts.length === 0) {\n return capitalize(sanitizeIdentifierCharacters(input));\n }\n return parts.map(capitalize).join('');\n}\n\nfunction snakeToCamelCase(input: string): string {\n const parts = extractIdentifierParts(input);\n if (parts.length === 0) {\n return sanitizeIdentifierCharacters(input);\n }\n const [firstPart = input, ...rest] = parts;\n return firstPart.charAt(0).toLowerCase() + firstPart.slice(1) + rest.map(capitalize).join('');\n}\n\nfunction needsEscaping(name: string): boolean {\n return PSL_RESERVED_WORDS.has(name.toLowerCase()) || /^\\d/.test(name);\n}\n\nfunction escapeName(name: string): string {\n return `_${name}`;\n}\n\nfunction escapeIfNeeded(name: string): string {\n return needsEscaping(name) ? escapeName(name) : name;\n}\n\nexport function toModelName(tableName: string): NameResult {\n let name: string;\n\n if (hasSeparators(tableName)) {\n name = snakeToPascalCase(tableName);\n } else {\n name = tableName.charAt(0).toUpperCase() + tableName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: tableName };\n }\n\n if (name !== tableName) {\n return { name, map: tableName };\n }\n\n return { name };\n}\n\nexport function toFieldName(columnName: string): NameResult {\n let name: string;\n\n if (hasSeparators(columnName)) {\n name = snakeToCamelCase(columnName);\n } else {\n name = columnName.charAt(0).toLowerCase() + columnName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: columnName };\n }\n\n if (name !== columnName) {\n return { name, map: columnName };\n }\n\n return { name };\n}\n\nexport function toEnumName(pgTypeName: string): NameResult {\n let name: string;\n\n if (hasSeparators(pgTypeName)) {\n name = snakeToPascalCase(pgTypeName);\n } else {\n name = pgTypeName.charAt(0).toUpperCase() + pgTypeName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: pgTypeName };\n }\n\n if (name !== pgTypeName) {\n return { name, map: pgTypeName };\n }\n\n return { name };\n}\n\nexport function pluralize(word: string): string {\n if (\n word.endsWith('s') ||\n word.endsWith('x') ||\n word.endsWith('z') ||\n word.endsWith('ch') ||\n word.endsWith('sh')\n ) {\n return `${word}es`;\n }\n if (word.endsWith('y') && !/[aeiou]y$/i.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n return `${word}s`;\n}\n\nexport function deriveRelationFieldName(\n fkColumns: readonly string[],\n referencedTableName: string,\n): string {\n if (fkColumns.length === 1) {\n const [col = referencedTableName] = fkColumns;\n const stripped = col.replace(/_id$/i, '').replace(/Id$/, '');\n\n if (stripped.length > 0 && stripped !== col) {\n return escapeIfNeeded(snakeToCamelCase(stripped));\n }\n return escapeIfNeeded(snakeToCamelCase(referencedTableName));\n }\n\n return escapeIfNeeded(snakeToCamelCase(referencedTableName));\n}\n\nexport function deriveBackRelationFieldName(childModelName: string, isOneToOne: boolean): string {\n const base = childModelName.charAt(0).toLowerCase() + childModelName.slice(1);\n return isOneToOne ? base : pluralize(base);\n}\n\nexport function toNamedTypeName(columnName: string): string {\n let name: string;\n\n if (hasSeparators(columnName)) {\n name = snakeToPascalCase(columnName);\n } else {\n name = columnName.charAt(0).toUpperCase() + columnName.slice(1);\n }\n\n return escapeIfNeeded(name);\n}\n","import type { DefaultMappingOptions } from './default-mapping';\n\nconst POSTGRES_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>> = {\n 'gen_random_uuid()': '@default(dbgenerated(\"gen_random_uuid()\"))',\n};\n\nfunction formatDbGeneratedAttribute(expression: string): string {\n return `@default(dbgenerated(${JSON.stringify(expression)}))`;\n}\n\nexport function createPostgresDefaultMapping(): DefaultMappingOptions {\n return {\n functionAttributes: POSTGRES_FUNCTION_ATTRIBUTES,\n fallbackFunctionAttribute: formatDbGeneratedAttribute,\n };\n}\n","import type {\n EnumInfo,\n PslNativeTypeAttribute,\n PslTypeMap,\n PslTypeResolution,\n} from './printer-config';\n\nconst POSTGRES_TO_PSL: Record<string, string> = {\n text: 'String',\n bool: 'Boolean',\n boolean: 'Boolean',\n int4: 'Int',\n integer: 'Int',\n int8: 'BigInt',\n bigint: 'BigInt',\n float8: 'Float',\n 'double precision': 'Float',\n numeric: 'Decimal',\n decimal: 'Decimal',\n timestamptz: 'DateTime',\n 'timestamp with time zone': 'DateTime',\n jsonb: 'Json',\n bytea: 'Bytes',\n};\n\nconst PRESERVED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n> = {\n 'character varying': { pslType: 'String', attributeName: 'db.VarChar' },\n character: { pslType: 'String', attributeName: 'db.Char' },\n char: { pslType: 'String', attributeName: 'db.Char' },\n varchar: { pslType: 'String', attributeName: 'db.VarChar' },\n uuid: { pslType: 'String', attributeName: 'db.Uuid' },\n int2: { pslType: 'Int', attributeName: 'db.SmallInt' },\n smallint: { pslType: 'Int', attributeName: 'db.SmallInt' },\n float4: { pslType: 'Float', attributeName: 'db.Real' },\n real: { pslType: 'Float', attributeName: 'db.Real' },\n timestamp: { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n 'timestamp without time zone': { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n date: { pslType: 'DateTime', attributeName: 'db.Date' },\n time: { pslType: 'DateTime', attributeName: 'db.Time' },\n 'time without time zone': { pslType: 'DateTime', attributeName: 'db.Time' },\n timetz: { pslType: 'DateTime', attributeName: 'db.Timetz' },\n 'time with time zone': { pslType: 'DateTime', attributeName: 'db.Timetz' },\n json: { pslType: 'Json', attributeName: 'db.Json' },\n};\n\nconst PARAMETERIZED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n> = {\n 'character varying': { pslType: 'String', attributeName: 'db.VarChar' },\n character: { pslType: 'String', attributeName: 'db.Char' },\n char: { pslType: 'String', attributeName: 'db.Char' },\n varchar: { pslType: 'String', attributeName: 'db.VarChar' },\n numeric: { pslType: 'Decimal', attributeName: 'db.Numeric' },\n timestamp: { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n timestamptz: { pslType: 'DateTime', attributeName: 'db.Timestamptz' },\n time: { pslType: 'DateTime', attributeName: 'db.Time' },\n timetz: { pslType: 'DateTime', attributeName: 'db.Timetz' },\n};\n\nconst PARAMETERIZED_TYPE_PATTERN = /^(.+?)\\((.+)\\)$/;\n\nconst ENUM_CODEC_ID = 'pg/enum@1';\n\nfunction getOwnMappingValue(map: Record<string, string>, key: string): string | undefined {\n return Object.hasOwn(map, key) ? map[key] : undefined;\n}\n\nfunction getOwnRecordValue<T>(map: Record<string, T>, key: string): T | undefined {\n return Object.hasOwn(map, key) ? map[key] : undefined;\n}\n\nfunction createNativeTypeAttribute(name: string, args?: readonly string[]): PslNativeTypeAttribute {\n return args && args.length > 0 ? { name, args } : { name };\n}\n\nfunction splitTypeParameterList(params: string): readonly string[] {\n return params\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n}\n\nexport function createPostgresTypeMap(enumTypeNames?: ReadonlySet<string>): PslTypeMap {\n return {\n resolve(nativeType: string): PslTypeResolution {\n if (enumTypeNames?.has(nativeType)) {\n return { pslType: nativeType, nativeType };\n }\n\n const paramMatch = nativeType.match(PARAMETERIZED_TYPE_PATTERN);\n if (paramMatch) {\n const [, baseType = nativeType, params = ''] = paramMatch;\n const template = getOwnRecordValue(PARAMETERIZED_NATIVE_TYPES, baseType);\n if (template) {\n return {\n pslType: template.pslType,\n nativeType,\n typeParams: { baseType, params },\n nativeTypeAttribute: createNativeTypeAttribute(\n template.attributeName,\n splitTypeParameterList(params),\n ),\n };\n }\n }\n\n const preservedType = getOwnRecordValue(PRESERVED_NATIVE_TYPES, nativeType);\n if (preservedType) {\n return {\n pslType: preservedType.pslType,\n nativeType,\n nativeTypeAttribute: createNativeTypeAttribute(preservedType.attributeName),\n };\n }\n\n const pslType = getOwnMappingValue(POSTGRES_TO_PSL, nativeType);\n if (pslType) {\n return {\n pslType,\n nativeType,\n };\n }\n\n return { unsupported: true, nativeType };\n },\n };\n}\n\nexport function extractEnumInfo(annotations?: Record<string, unknown>): EnumInfo {\n const pgAnnotations = annotations?.['pg'] as Record<string, unknown> | undefined;\n const storageTypes = pgAnnotations?.['storageTypes'] as\n | Record<string, { codecId: string; nativeType: string; typeParams?: Record<string, unknown> }>\n | undefined;\n\n const typeNames = new Set<string>();\n const definitions = new Map<string, readonly string[]>();\n\n if (storageTypes) {\n for (const [key, typeInstance] of Object.entries(storageTypes)) {\n if (typeInstance.codecId === ENUM_CODEC_ID) {\n typeNames.add(key);\n const values = typeInstance.typeParams?.['values'];\n if (Array.isArray(values)) {\n definitions.set(key, values as string[]);\n }\n }\n }\n }\n\n return { typeNames, definitions };\n}\n\nexport function extractEnumTypeNames(annotations?: Record<string, unknown>): ReadonlySet<string> {\n return extractEnumInfo(annotations).typeNames;\n}\n\nexport function extractEnumDefinitions(\n annotations?: Record<string, unknown>,\n): ReadonlyMap<string, readonly string[]> {\n return extractEnumInfo(annotations).definitions;\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\n\nconst NEXTVAL_PATTERN = /^nextval\\s*\\(/i;\nconst NOW_FUNCTION_PATTERN = /^(now\\s*\\(\\s*\\)|CURRENT_TIMESTAMP)$/i;\nconst CLOCK_TIMESTAMP_PATTERN = /^clock_timestamp\\s*\\(\\s*\\)$/i;\nconst TIMESTAMP_CAST_SUFFIX = /::timestamp(?:tz|\\s+(?:with|without)\\s+time\\s+zone)?$/i;\nconst TEXT_CAST_SUFFIX = /::text$/i;\nconst NOW_LITERAL_PATTERN = /^'now'$/i;\nconst UUID_PATTERN = /^gen_random_uuid\\s*\\(\\s*\\)$/i;\nconst UUID_OSSP_PATTERN = /^uuid_generate_v4\\s*\\(\\s*\\)$/i;\nconst NULL_PATTERN = /^NULL(?:::.+)?$/i;\nconst TRUE_PATTERN = /^true$/i;\nconst FALSE_PATTERN = /^false$/i;\nconst NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/;\nconst JSON_CAST_SUFFIX = /::jsonb?$/i;\nconst STRING_LITERAL_PATTERN = /^'((?:[^']|'')*)'(?:::(?:\"[^\"]+\"|[\\w\\s]+)(?:\\(\\d+\\))?)?$/;\n\nfunction canonicalizeTimestampDefault(expr: string): string | undefined {\n if (NOW_FUNCTION_PATTERN.test(expr)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(expr)) return 'clock_timestamp()';\n\n if (!TIMESTAMP_CAST_SUFFIX.test(expr)) return undefined;\n\n let inner = expr.replace(TIMESTAMP_CAST_SUFFIX, '').trim();\n if (inner.startsWith('(') && inner.endsWith(')')) {\n inner = inner.slice(1, -1).trim();\n }\n\n if (NOW_FUNCTION_PATTERN.test(inner)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(inner)) return 'clock_timestamp()';\n\n inner = inner.replace(TEXT_CAST_SUFFIX, '').trim();\n if (NOW_LITERAL_PATTERN.test(inner)) return 'now()';\n\n return undefined;\n}\n\nexport function parseRawDefault(\n rawDefault: string,\n nativeType?: string,\n): ColumnDefault | undefined {\n const trimmed = rawDefault.trim();\n const normalizedType = nativeType?.toLowerCase();\n\n if (NEXTVAL_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'autoincrement()' };\n }\n\n const canonicalTimestamp = canonicalizeTimestampDefault(trimmed);\n if (canonicalTimestamp) {\n return { kind: 'function', expression: canonicalTimestamp };\n }\n\n if (UUID_PATTERN.test(trimmed) || UUID_OSSP_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'gen_random_uuid()' };\n }\n\n if (NULL_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: null };\n }\n\n if (TRUE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: true };\n }\n\n if (FALSE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: false };\n }\n\n if (NUMERIC_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: Number(trimmed) };\n }\n\n const stringMatch = trimmed.match(STRING_LITERAL_PATTERN);\n if (stringMatch?.[1] !== undefined) {\n const unescaped = stringMatch[1].replace(/''/g, \"'\");\n if (normalizedType === 'json' || normalizedType === 'jsonb') {\n if (JSON_CAST_SUFFIX.test(trimmed)) {\n return { kind: 'function', expression: trimmed };\n }\n try {\n return { kind: 'literal', value: JSON.parse(unescaped) };\n } catch {\n // Fall through to the string form for malformed/non-JSON values.\n }\n }\n return { kind: 'literal', value: unescaped };\n }\n\n return { kind: 'function', expression: trimmed };\n}\n","import type { SqlForeignKeyIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { deriveBackRelationFieldName, deriveRelationFieldName, pluralize } from './name-transforms';\nimport type { RelationField } from './printer-config';\n\nconst DEFAULT_ON_DELETE = 'noAction';\nconst DEFAULT_ON_UPDATE = 'noAction';\n\nconst REFERENTIAL_ACTION_PSL: Record<string, string> = {\n noAction: 'NoAction',\n restrict: 'Restrict',\n cascade: 'Cascade',\n setNull: 'SetNull',\n setDefault: 'SetDefault',\n};\n\nexport type InferredRelations = {\n readonly relationsByTable: ReadonlyMap<string, readonly RelationField[]>;\n};\n\nexport function inferRelations(\n tables: Record<string, SqlTableIR>,\n modelNameMap: ReadonlyMap<string, string>,\n): InferredRelations {\n const relationsByTable = new Map<string, RelationField[]>();\n\n const fkCountByPair = new Map<string, number>();\n for (const table of Object.values(tables)) {\n for (const fk of table.foreignKeys) {\n const pairKey = `${table.name}→${fk.referencedTable}`;\n fkCountByPair.set(pairKey, (fkCountByPair.get(pairKey) ?? 0) + 1);\n }\n }\n\n const usedFieldNames = new Map<string, Set<string>>();\n for (const table of Object.values(tables)) {\n const names = new Set<string>();\n for (const col of Object.values(table.columns)) {\n names.add(col.name);\n }\n usedFieldNames.set(table.name, names);\n }\n\n for (const table of Object.values(tables)) {\n for (const fk of table.foreignKeys) {\n const childTableName = table.name;\n const parentTableName = fk.referencedTable;\n const childUsed = usedFieldNames.get(childTableName) as Set<string>;\n const childModelName = modelNameMap.get(childTableName) ?? childTableName;\n const parentModelName = modelNameMap.get(parentTableName) ?? parentTableName;\n const pairKey = `${childTableName}→${parentTableName}`;\n const isSelfRelation = childTableName === parentTableName;\n const needsRelationName = (fkCountByPair.get(pairKey) as number) > 1 || isSelfRelation;\n\n const isOneToOne = detectOneToOne(fk, table);\n\n const childRelFieldName = resolveUniqueFieldName(\n deriveRelationFieldName(fk.columns, parentTableName),\n childUsed,\n parentModelName,\n );\n const relationName = needsRelationName\n ? deriveRelationName(fk, childRelFieldName, parentModelName, isSelfRelation)\n : undefined;\n const childOptional = fk.columns.some(\n (columnName) => table.columns[columnName]?.nullable ?? false,\n );\n\n const childRelField = buildChildRelationField(\n childRelFieldName,\n parentModelName,\n fk,\n childOptional,\n relationName,\n );\n\n addRelationField(relationsByTable, childTableName, childRelField);\n childUsed.add(childRelFieldName);\n\n const parentUsed = usedFieldNames.get(parentTableName) ?? new Set();\n usedFieldNames.set(parentTableName, parentUsed);\n\n const backRelFieldName = resolveUniqueFieldName(\n deriveBackRelationFieldName(childModelName, isOneToOne),\n parentUsed,\n childModelName,\n );\n\n const backRelField: RelationField = {\n fieldName: backRelFieldName,\n typeName: childModelName,\n optional: isOneToOne,\n list: !isOneToOne,\n relationName,\n };\n\n addRelationField(relationsByTable, parentTableName, backRelField);\n parentUsed.add(backRelFieldName);\n }\n }\n\n return { relationsByTable };\n}\n\nfunction detectOneToOne(fk: SqlForeignKeyIR, table: SqlTableIR): boolean {\n const fkCols = [...fk.columns].sort();\n\n if (table.primaryKey) {\n const pkCols = [...table.primaryKey.columns].sort();\n if (pkCols.length === fkCols.length && pkCols.every((c, i) => c === fkCols[i])) {\n return true;\n }\n }\n\n for (const unique of table.uniques) {\n const uniqueCols = [...unique.columns].sort();\n if (uniqueCols.length === fkCols.length && uniqueCols.every((c, i) => c === fkCols[i])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction deriveRelationName(\n fk: SqlForeignKeyIR,\n childRelationFieldName: string,\n parentModelName: string,\n isSelfRelation: boolean,\n): string {\n if (fk.name) {\n return fk.name;\n }\n if (isSelfRelation) {\n return `${childRelationFieldName.charAt(0).toUpperCase() + childRelationFieldName.slice(1)}${pluralize(parentModelName)}`;\n }\n return fk.columns.join('_');\n}\n\nfunction buildChildRelationField(\n fieldName: string,\n parentModelName: string,\n fk: SqlForeignKeyIR,\n optional: boolean,\n relationName?: string,\n): RelationField {\n const onDelete = fk.onDelete && fk.onDelete !== DEFAULT_ON_DELETE ? fk.onDelete : undefined;\n const onUpdate = fk.onUpdate && fk.onUpdate !== DEFAULT_ON_UPDATE ? fk.onUpdate : undefined;\n\n return {\n fieldName,\n typeName: parentModelName,\n referencedTableName: fk.referencedTable,\n optional,\n list: false,\n relationName,\n fkName: fk.name,\n fields: fk.columns,\n references: fk.referencedColumns,\n onDelete: onDelete ? REFERENTIAL_ACTION_PSL[onDelete] : undefined,\n onUpdate: onUpdate ? REFERENTIAL_ACTION_PSL[onUpdate] : undefined,\n };\n}\n\nfunction resolveUniqueFieldName(\n desired: string,\n usedNames: ReadonlySet<string>,\n fallbackSuffix: string,\n): string {\n if (!usedNames.has(desired)) {\n return desired;\n }\n\n const withSuffix = `${desired}${fallbackSuffix}`;\n if (!usedNames.has(withSuffix)) {\n return withSuffix;\n }\n\n let counter = 2;\n while (usedNames.has(`${desired}${counter}`)) {\n counter++;\n }\n return `${desired}${counter}`;\n}\n\nfunction addRelationField(\n map: Map<string, RelationField[]>,\n tableName: string,\n field: RelationField,\n): void {\n const existing = map.get(tableName);\n if (existing) {\n existing.push(field);\n } else {\n map.set(tableName, [field]);\n }\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\nimport type {\n PslAttribute,\n PslAttributeArgument,\n PslDocumentAst,\n PslEnum,\n PslField,\n PslFieldAttribute,\n PslModel,\n PslModelAttribute,\n PslNamedTypeDeclaration,\n PslSpan,\n PslTypesBlock,\n} from '@prisma-next/framework-components/psl-ast';\nimport type { SqlColumnIR, SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport type { DefaultMappingOptions } from './default-mapping';\nimport { mapDefault } from './default-mapping';\nimport { toEnumName, toFieldName, toModelName, toNamedTypeName } from './name-transforms';\nimport { createPostgresDefaultMapping } from './postgres-default-mapping';\nimport { createPostgresTypeMap, extractEnumInfo } from './postgres-type-map';\nimport type {\n EnumInfo,\n PslNativeTypeAttribute,\n PslPrinterOptions,\n PslTypeMap,\n RelationField,\n} from './printer-config';\nimport { parseRawDefault } from './raw-default-parser';\nimport { inferRelations } from './relation-inference';\n\nconst SYNTHETIC_SPAN: PslSpan = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: 0, line: 1, column: 1 },\n};\n\nconst PSL_SCALAR_TYPE_NAMES = new Set([\n 'String',\n 'Boolean',\n 'Int',\n 'BigInt',\n 'Float',\n 'Decimal',\n 'DateTime',\n 'Json',\n 'Bytes',\n]);\n\ntype ResolvedColumnFieldName = {\n readonly fieldName: string;\n readonly fieldMap?: string | undefined;\n};\n\ntype TableColumnFieldNameMap = ReadonlyMap<string, ResolvedColumnFieldName>;\n\ntype NamedTypeRegistryEntry = {\n readonly name: string;\n readonly baseType: string;\n readonly nativeTypeAttribute: PslNativeTypeAttribute;\n};\n\ntype NamedTypeRegistry = {\n readonly entriesByKey: Map<string, NamedTypeRegistryEntry>;\n readonly usedNames: Set<string>;\n};\n\ntype TopLevelNameResult = {\n readonly name: string;\n readonly map?: string | undefined;\n};\n\n/**\n * Converts a SQL schema IR into a PSL AST suitable for `printPsl`.\n *\n * This function owns all SQL-specific concerns: native type mapping (Postgres),\n * relation inference from foreign keys, enum extraction, and raw default parsing.\n * The output is a fully-formed `PslDocumentAst` with synthetic spans.\n */\nexport function sqlSchemaIrToPslAst(schemaIR: SqlSchemaIR): PslDocumentAst {\n const enumInfo = extractEnumInfo(schemaIR.annotations);\n const options: PslPrinterOptions = {\n typeMap: createPostgresTypeMap(enumInfo.typeNames),\n defaultMapping: createPostgresDefaultMapping(),\n enumInfo,\n parseRawDefault,\n };\n\n return buildPslDocumentAst(schemaIR, options);\n}\n\nfunction buildPslDocumentAst(schemaIR: SqlSchemaIR, options: PslPrinterOptions): PslDocumentAst {\n const { typeMap, defaultMapping, enumInfo, parseRawDefault: rawDefaultParser } = options;\n const emptyEnumInfo: EnumInfo = {\n typeNames: new Set<string>(),\n definitions: new Map<string, readonly string[]>(),\n };\n const { typeNames: enumTypeNames, definitions: enumDefinitions } = enumInfo ?? emptyEnumInfo;\n\n const modelNames = buildTopLevelNameMap(\n Object.keys(schemaIR.tables),\n toModelName,\n 'model',\n 'table',\n );\n const enumNames = buildTopLevelNameMap(enumTypeNames, toEnumName, 'enum', 'enum type');\n assertNoCrossKindNameCollisions(modelNames, enumNames);\n\n const modelNameMap = new Map(\n [...modelNames].map(([tableName, result]) => [tableName, result.name]),\n );\n const enumNameMap = new Map(\n [...enumNames].map(([pgTypeName, result]) => [pgTypeName, result.name]),\n );\n const reservedNamedTypeNames = createReservedNamedTypeNames(modelNames, enumNames);\n\n const fieldNamesByTable = buildFieldNamesByTable(schemaIR.tables);\n const { relationsByTable } = inferRelations(schemaIR.tables, modelNameMap);\n const namedTypes = seedNamedTypeRegistry(schemaIR, typeMap, enumNameMap, reservedNamedTypeNames);\n\n const models: PslModel[] = [];\n for (const table of Object.values(schemaIR.tables)) {\n models.push(\n buildModel(\n table,\n typeMap,\n enumNameMap,\n fieldNamesByTable,\n namedTypes,\n defaultMapping,\n rawDefaultParser,\n relationsByTable.get(table.name) ?? [],\n ),\n );\n }\n\n const sortedModels = topologicalSort(models, schemaIR.tables, modelNameMap);\n\n const enums: PslEnum[] = [];\n for (const [pgTypeName, values] of enumDefinitions) {\n const enumName = enumNames.get(pgTypeName) as TopLevelNameResult;\n enums.push(buildEnum(enumName, values));\n }\n enums.sort((a, b) => a.name.localeCompare(b.name));\n\n const namedTypeEntries = [...namedTypes.entriesByKey.values()].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n const types: PslTypesBlock | undefined =\n namedTypeEntries.length > 0\n ? {\n kind: 'types',\n declarations: namedTypeEntries.map(buildNamedTypeDeclaration),\n span: SYNTHETIC_SPAN,\n }\n : undefined;\n\n const ast: PslDocumentAst = {\n kind: 'document',\n sourceId: '<sql-schema-ir>',\n models: sortedModels,\n enums,\n compositeTypes: [],\n ...(types ? { types } : {}),\n span: SYNTHETIC_SPAN,\n };\n\n return ast;\n}\n\nfunction buildModel(\n table: SqlTableIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n namedTypes: NamedTypeRegistry,\n defaultMapping: DefaultMappingOptions | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n relationFields: readonly RelationField[],\n): PslModel {\n const { name: modelName, map: mapName } = toModelName(table.name);\n const fieldNameMap = fieldNamesByTable.get(table.name);\n\n const pkColumns = new Set(table.primaryKey?.columns ?? []);\n const isSinglePk = pkColumns.size === 1;\n const singlePkConstraintName = isSinglePk ? table.primaryKey?.name : undefined;\n\n const uniqueColumns = new Map<string, string | undefined>();\n for (const unique of table.uniques) {\n if (unique.columns.length === 1) {\n const [columnName = ''] = unique.columns;\n const existingConstraintName = uniqueColumns.get(columnName);\n if (!uniqueColumns.has(columnName) || (existingConstraintName === undefined && unique.name)) {\n uniqueColumns.set(columnName, unique.name);\n }\n }\n }\n\n const fields: PslField[] = [];\n for (const column of Object.values(table.columns)) {\n fields.push(\n buildScalarField(\n column,\n table,\n typeMap,\n enumNameMap,\n fieldNameMap,\n namedTypes,\n defaultMapping,\n rawDefaultParser,\n pkColumns,\n isSinglePk,\n singlePkConstraintName,\n uniqueColumns,\n ),\n );\n }\n\n const usedFieldNames = new Set(fields.map((field) => field.name));\n for (const rel of relationFields) {\n fields.push(buildRelationField(rel, table.name, fieldNamesByTable, usedFieldNames));\n }\n\n const modelAttributes: PslModelAttribute[] = [];\n\n if (table.primaryKey && table.primaryKey.columns.length > 1) {\n const pkFieldNames = table.primaryKey.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('id', pkFieldNames, table.primaryKey.name));\n }\n\n for (const unique of table.uniques) {\n if (unique.columns.length > 1) {\n const uniqueFieldNames = unique.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('unique', uniqueFieldNames, unique.name));\n }\n }\n\n for (const index of table.indexes) {\n if (!index.unique) {\n const indexFieldNames = index.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('index', indexFieldNames, index.name));\n }\n }\n\n if (mapName) {\n modelAttributes.push(buildMapAttribute('model', mapName));\n }\n\n // Surface introspection advisory: tables without a primary key cannot serve\n // as the right-hand side of a `findUnique`-style query downstream, so the\n // user should add an `@id` policy. This warning has shipped since\n // `contract infer` was introduced and is part of the spec § A9 byte-identity\n // contract for SQL output.\n const comment = table.primaryKey\n ? undefined\n : '// WARNING: This table has no primary key in the database';\n\n return {\n kind: 'model',\n name: modelName,\n fields,\n attributes: modelAttributes,\n span: SYNTHETIC_SPAN,\n ...(comment !== undefined ? { comment } : {}),\n };\n}\n\nfunction buildScalarField(\n column: SqlColumnIR,\n table: SqlTableIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n fieldNameMap: TableColumnFieldNameMap | undefined,\n namedTypes: NamedTypeRegistry,\n defaultMapping: DefaultMappingOptions | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n pkColumns: ReadonlySet<string>,\n isSinglePk: boolean,\n singlePkConstraintName: string | undefined,\n uniqueColumns: ReadonlyMap<string, string | undefined>,\n): PslField {\n const resolvedField = fieldNameMap?.get(column.name);\n const fieldName = resolvedField?.fieldName ?? toFieldName(column.name).name;\n const fieldMap = resolvedField?.fieldMap;\n\n const resolution = typeMap.resolve(column.nativeType, table.annotations);\n\n if ('unsupported' in resolution) {\n const attrs: PslFieldAttribute[] = [];\n if (fieldMap !== undefined) {\n attrs.push(buildMapAttribute('field', fieldMap));\n }\n return {\n kind: 'field',\n name: fieldName,\n typeName: `Unsupported(\"${escapePslString(resolution.nativeType)}\")`,\n optional: column.nullable,\n list: false,\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n }\n\n let typeName = resolution.pslType;\n const enumPslName = enumNameMap.get(column.nativeType);\n if (enumPslName) {\n typeName = enumPslName;\n }\n if (resolution.nativeTypeAttribute && !enumPslName) {\n typeName = resolveNamedTypeName(namedTypes, resolution);\n }\n\n const attributes: PslFieldAttribute[] = [];\n const isId = isSinglePk && pkColumns.has(column.name);\n if (isId) {\n attributes.push(buildSimpleConstraintFieldAttribute('id', singlePkConstraintName));\n }\n\n if (column.default !== undefined) {\n const parsed = parseColumnDefault(column.default, column.nativeType, rawDefaultParser);\n if (parsed) {\n const result = mapDefault(parsed, defaultMapping);\n if ('attribute' in result) {\n attributes.push(parseDefaultAttributeString(result.attribute));\n }\n // 'comment' fallback (unrecognized raw default) is dropped — the\n // M1 legacy path emitted a `// Raw default: ...` line above the field via\n // `PrinterField.comment`. M2 drops this since it would require comment\n // nodes in the AST.\n }\n }\n\n if (uniqueColumns.has(column.name) && !isId) {\n const uniqueConstraintName = uniqueColumns.get(column.name);\n attributes.push(buildSimpleConstraintFieldAttribute('unique', uniqueConstraintName));\n }\n\n if (fieldMap !== undefined) {\n attributes.push(buildMapAttribute('field', fieldMap));\n }\n\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n optional: column.nullable,\n list: false,\n attributes,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildRelationField(\n rel: RelationField,\n hostTableName: string,\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n usedFieldNames: Set<string>,\n): PslField {\n const fieldName = createUniqueFieldName(rel.fieldName, usedFieldNames);\n usedFieldNames.add(fieldName);\n\n const args: PslAttributeArgument[] = [];\n\n if (rel.fields && rel.references) {\n if (rel.relationName) {\n args.push(namedArg('name', `\"${escapePslString(rel.relationName)}\"`));\n }\n args.push(\n namedArg(\n 'fields',\n `[${rel.fields\n .map((columnName) => resolveColumnFieldName(fieldNamesByTable, hostTableName, columnName))\n .join(', ')}]`,\n ),\n );\n args.push(\n namedArg(\n 'references',\n `[${rel.references\n .map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, rel.referencedTableName ?? '', columnName),\n )\n .join(', ')}]`,\n ),\n );\n if (rel.onDelete) {\n args.push(namedArg('onDelete', rel.onDelete));\n }\n if (rel.onUpdate) {\n args.push(namedArg('onUpdate', rel.onUpdate));\n }\n if (rel.fkName) {\n args.push(namedArg('map', `\"${escapePslString(rel.fkName)}\"`));\n }\n } else if (rel.relationName) {\n args.push(namedArg('name', `\"${escapePslString(rel.relationName)}\"`));\n }\n\n const attrs: PslFieldAttribute[] =\n args.length > 0 ? [buildAttribute('field', 'relation', args)] : [];\n\n return {\n kind: 'field',\n name: fieldName,\n typeName: rel.typeName,\n optional: rel.optional,\n list: rel.list,\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildModelConstraintAttribute(\n name: 'id' | 'unique' | 'index',\n fields: readonly string[],\n constraintName?: string,\n): PslModelAttribute {\n const args: PslAttributeArgument[] = [positionalArg(`[${fields.join(', ')}]`)];\n if (constraintName !== undefined) {\n args.push(namedArg('map', `\"${escapePslString(constraintName)}\"`));\n }\n return buildAttribute('model', name, args);\n}\n\nfunction buildSimpleConstraintFieldAttribute(\n name: 'id' | 'unique',\n constraintName: string | undefined,\n): PslFieldAttribute {\n if (constraintName === undefined) {\n return buildAttribute('field', name, []);\n }\n return buildAttribute('field', name, [namedArg('map', `\"${escapePslString(constraintName)}\"`)]);\n}\n\nfunction parseDefaultAttributeString(attributeText: string): PslFieldAttribute {\n // Strip leading \"@default(\" and trailing \")\" — `mapDefault` always returns one\n // top-level positional expression.\n const inner = attributeText.replace(/^@default\\(/, '').replace(/\\)$/, '');\n return buildAttribute('field', 'default', [positionalArg(inner)]);\n}\n\nfunction buildMapAttribute(target: 'model' | 'field' | 'enum', mapName: string): PslAttribute {\n return buildAttribute(target, 'map', [positionalArg(`\"${escapePslString(mapName)}\"`)]);\n}\n\nfunction buildAttribute(\n target: PslAttribute['target'],\n name: string,\n args: readonly PslAttributeArgument[],\n): PslAttribute {\n return {\n kind: 'attribute',\n target,\n name,\n args,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction positionalArg(value: string): PslAttributeArgument {\n return { kind: 'positional', value, span: SYNTHETIC_SPAN };\n}\n\nfunction namedArg(name: string, value: string): PslAttributeArgument {\n return { kind: 'named', name, value, span: SYNTHETIC_SPAN };\n}\n\nfunction buildEnum(name: TopLevelNameResult, values: readonly string[]): PslEnum {\n const attrs: PslAttribute[] = [];\n if (name.map) {\n attrs.push(buildMapAttribute('enum', name.map));\n }\n return {\n kind: 'enum',\n name: name.name,\n values: values.map((value) => ({\n kind: 'enumValue',\n name: value,\n span: SYNTHETIC_SPAN,\n })),\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildNamedTypeDeclaration(entry: NamedTypeRegistryEntry): PslNamedTypeDeclaration {\n const attribute = buildAttribute(\n 'namedType',\n entry.nativeTypeAttribute.name,\n (entry.nativeTypeAttribute.args ?? []).map(positionalArg),\n );\n return {\n kind: 'namedType',\n name: entry.name,\n baseType: entry.baseType,\n attributes: [attribute],\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction escapePslString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n}\n\n/**\n * Resolves a `SqlColumnIR.default` value into a normalized {@link ColumnDefault}.\n *\n * `SqlSchemaIR` types the column default as `string` (a raw database default\n * expression). Some legacy fixtures and tests still pass already-normalized\n * `ColumnDefault` objects in the same slot, so we accept either shape\n * defensively at runtime.\n */\nfunction parseColumnDefault(\n value: unknown,\n nativeType: string | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n): ColumnDefault | undefined {\n if (typeof value === 'string') {\n return rawDefaultParser ? rawDefaultParser(value, nativeType) : undefined;\n }\n if (value !== null && typeof value === 'object' && 'kind' in (value as Record<string, unknown>)) {\n return value as ColumnDefault;\n }\n return undefined;\n}\n\nfunction buildFieldNamesByTable(\n tables: Record<string, SqlTableIR>,\n): ReadonlyMap<string, TableColumnFieldNameMap> {\n const fieldNamesByTable = new Map<string, TableColumnFieldNameMap>();\n\n for (const table of Object.values(tables)) {\n const columns = Object.values(table.columns).map((column, index) => {\n const { name, map } = toFieldName(column.name);\n return {\n columnName: column.name,\n desiredFieldName: name,\n fieldMap: map,\n index,\n };\n });\n\n const assignmentOrder = [...columns].sort((left, right) => {\n const mapComparison =\n Number(left.fieldMap !== undefined) - Number(right.fieldMap !== undefined);\n if (mapComparison !== 0) {\n return mapComparison;\n }\n return left.index - right.index;\n });\n\n const usedFieldNames = new Set<string>();\n const tableFieldNames = new Map<string, ResolvedColumnFieldName>();\n\n for (const column of assignmentOrder) {\n const fieldName = createUniqueFieldName(column.desiredFieldName, usedFieldNames);\n usedFieldNames.add(fieldName);\n tableFieldNames.set(column.columnName, {\n fieldName,\n fieldMap: column.fieldMap,\n });\n }\n\n fieldNamesByTable.set(table.name, tableFieldNames);\n }\n\n return fieldNamesByTable;\n}\n\nfunction resolveColumnFieldName(\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n tableName: string,\n columnName: string,\n): string {\n return (\n fieldNamesByTable.get(tableName)?.get(columnName)?.fieldName ?? toFieldName(columnName).name\n );\n}\n\nfunction createUniqueFieldName(desiredName: string, usedFieldNames: ReadonlySet<string>): string {\n if (!usedFieldNames.has(desiredName)) {\n return desiredName;\n }\n\n let counter = 2;\n while (usedFieldNames.has(`${desiredName}${counter}`)) {\n counter++;\n }\n return `${desiredName}${counter}`;\n}\n\nfunction buildTopLevelNameMap(\n sources: Iterable<string>,\n normalize: (source: string) => TopLevelNameResult,\n kind: 'model' | 'enum',\n sourceKind: 'table' | 'enum type',\n): Map<string, TopLevelNameResult> {\n const results = new Map<string, TopLevelNameResult>();\n const normalizedToSources = new Map<string, string[]>();\n\n for (const source of sources) {\n const normalized = normalize(source);\n results.set(source, normalized);\n normalizedToSources.set(normalized.name, [\n ...(normalizedToSources.get(normalized.name) ?? []),\n source,\n ]);\n }\n\n const duplicates = [...normalizedToSources.entries()].filter(\n ([, conflictingSources]) => conflictingSources.length > 1,\n );\n if (duplicates.length > 0) {\n const details = duplicates.map(\n ([normalizedName, conflictingSources]) =>\n `- ${kind} \"${normalizedName}\" from ${sourceKind}s ${conflictingSources\n .map((source) => `\"${source}\"`)\n .join(', ')}`,\n );\n throw new Error(`PSL ${kind} name collisions detected:\\n${details.join('\\n')}`);\n }\n\n return results;\n}\n\nfunction assertNoCrossKindNameCollisions(\n modelNames: ReadonlyMap<string, TopLevelNameResult>,\n enumNames: ReadonlyMap<string, TopLevelNameResult>,\n): void {\n const enumSourceByName = new Map([...enumNames].map(([source, result]) => [result.name, source]));\n\n const collisions = [...modelNames.entries()]\n .map(([tableName, result]) => {\n const enumSource = enumSourceByName.get(result.name);\n return enumSource\n ? `- identifier \"${result.name}\" from table \"${tableName}\" collides with enum type \"${enumSource}\"`\n : undefined;\n })\n .filter((detail): detail is string => detail !== undefined);\n\n if (collisions.length > 0) {\n throw new Error(`PSL top-level name collisions detected:\\n${collisions.join('\\n')}`);\n }\n}\n\nfunction createReservedNamedTypeNames(\n modelNames: ReadonlyMap<string, TopLevelNameResult>,\n enumNames: ReadonlyMap<string, TopLevelNameResult>,\n): Set<string> {\n const reservedNames = new Set<string>(PSL_SCALAR_TYPE_NAMES);\n\n for (const result of modelNames.values()) {\n reservedNames.add(result.name);\n }\n\n for (const result of enumNames.values()) {\n reservedNames.add(result.name);\n }\n\n return reservedNames;\n}\n\nfunction seedNamedTypeRegistry(\n schemaIR: SqlSchemaIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n reservedNames: ReadonlySet<string>,\n): NamedTypeRegistry {\n type Seed = {\n readonly baseType: string;\n readonly desiredName: string;\n readonly nativeTypeAttribute: PslNativeTypeAttribute;\n };\n\n const seeds = new Map<string, Seed>();\n\n for (const tableName of Object.keys(schemaIR.tables).sort()) {\n const table = schemaIR.tables[tableName];\n if (!table) {\n continue;\n }\n\n for (const columnName of Object.keys(table.columns).sort()) {\n const column = table.columns[columnName];\n if (!column) {\n continue;\n }\n\n const resolution = typeMap.resolve(column.nativeType, table.annotations);\n if (\n 'unsupported' in resolution ||\n enumNameMap.has(column.nativeType) ||\n !resolution.nativeTypeAttribute\n ) {\n continue;\n }\n\n const signatureKey = createNamedTypeSignatureKey(resolution);\n if (!seeds.has(signatureKey)) {\n seeds.set(signatureKey, {\n baseType: resolution.pslType,\n desiredName: toNamedTypeName(column.name),\n nativeTypeAttribute: resolution.nativeTypeAttribute,\n });\n }\n }\n }\n\n const registry: NamedTypeRegistry = {\n entriesByKey: new Map<string, NamedTypeRegistryEntry>(),\n usedNames: new Set<string>(reservedNames),\n };\n\n const sortedSeeds = [...seeds.entries()].sort((left, right) => {\n const desiredNameComparison = left[1].desiredName.localeCompare(right[1].desiredName);\n if (desiredNameComparison !== 0) {\n return desiredNameComparison;\n }\n return left[0].localeCompare(right[0]);\n });\n\n for (const [signatureKey, seed] of sortedSeeds) {\n const name = createUniqueFieldName(seed.desiredName, registry.usedNames);\n registry.entriesByKey.set(signatureKey, {\n name,\n baseType: seed.baseType,\n nativeTypeAttribute: seed.nativeTypeAttribute,\n });\n registry.usedNames.add(name);\n }\n\n return registry;\n}\n\nfunction resolveNamedTypeName(\n registry: NamedTypeRegistry,\n resolution: {\n readonly pslType: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n readonly nativeTypeAttribute?: PslNativeTypeAttribute;\n },\n): string {\n const key = createNamedTypeSignatureKey(resolution);\n const existing = registry.entriesByKey.get(key);\n if (existing) {\n return existing.name;\n }\n\n throw new Error(`Named type registry was not seeded for native type \"${resolution.nativeType}\"`);\n}\n\nfunction createNamedTypeSignatureKey(resolution: {\n readonly pslType: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n readonly nativeTypeAttribute?: PslNativeTypeAttribute;\n}): string {\n return JSON.stringify({\n baseType: resolution.pslType,\n nativeTypeAttribute: resolution.nativeTypeAttribute\n ? {\n name: resolution.nativeTypeAttribute.name,\n args: resolution.nativeTypeAttribute.args ?? null,\n }\n : null,\n });\n}\n\nfunction topologicalSort(\n models: PslModel[],\n tables: Record<string, SqlTableIR>,\n modelNameMap: ReadonlyMap<string, string>,\n): PslModel[] {\n const modelByName = new Map<string, PslModel>();\n for (const model of models) {\n modelByName.set(model.name, model);\n }\n\n const deps = new Map<string, Set<string>>();\n const tableToModel = new Map<string, string>();\n for (const tableName of Object.keys(tables)) {\n const modelName = modelNameMap.get(tableName) as string;\n tableToModel.set(tableName, modelName);\n deps.set(modelName, new Set());\n }\n\n for (const [tableName, table] of Object.entries(tables)) {\n const modelName = tableToModel.get(tableName) as string;\n for (const fk of table.foreignKeys) {\n const refModelName = tableToModel.get(fk.referencedTable);\n if (refModelName && refModelName !== modelName) {\n (deps.get(modelName) as Set<string>).add(refModelName);\n }\n }\n }\n\n const result: PslModel[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const sortedNames = [...deps.keys()].sort();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) return;\n visiting.add(name);\n\n const sortedDeps = [...(deps.get(name) as Set<string>)].sort();\n for (const dep of sortedDeps) {\n visit(dep);\n }\n\n visiting.delete(name);\n visited.add(name);\n result.push(modelByName.get(name) as PslModel);\n }\n\n for (const name of sortedNames) {\n visit(name);\n }\n\n return result;\n}\n","import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n MigrationPlanOperation,\n OperationContext,\n OperationPreview,\n OperationPreviewCapable,\n PslContractInferCapable,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { PslDocumentAst } from '@prisma-next/framework-components/psl-ast';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { sqlOperationsToPreview } from './operation-preview';\nimport { sqlSchemaIrToPslAst } from './psl-contract-infer/sql-schema-ir-to-psl-ast';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n PslContractInferCapable<SqlSchemaIR>,\n OperationPreviewCapable,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n\n inferPslContract(schemaIR: SqlSchemaIR): PslDocumentAst;\n\n toOperationPreview(operations: readonly MigrationPlanOperation[]): OperationPreview;\n}\n\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\nfunction isSqlControlAdapter<TTargetId extends string>(\n value: unknown,\n): value is SqlControlAdapter<TTargetId> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'introspect' in value &&\n typeof (value as { introspect: unknown }).introspect === 'function' &&\n 'readMarker' in value &&\n typeof (value as { readMarker: unknown }).readMarker === 'function'\n );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n // Family-instance methods accept `ControlDriverInstance<'sql', string>` —\n // the family API isn't generic on the target id. Letting `isSqlControlAdapter`\n // default its type parameter narrows the adapter to `SqlControlAdapter<string>`,\n // which matches the family-level driver type without any cast at call sites.\n const getControlAdapter = () => {\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error(\n 'Adapter does not implement SqlControlAdapter (missing introspect or readMarker)',\n );\n }\n return controlAdapter;\n };\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await getControlAdapter().readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = getControlAdapter();\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await getControlAdapter().readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return getControlAdapter().readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n return getControlAdapter().introspect(options.driver, options.contract);\n },\n\n inferPslContract(schemaIR: SqlSchemaIR): PslDocumentAst {\n return sqlSchemaIrToPslAst(schemaIR);\n },\n\n toOperationPreview(operations: readonly MigrationPlanOperation[]): OperationPreview {\n return sqlOperationsToPreview(operations);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":["statements: string[]","DEFAULT_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>>","name: string","POSTGRES_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>>","POSTGRES_TO_PSL: Record<string, string>","PRESERVED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n>","PARAMETERIZED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n>","REFERENTIAL_ACTION_PSL: Record<string, string>","SYNTHETIC_SPAN: PslSpan","models: PslModel[]","enums: PslEnum[]","types: PslTypesBlock | undefined","fields: PslField[]","modelAttributes: PslModelAttribute[]","attrs: PslFieldAttribute[]","attributes: PslFieldAttribute[]","args: PslAttributeArgument[]","attrs: PslAttribute[]","registry: NamedTypeRegistry","result: PslModel[]","contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/operation-preview.ts","../src/core/psl-contract-infer/default-mapping.ts","../src/core/psl-contract-infer/name-transforms.ts","../src/core/psl-contract-infer/postgres-default-mapping.ts","../src/core/psl-contract-infer/postgres-type-map.ts","../src/core/psl-contract-infer/raw-default-parser.ts","../src/core/psl-contract-infer/relation-inference.ts","../src/core/psl-contract-infer/sql-schema-ir-to-psl-ast.ts","../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n MigrationPlanOperation,\n OperationPreview,\n} from '@prisma-next/framework-components/control';\n\n/**\n * Shape of an SQL execute step on `SqlMigrationPlanOperation`. Used for runtime\n * type narrowing without importing the concrete SQL type.\n */\ninterface SqlExecuteStep {\n readonly sql: string;\n}\n\nfunction isDdlStatement(sqlStatement: string): boolean {\n const trimmed = sqlStatement.trim().toLowerCase();\n return (\n trimmed.startsWith('create ') || trimmed.startsWith('alter ') || trimmed.startsWith('drop ')\n );\n}\n\nfunction hasExecuteSteps(\n operation: MigrationPlanOperation,\n): operation is MigrationPlanOperation & { readonly execute: readonly SqlExecuteStep[] } {\n const candidate = operation as unknown as Record<string, unknown>;\n if (!('execute' in candidate) || !Array.isArray(candidate['execute'])) {\n return false;\n }\n return candidate['execute'].every(\n (step: unknown) => typeof step === 'object' && step !== null && 'sql' in step,\n );\n}\n\n/**\n * Extracts a best-effort SQL DDL preview for CLI plan output.\n * Presentation-only: never used to decide migration correctness.\n */\nexport function extractSqlDdl(operations: readonly MigrationPlanOperation[]): string[] {\n const statements: string[] = [];\n for (const operation of operations) {\n if (!hasExecuteSteps(operation)) {\n continue;\n }\n for (const step of operation.execute) {\n if (typeof step.sql === 'string' && isDdlStatement(step.sql)) {\n statements.push(step.sql.trim());\n }\n }\n }\n return statements;\n}\n\n/**\n * Wraps `extractSqlDdl` into the family-agnostic `OperationPreview` shape.\n * Each statement carries `language: 'sql'`.\n */\nexport function sqlOperationsToPreview(\n operations: readonly MigrationPlanOperation[],\n): OperationPreview {\n return {\n statements: extractSqlDdl(operations).map((text) => ({ text, language: 'sql' })),\n };\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\n\nconst DEFAULT_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>> = {\n 'autoincrement()': '@default(autoincrement())',\n 'now()': '@default(now())',\n};\n\nexport interface DefaultMappingOptions {\n readonly functionAttributes?: Readonly<Record<string, string>>;\n readonly fallbackFunctionAttribute?: ((expression: string) => string | undefined) | undefined;\n}\n\nexport type DefaultMappingResult = { readonly attribute: string } | { readonly comment: string };\n\nexport function mapDefault(\n columnDefault: ColumnDefault,\n options?: DefaultMappingOptions,\n): DefaultMappingResult {\n switch (columnDefault.kind) {\n case 'literal':\n return { attribute: `@default(${formatLiteralValue(columnDefault.value)})` };\n case 'function': {\n const attribute =\n options?.functionAttributes?.[columnDefault.expression] ??\n DEFAULT_FUNCTION_ATTRIBUTES[columnDefault.expression] ??\n options?.fallbackFunctionAttribute?.(columnDefault.expression);\n return attribute\n ? { attribute }\n : { comment: `// Raw default: ${columnDefault.expression.replace(/[\\r\\n]+/g, ' ')}` };\n }\n }\n}\n\nfunction formatLiteralValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n switch (typeof value) {\n case 'boolean':\n case 'number':\n return String(value);\n case 'string':\n return quoteString(value);\n default:\n return quoteString(JSON.stringify(value));\n }\n}\n\nfunction quoteString(str: string): string {\n return `\"${escapeString(str)}\"`;\n}\n\nfunction escapeString(str: string): string {\n return JSON.stringify(str).slice(1, -1);\n}\n","const PSL_RESERVED_WORDS = new Set(['model', 'enum', 'types', 'type', 'generator', 'datasource']);\n\nconst IDENTIFIER_PART_PATTERN = /[A-Za-z0-9]+/g;\n\ntype NameResult = {\n readonly name: string;\n readonly map?: string;\n};\n\nfunction hasSeparators(input: string): boolean {\n return /[^A-Za-z0-9]/.test(input);\n}\n\nfunction extractIdentifierParts(input: string): string[] {\n return input.match(IDENTIFIER_PART_PATTERN) ?? [];\n}\n\nfunction createSyntheticIdentifier(input: string): string {\n let hash = 2166136261;\n\n for (const char of input) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n\n return `x${(hash >>> 0).toString(16)}`;\n}\n\nfunction sanitizeIdentifierCharacters(input: string): string {\n const sanitized = input.replace(/[^\\w]/g, '');\n return sanitized.length > 0 ? sanitized : createSyntheticIdentifier(input);\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction snakeToPascalCase(input: string): string {\n const parts = extractIdentifierParts(input);\n if (parts.length === 0) {\n return capitalize(sanitizeIdentifierCharacters(input));\n }\n return parts.map(capitalize).join('');\n}\n\nfunction snakeToCamelCase(input: string): string {\n const parts = extractIdentifierParts(input);\n if (parts.length === 0) {\n return sanitizeIdentifierCharacters(input);\n }\n const [firstPart = input, ...rest] = parts;\n return firstPart.charAt(0).toLowerCase() + firstPart.slice(1) + rest.map(capitalize).join('');\n}\n\nfunction needsEscaping(name: string): boolean {\n return PSL_RESERVED_WORDS.has(name.toLowerCase()) || /^\\d/.test(name);\n}\n\nfunction escapeName(name: string): string {\n return `_${name}`;\n}\n\nfunction escapeIfNeeded(name: string): string {\n return needsEscaping(name) ? escapeName(name) : name;\n}\n\nexport function toModelName(tableName: string): NameResult {\n let name: string;\n\n if (hasSeparators(tableName)) {\n name = snakeToPascalCase(tableName);\n } else {\n name = tableName.charAt(0).toUpperCase() + tableName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: tableName };\n }\n\n if (name !== tableName) {\n return { name, map: tableName };\n }\n\n return { name };\n}\n\nexport function toFieldName(columnName: string): NameResult {\n let name: string;\n\n if (hasSeparators(columnName)) {\n name = snakeToCamelCase(columnName);\n } else {\n name = columnName.charAt(0).toLowerCase() + columnName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: columnName };\n }\n\n if (name !== columnName) {\n return { name, map: columnName };\n }\n\n return { name };\n}\n\nexport function toEnumName(pgTypeName: string): NameResult {\n let name: string;\n\n if (hasSeparators(pgTypeName)) {\n name = snakeToPascalCase(pgTypeName);\n } else {\n name = pgTypeName.charAt(0).toUpperCase() + pgTypeName.slice(1);\n }\n\n if (needsEscaping(name)) {\n const escaped = escapeName(name);\n return { name: escaped, map: pgTypeName };\n }\n\n if (name !== pgTypeName) {\n return { name, map: pgTypeName };\n }\n\n return { name };\n}\n\nexport function pluralize(word: string): string {\n if (\n word.endsWith('s') ||\n word.endsWith('x') ||\n word.endsWith('z') ||\n word.endsWith('ch') ||\n word.endsWith('sh')\n ) {\n return `${word}es`;\n }\n if (word.endsWith('y') && !/[aeiou]y$/i.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n return `${word}s`;\n}\n\nexport function deriveRelationFieldName(\n fkColumns: readonly string[],\n referencedTableName: string,\n): string {\n if (fkColumns.length === 1) {\n const [col = referencedTableName] = fkColumns;\n const stripped = col.replace(/_id$/i, '').replace(/Id$/, '');\n\n if (stripped.length > 0 && stripped !== col) {\n return escapeIfNeeded(snakeToCamelCase(stripped));\n }\n return escapeIfNeeded(snakeToCamelCase(referencedTableName));\n }\n\n return escapeIfNeeded(snakeToCamelCase(referencedTableName));\n}\n\nexport function deriveBackRelationFieldName(childModelName: string, isOneToOne: boolean): string {\n const base = childModelName.charAt(0).toLowerCase() + childModelName.slice(1);\n return isOneToOne ? base : pluralize(base);\n}\n\nexport function toNamedTypeName(columnName: string): string {\n let name: string;\n\n if (hasSeparators(columnName)) {\n name = snakeToPascalCase(columnName);\n } else {\n name = columnName.charAt(0).toUpperCase() + columnName.slice(1);\n }\n\n return escapeIfNeeded(name);\n}\n","import type { DefaultMappingOptions } from './default-mapping';\n\nconst POSTGRES_FUNCTION_ATTRIBUTES: Readonly<Record<string, string>> = {\n 'gen_random_uuid()': '@default(dbgenerated(\"gen_random_uuid()\"))',\n};\n\nfunction formatDbGeneratedAttribute(expression: string): string {\n return `@default(dbgenerated(${JSON.stringify(expression)}))`;\n}\n\nexport function createPostgresDefaultMapping(): DefaultMappingOptions {\n return {\n functionAttributes: POSTGRES_FUNCTION_ATTRIBUTES,\n fallbackFunctionAttribute: formatDbGeneratedAttribute,\n };\n}\n","import type {\n EnumInfo,\n PslNativeTypeAttribute,\n PslTypeMap,\n PslTypeResolution,\n} from './printer-config';\n\nconst POSTGRES_TO_PSL: Record<string, string> = {\n text: 'String',\n bool: 'Boolean',\n boolean: 'Boolean',\n int4: 'Int',\n integer: 'Int',\n int8: 'BigInt',\n bigint: 'BigInt',\n float8: 'Float',\n 'double precision': 'Float',\n numeric: 'Decimal',\n decimal: 'Decimal',\n timestamptz: 'DateTime',\n 'timestamp with time zone': 'DateTime',\n jsonb: 'Json',\n bytea: 'Bytes',\n};\n\nconst PRESERVED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n> = {\n 'character varying': { pslType: 'String', attributeName: 'db.VarChar' },\n character: { pslType: 'String', attributeName: 'db.Char' },\n char: { pslType: 'String', attributeName: 'db.Char' },\n varchar: { pslType: 'String', attributeName: 'db.VarChar' },\n uuid: { pslType: 'String', attributeName: 'db.Uuid' },\n int2: { pslType: 'Int', attributeName: 'db.SmallInt' },\n smallint: { pslType: 'Int', attributeName: 'db.SmallInt' },\n float4: { pslType: 'Float', attributeName: 'db.Real' },\n real: { pslType: 'Float', attributeName: 'db.Real' },\n timestamp: { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n 'timestamp without time zone': { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n date: { pslType: 'DateTime', attributeName: 'db.Date' },\n time: { pslType: 'DateTime', attributeName: 'db.Time' },\n 'time without time zone': { pslType: 'DateTime', attributeName: 'db.Time' },\n timetz: { pslType: 'DateTime', attributeName: 'db.Timetz' },\n 'time with time zone': { pslType: 'DateTime', attributeName: 'db.Timetz' },\n json: { pslType: 'Json', attributeName: 'db.Json' },\n};\n\nconst PARAMETERIZED_NATIVE_TYPES: Record<\n string,\n { readonly pslType: string; readonly attributeName: string }\n> = {\n 'character varying': { pslType: 'String', attributeName: 'db.VarChar' },\n character: { pslType: 'String', attributeName: 'db.Char' },\n char: { pslType: 'String', attributeName: 'db.Char' },\n varchar: { pslType: 'String', attributeName: 'db.VarChar' },\n numeric: { pslType: 'Decimal', attributeName: 'db.Numeric' },\n timestamp: { pslType: 'DateTime', attributeName: 'db.Timestamp' },\n timestamptz: { pslType: 'DateTime', attributeName: 'db.Timestamptz' },\n time: { pslType: 'DateTime', attributeName: 'db.Time' },\n timetz: { pslType: 'DateTime', attributeName: 'db.Timetz' },\n};\n\nconst PARAMETERIZED_TYPE_PATTERN = /^(.+?)\\((.+)\\)$/;\n\nconst ENUM_CODEC_ID = 'pg/enum@1';\n\nfunction getOwnMappingValue(map: Record<string, string>, key: string): string | undefined {\n return Object.hasOwn(map, key) ? map[key] : undefined;\n}\n\nfunction getOwnRecordValue<T>(map: Record<string, T>, key: string): T | undefined {\n return Object.hasOwn(map, key) ? map[key] : undefined;\n}\n\nfunction createNativeTypeAttribute(name: string, args?: readonly string[]): PslNativeTypeAttribute {\n return args && args.length > 0 ? { name, args } : { name };\n}\n\nfunction splitTypeParameterList(params: string): readonly string[] {\n return params\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n}\n\nexport function createPostgresTypeMap(enumTypeNames?: ReadonlySet<string>): PslTypeMap {\n return {\n resolve(nativeType: string): PslTypeResolution {\n if (enumTypeNames?.has(nativeType)) {\n return { pslType: nativeType, nativeType };\n }\n\n const paramMatch = nativeType.match(PARAMETERIZED_TYPE_PATTERN);\n if (paramMatch) {\n const [, baseType = nativeType, params = ''] = paramMatch;\n const template = getOwnRecordValue(PARAMETERIZED_NATIVE_TYPES, baseType);\n if (template) {\n return {\n pslType: template.pslType,\n nativeType,\n typeParams: { baseType, params },\n nativeTypeAttribute: createNativeTypeAttribute(\n template.attributeName,\n splitTypeParameterList(params),\n ),\n };\n }\n }\n\n const preservedType = getOwnRecordValue(PRESERVED_NATIVE_TYPES, nativeType);\n if (preservedType) {\n return {\n pslType: preservedType.pslType,\n nativeType,\n nativeTypeAttribute: createNativeTypeAttribute(preservedType.attributeName),\n };\n }\n\n const pslType = getOwnMappingValue(POSTGRES_TO_PSL, nativeType);\n if (pslType) {\n return {\n pslType,\n nativeType,\n };\n }\n\n return { unsupported: true, nativeType };\n },\n };\n}\n\nexport function extractEnumInfo(annotations?: Record<string, unknown>): EnumInfo {\n const pgAnnotations = annotations?.['pg'] as Record<string, unknown> | undefined;\n const storageTypes = pgAnnotations?.['storageTypes'] as\n | Record<string, { codecId: string; nativeType: string; typeParams?: Record<string, unknown> }>\n | undefined;\n\n const typeNames = new Set<string>();\n const definitions = new Map<string, readonly string[]>();\n\n if (storageTypes) {\n for (const [key, typeInstance] of Object.entries(storageTypes)) {\n if (typeInstance.codecId === ENUM_CODEC_ID) {\n typeNames.add(key);\n const values = typeInstance.typeParams?.['values'];\n if (Array.isArray(values)) {\n definitions.set(key, values as string[]);\n }\n }\n }\n }\n\n return { typeNames, definitions };\n}\n\nexport function extractEnumTypeNames(annotations?: Record<string, unknown>): ReadonlySet<string> {\n return extractEnumInfo(annotations).typeNames;\n}\n\nexport function extractEnumDefinitions(\n annotations?: Record<string, unknown>,\n): ReadonlyMap<string, readonly string[]> {\n return extractEnumInfo(annotations).definitions;\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\n\nconst NEXTVAL_PATTERN = /^nextval\\s*\\(/i;\nconst NOW_FUNCTION_PATTERN = /^(now\\s*\\(\\s*\\)|CURRENT_TIMESTAMP)$/i;\nconst CLOCK_TIMESTAMP_PATTERN = /^clock_timestamp\\s*\\(\\s*\\)$/i;\nconst TIMESTAMP_CAST_SUFFIX = /::timestamp(?:tz|\\s+(?:with|without)\\s+time\\s+zone)?$/i;\nconst TEXT_CAST_SUFFIX = /::text$/i;\nconst NOW_LITERAL_PATTERN = /^'now'$/i;\nconst UUID_PATTERN = /^gen_random_uuid\\s*\\(\\s*\\)$/i;\nconst UUID_OSSP_PATTERN = /^uuid_generate_v4\\s*\\(\\s*\\)$/i;\nconst NULL_PATTERN = /^NULL(?:::.+)?$/i;\nconst TRUE_PATTERN = /^true$/i;\nconst FALSE_PATTERN = /^false$/i;\nconst NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/;\nconst JSON_CAST_SUFFIX = /::jsonb?$/i;\nconst STRING_LITERAL_PATTERN = /^'((?:[^']|'')*)'(?:::(?:\"[^\"]+\"|[\\w\\s]+)(?:\\(\\d+\\))?)?$/;\n\nfunction canonicalizeTimestampDefault(expr: string): string | undefined {\n if (NOW_FUNCTION_PATTERN.test(expr)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(expr)) return 'clock_timestamp()';\n\n if (!TIMESTAMP_CAST_SUFFIX.test(expr)) return undefined;\n\n let inner = expr.replace(TIMESTAMP_CAST_SUFFIX, '').trim();\n if (inner.startsWith('(') && inner.endsWith(')')) {\n inner = inner.slice(1, -1).trim();\n }\n\n if (NOW_FUNCTION_PATTERN.test(inner)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(inner)) return 'clock_timestamp()';\n\n inner = inner.replace(TEXT_CAST_SUFFIX, '').trim();\n if (NOW_LITERAL_PATTERN.test(inner)) return 'now()';\n\n return undefined;\n}\n\nexport function parseRawDefault(\n rawDefault: string,\n nativeType?: string,\n): ColumnDefault | undefined {\n const trimmed = rawDefault.trim();\n const normalizedType = nativeType?.toLowerCase();\n\n if (NEXTVAL_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'autoincrement()' };\n }\n\n const canonicalTimestamp = canonicalizeTimestampDefault(trimmed);\n if (canonicalTimestamp) {\n return { kind: 'function', expression: canonicalTimestamp };\n }\n\n if (UUID_PATTERN.test(trimmed) || UUID_OSSP_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'gen_random_uuid()' };\n }\n\n if (NULL_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: null };\n }\n\n if (TRUE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: true };\n }\n\n if (FALSE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: false };\n }\n\n if (NUMERIC_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: Number(trimmed) };\n }\n\n const stringMatch = trimmed.match(STRING_LITERAL_PATTERN);\n if (stringMatch?.[1] !== undefined) {\n const unescaped = stringMatch[1].replace(/''/g, \"'\");\n if (normalizedType === 'json' || normalizedType === 'jsonb') {\n if (JSON_CAST_SUFFIX.test(trimmed)) {\n return { kind: 'function', expression: trimmed };\n }\n try {\n return { kind: 'literal', value: JSON.parse(unescaped) };\n } catch {\n // Fall through to the string form for malformed/non-JSON values.\n }\n }\n return { kind: 'literal', value: unescaped };\n }\n\n return { kind: 'function', expression: trimmed };\n}\n","import type { SqlForeignKeyIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { deriveBackRelationFieldName, deriveRelationFieldName, pluralize } from './name-transforms';\nimport type { RelationField } from './printer-config';\n\nconst DEFAULT_ON_DELETE = 'noAction';\nconst DEFAULT_ON_UPDATE = 'noAction';\n\nconst REFERENTIAL_ACTION_PSL: Record<string, string> = {\n noAction: 'NoAction',\n restrict: 'Restrict',\n cascade: 'Cascade',\n setNull: 'SetNull',\n setDefault: 'SetDefault',\n};\n\nexport type InferredRelations = {\n readonly relationsByTable: ReadonlyMap<string, readonly RelationField[]>;\n};\n\nexport function inferRelations(\n tables: Record<string, SqlTableIR>,\n modelNameMap: ReadonlyMap<string, string>,\n): InferredRelations {\n const relationsByTable = new Map<string, RelationField[]>();\n\n const fkCountByPair = new Map<string, number>();\n for (const table of Object.values(tables)) {\n for (const fk of table.foreignKeys) {\n const pairKey = `${table.name}→${fk.referencedTable}`;\n fkCountByPair.set(pairKey, (fkCountByPair.get(pairKey) ?? 0) + 1);\n }\n }\n\n const usedFieldNames = new Map<string, Set<string>>();\n for (const table of Object.values(tables)) {\n const names = new Set<string>();\n for (const col of Object.values(table.columns)) {\n names.add(col.name);\n }\n usedFieldNames.set(table.name, names);\n }\n\n for (const table of Object.values(tables)) {\n for (const fk of table.foreignKeys) {\n const childTableName = table.name;\n const parentTableName = fk.referencedTable;\n const childUsed = usedFieldNames.get(childTableName) as Set<string>;\n const childModelName = modelNameMap.get(childTableName) ?? childTableName;\n const parentModelName = modelNameMap.get(parentTableName) ?? parentTableName;\n const pairKey = `${childTableName}→${parentTableName}`;\n const isSelfRelation = childTableName === parentTableName;\n const needsRelationName = (fkCountByPair.get(pairKey) as number) > 1 || isSelfRelation;\n\n const isOneToOne = detectOneToOne(fk, table);\n\n const childRelFieldName = resolveUniqueFieldName(\n deriveRelationFieldName(fk.columns, parentTableName),\n childUsed,\n parentModelName,\n );\n const relationName = needsRelationName\n ? deriveRelationName(fk, childRelFieldName, parentModelName, isSelfRelation)\n : undefined;\n const childOptional = fk.columns.some(\n (columnName) => table.columns[columnName]?.nullable ?? false,\n );\n\n const childRelField = buildChildRelationField(\n childRelFieldName,\n parentModelName,\n fk,\n childOptional,\n relationName,\n );\n\n addRelationField(relationsByTable, childTableName, childRelField);\n childUsed.add(childRelFieldName);\n\n const parentUsed = usedFieldNames.get(parentTableName) ?? new Set();\n usedFieldNames.set(parentTableName, parentUsed);\n\n const backRelFieldName = resolveUniqueFieldName(\n deriveBackRelationFieldName(childModelName, isOneToOne),\n parentUsed,\n childModelName,\n );\n\n const backRelField: RelationField = {\n fieldName: backRelFieldName,\n typeName: childModelName,\n optional: isOneToOne,\n list: !isOneToOne,\n relationName,\n };\n\n addRelationField(relationsByTable, parentTableName, backRelField);\n parentUsed.add(backRelFieldName);\n }\n }\n\n return { relationsByTable };\n}\n\nfunction detectOneToOne(fk: SqlForeignKeyIR, table: SqlTableIR): boolean {\n const fkCols = [...fk.columns].sort();\n\n if (table.primaryKey) {\n const pkCols = [...table.primaryKey.columns].sort();\n if (pkCols.length === fkCols.length && pkCols.every((c, i) => c === fkCols[i])) {\n return true;\n }\n }\n\n for (const unique of table.uniques) {\n const uniqueCols = [...unique.columns].sort();\n if (uniqueCols.length === fkCols.length && uniqueCols.every((c, i) => c === fkCols[i])) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction deriveRelationName(\n fk: SqlForeignKeyIR,\n childRelationFieldName: string,\n parentModelName: string,\n isSelfRelation: boolean,\n): string {\n if (fk.name) {\n return fk.name;\n }\n if (isSelfRelation) {\n return `${childRelationFieldName.charAt(0).toUpperCase() + childRelationFieldName.slice(1)}${pluralize(parentModelName)}`;\n }\n return fk.columns.join('_');\n}\n\nfunction buildChildRelationField(\n fieldName: string,\n parentModelName: string,\n fk: SqlForeignKeyIR,\n optional: boolean,\n relationName?: string,\n): RelationField {\n const onDelete = fk.onDelete && fk.onDelete !== DEFAULT_ON_DELETE ? fk.onDelete : undefined;\n const onUpdate = fk.onUpdate && fk.onUpdate !== DEFAULT_ON_UPDATE ? fk.onUpdate : undefined;\n\n return {\n fieldName,\n typeName: parentModelName,\n referencedTableName: fk.referencedTable,\n optional,\n list: false,\n relationName,\n fkName: fk.name,\n fields: fk.columns,\n references: fk.referencedColumns,\n onDelete: onDelete ? REFERENTIAL_ACTION_PSL[onDelete] : undefined,\n onUpdate: onUpdate ? REFERENTIAL_ACTION_PSL[onUpdate] : undefined,\n };\n}\n\nfunction resolveUniqueFieldName(\n desired: string,\n usedNames: ReadonlySet<string>,\n fallbackSuffix: string,\n): string {\n if (!usedNames.has(desired)) {\n return desired;\n }\n\n const withSuffix = `${desired}${fallbackSuffix}`;\n if (!usedNames.has(withSuffix)) {\n return withSuffix;\n }\n\n let counter = 2;\n while (usedNames.has(`${desired}${counter}`)) {\n counter++;\n }\n return `${desired}${counter}`;\n}\n\nfunction addRelationField(\n map: Map<string, RelationField[]>,\n tableName: string,\n field: RelationField,\n): void {\n const existing = map.get(tableName);\n if (existing) {\n existing.push(field);\n } else {\n map.set(tableName, [field]);\n }\n}\n","import type { ColumnDefault } from '@prisma-next/contract/types';\nimport type {\n PslAttribute,\n PslAttributeArgument,\n PslDocumentAst,\n PslEnum,\n PslField,\n PslFieldAttribute,\n PslModel,\n PslModelAttribute,\n PslNamedTypeDeclaration,\n PslSpan,\n PslTypesBlock,\n} from '@prisma-next/framework-components/psl-ast';\nimport type { SqlColumnIR, SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport type { DefaultMappingOptions } from './default-mapping';\nimport { mapDefault } from './default-mapping';\nimport { toEnumName, toFieldName, toModelName, toNamedTypeName } from './name-transforms';\nimport { createPostgresDefaultMapping } from './postgres-default-mapping';\nimport { createPostgresTypeMap, extractEnumInfo } from './postgres-type-map';\nimport type {\n EnumInfo,\n PslNativeTypeAttribute,\n PslPrinterOptions,\n PslTypeMap,\n RelationField,\n} from './printer-config';\nimport { parseRawDefault } from './raw-default-parser';\nimport { inferRelations } from './relation-inference';\n\nconst SYNTHETIC_SPAN: PslSpan = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: 0, line: 1, column: 1 },\n};\n\nconst PSL_SCALAR_TYPE_NAMES = new Set([\n 'String',\n 'Boolean',\n 'Int',\n 'BigInt',\n 'Float',\n 'Decimal',\n 'DateTime',\n 'Json',\n 'Bytes',\n]);\n\ntype ResolvedColumnFieldName = {\n readonly fieldName: string;\n readonly fieldMap?: string | undefined;\n};\n\ntype TableColumnFieldNameMap = ReadonlyMap<string, ResolvedColumnFieldName>;\n\ntype NamedTypeRegistryEntry = {\n readonly name: string;\n readonly baseType: string;\n readonly nativeTypeAttribute: PslNativeTypeAttribute;\n};\n\ntype NamedTypeRegistry = {\n readonly entriesByKey: Map<string, NamedTypeRegistryEntry>;\n readonly usedNames: Set<string>;\n};\n\ntype TopLevelNameResult = {\n readonly name: string;\n readonly map?: string | undefined;\n};\n\n/**\n * Converts a SQL schema IR into a PSL AST suitable for `printPsl`.\n *\n * This function owns all SQL-specific concerns: native type mapping (Postgres),\n * relation inference from foreign keys, enum extraction, and raw default parsing.\n * The output is a fully-formed `PslDocumentAst` with synthetic spans.\n */\nexport function sqlSchemaIrToPslAst(schemaIR: SqlSchemaIR): PslDocumentAst {\n const enumInfo = extractEnumInfo(schemaIR.annotations);\n const options: PslPrinterOptions = {\n typeMap: createPostgresTypeMap(enumInfo.typeNames),\n defaultMapping: createPostgresDefaultMapping(),\n enumInfo,\n parseRawDefault,\n };\n\n return buildPslDocumentAst(schemaIR, options);\n}\n\nfunction buildPslDocumentAst(schemaIR: SqlSchemaIR, options: PslPrinterOptions): PslDocumentAst {\n const { typeMap, defaultMapping, enumInfo, parseRawDefault: rawDefaultParser } = options;\n const emptyEnumInfo: EnumInfo = {\n typeNames: new Set<string>(),\n definitions: new Map<string, readonly string[]>(),\n };\n const { typeNames: enumTypeNames, definitions: enumDefinitions } = enumInfo ?? emptyEnumInfo;\n\n const modelNames = buildTopLevelNameMap(\n Object.keys(schemaIR.tables),\n toModelName,\n 'model',\n 'table',\n );\n const enumNames = buildTopLevelNameMap(enumTypeNames, toEnumName, 'enum', 'enum type');\n assertNoCrossKindNameCollisions(modelNames, enumNames);\n\n const modelNameMap = new Map(\n [...modelNames].map(([tableName, result]) => [tableName, result.name]),\n );\n const enumNameMap = new Map(\n [...enumNames].map(([pgTypeName, result]) => [pgTypeName, result.name]),\n );\n const reservedNamedTypeNames = createReservedNamedTypeNames(modelNames, enumNames);\n\n const fieldNamesByTable = buildFieldNamesByTable(schemaIR.tables);\n const { relationsByTable } = inferRelations(schemaIR.tables, modelNameMap);\n const namedTypes = seedNamedTypeRegistry(schemaIR, typeMap, enumNameMap, reservedNamedTypeNames);\n\n const models: PslModel[] = [];\n for (const table of Object.values(schemaIR.tables)) {\n models.push(\n buildModel(\n table,\n typeMap,\n enumNameMap,\n fieldNamesByTable,\n namedTypes,\n defaultMapping,\n rawDefaultParser,\n relationsByTable.get(table.name) ?? [],\n ),\n );\n }\n\n const sortedModels = topologicalSort(models, schemaIR.tables, modelNameMap);\n\n const enums: PslEnum[] = [];\n for (const [pgTypeName, values] of enumDefinitions) {\n const enumName = enumNames.get(pgTypeName) as TopLevelNameResult;\n enums.push(buildEnum(enumName, values));\n }\n enums.sort((a, b) => a.name.localeCompare(b.name));\n\n const namedTypeEntries = [...namedTypes.entriesByKey.values()].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n const types: PslTypesBlock | undefined =\n namedTypeEntries.length > 0\n ? {\n kind: 'types',\n declarations: namedTypeEntries.map(buildNamedTypeDeclaration),\n span: SYNTHETIC_SPAN,\n }\n : undefined;\n\n const ast: PslDocumentAst = {\n kind: 'document',\n sourceId: '<sql-schema-ir>',\n models: sortedModels,\n enums,\n compositeTypes: [],\n ...(types ? { types } : {}),\n span: SYNTHETIC_SPAN,\n };\n\n return ast;\n}\n\nfunction buildModel(\n table: SqlTableIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n namedTypes: NamedTypeRegistry,\n defaultMapping: DefaultMappingOptions | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n relationFields: readonly RelationField[],\n): PslModel {\n const { name: modelName, map: mapName } = toModelName(table.name);\n const fieldNameMap = fieldNamesByTable.get(table.name);\n\n const pkColumns = new Set(table.primaryKey?.columns ?? []);\n const isSinglePk = pkColumns.size === 1;\n const singlePkConstraintName = isSinglePk ? table.primaryKey?.name : undefined;\n\n const uniqueColumns = new Map<string, string | undefined>();\n for (const unique of table.uniques) {\n if (unique.columns.length === 1) {\n const [columnName = ''] = unique.columns;\n const existingConstraintName = uniqueColumns.get(columnName);\n if (!uniqueColumns.has(columnName) || (existingConstraintName === undefined && unique.name)) {\n uniqueColumns.set(columnName, unique.name);\n }\n }\n }\n\n const fields: PslField[] = [];\n for (const column of Object.values(table.columns)) {\n fields.push(\n buildScalarField(\n column,\n table,\n typeMap,\n enumNameMap,\n fieldNameMap,\n namedTypes,\n defaultMapping,\n rawDefaultParser,\n pkColumns,\n isSinglePk,\n singlePkConstraintName,\n uniqueColumns,\n ),\n );\n }\n\n const usedFieldNames = new Set(fields.map((field) => field.name));\n for (const rel of relationFields) {\n fields.push(buildRelationField(rel, table.name, fieldNamesByTable, usedFieldNames));\n }\n\n const modelAttributes: PslModelAttribute[] = [];\n\n if (table.primaryKey && table.primaryKey.columns.length > 1) {\n const pkFieldNames = table.primaryKey.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('id', pkFieldNames, table.primaryKey.name));\n }\n\n for (const unique of table.uniques) {\n if (unique.columns.length > 1) {\n const uniqueFieldNames = unique.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('unique', uniqueFieldNames, unique.name));\n }\n }\n\n for (const index of table.indexes) {\n if (!index.unique) {\n const indexFieldNames = index.columns.map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, table.name, columnName),\n );\n modelAttributes.push(buildModelConstraintAttribute('index', indexFieldNames, index.name));\n }\n }\n\n if (mapName) {\n modelAttributes.push(buildMapAttribute('model', mapName));\n }\n\n // Surface introspection advisory: tables without a primary key cannot serve\n // as the right-hand side of a `findUnique`-style query downstream, so the\n // user should add an `@id` policy. This warning has shipped since\n // `contract infer` was introduced and is part of the spec § A9 byte-identity\n // contract for SQL output.\n const comment = table.primaryKey\n ? undefined\n : '// WARNING: This table has no primary key in the database';\n\n return {\n kind: 'model',\n name: modelName,\n fields,\n attributes: modelAttributes,\n span: SYNTHETIC_SPAN,\n ...(comment !== undefined ? { comment } : {}),\n };\n}\n\nfunction buildScalarField(\n column: SqlColumnIR,\n table: SqlTableIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n fieldNameMap: TableColumnFieldNameMap | undefined,\n namedTypes: NamedTypeRegistry,\n defaultMapping: DefaultMappingOptions | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n pkColumns: ReadonlySet<string>,\n isSinglePk: boolean,\n singlePkConstraintName: string | undefined,\n uniqueColumns: ReadonlyMap<string, string | undefined>,\n): PslField {\n const resolvedField = fieldNameMap?.get(column.name);\n const fieldName = resolvedField?.fieldName ?? toFieldName(column.name).name;\n const fieldMap = resolvedField?.fieldMap;\n\n const resolution = typeMap.resolve(column.nativeType, table.annotations);\n\n if ('unsupported' in resolution) {\n const attrs: PslFieldAttribute[] = [];\n if (fieldMap !== undefined) {\n attrs.push(buildMapAttribute('field', fieldMap));\n }\n return {\n kind: 'field',\n name: fieldName,\n typeName: `Unsupported(\"${escapePslString(resolution.nativeType)}\")`,\n optional: column.nullable,\n list: false,\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n }\n\n let typeName = resolution.pslType;\n const enumPslName = enumNameMap.get(column.nativeType);\n if (enumPslName) {\n typeName = enumPslName;\n }\n if (resolution.nativeTypeAttribute && !enumPslName) {\n typeName = resolveNamedTypeName(namedTypes, resolution);\n }\n\n const attributes: PslFieldAttribute[] = [];\n const isId = isSinglePk && pkColumns.has(column.name);\n if (isId) {\n attributes.push(buildSimpleConstraintFieldAttribute('id', singlePkConstraintName));\n }\n\n if (column.default !== undefined) {\n const parsed = parseColumnDefault(column.default, column.nativeType, rawDefaultParser);\n if (parsed) {\n const result = mapDefault(parsed, defaultMapping);\n if ('attribute' in result) {\n attributes.push(parseDefaultAttributeString(result.attribute));\n }\n // 'comment' fallback (unrecognized raw default) is dropped — the\n // M1 legacy path emitted a `// Raw default: ...` line above the field via\n // `PrinterField.comment`. M2 drops this since it would require comment\n // nodes in the AST.\n }\n }\n\n if (uniqueColumns.has(column.name) && !isId) {\n const uniqueConstraintName = uniqueColumns.get(column.name);\n attributes.push(buildSimpleConstraintFieldAttribute('unique', uniqueConstraintName));\n }\n\n if (fieldMap !== undefined) {\n attributes.push(buildMapAttribute('field', fieldMap));\n }\n\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n optional: column.nullable,\n list: false,\n attributes,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildRelationField(\n rel: RelationField,\n hostTableName: string,\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n usedFieldNames: Set<string>,\n): PslField {\n const fieldName = createUniqueFieldName(rel.fieldName, usedFieldNames);\n usedFieldNames.add(fieldName);\n\n const args: PslAttributeArgument[] = [];\n\n if (rel.fields && rel.references) {\n if (rel.relationName) {\n args.push(namedArg('name', `\"${escapePslString(rel.relationName)}\"`));\n }\n args.push(\n namedArg(\n 'fields',\n `[${rel.fields\n .map((columnName) => resolveColumnFieldName(fieldNamesByTable, hostTableName, columnName))\n .join(', ')}]`,\n ),\n );\n args.push(\n namedArg(\n 'references',\n `[${rel.references\n .map((columnName) =>\n resolveColumnFieldName(fieldNamesByTable, rel.referencedTableName ?? '', columnName),\n )\n .join(', ')}]`,\n ),\n );\n if (rel.onDelete) {\n args.push(namedArg('onDelete', rel.onDelete));\n }\n if (rel.onUpdate) {\n args.push(namedArg('onUpdate', rel.onUpdate));\n }\n if (rel.fkName) {\n args.push(namedArg('map', `\"${escapePslString(rel.fkName)}\"`));\n }\n } else if (rel.relationName) {\n args.push(namedArg('name', `\"${escapePslString(rel.relationName)}\"`));\n }\n\n const attrs: PslFieldAttribute[] =\n args.length > 0 ? [buildAttribute('field', 'relation', args)] : [];\n\n return {\n kind: 'field',\n name: fieldName,\n typeName: rel.typeName,\n optional: rel.optional,\n list: rel.list,\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildModelConstraintAttribute(\n name: 'id' | 'unique' | 'index',\n fields: readonly string[],\n constraintName?: string,\n): PslModelAttribute {\n const args: PslAttributeArgument[] = [positionalArg(`[${fields.join(', ')}]`)];\n if (constraintName !== undefined) {\n args.push(namedArg('map', `\"${escapePslString(constraintName)}\"`));\n }\n return buildAttribute('model', name, args);\n}\n\nfunction buildSimpleConstraintFieldAttribute(\n name: 'id' | 'unique',\n constraintName: string | undefined,\n): PslFieldAttribute {\n if (constraintName === undefined) {\n return buildAttribute('field', name, []);\n }\n return buildAttribute('field', name, [namedArg('map', `\"${escapePslString(constraintName)}\"`)]);\n}\n\nfunction parseDefaultAttributeString(attributeText: string): PslFieldAttribute {\n // Strip leading \"@default(\" and trailing \")\" — `mapDefault` always returns one\n // top-level positional expression.\n const inner = attributeText.replace(/^@default\\(/, '').replace(/\\)$/, '');\n return buildAttribute('field', 'default', [positionalArg(inner)]);\n}\n\nfunction buildMapAttribute(target: 'model' | 'field' | 'enum', mapName: string): PslAttribute {\n return buildAttribute(target, 'map', [positionalArg(`\"${escapePslString(mapName)}\"`)]);\n}\n\nfunction buildAttribute(\n target: PslAttribute['target'],\n name: string,\n args: readonly PslAttributeArgument[],\n): PslAttribute {\n return {\n kind: 'attribute',\n target,\n name,\n args,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction positionalArg(value: string): PslAttributeArgument {\n return { kind: 'positional', value, span: SYNTHETIC_SPAN };\n}\n\nfunction namedArg(name: string, value: string): PslAttributeArgument {\n return { kind: 'named', name, value, span: SYNTHETIC_SPAN };\n}\n\nfunction buildEnum(name: TopLevelNameResult, values: readonly string[]): PslEnum {\n const attrs: PslAttribute[] = [];\n if (name.map) {\n attrs.push(buildMapAttribute('enum', name.map));\n }\n return {\n kind: 'enum',\n name: name.name,\n values: values.map((value) => ({\n kind: 'enumValue',\n name: value,\n span: SYNTHETIC_SPAN,\n })),\n attributes: attrs,\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction buildNamedTypeDeclaration(entry: NamedTypeRegistryEntry): PslNamedTypeDeclaration {\n const attribute = buildAttribute(\n 'namedType',\n entry.nativeTypeAttribute.name,\n (entry.nativeTypeAttribute.args ?? []).map(positionalArg),\n );\n return {\n kind: 'namedType',\n name: entry.name,\n baseType: entry.baseType,\n attributes: [attribute],\n span: SYNTHETIC_SPAN,\n };\n}\n\nfunction escapePslString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r');\n}\n\n/**\n * Resolves a `SqlColumnIR.default` value into a normalized {@link ColumnDefault}.\n *\n * `SqlSchemaIR` types the column default as `string` (a raw database default\n * expression). Some legacy fixtures and tests still pass already-normalized\n * `ColumnDefault` objects in the same slot, so we accept either shape\n * defensively at runtime.\n */\nfunction parseColumnDefault(\n value: unknown,\n nativeType: string | undefined,\n rawDefaultParser: PslPrinterOptions['parseRawDefault'],\n): ColumnDefault | undefined {\n if (typeof value === 'string') {\n return rawDefaultParser ? rawDefaultParser(value, nativeType) : undefined;\n }\n if (value !== null && typeof value === 'object' && 'kind' in (value as Record<string, unknown>)) {\n return value as ColumnDefault;\n }\n return undefined;\n}\n\nfunction buildFieldNamesByTable(\n tables: Record<string, SqlTableIR>,\n): ReadonlyMap<string, TableColumnFieldNameMap> {\n const fieldNamesByTable = new Map<string, TableColumnFieldNameMap>();\n\n for (const table of Object.values(tables)) {\n const columns = Object.values(table.columns).map((column, index) => {\n const { name, map } = toFieldName(column.name);\n return {\n columnName: column.name,\n desiredFieldName: name,\n fieldMap: map,\n index,\n };\n });\n\n const assignmentOrder = [...columns].sort((left, right) => {\n const mapComparison =\n Number(left.fieldMap !== undefined) - Number(right.fieldMap !== undefined);\n if (mapComparison !== 0) {\n return mapComparison;\n }\n return left.index - right.index;\n });\n\n const usedFieldNames = new Set<string>();\n const tableFieldNames = new Map<string, ResolvedColumnFieldName>();\n\n for (const column of assignmentOrder) {\n const fieldName = createUniqueFieldName(column.desiredFieldName, usedFieldNames);\n usedFieldNames.add(fieldName);\n tableFieldNames.set(column.columnName, {\n fieldName,\n fieldMap: column.fieldMap,\n });\n }\n\n fieldNamesByTable.set(table.name, tableFieldNames);\n }\n\n return fieldNamesByTable;\n}\n\nfunction resolveColumnFieldName(\n fieldNamesByTable: ReadonlyMap<string, TableColumnFieldNameMap>,\n tableName: string,\n columnName: string,\n): string {\n return (\n fieldNamesByTable.get(tableName)?.get(columnName)?.fieldName ?? toFieldName(columnName).name\n );\n}\n\nfunction createUniqueFieldName(desiredName: string, usedFieldNames: ReadonlySet<string>): string {\n if (!usedFieldNames.has(desiredName)) {\n return desiredName;\n }\n\n let counter = 2;\n while (usedFieldNames.has(`${desiredName}${counter}`)) {\n counter++;\n }\n return `${desiredName}${counter}`;\n}\n\nfunction buildTopLevelNameMap(\n sources: Iterable<string>,\n normalize: (source: string) => TopLevelNameResult,\n kind: 'model' | 'enum',\n sourceKind: 'table' | 'enum type',\n): Map<string, TopLevelNameResult> {\n const results = new Map<string, TopLevelNameResult>();\n const normalizedToSources = new Map<string, string[]>();\n\n for (const source of sources) {\n const normalized = normalize(source);\n results.set(source, normalized);\n normalizedToSources.set(normalized.name, [\n ...(normalizedToSources.get(normalized.name) ?? []),\n source,\n ]);\n }\n\n const duplicates = [...normalizedToSources.entries()].filter(\n ([, conflictingSources]) => conflictingSources.length > 1,\n );\n if (duplicates.length > 0) {\n const details = duplicates.map(\n ([normalizedName, conflictingSources]) =>\n `- ${kind} \"${normalizedName}\" from ${sourceKind}s ${conflictingSources\n .map((source) => `\"${source}\"`)\n .join(', ')}`,\n );\n throw new Error(`PSL ${kind} name collisions detected:\\n${details.join('\\n')}`);\n }\n\n return results;\n}\n\nfunction assertNoCrossKindNameCollisions(\n modelNames: ReadonlyMap<string, TopLevelNameResult>,\n enumNames: ReadonlyMap<string, TopLevelNameResult>,\n): void {\n const enumSourceByName = new Map([...enumNames].map(([source, result]) => [result.name, source]));\n\n const collisions = [...modelNames.entries()]\n .map(([tableName, result]) => {\n const enumSource = enumSourceByName.get(result.name);\n return enumSource\n ? `- identifier \"${result.name}\" from table \"${tableName}\" collides with enum type \"${enumSource}\"`\n : undefined;\n })\n .filter((detail): detail is string => detail !== undefined);\n\n if (collisions.length > 0) {\n throw new Error(`PSL top-level name collisions detected:\\n${collisions.join('\\n')}`);\n }\n}\n\nfunction createReservedNamedTypeNames(\n modelNames: ReadonlyMap<string, TopLevelNameResult>,\n enumNames: ReadonlyMap<string, TopLevelNameResult>,\n): Set<string> {\n const reservedNames = new Set<string>(PSL_SCALAR_TYPE_NAMES);\n\n for (const result of modelNames.values()) {\n reservedNames.add(result.name);\n }\n\n for (const result of enumNames.values()) {\n reservedNames.add(result.name);\n }\n\n return reservedNames;\n}\n\nfunction seedNamedTypeRegistry(\n schemaIR: SqlSchemaIR,\n typeMap: PslTypeMap,\n enumNameMap: ReadonlyMap<string, string>,\n reservedNames: ReadonlySet<string>,\n): NamedTypeRegistry {\n type Seed = {\n readonly baseType: string;\n readonly desiredName: string;\n readonly nativeTypeAttribute: PslNativeTypeAttribute;\n };\n\n const seeds = new Map<string, Seed>();\n\n for (const tableName of Object.keys(schemaIR.tables).sort()) {\n const table = schemaIR.tables[tableName];\n if (!table) {\n continue;\n }\n\n for (const columnName of Object.keys(table.columns).sort()) {\n const column = table.columns[columnName];\n if (!column) {\n continue;\n }\n\n const resolution = typeMap.resolve(column.nativeType, table.annotations);\n if (\n 'unsupported' in resolution ||\n enumNameMap.has(column.nativeType) ||\n !resolution.nativeTypeAttribute\n ) {\n continue;\n }\n\n const signatureKey = createNamedTypeSignatureKey(resolution);\n if (!seeds.has(signatureKey)) {\n seeds.set(signatureKey, {\n baseType: resolution.pslType,\n desiredName: toNamedTypeName(column.name),\n nativeTypeAttribute: resolution.nativeTypeAttribute,\n });\n }\n }\n }\n\n const registry: NamedTypeRegistry = {\n entriesByKey: new Map<string, NamedTypeRegistryEntry>(),\n usedNames: new Set<string>(reservedNames),\n };\n\n const sortedSeeds = [...seeds.entries()].sort((left, right) => {\n const desiredNameComparison = left[1].desiredName.localeCompare(right[1].desiredName);\n if (desiredNameComparison !== 0) {\n return desiredNameComparison;\n }\n return left[0].localeCompare(right[0]);\n });\n\n for (const [signatureKey, seed] of sortedSeeds) {\n const name = createUniqueFieldName(seed.desiredName, registry.usedNames);\n registry.entriesByKey.set(signatureKey, {\n name,\n baseType: seed.baseType,\n nativeTypeAttribute: seed.nativeTypeAttribute,\n });\n registry.usedNames.add(name);\n }\n\n return registry;\n}\n\nfunction resolveNamedTypeName(\n registry: NamedTypeRegistry,\n resolution: {\n readonly pslType: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n readonly nativeTypeAttribute?: PslNativeTypeAttribute;\n },\n): string {\n const key = createNamedTypeSignatureKey(resolution);\n const existing = registry.entriesByKey.get(key);\n if (existing) {\n return existing.name;\n }\n\n throw new Error(`Named type registry was not seeded for native type \"${resolution.nativeType}\"`);\n}\n\nfunction createNamedTypeSignatureKey(resolution: {\n readonly pslType: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n readonly nativeTypeAttribute?: PslNativeTypeAttribute;\n}): string {\n return JSON.stringify({\n baseType: resolution.pslType,\n nativeTypeAttribute: resolution.nativeTypeAttribute\n ? {\n name: resolution.nativeTypeAttribute.name,\n args: resolution.nativeTypeAttribute.args ?? null,\n }\n : null,\n });\n}\n\nfunction topologicalSort(\n models: PslModel[],\n tables: Record<string, SqlTableIR>,\n modelNameMap: ReadonlyMap<string, string>,\n): PslModel[] {\n const modelByName = new Map<string, PslModel>();\n for (const model of models) {\n modelByName.set(model.name, model);\n }\n\n const deps = new Map<string, Set<string>>();\n const tableToModel = new Map<string, string>();\n for (const tableName of Object.keys(tables)) {\n const modelName = modelNameMap.get(tableName) as string;\n tableToModel.set(tableName, modelName);\n deps.set(modelName, new Set());\n }\n\n for (const [tableName, table] of Object.entries(tables)) {\n const modelName = tableToModel.get(tableName) as string;\n for (const fk of table.foreignKeys) {\n const refModelName = tableToModel.get(fk.referencedTable);\n if (refModelName && refModelName !== modelName) {\n (deps.get(modelName) as Set<string>).add(refModelName);\n }\n }\n }\n\n const result: PslModel[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const sortedNames = [...deps.keys()].sort();\n\n function visit(name: string): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) return;\n visiting.add(name);\n\n const sortedDeps = [...(deps.get(name) as Set<string>)].sort();\n for (const dep of sortedDeps) {\n visit(dep);\n }\n\n visiting.delete(name);\n visited.add(name);\n result.push(modelByName.get(name) as PslModel);\n }\n\n for (const name of sortedNames) {\n visit(name);\n }\n\n return result;\n}\n","import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n MigrationPlanOperation,\n OperationContext,\n OperationPreview,\n OperationPreviewCapable,\n PslContractInferCapable,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { PslDocumentAst } from '@prisma-next/framework-components/psl-ast';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { sqlOperationsToPreview } from './operation-preview';\nimport { sqlSchemaIrToPslAst } from './psl-contract-infer/sql-schema-ir-to-psl-ast';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n PslContractInferCapable<SqlSchemaIR>,\n OperationPreviewCapable,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n\n inferPslContract(schemaIR: SqlSchemaIR): PslDocumentAst;\n\n toOperationPreview(operations: readonly MigrationPlanOperation[]): OperationPreview;\n}\n\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\nfunction isSqlControlAdapter<TTargetId extends string>(\n value: unknown,\n): value is SqlControlAdapter<TTargetId> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'introspect' in value &&\n typeof (value as { introspect: unknown }).introspect === 'function' &&\n 'readMarker' in value &&\n typeof (value as { readMarker: unknown }).readMarker === 'function'\n );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n // Family-instance methods accept `ControlDriverInstance<'sql', string>` —\n // the family API isn't generic on the target id. Letting `isSqlControlAdapter`\n // default its type parameter narrows the adapter to `SqlControlAdapter<string>`,\n // which matches the family-level driver type without any cast at call sites.\n const getControlAdapter = () => {\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error(\n 'Adapter does not implement SqlControlAdapter (missing introspect or readMarker)',\n );\n }\n return controlAdapter;\n };\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await getControlAdapter().readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = getControlAdapter();\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await getControlAdapter().readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return getControlAdapter().readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n return getControlAdapter().introspect(options.driver, options.contract);\n },\n\n inferPslContract(schemaIR: SqlSchemaIR): PslDocumentAst {\n return sqlSchemaIrToPslAst(schemaIR);\n },\n\n toOperationPreview(operations: readonly MigrationPlanOperation[]): OperationPreview {\n return sqlOperationsToPreview(operations);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n providedInvariants: Object.freeze([...options.providedInvariants]),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|