@prisma-next/contract-authoring 0.1.0-pr.65.1 → 0.1.0-pr.65.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.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { TargetPackRef } from '@prisma-next/contract/framework-components';
2
+
1
3
  /**
2
4
  * Column type descriptor containing both codec ID and native type.
3
5
  * Used when defining columns with descriptor objects instead of string IDs.
@@ -36,12 +38,12 @@ interface ModelBuilderState<Name extends string, Table extends string, Fields ex
36
38
  readonly fields: Fields;
37
39
  readonly relations: Relations;
38
40
  }
39
- interface ContractBuilderState<Target extends string | undefined = string | undefined, Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>> = Record<never, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>, Models extends Record<string, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>> = Record<never, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>>, CoreHash extends string | undefined = string | undefined, Extensions extends Record<string, unknown> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> {
41
+ interface ContractBuilderState<Target extends string | undefined = string | undefined, Tables extends Record<string, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>> = Record<never, TableBuilderState<string, Record<string, ColumnBuilderState<string, boolean, string>>, readonly string[] | undefined>>, Models extends Record<string, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>> = Record<never, ModelBuilderState<string, string, Record<string, string>, Record<string, RelationDefinition>>>, CoreHash extends string | undefined = string | undefined, ExtensionPacks extends Record<string, unknown> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> {
40
42
  readonly target?: Target;
41
43
  readonly tables: Tables;
42
44
  readonly models: Models;
43
45
  readonly coreHash?: CoreHash;
44
- readonly extensions?: Extensions;
46
+ readonly extensionPacks?: ExtensionPacks;
45
47
  readonly capabilities?: Capabilities;
46
48
  readonly extensionNamespaces?: readonly string[];
47
49
  }
@@ -107,21 +109,14 @@ declare class TableBuilder<Name extends string, Columns extends Record<string, C
107
109
  build(): TableBuilderState<Name, Columns, PrimaryKey>;
108
110
  }
109
111
 
110
- /**
111
- * Minimal pack ref interface for target selection.
112
- * Family-specific builders can use more specific pack ref types.
113
- */
114
- interface TargetPackRefLike<T extends string = string> {
115
- readonly targetId: T;
116
- }
117
- declare class ContractBuilder<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, Extensions extends Record<string, unknown> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> {
118
- protected readonly state: ContractBuilderState<Target, Tables, Models, CoreHash, Extensions, Capabilities>;
119
- constructor(state?: ContractBuilderState<Target, Tables, Models, CoreHash, Extensions, Capabilities>);
120
- target<T extends string>(targetOrPackRef: T | TargetPackRefLike<T>): ContractBuilder<T, Tables, Models, CoreHash, Extensions, Capabilities>;
121
- capabilities<C extends Record<string, Record<string, boolean>>>(capabilities: C): ContractBuilder<Target, Tables, Models, CoreHash, Extensions, C>;
122
- 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): ContractBuilder<Target, Tables & Record<TableName, ReturnType<T['build']>>, Models, CoreHash, Extensions, Capabilities>;
123
- 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): ContractBuilder<Target, Tables, Models & Record<ModelName, ReturnType<M['build']>>, CoreHash, Extensions, Capabilities>;
124
- coreHash<H extends string>(hash: H): ContractBuilder<Target, Tables, Models, H, Extensions, Capabilities>;
112
+ declare class ContractBuilder<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> {
113
+ protected readonly state: ContractBuilderState<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities>;
114
+ constructor(state?: ContractBuilderState<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities>);
115
+ target<T extends string>(packRef: TargetPackRef<string, T>): ContractBuilder<T, Tables, Models, CoreHash, ExtensionPacks, Capabilities>;
116
+ capabilities<C extends Record<string, Record<string, boolean>>>(capabilities: C): ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, C>;
117
+ 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): ContractBuilder<Target, Tables & Record<TableName, ReturnType<T['build']>>, Models, CoreHash, ExtensionPacks, Capabilities>;
118
+ 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): ContractBuilder<Target, Tables, Models & Record<ModelName, ReturnType<M['build']>>, CoreHash, ExtensionPacks, Capabilities>;
119
+ coreHash<H extends string>(hash: H): ContractBuilder<Target, Tables, Models, H, ExtensionPacks, Capabilities>;
125
120
  }
126
121
  declare function defineContract(): ContractBuilder;
127
122
 
package/dist/index.js CHANGED
@@ -128,11 +128,10 @@ var ContractBuilder = class _ContractBuilder {
128
128
  models: {}
129
129
  };
130
130
  }
131
- target(targetOrPackRef) {
132
- const targetId = typeof targetOrPackRef === "string" ? targetOrPackRef : targetOrPackRef.targetId;
131
+ target(packRef) {
133
132
  return new _ContractBuilder({
134
133
  ...this.state,
135
- target: targetId
134
+ target: packRef.targetId
136
135
  });
137
136
  }
138
137
  capabilities(capabilities) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model-builder.ts","../src/table-builder.ts","../src/contract-builder.ts"],"sourcesContent":["import type { ModelBuilderState, RelationDefinition } from './builder-state';\n\nexport class ModelBuilder<\n Name extends string,\n Table extends string,\n Fields extends Record<string, string> = Record<never, never>,\n Relations extends Record<string, RelationDefinition> = Record<never, never>,\n> {\n private readonly _name: Name;\n private readonly _table: Table;\n private readonly _fields: Fields;\n private readonly _relations: Relations;\n\n constructor(\n name: Name,\n table: Table,\n fields: Fields = {} as Fields,\n relations: Relations = {} as Relations,\n ) {\n this._name = name;\n this._table = table;\n this._fields = fields;\n this._relations = relations;\n }\n\n field<FieldName extends string, ColumnName extends string>(\n fieldName: FieldName,\n columnName: ColumnName,\n ): ModelBuilder<Name, Table, Fields & Record<FieldName, ColumnName>, Relations> {\n return new ModelBuilder(\n this._name,\n this._table,\n {\n ...this._fields,\n [fieldName]: columnName,\n } as Fields & Record<FieldName, ColumnName>,\n this._relations,\n );\n }\n\n relation<RelationName extends string, ToModel extends string, ToTable extends string>(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: '1:1' | '1:N' | 'N:1';\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: ToTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>>;\n relation<\n RelationName extends string,\n ToModel extends string,\n ToTable extends string,\n JunctionTable extends string,\n >(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: 'N:M';\n through: {\n table: JunctionTable;\n parentColumns: readonly string[];\n childColumns: readonly string[];\n };\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: JunctionTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>>;\n relation<\n RelationName extends string,\n ToModel extends string,\n ToTable extends string,\n JunctionTable extends string = never,\n >(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: '1:1' | '1:N' | 'N:1' | 'N:M';\n through?: {\n table: JunctionTable;\n parentColumns: readonly string[];\n childColumns: readonly string[];\n };\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: ToTable | JunctionTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>> {\n // Validate parentTable matches model's table\n if (options.on.parentTable !== this._table) {\n throw new Error(\n `Relation \"${name}\" parentTable \"${options.on.parentTable}\" does not match model table \"${this._table}\"`,\n );\n }\n\n // Validate childTable matches toTable (for non-N:M) or through.table (for N:M)\n if (options.cardinality === 'N:M') {\n if (!options.through) {\n throw new Error(`Relation \"${name}\" with cardinality \"N:M\" requires through field`);\n }\n if (options.on.childTable !== options.through.table) {\n throw new Error(\n `Relation \"${name}\" childTable \"${options.on.childTable}\" does not match through.table \"${options.through.table}\"`,\n );\n }\n } else {\n if (options.on.childTable !== options.toTable) {\n throw new Error(\n `Relation \"${name}\" childTable \"${options.on.childTable}\" does not match toTable \"${options.toTable}\"`,\n );\n }\n }\n\n const relationDef: RelationDefinition = {\n to: options.toModel,\n cardinality: options.cardinality,\n on: {\n parentCols: options.on.parentColumns,\n childCols: options.on.childColumns,\n },\n ...(options.through\n ? {\n through: {\n table: options.through.table,\n parentCols: options.through.parentColumns,\n childCols: options.through.childColumns,\n },\n }\n : undefined),\n };\n\n return new ModelBuilder(this._name, this._table, this._fields, {\n ...this._relations,\n [name]: relationDef,\n } as Relations & Record<RelationName, RelationDefinition>);\n }\n\n build(): ModelBuilderState<Name, Table, Fields, Relations> {\n return {\n name: this._name,\n table: this._table,\n fields: this._fields,\n relations: this._relations,\n };\n }\n}\n","import type { ColumnBuilderState, ColumnTypeDescriptor, TableBuilderState } from './builder-state';\n\nexport class TableBuilder<\n Name extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>> = Record<\n never,\n ColumnBuilderState<string, boolean, string>\n >,\n PrimaryKey extends readonly string[] | undefined = undefined,\n> {\n private readonly _name: Name;\n private readonly _columns: Columns;\n private readonly _primaryKey: PrimaryKey;\n\n constructor(name: Name, columns: Columns = {} as Columns, primaryKey?: PrimaryKey) {\n this._name = name;\n this._columns = columns;\n this._primaryKey = primaryKey as PrimaryKey;\n }\n\n column<\n ColName extends string,\n Descriptor extends ColumnTypeDescriptor,\n Nullable extends boolean | undefined = undefined,\n >(\n name: ColName,\n options: {\n type: Descriptor;\n nullable?: Nullable;\n },\n ): TableBuilder<\n Name,\n Columns &\n Record<\n ColName,\n ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>\n >,\n PrimaryKey\n > {\n const nullable = (options.nullable ?? false) as Nullable extends true ? true : false;\n const { codecId, nativeType } = options.type;\n\n const columnState = {\n name,\n nullable,\n type: codecId,\n nativeType,\n } as ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>;\n return new TableBuilder(\n this._name,\n { ...this._columns, [name]: columnState } as Columns &\n Record<\n ColName,\n ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>\n >,\n this._primaryKey,\n );\n }\n\n primaryKey<PK extends readonly string[]>(\n columns: PK,\n _name?: string,\n ): TableBuilder<Name, Columns, PK> {\n return new TableBuilder(this._name, this._columns, columns);\n }\n\n unique(_columns: readonly string[], _name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n index(_columns: readonly string[], _name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n foreignKey(\n _columns: readonly string[],\n _references: { table: string; columns: readonly string[] },\n _name?: string,\n ): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n build(): TableBuilderState<Name, Columns, PrimaryKey> {\n return {\n name: this._name,\n columns: this._columns,\n ...(this._primaryKey !== undefined ? { primaryKey: this._primaryKey } : {}),\n } as TableBuilderState<Name, Columns, PrimaryKey>;\n }\n}\n","import type {\n ColumnBuilderState,\n ContractBuilderState,\n ModelBuilderState,\n RelationDefinition,\n TableBuilderState,\n} from './builder-state';\nimport { ModelBuilder } from './model-builder';\nimport { TableBuilder } from './table-builder';\n\n/**\n * Minimal pack ref interface for target selection.\n * Family-specific builders can use more specific pack ref types.\n */\nexport interface TargetPackRefLike<T extends string = string> {\n readonly targetId: T;\n}\n\nexport class ContractBuilder<\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 Extensions extends Record<string, unknown> | undefined = undefined,\n Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined,\n> {\n protected readonly state: ContractBuilderState<\n Target,\n Tables,\n Models,\n CoreHash,\n Extensions,\n Capabilities\n >;\n\n constructor(\n state?: ContractBuilderState<Target, Tables, Models, CoreHash, Extensions, Capabilities>,\n ) {\n this.state =\n state ??\n ({\n tables: {},\n models: {},\n } as ContractBuilderState<Target, Tables, Models, CoreHash, Extensions, Capabilities>);\n }\n\n target<T extends string>(\n targetOrPackRef: T | TargetPackRefLike<T>,\n ): ContractBuilder<T, Tables, Models, CoreHash, Extensions, Capabilities> {\n const targetId =\n typeof targetOrPackRef === 'string' ? targetOrPackRef : targetOrPackRef.targetId;\n return new ContractBuilder<T, Tables, Models, CoreHash, Extensions, Capabilities>({\n ...this.state,\n target: targetId,\n });\n }\n\n capabilities<C extends Record<string, Record<string, boolean>>>(\n capabilities: C,\n ): ContractBuilder<Target, Tables, Models, CoreHash, Extensions, C> {\n return new ContractBuilder<Target, Tables, Models, CoreHash, Extensions, C>({\n ...this.state,\n capabilities,\n });\n }\n\n 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 ): ContractBuilder<\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n CoreHash,\n Extensions,\n Capabilities\n > {\n const tableBuilder = new TableBuilder<TableName>(name);\n const result = callback(tableBuilder);\n const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;\n const tableState = finalBuilder.build();\n\n return new ContractBuilder<\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n CoreHash,\n Extensions,\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 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 ): ContractBuilder<\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n CoreHash,\n Extensions,\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 ContractBuilder<\n Target,\n Tables,\n Models & Record<ModelName, ReturnType<M['build']>>,\n CoreHash,\n Extensions,\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 coreHash<H extends string>(\n hash: H,\n ): ContractBuilder<Target, Tables, Models, H, Extensions, Capabilities> {\n return new ContractBuilder<Target, Tables, Models, H, Extensions, Capabilities>({\n ...this.state,\n coreHash: hash,\n });\n }\n}\n\nexport function defineContract(): ContractBuilder {\n return new ContractBuilder();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/model-builder.ts","../src/table-builder.ts","../src/contract-builder.ts"],"sourcesContent":["import type { ModelBuilderState, RelationDefinition } from './builder-state';\n\nexport class ModelBuilder<\n Name extends string,\n Table extends string,\n Fields extends Record<string, string> = Record<never, never>,\n Relations extends Record<string, RelationDefinition> = Record<never, never>,\n> {\n private readonly _name: Name;\n private readonly _table: Table;\n private readonly _fields: Fields;\n private readonly _relations: Relations;\n\n constructor(\n name: Name,\n table: Table,\n fields: Fields = {} as Fields,\n relations: Relations = {} as Relations,\n ) {\n this._name = name;\n this._table = table;\n this._fields = fields;\n this._relations = relations;\n }\n\n field<FieldName extends string, ColumnName extends string>(\n fieldName: FieldName,\n columnName: ColumnName,\n ): ModelBuilder<Name, Table, Fields & Record<FieldName, ColumnName>, Relations> {\n return new ModelBuilder(\n this._name,\n this._table,\n {\n ...this._fields,\n [fieldName]: columnName,\n } as Fields & Record<FieldName, ColumnName>,\n this._relations,\n );\n }\n\n relation<RelationName extends string, ToModel extends string, ToTable extends string>(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: '1:1' | '1:N' | 'N:1';\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: ToTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>>;\n relation<\n RelationName extends string,\n ToModel extends string,\n ToTable extends string,\n JunctionTable extends string,\n >(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: 'N:M';\n through: {\n table: JunctionTable;\n parentColumns: readonly string[];\n childColumns: readonly string[];\n };\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: JunctionTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>>;\n relation<\n RelationName extends string,\n ToModel extends string,\n ToTable extends string,\n JunctionTable extends string = never,\n >(\n name: RelationName,\n options: {\n toModel: ToModel;\n toTable: ToTable;\n cardinality: '1:1' | '1:N' | 'N:1' | 'N:M';\n through?: {\n table: JunctionTable;\n parentColumns: readonly string[];\n childColumns: readonly string[];\n };\n on: {\n parentTable: Table;\n parentColumns: readonly string[];\n childTable: ToTable | JunctionTable;\n childColumns: readonly string[];\n };\n },\n ): ModelBuilder<Name, Table, Fields, Relations & Record<RelationName, RelationDefinition>> {\n // Validate parentTable matches model's table\n if (options.on.parentTable !== this._table) {\n throw new Error(\n `Relation \"${name}\" parentTable \"${options.on.parentTable}\" does not match model table \"${this._table}\"`,\n );\n }\n\n // Validate childTable matches toTable (for non-N:M) or through.table (for N:M)\n if (options.cardinality === 'N:M') {\n if (!options.through) {\n throw new Error(`Relation \"${name}\" with cardinality \"N:M\" requires through field`);\n }\n if (options.on.childTable !== options.through.table) {\n throw new Error(\n `Relation \"${name}\" childTable \"${options.on.childTable}\" does not match through.table \"${options.through.table}\"`,\n );\n }\n } else {\n if (options.on.childTable !== options.toTable) {\n throw new Error(\n `Relation \"${name}\" childTable \"${options.on.childTable}\" does not match toTable \"${options.toTable}\"`,\n );\n }\n }\n\n const relationDef: RelationDefinition = {\n to: options.toModel,\n cardinality: options.cardinality,\n on: {\n parentCols: options.on.parentColumns,\n childCols: options.on.childColumns,\n },\n ...(options.through\n ? {\n through: {\n table: options.through.table,\n parentCols: options.through.parentColumns,\n childCols: options.through.childColumns,\n },\n }\n : undefined),\n };\n\n return new ModelBuilder(this._name, this._table, this._fields, {\n ...this._relations,\n [name]: relationDef,\n } as Relations & Record<RelationName, RelationDefinition>);\n }\n\n build(): ModelBuilderState<Name, Table, Fields, Relations> {\n return {\n name: this._name,\n table: this._table,\n fields: this._fields,\n relations: this._relations,\n };\n }\n}\n","import type { ColumnBuilderState, ColumnTypeDescriptor, TableBuilderState } from './builder-state';\n\nexport class TableBuilder<\n Name extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>> = Record<\n never,\n ColumnBuilderState<string, boolean, string>\n >,\n PrimaryKey extends readonly string[] | undefined = undefined,\n> {\n private readonly _name: Name;\n private readonly _columns: Columns;\n private readonly _primaryKey: PrimaryKey;\n\n constructor(name: Name, columns: Columns = {} as Columns, primaryKey?: PrimaryKey) {\n this._name = name;\n this._columns = columns;\n this._primaryKey = primaryKey as PrimaryKey;\n }\n\n column<\n ColName extends string,\n Descriptor extends ColumnTypeDescriptor,\n Nullable extends boolean | undefined = undefined,\n >(\n name: ColName,\n options: {\n type: Descriptor;\n nullable?: Nullable;\n },\n ): TableBuilder<\n Name,\n Columns &\n Record<\n ColName,\n ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>\n >,\n PrimaryKey\n > {\n const nullable = (options.nullable ?? false) as Nullable extends true ? true : false;\n const { codecId, nativeType } = options.type;\n\n const columnState = {\n name,\n nullable,\n type: codecId,\n nativeType,\n } as ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>;\n return new TableBuilder(\n this._name,\n { ...this._columns, [name]: columnState } as Columns &\n Record<\n ColName,\n ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>\n >,\n this._primaryKey,\n );\n }\n\n primaryKey<PK extends readonly string[]>(\n columns: PK,\n _name?: string,\n ): TableBuilder<Name, Columns, PK> {\n return new TableBuilder(this._name, this._columns, columns);\n }\n\n unique(_columns: readonly string[], _name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n index(_columns: readonly string[], _name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n foreignKey(\n _columns: readonly string[],\n _references: { table: string; columns: readonly string[] },\n _name?: string,\n ): TableBuilder<Name, Columns, PrimaryKey> {\n return this;\n }\n\n build(): TableBuilderState<Name, Columns, PrimaryKey> {\n return {\n name: this._name,\n columns: this._columns,\n ...(this._primaryKey !== undefined ? { primaryKey: this._primaryKey } : {}),\n } as TableBuilderState<Name, Columns, PrimaryKey>;\n }\n}\n","import type { TargetPackRef } from '@prisma-next/contract/framework-components';\nimport type {\n ColumnBuilderState,\n ContractBuilderState,\n ModelBuilderState,\n RelationDefinition,\n TableBuilderState,\n} from './builder-state';\nimport { ModelBuilder } from './model-builder';\nimport { TableBuilder } from './table-builder';\n\nexport class ContractBuilder<\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> {\n protected readonly state: ContractBuilderState<\n Target,\n Tables,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n >;\n\n constructor(\n state?: ContractBuilderState<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities>,\n ) {\n this.state =\n state ??\n ({\n tables: {},\n models: {},\n } as ContractBuilderState<Target, Tables, Models, CoreHash, ExtensionPacks, Capabilities>);\n }\n\n target<T extends string>(\n packRef: TargetPackRef<string, T>,\n ): ContractBuilder<T, Tables, Models, CoreHash, ExtensionPacks, Capabilities> {\n return new ContractBuilder<T, Tables, Models, CoreHash, ExtensionPacks, Capabilities>({\n ...this.state,\n target: packRef.targetId,\n });\n }\n\n capabilities<C extends Record<string, Record<string, boolean>>>(\n capabilities: C,\n ): ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, C> {\n return new ContractBuilder<Target, Tables, Models, CoreHash, ExtensionPacks, C>({\n ...this.state,\n capabilities,\n });\n }\n\n 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 ): ContractBuilder<\n Target,\n Tables & Record<TableName, ReturnType<T['build']>>,\n Models,\n CoreHash,\n ExtensionPacks,\n Capabilities\n > {\n const tableBuilder = new TableBuilder<TableName>(name);\n const result = callback(tableBuilder);\n const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;\n const tableState = finalBuilder.build();\n\n return new ContractBuilder<\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 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 ): ContractBuilder<\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 ContractBuilder<\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 coreHash<H extends string>(\n hash: H,\n ): ContractBuilder<Target, Tables, Models, H, ExtensionPacks, Capabilities> {\n return new ContractBuilder<Target, Tables, Models, H, ExtensionPacks, Capabilities>({\n ...this.state,\n coreHash: hash,\n });\n }\n}\n\nexport function defineContract(): ContractBuilder {\n return new ContractBuilder();\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@prisma-next/contract-authoring",
3
- "version": "0.1.0-pr.65.1",
3
+ "version": "0.1.0-pr.65.2",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Target-agnostic contract authoring builder core for Prisma Next",
7
7
  "dependencies": {
8
8
  "ts-toolbelt": "^9.6.0",
9
- "@prisma-next/contract": "0.1.0-pr.65.1"
9
+ "@prisma-next/contract": "0.1.0-pr.65.2"
10
10
  },
11
11
  "devDependencies": {
12
- "@vitest/coverage-v8": "^2.1.1",
12
+ "@vitest/coverage-v8": "^4.0.0",
13
13
  "tsup": "^8.3.0",
14
14
  "typescript": "^5.9.3",
15
15
  "vitest": "^4.0.16"