pqb 0.0.1

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.
Files changed (122) hide show
  1. package/dist/index.d.ts +3630 -0
  2. package/dist/index.esm.js +4587 -0
  3. package/dist/index.esm.js.map +1 -0
  4. package/dist/index.js +4691 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +59 -0
  7. package/rollup.config.js +35 -0
  8. package/src/adapter.test.ts +10 -0
  9. package/src/adapter.ts +171 -0
  10. package/src/columnSchema/array.ts +21 -0
  11. package/src/columnSchema/boolean.ts +10 -0
  12. package/src/columnSchema/columnType.test.ts +129 -0
  13. package/src/columnSchema/columnType.ts +77 -0
  14. package/src/columnSchema/columnTypes.ts +145 -0
  15. package/src/columnSchema/columnsSchema.test.ts +32 -0
  16. package/src/columnSchema/columnsSchema.ts +100 -0
  17. package/src/columnSchema/commonMethods.ts +130 -0
  18. package/src/columnSchema/dateTime.ts +104 -0
  19. package/src/columnSchema/enum.ts +13 -0
  20. package/src/columnSchema/index.ts +11 -0
  21. package/src/columnSchema/json/array.ts +55 -0
  22. package/src/columnSchema/json/discriminatedUnion.ts +91 -0
  23. package/src/columnSchema/json/enum.ts +29 -0
  24. package/src/columnSchema/json/instanceOf.ts +16 -0
  25. package/src/columnSchema/json/intersection.ts +23 -0
  26. package/src/columnSchema/json/lazy.ts +22 -0
  27. package/src/columnSchema/json/literal.ts +12 -0
  28. package/src/columnSchema/json/map.ts +29 -0
  29. package/src/columnSchema/json/nativeEnum.ts +30 -0
  30. package/src/columnSchema/json/nullable.ts +33 -0
  31. package/src/columnSchema/json/nullish.ts +30 -0
  32. package/src/columnSchema/json/object.ts +206 -0
  33. package/src/columnSchema/json/optional.ts +28 -0
  34. package/src/columnSchema/json/record.ts +40 -0
  35. package/src/columnSchema/json/scalarTypes.ts +117 -0
  36. package/src/columnSchema/json/set.ts +34 -0
  37. package/src/columnSchema/json/tuple.ts +40 -0
  38. package/src/columnSchema/json/typeBase.ts +202 -0
  39. package/src/columnSchema/json/union.ts +16 -0
  40. package/src/columnSchema/json.ts +64 -0
  41. package/src/columnSchema/number.ts +122 -0
  42. package/src/columnSchema/string.ts +222 -0
  43. package/src/columnSchema/utils.ts +27 -0
  44. package/src/common.ts +86 -0
  45. package/src/db.test.ts +67 -0
  46. package/src/db.ts +212 -0
  47. package/src/errors.ts +7 -0
  48. package/src/index.ts +18 -0
  49. package/src/operators.test.ts +608 -0
  50. package/src/operators.ts +177 -0
  51. package/src/query.ts +292 -0
  52. package/src/queryDataUtils.ts +50 -0
  53. package/src/queryMethods/aggregate.test.ts +583 -0
  54. package/src/queryMethods/aggregate.ts +878 -0
  55. package/src/queryMethods/callbacks.test.ts +69 -0
  56. package/src/queryMethods/callbacks.ts +55 -0
  57. package/src/queryMethods/clear.test.ts +64 -0
  58. package/src/queryMethods/clear.ts +58 -0
  59. package/src/queryMethods/columnInfo.test.ts +45 -0
  60. package/src/queryMethods/columnInfo.ts +67 -0
  61. package/src/queryMethods/delete.test.ts +135 -0
  62. package/src/queryMethods/delete.ts +50 -0
  63. package/src/queryMethods/for.test.ts +57 -0
  64. package/src/queryMethods/for.ts +99 -0
  65. package/src/queryMethods/from.test.ts +66 -0
  66. package/src/queryMethods/from.ts +58 -0
  67. package/src/queryMethods/get.test.ts +66 -0
  68. package/src/queryMethods/get.ts +88 -0
  69. package/src/queryMethods/having.test.ts +247 -0
  70. package/src/queryMethods/having.ts +99 -0
  71. package/src/queryMethods/insert.test.ts +555 -0
  72. package/src/queryMethods/insert.ts +453 -0
  73. package/src/queryMethods/join.test.ts +150 -0
  74. package/src/queryMethods/join.ts +508 -0
  75. package/src/queryMethods/json.test.ts +398 -0
  76. package/src/queryMethods/json.ts +259 -0
  77. package/src/queryMethods/log.test.ts +172 -0
  78. package/src/queryMethods/log.ts +123 -0
  79. package/src/queryMethods/queryMethods.test.ts +629 -0
  80. package/src/queryMethods/queryMethods.ts +428 -0
  81. package/src/queryMethods/select.test.ts +479 -0
  82. package/src/queryMethods/select.ts +249 -0
  83. package/src/queryMethods/then.ts +236 -0
  84. package/src/queryMethods/transaction.test.ts +66 -0
  85. package/src/queryMethods/transaction.ts +66 -0
  86. package/src/queryMethods/union.test.ts +59 -0
  87. package/src/queryMethods/union.ts +89 -0
  88. package/src/queryMethods/update.test.ts +417 -0
  89. package/src/queryMethods/update.ts +350 -0
  90. package/src/queryMethods/upsert.test.ts +56 -0
  91. package/src/queryMethods/upsert.ts +43 -0
  92. package/src/queryMethods/where.test.ts +1594 -0
  93. package/src/queryMethods/where.ts +450 -0
  94. package/src/queryMethods/window.test.ts +66 -0
  95. package/src/queryMethods/window.ts +108 -0
  96. package/src/queryMethods/with.test.ts +191 -0
  97. package/src/queryMethods/with.ts +92 -0
  98. package/src/quote.ts +36 -0
  99. package/src/relations.ts +194 -0
  100. package/src/sql/aggregate.ts +80 -0
  101. package/src/sql/columnInfo.ts +22 -0
  102. package/src/sql/common.ts +42 -0
  103. package/src/sql/delete.ts +41 -0
  104. package/src/sql/distinct.ts +19 -0
  105. package/src/sql/fromAndAs.ts +51 -0
  106. package/src/sql/having.ts +140 -0
  107. package/src/sql/index.ts +2 -0
  108. package/src/sql/insert.ts +102 -0
  109. package/src/sql/join.ts +242 -0
  110. package/src/sql/orderBy.ts +41 -0
  111. package/src/sql/select.ts +153 -0
  112. package/src/sql/toSql.ts +153 -0
  113. package/src/sql/truncate.ts +13 -0
  114. package/src/sql/types.ts +355 -0
  115. package/src/sql/update.ts +62 -0
  116. package/src/sql/where.ts +314 -0
  117. package/src/sql/window.ts +38 -0
  118. package/src/sql/with.ts +32 -0
  119. package/src/test-utils.ts +172 -0
  120. package/src/utils.ts +140 -0
  121. package/tsconfig.build.json +6 -0
  122. package/tsconfig.json +8 -0
@@ -0,0 +1,508 @@
1
+ import {
2
+ AddQueryJoinedTable,
3
+ ColumnsParsers,
4
+ Query,
5
+ QueryBase,
6
+ Selectable,
7
+ SelectableBase,
8
+ WithDataItem,
9
+ } from '../query';
10
+ import { pushQueryValue, setQueryObjectValue } from '../queryDataUtils';
11
+ import { RawExpression, StringKey } from '../common';
12
+ import { WhereQueryBuilder } from './where';
13
+ import { Relation } from '../relations';
14
+
15
+ type WithSelectable<
16
+ T extends QueryBase,
17
+ W extends keyof T['withData'],
18
+ > = T['withData'][W] extends WithDataItem
19
+ ?
20
+ | StringKey<keyof T['withData'][W]['shape']>
21
+ | `${T['withData'][W]['table']}.${StringKey<
22
+ keyof T['withData'][W]['shape']
23
+ >}`
24
+ : never;
25
+
26
+ export type JoinArgs<
27
+ T extends QueryBase,
28
+ Q extends Query = Query,
29
+ R extends keyof T['relations'] = keyof T['relations'],
30
+ W extends keyof T['withData'] = keyof T['withData'],
31
+ > =
32
+ | [relation: R]
33
+ | [
34
+ query: Q,
35
+ conditions:
36
+ | Record<Selectable<Q>, Selectable<T> | RawExpression>
37
+ | RawExpression,
38
+ ]
39
+ | [
40
+ withAlias: W,
41
+ conditions:
42
+ | Record<WithSelectable<T, W>, Selectable<T> | RawExpression>
43
+ | RawExpression,
44
+ ]
45
+ | [
46
+ query: Q,
47
+ leftColumn: Selectable<Q> | RawExpression,
48
+ rightColumn: Selectable<T> | RawExpression,
49
+ ]
50
+ | [
51
+ withAlias: W,
52
+ leftColumn: WithSelectable<T, W> | RawExpression,
53
+ rightColumn: Selectable<T> | RawExpression,
54
+ ]
55
+ | [
56
+ query: Q,
57
+ leftColumn: Selectable<Q> | RawExpression,
58
+ op: string,
59
+ rightColumn: Selectable<T> | RawExpression,
60
+ ]
61
+ | [
62
+ withAlias: W,
63
+ leftColumn: WithSelectable<T, W> | RawExpression,
64
+ op: string,
65
+ rightColumn: Selectable<T> | RawExpression,
66
+ ];
67
+
68
+ type JoinResult<
69
+ T extends Query,
70
+ Args extends JoinArgs<T>,
71
+ A extends Query | keyof T['relations'] = Args[0],
72
+ > = AddQueryJoinedTable<
73
+ T,
74
+ A extends Query
75
+ ? A
76
+ : T['relations'] extends Record<string, Relation>
77
+ ? A extends keyof T['relations']
78
+ ? T['relations'][A]['model']
79
+ : A extends keyof T['withData']
80
+ ? T['withData'][A] extends WithDataItem
81
+ ? {
82
+ table: T['withData'][A]['table'];
83
+ tableAlias: undefined;
84
+ result: T['withData'][A]['shape'];
85
+ }
86
+ : never
87
+ : never
88
+ : never
89
+ >;
90
+
91
+ export type JoinCallbackArg<T extends QueryBase> =
92
+ | Query
93
+ | keyof T['withData']
94
+ | keyof T['relations'];
95
+
96
+ export type JoinCallback<
97
+ T extends QueryBase,
98
+ Arg extends JoinCallbackArg<T>,
99
+ > = (
100
+ q: OnQueryBuilder<
101
+ T,
102
+ Arg extends keyof T['withData']
103
+ ? T['withData'][Arg] extends WithDataItem
104
+ ? {
105
+ table: T['withData'][Arg]['table'];
106
+ tableAlias: undefined;
107
+ shape: T['withData'][Arg]['shape'];
108
+ selectable: {
109
+ [K in keyof T['withData'][Arg]['shape'] as `${T['withData'][Arg]['table']}.${StringKey<K>}`]: {
110
+ as: StringKey<K>;
111
+ column: T['withData'][Arg]['shape'][K];
112
+ };
113
+ };
114
+ }
115
+ : never
116
+ : Arg extends Query
117
+ ? Arg
118
+ : T['relations'] extends Record<string, Relation>
119
+ ? Arg extends keyof T['relations']
120
+ ? T['relations'][Arg]['model']
121
+ : never
122
+ : never
123
+ >,
124
+ ) => OnQueryBuilder;
125
+
126
+ type JoinCallbackResult<
127
+ T extends Query,
128
+ Arg extends JoinCallbackArg<T>,
129
+ > = AddQueryJoinedTable<
130
+ T,
131
+ Arg extends Query
132
+ ? Arg
133
+ : T['relations'] extends Record<string, Relation>
134
+ ? Arg extends keyof T['relations']
135
+ ? T['relations'][Arg]['model']
136
+ : Arg extends keyof T['withData']
137
+ ? T['withData'][Arg] extends WithDataItem
138
+ ? {
139
+ table: T['withData'][Arg]['table'];
140
+ tableAlias: undefined;
141
+ result: T['withData'][Arg]['shape'];
142
+ }
143
+ : never
144
+ : never
145
+ : never
146
+ >;
147
+
148
+ const join = <T extends Query, Args extends JoinArgs<T>>(
149
+ q: T,
150
+ type: string,
151
+ args: Args,
152
+ ): JoinResult<T, Args> => {
153
+ return _join(q.clone() as T, type, args) as unknown as JoinResult<T, Args>;
154
+ };
155
+
156
+ const _join = <
157
+ T extends Query,
158
+ Arg extends JoinCallbackArg<T>,
159
+ Args extends JoinArgs<T>,
160
+ >(
161
+ q: T,
162
+ type: string,
163
+ args: Args | [arg: Arg, cb: JoinCallback<T, Arg>],
164
+ ): JoinResult<T, Args> => {
165
+ const first = args[0];
166
+ let joinKey: string | undefined;
167
+ let parsers: ColumnsParsers | undefined;
168
+
169
+ if (typeof first === 'object') {
170
+ const as = first.tableAlias || first.table;
171
+ if (as) {
172
+ joinKey = as;
173
+ parsers = first.query.parsers || first.columnsParsers;
174
+ }
175
+ } else {
176
+ joinKey = first as string;
177
+
178
+ const relation = (q.relations as Record<string, Relation>)[joinKey];
179
+ if (relation) {
180
+ parsers = relation.model.query.parsers || relation.model.columnsParsers;
181
+ } else {
182
+ const shape = q.query.withShapes?.[first as string];
183
+ if (shape) {
184
+ parsers = {};
185
+ for (const key in shape) {
186
+ const parser = shape[key].parseFn;
187
+ if (parser) {
188
+ parsers[key] = parser;
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+
195
+ if (joinKey && parsers) {
196
+ setQueryObjectValue(q, 'joinedParsers', joinKey, parsers);
197
+ }
198
+
199
+ return pushQueryValue(q, 'join', {
200
+ type,
201
+ args,
202
+ }) as unknown as JoinResult<T, Args>;
203
+ };
204
+
205
+ export class Join {
206
+ join<T extends Query, Args extends JoinArgs<T>>(
207
+ this: T,
208
+ ...args: Args
209
+ ): JoinResult<T, Args>;
210
+ join<T extends Query, Arg extends JoinCallbackArg<T>>(
211
+ this: T,
212
+ arg: Arg,
213
+ cb: JoinCallback<T, Arg>,
214
+ ): JoinCallbackResult<T, Arg>;
215
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
216
+ join(this: Query, ...args: any) {
217
+ return join(this, 'JOIN', args);
218
+ }
219
+ _join<T extends Query, Args extends JoinArgs<T>>(
220
+ this: T,
221
+ ...args: Args
222
+ ): JoinResult<T, Args>;
223
+ _join<T extends Query, Arg extends JoinCallbackArg<T>>(
224
+ this: T,
225
+ arg: Arg,
226
+ cb: JoinCallback<T, Arg>,
227
+ ): JoinCallbackResult<T, Arg>;
228
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
229
+ _join(this: Query, ...args: any) {
230
+ return _join(this, 'JOIN', args);
231
+ }
232
+
233
+ innerJoin<T extends Query, Args extends JoinArgs<T>>(
234
+ this: T,
235
+ ...args: Args
236
+ ): JoinResult<T, Args>;
237
+ innerJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
238
+ this: T,
239
+ arg: Arg,
240
+ cb: JoinCallback<T, Arg>,
241
+ ): JoinCallbackResult<T, Arg>;
242
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
243
+ innerJoin(this: Query, ...args: any) {
244
+ return join(this, 'INNER JOIN', args);
245
+ }
246
+ _innerJoin<T extends Query, Args extends JoinArgs<T>>(
247
+ this: T,
248
+ ...args: Args
249
+ ): JoinResult<T, Args>;
250
+ _innerJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
251
+ this: T,
252
+ arg: Arg,
253
+ cb: JoinCallback<T, Arg>,
254
+ ): JoinCallbackResult<T, Arg>;
255
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
256
+ _innerJoin(this: Query, ...args: any) {
257
+ return _join(this, 'INNER JOIN', args);
258
+ }
259
+
260
+ leftJoin<T extends Query, Args extends JoinArgs<T>>(
261
+ this: T,
262
+ ...args: Args
263
+ ): JoinResult<T, Args>;
264
+ leftJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
265
+ this: T,
266
+ arg: Arg,
267
+ cb: JoinCallback<T, Arg>,
268
+ ): JoinCallbackResult<T, Arg>;
269
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
270
+ leftJoin(this: Query, ...args: any) {
271
+ return join(this, 'LEFT JOIN', args);
272
+ }
273
+ _leftJoin<T extends Query, Args extends JoinArgs<T>>(
274
+ this: T,
275
+ ...args: Args
276
+ ): JoinResult<T, Args>;
277
+ _leftJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
278
+ this: T,
279
+ arg: Arg,
280
+ cb: JoinCallback<T, Arg>,
281
+ ): JoinCallbackResult<T, Arg>;
282
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
283
+ _leftJoin(this: Query, ...args: any) {
284
+ return _join(this, 'LEFT JOIN', args);
285
+ }
286
+
287
+ leftOuterJoin<T extends Query, Args extends JoinArgs<T>>(
288
+ this: T,
289
+ ...args: Args
290
+ ): JoinResult<T, Args>;
291
+ leftOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
292
+ this: T,
293
+ arg: Arg,
294
+ cb: JoinCallback<T, Arg>,
295
+ ): JoinCallbackResult<T, Arg>;
296
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
297
+ leftOuterJoin(this: Query, ...args: any) {
298
+ return join(this, 'LEFT OUTER JOIN', args);
299
+ }
300
+ _leftOuterJoin<T extends Query, Args extends JoinArgs<T>>(
301
+ this: T,
302
+ ...args: Args
303
+ ): JoinResult<T, Args>;
304
+ _leftOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
305
+ this: T,
306
+ arg: Arg,
307
+ cb: JoinCallback<T, Arg>,
308
+ ): JoinCallbackResult<T, Arg>;
309
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
310
+ _leftOuterJoin(this: Query, ...args: any) {
311
+ return _join(this, 'LEFT OUTER JOIN', args);
312
+ }
313
+
314
+ rightJoin<T extends Query, Args extends JoinArgs<T>>(
315
+ this: T,
316
+ ...args: Args
317
+ ): JoinResult<T, Args>;
318
+ rightJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
319
+ this: T,
320
+ arg: Arg,
321
+ cb: JoinCallback<T, Arg>,
322
+ ): JoinCallbackResult<T, Arg>;
323
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
324
+ rightJoin(this: Query, ...args: any) {
325
+ return join(this, 'RIGHT JOIN', args);
326
+ }
327
+ _rightJoin<T extends Query, Args extends JoinArgs<T>>(
328
+ this: T,
329
+ ...args: Args
330
+ ): JoinResult<T, Args>;
331
+ _rightJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
332
+ this: T,
333
+ arg: Arg,
334
+ cb: JoinCallback<T, Arg>,
335
+ ): JoinCallbackResult<T, Arg>;
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
+ _rightJoin(this: Query, ...args: any) {
338
+ return _join(this, 'RIGHT JOIN', args);
339
+ }
340
+
341
+ rightOuterJoin<T extends Query, Args extends JoinArgs<T>>(
342
+ this: T,
343
+ ...args: Args
344
+ ): JoinResult<T, Args>;
345
+ rightOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
346
+ this: T,
347
+ arg: Arg,
348
+ cb: JoinCallback<T, Arg>,
349
+ ): JoinCallbackResult<T, Arg>;
350
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
351
+ rightOuterJoin(this: Query, ...args: any) {
352
+ return join(this, 'RIGHT OUTER JOIN', args);
353
+ }
354
+ _rightOuterJoin<T extends Query, Args extends JoinArgs<T>>(
355
+ this: T,
356
+ ...args: Args
357
+ ): JoinResult<T, Args>;
358
+ _rightOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
359
+ this: T,
360
+ arg: Arg,
361
+ cb: JoinCallback<T, Arg>,
362
+ ): JoinCallbackResult<T, Arg>;
363
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
+ _rightOuterJoin(this: Query, ...args: any) {
365
+ return _join(this, 'RIGHT OUTER JOIN', args);
366
+ }
367
+
368
+ fullOuterJoin<T extends Query, Args extends JoinArgs<T>>(
369
+ this: T,
370
+ ...args: Args
371
+ ): JoinResult<T, Args>;
372
+ fullOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
373
+ this: T,
374
+ arg: Arg,
375
+ cb: JoinCallback<T, Arg>,
376
+ ): JoinCallbackResult<T, Arg>;
377
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
378
+ fullOuterJoin(this: Query, ...args: any) {
379
+ return join(this, 'FULL OUTER JOIN', args);
380
+ }
381
+ _fullOuterJoin<T extends Query, Args extends JoinArgs<T>>(
382
+ this: T,
383
+ ...args: Args
384
+ ): JoinResult<T, Args>;
385
+ _fullOuterJoin<T extends Query, Arg extends JoinCallbackArg<T>>(
386
+ this: T,
387
+ arg: Arg,
388
+ cb: JoinCallback<T, Arg>,
389
+ ): JoinCallbackResult<T, Arg>;
390
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
391
+ _fullOuterJoin(this: Query, ...args: any) {
392
+ return _join(this, 'FULL OUTER JOIN', args);
393
+ }
394
+ }
395
+
396
+ type PickQueryForSelect<T extends QueryBase = QueryBase> = Pick<
397
+ T,
398
+ 'table' | 'tableAlias' | 'selectable'
399
+ >;
400
+
401
+ type OnArgs<Q extends { selectable: SelectableBase }> =
402
+ | [leftColumn: keyof Q['selectable'], rightColumn: keyof Q['selectable']]
403
+ | [
404
+ leftColumn: keyof Q['selectable'],
405
+ op: string,
406
+ rightColumn: keyof Q['selectable'],
407
+ ];
408
+
409
+ const makeOnItem = (
410
+ joinTo: QueryBase | string,
411
+ joinFrom: QueryBase | string,
412
+ args: OnArgs<QueryBase>,
413
+ ) => {
414
+ return {
415
+ ON: {
416
+ joinTo,
417
+ joinFrom,
418
+ on: args,
419
+ },
420
+ };
421
+ };
422
+
423
+ export const pushQueryOn = <T extends QueryBase>(
424
+ q: T,
425
+ joinFrom: QueryBase | string,
426
+ joinTo: QueryBase | string,
427
+ ...on: OnArgs<QueryBase>
428
+ ): T => {
429
+ return pushQueryValue(q, 'and', makeOnItem(joinFrom, joinTo, on));
430
+ };
431
+
432
+ export const pushQueryOrOn: typeof pushQueryOn = (
433
+ q,
434
+ joinFrom,
435
+ joinTo,
436
+ ...on
437
+ ) => {
438
+ return pushQueryValue(q, 'or', [makeOnItem(joinFrom, joinTo, on)]);
439
+ };
440
+
441
+ export const addQueryOn: typeof pushQueryOrOn = (
442
+ q,
443
+ joinFrom,
444
+ joinTo,
445
+ ...args
446
+ ) => {
447
+ return pushQueryOn(q.clone() as typeof q, joinFrom, joinTo, ...args);
448
+ };
449
+
450
+ export const addQueryOrOn: typeof pushQueryOrOn = (
451
+ q,
452
+ joinFrom,
453
+ joinTo,
454
+ ...args
455
+ ) => {
456
+ return pushQueryOrOn(q.clone() as typeof q, joinFrom, joinTo, ...args);
457
+ };
458
+
459
+ type OnJsonPathEqualsArgs<T extends QueryBase> = [
460
+ leftColumn: keyof T['selectable'],
461
+ leftPath: string,
462
+ rightColumn: keyof T['selectable'],
463
+ rightPath: string,
464
+ ];
465
+
466
+ export class OnQueryBuilder<
467
+ S extends QueryBase = QueryBase,
468
+ J extends PickQueryForSelect = PickQueryForSelect,
469
+ >
470
+ extends WhereQueryBuilder<
471
+ Omit<S, 'selectable'> & { selectable: S['selectable'] & J['selectable'] }
472
+ >
473
+ implements QueryBase
474
+ {
475
+ constructor(
476
+ q: { table?: string; query: { as?: string } },
477
+ public joinTo: QueryBase | string,
478
+ ) {
479
+ super(q.table, q.query.as);
480
+ }
481
+
482
+ on<T extends this>(this: T, ...args: OnArgs<T>): T {
483
+ return this.clone()._on(...args);
484
+ }
485
+ _on<T extends this>(this: T, ...args: OnArgs<T>): T {
486
+ return pushQueryOn(this, this.joinTo, this, ...args);
487
+ }
488
+
489
+ orOn<T extends this>(this: T, ...args: OnArgs<T>): T {
490
+ return this.clone()._orOn(...args);
491
+ }
492
+ _orOn<T extends this>(this: T, ...args: OnArgs<T>): T {
493
+ return pushQueryOrOn(this, this.joinTo, this, ...args);
494
+ }
495
+
496
+ onJsonPathEquals<T extends this>(
497
+ this: T,
498
+ ...args: OnJsonPathEqualsArgs<T>
499
+ ): T {
500
+ return this.clone()._onJsonPathEquals(...args);
501
+ }
502
+ _onJsonPathEquals<T extends this>(
503
+ this: T,
504
+ ...args: OnJsonPathEqualsArgs<T>
505
+ ): T {
506
+ return pushQueryValue(this, 'and', { ON: args });
507
+ }
508
+ }