@prisma-next/family-sql 0.5.0-dev.2 → 0.5.0-dev.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/control-adapter.d.mts +12 -1
- package/dist/control-adapter.d.mts.map +1 -1
- package/dist/control.d.mts +2 -2
- package/dist/control.mjs +12 -11
- package/dist/control.mjs.map +1 -1
- package/dist/migration.d.mts +1 -1
- package/dist/schema-verify.d.mts +2 -2
- package/dist/{types-C6K4mxDM.d.mts → types-BtFk2T25.d.mts} +9 -3
- package/dist/{types-C6K4mxDM.d.mts.map → types-BtFk2T25.d.mts.map} +1 -1
- package/dist/verify-BdES8wgQ.mjs +82 -0
- package/dist/verify-BdES8wgQ.mjs.map +1 -0
- package/dist/verify-sql-schema-Ovz7RXR5.mjs.map +1 -1
- package/dist/{verify-sql-schema-BBhkqEDo.d.mts → verify-sql-schema-_EoNcGIq.d.mts} +2 -2
- package/dist/{verify-sql-schema-BBhkqEDo.d.mts.map → verify-sql-schema-_EoNcGIq.d.mts.map} +1 -1
- package/dist/verify.d.mts +16 -20
- package/dist/verify.d.mts.map +1 -1
- package/dist/verify.mjs +2 -2
- package/package.json +17 -18
- package/src/core/control-adapter.ts +12 -0
- package/src/core/control-instance.ts +23 -16
- package/src/core/migrations/types.ts +7 -0
- package/src/core/verify.ts +46 -108
- package/src/exports/verify.ts +1 -1
- package/dist/verify-4GshvY4p.mjs +0 -122
- package/dist/verify-4GshvY4p.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -111,7 +111,7 @@ The descriptor is "pure data + factory" - it only provides the hook and factory
|
|
|
111
111
|
- **`src/core/control-descriptor.ts`**: `SqlFamilyDescriptor` class implementing `ControlFamilyDescriptor` interface (pure data + factory)
|
|
112
112
|
- **`src/core/control-instance.ts`**: `createSqlFamilyInstance` function that creates `SqlFamilyInstance` with domain action methods (`validateContract`, `verify`, `schemaVerify`, `introspect`, `toSchemaView`, `emitContract`). Contains `convertOperationManifest` function used internally by instance creation and test utilities in the same package.
|
|
113
113
|
- **`src/core/assembly.ts`**: Assembly helpers for extracting type imports, collecting codec-owned storage type control hooks, and composing mutation-default registries with duplicate detection.
|
|
114
|
-
- **`src/core/verify.ts`**: Verification helpers (`
|
|
114
|
+
- **`src/core/verify.ts`**: Verification helpers (`parseContractMarkerRow`, `collectSupportedCodecTypeIds`)
|
|
115
115
|
- **`src/core/control-adapter.ts`**: SQL control adapter interface (`SqlControlAdapter`) for control-plane operations
|
|
116
116
|
- **`src/core/migrations/`**: Migration IR helpers plus planner and runner SPI types (`MigrationPlanner`, `MigrationRunner`, `SqlControlTargetDescriptor`). Runners return `MigrationRunnerResult` which is a union of success/failure.
|
|
117
117
|
- **`src/core/migrations/contract-to-schema-ir.ts`**: `contractToSchemaIR(contract, { annotationNamespace, ... })` converts a contract to `SqlSchemaIR` for offline migration planning (used by `migration plan` to synthesize the "from" schema without a database connection). Also exports `detectDestructiveChanges(from, to)` which compares two `SqlStorage` values and returns a list of destructive changes (dropped tables, dropped columns) for migration policy enforcement.
|
|
@@ -135,7 +135,7 @@ The runner returns structured errors with the following codes:
|
|
|
135
135
|
- **`./control`**: Control plane entry point for CLI/config usage (exports `SqlFamilyDescriptor`)
|
|
136
136
|
- **`./control-adapter`**: SQL control adapter interface (`SqlControlAdapter`, `SqlControlAdapterDescriptor`) for target-specific adapters
|
|
137
137
|
- **`./runtime`**: Runtime plane identity exports only (family ID, types, descriptor identity). Does **not** export runtime creation helpers—use `instantiateExecutionStack` from `@prisma-next/framework-components/execution` and `createExecutionContext`, `createRuntime`, `createSqlExecutionStack` from `@prisma-next/sql-runtime`. See [ADR 152](../../../docs/architecture%20docs/adrs/ADR%20152%20-%20Execution%20Plane%20Descriptors%20and%20Instances.md).
|
|
138
|
-
- **`./verify`**:
|
|
138
|
+
- **`./verify`**: Marker row parsing helper (`parseContractMarkerRow`). Marker reads are owned by each `SqlControlAdapter` (e.g. `PostgresControlAdapter.readMarker`) so dialect-specific SQL stays target-local.
|
|
139
139
|
|
|
140
140
|
## Dependencies
|
|
141
141
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { n as NativeTypeNormalizer, t as DefaultNormalizer } from "./verify-sql-schema-
|
|
1
|
+
import { n as NativeTypeNormalizer, t as DefaultNormalizer } from "./verify-sql-schema-_EoNcGIq.mjs";
|
|
2
2
|
import { ControlAdapterInstance, ControlDriverInstance, ControlStack } from "@prisma-next/framework-components/control";
|
|
3
|
+
import { ContractMarkerRecord } from "@prisma-next/contract/types";
|
|
3
4
|
import { AnyQueryAst, LoweredStatement, LowererContext } from "@prisma-next/sql-relational-core/ast";
|
|
4
5
|
import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
5
6
|
|
|
@@ -12,6 +13,16 @@ import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
|
12
13
|
* @template TTarget - The target ID (e.g., 'postgres', 'mysql')
|
|
13
14
|
*/
|
|
14
15
|
interface SqlControlAdapter<TTarget extends string = string> extends ControlAdapterInstance<'sql', TTarget> {
|
|
16
|
+
/**
|
|
17
|
+
* Reads the contract marker from the database, returning `null` if the marker
|
|
18
|
+
* table or its row is missing. Implementations are responsible for the
|
|
19
|
+
* dialect-specific existence probe (e.g. Postgres `information_schema.tables`
|
|
20
|
+
* vs SQLite `sqlite_master`) and parameter placeholders.
|
|
21
|
+
*
|
|
22
|
+
* @param driver - ControlDriverInstance for executing queries (target-specific)
|
|
23
|
+
* @returns Resolved marker record, or `null` if not yet stamped.
|
|
24
|
+
*/
|
|
25
|
+
readMarker(driver: ControlDriverInstance<'sql', TTarget>): Promise<ContractMarkerRecord | null>;
|
|
15
26
|
/**
|
|
16
27
|
* Introspects a database schema and returns a raw SqlSchemaIR.
|
|
17
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-adapter.d.mts","names":[],"sources":["../src/core/control-adapter.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"control-adapter.d.mts","names":[],"sources":["../src/core/control-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAoBA;;;;AAWqE,UAXpD,iBAWoD,CAAA,gBAAA,MAAA,GAAA,MAAA,CAAA,SAV3D,sBAU2D,CAAA,KAAA,EAV7B,OAU6B,CAAA,CAAA;EAAR;;;;;;;;;EA2CA,UAAA,CAAA,MAAA,EA3CxC,qBA2CwC,CAAA,KAAA,EA3CX,OA2CW,CAAA,CAAA,EA3CA,OA2CA,CA3CQ,oBA2CR,GAAA,IAAA,CAAA;EArDnD;;AA8DV;;;;;;;;;;qBArCY,6BAA6B,gDAGpC,QAAQ;;;;;;8BAOiB;;;;;;iCAOG;;;;;;;;;;aAWpB,sBAAsB,0BAA0B;;;;;;;;UAS5C;;;;;;;gBAOD,oBAAoB,WAAW,kBAAkB"}
|
package/dist/control.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { A as SqlPlannerFailureResult, C as SqlMigrationRunnerFailure, D as SqlPlannerConflict, E as SqlPlanTargetDetails, F as isDatabaseDependencyProvider, I as SchemaVerifyOptions, L as SqlControlFamilyInstance, M as SqlPlannerSuccessResult, N as StorageTypePlanResult, O as SqlPlannerConflictKind, P as collectInitDependencies, S as SqlMigrationRunnerExecuteOptions, T as SqlMigrationRunnerSuccessValue, _ as SqlMigrationPlanner, a as ComponentDatabaseDependency, b as SqlMigrationRunnerErrorCode, c as ResolveIdentityValueInput, d as SqlControlTargetDescriptor, f as SqlMigrationPlan, g as SqlMigrationPlanOperationTarget, h as SqlMigrationPlanOperationStep, i as ComponentDatabaseDependencies, j as SqlPlannerResult, k as SqlPlannerConflictLocation, l as SqlControlAdapterDescriptor, m as SqlMigrationPlanOperation, n as AnySqlMigrationOperation, o as CreateSqlMigrationPlanOptions, p as SqlMigrationPlanContractInfo, r as CodecControlHooks, s as ExpandNativeTypeInput, t as AnyRecord, u as SqlControlExtensionDescriptor, v as SqlMigrationPlannerPlanOptions, w as SqlMigrationRunnerResult, x as SqlMigrationRunnerExecuteCallbacks, y as SqlMigrationRunner } from "./types-
|
|
1
|
+
import { A as SqlPlannerFailureResult, C as SqlMigrationRunnerFailure, D as SqlPlannerConflict, E as SqlPlanTargetDetails, F as isDatabaseDependencyProvider, I as SchemaVerifyOptions, L as SqlControlFamilyInstance, M as SqlPlannerSuccessResult, N as StorageTypePlanResult, O as SqlPlannerConflictKind, P as collectInitDependencies, S as SqlMigrationRunnerExecuteOptions, T as SqlMigrationRunnerSuccessValue, _ as SqlMigrationPlanner, a as ComponentDatabaseDependency, b as SqlMigrationRunnerErrorCode, c as ResolveIdentityValueInput, d as SqlControlTargetDescriptor, f as SqlMigrationPlan, g as SqlMigrationPlanOperationTarget, h as SqlMigrationPlanOperationStep, i as ComponentDatabaseDependencies, j as SqlPlannerResult, k as SqlPlannerConflictLocation, l as SqlControlAdapterDescriptor, m as SqlMigrationPlanOperation, n as AnySqlMigrationOperation, o as CreateSqlMigrationPlanOptions, p as SqlMigrationPlanContractInfo, r as CodecControlHooks, s as ExpandNativeTypeInput, t as AnyRecord, u as SqlControlExtensionDescriptor, v as SqlMigrationPlannerPlanOptions, w as SqlMigrationRunnerResult, x as SqlMigrationRunnerExecuteCallbacks, y as SqlMigrationRunner } from "./types-BtFk2T25.mjs";
|
|
2
2
|
import { ControlFamilyDescriptor, ControlStack, MigrationOperationClass, MigrationOperationPolicy, MigrationOperationPolicy as MigrationOperationPolicy$1, MigrationPlan, MigrationPlanOperation, MigrationPlanner, MigrationPlannerConflict, MigrationPlannerConflict as MigrationPlannerConflict$1, MigrationPlannerResult, TargetMigrationsCapability, assembleAuthoringContributions } from "@prisma-next/framework-components/control";
|
|
3
3
|
import { NotOk, Ok } from "@prisma-next/utils/result";
|
|
4
|
-
import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
5
4
|
import * as _prisma_next_contract_types0 from "@prisma-next/contract/types";
|
|
6
5
|
import { ColumnDefault, Contract } from "@prisma-next/contract/types";
|
|
6
|
+
import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
7
7
|
import { TargetBoundComponentDescriptor } from "@prisma-next/framework-components/components";
|
|
8
8
|
import { SqlStorage, StorageColumn } from "@prisma-next/sql-contract/types";
|
|
9
9
|
import * as _prisma_next_framework_components_emission0 from "@prisma-next/framework-components/emission";
|
package/dist/control.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as sqlFamilyAuthoringFieldPresets, t as sqlFamilyAuthoringTypes } from "./authoring-type-constructors-BAR65pSK.mjs";
|
|
2
2
|
import { c as extractCodecControlHooks, o as collectInitDependencies, s as isDatabaseDependencyProvider, t as verifySqlSchema } from "./verify-sql-schema-Ovz7RXR5.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { t as collectSupportedCodecTypeIds } from "./verify-BdES8wgQ.mjs";
|
|
4
4
|
import { sqlEmission } from "@prisma-next/sql-contract-emitter";
|
|
5
5
|
import { emptyCodecLookup } from "@prisma-next/framework-components/codec";
|
|
6
6
|
import { SchemaTreeNode, VERIFY_CODE_HASH_MISMATCH, VERIFY_CODE_MARKER_MISSING, VERIFY_CODE_TARGET_MISMATCH, assembleAuthoringContributions } from "@prisma-next/framework-components/control";
|
|
@@ -49,7 +49,7 @@ function createVerifyResult(options) {
|
|
|
49
49
|
return result;
|
|
50
50
|
}
|
|
51
51
|
function isSqlControlAdapter(value) {
|
|
52
|
-
return typeof value === "object" && value !== null && "introspect" in value && typeof value.introspect === "function";
|
|
52
|
+
return typeof value === "object" && value !== null && "introspect" in value && typeof value.introspect === "function" && "readMarker" in value && typeof value.readMarker === "function";
|
|
53
53
|
}
|
|
54
54
|
function buildSqlTypeMetadataRegistry(options) {
|
|
55
55
|
const { target, adapter, extensionPacks: extensions } = options;
|
|
@@ -83,6 +83,11 @@ function createSqlFamilyInstance(stack) {
|
|
|
83
83
|
adapter,
|
|
84
84
|
extensionPacks: extensions
|
|
85
85
|
});
|
|
86
|
+
const getControlAdapter = () => {
|
|
87
|
+
const controlAdapter = adapter.create(stack);
|
|
88
|
+
if (!isSqlControlAdapter(controlAdapter)) throw new Error("Adapter does not implement SqlControlAdapter (missing introspect or readMarker)");
|
|
89
|
+
return controlAdapter;
|
|
90
|
+
};
|
|
86
91
|
return {
|
|
87
92
|
familyId: "sql",
|
|
88
93
|
codecTypeImports,
|
|
@@ -99,7 +104,7 @@ function createSqlFamilyInstance(stack) {
|
|
|
99
104
|
const contractStorageHash = contract.storage.storageHash;
|
|
100
105
|
const contractProfileHash = contract.profileHash;
|
|
101
106
|
const contractTarget = contract.target;
|
|
102
|
-
const marker = await readMarker(driver);
|
|
107
|
+
const marker = await getControlAdapter().readMarker(driver);
|
|
103
108
|
let missingCodecs;
|
|
104
109
|
let codecCoverageSkipped = false;
|
|
105
110
|
const supportedTypeIds = collectSupportedCodecTypeIds([
|
|
@@ -186,8 +191,7 @@ function createSqlFamilyInstance(stack) {
|
|
|
186
191
|
async schemaVerify(options) {
|
|
187
192
|
const { driver, contract: contractInput, strict, context, frameworkComponents } = options;
|
|
188
193
|
const contract = validateContract(contractInput, emptyCodecLookup);
|
|
189
|
-
const controlAdapter =
|
|
190
|
-
if (!isSqlControlAdapter(controlAdapter)) throw new Error("Adapter does not implement SqlControlAdapter.introspect()");
|
|
194
|
+
const controlAdapter = getControlAdapter();
|
|
191
195
|
return verifySqlSchema({
|
|
192
196
|
contract,
|
|
193
197
|
schema: await controlAdapter.introspect(driver, contractInput),
|
|
@@ -208,7 +212,7 @@ function createSqlFamilyInstance(stack) {
|
|
|
208
212
|
const contractTarget = contract.target;
|
|
209
213
|
await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);
|
|
210
214
|
await driver.query(ensureTableStatement.sql, ensureTableStatement.params);
|
|
211
|
-
const existingMarker = await readMarker(driver);
|
|
215
|
+
const existingMarker = await getControlAdapter().readMarker(driver);
|
|
212
216
|
let markerCreated = false;
|
|
213
217
|
let markerUpdated = false;
|
|
214
218
|
let previousHashes;
|
|
@@ -268,13 +272,10 @@ function createSqlFamilyInstance(stack) {
|
|
|
268
272
|
};
|
|
269
273
|
},
|
|
270
274
|
async readMarker(options) {
|
|
271
|
-
return readMarker(options.driver);
|
|
275
|
+
return getControlAdapter().readMarker(options.driver);
|
|
272
276
|
},
|
|
273
277
|
async introspect(options) {
|
|
274
|
-
|
|
275
|
-
const controlAdapter = adapter.create(stack);
|
|
276
|
-
if (!isSqlControlAdapter(controlAdapter)) throw new Error("Adapter does not implement SqlControlAdapter.introspect()");
|
|
277
|
-
return controlAdapter.introspect(driver, contract);
|
|
278
|
+
return getControlAdapter().introspect(options.driver, options.contract);
|
|
278
279
|
},
|
|
279
280
|
toSchemaView(schema) {
|
|
280
281
|
const tableNodes = Object.entries(schema.tables).map(([tableName, table]) => {
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n OperationContext,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds, readMarker } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n}\n\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\nfunction isSqlControlAdapter<TTargetId extends string>(\n value: unknown,\n): value is SqlControlAdapter<TTargetId> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'introspect' in value &&\n typeof (value as { introspect: unknown }).introspect === 'function'\n );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n const { driver, contract } = options;\n\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error('Adapter does not implement SqlControlAdapter.introspect()');\n }\n return controlAdapter.introspect(driver, contract);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":["contract: { storageHash: string; profileHash?: string }","target: { expected: string; actual?: string }","meta: { contractPath: string; configPath?: string }","result: VerifyDatabaseResult","sqlValidateContract","missingCodecs: readonly string[] | undefined","previousHashes: { storageHash?: string; profileHash?: string } | undefined","summary: string","tableNodes: readonly SchemaTreeNode[]","children: SchemaTreeNode[]","columnNodes: SchemaTreeNode[]","tableMeta: Record<string, unknown>","dependencyNodes: readonly SchemaTreeNode[]","columns: Record<string, SqlColumnIR>","fkBackingIndexes: SqlIndexIR[]","conflicts: MigrationPlannerConflict[]","tables: Record<string, SqlTableIR>","result: DependencyIR[]","byNativeType: Record<string, (typeof storage.types)[string]>","readOnlyEmptyObject: Record<string, never>","INIT_ADDITIVE_POLICY: MigrationOperationPolicy"],"sources":["../src/core/control-instance.ts","../src/core/control-descriptor.ts","../src/core/migrations/contract-to-schema-ir.ts","../src/core/migrations/plan-helpers.ts","../src/core/migrations/policies.ts","../src/exports/control.ts"],"sourcesContent":["import type { Contract, ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { emptyCodecLookup } from '@prisma-next/framework-components/codec';\nimport type {\n TargetBoundComponentDescriptor,\n TargetDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n ControlStack,\n CoreSchemaView,\n OperationContext,\n SchemaViewCapable,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport {\n SchemaTreeNode,\n VERIFY_CODE_HASH_MISMATCH,\n VERIFY_CODE_MARKER_MISSING,\n VERIFY_CODE_TARGET_MISMATCH,\n} from '@prisma-next/framework-components/control';\nimport type { TypesImportSpec } from '@prisma-next/framework-components/emission';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport { validateContract as sqlValidateContract } from '@prisma-next/sql-contract/validate';\nimport {\n ensureSchemaStatement,\n ensureTableStatement,\n writeContractMarker,\n} from '@prisma-next/sql-runtime';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type { SqlSchemaIR, SqlTableIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { SqlControlAdapter } from './control-adapter';\nimport type {\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n} from './migrations/types';\nimport { verifySqlSchema } from './schema-verify/verify-sql-schema';\nimport { collectSupportedCodecTypeIds } from './verify';\n\nfunction extractCodecTypeIdsFromContract(contract: unknown): readonly string[] {\n const typeIds = new Set<string>();\n\n // Type guard for SQL contract structure\n if (\n typeof contract === 'object' &&\n contract !== null &&\n 'storage' in contract &&\n typeof contract.storage === 'object' &&\n contract.storage !== null &&\n 'tables' in contract.storage\n ) {\n const storage = contract.storage as { tables?: Record<string, unknown> };\n if (storage.tables && typeof storage.tables === 'object') {\n for (const table of Object.values(storage.tables)) {\n if (\n typeof table === 'object' &&\n table !== null &&\n 'columns' in table &&\n typeof table.columns === 'object' &&\n table.columns !== null\n ) {\n const columns = table.columns as Record<string, { codecId: string } | undefined>;\n for (const column of Object.values(columns)) {\n if (\n column &&\n typeof column === 'object' &&\n 'codecId' in column &&\n typeof column.codecId === 'string'\n ) {\n typeIds.add(column.codecId);\n }\n }\n }\n }\n }\n }\n\n return Array.from(typeIds).sort();\n}\n\nfunction createVerifyResult(options: {\n ok: boolean;\n code?: string;\n summary: string;\n contractStorageHash: string;\n contractProfileHash?: string;\n marker?: ContractMarkerRecord;\n expectedTargetId: string;\n actualTargetId?: string;\n missingCodecs?: readonly string[];\n codecCoverageSkipped?: boolean;\n configPath?: string;\n contractPath: string;\n totalTime: number;\n}): VerifyDatabaseResult {\n const contract: { storageHash: string; profileHash?: string } = {\n storageHash: options.contractStorageHash,\n };\n if (options.contractProfileHash) {\n contract.profileHash = options.contractProfileHash;\n }\n\n const target: { expected: string; actual?: string } = {\n expected: options.expectedTargetId,\n };\n if (options.actualTargetId) {\n target.actual = options.actualTargetId;\n }\n\n const meta: { contractPath: string; configPath?: string } = {\n contractPath: options.contractPath,\n };\n if (options.configPath) {\n meta.configPath = options.configPath;\n }\n\n const result: VerifyDatabaseResult = {\n ok: options.ok,\n summary: options.summary,\n contract,\n target,\n meta,\n timings: {\n total: options.totalTime,\n },\n };\n\n if (options.code) {\n (result as { code?: string }).code = options.code;\n }\n\n if (options.marker) {\n (result as { marker?: { storageHash: string; profileHash: string } }).marker = {\n storageHash: options.marker.storageHash,\n profileHash: options.marker.profileHash,\n };\n }\n\n if (options.missingCodecs) {\n (result as { missingCodecs?: readonly string[] }).missingCodecs = options.missingCodecs;\n }\n\n if (options.codecCoverageSkipped) {\n (result as { codecCoverageSkipped?: boolean }).codecCoverageSkipped =\n options.codecCoverageSkipped;\n }\n\n return result;\n}\n\ninterface SqlTypeMetadata {\n readonly typeId: string;\n readonly familyId: 'sql';\n readonly targetId: string;\n readonly nativeType?: string;\n}\n\ntype SqlTypeMetadataRegistry = Map<string, SqlTypeMetadata>;\n\ninterface SqlFamilyInstanceState {\n readonly codecTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly operationTypeImports: ReadonlyArray<TypesImportSpec>;\n readonly extensionIds: ReadonlyArray<string>;\n readonly typeMetadataRegistry: SqlTypeMetadataRegistry;\n}\n\nexport interface SchemaVerifyOptions {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition.\n * All components must have matching familyId ('sql') and targetId.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\nexport interface SqlControlFamilyInstance\n extends ControlFamilyInstance<'sql', SqlSchemaIR>,\n SchemaViewCapable<SqlSchemaIR>,\n SqlFamilyInstanceState {\n validateContract(contractJson: unknown): Contract;\n\n verify(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult>;\n\n schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult>;\n\n sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult>;\n\n introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR>;\n}\n\nexport type SqlFamilyInstance = SqlControlFamilyInstance;\n\nfunction isSqlControlAdapter<TTargetId extends string>(\n value: unknown,\n): value is SqlControlAdapter<TTargetId> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'introspect' in value &&\n typeof (value as { introspect: unknown }).introspect === 'function' &&\n 'readMarker' in value &&\n typeof (value as { readMarker: unknown }).readMarker === 'function'\n );\n}\n\ninterface DescriptorWithStorageTypes {\n readonly targetId?: string | undefined;\n readonly types?:\n | {\n readonly storage?:\n | ReadonlyArray<{\n readonly typeId: string;\n readonly familyId: string;\n readonly targetId: string;\n readonly nativeType?: string | undefined;\n }>\n | undefined;\n }\n | undefined;\n}\n\nfunction buildSqlTypeMetadataRegistry(options: {\n readonly target: DescriptorWithStorageTypes;\n readonly adapter: DescriptorWithStorageTypes & { readonly targetId: string };\n readonly extensionPacks: readonly DescriptorWithStorageTypes[];\n}): SqlTypeMetadataRegistry {\n const { target, adapter, extensionPacks: extensions } = options;\n const registry = new Map<string, SqlTypeMetadata>();\n const targetId = adapter.targetId;\n const descriptors = [target, adapter, ...extensions];\n\n for (const descriptor of descriptors) {\n const types = descriptor.types;\n const storageTypes = types?.storage;\n\n if (!storageTypes) {\n continue;\n }\n\n for (const storageType of storageTypes) {\n if (storageType.familyId === 'sql' && storageType.targetId === targetId) {\n registry.set(storageType.typeId, {\n typeId: storageType.typeId,\n familyId: 'sql',\n targetId: storageType.targetId,\n ...(storageType.nativeType !== undefined ? { nativeType: storageType.nativeType } : {}),\n });\n }\n }\n }\n\n return registry;\n}\n\nexport function createSqlFamilyInstance<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n): SqlFamilyInstance {\n if (!stack.adapter) {\n throw new Error('SQL family requires an adapter descriptor in ControlStack');\n }\n\n const target = stack.target as unknown as TargetDescriptor<'sql', TTargetId> &\n DescriptorWithStorageTypes;\n const adapter = stack.adapter as unknown as SqlControlAdapterDescriptor<TTargetId> &\n DescriptorWithStorageTypes;\n const extensions =\n stack.extensionPacks as unknown as readonly (SqlControlExtensionDescriptor<TTargetId> &\n DescriptorWithStorageTypes)[];\n\n const { codecTypeImports, operationTypeImports, extensionIds } = stack;\n\n const typeMetadataRegistry = buildSqlTypeMetadataRegistry({\n target,\n adapter,\n extensionPacks: extensions,\n });\n\n // Family-instance methods accept `ControlDriverInstance<'sql', string>` —\n // the family API isn't generic on the target id. Letting `isSqlControlAdapter`\n // default its type parameter narrows the adapter to `SqlControlAdapter<string>`,\n // which matches the family-level driver type without any cast at call sites.\n const getControlAdapter = () => {\n const controlAdapter = adapter.create(stack);\n if (!isSqlControlAdapter(controlAdapter)) {\n throw new Error(\n 'Adapter does not implement SqlControlAdapter (missing introspect or readMarker)',\n );\n }\n return controlAdapter;\n };\n\n return {\n familyId: 'sql',\n codecTypeImports,\n operationTypeImports,\n extensionIds,\n typeMetadataRegistry,\n\n validateContract(contractJson: unknown): Contract {\n return sqlValidateContract<Contract<SqlStorage>>(contractJson, emptyCodecLookup);\n },\n\n async verify(verifyOptions: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly expectedTargetId: string;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<VerifyDatabaseResult> {\n const {\n driver,\n contract: rawContract,\n expectedTargetId,\n contractPath,\n configPath,\n } = verifyOptions;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(rawContract, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash = contract.profileHash;\n const contractTarget = contract.target;\n\n const marker = await getControlAdapter().readMarker(driver);\n\n let missingCodecs: readonly string[] | undefined;\n let codecCoverageSkipped = false;\n const supportedTypeIds = collectSupportedCodecTypeIds([adapter, target, ...extensions]);\n if (supportedTypeIds.length === 0) {\n codecCoverageSkipped = true;\n } else {\n const supportedSet = new Set(supportedTypeIds);\n const usedTypeIds = extractCodecTypeIdsFromContract(contract);\n const missing = usedTypeIds.filter((id) => !supportedSet.has(id));\n if (missing.length > 0) {\n missingCodecs = missing;\n }\n }\n\n if (!marker) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_MARKER_MISSING,\n summary: 'Marker missing',\n contractStorageHash,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractTarget !== expectedTargetId) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_TARGET_MISMATCH,\n summary: 'Target mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n actualTargetId: contractTarget,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (marker.storageHash !== contractStorageHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n if (contractProfileHash && marker.profileHash !== contractProfileHash) {\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: false,\n code: VERIFY_CODE_HASH_MISMATCH,\n summary: 'Hash mismatch',\n contractStorageHash,\n contractProfileHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n }\n\n const totalTime = Date.now() - startTime;\n return createVerifyResult({\n ok: true,\n summary: 'Database matches contract',\n contractStorageHash,\n marker,\n expectedTargetId,\n contractPath,\n totalTime,\n ...(contractProfileHash ? { contractProfileHash } : {}),\n ...(missingCodecs ? { missingCodecs } : {}),\n ...(codecCoverageSkipped ? { codecCoverageSkipped } : {}),\n ...(configPath ? { configPath } : {}),\n });\n },\n\n async schemaVerify(options: SchemaVerifyOptions): Promise<VerifyDatabaseSchemaResult> {\n const { driver, contract: contractInput, strict, context, frameworkComponents } = options;\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const controlAdapter = getControlAdapter();\n const schemaIR = await controlAdapter.introspect(driver, contractInput);\n\n return verifySqlSchema({\n contract,\n schema: schemaIR,\n strict,\n ...ifDefined('context', context),\n typeMetadataRegistry,\n frameworkComponents,\n // Wire up target-specific normalizers if available\n ...ifDefined('normalizeDefault', controlAdapter.normalizeDefault),\n ...ifDefined('normalizeNativeType', controlAdapter.normalizeNativeType),\n });\n },\n async sign(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract: unknown;\n readonly contractPath: string;\n readonly configPath?: string;\n }): Promise<SignDatabaseResult> {\n const { driver, contract: contractInput, contractPath, configPath } = options;\n const startTime = Date.now();\n\n const contract = sqlValidateContract<Contract<SqlStorage>>(contractInput, emptyCodecLookup);\n\n const contractStorageHash = contract.storage.storageHash;\n const contractProfileHash =\n 'profileHash' in contract && typeof contract.profileHash === 'string'\n ? contract.profileHash\n : contractStorageHash;\n const contractTarget = contract.target;\n\n await driver.query(ensureSchemaStatement.sql, ensureSchemaStatement.params);\n await driver.query(ensureTableStatement.sql, ensureTableStatement.params);\n\n const existingMarker = await getControlAdapter().readMarker(driver);\n\n let markerCreated = false;\n let markerUpdated = false;\n let previousHashes: { storageHash?: string; profileHash?: string } | undefined;\n\n if (!existingMarker) {\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: 1,\n });\n await driver.query(write.insert.sql, write.insert.params);\n markerCreated = true;\n } else {\n const existingStorageHash = existingMarker.storageHash;\n const existingProfileHash = existingMarker.profileHash;\n\n const storageHashMatches = existingStorageHash === contractStorageHash;\n const profileHashMatches = existingProfileHash === contractProfileHash;\n\n if (!storageHashMatches || !profileHashMatches) {\n previousHashes = {\n storageHash: existingStorageHash,\n profileHash: existingProfileHash,\n };\n const write = writeContractMarker({\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n contractJson: contractInput,\n canonicalVersion: existingMarker.canonicalVersion ?? 1,\n });\n await driver.query(write.update.sql, write.update.params);\n markerUpdated = true;\n }\n }\n\n let summary: string;\n if (markerCreated) {\n summary = 'Database signed (marker created)';\n } else if (markerUpdated) {\n summary = `Database signed (marker updated from ${previousHashes?.storageHash ?? 'unknown'})`;\n } else {\n summary = 'Database already signed with this contract';\n }\n\n const totalTime = Date.now() - startTime;\n\n return {\n ok: true,\n summary,\n contract: {\n storageHash: contractStorageHash,\n profileHash: contractProfileHash,\n },\n target: {\n expected: contractTarget,\n actual: contractTarget,\n },\n marker: {\n created: markerCreated,\n updated: markerUpdated,\n ...(previousHashes ? { previous: previousHashes } : {}),\n },\n meta: {\n contractPath,\n ...(configPath ? { configPath } : {}),\n },\n timings: {\n total: totalTime,\n },\n };\n },\n async readMarker(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n }): Promise<ContractMarkerRecord | null> {\n return getControlAdapter().readMarker(options.driver);\n },\n async introspect(options: {\n readonly driver: ControlDriverInstance<'sql', string>;\n readonly contract?: unknown;\n }): Promise<SqlSchemaIR> {\n return getControlAdapter().introspect(options.driver, options.contract);\n },\n\n toSchemaView(schema: SqlSchemaIR): CoreSchemaView {\n const tableNodes: readonly SchemaTreeNode[] = Object.entries(schema.tables).map(\n ([tableName, table]: [string, SqlTableIR]) => {\n const children: SchemaTreeNode[] = [];\n\n const columnNodes: SchemaTreeNode[] = [];\n for (const [columnName, column] of Object.entries(table.columns)) {\n const typeDisplay = column.nativeType;\n const nullability = column.nullable ? 'nullable' : 'not nullable';\n const label = `${columnName}: ${typeDisplay} (${nullability})`;\n columnNodes.push(\n new SchemaTreeNode({\n kind: 'field',\n id: `column-${tableName}-${columnName}`,\n label,\n meta: {\n nativeType: column.nativeType,\n nullable: column.nullable,\n ...ifDefined('default', column.default),\n },\n }),\n );\n }\n\n if (columnNodes.length > 0) {\n children.push(\n new SchemaTreeNode({\n kind: 'collection',\n id: `columns-${tableName}`,\n label: 'columns',\n children: columnNodes,\n }),\n );\n }\n\n if (table.primaryKey) {\n const pkColumns = table.primaryKey.columns.join(', ');\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `primary-key-${tableName}`,\n label: `primary key: ${pkColumns}`,\n meta: {\n columns: table.primaryKey.columns,\n ...(table.primaryKey.name ? { name: table.primaryKey.name } : {}),\n },\n }),\n );\n }\n\n for (const unique of table.uniques) {\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_unique`;\n const label = `unique ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `unique-${tableName}-${name}`,\n label,\n meta: {\n columns: unique.columns,\n unique: true,\n },\n }),\n );\n }\n\n for (const index of table.indexes) {\n const name = index.name ?? defaultIndexName(tableName, index.columns);\n const label = index.unique ? `unique index ${name}` : `index ${name}`;\n children.push(\n new SchemaTreeNode({\n kind: 'index',\n id: `index-${tableName}-${name}`,\n label,\n meta: {\n columns: index.columns,\n unique: index.unique,\n },\n }),\n );\n }\n\n const tableMeta: Record<string, unknown> = {};\n if (table.primaryKey) {\n tableMeta['primaryKey'] = table.primaryKey.columns;\n if (table.primaryKey.name) {\n tableMeta['primaryKeyName'] = table.primaryKey.name;\n }\n }\n if (table.foreignKeys.length > 0) {\n tableMeta['foreignKeys'] = table.foreignKeys.map((fk) => ({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n }\n\n return new SchemaTreeNode({\n kind: 'entity',\n id: `table-${tableName}`,\n label: `table ${tableName}`,\n ...(Object.keys(tableMeta).length > 0 ? { meta: tableMeta } : {}),\n ...(children.length > 0 ? { children } : {}),\n });\n },\n );\n\n const dependencyNodes: readonly SchemaTreeNode[] = schema.dependencies.map((dep) => {\n const shortName = dep.id.split('.').pop() ?? dep.id;\n return new SchemaTreeNode({\n kind: 'dependency',\n id: `dependency-${dep.id}`,\n label: `${shortName} dependency is installed`,\n });\n });\n\n const rootChildren = [...tableNodes, ...dependencyNodes];\n\n return {\n root: new SchemaTreeNode({\n kind: 'root',\n id: 'sql-schema',\n label: 'database',\n ...(rootChildren.length > 0 ? { children: rootChildren } : {}),\n }),\n };\n },\n };\n}\n","import type {\n ControlFamilyDescriptor,\n ControlStack,\n} from '@prisma-next/framework-components/control';\nimport { sqlEmission } from '@prisma-next/sql-contract-emitter';\nimport { sqlFamilyAuthoringFieldPresets } from './authoring-field-presets';\nimport { sqlFamilyAuthoringTypes } from './authoring-type-constructors';\nimport { createSqlFamilyInstance, type SqlControlFamilyInstance } from './control-instance';\n\nexport class SqlFamilyDescriptor\n implements ControlFamilyDescriptor<'sql', SqlControlFamilyInstance>\n{\n readonly kind = 'family' as const;\n readonly id = 'sql';\n readonly familyId = 'sql' as const;\n readonly version = '0.0.1';\n readonly emission = sqlEmission;\n readonly authoring = {\n field: sqlFamilyAuthoringFieldPresets,\n type: sqlFamilyAuthoringTypes,\n } as const;\n\n create<TTargetId extends string>(\n stack: ControlStack<'sql', TTargetId>,\n ): SqlControlFamilyInstance {\n return createSqlFamilyInstance(stack);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { MigrationPlannerConflict } from '@prisma-next/framework-components/control';\nimport type {\n ForeignKey,\n Index,\n SqlStorage,\n StorageColumn,\n StorageTable,\n StorageTypeInstance,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport type {\n DependencyIR,\n SqlAnnotations,\n SqlColumnIR,\n SqlForeignKeyIR,\n SqlIndexIR,\n SqlSchemaIR,\n SqlTableIR,\n SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { collectInitDependencies } from './types';\n\n/**\n * Target-specific callback that expands a column's base `nativeType` and optional\n * `typeParams` into the fully-qualified type string used by the database\n * (e.g. `character` + `{ length: 36 }` → `character(36)`).\n *\n * This lives in the family layer as a callback rather than importing a concrete\n * implementation because each target (Postgres, MySQL, SQLite, …) has its own\n * parameterization syntax. The target wires its expander when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type NativeTypeExpander = (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n}) => string;\n\n/**\n * Target-specific callback that renders a `ColumnDefault` into the raw SQL literal\n * string stored in `SqlColumnIR.default`.\n *\n * Default value serialization is target-specific (quoting, casting, type syntax vary\n * between Postgres, MySQL, SQLite, …). This callback follows the same IoC pattern as\n * `NativeTypeExpander`: the target provides its renderer when calling\n * `contractToSchemaIR`, keeping the family layer target-agnostic.\n */\nexport type DefaultRenderer = (def: ColumnDefault, column: StorageColumn) => string;\n\nfunction convertColumn(\n name: string,\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlColumnIR {\n // Resolve `typeRef` so columns that delegate their `nativeType`/`codecId`/\n // `typeParams` to a named `storage.types` entry expand the same way as\n // columns that inline those fields. Without this resolution, a\n // `typeRef`-based column like `post.embedding → Embedding1536` would\n // render as the bare `\"vector\"` (dropping the `length` parameter), while\n // `verify-sql-schema.ts`'s `renderExpectedNativeType` resolves the\n // typeRef and produces `\"vector(1536)\"` — making diffs on the same\n // contract falsely report a `type_mismatch`.\n const resolved = resolveColumnTypeMetadata(column, storageTypes);\n const nativeType = expandNativeType\n ? expandNativeType({\n nativeType: resolved.nativeType,\n codecId: resolved.codecId,\n ...ifDefined('typeParams', resolved.typeParams),\n })\n : resolved.nativeType;\n return {\n name,\n nativeType,\n nullable: column.nullable,\n ...ifDefined(\n 'default',\n column.default != null && renderDefault ? renderDefault(column.default, column) : undefined,\n ),\n };\n}\n\nfunction resolveColumnTypeMetadata(\n column: StorageColumn,\n storageTypes: Record<string, StorageTypeInstance>,\n): Pick<StorageColumn, 'codecId' | 'nativeType' | 'typeParams'> {\n if (!column.typeRef) {\n return column;\n }\n const referenced = storageTypes[column.typeRef];\n if (!referenced) {\n throw new Error(\n `Column references storage type \"${column.typeRef}\" but it is not defined in storage.types.`,\n );\n }\n return {\n codecId: referenced.codecId,\n nativeType: referenced.nativeType,\n typeParams: referenced.typeParams,\n };\n}\n\nfunction convertUnique(unique: UniqueConstraint): SqlUniqueIR {\n return {\n columns: unique.columns,\n ...ifDefined('name', unique.name),\n };\n}\n\nfunction convertIndex(index: Index): SqlIndexIR {\n return {\n columns: index.columns,\n unique: false,\n ...ifDefined('name', index.name),\n };\n}\n\nfunction convertForeignKey(fk: ForeignKey): SqlForeignKeyIR {\n return {\n columns: fk.columns,\n referencedTable: fk.references.table,\n referencedColumns: fk.references.columns,\n ...ifDefined('name', fk.name),\n };\n}\n\nfunction convertTable(\n name: string,\n table: StorageTable,\n storageTypes: Record<string, StorageTypeInstance>,\n expandNativeType: NativeTypeExpander | undefined,\n renderDefault: DefaultRenderer | undefined,\n): SqlTableIR {\n const columns: Record<string, SqlColumnIR> = {};\n for (const [colName, colDef] of Object.entries(table.columns)) {\n columns[colName] = convertColumn(\n colName,\n colDef,\n storageTypes,\n expandNativeType,\n renderDefault,\n );\n }\n\n const satisfiedIndexColumns = new Set([\n ...table.indexes.map((idx) => idx.columns.join(',')),\n ...table.uniques.map((unique) => unique.columns.join(',')),\n ...(table.primaryKey ? [table.primaryKey.columns.join(',')] : []),\n ]);\n const fkBackingIndexes: SqlIndexIR[] = [];\n for (const fk of table.foreignKeys) {\n if (fk.index === false) continue;\n const key = fk.columns.join(',');\n if (satisfiedIndexColumns.has(key)) continue;\n fkBackingIndexes.push({\n columns: fk.columns,\n unique: false,\n name: defaultIndexName(name, fk.columns),\n });\n satisfiedIndexColumns.add(key);\n }\n\n return {\n name,\n columns,\n ...ifDefined('primaryKey', table.primaryKey),\n foreignKeys: table.foreignKeys.map(convertForeignKey),\n uniques: table.uniques.map(convertUnique),\n indexes: [...table.indexes.map(convertIndex), ...fkBackingIndexes],\n };\n}\n\n/**\n * Detects destructive changes between two contract storages.\n *\n * The additive-only planner silently ignores removals (tables, columns).\n * This function detects those removals so callers can report them as conflicts\n * rather than silently producing an empty plan.\n *\n * Returns an empty array if no destructive changes are found.\n */\nexport function detectDestructiveChanges(\n from: SqlStorage | null,\n to: SqlStorage,\n): readonly MigrationPlannerConflict[] {\n if (!from) return [];\n\n const hasOwn = (value: object, key: string): boolean => Object.hasOwn(value, key);\n\n const conflicts: MigrationPlannerConflict[] = [];\n\n for (const tableName of Object.keys(from.tables)) {\n if (!hasOwn(to.tables, tableName)) {\n conflicts.push({\n kind: 'tableRemoved',\n summary: `Table \"${tableName}\" was removed`,\n });\n continue;\n }\n\n const toTable = to.tables[tableName] as StorageTable;\n const fromTable = from.tables[tableName];\n if (!fromTable) continue;\n\n for (const columnName of Object.keys(fromTable.columns)) {\n if (!hasOwn(toTable.columns, columnName)) {\n conflicts.push({\n kind: 'columnRemoved',\n summary: `Column \"${tableName}\".\"${columnName}\" was removed`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nexport interface ContractToSchemaIROptions {\n readonly annotationNamespace: string;\n readonly expandNativeType?: NativeTypeExpander;\n readonly renderDefault?: DefaultRenderer;\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n/**\n * Converts a `Contract` to `SqlSchemaIR`.\n *\n * Reads `contract.storage` for tables, `contract.storage.types` for type\n * annotations, and derives database dependencies from `frameworkComponents`\n * (each component's `databaseDependencies.init[].id`).\n * Storage-type annotations are written under `options.annotationNamespace`.\n *\n * Drops codec metadata (`codecId`, `typeRef`) since the schema IR only represents\n * structural information. When `expandNativeType` is provided, parameterized types\n * are expanded (e.g. `character` + `{ length: 36 }` → `character(36)`) so the\n * resulting IR compares correctly against the \"to\" contract during planning.\n *\n * Returns an empty schema IR when `contract` is `null` (new project).\n */\nexport function contractToSchemaIR(\n contract: Contract<SqlStorage> | null,\n options: ContractToSchemaIROptions,\n): SqlSchemaIR {\n if (options.annotationNamespace.length === 0) {\n throw new Error('annotationNamespace must be a non-empty string');\n }\n\n if (!contract) {\n return { tables: {}, dependencies: [] };\n }\n\n const storage = contract.storage;\n const storageTypes = storage.types ?? {};\n const tables: Record<string, SqlTableIR> = {};\n for (const [tableName, tableDef] of Object.entries(storage.tables)) {\n tables[tableName] = convertTable(\n tableName,\n tableDef,\n storageTypes,\n options.expandNativeType,\n options.renderDefault,\n );\n }\n\n const dependencies = deduplicateDependencyIRs(\n collectInitDependencies(options.frameworkComponents ?? []),\n );\n const annotations = deriveAnnotations(storage, options.annotationNamespace);\n\n return {\n tables,\n dependencies,\n ...ifDefined('annotations', annotations),\n };\n}\n\nfunction deduplicateDependencyIRs(\n deps: readonly { readonly id: string }[],\n): readonly DependencyIR[] {\n const seen = new Set<string>();\n const result: DependencyIR[] = [];\n for (const dep of deps) {\n if (dep.id.trim().length === 0) {\n throw new Error('Dependency id must be a non-empty string');\n }\n if (seen.has(dep.id)) continue;\n seen.add(dep.id);\n result.push({ id: dep.id });\n }\n return result;\n}\n\nfunction deriveAnnotations(\n storage: SqlStorage,\n annotationNamespace: string,\n): SqlAnnotations | undefined {\n if (!storage.types || Object.keys(storage.types).length === 0) return undefined;\n // Re-key by nativeType to match the structure produced by introspection\n const byNativeType: Record<string, (typeof storage.types)[string]> = {};\n for (const typeInstance of Object.values(storage.types)) {\n byNativeType[typeInstance.nativeType] = typeInstance;\n }\n return { [annotationNamespace]: { storageTypes: byNativeType } };\n}\n","import type { NotOk, Ok } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type {\n AnyRecord,\n CreateSqlMigrationPlanOptions,\n SqlMigrationPlan,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerFailureResult,\n SqlPlannerSuccessResult,\n} from './types';\n\nconst readOnlyEmptyObject: Record<string, never> = Object.freeze({});\n\nfunction cloneRecord<T extends AnyRecord>(value: T): T {\n if (value === readOnlyEmptyObject) {\n return value;\n }\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeSteps(\n steps: readonly SqlMigrationPlanOperationStep[],\n): readonly SqlMigrationPlanOperationStep[] {\n if (steps.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(\n steps.map((step) =>\n Object.freeze({\n description: step.description,\n sql: step.sql,\n ...(step.meta ? { meta: cloneRecord(step.meta) } : {}),\n }),\n ),\n );\n}\n\nfunction freezeDetailsValue<T>(value: T): T {\n // Primitives and null/undefined are already immutable, return as-is\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value !== 'object') {\n return value;\n }\n // Arrays: shallow clone and freeze\n if (Array.isArray(value)) {\n return Object.freeze([...value]) as T;\n }\n // Objects: shallow clone and freeze (matching cloneRecord pattern)\n return Object.freeze({ ...value }) as T;\n}\n\nfunction freezeTargetDetails<TTargetDetails>(\n target: SqlMigrationPlanOperationTarget<TTargetDetails>,\n): SqlMigrationPlanOperationTarget<TTargetDetails> {\n return Object.freeze({\n id: target.id,\n ...(target.details !== undefined ? { details: freezeDetailsValue(target.details) } : {}),\n });\n}\n\nfunction freezeOperation<TTargetDetails>(\n operation: SqlMigrationPlanOperation<TTargetDetails>,\n): SqlMigrationPlanOperation<TTargetDetails> {\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...(operation.summary ? { summary: operation.summary } : {}),\n operationClass: operation.operationClass,\n target: freezeTargetDetails(operation.target),\n precheck: freezeSteps(operation.precheck),\n execute: freezeSteps(operation.execute),\n postcheck: freezeSteps(operation.postcheck),\n ...(operation.meta ? { meta: cloneRecord(operation.meta) } : {}),\n });\n}\n\nfunction freezeOperations<TTargetDetails>(\n operations: readonly SqlMigrationPlanOperation<TTargetDetails>[],\n): readonly SqlMigrationPlanOperation<TTargetDetails>[] {\n if (operations.length === 0) {\n return Object.freeze([]);\n }\n return Object.freeze(operations.map((operation) => freezeOperation(operation)));\n}\n\nexport function createMigrationPlan<TTargetDetails>(\n options: CreateSqlMigrationPlanOptions<TTargetDetails>,\n): SqlMigrationPlan<TTargetDetails> {\n return Object.freeze({\n targetId: options.targetId,\n ...(options.origin !== undefined\n ? { origin: options.origin ? Object.freeze({ ...options.origin }) : null }\n : {}),\n destination: Object.freeze({ ...options.destination }),\n operations: freezeOperations(options.operations),\n ...(options.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n}\n\nexport function plannerSuccess<TTargetDetails>(\n plan: SqlMigrationPlan<TTargetDetails>,\n): SqlPlannerSuccessResult<TTargetDetails> {\n return Object.freeze({\n kind: 'success',\n plan,\n });\n}\n\nexport function plannerFailure(conflicts: readonly SqlPlannerConflict[]): SqlPlannerFailureResult {\n return Object.freeze({\n kind: 'failure' as const,\n conflicts: Object.freeze(\n conflicts.map((conflict) =>\n Object.freeze({\n kind: conflict.kind,\n summary: conflict.summary,\n ...(conflict.why ? { why: conflict.why } : {}),\n ...(conflict.location ? { location: Object.freeze({ ...conflict.location }) } : {}),\n ...(conflict.meta ? { meta: cloneRecord(conflict.meta) } : {}),\n }),\n ),\n ),\n });\n}\n\n/**\n * Creates a successful migration runner result.\n */\nexport function runnerSuccess(value: {\n operationsPlanned: number;\n operationsExecuted: number;\n}): Ok<SqlMigrationRunnerSuccessValue> {\n return ok(\n Object.freeze({\n operationsPlanned: value.operationsPlanned,\n operationsExecuted: value.operationsExecuted,\n }),\n );\n}\n\n/**\n * Creates a failed migration runner result.\n */\nexport function runnerFailure(\n code: SqlMigrationRunnerErrorCode,\n summary: string,\n options?: { why?: string; meta?: AnyRecord },\n): NotOk<SqlMigrationRunnerFailure> {\n const failure: SqlMigrationRunnerFailure = Object.freeze({\n code,\n summary,\n ...(options?.why ? { why: options.why } : {}),\n ...(options?.meta ? { meta: cloneRecord(options.meta) } : {}),\n });\n return notOk(failure);\n}\n","import type { MigrationOperationPolicy } from '@prisma-next/framework-components/control';\n\n/**\n * Policy used by `db init`: additive-only operations, no widening/destructive steps.\n */\nexport const INIT_ADDITIVE_POLICY: MigrationOperationPolicy = Object.freeze({\n allowedOperationClasses: Object.freeze(['additive'] as const),\n});\n","import { SqlFamilyDescriptor } from '../core/control-descriptor';\n\n// Re-export core types from canonical source\nexport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanOperation,\n TargetMigrationsCapability,\n} from '@prisma-next/framework-components/control';\nexport { assembleAuthoringContributions } from '@prisma-next/framework-components/control';\nexport { extractCodecControlHooks } from '../core/assembly';\nexport type { SchemaVerifyOptions, SqlControlFamilyInstance } from '../core/control-instance';\nexport type {\n ContractToSchemaIROptions,\n DefaultRenderer,\n NativeTypeExpander,\n} from '../core/migrations/contract-to-schema-ir';\n// Contract → SchemaIR conversion for offline migration planning\nexport {\n contractToSchemaIR,\n detectDestructiveChanges,\n} from '../core/migrations/contract-to-schema-ir';\nexport {\n createMigrationPlan,\n plannerFailure,\n plannerSuccess,\n runnerFailure,\n runnerSuccess,\n} from '../core/migrations/plan-helpers';\nexport { INIT_ADDITIVE_POLICY } from '../core/migrations/policies';\nexport type {\n AnySqlMigrationOperation,\n CodecControlHooks,\n ComponentDatabaseDependencies,\n ComponentDatabaseDependency,\n CreateSqlMigrationPlanOptions,\n ExpandNativeTypeInput,\n ResolveIdentityValueInput,\n SqlControlAdapterDescriptor,\n SqlControlExtensionDescriptor,\n SqlControlTargetDescriptor,\n SqlMigrationPlan,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanner,\n SqlMigrationPlannerPlanOptions,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationPlanOperationTarget,\n SqlMigrationRunner,\n SqlMigrationRunnerErrorCode,\n SqlMigrationRunnerExecuteCallbacks,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n SqlMigrationRunnerSuccessValue,\n SqlPlannerConflict,\n SqlPlannerConflictKind,\n SqlPlannerConflictLocation,\n SqlPlannerFailureResult,\n SqlPlannerResult,\n SqlPlannerSuccessResult,\n SqlPlanTargetDetails,\n StorageTypePlanResult,\n} from '../core/migrations/types';\nexport { collectInitDependencies, isDatabaseDependencyProvider } from '../core/migrations/types';\n\nexport default new SqlFamilyDescriptor();\n"],"mappings":"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"}
|
package/dist/migration.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as SqlPlanTargetDetails, n as AnySqlMigrationOperation } from "./types-
|
|
1
|
+
import { E as SqlPlanTargetDetails, n as AnySqlMigrationOperation } from "./types-BtFk2T25.mjs";
|
|
2
2
|
import { Migration } from "@prisma-next/migration-tools/migration";
|
|
3
3
|
|
|
4
4
|
//#region src/core/sql-migration.d.ts
|
package/dist/schema-verify.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as verifySqlSchema, n as NativeTypeNormalizer, r as VerifySqlSchemaOptions } from "./verify-sql-schema-
|
|
2
|
-
import { a as ComponentDatabaseDependency } from "./types-
|
|
1
|
+
import { i as verifySqlSchema, n as NativeTypeNormalizer, r as VerifySqlSchemaOptions } from "./verify-sql-schema-_EoNcGIq.mjs";
|
|
2
|
+
import { a as ComponentDatabaseDependency } from "./types-BtFk2T25.mjs";
|
|
3
3
|
import { SchemaIssue, SchemaVerificationNode } from "@prisma-next/framework-components/control";
|
|
4
4
|
import { SqlIndexIR, SqlSchemaIR, SqlUniqueIR } from "@prisma-next/sql-schema-ir/types";
|
|
5
5
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ControlAdapterDescriptor, ControlDriverInstance, ControlExtensionDescriptor, ControlFamilyInstance, ControlStack, DataTransformOperation, MigratableTargetDescriptor, MigrationOperationPolicy, MigrationPlan, MigrationPlanOperation, MigrationPlannerConflict, MigrationPlannerFailureResult, MigrationPlannerSuccessResult, MigrationRunnerExecutionChecks, MigrationRunnerFailure, MigrationRunnerSuccessValue, OperationContext, SchemaIssue, SchemaViewCapable, SignDatabaseResult, VerifyDatabaseResult, VerifyDatabaseSchemaResult } from "@prisma-next/framework-components/control";
|
|
2
2
|
import { Result } from "@prisma-next/utils/result";
|
|
3
|
-
import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
4
3
|
import { Contract } from "@prisma-next/contract/types";
|
|
4
|
+
import { SqlSchemaIR } from "@prisma-next/sql-schema-ir/types";
|
|
5
5
|
import { TargetBoundComponentDescriptor } from "@prisma-next/framework-components/components";
|
|
6
6
|
import { SqlStorage, StorageTypeInstance } from "@prisma-next/sql-contract/types";
|
|
7
7
|
import { TypesImportSpec } from "@prisma-next/framework-components/emission";
|
|
@@ -273,8 +273,14 @@ interface SqlMigrationRunnerExecuteOptions<TTargetDetails> {
|
|
|
273
273
|
* All components must have matching familyId ('sql') and targetId.
|
|
274
274
|
*/
|
|
275
275
|
readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;
|
|
276
|
+
/**
|
|
277
|
+
* Invariant ids contributed by this apply (the migration's `providedInvariants`).
|
|
278
|
+
* The runner unions these into `marker.invariants` atomically with the marker write.
|
|
279
|
+
* Defaults to `[]` for marker-only flows (`db update`, `db init`).
|
|
280
|
+
*/
|
|
281
|
+
readonly invariants?: readonly string[];
|
|
276
282
|
}
|
|
277
|
-
type SqlMigrationRunnerErrorCode = 'DESTINATION_CONTRACT_MISMATCH' | 'MARKER_ORIGIN_MISMATCH' | 'POLICY_VIOLATION' | 'PRECHECK_FAILED' | 'POSTCHECK_FAILED' | 'SCHEMA_VERIFY_FAILED' | 'EXECUTION_FAILED';
|
|
283
|
+
type SqlMigrationRunnerErrorCode = 'DESTINATION_CONTRACT_MISMATCH' | 'MARKER_ORIGIN_MISMATCH' | 'POLICY_VIOLATION' | 'PRECHECK_FAILED' | 'POSTCHECK_FAILED' | 'SCHEMA_VERIFY_FAILED' | 'FOREIGN_KEY_VIOLATION' | 'EXECUTION_FAILED';
|
|
278
284
|
interface SqlMigrationRunnerFailure extends MigrationRunnerFailure {
|
|
279
285
|
readonly code: SqlMigrationRunnerErrorCode;
|
|
280
286
|
readonly meta?: AnyRecord;
|
|
@@ -298,4 +304,4 @@ interface CreateSqlMigrationPlanOptions<TTargetDetails> {
|
|
|
298
304
|
}
|
|
299
305
|
//#endregion
|
|
300
306
|
export { SqlPlannerFailureResult as A, SqlMigrationRunnerFailure as C, SqlPlannerConflict as D, SqlPlanTargetDetails as E, isDatabaseDependencyProvider as F, SchemaVerifyOptions as I, SqlControlFamilyInstance as L, SqlPlannerSuccessResult as M, StorageTypePlanResult as N, SqlPlannerConflictKind as O, collectInitDependencies as P, SqlMigrationRunnerExecuteOptions as S, SqlMigrationRunnerSuccessValue as T, SqlMigrationPlanner as _, ComponentDatabaseDependency as a, SqlMigrationRunnerErrorCode as b, ResolveIdentityValueInput as c, SqlControlTargetDescriptor as d, SqlMigrationPlan as f, SqlMigrationPlanOperationTarget as g, SqlMigrationPlanOperationStep as h, ComponentDatabaseDependencies as i, SqlPlannerResult as j, SqlPlannerConflictLocation as k, SqlControlAdapterDescriptor as l, SqlMigrationPlanOperation as m, AnySqlMigrationOperation as n, CreateSqlMigrationPlanOptions as o, SqlMigrationPlanContractInfo as p, CodecControlHooks as r, ExpandNativeTypeInput as s, AnyRecord as t, SqlControlExtensionDescriptor as u, SqlMigrationPlannerPlanOptions as v, SqlMigrationRunnerResult as w, SqlMigrationRunnerExecuteCallbacks as x, SqlMigrationRunner as y };
|
|
301
|
-
//# sourceMappingURL=types-
|
|
307
|
+
//# sourceMappingURL=types-BtFk2T25.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-BtFk2T25.d.mts","names":[],"sources":["../src/core/control-instance.ts","../src/core/migrations/types.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type } from "arktype";
|
|
2
|
+
|
|
3
|
+
//#region src/core/verify.ts
|
|
4
|
+
const MetaSchema = type({ "[string]": "unknown" });
|
|
5
|
+
function parseMeta(meta) {
|
|
6
|
+
if (meta === null || meta === void 0) return {};
|
|
7
|
+
let parsed;
|
|
8
|
+
if (typeof meta === "string") try {
|
|
9
|
+
parsed = JSON.parse(meta);
|
|
10
|
+
} catch {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
else parsed = meta;
|
|
14
|
+
const result = MetaSchema(parsed);
|
|
15
|
+
if (result instanceof type.errors) return {};
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* SQLite stores `contract_json` as TEXT, so the wire shape is a JSON string;
|
|
20
|
+
* Postgres uses `jsonb` and returns an already-parsed value. Normalize both
|
|
21
|
+
* here so `ContractMarkerRecord.contractJson` is always the structured form.
|
|
22
|
+
*/
|
|
23
|
+
function parseContractJson(value) {
|
|
24
|
+
if (value === null || value === void 0) return null;
|
|
25
|
+
if (typeof value !== "string") return value;
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(value);
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const ContractMarkerRowSchema = type({
|
|
33
|
+
core_hash: "string",
|
|
34
|
+
profile_hash: "string",
|
|
35
|
+
"contract_json?": "unknown | null",
|
|
36
|
+
"canonical_version?": "number | null",
|
|
37
|
+
"updated_at?": "Date | string",
|
|
38
|
+
"app_tag?": "string | null",
|
|
39
|
+
"meta?": "unknown | null",
|
|
40
|
+
invariants: type("string").array()
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Parses a contract marker row from database query result.
|
|
44
|
+
* This is SQL-specific parsing logic (handles SQL row structure with snake_case columns).
|
|
45
|
+
*/
|
|
46
|
+
function parseContractMarkerRow(row) {
|
|
47
|
+
const result = ContractMarkerRowSchema(row);
|
|
48
|
+
if (result instanceof type.errors) {
|
|
49
|
+
const messages = result.map((p) => p.message).join("; ");
|
|
50
|
+
throw new Error(`Invalid contract marker row: ${messages}`);
|
|
51
|
+
}
|
|
52
|
+
const updatedAt = result.updated_at ? result.updated_at instanceof Date ? result.updated_at : new Date(result.updated_at) : /* @__PURE__ */ new Date();
|
|
53
|
+
return {
|
|
54
|
+
storageHash: result.core_hash,
|
|
55
|
+
profileHash: result.profile_hash,
|
|
56
|
+
contractJson: parseContractJson(result.contract_json),
|
|
57
|
+
canonicalVersion: result.canonical_version ?? null,
|
|
58
|
+
updatedAt,
|
|
59
|
+
appTag: result.app_tag ?? null,
|
|
60
|
+
meta: parseMeta(result.meta),
|
|
61
|
+
invariants: result.invariants
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Collects supported codec type IDs from adapter and extension manifests.
|
|
66
|
+
* Returns a sorted, unique array of type IDs that are declared in the manifests.
|
|
67
|
+
* This enables coverage checks by comparing contract column types against supported types.
|
|
68
|
+
*
|
|
69
|
+
* Note: This extracts type IDs from manifest type imports, not from runtime codec registries.
|
|
70
|
+
* The manifests declare which codec types are available, but the actual type IDs
|
|
71
|
+
* are defined in the codec-types TypeScript modules that are imported.
|
|
72
|
+
*
|
|
73
|
+
* For MVP, we return an empty array since extracting type IDs from TypeScript modules
|
|
74
|
+
* would require runtime evaluation or static analysis. This can be enhanced later.
|
|
75
|
+
*/
|
|
76
|
+
function collectSupportedCodecTypeIds(descriptors) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { parseContractMarkerRow as n, collectSupportedCodecTypeIds as t };
|
|
82
|
+
//# sourceMappingURL=verify-BdES8wgQ.mjs.map
|