@reventlessdev/reventless-postgres 3.0.0-alpha.9 → 3.0.0-alpha.91

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 (117) hide show
  1. package/CHANGELOG.md +658 -0
  2. package/README.md +83 -0
  3. package/lib/bs/.compiler.log +2 -2
  4. package/lib/bs/ReventlessPostgres.cmt +0 -0
  5. package/lib/bs/ReventlessPostgres.mlmap +0 -2
  6. package/lib/bs/compiler-info.json +2 -2
  7. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  8. package/lib/bs/src/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  9. package/lib/bs/src/DcbEventLogStorage_Postgres.ast +0 -0
  10. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  11. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  12. package/lib/bs/src/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  13. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  14. package/lib/bs/src/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  15. package/lib/bs/src/EventLogChangeFeed.ast +0 -0
  16. package/lib/bs/src/EventLogChangeFeed.res +5 -2
  17. package/lib/bs/src/EventLogChangeFeed.res.mjs +3 -3
  18. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  19. package/lib/bs/src/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  20. package/lib/bs/src/EventLogStorage_Postgres.ast +0 -0
  21. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  22. package/lib/bs/src/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  23. package/lib/bs/src/EventLogStorage_Postgres_Ops.ast +0 -0
  24. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  25. package/lib/bs/src/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  26. package/lib/bs/src/PgChangeFeed.ast +0 -0
  27. package/lib/bs/src/PgChangeFeed.res +6 -1
  28. package/lib/bs/src/PgChangeFeed.res.mjs +6 -6
  29. package/lib/bs/src/PgDriver-ReventlessPostgres.cmi +0 -0
  30. package/lib/bs/src/PgDriver-ReventlessPostgres.cmt +0 -0
  31. package/lib/bs/src/PgDriver-ReventlessPostgres.cmti +0 -0
  32. package/lib/bs/src/PgDriver.ast +0 -0
  33. package/lib/bs/src/PgDriver.iast +0 -0
  34. package/lib/bs/src/PgSchema-ReventlessPostgres.cmi +0 -0
  35. package/lib/bs/src/PgSchema-ReventlessPostgres.cmt +0 -0
  36. package/lib/bs/src/PgSchema.ast +0 -0
  37. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  38. package/lib/bs/src/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  39. package/lib/bs/src/QueryDbStorage_Postgres.ast +0 -0
  40. package/lib/bs/src/QueryDbStorage_Postgres.res +1 -1
  41. package/lib/bs/src/QueryDbStorage_Postgres.res.mjs +1 -1
  42. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  43. package/lib/bs/src/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  44. package/lib/bs/src/QueryDbStorage_Postgres_Ops.ast +0 -0
  45. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  46. package/lib/bs/src/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  47. package/lib/bs/src/QueryEnginePostgres.ast +0 -0
  48. package/lib/bs/src/QueryEnginePostgres.res +26 -12
  49. package/lib/bs/src/QueryEnginePostgres.res.mjs +26 -26
  50. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  51. package/lib/bs/tests/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  52. package/lib/bs/tests/PostgresIntegrationTest.ast +0 -0
  53. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  54. package/lib/bs/tests/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  55. package/lib/bs/tests/QueryEnginePostgresListPageTest.ast +0 -0
  56. package/lib/bs/tests/QueryEnginePostgresListPageTest.res.mjs +4 -4
  57. package/lib/ocaml/.compiler.log +2 -2
  58. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  59. package/lib/ocaml/DcbEventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  60. package/lib/ocaml/DcbEventLogStorage_Postgres.ast +0 -0
  61. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  62. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  63. package/lib/ocaml/DcbEventLogStorage_Postgres_Ops.ast +0 -0
  64. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmi +0 -0
  65. package/lib/ocaml/EventLogChangeFeed-ReventlessPostgres.cmt +0 -0
  66. package/lib/ocaml/EventLogChangeFeed.ast +0 -0
  67. package/lib/ocaml/EventLogChangeFeed.res +5 -2
  68. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmi +0 -0
  69. package/lib/ocaml/EventLogStorage_Postgres-ReventlessPostgres.cmt +0 -0
  70. package/lib/ocaml/EventLogStorage_Postgres.ast +0 -0
  71. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  72. package/lib/ocaml/EventLogStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  73. package/lib/ocaml/EventLogStorage_Postgres_Ops.ast +0 -0
  74. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmi +0 -0
  75. package/lib/ocaml/PgChangeFeed-ReventlessPostgres.cmt +0 -0
  76. package/lib/ocaml/PgChangeFeed.ast +0 -0
  77. package/lib/ocaml/PgChangeFeed.res +6 -1
  78. package/lib/ocaml/PgDriver-ReventlessPostgres.cmi +0 -0
  79. package/lib/ocaml/PgDriver-ReventlessPostgres.cmt +0 -0
  80. package/lib/ocaml/PgDriver-ReventlessPostgres.cmti +0 -0
  81. package/lib/ocaml/PgDriver.ast +0 -0
  82. package/lib/ocaml/PgDriver.iast +0 -0
  83. package/lib/ocaml/PgSchema-ReventlessPostgres.cmi +0 -0
  84. package/lib/ocaml/PgSchema-ReventlessPostgres.cmt +0 -0
  85. package/lib/ocaml/PgSchema.ast +0 -0
  86. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmi +0 -0
  87. package/lib/ocaml/QueryDbStorage_Postgres-ReventlessPostgres.cmt +0 -0
  88. package/lib/ocaml/QueryDbStorage_Postgres.ast +0 -0
  89. package/lib/ocaml/QueryDbStorage_Postgres.res +1 -1
  90. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmi +0 -0
  91. package/lib/ocaml/QueryDbStorage_Postgres_Ops-ReventlessPostgres.cmt +0 -0
  92. package/lib/ocaml/QueryDbStorage_Postgres_Ops.ast +0 -0
  93. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmi +0 -0
  94. package/lib/ocaml/QueryEnginePostgres-ReventlessPostgres.cmt +0 -0
  95. package/lib/ocaml/QueryEnginePostgres.ast +0 -0
  96. package/lib/ocaml/QueryEnginePostgres.res +26 -12
  97. package/lib/ocaml/ReventlessPostgres.cmt +0 -0
  98. package/package.json +11 -11
  99. package/rescript.json +2 -1
  100. package/src/EventLogChangeFeed.res +5 -2
  101. package/src/EventLogChangeFeed.res.mjs +3 -3
  102. package/src/PgChangeFeed.res +6 -1
  103. package/src/PgChangeFeed.res.mjs +6 -6
  104. package/src/QueryDbStorage_Postgres.res +1 -1
  105. package/src/QueryDbStorage_Postgres.res.mjs +1 -1
  106. package/src/QueryEnginePostgres.res +26 -12
  107. package/src/QueryEnginePostgres.res.mjs +26 -26
  108. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmi +0 -0
  109. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmj +0 -0
  110. package/lib/ocaml/PostgresIntegrationTest-ReventlessPostgres.cmt +0 -0
  111. package/lib/ocaml/PostgresIntegrationTest.ast +0 -0
  112. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmi +0 -0
  113. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmj +0 -0
  114. package/lib/ocaml/QueryEnginePostgresListPageTest-ReventlessPostgres.cmt +0 -0
  115. package/lib/ocaml/QueryEnginePostgresListPageTest.ast +0 -0
  116. package/tests/PostgresIntegrationTest.res.mjs +0 -377
  117. package/tests/QueryEnginePostgresListPageTest.res.mjs +0 -461
@@ -1,461 +0,0 @@
1
- // Generated by ReScript, PLEASE EDIT WITH CARE
2
-
3
- import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
- import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
- import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
- import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
7
- import * as PgDriver$ReventlessPostgres from "../src/PgDriver.res.mjs";
8
- import * as QueryDbListQuery$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/QueryDbListQuery.res.mjs";
9
- import * as QueryEnginePostgres$ReventlessPostgres from "../src/QueryEnginePostgres.res.mjs";
10
- import * as QueryDbStorage_Postgres$ReventlessPostgres from "../src/QueryDbStorage_Postgres.res.mjs";
11
-
12
- let capability_filterFields = [
13
- {
14
- name: "status",
15
- gqlType: "String",
16
- range: false
17
- },
18
- {
19
- name: "qty",
20
- gqlType: "Int",
21
- range: true
22
- }
23
- ];
24
-
25
- let capability_sortFields = [
26
- "name",
27
- "qty",
28
- "status"
29
- ];
30
-
31
- let capability = {
32
- filterFields: capability_filterFields,
33
- sortFields: capability_sortFields
34
- };
35
-
36
- function mk(id, status, name, qty) {
37
- let o = {};
38
- o["id"] = id;
39
- o["status"] = status;
40
- o["name"] = name;
41
- o["qty"] = qty;
42
- return o;
43
- }
44
-
45
- let rows = [
46
- [
47
- "p-1",
48
- "active",
49
- "Charlie",
50
- 3
51
- ],
52
- [
53
- "p-2",
54
- "active",
55
- "Alpha",
56
- 1
57
- ],
58
- [
59
- "p-3",
60
- "inactive",
61
- "Echo",
62
- 5
63
- ],
64
- [
65
- "p-4",
66
- "active",
67
- "Bravo",
68
- 2
69
- ],
70
- [
71
- "p-5",
72
- "inactive",
73
- "Delta",
74
- 4
75
- ]
76
- ];
77
-
78
- let seededItems = rows.map(param => mk(param[0], param[1], param[2], param[3]));
79
-
80
- function field(j, k) {
81
- return Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(j), d => d[k]);
82
- }
83
-
84
- function str(j, k) {
85
- return Stdlib_Option.flatMap(field(j, k), Stdlib_JSON.Decode.string);
86
- }
87
-
88
- function norm(conn) {
89
- let edges = Stdlib_Option.getOr(Stdlib_Option.flatMap(field(conn, "edges"), Stdlib_JSON.Decode.array), []).map(e => ({
90
- id: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(e, "node"), n => str(n, "id")), ""),
91
- cursor: Stdlib_Option.getOr(str(e, "cursor"), "")
92
- }));
93
- let pi = Stdlib_Option.getOr(field(conn, "pageInfo"), null);
94
- return {
95
- edges: edges,
96
- hasNext: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(pi, "hasNextPage"), Stdlib_JSON.Decode.bool), false),
97
- hasPrev: Stdlib_Option.getOr(Stdlib_Option.flatMap(field(pi, "hasPreviousPage"), Stdlib_JSON.Decode.bool), false),
98
- startCursor: str(pi, "startCursor"),
99
- endCursor: str(pi, "endCursor")
100
- };
101
- }
102
-
103
- function argsOf(entries) {
104
- return Object.fromEntries(entries);
105
- }
106
-
107
- function filterOf(entries) {
108
- return Object.fromEntries(entries);
109
- }
110
-
111
- function orderBy(f, dir) {
112
- return Object.fromEntries([
113
- [
114
- "field",
115
- f
116
- ],
117
- [
118
- "direction",
119
- dir
120
- ]
121
- ]);
122
- }
123
-
124
- function expectedFor(argsDict) {
125
- return norm(QueryDbListQuery$ReventlessCore.run(seededItems, argsDict, capability, "name", param => {}));
126
- }
127
-
128
- let url = process.env["PG_URL"];
129
-
130
- if (url !== undefined) {
131
- let pool = PgDriver$ReventlessPostgres.makePool({
132
- connectionString: url
133
- });
134
- let Eng = QueryEnginePostgres$ReventlessPostgres.Make({
135
- pool: pool
136
- });
137
- let name = "listparity";
138
- globalThis.beforeAll(async () => {
139
- let ops = QueryDbStorage_Postgres$ReventlessPostgres.makeOperations(pool, name, [], undefined);
140
- for (let i = 0, i_finish = rows.length; i < i_finish; ++i) {
141
- let match = rows[i];
142
- let id = match[0];
143
- await ops.save(id, mk(id, match[1], match[2], match[3]), "Any", undefined);
144
- }
145
- });
146
- globalThis.afterAll(() => {
147
- PgDriver$ReventlessPostgres.endPool(pool);
148
- });
149
- let checkPushed = async (label, args) => {
150
- let argsDict = Object.fromEntries(args);
151
- let actual = await Eng.listPage(name, argsDict, capability, "name");
152
- if (actual !== undefined) {
153
- globalThis.expect(norm(actual)).toEqual(expectedFor(argsDict));
154
- } else {
155
- globalThis.expect("push-down for " + label).toBe("returned None");
156
- }
157
- };
158
- let checkFallback = async args => {
159
- let r = await Eng.listPage(name, Object.fromEntries(args), capability, "name");
160
- globalThis.expect(Stdlib_Option.isSome(r)).toBe(false);
161
- };
162
- globalThis.describe("QueryDb list push-down parity (Postgres ≡ QueryDbListQuery spec)", () => {
163
- globalThis.test("bare page", () => checkPushed("bare", []));
164
- globalThis.test("first:2", () => checkPushed("first", [[
165
- "first",
166
- 2
167
- ]]));
168
- globalThis.test("first:2 + after", () => checkPushed("after", [
169
- [
170
- "first",
171
- 2
172
- ],
173
- [
174
- "after",
175
- QueryDbListQuery$ReventlessCore.encodeCursor("p-2")
176
- ]
177
- ]));
178
- globalThis.test("statusEq active", () => checkPushed("eq", [[
179
- "filter",
180
- Object.fromEntries([[
181
- "statusEq",
182
- "active"
183
- ]])
184
- ]]));
185
- globalThis.test("statusEq active + first:2", () => checkPushed("eq+first", [
186
- [
187
- "filter",
188
- Object.fromEntries([[
189
- "statusEq",
190
- "active"
191
- ]])
192
- ],
193
- [
194
- "first",
195
- 2
196
- ]
197
- ]));
198
- globalThis.test("orderBy name ASC", () => checkPushed("order-asc", [[
199
- "orderBy",
200
- orderBy("name", "ASC")
201
- ]]));
202
- globalThis.test("orderBy name DESC", () => checkPushed("order-desc", [[
203
- "orderBy",
204
- orderBy("name", "DESC")
205
- ]]));
206
- globalThis.test("orderBy name DESC + first:2 + after", () => checkPushed("order-desc-after", [
207
- [
208
- "orderBy",
209
- orderBy("name", "DESC")
210
- ],
211
- [
212
- "first",
213
- 2
214
- ],
215
- [
216
- "after",
217
- QueryDbListQuery$ReventlessCore.encodeCursor("Delta")
218
- ]
219
- ]));
220
- globalThis.test("orderBy status ASC (tiebreak by id)", () => checkPushed("order-tiebreak", [[
221
- "orderBy",
222
- orderBy("status", "ASC")
223
- ]]));
224
- globalThis.test("qty range From/To (numeric-as-string)", () => checkPushed("range", [[
225
- "filter",
226
- Object.fromEntries([
227
- [
228
- "qtyFrom",
229
- "2"
230
- ],
231
- [
232
- "qtyTo",
233
- "4"
234
- ]
235
- ])
236
- ]]));
237
- globalThis.test("orderBy qty ASC (numeric-as-string sort)", () => checkPushed("order-qty", [[
238
- "orderBy",
239
- orderBy("qty", "ASC")
240
- ]]));
241
- globalThis.test("search → fallback", () => checkFallback([[
242
- "filter",
243
- Object.fromEntries([[
244
- "search",
245
- "alp"
246
- ]])
247
- ]]));
248
- globalThis.test("searchPrefix → fallback", () => checkFallback([[
249
- "filter",
250
- Object.fromEntries([[
251
- "searchPrefix",
252
- "A"
253
- ]])
254
- ]]));
255
- globalThis.test("ids → fallback", () => checkFallback([[
256
- "filter",
257
- Object.fromEntries([[
258
- "ids",
259
- ["p-1"]
260
- ]])
261
- ]]));
262
- globalThis.test("backward (last/before) → fallback", () => checkFallback([
263
- [
264
- "last",
265
- 2
266
- ],
267
- [
268
- "before",
269
- QueryDbListQuery$ReventlessCore.encodeCursor("p-4")
270
- ]
271
- ]));
272
- });
273
- let idsOf = items => Stdlib_Array.filterMap(items, i => str(i, "id")).toSorted(Primitive_string.compare);
274
- globalThis.describe("QueryEnginePostgres index / batch push-downs", () => {
275
- globalThis.test("indexLookup by status = active", async () => {
276
- let items = await Eng.indexLookup(name, "status", "active");
277
- globalThis.expect(idsOf(items)).toEqual([
278
- "p-1",
279
- "p-2",
280
- "p-4"
281
- ]);
282
- });
283
- globalThis.test("indexLookup miss → empty", async () => {
284
- let items = await Eng.indexLookup(name, "status", "nope");
285
- globalThis.expect(items.length).toBe(0);
286
- });
287
- globalThis.test("byIds returns matches, drops missing", async () => {
288
- let items = await Eng.byIds(name, [
289
- "p-1",
290
- "p-3",
291
- "absent"
292
- ]);
293
- globalThis.expect(idsOf(items)).toEqual([
294
- "p-1",
295
- "p-3"
296
- ]);
297
- });
298
- globalThis.test("byIds [] → empty (no query)", async () => {
299
- let items = await Eng.byIds(name, []);
300
- globalThis.expect(items.length).toBe(0);
301
- });
302
- });
303
- let itemsName = "itemsparity";
304
- let mkLine = seq => {
305
- let o = {};
306
- o["id"] = "order-1";
307
- o["seq"] = seq;
308
- return o;
309
- };
310
- let seqs = [
311
- "a",
312
- "b",
313
- "c",
314
- "d",
315
- "e"
316
- ];
317
- globalThis.beforeAll(async () => {
318
- let ops = QueryDbStorage_Postgres$ReventlessPostgres.makeOperations(pool, itemsName, [], "seq");
319
- for (let i = 0, i_finish = seqs.length; i < i_finish; ++i) {
320
- await ops.save("order-1", mkLine(seqs[i]), "Any", undefined);
321
- }
322
- });
323
- let itemSeqs = conn => Stdlib_Array.filterMap(Stdlib_Option.getOr(Stdlib_Option.flatMap(field(conn, "edges"), Stdlib_JSON.Decode.array), []), e => Stdlib_Option.flatMap(field(e, "node"), n => str(n, "seq")));
324
- let pageInfoBool = (conn, key) => Stdlib_Option.getOr(Stdlib_Option.flatMap(field(Stdlib_Option.getOr(field(conn, "pageInfo"), null), key), Stdlib_JSON.Decode.bool), false);
325
- let itemsPage = args => Eng.itemsPage(itemsName, "seq", "order-1", Object.fromEntries(args));
326
- globalThis.describe("QueryEnginePostgres itemsPage (sub-id keyset)", () => {
327
- globalThis.test("bare → all lines ASC, no next page", async () => {
328
- let r = await itemsPage([]);
329
- globalThis.expect(itemSeqs(r)).toEqual([
330
- "a",
331
- "b",
332
- "c",
333
- "d",
334
- "e"
335
- ]);
336
- globalThis.expect(pageInfoBool(r, "hasNextPage")).toBe(false);
337
- });
338
- globalThis.test("first:2 → [a,b], hasNextPage", async () => {
339
- let r = await itemsPage([[
340
- "first",
341
- 2
342
- ]]);
343
- globalThis.expect(itemSeqs(r)).toEqual([
344
- "a",
345
- "b"
346
- ]);
347
- globalThis.expect(pageInfoBool(r, "hasNextPage")).toBe(true);
348
- });
349
- globalThis.test("first:2 after b → [c,d]", async () => {
350
- let r = await itemsPage([
351
- [
352
- "first",
353
- 2
354
- ],
355
- [
356
- "after",
357
- QueryDbListQuery$ReventlessCore.encodeCursor("b")
358
- ]
359
- ]);
360
- globalThis.expect(itemSeqs(r)).toEqual([
361
- "c",
362
- "d"
363
- ]);
364
- });
365
- globalThis.test("order DESC → [e..a]", async () => {
366
- let r = await itemsPage([[
367
- "filter",
368
- Object.fromEntries([[
369
- "order",
370
- "DESC"
371
- ]])
372
- ]]);
373
- globalThis.expect(itemSeqs(r)).toEqual([
374
- "e",
375
- "d",
376
- "c",
377
- "b",
378
- "a"
379
- ]);
380
- });
381
- globalThis.test("filter eq c → [c]", async () => {
382
- let r = await itemsPage([[
383
- "filter",
384
- Object.fromEntries([[
385
- "eq",
386
- "c"
387
- ]])
388
- ]]);
389
- globalThis.expect(itemSeqs(r)).toEqual(["c"]);
390
- });
391
- globalThis.test("filter from b to d → [b,c,d]", async () => {
392
- let r = await itemsPage([[
393
- "filter",
394
- Object.fromEntries([
395
- [
396
- "from",
397
- "b"
398
- ],
399
- [
400
- "to",
401
- "d"
402
- ]
403
- ])
404
- ]]);
405
- globalThis.expect(itemSeqs(r)).toEqual([
406
- "b",
407
- "c",
408
- "d"
409
- ]);
410
- });
411
- globalThis.test("prefix c → [c]", async () => {
412
- let r = await itemsPage([[
413
- "filter",
414
- Object.fromEntries([[
415
- "prefix",
416
- "c"
417
- ]])
418
- ]]);
419
- globalThis.expect(itemSeqs(r)).toEqual(["c"]);
420
- });
421
- globalThis.test("backward last:2 before d → [b,c] (logical ASC)", async () => {
422
- let r = await itemsPage([
423
- [
424
- "last",
425
- 2
426
- ],
427
- [
428
- "before",
429
- QueryDbListQuery$ReventlessCore.encodeCursor("d")
430
- ]
431
- ]);
432
- globalThis.expect(itemSeqs(r)).toEqual([
433
- "b",
434
- "c"
435
- ]);
436
- globalThis.expect(pageInfoBool(r, "hasPreviousPage")).toBe(true);
437
- });
438
- });
439
- } else {
440
- globalThis.test("Postgres list push-down parity (skipped — set PG_URL to run)", () => {
441
- globalThis.expect(true).toBe(true);
442
- });
443
- }
444
-
445
- let cur = QueryDbListQuery$ReventlessCore.encodeCursor;
446
-
447
- export {
448
- capability,
449
- mk,
450
- rows,
451
- seededItems,
452
- field,
453
- str,
454
- norm,
455
- argsOf,
456
- filterOf,
457
- orderBy,
458
- cur,
459
- expectedFor,
460
- }
461
- /* seededItems Not a pure module */