orchid-orm 1.59.3 → 1.59.5

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, RelationConfigBase, QueryManyTake, QueryManyTakeOptional, EmptyObject, CreateData, UpdateData, WhereArg, CreateMethodsNames, MaybeArray, JoinQueryMethod, DeleteMethodsNames, Db, IsolationLevel, TransactionOptions, AfterCommitStandaloneHook, AdapterBase, FromArg, FromResult, DbSharedOptions, 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,36 +20,27 @@ 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;
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
- };
36
- 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
- };
44
- 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 {
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 HasOneQueryThrough<Name extends string, TableQuery extends Query> = {
28
+ [K in keyof TableQuery]: K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : K extends CreateMethodsNames ? never : TableQuery[K];
29
+ } & QueryHasWhere & HasRelJoin;
30
+ type HasOneQuery<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = T['relations'][Name]['options'] extends RelationRefsOptions ? {
31
+ [K in keyof TableQuery]: K extends '__defaults' ? {
32
+ [K in keyof TableQuery['__defaults'] | T['relations'][Name]['options']['references'][number]]: true;
33
+ } : K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : K extends CreateManyMethodsNames ? never : TableQuery[K];
34
+ } & QueryHasWhere & HasRelJoin : HasOneQueryThrough<Name, TableQuery>;
35
+ interface HasOneInfo<T extends RelationConfigSelf, Name extends string, Rel extends HasOne, Q extends Query> extends RelationConfigBase {
45
36
  returnsOne: true;
46
37
  query: Q;
47
- params: HasOneParams<T, Rel>;
48
- maybeSingle: T['relations'][Name]['options']['required'] extends true ? QueryTake<Q> : QueryTakeOptional<Q>;
38
+ params: HasOneParams<T, Rel['options']>;
39
+ maybeSingle: T['relations'][Name]['options']['required'] extends true ? QueryManyTake<Q> : QueryManyTakeOptional<Q>;
49
40
  omitForeignKeyInCreate: never;
50
41
  optionalDataForCreate: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : {
51
42
  [P in Name]?: RelationToOneDataForCreate<{
52
- nestedCreateQuery: CD;
43
+ nestedCreateQuery: CreateData<Q>;
53
44
  table: Q;
54
45
  }>;
55
46
  };
@@ -72,10 +63,10 @@ interface HasOneInfo<T extends RelationConfigSelf, Name extends string, Rel exte
72
63
  } | {
73
64
  upsert: {
74
65
  update: UpdateData<Q>;
75
- create: CD | (() => CD);
66
+ create: CreateData<Q> | (() => CreateData<Q>);
76
67
  };
77
68
  } | {
78
- create: CD;
69
+ create: CreateData<Q>;
79
70
  };
80
71
  }
81
72
 
@@ -83,27 +74,24 @@ interface HasMany extends RelationThunkBase {
83
74
  type: 'hasMany';
84
75
  options: HasOneOptions;
85
76
  }
86
- 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
+ type HasManyQuery<T extends RelationConfigSelf, Name extends string, TableQuery extends Query> = T['relations'][Name]['options'] extends RelationRefsOptions ? {
78
+ [K in keyof TableQuery]: K extends '__defaults' ? {
79
+ [K in keyof TableQuery['__defaults'] | T['relations'][Name]['options']['references'][number]]: true;
80
+ } : K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : TableQuery[K];
81
+ } & QueryHasWhere & HasRelJoin : HasOneQueryThrough<Name, TableQuery>;
94
82
  interface HasManyInfo<T extends RelationConfigSelf, Name extends string, Rel extends HasMany, Q extends Query> extends RelationConfigBase {
95
83
  returnsOne: false;
96
84
  query: Q;
97
- params: HasOneParams<T, Rel>;
85
+ params: HasOneParams<T, Rel['options']>;
98
86
  maybeSingle: Q;
99
87
  omitForeignKeyInCreate: never;
100
88
  optionalDataForCreate: {
101
89
  [P in Name]?: T['relations'][Name]['options'] extends RelationThroughOptions ? EmptyObject : {
102
- create?: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>[];
90
+ create?: CreateData<Q>[];
103
91
  connect?: WhereArg<Q>[];
104
92
  connectOrCreate?: {
105
93
  where: WhereArg<Q>;
106
- create: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>;
94
+ create: CreateData<Q>;
107
95
  }[];
108
96
  };
109
97
  };
@@ -125,42 +113,39 @@ interface HasManyInfo<T extends RelationConfigSelf, Name extends string, Rel ext
125
113
  };
126
114
  set?: MaybeArray<WhereArg<Q>>;
127
115
  add?: MaybeArray<WhereArg<Q>>;
128
- create?: CreateData<T['relations'][Name]['options'] extends RelationThroughOptions ? Q : AddQueryDefaults<Q, HasOnePopulate<T, Name>>>[];
116
+ create?: CreateData<Q>[];
129
117
  };
130
118
  }
131
119
 
132
120
  interface RelJoin extends JoinQueryMethod {
133
121
  <T extends Query>(this: T): T;
134
122
  }
123
+ interface HasRelJoin {
124
+ join: RelJoin;
125
+ }
135
126
 
136
127
  interface BelongsTo extends RelationThunkBase {
137
128
  type: 'belongsTo';
138
129
  options: BelongsToOptions;
139
130
  }
140
- interface BelongsToOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends TableClass = TableClass> {
131
+ interface BelongsToOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends ORMTableInput = ORMTableInput> {
141
132
  required?: boolean;
142
133
  columns: (keyof Columns)[];
143
- references: (keyof InstanceType<Related>['columns']['shape'])[];
134
+ references: (keyof Related['columns']['shape'])[];
144
135
  foreignKey?: boolean | TableData.References.Options;
145
- on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;
136
+ on?: ColumnsShape.InputPartial<Related['columns']['shape']>;
146
137
  }
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'];
138
+ type BelongsToParams<T extends RelationConfigSelf, FK extends string> = {
139
+ [Name in FK]: T['columns']['shape'][Name]['type'];
150
140
  };
151
141
  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 {
142
+ [P in keyof T]: P extends '__selectable' ? SelectableFromShape<T['shape'], Name> : P extends '__as' ? Name : P extends CreateMethodsNames | DeleteMethodsNames ? never : T[P];
143
+ } & QueryHasWhere & HasRelJoin;
144
+ interface BelongsToInfo<T extends RelationConfigSelf, Name extends string, FK extends string, Required, Q extends Query> extends RelationConfigBase {
160
145
  returnsOne: true;
161
146
  query: Q;
162
- params: BelongsToParams<T, Rel>;
163
- maybeSingle: Required extends true ? QueryTake<Q> : QueryTakeOptional<Q>;
147
+ params: BelongsToParams<T, FK>;
148
+ maybeSingle: Required extends true ? QueryManyTake<Q> : QueryManyTakeOptional<Q>;
164
149
  omitForeignKeyInCreate: FK;
165
150
  dataForCreate: {
166
151
  columns: FK;
@@ -220,8 +205,11 @@ interface FromQuery extends Query {
220
205
  returnType: 'all';
221
206
  }
222
207
  type OrchidORM<T extends TableClasses = TableClasses> = {
223
- [K in keyof T]: ORMTableInputToQueryBuilder<InstanceType<T[K]>>;
224
- } & {
208
+ [K in keyof T]: T[K] extends {
209
+ new (): infer R extends ORMTableInput;
210
+ } ? TableToDb<R> : never;
211
+ } & OrchidORMMethods;
212
+ interface OrchidORMMethods {
225
213
  /**
226
214
  * @see import('pqb').Transaction.prototype.transaction
227
215
  */
@@ -302,7 +290,7 @@ type OrchidORM<T extends TableClasses = TableClasses> = {
302
290
  */
303
291
  $from<Arg extends MaybeArray<FromArg<Query>>>(arg: Arg): FromResult<FromQuery, Arg>;
304
292
  $close(): Promise<void>;
305
- };
293
+ }
306
294
  type OrchidOrmParam<Options> = true | null extends true ? 'Set strict: true to tsconfig' : Options;
307
295
  declare const orchidORMWithAdapter: <T extends TableClasses>({ log, logger, autoPreparedStatements, noPrimaryKey, ...options }: OrchidOrmParam<({
308
296
  db: Query;
@@ -314,7 +302,7 @@ interface HasAndBelongsToMany extends RelationThunkBase {
314
302
  type: 'hasAndBelongsToMany';
315
303
  options: HasAndBelongsToManyOptions;
316
304
  }
317
- interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends TableClass = TableClass> {
305
+ interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Column.Shape.QueryInit, Related extends ORMTableInput = ORMTableInput> {
318
306
  required?: boolean;
319
307
  columns: (keyof Columns)[];
320
308
  references: string[];
@@ -322,25 +310,21 @@ interface HasAndBelongsToManyOptions<Columns extends Column.Shape.QueryInit = Co
322
310
  through: {
323
311
  table: string;
324
312
  columns: string[];
325
- references: (keyof InstanceType<Related>['columns']['shape'])[];
313
+ references: (keyof Related['columns']['shape'])[];
326
314
  foreignKey?: boolean | TableData.References.Options;
327
315
  };
328
- on?: ColumnsShape.InputPartial<InstanceType<Related>['columns']['shape']>;
316
+ on?: ColumnsShape.InputPartial<Related['columns']['shape']>;
329
317
  }
330
- type HasAndBelongsToManyParams<T extends RelationConfigSelf, Relation extends HasAndBelongsToMany> = {
331
- [Name in Relation['options']['columns'][number]]: T['columns']['shape'][Name]['type'];
318
+ type HasAndBelongsToManyParams<T extends RelationConfigSelf, FK extends string> = {
319
+ [Name in FK]: T['columns']['shape'][Name]['type'];
332
320
  };
333
321
  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 {
322
+ [K in keyof TableQuery]: K extends '__selectable' ? SelectableFromShape<TableQuery['shape'], Name> : K extends '__as' ? Name : TableQuery[K];
323
+ } & QueryHasWhere & HasRelJoin;
324
+ interface HasAndBelongsToManyInfo<T extends RelationConfigSelf, Name extends string, FK extends string, Q extends Query> extends RelationConfigBase {
341
325
  returnsOne: false;
342
326
  query: Q;
343
- params: HasAndBelongsToManyParams<T, Rel>;
327
+ params: HasAndBelongsToManyParams<T, FK>;
344
328
  maybeSingle: Q;
345
329
  omitForeignKeyInCreate: never;
346
330
  optionalDataForCreate: {
@@ -415,25 +399,26 @@ type RelationToOneDataForCreateSameQuery<Q extends Query> = {
415
399
  };
416
400
  interface RelationThunkBase {
417
401
  type: string;
418
- fn(): TableClass;
402
+ related: ORMTableInput;
419
403
  options: unknown;
420
404
  }
421
405
  type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;
422
406
  interface RelationThunks {
423
407
  [K: string]: RelationThunk;
424
408
  }
425
- type RelationTableToQuery<Relation extends RelationThunkBase> = ORMTableInputToQueryBuilder<InstanceType<ReturnType<Relation['fn']>>>;
409
+ type RelationTableToQuery<Relation> = Relation extends {
410
+ related: infer R extends ORMTableInput;
411
+ } ? TableToDb<R> : never;
426
412
  interface RelationConfigSelf {
427
413
  columns: {
428
414
  shape: Column.Shape.QueryInit;
429
415
  };
430
416
  relations: RelationThunks;
431
417
  }
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;
418
+ 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
419
 
434
420
  interface TableClass<T extends ORMTableInput = ORMTableInput> {
435
421
  new (): T;
436
- instance(): T;
437
422
  }
438
423
  interface TableClasses {
439
424
  [K: string]: TableClass;
@@ -446,12 +431,11 @@ interface TableInfo {
446
431
  }
447
432
  interface Table extends Query, TableInfo {
448
433
  }
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>> {
450
- relations: Relations;
434
+ interface TableToDb<T extends ORMTableInput> 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']>> {
435
+ relations: T extends RelationConfigSelf ? {
436
+ [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;
437
+ } : EmptyObject;
451
438
  }
452
- 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;
454
- } : EmptyObject> : TableToDb<T, EmptyObject>;
455
439
  interface ORMTableInput {
456
440
  table: string;
457
441
  columns: {
@@ -617,40 +601,48 @@ interface BaseTableInstance<ColumnTypes> {
617
601
  shape: Shape;
618
602
  };
619
603
  }, scopes: DbTableOptionScopes<Table, Shape, Keys>): QueryScopes<Keys>;
620
- belongsTo<Columns extends Column.Shape.QueryInit, Related extends TableClass, Options extends BelongsToOptions<Columns, Related>>(this: {
604
+ belongsTo<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Options extends BelongsToOptions<Columns, Related>>(this: {
621
605
  columns: {
622
606
  shape: Columns;
623
607
  };
624
- }, fn: () => Related, options: Options): {
608
+ }, fn: () => {
609
+ new (): Related;
610
+ }, options: Options): {
625
611
  type: 'belongsTo';
626
- fn: () => Related;
612
+ related: Related;
627
613
  options: Options;
628
614
  };
629
- hasOne<Columns extends Column.Shape.QueryInit, Related extends TableClass, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
615
+ hasOne<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
630
616
  columns: {
631
617
  shape: Columns;
632
618
  };
633
- }, fn: () => Related, options: Options): {
619
+ }, fn: () => {
620
+ new (): Related;
621
+ }, options: Options): {
634
622
  type: 'hasOne';
635
- fn: () => Related;
623
+ related: Related;
636
624
  options: Options;
637
625
  };
638
- hasMany<Columns extends Column.Shape.QueryInit, Related extends TableClass, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
626
+ hasMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
639
627
  columns: {
640
628
  shape: Columns;
641
629
  };
642
- }, fn: () => Related, options: Options): {
630
+ }, fn: () => {
631
+ new (): Related;
632
+ }, options: Options): {
643
633
  type: 'hasMany';
644
- fn: () => Related;
634
+ related: Related;
645
635
  options: Options;
646
636
  };
647
- hasAndBelongsToMany<Columns extends Column.Shape.QueryInit, Related extends TableClass, Options extends HasAndBelongsToManyOptions<Columns, Related>>(this: {
637
+ hasAndBelongsToMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Options extends HasAndBelongsToManyOptions<Columns, Related>>(this: {
648
638
  columns: {
649
639
  shape: Columns;
650
640
  };
651
- }, fn: () => Related, options: Options): {
641
+ }, fn: () => {
642
+ new (): Related;
643
+ }, options: Options): {
652
644
  type: 'hasAndBelongsToMany';
653
- fn: () => Related;
645
+ related: Related;
654
646
  options: Options;
655
647
  };
656
648
  beforeQuery: BeforeHookMethod;
@@ -722,13 +714,13 @@ type QueryOne<T extends Query> = {
722
714
  interface MethodsBase<T extends Query> {
723
715
  queryMethods?: QueryMethods<T>;
724
716
  queryOneMethods?: QueryMethods<QueryOne<T>>;
725
- queryWithWhereMethods?: QueryMethods<WhereResult<T>>;
726
- queryOneWithWhereMethods?: QueryMethods<QueryOne<WhereResult<T>>>;
717
+ queryWithWhereMethods?: QueryMethods<T & QueryHasWhere>;
718
+ queryOneWithWhereMethods?: QueryMethods<QueryOne<T & QueryHasWhere>>;
727
719
  methods?: RecordUnknown;
728
720
  }
729
721
  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
722
  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;
723
+ [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
724
  };
733
725
  type Repo<T extends Query, Methods extends MethodsBase<T>> = T & MapMethods<T, Methods>;
734
726
  declare const createRepo: <T extends Query, Methods extends MethodsBase<T>>(table: T, methods: Methods) => Repo<(<Q extends {
@@ -736,4 +728,4 @@ declare const createRepo: <T extends Query, Methods extends MethodsBase<T>>(tabl
736
728
  shape: T['shape'];
737
729
  }>(q: Q) => Query & Q & MapMethods<T, Methods>) & T, Methods>;
738
730
 
739
- export { type BaseTableClass, type BaseTableInstance, type DefaultSelect, type Insertable, type MapMethods, type MapQueryMethods, type MethodsBase, type ORMTableInput, type ORMTableInputToQueryBuilder, type OrchidORM, type OrchidOrmParam, type Queryable, type Repo, type Selectable, type SetColumnsResult, type Table, type TableClass, type TableClasses, type TableInfo, type TableToDb, type Updatable, createBaseTable, createRepo, orchidORMWithAdapter };
731
+ export { type BaseTableClass, type BaseTableInstance, type DefaultSelect, type Insertable, type MapMethods, type MapQueryMethods, type MethodsBase, type ORMTableInput, type OrchidORM, type OrchidOrmParam, type Queryable, type Repo, type Selectable, type SetColumnsResult, type Table, type TableClass, type TableClasses, type TableInfo, type TableToDb, type Updatable, createBaseTable, createRepo, orchidORMWithAdapter };
package/dist/index.js CHANGED
@@ -422,7 +422,10 @@ class BelongsToVirtualColumn extends pqb.VirtualColumn {
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
443
  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
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) {