@reventlessdev/reventless-aws 3.0.0-alpha.176 → 3.0.0-alpha.177

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.
@@ -3,6 +3,7 @@
3
3
  import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
4
4
  import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
5
5
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6
+ import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
6
7
  import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
7
8
  import * as Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
8
9
  import * as QueryDb_Callback$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Callback.res.mjs";
@@ -72,6 +73,13 @@ async function pushdowns_listPage(param, param$1, param$2, param$3) {
72
73
  return listPageReturn.contents;
73
74
  }
74
75
 
76
+ async function pushdowns_itemsPage(param, param$1, id, param$2) {
77
+ return Object.fromEntries([[
78
+ "itemsFor",
79
+ id
80
+ ]]);
81
+ }
82
+
75
83
  async function pushdowns_scanAll(param) {
76
84
  return Object.values(store);
77
85
  }
@@ -80,6 +88,7 @@ let pushdowns = {
80
88
  indexLookup: pushdowns_indexLookup,
81
89
  byIds: pushdowns_byIds,
82
90
  listPage: pushdowns_listPage,
91
+ itemsPage: pushdowns_itemsPage,
83
92
  scanAll: pushdowns_scanAll
84
93
  };
85
94
 
@@ -99,8 +108,9 @@ let capability = {
99
108
  sortFields: capability_sortFields
100
109
  };
101
110
 
102
- function makeBinding(authorizationOpt, param) {
111
+ function makeBinding(authorizationOpt, subIdFieldOpt, param) {
103
112
  let authorization = authorizationOpt !== undefined ? authorizationOpt : "AllowAnonymous";
113
+ let subIdField = subIdFieldOpt !== undefined ? Primitive_option.valFromOption(subIdFieldOpt) : undefined;
104
114
  return {
105
115
  ops: ops,
106
116
  pushdowns: pushdowns,
@@ -110,7 +120,7 @@ function makeBinding(authorizationOpt, param) {
110
120
  idField: "status",
111
121
  projectionType: "ALL"
112
122
  }],
113
- subIdField: undefined,
123
+ subIdField: subIdField,
114
124
  capability: capability,
115
125
  labelField: "name",
116
126
  includeIdParam: true,
@@ -147,7 +157,7 @@ function ids(arr) {
147
157
 
148
158
  globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
149
159
  globalThis.test("getById returns the item (id-carrying)", async () => {
150
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
160
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
151
161
  "id",
152
162
  "p-2"
153
163
  ]]), undefined));
@@ -155,14 +165,14 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
155
165
  globalThis.expect(str(r, "name")).toEqual("Bravo");
156
166
  });
157
167
  globalThis.test("getById miss → null", async () => {
158
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
168
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
159
169
  "id",
160
170
  "absent"
161
171
  ]]), undefined));
162
172
  globalThis.expect(r).toBe(null);
163
173
  });
164
174
  globalThis.test("byIds returns matches, drops missing", async () => {
165
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("byIds", undefined, Object.fromEntries([[
175
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("byIds", undefined, Object.fromEntries([[
166
176
  "ids",
167
177
  [
168
178
  "p-1",
@@ -176,7 +186,7 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
176
186
  ]);
177
187
  });
178
188
  globalThis.test("index routes to indexLookup on the idField", async () => {
179
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("index", "byStatus", Object.fromEntries([[
189
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("index", "byStatus", Object.fromEntries([[
180
190
  "byStatus",
181
191
  "active"
182
192
  ]]), undefined));
@@ -187,13 +197,13 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
187
197
  });
188
198
  globalThis.test("list with push-down → returns the connection listPage gives", async () => {
189
199
  listPageReturn.contents = "PUSHED";
190
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("list", undefined, undefined, undefined));
200
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("list", undefined, undefined, undefined));
191
201
  listPageReturn.contents = undefined;
192
202
  globalThis.expect(r).toEqual("PUSHED");
193
203
  });
194
204
  globalThis.test("list without push-down → falls back to the shared spec", async () => {
195
205
  listPageReturn.contents = undefined;
196
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("list", undefined, undefined, undefined));
206
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("list", undefined, undefined, undefined));
197
207
  let edgeIds = Stdlib_Array.filterMap(Stdlib_Option.getOr(Stdlib_Option.flatMap(field(r, "edges"), Stdlib_JSON.Decode.array), []), e => Stdlib_Option.flatMap(field(e, "node"), n => str(n, "id")));
198
208
  globalThis.expect(edgeIds).toEqual([
199
209
  "p-1",
@@ -201,8 +211,22 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
201
211
  "p-3"
202
212
  ]);
203
213
  });
214
+ globalThis.test("items with subId routes to itemsPage (id echoed)", async () => {
215
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, "seq", undefined), mkPayload("items", undefined, Object.fromEntries([[
216
+ "id",
217
+ "p-2"
218
+ ]]), undefined));
219
+ globalThis.expect(str(r, "itemsFor")).toEqual("p-2");
220
+ });
221
+ globalThis.test("items without subId → empty connection", async () => {
222
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("items", undefined, Object.fromEntries([[
223
+ "id",
224
+ "p-2"
225
+ ]]), undefined));
226
+ globalThis.expect(Stdlib_Option.getOr(Stdlib_Option.flatMap(field(r, "edges"), Stdlib_JSON.Decode.array), []).length).toBe(0);
227
+ });
204
228
  globalThis.test("authorization DenyAll → empty shape per kind", async () => {
205
- let b = makeBinding("DenyAll", undefined);
229
+ let b = makeBinding("DenyAll", undefined, undefined);
206
230
  let single = await PgQueryResolver_Lambda$ReventlessAws.dispatch(b, mkPayload("getById", undefined, Object.fromEntries([[
207
231
  "id",
208
232
  "p-1"
@@ -221,17 +245,126 @@ globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
221
245
  TAG: "Deny",
222
246
  _0: "nope"
223
247
  }));
224
- let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
248
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
225
249
  "id",
226
250
  "p-1"
227
251
  ]]), undefined));
228
252
  QueryDb_Callback$ReventlessCore.clearQueryInterceptor();
229
253
  globalThis.expect(r).toBe(null);
230
254
  });
255
+ globalThis.test("resolveOne loads target by parent's id field", async () => {
256
+ let payload_target = "Things";
257
+ let payload_source = Object.fromEntries([[
258
+ "ref",
259
+ "p-2"
260
+ ]]);
261
+ let payload_sourceIdField = "ref";
262
+ let payload_multi = false;
263
+ let payload_arguments = Object.fromEntries([]);
264
+ let payload = {
265
+ readModelName: "Things",
266
+ kind: "resolveOne",
267
+ target: payload_target,
268
+ source: payload_source,
269
+ sourceIdField: payload_sourceIdField,
270
+ multi: payload_multi,
271
+ arguments: payload_arguments,
272
+ identity: Identity$Reventless.anonymous
273
+ };
274
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), payload);
275
+ globalThis.expect(str(r, "id")).toEqual("p-2");
276
+ });
277
+ globalThis.test("resolveOne multi via target index → array", async () => {
278
+ let payload_target = "Things";
279
+ let payload_source = Object.fromEntries([[
280
+ "st",
281
+ "active"
282
+ ]]);
283
+ let payload_sourceIdField = "st";
284
+ let payload_targetIndex = "byStatus";
285
+ let payload_targetIndexIdField = "status";
286
+ let payload_multi = true;
287
+ let payload_arguments = Object.fromEntries([]);
288
+ let payload = {
289
+ readModelName: "Things",
290
+ kind: "resolveOne",
291
+ target: payload_target,
292
+ source: payload_source,
293
+ sourceIdField: payload_sourceIdField,
294
+ targetIndex: payload_targetIndex,
295
+ targetIndexIdField: payload_targetIndexIdField,
296
+ multi: payload_multi,
297
+ arguments: payload_arguments,
298
+ identity: Identity$Reventless.anonymous
299
+ };
300
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), payload);
301
+ globalThis.expect(ids(r)).toEqual([
302
+ "p-1",
303
+ "p-3"
304
+ ]);
305
+ });
306
+ globalThis.test("resolveMany batch-loads target by parent's ids field", async () => {
307
+ let payload_target = "Things";
308
+ let payload_source = Object.fromEntries([[
309
+ "refs",
310
+ [
311
+ "p-1",
312
+ "x",
313
+ "p-3"
314
+ ].map(prim => prim)
315
+ ]]);
316
+ let payload_sourceIdsField = "refs";
317
+ let payload_arguments = Object.fromEntries([]);
318
+ let payload = {
319
+ readModelName: "Things",
320
+ kind: "resolveMany",
321
+ target: payload_target,
322
+ source: payload_source,
323
+ sourceIdsField: payload_sourceIdsField,
324
+ arguments: payload_arguments,
325
+ identity: Identity$Reventless.anonymous
326
+ };
327
+ let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), payload);
328
+ globalThis.expect(ids(r)).toEqual([
329
+ "p-1",
330
+ "p-3"
331
+ ]);
332
+ });
333
+ globalThis.test("node decodes global id → __typename + item", async () => {
334
+ PgQueryResolver_Lambda$ReventlessAws.register("Things", makeBinding(undefined, undefined, undefined));
335
+ PgQueryResolver_Lambda$ReventlessAws.registerNodeType("Thing", "Things");
336
+ let payload_arguments = Object.fromEntries([[
337
+ "id",
338
+ btoa("Thing:p-2")
339
+ ]]);
340
+ let payload = {
341
+ readModelName: "",
342
+ kind: "node",
343
+ arguments: payload_arguments,
344
+ identity: Identity$Reventless.anonymous
345
+ };
346
+ let r = await PgQueryResolver_Lambda$ReventlessAws.handler(payload, null);
347
+ globalThis.expect(str(r, "__typename")).toEqual("Thing");
348
+ globalThis.expect(str(r, "name")).toEqual("Bravo");
349
+ });
350
+ globalThis.test("node with unknown type → null", async () => {
351
+ let payload_arguments = Object.fromEntries([[
352
+ "id",
353
+ btoa("Nope:p-1")
354
+ ]]);
355
+ let payload = {
356
+ readModelName: "",
357
+ kind: "node",
358
+ arguments: payload_arguments,
359
+ identity: Identity$Reventless.anonymous
360
+ };
361
+ let r = await PgQueryResolver_Lambda$ReventlessAws.handler(payload, null);
362
+ globalThis.expect(r).toBe(null);
363
+ });
231
364
  globalThis.test("unmapped kind throws", async () => {
232
365
  let threw;
233
366
  try {
234
- await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("frobnicate", undefined, undefined, undefined));
367
+ await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined, undefined), mkPayload("frobnicate", undefined, undefined, undefined));
235
368
  threw = false;
236
369
  } catch (exn) {
237
370
  threw = true;