orchid-orm 1.31.0 → 1.31.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,4 +1,4 @@
1
- import { Query, SelectableFromShape, CreateMethodsNames, AddQueryDefaults, SetQueryReturnsOne, SetQueryReturnsOneOptional, RelationJoinQuery, UpdateData, WhereArg, CreateData, JoinQueryMethod, DeleteMethodsNames, Db, IsolationLevel, TransactionOptions, Adapter, FromArg, FromResult, AdapterOptions, DbSharedOptions, RelationQuery, ShapeColumnPrimaryKeys, ShapeUniqueColumns, TableDataItemsUniqueColumns, TableDataItemsUniqueColumnTuples, UniqueConstraints, TableDataItemsUniqueConstraints, ComputedColumnsFromOptions, MapTableScopesOption, TableDataItem, ComputedOptionsFactory, QueryData, QueryBase, TableDataFn, DbTableOptionScopes, SqlMethod, DefaultSchemaConfig, DefaultColumnTypes, RelationQueryBase, QueryBeforeHook, QueryAfterHook, AfterHook, WhereResult, MergeQuery } from 'pqb';
1
+ import { Query, SelectableFromShape, CreateMethodsNames, CreateData, AddQueryDefaults, RelationConfigBase, UpdateData, WhereArg, JoinQueryMethod, DeleteMethodsNames, Db, IsolationLevel, TransactionOptions, Adapter, FromArg, FromResult, AdapterOptions, DbSharedOptions, RelationJoinQuery, RelationQuery, RelationsBase, ShapeColumnPrimaryKeys, ShapeUniqueColumns, TableDataItemsUniqueColumns, TableDataItemsUniqueColumnTuples, UniqueConstraints, TableDataItemsUniqueConstraints, ComputedColumnsFromOptions, MapTableScopesOption, TableDataItem, ComputedOptionsFactory, QueryData, QueryBase, TableDataFn, DbTableOptionScopes, SqlMethod, DefaultSchemaConfig, DefaultColumnTypes, QueryBeforeHook, QueryAfterHook, AfterHook, WhereResult, MergeQuery } from 'pqb';
2
2
  export * from 'pqb';
3
3
  import { ColumnsShapeBase, EmptyObject, MaybeArray, CoreQueryScopes, ColumnShapeOutput, ColumnShapeInput, ColumnShapeInputPartial, ColumnSchemaConfig, RecordUnknown, QueryReturnType } from 'orchid-core';
4
4
  export * from 'orchid-core';
@@ -11,48 +11,41 @@ interface RelationRefsOptions<Column extends PropertyKey = string, Ref extends P
11
11
  columns: Column[];
12
12
  references: Ref[];
13
13
  }
14
- interface RelationKeysOptions<PK extends PropertyKey = string, FK extends PropertyKey = string> {
15
- primaryKey: PK;
16
- foreignKey: FK;
17
- }
18
- type RelationRefsOrKeysOptions<Column extends PropertyKey = string, Ref extends PropertyKey = string, PK extends PropertyKey = string, FK extends PropertyKey = string> = RelationRefsOptions<Column, Ref> | RelationKeysOptions<PK, FK>;
19
14
  interface RelationThroughOptions<Through extends PropertyKey = string, Source extends PropertyKey = string> {
20
15
  through: Through;
21
16
  source: Source;
22
17
  }
23
- type RelationHasOptions<Column extends PropertyKey = string, Ref extends PropertyKey = string> = RelationRefsOrKeysOptions<Column, Ref, Column, Ref>;
24
18
 
25
19
  interface HasOne extends RelationThunkBase {
26
20
  type: 'hasOne';
27
21
  options: HasOneOptions;
28
22
  }
29
- type HasOneOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query, Through extends string = string, Source extends string = string> = RelationCommonOptions<Related, Scope> & (RelationHasOptions<keyof Columns, keyof InstanceType<Related>['columns']['shape']> | RelationThroughOptions<Through, Source>);
23
+ type HasOneOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query, Through extends string = string, Source extends string = string> = RelationCommonOptions<Related, Scope> & (RelationRefsOptions<keyof Columns, keyof InstanceType<Related>['columns']['shape']> | RelationThroughOptions<Through, Source>);
30
24
  type HasOneParams<T extends RelationConfigSelf, Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? {
31
25
  [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
32
- } : Relation['options'] extends RelationKeysOptions ? Record<Relation['options']['primaryKey'], T['columns']['shape'][Relation['options']['primaryKey']]['type']> : Relation['options'] extends RelationThroughOptions ? RelationConfigParams<T, T['relations'][Relation['options']['through']]> : never;
33
- interface HasOneInfo<T extends RelationConfigSelf, Name extends keyof T['relations'] & string, TableQuery extends Query, Populate = T['relations'][Name]['options'] extends RelationRefsOptions ? Record<T['relations'][Name]['options']['references'][number], true> : T['relations'][Name]['options'] extends RelationKeysOptions ? Record<T['relations'][Name]['options']['foreignKey'], true> : never, Q extends Query = T['relations'][Name]['options'] extends RelationThroughOptions ? {
26
+ } : Relation['options'] extends RelationThroughOptions ? RelationConfigParams<T, T['relations'][Relation['options']['through']]> : never;
27
+ type HasOnePopulate<T extends RelationConfigSelf, Name extends string> = T['relations'][Name]['options'] extends RelationRefsOptions ? Record<T['relations'][Name]['options']['references'][number], true> : never;
28
+ type HasOneQuery<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = T['relations'][Name]['options'] extends RelationThroughOptions ? {
34
29
  [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
35
30
  as: Name;
36
- defaults: Populate;
31
+ defaults: HasOnePopulate<T, Name>;
37
32
  hasWhere: true;
38
33
  selectable: SelectableFromShape<TableQuery['shape'], Name>;
39
34
  } : K extends 'join' ? RelJoin : K extends CreateMethodsNames ? never : TableQuery[K];
40
35
  } : {
41
36
  [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
42
37
  as: Name;
43
- defaults: Populate;
38
+ defaults: HasOnePopulate<T, Name>;
44
39
  hasWhere: true;
45
40
  selectable: SelectableFromShape<TableQuery['shape'], Name>;
46
41
  } : K extends 'join' ? RelJoin : TableQuery[K];
47
- }, NestedCreateQuery extends Query = T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, Populate>> {
42
+ };
43
+ interface HasOneInfo<T extends RelationConfigSelf, Name extends string, Q extends Query, CD = CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>> extends RelationConfigBase {
48
44
  query: Q;
49
- methodQuery: T['relations'][Name]['options']['required'] extends true ? SetQueryReturnsOne<Q> : SetQueryReturnsOneOptional<Q>;
50
- joinQuery: RelationJoinQuery;
51
- one: true;
52
45
  omitForeignKeyInCreate: never;
53
46
  optionalDataForCreate: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : {
54
47
  [P in Name]?: RelationToOneDataForCreate<{
55
- nestedCreateQuery: NestedCreateQuery;
48
+ nestedCreateQuery: CD;
56
49
  table: Q;
57
50
  }>;
58
51
  };
@@ -65,51 +58,39 @@ interface HasOneInfo<T extends RelationConfigSelf, Name extends keyof T['relatio
65
58
  update: UpdateData<Q>;
66
59
  };
67
60
  dataForUpdateOne: {
61
+ disconnect: boolean;
62
+ } | {
63
+ delete: boolean;
64
+ } | {
65
+ update: UpdateData<Q>;
66
+ } | {
68
67
  set: WhereArg<Q>;
69
68
  } | {
70
69
  upsert: {
71
70
  update: UpdateData<Q>;
72
- create: CreateData<NestedCreateQuery> | (() => CreateData<NestedCreateQuery>);
71
+ create: CD | (() => CD);
73
72
  };
74
73
  } | {
75
- create: CreateData<NestedCreateQuery>;
74
+ create: CD;
76
75
  };
77
- params: HasOneParams<T, T['relations'][Name]>;
78
76
  }
79
77
 
80
78
  interface HasMany extends RelationThunkBase {
81
79
  type: 'hasMany';
82
- options: HasManyOptions;
80
+ options: HasOneOptions;
83
81
  }
84
- type HasManyOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query, Through extends string = string, Source extends string = string> = HasOneOptions<Columns, Related, Scope, Through, Source>;
85
- type HasManyParams<T extends RelationConfigSelf, Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? {
86
- [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
87
- } : Relation['options'] extends RelationKeysOptions ? Record<Relation['options']['primaryKey'], T['columns']['shape'][Relation['options']['primaryKey']]['type']> : Relation['options'] extends RelationThroughOptions ? RelationConfigParams<T, T['relations'][Relation['options']['through']]> : never;
88
- interface HasManyInfo<T extends RelationConfigSelf, Name extends keyof T['relations'] & string, TableQuery extends Query, Populate extends PropertyKey = T['relations'][Name]['options'] extends RelationRefsOptions ? T['relations'][Name]['options']['references'][number] : T['relations'][Name]['options'] extends RelationKeysOptions ? T['relations'][Name]['options']['foreignKey'] : never, Q extends Query = T['relations'][Name]['options'] extends RelationThroughOptions ? {
89
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
90
- as: Name;
91
- defaults: Record<Populate, true>;
92
- hasWhere: true;
93
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
94
- } : K extends 'join' ? RelJoin : K extends CreateMethodsNames ? never : TableQuery[K];
95
- } : {
96
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
97
- as: Name;
98
- defaults: Record<Populate, true>;
99
- hasWhere: true;
100
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
101
- } : K extends 'join' ? RelJoin : TableQuery[K];
102
- }> {
82
+ interface HasManyInfo<T extends RelationConfigSelf, Name extends string, Q extends Query> extends RelationConfigBase {
103
83
  query: Q;
104
- methodQuery: Q;
105
- joinQuery: RelationJoinQuery;
106
- one: false;
107
84
  omitForeignKeyInCreate: never;
108
85
  optionalDataForCreate: {
109
- [P in Name]?: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : RelationToManyDataForCreate<{
110
- nestedCreateQuery: T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, Record<Populate, true>>;
111
- table: Q;
112
- }>;
86
+ [P in Name]?: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : {
87
+ create?: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>[];
88
+ connect?: WhereArg<Q>[];
89
+ connectOrCreate?: {
90
+ where: WhereArg<Q>;
91
+ create: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>;
92
+ }[];
93
+ };
113
94
  };
114
95
  dataForCreate: never;
115
96
  dataForUpdate: {
@@ -121,35 +102,41 @@ interface HasManyInfo<T extends RelationConfigSelf, Name extends keyof T['relati
121
102
  };
122
103
  };
123
104
  dataForUpdateOne: {
105
+ disconnect?: MaybeArray<WhereArg<Q>>;
106
+ delete?: MaybeArray<WhereArg<Q>>;
107
+ update?: {
108
+ where: MaybeArray<WhereArg<Q>>;
109
+ data: UpdateData<Q>;
110
+ };
124
111
  set?: MaybeArray<WhereArg<Q>>;
125
- create?: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, Record<Populate, true>>>[];
112
+ create?: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>[];
126
113
  };
127
- params: HasManyParams<T, T['relations'][Name]>;
128
114
  }
129
115
 
130
- type RelJoin = JoinQueryMethod & (<T extends Query>(this: T) => T);
116
+ interface RelJoin extends JoinQueryMethod {
117
+ <T extends Query>(this: T): T;
118
+ }
131
119
 
132
120
  interface BelongsTo extends RelationThunkBase {
133
121
  type: 'belongsTo';
134
122
  options: BelongsToOptions;
135
123
  }
136
- type BelongsToOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query> = RelationCommonOptions<Related, Scope> & RelationRefsOrKeysOptions<keyof Columns, keyof InstanceType<Related>['columns']['shape'], keyof InstanceType<Related>['columns']['shape'], keyof Columns>;
137
- type BelongsToFKey<Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? Relation['options']['columns'][number] : Relation['options'] extends RelationKeysOptions ? Relation['options']['foreignKey'] : never;
138
- type BelongsToParams<T extends RelationConfigSelf, Relation extends RelationThunkBase> = {
124
+ interface BelongsToOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query> extends RelationCommonOptions<Related, Scope>, RelationRefsOptions<keyof Columns, keyof InstanceType<Related>['columns']['shape']> {
125
+ }
126
+ type BelongsToFKey<Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? Relation['options']['columns'][number] : never;
127
+ type BelongsToParams<T extends RelationConfigSelf, Relation extends BelongsTo> = {
139
128
  [Name in BelongsToFKey<Relation>]: T['columns']['shape'][Name]['type'];
140
129
  };
141
- interface BelongsToInfo<T extends RelationConfigSelf, Name extends keyof T['relations'] & string, TableQuery extends Query, FK extends string, Required, Q extends Query = {
142
- [P in keyof TableQuery]: P extends 'meta' ? // Omit is optimal
143
- Omit<TableQuery['meta'], 'selectable'> & {
130
+ type BelongsToQuery<T extends Query, Name extends string> = {
131
+ [P in keyof T]: P extends 'meta' ? // Omit is optimal
132
+ Omit<T['meta'], 'selectable'> & {
144
133
  as: Name;
145
134
  hasWhere: true;
146
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
147
- } : P extends 'join' ? RelJoin : P extends CreateMethodsNames | DeleteMethodsNames ? never : TableQuery[P];
148
- }> {
135
+ selectable: SelectableFromShape<T['shape'], Name>;
136
+ } : P extends 'join' ? RelJoin : P extends CreateMethodsNames | DeleteMethodsNames ? never : T[P];
137
+ };
138
+ interface BelongsToInfo<T extends RelationConfigSelf, Name extends string, FK extends string, Required, Q extends Query> extends RelationConfigBase {
149
139
  query: Q;
150
- methodQuery: Required extends true ? SetQueryReturnsOne<Q> : SetQueryReturnsOneOptional<Q>;
151
- joinQuery: RelationJoinQuery;
152
- one: true;
153
140
  omitForeignKeyInCreate: FK;
154
141
  dataForCreate: {
155
142
  columns: {
@@ -174,12 +161,21 @@ interface BelongsToInfo<T extends RelationConfigSelf, Name extends keyof T['rela
174
161
  create: CreateData<Q>;
175
162
  };
176
163
  dataForUpdateOne: {
164
+ disconnect: boolean;
165
+ } | {
166
+ set: WhereArg<Q>;
167
+ } | {
168
+ delete: boolean;
169
+ } | {
170
+ update: UpdateData<Q>;
171
+ } | {
172
+ create: CreateData<Q>;
173
+ } | {
177
174
  upsert: {
178
175
  update: UpdateData<Q>;
179
176
  create: CreateData<Q> | (() => CreateData<Q>);
180
177
  };
181
178
  };
182
- params: BelongsToParams<T, T['relations'][Name]>;
183
179
  }
184
180
 
185
181
  declare function transaction<T extends {
@@ -272,7 +268,9 @@ interface HasAndBelongsToMany extends RelationThunkBase {
272
268
  type: 'hasAndBelongsToMany';
273
269
  options: HasAndBelongsToManyOptions;
274
270
  }
275
- type HasAndBelongsToManyOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query> = RelationCommonOptions<Related, Scope> & ({
271
+ interface HasAndBelongsToManyOptions<Columns extends ColumnsShapeBase = ColumnsShapeBase, Related extends TableClass = TableClass, Scope extends Query = Query> {
272
+ scope?: ScopeFn<Related, Scope>;
273
+ required?: boolean;
276
274
  columns: (keyof Columns)[];
277
275
  references: string[];
278
276
  through: {
@@ -280,37 +278,30 @@ type HasAndBelongsToManyOptions<Columns extends ColumnsShapeBase = ColumnsShapeB
280
278
  columns: string[];
281
279
  references: (keyof InstanceType<Related>['columns']['shape'])[];
282
280
  };
283
- } | {
284
- primaryKey: keyof Columns;
285
- foreignKey: string;
286
- joinTable: string;
287
- associationPrimaryKey: string;
288
- associationForeignKey: keyof InstanceType<Related>['columns']['shape'];
289
- });
290
- type HasAndBelongsToManyParams<T extends RelationConfigSelf, Relation extends RelationThunkBase> = Relation['options'] extends {
291
- columns: string[];
292
- } ? {
281
+ }
282
+ type HasAndBelongsToManyParams<T extends RelationConfigSelf, Relation extends HasAndBelongsToMany> = {
293
283
  [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
294
- } : Relation['options'] extends {
295
- primaryKey: string;
296
- } ? Record<Relation['options']['primaryKey'], T['columns']['shape'][Relation['options']['primaryKey']]['type']> : never;
297
- interface HasAndBelongsToManyInfo<T extends RelationConfigSelf, Name extends keyof T['relations'] & string, TableQuery extends Query, Q extends Query = {
284
+ };
285
+ type HasAndBelongsToManyQuery<Name extends string, TableQuery extends Query> = {
298
286
  [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
299
287
  as: Name;
300
288
  hasWhere: true;
301
289
  selectable: SelectableFromShape<TableQuery['shape'], Name>;
302
290
  } : K extends 'join' ? RelJoin : TableQuery[K];
303
- }> {
291
+ };
292
+ interface HasAndBelongsToManyInfo<Name extends string, Q extends Query> extends RelationConfigBase {
304
293
  query: Q;
305
- methodQuery: Q;
306
294
  joinQuery: RelationJoinQuery;
307
- one: false;
308
295
  omitForeignKeyInCreate: never;
309
296
  optionalDataForCreate: {
310
- [P in Name]?: RelationToManyDataForCreate<{
311
- nestedCreateQuery: Q;
312
- table: Q;
313
- }>;
297
+ [P in Name]?: {
298
+ create?: CreateData<Q>[];
299
+ connect?: WhereArg<Q>[];
300
+ connectOrCreate?: {
301
+ where: WhereArg<Q>;
302
+ create: CreateData<Q>;
303
+ }[];
304
+ };
314
305
  };
315
306
  dataForCreate: never;
316
307
  dataForUpdate: {
@@ -323,15 +314,23 @@ interface HasAndBelongsToManyInfo<T extends RelationConfigSelf, Name extends key
323
314
  };
324
315
  create?: CreateData<Q>[];
325
316
  };
326
- dataForUpdateOne: EmptyObject;
327
- params: HasAndBelongsToManyParams<T, T['relations'][Name]>;
317
+ dataForUpdateOne: {
318
+ disconnect?: MaybeArray<WhereArg<Q>>;
319
+ set?: MaybeArray<WhereArg<Q>>;
320
+ delete?: MaybeArray<WhereArg<Q>>;
321
+ update?: {
322
+ where: MaybeArray<WhereArg<Q>>;
323
+ data: UpdateData<Q>;
324
+ };
325
+ create?: CreateData<Q>[];
326
+ };
328
327
  }
329
328
 
330
329
  type RelationToOneDataForCreate<Rel extends {
331
- nestedCreateQuery: Query;
330
+ nestedCreateQuery: unknown;
332
331
  table: Query;
333
332
  }> = {
334
- create: CreateData<Rel['nestedCreateQuery']>;
333
+ create: Rel['nestedCreateQuery'];
335
334
  connect?: never;
336
335
  connectOrCreate?: never;
337
336
  } | {
@@ -343,7 +342,7 @@ type RelationToOneDataForCreate<Rel extends {
343
342
  connect?: never;
344
343
  connectOrCreate: {
345
344
  where: WhereArg<Rel['table']>;
346
- create: CreateData<Rel['nestedCreateQuery']>;
345
+ create: Rel['nestedCreateQuery'];
347
346
  };
348
347
  };
349
348
  type RelationToOneDataForCreateSameQuery<Q extends Query> = {
@@ -362,17 +361,6 @@ type RelationToOneDataForCreateSameQuery<Q extends Query> = {
362
361
  create: CreateData<Q>;
363
362
  };
364
363
  };
365
- type RelationToManyDataForCreate<Rel extends {
366
- nestedCreateQuery: Query;
367
- table: Query;
368
- }> = {
369
- create?: CreateData<Rel['nestedCreateQuery']>[];
370
- connect?: WhereArg<Rel['table']>[];
371
- connectOrCreate?: {
372
- where: WhereArg<Rel['table']>;
373
- create: CreateData<Rel['nestedCreateQuery']>;
374
- }[];
375
- };
376
364
  interface RelationThunkBase {
377
365
  type: string;
378
366
  fn(): TableClass;
@@ -389,10 +377,10 @@ interface RelationConfigSelf {
389
377
  };
390
378
  relations: RelationThunks;
391
379
  }
392
- type RelationConfigParams<T extends RelationConfigSelf, Relation extends RelationThunk> = Relation extends BelongsTo ? BelongsToParams<T, Relation> : Relation extends HasOne ? HasOneParams<T, Relation> : Relation extends HasMany ? HasManyParams<T, Relation> : Relation extends HasAndBelongsToMany ? HasAndBelongsToManyParams<T, Relation> : never;
393
- type MapRelation<T extends RelationConfigSelf, K extends keyof T['relations'] & string> = RelationQuery<T['relations'][K] extends BelongsTo ? BelongsToInfo<T, K, RelationScopeOrTable<T['relations'][K]>, BelongsToFKey<T['relations'][K]>, T['relations'][K]['options']['required']> : T['relations'][K] extends HasOne ? HasOneInfo<T, K, RelationScopeOrTable<T['relations'][K]>> : T['relations'][K] extends HasMany ? HasManyInfo<T, K, RelationScopeOrTable<T['relations'][K]>> : T['relations'][K] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, K, RelationScopeOrTable<T['relations'][K]>> : never>;
380
+ type RelationConfigParams<T extends RelationConfigSelf, Relation extends RelationThunk> = Relation extends BelongsTo ? BelongsToParams<T, Relation> : Relation extends HasOne | HasMany ? HasOneParams<T, Relation> : Relation extends HasAndBelongsToMany ? HasAndBelongsToManyParams<T, Relation> : never;
381
+ type MapRelation<T extends RelationConfigSelf, K extends keyof T['relations'] & string, R extends Query> = T['relations'][K] extends BelongsTo ? RelationQuery<BelongsToInfo<T, K, T['relations'][K]['options']['columns'][number] & string, T['relations'][K]['options']['required'], BelongsToQuery<R, K>>, BelongsToParams<T, T['relations'][K]>, T['relations'][K]['options']['required'], true> : T['relations'][K] extends HasOne ? RelationQuery<HasOneInfo<T, K, HasOneQuery<T, K, RelationScopeOrTable<T['relations'][K]>>>, HasOneParams<T, T['relations'][K]>, T['relations'][K]['options']['required'], true> : T['relations'][K] extends HasMany ? RelationQuery<HasManyInfo<T, K, HasOneQuery<T, K, RelationScopeOrTable<T['relations'][K]>>>, HasOneParams<T, T['relations'][K]>, true, false> : T['relations'][K] extends HasAndBelongsToMany ? RelationQuery<HasAndBelongsToManyInfo<K, HasAndBelongsToManyQuery<K, RelationScopeOrTable<T['relations'][K]>>>, HasAndBelongsToManyParams<T, T['relations'][K]>, true, false> : never;
394
382
  type MapRelations<T> = T extends RelationConfigSelf ? {
395
- [K in keyof T['relations'] & string]: MapRelation<T, K>;
383
+ [K in keyof T['relations'] & string]: MapRelation<T, K, RelationScopeOrTable<T['relations'][K]>>;
396
384
  } : EmptyObject;
397
385
 
398
386
  interface TableClass<T extends Table = Table> {
@@ -402,16 +390,14 @@ interface TableClass<T extends Table = Table> {
402
390
  interface TableClasses {
403
391
  [K: string]: TableClass;
404
392
  }
405
- interface RelationQueriesBase {
406
- [K: string]: RelationQueryBase;
407
- }
408
- interface TableToDb<T extends Table, RelationQueries extends RelationQueriesBase> extends Db<T['table'], T['columns']['shape'], keyof ShapeColumnPrimaryKeys<T['columns']['shape']> extends never ? never : ShapeColumnPrimaryKeys<T['columns']['shape']>, ShapeUniqueColumns<T['columns']['shape']> | TableDataItemsUniqueColumns<T['columns']['shape'], T['columns']['data']>, TableDataItemsUniqueColumnTuples<T['columns']['shape'], T['columns']['data']>, UniqueConstraints<T['columns']['shape']> | TableDataItemsUniqueConstraints<T['columns']['data']>, RelationQueries, T['types'], T['columns']['shape'] & ComputedColumnsFromOptions<T['computed']>, MapTableScopesOption<T['scopes'], T['softDelete']>> {
393
+ interface TableToDb<T extends Table, Relations extends RelationsBase> extends Db<T['table'], T['columns']['shape'], keyof ShapeColumnPrimaryKeys<T['columns']['shape']> extends never ? never : ShapeColumnPrimaryKeys<T['columns']['shape']>, ShapeUniqueColumns<T['columns']['shape']> | TableDataItemsUniqueColumns<T['columns']['shape'], T['columns']['data']>, TableDataItemsUniqueColumnTuples<T['columns']['shape'], T['columns']['data']>, UniqueConstraints<T['columns']['shape']> | TableDataItemsUniqueConstraints<T['columns']['data']>, T['types'], T['columns']['shape'] & ComputedColumnsFromOptions<T['computed']>, MapTableScopesOption<T['scopes'], T['softDelete']>> {
394
+ relations: Relations;
409
395
  definedAs: string;
410
396
  db: OrchidORM;
411
397
  getFilePath(): string;
412
398
  name: string;
413
399
  }
414
- type DbTable<T extends Table> = TableToDb<T, MapRelations<T>> & MapRelations<T>;
400
+ type DbTable<T extends Table> = T extends RelationConfigSelf ? TableToDb<T, MapRelations<T>> & MapRelations<T> : TableToDb<T, RelationsBase>;
415
401
  type ScopeFn<Related extends TableClass, Scope extends Query> = (q: DbTable<InstanceType<Related>>) => Scope;
416
402
  interface Table {
417
403
  table: string;
@@ -584,7 +570,7 @@ interface BaseTableInstance<ColumnTypes> {
584
570
  fn: () => Related;
585
571
  options: Options;
586
572
  };
587
- hasMany<Columns extends ColumnsShapeBase, Related extends TableClass, Scope extends Query, Through extends string, Source extends string, Options extends HasManyOptions<Columns, Related, Scope, Through, Source>>(this: {
573
+ hasMany<Columns extends ColumnsShapeBase, Related extends TableClass, Scope extends Query, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Scope, Through, Source>>(this: {
588
574
  columns: {
589
575
  shape: Columns;
590
576
  };
package/dist/index.js CHANGED
@@ -299,8 +299,8 @@ class BelongsToVirtualColumn extends pqb.VirtualColumn {
299
299
  }
300
300
  }
301
301
  const makeBelongsToMethod = (relation, relationName, query) => {
302
- const primaryKeys = "columns" in relation.options ? relation.options.references : [relation.options.primaryKey];
303
- const foreignKeys = "columns" in relation.options ? relation.options.columns : [relation.options.foreignKey];
302
+ const primaryKeys = relation.options.references;
303
+ const foreignKeys = relation.options.columns;
304
304
  const len = primaryKeys.length;
305
305
  const state = { query, primaryKeys, foreignKeys, len };
306
306
  const makeWhere = relationWhere(len, primaryKeys, foreignKeys);
@@ -617,8 +617,8 @@ const makeHasOneMethod = (table, relation, relationName, query) => {
617
617
  reverseJoin: reverseJoin2
618
618
  };
619
619
  }
620
- const primaryKeys = "columns" in relation.options ? relation.options.columns : [relation.options.primaryKey];
621
- const foreignKeys = "columns" in relation.options ? relation.options.references : [relation.options.foreignKey];
620
+ const primaryKeys = relation.options.columns;
621
+ const foreignKeys = relation.options.references;
622
622
  const state = { query, primaryKeys, foreignKeys };
623
623
  const len = primaryKeys.length;
624
624
  const reversedOn = {};
@@ -879,8 +879,8 @@ const makeHasManyMethod = (table, relation, relationName, query) => {
879
879
  reverseJoin: reverseJoin2
880
880
  };
881
881
  }
882
- const primaryKeys = "columns" in relation.options ? relation.options.columns : [relation.options.primaryKey];
883
- const foreignKeys = "columns" in relation.options ? relation.options.references : [relation.options.foreignKey];
882
+ const primaryKeys = relation.options.columns;
883
+ const foreignKeys = relation.options.references;
884
884
  const state = { query, primaryKeys, foreignKeys };
885
885
  const len = primaryKeys.length;
886
886
  const reversedOn = {};
@@ -977,7 +977,10 @@ const nestedInsert$1 = ({ query, primaryKeys, foreignKeys }) => {
977
977
  obj[foreignKeys[i2]] = selfData[primaryKeys[i2]];
978
978
  }
979
979
  queries.push(
980
- pqb._queryUpdate(t.where(item.where), obj)
980
+ pqb._queryUpdate(
981
+ t.where(item.where),
982
+ obj
983
+ )
981
984
  );
982
985
  }
983
986
  }
@@ -1147,25 +1150,12 @@ const removeColumnName = (column) => {
1147
1150
  return cloned;
1148
1151
  };
1149
1152
  const makeHasAndBelongsToManyMethod = (table, qb, relation, relationName, query) => {
1150
- let primaryKeys;
1151
- let foreignKeys;
1152
- let joinTable;
1153
- let throughForeignKeys;
1154
- let throughPrimaryKeys;
1155
1153
  const { options } = relation;
1156
- if ("columns" in options) {
1157
- primaryKeys = options.columns;
1158
- foreignKeys = options.references;
1159
- joinTable = options.through.table;
1160
- throughForeignKeys = options.through.columns;
1161
- throughPrimaryKeys = options.through.references;
1162
- } else {
1163
- primaryKeys = [options.primaryKey];
1164
- foreignKeys = [options.foreignKey];
1165
- joinTable = options.joinTable;
1166
- throughForeignKeys = [options.associationForeignKey];
1167
- throughPrimaryKeys = [options.associationPrimaryKey];
1168
- }
1154
+ const primaryKeys = options.columns;
1155
+ const foreignKeys = options.references;
1156
+ const joinTable = options.through.table;
1157
+ const throughForeignKeys = options.through.columns;
1158
+ const throughPrimaryKeys = options.through.references;
1169
1159
  const { snakeCase } = table.internal;
1170
1160
  const foreignKeysFull = foreignKeys.map((key, i) => {
1171
1161
  if (snakeCase)