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,608 @@
1
+ import { expectSql, User } from './test-utils';
2
+ import { raw } from './common';
3
+
4
+ describe('operators', () => {
5
+ describe('equals', () => {
6
+ it('should handle value', () => {
7
+ expectSql(
8
+ User.where({ name: { equals: 'name' } }).toSql(),
9
+ `
10
+ SELECT * FROM "user"
11
+ WHERE "user"."name" = $1
12
+ `,
13
+ ['name'],
14
+ );
15
+ });
16
+
17
+ it('should handle sub query', () => {
18
+ expectSql(
19
+ User.where({ name: { equals: User.select('name').take() } }).toSql(),
20
+ `
21
+ SELECT * FROM "user"
22
+ WHERE "user"."name" = (SELECT "user"."name" FROM "user" LIMIT $1)
23
+ `,
24
+ [1],
25
+ );
26
+ });
27
+
28
+ it('should handle raw query', () => {
29
+ expectSql(
30
+ User.where({ name: { equals: raw("'name'") } }).toSql(),
31
+ `
32
+ SELECT * FROM "user"
33
+ WHERE "user"."name" = 'name'
34
+ `,
35
+ );
36
+ });
37
+ });
38
+
39
+ describe('not', () => {
40
+ it('should handle value', () => {
41
+ expectSql(
42
+ User.where({ name: { not: 'name' } }).toSql(),
43
+ `
44
+ SELECT * FROM "user"
45
+ WHERE "user"."name" <> $1
46
+ `,
47
+ ['name'],
48
+ );
49
+ });
50
+
51
+ it('should handle sub query', () => {
52
+ expectSql(
53
+ User.where({ name: { not: User.select('name').take() } }).toSql(),
54
+ `
55
+ SELECT * FROM "user"
56
+ WHERE "user"."name" <> (SELECT "user"."name" FROM "user" LIMIT $1)
57
+ `,
58
+ [1],
59
+ );
60
+ });
61
+
62
+ it('should handle raw query', () => {
63
+ expectSql(
64
+ User.where({ name: { not: raw("'name'") } }).toSql(),
65
+ `
66
+ SELECT * FROM "user"
67
+ WHERE "user"."name" <> 'name'
68
+ `,
69
+ );
70
+ });
71
+ });
72
+
73
+ describe('in', () => {
74
+ it('should handle value', () => {
75
+ expectSql(
76
+ User.where({ name: { in: ['a', 'b'] } }).toSql(),
77
+ `
78
+ SELECT * FROM "user"
79
+ WHERE "user"."name" IN ($1, $2)
80
+ `,
81
+ ['a', 'b'],
82
+ );
83
+ });
84
+
85
+ it('should handle sub query', () => {
86
+ expectSql(
87
+ User.where({ name: { in: User.select('name') } }).toSql(),
88
+ `
89
+ SELECT * FROM "user"
90
+ WHERE "user"."name" IN (SELECT "user"."name" FROM "user")
91
+ `,
92
+ );
93
+ });
94
+
95
+ it('should handle raw query', () => {
96
+ expectSql(
97
+ User.where({ name: { in: raw("('a', 'b')") } }).toSql(),
98
+ `
99
+ SELECT * FROM "user"
100
+ WHERE "user"."name" IN ('a', 'b')
101
+ `,
102
+ );
103
+ });
104
+ });
105
+
106
+ describe('notIn', () => {
107
+ it('should handle value', () => {
108
+ expectSql(
109
+ User.where({ name: { notIn: ['a', 'b'] } }).toSql(),
110
+ `
111
+ SELECT * FROM "user"
112
+ WHERE NOT "user"."name" IN ($1, $2)
113
+ `,
114
+ ['a', 'b'],
115
+ );
116
+ });
117
+
118
+ it('should handle sub query', () => {
119
+ expectSql(
120
+ User.where({ name: { notIn: User.select('name') } }).toSql(),
121
+ `
122
+ SELECT * FROM "user"
123
+ WHERE NOT "user"."name" IN (SELECT "user"."name" FROM "user")
124
+ `,
125
+ );
126
+ });
127
+
128
+ it('should handle raw query', () => {
129
+ expectSql(
130
+ User.where({ name: { notIn: raw("('a', 'b')") } }).toSql(),
131
+ `
132
+ SELECT * FROM "user"
133
+ WHERE NOT "user"."name" IN ('a', 'b')
134
+ `,
135
+ );
136
+ });
137
+ });
138
+
139
+ describe('lt', () => {
140
+ it('should handle value', () => {
141
+ expectSql(
142
+ User.where({ id: { lt: 5 } }).toSql(),
143
+ `
144
+ SELECT * FROM "user"
145
+ WHERE "user"."id" < $1
146
+ `,
147
+ [5],
148
+ );
149
+ });
150
+
151
+ it('should handle sub query', () => {
152
+ expectSql(
153
+ User.where({ id: { lt: User.select('id').take() } }).toSql(),
154
+ `
155
+ SELECT * FROM "user"
156
+ WHERE "user"."id" < (SELECT "user"."id" FROM "user" LIMIT $1)
157
+ `,
158
+ [1],
159
+ );
160
+ });
161
+
162
+ it('should handle raw query', () => {
163
+ expectSql(
164
+ User.where({ id: { lt: raw('5') } }).toSql(),
165
+ `
166
+ SELECT * FROM "user"
167
+ WHERE "user"."id" < 5
168
+ `,
169
+ );
170
+ });
171
+ });
172
+
173
+ describe('lte', () => {
174
+ it('should handle value', () => {
175
+ expectSql(
176
+ User.where({ id: { lte: 5 } }).toSql(),
177
+ `
178
+ SELECT * FROM "user"
179
+ WHERE "user"."id" <= $1
180
+ `,
181
+ [5],
182
+ );
183
+ });
184
+
185
+ it('should handle sub query', () => {
186
+ expectSql(
187
+ User.where({ id: { lte: User.select('id').take() } }).toSql(),
188
+ `
189
+ SELECT * FROM "user"
190
+ WHERE "user"."id" <= (SELECT "user"."id" FROM "user" LIMIT $1)
191
+ `,
192
+ [1],
193
+ );
194
+ });
195
+
196
+ it('should handle raw query', () => {
197
+ expectSql(
198
+ User.where({ id: { lte: raw('5') } }).toSql(),
199
+ `
200
+ SELECT * FROM "user"
201
+ WHERE "user"."id" <= 5
202
+ `,
203
+ );
204
+ });
205
+ });
206
+
207
+ describe('gt', () => {
208
+ it('should handle value', () => {
209
+ expectSql(
210
+ User.where({ id: { gt: 5 } }).toSql(),
211
+ `
212
+ SELECT * FROM "user"
213
+ WHERE "user"."id" > $1
214
+ `,
215
+ [5],
216
+ );
217
+ });
218
+
219
+ it('should handle sub query', () => {
220
+ expectSql(
221
+ User.where({ id: { gt: User.select('id').take() } }).toSql(),
222
+ `
223
+ SELECT * FROM "user"
224
+ WHERE "user"."id" > (SELECT "user"."id" FROM "user" LIMIT $1)
225
+ `,
226
+ [1],
227
+ );
228
+ });
229
+
230
+ it('should handle raw query', () => {
231
+ expectSql(
232
+ User.where({ id: { gt: raw('5') } }).toSql(),
233
+ `
234
+ SELECT * FROM "user"
235
+ WHERE "user"."id" > 5
236
+ `,
237
+ );
238
+ });
239
+ });
240
+
241
+ describe('gte', () => {
242
+ it('should handle value', () => {
243
+ expectSql(
244
+ User.where({ id: { gte: 5 } }).toSql(),
245
+ `
246
+ SELECT * FROM "user"
247
+ WHERE "user"."id" >= $1
248
+ `,
249
+ [5],
250
+ );
251
+ });
252
+
253
+ it('should handle sub query', () => {
254
+ expectSql(
255
+ User.where({ id: { gte: User.select('id').take() } }).toSql(),
256
+ `
257
+ SELECT * FROM "user"
258
+ WHERE "user"."id" >= (SELECT "user"."id" FROM "user" LIMIT $1)
259
+ `,
260
+ [1],
261
+ );
262
+ });
263
+
264
+ it('should handle raw query', () => {
265
+ expectSql(
266
+ User.where({ id: { gte: raw('5') } }).toSql(),
267
+ `
268
+ SELECT * FROM "user"
269
+ WHERE "user"."id" >= 5
270
+ `,
271
+ );
272
+ });
273
+ });
274
+
275
+ describe('contains', () => {
276
+ it('should handle value', () => {
277
+ expectSql(
278
+ User.where({ name: { contains: 'ko' } }).toSql(),
279
+ `
280
+ SELECT * FROM "user"
281
+ WHERE "user"."name" LIKE '%' || $1 || '%'
282
+ `,
283
+ ['ko'],
284
+ );
285
+ });
286
+
287
+ it('should handle sub query', () => {
288
+ expectSql(
289
+ User.where({ name: { contains: User.select('name').take() } }).toSql(),
290
+ `
291
+ SELECT * FROM "user"
292
+ WHERE "user"."name" LIKE '%' || (SELECT "user"."name" FROM "user" LIMIT $1) || '%'
293
+ `,
294
+ [1],
295
+ );
296
+ });
297
+
298
+ it('should handle raw query', () => {
299
+ expectSql(
300
+ User.where({ name: { contains: raw("'ko'") } }).toSql(),
301
+ `
302
+ SELECT * FROM "user"
303
+ WHERE "user"."name" LIKE '%' || 'ko' || '%'
304
+ `,
305
+ );
306
+ });
307
+ });
308
+
309
+ describe('containsInsensitive', () => {
310
+ it('should handle value', () => {
311
+ expectSql(
312
+ User.where({ name: { containsInsensitive: 'ko' } }).toSql(),
313
+ `
314
+ SELECT * FROM "user"
315
+ WHERE "user"."name" ILIKE '%' || $1 || '%'
316
+ `,
317
+ ['ko'],
318
+ );
319
+ });
320
+
321
+ it('should handle sub query', () => {
322
+ expectSql(
323
+ User.where({
324
+ name: { containsInsensitive: User.select('name').take() },
325
+ }).toSql(),
326
+ `
327
+ SELECT * FROM "user"
328
+ WHERE "user"."name" ILIKE '%' || (SELECT "user"."name" FROM "user" LIMIT $1) || '%'
329
+ `,
330
+ [1],
331
+ );
332
+ });
333
+
334
+ it('should handle raw query', () => {
335
+ expectSql(
336
+ User.where({ name: { containsInsensitive: raw("'ko'") } }).toSql(),
337
+ `
338
+ SELECT * FROM "user"
339
+ WHERE "user"."name" ILIKE '%' || 'ko' || '%'
340
+ `,
341
+ );
342
+ });
343
+ });
344
+
345
+ describe('startsWith', () => {
346
+ it('should handle value', () => {
347
+ expectSql(
348
+ User.where({ name: { startsWith: 'ko' } }).toSql(),
349
+ `
350
+ SELECT * FROM "user"
351
+ WHERE "user"."name" LIKE $1 || '%'
352
+ `,
353
+ ['ko'],
354
+ );
355
+ });
356
+
357
+ it('should handle sub query', () => {
358
+ expectSql(
359
+ User.where({
360
+ name: { startsWith: User.select('name').take() },
361
+ }).toSql(),
362
+ `
363
+ SELECT * FROM "user"
364
+ WHERE "user"."name" LIKE (SELECT "user"."name" FROM "user" LIMIT $1) || '%'
365
+ `,
366
+ [1],
367
+ );
368
+ });
369
+
370
+ it('should handle raw query', () => {
371
+ expectSql(
372
+ User.where({ name: { startsWith: raw("'ko'") } }).toSql(),
373
+ `
374
+ SELECT * FROM "user"
375
+ WHERE "user"."name" LIKE 'ko' || '%'
376
+ `,
377
+ );
378
+ });
379
+ });
380
+
381
+ describe('startsWithInsensitive', () => {
382
+ it('should handle value', () => {
383
+ expectSql(
384
+ User.where({ name: { startsWithInsensitive: 'ko' } }).toSql(),
385
+ `
386
+ SELECT * FROM "user"
387
+ WHERE "user"."name" ILIKE $1 || '%'
388
+ `,
389
+ ['ko'],
390
+ );
391
+ });
392
+
393
+ it('should handle sub query', () => {
394
+ expectSql(
395
+ User.where({
396
+ name: { startsWithInsensitive: User.select('name').take() },
397
+ }).toSql(),
398
+ `
399
+ SELECT * FROM "user"
400
+ WHERE "user"."name" ILIKE (SELECT "user"."name" FROM "user" LIMIT $1) || '%'
401
+ `,
402
+ [1],
403
+ );
404
+ });
405
+
406
+ it('should handle raw query', () => {
407
+ expectSql(
408
+ User.where({ name: { startsWithInsensitive: raw("'ko'") } }).toSql(),
409
+ `
410
+ SELECT * FROM "user"
411
+ WHERE "user"."name" ILIKE 'ko' || '%'
412
+ `,
413
+ );
414
+ });
415
+ });
416
+
417
+ describe('endsWith', () => {
418
+ it('should handle value', () => {
419
+ expectSql(
420
+ User.where({ name: { endsWith: 'ko' } }).toSql(),
421
+ `
422
+ SELECT * FROM "user"
423
+ WHERE "user"."name" LIKE '%' || $1
424
+ `,
425
+ ['ko'],
426
+ );
427
+ });
428
+
429
+ it('should handle sub query', () => {
430
+ expectSql(
431
+ User.where({
432
+ name: { endsWith: User.select('name').take() },
433
+ }).toSql(),
434
+ `
435
+ SELECT * FROM "user"
436
+ WHERE "user"."name" LIKE '%' || (SELECT "user"."name" FROM "user" LIMIT $1)
437
+ `,
438
+ [1],
439
+ );
440
+ });
441
+
442
+ it('should handle raw query', () => {
443
+ expectSql(
444
+ User.where({ name: { endsWith: raw("'ko'") } }).toSql(),
445
+ `
446
+ SELECT * FROM "user"
447
+ WHERE "user"."name" LIKE '%' || 'ko'
448
+ `,
449
+ );
450
+ });
451
+ });
452
+
453
+ describe('endsWithInsensitive', () => {
454
+ it('should handle value', () => {
455
+ expectSql(
456
+ User.where({ name: { endsWithInsensitive: 'ko' } }).toSql(),
457
+ `
458
+ SELECT * FROM "user"
459
+ WHERE "user"."name" ILIKE '%' || $1
460
+ `,
461
+ ['ko'],
462
+ );
463
+ });
464
+
465
+ it('should handle sub query', () => {
466
+ expectSql(
467
+ User.where({
468
+ name: { endsWithInsensitive: User.select('name').take() },
469
+ }).toSql(),
470
+ `
471
+ SELECT * FROM "user"
472
+ WHERE "user"."name" ILIKE '%' || (SELECT "user"."name" FROM "user" LIMIT $1)
473
+ `,
474
+ [1],
475
+ );
476
+ });
477
+
478
+ it('should handle raw query', () => {
479
+ expectSql(
480
+ User.where({ name: { endsWithInsensitive: raw("'ko'") } }).toSql(),
481
+ `
482
+ SELECT * FROM "user"
483
+ WHERE "user"."name" ILIKE '%' || 'ko'
484
+ `,
485
+ );
486
+ });
487
+ });
488
+
489
+ describe('between', () => {
490
+ it('should handle value', () => {
491
+ expectSql(
492
+ User.where({ id: { between: [1, 10] } }).toSql(),
493
+ `
494
+ SELECT * FROM "user"
495
+ WHERE "user"."id" BETWEEN $1 AND $2
496
+ `,
497
+ [1, 10],
498
+ );
499
+ });
500
+
501
+ it('should handle sub query', () => {
502
+ expectSql(
503
+ User.where({
504
+ id: { between: [User.select('id').take(), User.select('id').take()] },
505
+ }).toSql(),
506
+ `
507
+ SELECT * FROM "user"
508
+ WHERE "user"."id"
509
+ BETWEEN (SELECT "user"."id" FROM "user" LIMIT $1)
510
+ AND (SELECT "user"."id" FROM "user" LIMIT $2)
511
+ `,
512
+ [1, 1],
513
+ );
514
+ });
515
+
516
+ it('should handle raw query', () => {
517
+ expectSql(
518
+ User.where({ id: { between: [raw('1'), raw('10')] } }).toSql(),
519
+ `
520
+ SELECT * FROM "user"
521
+ WHERE "user"."id" BETWEEN 1 AND 10
522
+ `,
523
+ );
524
+ });
525
+ });
526
+
527
+ describe('jsonPath', () => {
528
+ it('should handle value', () => {
529
+ expectSql(
530
+ User.where({ data: { jsonPath: ['$.name', '=', 'name'] } }).toSql(),
531
+ `
532
+ SELECT * FROM "user"
533
+ WHERE jsonb_path_query_first("user"."data", '$.name') #>> '{}' = $1
534
+ `,
535
+ ['name'],
536
+ );
537
+ });
538
+
539
+ it('should handle sub query', () => {
540
+ expectSql(
541
+ User.where({
542
+ data: { jsonPath: ['$.name', '=', User.select('name').take()] },
543
+ }).toSql(),
544
+ `
545
+ SELECT * FROM "user"
546
+ WHERE jsonb_path_query_first("user"."data", '$.name') #>> '{}' = (
547
+ SELECT "user"."name" FROM "user" LIMIT $1
548
+ )
549
+ `,
550
+ [1],
551
+ );
552
+ });
553
+
554
+ it('should handle raw query', () => {
555
+ expectSql(
556
+ User.where({
557
+ data: { jsonPath: ['$.name', '=', raw("'name'")] },
558
+ }).toSql(),
559
+ `
560
+ SELECT * FROM "user"
561
+ WHERE jsonb_path_query_first("user"."data", '$.name') #>> '{}' = 'name'
562
+ `,
563
+ );
564
+ });
565
+ });
566
+
567
+ describe.each`
568
+ method | sql
569
+ ${'jsonSupersetOf'} | ${'@>'}
570
+ ${'jsonSubsetOf'} | ${'<@'}
571
+ `('$method', ({ method, sql }) => {
572
+ it('should handle value', () => {
573
+ expectSql(
574
+ User.where({ data: { [method]: { a: 'b' } } }).toSql(),
575
+ `
576
+ SELECT * FROM "user"
577
+ WHERE "user"."data" ${sql} $1
578
+ `,
579
+ [{ a: 'b' }],
580
+ );
581
+ });
582
+
583
+ it('should handle sub query', () => {
584
+ expectSql(
585
+ User.where({
586
+ data: { [method]: User.select('data').take() },
587
+ }).toSql(),
588
+ `
589
+ SELECT * FROM "user"
590
+ WHERE "user"."data" ${sql} (SELECT "user"."data" FROM "user" LIMIT $1)
591
+ `,
592
+ [1],
593
+ );
594
+ });
595
+
596
+ it('should handle raw query', () => {
597
+ expectSql(
598
+ User.where({
599
+ data: { [method]: raw(`'{"a":"b"}'`) },
600
+ }).toSql(),
601
+ `
602
+ SELECT * FROM "user"
603
+ WHERE "user"."data" ${sql} '{"a":"b"}'
604
+ `,
605
+ );
606
+ });
607
+ });
608
+ });