run402 1.69.5 → 1.69.7
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/lib/agent.mjs +37 -11
- package/lib/apps.mjs +92 -40
- package/lib/argparse.mjs +53 -1
- package/lib/billing.mjs +65 -24
- package/lib/blob.mjs +87 -49
- package/lib/cdn.mjs +21 -8
- package/lib/contracts.mjs +112 -33
- package/lib/deploy-v2.mjs +159 -62
- package/lib/domains.mjs +22 -11
- package/lib/functions.mjs +42 -6
- package/lib/image.mjs +17 -8
- package/lib/message.mjs +4 -1
- package/lib/secrets.mjs +29 -12
- package/lib/sender-domain.mjs +32 -14
- package/lib/sites.mjs +39 -16
- package/lib/subdomains.mjs +31 -35
- package/lib/tier.mjs +26 -4
- package/package.json +1 -1
- package/sdk/dist/namespaces/ai.d.ts.map +1 -1
- package/sdk/dist/namespaces/ai.js +7 -2
- package/sdk/dist/namespaces/ai.js.map +1 -1
- package/sdk/dist/namespaces/blobs.d.ts +3 -2
- package/sdk/dist/namespaces/blobs.d.ts.map +1 -1
- package/sdk/dist/namespaces/blobs.js +38 -7
- package/sdk/dist/namespaces/blobs.js.map +1 -1
- package/sdk/dist/namespaces/blobs.types.d.ts +5 -6
- package/sdk/dist/namespaces/blobs.types.d.ts.map +1 -1
- package/sdk/dist/namespaces/contracts.d.ts.map +1 -1
- package/sdk/dist/namespaces/contracts.js +17 -4
- package/sdk/dist/namespaces/contracts.js.map +1 -1
- package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
- package/sdk/dist/namespaces/deploy.js +13 -1
- package/sdk/dist/namespaces/deploy.js.map +1 -1
- package/sdk/dist/namespaces/functions.d.ts.map +1 -1
- package/sdk/dist/namespaces/functions.js +92 -1
- package/sdk/dist/namespaces/functions.js.map +1 -1
- package/sdk/dist/node/files.d.ts +11 -5
- package/sdk/dist/node/files.d.ts.map +1 -1
- package/sdk/dist/node/files.js +31 -7
- package/sdk/dist/node/files.js.map +1 -1
- package/sdk/dist/validation.d.ts +2 -0
- package/sdk/dist/validation.d.ts.map +1 -1
- package/sdk/dist/validation.js +10 -0
- package/sdk/dist/validation.js.map +1 -1
|
@@ -5,6 +5,18 @@
|
|
|
5
5
|
* `/projects/v1/admin/:id/functions*` and `/functions/v1/:name`.
|
|
6
6
|
*/
|
|
7
7
|
import { LocalError, ProjectNotFound } from "../errors.js";
|
|
8
|
+
const FUNCTION_NAME_RE = /^[a-z0-9][a-z0-9_-]{0,127}$/;
|
|
9
|
+
const FUNCTION_LOG_REQUEST_ID_RE = /^req_[A-Za-z0-9_-]{4,128}$/;
|
|
10
|
+
const FUNCTION_LOG_TAIL_MAX = 1000;
|
|
11
|
+
const FUNCTION_DEP_MAX = 30;
|
|
12
|
+
const FUNCTION_DEP_SPEC_MAX = 200;
|
|
13
|
+
const DISALLOWED_FUNCTION_DEPS = new Set([
|
|
14
|
+
"@run402/functions",
|
|
15
|
+
"run402-functions",
|
|
16
|
+
"sharp",
|
|
17
|
+
"canvas",
|
|
18
|
+
"bcrypt",
|
|
19
|
+
]);
|
|
8
20
|
export class Functions {
|
|
9
21
|
client;
|
|
10
22
|
constructor(client) {
|
|
@@ -29,7 +41,11 @@ export class Functions {
|
|
|
29
41
|
* @throws {PaymentRequired} when the project lease has expired.
|
|
30
42
|
*/
|
|
31
43
|
async deploy(projectId, opts) {
|
|
44
|
+
validateFunctionName(opts.name, "name", "deploying function");
|
|
45
|
+
validateFunctionCode(opts.code, "code", "deploying function");
|
|
32
46
|
validateFunctionConfig(opts.config, "config", "deploying function");
|
|
47
|
+
validateFunctionDeps(opts.deps, "deps", "deploying function");
|
|
48
|
+
validateFunctionSchedule(opts.schedule, "schedule", "deploying function");
|
|
33
49
|
const project = await this.client.getProject(projectId);
|
|
34
50
|
if (!project)
|
|
35
51
|
throw new ProjectNotFound(projectId, "deploying function");
|
|
@@ -95,11 +111,13 @@ export class Functions {
|
|
|
95
111
|
if (!project)
|
|
96
112
|
throw new ProjectNotFound(projectId, "fetching function logs");
|
|
97
113
|
const tail = opts.tail ?? 50;
|
|
114
|
+
validatePositiveJsonInteger(tail, "tail", "fetching function logs", { max: FUNCTION_LOG_TAIL_MAX });
|
|
98
115
|
const search = new URLSearchParams({ tail: String(tail) });
|
|
99
116
|
if (opts.since !== undefined) {
|
|
100
117
|
search.set("since", String(parseLogSince(opts.since)));
|
|
101
118
|
}
|
|
102
119
|
if (opts.requestId !== undefined) {
|
|
120
|
+
validateFunctionLogRequestId(opts.requestId, "requestId", "fetching function logs");
|
|
103
121
|
search.set("request_id", opts.requestId);
|
|
104
122
|
}
|
|
105
123
|
const path = `/projects/v1/admin/${projectId}/functions/${encodeURIComponent(name)}/logs?${search.toString()}`;
|
|
@@ -137,6 +155,10 @@ export class Functions {
|
|
|
137
155
|
async update(projectId, name, opts) {
|
|
138
156
|
validatePositiveJsonInteger(opts.timeout, "timeout", "updating function");
|
|
139
157
|
validatePositiveJsonInteger(opts.memory, "memory", "updating function");
|
|
158
|
+
validateFunctionSchedule(opts.schedule, "schedule", "updating function");
|
|
159
|
+
if (opts.schedule === undefined && opts.timeout === undefined && opts.memory === undefined) {
|
|
160
|
+
throw new LocalError("Provide at least one supported update field: schedule, timeout, or memory", "updating function");
|
|
161
|
+
}
|
|
140
162
|
const project = await this.client.getProject(projectId);
|
|
141
163
|
if (!project)
|
|
142
164
|
throw new ProjectNotFound(projectId, "updating function");
|
|
@@ -178,11 +200,80 @@ function validateFunctionConfig(config, resource, context) {
|
|
|
178
200
|
validatePositiveJsonInteger(record.timeout, `${resource}.timeout`, context);
|
|
179
201
|
validatePositiveJsonInteger(record.memory, `${resource}.memory`, context);
|
|
180
202
|
}
|
|
181
|
-
function
|
|
203
|
+
function validateFunctionName(value, resource, context) {
|
|
204
|
+
if (typeof value !== "string" || !FUNCTION_NAME_RE.test(value)) {
|
|
205
|
+
throw new LocalError(`${resource} must be a lowercase URL-safe function name (1-128 chars, starts with a letter or digit)`, context);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function validateFunctionCode(value, resource, context) {
|
|
209
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
210
|
+
throw new LocalError(`${resource} must be a non-empty source string`, context);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function validateFunctionDeps(value, resource, context) {
|
|
214
|
+
if (value === undefined)
|
|
215
|
+
return;
|
|
216
|
+
if (!Array.isArray(value)) {
|
|
217
|
+
throw new LocalError(`${resource} must be an array of npm package specs`, context);
|
|
218
|
+
}
|
|
219
|
+
if (value.length > FUNCTION_DEP_MAX) {
|
|
220
|
+
throw new LocalError(`${resource} must contain at most ${FUNCTION_DEP_MAX} entries`, context);
|
|
221
|
+
}
|
|
222
|
+
for (const [index, dep] of value.entries()) {
|
|
223
|
+
const entry = `${resource}[${index}]`;
|
|
224
|
+
if (typeof dep !== "string" || dep.trim() === "") {
|
|
225
|
+
throw new LocalError(`${entry} must be a non-empty npm package spec`, context);
|
|
226
|
+
}
|
|
227
|
+
if (dep !== dep.trim()) {
|
|
228
|
+
throw new LocalError(`${entry} must not contain leading or trailing whitespace`, context);
|
|
229
|
+
}
|
|
230
|
+
if (dep.length > FUNCTION_DEP_SPEC_MAX) {
|
|
231
|
+
throw new LocalError(`${entry} must be ${FUNCTION_DEP_SPEC_MAX} characters or fewer`, context);
|
|
232
|
+
}
|
|
233
|
+
if (/\s/.test(dep)) {
|
|
234
|
+
throw new LocalError(`${entry} must not contain whitespace`, context);
|
|
235
|
+
}
|
|
236
|
+
const packageName = depPackageName(dep);
|
|
237
|
+
if (DISALLOWED_FUNCTION_DEPS.has(packageName)) {
|
|
238
|
+
throw new LocalError(`${entry} references unsupported dependency ${packageName}`, context);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function depPackageName(spec) {
|
|
243
|
+
if (spec.startsWith("@")) {
|
|
244
|
+
const slash = spec.indexOf("/");
|
|
245
|
+
if (slash === -1)
|
|
246
|
+
return spec;
|
|
247
|
+
const versionAt = spec.indexOf("@", slash);
|
|
248
|
+
return versionAt === -1 ? spec : spec.slice(0, versionAt);
|
|
249
|
+
}
|
|
250
|
+
const versionAt = spec.indexOf("@");
|
|
251
|
+
return versionAt === -1 ? spec : spec.slice(0, versionAt);
|
|
252
|
+
}
|
|
253
|
+
function validateFunctionSchedule(value, resource, context) {
|
|
254
|
+
if (value === undefined || value === null)
|
|
255
|
+
return;
|
|
256
|
+
if (typeof value !== "string") {
|
|
257
|
+
throw new LocalError(`${resource} must be a 5-field cron string, null, or undefined`, context);
|
|
258
|
+
}
|
|
259
|
+
const parts = value.trim().split(/\s+/);
|
|
260
|
+
if (value.trim() === "" || parts.length !== 5 || parts.some((part) => part === "")) {
|
|
261
|
+
throw new LocalError(`${resource} must be a 5-field cron string`, context);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function validateFunctionLogRequestId(value, resource, context) {
|
|
265
|
+
if (typeof value !== "string" || !FUNCTION_LOG_REQUEST_ID_RE.test(value)) {
|
|
266
|
+
throw new LocalError(`${resource} must match req_<4-128 url-safe chars>`, context);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function validatePositiveJsonInteger(value, resource, context, opts = {}) {
|
|
182
270
|
if (value === undefined)
|
|
183
271
|
return;
|
|
184
272
|
if (!Number.isSafeInteger(value) || value < 1) {
|
|
185
273
|
throw new LocalError(`${resource} must be a positive safe JSON integer`, context);
|
|
186
274
|
}
|
|
275
|
+
if (opts.max !== undefined && value > opts.max) {
|
|
276
|
+
throw new LocalError(`${resource} must be <= ${opts.max}`, context);
|
|
277
|
+
}
|
|
187
278
|
}
|
|
188
279
|
//# sourceMappingURL=functions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAc3D,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAA2B;QACzD,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAc3D,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AAChE,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACvC,mBAAmB;IACnB,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAA2B;QACzD,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QACpE,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC9D,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAEzE,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/D,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,YAAY,EAC3C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,IAAI;YACJ,OAAO,EAAE,oBAAoB;SAC9B,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAY,EACZ,OAA8B,EAAE;QAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,OAAO,CAAC,WAAW;YAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,MAAM,WAAW,GAAqC;YACpD,MAAM;YACN,OAAO;YACP,OAAO,EAAE,mBAAmB;SAC7B,CAAC;QACF,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACrE,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAU,iBAAiB,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;QACtF,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAChC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CACR,SAAiB,EACjB,IAAY,EACZ,OAA4B,EAAE;QAE9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,4BAA4B,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,IAAI,GAAG,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAE/G,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB,IAAI,EAAE;YACnD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,YAAY,EAC3C;YACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAAY;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACvE;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAY,EACZ,IAA2B;QAE3B,2BAA2B,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC1E,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QACxE,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3F,MAAM,IAAI,UAAU,CAClB,2EAA2E,EAC3E,mBAAmB,CACpB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACvE;YACE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,IAAI;YACJ,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,UAAU,CAClB,2CAA2C,KAAK,EAAE,EAClD,wBAAwB,CACzB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAe,EAAE,QAAgB,EAAE,OAAe;IAChF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,2BAA2B,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5E,2BAA2B,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,QAAQ,SAAS,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,UAAU,CAClB,GAAG,QAAQ,0FAA0F,EACrG,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,oCAAoC,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe;IAC7E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,wCAAwC,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,yBAAyB,gBAAgB,UAAU,EAAE,OAAO,CAAC,CAAC;IAChG,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,GAAG,QAAQ,IAAI,KAAK,GAAG,CAAC;QACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,uCAAuC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,kDAAkD,EAAE,OAAO,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACvC,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,YAAY,qBAAqB,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,8BAA8B,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,sCAAsC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe;IACjF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,oDAAoD,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,wCAAwC,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAc,EACd,QAAgB,EAChB,OAAe,EACf,OAAyB,EAAE;IAE3B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,uCAAuC,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAK,KAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3D,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
package/sdk/dist/node/files.d.ts
CHANGED
|
@@ -9,8 +9,12 @@
|
|
|
9
9
|
import type { FileSet } from "../namespaces/deploy.types.js";
|
|
10
10
|
export interface FileSetFromDirOptions {
|
|
11
11
|
/** Additional names to skip at any depth. Merged with the default ignore
|
|
12
|
-
* list (`.git`, `node_modules`, `.DS_Store`)
|
|
12
|
+
* list (`.git`, `node_modules`, `.DS_Store`) and, unless
|
|
13
|
+
* `includeSensitive` is true, common secret-bearing filenames. */
|
|
13
14
|
ignore?: Iterable<string>;
|
|
15
|
+
/** Include dotenv, npmrc, and private-key-like files that are skipped by
|
|
16
|
+
* default. Use only when these files are intentional deploy artifacts. */
|
|
17
|
+
includeSensitive?: boolean;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* Walk a directory and return a `FileSet` whose values are `FsFileSource`
|
|
@@ -18,10 +22,12 @@ export interface FileSetFromDirOptions {
|
|
|
18
22
|
* content-type; the deploy normalizer hashes and uploads each file from
|
|
19
23
|
* disk on demand.
|
|
20
24
|
*
|
|
21
|
-
* Skips `.git`, `node_modules`, `.DS_Store
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
+
* Skips `.git`, `node_modules`, `.DS_Store`, common secret-bearing filenames
|
|
26
|
+
* like `.env`, `.npmrc`, and private-key material (plus any names in
|
|
27
|
+
* `opts.ignore`) at every depth. Pass `{ includeSensitive: true }` to opt in
|
|
28
|
+
* to collecting those sensitive filenames deliberately. Rejects symlinks.
|
|
29
|
+
* Throws `LocalError` if the directory does not exist, is not a directory, or
|
|
30
|
+
* contains no deployable files after the ignore list is applied.
|
|
25
31
|
*
|
|
26
32
|
* @example
|
|
27
33
|
* import { run402 } from "@run402/sdk/node";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/node/files.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/node/files.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,+BAA+B,CAAC;AAmB3E,MAAM,WAAW,qBAAqB;IACpC;;uEAEmE;IACnE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B;+EAC2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,OAAO,CAAC,CAkClB;AAiDD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
package/sdk/dist/node/files.js
CHANGED
|
@@ -10,6 +10,20 @@ import { readdir, lstat } from "node:fs/promises";
|
|
|
10
10
|
import { join, relative, sep } from "node:path";
|
|
11
11
|
import { LocalError } from "../errors.js";
|
|
12
12
|
const DEFAULT_IGNORE = new Set([".git", "node_modules", ".DS_Store"]);
|
|
13
|
+
const DEFAULT_SENSITIVE_IGNORE_NAMES = new Set([
|
|
14
|
+
".env",
|
|
15
|
+
".envrc",
|
|
16
|
+
".npmrc",
|
|
17
|
+
".pnpmrc",
|
|
18
|
+
".yarnrc",
|
|
19
|
+
".netrc",
|
|
20
|
+
".pypirc",
|
|
21
|
+
"id_dsa",
|
|
22
|
+
"id_ecdsa",
|
|
23
|
+
"id_ed25519",
|
|
24
|
+
"id_rsa",
|
|
25
|
+
]);
|
|
26
|
+
const DEFAULT_SENSITIVE_IGNORE_SUFFIXES = [".key", ".pem", ".p12", ".pfx"];
|
|
13
27
|
const CONTEXT = "collecting files for deploy";
|
|
14
28
|
/**
|
|
15
29
|
* Walk a directory and return a `FileSet` whose values are `FsFileSource`
|
|
@@ -17,10 +31,12 @@ const CONTEXT = "collecting files for deploy";
|
|
|
17
31
|
* content-type; the deploy normalizer hashes and uploads each file from
|
|
18
32
|
* disk on demand.
|
|
19
33
|
*
|
|
20
|
-
* Skips `.git`, `node_modules`, `.DS_Store
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
34
|
+
* Skips `.git`, `node_modules`, `.DS_Store`, common secret-bearing filenames
|
|
35
|
+
* like `.env`, `.npmrc`, and private-key material (plus any names in
|
|
36
|
+
* `opts.ignore`) at every depth. Pass `{ includeSensitive: true }` to opt in
|
|
37
|
+
* to collecting those sensitive filenames deliberately. Rejects symlinks.
|
|
38
|
+
* Throws `LocalError` if the directory does not exist, is not a directory, or
|
|
39
|
+
* contains no deployable files after the ignore list is applied.
|
|
24
40
|
*
|
|
25
41
|
* @example
|
|
26
42
|
* import { run402 } from "@run402/sdk/node";
|
|
@@ -50,13 +66,13 @@ export async function fileSetFromDir(root, opts = {}) {
|
|
|
50
66
|
throw new LocalError(`path ${root} is not a directory`, CONTEXT);
|
|
51
67
|
}
|
|
52
68
|
const out = {};
|
|
53
|
-
await walkInto(root, root, ignore, out);
|
|
69
|
+
await walkInto(root, root, ignore, opts.includeSensitive === true, out);
|
|
54
70
|
if (Object.keys(out).length === 0) {
|
|
55
71
|
throw new LocalError(`directory ${root} contains no deployable files`, CONTEXT);
|
|
56
72
|
}
|
|
57
73
|
return out;
|
|
58
74
|
}
|
|
59
|
-
async function walkInto(root, current, ignore, out) {
|
|
75
|
+
async function walkInto(root, current, ignore, includeSensitive, out) {
|
|
60
76
|
let entries;
|
|
61
77
|
try {
|
|
62
78
|
entries = await readdir(current, { withFileTypes: true });
|
|
@@ -67,12 +83,14 @@ async function walkInto(root, current, ignore, out) {
|
|
|
67
83
|
for (const entry of entries) {
|
|
68
84
|
if (ignore.has(entry.name))
|
|
69
85
|
continue;
|
|
86
|
+
if (!includeSensitive && isSensitiveIgnoredName(entry.name))
|
|
87
|
+
continue;
|
|
70
88
|
const fullPath = join(current, entry.name);
|
|
71
89
|
if (entry.isSymbolicLink()) {
|
|
72
90
|
throw new LocalError(`symlink found at ${fullPath} (following symlinks is not supported)`, CONTEXT);
|
|
73
91
|
}
|
|
74
92
|
if (entry.isDirectory()) {
|
|
75
|
-
await walkInto(root, fullPath, ignore, out);
|
|
93
|
+
await walkInto(root, fullPath, ignore, includeSensitive, out);
|
|
76
94
|
continue;
|
|
77
95
|
}
|
|
78
96
|
if (entry.isFile()) {
|
|
@@ -81,6 +99,12 @@ async function walkInto(root, current, ignore, out) {
|
|
|
81
99
|
}
|
|
82
100
|
}
|
|
83
101
|
}
|
|
102
|
+
function isSensitiveIgnoredName(name) {
|
|
103
|
+
const lower = name.toLowerCase();
|
|
104
|
+
return (lower.startsWith(".env.") ||
|
|
105
|
+
DEFAULT_SENSITIVE_IGNORE_NAMES.has(lower) ||
|
|
106
|
+
DEFAULT_SENSITIVE_IGNORE_SUFFIXES.some((suffix) => lower.endsWith(suffix)));
|
|
107
|
+
}
|
|
84
108
|
/** Normalize a relative path to POSIX forward slashes. Exposed for tests. */
|
|
85
109
|
export function normalizeRelPath(rel) {
|
|
86
110
|
return sep === "/" ? rel : rel.split(sep).join("/");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/node/files.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;AACtE,MAAM,OAAO,GAAG,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/node/files.ts"],"names":[],"mappings":"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"}
|
package/sdk/dist/validation.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export declare function assertPositiveSafeInteger(value: number, name: string, context: string): void;
|
|
2
2
|
export declare function assertWeiString(value: string, name: string, context: string): void;
|
|
3
|
+
export declare function assertEvmAddress(value: string, name: string, context: string): void;
|
|
4
|
+
export declare function assertStringInSet<T extends string>(value: string, allowed: readonly T[], name: string, context: string): asserts value is T;
|
|
3
5
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAIN"}
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,IAAI,CAAC,CAIpB"}
|
package/sdk/dist/validation.js
CHANGED
|
@@ -9,4 +9,14 @@ export function assertWeiString(value, name, context) {
|
|
|
9
9
|
throw new LocalError(`${name} must be a decimal non-negative integer string in wei.`, context);
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
|
+
export function assertEvmAddress(value, name, context) {
|
|
13
|
+
if (typeof value !== "string" || !/^0x[a-fA-F0-9]{40}$/.test(value)) {
|
|
14
|
+
throw new LocalError(`${name} must be a 0x-prefixed 20-byte EVM address.`, context);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function assertStringInSet(value, allowed, name, context) {
|
|
18
|
+
if (!allowed.includes(value)) {
|
|
19
|
+
throw new LocalError(`${name} must be one of: ${allowed.join(", ")}.`, context);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
12
22
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,mCAAmC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,wDAAwD,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,mCAAmC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,wDAAwD,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,IAAY,EACZ,OAAe;IAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,6CAA6C,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,OAAqB,EACrB,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAU,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|