@prisma-next/family-sql 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { n as NativeTypeNormalizer, t as DefaultNormalizer } from "./verify-sql-schema-BBhkqEDo.mjs";
2
- import { ControlAdapterInstance, ControlDriverInstance } from "@prisma-next/framework-components/control";
2
+ import { ControlAdapterInstance, ControlDriverInstance, ControlStack } from "@prisma-next/framework-components/control";
3
+ import { AnyQueryAst, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
3
4
  import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
4
5
 
5
6
  //#region src/core/control-adapter.d.ts
@@ -36,6 +37,16 @@ interface SqlControlAdapter<TTarget extends string = string> extends ControlAdap
36
37
  * before comparison with contract native types during schema verification.
37
38
  */
38
39
  readonly normalizeNativeType?: NativeTypeNormalizer;
40
+ /**
41
+ * Lower a SQL query AST into a target-flavored `{ sql, params }` payload.
42
+ *
43
+ * Migration tooling (e.g. the `dataTransform` operation) needs to materialize
44
+ * SQL at emit/plan time without instantiating the runtime adapter. The control
45
+ * adapter's `lower` is byte-equivalent to the runtime adapter's `lower` for the
46
+ * same AST and contract, ensuring planned SQL matches what the runtime would
47
+ * emit.
48
+ */
49
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;
39
50
  }
40
51
  /**
41
52
  * SQL control adapter descriptor interface.
@@ -46,8 +57,11 @@ interface SqlControlAdapter<TTarget extends string = string> extends ControlAdap
46
57
  interface SqlControlAdapterDescriptor<TTarget extends string = string> {
47
58
  /**
48
59
  * Creates a SQL control adapter instance for control-plane operations.
60
+ *
61
+ * Receives the assembled `ControlStack` so adapters can read aggregated
62
+ * metadata (codec lookup, extension contributions) when materializing.
49
63
  */
50
- create(): SqlControlAdapter<TTarget>;
64
+ create(stack: ControlStack<'sql', TTarget>): SqlControlAdapter<TTarget>;
51
65
  }
52
66
  //#endregion
53
67
  export { type SqlControlAdapter, type SqlControlAdapterDescriptor };
@@ -1 +1 @@
1
- {"version":3,"file":"control-adapter.d.mts","names":[],"sources":["../src/core/control-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAaA;;;;AAkBa,UAlBI,iBAkBJ,CAAA,gBAAA,MAAA,GAAA,MAAA,CAAA,SAjBH,sBAiBG,CAAA,KAAA,EAjB2B,OAiB3B,CAAA,CAAA;EAAR;;;;;AAuBL;;;;;;;qBA1BY,6BAA6B,gDAGpC,QAAQ;;;;;;8BAOiB;;;;;;iCAOG;;;;;;;;UAShB;;;;YAIL,kBAAkB"}
1
+ {"version":3,"file":"control-adapter.d.mts","names":[],"sources":["../src/core/control-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAmBA;;;;AAkBa,UAlBI,iBAkBJ,CAAA,gBAAA,MAAA,GAAA,MAAA,CAAA,SAjBH,sBAiBG,CAAA,KAAA,EAjB2B,OAiB3B,CAAA,CAAA;EAAR;;;;;;;;AAkCL;;;;EAO+C,UAAA,CAAA,MAAA,EA5CnC,qBA4CmC,CAAA,KAAA,EA5CN,OA4CM,CAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAzC1C,OAyC0C,CAzClC,WAyCkC,CAAA;EAAiB;;;;;8BAlClC;;;;;;iCAOG;;;;;;;;;;aAWpB,sBAAsB,0BAA0B;;;;;;;;UAS5C;;;;;;;gBAOD,oBAAoB,WAAW,kBAAkB"}
package/dist/control.mjs CHANGED
@@ -186,7 +186,7 @@ function createSqlFamilyInstance(stack) {
186
186
  async schemaVerify(options) {
187
187
  const { driver, contract: contractInput, strict, context, frameworkComponents } = options;
188
188
  const contract = validateContract(contractInput, emptyCodecLookup);
189
- const controlAdapter = adapter.create();
189
+ const controlAdapter = adapter.create(stack);
190
190
  if (!isSqlControlAdapter(controlAdapter)) throw new Error("Adapter does not implement SqlControlAdapter.introspect()");
191
191
  return verifySqlSchema({
192
192
  contract,
@@ -272,7 +272,7 @@ function createSqlFamilyInstance(stack) {
272
272
  },
273
273
  async introspect(options) {
274
274
  const { driver, contract } = options;
275
- const controlAdapter = adapter.create();
275
+ const controlAdapter = adapter.create(stack);
276
276
  if (!isSqlControlAdapter(controlAdapter)) throw new Error("Adapter does not implement SqlControlAdapter.introspect()");
277
277
  return controlAdapter.introspect(driver, contract);
278
278
  },
@@ -1 +1 @@
1
- {"version":3,"file":"control.mjs","names":["contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n OperationContext,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds, readMarker } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n}\n\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 );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = adapter.create();\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n const { driver, contract } = options;\n\n const controlAdapter = adapter.create();\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n return controlAdapter.introspect(driver, contract);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":";;;;;;;;;;;;;AA0CA,SAAS,gCAAgC,UAAsC;CAC7E,MAAM,0BAAU,IAAI,KAAa;AAGjC,KACE,OAAO,aAAa,YACpB,aAAa,QACb,aAAa,YACb,OAAO,SAAS,YAAY,YAC5B,SAAS,YAAY,QACrB,YAAY,SAAS,SACrB;EACA,MAAM,UAAU,SAAS;AACzB,MAAI,QAAQ,UAAU,OAAO,QAAQ,WAAW,UAC9C;QAAK,MAAM,SAAS,OAAO,OAAO,QAAQ,OAAO,CAC/C,KACE,OAAO,UAAU,YACjB,UAAU,QACV,aAAa,SACb,OAAO,MAAM,YAAY,YACzB,MAAM,YAAY,MAClB;IACA,MAAM,UAAU,MAAM;AACtB,SAAK,MAAM,UAAU,OAAO,OAAO,QAAQ,CACzC,KACE,UACA,OAAO,WAAW,YAClB,aAAa,UACb,OAAO,OAAO,YAAY,SAE1B,SAAQ,IAAI,OAAO,QAAQ;;;;AAQvC,QAAO,MAAM,KAAK,QAAQ,CAAC,MAAM;;AAGnC,SAAS,mBAAmB,SAcH;CACvB,MAAMA,WAA0D,EAC9D,aAAa,QAAQ,qBACtB;AACD,KAAI,QAAQ,oBACV,UAAS,cAAc,QAAQ;CAGjC,MAAMC,SAAgD,EACpD,UAAU,QAAQ,kBACnB;AACD,KAAI,QAAQ,eACV,QAAO,SAAS,QAAQ;CAG1B,MAAMC,OAAsD,EAC1D,cAAc,QAAQ,cACvB;AACD,KAAI,QAAQ,WACV,MAAK,aAAa,QAAQ;CAG5B,MAAMC,SAA+B;EACnC,IAAI,QAAQ;EACZ,SAAS,QAAQ;EACjB;EACA;EACA;EACA,SAAS,EACP,OAAO,QAAQ,WAChB;EACF;AAED,KAAI,QAAQ,KACV,CAAC,OAA6B,OAAO,QAAQ;AAG/C,KAAI,QAAQ,OACV,CAAC,OAAqE,SAAS;EAC7E,aAAa,QAAQ,OAAO;EAC5B,aAAa,QAAQ,OAAO;EAC7B;AAGH,KAAI,QAAQ,cACV,CAAC,OAAiD,gBAAgB,QAAQ;AAG5E,KAAI,QAAQ,qBACV,CAAC,OAA8C,uBAC7C,QAAQ;AAGZ,QAAO;;AA8DT,SAAS,oBACP,OACuC;AACvC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,gBAAgB,SAChB,OAAQ,MAAkC,eAAe;;AAoB7D,SAAS,6BAA6B,SAIV;CAC1B,MAAM,EAAE,QAAQ,SAAS,gBAAgB,eAAe;CACxD,MAAM,2BAAW,IAAI,KAA8B;CACnD,MAAM,WAAW,QAAQ;CACzB,MAAM,cAAc;EAAC;EAAQ;EAAS,GAAG;EAAW;AAEpD,MAAK,MAAM,cAAc,aAAa;EAEpC,MAAM,eADQ,WAAW,OACG;AAE5B,MAAI,CAAC,aACH;AAGF,OAAK,MAAM,eAAe,aACxB,KAAI,YAAY,aAAa,SAAS,YAAY,aAAa,SAC7D,UAAS,IAAI,YAAY,QAAQ;GAC/B,QAAQ,YAAY;GACpB,UAAU;GACV,UAAU,YAAY;GACtB,GAAI,YAAY,eAAe,SAAY,EAAE,YAAY,YAAY,YAAY,GAAG,EAAE;GACvF,CAAC;;AAKR,QAAO;;AAGT,SAAgB,wBACd,OACmB;AACnB,KAAI,CAAC,MAAM,QACT,OAAM,IAAI,MAAM,4DAA4D;CAG9E,MAAM,SAAS,MAAM;CAErB,MAAM,UAAU,MAAM;CAEtB,MAAM,aACJ,MAAM;CAGR,MAAM,EAAE,kBAAkB,sBAAsB,iBAAiB;CAEjE,MAAM,uBAAuB,6BAA6B;EACxD;EACA;EACA,gBAAgB;EACjB,CAAC;AAEF,QAAO;EACL,UAAU;EACV;EACA;EACA;EACA;EAEA,iBAAiB,cAAiC;AAChD,UAAOC,iBAA0C,cAAc,iBAAiB;;EAGlF,MAAM,OAAO,eAMqB;GAChC,MAAM,EACJ,QACA,UAAU,aACV,kBACA,cACA,eACE;GACJ,MAAM,YAAY,KAAK,KAAK;GAE5B,MAAM,WAAWA,iBAA0C,aAAa,iBAAiB;GAEzF,MAAM,sBAAsB,SAAS,QAAQ;GAC7C,MAAM,sBAAsB,SAAS;GACrC,MAAM,iBAAiB,SAAS;GAEhC,MAAM,SAAS,MAAM,WAAW,OAAO;GAEvC,IAAIC;GACJ,IAAI,uBAAuB;GAC3B,MAAM,mBAAmB,6BAA6B;IAAC;IAAS;IAAQ,GAAG;IAAW,CAAC;AACvF,OAAI,iBAAiB,WAAW,EAC9B,wBAAuB;QAClB;IACL,MAAM,eAAe,IAAI,IAAI,iBAAiB;IAE9C,MAAM,UADc,gCAAgC,SAAS,CACjC,QAAQ,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC;AACjE,QAAI,QAAQ,SAAS,EACnB,iBAAgB;;AAIpB,OAAI,CAAC,OAEH,QAAO,mBAAmB;IACxB,IAAI;IACJ,MAAM;IACN,SAAS;IACT;IACA;IACA;IACA,WARgB,KAAK,KAAK,GAAG;IAS7B,GAAI,sBAAsB,EAAE,qBAAqB,GAAG,EAAE;IACtD,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;IAC1C,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACxD,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;IACrC,CAAC;AAGJ,OAAI,mBAAmB,iBAErB,QAAO,mBAAmB;IACxB,IAAI;IACJ,MAAM;IACN,SAAS;IACT;IACA;IACA;IACA,gBAAgB;IAChB;IACA,WAVgB,KAAK,KAAK,GAAG;IAW7B,GAAI,sBAAsB,EAAE,qBAAqB,GAAG,EAAE;IACtD,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;IAC1C,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACxD,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;IACrC,CAAC;AAGJ,OAAI,OAAO,gBAAgB,oBAEzB,QAAO,mBAAmB;IACxB,IAAI;IACJ,MAAM;IACN,SAAS;IACT;IACA;IACA;IACA;IACA,WATgB,KAAK,KAAK,GAAG;IAU7B,GAAI,sBAAsB,EAAE,qBAAqB,GAAG,EAAE;IACtD,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;IAC1C,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACxD,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;IACrC,CAAC;AAGJ,OAAI,uBAAuB,OAAO,gBAAgB,oBAEhD,QAAO,mBAAmB;IACxB,IAAI;IACJ,MAAM;IACN,SAAS;IACT;IACA;IACA;IACA;IACA;IACA,WAVgB,KAAK,KAAK,GAAG;IAW7B,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;IAC1C,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACxD,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;IACrC,CAAC;AAIJ,UAAO,mBAAmB;IACxB,IAAI;IACJ,SAAS;IACT;IACA;IACA;IACA;IACA,WARgB,KAAK,KAAK,GAAG;IAS7B,GAAI,sBAAsB,EAAE,qBAAqB,GAAG,EAAE;IACtD,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;IAC1C,GAAI,uBAAuB,EAAE,sBAAsB,GAAG,EAAE;IACxD,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;IACrC,CAAC;;EAGJ,MAAM,aAAa,SAAmE;GACpF,MAAM,EAAE,QAAQ,UAAU,eAAe,QAAQ,SAAS,wBAAwB;GAElF,MAAM,WAAWD,iBAA0C,eAAe,iBAAiB;GAE3F,MAAM,iBAAiB,QAAQ,QAAQ;AACvC,OAAI,CAAC,oBAAoB,eAAe,CACtC,OAAM,IAAI,MAAM,4DAA4D;AAI9E,UAAO,gBAAgB;IACrB;IACA,QAJe,MAAM,eAAe,WAAW,QAAQ,cAAc;IAKrE;IACA,GAAG,UAAU,WAAW,QAAQ;IAChC;IACA;IAEA,GAAG,UAAU,oBAAoB,eAAe,iBAAiB;IACjE,GAAG,UAAU,uBAAuB,eAAe,oBAAoB;IACxE,CAAC;;EAEJ,MAAM,KAAK,SAKqB;GAC9B,MAAM,EAAE,QAAQ,UAAU,eAAe,cAAc,eAAe;GACtE,MAAM,YAAY,KAAK,KAAK;GAE5B,MAAM,WAAWA,iBAA0C,eAAe,iBAAiB;GAE3F,MAAM,sBAAsB,SAAS,QAAQ;GAC7C,MAAM,sBACJ,iBAAiB,YAAY,OAAO,SAAS,gBAAgB,WACzD,SAAS,cACT;GACN,MAAM,iBAAiB,SAAS;AAEhC,SAAM,OAAO,MAAM,sBAAsB,KAAK,sBAAsB,OAAO;AAC3E,SAAM,OAAO,MAAM,qBAAqB,KAAK,qBAAqB,OAAO;GAEzE,MAAM,iBAAiB,MAAM,WAAW,OAAO;GAE/C,IAAI,gBAAgB;GACpB,IAAI,gBAAgB;GACpB,IAAIE;AAEJ,OAAI,CAAC,gBAAgB;IACnB,MAAM,QAAQ,oBAAoB;KAChC,aAAa;KACb,aAAa;KACb,cAAc;KACd,kBAAkB;KACnB,CAAC;AACF,UAAM,OAAO,MAAM,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACzD,oBAAgB;UACX;IACL,MAAM,sBAAsB,eAAe;IAC3C,MAAM,sBAAsB,eAAe;AAK3C,QAAI,EAHuB,wBAAwB,wBAGxB,EAFA,wBAAwB,sBAEH;AAC9C,sBAAiB;MACf,aAAa;MACb,aAAa;MACd;KACD,MAAM,QAAQ,oBAAoB;MAChC,aAAa;MACb,aAAa;MACb,cAAc;MACd,kBAAkB,eAAe,oBAAoB;MACtD,CAAC;AACF,WAAM,OAAO,MAAM,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACzD,qBAAgB;;;GAIpB,IAAIC;AACJ,OAAI,cACF,WAAU;YACD,cACT,WAAU,wCAAwC,gBAAgB,eAAe,UAAU;OAE3F,WAAU;GAGZ,MAAM,YAAY,KAAK,KAAK,GAAG;AAE/B,UAAO;IACL,IAAI;IACJ;IACA,UAAU;KACR,aAAa;KACb,aAAa;KACd;IACD,QAAQ;KACN,UAAU;KACV,QAAQ;KACT;IACD,QAAQ;KACN,SAAS;KACT,SAAS;KACT,GAAI,iBAAiB,EAAE,UAAU,gBAAgB,GAAG,EAAE;KACvD;IACD,MAAM;KACJ;KACA,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;KACrC;IACD,SAAS,EACP,OAAO,WACR;IACF;;EAEH,MAAM,WAAW,SAEwB;AACvC,UAAO,WAAW,QAAQ,OAAO;;EAEnC,MAAM,WAAW,SAGQ;GACvB,MAAM,EAAE,QAAQ,aAAa;GAE7B,MAAM,iBAAiB,QAAQ,QAAQ;AACvC,OAAI,CAAC,oBAAoB,eAAe,CACtC,OAAM,IAAI,MAAM,4DAA4D;AAE9E,UAAO,eAAe,WAAW,QAAQ,SAAS;;EAGpD,aAAa,QAAqC;GAChD,MAAMC,aAAwC,OAAO,QAAQ,OAAO,OAAO,CAAC,KACzE,CAAC,WAAW,WAAiC;IAC5C,MAAMC,WAA6B,EAAE;IAErC,MAAMC,cAAgC,EAAE;AACxC,SAAK,MAAM,CAAC,YAAY,WAAW,OAAO,QAAQ,MAAM,QAAQ,EAAE;KAGhE,MAAM,QAAQ,GAAG,WAAW,IAFR,OAAO,WAEiB,IADxB,OAAO,WAAW,aAAa,eACS;AAC5D,iBAAY,KACV,IAAI,eAAe;MACjB,MAAM;MACN,IAAI,UAAU,UAAU,GAAG;MAC3B;MACA,MAAM;OACJ,YAAY,OAAO;OACnB,UAAU,OAAO;OACjB,GAAG,UAAU,WAAW,OAAO,QAAQ;OACxC;MACF,CAAC,CACH;;AAGH,QAAI,YAAY,SAAS,EACvB,UAAS,KACP,IAAI,eAAe;KACjB,MAAM;KACN,IAAI,WAAW;KACf,OAAO;KACP,UAAU;KACX,CAAC,CACH;AAGH,QAAI,MAAM,YAAY;KACpB,MAAM,YAAY,MAAM,WAAW,QAAQ,KAAK,KAAK;AACrD,cAAS,KACP,IAAI,eAAe;MACjB,MAAM;MACN,IAAI,eAAe;MACnB,OAAO,gBAAgB;MACvB,MAAM;OACJ,SAAS,MAAM,WAAW;OAC1B,GAAI,MAAM,WAAW,OAAO,EAAE,MAAM,MAAM,WAAW,MAAM,GAAG,EAAE;OACjE;MACF,CAAC,CACH;;AAGH,SAAK,MAAM,UAAU,MAAM,SAAS;KAClC,MAAM,OAAO,OAAO,QAAQ,GAAG,UAAU,GAAG,OAAO,QAAQ,KAAK,IAAI,CAAC;KACrE,MAAM,QAAQ,UAAU;AACxB,cAAS,KACP,IAAI,eAAe;MACjB,MAAM;MACN,IAAI,UAAU,UAAU,GAAG;MAC3B;MACA,MAAM;OACJ,SAAS,OAAO;OAChB,QAAQ;OACT;MACF,CAAC,CACH;;AAGH,SAAK,MAAM,SAAS,MAAM,SAAS;KACjC,MAAM,OAAO,MAAM,QAAQ,iBAAiB,WAAW,MAAM,QAAQ;KACrE,MAAM,QAAQ,MAAM,SAAS,gBAAgB,SAAS,SAAS;AAC/D,cAAS,KACP,IAAI,eAAe;MACjB,MAAM;MACN,IAAI,SAAS,UAAU,GAAG;MAC1B;MACA,MAAM;OACJ,SAAS,MAAM;OACf,QAAQ,MAAM;OACf;MACF,CAAC,CACH;;IAGH,MAAMC,YAAqC,EAAE;AAC7C,QAAI,MAAM,YAAY;AACpB,eAAU,gBAAgB,MAAM,WAAW;AAC3C,SAAI,MAAM,WAAW,KACnB,WAAU,oBAAoB,MAAM,WAAW;;AAGnD,QAAI,MAAM,YAAY,SAAS,EAC7B,WAAU,iBAAiB,MAAM,YAAY,KAAK,QAAQ;KACxD,SAAS,GAAG;KACZ,iBAAiB,GAAG;KACpB,mBAAmB,GAAG;KACtB,GAAI,GAAG,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,EAAE;KACrC,EAAE;AAGL,WAAO,IAAI,eAAe;KACxB,MAAM;KACN,IAAI,SAAS;KACb,OAAO,SAAS;KAChB,GAAI,OAAO,KAAK,UAAU,CAAC,SAAS,IAAI,EAAE,MAAM,WAAW,GAAG,EAAE;KAChE,GAAI,SAAS,SAAS,IAAI,EAAE,UAAU,GAAG,EAAE;KAC5C,CAAC;KAEL;GAED,MAAMC,kBAA6C,OAAO,aAAa,KAAK,QAAQ;IAClF,MAAM,YAAY,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI;AACjD,WAAO,IAAI,eAAe;KACxB,MAAM;KACN,IAAI,cAAc,IAAI;KACtB,OAAO,GAAG,UAAU;KACrB,CAAC;KACF;GAEF,MAAM,eAAe,CAAC,GAAG,YAAY,GAAG,gBAAgB;AAExD,UAAO,EACL,MAAM,IAAI,eAAe;IACvB,MAAM;IACN,IAAI;IACJ,OAAO;IACP,GAAI,aAAa,SAAS,IAAI,EAAE,UAAU,cAAc,GAAG,EAAE;IAC9D,CAAC,EACH;;EAEJ;;;;;AC/qBH,IAAa,sBAAb,MAEA;CACE,AAAS,OAAO;CAChB,AAAS,KAAK;CACd,AAAS,WAAW;CACpB,AAAS,UAAU;CACnB,AAAS,WAAW;CACpB,AAAS,YAAY;EACnB,OAAO;EACP,MAAM;EACP;CAED,OACE,OAC0B;AAC1B,SAAO,wBAAwB,MAAM;;;;;;AC4BzC,SAAS,cACP,MACA,QACA,cACA,kBACA,eACa;CASb,MAAM,WAAW,0BAA0B,QAAQ,aAAa;AAQhE,QAAO;EACL;EACA,YATiB,mBACf,iBAAiB;GACf,YAAY,SAAS;GACrB,SAAS,SAAS;GAClB,GAAG,UAAU,cAAc,SAAS,WAAW;GAChD,CAAC,GACF,SAAS;EAIX,UAAU,OAAO;EACjB,GAAG,UACD,WACA,OAAO,WAAW,QAAQ,gBAAgB,cAAc,OAAO,SAAS,OAAO,GAAG,OACnF;EACF;;AAGH,SAAS,0BACP,QACA,cAC8D;AAC9D,KAAI,CAAC,OAAO,QACV,QAAO;CAET,MAAM,aAAa,aAAa,OAAO;AACvC,KAAI,CAAC,WACH,OAAM,IAAI,MACR,mCAAmC,OAAO,QAAQ,2CACnD;AAEH,QAAO;EACL,SAAS,WAAW;EACpB,YAAY,WAAW;EACvB,YAAY,WAAW;EACxB;;AAGH,SAAS,cAAc,QAAuC;AAC5D,QAAO;EACL,SAAS,OAAO;EAChB,GAAG,UAAU,QAAQ,OAAO,KAAK;EAClC;;AAGH,SAAS,aAAa,OAA0B;AAC9C,QAAO;EACL,SAAS,MAAM;EACf,QAAQ;EACR,GAAG,UAAU,QAAQ,MAAM,KAAK;EACjC;;AAGH,SAAS,kBAAkB,IAAiC;AAC1D,QAAO;EACL,SAAS,GAAG;EACZ,iBAAiB,GAAG,WAAW;EAC/B,mBAAmB,GAAG,WAAW;EACjC,GAAG,UAAU,QAAQ,GAAG,KAAK;EAC9B;;AAGH,SAAS,aACP,MACA,OACA,cACA,kBACA,eACY;CACZ,MAAMC,UAAuC,EAAE;AAC/C,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,MAAM,QAAQ,CAC3D,SAAQ,WAAW,cACjB,SACA,QACA,cACA,kBACA,cACD;CAGH,MAAM,wBAAwB,IAAI,IAAI;EACpC,GAAG,MAAM,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC;EACpD,GAAG,MAAM,QAAQ,KAAK,WAAW,OAAO,QAAQ,KAAK,IAAI,CAAC;EAC1D,GAAI,MAAM,aAAa,CAAC,MAAM,WAAW,QAAQ,KAAK,IAAI,CAAC,GAAG,EAAE;EACjE,CAAC;CACF,MAAMC,mBAAiC,EAAE;AACzC,MAAK,MAAM,MAAM,MAAM,aAAa;AAClC,MAAI,GAAG,UAAU,MAAO;EACxB,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI;AAChC,MAAI,sBAAsB,IAAI,IAAI,CAAE;AACpC,mBAAiB,KAAK;GACpB,SAAS,GAAG;GACZ,QAAQ;GACR,MAAM,iBAAiB,MAAM,GAAG,QAAQ;GACzC,CAAC;AACF,wBAAsB,IAAI,IAAI;;AAGhC,QAAO;EACL;EACA;EACA,GAAG,UAAU,cAAc,MAAM,WAAW;EAC5C,aAAa,MAAM,YAAY,IAAI,kBAAkB;EACrD,SAAS,MAAM,QAAQ,IAAI,cAAc;EACzC,SAAS,CAAC,GAAG,MAAM,QAAQ,IAAI,aAAa,EAAE,GAAG,iBAAiB;EACnE;;;;;;;;;;;AAYH,SAAgB,yBACd,MACA,IACqC;AACrC,KAAI,CAAC,KAAM,QAAO,EAAE;CAEpB,MAAM,UAAU,OAAe,QAAyB,OAAO,OAAO,OAAO,IAAI;CAEjF,MAAMC,YAAwC,EAAE;AAEhD,MAAK,MAAM,aAAa,OAAO,KAAK,KAAK,OAAO,EAAE;AAChD,MAAI,CAAC,OAAO,GAAG,QAAQ,UAAU,EAAE;AACjC,aAAU,KAAK;IACb,MAAM;IACN,SAAS,UAAU,UAAU;IAC9B,CAAC;AACF;;EAGF,MAAM,UAAU,GAAG,OAAO;EAC1B,MAAM,YAAY,KAAK,OAAO;AAC9B,MAAI,CAAC,UAAW;AAEhB,OAAK,MAAM,cAAc,OAAO,KAAK,UAAU,QAAQ,CACrD,KAAI,CAAC,OAAO,QAAQ,SAAS,WAAW,CACtC,WAAU,KAAK;GACb,MAAM;GACN,SAAS,WAAW,UAAU,KAAK,WAAW;GAC/C,CAAC;;AAKR,QAAO;;;;;;;;;;;;;;;;;AAyBT,SAAgB,mBACd,UACA,SACa;AACb,KAAI,QAAQ,oBAAoB,WAAW,EACzC,OAAM,IAAI,MAAM,iDAAiD;AAGnE,KAAI,CAAC,SACH,QAAO;EAAE,QAAQ,EAAE;EAAE,cAAc,EAAE;EAAE;CAGzC,MAAM,UAAU,SAAS;CACzB,MAAM,eAAe,QAAQ,SAAS,EAAE;CACxC,MAAMC,SAAqC,EAAE;AAC7C,MAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,QAAQ,OAAO,CAChE,QAAO,aAAa,aAClB,WACA,UACA,cACA,QAAQ,kBACR,QAAQ,cACT;AAQH,QAAO;EACL;EACA,cAPmB,yBACnB,wBAAwB,QAAQ,uBAAuB,EAAE,CAAC,CAC3D;EAMC,GAAG,UAAU,eALK,kBAAkB,SAAS,QAAQ,oBAAoB,CAKjC;EACzC;;AAGH,SAAS,yBACP,MACyB;CACzB,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAMC,SAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,IAAI,GAAG,MAAM,CAAC,WAAW,EAC3B,OAAM,IAAI,MAAM,2CAA2C;AAE7D,MAAI,KAAK,IAAI,IAAI,GAAG,CAAE;AACtB,OAAK,IAAI,IAAI,GAAG;AAChB,SAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;;AAE7B,QAAO;;AAGT,SAAS,kBACP,SACA,qBAC4B;AAC5B,KAAI,CAAC,QAAQ,SAAS,OAAO,KAAK,QAAQ,MAAM,CAAC,WAAW,EAAG,QAAO;CAEtE,MAAMC,eAA+D,EAAE;AACvE,MAAK,MAAM,gBAAgB,OAAO,OAAO,QAAQ,MAAM,CACrD,cAAa,aAAa,cAAc;AAE1C,QAAO,GAAG,sBAAsB,EAAE,cAAc,cAAc,EAAE;;;;;AClSlE,MAAMC,sBAA6C,OAAO,OAAO,EAAE,CAAC;AAEpE,SAAS,YAAiC,OAAa;AACrD,KAAI,UAAU,oBACZ,QAAO;AAET,QAAO,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;;AAGpC,SAAS,YACP,OAC0C;AAC1C,KAAI,MAAM,WAAW,EACnB,QAAO,OAAO,OAAO,EAAE,CAAC;AAE1B,QAAO,OAAO,OACZ,MAAM,KAAK,SACT,OAAO,OAAO;EACZ,aAAa,KAAK;EAClB,KAAK,KAAK;EACV,GAAI,KAAK,OAAO,EAAE,MAAM,YAAY,KAAK,KAAK,EAAE,GAAG,EAAE;EACtD,CAAC,CACH,CACF;;AAGH,SAAS,mBAAsB,OAAa;AAE1C,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC;AAGlC,QAAO,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;;AAGpC,SAAS,oBACP,QACiD;AACjD,QAAO,OAAO,OAAO;EACnB,IAAI,OAAO;EACX,GAAI,OAAO,YAAY,SAAY,EAAE,SAAS,mBAAmB,OAAO,QAAQ,EAAE,GAAG,EAAE;EACxF,CAAC;;AAGJ,SAAS,gBACP,WAC2C;AAC3C,QAAO,OAAO,OAAO;EACnB,IAAI,UAAU;EACd,OAAO,UAAU;EACjB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,SAAS,GAAG,EAAE;EAC3D,gBAAgB,UAAU;EAC1B,QAAQ,oBAAoB,UAAU,OAAO;EAC7C,UAAU,YAAY,UAAU,SAAS;EACzC,SAAS,YAAY,UAAU,QAAQ;EACvC,WAAW,YAAY,UAAU,UAAU;EAC3C,GAAI,UAAU,OAAO,EAAE,MAAM,YAAY,UAAU,KAAK,EAAE,GAAG,EAAE;EAChE,CAAC;;AAGJ,SAAS,iBACP,YACsD;AACtD,KAAI,WAAW,WAAW,EACxB,QAAO,OAAO,OAAO,EAAE,CAAC;AAE1B,QAAO,OAAO,OAAO,WAAW,KAAK,cAAc,gBAAgB,UAAU,CAAC,CAAC;;AAGjF,SAAgB,oBACd,SACkC;AAClC,QAAO,OAAO,OAAO;EACnB,UAAU,QAAQ;EAClB,GAAI,QAAQ,WAAW,SACnB,EAAE,QAAQ,QAAQ,SAAS,OAAO,OAAO,EAAE,GAAG,QAAQ,QAAQ,CAAC,GAAG,MAAM,GACxE,EAAE;EACN,aAAa,OAAO,OAAO,EAAE,GAAG,QAAQ,aAAa,CAAC;EACtD,YAAY,iBAAiB,QAAQ,WAAW;EAChD,GAAI,QAAQ,OAAO,EAAE,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG,EAAE;EAC5D,CAAC;;AAGJ,SAAgB,eACd,MACyC;AACzC,QAAO,OAAO,OAAO;EACnB,MAAM;EACN;EACD,CAAC;;AAGJ,SAAgB,eAAe,WAAmE;AAChG,QAAO,OAAO,OAAO;EACnB,MAAM;EACN,WAAW,OAAO,OAChB,UAAU,KAAK,aACb,OAAO,OAAO;GACZ,MAAM,SAAS;GACf,SAAS,SAAS;GAClB,GAAI,SAAS,MAAM,EAAE,KAAK,SAAS,KAAK,GAAG,EAAE;GAC7C,GAAI,SAAS,WAAW,EAAE,UAAU,OAAO,OAAO,EAAE,GAAG,SAAS,UAAU,CAAC,EAAE,GAAG,EAAE;GAClF,GAAI,SAAS,OAAO,EAAE,MAAM,YAAY,SAAS,KAAK,EAAE,GAAG,EAAE;GAC9D,CAAC,CACH,CACF;EACF,CAAC;;;;;AAMJ,SAAgB,cAAc,OAGS;AACrC,QAAO,GACL,OAAO,OAAO;EACZ,mBAAmB,MAAM;EACzB,oBAAoB,MAAM;EAC3B,CAAC,CACH;;;;;AAMH,SAAgB,cACd,MACA,SACA,SACkC;AAOlC,QAAO,MANoC,OAAO,OAAO;EACvD;EACA;EACA,GAAI,SAAS,MAAM,EAAE,KAAK,QAAQ,KAAK,GAAG,EAAE;EAC5C,GAAI,SAAS,OAAO,EAAE,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG,EAAE;EAC7D,CAAC,CACmB;;;;;;;;AC7JvB,MAAaC,uBAAiD,OAAO,OAAO,EAC1E,yBAAyB,OAAO,OAAO,CAAC,WAAW,CAAU,EAC9D,CAAC;;;;AC+DF,sBAAe,IAAI,qBAAqB"}
1
+ {"version":3,"file":"control.mjs","names":["contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n OperationContext,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds, readMarker } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n}\n\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 );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n const { driver, contract } = options;\n\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n return controlAdapter.introspect(driver, contract);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
@@ -30,7 +30,7 @@ import { Migration } from "@prisma-next/migration-tools/migration";
30
30
  * `addColumn`) and data-transform operations (e.g. `dataTransform`). Mirrors
31
31
  * `MongoMigration`'s parameterization on `AnyMongoMigrationOperation`.
32
32
  */
33
- declare abstract class SqlMigration<TDetails extends SqlPlanTargetDetails> extends Migration<AnySqlMigrationOperation<TDetails>> {}
33
+ declare abstract class SqlMigration<TDetails extends SqlPlanTargetDetails, TTargetId extends string = string> extends Migration<AnySqlMigrationOperation<TDetails>, 'sql', TTargetId> {}
34
34
  //#endregion
35
35
  export { SqlMigration as Migration };
36
36
  //# sourceMappingURL=migration.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration.d.mts","names":[],"sources":["../src/core/sql-migration.ts"],"sourcesContent":[],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;uBAAsB,8BAA8B,8BAA8B,UAChF,yBAAyB"}
1
+ {"version":3,"file":"migration.d.mts","names":[],"sources":["../src/core/sql-migration.ts"],"sourcesContent":[],"mappings":";;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;uBAAsB,8BACH,iEAET,UAAU,yBAAyB,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"migration.mjs","names":[],"sources":["../src/core/sql-migration.ts"],"sourcesContent":["import { Migration } from '@prisma-next/migration-tools/migration';\nimport type { AnySqlMigrationOperation, SqlPlanTargetDetails } from './migrations/types';\n\n/**\n * Family-owned base class for SQL migrations.\n *\n * Parameterized on the target-details shape because SQL-family targets\n * (Postgres, MySQL, SQLite, …) each carry their own `target.details` payload\n * on `SqlMigrationPlanOperation`. The type parameter is narrowed to\n * `SqlPlanTargetDetails` so every target-specific shape must at minimum\n * identify the object being targeted (schema + name); concrete targets\n * extend the shape with their own fields.\n *\n * Each concrete target-side subclass (e.g. Postgres's\n * `TypeScriptRenderablePostgresMigration`) fixes `targetId` to its own\n * target-id string literal, since SQL can't hardcode a single `targetId`:\n * `targetId` is a target-level identity, not a family-level one, and\n * belongs on the subclass.\n *\n * `familyId` is intentionally not declared here. The SQL family has no\n * family-scoped runtime identity today — consumers reach the family via\n * target descriptors rather than by family-id lookup, so adding one would\n * be purely decorative. Introducing it later is a non-breaking superset.\n *\n * The operation type parameter is `AnySqlMigrationOperation<TDetails>` — the\n * union of DDL-shaped `SqlMigrationPlanOperation` and `DataTransformOperation`\n * — so subclasses can return a mix of schema operations (e.g. `setNotNull`,\n * `addColumn`) and data-transform operations (e.g. `dataTransform`). Mirrors\n * `MongoMigration`'s parameterization on `AnyMongoMigrationOperation`.\n */\nexport abstract class SqlMigration<TDetails extends SqlPlanTargetDetails> extends Migration<\n AnySqlMigrationOperation<TDetails>\n> {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAsB,eAAtB,cAAkF,UAEhF"}
1
+ {"version":3,"file":"migration.mjs","names":[],"sources":["../src/core/sql-migration.ts"],"sourcesContent":["import { Migration } from '@prisma-next/migration-tools/migration';\nimport type { AnySqlMigrationOperation, SqlPlanTargetDetails } from './migrations/types';\n\n/**\n * Family-owned base class for SQL migrations.\n *\n * Parameterized on the target-details shape because SQL-family targets\n * (Postgres, MySQL, SQLite, …) each carry their own `target.details` payload\n * on `SqlMigrationPlanOperation`. The type parameter is narrowed to\n * `SqlPlanTargetDetails` so every target-specific shape must at minimum\n * identify the object being targeted (schema + name); concrete targets\n * extend the shape with their own fields.\n *\n * Each concrete target-side subclass (e.g. Postgres's\n * `TypeScriptRenderablePostgresMigration`) fixes `targetId` to its own\n * target-id string literal, since SQL can't hardcode a single `targetId`:\n * `targetId` is a target-level identity, not a family-level one, and\n * belongs on the subclass.\n *\n * `familyId` is intentionally not declared here. The SQL family has no\n * family-scoped runtime identity today — consumers reach the family via\n * target descriptors rather than by family-id lookup, so adding one would\n * be purely decorative. Introducing it later is a non-breaking superset.\n *\n * The operation type parameter is `AnySqlMigrationOperation<TDetails>` — the\n * union of DDL-shaped `SqlMigrationPlanOperation` and `DataTransformOperation`\n * — so subclasses can return a mix of schema operations (e.g. `setNotNull`,\n * `addColumn`) and data-transform operations (e.g. `dataTransform`). Mirrors\n * `MongoMigration`'s parameterization on `AnyMongoMigrationOperation`.\n */\nexport abstract class SqlMigration<\n TDetails extends SqlPlanTargetDetails,\n TTargetId extends string = string,\n> extends Migration<AnySqlMigrationOperation<TDetails>, 'sql', TTargetId> {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAsB,eAAtB,cAGU,UAAgE"}
package/package.json CHANGED
@@ -1,36 +1,36 @@
1
1
  {
2
2
  "name": "@prisma-next/family-sql",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "SQL family descriptor for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.0.0",
9
- "@prisma-next/emitter": "0.4.1",
10
- "@prisma-next/contract": "0.4.1",
11
- "@prisma-next/framework-components": "0.4.1",
12
- "@prisma-next/operations": "0.4.1",
13
- "@prisma-next/migration-tools": "0.4.1",
14
- "@prisma-next/sql-contract-ts": "0.4.1",
15
- "@prisma-next/sql-operations": "0.4.1",
16
- "@prisma-next/sql-runtime": "0.4.1",
17
- "@prisma-next/sql-contract": "0.4.1",
18
- "@prisma-next/sql-relational-core": "0.4.1",
19
- "@prisma-next/sql-schema-ir": "0.4.1",
20
- "@prisma-next/sql-contract-emitter": "0.4.1",
21
- "@prisma-next/utils": "0.4.1",
22
- "@prisma-next/runtime-executor": "0.4.1"
9
+ "@prisma-next/contract": "0.4.2",
10
+ "@prisma-next/migration-tools": "0.4.2",
11
+ "@prisma-next/emitter": "0.4.2",
12
+ "@prisma-next/operations": "0.4.2",
13
+ "@prisma-next/sql-contract-emitter": "0.4.2",
14
+ "@prisma-next/sql-contract": "0.4.2",
15
+ "@prisma-next/framework-components": "0.4.2",
16
+ "@prisma-next/sql-contract-ts": "0.4.2",
17
+ "@prisma-next/runtime-executor": "0.4.2",
18
+ "@prisma-next/sql-operations": "0.4.2",
19
+ "@prisma-next/sql-relational-core": "0.4.2",
20
+ "@prisma-next/sql-runtime": "0.4.2",
21
+ "@prisma-next/utils": "0.4.2",
22
+ "@prisma-next/sql-schema-ir": "0.4.2"
23
23
  },
24
24
  "devDependencies": {
25
25
  "tsdown": "0.18.4",
26
26
  "typescript": "5.9.3",
27
27
  "vitest": "4.0.17",
28
- "@prisma-next/driver-postgres": "0.4.1",
29
- "@prisma-next/psl-parser": "0.4.1",
30
- "@prisma-next/sql-contract-psl": "0.4.1",
31
- "@prisma-next/test-utils": "0.0.1",
28
+ "@prisma-next/psl-parser": "0.4.2",
29
+ "@prisma-next/driver-postgres": "0.4.2",
30
+ "@prisma-next/sql-contract-psl": "0.4.2",
31
+ "@prisma-next/tsconfig": "0.0.0",
32
32
  "@prisma-next/tsdown": "0.0.0",
33
- "@prisma-next/tsconfig": "0.0.0"
33
+ "@prisma-next/test-utils": "0.0.1"
34
34
  },
35
35
  "files": [
36
36
  "dist",
@@ -1,7 +1,13 @@
1
1
  import type {
2
2
  ControlAdapterInstance,
3
3
  ControlDriverInstance,
4
+ ControlStack,
4
5
  } from '@prisma-next/framework-components/control';
6
+ import type {
7
+ AnyQueryAst,
8
+ LoweredStatement,
9
+ LowererContext,
10
+ } from '@prisma-next/sql-relational-core/ast';
5
11
  import type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';
6
12
  import type { DefaultNormalizer, NativeTypeNormalizer } from './schema-verify/verify-sql-schema';
7
13
 
@@ -44,6 +50,17 @@ export interface SqlControlAdapter<TTarget extends string = string>
44
50
  * before comparison with contract native types during schema verification.
45
51
  */
46
52
  readonly normalizeNativeType?: NativeTypeNormalizer;
53
+
54
+ /**
55
+ * Lower a SQL query AST into a target-flavored `{ sql, params }` payload.
56
+ *
57
+ * Migration tooling (e.g. the `dataTransform` operation) needs to materialize
58
+ * SQL at emit/plan time without instantiating the runtime adapter. The control
59
+ * adapter's `lower` is byte-equivalent to the runtime adapter's `lower` for the
60
+ * same AST and contract, ensuring planned SQL matches what the runtime would
61
+ * emit.
62
+ */
63
+ lower(ast: AnyQueryAst, context: LowererContext<unknown>): LoweredStatement;
47
64
  }
48
65
 
49
66
  /**
@@ -55,6 +72,9 @@ export interface SqlControlAdapter<TTarget extends string = string>
55
72
  export interface SqlControlAdapterDescriptor<TTarget extends string = string> {
56
73
  /**
57
74
  * Creates a SQL control adapter instance for control-plane operations.
75
+ *
76
+ * Receives the assembled `ControlStack` so adapters can read aggregated
77
+ * metadata (codec lookup, extension contributions) when materializing.
58
78
  */
59
- create(): SqlControlAdapter<TTarget>;
79
+ create(stack: ControlStack<'sql', TTarget>): SqlControlAdapter<TTarget>;
60
80
  }
@@ -435,7 +435,7 @@ export function createSqlFamilyInstance<TTargetId extends string>(
435
435
 
436
436
  const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);
437
437
 
438
- const controlAdapter = adapter.create();
438
+ const controlAdapter = adapter.create(stack);
439
439
  if (!isSqlControlAdapter(controlAdapter)) {
440
440
  throw new Error('Adapter does not implement SqlControlAdapter.introspect()');
441
441
  }
@@ -559,7 +559,7 @@ export function createSqlFamilyInstance<TTargetId extends string>(
559
559
  }): Promise<SqlSchemaIR> {
560
560
  const { driver, contract } = options;
561
561
 
562
- const controlAdapter = adapter.create();
562
+ const controlAdapter = adapter.create(stack);
563
563
  if (!isSqlControlAdapter(controlAdapter)) {
564
564
  throw new Error('Adapter does not implement SqlControlAdapter.introspect()');
565
565
  }
@@ -28,6 +28,7 @@ import type { AnySqlMigrationOperation, SqlPlanTargetDetails } from './migration
28
28
  * `addColumn`) and data-transform operations (e.g. `dataTransform`). Mirrors
29
29
  * `MongoMigration`'s parameterization on `AnyMongoMigrationOperation`.
30
30
  */
31
- export abstract class SqlMigration<TDetails extends SqlPlanTargetDetails> extends Migration<
32
- AnySqlMigrationOperation<TDetails>
33
- > {}
31
+ export abstract class SqlMigration<
32
+ TDetails extends SqlPlanTargetDetails,
33
+ TTargetId extends string = string,
34
+ > extends Migration<AnySqlMigrationOperation<TDetails>, 'sql', TTargetId> {}