@certik/skynet 0.25.4 → 0.25.5
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/.vscode/settings.json +5 -0
- package/CHANGELOG.md +6 -1
- package/dist/api.js +38 -38
- package/dist/app.js +287 -293
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +0 -4
- package/dist/deploy.js +19 -22
- package/dist/dynamodb.js +22 -22
- package/dist/indexer.js +131 -134
- package/examples/api.ts +0 -0
- package/examples/indexer.ts +0 -0
- package/examples/mode-indexer.ts +0 -0
- package/package.json +1 -1
- package/src/dynamodb.ts +7 -0
- package/src/indexer.ts +9 -2
- package/dist/email.d.ts +0 -9
- package/dist/email.js +0 -31
package/dist/cli.js
CHANGED
|
@@ -33,11 +33,7 @@ function detectBin() {
|
|
|
33
33
|
const wd = detectDirectory(process.argv[1], "package.json");
|
|
34
34
|
return process.argv[1].slice(wd.length + path.sep.length).replace(path.sep, "/");
|
|
35
35
|
}
|
|
36
|
-
function getDeployBin(bin) {
|
|
37
|
-
return bin.endsWith(".ts") ? `bun ${bin}` : bin;
|
|
38
|
-
}
|
|
39
36
|
export {
|
|
40
|
-
getDeployBin,
|
|
41
37
|
getBinaryName,
|
|
42
38
|
detectWorkingDirectory,
|
|
43
39
|
detectSkynetDirectory,
|
package/dist/deploy.js
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
// src/env.ts
|
|
2
|
-
function ensureAndGet(envName, defaultValue) {
|
|
3
|
-
return process.env[envName] || defaultValue;
|
|
4
|
-
}
|
|
5
|
-
function getEnvironment() {
|
|
6
|
-
return ensureAndGet("SKYNET_ENVIRONMENT", "dev");
|
|
7
|
-
}
|
|
8
|
-
function getEnvOrThrow(envName) {
|
|
9
|
-
if (!process.env[envName]) {
|
|
10
|
-
throw new Error(`Must set environment variable ${envName}`);
|
|
11
|
-
}
|
|
12
|
-
return process.env[envName];
|
|
13
|
-
}
|
|
14
|
-
function isProduction() {
|
|
15
|
-
return getEnvironment() === "prd";
|
|
16
|
-
}
|
|
17
|
-
function isDev() {
|
|
18
|
-
return getEnvironment() === "dev";
|
|
19
|
-
}
|
|
20
1
|
// src/selector.ts
|
|
21
2
|
function getSelectorDesc(selector) {
|
|
22
3
|
return Object.keys(selector).map((name) => {
|
|
@@ -55,6 +36,25 @@ function getJobName(name, selectorFlags, mode) {
|
|
|
55
36
|
}
|
|
56
37
|
return jobName;
|
|
57
38
|
}
|
|
39
|
+
// src/env.ts
|
|
40
|
+
function ensureAndGet(envName, defaultValue) {
|
|
41
|
+
return process.env[envName] || defaultValue;
|
|
42
|
+
}
|
|
43
|
+
function getEnvironment() {
|
|
44
|
+
return ensureAndGet("SKYNET_ENVIRONMENT", "dev");
|
|
45
|
+
}
|
|
46
|
+
function getEnvOrThrow(envName) {
|
|
47
|
+
if (!process.env[envName]) {
|
|
48
|
+
throw new Error(`Must set environment variable ${envName}`);
|
|
49
|
+
}
|
|
50
|
+
return process.env[envName];
|
|
51
|
+
}
|
|
52
|
+
function isProduction() {
|
|
53
|
+
return getEnvironment() === "prd";
|
|
54
|
+
}
|
|
55
|
+
function isDev() {
|
|
56
|
+
return getEnvironment() === "dev";
|
|
57
|
+
}
|
|
58
58
|
// src/cli.ts
|
|
59
59
|
import path from "path";
|
|
60
60
|
import fs from "fs";
|
|
@@ -90,9 +90,6 @@ function detectBin() {
|
|
|
90
90
|
const wd = detectDirectory(process.argv[1], "package.json");
|
|
91
91
|
return process.argv[1].slice(wd.length + path.sep.length).replace(path.sep, "/");
|
|
92
92
|
}
|
|
93
|
-
function getDeployBin(bin) {
|
|
94
|
-
return bin.endsWith(".ts") ? `bun ${bin}` : bin;
|
|
95
|
-
}
|
|
96
93
|
// src/deploy.ts
|
|
97
94
|
import fs2 from "fs/promises";
|
|
98
95
|
import fso from "fs";
|
package/dist/dynamodb.js
CHANGED
|
@@ -1,25 +1,3 @@
|
|
|
1
|
-
// src/util.ts
|
|
2
|
-
function range(startAt, endAt, step) {
|
|
3
|
-
const arr = [];
|
|
4
|
-
for (let i = startAt;i <= endAt; i += step) {
|
|
5
|
-
arr.push([i, Math.min(endAt, i + step - 1)]);
|
|
6
|
-
}
|
|
7
|
-
return arr;
|
|
8
|
-
}
|
|
9
|
-
function arrayGroup(array, groupSize) {
|
|
10
|
-
const groups = [];
|
|
11
|
-
for (let i = 0;i < array.length; i += groupSize) {
|
|
12
|
-
groups.push(array.slice(i, i + groupSize));
|
|
13
|
-
}
|
|
14
|
-
return groups;
|
|
15
|
-
}
|
|
16
|
-
function fillRange(start, end) {
|
|
17
|
-
const result = [];
|
|
18
|
-
for (let i = start;i <= end; i++) {
|
|
19
|
-
result.push(i);
|
|
20
|
-
}
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
1
|
// src/object-hash.ts
|
|
24
2
|
import xh from "@node-rs/xxhash";
|
|
25
3
|
function getHash(obj) {
|
|
@@ -146,6 +124,28 @@ function memoize(func, options) {
|
|
|
146
124
|
}
|
|
147
125
|
return pMemoize(func, options);
|
|
148
126
|
}
|
|
127
|
+
// src/util.ts
|
|
128
|
+
function range(startAt, endAt, step) {
|
|
129
|
+
const arr = [];
|
|
130
|
+
for (let i = startAt;i <= endAt; i += step) {
|
|
131
|
+
arr.push([i, Math.min(endAt, i + step - 1)]);
|
|
132
|
+
}
|
|
133
|
+
return arr;
|
|
134
|
+
}
|
|
135
|
+
function arrayGroup(array, groupSize) {
|
|
136
|
+
const groups = [];
|
|
137
|
+
for (let i = 0;i < array.length; i += groupSize) {
|
|
138
|
+
groups.push(array.slice(i, i + groupSize));
|
|
139
|
+
}
|
|
140
|
+
return groups;
|
|
141
|
+
}
|
|
142
|
+
function fillRange(start, end) {
|
|
143
|
+
const result = [];
|
|
144
|
+
for (let i = start;i <= end; i++) {
|
|
145
|
+
result.push(i);
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
149
|
// src/dynamodb.ts
|
|
150
150
|
import {
|
|
151
151
|
DynamoDBDocumentClient,
|
package/dist/indexer.js
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
// src/selector.ts
|
|
2
|
+
function getSelectorDesc(selector) {
|
|
3
|
+
return Object.keys(selector).map((name) => {
|
|
4
|
+
return ` --${name.padEnd(14)}${selector[name].desc || selector[name].description || ""}`;
|
|
5
|
+
}).join(`
|
|
6
|
+
`);
|
|
7
|
+
}
|
|
8
|
+
function getSelectorFlags(selector) {
|
|
9
|
+
return Object.keys(selector).reduce((acc, name) => {
|
|
10
|
+
const flag = {
|
|
11
|
+
type: selector[name].type || "string",
|
|
12
|
+
...selector[name]
|
|
13
|
+
};
|
|
14
|
+
if (!selector[name].optional && selector[name].isRequired !== false) {
|
|
15
|
+
flag.isRequired = true;
|
|
16
|
+
}
|
|
17
|
+
return { ...acc, [name]: flag };
|
|
18
|
+
}, {});
|
|
19
|
+
}
|
|
20
|
+
function toSelectorString(selectorFlags, delim = ",") {
|
|
21
|
+
return Object.keys(selectorFlags).sort().map((flag) => {
|
|
22
|
+
return `${flag}=${selectorFlags[flag]}`;
|
|
23
|
+
}).join(delim);
|
|
24
|
+
}
|
|
25
|
+
function normalizeSelectorValue(v) {
|
|
26
|
+
return v.replace(/[^A-Za-z0-9]+/g, "-");
|
|
27
|
+
}
|
|
28
|
+
function getJobName(name, selectorFlags, mode) {
|
|
29
|
+
const selectorNamePart = Object.keys(selectorFlags).sort().map((name2) => selectorFlags[name2]).join("-");
|
|
30
|
+
let jobName = name;
|
|
31
|
+
if (mode) {
|
|
32
|
+
jobName += `-${mode}`;
|
|
33
|
+
}
|
|
34
|
+
if (selectorNamePart.length > 0) {
|
|
35
|
+
jobName += `-${normalizeSelectorValue(selectorNamePart)}`;
|
|
36
|
+
}
|
|
37
|
+
return jobName;
|
|
38
|
+
}
|
|
1
39
|
// src/env.ts
|
|
2
40
|
function ensureAndGet(envName, defaultValue) {
|
|
3
41
|
return process.env[envName] || defaultValue;
|
|
@@ -17,56 +55,63 @@ function isProduction() {
|
|
|
17
55
|
function isDev() {
|
|
18
56
|
return getEnvironment() === "dev";
|
|
19
57
|
}
|
|
20
|
-
// src/
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
for (let i = startAt;i <= endAt; i += step) {
|
|
24
|
-
arr.push([i, Math.min(endAt, i + step - 1)]);
|
|
25
|
-
}
|
|
26
|
-
return arr;
|
|
58
|
+
// src/log.ts
|
|
59
|
+
function isObject(a) {
|
|
60
|
+
return !!a && a.constructor === Object;
|
|
27
61
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
groups.push(array.slice(i, i + groupSize));
|
|
62
|
+
function print(o) {
|
|
63
|
+
if (Array.isArray(o)) {
|
|
64
|
+
return `[${o.map(print).join(", ")}]`;
|
|
32
65
|
}
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
function fillRange(start, end) {
|
|
36
|
-
const result = [];
|
|
37
|
-
for (let i = start;i <= end; i++) {
|
|
38
|
-
result.push(i);
|
|
66
|
+
if (isObject(o)) {
|
|
67
|
+
return `{${Object.keys(o).map((k) => `${k}: ${o[k]}`).join(", ")}}`;
|
|
39
68
|
}
|
|
40
|
-
return
|
|
69
|
+
return `${o}`;
|
|
41
70
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
71
|
+
function getLine(params) {
|
|
72
|
+
let line = "";
|
|
73
|
+
for (let i = 0, l = params.length;i < l; i++) {
|
|
74
|
+
line += `${print(params[i])} `.replace(/\n/gm, "\t");
|
|
75
|
+
}
|
|
76
|
+
return line.trim();
|
|
46
77
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
const after = new Date(d.getTime() + MS_IN_A_DAY * n);
|
|
50
|
-
return getDateOnly(after);
|
|
78
|
+
function timestamp() {
|
|
79
|
+
return new Date().toISOString();
|
|
51
80
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
var inline = {
|
|
82
|
+
debug: function(...args) {
|
|
83
|
+
if (true) {
|
|
84
|
+
console.log(`${timestamp()} ${getLine(args)}`);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
log: function(...args) {
|
|
88
|
+
if (true) {
|
|
89
|
+
console.log(`${timestamp()} ${getLine(args)}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
error: function(...args) {
|
|
93
|
+
if (true) {
|
|
94
|
+
console.error(`${timestamp()} ${getLine(args)}`);
|
|
95
|
+
}
|
|
57
96
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
97
|
+
};
|
|
98
|
+
var logger = {
|
|
99
|
+
debug: function(...args) {
|
|
100
|
+
if (true) {
|
|
101
|
+
console.log(`[${timestamp()}]`, ...args);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
log: function(...args) {
|
|
105
|
+
if (true) {
|
|
106
|
+
console.log(`[${timestamp()}]`, ...args);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
error: function(...args) {
|
|
110
|
+
if (true) {
|
|
111
|
+
console.error(`[${timestamp()}]`, ...args);
|
|
112
|
+
}
|
|
62
113
|
}
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
function dateRange(from, to, step) {
|
|
66
|
-
const days = daysInRange(from, to);
|
|
67
|
-
const windows = arrayGroup(days, step);
|
|
68
|
-
return windows.map((w) => [w[0], w[w.length - 1]]);
|
|
69
|
-
}
|
|
114
|
+
};
|
|
70
115
|
// src/object-hash.ts
|
|
71
116
|
import xh from "@node-rs/xxhash";
|
|
72
117
|
function getHash(obj) {
|
|
@@ -193,63 +238,28 @@ function memoize(func, options) {
|
|
|
193
238
|
}
|
|
194
239
|
return pMemoize(func, options);
|
|
195
240
|
}
|
|
196
|
-
// src/
|
|
197
|
-
function
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (Array.isArray(o)) {
|
|
202
|
-
return `[${o.map(print).join(", ")}]`;
|
|
203
|
-
}
|
|
204
|
-
if (isObject(o)) {
|
|
205
|
-
return `{${Object.keys(o).map((k) => `${k}: ${o[k]}`).join(", ")}}`;
|
|
241
|
+
// src/util.ts
|
|
242
|
+
function range(startAt, endAt, step) {
|
|
243
|
+
const arr = [];
|
|
244
|
+
for (let i = startAt;i <= endAt; i += step) {
|
|
245
|
+
arr.push([i, Math.min(endAt, i + step - 1)]);
|
|
206
246
|
}
|
|
207
|
-
return
|
|
247
|
+
return arr;
|
|
208
248
|
}
|
|
209
|
-
function
|
|
210
|
-
|
|
211
|
-
for (let i = 0
|
|
212
|
-
|
|
249
|
+
function arrayGroup(array, groupSize) {
|
|
250
|
+
const groups = [];
|
|
251
|
+
for (let i = 0;i < array.length; i += groupSize) {
|
|
252
|
+
groups.push(array.slice(i, i + groupSize));
|
|
213
253
|
}
|
|
214
|
-
return
|
|
215
|
-
}
|
|
216
|
-
function timestamp() {
|
|
217
|
-
return new Date().toISOString();
|
|
254
|
+
return groups;
|
|
218
255
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
log: function(...args) {
|
|
226
|
-
if (true) {
|
|
227
|
-
console.log(`${timestamp()} ${getLine(args)}`);
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
error: function(...args) {
|
|
231
|
-
if (true) {
|
|
232
|
-
console.error(`${timestamp()} ${getLine(args)}`);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
var logger = {
|
|
237
|
-
debug: function(...args) {
|
|
238
|
-
if (true) {
|
|
239
|
-
console.log(`[${timestamp()}]`, ...args);
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
log: function(...args) {
|
|
243
|
-
if (true) {
|
|
244
|
-
console.log(`[${timestamp()}]`, ...args);
|
|
245
|
-
}
|
|
246
|
-
},
|
|
247
|
-
error: function(...args) {
|
|
248
|
-
if (true) {
|
|
249
|
-
console.error(`[${timestamp()}]`, ...args);
|
|
250
|
-
}
|
|
256
|
+
function fillRange(start, end) {
|
|
257
|
+
const result = [];
|
|
258
|
+
for (let i = start;i <= end; i++) {
|
|
259
|
+
result.push(i);
|
|
251
260
|
}
|
|
252
|
-
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
253
263
|
// src/dynamodb.ts
|
|
254
264
|
import {
|
|
255
265
|
DynamoDBDocumentClient,
|
|
@@ -564,44 +574,6 @@ async function deleteRecordsByHashKey(tableName, indexName, hashKeyValue, verbos
|
|
|
564
574
|
}
|
|
565
575
|
return totalDeleted;
|
|
566
576
|
}
|
|
567
|
-
// src/selector.ts
|
|
568
|
-
function getSelectorDesc(selector) {
|
|
569
|
-
return Object.keys(selector).map((name) => {
|
|
570
|
-
return ` --${name.padEnd(14)}${selector[name].desc || selector[name].description || ""}`;
|
|
571
|
-
}).join(`
|
|
572
|
-
`);
|
|
573
|
-
}
|
|
574
|
-
function getSelectorFlags(selector) {
|
|
575
|
-
return Object.keys(selector).reduce((acc, name) => {
|
|
576
|
-
const flag = {
|
|
577
|
-
type: selector[name].type || "string",
|
|
578
|
-
...selector[name]
|
|
579
|
-
};
|
|
580
|
-
if (!selector[name].optional && selector[name].isRequired !== false) {
|
|
581
|
-
flag.isRequired = true;
|
|
582
|
-
}
|
|
583
|
-
return { ...acc, [name]: flag };
|
|
584
|
-
}, {});
|
|
585
|
-
}
|
|
586
|
-
function toSelectorString(selectorFlags, delim = ",") {
|
|
587
|
-
return Object.keys(selectorFlags).sort().map((flag) => {
|
|
588
|
-
return `${flag}=${selectorFlags[flag]}`;
|
|
589
|
-
}).join(delim);
|
|
590
|
-
}
|
|
591
|
-
function normalizeSelectorValue(v) {
|
|
592
|
-
return v.replace(/[^A-Za-z0-9]+/g, "-");
|
|
593
|
-
}
|
|
594
|
-
function getJobName(name, selectorFlags, mode) {
|
|
595
|
-
const selectorNamePart = Object.keys(selectorFlags).sort().map((name2) => selectorFlags[name2]).join("-");
|
|
596
|
-
let jobName = name;
|
|
597
|
-
if (mode) {
|
|
598
|
-
jobName += `-${mode}`;
|
|
599
|
-
}
|
|
600
|
-
if (selectorNamePart.length > 0) {
|
|
601
|
-
jobName += `-${normalizeSelectorValue(selectorNamePart)}`;
|
|
602
|
-
}
|
|
603
|
-
return jobName;
|
|
604
|
-
}
|
|
605
577
|
// src/cli.ts
|
|
606
578
|
import path from "path";
|
|
607
579
|
import fs from "fs";
|
|
@@ -637,8 +609,33 @@ function detectBin() {
|
|
|
637
609
|
const wd = detectDirectory(process.argv[1], "package.json");
|
|
638
610
|
return process.argv[1].slice(wd.length + path.sep.length).replace(path.sep, "/");
|
|
639
611
|
}
|
|
640
|
-
|
|
641
|
-
|
|
612
|
+
// src/date.ts
|
|
613
|
+
var MS_IN_A_DAY = 3600 * 24 * 1000;
|
|
614
|
+
function getDateOnly(date) {
|
|
615
|
+
return new Date(date).toISOString().split("T")[0];
|
|
616
|
+
}
|
|
617
|
+
function findDateAfter(date, n) {
|
|
618
|
+
const d = new Date(date);
|
|
619
|
+
const after = new Date(d.getTime() + MS_IN_A_DAY * n);
|
|
620
|
+
return getDateOnly(after);
|
|
621
|
+
}
|
|
622
|
+
function daysInRange(from, to) {
|
|
623
|
+
const fromTime = new Date(from).getTime();
|
|
624
|
+
const toTime = new Date(to).getTime();
|
|
625
|
+
if (fromTime > toTime) {
|
|
626
|
+
throw new Error(`range to date couldn't be earlier than range from date`);
|
|
627
|
+
}
|
|
628
|
+
const daysBetween = Math.floor((toTime - fromTime) / MS_IN_A_DAY);
|
|
629
|
+
const dates = [getDateOnly(new Date(fromTime))];
|
|
630
|
+
for (let i = 1;i <= daysBetween; i += 1) {
|
|
631
|
+
dates.push(getDateOnly(new Date(fromTime + i * MS_IN_A_DAY)));
|
|
632
|
+
}
|
|
633
|
+
return dates;
|
|
634
|
+
}
|
|
635
|
+
function dateRange(from, to, step) {
|
|
636
|
+
const days = daysInRange(from, to);
|
|
637
|
+
const windows = arrayGroup(days, step);
|
|
638
|
+
return windows.map((w) => [w[0], w[w.length - 1]]);
|
|
642
639
|
}
|
|
643
640
|
// src/indexer.ts
|
|
644
641
|
import meow from "meow";
|
package/examples/api.ts
CHANGED
|
File without changes
|
package/examples/indexer.ts
CHANGED
|
File without changes
|
package/examples/mode-indexer.ts
CHANGED
|
File without changes
|
package/package.json
CHANGED
package/src/dynamodb.ts
CHANGED
|
@@ -475,8 +475,15 @@ async function deleteRecordsByHashKey(
|
|
|
475
475
|
return totalDeleted;
|
|
476
476
|
}
|
|
477
477
|
|
|
478
|
+
function destroyDynamoDB() {
|
|
479
|
+
if (_dynamoDB) {
|
|
480
|
+
_dynamoDB.destroy();
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
478
484
|
export {
|
|
479
485
|
getDocClient,
|
|
486
|
+
destroyDynamoDB,
|
|
480
487
|
// export common dynamodb commands to make it easier to use
|
|
481
488
|
ScanCommand,
|
|
482
489
|
BatchWriteCommand,
|
package/src/indexer.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import meow from "meow";
|
|
2
|
-
import { createRecord, getRecordByKey } from "./dynamodb";
|
|
2
|
+
import { createRecord, getRecordByKey, destroyDynamoDB } from "./dynamodb";
|
|
3
3
|
import { getEnvironment } from "./env";
|
|
4
4
|
import { exponentialRetry } from "./availability";
|
|
5
5
|
import { range as numberRange, fillRange as fillNumberRange } from "./util";
|
|
@@ -213,6 +213,7 @@ function createModeIndexerApp<T extends IndexerStateValue, TSelector extends Sel
|
|
|
213
213
|
|
|
214
214
|
if (mode === "reset") {
|
|
215
215
|
await runReset(selectorFlags);
|
|
216
|
+
process.exit(0);
|
|
216
217
|
} else if (mode === "rebuild") {
|
|
217
218
|
const rebuildFrom = from || (await finalState.getMinId(selectorFlags));
|
|
218
219
|
const rebuildTo = to || (await finalState.getMaxId(selectorFlags));
|
|
@@ -389,6 +390,8 @@ function createModeIndexerApp<T extends IndexerStateValue, TSelector extends Sel
|
|
|
389
390
|
inline.log(
|
|
390
391
|
`[MODE INDEXER] validated ${offsetRange(from, to)} ${finalState.type} successfully in ${Date.now() - startTime}ms`,
|
|
391
392
|
);
|
|
393
|
+
|
|
394
|
+
process.exit(0);
|
|
392
395
|
}
|
|
393
396
|
|
|
394
397
|
async function execBuild(
|
|
@@ -521,7 +524,7 @@ function createModeIndexerApp<T extends IndexerStateValue, TSelector extends Sel
|
|
|
521
524
|
)}`,
|
|
522
525
|
);
|
|
523
526
|
|
|
524
|
-
|
|
527
|
+
process.exit(0);
|
|
525
528
|
}
|
|
526
529
|
|
|
527
530
|
inline.log(
|
|
@@ -646,6 +649,8 @@ ${selector ? getSelectorDesc(selector) : ""}
|
|
|
646
649
|
} catch (err) {
|
|
647
650
|
inline.error(err);
|
|
648
651
|
process.exit(1);
|
|
652
|
+
} finally {
|
|
653
|
+
destroyDynamoDB();
|
|
649
654
|
}
|
|
650
655
|
}
|
|
651
656
|
|
|
@@ -731,6 +736,8 @@ ${selector ? getSelectorDesc(selector) : ""}
|
|
|
731
736
|
}
|
|
732
737
|
|
|
733
738
|
inline.log(`[INDEXER] build successfully in ${Date.now() - startTime}ms`);
|
|
739
|
+
|
|
740
|
+
process.exit(0);
|
|
734
741
|
}
|
|
735
742
|
|
|
736
743
|
return runBuild(cli.flags as ModeIndexerFlags<TSelector>).catch((err) => {
|
package/dist/email.d.ts
DELETED
package/dist/email.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// src/email.ts
|
|
2
|
-
import Mailgun from "mailgun.js";
|
|
3
|
-
import formData from "form-data";
|
|
4
|
-
async function sendEmail({ to, subject, html, from, text }) {
|
|
5
|
-
const apiKey = process.env.MAILGUN_API_KEY;
|
|
6
|
-
if (!apiKey) {
|
|
7
|
-
throw new Error("missing MAILGUN_API_KEY");
|
|
8
|
-
}
|
|
9
|
-
const domain = process.env.MAILGUN_DOMAIN;
|
|
10
|
-
if (!domain) {
|
|
11
|
-
throw new Error("missing MAILGUN_DOMAIN");
|
|
12
|
-
}
|
|
13
|
-
const mailgun = new Mailgun(formData);
|
|
14
|
-
const mg = mailgun.client({ username: "api", key: apiKey });
|
|
15
|
-
const recipients = Array.isArray(to) ? to : [to];
|
|
16
|
-
try {
|
|
17
|
-
await mg.messages.create(domain, {
|
|
18
|
-
from,
|
|
19
|
-
to: recipients,
|
|
20
|
-
subject,
|
|
21
|
-
...text ? { text } : {},
|
|
22
|
-
html
|
|
23
|
-
});
|
|
24
|
-
} catch (error) {
|
|
25
|
-
console.error("failed to send email", error);
|
|
26
|
-
throw error;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export {
|
|
30
|
-
sendEmail
|
|
31
|
-
};
|