@prisma-next/family-sql 0.3.0-pr.94.2 → 0.3.0-pr.94.4

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 +1 @@
1
- {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/descriptor.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;cAWa,mBAAA,YACA,+BAA+B;;;EAD/B,SAAA,QAAA,EAAA,KACX;EAA0C,SAAA,OAAA,GAAA,OAAA;EAAwB,SAAA,IAAA,EAAA;;iCAAA,yBAAA,CAAA;;;;;;;;0CASzD,yBAAyB,aAC/B;;;;iBCuEW,6CACL,8BAA8B,kBACtC,iBAAiB;iBAYJ,qCACR,iBAAiB,kBACtB,wBAAwB;iBAOX,cAAA,qBAAmC,uBAAuB;;;;iBAoB1D,aAAA;ED7HH,iBAAA,EAAA,MACX;EAA0C,kBAAA,EAAA,MAAA;CAAwB,CAAA,EC+HhE,ED/HgE,CC+H7D,8BD/H6D,CAAA;;;;iBC2IpD,aAAA,OACR;;SAE2B;IAChC,MAAM;;;;;;cCtJI,sBAAsB;;;;;;AFMnC;cGsCkC,QHrCU,EGqCV,mBHrCU"}
1
+ {"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/descriptor.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;cAWa,mBAAA,YACA,+BAA+B;;;EAD/B,SAAA,QAAA,EAAA,KACX;EAA0C,SAAA,OAAA,GAAA,OAAA;EAAwB,SAAA,IAAA,EAAA;;iCAAA,yBAAA,CAAA;;;;;;;;0CASzD,yBAAyB,aAC/B;;;;iBCuEW,6CACL,8BAA8B,kBACtC,iBAAiB;iBAYJ,qCACR,iBAAiB,kBACtB,wBAAwB;iBAOX,cAAA,qBAAmC,uBAAuB;;;;iBAoB1D,aAAA;ED7HH,iBAAA,EAAA,MACX;EAA0C,kBAAA,EAAA,MAAA;CAAwB,CAAA,EC+HhE,ED/HgE,CC+H7D,8BD/H6D,CAAA;;;;iBC2IpD,aAAA,OACR;;SAE2B;IAChC,MAAM;;;;;;cCtJI,sBAAsB;;;;;;AFMnC;cGsCqC,QHrCO,EGqCP,mBHrCO"}
package/dist/control.mjs CHANGED
@@ -1,6 +1,4 @@
1
1
  import { n as createSqlFamilyInstance } from "./instance-B_PdDN4y.mjs";
2
- import "./verify-sql-schema-BnLVoeWI.mjs";
3
- import "./verify-DhFytkFC.mjs";
4
2
  import { sqlTargetFamilyHook } from "@prisma-next/sql-contract-emitter";
5
3
  import { notOk, ok } from "@prisma-next/utils/result";
6
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"control.mjs","names":["readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/descriptor.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n ControlFamilyDescriptor,\n ControlPlaneStack,\n} from '@prisma-next/core-control-plane/types';\nimport { sqlTargetFamilyHook } from '@prisma-next/sql-contract-emitter';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './instance';\n\n/**\n * SQL family descriptor implementation.\n * Provides the SQL family hook and factory method.\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 hook = sqlTargetFamilyHook;\n\n create<TTargetId extends string>(\n stack: ControlPlaneStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n // Note: driver is not passed here because SqlFamilyInstance operations\n // (validate, emit, etc.) don't require DB connectivity. Commands that\n // need the driver (verify, introspect) get it directly from the stack.\n return createSqlFamilyInstance({\n target: stack.target,\n adapter: stack.adapter,\n extensionPacks: stack.extensionPacks,\n });\n }\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/core-control-plane/types';\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/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/core-control-plane/types';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/instance';\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';\n// SQL-specific types\nexport type {\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\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} from '../core/migrations/types';\n\n/**\n * SQL family descriptor for control plane (CLI/config).\n * Provides the SQL family hook and conversion helpers.\n */\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
1
+ {"version":3,"file":"control.mjs","names":["readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/descriptor.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n ControlFamilyDescriptor,\n ControlPlaneStack,\n} from '@prisma-next/core-control-plane/types';\nimport { sqlTargetFamilyHook } from '@prisma-next/sql-contract-emitter';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './instance.ts';\n\n/**\n * SQL family descriptor implementation.\n * Provides the SQL family hook and factory method.\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 hook = sqlTargetFamilyHook;\n\n create<TTargetId extends string>(\n stack: ControlPlaneStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n // Note: driver is not passed here because SqlFamilyInstance operations\n // (validate, emit, etc.) don't require DB connectivity. Commands that\n // need the driver (verify, introspect) get it directly from the stack.\n return createSqlFamilyInstance({\n target: stack.target,\n adapter: stack.adapter,\n extensionPacks: stack.extensionPacks,\n });\n }\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.ts';\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/core-control-plane/types';\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/descriptor.ts';\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/core-control-plane/types';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/instance.ts';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers.ts';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies.ts';\n// SQL-specific types\nexport type {\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\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} from '../core/migrations/types.ts';\n\n/**\n * SQL family descriptor for control plane (CLI/config).\n * Provides the SQL family hook and conversion helpers.\n */\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"instance-B_PdDN4y.mjs","names":["convertOperationManifest","imports: TypesImportSpec[]","ids: string[]","contract: { coreHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","missingCodecs: readonly string[] | undefined","options","previousHashes: { coreHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","extensionNodes: readonly SchemaTreeNode[]"],"sources":["../src/core/assembly.ts","../src/core/instance.ts"],"sourcesContent":["import type { OperationManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { TypesImportSpec } from '@prisma-next/contract/types';\nimport type {\n ControlAdapterDescriptor,\n ControlExtensionDescriptor,\n ControlTargetDescriptor,\n} from '@prisma-next/core-control-plane/types';\nimport type { OperationRegistry, OperationSignature } from '@prisma-next/operations';\nimport { createOperationRegistry } from '@prisma-next/operations';\n\n/**\n * Assembles an operation registry from descriptors (adapter, target, extensions).\n * Loops over descriptors, extracts operations, converts them using the provided\n * conversion function, and registers them in a new registry.\n */\nexport function assembleOperationRegistry(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n convertOperationManifest: (manifest: OperationManifest) => OperationSignature,\n): OperationRegistry {\n const registry = createOperationRegistry();\n\n for (const descriptor of descriptors) {\n const operations = descriptor.operations ?? [];\n for (const operationManifest of operations as ReadonlyArray<OperationManifest>) {\n const signature = convertOperationManifest(operationManifest);\n registry.register(signature);\n }\n }\n\n return registry;\n}\n\n/**\n * Extracts codec type imports from descriptors for contract.d.ts generation.\n */\nexport function extractCodecTypeImports(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n): ReadonlyArray<TypesImportSpec> {\n const imports: TypesImportSpec[] = [];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const codecTypes = types?.codecTypes;\n if (codecTypes?.import) {\n imports.push(codecTypes.import);\n }\n }\n\n return imports;\n}\n\n/**\n * Extracts operation type imports from descriptors for contract.d.ts generation.\n */\nexport function extractOperationTypeImports(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n): ReadonlyArray<TypesImportSpec> {\n const imports: TypesImportSpec[] = [];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const operationTypes = types?.operationTypes;\n if (operationTypes?.import) {\n imports.push(operationTypes.import);\n }\n }\n\n return imports;\n}\n\n/**\n * Extracts extension IDs from descriptors in deterministic order:\n * [adapter.id, target.id, ...extensions.map(e => e.id)]\n * Deduplicates while preserving stable order.\n */\nexport function extractExtensionIds(\n adapter: ControlAdapterDescriptor<'sql', string>,\n target: ControlTargetDescriptor<'sql', string>,\n extensions: ReadonlyArray<ControlExtensionDescriptor<'sql', string>>,\n): ReadonlyArray<string> {\n const ids: string[] = [];\n const seen = new Set<string>();\n\n // Add adapter first\n if (!seen.has(adapter.id)) {\n ids.push(adapter.id);\n seen.add(adapter.id);\n }\n\n // Add target second\n if (!seen.has(target.id)) {\n ids.push(target.id);\n seen.add(target.id);\n }\n\n // Add extensions in order\n for (const ext of extensions) {\n if (!seen.has(ext.id)) {\n ids.push(ext.id);\n seen.add(ext.id);\n }\n }\n\n return ids;\n}\n","import type { TargetBoundComponentDescriptor } from '@prisma-next/contract/framework-components';\nimport type { ContractIR } from '@prisma-next/contract/ir';\nimport type { OperationManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { ContractMarkerRecord, TypesImportSpec } from '@prisma-next/contract/types';\nimport { emit } from '@prisma-next/core-control-plane/emission';\nimport type { CoreSchemaView, SchemaTreeNode } from '@prisma-next/core-control-plane/schema-view';\nimport type {\n ControlAdapterDescriptor,\n ControlDriverInstance,\n ControlExtensionDescriptor,\n ControlFamilyInstance,\n ControlTargetDescriptor,\n EmitContractResult,\n OperationContext,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/core-control-plane/types';\nimport type { OperationRegistry } from '@prisma-next/operations';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport { sqlTargetFamilyHook } from '@prisma-next/sql-contract-emitter';\nimport { validateContract } from '@prisma-next/sql-contract-ts/contract';\nimport type { SqlOperationSignature } from '@prisma-next/sql-operations';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n assembleOperationRegistry,\n extractCodecTypeImports,\n extractExtensionIds,\n extractOperationTypeImports,\n} from './assembly';\nimport type { SqlControlAdapter } from './control-adapter';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds, readMarker } from './verify';\n\n/**\n * Converts an OperationManifest (descriptor declarative data) to a SqlOperationSignature.\n * This is SQL-family-specific conversion logic used by instance creation and test utilities.\n */\nexport function convertOperationManifest(manifest: OperationManifest): SqlOperationSignature {\n return {\n forTypeId: manifest.for,\n method: manifest.method,\n args: manifest.args.map((arg: OperationManifest['args'][number]) => {\n if (arg.kind === 'typeId') {\n if (!arg.type) {\n throw new Error('typeId arg must have type property');\n }\n return { kind: 'typeId' as const, type: arg.type };\n }\n if (arg.kind === 'param') {\n return { kind: 'param' as const };\n }\n if (arg.kind === 'literal') {\n return { kind: 'literal' as const };\n }\n throw new Error(`Invalid arg kind: ${(arg as { kind: unknown }).kind}`);\n }),\n returns: (() => {\n if (manifest.returns.kind === 'typeId') {\n return { kind: 'typeId' as const, type: manifest.returns.type };\n }\n if (manifest.returns.kind === 'builtin') {\n return {\n kind: 'builtin' as const,\n type: manifest.returns.type as 'number' | 'boolean' | 'string',\n };\n }\n throw new Error(`Invalid return kind: ${(manifest.returns as { kind: unknown }).kind}`);\n })(),\n lowering: {\n targetFamily: 'sql',\n strategy: manifest.lowering.strategy,\n template: manifest.lowering.template,\n },\n ...(manifest.capabilities ? { capabilities: manifest.capabilities } : {}),\n };\n}\n\n/**\n * Extracts codec type IDs used in contract storage tables.\n * Uses type guards to safely access SQL-specific structure without importing SQL types.\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\n/**\n * Creates a VerifyDatabaseResult object with common structure.\n */\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractCoreHash: 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: { coreHash: string; profileHash?: string } = {\n coreHash: options.contractCoreHash,\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?: { coreHash: string; profileHash: string } }).marker = {\n coreHash: options.marker.coreHash,\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\n/**\n * Type metadata for SQL storage types.\n * Maps contract storage type IDs to native database types.\n */\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\n/**\n * Registry mapping type IDs to their metadata.\n * Keyed by contract storage type ID (e.g., 'pg/int4@1').\n */\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\n/**\n * State fields for SQL family instance that hold assembly data.\n */\ninterface SqlFamilyInstanceState {\n readonly operationRegistry: OperationRegistry;\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\n/**\n * Options for schema verification.\n */\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: 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\n/**\n * SQL control family instance interface.\n * Extends ControlFamilyInstance with SQL-specific domain actions.\n */\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql'>,\n SqlFamilyInstanceState {\n /**\n * Validates a contract JSON and returns a validated ContractIR (without mappings).\n * Mappings are runtime-only and should not be part of ContractIR.\n */\n validateContractIR(contractJson: unknown): ContractIR;\n\n /**\n * Verifies the database marker against the contract.\n * Compares target, coreHash, and profileHash.\n */\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n /**\n * Verifies the database schema against the contract.\n * Compares contract requirements against live database schema.\n */\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n /**\n * Signs the database with the contract marker.\n * Writes or updates the contract marker if schema verification passes.\n * This operation is idempotent - if the marker already matches, no changes are made.\n */\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n /**\n * Introspects the database schema and returns a family-specific schema IR.\n *\n * This is a read-only operation that returns a snapshot of the live database schema.\n * The method is family-owned and delegates to target/adapter-specific introspectors\n * to perform the actual schema introspection.\n *\n * @param options - Introspection options\n * @param options.driver - Control plane driver for database connection\n * @param options.contractIR - Optional contract IR for contract-guided introspection.\n * When provided, families may use it for filtering, optimization, or validation\n * during introspection. The contract IR does not change the meaning of \"what exists\"\n * in the database - it only guides how introspection is performed.\n * @returns Promise resolving to the family-specific Schema IR (e.g., `SqlSchemaIR` for SQL).\n * The IR represents the complete schema snapshot at the time of introspection.\n */\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR?: unknown;\n }): Promise<SqlSchemaIR>;\n\n /**\n * Projects a SQL Schema IR into a core schema view for CLI visualization.\n * Converts SqlSchemaIR (tables, columns, indexes, extensions) into a tree structure.\n */\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView;\n\n /**\n * Emits contract JSON and DTS as strings.\n * Uses the instance's preassembled state (operation registry, type imports, extension IDs).\n * Handles stripping mappings and validation internally.\n */\n emitContract(options: { readonly contractIR: ContractIR | unknown }): Promise<EmitContractResult>;\n}\n\n/**\n * SQL family instance type.\n * Maintains backward compatibility with FamilyInstance while implementing SqlControlFamilyInstance.\n */\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\ninterface CreateSqlFamilyInstanceOptions<TTargetId extends string> {\n readonly target: ControlTargetDescriptor<'sql', TTargetId>;\n readonly adapter: ControlAdapterDescriptor<'sql', TTargetId>;\n readonly extensionPacks: readonly ControlExtensionDescriptor<'sql', TTargetId>[];\n}\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\n/**\n * Builds a SQL type metadata registry from extension pack manifests.\n * Collects type metadata from target, adapter, and extension pack manifests.\n *\n * @param options - Descriptors for target, adapter, and extensions\n * @returns Registry mapping type IDs to their metadata, filtered by targetId\n */\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: ControlTargetDescriptor<'sql', string>;\n readonly adapter: ControlAdapterDescriptor<'sql', string>;\n readonly extensionPacks: readonly ControlExtensionDescriptor<'sql', string>[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n\n // Get targetId from adapter (they should match)\n const targetId = adapter.targetId;\n\n // Collect descriptors to iterate over\n const descriptors = [target, adapter, ...extensions];\n\n // Iterate over each descriptor's types\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 // Filter for SQL family and matching targetId\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n // Use existing entry if present, otherwise create new one\n // Later entries (extensions) can override earlier ones (adapter/target)\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\n/**\n * Creates a SQL family instance for control-plane operations.\n */\nexport function createSqlFamilyInstance<TTargetId extends string>(\n options: CreateSqlFamilyInstanceOptions<TTargetId>,\n): SqlFamilyInstance {\n const { target, adapter, extensionPacks: extensions = [] } = options;\n\n // Build descriptors array for assembly\n // Assembly functions only use manifest and id, so we can pass Control*Descriptor types directly\n const descriptors = [target, adapter, ...extensions];\n\n // Assemble operation registry, type imports, and extension IDs\n const operationRegistry = assembleOperationRegistry(descriptors, convertOperationManifest);\n const codecTypeImports = extractCodecTypeImports(descriptors);\n const operationTypeImports = extractOperationTypeImports(descriptors);\n const extensionIds = extractExtensionIds(adapter, target, extensions);\n\n // Build type metadata registry from manifests\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n /**\n * Strips mappings from a contract (mappings are runtime-only).\n */\n function stripMappings(contract: unknown): unknown {\n // Type guard to check if contract has mappings\n if (typeof contract === 'object' && contract !== null && 'mappings' in contract) {\n const { mappings: _mappings, ...contractIR } = contract as {\n mappings?: unknown;\n [key: string]: unknown;\n };\n return contractIR;\n }\n return contract;\n }\n\n return {\n familyId: 'sql',\n operationRegistry,\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContractIR(contractJson: unknown): ContractIR {\n // Validate the contract (this normalizes and validates structure/logic)\n const validated = validateContract<SqlContract<SqlStorage>>(contractJson);\n // Strip mappings before returning ContractIR (mappings are runtime-only)\n // The validated contract has all required ContractIR properties\n const { mappings: _mappings, ...contractIR } = validated;\n return contractIR as ContractIR;\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const { driver, contractIR, expectedTargetId, contractPath, configPath } = verifyOptions;\n const startTime = Date.now();\n\n // Type guard to ensure contract has required properties\n if (\n typeof contractIR !== 'object' ||\n contractIR === null ||\n !('coreHash' in contractIR) ||\n !('target' in contractIR) ||\n typeof contractIR.coreHash !== 'string' ||\n typeof contractIR.target !== 'string'\n ) {\n throw new Error('Contract is missing required fields: coreHash or target');\n }\n\n // Extract contract hashes and target\n const contractCoreHash = contractIR.coreHash;\n const contractProfileHash =\n 'profileHash' in contractIR && typeof contractIR.profileHash === 'string'\n ? contractIR.profileHash\n : undefined;\n const contractTarget = contractIR.target;\n\n // Read marker from database\n const marker = await readMarker(driver);\n\n // Compute codec coverage (optional)\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds<'sql', string>([\n adapter,\n target,\n ...extensions,\n ]);\n if (supportedTypeIds.length === 0) {\n // Helper is present but returns empty (MVP behavior)\n // Coverage check is skipped - missingCodecs remains undefined\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contractIR);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n // Check marker presence\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3001',\n summary: 'Marker missing',\n contractCoreHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Compare target\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3003',\n summary: 'Target mismatch',\n contractCoreHash,\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 // Compare hashes\n if (marker.coreHash !== contractCoreHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3002',\n summary: 'Hash mismatch',\n contractCoreHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Compare profile hash if present\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3002',\n summary: 'Hash mismatch',\n contractCoreHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Success - all checks passed\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractCoreHash,\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, contractIR, strict, context, frameworkComponents } = options;\n\n // Validate contractIR as SqlContract<SqlStorage>\n const contract = validateContract<SqlContract<SqlStorage>>(contractIR);\n\n // Introspect live schema (DB I/O)\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, contractIR);\n\n // Pure verification (no I/O) - delegates to extracted pure function\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contractIR, contractPath, configPath } = options;\n const startTime = Date.now();\n\n // Validate contractIR as SqlContract<SqlStorage>\n const contract = validateContract<SqlContract<SqlStorage>>(contractIR);\n\n // Extract contract hashes and target\n const contractCoreHash = contract.coreHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractCoreHash;\n const contractTarget = contract.target;\n\n // Ensure marker schema and table exist\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n // Read existing marker\n const existingMarker = await readMarker(driver);\n\n // Determine if we need to write/update marker\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { coreHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n // No marker exists - insert new one\n const write = writeContractMarker({\n coreHash: contractCoreHash,\n profileHash: contractProfileHash,\n contractJson: contractIR,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n // Marker exists - check if hashes differ\n const existingCoreHash = existingMarker.coreHash;\n const existingProfileHash = existingMarker.profileHash;\n\n // Compare hashes (use strict equality to ensure exact match)\n const coreHashMatches = existingCoreHash === contractCoreHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!coreHashMatches || !profileHashMatches) {\n // Hashes differ - update marker and capture previous hashes for output\n previousHashes = {\n coreHash: existingCoreHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n coreHash: contractCoreHash,\n profileHash: contractProfileHash,\n contractJson: contractIR,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n // If hashes match, no-op (idempotent) - previousHashes remains undefined\n }\n\n // Build summary message\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?.coreHash ?? '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 coreHash: contractCoreHash,\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 contractIR?: unknown;\n }): Promise<SqlSchemaIR> {\n const { driver, contractIR } = 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, contractIR);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const rootLabel = 'contract';\n\n // Build table nodes\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n // Add column nodes grouped under \"columns\"\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const nullableText = column.nullable ? '(nullable)' : '(not nullable)';\n // Always display nativeType for introspection (database state)\n const typeDisplay = column.nativeType;\n const label = `${columnName}: ${typeDisplay} ${nullableText}`;\n columnNodes.push({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n },\n });\n }\n\n // Add \"columns\" grouping node if there are columns\n if (columnNodes.length > 0) {\n children.push({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n });\n }\n\n // Add primary key node if present\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push({\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 // Add unique constraint nodes\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 kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n });\n }\n\n // Add index nodes\n for (const index of table.indexes) {\n const name = index.name ?? `${tableName}_${index.columns.join('_')}_idx`;\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push({\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 // Build table meta\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 const node: 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: children as readonly SchemaTreeNode[] } : {}),\n };\n return node;\n },\n );\n\n // Add extension nodes (format: \"extensionName extension is enabled\")\n const extensionNodes: readonly SchemaTreeNode[] = schema.extensions.map((extName) => ({\n kind: 'extension',\n id: `extension-${extName}`,\n label: `${extName} extension is enabled`,\n }));\n\n // Combine all children\n const rootChildren = [...tableNodes, ...extensionNodes];\n\n const rootNode: SchemaTreeNode = {\n kind: 'root',\n id: 'sql-schema',\n label: rootLabel,\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n };\n\n return {\n root: rootNode,\n };\n },\n\n async emitContract({ contractIR }): Promise<EmitContractResult> {\n // Strip mappings if present (mappings are runtime-only)\n const contractWithoutMappings = stripMappings(contractIR);\n\n // Validate and normalize the contract\n const validatedIR = this.validateContractIR(contractWithoutMappings);\n\n const result = await emit(\n validatedIR,\n {\n outputDir: '',\n operationRegistry,\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n },\n sqlTargetFamilyHook,\n );\n\n return {\n contractJson: result.contractJson,\n contractDts: result.contractDts,\n coreHash: result.coreHash,\n profileHash: result.profileHash,\n };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"instance-B_PdDN4y.mjs","names":["convertOperationManifest","imports: TypesImportSpec[]","ids: string[]","contract: { coreHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","missingCodecs: readonly string[] | undefined","options","previousHashes: { coreHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","extensionNodes: readonly SchemaTreeNode[]"],"sources":["../src/core/assembly.ts","../src/core/instance.ts"],"sourcesContent":["import type { OperationManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { TypesImportSpec } from '@prisma-next/contract/types';\nimport type {\n ControlAdapterDescriptor,\n ControlExtensionDescriptor,\n ControlTargetDescriptor,\n} from '@prisma-next/core-control-plane/types';\nimport type { OperationRegistry, OperationSignature } from '@prisma-next/operations';\nimport { createOperationRegistry } from '@prisma-next/operations';\n\n/**\n * Assembles an operation registry from descriptors (adapter, target, extensions).\n * Loops over descriptors, extracts operations, converts them using the provided\n * conversion function, and registers them in a new registry.\n */\nexport function assembleOperationRegistry(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n convertOperationManifest: (manifest: OperationManifest) => OperationSignature,\n): OperationRegistry {\n const registry = createOperationRegistry();\n\n for (const descriptor of descriptors) {\n const operations = descriptor.operations ?? [];\n for (const operationManifest of operations as ReadonlyArray<OperationManifest>) {\n const signature = convertOperationManifest(operationManifest);\n registry.register(signature);\n }\n }\n\n return registry;\n}\n\n/**\n * Extracts codec type imports from descriptors for contract.d.ts generation.\n */\nexport function extractCodecTypeImports(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n): ReadonlyArray<TypesImportSpec> {\n const imports: TypesImportSpec[] = [];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const codecTypes = types?.codecTypes;\n if (codecTypes?.import) {\n imports.push(codecTypes.import);\n }\n }\n\n return imports;\n}\n\n/**\n * Extracts operation type imports from descriptors for contract.d.ts generation.\n */\nexport function extractOperationTypeImports(\n descriptors: ReadonlyArray<\n | ControlTargetDescriptor<'sql', string>\n | ControlAdapterDescriptor<'sql', string>\n | ControlExtensionDescriptor<'sql', string>\n >,\n): ReadonlyArray<TypesImportSpec> {\n const imports: TypesImportSpec[] = [];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const operationTypes = types?.operationTypes;\n if (operationTypes?.import) {\n imports.push(operationTypes.import);\n }\n }\n\n return imports;\n}\n\n/**\n * Extracts extension IDs from descriptors in deterministic order:\n * [adapter.id, target.id, ...extensions.map(e => e.id)]\n * Deduplicates while preserving stable order.\n */\nexport function extractExtensionIds(\n adapter: ControlAdapterDescriptor<'sql', string>,\n target: ControlTargetDescriptor<'sql', string>,\n extensions: ReadonlyArray<ControlExtensionDescriptor<'sql', string>>,\n): ReadonlyArray<string> {\n const ids: string[] = [];\n const seen = new Set<string>();\n\n // Add adapter first\n if (!seen.has(adapter.id)) {\n ids.push(adapter.id);\n seen.add(adapter.id);\n }\n\n // Add target second\n if (!seen.has(target.id)) {\n ids.push(target.id);\n seen.add(target.id);\n }\n\n // Add extensions in order\n for (const ext of extensions) {\n if (!seen.has(ext.id)) {\n ids.push(ext.id);\n seen.add(ext.id);\n }\n }\n\n return ids;\n}\n","import type { TargetBoundComponentDescriptor } from '@prisma-next/contract/framework-components';\nimport type { ContractIR } from '@prisma-next/contract/ir';\nimport type { OperationManifest } from '@prisma-next/contract/pack-manifest-types';\nimport type { ContractMarkerRecord, TypesImportSpec } from '@prisma-next/contract/types';\nimport { emit } from '@prisma-next/core-control-plane/emission';\nimport type { CoreSchemaView, SchemaTreeNode } from '@prisma-next/core-control-plane/schema-view';\nimport type {\n ControlAdapterDescriptor,\n ControlDriverInstance,\n ControlExtensionDescriptor,\n ControlFamilyInstance,\n ControlTargetDescriptor,\n EmitContractResult,\n OperationContext,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/core-control-plane/types';\nimport type { OperationRegistry } from '@prisma-next/operations';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport { sqlTargetFamilyHook } from '@prisma-next/sql-contract-emitter';\nimport { validateContract } from '@prisma-next/sql-contract-ts/contract';\nimport type { SqlOperationSignature } from '@prisma-next/sql-operations';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport {\n assembleOperationRegistry,\n extractCodecTypeImports,\n extractExtensionIds,\n extractOperationTypeImports,\n} from './assembly.ts';\nimport type { SqlControlAdapter } from './control-adapter.ts';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema.ts';\nimport { collectSupportedCodecTypeIds, readMarker } from './verify.ts';\n\n/**\n * Converts an OperationManifest (descriptor declarative data) to a SqlOperationSignature.\n * This is SQL-family-specific conversion logic used by instance creation and test utilities.\n */\nexport function convertOperationManifest(manifest: OperationManifest): SqlOperationSignature {\n return {\n forTypeId: manifest.for,\n method: manifest.method,\n args: manifest.args.map((arg: OperationManifest['args'][number]) => {\n if (arg.kind === 'typeId') {\n if (!arg.type) {\n throw new Error('typeId arg must have type property');\n }\n return { kind: 'typeId' as const, type: arg.type };\n }\n if (arg.kind === 'param') {\n return { kind: 'param' as const };\n }\n if (arg.kind === 'literal') {\n return { kind: 'literal' as const };\n }\n throw new Error(`Invalid arg kind: ${(arg as { kind: unknown }).kind}`);\n }),\n returns: (() => {\n if (manifest.returns.kind === 'typeId') {\n return { kind: 'typeId' as const, type: manifest.returns.type };\n }\n if (manifest.returns.kind === 'builtin') {\n return {\n kind: 'builtin' as const,\n type: manifest.returns.type as 'number' | 'boolean' | 'string',\n };\n }\n throw new Error(`Invalid return kind: ${(manifest.returns as { kind: unknown }).kind}`);\n })(),\n lowering: {\n targetFamily: 'sql',\n strategy: manifest.lowering.strategy,\n template: manifest.lowering.template,\n },\n ...(manifest.capabilities ? { capabilities: manifest.capabilities } : {}),\n };\n}\n\n/**\n * Extracts codec type IDs used in contract storage tables.\n * Uses type guards to safely access SQL-specific structure without importing SQL types.\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\n/**\n * Creates a VerifyDatabaseResult object with common structure.\n */\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractCoreHash: 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: { coreHash: string; profileHash?: string } = {\n coreHash: options.contractCoreHash,\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?: { coreHash: string; profileHash: string } }).marker = {\n coreHash: options.marker.coreHash,\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\n/**\n * Type metadata for SQL storage types.\n * Maps contract storage type IDs to native database types.\n */\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\n/**\n * Registry mapping type IDs to their metadata.\n * Keyed by contract storage type ID (e.g., 'pg/int4@1').\n */\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\n/**\n * State fields for SQL family instance that hold assembly data.\n */\ninterface SqlFamilyInstanceState {\n readonly operationRegistry: OperationRegistry;\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\n/**\n * Options for schema verification.\n */\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: 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\n/**\n * SQL control family instance interface.\n * Extends ControlFamilyInstance with SQL-specific domain actions.\n */\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql'>,\n SqlFamilyInstanceState {\n /**\n * Validates a contract JSON and returns a validated ContractIR (without mappings).\n * Mappings are runtime-only and should not be part of ContractIR.\n */\n validateContractIR(contractJson: unknown): ContractIR;\n\n /**\n * Verifies the database marker against the contract.\n * Compares target, coreHash, and profileHash.\n */\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n /**\n * Verifies the database schema against the contract.\n * Compares contract requirements against live database schema.\n */\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n /**\n * Signs the database with the contract marker.\n * Writes or updates the contract marker if schema verification passes.\n * This operation is idempotent - if the marker already matches, no changes are made.\n */\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n /**\n * Introspects the database schema and returns a family-specific schema IR.\n *\n * This is a read-only operation that returns a snapshot of the live database schema.\n * The method is family-owned and delegates to target/adapter-specific introspectors\n * to perform the actual schema introspection.\n *\n * @param options - Introspection options\n * @param options.driver - Control plane driver for database connection\n * @param options.contractIR - Optional contract IR for contract-guided introspection.\n * When provided, families may use it for filtering, optimization, or validation\n * during introspection. The contract IR does not change the meaning of \"what exists\"\n * in the database - it only guides how introspection is performed.\n * @returns Promise resolving to the family-specific Schema IR (e.g., `SqlSchemaIR` for SQL).\n * The IR represents the complete schema snapshot at the time of introspection.\n */\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR?: unknown;\n }): Promise<SqlSchemaIR>;\n\n /**\n * Projects a SQL Schema IR into a core schema view for CLI visualization.\n * Converts SqlSchemaIR (tables, columns, indexes, extensions) into a tree structure.\n */\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView;\n\n /**\n * Emits contract JSON and DTS as strings.\n * Uses the instance's preassembled state (operation registry, type imports, extension IDs).\n * Handles stripping mappings and validation internally.\n */\n emitContract(options: { readonly contractIR: ContractIR | unknown }): Promise<EmitContractResult>;\n}\n\n/**\n * SQL family instance type.\n * Maintains backward compatibility with FamilyInstance while implementing SqlControlFamilyInstance.\n */\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\ninterface CreateSqlFamilyInstanceOptions<TTargetId extends string> {\n readonly target: ControlTargetDescriptor<'sql', TTargetId>;\n readonly adapter: ControlAdapterDescriptor<'sql', TTargetId>;\n readonly extensionPacks: readonly ControlExtensionDescriptor<'sql', TTargetId>[];\n}\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\n/**\n * Builds a SQL type metadata registry from extension pack manifests.\n * Collects type metadata from target, adapter, and extension pack manifests.\n *\n * @param options - Descriptors for target, adapter, and extensions\n * @returns Registry mapping type IDs to their metadata, filtered by targetId\n */\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: ControlTargetDescriptor<'sql', string>;\n readonly adapter: ControlAdapterDescriptor<'sql', string>;\n readonly extensionPacks: readonly ControlExtensionDescriptor<'sql', string>[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n\n // Get targetId from adapter (they should match)\n const targetId = adapter.targetId;\n\n // Collect descriptors to iterate over\n const descriptors = [target, adapter, ...extensions];\n\n // Iterate over each descriptor's types\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 // Filter for SQL family and matching targetId\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n // Use existing entry if present, otherwise create new one\n // Later entries (extensions) can override earlier ones (adapter/target)\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\n/**\n * Creates a SQL family instance for control-plane operations.\n */\nexport function createSqlFamilyInstance<TTargetId extends string>(\n options: CreateSqlFamilyInstanceOptions<TTargetId>,\n): SqlFamilyInstance {\n const { target, adapter, extensionPacks: extensions = [] } = options;\n\n // Build descriptors array for assembly\n // Assembly functions only use manifest and id, so we can pass Control*Descriptor types directly\n const descriptors = [target, adapter, ...extensions];\n\n // Assemble operation registry, type imports, and extension IDs\n const operationRegistry = assembleOperationRegistry(descriptors, convertOperationManifest);\n const codecTypeImports = extractCodecTypeImports(descriptors);\n const operationTypeImports = extractOperationTypeImports(descriptors);\n const extensionIds = extractExtensionIds(adapter, target, extensions);\n\n // Build type metadata registry from manifests\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n /**\n * Strips mappings from a contract (mappings are runtime-only).\n */\n function stripMappings(contract: unknown): unknown {\n // Type guard to check if contract has mappings\n if (typeof contract === 'object' && contract !== null && 'mappings' in contract) {\n const { mappings: _mappings, ...contractIR } = contract as {\n mappings?: unknown;\n [key: string]: unknown;\n };\n return contractIR;\n }\n return contract;\n }\n\n return {\n familyId: 'sql',\n operationRegistry,\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContractIR(contractJson: unknown): ContractIR {\n // Validate the contract (this normalizes and validates structure/logic)\n const validated = validateContract<SqlContract<SqlStorage>>(contractJson);\n // Strip mappings before returning ContractIR (mappings are runtime-only)\n // The validated contract has all required ContractIR properties\n const { mappings: _mappings, ...contractIR } = validated;\n return contractIR as ContractIR;\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const { driver, contractIR, expectedTargetId, contractPath, configPath } = verifyOptions;\n const startTime = Date.now();\n\n // Type guard to ensure contract has required properties\n if (\n typeof contractIR !== 'object' ||\n contractIR === null ||\n !('coreHash' in contractIR) ||\n !('target' in contractIR) ||\n typeof contractIR.coreHash !== 'string' ||\n typeof contractIR.target !== 'string'\n ) {\n throw new Error('Contract is missing required fields: coreHash or target');\n }\n\n // Extract contract hashes and target\n const contractCoreHash = contractIR.coreHash;\n const contractProfileHash =\n 'profileHash' in contractIR && typeof contractIR.profileHash === 'string'\n ? contractIR.profileHash\n : undefined;\n const contractTarget = contractIR.target;\n\n // Read marker from database\n const marker = await readMarker(driver);\n\n // Compute codec coverage (optional)\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds<'sql', string>([\n adapter,\n target,\n ...extensions,\n ]);\n if (supportedTypeIds.length === 0) {\n // Helper is present but returns empty (MVP behavior)\n // Coverage check is skipped - missingCodecs remains undefined\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contractIR);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n // Check marker presence\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3001',\n summary: 'Marker missing',\n contractCoreHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Compare target\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3003',\n summary: 'Target mismatch',\n contractCoreHash,\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 // Compare hashes\n if (marker.coreHash !== contractCoreHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3002',\n summary: 'Hash mismatch',\n contractCoreHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Compare profile hash if present\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: 'PN-RTM-3002',\n summary: 'Hash mismatch',\n contractCoreHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n // Success - all checks passed\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractCoreHash,\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, contractIR, strict, context, frameworkComponents } = options;\n\n // Validate contractIR as SqlContract<SqlStorage>\n const contract = validateContract<SqlContract<SqlStorage>>(contractIR);\n\n // Introspect live schema (DB I/O)\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, contractIR);\n\n // Pure verification (no I/O) - delegates to extracted pure function\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contractIR: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contractIR, contractPath, configPath } = options;\n const startTime = Date.now();\n\n // Validate contractIR as SqlContract<SqlStorage>\n const contract = validateContract<SqlContract<SqlStorage>>(contractIR);\n\n // Extract contract hashes and target\n const contractCoreHash = contract.coreHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractCoreHash;\n const contractTarget = contract.target;\n\n // Ensure marker schema and table exist\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n // Read existing marker\n const existingMarker = await readMarker(driver);\n\n // Determine if we need to write/update marker\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { coreHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n // No marker exists - insert new one\n const write = writeContractMarker({\n coreHash: contractCoreHash,\n profileHash: contractProfileHash,\n contractJson: contractIR,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n // Marker exists - check if hashes differ\n const existingCoreHash = existingMarker.coreHash;\n const existingProfileHash = existingMarker.profileHash;\n\n // Compare hashes (use strict equality to ensure exact match)\n const coreHashMatches = existingCoreHash === contractCoreHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!coreHashMatches || !profileHashMatches) {\n // Hashes differ - update marker and capture previous hashes for output\n previousHashes = {\n coreHash: existingCoreHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n coreHash: contractCoreHash,\n profileHash: contractProfileHash,\n contractJson: contractIR,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n // If hashes match, no-op (idempotent) - previousHashes remains undefined\n }\n\n // Build summary message\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?.coreHash ?? '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 coreHash: contractCoreHash,\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 contractIR?: unknown;\n }): Promise<SqlSchemaIR> {\n const { driver, contractIR } = 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, contractIR);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const rootLabel = 'contract';\n\n // Build table nodes\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n // Add column nodes grouped under \"columns\"\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const nullableText = column.nullable ? '(nullable)' : '(not nullable)';\n // Always display nativeType for introspection (database state)\n const typeDisplay = column.nativeType;\n const label = `${columnName}: ${typeDisplay} ${nullableText}`;\n columnNodes.push({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n },\n });\n }\n\n // Add \"columns\" grouping node if there are columns\n if (columnNodes.length > 0) {\n children.push({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n });\n }\n\n // Add primary key node if present\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push({\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 // Add unique constraint nodes\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 kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n });\n }\n\n // Add index nodes\n for (const index of table.indexes) {\n const name = index.name ?? `${tableName}_${index.columns.join('_')}_idx`;\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push({\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 // Build table meta\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 const node: 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: children as readonly SchemaTreeNode[] } : {}),\n };\n return node;\n },\n );\n\n // Add extension nodes (format: \"extensionName extension is enabled\")\n const extensionNodes: readonly SchemaTreeNode[] = schema.extensions.map((extName) => ({\n kind: 'extension',\n id: `extension-${extName}`,\n label: `${extName} extension is enabled`,\n }));\n\n // Combine all children\n const rootChildren = [...tableNodes, ...extensionNodes];\n\n const rootNode: SchemaTreeNode = {\n kind: 'root',\n id: 'sql-schema',\n label: rootLabel,\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n };\n\n return {\n root: rootNode,\n };\n },\n\n async emitContract({ contractIR }): Promise<EmitContractResult> {\n // Strip mappings if present (mappings are runtime-only)\n const contractWithoutMappings = stripMappings(contractIR);\n\n // Validate and normalize the contract\n const validatedIR = this.validateContractIR(contractWithoutMappings);\n\n const result = await emit(\n validatedIR,\n {\n outputDir: '',\n operationRegistry,\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n },\n sqlTargetFamilyHook,\n );\n\n return {\n contractJson: result.contractJson,\n contractDts: result.contractDts,\n coreHash: result.coreHash,\n profileHash: result.profileHash,\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/core/runtime-instance.ts","../src/core/runtime-descriptor.ts","../src/exports/runtime.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA6BA;;AAA0E,KAA9D,wBAA8D,CAAA,kBAAA,MAAA,GAAA,MAAA,CAAA,GAAA,qBAAA,CAAA,KAAA,EAExE,SAFwE,CAAA,GAIxE,SAJwE;;AAa1E;;;AAiBuB,UAjBN,wBAAA,SAAiC,qBAiB3B,CAAA,KAAA,CAAA,CAAA;EAEF;;;;;;;;;;;;;;;kCAHa,YAAY;ICxCjC,SAAA,QAAA,EDyCU,SCxCrB;IAA0C,SAAA,aAAA,EAAA,OAAA;IAQQ,SAAA,MAAA,EDkC/B,oBClC+B;IAA/B,SAAA,OAAA,CAAA,EAAA,SDmCW,MCnCX,CDoCf,SCpCe,EDqCf,OCrCe,CDqCP,SCrCO,EDqCI,WCrCJ,CDqCgB,UCrChB,CAAA,EDqC6B,gBCrC7B,CAAA,EDsCf,SCtCe,CAAA,EAAA;IAGf,SAAA,IAAA,CAAA,EAAA,QAAA,GAAA,YAAA;IAC0B,SAAA,GAAA,CAAA,EDqCb,GCrCa;EAA1B,CAAA,CAAA,EDsCA,OCtCA;;;;;;;;cAbO,0BAAA,YACA,+BAA+B;EDUhC,SAAA,IAAA,EAAA,QAAA;EAEV,SAAA,EAAA,GAAA,KAAA;EAFwE,SAAA,QAAA,EAAA,KAAA;EAIxE,SAAA,OAAA,GAAA,OAAA;EAAS,MAAA,CAAA,kBAAA,MAAA,CAAA,CAAA,OAAA,EAAA;IASM,SAAA,MAAA,ECfI,uBDeqB,CAAA,KAAA,ECfU,SDeV,CAAA;IAgBI,SAAA,OAAA,EC9BxB,wBD8BwB,CAAA,KAAA,EC5BxC,SD4BwC,EC3BxC,yBD2BwC,CC3Bd,SD2Bc,CAAA,CAAA;IAAZ,SAAA,MAAA,ECzBb,uBDyBa,CAAA,KAAA,ECzBkB,SDyBlB,ECzB6B,wBDyB7B,CCzBsD,SDyBtD,CAAA,CAAA;IACX,SAAA,cAAA,EAAA,SCzBe,0BDyBf,CAAA,KAAA,ECzBiD,SDyBjD,CAAA,EAAA;EAEF,CAAA,CAAA,EC1Bf,wBD0Be;;;;;;;;cE7DmD,UAAA"}
1
+ {"version":3,"file":"runtime.d.mts","names":[],"sources":["../src/core/runtime-instance.ts","../src/core/runtime-descriptor.ts","../src/exports/runtime.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA6BA;;AAA0E,KAA9D,wBAA8D,CAAA,kBAAA,MAAA,GAAA,MAAA,CAAA,GAAA,qBAAA,CAAA,KAAA,EAExE,SAFwE,CAAA,GAIxE,SAJwE;;AAa1E;;;AAiBuB,UAjBN,wBAAA,SAAiC,qBAiB3B,CAAA,KAAA,CAAA,CAAA;EAEF;;;;;;;;;;;;;;;kCAHa,YAAY;ICxCjC,SAAA,QAAA,EDyCU,SCxCrB;IAA0C,SAAA,aAAA,EAAA,OAAA;IAQQ,SAAA,MAAA,EDkC/B,oBClC+B;IAA/B,SAAA,OAAA,CAAA,EAAA,SDmCW,MCnCX,CDoCf,SCpCe,EDqCf,OCrCe,CDqCP,SCrCO,EDqCI,WCrCJ,CDqCgB,UCrChB,CAAA,EDqC6B,gBCrC7B,CAAA,EDsCf,SCtCe,CAAA,EAAA;IAGf,SAAA,IAAA,CAAA,EAAA,QAAA,GAAA,YAAA;IAC0B,SAAA,GAAA,CAAA,EDqCb,GCrCa;EAA1B,CAAA,CAAA,EDsCA,OCtCA;;;;;;;;cAbO,0BAAA,YACA,+BAA+B;EDUhC,SAAA,IAAA,EAAA,QAAA;EAEV,SAAA,EAAA,GAAA,KAAA;EAFwE,SAAA,QAAA,EAAA,KAAA;EAIxE,SAAA,OAAA,GAAA,OAAA;EAAS,MAAA,CAAA,kBAAA,MAAA,CAAA,CAAA,OAAA,EAAA;IASM,SAAA,MAAA,ECfI,uBDeqB,CAAA,KAAA,ECfU,SDeV,CAAA;IAgBI,SAAA,OAAA,EC9BxB,wBD8BwB,CAAA,KAAA,EC5BxC,SD4BwC,EC3BxC,yBD2BwC,CC3Bd,SD2Bc,CAAA,CAAA;IAAZ,SAAA,MAAA,ECzBb,uBDyBa,CAAA,KAAA,ECzBkB,SDyBlB,ECzB6B,wBDyB7B,CCzBsD,SDyBtD,CAAA,CAAA;IACX,SAAA,cAAA,EAAA,SCzBe,0BDyBf,CAAA,KAAA,ECzBiD,SDyBjD,CAAA,EAAA;EAEF,CAAA,CAAA,EC1Bf,wBD0Be;;;;;;;;cE7DsD,UAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.mjs","names":[],"sources":["../src/core/runtime-instance.ts","../src/core/runtime-descriptor.ts","../src/exports/runtime.ts"],"sourcesContent":["import { assertRuntimeContractRequirementsSatisfied } from '@prisma-next/core-execution-plane/framework-components';\nimport type {\n RuntimeAdapterDescriptor,\n RuntimeDriverDescriptor,\n RuntimeDriverInstance,\n RuntimeFamilyDescriptor,\n RuntimeFamilyInstance,\n RuntimeTargetDescriptor,\n} from '@prisma-next/core-execution-plane/types';\nimport type { Log, Plugin, RuntimeVerifyOptions } from '@prisma-next/runtime-executor';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n Adapter,\n LoweredStatement,\n SelectAst,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n Runtime,\n RuntimeOptions,\n SqlRuntimeAdapterInstance,\n SqlRuntimeExtensionDescriptor,\n} from '@prisma-next/sql-runtime';\nimport { createRuntime, createRuntimeContext } from '@prisma-next/sql-runtime';\n\n/**\n * SQL runtime driver instance type.\n * Combines identity properties with SQL-specific behavior methods.\n */\nexport type SqlRuntimeDriverInstance<TTargetId extends string = string> = RuntimeDriverInstance<\n 'sql',\n TTargetId\n> &\n SqlDriver;\n\n// Re-export SqlRuntimeAdapterInstance from sql-runtime for consumers\nexport type { SqlRuntimeAdapterInstance } from '@prisma-next/sql-runtime';\n\n/**\n * SQL runtime family instance interface.\n * Extends base RuntimeFamilyInstance with SQL-specific runtime creation method.\n */\nexport interface SqlRuntimeFamilyInstance extends RuntimeFamilyInstance<'sql'> {\n /**\n * Creates a SQL runtime from contract, driver options, and verification settings.\n *\n * Extension packs are routed through composition (at instance creation time),\n * not through this method. This aligns with control-plane composition patterns.\n *\n * @param options - Runtime creation options\n * @param options.contract - SQL contract\n * @param options.driverOptions - Driver options (e.g., PostgresDriverOptions)\n * @param options.verify - Runtime verification options\n * @param options.plugins - Optional plugins\n * @param options.mode - Optional runtime mode\n * @param options.log - Optional log instance\n * @returns Runtime instance\n */\n createRuntime<TContract extends SqlContract<SqlStorage>>(options: {\n readonly contract: TContract;\n readonly driverOptions: unknown;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver\n >[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n }): Runtime;\n}\n\n/**\n * Creates a SQL runtime family instance from runtime descriptors.\n *\n * Routes the same framework composition as control-plane:\n * family, target, adapter, driver, extensionPacks (all as descriptors with IDs).\n */\nexport function createSqlRuntimeFamilyInstance<TTargetId extends string>(options: {\n readonly family: RuntimeFamilyDescriptor<'sql'>;\n readonly target: RuntimeTargetDescriptor<'sql', TTargetId>;\n readonly adapter: RuntimeAdapterDescriptor<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>\n >;\n readonly driver: RuntimeDriverDescriptor<'sql', TTargetId, SqlRuntimeDriverInstance<TTargetId>>;\n readonly extensionPacks?: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n}): SqlRuntimeFamilyInstance {\n const {\n family: familyDescriptor,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n driver: driverDescriptor,\n extensionPacks: extensionDescriptors = [],\n } = options;\n\n return {\n familyId: 'sql' as const,\n createRuntime<TContract extends SqlContract<SqlStorage>>(runtimeOptions: {\n readonly contract: TContract;\n readonly driverOptions: unknown;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver\n >[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n }): Runtime {\n // Validate contract requirements against provided descriptors\n assertRuntimeContractRequirementsSatisfied({\n contract: runtimeOptions.contract,\n family: familyDescriptor,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n extensionPacks: extensionDescriptors,\n });\n\n // Create driver instance\n const driverInstance = driverDescriptor.create(runtimeOptions.driverOptions);\n\n // Create context via descriptor-first API\n const context = createRuntimeContext<TContract, TTargetId>({\n contract: runtimeOptions.contract,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n extensionPacks: extensionDescriptors,\n });\n\n const runtimeOptions_: RuntimeOptions<TContract> = {\n driver: driverInstance,\n verify: runtimeOptions.verify,\n context,\n ...(runtimeOptions.plugins ? { plugins: runtimeOptions.plugins } : {}),\n ...(runtimeOptions.mode ? { mode: runtimeOptions.mode } : {}),\n ...(runtimeOptions.log ? { log: runtimeOptions.log } : {}),\n };\n\n return createRuntime(runtimeOptions_);\n },\n };\n}\n","import type {\n RuntimeAdapterDescriptor,\n RuntimeDriverDescriptor,\n RuntimeExtensionDescriptor,\n RuntimeFamilyDescriptor,\n RuntimeTargetDescriptor,\n} from '@prisma-next/core-execution-plane/types';\nimport {\n createSqlRuntimeFamilyInstance,\n type SqlRuntimeAdapterInstance,\n type SqlRuntimeDriverInstance,\n type SqlRuntimeFamilyInstance,\n} from './runtime-instance';\n\n/**\n * SQL runtime family descriptor implementation.\n * Provides factory method to create SQL runtime family instance.\n */\nexport class SqlRuntimeFamilyDescriptor\n implements RuntimeFamilyDescriptor<'sql', SqlRuntimeFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n\n create<TTargetId extends string>(options: {\n readonly target: RuntimeTargetDescriptor<'sql', TTargetId>;\n readonly adapter: RuntimeAdapterDescriptor<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>\n >;\n readonly driver: RuntimeDriverDescriptor<'sql', TTargetId, SqlRuntimeDriverInstance<TTargetId>>;\n readonly extensionPacks: readonly RuntimeExtensionDescriptor<'sql', TTargetId>[];\n }): SqlRuntimeFamilyInstance {\n return createSqlRuntimeFamilyInstance({\n family: this,\n target: options.target,\n adapter: options.adapter,\n driver: options.driver,\n extensionPacks: options.extensionPacks,\n });\n }\n}\n","import { SqlRuntimeFamilyDescriptor } from '../core/runtime-descriptor';\n\n/**\n * SQL runtime family descriptor for execution/runtime plane.\n * Provides factory method to create SQL runtime family instance.\n */\nexport default new SqlRuntimeFamilyDescriptor();\n"],"mappings":";;;;;;;;;;AA8EA,SAAgB,+BAAyD,SAU5C;CAC3B,MAAM,EACJ,QAAQ,kBACR,QAAQ,kBACR,SAAS,mBACT,QAAQ,kBACR,gBAAgB,uBAAuB,EAAE,KACvC;AAEJ,QAAO;EACL,UAAU;EACV,cAAyD,gBAW7C;AAEV,8CAA2C;IACzC,UAAU,eAAe;IACzB,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,gBAAgB;IACjB,CAAC;GAGF,MAAM,iBAAiB,iBAAiB,OAAO,eAAe,cAAc;GAG5E,MAAM,UAAU,qBAA2C;IACzD,UAAU,eAAe;IACzB,QAAQ;IACR,SAAS;IACT,gBAAgB;IACjB,CAAC;AAWF,UAAO,cAT4C;IACjD,QAAQ;IACR,QAAQ,eAAe;IACvB;IACA,GAAI,eAAe,UAAU,EAAE,SAAS,eAAe,SAAS,GAAG,EAAE;IACrE,GAAI,eAAe,OAAO,EAAE,MAAM,eAAe,MAAM,GAAG,EAAE;IAC5D,GAAI,eAAe,MAAM,EAAE,KAAK,eAAe,KAAK,GAAG,EAAE;IAC1D,CAEoC;;EAExC;;;;;;;;;AC5HH,IAAa,6BAAb,MAEA;CACE,AAAS,OAAO;CAChB,AAAS,KAAK;CACd,AAAS,WAAW;CACpB,AAAS,UAAU;CAEnB,OAAiC,SASJ;AAC3B,SAAO,+BAA+B;GACpC,QAAQ;GACR,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,gBAAgB,QAAQ;GACzB,CAAC;;;;;;;;;;ACpCN,sBAAe,IAAI,4BAA4B"}
1
+ {"version":3,"file":"runtime.mjs","names":[],"sources":["../src/core/runtime-instance.ts","../src/core/runtime-descriptor.ts","../src/exports/runtime.ts"],"sourcesContent":["import { assertRuntimeContractRequirementsSatisfied } from '@prisma-next/core-execution-plane/framework-components';\nimport type {\n RuntimeAdapterDescriptor,\n RuntimeDriverDescriptor,\n RuntimeDriverInstance,\n RuntimeFamilyDescriptor,\n RuntimeFamilyInstance,\n RuntimeTargetDescriptor,\n} from '@prisma-next/core-execution-plane/types';\nimport type { Log, Plugin, RuntimeVerifyOptions } from '@prisma-next/runtime-executor';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type {\n Adapter,\n LoweredStatement,\n SelectAst,\n SqlDriver,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n Runtime,\n RuntimeOptions,\n SqlRuntimeAdapterInstance,\n SqlRuntimeExtensionDescriptor,\n} from '@prisma-next/sql-runtime';\nimport { createRuntime, createRuntimeContext } from '@prisma-next/sql-runtime';\n\n/**\n * SQL runtime driver instance type.\n * Combines identity properties with SQL-specific behavior methods.\n */\nexport type SqlRuntimeDriverInstance<TTargetId extends string = string> = RuntimeDriverInstance<\n 'sql',\n TTargetId\n> &\n SqlDriver;\n\n// Re-export SqlRuntimeAdapterInstance from sql-runtime for consumers\nexport type { SqlRuntimeAdapterInstance } from '@prisma-next/sql-runtime';\n\n/**\n * SQL runtime family instance interface.\n * Extends base RuntimeFamilyInstance with SQL-specific runtime creation method.\n */\nexport interface SqlRuntimeFamilyInstance extends RuntimeFamilyInstance<'sql'> {\n /**\n * Creates a SQL runtime from contract, driver options, and verification settings.\n *\n * Extension packs are routed through composition (at instance creation time),\n * not through this method. This aligns with control-plane composition patterns.\n *\n * @param options - Runtime creation options\n * @param options.contract - SQL contract\n * @param options.driverOptions - Driver options (e.g., PostgresDriverOptions)\n * @param options.verify - Runtime verification options\n * @param options.plugins - Optional plugins\n * @param options.mode - Optional runtime mode\n * @param options.log - Optional log instance\n * @returns Runtime instance\n */\n createRuntime<TContract extends SqlContract<SqlStorage>>(options: {\n readonly contract: TContract;\n readonly driverOptions: unknown;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver\n >[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n }): Runtime;\n}\n\n/**\n * Creates a SQL runtime family instance from runtime descriptors.\n *\n * Routes the same framework composition as control-plane:\n * family, target, adapter, driver, extensionPacks (all as descriptors with IDs).\n */\nexport function createSqlRuntimeFamilyInstance<TTargetId extends string>(options: {\n readonly family: RuntimeFamilyDescriptor<'sql'>;\n readonly target: RuntimeTargetDescriptor<'sql', TTargetId>;\n readonly adapter: RuntimeAdapterDescriptor<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>\n >;\n readonly driver: RuntimeDriverDescriptor<'sql', TTargetId, SqlRuntimeDriverInstance<TTargetId>>;\n readonly extensionPacks?: readonly SqlRuntimeExtensionDescriptor<TTargetId>[];\n}): SqlRuntimeFamilyInstance {\n const {\n family: familyDescriptor,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n driver: driverDescriptor,\n extensionPacks: extensionDescriptors = [],\n } = options;\n\n return {\n familyId: 'sql' as const,\n createRuntime<TContract extends SqlContract<SqlStorage>>(runtimeOptions: {\n readonly contract: TContract;\n readonly driverOptions: unknown;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<\n TContract,\n Adapter<SelectAst, SqlContract<SqlStorage>, LoweredStatement>,\n SqlDriver\n >[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n }): Runtime {\n // Validate contract requirements against provided descriptors\n assertRuntimeContractRequirementsSatisfied({\n contract: runtimeOptions.contract,\n family: familyDescriptor,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n extensionPacks: extensionDescriptors,\n });\n\n // Create driver instance\n const driverInstance = driverDescriptor.create(runtimeOptions.driverOptions);\n\n // Create context via descriptor-first API\n const context = createRuntimeContext<TContract, TTargetId>({\n contract: runtimeOptions.contract,\n target: targetDescriptor,\n adapter: adapterDescriptor,\n extensionPacks: extensionDescriptors,\n });\n\n const runtimeOptions_: RuntimeOptions<TContract> = {\n driver: driverInstance,\n verify: runtimeOptions.verify,\n context,\n ...(runtimeOptions.plugins ? { plugins: runtimeOptions.plugins } : {}),\n ...(runtimeOptions.mode ? { mode: runtimeOptions.mode } : {}),\n ...(runtimeOptions.log ? { log: runtimeOptions.log } : {}),\n };\n\n return createRuntime(runtimeOptions_);\n },\n };\n}\n","import type {\n RuntimeAdapterDescriptor,\n RuntimeDriverDescriptor,\n RuntimeExtensionDescriptor,\n RuntimeFamilyDescriptor,\n RuntimeTargetDescriptor,\n} from '@prisma-next/core-execution-plane/types';\nimport {\n createSqlRuntimeFamilyInstance,\n type SqlRuntimeAdapterInstance,\n type SqlRuntimeDriverInstance,\n type SqlRuntimeFamilyInstance,\n} from './runtime-instance.ts';\n\n/**\n * SQL runtime family descriptor implementation.\n * Provides factory method to create SQL runtime family instance.\n */\nexport class SqlRuntimeFamilyDescriptor\n implements RuntimeFamilyDescriptor<'sql', SqlRuntimeFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n\n create<TTargetId extends string>(options: {\n readonly target: RuntimeTargetDescriptor<'sql', TTargetId>;\n readonly adapter: RuntimeAdapterDescriptor<\n 'sql',\n TTargetId,\n SqlRuntimeAdapterInstance<TTargetId>\n >;\n readonly driver: RuntimeDriverDescriptor<'sql', TTargetId, SqlRuntimeDriverInstance<TTargetId>>;\n readonly extensionPacks: readonly RuntimeExtensionDescriptor<'sql', TTargetId>[];\n }): SqlRuntimeFamilyInstance {\n return createSqlRuntimeFamilyInstance({\n family: this,\n target: options.target,\n adapter: options.adapter,\n driver: options.driver,\n extensionPacks: options.extensionPacks,\n });\n }\n}\n","import { SqlRuntimeFamilyDescriptor } from '../core/runtime-descriptor.ts';\n\n/**\n * SQL runtime family descriptor for execution/runtime plane.\n * Provides factory method to create SQL runtime family instance.\n */\nexport default new SqlRuntimeFamilyDescriptor();\n"],"mappings":";;;;;;;;;;AA8EA,SAAgB,+BAAyD,SAU5C;CAC3B,MAAM,EACJ,QAAQ,kBACR,QAAQ,kBACR,SAAS,mBACT,QAAQ,kBACR,gBAAgB,uBAAuB,EAAE,KACvC;AAEJ,QAAO;EACL,UAAU;EACV,cAAyD,gBAW7C;AAEV,8CAA2C;IACzC,UAAU,eAAe;IACzB,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,gBAAgB;IACjB,CAAC;GAGF,MAAM,iBAAiB,iBAAiB,OAAO,eAAe,cAAc;GAG5E,MAAM,UAAU,qBAA2C;IACzD,UAAU,eAAe;IACzB,QAAQ;IACR,SAAS;IACT,gBAAgB;IACjB,CAAC;AAWF,UAAO,cAT4C;IACjD,QAAQ;IACR,QAAQ,eAAe;IACvB;IACA,GAAI,eAAe,UAAU,EAAE,SAAS,eAAe,SAAS,GAAG,EAAE;IACrE,GAAI,eAAe,OAAO,EAAE,MAAM,eAAe,MAAM,GAAG,EAAE;IAC5D,GAAI,eAAe,MAAM,EAAE,KAAK,eAAe,KAAK,GAAG,EAAE;IAC1D,CAEoC;;EAExC;;;;;;;;;AC5HH,IAAa,6BAAb,MAEA;CACE,AAAS,OAAO;CAChB,AAAS,KAAK;CACd,AAAS,WAAW;CACpB,AAAS,UAAU;CAEnB,OAAiC,SASJ;AAC3B,SAAO,+BAA+B;GACpC,QAAQ;GACR,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,gBAAgB,QAAQ;GACzB,CAAC;;;;;;;;;;ACpCN,sBAAe,IAAI,4BAA4B"}
@@ -4,6 +4,7 @@ import { OperationContext, SchemaIssue, SchemaVerificationNode, VerifyDatabaseSc
4
4
  import { SqlIndexIR, SqlSchemaIR, SqlUniqueIR } from "@prisma-next/sql-schema-ir/types";
5
5
  import { SqlContract, SqlStorage } from "@prisma-next/sql-contract/types";
6
6
  import { TargetBoundComponentDescriptor } from "@prisma-next/contract/framework-components";
7
+ import { SqlSchemaIR as SqlSchemaIR$1 } from "@prisma-next/sql-schema-ir";
7
8
 
8
9
  //#region src/core/schema-verify/verify-helpers.d.ts
9
10
 
@@ -54,7 +55,7 @@ interface VerifySqlSchemaOptions {
54
55
  /** The validated SQL contract to verify against */
55
56
  readonly contract: SqlContract<SqlStorage>;
56
57
  /** The schema IR from introspection (or another source) */
57
- readonly schema: SqlSchemaIR;
58
+ readonly schema: SqlSchemaIR$1;
58
59
  /** Whether to run in strict mode (detects extra tables/columns) */
59
60
  readonly strict: boolean;
60
61
  /** Optional operation context for metadata */
@@ -1 +1 @@
1
- {"version":3,"file":"schema-verify.d.mts","names":[],"sources":["../src/core/schema-verify/verify-helpers.ts","../src/core/schema-verify/verify-sql-schema.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAuBA;AA+BA;AA0BA;AAgXgB,iBAzaA,WAAA,CAya0B,CAAA,EAAA,SAAA,MAAA,EAAA,EAAA,CAAA,EAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA;;;;;;;;;;ACja1C;;;AAImB,iBDmBH,2BAAA,CCnBG,OAAA,EAAA,SDoBC,WCpBD,EAAA,EAAA,OAAA,EAAA,SDqBC,UCrBD,EAAA,EAAA,OAAA,EAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA;;;;;;AAwBnB;;;;;;;iBDqBgB,gBAAA,mBACI,gCACA;;;;;;;;iBA8WJ,0BAAA,eACA,cAAc,+CACpB,qBACA,gBACP;;;AAJH;;;AAEU,UCnaO,sBAAA,CDmaP;EACA;EACP,SAAA,QAAA,ECnakB,WDmalB,CCna8B,UDma9B,CAAA;EAAsB;mBCjaN;;;EAJF;EAEgB,SAAA,OAAA,CAAA,EAMZ,gBANY;EAAZ;EAEF,SAAA,oBAAA,EAMc,WANd,CAAA,MAAA,EAAA;IAIE,UAAA,CAAA,EAAA,MAAA;EAEY,CAAA,CAAA;EAKa;;;AAa9C;gCAbgC,cAAc;;;;;;;;;;;;iBAa9B,eAAA,UAAyB,yBAAyB"}
1
+ {"version":3,"file":"schema-verify.d.mts","names":[],"sources":["../src/core/schema-verify/verify-helpers.ts","../src/core/schema-verify/verify-sql-schema.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAuBA;AA+BA;AA0BgB,iBAzDA,WAAA,CA0DI,CAAA,EAAA,SACA,MAAA,EAAA,EAAA,CAAW,EAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA;AA8W/B;;;;;;;;;;ACjaA;;AAEqB,iBDqBL,2BAAA,CCrBK,OAAA,EAAA,SDsBD,WCtBC,EAAA,EAAA,OAAA,EAAA,SDuBD,UCvBC,EAAA,EAAA,OAAA,EAAA,SAAA,MAAA,EAAA,CAAA,EAAA,OAAA;;;;;;;AA0BrB;;;;;;iBDqBgB,gBAAA,mBACI,gCACA;;;;;;;;iBA8WJ,0BAAA,eACA,cAAc,+CACpB,qBACA,gBACP;;;AApXH;AAgXA;;AACgB,UClaC,sBAAA,CDkaD;EACN;EACA,SAAA,QAAA,EClaW,WDkaX,CClauB,UDkavB,CAAA;EACP;EAAsB,SAAA,MAAA,ECjaN,aDiaM;;;;ECraR,SAAA,OAAA,CAAA,EAQI,gBARkB;EAEN;EAAZ,SAAA,oBAAA,EAQY,WARZ,CAAA,MAAA,EAAA;IAEF,UAAA,CAAA,EAAA,MAAA;EAIE,CAAA,CAAA;EAEY;;;;EAkBjB,SAAA,mBAAe,EAbC,aAaS,CAbK,8BAaoB,CAAA,KAAA,EAA0B,MAAA,CAAA,CAAA;;;;;;;;;;;;iBAA5E,eAAA,UAAyB,yBAAyB"}
@@ -1,5 +1,3 @@
1
1
  import { a as extractExtensionIds, i as extractCodecTypeImports, o as extractOperationTypeImports, r as assembleOperationRegistry, t as convertOperationManifest } from "./instance-B_PdDN4y.mjs";
2
- import "./verify-sql-schema-BnLVoeWI.mjs";
3
- import "./verify-DhFytkFC.mjs";
4
2
 
5
3
  export { assembleOperationRegistry, convertOperationManifest, extractCodecTypeImports, extractExtensionIds, extractOperationTypeImports };
@@ -1 +1 @@
1
- {"version":3,"file":"verify-sql-schema-BnLVoeWI.mjs","names":["nodes: SchemaVerificationNode[]","issues: SchemaIssue[]","rootChildren: SchemaVerificationNode[]","tableChildren: SchemaVerificationNode[]","columnNodes: SchemaVerificationNode[]","columnChildren: SchemaVerificationNode[]","columnStatus: 'pass' | 'warn' | 'fail'","root: SchemaVerificationNode","dependencies: ComponentDatabaseDependency<T>[]"],"sources":["../src/core/schema-verify/verify-helpers.ts","../src/core/schema-verify/verify-sql-schema.ts"],"sourcesContent":["/**\n * Pure verification helper functions for SQL schema verification.\n * These functions verify schema IR against contract requirements.\n */\n\nimport type { SchemaIssue, SchemaVerificationNode } from '@prisma-next/core-control-plane/types';\nimport type {\n ForeignKey,\n Index,\n PrimaryKey,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport type {\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport type { ComponentDatabaseDependency } from '../migrations/types';\n\n/**\n * Compares two arrays of strings for equality (order-sensitive).\n */\nexport function arraysEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// ============================================================================\n// Semantic Satisfaction Predicates\n// ============================================================================\n// These predicates implement the \"stronger satisfies weaker\" logic for storage\n// objects. They are used by both verification and migration planning to ensure\n// consistent behavior across the control plane.\n\n/**\n * Checks if a unique constraint requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a unique constraint requirement can be satisfied by:\n * - A unique constraint with the same columns, OR\n * - A unique index with the same columns\n *\n * @param uniques - The unique constraints in the schema table\n * @param indexes - The indexes in the schema table\n * @param columns - The columns required by the unique constraint\n * @returns true if the requirement is satisfied\n */\nexport function isUniqueConstraintSatisfied(\n uniques: readonly SqlUniqueIR[],\n indexes: readonly SqlIndexIR[],\n columns: readonly string[],\n): boolean {\n // Check for matching unique constraint\n const hasConstraint = uniques.some((unique) => arraysEqual(unique.columns, columns));\n if (hasConstraint) {\n return true;\n }\n // Check for matching unique index (semantic satisfaction)\n return indexes.some((index) => index.unique && arraysEqual(index.columns, columns));\n}\n\n/**\n * Checks if an index requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a non-unique index requirement can be satisfied by:\n * - Any index (unique or non-unique) with the same columns, OR\n * - A unique constraint with the same columns (stronger satisfies weaker)\n *\n * @param indexes - The indexes in the schema table\n * @param uniques - The unique constraints in the schema table\n * @param columns - The columns required by the index\n * @returns true if the requirement is satisfied\n */\nexport function isIndexSatisfied(\n indexes: readonly SqlIndexIR[],\n uniques: readonly SqlUniqueIR[],\n columns: readonly string[],\n): boolean {\n // Check for any matching index (unique or non-unique)\n const hasMatchingIndex = indexes.some((index) => arraysEqual(index.columns, columns));\n if (hasMatchingIndex) {\n return true;\n }\n // Check for matching unique constraint (semantic satisfaction)\n return uniques.some((unique) => arraysEqual(unique.columns, columns));\n}\n\n/**\n * Verifies primary key matches between contract and schema.\n * Returns 'pass' or 'fail'.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyPrimaryKey(\n contractPK: PrimaryKey,\n schemaPK: PrimaryKey | undefined,\n tableName: string,\n issues: SchemaIssue[],\n): 'pass' | 'fail' {\n if (!schemaPK) {\n issues.push({\n kind: 'primary_key_mismatch',\n table: tableName,\n expected: contractPK.columns.join(', '),\n message: `Table \"${tableName}\" is missing primary key`,\n });\n return 'fail';\n }\n\n if (!arraysEqual(contractPK.columns, schemaPK.columns)) {\n issues.push({\n kind: 'primary_key_mismatch',\n table: tableName,\n expected: contractPK.columns.join(', '),\n actual: schemaPK.columns.join(', '),\n message: `Table \"${tableName}\" has primary key mismatch: expected columns [${contractPK.columns.join(', ')}], got [${schemaPK.columns.join(', ')}]`,\n });\n return 'fail';\n }\n\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n\n return 'pass';\n}\n\n/**\n * Verifies foreign keys match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + columns + referenced table + referenced columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyForeignKeys(\n contractFKs: readonly ForeignKey[],\n schemaFKs: readonly SqlForeignKeyIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract FK exists in schema\n for (const contractFK of contractFKs) {\n const fkPath = `${tablePath}.foreignKeys[${contractFK.columns.join(',')}]`;\n const matchingFK = schemaFKs.find((fk) => {\n return (\n arraysEqual(fk.columns, contractFK.columns) &&\n fk.referencedTable === contractFK.references.table &&\n arraysEqual(fk.referencedColumns, contractFK.references.columns)\n );\n });\n\n if (!matchingFK) {\n issues.push({\n kind: 'foreign_key_mismatch',\n table: tableName,\n expected: `${contractFK.columns.join(', ')} -> ${contractFK.references.table}(${contractFK.references.columns.join(', ')})`,\n message: `Table \"${tableName}\" is missing foreign key: ${contractFK.columns.join(', ')} -> ${contractFK.references.table}(${contractFK.references.columns.join(', ')})`,\n });\n nodes.push({\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.columns.join(', ')})`,\n contractPath: fkPath,\n code: 'foreign_key_mismatch',\n message: 'Foreign key missing',\n expected: contractFK,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.columns.join(', ')})`,\n contractPath: fkPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra FKs in strict mode\n if (strict) {\n for (const schemaFK of schemaFKs) {\n const matchingFK = contractFKs.find((fk) => {\n return (\n arraysEqual(fk.columns, schemaFK.columns) &&\n fk.references.table === schemaFK.referencedTable &&\n arraysEqual(fk.references.columns, schemaFK.referencedColumns)\n );\n });\n\n if (!matchingFK) {\n issues.push({\n kind: 'extra_foreign_key',\n table: tableName,\n message: `Extra foreign key found in database (not in contract): ${schemaFK.columns.join(', ')} -> ${schemaFK.referencedTable}(${schemaFK.referencedColumns.join(', ')})`,\n });\n nodes.push({\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${schemaFK.columns.join(', ')})`,\n contractPath: `${tablePath}.foreignKeys[${schemaFK.columns.join(',')}]`,\n code: 'extra_foreign_key',\n message: 'Extra foreign key found',\n expected: undefined,\n actual: schemaFK,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies unique constraints match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A unique constraint requirement can be satisfied by either:\n * - A unique constraint with the same columns, or\n * - A unique index with the same columns\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyUniqueConstraints(\n contractUniques: readonly UniqueConstraint[],\n schemaUniques: readonly SqlUniqueIR[],\n schemaIndexes: readonly SqlIndexIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract unique exists in schema\n for (const contractUnique of contractUniques) {\n const uniquePath = `${tablePath}.uniques[${contractUnique.columns.join(',')}]`;\n\n // First check for a matching unique constraint\n const matchingUnique = schemaUniques.find((u) =>\n arraysEqual(u.columns, contractUnique.columns),\n );\n\n // If no matching constraint, check for a unique index with the same columns\n const matchingUniqueIndex =\n !matchingUnique &&\n schemaIndexes.find((idx) => idx.unique && arraysEqual(idx.columns, contractUnique.columns));\n\n if (!matchingUnique && !matchingUniqueIndex) {\n issues.push({\n kind: 'unique_constraint_mismatch',\n table: tableName,\n expected: contractUnique.columns.join(', '),\n message: `Table \"${tableName}\" is missing unique constraint: ${contractUnique.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: 'unique_constraint_mismatch',\n message: 'Unique constraint missing',\n expected: contractUnique,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra uniques in strict mode\n if (strict) {\n for (const schemaUnique of schemaUniques) {\n const matchingUnique = contractUniques.find((u) =>\n arraysEqual(u.columns, schemaUnique.columns),\n );\n\n if (!matchingUnique) {\n issues.push({\n kind: 'extra_unique_constraint',\n table: tableName,\n message: `Extra unique constraint found in database (not in contract): ${schemaUnique.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'unique',\n name: `unique(${schemaUnique.columns.join(', ')})`,\n contractPath: `${tablePath}.uniques[${schemaUnique.columns.join(',')}]`,\n code: 'extra_unique_constraint',\n message: 'Extra unique constraint found',\n expected: undefined,\n actual: schemaUnique,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies indexes match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A non-unique index requirement can be satisfied by either:\n * - A non-unique index with the same columns, or\n * - A unique index with the same columns (stronger satisfies weaker)\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyIndexes(\n contractIndexes: readonly Index[],\n schemaIndexes: readonly SqlIndexIR[],\n schemaUniques: readonly SqlUniqueIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract index exists in schema\n for (const contractIndex of contractIndexes) {\n const indexPath = `${tablePath}.indexes[${contractIndex.columns.join(',')}]`;\n\n // Check for any matching index (unique or non-unique)\n // A unique index can satisfy a non-unique index requirement (stronger satisfies weaker)\n const matchingIndex = schemaIndexes.find((idx) =>\n arraysEqual(idx.columns, contractIndex.columns),\n );\n\n // Also check if a unique constraint satisfies the index requirement\n const matchingUniqueConstraint =\n !matchingIndex && schemaUniques.find((u) => arraysEqual(u.columns, contractIndex.columns));\n\n if (!matchingIndex && !matchingUniqueConstraint) {\n issues.push({\n kind: 'index_mismatch',\n table: tableName,\n expected: contractIndex.columns.join(', '),\n message: `Table \"${tableName}\" is missing index: ${contractIndex.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: 'index_mismatch',\n message: 'Index missing',\n expected: contractIndex,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra indexes in strict mode\n if (strict) {\n for (const schemaIndex of schemaIndexes) {\n // Skip unique indexes (they're handled as unique constraints)\n if (schemaIndex.unique) {\n continue;\n }\n\n const matchingIndex = contractIndexes.find((idx) =>\n arraysEqual(idx.columns, schemaIndex.columns),\n );\n\n if (!matchingIndex) {\n issues.push({\n kind: 'extra_index',\n table: tableName,\n message: `Extra index found in database (not in contract): ${schemaIndex.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'index',\n name: `index(${schemaIndex.columns.join(', ')})`,\n contractPath: `${tablePath}.indexes[${schemaIndex.columns.join(',')}]`,\n code: 'extra_index',\n message: 'Extra index found',\n expected: undefined,\n actual: schemaIndex,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies database dependencies are installed using component-owned verification hooks.\n * Each dependency provides a pure verifyDatabaseDependencyInstalled function that checks\n * whether the dependency is satisfied based on the in-memory schema IR (no DB I/O).\n *\n * Returns verification nodes for the tree.\n */\nexport function verifyDatabaseDependencies(\n dependencies: ReadonlyArray<ComponentDatabaseDependency<unknown>>,\n schema: SqlSchemaIR,\n issues: SchemaIssue[],\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n for (const dependency of dependencies) {\n const depIssues = dependency.verifyDatabaseDependencyInstalled(schema);\n const depPath = `dependencies.${dependency.id}`;\n\n if (depIssues.length > 0) {\n // Dependency is not satisfied\n issues.push(...depIssues);\n const issuesMessage = depIssues.map((i) => i.message).join('; ');\n const nodeMessage = issuesMessage ? `${dependency.id}: ${issuesMessage}` : dependency.id;\n nodes.push({\n status: 'fail',\n kind: 'databaseDependency',\n name: dependency.label,\n contractPath: depPath,\n code: 'dependency_missing',\n message: nodeMessage,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n } else {\n // Dependency is satisfied\n nodes.push({\n status: 'pass',\n kind: 'databaseDependency',\n name: dependency.label,\n contractPath: depPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n return nodes;\n}\n\n/**\n * Computes counts of pass/warn/fail nodes by traversing the tree.\n */\nexport function computeCounts(node: SchemaVerificationNode): {\n pass: number;\n warn: number;\n fail: number;\n totalNodes: number;\n} {\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n function traverse(n: SchemaVerificationNode): void {\n if (n.status === 'pass') {\n pass++;\n } else if (n.status === 'warn') {\n warn++;\n } else if (n.status === 'fail') {\n fail++;\n }\n\n if (n.children) {\n for (const child of n.children) {\n traverse(child);\n }\n }\n }\n\n traverse(node);\n\n return {\n pass,\n warn,\n fail,\n totalNodes: pass + warn + fail,\n };\n}\n","/**\n * Pure SQL schema verification function.\n *\n * This module provides a pure function that verifies a SqlSchemaIR against\n * a SqlContract without requiring a database connection. It can be reused\n * by migration planners and other tools that need to compare schema states.\n */\n\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/contract/framework-components';\nimport type {\n OperationContext,\n SchemaIssue,\n SchemaVerificationNode,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/core-control-plane/types';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { ComponentDatabaseDependency } from '../migrations/types';\nimport {\n computeCounts,\n verifyDatabaseDependencies,\n verifyForeignKeys,\n verifyIndexes,\n verifyPrimaryKey,\n verifyUniqueConstraints,\n} from './verify-helpers';\n\n/**\n * Options for the pure schema verification function.\n */\nexport interface VerifySqlSchemaOptions {\n /** The validated SQL contract to verify against */\n readonly contract: SqlContract<SqlStorage>;\n /** The schema IR from introspection (or another source) */\n readonly schema: SqlSchemaIR;\n /** Whether to run in strict mode (detects extra tables/columns) */\n readonly strict: boolean;\n /** Optional operation context for metadata */\n readonly context?: OperationContext;\n /** Type metadata registry for codec consistency warnings */\n readonly typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\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\n/**\n * Verifies that a SqlSchemaIR matches a SqlContract.\n *\n * This is a pure function that does NOT perform any database I/O.\n * It takes an already-introspected schema IR and compares it against\n * the contract requirements.\n *\n * @param options - Verification options\n * @returns VerifyDatabaseSchemaResult with verification tree and issues\n */\nexport function verifySqlSchema(options: VerifySqlSchemaOptions): VerifyDatabaseSchemaResult {\n const { contract, schema, strict, context, typeMetadataRegistry } = options;\n const startTime = Date.now();\n\n // Extract contract hashes and target\n const contractCoreHash = contract.coreHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : undefined;\n const contractTarget = contract.target;\n\n // Compare contract vs schema IR\n const issues: SchemaIssue[] = [];\n const rootChildren: SchemaVerificationNode[] = [];\n\n // Compare tables\n const contractTables = contract.storage.tables;\n const schemaTables = schema.tables;\n\n for (const [tableName, contractTable] of Object.entries(contractTables)) {\n const schemaTable = schemaTables[tableName];\n const tablePath = `storage.tables.${tableName}`;\n\n if (!schemaTable) {\n // Missing table\n issues.push({\n kind: 'missing_table',\n table: tableName,\n message: `Table \"${tableName}\" is missing from database`,\n });\n rootChildren.push({\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: 'missing_table',\n message: `Table \"${tableName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n continue;\n }\n\n // Table exists - compare columns, constraints, etc.\n const tableChildren: SchemaVerificationNode[] = [];\n const columnNodes: SchemaVerificationNode[] = [];\n\n // Compare columns\n for (const [columnName, contractColumn] of Object.entries(contractTable.columns)) {\n const schemaColumn = schemaTable.columns[columnName];\n const columnPath = `${tablePath}.columns.${columnName}`;\n\n if (!schemaColumn) {\n // Missing column\n issues.push({\n kind: 'missing_column',\n table: tableName,\n column: columnName,\n message: `Column \"${tableName}\".\"${columnName}\" is missing from database`,\n });\n columnNodes.push({\n status: 'fail',\n kind: 'column',\n name: `${columnName}: missing`,\n contractPath: columnPath,\n code: 'missing_column',\n message: `Column \"${columnName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n continue;\n }\n\n // Column exists - compare type and nullability\n const columnChildren: SchemaVerificationNode[] = [];\n let columnStatus: 'pass' | 'warn' | 'fail' = 'pass';\n\n // Compare type using nativeType directly\n // Both contractColumn.nativeType and schemaColumn.nativeType are required by their types\n const contractNativeType = contractColumn.nativeType;\n const schemaNativeType = schemaColumn.nativeType;\n\n if (contractNativeType !== schemaNativeType) {\n // Compare native types directly\n issues.push({\n kind: 'type_mismatch',\n table: tableName,\n column: columnName,\n expected: contractNativeType,\n actual: schemaNativeType,\n message: `Column \"${tableName}\".\"${columnName}\" has type mismatch: expected \"${contractNativeType}\", got \"${schemaNativeType}\"`,\n });\n columnChildren.push({\n status: 'fail',\n kind: 'type',\n name: 'type',\n contractPath: `${columnPath}.nativeType`,\n code: 'type_mismatch',\n message: `Type mismatch: expected ${contractNativeType}, got ${schemaNativeType}`,\n expected: contractNativeType,\n actual: schemaNativeType,\n children: [],\n });\n columnStatus = 'fail';\n }\n\n // Optionally validate that codecId (if present) and nativeType agree with registry\n if (contractColumn.codecId) {\n const typeMetadata = typeMetadataRegistry.get(contractColumn.codecId);\n if (!typeMetadata) {\n // Warning: codecId not found in registry\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_metadata_missing',\n contractPath: `${columnPath}.codecId`,\n code: 'type_metadata_missing',\n message: `codecId \"${contractColumn.codecId}\" not found in type metadata registry`,\n expected: contractColumn.codecId,\n actual: undefined,\n children: [],\n });\n } else if (typeMetadata.nativeType && typeMetadata.nativeType !== contractNativeType) {\n // Warning: codecId and nativeType don't agree with registry\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_consistency',\n contractPath: `${columnPath}.codecId`,\n code: 'type_consistency_warning',\n message: `codecId \"${contractColumn.codecId}\" maps to nativeType \"${typeMetadata.nativeType}\" in registry, but contract has \"${contractNativeType}\"`,\n expected: typeMetadata.nativeType,\n actual: contractNativeType,\n children: [],\n });\n }\n }\n\n // Compare nullability\n if (contractColumn.nullable !== schemaColumn.nullable) {\n issues.push({\n kind: 'nullability_mismatch',\n table: tableName,\n column: columnName,\n expected: String(contractColumn.nullable),\n actual: String(schemaColumn.nullable),\n message: `Column \"${tableName}\".\"${columnName}\" has nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n });\n columnChildren.push({\n status: 'fail',\n kind: 'nullability',\n name: 'nullability',\n contractPath: `${columnPath}.nullable`,\n code: 'nullability_mismatch',\n message: `Nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n expected: contractColumn.nullable,\n actual: schemaColumn.nullable,\n children: [],\n });\n columnStatus = 'fail';\n }\n\n // Compute column status from children (fail > warn > pass)\n const computedColumnStatus = columnChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : columnChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n // Use computed status if we have children, otherwise use the manually set status\n const finalColumnStatus = columnChildren.length > 0 ? computedColumnStatus : columnStatus;\n\n // Build column node\n const nullableText = contractColumn.nullable ? 'nullable' : 'not nullable';\n const columnTypeDisplay = contractColumn.codecId\n ? `${contractNativeType} (${contractColumn.codecId})`\n : contractNativeType;\n // Collect failure messages from children to create a summary message\n const failureMessages = columnChildren\n .filter((child) => child.status === 'fail' && child.message)\n .map((child) => child.message)\n .filter((msg): msg is string => typeof msg === 'string' && msg.length > 0);\n const columnMessage =\n finalColumnStatus === 'fail' && failureMessages.length > 0\n ? failureMessages.join('; ')\n : '';\n // Extract code from first child if status indicates an issue\n const columnCode =\n (finalColumnStatus === 'fail' || finalColumnStatus === 'warn') && columnChildren[0]\n ? columnChildren[0].code\n : '';\n columnNodes.push({\n status: finalColumnStatus,\n kind: 'column',\n name: `${columnName}: ${columnTypeDisplay} (${nullableText})`,\n contractPath: columnPath,\n code: columnCode,\n message: columnMessage,\n expected: undefined,\n actual: undefined,\n children: columnChildren,\n });\n }\n\n // Group columns under a \"columns\" header if we have any columns\n if (columnNodes.length > 0) {\n const columnsStatus = columnNodes.some((c) => c.status === 'fail')\n ? 'fail'\n : columnNodes.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n tableChildren.push({\n status: columnsStatus,\n kind: 'columns',\n name: 'columns',\n contractPath: `${tablePath}.columns`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: columnNodes,\n });\n }\n\n // Check for extra columns in strict mode\n if (strict) {\n for (const [columnName, { nativeType }] of Object.entries(schemaTable.columns)) {\n if (!contractTable.columns[columnName]) {\n issues.push({\n kind: 'extra_column',\n table: tableName,\n column: columnName,\n message: `Extra column \"${tableName}\".\"${columnName}\" found in database (not in contract)`,\n });\n columnNodes.push({\n status: 'fail',\n kind: 'column',\n name: `${columnName}: extra`,\n contractPath: `${tablePath}.columns.${columnName}`,\n code: 'extra_column',\n message: `Extra column \"${columnName}\" found`,\n expected: undefined,\n actual: nativeType,\n children: [],\n });\n }\n }\n }\n\n // Compare primary key\n if (contractTable.primaryKey) {\n const pkStatus = verifyPrimaryKey(\n contractTable.primaryKey,\n schemaTable.primaryKey,\n tableName,\n issues,\n );\n if (pkStatus === 'fail') {\n tableChildren.push({\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'primary_key_mismatch',\n message: 'Primary key mismatch',\n expected: contractTable.primaryKey,\n actual: schemaTable.primaryKey,\n children: [],\n });\n } else {\n tableChildren.push({\n status: 'pass',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n } else if (schemaTable.primaryKey && strict) {\n // Extra primary key in strict mode\n issues.push({\n kind: 'extra_primary_key',\n table: tableName,\n message: 'Extra primary key found in database (not in contract)',\n });\n tableChildren.push({\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${schemaTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'extra_primary_key',\n message: 'Extra primary key found',\n expected: undefined,\n actual: schemaTable.primaryKey,\n children: [],\n });\n }\n\n // Compare foreign keys\n const fkStatuses = verifyForeignKeys(\n contractTable.foreignKeys,\n schemaTable.foreignKeys,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...fkStatuses);\n\n // Compare unique constraints\n // Pass schemaIndexes so unique indexes can satisfy unique constraint requirements\n const uniqueStatuses = verifyUniqueConstraints(\n contractTable.uniques,\n schemaTable.uniques,\n schemaTable.indexes,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...uniqueStatuses);\n\n // Compare indexes\n // Pass schemaUniques so unique constraints can satisfy index requirements\n const indexStatuses = verifyIndexes(\n contractTable.indexes,\n schemaTable.indexes,\n schemaTable.uniques,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...indexStatuses);\n\n // Build table node\n const tableStatus = tableChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : tableChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n // Collect failure messages from children to create a summary message\n const tableFailureMessages = tableChildren\n .filter((child) => child.status === 'fail' && child.message)\n .map((child) => child.message)\n .filter((msg): msg is string => typeof msg === 'string' && msg.length > 0);\n const tableMessage =\n tableStatus === 'fail' && tableFailureMessages.length > 0\n ? `${tableFailureMessages.length} issue${tableFailureMessages.length === 1 ? '' : 's'}`\n : '';\n const tableCode =\n tableStatus === 'fail' && tableChildren.length > 0 && tableChildren[0]\n ? tableChildren[0].code\n : '';\n rootChildren.push({\n status: tableStatus,\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: tableCode,\n message: tableMessage,\n expected: undefined,\n actual: undefined,\n children: tableChildren,\n });\n }\n\n // Check for extra tables in strict mode\n if (strict) {\n for (const tableName of Object.keys(schemaTables)) {\n if (!contractTables[tableName]) {\n issues.push({\n kind: 'extra_table',\n table: tableName,\n message: `Extra table \"${tableName}\" found in database (not in contract)`,\n });\n rootChildren.push({\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: `storage.tables.${tableName}`,\n code: 'extra_table',\n message: `Extra table \"${tableName}\" found`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n }\n\n // Validate that all extension packs declared in the contract are present in frameworkComponents\n // This is a configuration integrity check - if the contract was emitted with an extension,\n // that extension must be provided in the current configuration.\n // Note: contract.extensionPacks includes adapter.id and target.id (from extractExtensionIds),\n // so we check for matches as extension, adapter, or target components.\n const contractExtensionPacks = contract.extensionPacks ?? {};\n for (const extensionNamespace of Object.keys(contractExtensionPacks)) {\n const hasComponent = options.frameworkComponents.some(\n (component) =>\n component.id === extensionNamespace &&\n (component.kind === 'extension' ||\n component.kind === 'adapter' ||\n component.kind === 'target'),\n );\n if (!hasComponent) {\n throw new Error(\n `Extension pack '${extensionNamespace}' is declared in the contract but not found in framework components. ` +\n 'This indicates a configuration mismatch - the contract was emitted with this extension pack, ' +\n 'but it is not provided in the current configuration.',\n );\n }\n }\n\n // Compare component-owned database dependencies (pure, deterministic)\n // Per ADR 154: We do NOT infer dependencies from contract extension packs.\n // Dependencies are only collected from frameworkComponents provided by the CLI.\n const databaseDependencies = collectDependenciesFromFrameworkComponents(\n options.frameworkComponents,\n );\n const dependencyStatuses = verifyDatabaseDependencies(databaseDependencies, schema, issues);\n rootChildren.push(...dependencyStatuses);\n\n // Build root node\n const rootStatus = rootChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : rootChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n const root: SchemaVerificationNode = {\n status: rootStatus,\n kind: 'contract',\n name: 'contract',\n contractPath: '',\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: rootChildren,\n };\n\n // Compute counts\n const counts = computeCounts(root);\n\n // Set ok flag\n const ok = counts.fail === 0;\n\n // Set code\n const code = ok ? undefined : 'PN-SCHEMA-0001';\n\n // Set summary\n const summary = ok\n ? 'Database schema satisfies contract'\n : `Database schema does not satisfy contract (${counts.fail} failure${counts.fail === 1 ? '' : 's'})`;\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok,\n ...ifDefined('code', code),\n summary,\n contract: {\n coreHash: contractCoreHash,\n ...ifDefined('profileHash', contractProfileHash),\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n schema: {\n issues,\n root,\n counts,\n },\n meta: {\n strict,\n ...ifDefined('contractPath', context?.contractPath),\n ...ifDefined('configPath', context?.configPath),\n },\n timings: {\n total: totalTime,\n },\n };\n}\n\n/**\n * Type predicate to check if a component has database dependencies with an init array.\n * The familyId check is redundant since TargetBoundComponentDescriptor<'sql', T> already\n * guarantees familyId is 'sql' at the type level, so we don't need runtime checks for it.\n */\nfunction hasDatabaseDependenciesInit<T extends string>(\n component: TargetBoundComponentDescriptor<'sql', T>,\n): component is TargetBoundComponentDescriptor<'sql', T> & {\n readonly databaseDependencies: {\n readonly init: readonly ComponentDatabaseDependency<T>[];\n };\n} {\n if (!('databaseDependencies' in component)) {\n return false;\n }\n const dbDeps = (component as Record<string, unknown>)['databaseDependencies'];\n if (dbDeps === undefined || dbDeps === null || typeof dbDeps !== 'object') {\n return false;\n }\n const depsRecord = dbDeps as Record<string, unknown>;\n const init = depsRecord['init'];\n if (init === undefined || !Array.isArray(init)) {\n return false;\n }\n return true;\n}\n\nfunction collectDependenciesFromFrameworkComponents<T extends string>(\n components: ReadonlyArray<TargetBoundComponentDescriptor<'sql', T>>,\n): ReadonlyArray<ComponentDatabaseDependency<T>> {\n const dependencies: ComponentDatabaseDependency<T>[] = [];\n for (const component of components) {\n if (hasDatabaseDependenciesInit(component)) {\n dependencies.push(...component.databaseDependencies.init);\n }\n }\n return dependencies;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"verify-sql-schema-BnLVoeWI.mjs","names":["nodes: SchemaVerificationNode[]","issues: SchemaIssue[]","rootChildren: SchemaVerificationNode[]","tableChildren: SchemaVerificationNode[]","columnNodes: SchemaVerificationNode[]","columnChildren: SchemaVerificationNode[]","columnStatus: 'pass' | 'warn' | 'fail'","root: SchemaVerificationNode","dependencies: ComponentDatabaseDependency<T>[]"],"sources":["../src/core/schema-verify/verify-helpers.ts","../src/core/schema-verify/verify-sql-schema.ts"],"sourcesContent":["/**\n * Pure verification helper functions for SQL schema verification.\n * These functions verify schema IR against contract requirements.\n */\n\nimport type { SchemaIssue, SchemaVerificationNode } from '@prisma-next/core-control-plane/types';\nimport type {\n ForeignKey,\n Index,\n PrimaryKey,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport type {\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport type { ComponentDatabaseDependency } from '../migrations/types.ts';\n\n/**\n * Compares two arrays of strings for equality (order-sensitive).\n */\nexport function arraysEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// ============================================================================\n// Semantic Satisfaction Predicates\n// ============================================================================\n// These predicates implement the \"stronger satisfies weaker\" logic for storage\n// objects. They are used by both verification and migration planning to ensure\n// consistent behavior across the control plane.\n\n/**\n * Checks if a unique constraint requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a unique constraint requirement can be satisfied by:\n * - A unique constraint with the same columns, OR\n * - A unique index with the same columns\n *\n * @param uniques - The unique constraints in the schema table\n * @param indexes - The indexes in the schema table\n * @param columns - The columns required by the unique constraint\n * @returns true if the requirement is satisfied\n */\nexport function isUniqueConstraintSatisfied(\n uniques: readonly SqlUniqueIR[],\n indexes: readonly SqlIndexIR[],\n columns: readonly string[],\n): boolean {\n // Check for matching unique constraint\n const hasConstraint = uniques.some((unique) => arraysEqual(unique.columns, columns));\n if (hasConstraint) {\n return true;\n }\n // Check for matching unique index (semantic satisfaction)\n return indexes.some((index) => index.unique && arraysEqual(index.columns, columns));\n}\n\n/**\n * Checks if an index requirement is satisfied by the given columns.\n *\n * Semantic satisfaction: a non-unique index requirement can be satisfied by:\n * - Any index (unique or non-unique) with the same columns, OR\n * - A unique constraint with the same columns (stronger satisfies weaker)\n *\n * @param indexes - The indexes in the schema table\n * @param uniques - The unique constraints in the schema table\n * @param columns - The columns required by the index\n * @returns true if the requirement is satisfied\n */\nexport function isIndexSatisfied(\n indexes: readonly SqlIndexIR[],\n uniques: readonly SqlUniqueIR[],\n columns: readonly string[],\n): boolean {\n // Check for any matching index (unique or non-unique)\n const hasMatchingIndex = indexes.some((index) => arraysEqual(index.columns, columns));\n if (hasMatchingIndex) {\n return true;\n }\n // Check for matching unique constraint (semantic satisfaction)\n return uniques.some((unique) => arraysEqual(unique.columns, columns));\n}\n\n/**\n * Verifies primary key matches between contract and schema.\n * Returns 'pass' or 'fail'.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyPrimaryKey(\n contractPK: PrimaryKey,\n schemaPK: PrimaryKey | undefined,\n tableName: string,\n issues: SchemaIssue[],\n): 'pass' | 'fail' {\n if (!schemaPK) {\n issues.push({\n kind: 'primary_key_mismatch',\n table: tableName,\n expected: contractPK.columns.join(', '),\n message: `Table \"${tableName}\" is missing primary key`,\n });\n return 'fail';\n }\n\n if (!arraysEqual(contractPK.columns, schemaPK.columns)) {\n issues.push({\n kind: 'primary_key_mismatch',\n table: tableName,\n expected: contractPK.columns.join(', '),\n actual: schemaPK.columns.join(', '),\n message: `Table \"${tableName}\" has primary key mismatch: expected columns [${contractPK.columns.join(', ')}], got [${schemaPK.columns.join(', ')}]`,\n });\n return 'fail';\n }\n\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n\n return 'pass';\n}\n\n/**\n * Verifies foreign keys match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + columns + referenced table + referenced columns).\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyForeignKeys(\n contractFKs: readonly ForeignKey[],\n schemaFKs: readonly SqlForeignKeyIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract FK exists in schema\n for (const contractFK of contractFKs) {\n const fkPath = `${tablePath}.foreignKeys[${contractFK.columns.join(',')}]`;\n const matchingFK = schemaFKs.find((fk) => {\n return (\n arraysEqual(fk.columns, contractFK.columns) &&\n fk.referencedTable === contractFK.references.table &&\n arraysEqual(fk.referencedColumns, contractFK.references.columns)\n );\n });\n\n if (!matchingFK) {\n issues.push({\n kind: 'foreign_key_mismatch',\n table: tableName,\n expected: `${contractFK.columns.join(', ')} -> ${contractFK.references.table}(${contractFK.references.columns.join(', ')})`,\n message: `Table \"${tableName}\" is missing foreign key: ${contractFK.columns.join(', ')} -> ${contractFK.references.table}(${contractFK.references.columns.join(', ')})`,\n });\n nodes.push({\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.columns.join(', ')})`,\n contractPath: fkPath,\n code: 'foreign_key_mismatch',\n message: 'Foreign key missing',\n expected: contractFK,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'foreignKey',\n name: `foreignKey(${contractFK.columns.join(', ')})`,\n contractPath: fkPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra FKs in strict mode\n if (strict) {\n for (const schemaFK of schemaFKs) {\n const matchingFK = contractFKs.find((fk) => {\n return (\n arraysEqual(fk.columns, schemaFK.columns) &&\n fk.references.table === schemaFK.referencedTable &&\n arraysEqual(fk.references.columns, schemaFK.referencedColumns)\n );\n });\n\n if (!matchingFK) {\n issues.push({\n kind: 'extra_foreign_key',\n table: tableName,\n message: `Extra foreign key found in database (not in contract): ${schemaFK.columns.join(', ')} -> ${schemaFK.referencedTable}(${schemaFK.referencedColumns.join(', ')})`,\n });\n nodes.push({\n status: 'fail',\n kind: 'foreignKey',\n name: `foreignKey(${schemaFK.columns.join(', ')})`,\n contractPath: `${tablePath}.foreignKeys[${schemaFK.columns.join(',')}]`,\n code: 'extra_foreign_key',\n message: 'Extra foreign key found',\n expected: undefined,\n actual: schemaFK,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies unique constraints match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A unique constraint requirement can be satisfied by either:\n * - A unique constraint with the same columns, or\n * - A unique index with the same columns\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyUniqueConstraints(\n contractUniques: readonly UniqueConstraint[],\n schemaUniques: readonly SqlUniqueIR[],\n schemaIndexes: readonly SqlIndexIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract unique exists in schema\n for (const contractUnique of contractUniques) {\n const uniquePath = `${tablePath}.uniques[${contractUnique.columns.join(',')}]`;\n\n // First check for a matching unique constraint\n const matchingUnique = schemaUniques.find((u) =>\n arraysEqual(u.columns, contractUnique.columns),\n );\n\n // If no matching constraint, check for a unique index with the same columns\n const matchingUniqueIndex =\n !matchingUnique &&\n schemaIndexes.find((idx) => idx.unique && arraysEqual(idx.columns, contractUnique.columns));\n\n if (!matchingUnique && !matchingUniqueIndex) {\n issues.push({\n kind: 'unique_constraint_mismatch',\n table: tableName,\n expected: contractUnique.columns.join(', '),\n message: `Table \"${tableName}\" is missing unique constraint: ${contractUnique.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: 'unique_constraint_mismatch',\n message: 'Unique constraint missing',\n expected: contractUnique,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'unique',\n name: `unique(${contractUnique.columns.join(', ')})`,\n contractPath: uniquePath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra uniques in strict mode\n if (strict) {\n for (const schemaUnique of schemaUniques) {\n const matchingUnique = contractUniques.find((u) =>\n arraysEqual(u.columns, schemaUnique.columns),\n );\n\n if (!matchingUnique) {\n issues.push({\n kind: 'extra_unique_constraint',\n table: tableName,\n message: `Extra unique constraint found in database (not in contract): ${schemaUnique.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'unique',\n name: `unique(${schemaUnique.columns.join(', ')})`,\n contractPath: `${tablePath}.uniques[${schemaUnique.columns.join(',')}]`,\n code: 'extra_unique_constraint',\n message: 'Extra unique constraint found',\n expected: undefined,\n actual: schemaUnique,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies indexes match between contract and schema.\n * Returns verification nodes for the tree.\n *\n * Uses semantic satisfaction: identity is based on (table + kind + columns).\n * A non-unique index requirement can be satisfied by either:\n * - A non-unique index with the same columns, or\n * - A unique index with the same columns (stronger satisfies weaker)\n *\n * Name differences are ignored by default (names are for DDL/diagnostics, not identity).\n */\nexport function verifyIndexes(\n contractIndexes: readonly Index[],\n schemaIndexes: readonly SqlIndexIR[],\n schemaUniques: readonly SqlUniqueIR[],\n tableName: string,\n tablePath: string,\n issues: SchemaIssue[],\n strict: boolean,\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n // Check each contract index exists in schema\n for (const contractIndex of contractIndexes) {\n const indexPath = `${tablePath}.indexes[${contractIndex.columns.join(',')}]`;\n\n // Check for any matching index (unique or non-unique)\n // A unique index can satisfy a non-unique index requirement (stronger satisfies weaker)\n const matchingIndex = schemaIndexes.find((idx) =>\n arraysEqual(idx.columns, contractIndex.columns),\n );\n\n // Also check if a unique constraint satisfies the index requirement\n const matchingUniqueConstraint =\n !matchingIndex && schemaUniques.find((u) => arraysEqual(u.columns, contractIndex.columns));\n\n if (!matchingIndex && !matchingUniqueConstraint) {\n issues.push({\n kind: 'index_mismatch',\n table: tableName,\n expected: contractIndex.columns.join(', '),\n message: `Table \"${tableName}\" is missing index: ${contractIndex.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: 'index_mismatch',\n message: 'Index missing',\n expected: contractIndex,\n actual: undefined,\n children: [],\n });\n } else {\n // Name differences are ignored for semantic satisfaction.\n // Names are persisted for deterministic DDL and diagnostics but are not identity.\n nodes.push({\n status: 'pass',\n kind: 'index',\n name: `index(${contractIndex.columns.join(', ')})`,\n contractPath: indexPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n // Check for extra indexes in strict mode\n if (strict) {\n for (const schemaIndex of schemaIndexes) {\n // Skip unique indexes (they're handled as unique constraints)\n if (schemaIndex.unique) {\n continue;\n }\n\n const matchingIndex = contractIndexes.find((idx) =>\n arraysEqual(idx.columns, schemaIndex.columns),\n );\n\n if (!matchingIndex) {\n issues.push({\n kind: 'extra_index',\n table: tableName,\n message: `Extra index found in database (not in contract): ${schemaIndex.columns.join(', ')}`,\n });\n nodes.push({\n status: 'fail',\n kind: 'index',\n name: `index(${schemaIndex.columns.join(', ')})`,\n contractPath: `${tablePath}.indexes[${schemaIndex.columns.join(',')}]`,\n code: 'extra_index',\n message: 'Extra index found',\n expected: undefined,\n actual: schemaIndex,\n children: [],\n });\n }\n }\n }\n\n return nodes;\n}\n\n/**\n * Verifies database dependencies are installed using component-owned verification hooks.\n * Each dependency provides a pure verifyDatabaseDependencyInstalled function that checks\n * whether the dependency is satisfied based on the in-memory schema IR (no DB I/O).\n *\n * Returns verification nodes for the tree.\n */\nexport function verifyDatabaseDependencies(\n dependencies: ReadonlyArray<ComponentDatabaseDependency<unknown>>,\n schema: SqlSchemaIR,\n issues: SchemaIssue[],\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n\n for (const dependency of dependencies) {\n const depIssues = dependency.verifyDatabaseDependencyInstalled(schema);\n const depPath = `dependencies.${dependency.id}`;\n\n if (depIssues.length > 0) {\n // Dependency is not satisfied\n issues.push(...depIssues);\n const issuesMessage = depIssues.map((i) => i.message).join('; ');\n const nodeMessage = issuesMessage ? `${dependency.id}: ${issuesMessage}` : dependency.id;\n nodes.push({\n status: 'fail',\n kind: 'databaseDependency',\n name: dependency.label,\n contractPath: depPath,\n code: 'dependency_missing',\n message: nodeMessage,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n } else {\n // Dependency is satisfied\n nodes.push({\n status: 'pass',\n kind: 'databaseDependency',\n name: dependency.label,\n contractPath: depPath,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n\n return nodes;\n}\n\n/**\n * Computes counts of pass/warn/fail nodes by traversing the tree.\n */\nexport function computeCounts(node: SchemaVerificationNode): {\n pass: number;\n warn: number;\n fail: number;\n totalNodes: number;\n} {\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n function traverse(n: SchemaVerificationNode): void {\n if (n.status === 'pass') {\n pass++;\n } else if (n.status === 'warn') {\n warn++;\n } else if (n.status === 'fail') {\n fail++;\n }\n\n if (n.children) {\n for (const child of n.children) {\n traverse(child);\n }\n }\n }\n\n traverse(node);\n\n return {\n pass,\n warn,\n fail,\n totalNodes: pass + warn + fail,\n };\n}\n","/**\n * Pure SQL schema verification function.\n *\n * This module provides a pure function that verifies a SqlSchemaIR against\n * a SqlContract without requiring a database connection. It can be reused\n * by migration planners and other tools that need to compare schema states.\n */\n\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/contract/framework-components';\nimport type {\n OperationContext,\n SchemaIssue,\n SchemaVerificationNode,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/core-control-plane/types';\nimport type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIR } from '@prisma-next/sql-schema-ir';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { ComponentDatabaseDependency } from '../migrations/types.ts';\nimport {\n computeCounts,\n verifyDatabaseDependencies,\n verifyForeignKeys,\n verifyIndexes,\n verifyPrimaryKey,\n verifyUniqueConstraints,\n} from './verify-helpers.ts';\n\n/**\n * Options for the pure schema verification function.\n */\nexport interface VerifySqlSchemaOptions {\n /** The validated SQL contract to verify against */\n readonly contract: SqlContract<SqlStorage>;\n /** The schema IR from introspection (or another source) */\n readonly schema: SqlSchemaIR;\n /** Whether to run in strict mode (detects extra tables/columns) */\n readonly strict: boolean;\n /** Optional operation context for metadata */\n readonly context?: OperationContext;\n /** Type metadata registry for codec consistency warnings */\n readonly typeMetadataRegistry: ReadonlyMap<string, { nativeType?: string }>;\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\n/**\n * Verifies that a SqlSchemaIR matches a SqlContract.\n *\n * This is a pure function that does NOT perform any database I/O.\n * It takes an already-introspected schema IR and compares it against\n * the contract requirements.\n *\n * @param options - Verification options\n * @returns VerifyDatabaseSchemaResult with verification tree and issues\n */\nexport function verifySqlSchema(options: VerifySqlSchemaOptions): VerifyDatabaseSchemaResult {\n const { contract, schema, strict, context, typeMetadataRegistry } = options;\n const startTime = Date.now();\n\n // Extract contract hashes and target\n const contractCoreHash = contract.coreHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : undefined;\n const contractTarget = contract.target;\n\n // Compare contract vs schema IR\n const issues: SchemaIssue[] = [];\n const rootChildren: SchemaVerificationNode[] = [];\n\n // Compare tables\n const contractTables = contract.storage.tables;\n const schemaTables = schema.tables;\n\n for (const [tableName, contractTable] of Object.entries(contractTables)) {\n const schemaTable = schemaTables[tableName];\n const tablePath = `storage.tables.${tableName}`;\n\n if (!schemaTable) {\n // Missing table\n issues.push({\n kind: 'missing_table',\n table: tableName,\n message: `Table \"${tableName}\" is missing from database`,\n });\n rootChildren.push({\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: 'missing_table',\n message: `Table \"${tableName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n continue;\n }\n\n // Table exists - compare columns, constraints, etc.\n const tableChildren: SchemaVerificationNode[] = [];\n const columnNodes: SchemaVerificationNode[] = [];\n\n // Compare columns\n for (const [columnName, contractColumn] of Object.entries(contractTable.columns)) {\n const schemaColumn = schemaTable.columns[columnName];\n const columnPath = `${tablePath}.columns.${columnName}`;\n\n if (!schemaColumn) {\n // Missing column\n issues.push({\n kind: 'missing_column',\n table: tableName,\n column: columnName,\n message: `Column \"${tableName}\".\"${columnName}\" is missing from database`,\n });\n columnNodes.push({\n status: 'fail',\n kind: 'column',\n name: `${columnName}: missing`,\n contractPath: columnPath,\n code: 'missing_column',\n message: `Column \"${columnName}\" is missing`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n continue;\n }\n\n // Column exists - compare type and nullability\n const columnChildren: SchemaVerificationNode[] = [];\n let columnStatus: 'pass' | 'warn' | 'fail' = 'pass';\n\n // Compare type using nativeType directly\n // Both contractColumn.nativeType and schemaColumn.nativeType are required by their types\n const contractNativeType = contractColumn.nativeType;\n const schemaNativeType = schemaColumn.nativeType;\n\n if (contractNativeType !== schemaNativeType) {\n // Compare native types directly\n issues.push({\n kind: 'type_mismatch',\n table: tableName,\n column: columnName,\n expected: contractNativeType,\n actual: schemaNativeType,\n message: `Column \"${tableName}\".\"${columnName}\" has type mismatch: expected \"${contractNativeType}\", got \"${schemaNativeType}\"`,\n });\n columnChildren.push({\n status: 'fail',\n kind: 'type',\n name: 'type',\n contractPath: `${columnPath}.nativeType`,\n code: 'type_mismatch',\n message: `Type mismatch: expected ${contractNativeType}, got ${schemaNativeType}`,\n expected: contractNativeType,\n actual: schemaNativeType,\n children: [],\n });\n columnStatus = 'fail';\n }\n\n // Optionally validate that codecId (if present) and nativeType agree with registry\n if (contractColumn.codecId) {\n const typeMetadata = typeMetadataRegistry.get(contractColumn.codecId);\n if (!typeMetadata) {\n // Warning: codecId not found in registry\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_metadata_missing',\n contractPath: `${columnPath}.codecId`,\n code: 'type_metadata_missing',\n message: `codecId \"${contractColumn.codecId}\" not found in type metadata registry`,\n expected: contractColumn.codecId,\n actual: undefined,\n children: [],\n });\n } else if (typeMetadata.nativeType && typeMetadata.nativeType !== contractNativeType) {\n // Warning: codecId and nativeType don't agree with registry\n columnChildren.push({\n status: 'warn',\n kind: 'type',\n name: 'type_consistency',\n contractPath: `${columnPath}.codecId`,\n code: 'type_consistency_warning',\n message: `codecId \"${contractColumn.codecId}\" maps to nativeType \"${typeMetadata.nativeType}\" in registry, but contract has \"${contractNativeType}\"`,\n expected: typeMetadata.nativeType,\n actual: contractNativeType,\n children: [],\n });\n }\n }\n\n // Compare nullability\n if (contractColumn.nullable !== schemaColumn.nullable) {\n issues.push({\n kind: 'nullability_mismatch',\n table: tableName,\n column: columnName,\n expected: String(contractColumn.nullable),\n actual: String(schemaColumn.nullable),\n message: `Column \"${tableName}\".\"${columnName}\" has nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n });\n columnChildren.push({\n status: 'fail',\n kind: 'nullability',\n name: 'nullability',\n contractPath: `${columnPath}.nullable`,\n code: 'nullability_mismatch',\n message: `Nullability mismatch: expected ${contractColumn.nullable ? 'nullable' : 'not null'}, got ${schemaColumn.nullable ? 'nullable' : 'not null'}`,\n expected: contractColumn.nullable,\n actual: schemaColumn.nullable,\n children: [],\n });\n columnStatus = 'fail';\n }\n\n // Compute column status from children (fail > warn > pass)\n const computedColumnStatus = columnChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : columnChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n // Use computed status if we have children, otherwise use the manually set status\n const finalColumnStatus = columnChildren.length > 0 ? computedColumnStatus : columnStatus;\n\n // Build column node\n const nullableText = contractColumn.nullable ? 'nullable' : 'not nullable';\n const columnTypeDisplay = contractColumn.codecId\n ? `${contractNativeType} (${contractColumn.codecId})`\n : contractNativeType;\n // Collect failure messages from children to create a summary message\n const failureMessages = columnChildren\n .filter((child) => child.status === 'fail' && child.message)\n .map((child) => child.message)\n .filter((msg): msg is string => typeof msg === 'string' && msg.length > 0);\n const columnMessage =\n finalColumnStatus === 'fail' && failureMessages.length > 0\n ? failureMessages.join('; ')\n : '';\n // Extract code from first child if status indicates an issue\n const columnCode =\n (finalColumnStatus === 'fail' || finalColumnStatus === 'warn') && columnChildren[0]\n ? columnChildren[0].code\n : '';\n columnNodes.push({\n status: finalColumnStatus,\n kind: 'column',\n name: `${columnName}: ${columnTypeDisplay} (${nullableText})`,\n contractPath: columnPath,\n code: columnCode,\n message: columnMessage,\n expected: undefined,\n actual: undefined,\n children: columnChildren,\n });\n }\n\n // Group columns under a \"columns\" header if we have any columns\n if (columnNodes.length > 0) {\n const columnsStatus = columnNodes.some((c) => c.status === 'fail')\n ? 'fail'\n : columnNodes.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n tableChildren.push({\n status: columnsStatus,\n kind: 'columns',\n name: 'columns',\n contractPath: `${tablePath}.columns`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: columnNodes,\n });\n }\n\n // Check for extra columns in strict mode\n if (strict) {\n for (const [columnName, { nativeType }] of Object.entries(schemaTable.columns)) {\n if (!contractTable.columns[columnName]) {\n issues.push({\n kind: 'extra_column',\n table: tableName,\n column: columnName,\n message: `Extra column \"${tableName}\".\"${columnName}\" found in database (not in contract)`,\n });\n columnNodes.push({\n status: 'fail',\n kind: 'column',\n name: `${columnName}: extra`,\n contractPath: `${tablePath}.columns.${columnName}`,\n code: 'extra_column',\n message: `Extra column \"${columnName}\" found`,\n expected: undefined,\n actual: nativeType,\n children: [],\n });\n }\n }\n }\n\n // Compare primary key\n if (contractTable.primaryKey) {\n const pkStatus = verifyPrimaryKey(\n contractTable.primaryKey,\n schemaTable.primaryKey,\n tableName,\n issues,\n );\n if (pkStatus === 'fail') {\n tableChildren.push({\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'primary_key_mismatch',\n message: 'Primary key mismatch',\n expected: contractTable.primaryKey,\n actual: schemaTable.primaryKey,\n children: [],\n });\n } else {\n tableChildren.push({\n status: 'pass',\n kind: 'primaryKey',\n name: `primary key: ${contractTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n } else if (schemaTable.primaryKey && strict) {\n // Extra primary key in strict mode\n issues.push({\n kind: 'extra_primary_key',\n table: tableName,\n message: 'Extra primary key found in database (not in contract)',\n });\n tableChildren.push({\n status: 'fail',\n kind: 'primaryKey',\n name: `primary key: ${schemaTable.primaryKey.columns.join(', ')}`,\n contractPath: `${tablePath}.primaryKey`,\n code: 'extra_primary_key',\n message: 'Extra primary key found',\n expected: undefined,\n actual: schemaTable.primaryKey,\n children: [],\n });\n }\n\n // Compare foreign keys\n const fkStatuses = verifyForeignKeys(\n contractTable.foreignKeys,\n schemaTable.foreignKeys,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...fkStatuses);\n\n // Compare unique constraints\n // Pass schemaIndexes so unique indexes can satisfy unique constraint requirements\n const uniqueStatuses = verifyUniqueConstraints(\n contractTable.uniques,\n schemaTable.uniques,\n schemaTable.indexes,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...uniqueStatuses);\n\n // Compare indexes\n // Pass schemaUniques so unique constraints can satisfy index requirements\n const indexStatuses = verifyIndexes(\n contractTable.indexes,\n schemaTable.indexes,\n schemaTable.uniques,\n tableName,\n tablePath,\n issues,\n strict,\n );\n tableChildren.push(...indexStatuses);\n\n // Build table node\n const tableStatus = tableChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : tableChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n // Collect failure messages from children to create a summary message\n const tableFailureMessages = tableChildren\n .filter((child) => child.status === 'fail' && child.message)\n .map((child) => child.message)\n .filter((msg): msg is string => typeof msg === 'string' && msg.length > 0);\n const tableMessage =\n tableStatus === 'fail' && tableFailureMessages.length > 0\n ? `${tableFailureMessages.length} issue${tableFailureMessages.length === 1 ? '' : 's'}`\n : '';\n const tableCode =\n tableStatus === 'fail' && tableChildren.length > 0 && tableChildren[0]\n ? tableChildren[0].code\n : '';\n rootChildren.push({\n status: tableStatus,\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: tablePath,\n code: tableCode,\n message: tableMessage,\n expected: undefined,\n actual: undefined,\n children: tableChildren,\n });\n }\n\n // Check for extra tables in strict mode\n if (strict) {\n for (const tableName of Object.keys(schemaTables)) {\n if (!contractTables[tableName]) {\n issues.push({\n kind: 'extra_table',\n table: tableName,\n message: `Extra table \"${tableName}\" found in database (not in contract)`,\n });\n rootChildren.push({\n status: 'fail',\n kind: 'table',\n name: `table ${tableName}`,\n contractPath: `storage.tables.${tableName}`,\n code: 'extra_table',\n message: `Extra table \"${tableName}\" found`,\n expected: undefined,\n actual: undefined,\n children: [],\n });\n }\n }\n }\n\n // Validate that all extension packs declared in the contract are present in frameworkComponents\n // This is a configuration integrity check - if the contract was emitted with an extension,\n // that extension must be provided in the current configuration.\n // Note: contract.extensionPacks includes adapter.id and target.id (from extractExtensionIds),\n // so we check for matches as extension, adapter, or target components.\n const contractExtensionPacks = contract.extensionPacks ?? {};\n for (const extensionNamespace of Object.keys(contractExtensionPacks)) {\n const hasComponent = options.frameworkComponents.some(\n (component) =>\n component.id === extensionNamespace &&\n (component.kind === 'extension' ||\n component.kind === 'adapter' ||\n component.kind === 'target'),\n );\n if (!hasComponent) {\n throw new Error(\n `Extension pack '${extensionNamespace}' is declared in the contract but not found in framework components. ` +\n 'This indicates a configuration mismatch - the contract was emitted with this extension pack, ' +\n 'but it is not provided in the current configuration.',\n );\n }\n }\n\n // Compare component-owned database dependencies (pure, deterministic)\n // Per ADR 154: We do NOT infer dependencies from contract extension packs.\n // Dependencies are only collected from frameworkComponents provided by the CLI.\n const databaseDependencies = collectDependenciesFromFrameworkComponents(\n options.frameworkComponents,\n );\n const dependencyStatuses = verifyDatabaseDependencies(databaseDependencies, schema, issues);\n rootChildren.push(...dependencyStatuses);\n\n // Build root node\n const rootStatus = rootChildren.some((c) => c.status === 'fail')\n ? 'fail'\n : rootChildren.some((c) => c.status === 'warn')\n ? 'warn'\n : 'pass';\n const root: SchemaVerificationNode = {\n status: rootStatus,\n kind: 'contract',\n name: 'contract',\n contractPath: '',\n code: '',\n message: '',\n expected: undefined,\n actual: undefined,\n children: rootChildren,\n };\n\n // Compute counts\n const counts = computeCounts(root);\n\n // Set ok flag\n const ok = counts.fail === 0;\n\n // Set code\n const code = ok ? undefined : 'PN-SCHEMA-0001';\n\n // Set summary\n const summary = ok\n ? 'Database schema satisfies contract'\n : `Database schema does not satisfy contract (${counts.fail} failure${counts.fail === 1 ? '' : 's'})`;\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok,\n ...ifDefined('code', code),\n summary,\n contract: {\n coreHash: contractCoreHash,\n ...ifDefined('profileHash', contractProfileHash),\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n schema: {\n issues,\n root,\n counts,\n },\n meta: {\n strict,\n ...ifDefined('contractPath', context?.contractPath),\n ...ifDefined('configPath', context?.configPath),\n },\n timings: {\n total: totalTime,\n },\n };\n}\n\n/**\n * Type predicate to check if a component has database dependencies with an init array.\n * The familyId check is redundant since TargetBoundComponentDescriptor<'sql', T> already\n * guarantees familyId is 'sql' at the type level, so we don't need runtime checks for it.\n */\nfunction hasDatabaseDependenciesInit<T extends string>(\n component: TargetBoundComponentDescriptor<'sql', T>,\n): component is TargetBoundComponentDescriptor<'sql', T> & {\n readonly databaseDependencies: {\n readonly init: readonly ComponentDatabaseDependency<T>[];\n };\n} {\n if (!('databaseDependencies' in component)) {\n return false;\n }\n const dbDeps = (component as Record<string, unknown>)['databaseDependencies'];\n if (dbDeps === undefined || dbDeps === null || typeof dbDeps !== 'object') {\n return false;\n }\n const depsRecord = dbDeps as Record<string, unknown>;\n const init = depsRecord['init'];\n if (init === undefined || !Array.isArray(init)) {\n return false;\n }\n return true;\n}\n\nfunction collectDependenciesFromFrameworkComponents<T extends string>(\n components: ReadonlyArray<TargetBoundComponentDescriptor<'sql', T>>,\n): ReadonlyArray<ComponentDatabaseDependency<T>> {\n const dependencies: ComponentDatabaseDependency<T>[] = [];\n for (const component of components) {\n if (hasDatabaseDependenciesInit(component)) {\n dependencies.push(...component.databaseDependencies.init);\n }\n }\n return dependencies;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/family-sql",
3
- "version": "0.3.0-pr.94.2",
3
+ "version": "0.3.0-pr.94.4",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "engines": {
@@ -9,26 +9,26 @@
9
9
  "description": "SQL family descriptor for Prisma Next",
10
10
  "dependencies": {
11
11
  "arktype": "^2.0.0",
12
- "@prisma-next/cli": "0.3.0-pr.94.2",
13
- "@prisma-next/contract": "0.3.0-pr.94.2",
14
- "@prisma-next/core-control-plane": "0.3.0-pr.94.2",
15
- "@prisma-next/core-execution-plane": "0.3.0-pr.94.2",
16
- "@prisma-next/operations": "0.3.0-pr.94.2",
17
- "@prisma-next/runtime-executor": "0.3.0-pr.94.2",
18
- "@prisma-next/sql-contract": "0.3.0-pr.94.2",
19
- "@prisma-next/sql-contract-emitter": "0.3.0-pr.94.2",
20
- "@prisma-next/sql-contract-ts": "0.3.0-pr.94.2",
21
- "@prisma-next/sql-operations": "0.3.0-pr.94.2",
22
- "@prisma-next/sql-relational-core": "0.3.0-pr.94.2",
23
- "@prisma-next/sql-runtime": "0.3.0-pr.94.2",
24
- "@prisma-next/sql-schema-ir": "0.3.0-pr.94.2",
25
- "@prisma-next/utils": "0.3.0-pr.94.2"
12
+ "@prisma-next/contract": "0.3.0-pr.94.4",
13
+ "@prisma-next/core-control-plane": "0.3.0-pr.94.4",
14
+ "@prisma-next/core-execution-plane": "0.3.0-pr.94.4",
15
+ "@prisma-next/cli": "0.3.0-pr.94.4",
16
+ "@prisma-next/runtime-executor": "0.3.0-pr.94.4",
17
+ "@prisma-next/operations": "0.3.0-pr.94.4",
18
+ "@prisma-next/sql-contract": "0.3.0-pr.94.4",
19
+ "@prisma-next/sql-contract-emitter": "0.3.0-pr.94.4",
20
+ "@prisma-next/sql-contract-ts": "0.3.0-pr.94.4",
21
+ "@prisma-next/sql-operations": "0.3.0-pr.94.4",
22
+ "@prisma-next/sql-relational-core": "0.3.0-pr.94.4",
23
+ "@prisma-next/sql-runtime": "0.3.0-pr.94.4",
24
+ "@prisma-next/sql-schema-ir": "0.3.0-pr.94.4",
25
+ "@prisma-next/utils": "0.3.0-pr.94.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "tsdown": "0.18.4",
29
29
  "typescript": "5.9.3",
30
30
  "vitest": "4.0.16",
31
- "@prisma-next/driver-postgres": "0.3.0-pr.94.2",
31
+ "@prisma-next/driver-postgres": "0.3.0-pr.94.4",
32
32
  "@prisma-next/test-utils": "0.0.1",
33
33
  "@prisma-next/tsconfig": "0.0.0",
34
34
  "@prisma-next/tsdown": "0.0.0"
@@ -3,7 +3,7 @@ import type {
3
3
  ControlPlaneStack,
4
4
  } from '@prisma-next/core-control-plane/types';
5
5
  import { sqlTargetFamilyHook } from '@prisma-next/sql-contract-emitter';
6
- import { createSqlFamilyInstance, type SqlControlFamilyInstance } from './instance';
6
+ import { createSqlFamilyInstance, type SqlControlFamilyInstance } from './instance.ts';
7
7
 
8
8
  /**
9
9
  * SQL family descriptor implementation.
@@ -33,10 +33,10 @@ import {
33
33
  extractCodecTypeImports,
34
34
  extractExtensionIds,
35
35
  extractOperationTypeImports,
36
- } from './assembly';
37
- import type { SqlControlAdapter } from './control-adapter';
38
- import { verifySqlSchema } from './schema-verify/verify-sql-schema';
39
- import { collectSupportedCodecTypeIds, readMarker } from './verify';
36
+ } from './assembly.ts';
37
+ import type { SqlControlAdapter } from './control-adapter.ts';
38
+ import { verifySqlSchema } from './schema-verify/verify-sql-schema.ts';
39
+ import { collectSupportedCodecTypeIds, readMarker } from './verify.ts';
40
40
 
41
41
  /**
42
42
  * Converts an OperationManifest (descriptor declarative data) to a SqlOperationSignature.
@@ -13,7 +13,7 @@ import type {
13
13
  SqlPlannerConflict,
14
14
  SqlPlannerFailureResult,
15
15
  SqlPlannerSuccessResult,
16
- } from './types';
16
+ } from './types.ts';
17
17
 
18
18
  const readOnlyEmptyObject: Record<string, never> = Object.freeze({});
19
19
 
@@ -26,7 +26,7 @@ import type {
26
26
  import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
27
27
  import type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';
28
28
  import type { Result } from '@prisma-next/utils/result';
29
- import type { SqlControlFamilyInstance } from '../instance';
29
+ import type { SqlControlFamilyInstance } from '../instance.ts';
30
30
 
31
31
  export type AnyRecord = Readonly<Record<string, unknown>>;
32
32
 
@@ -10,7 +10,7 @@ import {
10
10
  type SqlRuntimeAdapterInstance,
11
11
  type SqlRuntimeDriverInstance,
12
12
  type SqlRuntimeFamilyInstance,
13
- } from './runtime-instance';
13
+ } from './runtime-instance.ts';
14
14
 
15
15
  /**
16
16
  * SQL runtime family descriptor implementation.
@@ -16,7 +16,7 @@ import type {
16
16
  SqlSchemaIR,
17
17
  SqlUniqueIR,
18
18
  } from '@prisma-next/sql-schema-ir/types';
19
- import type { ComponentDatabaseDependency } from '../migrations/types';
19
+ import type { ComponentDatabaseDependency } from '../migrations/types.ts';
20
20
 
21
21
  /**
22
22
  * Compares two arrays of strings for equality (order-sensitive).
@@ -14,9 +14,9 @@ import type {
14
14
  VerifyDatabaseSchemaResult,
15
15
  } from '@prisma-next/core-control-plane/types';
16
16
  import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';
17
- import type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';
17
+ import type { SqlSchemaIR } from '@prisma-next/sql-schema-ir';
18
18
  import { ifDefined } from '@prisma-next/utils/defined';
19
- import type { ComponentDatabaseDependency } from '../migrations/types';
19
+ import type { ComponentDatabaseDependency } from '../migrations/types.ts';
20
20
  import {
21
21
  computeCounts,
22
22
  verifyDatabaseDependencies,
@@ -24,7 +24,7 @@ import {
24
24
  verifyIndexes,
25
25
  verifyPrimaryKey,
26
26
  verifyUniqueConstraints,
27
- } from './verify-helpers';
27
+ } from './verify-helpers.ts';
28
28
 
29
29
  /**
30
30
  * Options for the pure schema verification function.
@@ -1 +1 @@
1
- export type { SqlControlAdapter, SqlControlAdapterDescriptor } from '../core/control-adapter';
1
+ export type { SqlControlAdapter, SqlControlAdapterDescriptor } from '../core/control-adapter.ts';
@@ -1,4 +1,4 @@
1
- import { SqlFamilyDescriptor } from '../core/descriptor';
1
+ import { SqlFamilyDescriptor } from '../core/descriptor.ts';
2
2
 
3
3
  // Re-export core types from canonical source
4
4
  export type {
@@ -11,15 +11,15 @@ export type {
11
11
  MigrationPlanOperation,
12
12
  TargetMigrationsCapability,
13
13
  } from '@prisma-next/core-control-plane/types';
14
- export type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/instance';
14
+ export type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/instance.ts';
15
15
  export {
16
16
  createMigrationPlan,
17
17
  plannerFailure,
18
18
  plannerSuccess,
19
19
  runnerFailure,
20
20
  runnerSuccess,
21
- } from '../core/migrations/plan-helpers';
22
- export { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';
21
+ } from '../core/migrations/plan-helpers.ts';
22
+ export { INIT_ADDITIVE_POLICY } from '../core/migrations/policies.ts';
23
23
  // SQL-specific types
24
24
  export type {
25
25
  ComponentDatabaseDependencies,
@@ -47,7 +47,7 @@ export type {
47
47
  SqlPlannerFailureResult,
48
48
  SqlPlannerResult,
49
49
  SqlPlannerSuccessResult,
50
- } from '../core/migrations/types';
50
+ } from '../core/migrations/types.ts';
51
51
 
52
52
  /**
53
53
  * SQL family descriptor for control plane (CLI/config).
@@ -1,4 +1,4 @@
1
- import { SqlRuntimeFamilyDescriptor } from '../core/runtime-descriptor';
1
+ import { SqlRuntimeFamilyDescriptor } from '../core/runtime-descriptor.ts';
2
2
 
3
3
  /**
4
4
  * SQL runtime family descriptor for execution/runtime plane.
@@ -11,6 +11,6 @@ export {
11
11
  isIndexSatisfied,
12
12
  isUniqueConstraintSatisfied,
13
13
  verifyDatabaseDependencies,
14
- } from '../core/schema-verify/verify-helpers';
15
- export type { VerifySqlSchemaOptions } from '../core/schema-verify/verify-sql-schema';
16
- export { verifySqlSchema } from '../core/schema-verify/verify-sql-schema';
14
+ } from '../core/schema-verify/verify-helpers.ts';
15
+ export type { VerifySqlSchemaOptions } from '../core/schema-verify/verify-sql-schema.ts';
16
+ export { verifySqlSchema } from '../core/schema-verify/verify-sql-schema.ts';
@@ -7,5 +7,5 @@ export {
7
7
  extractCodecTypeImports,
8
8
  extractExtensionIds,
9
9
  extractOperationTypeImports,
10
- } from '../core/assembly';
11
- export { convertOperationManifest } from '../core/instance';
10
+ } from '../core/assembly.ts';
11
+ export { convertOperationManifest } from '../core/instance.ts';
@@ -1 +1 @@
1
- export { parseContractMarkerRow, readMarker, readMarkerSql } from '../core/verify';
1
+ export { parseContractMarkerRow, readMarker, readMarkerSql } from '../core/verify.ts';