@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.
- package/CHANGELOG.md +9 -0
- package/package.json +6 -6
- package/src/Platform.res +12 -0
- package/src/Platform.res.mjs +9 -0
- package/src/adapter/QueryDb/PgQueryResolver_Builder.res +281 -0
- package/src/adapter/QueryDb/PgQueryResolver_Builder.res.mjs +189 -0
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +152 -9
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res.mjs +115 -4
- package/src/adapter/QueryDb/QueryDbResolvers.res +6 -5
- package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +6 -3
- package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res +264 -0
- package/src/adapter/QueryDb/QueryDbResolvers_Lambda.res.mjs +164 -0
- package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +5 -1
- package/src/adapter/QueryDb/QueryDbStorage_Postgres.res.mjs +3 -3
- package/src/adapter/Runtime/PgQueryResolverEntryPoint.mjs +88 -0
- package/tests/PgQueryResolver_LambdaTest.res +104 -2
- package/tests/PgQueryResolver_LambdaTest.res.mjs +144 -11
|
@@ -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:
|
|
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;
|