orchid-orm 1.59.2 → 1.59.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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Column, TableData, ColumnsShape, Query, SelectableFromShape, CreateManyMethodsNames, CreateData, AddQueryDefaults, RelationConfigBase, QueryTake, QueryTakeOptional, EmptyObject, UpdateData, WhereArg, CreateMethodsNames, MaybeArray, JoinQueryMethod, DeleteMethodsNames, Db, IsolationLevel, TransactionOptions, AfterCommitStandaloneHook, AdapterBase, FromArg, FromResult, DbSharedOptions, RelationsBase, ShapeColumnPrimaryKeys, ShapeUniqueColumns, TableDataItemsUniqueColumns, TableDataItemsUniqueColumnTuples, UniqueConstraints, TableDataItemsUniqueConstraints, ComputedColumnsFromOptions, MapTableScopesOption, TableDataItem, ComputedOptionsFactory, RecordUnknown, ShallowSimplify, ComputedOptionsConfig, QueryOrExpression, QueryData, IsQuery, TableDataFn, DbTableOptionScopes, QueryScopes, ColumnSchemaConfig, StaticSQLArgs, RawSQL, DynamicSQLArg, DynamicRawSQL, DefaultSchemaConfig, DefaultColumnTypes, QueryBeforeHookInternal, QueryAfterHook, AfterHook, WhereResult, MergeQuery, QueryReturnType } from 'pqb';
1
+ import { Column, TableData, ColumnsShape, Query, SelectableFromShape, CreateManyMethodsNames, QueryHasWhere, CreateData, AddQueryDefaults, RelationConfigBase, QueryManyTake, QueryManyTakeOptional, EmptyObject, UpdateData, WhereArg, CreateMethodsNames, MaybeArray, JoinQueryMethod, DeleteMethodsNames, Db, IsolationLevel, TransactionOptions, AfterCommitStandaloneHook, AdapterBase, FromArg, FromResult, DbSharedOptions, RelationsBase, ShapeColumnPrimaryKeys, ShapeUniqueColumns, TableDataItemsUniqueColumns, TableDataItemsUniqueColumnTuples, UniqueConstraints, TableDataItemsUniqueConstraints, ComputedColumnsFromOptions, MapTableScopesOption, TableDataItem, ComputedOptionsFactory, RecordUnknown, ShallowSimplify, ComputedOptionsConfig, QueryOrExpression, QueryData, IsQuery, TableDataFn, DbTableOptionScopes, QueryScopes, ColumnSchemaConfig, StaticSQLArgs, RawSql, DynamicSQLArg, DynamicRawSQL, DefaultSchemaConfig, DefaultColumnTypes, QueryBeforeHookInternal, QueryAfterHook, AfterHook, MergeQuery, QueryReturnType } from 'pqb';
2
2
  export * from 'pqb';
3
3
 
4
4
  interface RelationRefsOptions<Column extends PropertyKey = string, Shape extends Column.Shape.QueryInit = Column.Shape.QueryInit> {
@@ -20,32 +20,22 @@ interface HasOne extends RelationThunkBase {
20
20
  interface RelationHasOneThroughOptions<Through extends string, Source extends string> extends RelationThroughOptions<Through, Source> {
21
21
  required?: boolean;
22
22
  }
23
- type HasOneOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends TableClass = TableClass, Through extends string = string, Source extends string = string> = RelationRefsOptions<keyof Columns, InstanceType<Related>['columns']['shape']> | RelationHasOneThroughOptions<Through, Source>;
24
- type HasOneParams<T extends RelationConfigSelf, Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? {
25
- [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
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;
23
+ type HasOneOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends ORMTableInput = ORMTableInput, Through extends string = string, Source extends string = string> = RelationRefsOptions<keyof Columns, Related['columns']['shape']> | RelationHasOneThroughOptions<Through, Source>;
24
+ type HasOneParams<T extends RelationConfigSelf, Options> = Options extends RelationRefsOptions ? {
25
+ [Name in Options['columns'][number]]: T['columns']['shape'][Name]['type'];
26
+ } : Options extends RelationThroughOptions ? RelationConfigParams<T, T['relations'][Options['through']]> : never;
27
+ type HasOnePopulate<T extends RelationConfigSelf, Name extends string> = T['relations'][Name]['options'] extends RelationRefsOptions ? T['relations'][Name]['options']['references'][number] : never;
28
28
  type HasOneQueryThrough<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = {
29
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
30
- as: Name;
31
- defaults: HasOnePopulate<T, Name>;
32
- hasWhere: true;
33
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
34
- } : K extends 'join' ? RelJoin : K extends CreateMethodsNames ? never : TableQuery[K];
35
- };
29
+ [K in keyof TableQuery]: K extends '__defaults' ? HasOnePopulate<T, Name> : K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : K extends CreateMethodsNames ? never : TableQuery[K];
30
+ } & QueryHasWhere & HasRelJoin;
36
31
  type HasOneQuery<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = T['relations'][Name]['options'] extends RelationThroughOptions ? HasOneQueryThrough<T, Name, TableQuery> : {
37
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
38
- as: Name;
39
- defaults: HasOnePopulate<T, Name>;
40
- hasWhere: true;
41
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
42
- } : K extends 'join' ? RelJoin : K extends CreateManyMethodsNames ? never : TableQuery[K];
43
- };
32
+ [K in keyof TableQuery]: K extends '__defaults' ? HasOnePopulate<T, Name> : K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : K extends CreateManyMethodsNames ? never : TableQuery[K];
33
+ } & QueryHasWhere & HasRelJoin;
44
34
  interface HasOneInfo<T extends RelationConfigSelf, Name extends string, Rel extends HasOne, Q extends Query, CD = T['relations'][Name]['options'] extends RelationThroughOptions ? CreateData<Q> : CreateData<AddQueryDefaults<Q, HasOnePopulate<T, Name>>>> extends RelationConfigBase {
45
35
  returnsOne: true;
46
36
  query: Q;
47
- params: HasOneParams<T, Rel>;
48
- maybeSingle: T['relations'][Name]['options']['required'] extends true ? QueryTake<Q> : QueryTakeOptional<Q>;
37
+ params: HasOneParams<T, Rel['options']>;
38
+ maybeSingle: T['relations'][Name]['options']['required'] extends true ? QueryManyTake<Q> : QueryManyTakeOptional<Q>;
49
39
  omitForeignKeyInCreate: never;
50
40
  optionalDataForCreate: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : {
51
41
  [P in Name]?: RelationToOneDataForCreate<{
@@ -84,17 +74,12 @@ interface HasMany extends RelationThunkBase {
84
74
  options: HasOneOptions;
85
75
  }
86
76
  type HasManyQuery<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = T['relations'][Name]['options'] extends RelationThroughOptions ? HasOneQueryThrough<T, Name, TableQuery> : {
87
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
88
- as: Name;
89
- defaults: HasOnePopulate<T, Name>;
90
- hasWhere: true;
91
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
92
- } : K extends 'join' ? RelJoin : TableQuery[K];
93
- };
77
+ [K in keyof TableQuery]: K extends '__defaults' ? HasOnePopulate<T, Name> : K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : TableQuery[K];
78
+ } & QueryHasWhere & HasRelJoin;
94
79
  interface HasManyInfo<T extends RelationConfigSelf, Name extends string, Rel extends HasMany, Q extends Query> extends RelationConfigBase {
95
80
  returnsOne: false;
96
81
  query: Q;
97
- params: HasOneParams<T, Rel>;
82
+ params: HasOneParams<T, Rel['options']>;
98
83
  maybeSingle: Q;
99
84
  omitForeignKeyInCreate: never;
100
85
  optionalDataForCreate: {
@@ -132,35 +117,32 @@ interface HasManyInfo<T extends RelationConfigSelf, Name extends string, Rel ext
132
117
  interface RelJoin extends JoinQueryMethod {
133
118
  <T extends Query>(this: T): T;
134
119
  }
120
+ interface HasRelJoin {
121
+ join: RelJoin;
122
+ }
135
123
 
136
124
  interface BelongsTo extends RelationThunkBase {
137
125
  type: 'belongsTo';
138
126
  options: BelongsToOptions;
139
127
  }
140
- interface BelongsToOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends TableClass = TableClass> {
128
+ interface BelongsToOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends ORMTableInput = ORMTableInput> {
141
129
  required?: boolean;
142
130
  columns: (keyof Columns)[];
143
- references: (keyof InstanceType<Related>['columns']['shape'])[];
131
+ references: (keyof Related['columns']['shape'])[];
144
132
  foreignKey?: boolean | TableData.References.Options;
145
- on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;
133
+ on?: ColumnsShape.InputPartial<Related['columns']['shape']>;
146
134
  }
147
- type BelongsToFKey<Relation extends RelationThunkBase> = Relation['options'] extends RelationRefsOptions ? Relation['options']['columns'][number] : never;
148
- type BelongsToParams<T extends RelationConfigSelf, Relation extends BelongsTo> = {
149
- [Name in BelongsToFKey<Relation>]: T['columns']['shape'][Name]['type'];
135
+ type BelongsToParams<T extends RelationConfigSelf, FK extends string> = {
136
+ [Name in FK]: T['columns']['shape'][Name]['type'];
150
137
  };
151
138
  type BelongsToQuery<T extends Query, Name extends string> = {
152
- [P in keyof T]: P extends 'meta' ? // Omit is optimal
153
- Omit<T['meta'], 'selectable'> & {
154
- as: Name;
155
- hasWhere: true;
156
- selectable: SelectableFromShape<T['shape'], Name>;
157
- } : P extends 'join' ? RelJoin : P extends CreateMethodsNames | DeleteMethodsNames ? never : T[P];
158
- };
159
- interface BelongsToInfo<T extends RelationConfigSelf, Name extends string, Rel extends BelongsTo, FK extends string, Required, Q extends Query> extends RelationConfigBase {
139
+ [P in keyof T]: P extends '__selectable' ? SelectableFromShape<T['shape'], Name> : P extends '__as' ? Name : P extends CreateMethodsNames | DeleteMethodsNames ? never : T[P];
140
+ } & QueryHasWhere & HasRelJoin;
141
+ interface BelongsToInfo<T extends RelationConfigSelf, Name extends string, FK extends string, Required, Q extends Query> extends RelationConfigBase {
160
142
  returnsOne: true;
161
143
  query: Q;
162
- params: BelongsToParams<T, Rel>;
163
- maybeSingle: Required extends true ? QueryTake<Q> : QueryTakeOptional<Q>;
144
+ params: BelongsToParams<T, FK>;
145
+ maybeSingle: Required extends true ? QueryManyTake<Q> : QueryManyTakeOptional<Q>;
164
146
  omitForeignKeyInCreate: FK;
165
147
  dataForCreate: {
166
148
  columns: FK;
@@ -220,8 +202,11 @@ interface FromQuery extends Query {
220
202
  returnType: 'all';
221
203
  }
222
204
  type OrchidORM<T extends TableClasses = TableClasses> = {
223
- [K in keyof T]: ORMTableInputToQueryBuilder<InstanceType<T[K]>>;
224
- } & {
205
+ [K in keyof T]: T[K] extends {
206
+ new (): infer R extends ORMTableInput;
207
+ } ? ORMTableInputToQueryBuilder<R> : never;
208
+ } & OrchidORMMethods;
209
+ interface OrchidORMMethods {
225
210
  /**
226
211
  * @see import('pqb').Transaction.prototype.transaction
227
212
  */
@@ -302,7 +287,7 @@ type OrchidORM<T extends TableClasses = TableClasses> = {
302
287
  */
303
288
  $from<Arg extends MaybeArray<FromArg<Query>>>(arg: Arg): FromResult<FromQuery, Arg>;
304
289
  $close(): Promise<void>;
305
- };
290
+ }
306
291
  type OrchidOrmParam<Options> = true | null extends true ? 'Set strict: true to tsconfig' : Options;
307
292
  declare const orchidORMWithAdapter: <T extends TableClasses>({ log, logger, autoPreparedStatements, noPrimaryKey, ...options }: OrchidOrmParam<({
308
293
  db: Query;
@@ -314,7 +299,7 @@ interface HasAndBelongsToMany extends RelationThunkBase {
314
299
  type: 'hasAndBelongsToMany';
315
300
  options: HasAndBelongsToManyOptions;
316
301
  }
317
- interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends TableClass = TableClass> {
302
+ interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends ORMTableInput = ORMTableInput> {
318
303
  required?: boolean;
319
304
  columns: (keyof Columns)[];
320
305
  references: string[];
@@ -322,25 +307,21 @@ interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Co
322
307
  through: {
323
308
  table: string;
324
309
  columns: string[];
325
- references: (keyof InstanceType<Related>['columns']['shape'])[];
310
+ references: (keyof Related['columns']['shape'])[];
326
311
  foreignKey?: boolean | TableData.References.Options;
327
312
  };
328
- on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;
313
+ on?: ColumnsShape.InputPartial<Related['columns']['shape']>;
329
314
  }
330
- type HasAndBelongsToManyParams<T extends RelationConfigSelf, Relation extends HasAndBelongsToMany> = {
331
- [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
315
+ type HasAndBelongsToManyParams<T extends RelationConfigSelf, FK extends string> = {
316
+ [Name in FK]: T['columns']['shape'][Name]['type'];
332
317
  };
333
318
  type HasAndBelongsToManyQuery<Name extends string, TableQuery extends Query> = {
334
- [K in keyof TableQuery]: K extends 'meta' ? Omit<TableQuery['meta'], 'selectable'> & {
335
- as: Name;
336
- hasWhere: true;
337
- selectable: SelectableFromShape<TableQuery['shape'], Name>;
338
- } : K extends 'join' ? RelJoin : TableQuery[K];
339
- };
340
- interface HasAndBelongsToManyInfo<T extends RelationConfigSelf, Name extends string, Rel extends HasAndBelongsToMany, Q extends Query> extends RelationConfigBase {
319
+ [K in keyof TableQuery]: K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : TableQuery[K];
320
+ } & QueryHasWhere & HasRelJoin;
321
+ interface HasAndBelongsToManyInfo<T extends RelationConfigSelf, Name extends string, FK extends string, Q extends Query> extends RelationConfigBase {
341
322
  returnsOne: false;
342
323
  query: Q;
343
- params: HasAndBelongsToManyParams<T, Rel>;
324
+ params: HasAndBelongsToManyParams<T, FK>;
344
325
  maybeSingle: Q;
345
326
  omitForeignKeyInCreate: never;
346
327
  optionalDataForCreate: {
@@ -415,25 +396,26 @@ type RelationToOneDataForCreateSameQuery<Q extends Query> = {
415
396
  };
416
397
  interface RelationThunkBase {
417
398
  type: string;
418
- fn(): TableClass;
399
+ related: ORMTableInput;
419
400
  options: unknown;
420
401
  }
421
402
  type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;
422
403
  interface RelationThunks {
423
404
  [K: string]: RelationThunk;
424
405
  }
425
- type RelationTableToQuery<Relation extends RelationThunkBase> = ORMTableInputToQueryBuilder<InstanceType<ReturnType<Relation['fn']>>>;
406
+ type RelationTableToQuery<Relation> = Relation extends {
407
+ related: infer R extends ORMTableInput;
408
+ } ? ORMTableInputToQueryBuilder<R> : never;
426
409
  interface RelationConfigSelf {
427
410
  columns: {
428
411
  shape: Column.Shape.QueryInit;
429
412
  };
430
413
  relations: RelationThunks;
431
414
  }
432
- 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;
415
+ type RelationConfigParams<T extends RelationConfigSelf, Relation extends RelationThunk> = Relation extends BelongsTo ? BelongsToParams<T, Relation['options']['columns'][number] & string> : Relation extends HasOne | HasMany ? HasOneParams<T, Relation['options']> : Relation extends HasAndBelongsToMany ? HasAndBelongsToManyParams<T, Relation['options']['columns'][number] & string> : never;
433
416
 
434
417
  interface TableClass<T extends ORMTableInput = ORMTableInput> {
435
418
  new (): T;
436
- instance(): T;
437
419
  }
438
420
  interface TableClasses {
439
421
  [K: string]: TableClass;
@@ -446,11 +428,11 @@ interface TableInfo {
446
428
  }
447
429
  interface Table extends Query, TableInfo {
448
430
  }
449
- interface TableToDb<T extends ORMTableInput, Relations extends RelationsBase> extends TableInfo, 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>> {
431
+ interface TableToDb<T extends ORMTableInput, Relations extends RelationsBase> extends TableInfo, 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>, ColumnsShape.DefaultSelectKeys<T['columns']['shape']>> {
450
432
  relations: Relations;
451
433
  }
452
434
  type ORMTableInputToQueryBuilder<T extends ORMTableInput> = T extends RelationConfigSelf ? TableToDb<T, T extends RelationConfigSelf ? {
453
- [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo ? BelongsToInfo<T, K, T['relations'][K], T['relations'][K]['options']['columns'][number] & string, T['relations'][K]['options']['required'], BelongsToQuery<RelationTableToQuery<T['relations'][K]>, K>> : T['relations'][K] extends HasOne ? HasOneInfo<T, K, T['relations'][K], HasOneQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasMany ? HasManyInfo<T, K, T['relations'][K], HasManyQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, K, T['relations'][K], HasAndBelongsToManyQuery<K, RelationTableToQuery<T['relations'][K]>>> : never;
435
+ [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo ? BelongsToInfo<T, K, T['relations'][K]['options']['columns'][number] & string, T['relations'][K]['options']['required'], BelongsToQuery<RelationTableToQuery<T['relations'][K]>, K>> : T['relations'][K] extends HasOne ? HasOneInfo<T, K, T['relations'][K], HasOneQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasMany ? HasManyInfo<T, K, T['relations'][K], HasManyQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, K, T['relations'][K]['options']['columns'][number] & string, HasAndBelongsToManyQuery<K, RelationTableToQuery<T['relations'][K]>>> : never;
454
436
  } : EmptyObject> : TableToDb<T, EmptyObject>;
455
437
  interface ORMTableInput {
456
438
  table: string;
@@ -617,40 +599,48 @@ interface BaseTableInstance<ColumnTypes> {
617
599
  shape: Shape;
618
600
  };
619
601
  }, scopes: DbTableOptionScopes<Table, Shape, Keys>): QueryScopes<Keys>;
620
- belongsTo<Columns extends Column.Shape.QueryInit, Related extends TableClass, Options extends BelongsToOptions<Columns, Related>>(this: {
602
+ belongsTo<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Options extends BelongsToOptions<Columns, Related>>(this: {
621
603
  columns: {
622
604
  shape: Columns;
623
605
  };
624
- }, fn: () => Related, options: Options): {
606
+ }, fn: () => {
607
+ new (): Related;
608
+ }, options: Options): {
625
609
  type: 'belongsTo';
626
- fn: () => Related;
610
+ related: Related;
627
611
  options: Options;
628
612
  };
629
- hasOne<Columns extends Column.Shape.QueryInit, Related extends TableClass, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
613
+ hasOne<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
630
614
  columns: {
631
615
  shape: Columns;
632
616
  };
633
- }, fn: () => Related, options: Options): {
617
+ }, fn: () => {
618
+ new (): Related;
619
+ }, options: Options): {
634
620
  type: 'hasOne';
635
- fn: () => Related;
621
+ related: Related;
636
622
  options: Options;
637
623
  };
638
- hasMany<Columns extends Column.Shape.QueryInit, Related extends TableClass, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
624
+ hasMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
639
625
  columns: {
640
626
  shape: Columns;
641
627
  };
642
- }, fn: () => Related, options: Options): {
628
+ }, fn: () => {
629
+ new (): Related;
630
+ }, options: Options): {
643
631
  type: 'hasMany';
644
- fn: () => Related;
632
+ related: Related;
645
633
  options: Options;
646
634
  };
647
- hasAndBelongsToMany<Columns extends Column.Shape.QueryInit, Related extends TableClass, Options extends HasAndBelongsToManyOptions<Columns, Related>>(this: {
635
+ hasAndBelongsToMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Options extends HasAndBelongsToManyOptions<Columns, Related>>(this: {
648
636
  columns: {
649
637
  shape: Columns;
650
638
  };
651
- }, fn: () => Related, options: Options): {
639
+ }, fn: () => {
640
+ new (): Related;
641
+ }, options: Options): {
652
642
  type: 'hasAndBelongsToMany';
653
- fn: () => Related;
643
+ related: Related;
654
644
  options: Options;
655
645
  };
656
646
  beforeQuery: BeforeHookMethod;
@@ -673,7 +663,7 @@ interface BaseTableClass<SchemaConfig extends ColumnSchemaConfig, ColumnTypes> {
673
663
  exportAs: string;
674
664
  columnTypes: ColumnTypes;
675
665
  getFilePath(): string;
676
- sql<T>(...args: StaticSQLArgs): RawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;
666
+ sql<T>(...args: StaticSQLArgs): RawSql<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;
677
667
  sql<T>(...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;
678
668
  new (): BaseTableInstance<ColumnTypes>;
679
669
  instance(): BaseTableInstance<ColumnTypes>;
@@ -722,13 +712,13 @@ type QueryOne<T extends Query> = {
722
712
  interface MethodsBase<T extends Query> {
723
713
  queryMethods?: QueryMethods<T>;
724
714
  queryOneMethods?: QueryMethods<QueryOne<T>>;
725
- queryWithWhereMethods?: QueryMethods<WhereResult<T>>;
726
- queryOneWithWhereMethods?: QueryMethods<QueryOne<WhereResult<T>>>;
715
+ queryWithWhereMethods?: QueryMethods<T & QueryHasWhere>;
716
+ queryOneWithWhereMethods?: QueryMethods<QueryOne<T & QueryHasWhere>>;
727
717
  methods?: RecordUnknown;
728
718
  }
729
719
  type MapQueryMethods<BaseQuery extends Query, Method> = Method extends (q: any, ...args: infer Args) => infer Result ? <T extends BaseQuery>(this: T, ...args: Args) => Result extends Query ? MergeQuery<T, Result> : Result : never;
730
720
  type MapMethods<T extends Query, Methods extends MethodsBase<T>> = {
731
- [K in keyof Methods['queryMethods'] | keyof Methods['queryOneMethods'] | keyof Methods['queryWithWhereMethods'] | keyof Methods['queryOneWithWhereMethods'] | keyof Methods['methods']]: K extends keyof Methods['methods'] ? Methods['methods'][K] : K extends keyof Methods['queryOneWithWhereMethods'] ? MapQueryMethods<QueryOne<WhereResult<Query>>, Methods['queryOneWithWhereMethods'][K]> : K extends keyof Methods['queryWithWhereMethods'] ? MapQueryMethods<WhereResult<Query>, Methods['queryWithWhereMethods'][K]> : K extends keyof Methods['queryOneMethods'] ? MapQueryMethods<QueryOne<Query>, Methods['queryOneMethods'][K]> : K extends keyof Methods['queryMethods'] ? MapQueryMethods<Query, Methods['queryMethods'][K]> : never;
721
+ [K in keyof Methods['queryMethods'] | keyof Methods['queryOneMethods'] | keyof Methods['queryWithWhereMethods'] | keyof Methods['queryOneWithWhereMethods'] | keyof Methods['methods']]: K extends keyof Methods['methods'] ? Methods['methods'][K] : K extends keyof Methods['queryOneWithWhereMethods'] ? MapQueryMethods<QueryOne<Query & QueryHasWhere>, Methods['queryOneWithWhereMethods'][K]> : K extends keyof Methods['queryWithWhereMethods'] ? MapQueryMethods<Query & QueryHasWhere, Methods['queryWithWhereMethods'][K]> : K extends keyof Methods['queryOneMethods'] ? MapQueryMethods<QueryOne<Query>, Methods['queryOneMethods'][K]> : K extends keyof Methods['queryMethods'] ? MapQueryMethods<Query, Methods['queryMethods'][K]> : never;
732
722
  };
733
723
  type Repo<T extends Query, Methods extends MethodsBase<T>> = T & MapMethods<T, Methods>;
734
724
  declare const createRepo: <T extends Query, Methods extends MethodsBase<T>>(table: T, methods: Methods) => Repo<(<Q extends {
package/dist/index.js CHANGED
@@ -388,7 +388,7 @@ const combineOrdering = (result, joined) => {
388
388
  const wrapQuery = (joiningQuery, result, item) => {
389
389
  const baseOuterQuery = pqb.cloneQueryBaseUnscoped(joiningQuery);
390
390
  const outer = baseOuterQuery.clone();
391
- outer.q.and = [new pqb.DynamicRawSQL(() => new pqb.RawSQL(`${item.as || "r"} = 1`))];
391
+ outer.q.and = [new pqb.DynamicRawSQL(() => new pqb.RawSql(`${item.as || "r"} = 1`))];
392
392
  outer.q.useFromLimitOffset = true;
393
393
  outer.shape = pqb.getShapeFromSelect(result, true);
394
394
  outer.q.select = Object.keys(outer.shape);
@@ -416,13 +416,16 @@ class BelongsToVirtualColumn extends pqb.VirtualColumn {
416
416
  }
417
417
  const value = item[key];
418
418
  if ("create" in value || "connectOrCreate" in value) {
419
- foreignKeys.forEach((foreignKey) => item[foreignKey] = new pqb.RawSQL(""));
419
+ foreignKeys.forEach((foreignKey) => item[foreignKey] = new pqb.RawSql(""));
420
420
  const selectPKeys = query.select(...primaryKeys);
421
421
  pqb._with(
422
422
  q,
423
423
  (as) => {
424
424
  foreignKeys.forEach((foreignKey, i) => {
425
- item[foreignKey]._sql = `(SELECT "${as}"."${primaryKeys[i]}" FROM "${as}")`;
425
+ item[foreignKey]._sql = selectCteColumnSql(
426
+ as,
427
+ primaryKeys[i]
428
+ );
426
429
  });
427
430
  },
428
431
  "create" in value ? pqb._queryCreate(selectPKeys, value.create) : pqb._orCreate(
@@ -437,9 +440,8 @@ class BelongsToVirtualColumn extends pqb.VirtualColumn {
437
440
  const as = pqb.getFreeAlias(q.q.withShapes, "q");
438
441
  pqb._with(q, as, query.select(...primaryKeys).findBy(value.connect));
439
442
  foreignKeys.map((foreignKey, i) => {
440
- const selectColumn = `(SELECT "${as}"."${primaryKeys[i]}" FROM "${as}")`;
441
- item[foreignKey] = new pqb.RawSQL(
442
- i === 0 ? `CASE WHEN (SELECT count(*) FROM "${as}") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END` : selectColumn
443
+ item[foreignKey] = new pqb.RawSql(
444
+ selectCteColumnMustExistSql(i, as, primaryKeys[i])
443
445
  );
444
446
  });
445
447
  return;
@@ -543,13 +545,18 @@ const nestedUpdate$3 = ({ query, primaryKeys, foreignKeys, len }) => {
543
545
  }
544
546
  }
545
547
  if (loadPrimaryKeys) {
546
- const record = await pqb._queryFindBy(
547
- query.select(...loadPrimaryKeys),
548
- params.set
549
- );
550
548
  for (let i = 0, len2 = loadPrimaryKeys.length; i < len2; i++) {
551
- update[loadForeignKeys[i]] = record[loadPrimaryKeys[i]];
549
+ update[loadForeignKeys[i]] = new pqb.RawSql("");
552
550
  }
551
+ pqb._with(
552
+ q2,
553
+ (as) => {
554
+ for (let i = 0, len2 = loadPrimaryKeys.length; i < len2; i++) {
555
+ update[loadForeignKeys[i]]._sql = selectCteColumnMustExistSql(i, as, loadPrimaryKeys[i]);
556
+ }
557
+ },
558
+ pqb._queryFindBy(query.select(...loadPrimaryKeys), params.set)
559
+ );
553
560
  }
554
561
  } else if (params.create) {
555
562
  const q3 = query.clone();
@@ -646,6 +653,11 @@ const nestedUpdate$3 = ({ query, primaryKeys, foreignKeys, len }) => {
646
653
  }
647
654
  };
648
655
  };
656
+ const selectCteColumnSql = (cteAs, column) => `(SELECT "${cteAs}"."${column}" FROM "${cteAs}")`;
657
+ const selectCteColumnMustExistSql = (i, cteAs, column) => {
658
+ const selectColumn = selectCteColumnSql(cteAs, column);
659
+ return i === 0 ? `CASE WHEN (SELECT count(*) FROM "${cteAs}") = 0 AND (SELECT 'not-found')::int = 0 THEN NULL ELSE ${selectColumn} END` : selectColumn;
660
+ };
649
661
 
650
662
  class HasOneVirtualColumn extends pqb.VirtualColumn {
651
663
  constructor(schema, key, state) {