@prisma-next/sql-contract-ts 0.3.0-pr.90.2 → 0.3.0-pr.91.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,12 +33,8 @@ var StorageTableSchema = type.declare().type({
33
33
  indexes: IndexSchema.array().readonly(),
34
34
  foreignKeys: ForeignKeySchema.array().readonly()
35
35
  });
36
- var StorageEnumSchema = type.declare().type({
37
- values: type.string.array().readonly()
38
- });
39
36
  var StorageSchema = type.declare().type({
40
- tables: type({ "[string]": StorageTableSchema }),
41
- "enums?": type({ "[string]": StorageEnumSchema })
37
+ tables: type({ "[string]": StorageTableSchema })
42
38
  });
43
39
  var ModelFieldSchema = type.declare().type({
44
40
  column: "string"
@@ -257,13 +253,7 @@ function normalizeContract(contract) {
257
253
  }
258
254
  normalizedStorage = {
259
255
  ...storage,
260
- tables: normalizedTables,
261
- enums: storage["enums"] ?? {}
262
- };
263
- } else {
264
- normalizedStorage = {
265
- ...storage,
266
- enums: storage["enums"] ?? {}
256
+ tables: normalizedTables
267
257
  };
268
258
  }
269
259
  }
@@ -316,4 +306,4 @@ export {
316
306
  computeMappings,
317
307
  validateContract
318
308
  };
319
- //# sourceMappingURL=chunk-5XCM6ONT.js.map
309
+ //# sourceMappingURL=chunk-SEOX3AAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contract.ts"],"sourcesContent":["import type {\n ForeignKey,\n ForeignKeyReferences,\n Index,\n ModelDefinition,\n ModelField,\n ModelStorage,\n PrimaryKey,\n SqlContract,\n SqlMappings,\n SqlStorage,\n StorageColumn,\n StorageTable,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { type } from 'arktype';\nimport type { O } from 'ts-toolbelt';\n\n/**\n * Structural validation schema for SqlContract using Arktype.\n * This validates the shape and types of the contract structure.\n */\nconst StorageColumnSchema = type.declare<StorageColumn>().type({\n nativeType: 'string',\n codecId: 'string',\n nullable: 'boolean',\n});\n\nconst PrimaryKeySchema = type.declare<PrimaryKey>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst UniqueConstraintSchema = type.declare<UniqueConstraint>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst IndexSchema = type.declare<Index>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst ForeignKeyReferencesSchema = type.declare<ForeignKeyReferences>().type({\n table: 'string',\n columns: type.string.array().readonly(),\n});\n\nconst ForeignKeySchema = type.declare<ForeignKey>().type({\n columns: type.string.array().readonly(),\n references: ForeignKeyReferencesSchema,\n 'name?': 'string',\n});\n\nconst StorageTableSchema = type.declare<StorageTable>().type({\n columns: type({ '[string]': StorageColumnSchema }),\n 'primaryKey?': PrimaryKeySchema,\n uniques: UniqueConstraintSchema.array().readonly(),\n indexes: IndexSchema.array().readonly(),\n foreignKeys: ForeignKeySchema.array().readonly(),\n});\n\nconst StorageSchema = type.declare<SqlStorage>().type({\n tables: type({ '[string]': StorageTableSchema }),\n});\n\nconst ModelFieldSchema = type.declare<ModelField>().type({\n column: 'string',\n});\n\nconst ModelStorageSchema = type.declare<ModelStorage>().type({\n table: 'string',\n});\n\nconst ModelSchema = type.declare<ModelDefinition>().type({\n storage: ModelStorageSchema,\n fields: type({ '[string]': ModelFieldSchema }),\n relations: type({ '[string]': 'unknown' }),\n});\n\n/**\n * Complete SqlContract schema for structural validation.\n * This validates the entire contract structure at once.\n */\nconst SqlContractSchema = type({\n 'schemaVersion?': \"'1'\",\n target: 'string',\n targetFamily: \"'sql'\",\n coreHash: 'string',\n 'profileHash?': 'string',\n 'capabilities?': 'Record<string, Record<string, boolean>>',\n 'extensionPacks?': 'Record<string, unknown>',\n 'meta?': 'Record<string, unknown>',\n 'sources?': 'Record<string, unknown>',\n models: type({ '[string]': ModelSchema }),\n storage: StorageSchema,\n});\n\n/**\n * Validates the structural shape of a SqlContract using Arktype.\n *\n * **Responsibility: Validation Only**\n * This function validates that the contract has the correct structure and types.\n * It does NOT normalize the contract - normalization must happen in the contract builder.\n *\n * The contract passed to this function must already be normalized (all required fields present).\n * If normalization is needed, it should be done by the contract builder before calling this function.\n *\n * This ensures all required fields are present and have the correct types.\n *\n * @param value - The contract value to validate (typically from a JSON import)\n * @returns The validated contract if structure is valid\n * @throws Error if the contract structure is invalid\n */\nfunction validateContractStructure<T extends SqlContract<SqlStorage>>(\n value: unknown,\n): O.Overwrite<T, { targetFamily: 'sql' }> {\n // Check targetFamily first to provide a clear error message for unsupported target families\n const rawValue = value as { targetFamily?: string };\n if (rawValue.targetFamily !== undefined && rawValue.targetFamily !== 'sql') {\n /* c8 ignore next */\n throw new Error(`Unsupported target family: ${rawValue.targetFamily}`);\n }\n\n const contractResult = SqlContractSchema(value);\n\n if (contractResult instanceof type.errors) {\n const messages = contractResult.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Contract structural validation failed: ${messages}`);\n }\n\n // After validation, contractResult matches the schema and preserves the input structure\n // TypeScript needs an assertion here due to exactOptionalPropertyTypes differences\n // between Arktype's inferred type and the generic T, but runtime-wise they're compatible\n return contractResult as O.Overwrite<T, { targetFamily: 'sql' }>;\n}\n\n/**\n * Computes mapping dictionaries from models and storage structures.\n * Assumes valid input - validation happens separately in validateContractLogic().\n *\n * @param models - Models object from contract\n * @param storage - Storage object from contract\n * @param existingMappings - Existing mappings from contract input (optional)\n * @returns Computed mappings dictionary\n */\nexport function computeMappings(\n models: Record<string, ModelDefinition>,\n _storage: SqlStorage,\n existingMappings?: Partial<SqlMappings>,\n): SqlMappings {\n const modelToTable: Record<string, string> = {};\n const tableToModel: Record<string, string> = {};\n const fieldToColumn: Record<string, Record<string, string>> = {};\n const columnToField: Record<string, Record<string, string>> = {};\n\n for (const [modelName, model] of Object.entries(models)) {\n const tableName = model.storage.table;\n modelToTable[modelName] = tableName;\n tableToModel[tableName] = modelName;\n\n const modelFieldToColumn: Record<string, string> = {};\n for (const [fieldName, field] of Object.entries(model.fields)) {\n const columnName = field.column;\n modelFieldToColumn[fieldName] = columnName;\n\n if (!columnToField[tableName]) {\n columnToField[tableName] = {};\n }\n columnToField[tableName][columnName] = fieldName;\n }\n fieldToColumn[modelName] = modelFieldToColumn;\n }\n\n // Preserve existing mappings if provided, otherwise use computed ones\n return {\n modelToTable: existingMappings?.modelToTable ?? modelToTable,\n tableToModel: existingMappings?.tableToModel ?? tableToModel,\n fieldToColumn: existingMappings?.fieldToColumn ?? fieldToColumn,\n columnToField: existingMappings?.columnToField ?? columnToField,\n codecTypes: existingMappings?.codecTypes ?? {},\n operationTypes: existingMappings?.operationTypes ?? {},\n };\n}\n\n/**\n * Validates logical consistency of a **structurally validated** SqlContract.\n * This checks that references (e.g., foreign keys, primary keys, uniques) point to storage objects that already exist.\n * Structural validation is expected to have already completed before this helper runs.\n *\n * @param structurallyValidatedContract - The contract whose structure has already been validated\n * @throws Error if logical validation fails\n */\nfunction validateContractLogic(structurallyValidatedContract: SqlContract<SqlStorage>): void {\n const { storage, models } = structurallyValidatedContract;\n const tableNames = new Set(Object.keys(storage.tables));\n\n // Validate models\n for (const [modelName, modelUnknown] of Object.entries(models)) {\n const model = modelUnknown as ModelDefinition;\n // Validate model has storage.table\n if (!model.storage?.table) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" is missing storage.table`);\n }\n\n const tableName = model.storage.table;\n\n // Validate model's table exists in storage\n if (!tableNames.has(tableName)) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n const table = storage.tables[tableName];\n if (!table) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n // Validate model's table has a primary key\n if (!table.primaryKey) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" table \"${tableName}\" is missing a primary key`);\n }\n\n const columnNames = new Set(Object.keys(table.columns));\n\n // Validate model fields\n if (!model.fields) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" is missing fields`);\n }\n\n for (const [fieldName, fieldUnknown] of Object.entries(model.fields)) {\n const field = fieldUnknown as { column: string };\n // Validate field has column property\n if (!field.column) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" field \"${fieldName}\" is missing column property`);\n }\n\n // Validate field's column exists in the model's backing table\n if (!columnNames.has(field.column)) {\n /* c8 ignore next */\n throw new Error(\n `Model \"${modelName}\" field \"${fieldName}\" references non-existent column \"${field.column}\" in table \"${tableName}\"`,\n );\n }\n }\n\n // Validate model relations have corresponding foreign keys\n if (model.relations) {\n for (const [relationName, relation] of Object.entries(model.relations)) {\n // For now, we'll do basic validation. Full FK validation can be added later\n // This would require checking that the relation's on.parentCols/childCols match FKs\n if (\n typeof relation === 'object' &&\n relation !== null &&\n 'on' in relation &&\n 'to' in relation\n ) {\n const on = relation.on as { parentCols?: string[]; childCols?: string[] };\n const cardinality = (relation as { cardinality?: string }).cardinality;\n if (on.parentCols && on.childCols) {\n // For 1:N relations, the foreign key is on the child table\n // For N:1 relations, the foreign key is on the parent table (this table)\n // For now, we'll skip validation for 1:N relations as the FK is on the child table\n // and we'll validate it when we process the child model\n if (cardinality === '1:N') {\n // Foreign key is on the child table, skip validation here\n // It will be validated when we process the child model\n continue;\n }\n\n // For N:1 relations, check that there's a foreign key matching this relation\n const hasMatchingFk = table.foreignKeys?.some((fk) => {\n return (\n fk.columns.length === on.childCols?.length &&\n fk.columns.every((col, i) => col === on.childCols?.[i]) &&\n fk.references.table &&\n fk.references.columns.length === on.parentCols?.length &&\n fk.references.columns.every((col, i) => col === on.parentCols?.[i])\n );\n });\n\n if (!hasMatchingFk) {\n /* c8 ignore next */\n throw new Error(\n `Model \"${modelName}\" relation \"${relationName}\" does not have a corresponding foreign key in table \"${tableName}\"`,\n );\n }\n }\n }\n }\n }\n }\n\n for (const [tableName, table] of Object.entries(storage.tables)) {\n const columnNames = new Set(Object.keys(table.columns));\n\n // Validate primaryKey references existing columns\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n // Validate unique constraints reference existing columns\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n // Validate indexes reference existing columns\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(`Table \"${tableName}\" index references non-existent column \"${colName}\"`);\n }\n }\n }\n\n // Validate foreignKeys reference existing tables and columns\n for (const fk of table.foreignKeys) {\n // Validate FK columns exist in the referencing table\n for (const colName of fk.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n // Validate referenced table exists\n if (!tableNames.has(fk.references.table)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n\n // Validate referenced columns exist in the referenced table\n const referencedTable = storage.tables[fk.references.table];\n if (!referencedTable) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n );\n }\n }\n }\n}\n\nexport function normalizeContract(contract: unknown): SqlContract<SqlStorage> {\n const contractObj = contract as Record<string, unknown>;\n\n // Only normalize if storage exists (validation will catch if it's missing)\n let normalizedStorage = contractObj['storage'];\n if (normalizedStorage && typeof normalizedStorage === 'object' && normalizedStorage !== null) {\n const storage = normalizedStorage as Record<string, unknown>;\n const tables = storage['tables'] as Record<string, unknown> | undefined;\n\n if (tables) {\n // Normalize storage tables\n const normalizedTables: Record<string, unknown> = {};\n for (const [tableName, table] of Object.entries(tables)) {\n const tableObj = table as Record<string, unknown>;\n const columns = tableObj['columns'] as Record<string, unknown> | undefined;\n\n if (columns) {\n // Normalize columns: add nullable: false if missing\n const normalizedColumns: Record<string, unknown> = {};\n for (const [columnName, column] of Object.entries(columns)) {\n const columnObj = column as Record<string, unknown>;\n const normalizedColumn: Record<string, unknown> = {\n ...columnObj,\n nullable: columnObj['nullable'] ?? false,\n };\n\n normalizedColumns[columnName] = normalizedColumn;\n }\n\n // Normalize table arrays: add empty arrays if missing\n normalizedTables[tableName] = {\n ...tableObj,\n columns: normalizedColumns,\n uniques: tableObj['uniques'] ?? [],\n indexes: tableObj['indexes'] ?? [],\n foreignKeys: tableObj['foreignKeys'] ?? [],\n };\n } else {\n normalizedTables[tableName] = tableObj;\n }\n }\n\n normalizedStorage = {\n ...storage,\n tables: normalizedTables,\n };\n }\n }\n\n // Only normalize if models exists (validation will catch if it's missing)\n let normalizedModels = contractObj['models'];\n if (normalizedModels && typeof normalizedModels === 'object' && normalizedModels !== null) {\n const models = normalizedModels as Record<string, unknown>;\n const normalizedModelsObj: Record<string, unknown> = {};\n for (const [modelName, model] of Object.entries(models)) {\n const modelObj = model as Record<string, unknown>;\n normalizedModelsObj[modelName] = {\n ...modelObj,\n relations: modelObj['relations'] ?? {},\n };\n }\n normalizedModels = normalizedModelsObj;\n }\n\n // Normalize top-level fields: add empty objects if missing\n return {\n ...contractObj,\n models: normalizedModels,\n relations: contractObj['relations'] ?? {},\n storage: normalizedStorage,\n extensionPacks: contractObj['extensionPacks'] ?? {},\n capabilities: contractObj['capabilities'] ?? {},\n meta: contractObj['meta'] ?? {},\n sources: contractObj['sources'] ?? {},\n } as SqlContract<SqlStorage>;\n}\n\n/**\n * Validates that a JSON import conforms to the SqlContract structure\n * and returns a fully typed SqlContract.\n *\n * This function is specifically for validating JSON imports (e.g., from contract.json).\n * Contracts created via the builder API (defineContract) are already valid and should\n * not be passed to this function - use them directly without validation.\n *\n * Performs both structural validation (using Arktype) and logical validation\n * (ensuring all references are valid).\n *\n *\n * The type parameter `TContract` must be a fully-typed contract type (e.g., from `contract.d.ts`),\n * NOT a generic `SqlContract<SqlStorage>`.\n *\n * **Correct:**\n * ```typescript\n * import type { Contract } from './contract.d';\n * const contract = validateContract<Contract>(contractJson);\n * ```\n *\n * **Incorrect:**\n * ```typescript\n * import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\n * const contract = validateContract<SqlContract<SqlStorage>>(contractJson);\n * // ❌ Types will be inferred as 'unknown' - this won't work!\n * ```\n *\n * The type parameter provides the specific table structure, column types, and model definitions.\n * This function validates the runtime structure matches the type, but does not infer types\n * from JSON (as JSON imports lose literal type information).\n *\n * @param value - The contract value to validate (must be from a JSON import, not a builder)\n * @returns A validated contract matching the TContract type\n * @throws Error if the contract structure or logic is invalid\n */\nexport function validateContract<TContract extends SqlContract<SqlStorage>>(\n value: unknown,\n): TContract {\n // Normalize contract first (add defaults for missing fields)\n const normalized = normalizeContract(value);\n\n const structurallyValid = validateContractStructure<SqlContract<SqlStorage>>(normalized);\n\n const contractForValidation = structurallyValid as SqlContract<SqlStorage>;\n\n // Validate contract logic (contracts must already have fully qualified type IDs)\n validateContractLogic(contractForValidation);\n\n // Extract existing mappings (optional - will be computed if missing)\n const existingMappings = (contractForValidation as { mappings?: Partial<SqlMappings> }).mappings;\n\n // Compute mappings from models and storage\n const mappings = computeMappings(\n contractForValidation.models as Record<string, ModelDefinition>,\n contractForValidation.storage,\n existingMappings,\n );\n\n // Add default values for optional metadata fields if missing\n const contractWithMappings = {\n ...structurallyValid,\n models: contractForValidation.models,\n relations: contractForValidation.relations,\n storage: contractForValidation.storage,\n mappings,\n };\n\n // Type assertion: The caller provides the strict type via TContract.\n // We validate the structure matches, but the precise types come from contract.d.ts\n return contractWithMappings as TContract;\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/contract/framework-components';
2
- import type { ColumnBuilderState, EnumBuilderState, ModelBuilderState, RelationDefinition, TableBuilderState } from '@prisma-next/contract-authoring';
2
+ import type { ColumnBuilderState, ModelBuilderState, RelationDefinition, TableBuilderState } from '@prisma-next/contract-authoring';
3
3
  import { type BuildModels, type BuildRelations, type BuildStorageColumn, ContractBuilder, type ExtractColumns, type ExtractPrimaryKey, ModelBuilder, TableBuilder } from '@prisma-next/contract-authoring';
4
4
  import type { SqlContract, SqlMappings } from '@prisma-next/sql-contract/types';
5
5
  /**
@@ -46,16 +46,10 @@ type BuildStorageTable<_TableName extends string, Columns extends Record<string,
46
46
  readonly name?: string;
47
47
  };
48
48
  } : Record<string, never>);
49
- type BuildStorageEnums<Enums extends Record<string, EnumBuilderState<string, readonly string[]>>> = {
50
- readonly [K in keyof Enums]: {
51
- readonly values: Enums[K]['values'];
52
- };
53
- };
54
- type BuildStorage<Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>, Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>> = {
49
+ type BuildStorage<Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>> = {
55
50
  readonly tables: {
56
51
  readonly [K in keyof Tables]: BuildStorageTable<K & string, ExtractColumns<Tables[K]>, ExtractPrimaryKey<Tables[K]>>;
57
52
  };
58
- readonly enums: BuildStorageEnums<Enums>;
59
53
  };
60
54
  export interface ColumnBuilder<Name extends string, Nullable extends boolean, Type extends string> {
61
55
  nullable<Value extends boolean>(value?: Value): ColumnBuilder<Name, Value, Type>;
@@ -64,7 +58,7 @@ export interface ColumnBuilder<Name extends string, Nullable extends boolean, Ty
64
58
  }
65
59
  declare class SqlContractBuilder<CodecTypes extends Record<string, {
66
60
  output: unknown;
67
- }> = Record<string, never>, Target extends string | undefined = undefined, Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>> = Record<never, never>, Models extends Record<string, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>> = Record<never, never>, Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>, CoreHash extends string | undefined = undefined, ExtensionPacks extends Record<string, unknown> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> extends ContractBuilder<Target, Tables, Models, Enums, CoreHash, ExtensionPacks, Capabilities> {
61
+ }> = Record<string, never>, Target extends string | undefined = undefined, Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>> = Record<never, never>, Models extends Record<string, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>> = Record<never, never>, CoreHash extends string | undefined = undefined, ExtensionPacks extends Record<string, unknown> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> extends ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {
68
62
  /**
69
63
  * This method is responsible for normalizing the contract IR by setting default values
70
64
  * for all required fields:
@@ -83,7 +77,7 @@ declare class SqlContractBuilder<CodecTypes extends Record<string, {
83
77
  *
84
78
  * @returns A normalized SqlContract with all required fields present
85
79
  */
86
- build(): Target extends string ? SqlContract<BuildStorage<Tables, Enums>, BuildModels<Models>, BuildRelations<Models>, ContractBuilderMappings<CodecTypes>> & {
80
+ build(): Target extends string ? SqlContract<BuildStorage<Tables>, BuildModels<Models>, BuildRelations<Models>, ContractBuilderMappings<CodecTypes>> & {
87
81
  readonly schemaVersion: '1';
88
82
  readonly target: Target;
89
83
  readonly targetFamily: 'sql';
@@ -93,18 +87,12 @@ declare class SqlContractBuilder<CodecTypes extends Record<string, {
93
87
  } : Record<string, never>) & (Capabilities extends Record<string, Record<string, boolean>> ? {
94
88
  readonly capabilities: Capabilities;
95
89
  } : Record<string, never>) : never;
96
- target<T extends string>(packRef: TargetPackRef<'sql', T>): SqlContractBuilder<CodecTypes, T, Tables, Models, Enums, CoreHash, ExtensionPacks, Capabilities>;
97
- extensionPacks(packs: Record<string, ExtensionPackRef<'sql', string>>): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums, CoreHash, ExtensionPacks, Capabilities>;
98
- capabilities<C extends Record<string, Record<string, boolean>>>(capabilities: C): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums, CoreHash, ExtensionPacks, C>;
99
- coreHash<H extends string>(hash: H): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums, H, ExtensionPacks, Capabilities>;
100
- table<TableName extends string, T extends TableBuilder<TableName, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>(name: TableName, callback: (t: TableBuilder<TableName>) => T | undefined): SqlContractBuilder<CodecTypes, Target, Tables & Record<TableName, ReturnType<T['build']>>, Models, Enums, CoreHash, ExtensionPacks, Capabilities>;
101
- model<ModelName extends string, TableName extends string, M extends ModelBuilder<ModelName, TableName, Record<string, string>, Record<string, RelationDefinition>>>(name: ModelName, table: TableName, callback: (m: ModelBuilder<ModelName, TableName, Record<string, string>, Record<never, never>>) => M | undefined): SqlContractBuilder<CodecTypes, Target, Tables, Models & Record<ModelName, ReturnType<M['build']>>, Enums, CoreHash, ExtensionPacks, Capabilities>;
102
- /**
103
- * Define an enum type with ordered values.
104
- * @param name The name of the enum type (e.g., 'Role', 'Status')
105
- * @param values The ordered list of enum values (e.g., ['USER', 'ADMIN'])
106
- */
107
- enum<EnumName extends string, Values extends readonly [string, ...string[]]>(name: EnumName, values: Values): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums & Record<EnumName, EnumBuilderState<EnumName, Values>>, CoreHash, ExtensionPacks, Capabilities>;
90
+ target<T extends string>(packRef: TargetPackRef<'sql', T>): SqlContractBuilder<CodecTypes, T, Tables, Models, CoreHash, ExtensionPacks, Capabilities>;
91
+ extensionPacks(packs: Record<string, ExtensionPackRef<'sql', string>>): SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities>;
92
+ capabilities<C extends Record<string, Record<string, boolean>>>(capabilities: C): SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, C>;
93
+ coreHash<H extends string>(hash: H): SqlContractBuilder<CodecTypes, Target, Tables, Models, H, ExtensionPacks, Capabilities>;
94
+ table<TableName extends string, T extends TableBuilder<TableName, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>(name: TableName, callback: (t: TableBuilder<TableName>) => T | undefined): SqlContractBuilder<CodecTypes, Target, Tables & Record<TableName, ReturnType<T['build']>>, Models, CoreHash, ExtensionPacks, Capabilities>;
95
+ model<ModelName extends string, TableName extends string, M extends ModelBuilder<ModelName, TableName, Record<string, string>, Record<string, RelationDefinition>>>(name: ModelName, table: TableName, callback: (m: ModelBuilder<ModelName, TableName, Record<string, string>, Record<never, never>>) => M | undefined): SqlContractBuilder<CodecTypes, Target, Tables, Models & Record<ModelName, ReturnType<M['build']>>, CoreHash, ExtensionPacks, Capabilities>;
108
96
  }
109
97
  export declare function defineContract<CodecTypes extends Record<string, {
110
98
  output: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"contract-builder.d.ts","sourceRoot":"","sources":["../src/contract-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract-builder.d.ts","sourceRoot":"","sources":["../src/contract-builder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,eAAe,EAIf,WAAW,EACX,WAAW,EACX,UAAU,EAKX,MAAM,iCAAiC,CAAC;AAgIzC;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,QAAQ,EAAE,UAAU,EACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACtC,WAAW,CAiCb;AAyMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAkF5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,EACxE,KAAK,EAAE,OAAO,GACb,SAAS,CAiCX"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,eAAe,EAIf,WAAW,EACX,WAAW,EACX,UAAU,EAIX,MAAM,iCAAiC,CAAC;AA2HzC;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,QAAQ,EAAE,UAAU,EACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACtC,WAAW,CAiCb;AAyMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CA2E5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,WAAW,CAAC,UAAU,CAAC,EACxE,KAAK,EAAE,OAAO,GACb,SAAS,CAiCX"}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  computeMappings
3
- } from "../chunk-5XCM6ONT.js";
3
+ } from "../chunk-SEOX3AAQ.js";
4
4
 
5
5
  // src/contract-builder.ts
6
6
  import {
@@ -76,18 +76,7 @@ var SqlContractBuilder = class _SqlContractBuilder extends ContractBuilder {
76
76
  };
77
77
  storageTables[tableName] = table;
78
78
  }
79
- const storageEnums = {};
80
- for (const enumName of Object.keys(this.state.enums)) {
81
- const enumState = this.state.enums[enumName];
82
- if (!enumState) continue;
83
- storageEnums[enumName] = {
84
- values: enumState.values
85
- };
86
- }
87
- const storage = {
88
- tables: storageTables,
89
- enums: storageEnums
90
- };
79
+ const storage = { tables: storageTables };
91
80
  const modelsPartial = {};
92
81
  for (const modelName in this.state.models) {
93
82
  const modelState = this.state.models[modelName];
@@ -232,21 +221,6 @@ var SqlContractBuilder = class _SqlContractBuilder extends ContractBuilder {
232
221
  models: { ...this.state.models, [name]: modelState }
233
222
  });
234
223
  }
235
- /**
236
- * Define an enum type with ordered values.
237
- * @param name The name of the enum type (e.g., 'Role', 'Status')
238
- * @param values The ordered list of enum values (e.g., ['USER', 'ADMIN'])
239
- */
240
- enum(name, values) {
241
- const enumState = {
242
- name,
243
- values
244
- };
245
- return new _SqlContractBuilder({
246
- ...this.state,
247
- enums: { ...this.state.enums, [name]: enumState }
248
- });
249
- }
250
224
  };
251
225
  function defineContract() {
252
226
  return new SqlContractBuilder();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contract-builder.ts"],"sourcesContent":["import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/contract/framework-components';\nimport type {\n ColumnBuilderState,\n EnumBuilderState,\n ModelBuilderState,\n RelationDefinition,\n TableBuilderState,\n} from '@prisma-next/contract-authoring';\nimport {\n type BuildModels,\n type BuildRelations,\n type BuildStorageColumn,\n ContractBuilder,\n createTable,\n type ExtractColumns,\n type ExtractPrimaryKey,\n ModelBuilder,\n type Mutable,\n TableBuilder,\n} from '@prisma-next/contract-authoring';\nimport type {\n ModelDefinition,\n ModelField,\n SqlContract,\n SqlMappings,\n SqlStorage,\n} from '@prisma-next/sql-contract/types';\nimport { computeMappings } from './contract';\n\n/**\n * Type-level mappings structure for contracts built via `defineContract()`.\n *\n * Compile-time type helper (not a runtime object) that ensures mappings match what the builder\n * produces. `codecTypes` uses the generic `CodecTypes` parameter; `operationTypes` is always\n * empty since operations are added via extensions at runtime.\n *\n * **Difference from RuntimeContext**: This is a compile-time type for contract construction.\n * `RuntimeContext` is a runtime object with populated registries for query execution.\n *\n * @template C - The `CodecTypes` generic parameter passed to `defineContract<CodecTypes>()`\n */\ntype ContractBuilderMappings<C extends Record<string, { output: unknown }>> = Omit<\n SqlMappings,\n 'codecTypes' | 'operationTypes'\n> & {\n readonly codecTypes: C;\n readonly operationTypes: Record<string, never>;\n};\n\ntype BuildStorageTable<\n _TableName extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,\n PK extends readonly string[] | undefined,\n> = {\n readonly columns: {\n readonly [K in keyof Columns]: Columns[K] extends ColumnBuilderState<\n string,\n infer Null,\n infer TType\n >\n ? BuildStorageColumn<Null & boolean, TType>\n : never;\n };\n readonly uniques: ReadonlyArray<{ readonly columns: readonly string[]; readonly name?: string }>;\n readonly indexes: ReadonlyArray<{ readonly columns: readonly string[]; readonly name?: string }>;\n readonly foreignKeys: ReadonlyArray<{\n readonly columns: readonly string[];\n readonly references: { readonly table: string; readonly columns: readonly string[] };\n readonly name?: string;\n }>;\n} & (PK extends readonly string[]\n ? { readonly primaryKey: { readonly columns: PK; readonly name?: string } }\n : Record<string, never>);\n\ntype BuildStorageEnums<Enums extends Record<string, EnumBuilderState<string, readonly string[]>>> =\n {\n readonly [K in keyof Enums]: {\n readonly values: Enums[K]['values'];\n };\n };\n\ntype BuildStorage<\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n >,\n Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>,\n> = {\n readonly tables: {\n readonly [K in keyof Tables]: BuildStorageTable<\n K & string,\n ExtractColumns<Tables[K]>,\n ExtractPrimaryKey<Tables[K]>\n >;\n };\n readonly enums: BuildStorageEnums<Enums>;\n};\n\ntype BuildStorageTables<\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n >,\n> = {\n readonly [K in keyof Tables]: BuildStorageTable<\n K & string,\n ExtractColumns<Tables[K]>,\n ExtractPrimaryKey<Tables[K]>\n >;\n};\n\nexport interface ColumnBuilder<Name extends string, Nullable extends boolean, Type extends string> {\n nullable<Value extends boolean>(value?: Value): ColumnBuilder<Name, Value, Type>;\n type<Id extends string>(id: Id): ColumnBuilder<Name, Nullable, Id>;\n build(): ColumnBuilderState<Name, Nullable, Type>;\n}\n\nclass SqlContractBuilder<\n CodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n Target extends string | undefined = undefined,\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n > = Record<never, never>,\n Models extends Record<\n string,\n ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>\n > = Record<never, never>,\n Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>,\n CoreHash extends string | undefined = undefined,\n ExtensionPacks extends Record<string, unknown> | undefined = undefined,\n Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined,\n> extends ContractBuilder<Target, Tables, Models, Enums, CoreHash, ExtensionPacks, Capabilities> {\n /**\n * This method is responsible for normalizing the contract IR by setting default values\n * for all required fields:\n * - `nullable`: defaults to `false` if not provided\n * - `uniques`: defaults to `[]` (empty array)\n * - `indexes`: defaults to `[]` (empty array)\n * - `foreignKeys`: defaults to `[]` (empty array)\n * - `relations`: defaults to `{}` (empty object) for both model-level and contract-level\n * - `nativeType`: required field set from column type descriptor when columns are defined\n *\n * The contract builder is the **only** place where normalization should occur.\n * Validators, parsers, and emitters should assume the contract is already normalized.\n *\n * **Required**: Use column type descriptors (e.g., `int4Column`, `textColumn`) when defining columns.\n * This ensures `nativeType` is set correctly at build time.\n *\n * @returns A normalized SqlContract with all required fields present\n */\n build(): Target extends string\n ? SqlContract<\n BuildStorage<Tables, Enums>,\n BuildModels<Models>,\n BuildRelations<Models>,\n ContractBuilderMappings<CodecTypes>\n > & {\n readonly schemaVersion: '1';\n readonly target: Target;\n readonly targetFamily: 'sql';\n readonly coreHash: CoreHash extends string ? CoreHash : string;\n } & (ExtensionPacks extends Record<string, unknown>\n ? { readonly extensionPacks: ExtensionPacks }\n : Record<string, never>) &\n (Capabilities extends Record<string, Record<string, boolean>>\n ? { readonly capabilities: Capabilities }\n : Record<string, never>)\n : never {\n // Type helper to ensure literal types are preserved in return type\n type BuiltContract = Target extends string\n ? SqlContract<\n BuildStorage<Tables, Enums>,\n BuildModels<Models>,\n BuildRelations<Models>,\n ContractBuilderMappings<CodecTypes>\n > & {\n readonly schemaVersion: '1';\n readonly target: Target;\n readonly targetFamily: 'sql';\n readonly coreHash: CoreHash extends string ? CoreHash : string;\n } & (ExtensionPacks extends Record<string, unknown>\n ? { readonly extensionPacks: ExtensionPacks }\n : Record<string, never>) &\n (Capabilities extends Record<string, Record<string, boolean>>\n ? { readonly capabilities: Capabilities }\n : Record<string, never>)\n : never;\n if (!this.state.target) {\n throw new Error('target is required. Call .target() before .build()');\n }\n\n const target = this.state.target as Target & string;\n\n const storageTables = {} as Partial<Mutable<BuildStorageTables<Tables>>>;\n\n for (const tableName of Object.keys(this.state.tables) as Array<keyof Tables & string>) {\n const tableState = this.state.tables[tableName];\n if (!tableState) continue;\n\n type TableKey = typeof tableName;\n type ColumnDefs = ExtractColumns<Tables[TableKey]>;\n type PrimaryKey = ExtractPrimaryKey<Tables[TableKey]>;\n\n const columns = {} as Partial<{\n [K in keyof ColumnDefs]: BuildStorageColumn<\n ColumnDefs[K]['nullable'] & boolean,\n ColumnDefs[K]['type']\n >;\n }>;\n\n for (const columnName in tableState.columns) {\n const columnState = tableState.columns[columnName];\n if (!columnState) continue;\n const codecId = columnState.type;\n const nativeType = columnState.nativeType;\n\n columns[columnName as keyof ColumnDefs] = {\n nativeType,\n codecId,\n nullable: (columnState.nullable ?? false) as ColumnDefs[keyof ColumnDefs]['nullable'] &\n boolean,\n } as BuildStorageColumn<\n ColumnDefs[keyof ColumnDefs]['nullable'] & boolean,\n ColumnDefs[keyof ColumnDefs]['type']\n >;\n }\n\n // Build uniques from table state\n const uniques = (tableState.uniques ?? []).map((u) => ({\n columns: u.columns,\n ...(u.name ? { name: u.name } : {}),\n }));\n\n // Build indexes from table state\n const indexes = (tableState.indexes ?? []).map((i) => ({\n columns: i.columns,\n ...(i.name ? { name: i.name } : {}),\n }));\n\n // Build foreign keys from table state\n const foreignKeys = (tableState.foreignKeys ?? []).map((fk) => ({\n columns: fk.columns,\n references: fk.references,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n\n const table = {\n columns: columns as {\n [K in keyof ColumnDefs]: BuildStorageColumn<\n ColumnDefs[K]['nullable'] & boolean,\n ColumnDefs[K]['type']\n >;\n },\n uniques,\n indexes,\n foreignKeys,\n ...(tableState.primaryKey\n ? {\n primaryKey: {\n columns: tableState.primaryKey,\n ...(tableState.primaryKeyName ? { name: tableState.primaryKeyName } : {}),\n },\n }\n : {}),\n } as unknown as BuildStorageTable<TableKey & string, ColumnDefs, PrimaryKey>;\n\n (storageTables as Mutable<BuildStorageTables<Tables>>)[tableName] = table;\n }\n\n // Build enums from state\n const storageEnums = {} as Mutable<BuildStorageEnums<Enums>>;\n for (const enumName of Object.keys(this.state.enums) as Array<keyof Enums & string>) {\n const enumState = this.state.enums[enumName];\n if (!enumState) continue;\n\n storageEnums[enumName] = {\n values: enumState.values,\n } as BuildStorageEnums<Enums>[typeof enumName];\n }\n\n const storage = {\n tables: storageTables as BuildStorageTables<Tables>,\n enums: storageEnums as BuildStorageEnums<Enums>,\n } as BuildStorage<Tables, Enums>;\n\n // Build models - construct as partial first, then assert full type\n const modelsPartial: Partial<BuildModels<Models>> = {};\n\n // Iterate over models - TypeScript will see keys as string, but type assertion preserves literals\n for (const modelName in this.state.models) {\n const modelState = this.state.models[modelName];\n if (!modelState) continue;\n\n const modelStateTyped = modelState as unknown as {\n name: string;\n table: string;\n fields: Record<string, string>;\n };\n\n // Build fields object\n const fields: Partial<Record<string, ModelField>> = {};\n\n // Iterate over fields\n for (const fieldName in modelStateTyped.fields) {\n const columnName = modelStateTyped.fields[fieldName];\n if (columnName) {\n fields[fieldName] = {\n column: columnName,\n };\n }\n }\n\n // Assign to models - type assertion preserves literal keys\n (modelsPartial as unknown as Record<string, ModelDefinition>)[modelName] = {\n storage: {\n table: modelStateTyped.table,\n },\n fields: fields as Record<string, ModelField>,\n relations: {},\n };\n }\n\n // Build relations object - organized by table name\n const relationsPartial: Partial<Record<string, Record<string, RelationDefinition>>> = {};\n\n // Iterate over models to collect relations\n for (const modelName in this.state.models) {\n const modelState = this.state.models[modelName];\n if (!modelState) continue;\n\n const modelStateTyped = modelState as unknown as {\n name: string;\n table: string;\n fields: Record<string, string>;\n relations: Record<string, RelationDefinition>;\n };\n\n const tableName = modelStateTyped.table;\n if (!tableName) continue;\n\n // Only initialize relations object for this table if it has relations\n if (modelStateTyped.relations && Object.keys(modelStateTyped.relations).length > 0) {\n if (!relationsPartial[tableName]) {\n relationsPartial[tableName] = {};\n }\n\n // Add relations from this model to the table's relations\n const tableRelations = relationsPartial[tableName];\n if (tableRelations) {\n for (const relationName in modelStateTyped.relations) {\n const relation = modelStateTyped.relations[relationName];\n if (relation) {\n tableRelations[relationName] = relation;\n }\n }\n }\n }\n }\n\n const models = modelsPartial as unknown as BuildModels<Models>;\n\n const baseMappings = computeMappings(\n models as unknown as Record<string, ModelDefinition>,\n storage as SqlStorage,\n );\n\n const mappings = {\n ...baseMappings,\n codecTypes: {} as CodecTypes,\n operationTypes: {} as Record<string, never>,\n } as ContractBuilderMappings<CodecTypes>;\n\n const extensionNamespaces = this.state.extensionNamespaces ?? [];\n const extensionPacks: Record<string, unknown> = { ...(this.state.extensionPacks || {}) };\n for (const namespace of extensionNamespaces) {\n if (!Object.hasOwn(extensionPacks, namespace)) {\n extensionPacks[namespace] = {};\n }\n }\n\n // Construct contract with explicit type that matches the generic parameters\n // This ensures TypeScript infers literal types from the generics, not runtime values\n // Always include relations, even if empty (normalized to empty object)\n const contract = {\n schemaVersion: '1' as const,\n target,\n targetFamily: 'sql' as const,\n coreHash: this.state.coreHash || 'sha256:ts-builder-placeholder',\n models,\n relations: relationsPartial,\n storage,\n mappings,\n extensionPacks,\n capabilities: this.state.capabilities || {},\n meta: {},\n sources: {},\n } as unknown as BuiltContract;\n\n return contract as unknown as ReturnType<\n SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >['build']\n >;\n }\n\n override target<T extends string>(\n packRef: TargetPackRef<'sql', T>,\n ): SqlContractBuilder<\n CodecTypes,\n T,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n return new SqlContractBuilder<\n CodecTypes,\n T,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n target: packRef.targetId,\n });\n }\n\n extensionPacks(\n packs: Record<string, ExtensionPackRef<'sql', string>>,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n if (!this.state.target) {\n throw new Error('extensionPacks() requires target() to be called first');\n }\n\n const namespaces = new Set(this.state.extensionNamespaces ?? []);\n\n for (const packRef of Object.values(packs)) {\n if (!packRef) continue;\n\n if (packRef.kind !== 'extension') {\n throw new Error(\n `extensionPacks() only accepts extension pack refs. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== 'sql') {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but this builder targets \"sql\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== this.state.target) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but builder target is \"${this.state.target}\".`,\n );\n }\n\n namespaces.add(packRef.id);\n }\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n extensionNamespaces: [...namespaces],\n });\n }\n\n override capabilities<C extends Record<string, Record<string, boolean>>>(\n capabilities: C,\n ): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums, CoreHash, ExtensionPacks, C> {\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n C\n >({\n ...this.state,\n capabilities,\n });\n }\n\n override coreHash<H extends string>(\n hash: H,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n H,\n ExtensionPacks,\n Capabilities\n > {\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums,\n H,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n coreHash: hash,\n });\n }\n\n override table<\n TableName extends string,\n T extends TableBuilder<\n TableName,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >,\n >(\n name: TableName,\n callback: (t: TableBuilder<TableName>) => T | undefined,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const tableBuilder = createTable(name);\n const result = callback(tableBuilder);\n const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;\n const tableState = finalBuilder.build();\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n tables: { ...this.state.tables, [name]: tableState } as Tables &\n Record<TableName, ReturnType<T['build']>>,\n });\n }\n\n override model<\n ModelName extends string,\n TableName extends string,\n M extends ModelBuilder<\n ModelName,\n TableName,\n Record<string, string>,\n Record<string, RelationDefinition>\n >,\n >(\n name: ModelName,\n table: TableName,\n callback: (\n m: ModelBuilder<ModelName, TableName, Record<string, string>, Record<never, never>>,\n ) => M | undefined,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const modelBuilder = new ModelBuilder<ModelName, TableName>(name, table);\n const result = callback(modelBuilder);\n const finalBuilder = result instanceof ModelBuilder ? result : modelBuilder;\n const modelState = finalBuilder.build();\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n Enums,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n models: { ...this.state.models, [name]: modelState } as Models &\n Record<ModelName, ReturnType<M['build']>>,\n });\n }\n\n /**\n * Define an enum type with ordered values.\n * @param name The name of the enum type (e.g., 'Role', 'Status')\n * @param values The ordered list of enum values (e.g., ['USER', 'ADMIN'])\n */\n override enum<EnumName extends string, Values extends readonly [string, ...string[]]>(\n name: EnumName,\n values: Values,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums & Record<EnumName, EnumBuilderState<EnumName, Values>>,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const enumState: EnumBuilderState<EnumName, Values> = {\n name,\n values,\n };\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n Enums & Record<EnumName, EnumBuilderState<EnumName, Values>>,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n enums: { ...this.state.enums, [name]: enumState } as Enums &\n Record<EnumName, EnumBuilderState<EnumName, Values>>,\n });\n }\n}\n\nexport function defineContract<\n CodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n>(): SqlContractBuilder<CodecTypes> {\n return new SqlContractBuilder<CodecTypes>();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/contract-builder.ts"],"sourcesContent":["import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/contract/framework-components';\nimport type {\n ColumnBuilderState,\n ModelBuilderState,\n RelationDefinition,\n TableBuilderState,\n} from '@prisma-next/contract-authoring';\nimport {\n type BuildModels,\n type BuildRelations,\n type BuildStorageColumn,\n ContractBuilder,\n createTable,\n type ExtractColumns,\n type ExtractPrimaryKey,\n ModelBuilder,\n type Mutable,\n TableBuilder,\n} from '@prisma-next/contract-authoring';\nimport type {\n ModelDefinition,\n ModelField,\n SqlContract,\n SqlMappings,\n SqlStorage,\n} from '@prisma-next/sql-contract/types';\nimport { computeMappings } from './contract';\n\n/**\n * Type-level mappings structure for contracts built via `defineContract()`.\n *\n * Compile-time type helper (not a runtime object) that ensures mappings match what the builder\n * produces. `codecTypes` uses the generic `CodecTypes` parameter; `operationTypes` is always\n * empty since operations are added via extensions at runtime.\n *\n * **Difference from RuntimeContext**: This is a compile-time type for contract construction.\n * `RuntimeContext` is a runtime object with populated registries for query execution.\n *\n * @template C - The `CodecTypes` generic parameter passed to `defineContract<CodecTypes>()`\n */\ntype ContractBuilderMappings<C extends Record<string, { output: unknown }>> = Omit<\n SqlMappings,\n 'codecTypes' | 'operationTypes'\n> & {\n readonly codecTypes: C;\n readonly operationTypes: Record<string, never>;\n};\n\ntype BuildStorageTable<\n _TableName extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,\n PK extends readonly string[] | undefined,\n> = {\n readonly columns: {\n readonly [K in keyof Columns]: Columns[K] extends ColumnBuilderState<\n string,\n infer Null,\n infer TType\n >\n ? BuildStorageColumn<Null & boolean, TType>\n : never;\n };\n readonly uniques: ReadonlyArray<{ readonly columns: readonly string[]; readonly name?: string }>;\n readonly indexes: ReadonlyArray<{ readonly columns: readonly string[]; readonly name?: string }>;\n readonly foreignKeys: ReadonlyArray<{\n readonly columns: readonly string[];\n readonly references: { readonly table: string; readonly columns: readonly string[] };\n readonly name?: string;\n }>;\n} & (PK extends readonly string[]\n ? { readonly primaryKey: { readonly columns: PK; readonly name?: string } }\n : Record<string, never>);\n\ntype BuildStorage<\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n >,\n> = {\n readonly tables: {\n readonly [K in keyof Tables]: BuildStorageTable<\n K & string,\n ExtractColumns<Tables[K]>,\n ExtractPrimaryKey<Tables[K]>\n >;\n };\n};\n\ntype BuildStorageTables<\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n >,\n> = {\n readonly [K in keyof Tables]: BuildStorageTable<\n K & string,\n ExtractColumns<Tables[K]>,\n ExtractPrimaryKey<Tables[K]>\n >;\n};\n\nexport interface ColumnBuilder<Name extends string, Nullable extends boolean, Type extends string> {\n nullable<Value extends boolean>(value?: Value): ColumnBuilder<Name, Value, Type>;\n type<Id extends string>(id: Id): ColumnBuilder<Name, Nullable, Id>;\n build(): ColumnBuilderState<Name, Nullable, Type>;\n}\n\nclass SqlContractBuilder<\n CodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n Target extends string | undefined = undefined,\n Tables extends Record<\n string,\n TableBuilderState<\n string,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >\n > = Record<never, never>,\n Models extends Record<\n string,\n ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>\n > = Record<never, never>,\n CoreHash extends string | undefined = undefined,\n ExtensionPacks extends Record<string, unknown> | undefined = undefined,\n Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined,\n> extends ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {\n /**\n * This method is responsible for normalizing the contract IR by setting default values\n * for all required fields:\n * - `nullable`: defaults to `false` if not provided\n * - `uniques`: defaults to `[]` (empty array)\n * - `indexes`: defaults to `[]` (empty array)\n * - `foreignKeys`: defaults to `[]` (empty array)\n * - `relations`: defaults to `{}` (empty object) for both model-level and contract-level\n * - `nativeType`: required field set from column type descriptor when columns are defined\n *\n * The contract builder is the **only** place where normalization should occur.\n * Validators, parsers, and emitters should assume the contract is already normalized.\n *\n * **Required**: Use column type descriptors (e.g., `int4Column`, `textColumn`) when defining columns.\n * This ensures `nativeType` is set correctly at build time.\n *\n * @returns A normalized SqlContract with all required fields present\n */\n build(): Target extends string\n ? SqlContract<\n BuildStorage<Tables>,\n BuildModels<Models>,\n BuildRelations<Models>,\n ContractBuilderMappings<CodecTypes>\n > & {\n readonly schemaVersion: '1';\n readonly target: Target;\n readonly targetFamily: 'sql';\n readonly coreHash: CoreHash extends string ? CoreHash : string;\n } & (ExtensionPacks extends Record<string, unknown>\n ? { readonly extensionPacks: ExtensionPacks }\n : Record<string, never>) &\n (Capabilities extends Record<string, Record<string, boolean>>\n ? { readonly capabilities: Capabilities }\n : Record<string, never>)\n : never {\n // Type helper to ensure literal types are preserved in return type\n type BuiltContract = Target extends string\n ? SqlContract<\n BuildStorage<Tables>,\n BuildModels<Models>,\n BuildRelations<Models>,\n ContractBuilderMappings<CodecTypes>\n > & {\n readonly schemaVersion: '1';\n readonly target: Target;\n readonly targetFamily: 'sql';\n readonly coreHash: CoreHash extends string ? CoreHash : string;\n } & (ExtensionPacks extends Record<string, unknown>\n ? { readonly extensionPacks: ExtensionPacks }\n : Record<string, never>) &\n (Capabilities extends Record<string, Record<string, boolean>>\n ? { readonly capabilities: Capabilities }\n : Record<string, never>)\n : never;\n if (!this.state.target) {\n throw new Error('target is required. Call .target() before .build()');\n }\n\n const target = this.state.target as Target & string;\n\n const storageTables = {} as Partial<Mutable<BuildStorageTables<Tables>>>;\n\n for (const tableName of Object.keys(this.state.tables) as Array<keyof Tables & string>) {\n const tableState = this.state.tables[tableName];\n if (!tableState) continue;\n\n type TableKey = typeof tableName;\n type ColumnDefs = ExtractColumns<Tables[TableKey]>;\n type PrimaryKey = ExtractPrimaryKey<Tables[TableKey]>;\n\n const columns = {} as Partial<{\n [K in keyof ColumnDefs]: BuildStorageColumn<\n ColumnDefs[K]['nullable'] & boolean,\n ColumnDefs[K]['type']\n >;\n }>;\n\n for (const columnName in tableState.columns) {\n const columnState = tableState.columns[columnName];\n if (!columnState) continue;\n const codecId = columnState.type;\n const nativeType = columnState.nativeType;\n\n columns[columnName as keyof ColumnDefs] = {\n nativeType,\n codecId,\n nullable: (columnState.nullable ?? false) as ColumnDefs[keyof ColumnDefs]['nullable'] &\n boolean,\n } as BuildStorageColumn<\n ColumnDefs[keyof ColumnDefs]['nullable'] & boolean,\n ColumnDefs[keyof ColumnDefs]['type']\n >;\n }\n\n // Build uniques from table state\n const uniques = (tableState.uniques ?? []).map((u) => ({\n columns: u.columns,\n ...(u.name ? { name: u.name } : {}),\n }));\n\n // Build indexes from table state\n const indexes = (tableState.indexes ?? []).map((i) => ({\n columns: i.columns,\n ...(i.name ? { name: i.name } : {}),\n }));\n\n // Build foreign keys from table state\n const foreignKeys = (tableState.foreignKeys ?? []).map((fk) => ({\n columns: fk.columns,\n references: fk.references,\n ...(fk.name ? { name: fk.name } : {}),\n }));\n\n const table = {\n columns: columns as {\n [K in keyof ColumnDefs]: BuildStorageColumn<\n ColumnDefs[K]['nullable'] & boolean,\n ColumnDefs[K]['type']\n >;\n },\n uniques,\n indexes,\n foreignKeys,\n ...(tableState.primaryKey\n ? {\n primaryKey: {\n columns: tableState.primaryKey,\n ...(tableState.primaryKeyName ? { name: tableState.primaryKeyName } : {}),\n },\n }\n : {}),\n } as unknown as BuildStorageTable<TableKey & string, ColumnDefs, PrimaryKey>;\n\n (storageTables as Mutable<BuildStorageTables<Tables>>)[tableName] = table;\n }\n\n const storage = { tables: storageTables as BuildStorageTables<Tables> } as BuildStorage<Tables>;\n\n // Build models - construct as partial first, then assert full type\n const modelsPartial: Partial<BuildModels<Models>> = {};\n\n // Iterate over models - TypeScript will see keys as string, but type assertion preserves literals\n for (const modelName in this.state.models) {\n const modelState = this.state.models[modelName];\n if (!modelState) continue;\n\n const modelStateTyped = modelState as unknown as {\n name: string;\n table: string;\n fields: Record<string, string>;\n };\n\n // Build fields object\n const fields: Partial<Record<string, ModelField>> = {};\n\n // Iterate over fields\n for (const fieldName in modelStateTyped.fields) {\n const columnName = modelStateTyped.fields[fieldName];\n if (columnName) {\n fields[fieldName] = {\n column: columnName,\n };\n }\n }\n\n // Assign to models - type assertion preserves literal keys\n (modelsPartial as unknown as Record<string, ModelDefinition>)[modelName] = {\n storage: {\n table: modelStateTyped.table,\n },\n fields: fields as Record<string, ModelField>,\n relations: {},\n };\n }\n\n // Build relations object - organized by table name\n const relationsPartial: Partial<Record<string, Record<string, RelationDefinition>>> = {};\n\n // Iterate over models to collect relations\n for (const modelName in this.state.models) {\n const modelState = this.state.models[modelName];\n if (!modelState) continue;\n\n const modelStateTyped = modelState as unknown as {\n name: string;\n table: string;\n fields: Record<string, string>;\n relations: Record<string, RelationDefinition>;\n };\n\n const tableName = modelStateTyped.table;\n if (!tableName) continue;\n\n // Only initialize relations object for this table if it has relations\n if (modelStateTyped.relations && Object.keys(modelStateTyped.relations).length > 0) {\n if (!relationsPartial[tableName]) {\n relationsPartial[tableName] = {};\n }\n\n // Add relations from this model to the table's relations\n const tableRelations = relationsPartial[tableName];\n if (tableRelations) {\n for (const relationName in modelStateTyped.relations) {\n const relation = modelStateTyped.relations[relationName];\n if (relation) {\n tableRelations[relationName] = relation;\n }\n }\n }\n }\n }\n\n const models = modelsPartial as unknown as BuildModels<Models>;\n\n const baseMappings = computeMappings(\n models as unknown as Record<string, ModelDefinition>,\n storage as SqlStorage,\n );\n\n const mappings = {\n ...baseMappings,\n codecTypes: {} as CodecTypes,\n operationTypes: {} as Record<string, never>,\n } as ContractBuilderMappings<CodecTypes>;\n\n const extensionNamespaces = this.state.extensionNamespaces ?? [];\n const extensionPacks: Record<string, unknown> = { ...(this.state.extensionPacks || {}) };\n for (const namespace of extensionNamespaces) {\n if (!Object.hasOwn(extensionPacks, namespace)) {\n extensionPacks[namespace] = {};\n }\n }\n\n // Construct contract with explicit type that matches the generic parameters\n // This ensures TypeScript infers literal types from the generics, not runtime values\n // Always include relations, even if empty (normalized to empty object)\n const contract = {\n schemaVersion: '1' as const,\n target,\n targetFamily: 'sql' as const,\n coreHash: this.state.coreHash || 'sha256:ts-builder-placeholder',\n models,\n relations: relationsPartial,\n storage,\n mappings,\n extensionPacks,\n capabilities: this.state.capabilities || {},\n meta: {},\n sources: {},\n } as unknown as BuiltContract;\n\n return contract as unknown as ReturnType<\n SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >['build']\n >;\n }\n\n override target<T extends string>(\n packRef: TargetPackRef<'sql', T>,\n ): SqlContractBuilder<CodecTypes, T, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {\n return new SqlContractBuilder<\n CodecTypes,\n T,\n Tables,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n target: packRef.targetId,\n });\n }\n\n extensionPacks(\n packs: Record<string, ExtensionPackRef<'sql', string>>,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n if (!this.state.target) {\n throw new Error('extensionPacks() requires target() to be called first');\n }\n\n const namespaces = new Set(this.state.extensionNamespaces ?? []);\n\n for (const packRef of Object.values(packs)) {\n if (!packRef) continue;\n\n if (packRef.kind !== 'extension') {\n throw new Error(\n `extensionPacks() only accepts extension pack refs. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== 'sql') {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but this builder targets \"sql\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== this.state.target) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but builder target is \"${this.state.target}\".`,\n );\n }\n\n namespaces.add(packRef.id);\n }\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n extensionNamespaces: [...namespaces],\n });\n }\n\n override capabilities<C extends Record<string, Record<string, boolean>>>(\n capabilities: C,\n ): SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, C> {\n return new SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, C>({\n ...this.state,\n capabilities,\n });\n }\n\n override coreHash<H extends string>(\n hash: H,\n ): SqlContractBuilder<CodecTypes, Target, Tables, Models, H, ExtensionPacks, Capabilities> {\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models,\n H,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n coreHash: hash,\n });\n }\n\n override table<\n TableName extends string,\n T extends TableBuilder<\n TableName,\n Record<string, ColumnBuilderState<string, boolean, string>>,\n readonly string[] | undefined\n >,\n >(\n name: TableName,\n callback: (t: TableBuilder<TableName>) => T | undefined,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const tableBuilder = createTable(name);\n const result = callback(tableBuilder);\n const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;\n const tableState = finalBuilder.build();\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n tables: { ...this.state.tables, [name]: tableState } as Tables &\n Record<TableName, ReturnType<T['build']>>,\n });\n }\n\n override model<\n ModelName extends string,\n TableName extends string,\n M extends ModelBuilder<\n ModelName,\n TableName,\n Record<string, string>,\n Record<string, RelationDefinition>\n >,\n >(\n name: ModelName,\n table: TableName,\n callback: (\n m: ModelBuilder<ModelName, TableName, Record<string, string>, Record<never, never>>,\n ) => M | undefined,\n ): SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const modelBuilder = new ModelBuilder<ModelName, TableName>(name, table);\n const result = callback(modelBuilder);\n const finalBuilder = result instanceof ModelBuilder ? result : modelBuilder;\n const modelState = finalBuilder.build();\n\n return new SqlContractBuilder<\n CodecTypes,\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >({\n ...this.state,\n models: { ...this.state.models, [name]: modelState } as Models &\n Record<ModelName, ReturnType<M['build']>>,\n });\n }\n}\n\nexport function defineContract<\n CodecTypes extends Record<string, { output: unknown }> = Record<string, never>,\n>(): SqlContractBuilder<CodecTypes> {\n return new SqlContractBuilder<CodecTypes>();\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  computeMappings,
3
3
  validateContract
4
- } from "../chunk-5XCM6ONT.js";
4
+ } from "../chunk-SEOX3AAQ.js";
5
5
  export {
6
6
  computeMappings,
7
7
  validateContract
package/package.json CHANGED
@@ -1,19 +1,18 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-contract-ts",
3
- "version": "0.3.0-pr.90.2",
3
+ "version": "0.3.0-pr.91.2",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "SQL-specific TypeScript contract authoring surface for Prisma Next",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.25",
9
9
  "ts-toolbelt": "^9.6.0",
10
- "@prisma-next/contract": "0.3.0-pr.90.2",
11
- "@prisma-next/contract-authoring": "0.3.0-pr.90.2",
12
- "@prisma-next/sql-contract": "0.3.0-pr.90.2"
10
+ "@prisma-next/contract": "0.3.0-pr.91.2",
11
+ "@prisma-next/sql-contract": "0.3.0-pr.91.2",
12
+ "@prisma-next/contract-authoring": "0.3.0-pr.91.2"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@types/pg": "8.16.0",
16
- "@vitest/coverage-v8": "4.0.16",
17
16
  "pg": "8.16.3",
18
17
  "tsup": "8.5.1",
19
18
  "typescript": "5.9.3",
@@ -44,6 +43,6 @@
44
43
  "lint": "biome check . --error-on-warnings",
45
44
  "lint:fix": "biome check --write .",
46
45
  "lint:fix:unsafe": "biome check --write --unsafe .",
47
- "clean": "node ../../../../scripts/clean.mjs"
46
+ "clean": "rm -rf dist coverage .tmp-output"
48
47
  }
49
48
  }
@@ -79,13 +79,6 @@
79
79
  "additionalProperties": {
80
80
  "$ref": "#/$defs/StorageTable"
81
81
  }
82
- },
83
- "enums": {
84
- "type": "object",
85
- "description": "Enum type definitions keyed by enum type name",
86
- "additionalProperties": {
87
- "$ref": "#/$defs/StorageEnum"
88
- }
89
82
  }
90
83
  },
91
84
  "required": ["tables"]
@@ -138,37 +131,16 @@
138
131
  "description": "Column definition with type and nullability",
139
132
  "additionalProperties": false,
140
133
  "properties": {
141
- "nativeType": {
142
- "type": "string",
143
- "description": "Native database type (e.g., 'text', 'int4', 'timestamptz', 'bool', or enum type name)"
144
- },
145
- "codecId": {
134
+ "type": {
146
135
  "type": "string",
147
- "description": "Codec identifier for type encoding/decoding (e.g., 'pg/text@1', 'pg/enum@1')"
136
+ "description": "Column type (e.g., 'text', 'int4', 'timestamptz', 'bool')"
148
137
  },
149
138
  "nullable": {
150
139
  "type": "boolean",
151
140
  "default": false,
152
141
  "description": "Whether the column allows NULL values"
153
142
  }
154
- },
155
- "required": ["nativeType", "codecId", "nullable"]
156
- },
157
- "StorageEnum": {
158
- "type": "object",
159
- "description": "Enum type definition with ordered values",
160
- "additionalProperties": false,
161
- "properties": {
162
- "values": {
163
- "type": "array",
164
- "description": "Ordered list of enum values",
165
- "items": {
166
- "type": "string"
167
- },
168
- "minItems": 1
169
- }
170
- },
171
- "required": ["values"]
143
+ }
172
144
  },
173
145
  "PrimaryKey": {
174
146
  "type": "object",
@@ -1,7 +1,6 @@
1
1
  import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/contract/framework-components';
2
2
  import type {
3
3
  ColumnBuilderState,
4
- EnumBuilderState,
5
4
  ModelBuilderState,
6
5
  RelationDefinition,
7
6
  TableBuilderState,
@@ -72,13 +71,6 @@ type BuildStorageTable<
72
71
  ? { readonly primaryKey: { readonly columns: PK; readonly name?: string } }
73
72
  : Record<string, never>);
74
73
 
75
- type BuildStorageEnums<Enums extends Record<string, EnumBuilderState<string, readonly string[]>>> =
76
- {
77
- readonly [K in keyof Enums]: {
78
- readonly values: Enums[K]['values'];
79
- };
80
- };
81
-
82
74
  type BuildStorage<
83
75
  Tables extends Record<
84
76
  string,
@@ -88,7 +80,6 @@ type BuildStorage<
88
80
  readonly string[] | undefined
89
81
  >
90
82
  >,
91
- Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>,
92
83
  > = {
93
84
  readonly tables: {
94
85
  readonly [K in keyof Tables]: BuildStorageTable<
@@ -97,7 +88,6 @@ type BuildStorage<
97
88
  ExtractPrimaryKey<Tables[K]>
98
89
  >;
99
90
  };
100
- readonly enums: BuildStorageEnums<Enums>;
101
91
  };
102
92
 
103
93
  type BuildStorageTables<
@@ -138,11 +128,10 @@ class SqlContractBuilder<
138
128
  string,
139
129
  ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>
140
130
  > = Record<never, never>,
141
- Enums extends Record<string, EnumBuilderState<string, readonly string[]>> = Record<never, never>,
142
131
  CoreHash extends string | undefined = undefined,
143
132
  ExtensionPacks extends Record<string, unknown> | undefined = undefined,
144
133
  Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined,
145
- > extends ContractBuilder<Target, Tables, Models, Enums, CoreHash, ExtensionPacks, Capabilities> {
134
+ > extends ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {
146
135
  /**
147
136
  * This method is responsible for normalizing the contract IR by setting default values
148
137
  * for all required fields:
@@ -163,7 +152,7 @@ class SqlContractBuilder<
163
152
  */
164
153
  build(): Target extends string
165
154
  ? SqlContract<
166
- BuildStorage<Tables, Enums>,
155
+ BuildStorage<Tables>,
167
156
  BuildModels<Models>,
168
157
  BuildRelations<Models>,
169
158
  ContractBuilderMappings<CodecTypes>
@@ -182,7 +171,7 @@ class SqlContractBuilder<
182
171
  // Type helper to ensure literal types are preserved in return type
183
172
  type BuiltContract = Target extends string
184
173
  ? SqlContract<
185
- BuildStorage<Tables, Enums>,
174
+ BuildStorage<Tables>,
186
175
  BuildModels<Models>,
187
176
  BuildRelations<Models>,
188
177
  ContractBuilderMappings<CodecTypes>
@@ -280,21 +269,7 @@ class SqlContractBuilder<
280
269
  (storageTables as Mutable<BuildStorageTables<Tables>>)[tableName] = table;
281
270
  }
282
271
 
283
- // Build enums from state
284
- const storageEnums = {} as Mutable<BuildStorageEnums<Enums>>;
285
- for (const enumName of Object.keys(this.state.enums) as Array<keyof Enums & string>) {
286
- const enumState = this.state.enums[enumName];
287
- if (!enumState) continue;
288
-
289
- storageEnums[enumName] = {
290
- values: enumState.values,
291
- } as BuildStorageEnums<Enums>[typeof enumName];
292
- }
293
-
294
- const storage = {
295
- tables: storageTables as BuildStorageTables<Tables>,
296
- enums: storageEnums as BuildStorageEnums<Enums>,
297
- } as BuildStorage<Tables, Enums>;
272
+ const storage = { tables: storageTables as BuildStorageTables<Tables> } as BuildStorage<Tables>;
298
273
 
299
274
  // Build models - construct as partial first, then assert full type
300
275
  const modelsPartial: Partial<BuildModels<Models>> = {};
@@ -415,7 +390,6 @@ class SqlContractBuilder<
415
390
  Target,
416
391
  Tables,
417
392
  Models,
418
- Enums,
419
393
  CoreHash,
420
394
  ExtensionPacks,
421
395
  Capabilities
@@ -425,22 +399,12 @@ class SqlContractBuilder<
425
399
 
426
400
  override target<T extends string>(
427
401
  packRef: TargetPackRef<'sql', T>,
428
- ): SqlContractBuilder<
429
- CodecTypes,
430
- T,
431
- Tables,
432
- Models,
433
- Enums,
434
- CoreHash,
435
- ExtensionPacks,
436
- Capabilities
437
- > {
402
+ ): SqlContractBuilder<CodecTypes, T, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {
438
403
  return new SqlContractBuilder<
439
404
  CodecTypes,
440
405
  T,
441
406
  Tables,
442
407
  Models,
443
- Enums,
444
408
  CoreHash,
445
409
  ExtensionPacks,
446
410
  Capabilities
@@ -457,7 +421,6 @@ class SqlContractBuilder<
457
421
  Target,
458
422
  Tables,
459
423
  Models,
460
- Enums,
461
424
  CoreHash,
462
425
  ExtensionPacks,
463
426
  Capabilities
@@ -497,7 +460,6 @@ class SqlContractBuilder<
497
460
  Target,
498
461
  Tables,
499
462
  Models,
500
- Enums,
501
463
  CoreHash,
502
464
  ExtensionPacks,
503
465
  Capabilities
@@ -509,17 +471,8 @@ class SqlContractBuilder<
509
471
 
510
472
  override capabilities<C extends Record<string, Record<string, boolean>>>(
511
473
  capabilities: C,
512
- ): SqlContractBuilder<CodecTypes, Target, Tables, Models, Enums, CoreHash, ExtensionPacks, C> {
513
- return new SqlContractBuilder<
514
- CodecTypes,
515
- Target,
516
- Tables,
517
- Models,
518
- Enums,
519
- CoreHash,
520
- ExtensionPacks,
521
- C
522
- >({
474
+ ): SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, C> {
475
+ return new SqlContractBuilder<CodecTypes, Target, Tables, Models, CoreHash, ExtensionPacks, C>({
523
476
  ...this.state,
524
477
  capabilities,
525
478
  });
@@ -527,22 +480,12 @@ class SqlContractBuilder<
527
480
 
528
481
  override coreHash<H extends string>(
529
482
  hash: H,
530
- ): SqlContractBuilder<
531
- CodecTypes,
532
- Target,
533
- Tables,
534
- Models,
535
- Enums,
536
- H,
537
- ExtensionPacks,
538
- Capabilities
539
- > {
483
+ ): SqlContractBuilder<CodecTypes, Target, Tables, Models, H, ExtensionPacks, Capabilities> {
540
484
  return new SqlContractBuilder<
541
485
  CodecTypes,
542
486
  Target,
543
487
  Tables,
544
488
  Models,
545
- Enums,
546
489
  H,
547
490
  ExtensionPacks,
548
491
  Capabilities
@@ -567,7 +510,6 @@ class SqlContractBuilder<
567
510
  Target,
568
511
  Tables & Record<TableName, ReturnType<T['build']>>,
569
512
  Models,
570
- Enums,
571
513
  CoreHash,
572
514
  ExtensionPacks,
573
515
  Capabilities
@@ -582,7 +524,6 @@ class SqlContractBuilder<
582
524
  Target,
583
525
  Tables & Record<TableName, ReturnType<T['build']>>,
584
526
  Models,
585
- Enums,
586
527
  CoreHash,
587
528
  ExtensionPacks,
588
529
  Capabilities
@@ -613,7 +554,6 @@ class SqlContractBuilder<
613
554
  Target,
614
555
  Tables,
615
556
  Models & Record<ModelName, ReturnType<M['build']>>,
616
- Enums,
617
557
  CoreHash,
618
558
  ExtensionPacks,
619
559
  Capabilities
@@ -628,7 +568,6 @@ class SqlContractBuilder<
628
568
  Target,
629
569
  Tables,
630
570
  Models & Record<ModelName, ReturnType<M['build']>>,
631
- Enums,
632
571
  CoreHash,
633
572
  ExtensionPacks,
634
573
  Capabilities
@@ -638,45 +577,6 @@ class SqlContractBuilder<
638
577
  Record<ModelName, ReturnType<M['build']>>,
639
578
  });
640
579
  }
641
-
642
- /**
643
- * Define an enum type with ordered values.
644
- * @param name The name of the enum type (e.g., 'Role', 'Status')
645
- * @param values The ordered list of enum values (e.g., ['USER', 'ADMIN'])
646
- */
647
- override enum<EnumName extends string, Values extends readonly [string, ...string[]]>(
648
- name: EnumName,
649
- values: Values,
650
- ): SqlContractBuilder<
651
- CodecTypes,
652
- Target,
653
- Tables,
654
- Models,
655
- Enums & Record<EnumName, EnumBuilderState<EnumName, Values>>,
656
- CoreHash,
657
- ExtensionPacks,
658
- Capabilities
659
- > {
660
- const enumState: EnumBuilderState<EnumName, Values> = {
661
- name,
662
- values,
663
- };
664
-
665
- return new SqlContractBuilder<
666
- CodecTypes,
667
- Target,
668
- Tables,
669
- Models,
670
- Enums & Record<EnumName, EnumBuilderState<EnumName, Values>>,
671
- CoreHash,
672
- ExtensionPacks,
673
- Capabilities
674
- >({
675
- ...this.state,
676
- enums: { ...this.state.enums, [name]: enumState } as Enums &
677
- Record<EnumName, EnumBuilderState<EnumName, Values>>,
678
- });
679
- }
680
580
  }
681
581
 
682
582
  export function defineContract<
package/src/contract.ts CHANGED
@@ -10,7 +10,6 @@ import type {
10
10
  SqlMappings,
11
11
  SqlStorage,
12
12
  StorageColumn,
13
- StorageEnum,
14
13
  StorageTable,
15
14
  UniqueConstraint,
16
15
  } from '@prisma-next/sql-contract/types';
@@ -61,13 +60,8 @@ const StorageTableSchema = type.declare<StorageTable>().type({
61
60
  foreignKeys: ForeignKeySchema.array().readonly(),
62
61
  });
63
62
 
64
- const StorageEnumSchema = type.declare<StorageEnum>().type({
65
- values: type.string.array().readonly(),
66
- });
67
-
68
63
  const StorageSchema = type.declare<SqlStorage>().type({
69
64
  tables: type({ '[string]': StorageTableSchema }),
70
- 'enums?': type({ '[string]': StorageEnumSchema }),
71
65
  });
72
66
 
73
67
  const ModelFieldSchema = type.declare<ModelField>().type({
@@ -433,13 +427,6 @@ export function normalizeContract(contract: unknown): SqlContract<SqlStorage> {
433
427
  normalizedStorage = {
434
428
  ...storage,
435
429
  tables: normalizedTables,
436
- enums: storage['enums'] ?? {},
437
- };
438
- } else {
439
- // Storage exists but has no tables - still normalize enums
440
- normalizedStorage = {
441
- ...storage,
442
- enums: storage['enums'] ?? {},
443
430
  };
444
431
  }
445
432
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contract.ts"],"sourcesContent":["import type {\n ForeignKey,\n ForeignKeyReferences,\n Index,\n ModelDefinition,\n ModelField,\n ModelStorage,\n PrimaryKey,\n SqlContract,\n SqlMappings,\n SqlStorage,\n StorageColumn,\n StorageEnum,\n StorageTable,\n UniqueConstraint,\n} from '@prisma-next/sql-contract/types';\nimport { type } from 'arktype';\nimport type { O } from 'ts-toolbelt';\n\n/**\n * Structural validation schema for SqlContract using Arktype.\n * This validates the shape and types of the contract structure.\n */\nconst StorageColumnSchema = type.declare<StorageColumn>().type({\n nativeType: 'string',\n codecId: 'string',\n nullable: 'boolean',\n});\n\nconst PrimaryKeySchema = type.declare<PrimaryKey>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst UniqueConstraintSchema = type.declare<UniqueConstraint>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst IndexSchema = type.declare<Index>().type({\n columns: type.string.array().readonly(),\n 'name?': 'string',\n});\n\nconst ForeignKeyReferencesSchema = type.declare<ForeignKeyReferences>().type({\n table: 'string',\n columns: type.string.array().readonly(),\n});\n\nconst ForeignKeySchema = type.declare<ForeignKey>().type({\n columns: type.string.array().readonly(),\n references: ForeignKeyReferencesSchema,\n 'name?': 'string',\n});\n\nconst StorageTableSchema = type.declare<StorageTable>().type({\n columns: type({ '[string]': StorageColumnSchema }),\n 'primaryKey?': PrimaryKeySchema,\n uniques: UniqueConstraintSchema.array().readonly(),\n indexes: IndexSchema.array().readonly(),\n foreignKeys: ForeignKeySchema.array().readonly(),\n});\n\nconst StorageEnumSchema = type.declare<StorageEnum>().type({\n values: type.string.array().readonly(),\n});\n\nconst StorageSchema = type.declare<SqlStorage>().type({\n tables: type({ '[string]': StorageTableSchema }),\n 'enums?': type({ '[string]': StorageEnumSchema }),\n});\n\nconst ModelFieldSchema = type.declare<ModelField>().type({\n column: 'string',\n});\n\nconst ModelStorageSchema = type.declare<ModelStorage>().type({\n table: 'string',\n});\n\nconst ModelSchema = type.declare<ModelDefinition>().type({\n storage: ModelStorageSchema,\n fields: type({ '[string]': ModelFieldSchema }),\n relations: type({ '[string]': 'unknown' }),\n});\n\n/**\n * Complete SqlContract schema for structural validation.\n * This validates the entire contract structure at once.\n */\nconst SqlContractSchema = type({\n 'schemaVersion?': \"'1'\",\n target: 'string',\n targetFamily: \"'sql'\",\n coreHash: 'string',\n 'profileHash?': 'string',\n 'capabilities?': 'Record<string, Record<string, boolean>>',\n 'extensionPacks?': 'Record<string, unknown>',\n 'meta?': 'Record<string, unknown>',\n 'sources?': 'Record<string, unknown>',\n models: type({ '[string]': ModelSchema }),\n storage: StorageSchema,\n});\n\n/**\n * Validates the structural shape of a SqlContract using Arktype.\n *\n * **Responsibility: Validation Only**\n * This function validates that the contract has the correct structure and types.\n * It does NOT normalize the contract - normalization must happen in the contract builder.\n *\n * The contract passed to this function must already be normalized (all required fields present).\n * If normalization is needed, it should be done by the contract builder before calling this function.\n *\n * This ensures all required fields are present and have the correct types.\n *\n * @param value - The contract value to validate (typically from a JSON import)\n * @returns The validated contract if structure is valid\n * @throws Error if the contract structure is invalid\n */\nfunction validateContractStructure<T extends SqlContract<SqlStorage>>(\n value: unknown,\n): O.Overwrite<T, { targetFamily: 'sql' }> {\n // Check targetFamily first to provide a clear error message for unsupported target families\n const rawValue = value as { targetFamily?: string };\n if (rawValue.targetFamily !== undefined && rawValue.targetFamily !== 'sql') {\n /* c8 ignore next */\n throw new Error(`Unsupported target family: ${rawValue.targetFamily}`);\n }\n\n const contractResult = SqlContractSchema(value);\n\n if (contractResult instanceof type.errors) {\n const messages = contractResult.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Contract structural validation failed: ${messages}`);\n }\n\n // After validation, contractResult matches the schema and preserves the input structure\n // TypeScript needs an assertion here due to exactOptionalPropertyTypes differences\n // between Arktype's inferred type and the generic T, but runtime-wise they're compatible\n return contractResult as O.Overwrite<T, { targetFamily: 'sql' }>;\n}\n\n/**\n * Computes mapping dictionaries from models and storage structures.\n * Assumes valid input - validation happens separately in validateContractLogic().\n *\n * @param models - Models object from contract\n * @param storage - Storage object from contract\n * @param existingMappings - Existing mappings from contract input (optional)\n * @returns Computed mappings dictionary\n */\nexport function computeMappings(\n models: Record<string, ModelDefinition>,\n _storage: SqlStorage,\n existingMappings?: Partial<SqlMappings>,\n): SqlMappings {\n const modelToTable: Record<string, string> = {};\n const tableToModel: Record<string, string> = {};\n const fieldToColumn: Record<string, Record<string, string>> = {};\n const columnToField: Record<string, Record<string, string>> = {};\n\n for (const [modelName, model] of Object.entries(models)) {\n const tableName = model.storage.table;\n modelToTable[modelName] = tableName;\n tableToModel[tableName] = modelName;\n\n const modelFieldToColumn: Record<string, string> = {};\n for (const [fieldName, field] of Object.entries(model.fields)) {\n const columnName = field.column;\n modelFieldToColumn[fieldName] = columnName;\n\n if (!columnToField[tableName]) {\n columnToField[tableName] = {};\n }\n columnToField[tableName][columnName] = fieldName;\n }\n fieldToColumn[modelName] = modelFieldToColumn;\n }\n\n // Preserve existing mappings if provided, otherwise use computed ones\n return {\n modelToTable: existingMappings?.modelToTable ?? modelToTable,\n tableToModel: existingMappings?.tableToModel ?? tableToModel,\n fieldToColumn: existingMappings?.fieldToColumn ?? fieldToColumn,\n columnToField: existingMappings?.columnToField ?? columnToField,\n codecTypes: existingMappings?.codecTypes ?? {},\n operationTypes: existingMappings?.operationTypes ?? {},\n };\n}\n\n/**\n * Validates logical consistency of a **structurally validated** SqlContract.\n * This checks that references (e.g., foreign keys, primary keys, uniques) point to storage objects that already exist.\n * Structural validation is expected to have already completed before this helper runs.\n *\n * @param structurallyValidatedContract - The contract whose structure has already been validated\n * @throws Error if logical validation fails\n */\nfunction validateContractLogic(structurallyValidatedContract: SqlContract<SqlStorage>): void {\n const { storage, models } = structurallyValidatedContract;\n const tableNames = new Set(Object.keys(storage.tables));\n\n // Validate models\n for (const [modelName, modelUnknown] of Object.entries(models)) {\n const model = modelUnknown as ModelDefinition;\n // Validate model has storage.table\n if (!model.storage?.table) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" is missing storage.table`);\n }\n\n const tableName = model.storage.table;\n\n // Validate model's table exists in storage\n if (!tableNames.has(tableName)) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n const table = storage.tables[tableName];\n if (!table) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" references non-existent table \"${tableName}\"`);\n }\n\n // Validate model's table has a primary key\n if (!table.primaryKey) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" table \"${tableName}\" is missing a primary key`);\n }\n\n const columnNames = new Set(Object.keys(table.columns));\n\n // Validate model fields\n if (!model.fields) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" is missing fields`);\n }\n\n for (const [fieldName, fieldUnknown] of Object.entries(model.fields)) {\n const field = fieldUnknown as { column: string };\n // Validate field has column property\n if (!field.column) {\n /* c8 ignore next */\n throw new Error(`Model \"${modelName}\" field \"${fieldName}\" is missing column property`);\n }\n\n // Validate field's column exists in the model's backing table\n if (!columnNames.has(field.column)) {\n /* c8 ignore next */\n throw new Error(\n `Model \"${modelName}\" field \"${fieldName}\" references non-existent column \"${field.column}\" in table \"${tableName}\"`,\n );\n }\n }\n\n // Validate model relations have corresponding foreign keys\n if (model.relations) {\n for (const [relationName, relation] of Object.entries(model.relations)) {\n // For now, we'll do basic validation. Full FK validation can be added later\n // This would require checking that the relation's on.parentCols/childCols match FKs\n if (\n typeof relation === 'object' &&\n relation !== null &&\n 'on' in relation &&\n 'to' in relation\n ) {\n const on = relation.on as { parentCols?: string[]; childCols?: string[] };\n const cardinality = (relation as { cardinality?: string }).cardinality;\n if (on.parentCols && on.childCols) {\n // For 1:N relations, the foreign key is on the child table\n // For N:1 relations, the foreign key is on the parent table (this table)\n // For now, we'll skip validation for 1:N relations as the FK is on the child table\n // and we'll validate it when we process the child model\n if (cardinality === '1:N') {\n // Foreign key is on the child table, skip validation here\n // It will be validated when we process the child model\n continue;\n }\n\n // For N:1 relations, check that there's a foreign key matching this relation\n const hasMatchingFk = table.foreignKeys?.some((fk) => {\n return (\n fk.columns.length === on.childCols?.length &&\n fk.columns.every((col, i) => col === on.childCols?.[i]) &&\n fk.references.table &&\n fk.references.columns.length === on.parentCols?.length &&\n fk.references.columns.every((col, i) => col === on.parentCols?.[i])\n );\n });\n\n if (!hasMatchingFk) {\n /* c8 ignore next */\n throw new Error(\n `Model \"${modelName}\" relation \"${relationName}\" does not have a corresponding foreign key in table \"${tableName}\"`,\n );\n }\n }\n }\n }\n }\n }\n\n for (const [tableName, table] of Object.entries(storage.tables)) {\n const columnNames = new Set(Object.keys(table.columns));\n\n // Validate primaryKey references existing columns\n if (table.primaryKey) {\n for (const colName of table.primaryKey.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" primaryKey references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n // Validate unique constraints reference existing columns\n for (const unique of table.uniques) {\n for (const colName of unique.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" unique constraint references non-existent column \"${colName}\"`,\n );\n }\n }\n }\n\n // Validate indexes reference existing columns\n for (const index of table.indexes) {\n for (const colName of index.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(`Table \"${tableName}\" index references non-existent column \"${colName}\"`);\n }\n }\n }\n\n // Validate foreignKeys reference existing tables and columns\n for (const fk of table.foreignKeys) {\n // Validate FK columns exist in the referencing table\n for (const colName of fk.columns) {\n if (!columnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\"`,\n );\n }\n }\n\n // Validate referenced table exists\n if (!tableNames.has(fk.references.table)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n\n // Validate referenced columns exist in the referenced table\n const referencedTable = storage.tables[fk.references.table];\n if (!referencedTable) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent table \"${fk.references.table}\"`,\n );\n }\n const referencedColumnNames = new Set(Object.keys(referencedTable.columns));\n\n for (const colName of fk.references.columns) {\n if (!referencedColumnNames.has(colName)) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey references non-existent column \"${colName}\" in table \"${fk.references.table}\"`,\n );\n }\n }\n\n if (fk.columns.length !== fk.references.columns.length) {\n /* c8 ignore next */\n throw new Error(\n `Table \"${tableName}\" foreignKey column count (${fk.columns.length}) does not match referenced column count (${fk.references.columns.length})`,\n );\n }\n }\n }\n}\n\nexport function normalizeContract(contract: unknown): SqlContract<SqlStorage> {\n const contractObj = contract as Record<string, unknown>;\n\n // Only normalize if storage exists (validation will catch if it's missing)\n let normalizedStorage = contractObj['storage'];\n if (normalizedStorage && typeof normalizedStorage === 'object' && normalizedStorage !== null) {\n const storage = normalizedStorage as Record<string, unknown>;\n const tables = storage['tables'] as Record<string, unknown> | undefined;\n\n if (tables) {\n // Normalize storage tables\n const normalizedTables: Record<string, unknown> = {};\n for (const [tableName, table] of Object.entries(tables)) {\n const tableObj = table as Record<string, unknown>;\n const columns = tableObj['columns'] as Record<string, unknown> | undefined;\n\n if (columns) {\n // Normalize columns: add nullable: false if missing\n const normalizedColumns: Record<string, unknown> = {};\n for (const [columnName, column] of Object.entries(columns)) {\n const columnObj = column as Record<string, unknown>;\n const normalizedColumn: Record<string, unknown> = {\n ...columnObj,\n nullable: columnObj['nullable'] ?? false,\n };\n\n normalizedColumns[columnName] = normalizedColumn;\n }\n\n // Normalize table arrays: add empty arrays if missing\n normalizedTables[tableName] = {\n ...tableObj,\n columns: normalizedColumns,\n uniques: tableObj['uniques'] ?? [],\n indexes: tableObj['indexes'] ?? [],\n foreignKeys: tableObj['foreignKeys'] ?? [],\n };\n } else {\n normalizedTables[tableName] = tableObj;\n }\n }\n\n normalizedStorage = {\n ...storage,\n tables: normalizedTables,\n enums: storage['enums'] ?? {},\n };\n } else {\n // Storage exists but has no tables - still normalize enums\n normalizedStorage = {\n ...storage,\n enums: storage['enums'] ?? {},\n };\n }\n }\n\n // Only normalize if models exists (validation will catch if it's missing)\n let normalizedModels = contractObj['models'];\n if (normalizedModels && typeof normalizedModels === 'object' && normalizedModels !== null) {\n const models = normalizedModels as Record<string, unknown>;\n const normalizedModelsObj: Record<string, unknown> = {};\n for (const [modelName, model] of Object.entries(models)) {\n const modelObj = model as Record<string, unknown>;\n normalizedModelsObj[modelName] = {\n ...modelObj,\n relations: modelObj['relations'] ?? {},\n };\n }\n normalizedModels = normalizedModelsObj;\n }\n\n // Normalize top-level fields: add empty objects if missing\n return {\n ...contractObj,\n models: normalizedModels,\n relations: contractObj['relations'] ?? {},\n storage: normalizedStorage,\n extensionPacks: contractObj['extensionPacks'] ?? {},\n capabilities: contractObj['capabilities'] ?? {},\n meta: contractObj['meta'] ?? {},\n sources: contractObj['sources'] ?? {},\n } as SqlContract<SqlStorage>;\n}\n\n/**\n * Validates that a JSON import conforms to the SqlContract structure\n * and returns a fully typed SqlContract.\n *\n * This function is specifically for validating JSON imports (e.g., from contract.json).\n * Contracts created via the builder API (defineContract) are already valid and should\n * not be passed to this function - use them directly without validation.\n *\n * Performs both structural validation (using Arktype) and logical validation\n * (ensuring all references are valid).\n *\n *\n * The type parameter `TContract` must be a fully-typed contract type (e.g., from `contract.d.ts`),\n * NOT a generic `SqlContract<SqlStorage>`.\n *\n * **Correct:**\n * ```typescript\n * import type { Contract } from './contract.d';\n * const contract = validateContract<Contract>(contractJson);\n * ```\n *\n * **Incorrect:**\n * ```typescript\n * import type { SqlContract, SqlStorage } from '@prisma-next/sql-contract/types';\n * const contract = validateContract<SqlContract<SqlStorage>>(contractJson);\n * // ❌ Types will be inferred as 'unknown' - this won't work!\n * ```\n *\n * The type parameter provides the specific table structure, column types, and model definitions.\n * This function validates the runtime structure matches the type, but does not infer types\n * from JSON (as JSON imports lose literal type information).\n *\n * @param value - The contract value to validate (must be from a JSON import, not a builder)\n * @returns A validated contract matching the TContract type\n * @throws Error if the contract structure or logic is invalid\n */\nexport function validateContract<TContract extends SqlContract<SqlStorage>>(\n value: unknown,\n): TContract {\n // Normalize contract first (add defaults for missing fields)\n const normalized = normalizeContract(value);\n\n const structurallyValid = validateContractStructure<SqlContract<SqlStorage>>(normalized);\n\n const contractForValidation = structurallyValid as SqlContract<SqlStorage>;\n\n // Validate contract logic (contracts must already have fully qualified type IDs)\n validateContractLogic(contractForValidation);\n\n // Extract existing mappings (optional - will be computed if missing)\n const existingMappings = (contractForValidation as { mappings?: Partial<SqlMappings> }).mappings;\n\n // Compute mappings from models and storage\n const mappings = computeMappings(\n contractForValidation.models as Record<string, ModelDefinition>,\n contractForValidation.storage,\n existingMappings,\n );\n\n // Add default values for optional metadata fields if missing\n const contractWithMappings = {\n ...structurallyValid,\n models: contractForValidation.models,\n relations: contractForValidation.relations,\n storage: contractForValidation.storage,\n mappings,\n };\n\n // Type assertion: The caller provides the strict type via TContract.\n // We validate the structure matches, but the precise types come from contract.d.ts\n return contractWithMappings as TContract;\n}\n"],"mappings":"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","names":[]}