@continuous-excellence/ze-great-dashboard-aws 0.1.14 → 0.1.16
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/dist/cli.js +1044 -24
- package/dist/doctor.d.ts +18 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +772 -6
- package/package.json +2 -1
- package/template.yml +5 -2
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,739 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// packages/aws/src/cli.ts
|
|
4
|
-
import {
|
|
4
|
+
import { readFile as readFile4, writeFile as writeFile3 } from "node:fs/promises";
|
|
5
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
6
|
+
import { parse as parse3 } from "yaml";
|
|
7
|
+
|
|
8
|
+
// packages/aws/src/doctor.ts
|
|
9
|
+
import { execFile as execFile2 } from "node:child_process";
|
|
10
|
+
import { readFile as readFile3 } from "node:fs/promises";
|
|
11
|
+
import { promisify as promisify2 } from "node:util";
|
|
12
|
+
import { parse as parse2 } from "yaml";
|
|
5
13
|
|
|
6
14
|
// packages/aws/src/index.ts
|
|
7
15
|
import { execFile } from "node:child_process";
|
|
8
|
-
import { cp, mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
|
|
16
|
+
import { cp, mkdir as mkdir2, readFile as readFile2, rm, writeFile as writeFile2 } from "node:fs/promises";
|
|
9
17
|
import { join as join2, resolve as resolve2 } from "node:path";
|
|
10
18
|
import { fileURLToPath } from "node:url";
|
|
11
19
|
import { promisify } from "node:util";
|
|
12
20
|
|
|
21
|
+
// node_modules/fflate/esm/index.mjs
|
|
22
|
+
import { createRequire } from "module";
|
|
23
|
+
var require2 = createRequire("/");
|
|
24
|
+
var _a;
|
|
25
|
+
var Worker;
|
|
26
|
+
var isMarkedAsUntransferable;
|
|
27
|
+
try {
|
|
28
|
+
_a = require2("worker_threads"), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable;
|
|
29
|
+
} catch (e) {
|
|
30
|
+
}
|
|
31
|
+
var u8 = Uint8Array;
|
|
32
|
+
var u16 = Uint16Array;
|
|
33
|
+
var i32 = Int32Array;
|
|
34
|
+
var fleb = new u8([
|
|
35
|
+
0,
|
|
36
|
+
0,
|
|
37
|
+
0,
|
|
38
|
+
0,
|
|
39
|
+
0,
|
|
40
|
+
0,
|
|
41
|
+
0,
|
|
42
|
+
0,
|
|
43
|
+
1,
|
|
44
|
+
1,
|
|
45
|
+
1,
|
|
46
|
+
1,
|
|
47
|
+
2,
|
|
48
|
+
2,
|
|
49
|
+
2,
|
|
50
|
+
2,
|
|
51
|
+
3,
|
|
52
|
+
3,
|
|
53
|
+
3,
|
|
54
|
+
3,
|
|
55
|
+
4,
|
|
56
|
+
4,
|
|
57
|
+
4,
|
|
58
|
+
4,
|
|
59
|
+
5,
|
|
60
|
+
5,
|
|
61
|
+
5,
|
|
62
|
+
5,
|
|
63
|
+
0,
|
|
64
|
+
/* unused */
|
|
65
|
+
0,
|
|
66
|
+
0,
|
|
67
|
+
/* impossible */
|
|
68
|
+
0
|
|
69
|
+
]);
|
|
70
|
+
var fdeb = new u8([
|
|
71
|
+
0,
|
|
72
|
+
0,
|
|
73
|
+
0,
|
|
74
|
+
0,
|
|
75
|
+
1,
|
|
76
|
+
1,
|
|
77
|
+
2,
|
|
78
|
+
2,
|
|
79
|
+
3,
|
|
80
|
+
3,
|
|
81
|
+
4,
|
|
82
|
+
4,
|
|
83
|
+
5,
|
|
84
|
+
5,
|
|
85
|
+
6,
|
|
86
|
+
6,
|
|
87
|
+
7,
|
|
88
|
+
7,
|
|
89
|
+
8,
|
|
90
|
+
8,
|
|
91
|
+
9,
|
|
92
|
+
9,
|
|
93
|
+
10,
|
|
94
|
+
10,
|
|
95
|
+
11,
|
|
96
|
+
11,
|
|
97
|
+
12,
|
|
98
|
+
12,
|
|
99
|
+
13,
|
|
100
|
+
13,
|
|
101
|
+
/* unused */
|
|
102
|
+
0,
|
|
103
|
+
0
|
|
104
|
+
]);
|
|
105
|
+
var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
106
|
+
var freb = function(eb, start) {
|
|
107
|
+
var b = new u16(31);
|
|
108
|
+
for (var i2 = 0; i2 < 31; ++i2) {
|
|
109
|
+
b[i2] = start += 1 << eb[i2 - 1];
|
|
110
|
+
}
|
|
111
|
+
var r = new i32(b[30]);
|
|
112
|
+
for (var i2 = 1; i2 < 30; ++i2) {
|
|
113
|
+
for (var j = b[i2]; j < b[i2 + 1]; ++j) {
|
|
114
|
+
r[j] = j - b[i2] << 5 | i2;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { b, r };
|
|
118
|
+
};
|
|
119
|
+
var _a = freb(fleb, 2);
|
|
120
|
+
var fl = _a.b;
|
|
121
|
+
var revfl = _a.r;
|
|
122
|
+
fl[28] = 258, revfl[258] = 28;
|
|
123
|
+
var _b = freb(fdeb, 0);
|
|
124
|
+
var fd = _b.b;
|
|
125
|
+
var revfd = _b.r;
|
|
126
|
+
var rev = new u16(32768);
|
|
127
|
+
for (i = 0; i < 32768; ++i) {
|
|
128
|
+
x = (i & 43690) >> 1 | (i & 21845) << 1;
|
|
129
|
+
x = (x & 52428) >> 2 | (x & 13107) << 2;
|
|
130
|
+
x = (x & 61680) >> 4 | (x & 3855) << 4;
|
|
131
|
+
rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
|
|
132
|
+
}
|
|
133
|
+
var x;
|
|
134
|
+
var i;
|
|
135
|
+
var hMap = (function(cd, mb, r) {
|
|
136
|
+
var s = cd.length;
|
|
137
|
+
var i2 = 0;
|
|
138
|
+
var l = new u16(mb);
|
|
139
|
+
for (; i2 < s; ++i2) {
|
|
140
|
+
if (cd[i2])
|
|
141
|
+
++l[cd[i2] - 1];
|
|
142
|
+
}
|
|
143
|
+
var le = new u16(mb);
|
|
144
|
+
for (i2 = 1; i2 < mb; ++i2) {
|
|
145
|
+
le[i2] = le[i2 - 1] + l[i2 - 1] << 1;
|
|
146
|
+
}
|
|
147
|
+
var co;
|
|
148
|
+
if (r) {
|
|
149
|
+
co = new u16(1 << mb);
|
|
150
|
+
var rvb = 15 - mb;
|
|
151
|
+
for (i2 = 0; i2 < s; ++i2) {
|
|
152
|
+
if (cd[i2]) {
|
|
153
|
+
var sv = i2 << 4 | cd[i2];
|
|
154
|
+
var r_1 = mb - cd[i2];
|
|
155
|
+
var v = le[cd[i2] - 1]++ << r_1;
|
|
156
|
+
for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
|
|
157
|
+
co[rev[v] >> rvb] = sv;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
co = new u16(s);
|
|
163
|
+
for (i2 = 0; i2 < s; ++i2) {
|
|
164
|
+
if (cd[i2]) {
|
|
165
|
+
co[i2] = rev[le[cd[i2] - 1]++] >> 15 - cd[i2];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return co;
|
|
170
|
+
});
|
|
171
|
+
var flt = new u8(288);
|
|
172
|
+
for (i = 0; i < 144; ++i)
|
|
173
|
+
flt[i] = 8;
|
|
174
|
+
var i;
|
|
175
|
+
for (i = 144; i < 256; ++i)
|
|
176
|
+
flt[i] = 9;
|
|
177
|
+
var i;
|
|
178
|
+
for (i = 256; i < 280; ++i)
|
|
179
|
+
flt[i] = 7;
|
|
180
|
+
var i;
|
|
181
|
+
for (i = 280; i < 288; ++i)
|
|
182
|
+
flt[i] = 8;
|
|
183
|
+
var i;
|
|
184
|
+
var fdt = new u8(32);
|
|
185
|
+
for (i = 0; i < 32; ++i)
|
|
186
|
+
fdt[i] = 5;
|
|
187
|
+
var i;
|
|
188
|
+
var flm = /* @__PURE__ */ hMap(flt, 9, 0);
|
|
189
|
+
var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
|
|
190
|
+
var shft = function(p) {
|
|
191
|
+
return (p + 7) / 8 | 0;
|
|
192
|
+
};
|
|
193
|
+
var slc = function(v, s, e) {
|
|
194
|
+
if (s == null || s < 0)
|
|
195
|
+
s = 0;
|
|
196
|
+
if (e == null || e > v.length)
|
|
197
|
+
e = v.length;
|
|
198
|
+
return new u8(v.subarray(s, e));
|
|
199
|
+
};
|
|
200
|
+
var ec = [
|
|
201
|
+
"unexpected EOF",
|
|
202
|
+
"invalid block type",
|
|
203
|
+
"invalid length/literal",
|
|
204
|
+
"invalid distance",
|
|
205
|
+
"stream finished",
|
|
206
|
+
"no stream handler",
|
|
207
|
+
,
|
|
208
|
+
// determined by compression function
|
|
209
|
+
"no callback",
|
|
210
|
+
"invalid UTF-8 data",
|
|
211
|
+
"extra field too long",
|
|
212
|
+
"date not in range 1980-2099",
|
|
213
|
+
"filename too long",
|
|
214
|
+
"stream finishing",
|
|
215
|
+
"invalid zip data"
|
|
216
|
+
// determined by unknown compression method
|
|
217
|
+
];
|
|
218
|
+
var err = function(ind, msg, nt) {
|
|
219
|
+
var e = new Error(msg || ec[ind]);
|
|
220
|
+
e.code = ind;
|
|
221
|
+
if (Error.captureStackTrace)
|
|
222
|
+
Error.captureStackTrace(e, err);
|
|
223
|
+
if (!nt)
|
|
224
|
+
throw e;
|
|
225
|
+
return e;
|
|
226
|
+
};
|
|
227
|
+
var wbits = function(d, p, v) {
|
|
228
|
+
v <<= p & 7;
|
|
229
|
+
var o = p / 8 | 0;
|
|
230
|
+
d[o] |= v;
|
|
231
|
+
d[o + 1] |= v >> 8;
|
|
232
|
+
};
|
|
233
|
+
var wbits16 = function(d, p, v) {
|
|
234
|
+
v <<= p & 7;
|
|
235
|
+
var o = p / 8 | 0;
|
|
236
|
+
d[o] |= v;
|
|
237
|
+
d[o + 1] |= v >> 8;
|
|
238
|
+
d[o + 2] |= v >> 16;
|
|
239
|
+
};
|
|
240
|
+
var hTree = function(d, mb) {
|
|
241
|
+
var t = [];
|
|
242
|
+
for (var i2 = 0; i2 < d.length; ++i2) {
|
|
243
|
+
if (d[i2])
|
|
244
|
+
t.push({ s: i2, f: d[i2] });
|
|
245
|
+
}
|
|
246
|
+
var s = t.length;
|
|
247
|
+
var t2 = t.slice();
|
|
248
|
+
if (!s)
|
|
249
|
+
return { t: et, l: 0 };
|
|
250
|
+
if (s == 1) {
|
|
251
|
+
var v = new u8(t[0].s + 1);
|
|
252
|
+
v[t[0].s] = 1;
|
|
253
|
+
return { t: v, l: 1 };
|
|
254
|
+
}
|
|
255
|
+
t.sort(function(a, b) {
|
|
256
|
+
return a.f - b.f;
|
|
257
|
+
});
|
|
258
|
+
t.push({ s: -1, f: 25001 });
|
|
259
|
+
var l = t[0], r = t[1], i0 = 0, i1 = 1, i22 = 2;
|
|
260
|
+
t[0] = { s: -1, f: l.f + r.f, l, r };
|
|
261
|
+
while (i1 != s - 1) {
|
|
262
|
+
l = t[t[i0].f < t[i22].f ? i0++ : i22++];
|
|
263
|
+
r = t[i0 != i1 && t[i0].f < t[i22].f ? i0++ : i22++];
|
|
264
|
+
t[i1++] = { s: -1, f: l.f + r.f, l, r };
|
|
265
|
+
}
|
|
266
|
+
var maxSym = t2[0].s;
|
|
267
|
+
for (var i2 = 1; i2 < s; ++i2) {
|
|
268
|
+
if (t2[i2].s > maxSym)
|
|
269
|
+
maxSym = t2[i2].s;
|
|
270
|
+
}
|
|
271
|
+
var tr = new u16(maxSym + 1);
|
|
272
|
+
var mbt = ln(t[i1 - 1], tr, 0);
|
|
273
|
+
if (mbt > mb) {
|
|
274
|
+
var i2 = 0, dt = 0;
|
|
275
|
+
var lft = mbt - mb, cst = 1 << lft;
|
|
276
|
+
t2.sort(function(a, b) {
|
|
277
|
+
return tr[b.s] - tr[a.s] || a.f - b.f;
|
|
278
|
+
});
|
|
279
|
+
for (; i2 < s; ++i2) {
|
|
280
|
+
var i2_1 = t2[i2].s;
|
|
281
|
+
if (tr[i2_1] > mb) {
|
|
282
|
+
dt += cst - (1 << mbt - tr[i2_1]);
|
|
283
|
+
tr[i2_1] = mb;
|
|
284
|
+
} else
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
dt >>= lft;
|
|
288
|
+
while (dt > 0) {
|
|
289
|
+
var i2_2 = t2[i2].s;
|
|
290
|
+
if (tr[i2_2] < mb)
|
|
291
|
+
dt -= 1 << mb - tr[i2_2]++ - 1;
|
|
292
|
+
else
|
|
293
|
+
++i2;
|
|
294
|
+
}
|
|
295
|
+
for (; i2 >= 0 && dt; --i2) {
|
|
296
|
+
var i2_3 = t2[i2].s;
|
|
297
|
+
if (tr[i2_3] == mb) {
|
|
298
|
+
--tr[i2_3];
|
|
299
|
+
++dt;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
mbt = mb;
|
|
303
|
+
}
|
|
304
|
+
return { t: new u8(tr), l: mbt };
|
|
305
|
+
};
|
|
306
|
+
var ln = function(n, l, d) {
|
|
307
|
+
return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
|
|
308
|
+
};
|
|
309
|
+
var lc = function(c) {
|
|
310
|
+
var s = c.length;
|
|
311
|
+
while (s && !c[--s])
|
|
312
|
+
;
|
|
313
|
+
var cl = new u16(++s);
|
|
314
|
+
var cli = 0, cln = c[0], cls = 1;
|
|
315
|
+
var w = function(v) {
|
|
316
|
+
cl[cli++] = v;
|
|
317
|
+
};
|
|
318
|
+
for (var i2 = 1; i2 <= s; ++i2) {
|
|
319
|
+
if (c[i2] == cln && i2 != s)
|
|
320
|
+
++cls;
|
|
321
|
+
else {
|
|
322
|
+
if (!cln && cls > 2) {
|
|
323
|
+
for (; cls > 138; cls -= 138)
|
|
324
|
+
w(32754);
|
|
325
|
+
if (cls > 2) {
|
|
326
|
+
w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
|
|
327
|
+
cls = 0;
|
|
328
|
+
}
|
|
329
|
+
} else if (cls > 3) {
|
|
330
|
+
w(cln), --cls;
|
|
331
|
+
for (; cls > 6; cls -= 6)
|
|
332
|
+
w(8304);
|
|
333
|
+
if (cls > 2)
|
|
334
|
+
w(cls - 3 << 5 | 8208), cls = 0;
|
|
335
|
+
}
|
|
336
|
+
while (cls--)
|
|
337
|
+
w(cln);
|
|
338
|
+
cls = 1;
|
|
339
|
+
cln = c[i2];
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return { c: cl.subarray(0, cli), n: s };
|
|
343
|
+
};
|
|
344
|
+
var clen = function(cf, cl) {
|
|
345
|
+
var l = 0;
|
|
346
|
+
for (var i2 = 0; i2 < cl.length; ++i2)
|
|
347
|
+
l += cf[i2] * cl[i2];
|
|
348
|
+
return l;
|
|
349
|
+
};
|
|
350
|
+
var wfblk = function(out, pos, dat) {
|
|
351
|
+
var s = dat.length;
|
|
352
|
+
var o = shft(pos + 2);
|
|
353
|
+
out[o] = s & 255;
|
|
354
|
+
out[o + 1] = s >> 8;
|
|
355
|
+
out[o + 2] = out[o] ^ 255;
|
|
356
|
+
out[o + 3] = out[o + 1] ^ 255;
|
|
357
|
+
for (var i2 = 0; i2 < s; ++i2)
|
|
358
|
+
out[o + i2 + 4] = dat[i2];
|
|
359
|
+
return (o + 4 + s) * 8;
|
|
360
|
+
};
|
|
361
|
+
var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
|
|
362
|
+
wbits(out, p++, final);
|
|
363
|
+
++lf[256];
|
|
364
|
+
var _a2 = hTree(lf, 15), dlt = _a2.t, mlb = _a2.l;
|
|
365
|
+
var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
|
|
366
|
+
var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
|
|
367
|
+
var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
|
|
368
|
+
var lcfreq = new u16(19);
|
|
369
|
+
for (var i2 = 0; i2 < lclt.length; ++i2)
|
|
370
|
+
++lcfreq[lclt[i2] & 31];
|
|
371
|
+
for (var i2 = 0; i2 < lcdt.length; ++i2)
|
|
372
|
+
++lcfreq[lcdt[i2] & 31];
|
|
373
|
+
var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
|
|
374
|
+
var nlcc = 19;
|
|
375
|
+
for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
|
|
376
|
+
;
|
|
377
|
+
var flen = bl + 5 << 3;
|
|
378
|
+
var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
|
|
379
|
+
var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
|
|
380
|
+
if (bs >= 0 && flen <= ftlen && flen <= dtlen)
|
|
381
|
+
return wfblk(out, p, dat.subarray(bs, bs + bl));
|
|
382
|
+
var lm, ll, dm, dl;
|
|
383
|
+
wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
|
|
384
|
+
if (dtlen < ftlen) {
|
|
385
|
+
lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
|
|
386
|
+
var llm = hMap(lct, mlcb, 0);
|
|
387
|
+
wbits(out, p, nlc - 257);
|
|
388
|
+
wbits(out, p + 5, ndc - 1);
|
|
389
|
+
wbits(out, p + 10, nlcc - 4);
|
|
390
|
+
p += 14;
|
|
391
|
+
for (var i2 = 0; i2 < nlcc; ++i2)
|
|
392
|
+
wbits(out, p + 3 * i2, lct[clim[i2]]);
|
|
393
|
+
p += 3 * nlcc;
|
|
394
|
+
var lcts = [lclt, lcdt];
|
|
395
|
+
for (var it = 0; it < 2; ++it) {
|
|
396
|
+
var clct = lcts[it];
|
|
397
|
+
for (var i2 = 0; i2 < clct.length; ++i2) {
|
|
398
|
+
var len = clct[i2] & 31;
|
|
399
|
+
wbits(out, p, llm[len]), p += lct[len];
|
|
400
|
+
if (len > 15)
|
|
401
|
+
wbits(out, p, clct[i2] >> 5 & 127), p += clct[i2] >> 12;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
} else {
|
|
405
|
+
lm = flm, ll = flt, dm = fdm, dl = fdt;
|
|
406
|
+
}
|
|
407
|
+
for (var i2 = 0; i2 < li; ++i2) {
|
|
408
|
+
var sym = syms[i2];
|
|
409
|
+
if (sym > 255) {
|
|
410
|
+
var len = sym >> 18 & 31;
|
|
411
|
+
wbits16(out, p, lm[len + 257]), p += ll[len + 257];
|
|
412
|
+
if (len > 7)
|
|
413
|
+
wbits(out, p, sym >> 23 & 31), p += fleb[len];
|
|
414
|
+
var dst = sym & 31;
|
|
415
|
+
wbits16(out, p, dm[dst]), p += dl[dst];
|
|
416
|
+
if (dst > 3)
|
|
417
|
+
wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
|
|
418
|
+
} else {
|
|
419
|
+
wbits16(out, p, lm[sym]), p += ll[sym];
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
wbits16(out, p, lm[256]);
|
|
423
|
+
return p + ll[256];
|
|
424
|
+
};
|
|
425
|
+
var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
|
|
426
|
+
var et = /* @__PURE__ */ new u8(0);
|
|
427
|
+
var dflt = function(dat, lvl, plvl, pre, post, st) {
|
|
428
|
+
var s = st.z || dat.length;
|
|
429
|
+
var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
|
|
430
|
+
var w = o.subarray(pre, o.length - post);
|
|
431
|
+
var lst = st.l;
|
|
432
|
+
var pos = (st.r || 0) & 7;
|
|
433
|
+
if (lvl) {
|
|
434
|
+
if (pos)
|
|
435
|
+
w[0] = st.r >> 3;
|
|
436
|
+
var opt = deo[lvl - 1];
|
|
437
|
+
var n = opt >> 13, c = opt & 8191;
|
|
438
|
+
var msk_1 = (1 << plvl) - 1;
|
|
439
|
+
var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
|
|
440
|
+
var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
|
|
441
|
+
var hsh = function(i3) {
|
|
442
|
+
return (dat[i3] ^ dat[i3 + 1] << bs1_1 ^ dat[i3 + 2] << bs2_1) & msk_1;
|
|
443
|
+
};
|
|
444
|
+
var syms = new i32(25e3);
|
|
445
|
+
var lf = new u16(288), df = new u16(32);
|
|
446
|
+
var lc_1 = 0, eb = 0, i2 = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
|
|
447
|
+
for (; i2 + 2 < s; ++i2) {
|
|
448
|
+
var hv = hsh(i2);
|
|
449
|
+
var imod = i2 & 32767, pimod = head[hv];
|
|
450
|
+
prev[imod] = pimod;
|
|
451
|
+
head[hv] = imod;
|
|
452
|
+
if (wi <= i2) {
|
|
453
|
+
var rem = s - i2;
|
|
454
|
+
if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
|
|
455
|
+
pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i2 - bs, pos);
|
|
456
|
+
li = lc_1 = eb = 0, bs = i2;
|
|
457
|
+
for (var j = 0; j < 286; ++j)
|
|
458
|
+
lf[j] = 0;
|
|
459
|
+
for (var j = 0; j < 30; ++j)
|
|
460
|
+
df[j] = 0;
|
|
461
|
+
}
|
|
462
|
+
var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
|
|
463
|
+
if (rem > 2 && hv == hsh(i2 - dif)) {
|
|
464
|
+
var maxn = Math.min(n, rem) - 1;
|
|
465
|
+
var maxd = Math.min(32767, i2);
|
|
466
|
+
var ml = Math.min(258, rem);
|
|
467
|
+
while (dif <= maxd && --ch_1 && imod != pimod) {
|
|
468
|
+
if (dat[i2 + l] == dat[i2 + l - dif]) {
|
|
469
|
+
var nl = 0;
|
|
470
|
+
for (; nl < ml && dat[i2 + nl] == dat[i2 + nl - dif]; ++nl)
|
|
471
|
+
;
|
|
472
|
+
if (nl > l) {
|
|
473
|
+
l = nl, d = dif;
|
|
474
|
+
if (nl > maxn)
|
|
475
|
+
break;
|
|
476
|
+
var mmd = Math.min(dif, nl - 2);
|
|
477
|
+
var md = 0;
|
|
478
|
+
for (var j = 0; j < mmd; ++j) {
|
|
479
|
+
var ti = i2 - dif + j & 32767;
|
|
480
|
+
var pti = prev[ti];
|
|
481
|
+
var cd = ti - pti & 32767;
|
|
482
|
+
if (cd > md)
|
|
483
|
+
md = cd, pimod = ti;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
imod = pimod, pimod = prev[imod];
|
|
488
|
+
dif += imod - pimod & 32767;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
if (d) {
|
|
492
|
+
syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
|
|
493
|
+
var lin = revfl[l] & 31, din = revfd[d] & 31;
|
|
494
|
+
eb += fleb[lin] + fdeb[din];
|
|
495
|
+
++lf[257 + lin];
|
|
496
|
+
++df[din];
|
|
497
|
+
wi = i2 + l;
|
|
498
|
+
++lc_1;
|
|
499
|
+
} else {
|
|
500
|
+
syms[li++] = dat[i2];
|
|
501
|
+
++lf[dat[i2]];
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
for (i2 = Math.max(i2, wi); i2 < s; ++i2) {
|
|
506
|
+
syms[li++] = dat[i2];
|
|
507
|
+
++lf[dat[i2]];
|
|
508
|
+
}
|
|
509
|
+
pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i2 - bs, pos);
|
|
510
|
+
if (!lst) {
|
|
511
|
+
st.r = pos & 7 | w[pos / 8 | 0] << 3;
|
|
512
|
+
pos -= 7;
|
|
513
|
+
st.h = head, st.p = prev, st.i = i2, st.w = wi;
|
|
514
|
+
}
|
|
515
|
+
} else {
|
|
516
|
+
for (var i2 = st.w || 0; i2 < s + lst; i2 += 65535) {
|
|
517
|
+
var e = i2 + 65535;
|
|
518
|
+
if (e >= s) {
|
|
519
|
+
w[pos / 8 | 0] = lst;
|
|
520
|
+
e = s;
|
|
521
|
+
}
|
|
522
|
+
pos = wfblk(w, pos + 1, dat.subarray(i2, e));
|
|
523
|
+
}
|
|
524
|
+
st.i = s;
|
|
525
|
+
}
|
|
526
|
+
return slc(o, 0, pre + shft(pos) + post);
|
|
527
|
+
};
|
|
528
|
+
var crct = /* @__PURE__ */ (function() {
|
|
529
|
+
var t = new Int32Array(256);
|
|
530
|
+
for (var i2 = 0; i2 < 256; ++i2) {
|
|
531
|
+
var c = i2, k = 9;
|
|
532
|
+
while (--k)
|
|
533
|
+
c = (c & 1 && -306674912) ^ c >>> 1;
|
|
534
|
+
t[i2] = c;
|
|
535
|
+
}
|
|
536
|
+
return t;
|
|
537
|
+
})();
|
|
538
|
+
var crc = function() {
|
|
539
|
+
var c = -1;
|
|
540
|
+
return {
|
|
541
|
+
p: function(d) {
|
|
542
|
+
var cr = c;
|
|
543
|
+
for (var i2 = 0; i2 < d.length; ++i2)
|
|
544
|
+
cr = crct[cr & 255 ^ d[i2]] ^ cr >>> 8;
|
|
545
|
+
c = cr;
|
|
546
|
+
},
|
|
547
|
+
d: function() {
|
|
548
|
+
return ~c;
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
};
|
|
552
|
+
var dopt = function(dat, opt, pre, post, st) {
|
|
553
|
+
if (!st) {
|
|
554
|
+
st = { l: 1 };
|
|
555
|
+
if (opt.dictionary) {
|
|
556
|
+
var dict = opt.dictionary.subarray(-32768);
|
|
557
|
+
var newDat = new u8(dict.length + dat.length);
|
|
558
|
+
newDat.set(dict);
|
|
559
|
+
newDat.set(dat, dict.length);
|
|
560
|
+
dat = newDat;
|
|
561
|
+
st.w = dict.length;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
|
|
565
|
+
};
|
|
566
|
+
var mrg = function(a, b) {
|
|
567
|
+
var o = {};
|
|
568
|
+
for (var k in a)
|
|
569
|
+
o[k] = a[k];
|
|
570
|
+
for (var k in b)
|
|
571
|
+
o[k] = b[k];
|
|
572
|
+
return o;
|
|
573
|
+
};
|
|
574
|
+
var wbytes = function(d, b, v) {
|
|
575
|
+
for (; v; ++b)
|
|
576
|
+
d[b] = v, v >>>= 8;
|
|
577
|
+
};
|
|
578
|
+
function deflateSync(data, opts) {
|
|
579
|
+
return dopt(data, opts || {}, 0, 0);
|
|
580
|
+
}
|
|
581
|
+
var fltn = function(d, p, t, o) {
|
|
582
|
+
for (var k in d) {
|
|
583
|
+
var val = d[k], n = p + k, op = o;
|
|
584
|
+
if (Array.isArray(val))
|
|
585
|
+
op = mrg(o, val[1]), val = val[0];
|
|
586
|
+
if (ArrayBuffer.isView(val))
|
|
587
|
+
t[n] = [val, op];
|
|
588
|
+
else {
|
|
589
|
+
t[n += "/"] = [new u8(0), op];
|
|
590
|
+
fltn(val, n, t, o);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder();
|
|
595
|
+
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
596
|
+
var tds = 0;
|
|
597
|
+
try {
|
|
598
|
+
td.decode(et, { stream: true });
|
|
599
|
+
tds = 1;
|
|
600
|
+
} catch (e) {
|
|
601
|
+
}
|
|
602
|
+
function strToU8(str, latin1) {
|
|
603
|
+
if (latin1) {
|
|
604
|
+
var ar_1 = new u8(str.length);
|
|
605
|
+
for (var i2 = 0; i2 < str.length; ++i2)
|
|
606
|
+
ar_1[i2] = str.charCodeAt(i2);
|
|
607
|
+
return ar_1;
|
|
608
|
+
}
|
|
609
|
+
if (te)
|
|
610
|
+
return te.encode(str);
|
|
611
|
+
var l = str.length;
|
|
612
|
+
var ar = new u8(str.length + (str.length >> 1));
|
|
613
|
+
var ai = 0;
|
|
614
|
+
var w = function(v) {
|
|
615
|
+
ar[ai++] = v;
|
|
616
|
+
};
|
|
617
|
+
for (var i2 = 0; i2 < l; ++i2) {
|
|
618
|
+
if (ai + 5 > ar.length) {
|
|
619
|
+
var n = new u8(ai + 8 + (l - i2 << 1));
|
|
620
|
+
n.set(ar);
|
|
621
|
+
ar = n;
|
|
622
|
+
}
|
|
623
|
+
var c = str.charCodeAt(i2);
|
|
624
|
+
if (c < 128 || latin1)
|
|
625
|
+
w(c);
|
|
626
|
+
else if (c < 2048)
|
|
627
|
+
w(192 | c >> 6), w(128 | c & 63);
|
|
628
|
+
else if (c > 55295 && c < 57344)
|
|
629
|
+
c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i2) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63);
|
|
630
|
+
else
|
|
631
|
+
w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63);
|
|
632
|
+
}
|
|
633
|
+
return slc(ar, 0, ai);
|
|
634
|
+
}
|
|
635
|
+
var exfl = function(ex) {
|
|
636
|
+
var le = 0;
|
|
637
|
+
if (ex) {
|
|
638
|
+
for (var k in ex) {
|
|
639
|
+
var l = ex[k].length;
|
|
640
|
+
if (l > 65535)
|
|
641
|
+
err(9);
|
|
642
|
+
le += l + 4;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return le;
|
|
646
|
+
};
|
|
647
|
+
var wzh = function(d, b, f, fn, u, c, ce, co) {
|
|
648
|
+
var fl2 = fn.length, ex = f.extra, col = co && co.length;
|
|
649
|
+
var exl = exfl(ex);
|
|
650
|
+
wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4;
|
|
651
|
+
if (ce != null)
|
|
652
|
+
d[b++] = 20, d[b++] = f.os;
|
|
653
|
+
d[b] = 20, b += 2;
|
|
654
|
+
d[b++] = f.flag << 1 | (c < 0 && 8), d[b++] = u && 8;
|
|
655
|
+
d[b++] = f.compression & 255, d[b++] = f.compression >> 8;
|
|
656
|
+
var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;
|
|
657
|
+
if (y < 0 || y > 119)
|
|
658
|
+
err(10);
|
|
659
|
+
wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4;
|
|
660
|
+
if (c != -1) {
|
|
661
|
+
wbytes(d, b, f.crc);
|
|
662
|
+
wbytes(d, b + 4, c < 0 ? -c - 2 : c);
|
|
663
|
+
wbytes(d, b + 8, f.size);
|
|
664
|
+
}
|
|
665
|
+
wbytes(d, b + 12, fl2);
|
|
666
|
+
wbytes(d, b + 14, exl), b += 16;
|
|
667
|
+
if (ce != null) {
|
|
668
|
+
wbytes(d, b, col);
|
|
669
|
+
wbytes(d, b + 6, f.attrs);
|
|
670
|
+
wbytes(d, b + 10, ce), b += 14;
|
|
671
|
+
}
|
|
672
|
+
d.set(fn, b);
|
|
673
|
+
b += fl2;
|
|
674
|
+
if (exl) {
|
|
675
|
+
for (var k in ex) {
|
|
676
|
+
var exf = ex[k], l = exf.length;
|
|
677
|
+
wbytes(d, b, +k);
|
|
678
|
+
wbytes(d, b + 2, l);
|
|
679
|
+
d.set(exf, b + 4), b += 4 + l;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
if (col)
|
|
683
|
+
d.set(co, b), b += col;
|
|
684
|
+
return b;
|
|
685
|
+
};
|
|
686
|
+
var wzf = function(o, b, c, d, e) {
|
|
687
|
+
wbytes(o, b, 101010256);
|
|
688
|
+
wbytes(o, b + 8, c);
|
|
689
|
+
wbytes(o, b + 10, c);
|
|
690
|
+
wbytes(o, b + 12, d);
|
|
691
|
+
wbytes(o, b + 16, e);
|
|
692
|
+
};
|
|
693
|
+
function zipSync(data, opts) {
|
|
694
|
+
if (!opts)
|
|
695
|
+
opts = {};
|
|
696
|
+
var r = {};
|
|
697
|
+
var files = [];
|
|
698
|
+
fltn(data, "", r, opts);
|
|
699
|
+
var o = 0;
|
|
700
|
+
var tot = 0;
|
|
701
|
+
for (var fn in r) {
|
|
702
|
+
var _a2 = r[fn], file = _a2[0], p = _a2[1];
|
|
703
|
+
var compression = p.level == 0 ? 0 : 8;
|
|
704
|
+
var f = strToU8(fn), s = f.length;
|
|
705
|
+
var com = p.comment, m = com && strToU8(com), ms = m && m.length;
|
|
706
|
+
var exl = exfl(p.extra);
|
|
707
|
+
if (s > 65535)
|
|
708
|
+
err(11);
|
|
709
|
+
var d = compression ? deflateSync(file, p) : file, l = d.length;
|
|
710
|
+
var c = crc();
|
|
711
|
+
c.p(file);
|
|
712
|
+
files.push(mrg(p, {
|
|
713
|
+
size: file.length,
|
|
714
|
+
crc: c.d(),
|
|
715
|
+
c: d,
|
|
716
|
+
f,
|
|
717
|
+
m,
|
|
718
|
+
u: s != fn.length || m && com.length != ms,
|
|
719
|
+
o,
|
|
720
|
+
compression
|
|
721
|
+
}));
|
|
722
|
+
o += 30 + s + exl + l;
|
|
723
|
+
tot += 76 + 2 * (s + exl) + (ms || 0) + l;
|
|
724
|
+
}
|
|
725
|
+
var out = new u8(tot + 22), oe = o, cdl = tot - o;
|
|
726
|
+
for (var i2 = 0; i2 < files.length; ++i2) {
|
|
727
|
+
var f = files[i2];
|
|
728
|
+
wzh(out, f.o, f, f.f, f.u, f.c.length);
|
|
729
|
+
var badd = 30 + f.f.length + exfl(f.extra);
|
|
730
|
+
out.set(f.c, f.o + badd);
|
|
731
|
+
wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);
|
|
732
|
+
}
|
|
733
|
+
wzf(out, o, files.length, cdl, oe);
|
|
734
|
+
return out;
|
|
735
|
+
}
|
|
736
|
+
|
|
13
737
|
// packages/aws/src/release.ts
|
|
14
738
|
import { createHash } from "node:crypto";
|
|
15
739
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
@@ -71,7 +795,7 @@ var boardConfigSchema = z.object({
|
|
|
71
795
|
|
|
72
796
|
// packages/aws/src/release.ts
|
|
73
797
|
var CORE_RUNTIME_VERSION = "1.0.0";
|
|
74
|
-
var CANONICAL_ASSET_DOMAIN = "https://
|
|
798
|
+
var CANONICAL_ASSET_DOMAIN = "https://d3bvpdr9syk35m.cloudfront.net";
|
|
75
799
|
function clientAssetUrl(version, domain = CANONICAL_ASSET_DOMAIN) {
|
|
76
800
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(version))
|
|
77
801
|
throw new Error(`Invalid dashboard version: ${version}`);
|
|
@@ -116,6 +840,28 @@ function sha256(value) {
|
|
|
116
840
|
|
|
117
841
|
// packages/aws/src/index.ts
|
|
118
842
|
var run = promisify(execFile);
|
|
843
|
+
function deploymentTemplate(template, values) {
|
|
844
|
+
const listed = template.match(/^ {2}PackageManagedParameters: \[([^\]]*)\]\s*$/m)?.[1];
|
|
845
|
+
if (listed === void 0)
|
|
846
|
+
throw new Error("CloudFormation template has no PackageManagedParameters metadata");
|
|
847
|
+
const managed = listed.split(",").map((key) => key.trim()).filter(Boolean);
|
|
848
|
+
const missing = managed.filter((key) => !Object.hasOwn(values, key));
|
|
849
|
+
const unknown = Object.keys(values).filter((key) => !managed.includes(key));
|
|
850
|
+
if (missing.length || unknown.length)
|
|
851
|
+
throw new Error(
|
|
852
|
+
`Package-managed CloudFormation parameters are out of sync (missing: ${missing.join(", ") || "none"}; unknown: ${unknown.join(", ") || "none"})`
|
|
853
|
+
);
|
|
854
|
+
return managed.reduce((rendered, key) => {
|
|
855
|
+
const pattern = new RegExp(`^ ${key}: \\{[^\\n]+\\}\\s*$`, "m");
|
|
856
|
+
const declaration = rendered.match(pattern)?.[0];
|
|
857
|
+
if (!declaration || /\bDefault:/.test(declaration))
|
|
858
|
+
throw new Error(`Unable to set the CloudFormation default for ${key}`);
|
|
859
|
+
return rendered.replace(
|
|
860
|
+
pattern,
|
|
861
|
+
declaration.replace(/\s*}\s*$/, `, Default: ${JSON.stringify(values[key])} }`)
|
|
862
|
+
);
|
|
863
|
+
}, template);
|
|
864
|
+
}
|
|
119
865
|
async function packageLambda(options) {
|
|
120
866
|
const outputDir = resolve2(options.outputDir);
|
|
121
867
|
await mkdir2(outputDir, { recursive: true });
|
|
@@ -137,15 +883,43 @@ async function packageLambda(options) {
|
|
|
137
883
|
"index.mjs": sha256(await readFile2(join2(runtimeDir, "index.mjs")))
|
|
138
884
|
}
|
|
139
885
|
};
|
|
140
|
-
const clientSource = fileURLToPath(new URL("../client", import.meta.url));
|
|
141
|
-
await cp(clientSource, join2(outputDir, "assets"), { recursive: true });
|
|
142
886
|
await writeFile2(join2(runtimeDir, "release.json"), `${JSON.stringify(runtimeMetadata, null, 2)}
|
|
143
887
|
`);
|
|
144
888
|
const sums = Object.entries(runtimeMetadata.artifactChecksums).map(([name, digest]) => `${digest} ${name}`).join("\n");
|
|
145
889
|
await writeFile2(join2(runtimeDir, "SHA256SUMS"), `${sums}
|
|
146
890
|
`);
|
|
147
|
-
|
|
148
|
-
|
|
891
|
+
const lambdaPath = join2(outputDir, "lambda.zip");
|
|
892
|
+
const archiveFiles = ["SHA256SUMS", "board.yaml", "index.mjs", "release.json"].sort();
|
|
893
|
+
const archive = Object.fromEntries(
|
|
894
|
+
await Promise.all(
|
|
895
|
+
archiveFiles.map(async (name) => [
|
|
896
|
+
name,
|
|
897
|
+
[
|
|
898
|
+
strToU8(await readFile2(join2(runtimeDir, name), "utf8")),
|
|
899
|
+
{ mtime: new Date(1980, 0, 1, 0, 0, 0), level: 9 }
|
|
900
|
+
]
|
|
901
|
+
])
|
|
902
|
+
)
|
|
903
|
+
);
|
|
904
|
+
await writeFile2(lambdaPath, zipSync(archive));
|
|
905
|
+
await rm(runtimeDir, { recursive: true, force: true });
|
|
906
|
+
const lambdaChecksum = sha256(await readFile2(lambdaPath));
|
|
907
|
+
const deploymentChecksum = sha256(JSON.stringify(runtimeMetadata));
|
|
908
|
+
const packagedRelease = {
|
|
909
|
+
...runtimeMetadata,
|
|
910
|
+
artifactChecksums: { ...runtimeMetadata.artifactChecksums, "lambda.zip": lambdaChecksum },
|
|
911
|
+
artifactKey: `lambda/${deploymentChecksum}.zip`
|
|
912
|
+
};
|
|
913
|
+
await writeFile2(join2(outputDir, "release.json"), `${JSON.stringify(packagedRelease, null, 2)}
|
|
914
|
+
`);
|
|
915
|
+
await writeFile2(
|
|
916
|
+
join2(outputDir, "template.yml"),
|
|
917
|
+
deploymentTemplate(await cloudFormationTemplate(), {
|
|
918
|
+
LambdaArtifactKey: packagedRelease.artifactKey,
|
|
919
|
+
DashboardVersion: packagedRelease.dashboardVersion
|
|
920
|
+
})
|
|
921
|
+
);
|
|
922
|
+
return packagedRelease;
|
|
149
923
|
}
|
|
150
924
|
async function deployLambda(options) {
|
|
151
925
|
const artifactDir = resolve2(options.artifactDir);
|
|
@@ -193,37 +967,283 @@ async function deployLambda(options) {
|
|
|
193
967
|
]);
|
|
194
968
|
await run("aws", ["lambda", "wait", "function-updated", "--function-name", options.functionName]);
|
|
195
969
|
}
|
|
970
|
+
async function cloudFormationTemplate() {
|
|
971
|
+
return readFile2(fileURLToPath(new URL("../template.yml", import.meta.url)), "utf8");
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
// packages/aws/src/doctor.ts
|
|
975
|
+
var run2 = promisify2(execFile2);
|
|
976
|
+
var actualDependencies = {
|
|
977
|
+
async execute(command, args2) {
|
|
978
|
+
return (await run2(command, args2)).stdout.trim();
|
|
979
|
+
},
|
|
980
|
+
async fetch(url) {
|
|
981
|
+
return fetch(url);
|
|
982
|
+
},
|
|
983
|
+
nodeVersion: process.versions.node,
|
|
984
|
+
packageVersion: ""
|
|
985
|
+
};
|
|
986
|
+
function readParameterValues(value) {
|
|
987
|
+
if (!Array.isArray(value)) throw new Error("must contain a JSON parameter array");
|
|
988
|
+
const parameters = value.map((entry) => {
|
|
989
|
+
if (!entry || typeof entry !== "object" || typeof entry.ParameterKey !== "string" || typeof entry.ParameterValue !== "string")
|
|
990
|
+
throw new Error("entries must contain string ParameterKey and ParameterValue fields");
|
|
991
|
+
return entry;
|
|
992
|
+
});
|
|
993
|
+
const keys = parameters.map(({ ParameterKey }) => ParameterKey);
|
|
994
|
+
if (new Set(keys).size !== keys.length) throw new Error("contains duplicate parameters");
|
|
995
|
+
return parameters;
|
|
996
|
+
}
|
|
997
|
+
async function templateContract(parameters) {
|
|
998
|
+
const template = await cloudFormationTemplate();
|
|
999
|
+
const parametersBlock = template.match(
|
|
1000
|
+
/^Parameters:\n[\s\S]*?(?=^[A-Za-z][A-Za-z0-9]*:\s*$)/m
|
|
1001
|
+
)?.[0];
|
|
1002
|
+
const metadataBlock = template.match(/^Metadata:\n[\s\S]*?(?=^Parameters:\s*$)/m)?.[0];
|
|
1003
|
+
if (!parametersBlock) throw new Error("template has no Parameters block");
|
|
1004
|
+
const parsedParameters = parse2(parametersBlock);
|
|
1005
|
+
const parsedMetadata = metadataBlock ? parse2(metadataBlock) : {};
|
|
1006
|
+
const definitions = parsedParameters.Parameters ?? {};
|
|
1007
|
+
const managedValue = parsedMetadata.Metadata?.PackageManagedParameters ?? [];
|
|
1008
|
+
if (!Array.isArray(managedValue) || !managedValue.every((key) => typeof key === "string"))
|
|
1009
|
+
throw new Error("template has invalid PackageManagedParameters metadata");
|
|
1010
|
+
const managed = new Set(managedValue);
|
|
1011
|
+
const values = Object.fromEntries(
|
|
1012
|
+
parameters.map((item) => [item.ParameterKey, item.ParameterValue])
|
|
1013
|
+
);
|
|
1014
|
+
const stale = Object.keys(values).filter((key) => !Object.hasOwn(definitions, key));
|
|
1015
|
+
const missing = Object.entries(definitions).filter(
|
|
1016
|
+
([key, definition]) => !Object.hasOwn(definition, "Default") && !managed.has(key) && !Object.hasOwn(values, key)
|
|
1017
|
+
).map(([key]) => key);
|
|
1018
|
+
if (missing.length || stale.length)
|
|
1019
|
+
throw new Error(
|
|
1020
|
+
`out of sync with template (missing: ${missing.join(", ") || "none"}; stale: ${stale.join(", ") || "none"})`
|
|
1021
|
+
);
|
|
1022
|
+
return { values, definitions };
|
|
1023
|
+
}
|
|
1024
|
+
function failureDetail(error) {
|
|
1025
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
|
|
1026
|
+
return "not found on PATH";
|
|
1027
|
+
return error instanceof Error ? error.message : String(error);
|
|
1028
|
+
}
|
|
1029
|
+
async function runDoctor(options, dependencies = actualDependencies) {
|
|
1030
|
+
const checks = [];
|
|
1031
|
+
const check = async (name, action) => {
|
|
1032
|
+
try {
|
|
1033
|
+
checks.push({ name, ok: true, detail: await action() });
|
|
1034
|
+
} catch (error) {
|
|
1035
|
+
checks.push({ name, ok: false, detail: failureDetail(error) });
|
|
1036
|
+
}
|
|
1037
|
+
};
|
|
1038
|
+
await check("Node.js", async () => {
|
|
1039
|
+
const major = Number(dependencies.nodeVersion.split(".")[0]);
|
|
1040
|
+
if (!Number.isInteger(major) || major < 22)
|
|
1041
|
+
throw new Error(`v${dependencies.nodeVersion} is unsupported; Node.js 22+ is required`);
|
|
1042
|
+
return `v${dependencies.nodeVersion}`;
|
|
1043
|
+
});
|
|
1044
|
+
for (const [name, command, args2] of [
|
|
1045
|
+
["npm", "npm", ["--version"]],
|
|
1046
|
+
["AWS CLI", "aws", ["--version"]],
|
|
1047
|
+
["jq", "jq", ["--version"]]
|
|
1048
|
+
])
|
|
1049
|
+
await check(name, () => dependencies.execute(command, [...args2]));
|
|
1050
|
+
const awsAvailable = checks.find(({ name }) => name === "AWS CLI")?.ok === true;
|
|
1051
|
+
await check("AWS identity", async () => {
|
|
1052
|
+
if (!awsAvailable) throw new Error("skipped because the AWS CLI is unavailable");
|
|
1053
|
+
const identity = await dependencies.execute("aws", [
|
|
1054
|
+
"sts",
|
|
1055
|
+
"get-caller-identity",
|
|
1056
|
+
"--region",
|
|
1057
|
+
options.region,
|
|
1058
|
+
"--output",
|
|
1059
|
+
"json",
|
|
1060
|
+
"--no-cli-pager"
|
|
1061
|
+
]);
|
|
1062
|
+
const parsed = JSON.parse(identity);
|
|
1063
|
+
if (typeof parsed.Arn !== "string" || typeof parsed.Account !== "string")
|
|
1064
|
+
throw new Error("AWS returned an invalid identity");
|
|
1065
|
+
return `${parsed.Arn} (${parsed.Account})`;
|
|
1066
|
+
});
|
|
1067
|
+
let parameterData;
|
|
1068
|
+
await check("Parameters/template", async () => {
|
|
1069
|
+
const parameters = readParameterValues(
|
|
1070
|
+
JSON.parse(await readFile3(options.parametersPath, "utf8"))
|
|
1071
|
+
);
|
|
1072
|
+
parameterData = await templateContract(parameters);
|
|
1073
|
+
return `${options.parametersPath} is compatible`;
|
|
1074
|
+
});
|
|
1075
|
+
await check("Artifact bucket", async () => {
|
|
1076
|
+
const bucket = parameterData?.values.LambdaArtifactBucket;
|
|
1077
|
+
if (!bucket) throw new Error("skipped because parameters do not provide LambdaArtifactBucket");
|
|
1078
|
+
if (!awsAvailable) throw new Error("skipped because the AWS CLI is unavailable");
|
|
1079
|
+
const output = await dependencies.execute("aws", [
|
|
1080
|
+
"s3api",
|
|
1081
|
+
"get-bucket-location",
|
|
1082
|
+
"--bucket",
|
|
1083
|
+
bucket,
|
|
1084
|
+
"--region",
|
|
1085
|
+
options.region,
|
|
1086
|
+
"--output",
|
|
1087
|
+
"json",
|
|
1088
|
+
"--no-cli-pager"
|
|
1089
|
+
]);
|
|
1090
|
+
const location = JSON.parse(output).LocationConstraint;
|
|
1091
|
+
const bucketRegion = location === null || location === void 0 ? "us-east-1" : location;
|
|
1092
|
+
if (bucketRegion !== options.region)
|
|
1093
|
+
throw new Error(`bucket is in ${bucketRegion}, not ${options.region}`);
|
|
1094
|
+
return `${bucket} exists in ${bucketRegion}`;
|
|
1095
|
+
});
|
|
1096
|
+
await check("Hosted client", async () => {
|
|
1097
|
+
const baseUrl = parameterData?.definitions.AssetBaseUrl?.Default;
|
|
1098
|
+
if (typeof baseUrl !== "string") throw new Error("template has no AssetBaseUrl default");
|
|
1099
|
+
if (!dependencies.packageVersion) throw new Error("installed package version is unavailable");
|
|
1100
|
+
const url = `${baseUrl.replace(/\/+$/, "")}/dashboard/${dependencies.packageVersion}/index.html`;
|
|
1101
|
+
const response = await dependencies.fetch(url);
|
|
1102
|
+
if (!response.ok) throw new Error(`${url} returned HTTP ${response.status}`);
|
|
1103
|
+
return `${url} returned HTTP ${response.status}`;
|
|
1104
|
+
});
|
|
1105
|
+
return checks;
|
|
1106
|
+
}
|
|
196
1107
|
|
|
197
1108
|
// packages/aws/src/cli.ts
|
|
198
1109
|
var args = process.argv.slice(2);
|
|
199
1110
|
var option = (name, fallback) => {
|
|
200
|
-
const
|
|
201
|
-
return
|
|
1111
|
+
const i2 = args.indexOf(name);
|
|
1112
|
+
return i2 >= 0 ? args[i2 + 1] : fallback;
|
|
1113
|
+
};
|
|
1114
|
+
async function installedPackageVersion() {
|
|
1115
|
+
const packageManifest = JSON.parse(
|
|
1116
|
+
await readFile4(new URL("../package.json", import.meta.url), "utf8")
|
|
1117
|
+
);
|
|
1118
|
+
return typeof packageManifest.version === "string" ? packageManifest.version : "";
|
|
1119
|
+
}
|
|
1120
|
+
var requiredOption = (name, fallback) => {
|
|
1121
|
+
const value = option(name, fallback);
|
|
1122
|
+
if (!value) throw new Error(`${name} is required`);
|
|
1123
|
+
return value;
|
|
202
1124
|
};
|
|
1125
|
+
function parameter(key, value) {
|
|
1126
|
+
return { ParameterKey: key, ParameterValue: value };
|
|
1127
|
+
}
|
|
1128
|
+
async function existingParameters(path) {
|
|
1129
|
+
try {
|
|
1130
|
+
const parsed = JSON.parse(await readFile4(path, "utf8"));
|
|
1131
|
+
if (!Array.isArray(parsed)) throw new Error(`${path} must contain a JSON parameter array`);
|
|
1132
|
+
const values = parsed.map((value) => {
|
|
1133
|
+
if (!value || typeof value !== "object" || typeof value.ParameterKey !== "string" || typeof value.ParameterValue !== "string")
|
|
1134
|
+
throw new Error(
|
|
1135
|
+
`${path} entries must contain string ParameterKey and ParameterValue fields`
|
|
1136
|
+
);
|
|
1137
|
+
return value;
|
|
1138
|
+
});
|
|
1139
|
+
const keys = values.map(({ ParameterKey }) => ParameterKey);
|
|
1140
|
+
if (new Set(keys).size !== keys.length) throw new Error(`${path} contains duplicate parameters`);
|
|
1141
|
+
return values;
|
|
1142
|
+
} catch (error) {
|
|
1143
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return [];
|
|
1144
|
+
throw error;
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
async function templateParameters() {
|
|
1148
|
+
const template = await cloudFormationTemplate();
|
|
1149
|
+
const block = template.match(/^Parameters:\n[\s\S]*?(?=^[A-Za-z][A-Za-z0-9]*:\s*$)/m)?.[0];
|
|
1150
|
+
if (!block) throw new Error("Unable to read Parameters from the CloudFormation template");
|
|
1151
|
+
const parsed = parse3(block);
|
|
1152
|
+
if (!parsed.Parameters) throw new Error("CloudFormation template has no Parameters");
|
|
1153
|
+
const metadataBlock = template.match(/^Metadata:\n[\s\S]*?(?=^Parameters:\s*$)/m)?.[0];
|
|
1154
|
+
const metadata = metadataBlock ? parse3(metadataBlock).Metadata ?? {} : {};
|
|
1155
|
+
if (metadata.PackageManagedParameters !== void 0 && (!Array.isArray(metadata.PackageManagedParameters) || !metadata.PackageManagedParameters.every((key) => typeof key === "string")))
|
|
1156
|
+
throw new Error("CloudFormation template has invalid PackageManagedParameters metadata");
|
|
1157
|
+
const packageManaged = new Set(metadata.PackageManagedParameters ?? []);
|
|
1158
|
+
const unknownManaged = [...packageManaged].filter(
|
|
1159
|
+
(key) => !Object.hasOwn(parsed.Parameters ?? {}, key)
|
|
1160
|
+
);
|
|
1161
|
+
if (unknownManaged.length)
|
|
1162
|
+
throw new Error(
|
|
1163
|
+
`CloudFormation template has unknown package-managed parameters: ${unknownManaged.join(", ")}`
|
|
1164
|
+
);
|
|
1165
|
+
return { definitions: parsed.Parameters, packageManaged };
|
|
1166
|
+
}
|
|
203
1167
|
try {
|
|
1168
|
+
const packageVersion = await installedPackageVersion();
|
|
1169
|
+
const bundledAssets = fileURLToPath2(new URL("../client", import.meta.url));
|
|
204
1170
|
if (args[0] === "deploy") {
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
if (!value) throw new Error(`${name} is required`);
|
|
208
|
-
return value;
|
|
209
|
-
};
|
|
210
|
-
const artifactDir = required("--artifact-dir");
|
|
1171
|
+
const artifactDir = requiredOption("--artifact-dir");
|
|
1172
|
+
const version = requiredOption("--version", packageVersion);
|
|
211
1173
|
await deployLambda({
|
|
212
1174
|
artifactDir,
|
|
213
|
-
assetsDir: option("--assets-dir",
|
|
214
|
-
assetsBucket:
|
|
215
|
-
assetsBaseUrl:
|
|
216
|
-
functionName:
|
|
217
|
-
version
|
|
1175
|
+
assetsDir: option("--assets-dir", bundledAssets) ?? bundledAssets,
|
|
1176
|
+
assetsBucket: requiredOption("--assets-bucket"),
|
|
1177
|
+
assetsBaseUrl: requiredOption("--assets-base-url"),
|
|
1178
|
+
functionName: requiredOption("--function-name"),
|
|
1179
|
+
version,
|
|
218
1180
|
dryRun: args.includes("--dry-run")
|
|
219
1181
|
});
|
|
220
|
-
console.log(JSON.stringify({ deployed: true, version
|
|
1182
|
+
console.log(JSON.stringify({ deployed: true, version }));
|
|
1183
|
+
} else if (args[0] === "doctor") {
|
|
1184
|
+
const parametersPath = option("--parameters", "aws-dashboard-parameters.json") ?? "aws-dashboard-parameters.json";
|
|
1185
|
+
const region = option("--region", process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? "us-east-1") ?? "us-east-1";
|
|
1186
|
+
const checks = await runDoctor(
|
|
1187
|
+
{ parametersPath, region },
|
|
1188
|
+
{
|
|
1189
|
+
async execute(command, commandArgs) {
|
|
1190
|
+
const { execFile: execFile3 } = await import("node:child_process");
|
|
1191
|
+
const { promisify: promisify3 } = await import("node:util");
|
|
1192
|
+
return (await promisify3(execFile3)(command, commandArgs)).stdout.trim();
|
|
1193
|
+
},
|
|
1194
|
+
async fetch(url) {
|
|
1195
|
+
return fetch(url);
|
|
1196
|
+
},
|
|
1197
|
+
nodeVersion: process.versions.node,
|
|
1198
|
+
packageVersion
|
|
1199
|
+
}
|
|
1200
|
+
);
|
|
1201
|
+
for (const check of checks)
|
|
1202
|
+
console.log(`${check.ok ? "PASS" : "FAIL"} ${check.name}: ${check.detail}`);
|
|
1203
|
+
if (checks.some(({ ok }) => !ok)) process.exitCode = 1;
|
|
1204
|
+
} else if (args[0] === "parameters") {
|
|
1205
|
+
const output = option("--output", "aws-dashboard-parameters.json") ?? "aws-dashboard-parameters.json";
|
|
1206
|
+
const existing = await existingParameters(output);
|
|
1207
|
+
const existingValues = Object.fromEntries(
|
|
1208
|
+
existing.map(({ ParameterKey, ParameterValue }) => [ParameterKey, ParameterValue])
|
|
1209
|
+
);
|
|
1210
|
+
const artifactBucket = option("--artifact-bucket", existingValues.LambdaArtifactBucket);
|
|
1211
|
+
if (!artifactBucket) throw new Error("--artifact-bucket is required");
|
|
1212
|
+
const { definitions, packageManaged } = await templateParameters();
|
|
1213
|
+
const templateKeys = Object.keys(definitions);
|
|
1214
|
+
const hasDefault = (key) => Object.hasOwn(definitions[key] ?? {}, "Default");
|
|
1215
|
+
const hasValue = (key) => key === "LambdaArtifactBucket" || Object.hasOwn(existingValues, key);
|
|
1216
|
+
const missingRequired = templateKeys.filter(
|
|
1217
|
+
(key) => !hasDefault(key) && !packageManaged.has(key) && !hasValue(key)
|
|
1218
|
+
);
|
|
1219
|
+
const staleExisting = Object.keys(existingValues).filter(
|
|
1220
|
+
(key) => !Object.hasOwn(definitions, key)
|
|
1221
|
+
);
|
|
1222
|
+
if (missingRequired.length || staleExisting.length) {
|
|
1223
|
+
throw new Error(
|
|
1224
|
+
`Parameter values are out of sync with the CloudFormation template (missing: ${missingRequired.join(", ") || "none"}; stale: ${staleExisting.join(", ") || "none"})`
|
|
1225
|
+
);
|
|
1226
|
+
}
|
|
1227
|
+
const includeDefaults = args.includes("--include-defaults");
|
|
1228
|
+
const parameters = templateKeys.filter(
|
|
1229
|
+
(key) => !packageManaged.has(key) && (includeDefaults || !hasDefault(key) || Object.hasOwn(existingValues, key))
|
|
1230
|
+
).map((key) => {
|
|
1231
|
+
const definition = definitions[key];
|
|
1232
|
+
const value = key === "LambdaArtifactBucket" ? artifactBucket : existingValues[key] ?? definition?.Default;
|
|
1233
|
+
if (value === void 0) throw new Error(`No value for CloudFormation parameter ${key}`);
|
|
1234
|
+
return parameter(key, String(value));
|
|
1235
|
+
});
|
|
1236
|
+
await writeFile3(output, `${JSON.stringify(parameters, null, 2)}
|
|
1237
|
+
`);
|
|
1238
|
+
console.log(JSON.stringify({ output }));
|
|
221
1239
|
} else if (args[0] !== "package")
|
|
222
|
-
throw new Error("Usage: ze-great-dashboard-aws package|deploy [options]");
|
|
1240
|
+
throw new Error("Usage: ze-great-dashboard-aws package|parameters|deploy|doctor [options]");
|
|
223
1241
|
else {
|
|
224
1242
|
const boardConfig = option("--board-config");
|
|
225
|
-
const version = option("--version", process.env.DASHBOARD_VERSION);
|
|
226
|
-
if (!boardConfig
|
|
1243
|
+
const version = option("--version", process.env.DASHBOARD_VERSION ?? packageVersion);
|
|
1244
|
+
if (!boardConfig) throw new Error("--board-config is required");
|
|
1245
|
+
if (!version)
|
|
1246
|
+
throw new Error("Unable to determine the package version; pass --version explicitly");
|
|
227
1247
|
const metadata = await packageLambda({
|
|
228
1248
|
boardConfigPath: boardConfig,
|
|
229
1249
|
outputDir: option("--output", "aws-release") ?? "aws-release",
|