@prisma-next/contract-authoring 0.3.0-pr.87.2 → 0.3.0-pr.87.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -76,15 +76,15 @@ var ModelBuilder = class _ModelBuilder {
76
76
  // src/table-builder.ts
77
77
  var TableBuilder = class _TableBuilder {
78
78
  _state;
79
- constructor(name, columns = {}, primaryKey, primaryKeyName, uniques = [], indexes = [], foreignKeys = []) {
79
+ constructor(options) {
80
80
  this._state = {
81
- name,
82
- columns,
83
- primaryKey,
84
- primaryKeyName,
85
- uniques,
86
- indexes,
87
- foreignKeys
81
+ name: options.name,
82
+ columns: options.columns ?? {},
83
+ primaryKey: options.primaryKey,
84
+ primaryKeyName: options.primaryKeyName,
85
+ uniques: options.uniques ?? [],
86
+ indexes: options.indexes ?? [],
87
+ foreignKeys: options.foreignKeys ?? []
88
88
  };
89
89
  }
90
90
  get _name() {
@@ -105,62 +105,38 @@ var TableBuilder = class _TableBuilder {
105
105
  type: codecId,
106
106
  nativeType
107
107
  };
108
- return new _TableBuilder(
109
- this._name,
110
- { ...this._columns, [name]: columnState },
111
- this._primaryKey,
112
- this._state.primaryKeyName,
113
- this._state.uniques,
114
- this._state.indexes,
115
- this._state.foreignKeys
116
- );
108
+ return new _TableBuilder({
109
+ ...this._state,
110
+ columns: { ...this._columns, [name]: columnState }
111
+ });
117
112
  }
118
113
  primaryKey(columns, name) {
119
- return new _TableBuilder(
120
- this._name,
121
- this._columns,
122
- columns,
123
- name,
124
- this._state.uniques,
125
- this._state.indexes,
126
- this._state.foreignKeys
127
- );
114
+ return new _TableBuilder({
115
+ ...this._state,
116
+ primaryKey: columns,
117
+ primaryKeyName: name
118
+ });
128
119
  }
129
120
  unique(columns, name) {
130
121
  const constraint = name ? { columns, name } : { columns };
131
- return new _TableBuilder(
132
- this._name,
133
- this._columns,
134
- this._primaryKey,
135
- this._state.primaryKeyName,
136
- [...this._state.uniques, constraint],
137
- this._state.indexes,
138
- this._state.foreignKeys
139
- );
122
+ return new _TableBuilder({
123
+ ...this._state,
124
+ uniques: [...this._state.uniques, constraint]
125
+ });
140
126
  }
141
127
  index(columns, name) {
142
128
  const indexDef = name ? { columns, name } : { columns };
143
- return new _TableBuilder(
144
- this._name,
145
- this._columns,
146
- this._primaryKey,
147
- this._state.primaryKeyName,
148
- this._state.uniques,
149
- [...this._state.indexes, indexDef],
150
- this._state.foreignKeys
151
- );
129
+ return new _TableBuilder({
130
+ ...this._state,
131
+ indexes: [...this._state.indexes, indexDef]
132
+ });
152
133
  }
153
134
  foreignKey(columns, references, name) {
154
135
  const fkDef = name ? { columns, references, name } : { columns, references };
155
- return new _TableBuilder(
156
- this._name,
157
- this._columns,
158
- this._primaryKey,
159
- this._state.primaryKeyName,
160
- this._state.uniques,
161
- this._state.indexes,
162
- [...this._state.foreignKeys, fkDef]
163
- );
136
+ return new _TableBuilder({
137
+ ...this._state,
138
+ foreignKeys: [...this._state.foreignKeys, fkDef]
139
+ });
164
140
  }
165
141
  build() {
166
142
  return {
@@ -197,7 +173,7 @@ var ContractBuilder = class _ContractBuilder {
197
173
  });
198
174
  }
199
175
  table(name, callback) {
200
- const tableBuilder = new TableBuilder(name);
176
+ const tableBuilder = new TableBuilder({ name });
201
177
  const result = callback(tableBuilder);
202
178
  const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;
203
179
  const tableState = finalBuilder.build();
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 {\n ColumnBuilderState,\n ColumnTypeDescriptor,\n ForeignKeyDef,\n IndexDef,\n TableBuilderState,\n UniqueConstraintDef,\n} from './builder-state';\n\ninterface TableBuilderInternalState<\n Name extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,\n PrimaryKey extends readonly string[] | undefined,\n> {\n readonly name: Name;\n readonly columns: Columns;\n readonly primaryKey: PrimaryKey;\n readonly primaryKeyName: string | undefined;\n readonly uniques: readonly UniqueConstraintDef[];\n readonly indexes: readonly IndexDef[];\n readonly foreignKeys: readonly ForeignKeyDef[];\n}\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 _state: TableBuilderInternalState<Name, Columns, PrimaryKey>;\n\n constructor(\n name: Name,\n columns: Columns = {} as Columns,\n primaryKey?: PrimaryKey,\n primaryKeyName?: string,\n uniques: readonly UniqueConstraintDef[] = [],\n indexes: readonly IndexDef[] = [],\n foreignKeys: readonly ForeignKeyDef[] = [],\n ) {\n this._state = {\n name,\n columns,\n primaryKey: primaryKey as PrimaryKey,\n primaryKeyName,\n uniques,\n indexes,\n foreignKeys,\n };\n }\n\n private get _name(): Name {\n return this._state.name;\n }\n\n private get _columns(): Columns {\n return this._state.columns;\n }\n\n private get _primaryKey(): PrimaryKey {\n return this._state.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 this._state.primaryKeyName,\n this._state.uniques,\n this._state.indexes,\n this._state.foreignKeys,\n );\n }\n\n primaryKey<PK extends readonly string[]>(\n columns: PK,\n name?: string,\n ): TableBuilder<Name, Columns, PK> {\n return new TableBuilder(\n this._name,\n this._columns,\n columns,\n name,\n this._state.uniques,\n this._state.indexes,\n this._state.foreignKeys,\n );\n }\n\n unique(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n const constraint: UniqueConstraintDef = name ? { columns, name } : { columns };\n return new TableBuilder(\n this._name,\n this._columns,\n this._primaryKey,\n this._state.primaryKeyName,\n [...this._state.uniques, constraint],\n this._state.indexes,\n this._state.foreignKeys,\n );\n }\n\n index(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n const indexDef: IndexDef = name ? { columns, name } : { columns };\n return new TableBuilder(\n this._name,\n this._columns,\n this._primaryKey,\n this._state.primaryKeyName,\n this._state.uniques,\n [...this._state.indexes, indexDef],\n this._state.foreignKeys,\n );\n }\n\n foreignKey(\n columns: readonly string[],\n references: { table: string; columns: readonly string[] },\n name?: string,\n ): TableBuilder<Name, Columns, PrimaryKey> {\n const fkDef: ForeignKeyDef = name ? { columns, references, name } : { columns, references };\n return new TableBuilder(\n this._name,\n this._columns,\n this._primaryKey,\n this._state.primaryKeyName,\n this._state.uniques,\n this._state.indexes,\n [...this._state.foreignKeys, fkDef],\n );\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 ...(this._state.primaryKeyName !== undefined\n ? { primaryKeyName: this._state.primaryKeyName }\n : {}),\n uniques: this._state.uniques,\n indexes: this._state.indexes,\n foreignKeys: this._state.foreignKeys,\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":[]}
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 {\n ColumnBuilderState,\n ColumnTypeDescriptor,\n ForeignKeyDef,\n IndexDef,\n TableBuilderState,\n UniqueConstraintDef,\n} from './builder-state';\n\ninterface TableBuilderInternalState<\n Name extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,\n PrimaryKey extends readonly string[] | undefined,\n> {\n readonly name: Name;\n readonly columns: Columns;\n readonly primaryKey: PrimaryKey;\n readonly primaryKeyName: string | undefined;\n readonly uniques: readonly UniqueConstraintDef[];\n readonly indexes: readonly IndexDef[];\n readonly foreignKeys: readonly ForeignKeyDef[];\n}\n\ntype TableBuilderOptions<\n Name extends string,\n Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,\n PrimaryKey extends readonly string[] | undefined,\n> = Partial<Omit<TableBuilderInternalState<Name, Columns, PrimaryKey>, 'name'>> & { name: Name };\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 _state: TableBuilderInternalState<Name, Columns, PrimaryKey>;\n\n constructor(options: TableBuilderOptions<Name, Columns, PrimaryKey>) {\n this._state = {\n name: options.name,\n columns: (options.columns ?? {}) as Columns,\n primaryKey: options.primaryKey as PrimaryKey,\n primaryKeyName: options.primaryKeyName,\n uniques: options.uniques ?? [],\n indexes: options.indexes ?? [],\n foreignKeys: options.foreignKeys ?? [],\n };\n }\n\n private get _name(): Name {\n return this._state.name;\n }\n\n private get _columns(): Columns {\n return this._state.columns;\n }\n\n private get _primaryKey(): PrimaryKey {\n return this._state.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._state,\n columns: { ...this._columns, [name]: columnState } as Columns &\n Record<\n ColName,\n ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>\n >,\n });\n }\n\n primaryKey<PK extends readonly string[]>(\n columns: PK,\n name?: string,\n ): TableBuilder<Name, Columns, PK> {\n return new TableBuilder({\n ...this._state,\n primaryKey: columns,\n primaryKeyName: name,\n });\n }\n\n unique(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n const constraint: UniqueConstraintDef = name ? { columns, name } : { columns };\n return new TableBuilder({\n ...this._state,\n uniques: [...this._state.uniques, constraint],\n });\n }\n\n index(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {\n const indexDef: IndexDef = name ? { columns, name } : { columns };\n return new TableBuilder({\n ...this._state,\n indexes: [...this._state.indexes, indexDef],\n });\n }\n\n foreignKey(\n columns: readonly string[],\n references: { table: string; columns: readonly string[] },\n name?: string,\n ): TableBuilder<Name, Columns, PrimaryKey> {\n const fkDef: ForeignKeyDef = name ? { columns, references, name } : { columns, references };\n return new TableBuilder({\n ...this._state,\n foreignKeys: [...this._state.foreignKeys, fkDef],\n });\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 ...(this._state.primaryKeyName !== undefined\n ? { primaryKeyName: this._state.primaryKeyName }\n : {}),\n uniques: this._state.uniques,\n indexes: this._state.indexes,\n foreignKeys: this._state.foreignKeys,\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":[]}
@@ -1,7 +1,19 @@
1
1
  import type { ColumnBuilderState, ColumnTypeDescriptor, ForeignKeyDef, IndexDef, TableBuilderState, UniqueConstraintDef } from './builder-state';
2
+ interface TableBuilderInternalState<Name extends string, Columns extends Record<string, ColumnBuilderState<string, boolean, string>>, PrimaryKey extends readonly string[] | undefined> {
3
+ readonly name: Name;
4
+ readonly columns: Columns;
5
+ readonly primaryKey: PrimaryKey;
6
+ readonly primaryKeyName: string | undefined;
7
+ readonly uniques: readonly UniqueConstraintDef[];
8
+ readonly indexes: readonly IndexDef[];
9
+ readonly foreignKeys: readonly ForeignKeyDef[];
10
+ }
11
+ type TableBuilderOptions<Name extends string, Columns extends Record<string, ColumnBuilderState<string, boolean, string>>, PrimaryKey extends readonly string[] | undefined> = Partial<Omit<TableBuilderInternalState<Name, Columns, PrimaryKey>, 'name'>> & {
12
+ name: Name;
13
+ };
2
14
  export declare class TableBuilder<Name extends string, Columns extends Record<string, ColumnBuilderState<string, boolean, string>> = Record<never, ColumnBuilderState<string, boolean, string>>, PrimaryKey extends readonly string[] | undefined = undefined> {
3
15
  private readonly _state;
4
- constructor(name: Name, columns?: Columns, primaryKey?: PrimaryKey, primaryKeyName?: string, uniques?: readonly UniqueConstraintDef[], indexes?: readonly IndexDef[], foreignKeys?: readonly ForeignKeyDef[]);
16
+ constructor(options: TableBuilderOptions<Name, Columns, PrimaryKey>);
5
17
  private get _name();
6
18
  private get _columns();
7
19
  private get _primaryKey();
@@ -18,4 +30,5 @@ export declare class TableBuilder<Name extends string, Columns extends Record<st
18
30
  }, name?: string): TableBuilder<Name, Columns, PrimaryKey>;
19
31
  build(): TableBuilderState<Name, Columns, PrimaryKey>;
20
32
  }
33
+ export {};
21
34
  //# sourceMappingURL=table-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../src/table-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAgBzB,qBAAa,YAAY,CACvB,IAAI,SAAS,MAAM,EACnB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAClF,KAAK,EACL,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAC5C,EACD,UAAU,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;gBAG5E,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,OAAuB,EAChC,UAAU,CAAC,EAAE,UAAU,EACvB,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,GAAE,SAAS,mBAAmB,EAAO,EAC5C,OAAO,GAAE,SAAS,QAAQ,EAAO,EACjC,WAAW,GAAE,SAAS,aAAa,EAAO;IAa5C,OAAO,KAAK,KAAK,GAEhB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,MAAM,CACJ,OAAO,SAAS,MAAM,EACtB,UAAU,SAAS,oBAAoB,EACvC,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,SAAS,EAEhD,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;QACP,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,GACA,YAAY,CACb,IAAI,EACJ,OAAO,GACL,MAAM,CACJ,OAAO,EACP,kBAAkB,CAAC,OAAO,EAAE,QAAQ,SAAS,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CACzF,EACH,UAAU,CACX;IAyBD,UAAU,CAAC,EAAE,SAAS,SAAS,MAAM,EAAE,EACrC,OAAO,EAAE,EAAE,EACX,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IAYlC,MAAM,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;IAa1F,KAAK,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;IAazF,UAAU,CACR,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EACzD,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;IAa1C,KAAK,IAAI,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;CAatD"}
1
+ {"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../src/table-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@prisma-next/contract-authoring",
3
- "version": "0.3.0-pr.87.2",
3
+ "version": "0.3.0-pr.87.4",
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.3.0-pr.87.2"
9
+ "@prisma-next/contract": "0.3.0-pr.87.4"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@vitest/coverage-v8": "4.0.16",
@@ -83,7 +83,7 @@ export class ContractBuilder<
83
83
  ExtensionPacks,
84
84
  Capabilities
85
85
  > {
86
- const tableBuilder = new TableBuilder<TableName>(name);
86
+ const tableBuilder = new TableBuilder<TableName>({ name });
87
87
  const result = callback(tableBuilder);
88
88
  const finalBuilder = result instanceof TableBuilder ? result : tableBuilder;
89
89
  const tableState = finalBuilder.build();
@@ -21,6 +21,12 @@ interface TableBuilderInternalState<
21
21
  readonly foreignKeys: readonly ForeignKeyDef[];
22
22
  }
23
23
 
24
+ type TableBuilderOptions<
25
+ Name extends string,
26
+ Columns extends Record<string, ColumnBuilderState<string, boolean, string>>,
27
+ PrimaryKey extends readonly string[] | undefined,
28
+ > = Partial<Omit<TableBuilderInternalState<Name, Columns, PrimaryKey>, 'name'>> & { name: Name };
29
+
24
30
  export class TableBuilder<
25
31
  Name extends string,
26
32
  Columns extends Record<string, ColumnBuilderState<string, boolean, string>> = Record<
@@ -31,23 +37,15 @@ export class TableBuilder<
31
37
  > {
32
38
  private readonly _state: TableBuilderInternalState<Name, Columns, PrimaryKey>;
33
39
 
34
- constructor(
35
- name: Name,
36
- columns: Columns = {} as Columns,
37
- primaryKey?: PrimaryKey,
38
- primaryKeyName?: string,
39
- uniques: readonly UniqueConstraintDef[] = [],
40
- indexes: readonly IndexDef[] = [],
41
- foreignKeys: readonly ForeignKeyDef[] = [],
42
- ) {
40
+ constructor(options: TableBuilderOptions<Name, Columns, PrimaryKey>) {
43
41
  this._state = {
44
- name,
45
- columns,
46
- primaryKey: primaryKey as PrimaryKey,
47
- primaryKeyName,
48
- uniques,
49
- indexes,
50
- foreignKeys,
42
+ name: options.name,
43
+ columns: (options.columns ?? {}) as Columns,
44
+ primaryKey: options.primaryKey as PrimaryKey,
45
+ primaryKeyName: options.primaryKeyName,
46
+ uniques: options.uniques ?? [],
47
+ indexes: options.indexes ?? [],
48
+ foreignKeys: options.foreignKeys ?? [],
51
49
  };
52
50
  }
53
51
 
@@ -91,60 +89,41 @@ export class TableBuilder<
91
89
  type: codecId,
92
90
  nativeType,
93
91
  } as ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>;
94
- return new TableBuilder(
95
- this._name,
96
- { ...this._columns, [name]: columnState } as Columns &
92
+ return new TableBuilder({
93
+ ...this._state,
94
+ columns: { ...this._columns, [name]: columnState } as Columns &
97
95
  Record<
98
96
  ColName,
99
97
  ColumnBuilderState<ColName, Nullable extends true ? true : false, Descriptor['codecId']>
100
98
  >,
101
- this._primaryKey,
102
- this._state.primaryKeyName,
103
- this._state.uniques,
104
- this._state.indexes,
105
- this._state.foreignKeys,
106
- );
99
+ });
107
100
  }
108
101
 
109
102
  primaryKey<PK extends readonly string[]>(
110
103
  columns: PK,
111
104
  name?: string,
112
105
  ): TableBuilder<Name, Columns, PK> {
113
- return new TableBuilder(
114
- this._name,
115
- this._columns,
116
- columns,
117
- name,
118
- this._state.uniques,
119
- this._state.indexes,
120
- this._state.foreignKeys,
121
- );
106
+ return new TableBuilder({
107
+ ...this._state,
108
+ primaryKey: columns,
109
+ primaryKeyName: name,
110
+ });
122
111
  }
123
112
 
124
113
  unique(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {
125
114
  const constraint: UniqueConstraintDef = name ? { columns, name } : { columns };
126
- return new TableBuilder(
127
- this._name,
128
- this._columns,
129
- this._primaryKey,
130
- this._state.primaryKeyName,
131
- [...this._state.uniques, constraint],
132
- this._state.indexes,
133
- this._state.foreignKeys,
134
- );
115
+ return new TableBuilder({
116
+ ...this._state,
117
+ uniques: [...this._state.uniques, constraint],
118
+ });
135
119
  }
136
120
 
137
121
  index(columns: readonly string[], name?: string): TableBuilder<Name, Columns, PrimaryKey> {
138
122
  const indexDef: IndexDef = name ? { columns, name } : { columns };
139
- return new TableBuilder(
140
- this._name,
141
- this._columns,
142
- this._primaryKey,
143
- this._state.primaryKeyName,
144
- this._state.uniques,
145
- [...this._state.indexes, indexDef],
146
- this._state.foreignKeys,
147
- );
123
+ return new TableBuilder({
124
+ ...this._state,
125
+ indexes: [...this._state.indexes, indexDef],
126
+ });
148
127
  }
149
128
 
150
129
  foreignKey(
@@ -153,15 +132,10 @@ export class TableBuilder<
153
132
  name?: string,
154
133
  ): TableBuilder<Name, Columns, PrimaryKey> {
155
134
  const fkDef: ForeignKeyDef = name ? { columns, references, name } : { columns, references };
156
- return new TableBuilder(
157
- this._name,
158
- this._columns,
159
- this._primaryKey,
160
- this._state.primaryKeyName,
161
- this._state.uniques,
162
- this._state.indexes,
163
- [...this._state.foreignKeys, fkDef],
164
- );
135
+ return new TableBuilder({
136
+ ...this._state,
137
+ foreignKeys: [...this._state.foreignKeys, fkDef],
138
+ });
165
139
  }
166
140
 
167
141
  build(): TableBuilderState<Name, Columns, PrimaryKey> {