@prisma-next/family-sql 0.8.0-dev.9 → 0.9.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/control.d.mts +1 -1
- package/dist/control.mjs +2 -2
- package/dist/control.mjs.map +1 -1
- package/dist/ir.d.mts +1 -1
- package/dist/ir.mjs +1 -1
- package/dist/migration.d.mts +1 -1
- package/dist/{sql-contract-serializer-ayJ5Radj.mjs → sql-contract-serializer-qUQCnP-k.mjs} +2 -2
- package/dist/sql-contract-serializer-qUQCnP-k.mjs.map +1 -0
- package/dist/{types-CA8h-8mQ.d.mts → types-DMINfGUO.d.mts} +11 -3
- package/dist/types-DMINfGUO.d.mts.map +1 -0
- package/package.json +21 -21
- package/src/core/control-instance.ts +10 -2
- package/src/core/ir/sql-contract-serializer-base.ts +1 -1
- package/src/core/migrations/types.ts +1 -1
- package/dist/sql-contract-serializer-ayJ5Radj.mjs.map +0 -1
- package/dist/types-CA8h-8mQ.d.mts.map +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ Provides the SQL family descriptor (`ControlFamilyDescriptor`) that includes:
|
|
|
11
11
|
## Responsibilities
|
|
12
12
|
|
|
13
13
|
- **Family Descriptor Export**: Exports the SQL `ControlFamilyDescriptor` for use in CLI configuration files
|
|
14
|
-
- **Family Instance Creation**: Creates `SqlFamilyInstance` objects that implement control-plane domain actions (`verify`, `schemaVerify`, `introspect`, `emitContract`, `
|
|
14
|
+
- **Family Instance Creation**: Creates `SqlFamilyInstance` objects that implement control-plane domain actions (`verify`, `schemaVerify`, `introspect`, `emitContract`, `deserializeContract`)
|
|
15
15
|
- **Planner & Runner SPI**: Owns the `MigrationPlanner` / `MigrationRunner` interfaces plus the `SqlControlTargetDescriptor` helper so targets can expose planners and runners (e.g., Postgres init planner/runner)
|
|
16
16
|
- **Family Hook Integration**: Integrates the SQL target family hook (`sqlEmission`) from `@prisma-next/sql-contract-emitter`
|
|
17
17
|
- **Control Plane Entry Point**: Serves as the control plane entry point for the SQL family, enabling the CLI to select the family hook and create family instances
|
|
@@ -51,7 +51,7 @@ const stack = createControlStack({
|
|
|
51
51
|
const familyInstance = sql.create(stack);
|
|
52
52
|
|
|
53
53
|
// Use instance methods for domain actions
|
|
54
|
-
const contract = familyInstance.
|
|
54
|
+
const contract = familyInstance.deserializeContract(contractJson);
|
|
55
55
|
const verifyResult = await familyInstance.verify({ driver, contract, ... });
|
|
56
56
|
|
|
57
57
|
// Targets that implement SqlControlTargetDescriptor can build planners
|
|
@@ -96,7 +96,7 @@ The framework CLI uses this descriptor to:
|
|
|
96
96
|
1. Create family instances for control-plane operations (via `create()`)
|
|
97
97
|
|
|
98
98
|
Family instances implement domain actions:
|
|
99
|
-
- **`
|
|
99
|
+
- **`deserializeContract(contractJson)`**: Validates and normalizes contract, returns `Contract` without mappings
|
|
100
100
|
- **`verify()`**: Verifies database marker against contract (compares target, storageHash, profileHash)
|
|
101
101
|
- **`schemaVerify()`**: Verifies database schema against contract (compares contract requirements vs live schema)
|
|
102
102
|
- **`introspect()`**: Introspects database schema and returns `SqlSchemaIR`
|
|
@@ -108,7 +108,7 @@ The descriptor is "pure data + factory" - it only provides the hook and factory
|
|
|
108
108
|
## Package Structure
|
|
109
109
|
|
|
110
110
|
- **`src/core/control-descriptor.ts`**: `SqlFamilyDescriptor` class implementing `ControlFamilyDescriptor` interface (pure data + factory)
|
|
111
|
-
- **`src/core/control-instance.ts`**: `createSqlFamilyInstance` function that creates `SqlFamilyInstance` with domain action methods (`
|
|
111
|
+
- **`src/core/control-instance.ts`**: `createSqlFamilyInstance` function that creates `SqlFamilyInstance` with domain action methods (`deserializeContract`, `verify`, `schemaVerify`, `introspect`, `toSchemaView`, `emitContract`). Contains `convertOperationManifest` function used internally by instance creation and test utilities in the same package.
|
|
112
112
|
- **`src/core/assembly.ts`**: Assembly helpers for extracting type imports, collecting codec-owned storage type control hooks, and composing mutation-default registries with duplicate detection.
|
|
113
113
|
- **`src/core/verify.ts`**: Verification helpers (`parseContractMarkerRow`, `collectSupportedCodecTypeIds`)
|
|
114
114
|
- **`src/core/control-adapter.ts`**: SQL control adapter interface (`SqlControlAdapter`) for control-plane operations
|
|
@@ -140,7 +140,7 @@ The runner returns structured errors with the following codes:
|
|
|
140
140
|
|
|
141
141
|
- **`@prisma-next/framework-components`**: Control plane types via `./control` (`ControlFamilyDescriptor`, `ControlTargetDescriptor`, `ControlAdapterDescriptor`, `ControlDriverDescriptor`, `ControlExtensionDescriptor`, `ControlDriverInstance`, etc.)
|
|
142
142
|
- **`@prisma-next/sql-contract-emitter`**: SQL target family hook (`sqlEmission`)
|
|
143
|
-
- **`@prisma-next/sql-contract`**: SQL contract types plus validation (`
|
|
143
|
+
- **`@prisma-next/sql-contract`**: SQL contract types plus validation primitives (`validateSqlContractFully`, consumed by the family serializer base)
|
|
144
144
|
- **`@prisma-next/sql-operations`**: SQL operation registry types (`SqlOperationEntry`, `SqlOperationRegistry`)
|
|
145
145
|
|
|
146
146
|
**Dependents:**
|
package/dist/control.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as SqlPlannerConflictKind, C as SqlMigrationRunnerExecuteCallbacks, D as SqlMigrationRunnerSuccessValue, E as SqlMigrationRunnerResult, F as StorageTypePlanResult, I as SqlControlFamilyInstance, M as SqlPlannerFailureResult, N as SqlPlannerResult, O as SqlPlanTargetDetails, P as SqlPlannerSuccessResult, S as SqlMigrationRunnerErrorCode, T as SqlMigrationRunnerFailure, _ as SqlMigrationPlanOperationStep, a as FieldEvent, b as SqlMigrationPlannerPlanOptions, c as MultiSpaceRunnerResult, d as SqlControlAdapterDescriptor, f as SqlControlExtensionDescriptor, g as SqlMigrationPlanOperation, h as SqlMigrationPlanContractInfo, i as ExpandNativeTypeInput, j as SqlPlannerConflictLocation, k as SqlPlannerConflict, l as MultiSpaceRunnerSuccessValue, m as SqlMigrationPlan, n as CodecControlHooks, o as FieldEventContext, p as SqlControlTargetDescriptor, r as CreateSqlMigrationPlanOptions, s as MultiSpaceRunnerFailure, t as AnyRecord, u as ResolveIdentityValueInput, v as SqlMigrationPlanOperationTarget, w as SqlMigrationRunnerExecuteOptions, x as SqlMigrationRunner, y as SqlMigrationPlanner } from "./types-
|
|
1
|
+
import { A as SqlPlannerConflictKind, C as SqlMigrationRunnerExecuteCallbacks, D as SqlMigrationRunnerSuccessValue, E as SqlMigrationRunnerResult, F as StorageTypePlanResult, I as SqlControlFamilyInstance, M as SqlPlannerFailureResult, N as SqlPlannerResult, O as SqlPlanTargetDetails, P as SqlPlannerSuccessResult, S as SqlMigrationRunnerErrorCode, T as SqlMigrationRunnerFailure, _ as SqlMigrationPlanOperationStep, a as FieldEvent, b as SqlMigrationPlannerPlanOptions, c as MultiSpaceRunnerResult, d as SqlControlAdapterDescriptor, f as SqlControlExtensionDescriptor, g as SqlMigrationPlanOperation, h as SqlMigrationPlanContractInfo, i as ExpandNativeTypeInput, j as SqlPlannerConflictLocation, k as SqlPlannerConflict, l as MultiSpaceRunnerSuccessValue, m as SqlMigrationPlan, n as CodecControlHooks, o as FieldEventContext, p as SqlControlTargetDescriptor, r as CreateSqlMigrationPlanOptions, s as MultiSpaceRunnerFailure, t as AnyRecord, u as ResolveIdentityValueInput, v as SqlMigrationPlanOperationTarget, w as SqlMigrationRunnerExecuteOptions, x as SqlMigrationRunner, y as SqlMigrationPlanner } from "./types-DMINfGUO.mjs";
|
|
2
2
|
import { ControlFamilyDescriptor, ControlStack, MigrationOperationClass, MigrationOperationPolicy, MigrationOperationPolicy as MigrationOperationPolicy$1, MigrationPlan, MigrationPlanOperation, MigrationPlanner, MigrationPlannerConflict, MigrationPlannerConflict as MigrationPlannerConflict$1, MigrationPlannerResult, MutationDefaultGeneratorDescriptor, OpFactoryCall, TargetMigrationsCapability, assembleAuthoringContributions } from "@prisma-next/framework-components/control";
|
|
3
3
|
import { SqlStorage, StorageColumn } from "@prisma-next/sql-contract/types";
|
|
4
4
|
import { NotOk, Ok } from "@prisma-next/utils/result";
|
package/dist/control.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as sqlFamilyAuthoringFieldPresets, t as sqlFamilyAuthoringTypes } from "./authoring-type-constructors-F4JpCJl7.mjs";
|
|
2
|
-
import { t as SqlContractSerializer } from "./sql-contract-serializer-
|
|
2
|
+
import { t as SqlContractSerializer } from "./sql-contract-serializer-qUQCnP-k.mjs";
|
|
3
3
|
import { a as extractCodecControlHooks, t as verifySqlSchema } from "./verify-sql-schema-BXw7yx6L.mjs";
|
|
4
4
|
import { t as collectSupportedCodecTypeIds } from "./verify-Crewz6hG.mjs";
|
|
5
5
|
import { n as temporalAuthoringPresets, r as timestampNowControlDescriptor } from "./timestamp-now-generator-r7BP5n3l.mjs";
|
|
@@ -1106,7 +1106,7 @@ function createSqlFamilyInstance(stack) {
|
|
|
1106
1106
|
codecTypeImports,
|
|
1107
1107
|
extensionIds,
|
|
1108
1108
|
typeMetadataRegistry,
|
|
1109
|
-
|
|
1109
|
+
deserializeContract(contractJson) {
|
|
1110
1110
|
return deserializeWithTargetSerializer(contractJson);
|
|
1111
1111
|
},
|
|
1112
1112
|
async verify(verifyOptions) {
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":[],"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/field-event-planner.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 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 OperationPreview,\n OperationPreviewCapable,\n PslContractInferCapable,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n APP_SPACE_ID,\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 { assertDescriptorSelfConsistency } from '@prisma-next/migration-tools/spaces';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n LoweredStatement,\n LowererContext,\n} from '@prisma-next/sql-relational-core/ast';\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 { SqlContractSerializer } from './ir/sql-contract-serializer';\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 extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\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 /**\n * Verify a contract against an already-introspected schema slice.\n *\n * Callers that need to verify against the live database compose\n * `introspect({ driver })` + `verifySchema({ contract, schema, ... })`.\n * The aggregate verifier projects each member's claimed slice via\n * `projectSchemaToSpace` and hands the projected slice in — this\n * keeps per-member verification from surfacing sibling-space tables\n * as `extras`.\n */\n verifySchema(options: {\n readonly contract: unknown;\n readonly schema: SqlSchemaIR;\n readonly strict: boolean;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n }): 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 lowerAst(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;\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 'readAllMarkers' in value &&\n typeof (value as { readAllMarkers: unknown }).readAllMarkers === 'function' &&\n 'lower' in value &&\n typeof (value as { lower: unknown }).lower === '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 // Descriptor self-consistency check.\n // Each extension that exposes a `contractSpace` must publish a\n // `headRef.hash` that matches the canonical hash recomputed from its\n // `contractJson`. A stale value would silently corrupt every downstream\n // boundary that trusts `headRef.hash` as the canonical identity (drift\n // detection, on-disk artefact emission, runner marker writes). Failing\n // fast at descriptor-load time turns \"extension author shipped an\n // inconsistent descriptor\" into an explicit, actionable error\n // (`MIGRATION.DESCRIPTOR_HEAD_HASH_MISMATCH`) rather than a confusing\n // mismatch surfacing several layers downstream.\n for (const extension of extensions) {\n if (extension.contractSpace) {\n const { contractJson, headRef } = extension.contractSpace;\n assertDescriptorSelfConsistency({\n extensionId: extension.id,\n target: contractJson.target,\n targetFamily: contractJson.targetFamily,\n storage: contractJson.storage,\n headRefHash: headRef.hash,\n });\n }\n }\n\n const { codecTypeImports, 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, readMarker, or readAllMarkers)',\n );\n }\n return controlAdapter;\n };\n\n const targetSerializer = (\n target as unknown as {\n contractSerializer?: { deserializeContract(json: unknown): Contract<SqlStorage> };\n }\n ).contractSerializer;\n const deserializeWithTargetSerializer = (contractJson: unknown): Contract<SqlStorage> => {\n const serializer = targetSerializer ?? new SqlContractSerializer();\n return serializer.deserializeContract(contractJson) as Contract<SqlStorage>;\n };\n\n return {\n familyId: 'sql',\n codecTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return deserializeWithTargetSerializer(contractJson);\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 = deserializeWithTargetSerializer(rawContract) as Contract<SqlStorage>;\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, APP_SPACE_ID);\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 verifySchema(options: {\n readonly contract: unknown;\n readonly schema: SqlSchemaIR;\n readonly strict: boolean;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n }): VerifyDatabaseSchemaResult {\n const contract = deserializeWithTargetSerializer(options.contract) as Contract<SqlStorage>;\n const controlAdapter = getControlAdapter();\n return verifySqlSchema({\n contract,\n schema: options.schema,\n strict: options.strict,\n typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n ...ifDefined('resolveExistingEnumValues', controlAdapter.resolveExistingEnumValues),\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 = deserializeWithTargetSerializer(contractInput) as Contract<SqlStorage>;\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, APP_SPACE_ID);\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 space: APP_SPACE_ID,\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 space: APP_SPACE_ID,\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 readonly space: string;\n }): Promise<ContractMarkerRecord | null> {\n return getControlAdapter().readMarker(options.driver, options.space);\n },\n async readAllMarkers(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n return getControlAdapter().readAllMarkers(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 lowerAst(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement {\n return getControlAdapter().lower(ast, context);\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 return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(tableNodes.length > 0 ? { children: tableNodes } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\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: EmissionSpi = 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 { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport {\n type ForeignKey,\n type Index,\n isPostgresEnumStorageEntry,\n isStorageTypeInstance,\n type PostgresEnumStorageEntry,\n type SqlStorage,\n type StorageColumn,\n type StorageTable,\n type StorageTypeInstance,\n toStorageTypeInstance,\n type UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\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';\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: ResolvedStorageTypes,\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\n/**\n * `storageTypes` is polymorphic per Decision 18 (Option B) — codec-typed\n * entries match `StorageTypeInstance`; enum entries match the structural\n * `PostgresEnumStorageEntry` shape (Postgres-only; cross-domain layering\n * keeps target IR classes out of the family layer). Both shapes resolve\n * into the same `(codecId, nativeType, typeParams)` triplet at the\n * column-resolution boundary so downstream walks stay uniform.\n */\ntype ResolvedStorageTypes = Readonly<\n Record<string, StorageTypeInstance | PostgresEnumStorageEntry>\n>;\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: ResolvedStorageTypes,\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 if (isPostgresEnumStorageEntry(referenced)) {\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: { values: referenced.values } as Record<string, unknown>,\n };\n }\n if (isStorageTypeInstance(referenced)) {\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n }\n throw new Error(\n `Storage type \"${column.typeRef}\" has an unknown polymorphic kind; expected codec-instance or postgres-enum.`,\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: ResolvedStorageTypes,\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}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables and `contract.storage.types` for type\n * annotations. Storage-type annotations are written under\n * `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: {} };\n }\n\n const storage = contract.storage;\n const storageTypes = (storage.types ?? {}) as ResolvedStorageTypes;\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 annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n const types = storage.types as ResolvedStorageTypes | undefined;\n if (!types || Object.keys(types).length === 0) return undefined;\n // Re-key by nativeType, normalising every variant to the codec-typed\n // annotation shape `{codecId, nativeType, typeParams}` produced by the\n // adapter introspector (`introspectPostgresEnumTypes` writes that shape;\n // see also `enum-planning.ts § readExistingEnumValues`, which reads\n // `existing.codecId` + `existing.typeParams.values`). Without this\n // normalisation, the projector would emit the raw\n // `PostgresEnumStorageEntry` shape (top-level `values`, no `typeParams`)\n // and downstream Schema IR consumers that walk the codec-typed shape\n // would see enum entries as new (e.g. the planner emits a fresh\n // `CreateEnumTypeCall` instead of the rebuild recipe). Unknown future\n // kinds without `nativeType` are skipped rather than crashing.\n const byNativeType: Record<string, StorageTypeInstance> = {};\n for (const typeInstance of Object.values(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n byNativeType[typeInstance.nativeType] = toStorageTypeInstance({\n codecId: typeInstance.codecId,\n nativeType: typeInstance.nativeType,\n typeParams: { values: typeInstance.values },\n });\n continue;\n }\n if (isStorageTypeInstance(typeInstance)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","/**\n * Codec lifecycle hook planner — runs `onFieldEvent` for every per-field\n * delta between two contracts and concatenates the returned ops in a\n * deterministic order.\n *\n * Wired by each target's planner (`PostgresMigrationPlanner`,\n * `SqliteMigrationPlanner`) so codec-emitted ops are inlined alongside\n * structural DDL in the app-space migration's `ops.json`. Pure, target-\n * agnostic, and only ever invoked at the app-space emitter; extension-space\n * planning never reaches this helper.\n *\n * Ordering rules (see ADR 213):\n *\n * - Events are grouped by phase: `'added'` → `'dropped'` → `'altered'`.\n * - Within each phase, entries are sorted alphabetically by\n * `(tableName, fieldName)`.\n * - The hook's returned ops are appended in the order the hook returned them.\n *\n * `'altered'` is suppressed when only `codecId` differs (codec rotation is a\n * v1 non-goal).\n *\n * See: `docs/architecture docs/adrs/ADR 213 - Codec lifecycle hooks.md`.\n */\n\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { OpFactoryCall } from '@prisma-next/framework-components/control';\nimport type { SqlStorage, StorageColumn, StorageTable } from '@prisma-next/sql-contract/types';\nimport type { CodecControlHooks, FieldEvent, FieldEventContext } from './types';\n\nexport interface PlanFieldEventOperationsOptions {\n /**\n * Prior contract the planner is diffing against. `null` for first emits\n * (every field is treated as added).\n */\n readonly priorContract: Contract<SqlStorage> | null;\n /**\n * New contract the user just authored.\n */\n readonly newContract: Contract<SqlStorage>;\n /**\n * Codec-id keyed map of control hooks, as produced by\n * {@link import('./assembly').extractCodecControlHooks}. Hooks carry\n * `unknown` target details after extraction; the caller casts the\n * helper's returned ops to its target's `SqlMigrationPlanOperation`\n * specialisation at the integration boundary, mirroring how\n * `storageTypePlanCallStrategy` lifts `planTypeOperations` results into\n * `RawSqlCall`.\n */\n readonly codecHooks: ReadonlyMap<string, CodecControlHooks>;\n}\n\ninterface FieldEntry {\n readonly tableName: string;\n readonly fieldName: string;\n readonly priorTable: StorageTable | undefined;\n readonly newTable: StorageTable | undefined;\n readonly priorField: StorageColumn | undefined;\n readonly newField: StorageColumn | undefined;\n}\n\nexport function planFieldEventOperations(\n options: PlanFieldEventOperationsOptions,\n): readonly OpFactoryCall[] {\n const priorTables = options.priorContract?.storage.tables ?? {};\n const newTables = options.newContract.storage.tables;\n\n const added: FieldEntry[] = [];\n const dropped: FieldEntry[] = [];\n const altered: FieldEntry[] = [];\n\n const tableNames = unionSorted(Object.keys(priorTables), Object.keys(newTables));\n for (const tableName of tableNames) {\n const priorTable = priorTables[tableName];\n const newTable = newTables[tableName];\n const fieldNames = unionSorted(\n priorTable ? Object.keys(priorTable.columns) : [],\n newTable ? Object.keys(newTable.columns) : [],\n );\n for (const fieldName of fieldNames) {\n const priorField = priorTable?.columns[fieldName];\n const newField = newTable?.columns[fieldName];\n const entry: FieldEntry = {\n tableName,\n fieldName,\n priorTable,\n newTable,\n priorField,\n newField,\n };\n if (priorField === undefined && newField !== undefined) {\n added.push(entry);\n } else if (priorField !== undefined && newField === undefined) {\n dropped.push(entry);\n } else if (priorField !== undefined && newField !== undefined) {\n if (isAlteration(priorField, newField)) altered.push(entry);\n }\n }\n }\n\n const calls: OpFactoryCall[] = [];\n appendCalls('added', added, options.codecHooks, calls, (e) => e.newField?.codecId);\n appendCalls('dropped', dropped, options.codecHooks, calls, (e) => e.priorField?.codecId);\n appendCalls('altered', altered, options.codecHooks, calls, (e) => e.newField?.codecId);\n return calls;\n}\n\nfunction appendCalls(\n event: FieldEvent,\n entries: readonly FieldEntry[],\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n calls: OpFactoryCall[],\n pickCodecId: (entry: FieldEntry) => string | undefined,\n): void {\n for (const entry of entries) {\n const codecId = pickCodecId(entry);\n if (codecId === undefined) continue;\n const hook = codecHooks.get(codecId);\n if (!hook?.onFieldEvent) continue;\n const ctx = buildContext(event, entry);\n const emitted = hook.onFieldEvent(event, ctx);\n for (const call of emitted) calls.push(call);\n }\n}\n\n/**\n * The context's prior/new sides are scoped to the event:\n *\n * - `'added'` — only `newTable` / `newField` populated.\n * - `'dropped'` — only `priorTable` / `priorField` populated.\n * - `'altered'` — both sides populated.\n */\nfunction buildContext(event: FieldEvent, entry: FieldEntry): FieldEventContext {\n const base = { tableName: entry.tableName, fieldName: entry.fieldName };\n if (event === 'added') {\n return {\n ...base,\n ...(entry.newTable !== undefined ? { newTable: entry.newTable } : {}),\n ...(entry.newField !== undefined ? { newField: entry.newField } : {}),\n };\n }\n if (event === 'dropped') {\n return {\n ...base,\n ...(entry.priorTable !== undefined ? { priorTable: entry.priorTable } : {}),\n ...(entry.priorField !== undefined ? { priorField: entry.priorField } : {}),\n };\n }\n return {\n ...base,\n ...(entry.priorTable !== undefined ? { priorTable: entry.priorTable } : {}),\n ...(entry.newTable !== undefined ? { newTable: entry.newTable } : {}),\n ...(entry.priorField !== undefined ? { priorField: entry.priorField } : {}),\n ...(entry.newField !== undefined ? { newField: entry.newField } : {}),\n };\n}\n\n/**\n * `'altered'` predicate. Returns `false` whenever `codecId` differs —\n * any codec change suppresses the `altered` event entirely, including\n * cases where another property also differs in the same diff. Codec\n * rotation is a v1 non-goal; avoiding the mixed event keeps the\n * migration semantics for codec changes explicit rather than smuggling\n * them through as `altered`.\n *\n * For non-`codecId` diffs, returns `true` iff any other column property\n * differs.\n */\nfunction isAlteration(prior: StorageColumn, current: StorageColumn): boolean {\n if (prior.codecId !== current.codecId) return false;\n return !sameStorageColumn(prior, current);\n}\n\nfunction sameStorageColumn(a: StorageColumn, b: StorageColumn): boolean {\n if (a === b) return true;\n if (a.nativeType !== b.nativeType) return false;\n if (a.nullable !== b.nullable) return false;\n if (a.typeRef !== b.typeRef) return false;\n if (!sameJson(a.typeParams, b.typeParams)) return false;\n if (!sameJson(a.default, b.default)) return false;\n return true;\n}\n\nfunction sameJson(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction unionSorted(a: readonly string[], b: readonly string[]): readonly string[] {\n const set = new Set<string>();\n for (const name of a) set.add(name);\n for (const name of b) set.add(name);\n return [...set].sort((x, y) => (x < y ? -1 : x > y ? 1 : 0));\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.params ? { params: Object.freeze([...step.params]) } : {}),\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 ...(operation.invariantId ? { invariantId: operation.invariantId } : {}),\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 spaceId: options.spaceId,\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 { 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 type { PlanFieldEventOperationsOptions } from '../core/migrations/field-event-planner';\nexport { planFieldEventOperations } from '../core/migrations/field-event-planner';\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 CodecControlHooks,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n FieldEvent,\n FieldEventContext,\n MultiSpaceRunnerFailure,\n MultiSpaceRunnerResult,\n MultiSpaceRunnerSuccessValue,\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 {\n temporalAuthoringPresets,\n timestampNowControlDescriptor,\n} from '../core/timestamp-now-generator';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":[],"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/field-event-planner.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 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 OperationPreview,\n OperationPreviewCapable,\n PslContractInferCapable,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n APP_SPACE_ID,\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 { assertDescriptorSelfConsistency } from '@prisma-next/migration-tools/spaces';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n AnyQueryAst,\n LoweredStatement,\n LowererContext,\n} from '@prisma-next/sql-relational-core/ast';\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 { SqlContractSerializer } from './ir/sql-contract-serializer';\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 extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n PslContractInferCapable<SqlSchemaIR>,\n OperationPreviewCapable,\n SqlFamilyInstanceState {\n /**\n * The family seam-of-record for on-disk contract reads. Structurally\n * validates the JSON envelope, then hydrates IR-class instances via\n * the per-target ContractSerializer. The single named entry point\n * every CLI on-disk read crosses (TML-2536) — `as Contract` casts\n * in production package sources are a serializer-bypass smell guarded\n * by `pnpm lint:no-contract-cast`.\n */\n deserializeContract(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 /**\n * Verify a contract against an already-introspected schema slice.\n *\n * Callers that need to verify against the live database compose\n * `introspect({ driver })` + `verifySchema({ contract, schema, ... })`.\n * The aggregate verifier projects each member's claimed slice via\n * `projectSchemaToSpace` and hands the projected slice in — this\n * keeps per-member verification from surfacing sibling-space tables\n * as `extras`.\n */\n verifySchema(options: {\n readonly contract: unknown;\n readonly schema: SqlSchemaIR;\n readonly strict: boolean;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n }): 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 lowerAst(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;\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 'readAllMarkers' in value &&\n typeof (value as { readAllMarkers: unknown }).readAllMarkers === 'function' &&\n 'lower' in value &&\n typeof (value as { lower: unknown }).lower === '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 // Descriptor self-consistency check.\n // Each extension that exposes a `contractSpace` must publish a\n // `headRef.hash` that matches the canonical hash recomputed from its\n // `contractJson`. A stale value would silently corrupt every downstream\n // boundary that trusts `headRef.hash` as the canonical identity (drift\n // detection, on-disk artefact emission, runner marker writes). Failing\n // fast at descriptor-load time turns \"extension author shipped an\n // inconsistent descriptor\" into an explicit, actionable error\n // (`MIGRATION.DESCRIPTOR_HEAD_HASH_MISMATCH`) rather than a confusing\n // mismatch surfacing several layers downstream.\n for (const extension of extensions) {\n if (extension.contractSpace) {\n const { contractJson, headRef } = extension.contractSpace;\n assertDescriptorSelfConsistency({\n extensionId: extension.id,\n target: contractJson.target,\n targetFamily: contractJson.targetFamily,\n storage: contractJson.storage,\n headRefHash: headRef.hash,\n });\n }\n }\n\n const { codecTypeImports, 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, readMarker, or readAllMarkers)',\n );\n }\n return controlAdapter;\n };\n\n const targetSerializer = (\n target as unknown as {\n contractSerializer?: { deserializeContract(json: unknown): Contract<SqlStorage> };\n }\n ).contractSerializer;\n const deserializeWithTargetSerializer = (contractJson: unknown): Contract<SqlStorage> => {\n const serializer = targetSerializer ?? new SqlContractSerializer();\n return serializer.deserializeContract(contractJson) as Contract<SqlStorage>;\n };\n\n return {\n familyId: 'sql',\n codecTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n deserializeContract(contractJson: unknown): Contract {\n return deserializeWithTargetSerializer(contractJson);\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 = deserializeWithTargetSerializer(rawContract) as Contract<SqlStorage>;\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, APP_SPACE_ID);\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 verifySchema(options: {\n readonly contract: unknown;\n readonly schema: SqlSchemaIR;\n readonly strict: boolean;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n }): VerifyDatabaseSchemaResult {\n const contract = deserializeWithTargetSerializer(options.contract) as Contract<SqlStorage>;\n const controlAdapter = getControlAdapter();\n return verifySqlSchema({\n contract,\n schema: options.schema,\n strict: options.strict,\n typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n ...ifDefined('resolveExistingEnumValues', controlAdapter.resolveExistingEnumValues),\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 = deserializeWithTargetSerializer(contractInput) as Contract<SqlStorage>;\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, APP_SPACE_ID);\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 space: APP_SPACE_ID,\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 space: APP_SPACE_ID,\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 readonly space: string;\n }): Promise<ContractMarkerRecord | null> {\n return getControlAdapter().readMarker(options.driver, options.space);\n },\n async readAllMarkers(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n return getControlAdapter().readAllMarkers(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 lowerAst(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement {\n return getControlAdapter().lower(ast, context);\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 return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(tableNodes.length > 0 ? { children: tableNodes } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport type { EmissionSpi } from '@prisma-next/framework-components/emission';\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: EmissionSpi = 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 { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport {\n type ForeignKey,\n type Index,\n isPostgresEnumStorageEntry,\n isStorageTypeInstance,\n type PostgresEnumStorageEntry,\n type SqlStorage,\n type StorageColumn,\n type StorageTable,\n type StorageTypeInstance,\n toStorageTypeInstance,\n type UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\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';\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: ResolvedStorageTypes,\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\n/**\n * `storageTypes` is polymorphic per Decision 18 (Option B) — codec-typed\n * entries match `StorageTypeInstance`; enum entries match the structural\n * `PostgresEnumStorageEntry` shape (Postgres-only; cross-domain layering\n * keeps target IR classes out of the family layer). Both shapes resolve\n * into the same `(codecId, nativeType, typeParams)` triplet at the\n * column-resolution boundary so downstream walks stay uniform.\n */\ntype ResolvedStorageTypes = Readonly<\n Record<string, StorageTypeInstance | PostgresEnumStorageEntry>\n>;\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: ResolvedStorageTypes,\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 if (isPostgresEnumStorageEntry(referenced)) {\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: { values: referenced.values } as Record<string, unknown>,\n };\n }\n if (isStorageTypeInstance(referenced)) {\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n }\n throw new Error(\n `Storage type \"${column.typeRef}\" has an unknown polymorphic kind; expected codec-instance or postgres-enum.`,\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: ResolvedStorageTypes,\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}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables and `contract.storage.types` for type\n * annotations. Storage-type annotations are written under\n * `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: {} };\n }\n\n const storage = contract.storage;\n const storageTypes = (storage.types ?? {}) as ResolvedStorageTypes;\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 annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n const types = storage.types as ResolvedStorageTypes | undefined;\n if (!types || Object.keys(types).length === 0) return undefined;\n // Re-key by nativeType, normalising every variant to the codec-typed\n // annotation shape `{codecId, nativeType, typeParams}` produced by the\n // adapter introspector (`introspectPostgresEnumTypes` writes that shape;\n // see also `enum-planning.ts § readExistingEnumValues`, which reads\n // `existing.codecId` + `existing.typeParams.values`). Without this\n // normalisation, the projector would emit the raw\n // `PostgresEnumStorageEntry` shape (top-level `values`, no `typeParams`)\n // and downstream Schema IR consumers that walk the codec-typed shape\n // would see enum entries as new (e.g. the planner emits a fresh\n // `CreateEnumTypeCall` instead of the rebuild recipe). Unknown future\n // kinds without `nativeType` are skipped rather than crashing.\n const byNativeType: Record<string, StorageTypeInstance> = {};\n for (const typeInstance of Object.values(types)) {\n if (isPostgresEnumStorageEntry(typeInstance)) {\n byNativeType[typeInstance.nativeType] = toStorageTypeInstance({\n codecId: typeInstance.codecId,\n nativeType: typeInstance.nativeType,\n typeParams: { values: typeInstance.values },\n });\n continue;\n }\n if (isStorageTypeInstance(typeInstance)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","/**\n * Codec lifecycle hook planner — runs `onFieldEvent` for every per-field\n * delta between two contracts and concatenates the returned ops in a\n * deterministic order.\n *\n * Wired by each target's planner (`PostgresMigrationPlanner`,\n * `SqliteMigrationPlanner`) so codec-emitted ops are inlined alongside\n * structural DDL in the app-space migration's `ops.json`. Pure, target-\n * agnostic, and only ever invoked at the app-space emitter; extension-space\n * planning never reaches this helper.\n *\n * Ordering rules (see ADR 213):\n *\n * - Events are grouped by phase: `'added'` → `'dropped'` → `'altered'`.\n * - Within each phase, entries are sorted alphabetically by\n * `(tableName, fieldName)`.\n * - The hook's returned ops are appended in the order the hook returned them.\n *\n * `'altered'` is suppressed when only `codecId` differs (codec rotation is a\n * v1 non-goal).\n *\n * See: `docs/architecture docs/adrs/ADR 213 - Codec lifecycle hooks.md`.\n */\n\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { OpFactoryCall } from '@prisma-next/framework-components/control';\nimport type { SqlStorage, StorageColumn, StorageTable } from '@prisma-next/sql-contract/types';\nimport type { CodecControlHooks, FieldEvent, FieldEventContext } from './types';\n\nexport interface PlanFieldEventOperationsOptions {\n /**\n * Prior contract the planner is diffing against. `null` for first emits\n * (every field is treated as added).\n */\n readonly priorContract: Contract<SqlStorage> | null;\n /**\n * New contract the user just authored.\n */\n readonly newContract: Contract<SqlStorage>;\n /**\n * Codec-id keyed map of control hooks, as produced by\n * {@link import('./assembly').extractCodecControlHooks}. Hooks carry\n * `unknown` target details after extraction; the caller casts the\n * helper's returned ops to its target's `SqlMigrationPlanOperation`\n * specialisation at the integration boundary, mirroring how\n * `storageTypePlanCallStrategy` lifts `planTypeOperations` results into\n * `RawSqlCall`.\n */\n readonly codecHooks: ReadonlyMap<string, CodecControlHooks>;\n}\n\ninterface FieldEntry {\n readonly tableName: string;\n readonly fieldName: string;\n readonly priorTable: StorageTable | undefined;\n readonly newTable: StorageTable | undefined;\n readonly priorField: StorageColumn | undefined;\n readonly newField: StorageColumn | undefined;\n}\n\nexport function planFieldEventOperations(\n options: PlanFieldEventOperationsOptions,\n): readonly OpFactoryCall[] {\n const priorTables = options.priorContract?.storage.tables ?? {};\n const newTables = options.newContract.storage.tables;\n\n const added: FieldEntry[] = [];\n const dropped: FieldEntry[] = [];\n const altered: FieldEntry[] = [];\n\n const tableNames = unionSorted(Object.keys(priorTables), Object.keys(newTables));\n for (const tableName of tableNames) {\n const priorTable = priorTables[tableName];\n const newTable = newTables[tableName];\n const fieldNames = unionSorted(\n priorTable ? Object.keys(priorTable.columns) : [],\n newTable ? Object.keys(newTable.columns) : [],\n );\n for (const fieldName of fieldNames) {\n const priorField = priorTable?.columns[fieldName];\n const newField = newTable?.columns[fieldName];\n const entry: FieldEntry = {\n tableName,\n fieldName,\n priorTable,\n newTable,\n priorField,\n newField,\n };\n if (priorField === undefined && newField !== undefined) {\n added.push(entry);\n } else if (priorField !== undefined && newField === undefined) {\n dropped.push(entry);\n } else if (priorField !== undefined && newField !== undefined) {\n if (isAlteration(priorField, newField)) altered.push(entry);\n }\n }\n }\n\n const calls: OpFactoryCall[] = [];\n appendCalls('added', added, options.codecHooks, calls, (e) => e.newField?.codecId);\n appendCalls('dropped', dropped, options.codecHooks, calls, (e) => e.priorField?.codecId);\n appendCalls('altered', altered, options.codecHooks, calls, (e) => e.newField?.codecId);\n return calls;\n}\n\nfunction appendCalls(\n event: FieldEvent,\n entries: readonly FieldEntry[],\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n calls: OpFactoryCall[],\n pickCodecId: (entry: FieldEntry) => string | undefined,\n): void {\n for (const entry of entries) {\n const codecId = pickCodecId(entry);\n if (codecId === undefined) continue;\n const hook = codecHooks.get(codecId);\n if (!hook?.onFieldEvent) continue;\n const ctx = buildContext(event, entry);\n const emitted = hook.onFieldEvent(event, ctx);\n for (const call of emitted) calls.push(call);\n }\n}\n\n/**\n * The context's prior/new sides are scoped to the event:\n *\n * - `'added'` — only `newTable` / `newField` populated.\n * - `'dropped'` — only `priorTable` / `priorField` populated.\n * - `'altered'` — both sides populated.\n */\nfunction buildContext(event: FieldEvent, entry: FieldEntry): FieldEventContext {\n const base = { tableName: entry.tableName, fieldName: entry.fieldName };\n if (event === 'added') {\n return {\n ...base,\n ...(entry.newTable !== undefined ? { newTable: entry.newTable } : {}),\n ...(entry.newField !== undefined ? { newField: entry.newField } : {}),\n };\n }\n if (event === 'dropped') {\n return {\n ...base,\n ...(entry.priorTable !== undefined ? { priorTable: entry.priorTable } : {}),\n ...(entry.priorField !== undefined ? { priorField: entry.priorField } : {}),\n };\n }\n return {\n ...base,\n ...(entry.priorTable !== undefined ? { priorTable: entry.priorTable } : {}),\n ...(entry.newTable !== undefined ? { newTable: entry.newTable } : {}),\n ...(entry.priorField !== undefined ? { priorField: entry.priorField } : {}),\n ...(entry.newField !== undefined ? { newField: entry.newField } : {}),\n };\n}\n\n/**\n * `'altered'` predicate. Returns `false` whenever `codecId` differs —\n * any codec change suppresses the `altered` event entirely, including\n * cases where another property also differs in the same diff. Codec\n * rotation is a v1 non-goal; avoiding the mixed event keeps the\n * migration semantics for codec changes explicit rather than smuggling\n * them through as `altered`.\n *\n * For non-`codecId` diffs, returns `true` iff any other column property\n * differs.\n */\nfunction isAlteration(prior: StorageColumn, current: StorageColumn): boolean {\n if (prior.codecId !== current.codecId) return false;\n return !sameStorageColumn(prior, current);\n}\n\nfunction sameStorageColumn(a: StorageColumn, b: StorageColumn): boolean {\n if (a === b) return true;\n if (a.nativeType !== b.nativeType) return false;\n if (a.nullable !== b.nullable) return false;\n if (a.typeRef !== b.typeRef) return false;\n if (!sameJson(a.typeParams, b.typeParams)) return false;\n if (!sameJson(a.default, b.default)) return false;\n return true;\n}\n\nfunction sameJson(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === undefined || b === undefined) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction unionSorted(a: readonly string[], b: readonly string[]): readonly string[] {\n const set = new Set<string>();\n for (const name of a) set.add(name);\n for (const name of b) set.add(name);\n return [...set].sort((x, y) => (x < y ? -1 : x > y ? 1 : 0));\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.params ? { params: Object.freeze([...step.params]) } : {}),\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 ...(operation.invariantId ? { invariantId: operation.invariantId } : {}),\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 spaceId: options.spaceId,\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 { 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 type { PlanFieldEventOperationsOptions } from '../core/migrations/field-event-planner';\nexport { planFieldEventOperations } from '../core/migrations/field-event-planner';\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 CodecControlHooks,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n FieldEvent,\n FieldEventContext,\n MultiSpaceRunnerFailure,\n MultiSpaceRunnerResult,\n MultiSpaceRunnerSuccessValue,\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 {\n temporalAuthoringPresets,\n timestampNowControlDescriptor,\n} from '../core/timestamp-now-generator';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|
package/dist/ir.d.mts
CHANGED
|
@@ -10,7 +10,7 @@ type SqlEntityHydrationFactory = (entry: unknown) => SqlStorageTypeEntry;
|
|
|
10
10
|
* deserialization pipeline:
|
|
11
11
|
*
|
|
12
12
|
* 1. `parseSqlContractStructure` validates the on-disk JSON envelope
|
|
13
|
-
* against the SQL contract arktype schema (`
|
|
13
|
+
* against the SQL contract arktype schema (`validateSqlContractFully`)
|
|
14
14
|
* and returns the validated flat-data shape.
|
|
15
15
|
* 2. `hydrateSqlStorage` walks the validated `storage` subtree and
|
|
16
16
|
* constructs the family-shared SQL Contract IR class hierarchy
|
package/dist/ir.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as SqlContractSerializerBase, t as SqlContractSerializer } from "./sql-contract-serializer-
|
|
1
|
+
import { n as SqlContractSerializerBase, t as SqlContractSerializer } from "./sql-contract-serializer-qUQCnP-k.mjs";
|
|
2
2
|
//#region src/core/ir/sql-schema-verifier-base.ts
|
|
3
3
|
/**
|
|
4
4
|
* SQL family `SchemaVerifier` abstract base. Centralises the SQL-shared
|
package/dist/migration.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { O as SqlPlanTargetDetails, g as SqlMigrationPlanOperation } from "./types-
|
|
1
|
+
import { O as SqlPlanTargetDetails, g as SqlMigrationPlanOperation } from "./types-DMINfGUO.mjs";
|
|
2
2
|
import { Migration } from "@prisma-next/migration-tools/migration";
|
|
3
3
|
|
|
4
4
|
//#region src/core/sql-migration.d.ts
|
|
@@ -6,7 +6,7 @@ import { validateSqlContractFully } from "@prisma-next/sql-contract/validators";
|
|
|
6
6
|
* deserialization pipeline:
|
|
7
7
|
*
|
|
8
8
|
* 1. `parseSqlContractStructure` validates the on-disk JSON envelope
|
|
9
|
-
* against the SQL contract arktype schema (`
|
|
9
|
+
* against the SQL contract arktype schema (`validateSqlContractFully`)
|
|
10
10
|
* and returns the validated flat-data shape.
|
|
11
11
|
* 2. `hydrateSqlStorage` walks the validated `storage` subtree and
|
|
12
12
|
* constructs the family-shared SQL Contract IR class hierarchy
|
|
@@ -122,4 +122,4 @@ var SqlContractSerializer = class extends SqlContractSerializerBase {
|
|
|
122
122
|
//#endregion
|
|
123
123
|
export { SqlContractSerializerBase as n, SqlContractSerializer as t };
|
|
124
124
|
|
|
125
|
-
//# sourceMappingURL=sql-contract-serializer-
|
|
125
|
+
//# sourceMappingURL=sql-contract-serializer-qUQCnP-k.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-contract-serializer-qUQCnP-k.mjs","names":[],"sources":["../src/core/ir/sql-contract-serializer-base.ts","../src/core/ir/sql-contract-serializer.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport type { ContractSerializer } from '@prisma-next/framework-components/control';\nimport { SqlStorage, type SqlStorageTypeEntry } from '@prisma-next/sql-contract/types';\nimport { validateSqlContractFully } from '@prisma-next/sql-contract/validators';\nimport type { JsonObject } from '@prisma-next/utils/json';\n\nexport type SqlEntityHydrationFactory = (entry: unknown) => SqlStorageTypeEntry;\n\n/**\n * SQL family `ContractSerializer` abstract base. Carries the SQL-shared\n * deserialization pipeline:\n *\n * 1. `parseSqlContractStructure` validates the on-disk JSON envelope\n * against the SQL contract arktype schema (`validateSqlContractFully`)\n * and returns the validated flat-data shape.\n * 2. `hydrateSqlStorage` walks the validated `storage` subtree and\n * constructs the family-shared SQL Contract IR class hierarchy\n * (`SqlStorage` -> `StorageTable` -> `StorageColumn` / `PrimaryKey`\n * / …). The rest of the contract envelope is JSON-clean primitive\n * data and passes through unchanged.\n * 3. `constructTargetContract` is the target-specific extension hook;\n * defaults to identity. Targets that need to attach target-only\n * fields (e.g. target-specific derived storage fields) override it.\n *\n * Default `serializeContract` is identity over the contract — concrete\n * SQL targets ship JSON-clean class instances, so the contract value\n * can be stringified directly. The non-enumerable family-level `kind`\n * discriminator on `SqlNode` instances stays out of the persisted\n * envelope automatically. Targets that need to canonicalize on the way\n * out (key ordering, dropping computed-only fields) override\n * `serializeContract` directly.\n */\nexport abstract class SqlContractSerializerBase<TContract extends Contract<SqlStorage>>\n implements ContractSerializer<TContract>\n{\n constructor(\n private readonly entityTypeRegistry: ReadonlyMap<string, SqlEntityHydrationFactory>,\n ) {}\n\n deserializeContract(json: unknown): TContract {\n const validated = this.parseSqlContractStructure(json);\n const hydrated = this.hydrateSqlStorage(validated);\n return this.constructTargetContract(hydrated);\n }\n\n serializeContract(contract: TContract): JsonObject {\n // Targets that ship enumerable runtime-only fields must override\n // this method (mirroring `MongoTargetContractSerializer.serializeContract`)\n // to construct the persisted envelope explicitly; the default identity\n // works only when every enumerable own property belongs in the JSON.\n return contract as unknown as JsonObject;\n }\n\n /**\n * Family-shared validation pipeline (delegates to\n * `validateSqlContractFully` in `@prisma-next/sql-contract/validators`):\n * structural arktype + framework-shared domain + SQL storage\n * logical-consistency + SQL storage semantic + model ↔ storage\n * reference checks. Subclasses override to add target-specific\n * structural checks before hydration; the family default suffices\n * for targets whose contract shape is the SQL-shared shape\n * (Postgres, SQLite today).\n */\n protected parseSqlContractStructure(json: unknown): Contract<SqlStorage> {\n return validateSqlContractFully<Contract<SqlStorage>>(json);\n }\n\n /**\n * Family-shared hydration walker. Lifts the validated flat-data\n * `storage` subtree into the SQL Contract IR class hierarchy by\n * constructing a single `SqlStorage` instance — its constructor\n * cascades nested instantiation of `StorageTable`, `StorageColumn`,\n * `PrimaryKey`, `UniqueConstraint`, `Index`, `ForeignKey`,\n * `ForeignKeyReferences`, and `StorageTypeInstance`. The rest of the\n * contract envelope (target identity, hashes, capabilities, models,\n * meta, …) is JSON-clean primitive data and passes through unchanged.\n *\n * Polymorphic `storage.types` entries are normalised before the\n * `SqlStorage` constructor runs: when an entry carries an enumerable\n * string `kind`, the serializer looks up a pack-registered hydration\n * factory for that discriminator and delegates reconstruction. Entries\n * with no registered factory pass through unchanged (codec-typed JSON\n * stays codec-typed until `SqlStorage` normalises it).\n */\n protected hydrateSqlStorage(validated: Contract<SqlStorage>): Contract<SqlStorage> {\n const types = validated.storage.types;\n const hydratedTypes =\n types !== undefined\n ? Object.fromEntries(\n Object.entries(types).map(([name, entry]) => [\n name,\n this.hydrateStorageTypeEntry(entry),\n ]),\n )\n : undefined;\n\n return {\n ...validated,\n storage: new SqlStorage({\n ...validated.storage,\n ...(hydratedTypes !== undefined ? { types: hydratedTypes } : {}),\n }),\n };\n }\n\n /**\n * Per-entry hydration dispatcher for `storage.types`. When `kind` is a\n * string and the constructor registry supplies a factory for that key,\n * the factory returns the hydrated `SqlStorageTypeEntry`. Otherwise the\n * entry passes through unchanged for `SqlStorage` to normalise.\n */\n protected hydrateStorageTypeEntry(entry: SqlStorageTypeEntry): SqlStorageTypeEntry {\n if (typeof entry !== 'object' || entry === null) {\n return entry;\n }\n const kind = (entry as { kind?: unknown }).kind;\n if (typeof kind !== 'string') {\n return entry;\n }\n const factory = this.entityTypeRegistry.get(kind);\n if (factory === undefined) {\n return entry;\n }\n return factory(entry);\n }\n\n /**\n * Target-specific construction hook. Defaults to identity; targets\n * that need to wrap the hydrated contract (e.g. attach target-only\n * derived fields, narrow the contract type to a target-specific\n * subtype) override.\n */\n protected constructTargetContract(hydrated: Contract<SqlStorage>): TContract {\n return hydrated as TContract;\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { SqlContractSerializerBase } from './sql-contract-serializer-base';\n\n/**\n * Default SQL family `ContractSerializer` concretion. Inherits the\n * full SQL-shared deserialization pipeline (structural validation +\n * IR-class hydration) without pack-registered `storage.types`\n * hydration factories — targets that emit polymorphic JSON outside the\n * codec-typed envelope wire a target-specific subclass with a populated\n * registry (see Postgres). Family-level call sites instantiate this\n * default directly when no target serializer is supplied.\n */\nexport class SqlContractSerializer extends SqlContractSerializerBase<Contract<SqlStorage>> {\n constructor() {\n super(new Map());\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAsB,4BAAtB,MAEA;CAEqB;CADnB,YACE,oBACA;EADiB,KAAA,qBAAA;;CAGnB,oBAAoB,MAA0B;EAC5C,MAAM,YAAY,KAAK,0BAA0B,KAAK;EACtD,MAAM,WAAW,KAAK,kBAAkB,UAAU;EAClD,OAAO,KAAK,wBAAwB,SAAS;;CAG/C,kBAAkB,UAAiC;EAKjD,OAAO;;;;;;;;;;;;CAaT,0BAAoC,MAAqC;EACvE,OAAO,yBAA+C,KAAK;;;;;;;;;;;;;;;;;;;CAoB7D,kBAA4B,WAAuD;EACjF,MAAM,QAAQ,UAAU,QAAQ;EAChC,MAAM,gBACJ,UAAU,KAAA,IACN,OAAO,YACL,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,CAC3C,MACA,KAAK,wBAAwB,MAAM,CACpC,CAAC,CACH,GACD,KAAA;EAEN,OAAO;GACL,GAAG;GACH,SAAS,IAAI,WAAW;IACtB,GAAG,UAAU;IACb,GAAI,kBAAkB,KAAA,IAAY,EAAE,OAAO,eAAe,GAAG,EAAE;IAChE,CAAC;GACH;;;;;;;;CASH,wBAAkC,OAAiD;EACjF,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;EAET,MAAM,OAAQ,MAA6B;EAC3C,IAAI,OAAO,SAAS,UAClB,OAAO;EAET,MAAM,UAAU,KAAK,mBAAmB,IAAI,KAAK;EACjD,IAAI,YAAY,KAAA,GACd,OAAO;EAET,OAAO,QAAQ,MAAM;;;;;;;;CASvB,wBAAkC,UAA2C;EAC3E,OAAO;;;;;;;;;;;;;;ACxHX,IAAa,wBAAb,cAA2C,0BAAgD;CACzF,cAAc;EACZ,sBAAM,IAAI,KAAK,CAAC"}
|
|
@@ -23,7 +23,15 @@ interface SqlFamilyInstanceState {
|
|
|
23
23
|
readonly typeMetadataRegistry: SqlTypeMetadataRegistry;
|
|
24
24
|
}
|
|
25
25
|
interface SqlControlFamilyInstance extends ControlFamilyInstance<'sql', SqlSchemaIR>, SchemaViewCapable<SqlSchemaIR>, PslContractInferCapable<SqlSchemaIR>, OperationPreviewCapable, SqlFamilyInstanceState {
|
|
26
|
-
|
|
26
|
+
/**
|
|
27
|
+
* The family seam-of-record for on-disk contract reads. Structurally
|
|
28
|
+
* validates the JSON envelope, then hydrates IR-class instances via
|
|
29
|
+
* the per-target ContractSerializer. The single named entry point
|
|
30
|
+
* every CLI on-disk read crosses (TML-2536) — `as Contract` casts
|
|
31
|
+
* in production package sources are a serializer-bypass smell guarded
|
|
32
|
+
* by `pnpm lint:no-contract-cast`.
|
|
33
|
+
*/
|
|
34
|
+
deserializeContract(contractJson: unknown): Contract;
|
|
27
35
|
verify(options: {
|
|
28
36
|
readonly driver: ControlDriverInstance<'sql', string>;
|
|
29
37
|
readonly contract: unknown;
|
|
@@ -441,7 +449,7 @@ interface SqlControlTargetDescriptor<TTargetId extends string, TTargetDetails, T
|
|
|
441
449
|
* JSON ⇄ class boundary for the SQL target's contract. The descriptor
|
|
442
450
|
* composes a concrete `SqlContractSerializerBase` subclass; the rest
|
|
443
451
|
* of the control stack reaches `descriptor.contractSerializer` rather
|
|
444
|
-
* than importing a per-target
|
|
452
|
+
* than importing a per-target deserialization function.
|
|
445
453
|
*/
|
|
446
454
|
readonly contractSerializer: ContractSerializer<TContract>;
|
|
447
455
|
/**
|
|
@@ -473,4 +481,4 @@ interface CreateSqlMigrationPlanOptions<TTargetDetails> {
|
|
|
473
481
|
}
|
|
474
482
|
//#endregion
|
|
475
483
|
export { SqlPlannerConflictKind as A, SqlMigrationRunnerExecuteCallbacks as C, SqlMigrationRunnerSuccessValue as D, SqlMigrationRunnerResult as E, StorageTypePlanResult as F, SqlControlFamilyInstance as I, SqlPlannerFailureResult as M, SqlPlannerResult as N, SqlPlanTargetDetails as O, SqlPlannerSuccessResult as P, SqlMigrationRunnerErrorCode as S, SqlMigrationRunnerFailure as T, SqlMigrationPlanOperationStep as _, FieldEvent as a, SqlMigrationPlannerPlanOptions as b, MultiSpaceRunnerResult as c, SqlControlAdapterDescriptor as d, SqlControlExtensionDescriptor as f, SqlMigrationPlanOperation as g, SqlMigrationPlanContractInfo as h, ExpandNativeTypeInput as i, SqlPlannerConflictLocation as j, SqlPlannerConflict as k, MultiSpaceRunnerSuccessValue as l, SqlMigrationPlan as m, CodecControlHooks as n, FieldEventContext as o, SqlControlTargetDescriptor as p, CreateSqlMigrationPlanOptions as r, MultiSpaceRunnerFailure as s, AnyRecord as t, ResolveIdentityValueInput as u, SqlMigrationPlanOperationTarget as v, SqlMigrationRunnerExecuteOptions as w, SqlMigrationRunner as x, SqlMigrationPlanner as y };
|
|
476
|
-
//# sourceMappingURL=types-
|
|
484
|
+
//# sourceMappingURL=types-DMINfGUO.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-DMINfGUO.d.mts","names":[],"sources":["../src/core/control-instance.ts","../src/core/migrations/types.ts"],"mappings":";;;;;;;;;;;;UAqKU,eAAA;EAAA,SACC,MAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGN,uBAAA,GAA0B,GAAA,SAAY,eAAA;AAAA,UAEjC,sBAAA;EAAA,SACC,gBAAA,EAAkB,aAAA,CAAc,eAAA;EAAA,SAChC,YAAA,EAAc,aAAA;EAAA,SACd,oBAAA,EAAsB,uBAAA;AAAA;AAAA,UAGhB,wBAAA,SACP,qBAAA,QAA6B,WAAA,GACnC,iBAAA,CAAkB,WAAA,GAClB,uBAAA,CAAwB,WAAA,GACxB,uBAAA,EACA,sBAAA;EAhBiB;;AAAA;;;;;AAGqC;EAsBxD,mBAAA,CAAoB,YAAA,YAAwB,QAAA;EAE5C,MAAA,CAAO,OAAA;IAAA,SACI,MAAA,EAAQ,qBAAA;IAAA,SACR,QAAA;IAAA,SACA,gBAAA;IAAA,SACA,YAAA;IAAA,SACA,UAAA;EAAA,IACP,OAAA,CAAQ,oBAAA;EA3BH;;;;;;;;;AAKX;EAkCE,YAAA,CAAa,OAAA;IAAA,SACF,QAAA;IAAA,SACA,MAAA,EAAQ,WAAA;IAAA,SACR,MAAA;IAAA,SACA,mBAAA,EAAqB,aAAA,CAAc,8BAAA;EAAA,IAC1C,0BAAA;EAEJ,IAAA,CAAK,OAAA;IAAA,SACM,MAAA,EAAQ,qBAAA;IAAA,SACR,QAAA;IAAA,SACA,YAAA;IAAA,SACA,UAAA;EAAA,IACP,OAAA,CAAQ,kBAAA;EAEZ,UAAA,CAAW,OAAA;IAAA,SACA,MAAA,EAAQ,qBAAA;IAAA,SACR,QAAA;EAAA,IACP,OAAA,CAAQ,WAAA;EAEZ,gBAAA,CAAiB,QAAA,EAAU,WAAA,GAAc,cAAA;EAEzC,QAAA,CAAS,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS,cAAA,YAA0B,gBAAA;EAE9D,kBAAA,CAAmB,UAAA,WAAqB,sBAAA,KAA2B,gBAAA;AAAA;;;KC3MzD,SAAA,GAAY,QAAA,CAAS,MAAA;AAAA,UAEhB,qBAAA;EAAA,SACN,UAAA,WAAqB,yBAAA,CAA0B,cAAA;AAAA;ADIsB;;;AAAA,UCE/D,qBAAA;EAAA,SACN,UAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,MAAA;AAAA;;;AD2HH;;;;;UCjHJ,yBAAA;EAAA,SACN,UAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA,GAAa,MAAA;AAAA;;;;;;;;;;;;;;ADyHxB;KCxGY,UAAA;;;;;;;;;;;;;UAcK,iBAAA;EAAA,SACN,SAAA;EAAA,SACA,SAAA;EAAA,SACA,UAAA,GAAa,YAAA;EAAA,SACb,QAAA,GAAW,YAAA;EAAA,SACX,UAAA,GAAa,aAAA;EAAA,SACb,QAAA,GAAW,aAAA;AAAA;AAAA,UAGL,iBAAA;EACf,kBAAA,IAAsB,OAAA;IAAA,SACX,QAAA;IAAA,SACA,YAAA,EAAc,mBAAA;IAAA,SACd,QAAA,EAAU,QAAA,CAAS,UAAA;IAAA,SACnB,MAAA,EAAQ,WAAA;IAAA,SACR,UAAA;IAAA,SACA,MAAA,EAAQ,wBAAA;EAAA,MACb,qBAAA,CAAsB,cAAA;EAC5B,UAAA,IAAc,OAAA;IAAA,SACH,QAAA;IAAA,SACA,YAAA,EAAc,mBAAA;IAAA,SACd,MAAA,EAAQ,WAAA;IAAA,SACR,UAAA;EAAA,eACI,WAAA;EACf,eAAA,IAAmB,OAAA;IAAA,SACR,MAAA,EAAQ,qBAAA;IAAA,SACR,UAAA;EAAA,MACL,OAAA,CAAQ,MAAA,SAAe,mBAAA;EDoE3B;;;;;;;;;;ECzDF,gBAAA,IAAoB,KAAA,EAAO,qBAAA;EDoEpB;;;;;;;;;EC1DP,oBAAA,IAAwB,KAAA,EAAO,yBAAA;EDgFe;;;;;;;;;;;;;;ECjE9C,YAAA,IAAgB,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,iBAAA,cAA+B,aAAA;AAAA;AAAA,UAGxD,6BAAA,mCACP,0BAAA,QAAkC,SAAA;EAAA,SACjC,eAAA,SAAwB,uBAAA;EDyErB;;;;;;;;;;;EAAA,SC7DH,aAAA,GAAgB,aAAA,CAAc,QAAA,CAAS,UAAA;AAAA;AAAA,UAGjC,2BAAA,mCACP,wBAAA,QAAgC,SAAA;EAAA,SAC/B,eAAA,SAAwB,uBAAA;AAAA;AAAA,UAGlB,6BAAA;EAAA,SACN,WAAA;EAAA,SACA,GAAA;;AAlJX;;;;;AAEA;;WAyJW,MAAA;EAAA,SACA,IAAA,GAAO,SAAA;AAAA;;;;;;AAnJlB;;UA6JiB,oBAAA;EAAA,SACN,MAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGM,+BAAA;EAAA,SACN,EAAA;EAAA,SACA,OAAA,GAAU,cAAA;AAAA;AAAA,UAGJ,yBAAA,yBAAkD,sBAAA;EAAA,SACxD,OAAA;EAAA,SACA,MAAA,EAAQ,+BAAA,CAAgC,cAAA;EAAA,SACxC,QAAA,WAAmB,6BAAA;EAAA,SACnB,OAAA,WAAkB,6BAAA;EAAA,SAClB,SAAA,WAAoB,6BAAA;EAAA,SACpB,IAAA,GAAO,SAAA;AAAA;AAAA,UAGD,4BAAA;EAAA,SACN,WAAA;EAAA,SACA,WAAA;AAAA;AAAA,UAGM,gBAAA,yBAAyC,aAAA;EApJpC;;AActB;;;;;;;;;;;;EAdsB,SAmKX,OAAA;EAjJA;;;;EAAA,SAsJA,MAAA,GAAS,4BAAA;EApJE;;;EAAA,SAwJX,WAAA,EAAa,4BAAA;EAAA,SACb,UAAA,WAAqB,yBAAA,CAA0B,cAAA;EAtJxB;;;;;;;;EAAA,SA+JvB,kBAAA;EAAA,SACA,IAAA,GAAO,SAAA;AAAA;AAAA,KAGN,sBAAA;AAAA,UAQK,0BAAA;EAAA,SACN,KAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA;EAAA,SACA,UAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGM,kBAAA,SAA2B,wBAAA;EAAA,SACjC,IAAA,EAAM,sBAAA;EAAA,SACN,QAAA,GAAW,0BAAA;EAAA,SACX,IAAA,GAAO,SAAA;AAAA;AAAA,UAGD,uBAAA,yBACP,IAAA,CAAK,6BAAA;EAAA,SACJ,IAAA;EAAA,SACA,IAAA,EAAM,gBAAA,CAAiB,cAAA;AAAA;AAAA,UAGjB,uBAAA,SAAgC,IAAA,CAAK,6BAAA;EAAA,SAC3C,IAAA;EAAA,SACA,SAAA,WAAoB,kBAAA;AAAA;AAAA,KAGnB,gBAAA,mBACR,uBAAA,CAAwB,cAAA,IACxB,uBAAA;AAAA,UAEa,8BAAA;EAAA,SACN,QAAA,EAAU,QAAA,CAAS,UAAA;EAAA,SACnB,MAAA,EAAQ,WAAA;EAAA,SACR,MAAA,EAAQ,wBAAA;EAAA,SACR,UAAA;EAnMT;;;;;;;EAAA,SA2MS,OAAA;EAtMM;;;;;;;;;;;;;;;;EAAA,SAuNN,YAAA,EAAc,QAAA,CAAS,UAAA;EA/KhB;;;;;;EAAA,SAsLP,mBAAA,EAAqB,aAAA,CAAc,8BAAA;AAAA;AAAA,UAG7B,mBAAA;EACf,IAAA,CAAK,OAAA,EAAS,8BAAA,GAAiC,gBAAA,CAAiB,cAAA;AAAA;AAAA,UAGjD,kCAAA;EACf,gBAAA,EAAkB,SAAA,EAAW,yBAAA,CAA0B,cAAA;EACvD,mBAAA,EAAqB,SAAA,EAAW,yBAAA,CAA0B,cAAA;AAAA;AAAA,UAG3C,gCAAA;EAAA,SACN,IAAA,EAAM,gBAAA,CAAiB,cAAA;EAAA,SACvB,MAAA,EAAQ,qBAAA;EAhMT;;;;;;;EAAA,SAwMC,KAAA;EA3LiD;;AAG5D;;EAH4D,SAgMjD,mBAAA,EAAqB,QAAA,CAAS,UAAA;EA5LC;;;;EAAA,SAiM/B,MAAA,EAAQ,wBAAA;EAAA,SACR,UAAA;EAAA,SACA,kBAAA;EAAA,SACA,SAAA,GAAY,kCAAA,CAAmC,cAAA;EAAA,SAC/C,OAAA,GAAU,gBAAA;EApMc;;;AAGnC;EAHmC,SAyMxB,eAAA,GAAkB,8BAAA;;;;;;;WAOlB,mBAAA,EAAqB,aAAA,CAAc,8BAAA;AAAA;AAAA,KAGlC,2BAAA;AAAA,UAWK,yBAAA,SAAkC,sBAAA;EAAA,SACxC,IAAA,EAAM,2BAAA;EAAA,SACN,IAAA,GAAO,SAAA;AAAA;AAAA,UAGD,8BAAA,SAAuC,2BAAA;AAAA,KAE5C,wBAAA,GAA2B,MAAA,CACrC,8BAAA,EACA,yBAAA;AAAA,UAGe,kBAAA;EA1MkB;;;;;;EAiNjC,OAAA,CACE,OAAA,EAAS,gCAAA,CAAiC,cAAA,IACzC,OAAA,CAAQ,wBAAA;EAhNI;;;;;;;;;;;EA6Nf,mBAAA,CACE,OAAA,EAAS,gCAAA,CAAiC,cAAA,IACzC,OAAA,CAAQ,wBAAA;EA/N8B;;;;;;;;;;;;;;EA+OzC,mBAAA,CAAoB,OAAA;IAAA,SACT,MAAA,EAAQ,qBAAA;IAAA,SACR,eAAA,EAAiB,aAAA,CAAc,gCAAA,CAAiC,cAAA;EAAA,IACvE,OAAA,CAAQ,sBAAA;AAAA;AAAA,UAGG,4BAAA;EAAA,SACN,eAAA,EAAiB,aAAA;IAAA,SACf,KAAA;IAAA,SACA,KAAA,EAAO,8BAAA;EAAA;AAAA;AAAA,UAIH,uBAAA,SAAgC,yBAAA;EAAA,SACtC,YAAA;AAAA;AAAA,KAGC,sBAAA,GAAyB,MAAA,CAAO,4BAAA,EAA8B,uBAAA;AAAA,UAEzD,0BAAA,6DAGG,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,WAC1C,0BAAA,QAAkC,SAAA,EAAW,wBAAA;EAAA,SAC5C,eAAA,SAAwB,uBAAA;EAzPoC;;;;;;EAAA,SAgQ5D,kBAAA,EAAoB,kBAAA,CAAmB,SAAA;EAxO1B;;;;;;EAAA,SA+Ob,cAAA,EAAgB,cAAA,CAAe,SAAA,EAAW,WAAA;EACnD,aAAA,CAAc,MAAA,EAAQ,wBAAA,GAA2B,mBAAA,CAAoB,cAAA;EACrE,YAAA,CAAa,MAAA,EAAQ,wBAAA,GAA2B,kBAAA,CAAmB,cAAA;AAAA;AAAA,UAGpD,6BAAA;EAAA,SACN,QAAA;EAvOuB;;AAQlC;EARkC,SA2OvB,OAAA;EAAA,SACA,MAAA,GAAS,4BAAA;EAAA,SACT,WAAA,EAAa,4BAAA;EAAA,SACb,UAAA,WAAqB,yBAAA,CAA0B,cAAA;EApO/C;;;;;EAAA,SA0OA,kBAAA;EAAA,SACA,IAAA,GAAO,SAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/family-sql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0-dev.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "SQL family descriptor for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/contract": "0.
|
|
10
|
-
"@prisma-next/emitter": "0.
|
|
11
|
-
"@prisma-next/framework-components": "0.
|
|
12
|
-
"@prisma-next/migration-tools": "0.
|
|
13
|
-
"@prisma-next/operations": "0.
|
|
14
|
-
"@prisma-next/sql-contract": "0.
|
|
15
|
-
"@prisma-next/sql-contract-emitter": "0.
|
|
16
|
-
"@prisma-next/sql-contract-ts": "0.
|
|
17
|
-
"@prisma-next/sql-operations": "0.
|
|
18
|
-
"@prisma-next/sql-relational-core": "0.
|
|
19
|
-
"@prisma-next/sql-runtime": "0.
|
|
20
|
-
"@prisma-next/sql-schema-ir": "0.
|
|
21
|
-
"@prisma-next/utils": "0.
|
|
9
|
+
"@prisma-next/contract": "0.9.0-dev.1",
|
|
10
|
+
"@prisma-next/emitter": "0.9.0-dev.1",
|
|
11
|
+
"@prisma-next/framework-components": "0.9.0-dev.1",
|
|
12
|
+
"@prisma-next/migration-tools": "0.9.0-dev.1",
|
|
13
|
+
"@prisma-next/operations": "0.9.0-dev.1",
|
|
14
|
+
"@prisma-next/sql-contract": "0.9.0-dev.1",
|
|
15
|
+
"@prisma-next/sql-contract-emitter": "0.9.0-dev.1",
|
|
16
|
+
"@prisma-next/sql-contract-ts": "0.9.0-dev.1",
|
|
17
|
+
"@prisma-next/sql-operations": "0.9.0-dev.1",
|
|
18
|
+
"@prisma-next/sql-relational-core": "0.9.0-dev.1",
|
|
19
|
+
"@prisma-next/sql-runtime": "0.9.0-dev.1",
|
|
20
|
+
"@prisma-next/sql-schema-ir": "0.9.0-dev.1",
|
|
21
|
+
"@prisma-next/utils": "0.9.0-dev.1",
|
|
22
22
|
"arktype": "^2.1.29"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@prisma-next/driver-postgres": "0.
|
|
26
|
-
"@prisma-next/psl-parser": "0.
|
|
27
|
-
"@prisma-next/psl-printer": "0.
|
|
28
|
-
"@prisma-next/sql-contract-psl": "0.
|
|
29
|
-
"@prisma-next/test-utils": "0.
|
|
30
|
-
"@prisma-next/tsconfig": "0.
|
|
31
|
-
"@prisma-next/tsdown": "0.
|
|
25
|
+
"@prisma-next/driver-postgres": "0.9.0-dev.1",
|
|
26
|
+
"@prisma-next/psl-parser": "0.9.0-dev.1",
|
|
27
|
+
"@prisma-next/psl-printer": "0.9.0-dev.1",
|
|
28
|
+
"@prisma-next/sql-contract-psl": "0.9.0-dev.1",
|
|
29
|
+
"@prisma-next/test-utils": "0.9.0-dev.1",
|
|
30
|
+
"@prisma-next/tsconfig": "0.9.0-dev.1",
|
|
31
|
+
"@prisma-next/tsdown": "0.9.0-dev.1",
|
|
32
32
|
"tsdown": "0.22.0",
|
|
33
33
|
"typescript": "5.9.3",
|
|
34
34
|
"vitest": "4.1.5"
|
|
@@ -184,7 +184,15 @@ export interface SqlControlFamilyInstance
|
|
|
184
184
|
PslContractInferCapable<SqlSchemaIR>,
|
|
185
185
|
OperationPreviewCapable,
|
|
186
186
|
SqlFamilyInstanceState {
|
|
187
|
-
|
|
187
|
+
/**
|
|
188
|
+
* The family seam-of-record for on-disk contract reads. Structurally
|
|
189
|
+
* validates the JSON envelope, then hydrates IR-class instances via
|
|
190
|
+
* the per-target ContractSerializer. The single named entry point
|
|
191
|
+
* every CLI on-disk read crosses (TML-2536) — `as Contract` casts
|
|
192
|
+
* in production package sources are a serializer-bypass smell guarded
|
|
193
|
+
* by `pnpm lint:no-contract-cast`.
|
|
194
|
+
*/
|
|
195
|
+
deserializeContract(contractJson: unknown): Contract;
|
|
188
196
|
|
|
189
197
|
verify(options: {
|
|
190
198
|
readonly driver: ControlDriverInstance<'sql', string>;
|
|
@@ -374,7 +382,7 @@ export function createSqlFamilyInstance<TTargetId extends string>(
|
|
|
374
382
|
extensionIds,
|
|
375
383
|
typeMetadataRegistry,
|
|
376
384
|
|
|
377
|
-
|
|
385
|
+
deserializeContract(contractJson: unknown): Contract {
|
|
378
386
|
return deserializeWithTargetSerializer(contractJson);
|
|
379
387
|
},
|
|
380
388
|
|
|
@@ -11,7 +11,7 @@ export type SqlEntityHydrationFactory = (entry: unknown) => SqlStorageTypeEntry;
|
|
|
11
11
|
* deserialization pipeline:
|
|
12
12
|
*
|
|
13
13
|
* 1. `parseSqlContractStructure` validates the on-disk JSON envelope
|
|
14
|
-
* against the SQL contract arktype schema (`
|
|
14
|
+
* against the SQL contract arktype schema (`validateSqlContractFully`)
|
|
15
15
|
* and returns the validated flat-data shape.
|
|
16
16
|
* 2. `hydrateSqlStorage` walks the validated `storage` subtree and
|
|
17
17
|
* constructs the family-shared SQL Contract IR class hierarchy
|
|
@@ -476,7 +476,7 @@ export interface SqlControlTargetDescriptor<
|
|
|
476
476
|
* JSON ⇄ class boundary for the SQL target's contract. The descriptor
|
|
477
477
|
* composes a concrete `SqlContractSerializerBase` subclass; the rest
|
|
478
478
|
* of the control stack reaches `descriptor.contractSerializer` rather
|
|
479
|
-
* than importing a per-target
|
|
479
|
+
* than importing a per-target deserialization function.
|
|
480
480
|
*/
|
|
481
481
|
readonly contractSerializer: ContractSerializer<TContract>;
|
|
482
482
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sql-contract-serializer-ayJ5Radj.mjs","names":[],"sources":["../src/core/ir/sql-contract-serializer-base.ts","../src/core/ir/sql-contract-serializer.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport type { ContractSerializer } from '@prisma-next/framework-components/control';\nimport { SqlStorage, type SqlStorageTypeEntry } from '@prisma-next/sql-contract/types';\nimport { validateSqlContractFully } from '@prisma-next/sql-contract/validators';\nimport type { JsonObject } from '@prisma-next/utils/json';\n\nexport type SqlEntityHydrationFactory = (entry: unknown) => SqlStorageTypeEntry;\n\n/**\n * SQL family `ContractSerializer` abstract base. Carries the SQL-shared\n * deserialization pipeline:\n *\n * 1. `parseSqlContractStructure` validates the on-disk JSON envelope\n * against the SQL contract arktype schema (`validateSqlContract`)\n * and returns the validated flat-data shape.\n * 2. `hydrateSqlStorage` walks the validated `storage` subtree and\n * constructs the family-shared SQL Contract IR class hierarchy\n * (`SqlStorage` -> `StorageTable` -> `StorageColumn` / `PrimaryKey`\n * / …). The rest of the contract envelope is JSON-clean primitive\n * data and passes through unchanged.\n * 3. `constructTargetContract` is the target-specific extension hook;\n * defaults to identity. Targets that need to attach target-only\n * fields (e.g. target-specific derived storage fields) override it.\n *\n * Default `serializeContract` is identity over the contract — concrete\n * SQL targets ship JSON-clean class instances, so the contract value\n * can be stringified directly. The non-enumerable family-level `kind`\n * discriminator on `SqlNode` instances stays out of the persisted\n * envelope automatically. Targets that need to canonicalize on the way\n * out (key ordering, dropping computed-only fields) override\n * `serializeContract` directly.\n */\nexport abstract class SqlContractSerializerBase<TContract extends Contract<SqlStorage>>\n implements ContractSerializer<TContract>\n{\n constructor(\n private readonly entityTypeRegistry: ReadonlyMap<string, SqlEntityHydrationFactory>,\n ) {}\n\n deserializeContract(json: unknown): TContract {\n const validated = this.parseSqlContractStructure(json);\n const hydrated = this.hydrateSqlStorage(validated);\n return this.constructTargetContract(hydrated);\n }\n\n serializeContract(contract: TContract): JsonObject {\n // Targets that ship enumerable runtime-only fields must override\n // this method (mirroring `MongoTargetContractSerializer.serializeContract`)\n // to construct the persisted envelope explicitly; the default identity\n // works only when every enumerable own property belongs in the JSON.\n return contract as unknown as JsonObject;\n }\n\n /**\n * Family-shared validation pipeline (delegates to\n * `validateSqlContractFully` in `@prisma-next/sql-contract/validators`):\n * structural arktype + framework-shared domain + SQL storage\n * logical-consistency + SQL storage semantic + model ↔ storage\n * reference checks. Subclasses override to add target-specific\n * structural checks before hydration; the family default suffices\n * for targets whose contract shape is the SQL-shared shape\n * (Postgres, SQLite today).\n */\n protected parseSqlContractStructure(json: unknown): Contract<SqlStorage> {\n return validateSqlContractFully<Contract<SqlStorage>>(json);\n }\n\n /**\n * Family-shared hydration walker. Lifts the validated flat-data\n * `storage` subtree into the SQL Contract IR class hierarchy by\n * constructing a single `SqlStorage` instance — its constructor\n * cascades nested instantiation of `StorageTable`, `StorageColumn`,\n * `PrimaryKey`, `UniqueConstraint`, `Index`, `ForeignKey`,\n * `ForeignKeyReferences`, and `StorageTypeInstance`. The rest of the\n * contract envelope (target identity, hashes, capabilities, models,\n * meta, …) is JSON-clean primitive data and passes through unchanged.\n *\n * Polymorphic `storage.types` entries are normalised before the\n * `SqlStorage` constructor runs: when an entry carries an enumerable\n * string `kind`, the serializer looks up a pack-registered hydration\n * factory for that discriminator and delegates reconstruction. Entries\n * with no registered factory pass through unchanged (codec-typed JSON\n * stays codec-typed until `SqlStorage` normalises it).\n */\n protected hydrateSqlStorage(validated: Contract<SqlStorage>): Contract<SqlStorage> {\n const types = validated.storage.types;\n const hydratedTypes =\n types !== undefined\n ? Object.fromEntries(\n Object.entries(types).map(([name, entry]) => [\n name,\n this.hydrateStorageTypeEntry(entry),\n ]),\n )\n : undefined;\n\n return {\n ...validated,\n storage: new SqlStorage({\n ...validated.storage,\n ...(hydratedTypes !== undefined ? { types: hydratedTypes } : {}),\n }),\n };\n }\n\n /**\n * Per-entry hydration dispatcher for `storage.types`. When `kind` is a\n * string and the constructor registry supplies a factory for that key,\n * the factory returns the hydrated `SqlStorageTypeEntry`. Otherwise the\n * entry passes through unchanged for `SqlStorage` to normalise.\n */\n protected hydrateStorageTypeEntry(entry: SqlStorageTypeEntry): SqlStorageTypeEntry {\n if (typeof entry !== 'object' || entry === null) {\n return entry;\n }\n const kind = (entry as { kind?: unknown }).kind;\n if (typeof kind !== 'string') {\n return entry;\n }\n const factory = this.entityTypeRegistry.get(kind);\n if (factory === undefined) {\n return entry;\n }\n return factory(entry);\n }\n\n /**\n * Target-specific construction hook. Defaults to identity; targets\n * that need to wrap the hydrated contract (e.g. attach target-only\n * derived fields, narrow the contract type to a target-specific\n * subtype) override.\n */\n protected constructTargetContract(hydrated: Contract<SqlStorage>): TContract {\n return hydrated as TContract;\n }\n}\n","import type { Contract } from '@prisma-next/contract/types';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { SqlContractSerializerBase } from './sql-contract-serializer-base';\n\n/**\n * Default SQL family `ContractSerializer` concretion. Inherits the\n * full SQL-shared deserialization pipeline (structural validation +\n * IR-class hydration) without pack-registered `storage.types`\n * hydration factories — targets that emit polymorphic JSON outside the\n * codec-typed envelope wire a target-specific subclass with a populated\n * registry (see Postgres). Family-level call sites instantiate this\n * default directly when no target serializer is supplied.\n */\nexport class SqlContractSerializer extends SqlContractSerializerBase<Contract<SqlStorage>> {\n constructor() {\n super(new Map());\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAsB,4BAAtB,MAEA;CAEqB;CADnB,YACE,oBACA;EADiB,KAAA,qBAAA;;CAGnB,oBAAoB,MAA0B;EAC5C,MAAM,YAAY,KAAK,0BAA0B,KAAK;EACtD,MAAM,WAAW,KAAK,kBAAkB,UAAU;EAClD,OAAO,KAAK,wBAAwB,SAAS;;CAG/C,kBAAkB,UAAiC;EAKjD,OAAO;;;;;;;;;;;;CAaT,0BAAoC,MAAqC;EACvE,OAAO,yBAA+C,KAAK;;;;;;;;;;;;;;;;;;;CAoB7D,kBAA4B,WAAuD;EACjF,MAAM,QAAQ,UAAU,QAAQ;EAChC,MAAM,gBACJ,UAAU,KAAA,IACN,OAAO,YACL,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,CAC3C,MACA,KAAK,wBAAwB,MAAM,CACpC,CAAC,CACH,GACD,KAAA;EAEN,OAAO;GACL,GAAG;GACH,SAAS,IAAI,WAAW;IACtB,GAAG,UAAU;IACb,GAAI,kBAAkB,KAAA,IAAY,EAAE,OAAO,eAAe,GAAG,EAAE;IAChE,CAAC;GACH;;;;;;;;CASH,wBAAkC,OAAiD;EACjF,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;EAET,MAAM,OAAQ,MAA6B;EAC3C,IAAI,OAAO,SAAS,UAClB,OAAO;EAET,MAAM,UAAU,KAAK,mBAAmB,IAAI,KAAK;EACjD,IAAI,YAAY,KAAA,GACd,OAAO;EAET,OAAO,QAAQ,MAAM;;;;;;;;CASvB,wBAAkC,UAA2C;EAC3E,OAAO;;;;;;;;;;;;;;ACxHX,IAAa,wBAAb,cAA2C,0BAAgD;CACzF,cAAc;EACZ,sBAAM,IAAI,KAAK,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-CA8h-8mQ.d.mts","names":[],"sources":["../src/core/control-instance.ts","../src/core/migrations/types.ts"],"mappings":"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"}
|