@reventlessdev/reventless-seed-aws 1.0.0-alpha.10

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 (87) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/LICENSE +202 -0
  3. package/lib/bs/.compiler.log +2 -0
  4. package/lib/bs/.sourcedirs.json +1 -0
  5. package/lib/bs/build.ninja +0 -0
  6. package/lib/bs/compiler-info.json +8 -0
  7. package/lib/bs/src/ReventlessSeedAws.ast +0 -0
  8. package/lib/bs/src/ReventlessSeedAws.cmi +0 -0
  9. package/lib/bs/src/ReventlessSeedAws.cmj +0 -0
  10. package/lib/bs/src/ReventlessSeedAws.cmt +0 -0
  11. package/lib/bs/src/ReventlessSeedAws.res +328 -0
  12. package/lib/bs/src/ReventlessSeedAws.res.mjs +309 -0
  13. package/lib/bs/src/ReventlessSeedAws_Reconcile.ast +0 -0
  14. package/lib/bs/src/ReventlessSeedAws_Reconcile.cmi +0 -0
  15. package/lib/bs/src/ReventlessSeedAws_Reconcile.cmj +0 -0
  16. package/lib/bs/src/ReventlessSeedAws_Reconcile.cmt +0 -0
  17. package/lib/bs/src/ReventlessSeedAws_Reconcile.res +389 -0
  18. package/lib/bs/src/ReventlessSeedAws_Reconcile.res.mjs +318 -0
  19. package/lib/bs/src/ReventlessSeedAws_Reset.ast +0 -0
  20. package/lib/bs/src/ReventlessSeedAws_Reset.cmi +0 -0
  21. package/lib/bs/src/ReventlessSeedAws_Reset.cmj +0 -0
  22. package/lib/bs/src/ReventlessSeedAws_Reset.cmt +0 -0
  23. package/lib/bs/src/ReventlessSeedAws_Reset.res +948 -0
  24. package/lib/bs/src/ReventlessSeedAws_Reset.res.mjs +861 -0
  25. package/lib/bs/tests/EndpointResolutionTest.ast +0 -0
  26. package/lib/bs/tests/EndpointResolutionTest.cmi +0 -0
  27. package/lib/bs/tests/EndpointResolutionTest.cmj +0 -0
  28. package/lib/bs/tests/EndpointResolutionTest.cmt +0 -0
  29. package/lib/bs/tests/EndpointResolutionTest.res +83 -0
  30. package/lib/bs/tests/EndpointResolutionTest.res.mjs +115 -0
  31. package/lib/bs/tests/ObjectStoreReconcileTest.ast +0 -0
  32. package/lib/bs/tests/ObjectStoreReconcileTest.cmi +0 -0
  33. package/lib/bs/tests/ObjectStoreReconcileTest.cmj +0 -0
  34. package/lib/bs/tests/ObjectStoreReconcileTest.cmt +0 -0
  35. package/lib/bs/tests/ObjectStoreReconcileTest.res +84 -0
  36. package/lib/bs/tests/ObjectStoreReconcileTest.res.mjs +102 -0
  37. package/lib/bs/tests/ObjectStoreResetTest.ast +0 -0
  38. package/lib/bs/tests/ObjectStoreResetTest.cmi +0 -0
  39. package/lib/bs/tests/ObjectStoreResetTest.cmj +0 -0
  40. package/lib/bs/tests/ObjectStoreResetTest.cmt +0 -0
  41. package/lib/bs/tests/ObjectStoreResetTest.res +170 -0
  42. package/lib/bs/tests/ObjectStoreResetTest.res.mjs +211 -0
  43. package/lib/ocaml/.compiler.log +2 -0
  44. package/lib/ocaml/EndpointResolutionTest.ast +0 -0
  45. package/lib/ocaml/EndpointResolutionTest.cmi +0 -0
  46. package/lib/ocaml/EndpointResolutionTest.cmj +0 -0
  47. package/lib/ocaml/EndpointResolutionTest.cmt +0 -0
  48. package/lib/ocaml/EndpointResolutionTest.res +83 -0
  49. package/lib/ocaml/ObjectStoreReconcileTest.ast +0 -0
  50. package/lib/ocaml/ObjectStoreReconcileTest.cmi +0 -0
  51. package/lib/ocaml/ObjectStoreReconcileTest.cmj +0 -0
  52. package/lib/ocaml/ObjectStoreReconcileTest.cmt +0 -0
  53. package/lib/ocaml/ObjectStoreReconcileTest.res +84 -0
  54. package/lib/ocaml/ObjectStoreResetTest.ast +0 -0
  55. package/lib/ocaml/ObjectStoreResetTest.cmi +0 -0
  56. package/lib/ocaml/ObjectStoreResetTest.cmj +0 -0
  57. package/lib/ocaml/ObjectStoreResetTest.cmt +0 -0
  58. package/lib/ocaml/ObjectStoreResetTest.res +170 -0
  59. package/lib/ocaml/ReventlessSeedAws.ast +0 -0
  60. package/lib/ocaml/ReventlessSeedAws.cmi +0 -0
  61. package/lib/ocaml/ReventlessSeedAws.cmj +0 -0
  62. package/lib/ocaml/ReventlessSeedAws.cmt +0 -0
  63. package/lib/ocaml/ReventlessSeedAws.res +328 -0
  64. package/lib/ocaml/ReventlessSeedAws_Reconcile.ast +0 -0
  65. package/lib/ocaml/ReventlessSeedAws_Reconcile.cmi +0 -0
  66. package/lib/ocaml/ReventlessSeedAws_Reconcile.cmj +0 -0
  67. package/lib/ocaml/ReventlessSeedAws_Reconcile.cmt +0 -0
  68. package/lib/ocaml/ReventlessSeedAws_Reconcile.res +389 -0
  69. package/lib/ocaml/ReventlessSeedAws_Reset.ast +0 -0
  70. package/lib/ocaml/ReventlessSeedAws_Reset.cmi +0 -0
  71. package/lib/ocaml/ReventlessSeedAws_Reset.cmj +0 -0
  72. package/lib/ocaml/ReventlessSeedAws_Reset.cmt +0 -0
  73. package/lib/ocaml/ReventlessSeedAws_Reset.res +948 -0
  74. package/package.json +32 -0
  75. package/rescript.json +29 -0
  76. package/src/ReventlessSeedAws.res +328 -0
  77. package/src/ReventlessSeedAws.res.mjs +309 -0
  78. package/src/ReventlessSeedAws_Reconcile.res +389 -0
  79. package/src/ReventlessSeedAws_Reconcile.res.mjs +318 -0
  80. package/src/ReventlessSeedAws_Reset.res +948 -0
  81. package/src/ReventlessSeedAws_Reset.res.mjs +861 -0
  82. package/tests/EndpointResolutionTest.res +83 -0
  83. package/tests/EndpointResolutionTest.res.mjs +115 -0
  84. package/tests/ObjectStoreReconcileTest.res +84 -0
  85. package/tests/ObjectStoreReconcileTest.res.mjs +102 -0
  86. package/tests/ObjectStoreResetTest.res +170 -0
  87. package/tests/ObjectStoreResetTest.res.mjs +211 -0
@@ -0,0 +1,309 @@
1
+ // Generated by ReScript, PLEASE EDIT WITH CARE
2
+
3
+ import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
4
+ import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
5
+ import * as Nodechild_process from "node:child_process";
6
+ import * as Seed$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed.res.mjs";
7
+ import * as Seed_Prompt$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed_Prompt.res.mjs";
8
+ import * as Seed_Connect$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed_Connect.res.mjs";
9
+
10
+ function field(json, key) {
11
+ if (typeof json === "object" && json !== null && !Array.isArray(json)) {
12
+ return json[key];
13
+ }
14
+ }
15
+
16
+ function asString(json) {
17
+ if (typeof json === "string") {
18
+ return json;
19
+ }
20
+ }
21
+
22
+ function envForBackend(backend) {
23
+ if (backend === undefined) {
24
+ return;
25
+ }
26
+ let copy = Object.fromEntries(Object.entries(process.env));
27
+ copy["PULUMI_BACKEND_URL"] = backend;
28
+ return copy;
29
+ }
30
+
31
+ function pulumi(projectDir, backend, args) {
32
+ return Nodechild_process.execFileSync("pulumi", args, {
33
+ cwd: projectDir,
34
+ encoding: "utf8",
35
+ env: envForBackend(backend)
36
+ });
37
+ }
38
+
39
+ function deployedStacks(projectDir, backend) {
40
+ try {
41
+ let items = JSON.parse(pulumi(projectDir, backend, [
42
+ "stack",
43
+ "ls",
44
+ "--json"
45
+ ]));
46
+ if (Array.isArray(items)) {
47
+ return Stdlib_Array.filterMap(items, it => Stdlib_Option.flatMap(field(it, "name"), asString));
48
+ } else {
49
+ return [];
50
+ }
51
+ } catch (exn) {
52
+ return [];
53
+ }
54
+ }
55
+
56
+ function stackOutputs(projectDir, backend, stack) {
57
+ let raw;
58
+ try {
59
+ raw = pulumi(projectDir, backend, [
60
+ "stack",
61
+ "output",
62
+ "--stack",
63
+ stack,
64
+ "--json"
65
+ ]);
66
+ } catch (exn) {
67
+ throw {
68
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
69
+ _1: `pulumi stack output --stack ` + stack + ` failed — is pulumi installed, logged in, ` + "and the stack deployed?",
70
+ Error: new Error()
71
+ };
72
+ }
73
+ try {
74
+ return JSON.parse(raw);
75
+ } catch (exn$1) {
76
+ throw {
77
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
78
+ _1: `could not parse pulumi stack output for "` + stack + `"`,
79
+ Error: new Error()
80
+ };
81
+ }
82
+ }
83
+
84
+ function backendNote(backend) {
85
+ if (backend !== undefined) {
86
+ return ` (backend: ` + backend + `)`;
87
+ } else {
88
+ return "";
89
+ }
90
+ }
91
+
92
+ async function resolveStack(projectDir, backend, stack) {
93
+ if (stack !== undefined) {
94
+ return stack;
95
+ }
96
+ let s = Seed_Prompt$ReventlessSeed.envValue("SEED_STACK");
97
+ if (s !== undefined) {
98
+ return s;
99
+ }
100
+ let stacks = deployedStacks(projectDir, backend);
101
+ if (stacks.length === 0) {
102
+ throw {
103
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
104
+ _1: `no deployed Pulumi stacks for this project (\`pulumi stack ls\` is empty in ` + projectDir + `)` + backendNote(backend) + `. ` + "A Pulumi.<stack>.yaml config file alone is not a deployed stack — run `pulumi up` first, log in to the backend that holds the stack, or set SEED_STACK to target one.",
105
+ Error: new Error()
106
+ };
107
+ }
108
+ return await Seed_Prompt$ReventlessSeed.select("Stack:", stacks.map(s => [
109
+ s,
110
+ s
111
+ ]), undefined);
112
+ }
113
+
114
+ async function fetchConfig(hostShellUrl) {
115
+ let base = hostShellUrl.replace(/\/+$/g, "");
116
+ let url = base + `/config.json`;
117
+ let res;
118
+ try {
119
+ res = await fetch(url, {
120
+ method: "GET",
121
+ headers: {}
122
+ });
123
+ } catch (exn) {
124
+ throw {
125
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
126
+ _1: `cannot reach ` + url,
127
+ Error: new Error()
128
+ };
129
+ }
130
+ if (!res.ok) {
131
+ throw {
132
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
133
+ _1: `GET ` + url + ` → HTTP ` + res.status.toString(),
134
+ Error: new Error()
135
+ };
136
+ }
137
+ return await res.json();
138
+ }
139
+
140
+ function resolveField(envKey, fromSource, human) {
141
+ let v = Seed_Prompt$ReventlessSeed.envValue(envKey);
142
+ if (v !== undefined) {
143
+ return v;
144
+ }
145
+ if (fromSource !== undefined) {
146
+ return fromSource;
147
+ }
148
+ throw {
149
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
150
+ _1: `deployment is missing ` + human + ` (and ` + envKey + ` is unset)`,
151
+ Error: new Error()
152
+ };
153
+ }
154
+
155
+ function endpointsFrom(stack, source) {
156
+ if (source.TAG === "HostShellConfig") {
157
+ let cfg = source._0;
158
+ let fromCfg = key => Stdlib_Option.flatMap(field(cfg, key), asString);
159
+ return {
160
+ graphql: resolveField("REVENTLESS_GRAPHQL_ENDPOINT", fromCfg("apiEndpoint"), "apiEndpoint"),
161
+ cognitoRegion: resolveField("AWS_REGION", fromCfg("region"), "region"),
162
+ cognitoClientId: resolveField("COGNITO_CLIENT_ID", fromCfg("cognitoClientId"), "cognitoClientId")
163
+ };
164
+ }
165
+ let outputs = source._0;
166
+ let out = key => Stdlib_Option.flatMap(field(outputs, key), asString);
167
+ let match = Seed_Prompt$ReventlessSeed.envValue("REVENTLESS_GRAPHQL_ENDPOINT");
168
+ let match$1 = out("domainMergedApiEndpoint");
169
+ let match$2 = out("domainApiEndpoint");
170
+ let tmp;
171
+ if (match !== undefined) {
172
+ tmp = match;
173
+ } else if (match$1 !== undefined) {
174
+ tmp = match$1;
175
+ } else if (match$2 !== undefined) {
176
+ tmp = match$2;
177
+ } else {
178
+ throw {
179
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
180
+ _1: `stack "` + stack + `" exports neither domainMergedApiEndpoint nor domainApiEndpoint`,
181
+ Error: new Error()
182
+ };
183
+ }
184
+ return {
185
+ graphql: tmp,
186
+ cognitoRegion: resolveField("AWS_REGION", out("cognitoRegion"), "cognitoRegion"),
187
+ cognitoClientId: resolveField("COGNITO_CLIENT_ID", out("cognitoUserPoolClientId"), "cognitoUserPoolClientId")
188
+ };
189
+ }
190
+
191
+ async function resolveEndpoints(projectDir, backend, stack) {
192
+ let outputs = stackOutputs(projectDir, backend, stack);
193
+ let hostShellUrl = Stdlib_Option.flatMap(field(outputs, "hostShellUrl"), asString);
194
+ let source = hostShellUrl !== undefined ? ({
195
+ TAG: "HostShellConfig",
196
+ _0: await fetchConfig(hostShellUrl)
197
+ }) : ({
198
+ TAG: "StackOutputs",
199
+ _0: outputs
200
+ });
201
+ return endpointsFrom(stack, source);
202
+ }
203
+
204
+ function cognito(region, clientId) {
205
+ return async (username, password) => {
206
+ let body = JSON.stringify(Object.fromEntries([
207
+ [
208
+ "AuthFlow",
209
+ "USER_PASSWORD_AUTH"
210
+ ],
211
+ [
212
+ "ClientId",
213
+ clientId
214
+ ],
215
+ [
216
+ "AuthParameters",
217
+ Object.fromEntries([
218
+ [
219
+ "USERNAME",
220
+ username
221
+ ],
222
+ [
223
+ "PASSWORD",
224
+ password
225
+ ]
226
+ ])
227
+ ]
228
+ ]));
229
+ let headers = Object.fromEntries([
230
+ [
231
+ "content-type",
232
+ "application/x-amz-json-1.1"
233
+ ],
234
+ [
235
+ "x-amz-target",
236
+ "AWSCognitoIdentityProviderService.InitiateAuth"
237
+ ]
238
+ ]);
239
+ let res;
240
+ try {
241
+ res = await fetch(`https://cognito-idp.` + region + `.amazonaws.com/`, {
242
+ method: "POST",
243
+ headers: headers,
244
+ body: body
245
+ });
246
+ } catch (exn) {
247
+ throw {
248
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
249
+ _1: `cannot reach Cognito in ` + region,
250
+ Error: new Error()
251
+ };
252
+ }
253
+ let json = await res.json();
254
+ if (!res.ok) {
255
+ let detail = Stdlib_Option.getOr(Stdlib_Option.flatMap(field(json, "message"), asString), JSON.stringify(json));
256
+ throw {
257
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
258
+ _1: `Cognito InitiateAuth failed (HTTP ` + res.status.toString() + `): ` + detail,
259
+ Error: new Error()
260
+ };
261
+ }
262
+ let challenge = Stdlib_Option.flatMap(field(json, "ChallengeName"), asString);
263
+ if (challenge !== undefined) {
264
+ throw {
265
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
266
+ _1: `Cognito returned challenge ` + challenge + ` — set a permanent password first ` + "(aws cognito-idp admin-set-user-password … --permanent).",
267
+ Error: new Error()
268
+ };
269
+ }
270
+ let token = Stdlib_Option.flatMap(Stdlib_Option.flatMap(field(json, "AuthenticationResult"), ar => field(ar, "IdToken")), asString);
271
+ if (token !== undefined) {
272
+ return token;
273
+ }
274
+ throw {
275
+ RE_EXN_ID: Seed$ReventlessSeed.Failed,
276
+ _1: `Cognito response carried no IdToken: ` + JSON.stringify(json),
277
+ Error: new Error()
278
+ };
279
+ };
280
+ }
281
+
282
+ function connect($staropt$star, stack, backend, param) {
283
+ return async () => {
284
+ let projectDir = $staropt$star !== undefined ? $staropt$star : ".";
285
+ let url = Seed_Prompt$ReventlessSeed.envValue("SEED_PULUMI_BACKEND");
286
+ let backend$1 = url !== undefined ? url : backend;
287
+ let stackName = await resolveStack(projectDir, backend$1, stack);
288
+ let eps = await resolveEndpoints(projectDir, backend$1, stackName);
289
+ return await Seed_Connect$ReventlessSeed.make(stackName, eps.graphql, cognito(eps.cognitoRegion, eps.cognitoClientId), undefined);
290
+ };
291
+ }
292
+
293
+ export {
294
+ field,
295
+ asString,
296
+ envForBackend,
297
+ pulumi,
298
+ deployedStacks,
299
+ stackOutputs,
300
+ backendNote,
301
+ resolveStack,
302
+ fetchConfig,
303
+ resolveField,
304
+ endpointsFrom,
305
+ resolveEndpoints,
306
+ cognito,
307
+ connect,
308
+ }
309
+ /* node:child_process Not a pure module */