@reventlessdev/reventless-aws 3.0.0-alpha.175 → 3.0.0-alpha.176
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 +13 -0
- package/package.json +10 -10
- package/src/Platform.res +115 -31
- package/src/Platform.res.mjs +217 -44
- package/src/adapter/DcbEventLog/DcbBackend.res +2 -2
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res +4 -1
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream.res.mjs +1 -1
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res +14 -4
- package/src/adapter/EventCollector/EventCollectorChannel_DynamoDbStream_Runtime.res.mjs +19 -14
- package/src/adapter/EventLog/EventLogBackend.res +82 -0
- package/src/adapter/EventLog/EventLogBackend.res.mjs +53 -0
- package/src/adapter/EventLog/EventLogStorage.res +15 -0
- package/src/adapter/EventLog/EventLogStorage.res.mjs +20 -1
- package/src/adapter/EventLog/EventLogStorage_Postgres.res +37 -0
- package/src/adapter/EventLog/EventLogStorage_Postgres.res.mjs +21 -0
- package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res +26 -11
- package/src/adapter/Postgres/PgChangeFeedRelay_Builder.res.mjs +15 -6
- package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res +54 -0
- package/src/adapter/Postgres/PgChangeFeedRelay_Runtime.res.mjs +23 -0
- package/src/adapter/Postgres/PgProjectionFeed.res +100 -0
- package/src/adapter/Postgres/PgProjectionFeed.res.mjs +54 -0
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +192 -0
- package/src/adapter/QueryDb/PgQueryResolver_Lambda.res.mjs +141 -0
- package/src/adapter/QueryDb/QueryDbBackend.res +52 -0
- package/src/adapter/QueryDb/QueryDbBackend.res.mjs +44 -0
- package/src/adapter/QueryDb/QueryDbResolvers.res +48 -0
- package/src/adapter/QueryDb/QueryDbResolvers.res.mjs +17 -1
- package/src/adapter/QueryDb/QueryDbStorage.res +44 -0
- package/src/adapter/QueryDb/QueryDbStorage.res.mjs +34 -1
- package/src/adapter/QueryDb/QueryDbStorage_Postgres.res +43 -0
- package/src/adapter/QueryDb/QueryDbStorage_Postgres.res.mjs +21 -0
- package/src/adapter/QueryDb/QueryDbStorage_Postgres_Runtime.res +19 -0
- package/src/adapter/QueryDb/QueryDbStorage_Postgres_Runtime.res.mjs +15 -0
- package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res +12 -1
- package/src/adapter/QueryEngine/QueryEngine_DynamoDb.res.mjs +2 -1
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +83 -3
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +46 -3
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +83 -3
- package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +48 -3
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res +130 -5
- package/src/adapter/Runtime/EventCollectorRuntime_Builder_Single.res.mjs +66 -6
- package/src/adapter/Runtime/PgChangeFeedRelayEntryPoint.mjs +15 -10
- package/src/adapter/Runtime/ReadModelEntryPoint.mjs +32 -15
- package/src/adapter/Runtime/StateViewSliceEntryPoint.mjs +26 -12
- package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res +138 -8
- package/src/adapter/Runtime/StateViewSliceRuntime_Builder_Single.res.mjs +76 -11
- package/src/components/Aggregate_Builder_Single.res +12 -5
- package/src/components/Aggregate_Builder_Single.res.mjs +12 -6
- package/src/components/Aggregate_Builder_Single_Async.res +12 -5
- package/src/components/Aggregate_Builder_Single_Async.res.mjs +12 -6
- package/src/components/ReadModel_Builder_NoResolver.res.mjs +1 -1
- package/src/components/ReadModel_Builder_NoResolver_Stream.res +13 -4
- package/src/components/ReadModel_Builder_NoResolver_Stream.res.mjs +14 -9
- package/src/components/ReadModel_Builder_Single.res +14 -5
- package/src/components/ReadModel_Builder_Single.res.mjs +15 -12
- package/src/components/ReadModel_Builder_Single_Stream.res +14 -5
- package/src/components/ReadModel_Builder_Single_Stream.res.mjs +15 -12
- package/src/components/StateViewSlice_Builder.res +10 -4
- package/src/components/StateViewSlice_Builder.res.mjs +8 -10
- package/src/components/StateViewSlice_Builder_Stream.res +10 -4
- package/src/components/StateViewSlice_Builder_Stream.res.mjs +8 -10
- package/src/plugin/runtime/PluginRuntime_Builder.res +12 -0
- package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +4 -0
- package/tests/EventCollectorChannelStreamRuntimeTest.res +55 -0
- package/tests/EventCollectorChannelStreamRuntimeTest.res.mjs +78 -0
- package/tests/PgChangeFeedRelay_IntegrationTest.res +115 -4
- package/tests/PgChangeFeedRelay_IntegrationTest.res.mjs +84 -0
- package/tests/PgPipeline_IntegrationTest.res +208 -0
- package/tests/PgPipeline_IntegrationTest.res.mjs +260 -0
- package/tests/PgQueryResolver_LambdaTest.res +206 -0
- package/tests/PgQueryResolver_LambdaTest.res.mjs +259 -0
|
@@ -0,0 +1,259 @@
|
|
|
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 Identity$Reventless from "@reventlessdev/reventless-spec/src/types/Identity.res.mjs";
|
|
8
|
+
import * as QueryDb_Callback$ReventlessCore from "@reventlessdev/reventless-core/src/components/QueryDb/QueryDb_Callback.res.mjs";
|
|
9
|
+
import * as PgQueryResolver_Lambda$ReventlessAws from "../src/adapter/QueryDb/PgQueryResolver_Lambda.res.mjs";
|
|
10
|
+
|
|
11
|
+
function mk(id, status, name) {
|
|
12
|
+
let o = {};
|
|
13
|
+
o["id"] = id;
|
|
14
|
+
o["status"] = status;
|
|
15
|
+
o["name"] = name;
|
|
16
|
+
return o;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let store = Object.fromEntries([
|
|
20
|
+
[
|
|
21
|
+
"p-1",
|
|
22
|
+
mk("p-1", "active", "Alpha")
|
|
23
|
+
],
|
|
24
|
+
[
|
|
25
|
+
"p-2",
|
|
26
|
+
mk("p-2", "inactive", "Bravo")
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
"p-3",
|
|
30
|
+
mk("p-3", "active", "Charlie")
|
|
31
|
+
]
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
function allItems() {
|
|
35
|
+
return Object.values(store);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function fieldEq(item, field, value) {
|
|
39
|
+
return Stdlib_Option.mapOr(Stdlib_Option.flatMap(Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(item), d => d[field]), Stdlib_JSON.Decode.string), false, v => v === value);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let listPageReturn = {
|
|
43
|
+
contents: undefined
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
async function ops_load(id) {
|
|
47
|
+
return {
|
|
48
|
+
TAG: "Ok",
|
|
49
|
+
_0: Stdlib_Option.mapOr(store[id], [], i => [i])
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let ops = {
|
|
54
|
+
load: ops_load,
|
|
55
|
+
loadStream: 0,
|
|
56
|
+
save: 0,
|
|
57
|
+
saveBatch: 0,
|
|
58
|
+
count: 0,
|
|
59
|
+
delete: 0,
|
|
60
|
+
deleteBatch: 0
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
async function pushdowns_indexLookup(param, field, value) {
|
|
64
|
+
return Object.values(store).filter(i => fieldEq(i, field, value));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function pushdowns_byIds(param, ids) {
|
|
68
|
+
return Stdlib_Array.filterMap(ids, id => store[id]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function pushdowns_listPage(param, param$1, param$2, param$3) {
|
|
72
|
+
return listPageReturn.contents;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function pushdowns_scanAll(param) {
|
|
76
|
+
return Object.values(store);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let pushdowns = {
|
|
80
|
+
indexLookup: pushdowns_indexLookup,
|
|
81
|
+
byIds: pushdowns_byIds,
|
|
82
|
+
listPage: pushdowns_listPage,
|
|
83
|
+
scanAll: pushdowns_scanAll
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
let capability_filterFields = [{
|
|
87
|
+
name: "status",
|
|
88
|
+
gqlType: "String",
|
|
89
|
+
range: false
|
|
90
|
+
}];
|
|
91
|
+
|
|
92
|
+
let capability_sortFields = [
|
|
93
|
+
"name",
|
|
94
|
+
"status"
|
|
95
|
+
];
|
|
96
|
+
|
|
97
|
+
let capability = {
|
|
98
|
+
filterFields: capability_filterFields,
|
|
99
|
+
sortFields: capability_sortFields
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
function makeBinding(authorizationOpt, param) {
|
|
103
|
+
let authorization = authorizationOpt !== undefined ? authorizationOpt : "AllowAnonymous";
|
|
104
|
+
return {
|
|
105
|
+
ops: ops,
|
|
106
|
+
pushdowns: pushdowns,
|
|
107
|
+
indexes: [{
|
|
108
|
+
index: "byStatus",
|
|
109
|
+
type_: "S",
|
|
110
|
+
idField: "status",
|
|
111
|
+
projectionType: "ALL"
|
|
112
|
+
}],
|
|
113
|
+
subIdField: undefined,
|
|
114
|
+
capability: capability,
|
|
115
|
+
labelField: "name",
|
|
116
|
+
includeIdParam: true,
|
|
117
|
+
authorization: authorization
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function mkPayload(kind, index, argsOpt, param) {
|
|
122
|
+
let args = argsOpt !== undefined ? argsOpt : ({});
|
|
123
|
+
return {
|
|
124
|
+
readModelName: "Things",
|
|
125
|
+
kind: kind,
|
|
126
|
+
index: index,
|
|
127
|
+
arguments: args,
|
|
128
|
+
identity: Identity$Reventless.anonymous
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function objArgs(pairs) {
|
|
133
|
+
return Object.fromEntries(pairs);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function field(j, k) {
|
|
137
|
+
return Stdlib_Option.flatMap(Stdlib_JSON.Decode.object(j), d => d[k]);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function str(j, k) {
|
|
141
|
+
return Stdlib_Option.flatMap(field(j, k), Stdlib_JSON.Decode.string);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function ids(arr) {
|
|
145
|
+
return Stdlib_Array.filterMap(Stdlib_Option.getOr(Stdlib_JSON.Decode.array(arr), []), i => str(i, "id")).toSorted(Primitive_string.compare);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
globalThis.describe("PgQueryResolver_Lambda.dispatch", () => {
|
|
149
|
+
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([[
|
|
151
|
+
"id",
|
|
152
|
+
"p-2"
|
|
153
|
+
]]), undefined));
|
|
154
|
+
globalThis.expect(str(r, "id")).toEqual("p-2");
|
|
155
|
+
globalThis.expect(str(r, "name")).toEqual("Bravo");
|
|
156
|
+
});
|
|
157
|
+
globalThis.test("getById miss → null", async () => {
|
|
158
|
+
let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
|
|
159
|
+
"id",
|
|
160
|
+
"absent"
|
|
161
|
+
]]), undefined));
|
|
162
|
+
globalThis.expect(r).toBe(null);
|
|
163
|
+
});
|
|
164
|
+
globalThis.test("byIds returns matches, drops missing", async () => {
|
|
165
|
+
let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("byIds", undefined, Object.fromEntries([[
|
|
166
|
+
"ids",
|
|
167
|
+
[
|
|
168
|
+
"p-1",
|
|
169
|
+
"absent",
|
|
170
|
+
"p-3"
|
|
171
|
+
].map(prim => prim)
|
|
172
|
+
]]), undefined));
|
|
173
|
+
globalThis.expect(ids(r)).toEqual([
|
|
174
|
+
"p-1",
|
|
175
|
+
"p-3"
|
|
176
|
+
]);
|
|
177
|
+
});
|
|
178
|
+
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([[
|
|
180
|
+
"byStatus",
|
|
181
|
+
"active"
|
|
182
|
+
]]), undefined));
|
|
183
|
+
globalThis.expect(ids(r)).toEqual([
|
|
184
|
+
"p-1",
|
|
185
|
+
"p-3"
|
|
186
|
+
]);
|
|
187
|
+
});
|
|
188
|
+
globalThis.test("list with push-down → returns the connection listPage gives", async () => {
|
|
189
|
+
listPageReturn.contents = "PUSHED";
|
|
190
|
+
let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("list", undefined, undefined, undefined));
|
|
191
|
+
listPageReturn.contents = undefined;
|
|
192
|
+
globalThis.expect(r).toEqual("PUSHED");
|
|
193
|
+
});
|
|
194
|
+
globalThis.test("list without push-down → falls back to the shared spec", async () => {
|
|
195
|
+
listPageReturn.contents = undefined;
|
|
196
|
+
let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("list", undefined, undefined, undefined));
|
|
197
|
+
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
|
+
globalThis.expect(edgeIds).toEqual([
|
|
199
|
+
"p-1",
|
|
200
|
+
"p-2",
|
|
201
|
+
"p-3"
|
|
202
|
+
]);
|
|
203
|
+
});
|
|
204
|
+
globalThis.test("authorization DenyAll → empty shape per kind", async () => {
|
|
205
|
+
let b = makeBinding("DenyAll", undefined);
|
|
206
|
+
let single = await PgQueryResolver_Lambda$ReventlessAws.dispatch(b, mkPayload("getById", undefined, Object.fromEntries([[
|
|
207
|
+
"id",
|
|
208
|
+
"p-1"
|
|
209
|
+
]]), undefined));
|
|
210
|
+
globalThis.expect(single).toBe(null);
|
|
211
|
+
let list = await PgQueryResolver_Lambda$ReventlessAws.dispatch(b, mkPayload("list", undefined, undefined, undefined));
|
|
212
|
+
globalThis.expect(Stdlib_Option.getOr(Stdlib_Option.flatMap(field(list, "edges"), Stdlib_JSON.Decode.array), []).length).toBe(0);
|
|
213
|
+
let byIds = await PgQueryResolver_Lambda$ReventlessAws.dispatch(b, mkPayload("byIds", undefined, Object.fromEntries([[
|
|
214
|
+
"ids",
|
|
215
|
+
[]
|
|
216
|
+
]]), undefined));
|
|
217
|
+
globalThis.expect(Stdlib_Option.getOr(Stdlib_JSON.Decode.array(byIds), []).length).toBe(0);
|
|
218
|
+
});
|
|
219
|
+
globalThis.test("queryInterceptor hook Deny → empty shape (auth allowed)", async () => {
|
|
220
|
+
QueryDb_Callback$ReventlessCore.registerQueryInterceptor(async (param, param$1, param$2) => ({
|
|
221
|
+
TAG: "Deny",
|
|
222
|
+
_0: "nope"
|
|
223
|
+
}));
|
|
224
|
+
let r = await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("getById", undefined, Object.fromEntries([[
|
|
225
|
+
"id",
|
|
226
|
+
"p-1"
|
|
227
|
+
]]), undefined));
|
|
228
|
+
QueryDb_Callback$ReventlessCore.clearQueryInterceptor();
|
|
229
|
+
globalThis.expect(r).toBe(null);
|
|
230
|
+
});
|
|
231
|
+
globalThis.test("unmapped kind throws", async () => {
|
|
232
|
+
let threw;
|
|
233
|
+
try {
|
|
234
|
+
await PgQueryResolver_Lambda$ReventlessAws.dispatch(makeBinding(undefined, undefined), mkPayload("frobnicate", undefined, undefined, undefined));
|
|
235
|
+
threw = false;
|
|
236
|
+
} catch (exn) {
|
|
237
|
+
threw = true;
|
|
238
|
+
}
|
|
239
|
+
globalThis.expect(threw).toBe(true);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
export {
|
|
244
|
+
mk,
|
|
245
|
+
store,
|
|
246
|
+
allItems,
|
|
247
|
+
fieldEq,
|
|
248
|
+
listPageReturn,
|
|
249
|
+
ops,
|
|
250
|
+
pushdowns,
|
|
251
|
+
capability,
|
|
252
|
+
makeBinding,
|
|
253
|
+
mkPayload,
|
|
254
|
+
objArgs,
|
|
255
|
+
field,
|
|
256
|
+
str,
|
|
257
|
+
ids,
|
|
258
|
+
}
|
|
259
|
+
/* store Not a pure module */
|