@voltro/cli 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +310 -7
- package/dist/apiBuild-BbR1nYcE.js +2 -0
- package/dist/{apiBuild-eInHm_bJ.js → apiBuild-DTLPSlt9.js} +8 -8
- package/dist/bin.js +2 -2
- package/dist/{commands-Cxs97AFp.js → commands-B0QT8dUY.js} +1948 -1599
- package/dist/dev-BJvbwjSz.js +2 -0
- package/dist/{dev-63Ehpw2p.js → dev-CK9fbuAM.js} +1408 -1342
- package/dist/index.js +1 -1
- package/dist/{inspectMetrics-DVCKKSPk.js → inspectMetrics-BeMjgt8x.js} +1018 -827
- package/dist/inspectState.d.ts +6 -2
- package/dist/{serveCommand-Cq7BhtpB.js → serveCommand-YR3mKjvf.js} +367 -384
- package/dist/serveEntry.js +3 -3
- package/dist/{start-CYe-7ueh.js → start-C_M4fGS2.js} +331 -309
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/agent-docs/cli.md +45 -17
- package/templates/agent-docs/data.md +109 -1
- package/templates/agent-docs/database/seedsdialects.md +20 -4
- package/templates/agent-docs/routing.md +52 -13
- package/templates/agent-docs/scheduling.md +32 -0
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-durable/schedules/nightlyReport.cron.tsx +5 -0
- package/templates/apps/api-durable/subscribers/orderChanges.subscribe.ts +8 -2
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +8 -8
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/dist/apiBuild-Ba4njm9m.js +0 -2
- package/dist/dev-CXsR8Zgo.js +0 -2
|
@@ -6,18 +6,18 @@ import { Cause as d, Effect as f, Layer as p } from "effect";
|
|
|
6
6
|
import { LoggerLayer as m, addSink as h, createLogger as g, printReadyBlock as _ } from "@voltro/logger";
|
|
7
7
|
import { closeSync as v, existsSync as y, mkdirSync as b, openSync as x, promises as S, readFileSync as C, readdirSync as w, statSync as T, unlinkSync as E, unwatchFile as ee, watchFile as D, writeSync as te } from "node:fs";
|
|
8
8
|
import { currentTraceContext as O, lastWriteProvenance as k, recordSample as A, resolveSecret as j } from "@voltro/runtime";
|
|
9
|
-
import { mkdir as M, writeFile as N } from "node:fs/promises";
|
|
10
|
-
import { FRAMEWORK_ENV_CATALOG as
|
|
11
|
-
import { __installPublicEnv as
|
|
12
|
-
import { createHash as
|
|
13
|
-
import { spawn as
|
|
14
|
-
import { timingSafeStringEqual as
|
|
15
|
-
import { homedir as
|
|
16
|
-
import { createConnection as
|
|
17
|
-
import { createRequire as
|
|
18
|
-
import { PassThrough as
|
|
9
|
+
import { mkdir as M, readFile as ne, writeFile as N } from "node:fs/promises";
|
|
10
|
+
import { FRAMEWORK_ENV_CATALOG as re, appEnvEntries as P, checkEnvNaming as ie, formatEnvErrors as F, installEnvSnapshot as ae, isEnvContract as oe, pluginEnvEntries as I, renderDotEnvExample as se, resolveEnv as ce } from "@voltro/env";
|
|
11
|
+
import { __installPublicEnv as le } from "@voltro/env/public";
|
|
12
|
+
import { createHash as ue } from "node:crypto";
|
|
13
|
+
import { spawn as de } from "node:child_process";
|
|
14
|
+
import { timingSafeStringEqual as fe } from "@voltro/protocol/session";
|
|
15
|
+
import { homedir as L } from "node:os";
|
|
16
|
+
import { createConnection as pe } from "node:net";
|
|
17
|
+
import { createRequire as me } from "node:module";
|
|
18
|
+
import { PassThrough as he } from "node:stream";
|
|
19
19
|
//#region src/cliRuntime.ts
|
|
20
|
-
var
|
|
20
|
+
var ge = [
|
|
21
21
|
"severity",
|
|
22
22
|
"code",
|
|
23
23
|
"detail",
|
|
@@ -34,14 +34,14 @@ var he = [
|
|
|
34
34
|
"file",
|
|
35
35
|
"line",
|
|
36
36
|
"routine"
|
|
37
|
-
],
|
|
37
|
+
], R = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
|
|
38
38
|
if (t > 10 || typeof e != "object" || !e || n.has(e)) return null;
|
|
39
39
|
n.add(e);
|
|
40
40
|
let r = e, i = r.message;
|
|
41
41
|
if (typeof i == "string" && i.length > 0 && i !== "Failed to execute statement") {
|
|
42
42
|
let e = { message: i };
|
|
43
43
|
typeof r.stack == "string" && (e.stack = r.stack);
|
|
44
|
-
for (let t of
|
|
44
|
+
for (let t of ge) r[t] !== void 0 && (e[t] = r[t]);
|
|
45
45
|
return e;
|
|
46
46
|
}
|
|
47
47
|
for (let e of [
|
|
@@ -54,12 +54,12 @@ var he = [
|
|
|
54
54
|
]) {
|
|
55
55
|
let i = r[e];
|
|
56
56
|
if (i !== void 0) {
|
|
57
|
-
let e =
|
|
57
|
+
let e = R(i, t + 1, n);
|
|
58
58
|
if (e) return e;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
if (Array.isArray(r.failures)) for (let e of r.failures) {
|
|
62
|
-
let r =
|
|
62
|
+
let r = R(e, t + 1, n);
|
|
63
63
|
if (r) return r;
|
|
64
64
|
}
|
|
65
65
|
return null;
|
|
@@ -83,7 +83,7 @@ var he = [
|
|
|
83
83
|
}
|
|
84
84
|
let n = null;
|
|
85
85
|
for (let e of t) {
|
|
86
|
-
let t =
|
|
86
|
+
let t = R(e);
|
|
87
87
|
if (t) {
|
|
88
88
|
n = t;
|
|
89
89
|
break;
|
|
@@ -106,10 +106,10 @@ var he = [
|
|
|
106
106
|
}, ye = (e, t = {}) => {
|
|
107
107
|
let n = e.pipe(f.provide(_e(t)));
|
|
108
108
|
u.runMain(n, { disableErrorReporting: !1 });
|
|
109
|
-
},
|
|
109
|
+
}, z = t(o(import.meta.url)), be = [a(z, "..", "templates"), a(z, "..", "..", "templates")], xe = (e) => ({
|
|
110
110
|
_tag: "TemplateNotFoundError",
|
|
111
111
|
searched: e
|
|
112
|
-
}), Se = ["AGENTS.md", "CLAUDE.md"], Ce = "voltro:agents-md:keep", we = 2048, Te = "<!-- VOLTRO:INDEX -->",
|
|
112
|
+
}), Se = ["AGENTS.md", "CLAUDE.md"], Ce = "voltro:agents-md:keep", we = 2048, Te = "<!-- VOLTRO:INDEX -->", B = (e, t) => e.exists(t).pipe(f.orElseSucceed(() => !1)), V = (e, t) => e.readFileString(t).pipe(f.orElseSucceed(() => "")), Ee = (e, t) => e.readFileString(t).pipe(f.map((e) => {
|
|
113
113
|
try {
|
|
114
114
|
return JSON.parse(e).workspaces !== void 0;
|
|
115
115
|
} catch {
|
|
@@ -118,7 +118,7 @@ var he = [
|
|
|
118
118
|
}), f.orElseSucceed(() => !1)), De = (e) => f.gen(function* () {
|
|
119
119
|
let n = yield* c.FileSystem, i = a(e);
|
|
120
120
|
for (;;) {
|
|
121
|
-
if ((yield*
|
|
121
|
+
if ((yield* B(n, r(i, ".git"))) || (yield* B(n, r(i, "pnpm-workspace.yaml"))) || (yield* Ee(n, r(i, "package.json")))) return i;
|
|
122
122
|
let o = t(i);
|
|
123
123
|
if (o === i) return a(e);
|
|
124
124
|
i = o;
|
|
@@ -132,12 +132,12 @@ var he = [
|
|
|
132
132
|
}
|
|
133
133
|
}), ke = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Ae = (e, t) => f.gen(function* () {
|
|
134
134
|
let n = r(t, "app.config.ts");
|
|
135
|
-
if (!(yield*
|
|
135
|
+
if (!(yield* B(e, n))) return null;
|
|
136
136
|
let i = (yield* f.tryPromise(() => import(s(n).href)).pipe(f.orElseSucceed(() => null)))?.default;
|
|
137
137
|
return !i || i.type && i.type !== "api" ? i?.type === "web" ? [] : null : (i.plugins ?? []).map(ke).filter((e) => e !== null);
|
|
138
138
|
}), je = (e, t) => f.gen(function* () {
|
|
139
139
|
let n = [], i = [], a = r(t, "apps");
|
|
140
|
-
if (!(yield*
|
|
140
|
+
if (!(yield* B(e, a))) return {
|
|
141
141
|
apis: n,
|
|
142
142
|
webs: i
|
|
143
143
|
};
|
|
@@ -145,8 +145,8 @@ var he = [
|
|
|
145
145
|
let o = r(a, t);
|
|
146
146
|
if ((yield* e.stat(o).pipe(f.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(o).pipe(f.orElseSucceed(() => []))) {
|
|
147
147
|
let a = r(o, t), s = r(a, "app.config.ts");
|
|
148
|
-
if (!(yield*
|
|
149
|
-
let c = yield*
|
|
148
|
+
if (!(yield* B(e, s))) continue;
|
|
149
|
+
let c = yield* V(e, s);
|
|
150
150
|
/type:\s*['"]web['"]/.test(c) ? i.push(a) : n.push(a);
|
|
151
151
|
}
|
|
152
152
|
}
|
|
@@ -259,9 +259,9 @@ Open the full reference and follow the patterns there:
|
|
|
259
259
|
Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
|
|
260
260
|
boundary, naming, anti-patterns) before editing.
|
|
261
261
|
`, Re = (e, n, r, i) => f.gen(function* () {
|
|
262
|
-
let a = yield*
|
|
262
|
+
let a = yield* B(e, n);
|
|
263
263
|
if (a) {
|
|
264
|
-
if ((yield*
|
|
264
|
+
if ((yield* V(e, n)).slice(0, we).includes("voltro:agents-md:keep")) return {
|
|
265
265
|
path: n,
|
|
266
266
|
action: "protected"
|
|
267
267
|
};
|
|
@@ -276,23 +276,23 @@ boundary, naming, anti-patterns) before editing.
|
|
|
276
276
|
};
|
|
277
277
|
}), ze = (e, t = {}) => f.gen(function* () {
|
|
278
278
|
let n = yield* c.FileSystem, i = yield* De(e), o = null;
|
|
279
|
-
for (let e of
|
|
279
|
+
for (let e of be) if (yield* B(n, r(e, "AGENTS.core.md"))) {
|
|
280
280
|
o = e;
|
|
281
281
|
break;
|
|
282
282
|
}
|
|
283
283
|
if (o === null) {
|
|
284
|
-
for (let e of
|
|
285
|
-
let a = yield*
|
|
284
|
+
for (let e of be) if (yield* B(n, r(e, "AGENTS.md"))) {
|
|
285
|
+
let a = yield* V(n, r(e, "AGENTS.md")), o = [];
|
|
286
286
|
for (let e of Se) o.push(yield* Re(n, r(i, e), a, t.force ?? !1));
|
|
287
287
|
return { files: o };
|
|
288
288
|
}
|
|
289
|
-
return yield* f.fail(xe(
|
|
289
|
+
return yield* f.fail(xe(be.map((e) => r(e, "AGENTS.core.md"))));
|
|
290
290
|
}
|
|
291
|
-
let s = yield*
|
|
291
|
+
let s = yield* V(n, r(o, "AGENTS.core.md")), l = yield* V(n, r(o, "agent-docs", "_manifest.json")), u = l ? JSON.parse(l) : {
|
|
292
292
|
modules: [],
|
|
293
293
|
plugins: []
|
|
294
|
-
}, d = (t.preferPointer ?? !1) || (yield*
|
|
295
|
-
if ((yield* f.forEach(h, (e) =>
|
|
294
|
+
}, d = (t.preferPointer ?? !1) || (yield* B(n, r(i, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), p = d ? "node_modules/@voltro/cli/templates/" : "", m = t.force ?? !1, h = Se.map((e) => r(i, e));
|
|
295
|
+
if ((yield* f.forEach(h, (e) => V(n, e).pipe(f.map((e) => e.slice(0, we))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: h.map((e) => ({
|
|
296
296
|
path: e,
|
|
297
297
|
action: "protected"
|
|
298
298
|
})) };
|
|
@@ -311,7 +311,7 @@ boundary, naming, anti-patterns) before editing.
|
|
|
311
311
|
let t = w.get(a(e));
|
|
312
312
|
return t ? Pe(t, u, p) : "";
|
|
313
313
|
}, E = (e, t) => f.forEach(Se, (i) => Re(n, r(e, i), t, m));
|
|
314
|
-
for (let e of g) C.push(...yield* E(e, Fe.api(p, v.get(e) ?? null, T(e)))), (yield*
|
|
314
|
+
for (let e of g) C.push(...yield* E(e, Fe.api(p, v.get(e) ?? null, T(e)))), (yield* B(n, r(e, "database"))) && C.push(...yield* E(r(e, "database"), Fe.database(p)));
|
|
315
315
|
for (let e of _) C.push(...yield* E(e, Fe.web(p, T(e))));
|
|
316
316
|
for (let e of Ie) C.push(yield* Re(n, r(i, ".claude", "skills", e.name, "SKILL.md"), Le(e, p), m));
|
|
317
317
|
return { files: C };
|
|
@@ -360,8 +360,75 @@ boundary, naming, anti-patterns) before editing.
|
|
|
360
360
|
} catch (t) {
|
|
361
361
|
throw We(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
|
|
362
362
|
}
|
|
363
|
-
}, Ke =
|
|
364
|
-
let
|
|
363
|
+
}, Ke = () => {
|
|
364
|
+
let e = /* @__PURE__ */ new Map();
|
|
365
|
+
return {
|
|
366
|
+
get(t) {
|
|
367
|
+
return e.get(t);
|
|
368
|
+
},
|
|
369
|
+
set(t, n) {
|
|
370
|
+
e.set(t, n);
|
|
371
|
+
},
|
|
372
|
+
invalidate(t) {
|
|
373
|
+
e.delete(t);
|
|
374
|
+
},
|
|
375
|
+
invalidateBy(t) {
|
|
376
|
+
let n = 0;
|
|
377
|
+
for (let r of e.keys()) t(r) && (e.delete(r), n++);
|
|
378
|
+
return n;
|
|
379
|
+
},
|
|
380
|
+
clear() {
|
|
381
|
+
e.clear();
|
|
382
|
+
},
|
|
383
|
+
size() {
|
|
384
|
+
return e.size;
|
|
385
|
+
},
|
|
386
|
+
snapshot() {
|
|
387
|
+
return Array.from(e.entries());
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
}, qe = (e) => {
|
|
391
|
+
if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
|
|
392
|
+
if (typeof e != "string") return null;
|
|
393
|
+
let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
|
|
394
|
+
if (!t) return null;
|
|
395
|
+
let n = parseInt(t[1], 10);
|
|
396
|
+
if (!Number.isFinite(n) || n <= 0) return null;
|
|
397
|
+
let r = t[2].toLowerCase();
|
|
398
|
+
return r === "s" || r.startsWith("second") ? n * 1e3 : r === "m" || r.startsWith("minute") ? n * 6e4 : r === "h" || r.startsWith("hour") ? n * 36e5 : r === "d" || r.startsWith("day") ? n * 864e5 : null;
|
|
399
|
+
}, Je = (e, t = {}) => {
|
|
400
|
+
let n = [e];
|
|
401
|
+
return t.tenant !== void 0 && t.tenant !== "" && n.push(`tenant=${t.tenant}`), t.locale !== void 0 && t.locale !== "" && n.push(`lang=${t.locale}`), n.join("|");
|
|
402
|
+
}, Ye = (e, t) => e.expiresAt > t, Xe = (e, t) => e.expiresAt <= t && e.servableUntil > t, Ze = [
|
|
403
|
+
"static",
|
|
404
|
+
"spa",
|
|
405
|
+
"ssr",
|
|
406
|
+
"isr"
|
|
407
|
+
], Qe = (e) => typeof e == "string" && Ze.includes(e), $e = Ze.map((e) => `'${e}'`).join(" | "), et = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${$e}.${t === "client" || t === "csr" || t === "browser" ? "\n A page that renders only in the browser is 'spa': it is skipped by the prerender and mounts on the client. If its route has a layout, that layout still renders server-side as an SSR shell." : t === "server" || t === "dynamic" ? "\n A page rendered per request is 'ssr'." : t === "ssg" || t === "prerender" ? "\n A page rendered once at build time is 'static' (the default)." : ""}`, tt = class extends Error {
|
|
408
|
+
page;
|
|
409
|
+
value;
|
|
410
|
+
name = "InvalidRenderModeError";
|
|
411
|
+
constructor(e, t) {
|
|
412
|
+
super(et(e, t)), this.page = e, this.value = t;
|
|
413
|
+
}
|
|
414
|
+
}, nt = (e, t = "<page>") => {
|
|
415
|
+
if (e.renderMode !== void 0 && e.renderMode !== null) {
|
|
416
|
+
if (!Qe(e.renderMode)) throw new tt(t, String(e.renderMode));
|
|
417
|
+
return e.renderMode;
|
|
418
|
+
}
|
|
419
|
+
return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
|
|
420
|
+
}, rt = (e, t = "<page>") => ({
|
|
421
|
+
renderMode: nt(e, t),
|
|
422
|
+
tenantAware: e.tenantAware === !0,
|
|
423
|
+
revalidateMs: qe(e.revalidate),
|
|
424
|
+
staleWhileRevalidateMs: qe(e.staleWhileRevalidate) ?? 0,
|
|
425
|
+
cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
|
|
426
|
+
interactive: e.interactive ?? "full",
|
|
427
|
+
hasLoader: typeof e.loader == "function",
|
|
428
|
+
hasMeta: e.meta != null,
|
|
429
|
+
hasGetStaticPaths: typeof e.getStaticPaths == "function"
|
|
430
|
+
}), it = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", at = (e, t) => t ? `${e} | undefined` : e, ot = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${at(t.tsType, t.optional)}`).join("\n"), st = async (e, t) => {
|
|
431
|
+
let n = ot(t, () => !0), i = `${it}
|
|
365
432
|
import '@voltro/env/server'
|
|
366
433
|
|
|
367
434
|
declare module '@voltro/env/server' {
|
|
@@ -371,8 +438,8 @@ ${n.length > 0 ? n : " // (no variables declared)"}
|
|
|
371
438
|
}
|
|
372
439
|
`;
|
|
373
440
|
await N(r(e, "env.generated.d.ts"), i, "utf8");
|
|
374
|
-
},
|
|
375
|
-
let n =
|
|
441
|
+
}, ct = async (e, t) => {
|
|
442
|
+
let n = ot(t, (e) => e === "public"), i = `${it}
|
|
376
443
|
import '@voltro/env/public'
|
|
377
444
|
|
|
378
445
|
declare module '@voltro/env/public' {
|
|
@@ -382,8 +449,8 @@ ${n.length > 0 ? n : " // (no public variables declared)"}
|
|
|
382
449
|
}
|
|
383
450
|
`, a = r(e, "src");
|
|
384
451
|
await M(a, { recursive: !0 }), await N(r(a, "voltro-env.d.ts"), i, "utf8");
|
|
385
|
-
},
|
|
386
|
-
let n = `${
|
|
452
|
+
}, lt = async (e, t) => {
|
|
453
|
+
let n = `${it}
|
|
387
454
|
import { __installPublicEnv } from '@voltro/env/public'
|
|
388
455
|
|
|
389
456
|
export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
@@ -392,13 +459,13 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
|
392
459
|
__installPublicEnv(publicEnvValues)
|
|
393
460
|
`;
|
|
394
461
|
await M(e, { recursive: !0 }), await N(r(e, "env.public.ts"), n, "utf8");
|
|
395
|
-
},
|
|
396
|
-
let t =
|
|
462
|
+
}, ut = async (e) => {
|
|
463
|
+
let t = oe(e.rawEnv) ? e.rawEnv : void 0, n = await ce({
|
|
397
464
|
contract: t,
|
|
398
465
|
resolveSecret: j
|
|
399
|
-
}), r = [...n.errors, ...
|
|
400
|
-
if (r.length > 0) throw Error(
|
|
401
|
-
|
|
466
|
+
}), r = [...n.errors, ...ie(t, e.appType)];
|
|
467
|
+
if (r.length > 0) throw Error(F(r));
|
|
468
|
+
ae(n.values), e.appType === "web" && le(n.publicValues);
|
|
402
469
|
let i = t ? Object.keys(t.vars).length : 0;
|
|
403
470
|
if (i > 0) {
|
|
404
471
|
let r = Object.keys(n.publicValues).length;
|
|
@@ -410,57 +477,57 @@ __installPublicEnv(publicEnvValues)
|
|
|
410
477
|
n.length > 0 && e.log.warn(`env: ${n.length} secret var(s) declared on a web app — secrets are reachable only from server-side render code and are NEVER bundled. Prefer declaring secrets on the api.`, { keys: n });
|
|
411
478
|
}
|
|
412
479
|
}
|
|
413
|
-
return e.generateTypes && t && (e.appType === "api" ? await
|
|
480
|
+
return e.generateTypes && t && (e.appType === "api" ? await st(e.root, t) : await ct(e.root, t)), {
|
|
414
481
|
resolved: n,
|
|
415
482
|
contract: t
|
|
416
483
|
};
|
|
417
|
-
},
|
|
484
|
+
}, dt = g({ scope: "vite" }), ft = /\x1b\[[0-9;]*m/g, pt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, mt = (e) => e.replace(ft, "").replace(pt, "").trim(), ht = /proxy error/i, gt = [
|
|
418
485
|
"ECONNREFUSED",
|
|
419
486
|
"ECONNRESET",
|
|
420
487
|
"ECONNABORTED",
|
|
421
488
|
"EPIPE",
|
|
422
489
|
"ETIMEDOUT"
|
|
423
|
-
],
|
|
490
|
+
], _t = (e, t = 0) => {
|
|
424
491
|
if (e == null || t > 5) return !1;
|
|
425
492
|
let n = e;
|
|
426
|
-
return typeof n.code == "string" &&
|
|
427
|
-
},
|
|
493
|
+
return typeof n.code == "string" && gt.includes(n.code) || typeof n.message == "string" && gt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => _t(e, t + 1)) ? !0 : _t(n.cause, t + 1);
|
|
494
|
+
}, vt = 4e3, yt = () => {
|
|
428
495
|
let e = /* @__PURE__ */ new Set(), t = 0, n = {
|
|
429
496
|
hasWarned: !1,
|
|
430
497
|
info: (e) => {
|
|
431
|
-
let t =
|
|
432
|
-
t.length !== 0 &&
|
|
498
|
+
let t = mt(e);
|
|
499
|
+
t.length !== 0 && dt.info(t);
|
|
433
500
|
},
|
|
434
501
|
warn: (e) => {
|
|
435
502
|
n.hasWarned = !0;
|
|
436
|
-
let t =
|
|
437
|
-
t.length !== 0 &&
|
|
503
|
+
let t = mt(e);
|
|
504
|
+
t.length !== 0 && dt.warn(t);
|
|
438
505
|
},
|
|
439
506
|
warnOnce: (t) => {
|
|
440
|
-
let r =
|
|
441
|
-
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 &&
|
|
507
|
+
let r = mt(t);
|
|
508
|
+
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && dt.warn(r));
|
|
442
509
|
},
|
|
443
510
|
error: (e, n) => {
|
|
444
|
-
let r =
|
|
511
|
+
let r = mt(e), i = n?.error;
|
|
445
512
|
if (r.length !== 0) {
|
|
446
|
-
if (
|
|
513
|
+
if (ht.test(r) && _t(i)) {
|
|
447
514
|
let e = Date.now();
|
|
448
|
-
e - t >
|
|
515
|
+
e - t > vt && (t = e, dt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
|
|
449
516
|
return;
|
|
450
517
|
}
|
|
451
|
-
|
|
518
|
+
dt.error(r, {}, i);
|
|
452
519
|
}
|
|
453
520
|
},
|
|
454
521
|
clearScreen: () => {},
|
|
455
522
|
hasErrorLogged: (e) => !1
|
|
456
523
|
};
|
|
457
524
|
return n;
|
|
458
|
-
},
|
|
525
|
+
}, bt = (e = process.env) => {
|
|
459
526
|
let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
|
|
460
527
|
if (t === void 0 || t.trim() === "") return 4;
|
|
461
528
|
let n = Number(t);
|
|
462
529
|
return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
|
|
463
|
-
},
|
|
530
|
+
}, xt = (e) => {
|
|
464
531
|
let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
|
|
465
532
|
let e = r.shift();
|
|
466
533
|
e ? e() : n--;
|
|
@@ -478,8 +545,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
478
545
|
return n;
|
|
479
546
|
}
|
|
480
547
|
};
|
|
481
|
-
},
|
|
482
|
-
let t =
|
|
548
|
+
}, St = (e) => {
|
|
549
|
+
let t = xt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
|
|
483
550
|
return {
|
|
484
551
|
load: (i, a) => {
|
|
485
552
|
if (r.has(i)) return a();
|
|
@@ -504,7 +571,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
504
571
|
return r.size;
|
|
505
572
|
}
|
|
506
573
|
};
|
|
507
|
-
},
|
|
574
|
+
}, Ct = (e) => {
|
|
508
575
|
let t = [];
|
|
509
576
|
for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
|
|
510
577
|
name: n.slice(5, -2),
|
|
@@ -520,7 +587,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
520
587
|
optional: !1
|
|
521
588
|
});
|
|
522
589
|
return t;
|
|
523
|
-
},
|
|
590
|
+
}, wt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Tt = async (e) => {
|
|
524
591
|
let n = a(e);
|
|
525
592
|
for (let e = 0; e < 4; e++) {
|
|
526
593
|
let e = r(n, "project.json");
|
|
@@ -538,8 +605,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
538
605
|
n = i;
|
|
539
606
|
}
|
|
540
607
|
return null;
|
|
541
|
-
},
|
|
542
|
-
let n = await
|
|
608
|
+
}, Et = async (t) => {
|
|
609
|
+
let n = await Tt(t);
|
|
543
610
|
if (!n) return [];
|
|
544
611
|
let { projectDir: i, manifest: a } = n, o = e(t), s = a.apps ?? {}, c = [];
|
|
545
612
|
for (let [e, t] of Object.entries(s)) {
|
|
@@ -548,23 +615,23 @@ __installPublicEnv(publicEnvValues)
|
|
|
548
615
|
if (!y(n)) continue;
|
|
549
616
|
let a;
|
|
550
617
|
try {
|
|
551
|
-
let { pages: e } = await
|
|
618
|
+
let { pages: e } = await gi(n);
|
|
552
619
|
a = e.map((e) => ({
|
|
553
620
|
pattern: e.pattern,
|
|
554
|
-
params:
|
|
621
|
+
params: Ct(e.pattern)
|
|
555
622
|
}));
|
|
556
623
|
} catch {
|
|
557
624
|
continue;
|
|
558
625
|
}
|
|
559
626
|
c.push({
|
|
560
|
-
key:
|
|
627
|
+
key: wt(e),
|
|
561
628
|
origin: `http://localhost:${t.port}`,
|
|
562
629
|
...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
|
|
563
630
|
routes: a
|
|
564
631
|
});
|
|
565
632
|
}
|
|
566
633
|
return c;
|
|
567
|
-
},
|
|
634
|
+
}, Dt = (e) => {
|
|
568
635
|
if (e.params.length === 0) return `'${e.pattern}'`;
|
|
569
636
|
let t = e.pattern;
|
|
570
637
|
for (let n of e.params) {
|
|
@@ -572,21 +639,21 @@ __installPublicEnv(publicEnvValues)
|
|
|
572
639
|
t = t.replace(e, r);
|
|
573
640
|
}
|
|
574
641
|
return "`" + t + "`";
|
|
575
|
-
},
|
|
642
|
+
}, Ot = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
|
|
576
643
|
let t = "string";
|
|
577
644
|
return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
|
|
578
|
-
}).join("; ")} }`,
|
|
579
|
-
let r =
|
|
645
|
+
}).join("; ")} }`, kt = (e, t, n) => {
|
|
646
|
+
let r = Ot(e), i = Dt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
|
|
580
647
|
return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
|
|
581
|
-
},
|
|
648
|
+
}, At = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${kt(e, !1)},`).join("\n")}\n}`, jt = (e, t) => {
|
|
582
649
|
if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
|
|
583
|
-
let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${
|
|
650
|
+
let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${kt(e, !0, i)},`);
|
|
584
651
|
return ` ${e.key}: {\n${a.join("\n")}\n },`;
|
|
585
|
-
},
|
|
652
|
+
}, Mt = async (e) => {
|
|
586
653
|
let n = e.pages.map((e) => ({
|
|
587
654
|
pattern: e.pattern,
|
|
588
|
-
params:
|
|
589
|
-
})), i = await
|
|
655
|
+
params: Ct(e.pattern)
|
|
656
|
+
})), i = await Et(e.appRoot), a = [
|
|
590
657
|
"// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
|
|
591
658
|
"// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
|
|
592
659
|
"// Type-safe route builders consumed by <Link to={...}>.",
|
|
@@ -595,7 +662,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
595
662
|
"",
|
|
596
663
|
"type EmptyParams = Record<string, never>",
|
|
597
664
|
""
|
|
598
|
-
].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${
|
|
665
|
+
].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${At(n)} as const\n`}\n${i.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${i.map((e) => jt(e, o)).join("\n")}\n} as const\n`}`, c = r(e.appRoot, ".framework", "routes.generated.ts");
|
|
599
666
|
await S.mkdir(t(c), { recursive: !0 });
|
|
600
667
|
let l = null;
|
|
601
668
|
try {
|
|
@@ -608,16 +675,16 @@ __installPublicEnv(publicEnvValues)
|
|
|
608
675
|
path: c,
|
|
609
676
|
wrote: !0
|
|
610
677
|
});
|
|
611
|
-
},
|
|
612
|
-
let t =
|
|
678
|
+
}, Nt = (e) => {
|
|
679
|
+
let t = P(e.contract), n = (e.plugins ?? []).flatMap((e) => I(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : re, i = /* @__PURE__ */ new Set(), a = [];
|
|
613
680
|
for (let e of [
|
|
614
681
|
...t,
|
|
615
682
|
...n,
|
|
616
683
|
...r
|
|
617
684
|
]) i.has(e.key) || (i.add(e.key), a.push(e));
|
|
618
685
|
return a;
|
|
619
|
-
},
|
|
620
|
-
let r =
|
|
686
|
+
}, Pt = (e, t, n = (e) => process.env[e]) => {
|
|
687
|
+
let r = Nt(t).map((e) => {
|
|
621
688
|
let t = n(e.key) !== void 0;
|
|
622
689
|
return {
|
|
623
690
|
...e,
|
|
@@ -634,17 +701,17 @@ __installPublicEnv(publicEnvValues)
|
|
|
634
701
|
missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
|
|
635
702
|
}
|
|
636
703
|
};
|
|
637
|
-
},
|
|
704
|
+
}, Ft = (e, t) => se(Nt({
|
|
638
705
|
...e,
|
|
639
706
|
includeFramework: !1
|
|
640
707
|
}), {
|
|
641
708
|
includeFramework: e.includeFramework !== !1,
|
|
642
709
|
...t ? { header: t } : {}
|
|
643
|
-
}),
|
|
710
|
+
}), H = "/_voltro/inspect", U = () => process.env.VOLTRO_INSPECT === "off", W = (e) => {
|
|
644
711
|
let t = process.env.VOLTRO_INSPECT_TOKEN;
|
|
645
712
|
if (!t || t.length === 0) return { ok: !0 };
|
|
646
713
|
let n = e.authorization ?? e.Authorization;
|
|
647
|
-
return n ? n.startsWith("Bearer ") ?
|
|
714
|
+
return n ? n.startsWith("Bearer ") ? fe(n.slice(7).trim(), t) ? { ok: !0 } : {
|
|
648
715
|
ok: !1,
|
|
649
716
|
reason: "token mismatch"
|
|
650
717
|
} : {
|
|
@@ -654,7 +721,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
654
721
|
ok: !1,
|
|
655
722
|
reason: "missing Authorization header"
|
|
656
723
|
};
|
|
657
|
-
},
|
|
724
|
+
}, It = (e) => {
|
|
658
725
|
if (!Array.isArray(e) || e.length === 0) return;
|
|
659
726
|
let t = [];
|
|
660
727
|
for (let n of e) {
|
|
@@ -676,25 +743,25 @@ __installPublicEnv(publicEnvValues)
|
|
|
676
743
|
});
|
|
677
744
|
}
|
|
678
745
|
return t.length > 0 ? t : void 0;
|
|
679
|
-
},
|
|
746
|
+
}, G = (e, t, n = {}) => ({
|
|
680
747
|
status: e,
|
|
681
748
|
contentType: "application/json; charset=utf-8",
|
|
682
749
|
body: JSON.stringify(t),
|
|
683
750
|
headers: n
|
|
684
|
-
}),
|
|
751
|
+
}), K = (e) => !e || e.length === 0 ? {} : {
|
|
685
752
|
"access-control-allow-origin": e,
|
|
686
753
|
"access-control-allow-credentials": "true",
|
|
687
754
|
"access-control-allow-methods": "GET, POST, OPTIONS",
|
|
688
755
|
"access-control-allow-headers": "authorization, content-type, accept",
|
|
689
756
|
"access-control-expose-headers": "content-type, content-length",
|
|
690
757
|
vary: "Origin"
|
|
691
|
-
},
|
|
758
|
+
}, q = (e) => {
|
|
692
759
|
let t = e.indexOf("?");
|
|
693
760
|
return t === -1 ? e : e.slice(0, t);
|
|
694
|
-
},
|
|
761
|
+
}, Lt = (e) => {
|
|
695
762
|
let t = e.indexOf("?");
|
|
696
763
|
return t === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
|
|
697
|
-
},
|
|
764
|
+
}, Rt = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), zt = [
|
|
698
765
|
"text",
|
|
699
766
|
"textarea",
|
|
700
767
|
"number",
|
|
@@ -710,7 +777,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
710
777
|
"file",
|
|
711
778
|
"hidden",
|
|
712
779
|
"custom"
|
|
713
|
-
],
|
|
780
|
+
], Bt = (e, t, n = []) => ({
|
|
714
781
|
version: 2,
|
|
715
782
|
procedures: [...e].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({
|
|
716
783
|
tag: e.tag,
|
|
@@ -724,7 +791,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
724
791
|
...e.exposeAsTool === void 0 ? {} : { exposeAsTool: e.exposeAsTool }
|
|
725
792
|
})),
|
|
726
793
|
workflows: [...t].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({ name: e.tag })),
|
|
727
|
-
widgets:
|
|
794
|
+
widgets: zt,
|
|
728
795
|
tables: [...n].filter((e) => !e.isFrameworkTable).sort((e, t) => e.name.localeCompare(t.name)).map((e) => ({
|
|
729
796
|
name: e.name,
|
|
730
797
|
reactive: e.isReactive,
|
|
@@ -737,58 +804,58 @@ __installPublicEnv(publicEnvValues)
|
|
|
737
804
|
...e.oneOf === void 0 ? {} : { enum: e.oneOf }
|
|
738
805
|
}))
|
|
739
806
|
}))
|
|
740
|
-
}),
|
|
741
|
-
let i =
|
|
742
|
-
if (!
|
|
743
|
-
let a =
|
|
807
|
+
}), Vt = (e, t, n = {}, r = {}) => {
|
|
808
|
+
let i = q(e);
|
|
809
|
+
if (!Rt(i)) return null;
|
|
810
|
+
let a = K(n.origin ?? n.Origin);
|
|
744
811
|
if ((r.method ?? "GET").toUpperCase() === "OPTIONS") return {
|
|
745
812
|
status: 204,
|
|
746
813
|
contentType: "text/plain",
|
|
747
814
|
body: "",
|
|
748
815
|
headers: a
|
|
749
816
|
};
|
|
750
|
-
if (
|
|
751
|
-
let o = (r.authResolver ??
|
|
752
|
-
if (!o.ok) return
|
|
817
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
|
|
818
|
+
let o = (r.authResolver ?? W)(n);
|
|
819
|
+
if (!o.ok) return G(401, {
|
|
753
820
|
error: "unauthorized",
|
|
754
821
|
reason: o.reason
|
|
755
822
|
}, a);
|
|
756
|
-
if (i === "/_voltro/inspect" || i === "/_voltro/inspect/" || i === "/_voltro/inspect/app") return
|
|
823
|
+
if (i === "/_voltro/inspect" || i === "/_voltro/inspect/" || i === "/_voltro/inspect/app") return G(200, {
|
|
757
824
|
kind: t.kind,
|
|
758
825
|
...t.meta
|
|
759
826
|
}, a);
|
|
760
|
-
if (i === "/_voltro/inspect/routes") return t.kind === "web" ?
|
|
827
|
+
if (i === "/_voltro/inspect/routes") return t.kind === "web" ? G(200, {
|
|
761
828
|
pages: t.routes,
|
|
762
829
|
dirs: t.dirs
|
|
763
|
-
}, a) :
|
|
764
|
-
if (i === "/_voltro/inspect/cache") return t.kind === "web" ?
|
|
765
|
-
if (i === "/_voltro/inspect/rpc") return t.kind === "api" ?
|
|
830
|
+
}, a) : G(404, { error: "routes endpoint is web-only" }, a);
|
|
831
|
+
if (i === "/_voltro/inspect/cache") return t.kind === "web" ? G(200, t.cache(), a) : G(404, { error: "cache endpoint is web-only" }, a);
|
|
832
|
+
if (i === "/_voltro/inspect/rpc") return t.kind === "api" ? G(200, {
|
|
766
833
|
procedures: t.rpc,
|
|
767
834
|
workflows: t.workflows
|
|
768
|
-
}, a) :
|
|
835
|
+
}, a) : G(404, { error: "rpc endpoint is api-only" }, a);
|
|
769
836
|
if (i === "/_voltro/inspect/manifest") {
|
|
770
|
-
if (t.kind !== "api") return
|
|
837
|
+
if (t.kind !== "api") return G(404, { error: "manifest endpoint is api-only" }, a);
|
|
771
838
|
let e = t.inspectTables?.().tables ?? [];
|
|
772
|
-
return
|
|
839
|
+
return G(200, Bt(t.rpc, t.workflows, e), a);
|
|
773
840
|
}
|
|
774
|
-
return i === "/_voltro/inspect/metrics" ? t.metrics === void 0 ?
|
|
841
|
+
return i === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? G(200, [], a) : G(200, t.metrics(), a) : i === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? G(200, {
|
|
775
842
|
subscriptions: [],
|
|
776
843
|
matcherStats: [],
|
|
777
844
|
capturedAt: Date.now()
|
|
778
|
-
}, a) :
|
|
845
|
+
}, a) : G(200, t.subscriptions(), a) : G(404, { error: "subscriptions endpoint is api-only" }, a) : i === "/_voltro/inspect/data-cache" ? t.kind === "api" ? t.dataCache === void 0 ? G(200, {
|
|
779
846
|
backend: "memory",
|
|
780
847
|
engine: "memory",
|
|
781
848
|
driver: "resp",
|
|
782
849
|
hits: 0,
|
|
783
850
|
misses: 0,
|
|
784
851
|
hitRate: 0
|
|
785
|
-
}, a) :
|
|
852
|
+
}, a) : G(200, t.dataCache(), a) : G(404, { error: "data-cache endpoint is api-only" }, a) : i === "/_voltro/inspect/database" ? t.kind === "api" ? t.database === void 0 ? G(200, {
|
|
786
853
|
migrations: [],
|
|
787
854
|
seeds: []
|
|
788
|
-
}, a) :
|
|
855
|
+
}, a) : G(200, t.database(), a) : G(404, { error: "database endpoint is api-only" }, a) : i === "/_voltro/inspect/plugins" ? t.kind === "api" ? t.plugins === void 0 ? G(200, {
|
|
789
856
|
plugins: [],
|
|
790
857
|
capturedAt: Date.now()
|
|
791
|
-
}, a) :
|
|
858
|
+
}, a) : G(200, t.plugins(), a) : G(404, { error: "plugins endpoint is api-only" }, a) : i === "/_voltro/inspect/env" ? t.env === void 0 ? G(200, {
|
|
792
859
|
app: t.meta.name ?? "app",
|
|
793
860
|
entries: [],
|
|
794
861
|
summary: {
|
|
@@ -796,34 +863,34 @@ __installPublicEnv(publicEnvValues)
|
|
|
796
863
|
set: 0,
|
|
797
864
|
missingRequired: 0
|
|
798
865
|
}
|
|
799
|
-
}, a) :
|
|
866
|
+
}, a) : G(200, t.env(), a) : i === "/_voltro/inspect/data/tables" ? t.kind === "api" ? t.inspectTables === void 0 ? G(200, { tables: [] }, a) : G(200, t.inspectTables(), a) : G(404, { error: "data viewer is api-only" }, a) : i === "/_voltro/inspect/invoke" ? G(404, { error: "invoke not enabled here — use POST handler" }, a) : G(404, {
|
|
800
867
|
error: "unknown inspect endpoint",
|
|
801
868
|
path: i
|
|
802
869
|
}, a);
|
|
803
|
-
},
|
|
804
|
-
let i =
|
|
805
|
-
if (
|
|
806
|
-
if ((r.method ?? "POST").toUpperCase() !== "POST") return
|
|
870
|
+
}, Ht = async (e, t, n, r = {}) => {
|
|
871
|
+
let i = K(t.origin ?? t.Origin);
|
|
872
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
873
|
+
if ((r.method ?? "POST").toUpperCase() !== "POST") return G(405, {
|
|
807
874
|
error: "method not allowed",
|
|
808
875
|
expected: "POST"
|
|
809
876
|
}, i);
|
|
810
|
-
let a = (r.authResolver ??
|
|
811
|
-
if (!a.ok) return
|
|
877
|
+
let a = (r.authResolver ?? W)(t);
|
|
878
|
+
if (!a.ok) return G(401, {
|
|
812
879
|
error: "unauthorized",
|
|
813
880
|
reason: a.reason
|
|
814
881
|
}, i);
|
|
815
|
-
if (e.kind !== "api") return
|
|
816
|
-
if (!e.invokers || e.invokers.size === 0) return
|
|
882
|
+
if (e.kind !== "api") return G(404, { error: "invoke endpoint is api-only" }, i);
|
|
883
|
+
if (!e.invokers || e.invokers.size === 0) return G(404, { error: "invoke not configured" }, i);
|
|
817
884
|
let o;
|
|
818
885
|
try {
|
|
819
886
|
o = JSON.parse(n || "{}");
|
|
820
887
|
} catch {
|
|
821
|
-
return
|
|
888
|
+
return G(400, { error: "body must be JSON" }, i);
|
|
822
889
|
}
|
|
823
890
|
let s = o;
|
|
824
|
-
if (typeof s.tag != "string") return
|
|
891
|
+
if (typeof s.tag != "string") return G(400, { error: "body.tag must be a string" }, i);
|
|
825
892
|
let c = e.invokers.get(s.tag);
|
|
826
|
-
if (!c) return
|
|
893
|
+
if (!c) return G(404, {
|
|
827
894
|
error: "unknown tag",
|
|
828
895
|
tag: s.tag
|
|
829
896
|
}, i);
|
|
@@ -833,167 +900,167 @@ __installPublicEnv(publicEnvValues)
|
|
|
833
900
|
let n = e.toLowerCase();
|
|
834
901
|
n !== "cookie" && (u[n] = t);
|
|
835
902
|
}
|
|
836
|
-
return
|
|
837
|
-
},
|
|
838
|
-
let a =
|
|
839
|
-
if (!
|
|
840
|
-
let o =
|
|
903
|
+
return G(200, await c(s.input, u), i);
|
|
904
|
+
}, Ut = async (e, t, n, r, i = {}) => {
|
|
905
|
+
let a = q(e);
|
|
906
|
+
if (!Rt(a) || !a.startsWith("/_voltro/inspect/webhooks/")) return null;
|
|
907
|
+
let o = K(n.origin ?? n.Origin);
|
|
841
908
|
if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
|
|
842
|
-
if (
|
|
843
|
-
let s = (i.authResolver ??
|
|
844
|
-
if (!s.ok) return
|
|
909
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
|
|
910
|
+
let s = (i.authResolver ?? W)(n);
|
|
911
|
+
if (!s.ok) return G(401, {
|
|
845
912
|
error: "unauthorized",
|
|
846
913
|
reason: s.reason
|
|
847
914
|
}, o);
|
|
848
|
-
if (t.kind !== "api") return
|
|
849
|
-
if (!t.webhookActions) return
|
|
915
|
+
if (t.kind !== "api") return G(404, { error: "webhook actions are api-only" }, o);
|
|
916
|
+
if (!t.webhookActions) return G(404, { error: "webhook actions not configured — is @voltro/plugin-webhooks active?" }, o);
|
|
850
917
|
let c;
|
|
851
918
|
try {
|
|
852
919
|
c = JSON.parse(r || "{}");
|
|
853
920
|
} catch {
|
|
854
|
-
return
|
|
921
|
+
return G(400, { error: "body must be JSON" }, o);
|
|
855
922
|
}
|
|
856
|
-
let l = a.slice(`${
|
|
923
|
+
let l = a.slice(`${H}/webhooks/`.length);
|
|
857
924
|
try {
|
|
858
925
|
switch (l) {
|
|
859
926
|
case "subscribe": {
|
|
860
927
|
let e = c;
|
|
861
|
-
return typeof e.event != "string" || e.event.length === 0 ?
|
|
928
|
+
return typeof e.event != "string" || e.event.length === 0 ? G(400, { error: "event required" }, o) : typeof e.url != "string" || e.url.length === 0 ? G(400, { error: "url required" }, o) : G(200, await t.webhookActions.subscribe(e), o);
|
|
862
929
|
}
|
|
863
930
|
case "pause": {
|
|
864
931
|
let e = c.targetId;
|
|
865
|
-
return typeof e != "string" || e.length === 0 ?
|
|
932
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.pause(e), G(200, { ok: !0 }, o));
|
|
866
933
|
}
|
|
867
934
|
case "resume": {
|
|
868
935
|
let e = c.targetId;
|
|
869
|
-
return typeof e != "string" || e.length === 0 ?
|
|
936
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.resume(e), G(200, { ok: !0 }, o));
|
|
870
937
|
}
|
|
871
938
|
case "delete": {
|
|
872
939
|
let e = c.targetId;
|
|
873
|
-
return typeof e != "string" || e.length === 0 ?
|
|
940
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.delete(e), G(200, { ok: !0 }, o));
|
|
874
941
|
}
|
|
875
942
|
case "rotateSecret": {
|
|
876
943
|
let e = c.targetId;
|
|
877
|
-
return typeof e != "string" || e.length === 0 ?
|
|
944
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : G(200, await t.webhookActions.rotateSecret(e), o);
|
|
878
945
|
}
|
|
879
946
|
case "replay": {
|
|
880
947
|
let e = c.deliveryId;
|
|
881
|
-
return typeof e != "string" || e.length === 0 ?
|
|
948
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "deliveryId required" }, o) : (await t.webhookActions.replay(e), G(200, { ok: !0 }, o));
|
|
882
949
|
}
|
|
883
950
|
case "repinVersion": {
|
|
884
951
|
let e = c.targetId, n = c.version;
|
|
885
|
-
return typeof e != "string" || e.length === 0 ?
|
|
952
|
+
return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : typeof n != "number" || !Number.isInteger(n) || n < 1 ? G(400, { error: "version must be a positive integer" }, o) : (await t.webhookActions.updateTargetPayloadVersion(e, n), G(200, { ok: !0 }, o));
|
|
886
953
|
}
|
|
887
|
-
default: return
|
|
954
|
+
default: return G(404, { error: `unknown webhook action: ${l}` }, o);
|
|
888
955
|
}
|
|
889
956
|
} catch (e) {
|
|
890
|
-
return
|
|
957
|
+
return G(500, {
|
|
891
958
|
error: "webhook action failed",
|
|
892
959
|
message: e?.message ?? String(e)
|
|
893
960
|
}, o);
|
|
894
961
|
}
|
|
895
|
-
},
|
|
896
|
-
let a =
|
|
897
|
-
if (!
|
|
898
|
-
let o =
|
|
962
|
+
}, Wt = async (e, t, n, r, i = {}) => {
|
|
963
|
+
let a = q(e);
|
|
964
|
+
if (!Rt(a)) return null;
|
|
965
|
+
let o = K(n.origin ?? n.Origin);
|
|
899
966
|
if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
|
|
900
|
-
if (
|
|
901
|
-
let s = (i.authResolver ??
|
|
902
|
-
if (!s.ok) return
|
|
967
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
|
|
968
|
+
let s = (i.authResolver ?? W)(n);
|
|
969
|
+
if (!s.ok) return G(401, {
|
|
903
970
|
error: "unauthorized",
|
|
904
971
|
reason: s.reason
|
|
905
972
|
}, o);
|
|
906
|
-
if (t.kind !== "api") return
|
|
907
|
-
let c = `${
|
|
973
|
+
if (t.kind !== "api") return G(404, { error: "framework-action endpoints are api-only" }, o);
|
|
974
|
+
let c = `${H}/seeds/run`, l = `${H}/migrations/rollback`, u = `${H}/migrations/squash`, d = `${H}/migrations/restore-snapshot`;
|
|
908
975
|
if (a !== c && a !== l && a !== u && a !== d && a !== "/_voltro/inspect/migrations/compare-env") return null;
|
|
909
976
|
let f;
|
|
910
977
|
try {
|
|
911
978
|
f = JSON.parse(r || "{}");
|
|
912
979
|
} catch {
|
|
913
|
-
return
|
|
980
|
+
return G(400, { error: "body must be JSON" }, o);
|
|
914
981
|
}
|
|
915
982
|
try {
|
|
916
|
-
if (a === c) return typeof f.id != "string" || f.id.length === 0 ?
|
|
917
|
-
if (a === l) return typeof f.id != "string" || f.id.length === 0 ?
|
|
983
|
+
if (a === c) return typeof f.id != "string" || f.id.length === 0 ? G(400, { error: "body.id must be a non-empty string" }, o) : t.runSeed ? G(200, await t.runSeed(f.id), o) : G(404, { error: "runSeed not configured" }, o);
|
|
984
|
+
if (a === l) return typeof f.id != "string" || f.id.length === 0 ? G(400, { error: "body.id must be a non-empty string" }, o) : t.rollbackMigration ? G(200, await t.rollbackMigration(f.id), o) : G(404, { error: "rollbackMigration not configured" }, o);
|
|
918
985
|
if (a === u) {
|
|
919
|
-
if (typeof f.before != "string" || f.before.length === 0) return
|
|
920
|
-
if (!t.squashMigrationHistory) return
|
|
986
|
+
if (typeof f.before != "string" || f.before.length === 0) return G(400, { error: "body.before must be a non-empty ISO date string" }, o);
|
|
987
|
+
if (!t.squashMigrationHistory) return G(404, { error: "squashMigrationHistory not configured" }, o);
|
|
921
988
|
let e = typeof f.note == "string" ? f.note : void 0;
|
|
922
|
-
return
|
|
989
|
+
return G(200, await t.squashMigrationHistory({
|
|
923
990
|
before: f.before,
|
|
924
991
|
note: e
|
|
925
992
|
}), o);
|
|
926
993
|
}
|
|
927
|
-
return a === d ? typeof f.planId != "string" || f.planId.length === 0 ?
|
|
994
|
+
return a === d ? typeof f.planId != "string" || f.planId.length === 0 ? G(400, { error: "body.planId must be a non-empty string" }, o) : t.restoreSnapshot ? G(200, await t.restoreSnapshot({ planId: f.planId }), o) : G(404, { error: "restoreSnapshot not configured" }, o) : typeof f.url != "string" || f.url.length === 0 ? G(400, { error: "body.url must be a non-empty URL string" }, o) : t.compareCrossEnv ? (await t.compareCrossEnv({
|
|
928
995
|
url: f.url,
|
|
929
996
|
label: typeof f.label == "string" ? f.label : void 0,
|
|
930
997
|
token: typeof f.token == "string" ? f.token : void 0
|
|
931
|
-
}),
|
|
998
|
+
}), G(200, { ok: !0 }, o)) : G(404, { error: "compareCrossEnv not configured" }, o);
|
|
932
999
|
} catch (e) {
|
|
933
|
-
return
|
|
1000
|
+
return G(500, {
|
|
934
1001
|
error: "framework action failed",
|
|
935
1002
|
message: e?.message ?? String(e)
|
|
936
1003
|
}, o);
|
|
937
1004
|
}
|
|
938
|
-
},
|
|
939
|
-
if (
|
|
940
|
-
let i =
|
|
941
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1005
|
+
}, Gt = async (e, t, n, r = {}) => {
|
|
1006
|
+
if (q(e) !== "/_voltro/inspect/data/rows") return null;
|
|
1007
|
+
let i = K(n.origin ?? n.Origin);
|
|
1008
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
942
1009
|
error: "method not allowed",
|
|
943
1010
|
expected: "GET"
|
|
944
1011
|
}, i);
|
|
945
|
-
if (
|
|
946
|
-
let a = (r.authResolver ??
|
|
947
|
-
if (!a.ok) return
|
|
1012
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1013
|
+
let a = (r.authResolver ?? W)(n);
|
|
1014
|
+
if (!a.ok) return G(401, {
|
|
948
1015
|
error: "unauthorized",
|
|
949
1016
|
reason: a.reason
|
|
950
1017
|
}, i);
|
|
951
|
-
if (t.kind !== "api") return
|
|
952
|
-
if (t.inspectRows === void 0) return
|
|
953
|
-
let o =
|
|
954
|
-
if (!s) return
|
|
955
|
-
let c =
|
|
1018
|
+
if (t.kind !== "api") return G(404, { error: "data viewer is api-only" }, i);
|
|
1019
|
+
if (t.inspectRows === void 0) return G(404, { error: "inspectRows not configured" }, i);
|
|
1020
|
+
let o = J(e), s = o.get("table");
|
|
1021
|
+
if (!s) return G(400, { error: "query.table is required" }, i);
|
|
1022
|
+
let c = Y(o.get("offset")) ?? 0, l = Y(o.get("limit")) ?? 50, u = {}, d = o.get("q");
|
|
956
1023
|
if (d) {
|
|
957
|
-
if (d.length > 8192) return
|
|
1024
|
+
if (d.length > 8192) return G(400, { error: "query.q too large" }, i);
|
|
958
1025
|
try {
|
|
959
1026
|
u = JSON.parse(Buffer.from(d, "base64url").toString("utf8"));
|
|
960
1027
|
} catch {
|
|
961
|
-
return
|
|
1028
|
+
return G(400, { error: "query.q is not valid base64url JSON" }, i);
|
|
962
1029
|
}
|
|
963
1030
|
}
|
|
964
1031
|
try {
|
|
965
|
-
return
|
|
1032
|
+
return G(200, await t.inspectRows({
|
|
966
1033
|
table: s,
|
|
967
1034
|
offset: c,
|
|
968
1035
|
limit: l,
|
|
969
1036
|
...u
|
|
970
1037
|
}), i);
|
|
971
1038
|
} catch (e) {
|
|
972
|
-
return e?.name === "InspectQueryError" ?
|
|
1039
|
+
return e?.name === "InspectQueryError" ? G(400, {
|
|
973
1040
|
error: "invalid query",
|
|
974
1041
|
message: e.message
|
|
975
|
-
}, i) :
|
|
1042
|
+
}, i) : G(500, {
|
|
976
1043
|
error: "data-rows query failed",
|
|
977
1044
|
message: e?.message ?? String(e)
|
|
978
1045
|
}, i);
|
|
979
1046
|
}
|
|
980
|
-
},
|
|
981
|
-
if (
|
|
982
|
-
let i =
|
|
983
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1047
|
+
}, Kt = async (e, t, n, r = {}) => {
|
|
1048
|
+
if (q(e) !== "/_voltro/inspect/provenance") return null;
|
|
1049
|
+
let i = K(n.origin ?? n.Origin);
|
|
1050
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
984
1051
|
error: "method not allowed",
|
|
985
1052
|
expected: "GET"
|
|
986
1053
|
}, i);
|
|
987
|
-
if (
|
|
988
|
-
let a = (r.authResolver ??
|
|
989
|
-
if (!a.ok) return
|
|
1054
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1055
|
+
let a = (r.authResolver ?? W)(n);
|
|
1056
|
+
if (!a.ok) return G(401, {
|
|
990
1057
|
error: "unauthorized",
|
|
991
1058
|
reason: a.reason
|
|
992
1059
|
}, i);
|
|
993
|
-
if (t.kind !== "api") return
|
|
994
|
-
if (t.inspectRows === void 0) return
|
|
995
|
-
let o =
|
|
996
|
-
if (!s || !c) return
|
|
1060
|
+
if (t.kind !== "api") return G(404, { error: "provenance is api-only" }, i);
|
|
1061
|
+
if (t.inspectRows === void 0) return G(404, { error: "inspectRows not configured" }, i);
|
|
1062
|
+
let o = J(e), s = o.get("table"), c = o.get("id"), l = o.get("column") ?? void 0;
|
|
1063
|
+
if (!s || !c) return G(400, { error: "query.table and query.id are required" }, i);
|
|
997
1064
|
try {
|
|
998
1065
|
let e = (await t.inspectRows({
|
|
999
1066
|
table: s,
|
|
@@ -1005,175 +1072,175 @@ __installPublicEnv(publicEnvValues)
|
|
|
1005
1072
|
value: c
|
|
1006
1073
|
}
|
|
1007
1074
|
})).rows[0];
|
|
1008
|
-
return
|
|
1075
|
+
return G(200, k(e, {
|
|
1009
1076
|
table: s,
|
|
1010
1077
|
id: c,
|
|
1011
1078
|
...l === void 0 ? {} : { column: l }
|
|
1012
1079
|
}), i);
|
|
1013
1080
|
} catch (e) {
|
|
1014
|
-
return e?.name === "InspectQueryError" ?
|
|
1081
|
+
return e?.name === "InspectQueryError" ? G(400, {
|
|
1015
1082
|
error: "invalid query",
|
|
1016
1083
|
message: e.message
|
|
1017
|
-
}, i) :
|
|
1084
|
+
}, i) : G(500, {
|
|
1018
1085
|
error: "provenance query failed",
|
|
1019
1086
|
message: e?.message ?? String(e)
|
|
1020
1087
|
}, i);
|
|
1021
1088
|
}
|
|
1022
|
-
},
|
|
1089
|
+
}, J = (e) => {
|
|
1023
1090
|
let t = e.indexOf("?");
|
|
1024
1091
|
return t < 0 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
|
|
1025
|
-
},
|
|
1092
|
+
}, Y = (e) => {
|
|
1026
1093
|
if (e === null || e === "") return;
|
|
1027
1094
|
let t = Number(e);
|
|
1028
1095
|
return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
|
|
1029
|
-
},
|
|
1030
|
-
if (
|
|
1031
|
-
let i =
|
|
1032
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1096
|
+
}, qt = async (e, t, n, r = {}) => {
|
|
1097
|
+
if (q(e) !== "/_voltro/inspect/workflows/runs") return null;
|
|
1098
|
+
let i = K(n.origin ?? n.Origin);
|
|
1099
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1033
1100
|
error: "method not allowed",
|
|
1034
1101
|
expected: "GET"
|
|
1035
1102
|
}, i);
|
|
1036
|
-
if (
|
|
1037
|
-
let a = (r.authResolver ??
|
|
1038
|
-
if (!a.ok) return
|
|
1103
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1104
|
+
let a = (r.authResolver ?? W)(n);
|
|
1105
|
+
if (!a.ok) return G(401, {
|
|
1039
1106
|
error: "unauthorized",
|
|
1040
1107
|
reason: a.reason
|
|
1041
1108
|
}, i);
|
|
1042
|
-
if (t.kind !== "api") return
|
|
1043
|
-
if (t.inspectWorkflowRuns === void 0) return
|
|
1109
|
+
if (t.kind !== "api") return G(404, { error: "workflows endpoint is api-only" }, i);
|
|
1110
|
+
if (t.inspectWorkflowRuns === void 0) return G(200, {
|
|
1044
1111
|
runs: [],
|
|
1045
1112
|
total: 0,
|
|
1046
1113
|
offset: 0,
|
|
1047
1114
|
limit: 50
|
|
1048
1115
|
}, i);
|
|
1049
|
-
let o =
|
|
1116
|
+
let o = J(e);
|
|
1050
1117
|
try {
|
|
1051
|
-
return
|
|
1118
|
+
return G(200, await t.inspectWorkflowRuns({
|
|
1052
1119
|
...o.get("tag") === null ? {} : { tag: o.get("tag") },
|
|
1053
1120
|
...o.get("status") === null ? {} : { status: o.get("status") },
|
|
1054
|
-
offset:
|
|
1055
|
-
limit:
|
|
1121
|
+
offset: Y(o.get("offset")) ?? 0,
|
|
1122
|
+
limit: Y(o.get("limit")) ?? 50
|
|
1056
1123
|
}), i);
|
|
1057
1124
|
} catch (e) {
|
|
1058
|
-
return
|
|
1125
|
+
return G(500, {
|
|
1059
1126
|
error: "workflow-runs query failed",
|
|
1060
1127
|
message: e?.message ?? String(e)
|
|
1061
1128
|
}, i);
|
|
1062
1129
|
}
|
|
1063
|
-
},
|
|
1064
|
-
let a =
|
|
1130
|
+
}, Jt = async (e, t, n, r, i = {}) => {
|
|
1131
|
+
let a = q(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
|
|
1065
1132
|
if (!a) return null;
|
|
1066
|
-
let o = decodeURIComponent(a[1] ?? ""), s =
|
|
1067
|
-
if ((i.method ?? "POST").toUpperCase() !== "POST") return
|
|
1133
|
+
let o = decodeURIComponent(a[1] ?? ""), s = K(n.origin ?? n.Origin);
|
|
1134
|
+
if ((i.method ?? "POST").toUpperCase() !== "POST") return G(405, {
|
|
1068
1135
|
error: "method not allowed",
|
|
1069
1136
|
expected: "POST"
|
|
1070
1137
|
}, s);
|
|
1071
|
-
if (
|
|
1072
|
-
let c = (i.authResolver ??
|
|
1073
|
-
if (!c.ok) return
|
|
1138
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
|
|
1139
|
+
let c = (i.authResolver ?? W)(n);
|
|
1140
|
+
if (!c.ok) return G(401, {
|
|
1074
1141
|
error: "unauthorized",
|
|
1075
1142
|
reason: c.reason
|
|
1076
1143
|
}, s);
|
|
1077
|
-
if (t.kind !== "api") return
|
|
1078
|
-
if (t.inspectStartWorkflow === void 0) return
|
|
1144
|
+
if (t.kind !== "api") return G(404, { error: "workflow start is api-only" }, s);
|
|
1145
|
+
if (t.inspectStartWorkflow === void 0) return G(404, { error: "inspectStartWorkflow not configured" }, s);
|
|
1079
1146
|
let l = {};
|
|
1080
1147
|
if (r.length > 0) try {
|
|
1081
1148
|
l = JSON.parse(r).payload ?? {};
|
|
1082
1149
|
} catch {
|
|
1083
|
-
return
|
|
1150
|
+
return G(400, { error: "start requires JSON body `{ payload?: unknown }`" }, s);
|
|
1084
1151
|
}
|
|
1085
1152
|
try {
|
|
1086
|
-
return
|
|
1153
|
+
return G(200, await t.inspectStartWorkflow({
|
|
1087
1154
|
name: o,
|
|
1088
1155
|
payload: l
|
|
1089
1156
|
}), s);
|
|
1090
1157
|
} catch (e) {
|
|
1091
|
-
return
|
|
1158
|
+
return G(500, {
|
|
1092
1159
|
error: "workflow start failed",
|
|
1093
1160
|
message: e?.message ?? String(e)
|
|
1094
1161
|
}, s);
|
|
1095
1162
|
}
|
|
1096
|
-
},
|
|
1097
|
-
let i =
|
|
1163
|
+
}, Yt = async (e, t, n, r = {}) => {
|
|
1164
|
+
let i = q(e);
|
|
1098
1165
|
if (!i.startsWith("/_voltro/inspect/schedules")) return null;
|
|
1099
|
-
let a =
|
|
1100
|
-
if (
|
|
1101
|
-
let o = (r.authResolver ??
|
|
1102
|
-
if (!o.ok) return
|
|
1166
|
+
let a = K(n.origin ?? n.Origin);
|
|
1167
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
|
|
1168
|
+
let o = (r.authResolver ?? W)(n);
|
|
1169
|
+
if (!o.ok) return G(401, {
|
|
1103
1170
|
error: "unauthorized",
|
|
1104
1171
|
reason: o.reason
|
|
1105
1172
|
}, a);
|
|
1106
|
-
if (t.kind !== "api") return
|
|
1173
|
+
if (t.kind !== "api") return G(404, { error: "schedules are api-only" }, a);
|
|
1107
1174
|
let s = (r.method ?? "GET").toUpperCase(), c = i.match(/^\/_voltro\/inspect\/schedules\/([^/]+)\/fire$/);
|
|
1108
1175
|
if (c) {
|
|
1109
|
-
if (s !== "POST") return
|
|
1176
|
+
if (s !== "POST") return G(405, {
|
|
1110
1177
|
error: "method not allowed",
|
|
1111
1178
|
expected: "POST"
|
|
1112
1179
|
}, a);
|
|
1113
|
-
if (!t.inspectFireSchedule) return
|
|
1114
|
-
let n = decodeURIComponent(c[1] ?? ""), r =
|
|
1180
|
+
if (!t.inspectFireSchedule) return G(404, { error: "inspectFireSchedule not configured" }, a);
|
|
1181
|
+
let n = decodeURIComponent(c[1] ?? ""), r = J(e).get("trigger") === "external" ? "external" : "manual";
|
|
1115
1182
|
try {
|
|
1116
|
-
return
|
|
1183
|
+
return G(200, await t.inspectFireSchedule({
|
|
1117
1184
|
name: n,
|
|
1118
1185
|
trigger: r
|
|
1119
1186
|
}), a);
|
|
1120
1187
|
} catch (e) {
|
|
1121
|
-
return
|
|
1188
|
+
return G(500, {
|
|
1122
1189
|
error: "fire failed",
|
|
1123
1190
|
message: e?.message ?? String(e)
|
|
1124
1191
|
}, a);
|
|
1125
1192
|
}
|
|
1126
1193
|
}
|
|
1127
1194
|
if (i === "/_voltro/inspect/schedules/runs") {
|
|
1128
|
-
if (s !== "GET") return
|
|
1195
|
+
if (s !== "GET") return G(405, {
|
|
1129
1196
|
error: "method not allowed",
|
|
1130
1197
|
expected: "GET"
|
|
1131
1198
|
}, a);
|
|
1132
|
-
if (!t.inspectScheduleRuns) return
|
|
1199
|
+
if (!t.inspectScheduleRuns) return G(200, {
|
|
1133
1200
|
runs: [],
|
|
1134
1201
|
total: 0,
|
|
1135
1202
|
offset: 0,
|
|
1136
1203
|
limit: 50
|
|
1137
1204
|
}, a);
|
|
1138
|
-
let n =
|
|
1205
|
+
let n = J(e);
|
|
1139
1206
|
try {
|
|
1140
|
-
return
|
|
1207
|
+
return G(200, await t.inspectScheduleRuns({
|
|
1141
1208
|
...n.get("name") === null ? {} : { name: n.get("name") },
|
|
1142
|
-
offset:
|
|
1143
|
-
limit:
|
|
1209
|
+
offset: Y(n.get("offset")) ?? 0,
|
|
1210
|
+
limit: Y(n.get("limit")) ?? 50
|
|
1144
1211
|
}), a);
|
|
1145
1212
|
} catch (e) {
|
|
1146
|
-
return
|
|
1213
|
+
return G(500, {
|
|
1147
1214
|
error: "schedule-runs query failed",
|
|
1148
1215
|
message: e?.message ?? String(e)
|
|
1149
1216
|
}, a);
|
|
1150
1217
|
}
|
|
1151
1218
|
}
|
|
1152
|
-
return i === "/_voltro/inspect/schedules" ? s === "GET" ? t.inspectSchedules ?
|
|
1219
|
+
return i === "/_voltro/inspect/schedules" ? s === "GET" ? t.inspectSchedules ? G(200, t.inspectSchedules(), a) : G(200, {
|
|
1153
1220
|
schedules: [],
|
|
1154
1221
|
coordination: "single"
|
|
1155
|
-
}, a) :
|
|
1222
|
+
}, a) : G(405, {
|
|
1156
1223
|
error: "method not allowed",
|
|
1157
1224
|
expected: "GET"
|
|
1158
|
-
}, a) :
|
|
1225
|
+
}, a) : G(404, {
|
|
1159
1226
|
error: "unknown schedules endpoint",
|
|
1160
1227
|
path: i
|
|
1161
1228
|
}, a);
|
|
1162
|
-
},
|
|
1163
|
-
if (
|
|
1164
|
-
let i =
|
|
1165
|
-
if (
|
|
1166
|
-
let a = (r.authResolver ??
|
|
1167
|
-
if (!a.ok) return
|
|
1229
|
+
}, Xt = async (e, t, n, r = {}) => {
|
|
1230
|
+
if (q(e) !== "/_voltro/inspect/cluster") return null;
|
|
1231
|
+
let i = K(n.origin ?? n.Origin);
|
|
1232
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1233
|
+
let a = (r.authResolver ?? W)(n);
|
|
1234
|
+
if (!a.ok) return G(401, {
|
|
1168
1235
|
error: "unauthorized",
|
|
1169
1236
|
reason: a.reason
|
|
1170
1237
|
}, i);
|
|
1171
|
-
if (t.kind !== "api") return
|
|
1172
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1238
|
+
if (t.kind !== "api") return G(404, { error: "cluster is api-only" }, i);
|
|
1239
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1173
1240
|
error: "method not allowed",
|
|
1174
1241
|
expected: "GET"
|
|
1175
1242
|
}, i);
|
|
1176
|
-
if (!t.cluster) return
|
|
1243
|
+
if (!t.cluster) return G(200, {
|
|
1177
1244
|
instance: {
|
|
1178
1245
|
replicaId: process.env.POD_NAME ?? process.env.HOSTNAME ?? `dev-${process.pid}`,
|
|
1179
1246
|
dialect: "memory",
|
|
@@ -1198,163 +1265,163 @@ __installPublicEnv(publicEnvValues)
|
|
|
1198
1265
|
capturedAt: Date.now()
|
|
1199
1266
|
}, i);
|
|
1200
1267
|
try {
|
|
1201
|
-
return
|
|
1268
|
+
return G(200, await t.cluster(), i);
|
|
1202
1269
|
} catch (e) {
|
|
1203
|
-
return
|
|
1270
|
+
return G(500, {
|
|
1204
1271
|
error: "cluster snapshot failed",
|
|
1205
1272
|
message: e?.message ?? String(e)
|
|
1206
1273
|
}, i);
|
|
1207
1274
|
}
|
|
1208
|
-
},
|
|
1209
|
-
let i =
|
|
1275
|
+
}, Zt = async (e, t, n, r = {}) => {
|
|
1276
|
+
let i = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
|
|
1210
1277
|
if (!i) return null;
|
|
1211
|
-
let a = decodeURIComponent(i[1] ?? ""), o =
|
|
1212
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1278
|
+
let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
|
|
1279
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1213
1280
|
error: "method not allowed",
|
|
1214
1281
|
expected: "GET"
|
|
1215
1282
|
}, o);
|
|
1216
|
-
if (
|
|
1217
|
-
let s = (r.authResolver ??
|
|
1218
|
-
if (!s.ok) return
|
|
1283
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
|
|
1284
|
+
let s = (r.authResolver ?? W)(n);
|
|
1285
|
+
if (!s.ok) return G(401, {
|
|
1219
1286
|
error: "unauthorized",
|
|
1220
1287
|
reason: s.reason
|
|
1221
1288
|
}, o);
|
|
1222
|
-
if (t.kind !== "api") return
|
|
1223
|
-
if (t.inspectWorkflowRunSteps === void 0) return
|
|
1289
|
+
if (t.kind !== "api") return G(404, { error: "workflow steps are api-only" }, o);
|
|
1290
|
+
if (t.inspectWorkflowRunSteps === void 0) return G(200, { steps: [] }, o);
|
|
1224
1291
|
try {
|
|
1225
|
-
return
|
|
1292
|
+
return G(200, await t.inspectWorkflowRunSteps({ runId: a }), o);
|
|
1226
1293
|
} catch (e) {
|
|
1227
|
-
return
|
|
1294
|
+
return G(500, {
|
|
1228
1295
|
error: "steps query failed",
|
|
1229
1296
|
message: e?.message ?? String(e)
|
|
1230
1297
|
}, o);
|
|
1231
1298
|
}
|
|
1232
|
-
},
|
|
1233
|
-
let i =
|
|
1299
|
+
}, Qt = async (e, t, n, r = {}) => {
|
|
1300
|
+
let i = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
|
|
1234
1301
|
if (!i) return null;
|
|
1235
|
-
let a = decodeURIComponent(i[1] ?? ""), o =
|
|
1236
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1302
|
+
let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
|
|
1303
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1237
1304
|
error: "method not allowed",
|
|
1238
1305
|
expected: "GET"
|
|
1239
1306
|
}, o);
|
|
1240
|
-
if (
|
|
1241
|
-
let s = (r.authResolver ??
|
|
1242
|
-
if (!s.ok) return
|
|
1307
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
|
|
1308
|
+
let s = (r.authResolver ?? W)(n);
|
|
1309
|
+
if (!s.ok) return G(401, {
|
|
1243
1310
|
error: "unauthorized",
|
|
1244
1311
|
reason: s.reason
|
|
1245
1312
|
}, o);
|
|
1246
|
-
if (t.kind !== "api") return
|
|
1247
|
-
if (t.inspectWorkflowRunEvents === void 0) return
|
|
1313
|
+
if (t.kind !== "api") return G(404, { error: "workflow events are api-only" }, o);
|
|
1314
|
+
if (t.inspectWorkflowRunEvents === void 0) return G(200, { events: [] }, o);
|
|
1248
1315
|
try {
|
|
1249
|
-
return
|
|
1316
|
+
return G(200, await t.inspectWorkflowRunEvents({ runId: a }), o);
|
|
1250
1317
|
} catch (e) {
|
|
1251
|
-
return
|
|
1318
|
+
return G(500, {
|
|
1252
1319
|
error: "events query failed",
|
|
1253
1320
|
message: e?.message ?? String(e)
|
|
1254
1321
|
}, o);
|
|
1255
1322
|
}
|
|
1256
|
-
},
|
|
1257
|
-
if (
|
|
1258
|
-
let i =
|
|
1259
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1323
|
+
}, $t = async (e, t, n, r = {}) => {
|
|
1324
|
+
if (q(t) !== "/_voltro/inspect/workflows/events") return null;
|
|
1325
|
+
let i = K(n.origin ?? n.Origin);
|
|
1326
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1260
1327
|
error: "method not allowed",
|
|
1261
1328
|
expected: "GET"
|
|
1262
1329
|
}, i);
|
|
1263
|
-
if (
|
|
1264
|
-
let a = (r.authResolver ??
|
|
1265
|
-
if (!a.ok) return
|
|
1330
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1331
|
+
let a = (r.authResolver ?? W)(n);
|
|
1332
|
+
if (!a.ok) return G(401, {
|
|
1266
1333
|
error: "unauthorized",
|
|
1267
1334
|
reason: a.reason
|
|
1268
1335
|
}, i);
|
|
1269
|
-
if (e.kind !== "api") return
|
|
1270
|
-
if (e.inspectWorkflowDomainEvents === void 0) return
|
|
1336
|
+
if (e.kind !== "api") return G(404, { error: "workflow domain events are api-only" }, i);
|
|
1337
|
+
if (e.inspectWorkflowDomainEvents === void 0) return G(200, {
|
|
1271
1338
|
events: [],
|
|
1272
1339
|
total: 0,
|
|
1273
1340
|
offset: 0,
|
|
1274
1341
|
limit: 100
|
|
1275
1342
|
}, i);
|
|
1276
|
-
let o =
|
|
1343
|
+
let o = Lt(t), s = o.get("name") ?? void 0, c = Number(o.get("offset") ?? "0"), l = Number(o.get("limit") ?? "100");
|
|
1277
1344
|
try {
|
|
1278
|
-
return
|
|
1345
|
+
return G(200, await e.inspectWorkflowDomainEvents({
|
|
1279
1346
|
...s !== void 0 && s !== "" ? { name: s } : {},
|
|
1280
1347
|
offset: Number.isFinite(c) ? c : 0,
|
|
1281
1348
|
limit: Number.isFinite(l) ? l : 100
|
|
1282
1349
|
}), i);
|
|
1283
1350
|
} catch (e) {
|
|
1284
|
-
return
|
|
1351
|
+
return G(500, {
|
|
1285
1352
|
error: "workflow domain events query failed",
|
|
1286
1353
|
message: e?.message ?? String(e)
|
|
1287
1354
|
}, i);
|
|
1288
1355
|
}
|
|
1289
|
-
},
|
|
1290
|
-
let i =
|
|
1356
|
+
}, en = async (e, t, n, r = {}) => {
|
|
1357
|
+
let i = q(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
|
|
1291
1358
|
if (!i) return null;
|
|
1292
|
-
let a = decodeURIComponent(i[1] ?? ""), o =
|
|
1293
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1359
|
+
let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
|
|
1360
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1294
1361
|
error: "method not allowed",
|
|
1295
1362
|
expected: "GET"
|
|
1296
1363
|
}, o);
|
|
1297
|
-
if (
|
|
1298
|
-
let s = (r.authResolver ??
|
|
1299
|
-
if (!s.ok) return
|
|
1364
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
|
|
1365
|
+
let s = (r.authResolver ?? W)(n);
|
|
1366
|
+
if (!s.ok) return G(401, {
|
|
1300
1367
|
error: "unauthorized",
|
|
1301
1368
|
reason: s.reason
|
|
1302
1369
|
}, o);
|
|
1303
|
-
if (e.kind !== "api") return
|
|
1304
|
-
if (e.inspectWorkflowEventDeliveries === void 0) return
|
|
1370
|
+
if (e.kind !== "api") return G(404, { error: "workflow event deliveries are api-only" }, o);
|
|
1371
|
+
if (e.inspectWorkflowEventDeliveries === void 0) return G(200, { deliveries: [] }, o);
|
|
1305
1372
|
try {
|
|
1306
|
-
return
|
|
1373
|
+
return G(200, await e.inspectWorkflowEventDeliveries({ eventId: a }), o);
|
|
1307
1374
|
} catch (e) {
|
|
1308
|
-
return
|
|
1375
|
+
return G(500, {
|
|
1309
1376
|
error: "workflow event deliveries query failed",
|
|
1310
1377
|
message: e?.message ?? String(e)
|
|
1311
1378
|
}, o);
|
|
1312
1379
|
}
|
|
1313
|
-
},
|
|
1314
|
-
if (
|
|
1315
|
-
let i =
|
|
1316
|
-
if ((r.method ?? "GET").toUpperCase() !== "GET") return
|
|
1380
|
+
}, tn = async (e, t, n, r = {}) => {
|
|
1381
|
+
if (q(e) !== "/_voltro/inspect/workflows/children") return null;
|
|
1382
|
+
let i = K(n.origin ?? n.Origin);
|
|
1383
|
+
if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
|
|
1317
1384
|
error: "method not allowed",
|
|
1318
1385
|
expected: "GET"
|
|
1319
1386
|
}, i);
|
|
1320
|
-
if (
|
|
1321
|
-
let a = (r.authResolver ??
|
|
1322
|
-
if (!a.ok) return
|
|
1387
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
|
|
1388
|
+
let a = (r.authResolver ?? W)(n);
|
|
1389
|
+
if (!a.ok) return G(401, {
|
|
1323
1390
|
error: "unauthorized",
|
|
1324
1391
|
reason: a.reason
|
|
1325
1392
|
}, i);
|
|
1326
|
-
if (t.kind !== "api") return
|
|
1327
|
-
let o =
|
|
1328
|
-
if (o === null || o === "") return
|
|
1329
|
-
if (t.inspectWorkflowChildren === void 0) return
|
|
1393
|
+
if (t.kind !== "api") return G(404, { error: "workflow children are api-only" }, i);
|
|
1394
|
+
let o = J(e).get("parentExecutionId");
|
|
1395
|
+
if (o === null || o === "") return G(400, { error: "parentExecutionId query param required" }, i);
|
|
1396
|
+
if (t.inspectWorkflowChildren === void 0) return G(200, {
|
|
1330
1397
|
runs: [],
|
|
1331
1398
|
total: 0,
|
|
1332
1399
|
offset: 0,
|
|
1333
1400
|
limit: 200
|
|
1334
1401
|
}, i);
|
|
1335
1402
|
try {
|
|
1336
|
-
return
|
|
1403
|
+
return G(200, await t.inspectWorkflowChildren({ parentExecutionId: o }), i);
|
|
1337
1404
|
} catch (e) {
|
|
1338
|
-
return
|
|
1405
|
+
return G(500, {
|
|
1339
1406
|
error: "children query failed",
|
|
1340
1407
|
message: e?.message ?? String(e)
|
|
1341
1408
|
}, i);
|
|
1342
1409
|
}
|
|
1343
|
-
},
|
|
1344
|
-
let a =
|
|
1410
|
+
}, nn = async (e, t, n, r, i = {}) => {
|
|
1411
|
+
let a = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume|signal|update)$/);
|
|
1345
1412
|
if (!a) return null;
|
|
1346
|
-
let o = decodeURIComponent(a[1] ?? ""), s = a[2], c =
|
|
1347
|
-
if ((i.method ?? "POST").toUpperCase() !== "POST") return
|
|
1413
|
+
let o = decodeURIComponent(a[1] ?? ""), s = a[2], c = K(n.origin ?? n.Origin);
|
|
1414
|
+
if ((i.method ?? "POST").toUpperCase() !== "POST") return G(405, {
|
|
1348
1415
|
error: "method not allowed",
|
|
1349
1416
|
expected: "POST"
|
|
1350
1417
|
}, c);
|
|
1351
|
-
if (
|
|
1352
|
-
let l = (i.authResolver ??
|
|
1353
|
-
if (!l.ok) return
|
|
1418
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, c);
|
|
1419
|
+
let l = (i.authResolver ?? W)(n);
|
|
1420
|
+
if (!l.ok) return G(401, {
|
|
1354
1421
|
error: "unauthorized",
|
|
1355
1422
|
reason: l.reason
|
|
1356
1423
|
}, c);
|
|
1357
|
-
if (t.kind !== "api") return
|
|
1424
|
+
if (t.kind !== "api") return G(404, { error: "workflow actions are api-only" }, c);
|
|
1358
1425
|
let u = {
|
|
1359
1426
|
cancel: t.inspectCancelWorkflowRun,
|
|
1360
1427
|
retry: t.inspectRetryWorkflowRun,
|
|
@@ -1363,16 +1430,16 @@ __installPublicEnv(publicEnvValues)
|
|
|
1363
1430
|
signal: t.inspectSignalWorkflowRun,
|
|
1364
1431
|
update: t.inspectUpdateWorkflowRun
|
|
1365
1432
|
}[s];
|
|
1366
|
-
if (!u) return
|
|
1433
|
+
if (!u) return G(404, { error: `inspect${s[0]?.toUpperCase() ?? ""}${s.slice(1)}WorkflowRun not configured` }, c);
|
|
1367
1434
|
let d, f, p, m, h, g;
|
|
1368
1435
|
if (r.length > 0) try {
|
|
1369
1436
|
let e = JSON.parse(r);
|
|
1370
1437
|
s === "retry" && (d = e.payloadOverride), s === "signal" && (typeof e.signalName == "string" && e.signalName.length > 0 && (f = e.signalName), p = e.payload), s === "update" && (typeof e.updateName == "string" && e.updateName.length > 0 && (m = e.updateName), h = e.payload, typeof e.timeoutMs == "number" && Number.isFinite(e.timeoutMs) && (g = e.timeoutMs));
|
|
1371
1438
|
} catch {}
|
|
1372
|
-
if (s === "signal" && f === void 0) return
|
|
1373
|
-
if (s === "update" && m === void 0) return
|
|
1439
|
+
if (s === "signal" && f === void 0) return G(400, { error: "signal requires JSON body `{ signalName: string, payload?: unknown }`" }, c);
|
|
1440
|
+
if (s === "update" && m === void 0) return G(400, { error: "update requires JSON body `{ updateName: string, payload?: unknown, timeoutMs?: number }`" }, c);
|
|
1374
1441
|
try {
|
|
1375
|
-
return
|
|
1442
|
+
return G(200, s === "retry" && d !== void 0 ? await u({
|
|
1376
1443
|
runId: o,
|
|
1377
1444
|
payloadOverride: d
|
|
1378
1445
|
}) : s === "signal" ? await u({
|
|
@@ -1386,71 +1453,71 @@ __installPublicEnv(publicEnvValues)
|
|
|
1386
1453
|
...g === void 0 ? {} : { timeoutMs: g }
|
|
1387
1454
|
}) : await u({ runId: o }), c);
|
|
1388
1455
|
} catch (e) {
|
|
1389
|
-
return
|
|
1456
|
+
return G(500, {
|
|
1390
1457
|
error: `${s} failed`,
|
|
1391
1458
|
message: e?.message ?? String(e)
|
|
1392
1459
|
}, c);
|
|
1393
1460
|
}
|
|
1394
|
-
},
|
|
1395
|
-
if (
|
|
1396
|
-
let a =
|
|
1397
|
-
if (
|
|
1398
|
-
let o = (i.authResolver ??
|
|
1399
|
-
if (!o.ok) return
|
|
1461
|
+
}, rn = async (e, t, n, r, i = {}) => {
|
|
1462
|
+
if (q(e) !== "/_voltro/inspect/data/import" || (i.method ?? "POST").toUpperCase() !== "POST") return null;
|
|
1463
|
+
let a = K(n.origin ?? n.Origin);
|
|
1464
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
|
|
1465
|
+
let o = (i.authResolver ?? W)(n);
|
|
1466
|
+
if (!o.ok) return G(401, {
|
|
1400
1467
|
error: "unauthorized",
|
|
1401
1468
|
reason: o.reason
|
|
1402
1469
|
}, a);
|
|
1403
|
-
if (t.kind !== "api") return
|
|
1404
|
-
if (!t.inspectImport) return
|
|
1470
|
+
if (t.kind !== "api") return G(404, { error: "data import is api-only" }, a);
|
|
1471
|
+
if (!t.inspectImport) return G(404, { error: "inspectImport not configured" }, a);
|
|
1405
1472
|
let s;
|
|
1406
1473
|
try {
|
|
1407
1474
|
s = JSON.parse(r || "{}");
|
|
1408
1475
|
} catch {
|
|
1409
|
-
return
|
|
1476
|
+
return G(400, { error: "body must be JSON" }, a);
|
|
1410
1477
|
}
|
|
1411
|
-
if (typeof s.bundleDir != "string" || !s.bundleDir) return
|
|
1478
|
+
if (typeof s.bundleDir != "string" || !s.bundleDir) return G(400, { error: "body.bundleDir (string) is required" }, a);
|
|
1412
1479
|
try {
|
|
1413
|
-
return
|
|
1480
|
+
return G(200, await t.inspectImport({
|
|
1414
1481
|
bundleDir: s.bundleDir,
|
|
1415
1482
|
...s.mode === "upsert" || s.mode === "append" || s.mode === "replace" ? { mode: s.mode } : {},
|
|
1416
1483
|
...s.onConflict === "skip" || s.onConflict === "fail" ? { onConflict: s.onConflict } : {},
|
|
1417
1484
|
...typeof s.atomic == "boolean" ? { atomic: s.atomic } : {}
|
|
1418
1485
|
}), a);
|
|
1419
1486
|
} catch (e) {
|
|
1420
|
-
return
|
|
1487
|
+
return G(500, {
|
|
1421
1488
|
error: "import failed",
|
|
1422
1489
|
message: e?.message ?? String(e)
|
|
1423
1490
|
}, a);
|
|
1424
1491
|
}
|
|
1425
|
-
},
|
|
1426
|
-
let a =
|
|
1492
|
+
}, an = async (e, t, n, r, i = {}) => {
|
|
1493
|
+
let a = q(e);
|
|
1427
1494
|
if (!a.startsWith("/_voltro/inspect/data/rows")) return null;
|
|
1428
1495
|
let o = (i.method ?? "POST").toUpperCase();
|
|
1429
1496
|
if (o === "GET" && a === "/_voltro/inspect/data/rows") return null;
|
|
1430
|
-
let s =
|
|
1431
|
-
if (
|
|
1432
|
-
let c = (i.authResolver ??
|
|
1433
|
-
if (!c.ok) return
|
|
1497
|
+
let s = K(n.origin ?? n.Origin);
|
|
1498
|
+
if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
|
|
1499
|
+
let c = (i.authResolver ?? W)(n);
|
|
1500
|
+
if (!c.ok) return G(401, {
|
|
1434
1501
|
error: "unauthorized",
|
|
1435
1502
|
reason: c.reason
|
|
1436
1503
|
}, s);
|
|
1437
|
-
if (t.kind !== "api") return
|
|
1504
|
+
if (t.kind !== "api") return G(404, { error: "data viewer is api-only" }, s);
|
|
1438
1505
|
if (o === "POST" && a === "/_voltro/inspect/data/rows") {
|
|
1439
|
-
if (!t.inspectInsertRow) return
|
|
1506
|
+
if (!t.inspectInsertRow) return G(404, { error: "inspectInsertRow not configured" }, s);
|
|
1440
1507
|
let e;
|
|
1441
1508
|
try {
|
|
1442
1509
|
e = JSON.parse(r || "{}");
|
|
1443
1510
|
} catch {
|
|
1444
|
-
return
|
|
1511
|
+
return G(400, { error: "body must be JSON" }, s);
|
|
1445
1512
|
}
|
|
1446
|
-
if (typeof e.table != "string" || !e.row || typeof e.row != "object") return
|
|
1513
|
+
if (typeof e.table != "string" || !e.row || typeof e.row != "object") return G(400, { error: "body must be { table: string, row: object }" }, s);
|
|
1447
1514
|
try {
|
|
1448
|
-
return
|
|
1515
|
+
return G(200, await t.inspectInsertRow({
|
|
1449
1516
|
table: e.table,
|
|
1450
1517
|
row: e.row
|
|
1451
1518
|
}), s);
|
|
1452
1519
|
} catch (e) {
|
|
1453
|
-
return
|
|
1520
|
+
return G(500, {
|
|
1454
1521
|
error: "insert failed",
|
|
1455
1522
|
message: e?.message ?? String(e)
|
|
1456
1523
|
}, s);
|
|
@@ -1459,50 +1526,50 @@ __installPublicEnv(publicEnvValues)
|
|
|
1459
1526
|
let l = a.match(/^\/_voltro\/inspect\/data\/rows\/([^/]+)$/);
|
|
1460
1527
|
if (!l) return null;
|
|
1461
1528
|
let u = decodeURIComponent(l[1] ?? "");
|
|
1462
|
-
if (!u) return
|
|
1463
|
-
let d =
|
|
1464
|
-
if (!d) return
|
|
1529
|
+
if (!u) return G(400, { error: "row id is required in URL" }, s);
|
|
1530
|
+
let d = J(e).get("table") ?? "";
|
|
1531
|
+
if (!d) return G(400, { error: "query.table is required" }, s);
|
|
1465
1532
|
if (o === "PATCH") {
|
|
1466
|
-
if (!t.inspectUpdateRow) return
|
|
1533
|
+
if (!t.inspectUpdateRow) return G(404, { error: "inspectUpdateRow not configured" }, s);
|
|
1467
1534
|
let e;
|
|
1468
1535
|
try {
|
|
1469
1536
|
e = JSON.parse(r || "{}");
|
|
1470
1537
|
} catch {
|
|
1471
|
-
return
|
|
1538
|
+
return G(400, { error: "body must be JSON" }, s);
|
|
1472
1539
|
}
|
|
1473
|
-
if (!e.patch || typeof e.patch != "object") return
|
|
1540
|
+
if (!e.patch || typeof e.patch != "object") return G(400, { error: "body.patch must be an object" }, s);
|
|
1474
1541
|
try {
|
|
1475
|
-
return
|
|
1542
|
+
return G(200, await t.inspectUpdateRow({
|
|
1476
1543
|
table: d,
|
|
1477
1544
|
id: u,
|
|
1478
1545
|
patch: e.patch
|
|
1479
1546
|
}), s);
|
|
1480
1547
|
} catch (e) {
|
|
1481
|
-
return
|
|
1548
|
+
return G(500, {
|
|
1482
1549
|
error: "update failed",
|
|
1483
1550
|
message: e?.message ?? String(e)
|
|
1484
1551
|
}, s);
|
|
1485
1552
|
}
|
|
1486
1553
|
}
|
|
1487
1554
|
if (o === "DELETE") {
|
|
1488
|
-
if (!t.inspectDeleteRow) return
|
|
1555
|
+
if (!t.inspectDeleteRow) return G(404, { error: "inspectDeleteRow not configured" }, s);
|
|
1489
1556
|
try {
|
|
1490
|
-
return
|
|
1557
|
+
return G(200, await t.inspectDeleteRow({
|
|
1491
1558
|
table: d,
|
|
1492
1559
|
id: u
|
|
1493
1560
|
}), s);
|
|
1494
1561
|
} catch (e) {
|
|
1495
|
-
return
|
|
1562
|
+
return G(500, {
|
|
1496
1563
|
error: "delete failed",
|
|
1497
1564
|
message: e?.message ?? String(e)
|
|
1498
1565
|
}, s);
|
|
1499
1566
|
}
|
|
1500
1567
|
}
|
|
1501
|
-
return
|
|
1568
|
+
return G(405, {
|
|
1502
1569
|
error: "method not allowed",
|
|
1503
1570
|
expected: "POST | PATCH | DELETE"
|
|
1504
1571
|
}, s);
|
|
1505
|
-
},
|
|
1572
|
+
}, on = 256, sn = (e = on) => {
|
|
1506
1573
|
let t = [], n = /* @__PURE__ */ new Set();
|
|
1507
1574
|
return {
|
|
1508
1575
|
emit(r, i) {
|
|
@@ -1525,27 +1592,27 @@ __installPublicEnv(publicEnvValues)
|
|
|
1525
1592
|
return t.slice();
|
|
1526
1593
|
}
|
|
1527
1594
|
};
|
|
1528
|
-
},
|
|
1595
|
+
}, cn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, ln = () => `: keep-alive ${Date.now()}\n\n`, un = {
|
|
1529
1596
|
trace: 0,
|
|
1530
1597
|
debug: 1,
|
|
1531
1598
|
info: 2,
|
|
1532
1599
|
warn: 3,
|
|
1533
1600
|
error: 4,
|
|
1534
1601
|
fatal: 5
|
|
1535
|
-
},
|
|
1602
|
+
}, dn = 2e3, fn = 200, pn = class {
|
|
1536
1603
|
capacity;
|
|
1537
1604
|
buffer = [];
|
|
1538
|
-
constructor(e =
|
|
1605
|
+
constructor(e = dn) {
|
|
1539
1606
|
this.capacity = e;
|
|
1540
1607
|
}
|
|
1541
1608
|
append(e) {
|
|
1542
1609
|
this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
|
|
1543
1610
|
}
|
|
1544
1611
|
query(e = {}) {
|
|
1545
|
-
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ??
|
|
1612
|
+
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? fn, this.capacity), i = e.minLevel === void 0 ? un.trace : un[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
|
|
1546
1613
|
for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
|
|
1547
1614
|
let r = this.buffer[e];
|
|
1548
|
-
r.ts < t || r.ts > n ||
|
|
1615
|
+
r.ts < t || r.ts > n || un[r.level] < i || o !== void 0 && r.source !== o || a !== void 0 && (r.scope === void 0 || !r.scope.toLowerCase().includes(a)) || s !== void 0 && !r.message.toLowerCase().includes(s) || c !== void 0 && r.fields.traceId !== c || l.push(r);
|
|
1549
1616
|
}
|
|
1550
1617
|
return l.reverse();
|
|
1551
1618
|
}
|
|
@@ -1558,7 +1625,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1558
1625
|
clear() {
|
|
1559
1626
|
this.buffer = [];
|
|
1560
1627
|
}
|
|
1561
|
-
},
|
|
1628
|
+
}, mn = null, hn = () => (mn === null && (mn = new pn()), mn), gn = (e) => {
|
|
1562
1629
|
if (typeof e == "string") return e;
|
|
1563
1630
|
if (e instanceof Error) return e.message;
|
|
1564
1631
|
try {
|
|
@@ -1566,18 +1633,18 @@ __installPublicEnv(publicEnvValues)
|
|
|
1566
1633
|
} catch {
|
|
1567
1634
|
return String(e);
|
|
1568
1635
|
}
|
|
1569
|
-
},
|
|
1636
|
+
}, _n = (e) => {
|
|
1570
1637
|
let t = {
|
|
1571
1638
|
log: console.log.bind(console),
|
|
1572
1639
|
info: console.info.bind(console),
|
|
1573
1640
|
warn: console.warn.bind(console),
|
|
1574
1641
|
error: console.error.bind(console),
|
|
1575
1642
|
debug: console.debug.bind(console)
|
|
1576
|
-
}, n =
|
|
1643
|
+
}, n = hn(), r = !1, i = (i) => (...a) => {
|
|
1577
1644
|
if (t[i](...a), !r) {
|
|
1578
1645
|
r = !0;
|
|
1579
1646
|
try {
|
|
1580
|
-
let t = a.length > 0 ?
|
|
1647
|
+
let t = a.length > 0 ? gn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = O();
|
|
1581
1648
|
e.emit("log", {
|
|
1582
1649
|
level: i,
|
|
1583
1650
|
message: r,
|
|
@@ -1635,24 +1702,24 @@ __installPublicEnv(publicEnvValues)
|
|
|
1635
1702
|
return () => {
|
|
1636
1703
|
console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
|
|
1637
1704
|
};
|
|
1638
|
-
},
|
|
1705
|
+
}, vn = 2e3, yn = 8, bn = 1e3, xn = 200, X = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Sn = (e) => {
|
|
1639
1706
|
switch (e) {
|
|
1640
1707
|
case "error": return "error";
|
|
1641
1708
|
case "warn": return "warn";
|
|
1642
1709
|
case "debug": return "debug";
|
|
1643
1710
|
default: return "info";
|
|
1644
1711
|
}
|
|
1645
|
-
},
|
|
1712
|
+
}, Cn = g({ scope: "client" }), wn = (e, t) => {
|
|
1646
1713
|
let n;
|
|
1647
1714
|
try {
|
|
1648
1715
|
n = JSON.parse(e);
|
|
1649
1716
|
} catch {
|
|
1650
|
-
return
|
|
1717
|
+
return Tn(400, { error: "invalid JSON body" });
|
|
1651
1718
|
}
|
|
1652
|
-
if (typeof n != "object" || !n) return
|
|
1719
|
+
if (typeof n != "object" || !n) return Tn(400, { error: "body must be a JSON object" });
|
|
1653
1720
|
let r = n;
|
|
1654
|
-
if (!Array.isArray(r.entries)) return
|
|
1655
|
-
let i = typeof r.app == "string" ?
|
|
1721
|
+
if (!Array.isArray(r.entries)) return Tn(400, { error: "entries must be an array" });
|
|
1722
|
+
let i = typeof r.app == "string" ? X(r.app, 120) : void 0, a = typeof r.page == "string" ? X(r.page, 200) : void 0, o = typeof r.ua == "string" ? X(r.ua, 200) : void 0, s = r.entries.slice(0, xn), c = 0;
|
|
1656
1723
|
for (let e of s) {
|
|
1657
1724
|
if (typeof e != "object" || !e) continue;
|
|
1658
1725
|
let n = e;
|
|
@@ -1663,7 +1730,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1663
1730
|
"warn",
|
|
1664
1731
|
"error",
|
|
1665
1732
|
"debug"
|
|
1666
|
-
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l =
|
|
1733
|
+
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = X(n.message, vn), u = Array.isArray(n.args) ? n.args.slice(0, yn).filter((e) => typeof e == "string").map((e) => X(e, bn)) : void 0, d = typeof n.stack == "string" ? X(n.stack, vn) : void 0;
|
|
1667
1734
|
t.emit("clientLog", {
|
|
1668
1735
|
ts: s,
|
|
1669
1736
|
level: r,
|
|
@@ -1678,35 +1745,35 @@ __installPublicEnv(publicEnvValues)
|
|
|
1678
1745
|
...i === void 0 ? {} : { app: i },
|
|
1679
1746
|
...a === void 0 ? {} : { page: a },
|
|
1680
1747
|
...u !== void 0 && u.length > 0 ? { args: u } : {}
|
|
1681
|
-
}, p =
|
|
1682
|
-
(p === "error" || p === "warn") && d !== void 0 ?
|
|
1748
|
+
}, p = Sn(r);
|
|
1749
|
+
(p === "error" || p === "warn") && d !== void 0 ? Cn[p](l, f, { stack: d }) : Cn[p](l, {
|
|
1683
1750
|
...f,
|
|
1684
1751
|
...d === void 0 ? {} : { stack: d }
|
|
1685
1752
|
}), c++;
|
|
1686
1753
|
}
|
|
1687
|
-
return
|
|
1754
|
+
return Tn(202, {
|
|
1688
1755
|
accepted: c,
|
|
1689
1756
|
dropped: r.entries.length - c
|
|
1690
1757
|
});
|
|
1691
|
-
},
|
|
1758
|
+
}, Tn = (e, t) => ({
|
|
1692
1759
|
status: e,
|
|
1693
1760
|
contentType: "application/json; charset=utf-8",
|
|
1694
1761
|
body: JSON.stringify(t)
|
|
1695
|
-
}),
|
|
1762
|
+
}), En = "/_voltro/inspect/clientLog", Dn = [
|
|
1696
1763
|
"trace",
|
|
1697
1764
|
"debug",
|
|
1698
1765
|
"info",
|
|
1699
1766
|
"warn",
|
|
1700
1767
|
"error",
|
|
1701
1768
|
"fatal"
|
|
1702
|
-
],
|
|
1769
|
+
], On = {
|
|
1703
1770
|
trace: "TRACE",
|
|
1704
1771
|
debug: "DEBUG",
|
|
1705
1772
|
info: "INFO ",
|
|
1706
1773
|
warn: "WARN ",
|
|
1707
1774
|
error: "ERROR",
|
|
1708
1775
|
fatal: "FATAL"
|
|
1709
|
-
},
|
|
1776
|
+
}, kn = (e) => Dn.includes(e), An = (e, t) => {
|
|
1710
1777
|
let n = e.indexOf("?"), r = n === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(n + 1)), i = {}, a = r.get("since");
|
|
1711
1778
|
if (a !== null) {
|
|
1712
1779
|
let e = Number(a);
|
|
@@ -1723,7 +1790,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1723
1790
|
Number.isFinite(e) && e > 0 && (i.max = Math.floor(e));
|
|
1724
1791
|
}
|
|
1725
1792
|
let c = r.get("level");
|
|
1726
|
-
c !== null &&
|
|
1793
|
+
c !== null && kn(c) && (i.minLevel = c);
|
|
1727
1794
|
let l = r.get("source");
|
|
1728
1795
|
(l === "server" || l === "client") && (i.source = l);
|
|
1729
1796
|
let u = r.get("scope");
|
|
@@ -1736,7 +1803,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1736
1803
|
if ((r.get("format") ?? "json") === "text") return {
|
|
1737
1804
|
status: 200,
|
|
1738
1805
|
contentType: "text/plain; charset=utf-8",
|
|
1739
|
-
body: p.map(
|
|
1806
|
+
body: p.map(jn).join("\n") + (p.length > 0 ? "\n" : "")
|
|
1740
1807
|
};
|
|
1741
1808
|
let m = {
|
|
1742
1809
|
capturedAt: Date.now(),
|
|
@@ -1750,34 +1817,34 @@ __installPublicEnv(publicEnvValues)
|
|
|
1750
1817
|
contentType: "application/json; charset=utf-8",
|
|
1751
1818
|
body: JSON.stringify(m)
|
|
1752
1819
|
};
|
|
1753
|
-
},
|
|
1754
|
-
let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s =
|
|
1755
|
-
return `${n}:${r}:${i}.${a} ${
|
|
1756
|
-
},
|
|
1820
|
+
}, jn = (e) => {
|
|
1821
|
+
let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s = Nn(e.fields);
|
|
1822
|
+
return `${n}:${r}:${i}.${a} ${On[e.level]} ${o} ${e.message}${s}`;
|
|
1823
|
+
}, Mn = 80, Nn = (e) => {
|
|
1757
1824
|
let t = Object.entries(e);
|
|
1758
1825
|
if (t.length === 0) return "";
|
|
1759
1826
|
let n = [];
|
|
1760
1827
|
for (let [e, r] of t) {
|
|
1761
1828
|
if (r === void 0) continue;
|
|
1762
|
-
let t =
|
|
1829
|
+
let t = Pn(r);
|
|
1763
1830
|
n.push(`${e}=${t}`);
|
|
1764
1831
|
}
|
|
1765
1832
|
return n.length > 0 ? " " + n.join(" ") : "";
|
|
1766
|
-
},
|
|
1833
|
+
}, Pn = (e) => {
|
|
1767
1834
|
if (typeof e == "string") {
|
|
1768
|
-
let t = e.length >
|
|
1835
|
+
let t = e.length > Mn ? e.slice(0, Mn) + "…" : e;
|
|
1769
1836
|
return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
|
|
1770
1837
|
}
|
|
1771
1838
|
if (e === null) return "null";
|
|
1772
1839
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
1773
1840
|
try {
|
|
1774
1841
|
let t = JSON.stringify(e);
|
|
1775
|
-
return t.length >
|
|
1842
|
+
return t.length > Mn ? t.slice(0, Mn) + "…" : t;
|
|
1776
1843
|
} catch {
|
|
1777
1844
|
return "[unserialisable]";
|
|
1778
1845
|
}
|
|
1779
|
-
},
|
|
1780
|
-
|
|
1846
|
+
}, Fn = "/_voltro/inspect/logs", In = g({ scope: "voltro:cli" }), Ln = [], Rn = (e) => {
|
|
1847
|
+
Ln.length = 0;
|
|
1781
1848
|
let r = e[1] && !e[1].startsWith("-") ? e[1] : void 0, i = r ? n(r) ? r : a(process.cwd(), r) : process.cwd(), o = [], s = i;
|
|
1782
1849
|
for (;;) {
|
|
1783
1850
|
o.push(s);
|
|
@@ -1788,7 +1855,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1788
1855
|
for (let e of o) for (let t of [".env.local", ".env"]) {
|
|
1789
1856
|
let n = a(e, t);
|
|
1790
1857
|
if (y(n)) {
|
|
1791
|
-
|
|
1858
|
+
Ln.push(n);
|
|
1792
1859
|
try {
|
|
1793
1860
|
let e = C(n, "utf8");
|
|
1794
1861
|
for (let t of e.split(/\r?\n/)) {
|
|
@@ -1800,15 +1867,15 @@ __installPublicEnv(publicEnvValues)
|
|
|
1800
1867
|
(i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
|
|
1801
1868
|
}
|
|
1802
1869
|
} catch (e) {
|
|
1803
|
-
|
|
1870
|
+
In.warn("failed to load env file (continuing)", { path: n }, e);
|
|
1804
1871
|
}
|
|
1805
1872
|
}
|
|
1806
1873
|
}
|
|
1807
|
-
},
|
|
1874
|
+
}, zn = 500, Bn = (e, t, n = {}) => {
|
|
1808
1875
|
if (e.length === 0) return () => {};
|
|
1809
1876
|
let r = (e) => n.root ? i(n.root, e) : e, a = !1, o = (e) => {
|
|
1810
1877
|
a || (a = !0, t.warn(`.env changed (${r(e)}) — hard-restarting: process.env is read once at boot, a reload would keep stale values`, { file: r(e) }), Promise.resolve().then(() => n.onBeforeRestart?.()).catch((e) => t.warn(".env restart: onBeforeRestart failed (continuing)", {}, e)).finally(() => {
|
|
1811
|
-
let e =
|
|
1878
|
+
let e = de(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
1812
1879
|
stdio: "inherit",
|
|
1813
1880
|
env: process.env,
|
|
1814
1881
|
cwd: n.cwd ?? process.cwd()
|
|
@@ -1822,16 +1889,16 @@ __installPublicEnv(publicEnvValues)
|
|
|
1822
1889
|
});
|
|
1823
1890
|
}));
|
|
1824
1891
|
};
|
|
1825
|
-
for (let t of e) D(t, { interval:
|
|
1892
|
+
for (let t of e) D(t, { interval: zn }, (e, n) => {
|
|
1826
1893
|
e.mtimeMs !== n.mtimeMs && o(t);
|
|
1827
1894
|
});
|
|
1828
1895
|
return t.info("watching .env files for changes", {
|
|
1829
1896
|
files: e.map(r),
|
|
1830
|
-
intervalMs:
|
|
1897
|
+
intervalMs: zn
|
|
1831
1898
|
}), () => {
|
|
1832
1899
|
for (let t of e) ee(t);
|
|
1833
1900
|
};
|
|
1834
|
-
},
|
|
1901
|
+
}, Vn = [{
|
|
1835
1902
|
match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
|
|
1836
1903
|
handle: (e, t) => {
|
|
1837
1904
|
let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
|
|
@@ -1843,13 +1910,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
1843
1910
|
});
|
|
1844
1911
|
} else t.info(n);
|
|
1845
1912
|
}
|
|
1846
|
-
}],
|
|
1913
|
+
}], Hn = () => {
|
|
1847
1914
|
let e = {
|
|
1848
1915
|
warn: console.warn.bind(console),
|
|
1849
1916
|
error: console.error.bind(console)
|
|
1850
1917
|
}, t = g({ scope: "babel" }), n = !1, r = (r) => (...i) => {
|
|
1851
1918
|
if (!n) {
|
|
1852
|
-
for (let e of
|
|
1919
|
+
for (let e of Vn) if (e.match(i[0])) {
|
|
1853
1920
|
n = !0;
|
|
1854
1921
|
try {
|
|
1855
1922
|
e.handle(i, t);
|
|
@@ -1864,7 +1931,94 @@ __installPublicEnv(publicEnvValues)
|
|
|
1864
1931
|
return console.warn = r("warn"), console.error = r("error"), () => {
|
|
1865
1932
|
console.warn = e.warn, console.error = e.error;
|
|
1866
1933
|
};
|
|
1867
|
-
},
|
|
1934
|
+
}, Un = {
|
|
1935
|
+
loader: "it runs on the server, and the router caches its result per route + params",
|
|
1936
|
+
renderMode: "it picks the server render strategy",
|
|
1937
|
+
dynamic: "it picks the server render strategy",
|
|
1938
|
+
meta: "the server rendered it into <head>",
|
|
1939
|
+
getStaticPaths: "it enumerates which paths get prerendered",
|
|
1940
|
+
revalidate: "it sets the ISR cache window",
|
|
1941
|
+
staleWhileRevalidate: "it sets the ISR stale-while-revalidate window",
|
|
1942
|
+
cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
|
|
1943
|
+
interactive: "it decides how much client JS the server ships",
|
|
1944
|
+
tenantAware: "it is part of the server-side cache key"
|
|
1945
|
+
}, Wn = Object.keys(Un), Gn = "virtual:voltro-route-refresh", Kn = `\0${Gn}`, qn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Jn = () => `
|
|
1946
|
+
// GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
|
|
1947
|
+
|
|
1948
|
+
/** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
|
|
1949
|
+
* decision we make with it: an uppercase-named function, or a React element
|
|
1950
|
+
* type object (memo / forwardRef / lazy carry \`$$typeof\`). */
|
|
1951
|
+
const isComponentLike = (value) => {
|
|
1952
|
+
if (typeof value === 'function') {
|
|
1953
|
+
const name = value.displayName ?? value.name
|
|
1954
|
+
return typeof name === 'string' && /^[A-Z]/.test(name)
|
|
1955
|
+
}
|
|
1956
|
+
return typeof value === 'object' && value !== null && '$$typeof' in value
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
/** Value identity that survives module re-evaluation. A function is compared by
|
|
1960
|
+
* SOURCE TEXT — a re-evaluated but unedited \`loader\` is a brand-new object
|
|
1961
|
+
* with identical text — and everything else by its JSON form, so a \`meta\`
|
|
1962
|
+
* object literal does not read as changed on every edit. */
|
|
1963
|
+
const stableForm = (value) => {
|
|
1964
|
+
if (typeof value === 'function') return 'fn:' + String(value)
|
|
1965
|
+
try { return 'js:' + JSON.stringify(value) } catch { return 'st:' + String(value) }
|
|
1966
|
+
}
|
|
1967
|
+
|
|
1968
|
+
/** The route-module exports the SERVER reads to produce the HTML — injected
|
|
1969
|
+
* from \`SERVER_RELEVANT_ROUTE_EXPORTS\`, which is derived from
|
|
1970
|
+
* \`computeRouteMetadata\`'s own parameter type so it cannot drift from the
|
|
1971
|
+
* readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
|
|
1972
|
+
* one of THESE cannot be hot-applied: the server already ran with the old
|
|
1973
|
+
* value. Everything else a page exports is plain client-side data. */
|
|
1974
|
+
const serverRelevantExports = ${JSON.stringify(Wn)}
|
|
1975
|
+
|
|
1976
|
+
/** Name → the server step that already consumed it, so the reload message can
|
|
1977
|
+
* say WHY rather than just WHAT. Injected from the same single source. */
|
|
1978
|
+
const serverExportEffect = ${JSON.stringify(Un)}
|
|
1979
|
+
|
|
1980
|
+
/** The reason \`name\` forces a reload, for the console line. */
|
|
1981
|
+
export const serverEffectOf = (name) =>
|
|
1982
|
+
serverExportEffect[name] ?? 'the server reads it off the route module'
|
|
1983
|
+
|
|
1984
|
+
/** id (absolute file path, as react-refresh spells it) → export names that
|
|
1985
|
+
* react-refresh must NOT judge. */
|
|
1986
|
+
const ignoredExports = new Map()
|
|
1987
|
+
|
|
1988
|
+
export const registerRouteModule = (id, moduleExports) => {
|
|
1989
|
+
const names = []
|
|
1990
|
+
for (const key of Object.keys(moduleExports)) {
|
|
1991
|
+
if (key === 'default') continue
|
|
1992
|
+
if (isComponentLike(moduleExports[key])) continue
|
|
1993
|
+
names.push(key)
|
|
1994
|
+
}
|
|
1995
|
+
ignoredExports.set(id, names)
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
/** The name of the first SERVER-RELEVANT export whose VALUE changed, or null
|
|
1999
|
+
* when this update is one Fast Refresh can apply in place — a component edit,
|
|
2000
|
+
* or a change to a page-local value the server never read.
|
|
2001
|
+
*
|
|
2002
|
+
* Only the server-relevant names are inspected. A plain value export
|
|
2003
|
+
* (\`const COLUMNS = [...]\`) changing is NOT a reason to throw the page away:
|
|
2004
|
+
* the module re-evaluates, the component renders with the new value, and any
|
|
2005
|
+
* other importer is Vite's own graph propagation to resolve. */
|
|
2006
|
+
export const routeUpdateNeedsReload = (prevExports, nextExports) => {
|
|
2007
|
+
for (const key of serverRelevantExports) {
|
|
2008
|
+
if (stableForm(prevExports[key]) !== stableForm(nextExports[key])) return key
|
|
2009
|
+
}
|
|
2010
|
+
return null
|
|
2011
|
+
}
|
|
2012
|
+
|
|
2013
|
+
// \`globalThis\`, not \`window\`: identical in the browser (which is the only place
|
|
2014
|
+
// this module is ever loaded) and it keeps the runtime evaluatable by the unit
|
|
2015
|
+
// test, which is what lets the test read the REAL source instead of a copy.
|
|
2016
|
+
// Chained rather than overwritten — another plugin may own the hook for its own
|
|
2017
|
+
// modules, and ours only answers for ids it registered.
|
|
2018
|
+
const previousHook = globalThis.__getReactRefreshIgnoredExports
|
|
2019
|
+
globalThis.__getReactRefreshIgnoredExports = (args) =>
|
|
2020
|
+
ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
|
|
2021
|
+
`, Yn = (e) => `
|
|
1868
2022
|
if (import.meta.hot) {
|
|
1869
2023
|
// Self-import to read our OWN exports, the same technique the react plugin
|
|
1870
2024
|
// uses; the namespace is only complete after evaluation, hence the promise.
|
|
@@ -1878,8 +2032,10 @@ if (import.meta.hot) {
|
|
|
1878
2032
|
return
|
|
1879
2033
|
}
|
|
1880
2034
|
console.info(
|
|
1881
|
-
'[voltro] full reload:
|
|
1882
|
-
|
|
2035
|
+
'[voltro] full reload: \`' + changed + '\` changed in ' + ${JSON.stringify(e)} +
|
|
2036
|
+
' — the server READS that export (' + __voltro_serverEffect(changed) +
|
|
2037
|
+
'), and the page in front of you was produced from the old value, so it ' +
|
|
2038
|
+
'must be re-rendered. Other exports of this module hot-update in place.',
|
|
1883
2039
|
)
|
|
1884
2040
|
window.location.reload()
|
|
1885
2041
|
})
|
|
@@ -1888,72 +2044,49 @@ if (import.meta.hot) {
|
|
|
1888
2044
|
import {
|
|
1889
2045
|
registerRouteModule as __voltro_registerRouteModule,
|
|
1890
2046
|
routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
2047
|
+
serverEffectOf as __voltro_serverEffect,
|
|
2048
|
+
} from '${Gn}'
|
|
2049
|
+
`, Xn = (e) => e.replace(/\\/g, "/"), Zn = (e, t) => {
|
|
2050
|
+
let [n = "", r] = Xn(e).split("?");
|
|
2051
|
+
if (!n.endsWith(".tsx") || r !== void 0 && qn.test(r)) return !1;
|
|
2052
|
+
let i = Xn(t).replace(/\/$/, "");
|
|
1896
2053
|
return n.startsWith(`${i}/`);
|
|
1897
|
-
},
|
|
2054
|
+
}, Qn = (e, t, n) => Zn(t, n) ? `${e}${Yn(Xn(t).split("?")[0] ?? t)}` : null, $n = (e) => ({
|
|
1898
2055
|
name: "voltro:route-fast-refresh",
|
|
1899
2056
|
enforce: "pre",
|
|
1900
|
-
resolveId: (e) => e === "virtual:voltro-route-refresh" ?
|
|
1901
|
-
load: (e) => e ===
|
|
2057
|
+
resolveId: (e) => e === "virtual:voltro-route-refresh" ? Kn : void 0,
|
|
2058
|
+
load: (e) => e === Kn ? Jn() : void 0,
|
|
1902
2059
|
transform: (t, n, r) => {
|
|
1903
2060
|
if (r?.ssr === !0) return null;
|
|
1904
|
-
let i =
|
|
2061
|
+
let i = Qn(t, n, e);
|
|
1905
2062
|
return i === null ? null : {
|
|
1906
2063
|
code: i,
|
|
1907
2064
|
map: null
|
|
1908
2065
|
};
|
|
1909
2066
|
}
|
|
1910
|
-
}),
|
|
1911
|
-
let
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
}
|
|
1916
|
-
|
|
1917
|
-
e.set(t, n);
|
|
1918
|
-
},
|
|
1919
|
-
invalidate(t) {
|
|
1920
|
-
e.delete(t);
|
|
1921
|
-
},
|
|
1922
|
-
invalidateBy(t) {
|
|
1923
|
-
let n = 0;
|
|
1924
|
-
for (let r of e.keys()) t(r) && (e.delete(r), n++);
|
|
1925
|
-
return n;
|
|
1926
|
-
},
|
|
1927
|
-
clear() {
|
|
1928
|
-
e.clear();
|
|
1929
|
-
},
|
|
1930
|
-
size() {
|
|
1931
|
-
return e.size;
|
|
1932
|
-
},
|
|
1933
|
-
snapshot() {
|
|
1934
|
-
return Array.from(e.entries());
|
|
2067
|
+
}), er = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, tr = (e) => er.exec(e)?.[1] ?? null, nr = async (e, t) => {
|
|
2068
|
+
let n = (await Promise.all(t.map(async (t) => {
|
|
2069
|
+
let n;
|
|
2070
|
+
try {
|
|
2071
|
+
n = await ne(r(e, t.file), "utf8");
|
|
2072
|
+
} catch {
|
|
2073
|
+
return null;
|
|
1935
2074
|
}
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
let r = t[2].toLowerCase();
|
|
1945
|
-
return r === "s" || r.startsWith("second") ? n * 1e3 : r === "m" || r.startsWith("minute") ? n * 6e4 : r === "h" || r.startsWith("hour") ? n * 36e5 : r === "d" || r.startsWith("day") ? n * 864e5 : null;
|
|
1946
|
-
}, Hn = (e, t = {}) => {
|
|
1947
|
-
let n = [e];
|
|
1948
|
-
return t.tenant !== void 0 && t.tenant !== "" && n.push(`tenant=${t.tenant}`), t.locale !== void 0 && t.locale !== "" && n.push(`lang=${t.locale}`), n.join("|");
|
|
1949
|
-
}, Un = (e, t) => e.expiresAt > t, Wn = (e, t) => e.expiresAt <= t && e.servableUntil > t, Gn = r(de(), ".voltro"), Kn = r(Gn, "runtime-registry.json"), qn = 3e4, Jn = () => {
|
|
2075
|
+
let i = tr(n);
|
|
2076
|
+
return i === null || Qe(i) ? null : {
|
|
2077
|
+
file: t.file,
|
|
2078
|
+
value: i
|
|
2079
|
+
};
|
|
2080
|
+
}))).filter((e) => e !== null);
|
|
2081
|
+
if (n.length !== 0) throw Error(n.map((e) => et(r("src", "pages", e.file), e.value)).join("\n\n"));
|
|
2082
|
+
}, rr = r(L(), ".voltro"), ir = r(rr, "runtime-registry.json"), ar = 3e4, or = () => {
|
|
1950
2083
|
let e = Math.random().toString(36).slice(2, 10);
|
|
1951
|
-
return `${
|
|
1952
|
-
},
|
|
1953
|
-
await S.mkdir(
|
|
1954
|
-
},
|
|
2084
|
+
return `${ir}.${process.pid}.${Date.now()}.${e}.tmp`;
|
|
2085
|
+
}, sr = async () => {
|
|
2086
|
+
await S.mkdir(rr, { recursive: !0 });
|
|
2087
|
+
}, cr = async () => {
|
|
1955
2088
|
try {
|
|
1956
|
-
let e = await S.readFile(
|
|
2089
|
+
let e = await S.readFile(ir, "utf8"), t = JSON.parse(e);
|
|
1957
2090
|
return t.version !== 1 || !Array.isArray(t.apps) ? {
|
|
1958
2091
|
version: 1,
|
|
1959
2092
|
apps: []
|
|
@@ -1964,31 +2097,31 @@ import {
|
|
|
1964
2097
|
apps: []
|
|
1965
2098
|
};
|
|
1966
2099
|
}
|
|
1967
|
-
},
|
|
1968
|
-
await
|
|
1969
|
-
let t =
|
|
2100
|
+
}, lr = async (e) => {
|
|
2101
|
+
await sr();
|
|
2102
|
+
let t = or();
|
|
1970
2103
|
try {
|
|
1971
|
-
await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t,
|
|
2104
|
+
await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t, ir);
|
|
1972
2105
|
} catch (e) {
|
|
1973
2106
|
try {
|
|
1974
2107
|
await S.unlink(t);
|
|
1975
2108
|
} catch {}
|
|
1976
2109
|
throw e;
|
|
1977
2110
|
}
|
|
1978
|
-
},
|
|
2111
|
+
}, ur = (e) => {
|
|
1979
2112
|
try {
|
|
1980
2113
|
return process.kill(e, 0), !0;
|
|
1981
2114
|
} catch {
|
|
1982
2115
|
return !1;
|
|
1983
2116
|
}
|
|
1984
|
-
},
|
|
2117
|
+
}, dr = (e) => {
|
|
1985
2118
|
let t = Date.now();
|
|
1986
|
-
return e.filter((e) =>
|
|
1987
|
-
},
|
|
1988
|
-
let e = await
|
|
2119
|
+
return e.filter((e) => ur(e.pid) ? t - new Date(e.heartbeatAt).getTime() < ar : !1);
|
|
2120
|
+
}, fr = async () => {
|
|
2121
|
+
let e = await cr(), t = dr(e.apps);
|
|
1989
2122
|
if (t.length === e.apps.length) return e;
|
|
1990
2123
|
try {
|
|
1991
|
-
await
|
|
2124
|
+
await lr({
|
|
1992
2125
|
version: 1,
|
|
1993
2126
|
apps: t
|
|
1994
2127
|
});
|
|
@@ -1997,48 +2130,48 @@ import {
|
|
|
1997
2130
|
version: 1,
|
|
1998
2131
|
apps: t
|
|
1999
2132
|
};
|
|
2000
|
-
},
|
|
2001
|
-
let t = await
|
|
2133
|
+
}, pr = async (e) => {
|
|
2134
|
+
let t = await cr(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = {
|
|
2002
2135
|
...e,
|
|
2003
2136
|
registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
|
|
2004
2137
|
heartbeatAt: n
|
|
2005
2138
|
};
|
|
2006
|
-
await
|
|
2139
|
+
await lr({
|
|
2007
2140
|
version: 1,
|
|
2008
2141
|
apps: r >= 0 ? t.apps.map((e, t) => t === r ? i : e) : [...t.apps, i]
|
|
2009
2142
|
});
|
|
2010
|
-
},
|
|
2143
|
+
}, mr = async (e) => {
|
|
2011
2144
|
try {
|
|
2012
|
-
let t = await
|
|
2145
|
+
let t = await cr(), n = t.apps.filter((t) => t.id !== e);
|
|
2013
2146
|
if (n.length === t.apps.length) return;
|
|
2014
|
-
await
|
|
2147
|
+
await lr({
|
|
2015
2148
|
version: 1,
|
|
2016
2149
|
apps: n
|
|
2017
2150
|
});
|
|
2018
2151
|
} catch {}
|
|
2019
|
-
},
|
|
2152
|
+
}, hr = (e, t, n) => `${e}:${t}:${n}`, Z = r(L(), ".voltro", "logs"), gr = () => {
|
|
2020
2153
|
let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
|
|
2021
2154
|
return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
|
|
2022
|
-
},
|
|
2023
|
-
if (
|
|
2024
|
-
|
|
2025
|
-
let e = Date.now() -
|
|
2155
|
+
}, _r = !1, vr = () => {
|
|
2156
|
+
if (_r) return;
|
|
2157
|
+
_r = !0;
|
|
2158
|
+
let e = Date.now() - gr(), t = [];
|
|
2026
2159
|
try {
|
|
2027
|
-
t = w(
|
|
2160
|
+
t = w(Z);
|
|
2028
2161
|
} catch {
|
|
2029
2162
|
return;
|
|
2030
2163
|
}
|
|
2031
2164
|
for (let n of t) {
|
|
2032
2165
|
if (!n.endsWith(".log")) continue;
|
|
2033
|
-
let t = r(
|
|
2166
|
+
let t = r(Z, n);
|
|
2034
2167
|
try {
|
|
2035
2168
|
T(t).mtimeMs < e && E(t);
|
|
2036
2169
|
} catch {}
|
|
2037
2170
|
}
|
|
2038
|
-
},
|
|
2039
|
-
let t =
|
|
2171
|
+
}, yr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), br = (e, t) => r(Z, `${yr(e)}-${t}.log`), xr = (e) => {
|
|
2172
|
+
let t = yr(e), n = [];
|
|
2040
2173
|
try {
|
|
2041
|
-
n = w(
|
|
2174
|
+
n = w(Z);
|
|
2042
2175
|
} catch {
|
|
2043
2176
|
return;
|
|
2044
2177
|
}
|
|
@@ -2046,19 +2179,19 @@ import {
|
|
|
2046
2179
|
if (i.length === 0) return;
|
|
2047
2180
|
let a, o = -1;
|
|
2048
2181
|
for (let e of i) {
|
|
2049
|
-
let t = r(
|
|
2182
|
+
let t = r(Z, e);
|
|
2050
2183
|
try {
|
|
2051
2184
|
let e = T(t);
|
|
2052
2185
|
e.mtimeMs > o && (o = e.mtimeMs, a = t);
|
|
2053
2186
|
} catch {}
|
|
2054
2187
|
}
|
|
2055
2188
|
return a;
|
|
2056
|
-
},
|
|
2189
|
+
}, Sr = (e) => {
|
|
2057
2190
|
try {
|
|
2058
|
-
b(
|
|
2191
|
+
b(Z, { recursive: !0 });
|
|
2059
2192
|
} catch {}
|
|
2060
|
-
|
|
2061
|
-
let t =
|
|
2193
|
+
vr();
|
|
2194
|
+
let t = br(e, process.pid), n = x(t, "w"), r = (e) => {
|
|
2062
2195
|
let t = {
|
|
2063
2196
|
ts: e.ts.getTime(),
|
|
2064
2197
|
level: e.level,
|
|
@@ -2099,7 +2232,7 @@ import {
|
|
|
2099
2232
|
a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
|
|
2100
2233
|
}
|
|
2101
2234
|
};
|
|
2102
|
-
},
|
|
2235
|
+
}, Cr = async (e, t) => {
|
|
2103
2236
|
let n;
|
|
2104
2237
|
try {
|
|
2105
2238
|
n = await S.readFile(e, "utf8");
|
|
@@ -2113,11 +2246,11 @@ import {
|
|
|
2113
2246
|
i.push(t);
|
|
2114
2247
|
} catch {}
|
|
2115
2248
|
return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
|
|
2116
|
-
},
|
|
2249
|
+
}, wr = g({ scope: "voltro:dashboard" }), Tr = me(import.meta.url), Er = 5179, Dr = (e) => {
|
|
2117
2250
|
let n = process.env.VOLTRO_DASHBOARD_PATH;
|
|
2118
2251
|
if (n && y(r(a(n), "app.config.ts"))) return a(n);
|
|
2119
2252
|
try {
|
|
2120
|
-
let e = t(
|
|
2253
|
+
let e = t(Tr.resolve("@voltro/dashboard/package.json"));
|
|
2121
2254
|
if (y(r(e, "app.config.ts"))) return e;
|
|
2122
2255
|
} catch {}
|
|
2123
2256
|
let i = r("voltro-devtools", "apps", "dashboard"), o = a(e);
|
|
@@ -2129,53 +2262,53 @@ import {
|
|
|
2129
2262
|
o = n;
|
|
2130
2263
|
}
|
|
2131
2264
|
return null;
|
|
2132
|
-
},
|
|
2133
|
-
let i =
|
|
2265
|
+
}, Or = "VOLTRO_IS_DASHBOARD", kr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
|
|
2266
|
+
let i = pe({
|
|
2134
2267
|
port: e,
|
|
2135
2268
|
host: t
|
|
2136
2269
|
}), a = !1, o = (e) => {
|
|
2137
2270
|
a || (a = !0, i.destroy(), r(e));
|
|
2138
2271
|
};
|
|
2139
2272
|
i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
|
|
2140
|
-
}),
|
|
2273
|
+
}), Ar = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), jr = () => process.env[Or] === "1", Mr = () => process.stdout.isTTY === !0, Nr = r(L(), ".voltro", "dashboard-launch.lock"), Pr = 1e4, Fr = async () => {
|
|
2141
2274
|
try {
|
|
2142
|
-
await S.mkdir(t(
|
|
2143
|
-
let e = await S.open(
|
|
2275
|
+
await S.mkdir(t(Nr), { recursive: !0 });
|
|
2276
|
+
let e = await S.open(Nr, "wx");
|
|
2144
2277
|
return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
|
|
2145
2278
|
} catch {
|
|
2146
2279
|
try {
|
|
2147
|
-
let e = await S.stat(
|
|
2148
|
-
if (Date.now() - e.mtimeMs >
|
|
2280
|
+
let e = await S.stat(Nr);
|
|
2281
|
+
if (Date.now() - e.mtimeMs > Pr) return await S.unlink(Nr).catch(() => void 0), Fr();
|
|
2149
2282
|
} catch {}
|
|
2150
2283
|
return !1;
|
|
2151
2284
|
}
|
|
2152
|
-
},
|
|
2285
|
+
}, Ir = async () => {
|
|
2153
2286
|
try {
|
|
2154
|
-
await S.unlink(
|
|
2287
|
+
await S.unlink(Nr);
|
|
2155
2288
|
} catch {}
|
|
2156
|
-
},
|
|
2289
|
+
}, Lr = async (e) => {
|
|
2157
2290
|
let n = e.port ?? 5179;
|
|
2158
|
-
if (
|
|
2291
|
+
if (Ar()) return {
|
|
2159
2292
|
status: "skipped",
|
|
2160
2293
|
reason: "disabled by flag/env",
|
|
2161
2294
|
port: n
|
|
2162
2295
|
};
|
|
2163
|
-
if (
|
|
2296
|
+
if (jr()) return {
|
|
2164
2297
|
status: "skipped",
|
|
2165
2298
|
reason: "this process IS the dashboard",
|
|
2166
2299
|
port: n
|
|
2167
2300
|
};
|
|
2168
|
-
if (!
|
|
2301
|
+
if (!Mr()) return {
|
|
2169
2302
|
status: "skipped",
|
|
2170
2303
|
reason: "stdout is not a TTY (CI/smoke)",
|
|
2171
2304
|
port: n
|
|
2172
2305
|
};
|
|
2173
|
-
if (!await
|
|
2306
|
+
if (!await Fr()) return {
|
|
2174
2307
|
status: "skipped",
|
|
2175
2308
|
reason: "another voltro process is currently launching the dashboard",
|
|
2176
2309
|
port: n
|
|
2177
2310
|
};
|
|
2178
|
-
if (await
|
|
2311
|
+
if (await kr(n)) return await Ir(), {
|
|
2179
2312
|
status: "already-running",
|
|
2180
2313
|
port: n
|
|
2181
2314
|
};
|
|
@@ -2184,7 +2317,7 @@ import {
|
|
|
2184
2317
|
let e = process.argv[1];
|
|
2185
2318
|
i = e && e.endsWith("/src/bin.ts") ? r(t(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
|
|
2186
2319
|
}
|
|
2187
|
-
let a = y(r(e.dashboardAppPath, ".framework", "dist", "index.html")), o = a ? "start" : "dev", s =
|
|
2320
|
+
let a = y(r(e.dashboardAppPath, ".framework", "dist", "index.html")), o = a ? "start" : "dev", s = de(process.execPath, [
|
|
2188
2321
|
i,
|
|
2189
2322
|
o,
|
|
2190
2323
|
e.dashboardAppPath
|
|
@@ -2192,7 +2325,7 @@ import {
|
|
|
2192
2325
|
stdio: "ignore",
|
|
2193
2326
|
env: {
|
|
2194
2327
|
...process.env,
|
|
2195
|
-
[
|
|
2328
|
+
[Or]: "1",
|
|
2196
2329
|
VOLTRO_DASHBOARD_PORT: String(n)
|
|
2197
2330
|
}
|
|
2198
2331
|
});
|
|
@@ -2200,22 +2333,22 @@ import {
|
|
|
2200
2333
|
if (s.exitCode === null && s.signalCode === null) try {
|
|
2201
2334
|
s.kill("SIGTERM");
|
|
2202
2335
|
} catch {}
|
|
2203
|
-
}),
|
|
2336
|
+
}), wr.info(`auto-launching dashboard at http://localhost:${n}`, {
|
|
2204
2337
|
port: n,
|
|
2205
2338
|
mode: o,
|
|
2206
2339
|
prebuilt: a
|
|
2207
|
-
}), a ||
|
|
2208
|
-
|
|
2340
|
+
}), a || wr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), wr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
|
|
2341
|
+
Ir();
|
|
2209
2342
|
}, 4e3).unref(), {
|
|
2210
2343
|
status: "launched",
|
|
2211
2344
|
port: n
|
|
2212
2345
|
};
|
|
2213
|
-
},
|
|
2346
|
+
}, Rr = class extends Error {
|
|
2214
2347
|
_voltroDeferral = !0;
|
|
2215
2348
|
constructor(e) {
|
|
2216
2349
|
super(e), this.name = "DeferralNotSupportedError";
|
|
2217
2350
|
}
|
|
2218
|
-
},
|
|
2351
|
+
}, zr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Br = (e) => {
|
|
2219
2352
|
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
2220
2353
|
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
2221
2354
|
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
@@ -2226,62 +2359,84 @@ import {
|
|
|
2226
2359
|
t.assertDeferralSupported({
|
|
2227
2360
|
page: e.page,
|
|
2228
2361
|
renderMode: e.renderMode,
|
|
2229
|
-
interactive: e.interactive
|
|
2362
|
+
interactive: e.interactive,
|
|
2363
|
+
...e.layoutShell ? { layoutShell: e.layoutShell } : {}
|
|
2230
2364
|
});
|
|
2231
2365
|
} catch (e) {
|
|
2232
|
-
throw new
|
|
2366
|
+
throw new Rr(e instanceof Error ? e.message : String(e));
|
|
2233
2367
|
}
|
|
2234
2368
|
return {
|
|
2235
2369
|
loaderData: n.renderData,
|
|
2236
2370
|
segmentLoaderData: r,
|
|
2237
2371
|
hasDeferred: o,
|
|
2238
2372
|
stateInput: {
|
|
2373
|
+
path: e.pathname,
|
|
2239
2374
|
loaderData: n.stateData,
|
|
2240
2375
|
segmentLoaderData: i,
|
|
2241
2376
|
pageLoaderRan: e.pageLoaderRan,
|
|
2377
|
+
...e.layoutShell ? { pageClientOnly: !0 } : {},
|
|
2242
2378
|
...n.deferredIds ? { deferredPageIds: n.deferredIds } : {},
|
|
2243
2379
|
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
2244
2380
|
}
|
|
2245
2381
|
};
|
|
2246
|
-
},
|
|
2247
|
-
let { helpers: t, renderInput: n } = e,
|
|
2248
|
-
|
|
2249
|
-
|
|
2382
|
+
}, Vr = (e) => {
|
|
2383
|
+
let { helpers: t, renderInput: n } = e, r = Br({
|
|
2384
|
+
helpers: t,
|
|
2385
|
+
page: e.page,
|
|
2386
|
+
pathname: n.pathname,
|
|
2387
|
+
renderMode: "spa",
|
|
2388
|
+
interactive: e.interactive,
|
|
2389
|
+
loaderData: null,
|
|
2390
|
+
segmentLoaderData: n.segmentLoaderData ?? {},
|
|
2391
|
+
pageLoaderRan: !1,
|
|
2392
|
+
layoutShell: e.delivery
|
|
2250
2393
|
});
|
|
2251
2394
|
return {
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2395
|
+
renderInput: {
|
|
2396
|
+
...n,
|
|
2397
|
+
pageSlot: !0,
|
|
2255
2398
|
loaderData: null,
|
|
2256
|
-
segmentLoaderData:
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2399
|
+
segmentLoaderData: r.segmentLoaderData
|
|
2400
|
+
},
|
|
2401
|
+
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
2402
|
+
hasDeferred: r.hasDeferred
|
|
2260
2403
|
};
|
|
2261
|
-
},
|
|
2262
|
-
let
|
|
2263
|
-
|
|
2404
|
+
}, Hr = (e) => {
|
|
2405
|
+
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
2406
|
+
return {
|
|
2407
|
+
body: t,
|
|
2408
|
+
meta: n
|
|
2409
|
+
};
|
|
2410
|
+
}, Ur = (e) => [
|
|
2411
|
+
...e.extra ?? [],
|
|
2412
|
+
e.helpers.renderMetaToHtml(e.meta),
|
|
2413
|
+
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
2414
|
+
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
2415
|
+
e.prepared.stateScript
|
|
2416
|
+
].filter((e) => e.length > 0).join("\n "), Wr = "<div id=\"root\"></div>", Gr = "<div id=\"root\">", Kr = "</div>", qr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Jr = /\bsrc=["']([^"']+)["']/i, Yr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Xr = (e) => {
|
|
2417
|
+
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(qr, (e) => {
|
|
2418
|
+
let r = Jr.exec(e)?.[1];
|
|
2264
2419
|
return r === void 0 || t(r) ? e : (n.push(r), "");
|
|
2265
2420
|
});
|
|
2266
|
-
e.inlineModuleScriptsAsync && (r = r.replace(
|
|
2267
|
-
let i = r.indexOf(
|
|
2268
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
2421
|
+
e.inlineModuleScriptsAsync && (r = r.replace(Yr, "<script async$1>"));
|
|
2422
|
+
let i = r.indexOf(Wr);
|
|
2423
|
+
if (i === -1) throw Error(`[voltro] the generated shell has no \`${Wr}\` element, so a streamed response cannot be split around the page body. This is a framework bug unless the app overrode \`.framework/index.html\` by hand.`);
|
|
2269
2424
|
return {
|
|
2270
|
-
head: `${r.slice(0, i)}${
|
|
2271
|
-
tail: `${
|
|
2425
|
+
head: `${r.slice(0, i)}${Gr}`,
|
|
2426
|
+
tail: `${Kr}${r.slice(i + 21)}`,
|
|
2272
2427
|
bootstrapModules: n
|
|
2273
2428
|
};
|
|
2274
|
-
},
|
|
2429
|
+
}, Zr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Qr = (e) => {
|
|
2275
2430
|
let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
|
|
2276
2431
|
if (s || !o || a === null) return;
|
|
2277
2432
|
s = !0, t.statusCode = e.statusCode ?? 200;
|
|
2278
2433
|
for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
|
|
2279
|
-
t.flushHeaders?.(), t.write(
|
|
2434
|
+
t.flushHeaders?.(), t.write(Zr({
|
|
2280
2435
|
head: n.head,
|
|
2281
2436
|
headInjection: i(a.meta),
|
|
2282
2437
|
htmlLang: r
|
|
2283
2438
|
}));
|
|
2284
|
-
let c = new
|
|
2439
|
+
let c = new he();
|
|
2285
2440
|
c.pipe(t, { end: !1 }), c.on("end", () => {
|
|
2286
2441
|
t.end(n.tail);
|
|
2287
2442
|
}), a.stream.pipe(c);
|
|
@@ -2306,14 +2461,14 @@ import {
|
|
|
2306
2461
|
return;
|
|
2307
2462
|
}
|
|
2308
2463
|
c();
|
|
2309
|
-
},
|
|
2464
|
+
}, Q = g({ scope: "voltro:dev:web" }), $r = g({ scope: "vite" }), ei = await (async () => {
|
|
2310
2465
|
try {
|
|
2311
2466
|
let e = r(t(o(import.meta.url)), "..", "package.json"), n = await S.readFile(e, "utf8");
|
|
2312
2467
|
return JSON.parse(n).version ?? "0.0.0";
|
|
2313
2468
|
} catch {
|
|
2314
2469
|
return "0.0.0";
|
|
2315
2470
|
}
|
|
2316
|
-
})(),
|
|
2471
|
+
})(), ti = async () => {
|
|
2317
2472
|
try {
|
|
2318
2473
|
let e = t(o(import.meta.url)), n = a(e, "..", "..", "devtools");
|
|
2319
2474
|
if (y(r(n, "package.json"))) return n;
|
|
@@ -2322,7 +2477,7 @@ import {
|
|
|
2322
2477
|
} catch {
|
|
2323
2478
|
return null;
|
|
2324
2479
|
}
|
|
2325
|
-
},
|
|
2480
|
+
}, ni = (e, t) => e.disableDevtools || !t ? [] : [
|
|
2326
2481
|
"",
|
|
2327
2482
|
"// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
|
|
2328
2483
|
"// compile-time constant, so prod builds strip this whole `if` block — the",
|
|
@@ -2332,12 +2487,12 @@ import {
|
|
|
2332
2487
|
" await import('@voltro/devtools/styles.css')",
|
|
2333
2488
|
" Devtools = (await import('@voltro/devtools')).VoltroDevtools",
|
|
2334
2489
|
"}"
|
|
2335
|
-
],
|
|
2490
|
+
], ri = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], ii = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ai = (e) => e.sentry ? [
|
|
2336
2491
|
"",
|
|
2337
2492
|
"// Browser-side Sentry (frontend half of the deep integration). Errors +",
|
|
2338
2493
|
"// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
|
|
2339
2494
|
`await initSentryBrowser(${JSON.stringify(e.sentry)})`
|
|
2340
|
-
] : [],
|
|
2495
|
+
] : [], oi = (e) => e.env ? ["import './env.public'"] : [], si = (e) => {
|
|
2341
2496
|
let n = [], i = a(e);
|
|
2342
2497
|
for (;;) {
|
|
2343
2498
|
y(r(i, "pnpm-workspace.yaml")) && n.push(i);
|
|
@@ -2346,19 +2501,19 @@ import {
|
|
|
2346
2501
|
i = e;
|
|
2347
2502
|
}
|
|
2348
2503
|
return n;
|
|
2349
|
-
},
|
|
2504
|
+
}, ci = /* @__PURE__ */ new Set([
|
|
2350
2505
|
"layout.tsx",
|
|
2351
2506
|
"error.tsx",
|
|
2352
2507
|
"loading.tsx",
|
|
2353
2508
|
"not-found.tsx"
|
|
2354
|
-
]),
|
|
2509
|
+
]), li = (e) => /\.(test|spec)\.tsx$/.test(e), ui = (e) => {
|
|
2355
2510
|
if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
|
|
2356
2511
|
let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
|
|
2357
2512
|
if (t) return `island-${t[1]}`;
|
|
2358
|
-
},
|
|
2359
|
-
let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !
|
|
2513
|
+
}, di = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, fi = (e) => e.startsWith("(") && e.endsWith(")"), pi = (e) => e.filter((e) => !fi(e)), mi = (e) => {
|
|
2514
|
+
let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !fi(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
|
|
2360
2515
|
return n.length === 0 ? "/" : "/" + n.join("/");
|
|
2361
|
-
},
|
|
2516
|
+
}, hi = (e) => `${e.replace(/\.tsx$/, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, $ = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, gi = async (e) => {
|
|
2362
2517
|
let t = [], n = [], i = async (e, a) => {
|
|
2363
2518
|
let o = [];
|
|
2364
2519
|
try {
|
|
@@ -2366,17 +2521,17 @@ import {
|
|
|
2366
2521
|
} catch {
|
|
2367
2522
|
return;
|
|
2368
2523
|
}
|
|
2369
|
-
let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !
|
|
2370
|
-
if (c.some((e) =>
|
|
2524
|
+
let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !li(e.name)).map((e) => e.name).sort(), l = new Set(c), u = a.join("/");
|
|
2525
|
+
if (c.some((e) => ci.has(e))) {
|
|
2371
2526
|
let t = l.has("layout.tsx"), i = !1;
|
|
2372
2527
|
if (t) try {
|
|
2373
2528
|
let t = await S.readFile(r(e, "layout.tsx"), "utf8");
|
|
2374
|
-
i =
|
|
2529
|
+
i = di.test(t);
|
|
2375
2530
|
} catch {}
|
|
2376
2531
|
n.push({
|
|
2377
2532
|
dir: u,
|
|
2378
2533
|
chain: a,
|
|
2379
|
-
contributesToUrl: a.length === 0 || !
|
|
2534
|
+
contributesToUrl: a.length === 0 || !fi(a[a.length - 1]),
|
|
2380
2535
|
hasLayout: t,
|
|
2381
2536
|
hasLayoutLoader: i,
|
|
2382
2537
|
hasError: l.has("error.tsx"),
|
|
@@ -2385,12 +2540,12 @@ import {
|
|
|
2385
2540
|
});
|
|
2386
2541
|
}
|
|
2387
2542
|
for (let e of c) {
|
|
2388
|
-
if (
|
|
2543
|
+
if (ci.has(e)) continue;
|
|
2389
2544
|
let n = u ? `${u}/${e}` : e;
|
|
2390
2545
|
t.push({
|
|
2391
2546
|
file: n,
|
|
2392
|
-
pattern:
|
|
2393
|
-
ident:
|
|
2547
|
+
pattern: mi(n),
|
|
2548
|
+
ident: hi(n),
|
|
2394
2549
|
dirChain: a
|
|
2395
2550
|
});
|
|
2396
2551
|
}
|
|
@@ -2400,14 +2555,14 @@ import {
|
|
|
2400
2555
|
pages: t,
|
|
2401
2556
|
dirs: n
|
|
2402
2557
|
};
|
|
2403
|
-
},
|
|
2558
|
+
}, _i = (e, t) => {
|
|
2404
2559
|
let n = [];
|
|
2405
2560
|
for (let r = 0; r <= t.length; r++) {
|
|
2406
2561
|
let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
|
|
2407
2562
|
a && n.push(a);
|
|
2408
2563
|
}
|
|
2409
2564
|
return n;
|
|
2410
|
-
},
|
|
2565
|
+
}, vi = async (e) => {
|
|
2411
2566
|
let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
|
|
2412
2567
|
return {
|
|
2413
2568
|
chain: await Promise.all(t.map(async (e, t) => {
|
|
@@ -2429,10 +2584,10 @@ import {
|
|
|
2429
2584
|
})),
|
|
2430
2585
|
segmentLoaderData: o
|
|
2431
2586
|
};
|
|
2432
|
-
},
|
|
2433
|
-
let t =
|
|
2587
|
+
}, yi = (e) => {
|
|
2588
|
+
let t = pi(e);
|
|
2434
2589
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
2435
|
-
},
|
|
2590
|
+
}, bi = [
|
|
2436
2591
|
"// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
|
|
2437
2592
|
"// in sync with Vite's CSS HMR. Without this, edits to .css files",
|
|
2438
2593
|
"// only update the JS-injected <style> overlay; the underlying <link>",
|
|
@@ -2525,7 +2680,7 @@ import {
|
|
|
2525
2680
|
" _vdtErrorStart('Build error')",
|
|
2526
2681
|
" })",
|
|
2527
2682
|
"}"
|
|
2528
|
-
].join("\n"),
|
|
2683
|
+
].join("\n"), xi = (e) => {
|
|
2529
2684
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
2530
2685
|
for (let e of r) e.startsWith("[[...") && e.endsWith("]]") ? (i.push("(.*)"), t.push(e.slice(5, -2)), n += 2) : e.startsWith("[...") && e.endsWith("]") ? (i.push("(.+)"), t.push(e.slice(4, -1)), n += 3) : e.startsWith("[") && e.endsWith("]") ? (i.push("([^/]+)"), t.push(e.slice(1, -1)), n += 1) : i.push(e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
|
|
2531
2686
|
let a = i.join("/");
|
|
@@ -2534,8 +2689,8 @@ import {
|
|
|
2534
2689
|
paramNames: t,
|
|
2535
2690
|
priority: n
|
|
2536
2691
|
};
|
|
2537
|
-
},
|
|
2538
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
2692
|
+
}, Si = (e) => e.map((e) => {
|
|
2693
|
+
let { regex: t, paramNames: n, priority: r } = xi(e.pattern);
|
|
2539
2694
|
return {
|
|
2540
2695
|
pattern: e.pattern,
|
|
2541
2696
|
file: e.file,
|
|
@@ -2544,7 +2699,7 @@ import {
|
|
|
2544
2699
|
paramNames: n,
|
|
2545
2700
|
priority: r
|
|
2546
2701
|
};
|
|
2547
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
2702
|
+
}).slice().sort((e, t) => e.priority - t.priority), Ci = (e, t) => {
|
|
2548
2703
|
for (let n of t) {
|
|
2549
2704
|
let t = n.regex.exec(e);
|
|
2550
2705
|
if (!t) continue;
|
|
@@ -2556,7 +2711,7 @@ import {
|
|
|
2556
2711
|
};
|
|
2557
2712
|
}
|
|
2558
2713
|
return null;
|
|
2559
|
-
},
|
|
2714
|
+
}, wi = async (e, n) => {
|
|
2560
2715
|
let i = e;
|
|
2561
2716
|
for (;;) {
|
|
2562
2717
|
let e = r(i, "node_modules", n);
|
|
@@ -2570,7 +2725,7 @@ import {
|
|
|
2570
2725
|
if (a === i) return null;
|
|
2571
2726
|
i = a;
|
|
2572
2727
|
}
|
|
2573
|
-
},
|
|
2728
|
+
}, Ti = async (e) => {
|
|
2574
2729
|
try {
|
|
2575
2730
|
let t = await import(s(r(e, "app.config.ts")).href), n = t.default?.port, i = typeof n == "number" ? n : 4e3, a = t.default?.transport?.wsPath, o = typeof a == "string" && a.startsWith("/") ? a : void 0;
|
|
2576
2731
|
return o ? {
|
|
@@ -2579,13 +2734,13 @@ import {
|
|
|
2579
2734
|
} : { port: i };
|
|
2580
2735
|
} catch {}
|
|
2581
2736
|
return { port: 4e3 };
|
|
2582
|
-
},
|
|
2737
|
+
}, Ei = (e, t) => ({
|
|
2583
2738
|
name: e,
|
|
2584
2739
|
pkg: t.package,
|
|
2585
2740
|
browserWsUrl: t.url,
|
|
2586
2741
|
proxyTarget: void 0,
|
|
2587
2742
|
...t.headers ? { headers: t.headers } : {}
|
|
2588
|
-
}),
|
|
2743
|
+
}), Di = (e, t, n) => {
|
|
2589
2744
|
let r = t.transport?.wsPath ?? n.wsPath;
|
|
2590
2745
|
return {
|
|
2591
2746
|
name: e,
|
|
@@ -2595,7 +2750,7 @@ import {
|
|
|
2595
2750
|
...r ? { wsPath: r } : {},
|
|
2596
2751
|
...t.headers ? { headers: t.headers } : {}
|
|
2597
2752
|
};
|
|
2598
|
-
},
|
|
2753
|
+
}, Oi = (e) => {
|
|
2599
2754
|
let t = /* @__PURE__ */ new Map();
|
|
2600
2755
|
for (let n of e) {
|
|
2601
2756
|
if (n.proxyTarget === void 0) continue;
|
|
@@ -2603,19 +2758,19 @@ import {
|
|
|
2603
2758
|
if (e) throw Error(`[voltro] api ${JSON.stringify(n.name)} and ${JSON.stringify(e)} both resolve the same-origin WS path ${JSON.stringify(n.browserWsUrl)}. A custom transport.wsPath must be unique per origin (one api per origin may use a fixed path). Give each a distinct wsPath, or drop the override to use the default /ws/<name>.`);
|
|
2604
2759
|
t.set(n.browserWsUrl, n.name);
|
|
2605
2760
|
}
|
|
2606
|
-
},
|
|
2761
|
+
}, ki = async (e, t) => {
|
|
2607
2762
|
let n = Object.entries(t.apis ?? {}), r = [];
|
|
2608
2763
|
for (let [t, i] of n) {
|
|
2609
2764
|
if (i.url) {
|
|
2610
|
-
r.push(
|
|
2765
|
+
r.push(Ei(t, i));
|
|
2611
2766
|
continue;
|
|
2612
2767
|
}
|
|
2613
|
-
let n = await
|
|
2768
|
+
let n = await wi(e, i.package);
|
|
2614
2769
|
if (!n) throw Error(`[voltro dev] api ${JSON.stringify(t)} (package ${JSON.stringify(i.package)}) is not a workspace dep and has no \`url\` set in app.config.ts. External apis need an explicit \`url\` because the framework can't discover their dev port.`);
|
|
2615
|
-
r.push(
|
|
2770
|
+
r.push(Di(t, i, await Ti(n)));
|
|
2616
2771
|
}
|
|
2617
|
-
return
|
|
2618
|
-
},
|
|
2772
|
+
return Oi(r), r;
|
|
2773
|
+
}, Ai = (e) => {
|
|
2619
2774
|
if (!e) return;
|
|
2620
2775
|
let t = e.proxyTarget ?? e.browserWsUrl;
|
|
2621
2776
|
if (t && !(!/^wss?:\/\//.test(t) && !/^https?:\/\//.test(t))) try {
|
|
@@ -2624,7 +2779,7 @@ import {
|
|
|
2624
2779
|
} catch {
|
|
2625
2780
|
return;
|
|
2626
2781
|
}
|
|
2627
|
-
},
|
|
2782
|
+
}, ji = (e, t) => {
|
|
2628
2783
|
if (e) return async (n, r) => {
|
|
2629
2784
|
let i = {
|
|
2630
2785
|
_tag: "Request",
|
|
@@ -2656,8 +2811,8 @@ import {
|
|
|
2656
2811
|
}
|
|
2657
2812
|
if (l) return c;
|
|
2658
2813
|
};
|
|
2659
|
-
},
|
|
2660
|
-
let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await
|
|
2814
|
+
}, Mi = async (e, t, n, i = {}) => {
|
|
2815
|
+
let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await ti() !== null, c = t.theme === "system" ? [
|
|
2661
2816
|
" <script>",
|
|
2662
2817
|
" (function () {",
|
|
2663
2818
|
" var root = document.documentElement",
|
|
@@ -2695,59 +2850,61 @@ import {
|
|
|
2695
2850
|
" </body>",
|
|
2696
2851
|
"</html>",
|
|
2697
2852
|
""
|
|
2698
|
-
].join("\n"),
|
|
2699
|
-
|
|
2700
|
-
|
|
2701
|
-
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2853
|
+
].join("\n"), u = r(e, "src", "pages"), { pages: d, dirs: f } = await gi(u);
|
|
2854
|
+
await nr(u, d);
|
|
2855
|
+
let p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, h = n.map((e) => `import { appGroup as ${p(e.name)}, appDescriptors as ${m(e.name)} } from '${e.pkg}/rpcGroup'`), g = n.map((e) => {
|
|
2856
|
+
let t = [`group: ${p(e.name)}`];
|
|
2857
|
+
return t.push(`descriptors: ${m(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
|
|
2858
|
+
}), _, v, b;
|
|
2859
|
+
if (d.length > 0) {
|
|
2860
|
+
let e = d.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
|
|
2861
|
+
for (let e of f) {
|
|
2705
2862
|
let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
|
|
2706
|
-
e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${
|
|
2863
|
+
e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${$(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${$(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${$(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${$(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${$(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
|
|
2707
2864
|
}
|
|
2708
|
-
let r =
|
|
2709
|
-
let t =
|
|
2865
|
+
let r = d.map((e) => {
|
|
2866
|
+
let t = _i(f, e.dirChain).map((e) => {
|
|
2710
2867
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2711
2868
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasLayoutLoader && t.push(`loader: refs.layoutLoaders[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), e.hasPending && t.push(`Pending: refs.pendings[${n}]`), ` { ${t.join(", ")} }`;
|
|
2712
2869
|
}).join(",\n");
|
|
2713
2870
|
return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
|
|
2714
|
-
}), i =
|
|
2715
|
-
let t =
|
|
2871
|
+
}), i = f.filter((e) => e.hasNotFound).map((e) => {
|
|
2872
|
+
let t = yi(e.chain), n = _i(f, e.chain).map((e) => {
|
|
2716
2873
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2717
2874
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
|
|
2718
2875
|
}).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
|
|
2719
2876
|
return ` {\n prefix: ${JSON.stringify(t)},\n Component: refs.notFounds[${JSON.stringify(e.dir)}],${r}\n },`;
|
|
2720
|
-
}), a = [], o = [], c = [], l = [],
|
|
2721
|
-
for (let e of
|
|
2877
|
+
}), a = [], o = [], c = [], l = [], u = [], p = [];
|
|
2878
|
+
for (let e of f) {
|
|
2722
2879
|
let t = e.dir === "" ? "../src/pages/layout.tsx" : `../src/pages/${e.dir}/layout.tsx`, n = e.dir === "" ? "../src/pages/error.tsx" : `../src/pages/${e.dir}/error.tsx`, r = e.dir === "" ? "../src/pages/loading.tsx" : `../src/pages/${e.dir}/loading.tsx`, i = e.dir === "" ? "../src/pages/not-found.tsx" : `../src/pages/${e.dir}/not-found.tsx`, s = JSON.stringify(e.dir);
|
|
2723
|
-
e.hasLayout && e.hasLayoutLoader ? (o.push(` ${s}: ${
|
|
2880
|
+
e.hasLayout && e.hasLayoutLoader ? (o.push(` ${s}: ${$(e.dir, "Layout")}Mod.default,`), c.push(` ${s}: ${$(e.dir, "Layout")}Mod.loader,`), a.push({
|
|
2724
2881
|
relPath: t,
|
|
2725
2882
|
kind: "layout",
|
|
2726
2883
|
slotKey: e.dir
|
|
2727
|
-
})) : e.hasLayout && (o.push(` ${s}: ${
|
|
2884
|
+
})) : e.hasLayout && (o.push(` ${s}: ${$(e.dir, "Layout")},`), a.push({
|
|
2728
2885
|
relPath: t,
|
|
2729
2886
|
kind: "layout",
|
|
2730
2887
|
slotKey: e.dir
|
|
2731
|
-
})), e.hasError && (l.push(` ${s}: ${
|
|
2888
|
+
})), e.hasError && (l.push(` ${s}: ${$(e.dir, "Error")},`), a.push({
|
|
2732
2889
|
relPath: n,
|
|
2733
2890
|
kind: "error",
|
|
2734
2891
|
slotKey: e.dir
|
|
2735
|
-
})), e.hasPending && (
|
|
2892
|
+
})), e.hasPending && (u.push(` ${s}: ${$(e.dir, "Pending")},`), a.push({
|
|
2736
2893
|
relPath: r,
|
|
2737
2894
|
kind: "pending",
|
|
2738
2895
|
slotKey: e.dir
|
|
2739
|
-
})), e.hasNotFound && (p.push(` ${s}: ${
|
|
2896
|
+
})), e.hasNotFound && (p.push(` ${s}: ${$(e.dir, "NotFound")},`), a.push({
|
|
2740
2897
|
relPath: i,
|
|
2741
2898
|
kind: "notFound",
|
|
2742
2899
|
slotKey: e.dir
|
|
2743
2900
|
}));
|
|
2744
2901
|
}
|
|
2745
|
-
for (let e of
|
|
2902
|
+
for (let e of d) a.push({
|
|
2746
2903
|
relPath: `../src/pages/${e.file}`,
|
|
2747
2904
|
kind: "page",
|
|
2748
2905
|
slotKey: e.pattern
|
|
2749
2906
|
});
|
|
2750
|
-
let
|
|
2907
|
+
let m = a.map((e) => ` ${JSON.stringify(e.relPath)},`), y = a.map((e, t) => {
|
|
2751
2908
|
let n = JSON.stringify(e.slotKey);
|
|
2752
2909
|
return e.kind === "page" ? ` if (newMods[${t}] && refs.pages[${n}] !== undefined) { refs.pages[${n}] = newMods[${t}]; changed = true }` : ` if (newMods[${t}]?.default) { refs.${e.kind === "layout" ? "layouts" : e.kind === "error" ? "errors" : e.kind === "pending" ? "pendings" : "notFounds"}[${n}] = newMods[${t}].default;${e.kind === "layout" ? ` refs.layoutLoaders[${n}] = newMods[${t}].loader;` : ""} changed = true }`;
|
|
2753
2910
|
}), x = t.locales ?? [], S = x.length > 0, C = t.defaultLocale ?? x[0] ?? "en";
|
|
@@ -2758,7 +2915,7 @@ import {
|
|
|
2758
2915
|
"import { useServerRequest } from '@voltro/web'",
|
|
2759
2916
|
...x.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
|
|
2760
2917
|
] : [];
|
|
2761
|
-
|
|
2918
|
+
v = [
|
|
2762
2919
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
2763
2920
|
"// Routes + per-page chain + not-found scopes assembled from src/pages/.",
|
|
2764
2921
|
"//",
|
|
@@ -2801,7 +2958,7 @@ import {
|
|
|
2801
2958
|
...l,
|
|
2802
2959
|
" },",
|
|
2803
2960
|
" pendings: {",
|
|
2804
|
-
...
|
|
2961
|
+
...u,
|
|
2805
2962
|
" },",
|
|
2806
2963
|
" notFounds: {",
|
|
2807
2964
|
...p,
|
|
@@ -2869,17 +3026,17 @@ import {
|
|
|
2869
3026
|
"if (import.meta.hot) {",
|
|
2870
3027
|
" import.meta.hot.accept(",
|
|
2871
3028
|
" [",
|
|
2872
|
-
...
|
|
3029
|
+
...m,
|
|
2873
3030
|
" ],",
|
|
2874
3031
|
" (newMods: Array<Record<string, unknown> | undefined>) => {",
|
|
2875
3032
|
" let changed = false",
|
|
2876
|
-
...
|
|
3033
|
+
...y,
|
|
2877
3034
|
" if (changed) bump()",
|
|
2878
3035
|
" },",
|
|
2879
3036
|
" )",
|
|
2880
3037
|
"}",
|
|
2881
3038
|
""
|
|
2882
|
-
].join("\n"),
|
|
3039
|
+
].join("\n"), _ = [
|
|
2883
3040
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
2884
3041
|
"// The app's root component. It exports `App` and NOTHING ELSE: react-refresh",
|
|
2885
3042
|
"// only accepts a module whose every export is a component, and a module it",
|
|
@@ -2945,20 +3102,20 @@ import {
|
|
|
2945
3102
|
] : [" return <Router routes={routes} notFounds={notFounds} />"],
|
|
2946
3103
|
"}",
|
|
2947
3104
|
""
|
|
2948
|
-
].join("\n"),
|
|
3105
|
+
].join("\n"), b = [
|
|
2949
3106
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
2950
3107
|
"// Entry: imports the generated App component and calls mount() with the",
|
|
2951
3108
|
"// resolved apis map. Side-effect only — no local component definitions —",
|
|
2952
3109
|
"// so downstream invalidations (user page edits) terminate at app.tsx.",
|
|
2953
3110
|
"",
|
|
2954
|
-
...
|
|
3111
|
+
...oi(t),
|
|
2955
3112
|
"import { mount } from '@voltro/web'",
|
|
2956
|
-
...
|
|
3113
|
+
...h,
|
|
2957
3114
|
"import { App } from './app'",
|
|
2958
3115
|
"import { preloadCurrentRoute } from './routeTable'",
|
|
2959
|
-
...
|
|
2960
|
-
...
|
|
2961
|
-
...
|
|
3116
|
+
...ii(t),
|
|
3117
|
+
...ni(t, s),
|
|
3118
|
+
...ai(t),
|
|
2962
3119
|
"",
|
|
2963
3120
|
"// Preload the current route's page chunk BEFORE hydration so the first",
|
|
2964
3121
|
"// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
|
|
@@ -2973,77 +3130,77 @@ import {
|
|
|
2973
3130
|
"",
|
|
2974
3131
|
"mount(App, {",
|
|
2975
3132
|
" apis: {",
|
|
2976
|
-
...
|
|
3133
|
+
...g,
|
|
2977
3134
|
" },",
|
|
2978
|
-
...
|
|
3135
|
+
...ri(t, s),
|
|
2979
3136
|
"})",
|
|
2980
3137
|
"",
|
|
2981
|
-
|
|
3138
|
+
bi
|
|
2982
3139
|
].join("\n");
|
|
2983
|
-
} else
|
|
3140
|
+
} else _ = "", v = "", b = [
|
|
2984
3141
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
2985
3142
|
"// The user's root component lives at ../src/App.tsx; this file imports it",
|
|
2986
3143
|
"// and calls mount(). Side-effect only, no component definitions, so the",
|
|
2987
3144
|
"// user's component file remains the Fast Refresh boundary.",
|
|
2988
3145
|
"",
|
|
2989
|
-
...
|
|
3146
|
+
...oi(t),
|
|
2990
3147
|
"import { mount } from '@voltro/web'",
|
|
2991
|
-
...
|
|
3148
|
+
...h,
|
|
2992
3149
|
"import App from '../src/App'",
|
|
2993
|
-
...
|
|
2994
|
-
...
|
|
2995
|
-
...
|
|
3150
|
+
...ii(t),
|
|
3151
|
+
...ni(t, s),
|
|
3152
|
+
...ai(t),
|
|
2996
3153
|
"",
|
|
2997
3154
|
"mount(App, {",
|
|
2998
3155
|
" apis: {",
|
|
2999
|
-
...
|
|
3156
|
+
...g,
|
|
3000
3157
|
" },",
|
|
3001
|
-
...
|
|
3158
|
+
...ri(t, s),
|
|
3002
3159
|
"})",
|
|
3003
3160
|
"",
|
|
3004
|
-
|
|
3161
|
+
bi
|
|
3005
3162
|
].join("\n");
|
|
3006
|
-
let
|
|
3007
|
-
await S.mkdir(
|
|
3008
|
-
let
|
|
3163
|
+
let x = r(e, ".framework");
|
|
3164
|
+
await S.mkdir(x, { recursive: !0 }), t.env ? await lt(x, i) : await S.rm(r(x, "env.public.ts"), { force: !0 }), await S.writeFile(r(x, "index.html"), l, "utf8"), await S.writeFile(r(x, "main.tsx"), b, "utf8"), _ ? (await S.writeFile(r(x, "app.tsx"), _, "utf8"), await S.writeFile(r(x, "routeTable.ts"), v, "utf8")) : (await S.rm(r(x, "app.tsx"), { force: !0 }), await S.rm(r(x, "routeTable.ts"), { force: !0 }));
|
|
3165
|
+
let C = r(e, ".gitignore"), w = "";
|
|
3009
3166
|
try {
|
|
3010
|
-
|
|
3167
|
+
w = await S.readFile(C, "utf8");
|
|
3011
3168
|
} catch {}
|
|
3012
|
-
let
|
|
3013
|
-
for (let e of
|
|
3014
|
-
await S.writeFile(
|
|
3015
|
-
},
|
|
3169
|
+
let T = ["/.framework/"], E = w.split("\n").filter((e) => e.trim() !== "");
|
|
3170
|
+
for (let e of T) E.includes(e) || E.push(e);
|
|
3171
|
+
await S.writeFile(C, E.join("\n") + "\n", "utf8");
|
|
3172
|
+
}, Ni = async (e, n) => {
|
|
3016
3173
|
try {
|
|
3017
3174
|
let i = r(t(e), "project.json");
|
|
3018
3175
|
if (!y(i)) return;
|
|
3019
3176
|
let a = await S.readFile(i, "utf8"), o = JSON.parse(a).apps ?? {}, s = e.split("/").filter(Boolean).pop() ?? "", c = [];
|
|
3020
3177
|
for (let [e, t] of Object.entries(o)) e !== s && t.port === n && c.push(e);
|
|
3021
3178
|
if (c.length === 0) return;
|
|
3022
|
-
|
|
3179
|
+
Q.warn("sibling app(s) claim the same port — only one boots", {
|
|
3023
3180
|
port: n,
|
|
3024
3181
|
conflicts: c,
|
|
3025
3182
|
projectJson: i
|
|
3026
3183
|
});
|
|
3027
3184
|
} catch {}
|
|
3028
|
-
},
|
|
3029
|
-
let t =
|
|
3185
|
+
}, Pi = (e) => r(e, ".framework", "dist", "server", "appConfig.js"), Fi = async (e) => {
|
|
3186
|
+
let t = Pi(e), n = y(t) ? t : r(e, "app.config.ts");
|
|
3030
3187
|
try {
|
|
3031
3188
|
let e = (await import(s(n).href)).default;
|
|
3032
3189
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
|
|
3033
3190
|
} catch {
|
|
3034
3191
|
return null;
|
|
3035
3192
|
}
|
|
3036
|
-
},
|
|
3037
|
-
let n = await
|
|
3193
|
+
}, Ii = async (t) => {
|
|
3194
|
+
let n = await Fi(t);
|
|
3038
3195
|
if (!n) return {
|
|
3039
3196
|
ran: !1,
|
|
3040
3197
|
exitCode: 0
|
|
3041
3198
|
};
|
|
3042
|
-
|
|
3043
|
-
let o =
|
|
3044
|
-
|
|
3045
|
-
let s = await
|
|
3046
|
-
for (let e of s)
|
|
3199
|
+
Hn();
|
|
3200
|
+
let o = sn();
|
|
3201
|
+
_n(o), Q.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" });
|
|
3202
|
+
let s = await ki(t, n);
|
|
3203
|
+
for (let e of s) Q.info("api wired", {
|
|
3047
3204
|
name: e.name,
|
|
3048
3205
|
pkg: e.pkg,
|
|
3049
3206
|
...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
|
|
@@ -3051,23 +3208,23 @@ import {
|
|
|
3051
3208
|
Be(t).then((e) => {
|
|
3052
3209
|
for (let t of e.files) if (t.action === "created") {
|
|
3053
3210
|
let e = t.path.split("/").pop() ?? t.path;
|
|
3054
|
-
|
|
3211
|
+
Q.info(`${e} seeded`, { path: t.path });
|
|
3055
3212
|
}
|
|
3056
3213
|
}).catch(() => {});
|
|
3057
|
-
let { resolved: c } = await
|
|
3214
|
+
let { resolved: c } = await ut({
|
|
3058
3215
|
rawEnv: n.env,
|
|
3059
3216
|
appType: "web",
|
|
3060
3217
|
root: t,
|
|
3061
|
-
log:
|
|
3218
|
+
log: Q,
|
|
3062
3219
|
generateTypes: !0
|
|
3063
3220
|
}), l = c.publicValues;
|
|
3064
|
-
await
|
|
3221
|
+
await Mi(t, n, s, l), Q.debug("generated framework entry files", { files: [
|
|
3065
3222
|
"index.html",
|
|
3066
3223
|
".framework/main.tsx",
|
|
3067
3224
|
...n.env ? [".framework/env.public.ts"] : []
|
|
3068
3225
|
] });
|
|
3069
|
-
let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f =
|
|
3070
|
-
await
|
|
3226
|
+
let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f = hr("web", d, u), p = Sr(d);
|
|
3227
|
+
await pr({
|
|
3071
3228
|
id: f,
|
|
3072
3229
|
name: d,
|
|
3073
3230
|
kind: "web",
|
|
@@ -3075,18 +3232,18 @@ import {
|
|
|
3075
3232
|
pid: process.pid,
|
|
3076
3233
|
status: "booting",
|
|
3077
3234
|
logFile: p.path
|
|
3078
|
-
}).catch(() => {}), await
|
|
3079
|
-
let { pages: m, dirs: h } = await
|
|
3235
|
+
}).catch(() => {}), await Ni(t, u);
|
|
3236
|
+
let { pages: m, dirs: h } = await gi(r(t, "src", "pages")), g = h.map((e) => ({
|
|
3080
3237
|
dir: e.dir,
|
|
3081
3238
|
hasLayout: e.hasLayout,
|
|
3082
3239
|
hasError: e.hasError,
|
|
3083
3240
|
hasPending: e.hasPending,
|
|
3084
3241
|
hasNotFound: e.hasNotFound
|
|
3085
|
-
})), v = await
|
|
3242
|
+
})), v = await Mt({
|
|
3086
3243
|
appRoot: t,
|
|
3087
3244
|
pages: m
|
|
3088
3245
|
});
|
|
3089
|
-
v.wrote &&
|
|
3246
|
+
v.wrote && Q.debug("routes codegen wrote", { path: i(t, v.path) });
|
|
3090
3247
|
let b = await Ge("vite", () => import("vite")), x = (await import("@vitejs/plugin-react")).default, C = (await import("@tailwindcss/vite")).default, w = r(t, ".framework"), T = r(t, "src"), E = /* @__PURE__ */ new Set([
|
|
3091
3248
|
".framework",
|
|
3092
3249
|
"node_modules",
|
|
@@ -3111,7 +3268,7 @@ import {
|
|
|
3111
3268
|
...i.devDependencies
|
|
3112
3269
|
});
|
|
3113
3270
|
await Promise.all(a.map(async (n) => {
|
|
3114
|
-
let i = await
|
|
3271
|
+
let i = await wi(t, n);
|
|
3115
3272
|
if (!i) return;
|
|
3116
3273
|
let a = r(i, "src");
|
|
3117
3274
|
try {
|
|
@@ -3123,17 +3280,17 @@ import {
|
|
|
3123
3280
|
}, D = r(t, "src", "pages"), te = (e) => e.endsWith(".tsx") && (e === D || e.startsWith(D + "/")), O = (e) => e === D || e.startsWith(D + "/"), k = async (e) => {
|
|
3124
3281
|
try {
|
|
3125
3282
|
let r = Date.now();
|
|
3126
|
-
await
|
|
3127
|
-
let { pages: i } = await
|
|
3128
|
-
await
|
|
3283
|
+
await Mi(t, n, s, l);
|
|
3284
|
+
let { pages: i } = await gi(D);
|
|
3285
|
+
await Mt({
|
|
3129
3286
|
appRoot: t,
|
|
3130
3287
|
pages: i
|
|
3131
|
-
}),
|
|
3288
|
+
}), Q.info("page tree regenerated", {
|
|
3132
3289
|
reason: e,
|
|
3133
3290
|
ms: Date.now() - r
|
|
3134
3291
|
});
|
|
3135
3292
|
} catch (t) {
|
|
3136
|
-
|
|
3293
|
+
Q.error("page tree regen failed", { reason: e }, t);
|
|
3137
3294
|
}
|
|
3138
3295
|
}, A = {
|
|
3139
3296
|
name: "framework:regenerate-on-page-tree-change",
|
|
@@ -3156,16 +3313,16 @@ import {
|
|
|
3156
3313
|
});
|
|
3157
3314
|
}
|
|
3158
3315
|
}, j = r(t, "app.config.ts"), M = (e) => {
|
|
3159
|
-
if (!
|
|
3316
|
+
if (!oe(e.env)) return "";
|
|
3160
3317
|
let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
|
|
3161
3318
|
return `${String(e.env.publicPrefix)}|${t.join(",")}`;
|
|
3162
|
-
},
|
|
3319
|
+
}, ne = (e, t) => {
|
|
3163
3320
|
let n = [];
|
|
3164
3321
|
return e.port !== t.port && n.push(`port ${e.port ?? "(default)"} → ${t.port ?? "(default)"}`), JSON.stringify(e.proxies) !== JSON.stringify(t.proxies) && n.push("proxies"), JSON.stringify(e.allowedHosts) !== JSON.stringify(t.allowedHosts) && n.push("allowedHosts"), JSON.stringify(e.apis) !== JSON.stringify(t.apis) && n.push("apis"), M(e) !== M(t) && n.push("env"), n;
|
|
3165
|
-
},
|
|
3322
|
+
}, N = n, re = a(j), P = {
|
|
3166
3323
|
name: "framework:watch-app-config",
|
|
3167
3324
|
async configureServer(n) {
|
|
3168
|
-
n.watcher.add(j),
|
|
3325
|
+
n.watcher.add(j), Q.info("watching app.config.ts for changes", { path: i(t, j) });
|
|
3169
3326
|
let r = async () => {
|
|
3170
3327
|
try {
|
|
3171
3328
|
try {
|
|
@@ -3173,9 +3330,9 @@ import {
|
|
|
3173
3330
|
e && n.moduleGraph.invalidateModule(e);
|
|
3174
3331
|
} catch {}
|
|
3175
3332
|
let e = (await n.ssrLoadModule(j, { fixStacktrace: !0 })).default;
|
|
3176
|
-
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (
|
|
3333
|
+
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Q.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
|
|
3177
3334
|
} catch (e) {
|
|
3178
|
-
return
|
|
3335
|
+
return Q.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
|
|
3179
3336
|
}
|
|
3180
3337
|
}, o = null, s = () => {
|
|
3181
3338
|
o && clearTimeout(o), o = setTimeout(() => {
|
|
@@ -3184,24 +3341,24 @@ import {
|
|
|
3184
3341
|
}, c = async () => {
|
|
3185
3342
|
let e = await r();
|
|
3186
3343
|
if (!e) {
|
|
3187
|
-
|
|
3344
|
+
Q.info("app.config.ts onConfigChange: load returned null — skipping");
|
|
3188
3345
|
return;
|
|
3189
3346
|
}
|
|
3190
|
-
if (
|
|
3347
|
+
if (Q.info("app.config.ts onConfigChange: loaded", {
|
|
3191
3348
|
theme: e.theme,
|
|
3192
3349
|
port: e.port,
|
|
3193
3350
|
name: e.name
|
|
3194
|
-
}), JSON.stringify(e) === JSON.stringify(
|
|
3195
|
-
|
|
3351
|
+
}), JSON.stringify(e) === JSON.stringify(N)) {
|
|
3352
|
+
Q.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
|
|
3196
3353
|
return;
|
|
3197
3354
|
}
|
|
3198
|
-
let i = N
|
|
3355
|
+
let i = ne(N, e);
|
|
3199
3356
|
if (i.length > 0) {
|
|
3200
|
-
|
|
3357
|
+
Q.warn("app.config.ts changed — hard restart required", { fields: i });
|
|
3201
3358
|
try {
|
|
3202
3359
|
await n.close();
|
|
3203
3360
|
} catch {}
|
|
3204
|
-
let e =
|
|
3361
|
+
let e = de(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
3205
3362
|
stdio: "inherit",
|
|
3206
3363
|
env: process.env,
|
|
3207
3364
|
cwd: process.cwd()
|
|
@@ -3211,45 +3368,45 @@ import {
|
|
|
3211
3368
|
process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
|
|
3212
3369
|
process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
|
|
3213
3370
|
}), e.on("error", (e) => {
|
|
3214
|
-
|
|
3371
|
+
Q.error("restart spawn failed", {}, e), process.exit(1);
|
|
3215
3372
|
});
|
|
3216
3373
|
return;
|
|
3217
3374
|
}
|
|
3218
3375
|
try {
|
|
3219
3376
|
let r = Date.now();
|
|
3220
|
-
await
|
|
3377
|
+
await Mi(t, e, await ki(t, e)), N = e, n.ws && n.ws.send({
|
|
3221
3378
|
type: "full-reload",
|
|
3222
3379
|
path: "*"
|
|
3223
|
-
}),
|
|
3380
|
+
}), Q.info("app.config.ts soft-regen", {
|
|
3224
3381
|
ms: Date.now() - r,
|
|
3225
3382
|
reload: "full"
|
|
3226
3383
|
});
|
|
3227
3384
|
} catch (e) {
|
|
3228
|
-
|
|
3385
|
+
Q.error("app.config.ts soft-regen failed", {}, e);
|
|
3229
3386
|
}
|
|
3230
|
-
}, l = (t) => e(t) === "app.config.ts" ? t === j || a(t) ===
|
|
3387
|
+
}, l = (t) => e(t) === "app.config.ts" ? t === j || a(t) === re : !1;
|
|
3231
3388
|
n.watcher.on("change", (e) => {
|
|
3232
|
-
l(e) && (
|
|
3389
|
+
l(e) && (Q.info("app.config.ts change event (chokidar)", { file: e }), s());
|
|
3233
3390
|
}), n.watcher.on("add", (e) => {
|
|
3234
|
-
l(e) && (
|
|
3391
|
+
l(e) && (Q.info("app.config.ts add event (chokidar)", { file: e }), s());
|
|
3235
3392
|
});
|
|
3236
3393
|
try {
|
|
3237
3394
|
let { watchFile: e } = await import("node:fs");
|
|
3238
3395
|
e(j, { interval: 500 }, (e, t) => {
|
|
3239
|
-
e.mtimeMs !== t.mtimeMs && (
|
|
3240
|
-
}),
|
|
3396
|
+
e.mtimeMs !== t.mtimeMs && (Q.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), s());
|
|
3397
|
+
}), Q.info("app.config.ts polling watcher attached", { intervalMs: 500 });
|
|
3241
3398
|
} catch (e) {
|
|
3242
|
-
|
|
3399
|
+
Q.warn("app.config.ts polling watcher could not attach", {}, e);
|
|
3243
3400
|
}
|
|
3244
|
-
|
|
3401
|
+
Bn(Ln, Q, {
|
|
3245
3402
|
root: t,
|
|
3246
3403
|
onBeforeRestart: () => n.close()
|
|
3247
3404
|
});
|
|
3248
3405
|
}
|
|
3249
|
-
},
|
|
3406
|
+
}, ie = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, F = {
|
|
3250
3407
|
name: "framework:suppress-api-hmr",
|
|
3251
3408
|
handleHotUpdate(e) {
|
|
3252
|
-
if (
|
|
3409
|
+
if (ie.test(e.file)) return [];
|
|
3253
3410
|
}
|
|
3254
3411
|
}, ae = {
|
|
3255
3412
|
name: "framework:reoptimize-on-rpcgroup-change",
|
|
@@ -3257,7 +3414,7 @@ import {
|
|
|
3257
3414
|
let n = /* @__PURE__ */ new Map();
|
|
3258
3415
|
for (let i of s) {
|
|
3259
3416
|
if (!i.proxyTarget) continue;
|
|
3260
|
-
let a = await
|
|
3417
|
+
let a = await wi(t, i.pkg);
|
|
3261
3418
|
if (!a) continue;
|
|
3262
3419
|
let o = r(a, "rpcGroup.generated.ts");
|
|
3263
3420
|
try {
|
|
@@ -3283,14 +3440,14 @@ import {
|
|
|
3283
3440
|
r !== t && (n.set(e, r), a = e);
|
|
3284
3441
|
}
|
|
3285
3442
|
if (a !== null) {
|
|
3286
|
-
c = !0,
|
|
3443
|
+
c = !0, Q.info(`rpcGroup changed (${i(t, a)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
|
|
3287
3444
|
try {
|
|
3288
3445
|
await S.rm(r(w, ".vite", "deps"), {
|
|
3289
3446
|
recursive: !0,
|
|
3290
3447
|
force: !0
|
|
3291
3448
|
}), await e.restart(!0);
|
|
3292
3449
|
} catch (e) {
|
|
3293
|
-
c = !1,
|
|
3450
|
+
c = !1, Q.error("rpcGroup re-optimize failed", {}, e);
|
|
3294
3451
|
}
|
|
3295
3452
|
}
|
|
3296
3453
|
}, u = (e) => {
|
|
@@ -3300,38 +3457,38 @@ import {
|
|
|
3300
3457
|
};
|
|
3301
3458
|
e.watcher.on("change", u), e.watcher.on("add", u);
|
|
3302
3459
|
}
|
|
3303
|
-
},
|
|
3460
|
+
}, I = {};
|
|
3304
3461
|
for (let e of s) {
|
|
3305
3462
|
if (!e.proxyTarget) continue;
|
|
3306
|
-
|
|
3463
|
+
I[e.browserWsUrl] = {
|
|
3307
3464
|
target: e.proxyTarget,
|
|
3308
3465
|
ws: !0,
|
|
3309
3466
|
changeOrigin: !0,
|
|
3310
3467
|
...e.wsPath ? {} : { rewrite: () => "/ws" }
|
|
3311
3468
|
};
|
|
3312
3469
|
let t = e.proxyTarget.replace(/^ws/, "http");
|
|
3313
|
-
|
|
3470
|
+
I[`/_voltro/api/${e.name}`] = {
|
|
3314
3471
|
target: t,
|
|
3315
3472
|
changeOrigin: !0,
|
|
3316
3473
|
rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), "")
|
|
3317
3474
|
};
|
|
3318
3475
|
}
|
|
3319
3476
|
for (let [e, t] of Object.entries(n.proxies ?? {})) {
|
|
3320
|
-
if (
|
|
3321
|
-
|
|
3477
|
+
if (I[e]) {
|
|
3478
|
+
Q.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
|
|
3322
3479
|
continue;
|
|
3323
3480
|
}
|
|
3324
|
-
|
|
3481
|
+
I[e] = {
|
|
3325
3482
|
target: t.target,
|
|
3326
3483
|
changeOrigin: t.changeOrigin ?? !0,
|
|
3327
3484
|
...t.rewrite === void 0 ? {} : { rewrite: (n) => n.replace(RegExp(`^${e}`), t.rewrite) }
|
|
3328
|
-
},
|
|
3485
|
+
}, Q.info(`proxy ${e} → ${t.target}`, {
|
|
3329
3486
|
prefix: e,
|
|
3330
3487
|
target: t.target,
|
|
3331
3488
|
...t.rewrite === void 0 ? {} : { rewrite: t.rewrite }
|
|
3332
3489
|
});
|
|
3333
3490
|
}
|
|
3334
|
-
let
|
|
3491
|
+
let se = {
|
|
3335
3492
|
name: "framework:inspect",
|
|
3336
3493
|
configureServer(e) {
|
|
3337
3494
|
let i = null, a = async () => {
|
|
@@ -3343,18 +3500,18 @@ import {
|
|
|
3343
3500
|
pattern: i.pattern,
|
|
3344
3501
|
file: i.file,
|
|
3345
3502
|
dirChain: i.dirChain,
|
|
3346
|
-
renderMode: a
|
|
3503
|
+
renderMode: nt(a, r("src", "pages", i.file)),
|
|
3347
3504
|
interactive: a.interactive ?? "full",
|
|
3348
3505
|
tenantAware: a.tenantAware === !0,
|
|
3349
|
-
revalidateMs:
|
|
3350
|
-
staleWhileRevalidateMs:
|
|
3506
|
+
revalidateMs: qe(a.revalidate),
|
|
3507
|
+
staleWhileRevalidateMs: qe(a.staleWhileRevalidate) ?? 0,
|
|
3351
3508
|
cacheInvalidatesOn: Array.isArray(a.cacheInvalidatesOn) ? a.cacheInvalidatesOn : [],
|
|
3352
3509
|
hasLoader: typeof a.loader == "function",
|
|
3353
3510
|
hasMeta: a.meta != null,
|
|
3354
3511
|
hasGetStaticPaths: typeof a.getStaticPaths == "function"
|
|
3355
3512
|
});
|
|
3356
3513
|
} catch (e) {
|
|
3357
|
-
|
|
3514
|
+
Q.warn("inspect: failed to load page metadata", { pattern: i.pattern }, e);
|
|
3358
3515
|
}
|
|
3359
3516
|
return i = n, n;
|
|
3360
3517
|
};
|
|
@@ -3452,22 +3609,22 @@ import {
|
|
|
3452
3609
|
for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (s[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
|
|
3453
3610
|
let c = i.split("?")[0];
|
|
3454
3611
|
if (e.method === "GET" && (c === "/_voltro/inspect/logs" || i.startsWith("/_voltro/inspect/logs?"))) {
|
|
3455
|
-
let e =
|
|
3456
|
-
if (
|
|
3612
|
+
let e = K(s.origin);
|
|
3613
|
+
if (U()) {
|
|
3457
3614
|
t.statusCode = 503, t.setHeader("content-type", "application/json");
|
|
3458
3615
|
for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
|
|
3459
3616
|
t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
3460
3617
|
return;
|
|
3461
3618
|
}
|
|
3462
|
-
let n =
|
|
3619
|
+
let n = An(i, hn());
|
|
3463
3620
|
t.statusCode = n.status, t.setHeader("content-type", n.contentType);
|
|
3464
3621
|
for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
|
|
3465
3622
|
t.end(n.body);
|
|
3466
3623
|
return;
|
|
3467
3624
|
}
|
|
3468
3625
|
if (e.method === "POST" && c === "/_voltro/inspect/clientLog") {
|
|
3469
|
-
let n =
|
|
3470
|
-
if (
|
|
3626
|
+
let n = K(s.origin);
|
|
3627
|
+
if (U()) {
|
|
3471
3628
|
t.statusCode = 503, t.setHeader("content-type", "application/json");
|
|
3472
3629
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3473
3630
|
t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
@@ -3477,7 +3634,7 @@ import {
|
|
|
3477
3634
|
e.setEncoding("utf-8"), e.on("data", (e) => {
|
|
3478
3635
|
r += e;
|
|
3479
3636
|
}), e.on("end", () => {
|
|
3480
|
-
let e =
|
|
3637
|
+
let e = wn(r, o);
|
|
3481
3638
|
t.statusCode = e.status, t.setHeader("content-type", e.contentType);
|
|
3482
3639
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3483
3640
|
t.end(e.body);
|
|
@@ -3487,14 +3644,14 @@ import {
|
|
|
3487
3644
|
return;
|
|
3488
3645
|
}
|
|
3489
3646
|
if (c === "/_voltro/inspect/stream") {
|
|
3490
|
-
let n =
|
|
3491
|
-
if (
|
|
3647
|
+
let n = K(s.origin);
|
|
3648
|
+
if (U()) {
|
|
3492
3649
|
t.statusCode = 503, t.setHeader("content-type", "application/json");
|
|
3493
3650
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3494
3651
|
t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
3495
3652
|
return;
|
|
3496
3653
|
}
|
|
3497
|
-
let r =
|
|
3654
|
+
let r = W(s);
|
|
3498
3655
|
if (!r.ok) {
|
|
3499
3656
|
t.statusCode = 401, t.setHeader("content-type", "application/json");
|
|
3500
3657
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
@@ -3508,14 +3665,14 @@ import {
|
|
|
3508
3665
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3509
3666
|
t.flushHeaders?.(), t.write("retry: 5000\n\n");
|
|
3510
3667
|
let a = i.indexOf("?");
|
|
3511
|
-
if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(
|
|
3668
|
+
if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(cn(e));
|
|
3512
3669
|
let c = o.subscribe((e) => {
|
|
3513
3670
|
try {
|
|
3514
|
-
t.write(
|
|
3671
|
+
t.write(cn(e));
|
|
3515
3672
|
} catch {}
|
|
3516
3673
|
}), l = setInterval(() => {
|
|
3517
3674
|
try {
|
|
3518
|
-
t.write(
|
|
3675
|
+
t.write(ln());
|
|
3519
3676
|
} catch {}
|
|
3520
3677
|
}, 15e3), u = () => {
|
|
3521
3678
|
clearInterval(l), c();
|
|
@@ -3524,11 +3681,11 @@ import {
|
|
|
3524
3681
|
return;
|
|
3525
3682
|
}
|
|
3526
3683
|
try {
|
|
3527
|
-
let o =
|
|
3684
|
+
let o = Vt(i, {
|
|
3528
3685
|
kind: "web",
|
|
3529
3686
|
meta: {
|
|
3530
3687
|
name: n.name ?? "(unnamed)",
|
|
3531
|
-
voltroVersion:
|
|
3688
|
+
voltroVersion: ei,
|
|
3532
3689
|
port: u,
|
|
3533
3690
|
mode: "dev",
|
|
3534
3691
|
apis: Object.entries(n.apis ?? {}).map(([e, t]) => {
|
|
@@ -3546,7 +3703,7 @@ import {
|
|
|
3546
3703
|
size: 0,
|
|
3547
3704
|
entries: []
|
|
3548
3705
|
}),
|
|
3549
|
-
env: () =>
|
|
3706
|
+
env: () => Pt(n.name ?? "app", { contract: oe(n.env) ? n.env : void 0 })
|
|
3550
3707
|
}, s, { method: e.method ?? "GET" });
|
|
3551
3708
|
if (o === null) return r();
|
|
3552
3709
|
t.statusCode = o.status, t.setHeader("content-type", o.contentType);
|
|
@@ -3557,25 +3714,25 @@ import {
|
|
|
3557
3714
|
}
|
|
3558
3715
|
});
|
|
3559
3716
|
}
|
|
3560
|
-
},
|
|
3717
|
+
}, ce = n.name === "voltroDashboard" ? {
|
|
3561
3718
|
name: "framework:dashboard-registry",
|
|
3562
3719
|
configureServer(e) {
|
|
3563
3720
|
e.middlewares.use(async (e, t, n) => {
|
|
3564
3721
|
if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
|
|
3565
3722
|
try {
|
|
3566
|
-
let e = await
|
|
3723
|
+
let e = await fr();
|
|
3567
3724
|
t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
|
|
3568
3725
|
} catch (e) {
|
|
3569
3726
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
|
|
3570
3727
|
}
|
|
3571
3728
|
});
|
|
3572
3729
|
}
|
|
3573
|
-
} : null,
|
|
3574
|
-
limit:
|
|
3575
|
-
onColdStart: (e) =>
|
|
3576
|
-
onColdEnd: (e) =>
|
|
3730
|
+
} : null, le = Si(m), fe = /* @__PURE__ */ new Set(), L = bt(), pe = St({
|
|
3731
|
+
limit: L,
|
|
3732
|
+
onColdStart: (e) => Q.debug("ssr cold-compile start", { id: e }),
|
|
3733
|
+
onColdEnd: (e) => Q.debug("ssr cold-compile end", { id: e })
|
|
3577
3734
|
});
|
|
3578
|
-
|
|
3735
|
+
Q.debug(`ssr cold-compile concurrency ${L}`, { concurrency: L });
|
|
3579
3736
|
let me = null, he = async () => (me === null && (me = await S.readFile(r(t, ".framework", "index.html"), "utf8")), me), ge = {
|
|
3580
3737
|
name: "framework:ssr",
|
|
3581
3738
|
configureServer(e) {
|
|
@@ -3584,10 +3741,10 @@ import {
|
|
|
3584
3741
|
if (i.method !== "GET" && i.method !== "HEAD") return o();
|
|
3585
3742
|
let c = i.url ?? "/", l = c.indexOf("?"), u = (l === -1 ? c : c.slice(0, l)) || "/";
|
|
3586
3743
|
if (u.startsWith("/@") || u.startsWith("/node_modules/") || u.startsWith("/.framework/") || u.startsWith("/_voltro/") || u === "/main.tsx" || u === "/index.html" || u === "/sw.js" || u === "/favicon.ico" || u === "/robots.txt" || /\.[a-z0-9]+$/i.test(u)) return o();
|
|
3587
|
-
let d =
|
|
3744
|
+
let d = Ci(u, le);
|
|
3588
3745
|
if (!d) return o();
|
|
3589
|
-
let f = !
|
|
3590
|
-
f &&
|
|
3746
|
+
let f = !fe.has(d.route.pattern), p = Date.now();
|
|
3747
|
+
f && Q.info(`ssr compiling ${d.route.pattern}`, {
|
|
3591
3748
|
pattern: d.route.pattern,
|
|
3592
3749
|
pathname: u
|
|
3593
3750
|
});
|
|
@@ -3606,15 +3763,15 @@ import {
|
|
|
3606
3763
|
}
|
|
3607
3764
|
};
|
|
3608
3765
|
try {
|
|
3609
|
-
let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = l
|
|
3766
|
+
let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = nt(l, r("src", "pages", d.route.file)), y = _i(h, d.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
|
|
3610
3767
|
if (v !== "ssr" && v !== "isr" && !b) return o();
|
|
3611
3768
|
let x = {};
|
|
3612
3769
|
for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ? x[e] = t : Array.isArray(t) && (x[e] = t.join(", "));
|
|
3613
|
-
let S =
|
|
3770
|
+
let S = ji(Ai(s[0]), x.cookie), C = new AbortController(), w = () => C.abort();
|
|
3614
3771
|
a.once("close", w);
|
|
3615
3772
|
let T = null, E = [], ee = {};
|
|
3616
3773
|
try {
|
|
3617
|
-
({chain: E, segmentLoaderData: ee} = await g("loadChain", () =>
|
|
3774
|
+
({chain: E, segmentLoaderData: ee} = await g("loadChain", () => vi({
|
|
3618
3775
|
entries: y,
|
|
3619
3776
|
loadLayout: (e) => n(r(t, "src", "pages", e.dir, "layout.tsx")),
|
|
3620
3777
|
loadError: (e) => n(r(t, "src", "pages", e.dir, "error.tsx")),
|
|
@@ -3651,15 +3808,28 @@ import {
|
|
|
3651
3808
|
cookies: D.parseCookieHeader(x.cookie),
|
|
3652
3809
|
headers: x,
|
|
3653
3810
|
url: c
|
|
3654
|
-
}, k = l.interactive ?? "full", A = b ?
|
|
3811
|
+
}, k = l.interactive ?? "full", A = b ? Vr({
|
|
3655
3812
|
helpers: D,
|
|
3656
3813
|
page: `src/pages/${d.route.file}`,
|
|
3814
|
+
interactive: k,
|
|
3815
|
+
delivery: "stream",
|
|
3816
|
+
renderInput: {
|
|
3817
|
+
descriptor: te,
|
|
3818
|
+
params: d.params,
|
|
3819
|
+
pathname: u,
|
|
3820
|
+
segmentLoaderData: ee,
|
|
3821
|
+
requestContext: O
|
|
3822
|
+
}
|
|
3823
|
+
}) : null, j = b ? null : Br({
|
|
3824
|
+
helpers: D,
|
|
3825
|
+
page: `src/pages/${d.route.file}`,
|
|
3826
|
+
pathname: u,
|
|
3657
3827
|
renderMode: v,
|
|
3658
3828
|
interactive: k,
|
|
3659
3829
|
loaderData: T,
|
|
3660
3830
|
segmentLoaderData: ee,
|
|
3661
3831
|
pageLoaderRan: typeof l.loader == "function"
|
|
3662
|
-
}),
|
|
3832
|
+
}), M = [];
|
|
3663
3833
|
await g("collectCss", async () => {
|
|
3664
3834
|
let e = /* @__PURE__ */ new Set(), n = [
|
|
3665
3835
|
r(t, "src", "pages", d.route.file),
|
|
@@ -3670,48 +3840,69 @@ import {
|
|
|
3670
3840
|
]),
|
|
3671
3841
|
r(t, ".framework", "main.tsx")
|
|
3672
3842
|
];
|
|
3673
|
-
for (let t of n) await _(t, e,
|
|
3843
|
+
for (let t of n) await _(t, e, M);
|
|
3674
3844
|
});
|
|
3675
|
-
let
|
|
3676
|
-
if (
|
|
3677
|
-
let e =
|
|
3845
|
+
let ne = await g("readShell", he), N = await g("transformShell", () => e.transformIndexHtml(c, ne)), re = M.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), P = O.cookies["voltro:locale"] ?? "en", ie = Date.now();
|
|
3846
|
+
if (A) {
|
|
3847
|
+
let e = (e) => Ur({
|
|
3678
3848
|
helpers: D,
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
|
|
3849
|
+
prepared: A,
|
|
3850
|
+
meta: e,
|
|
3851
|
+
interactive: k,
|
|
3852
|
+
extra: [re]
|
|
3853
|
+
});
|
|
3854
|
+
if (A.hasDeferred) Qr({
|
|
3855
|
+
res: a,
|
|
3856
|
+
shell: Xr({
|
|
3857
|
+
shell: N,
|
|
3858
|
+
inlineModuleScriptsAsync: !0
|
|
3859
|
+
}),
|
|
3860
|
+
htmlLang: P,
|
|
3861
|
+
headers: {
|
|
3862
|
+
"content-type": "text/html; charset=utf-8",
|
|
3863
|
+
"x-voltro-rendered-by": "spa-shell-dev"
|
|
3864
|
+
},
|
|
3865
|
+
headInjection: e,
|
|
3866
|
+
render: (e) => D.renderPageToStream({
|
|
3867
|
+
...A.renderInput,
|
|
3868
|
+
...e
|
|
3869
|
+
}),
|
|
3870
|
+
onShellError: (e) => {
|
|
3871
|
+
Q.warn("spa-shell-dev shell render failed; falling back to SPA shell", {
|
|
3872
|
+
pathname: u,
|
|
3873
|
+
pattern: d.route.pattern
|
|
3874
|
+
}, e), o();
|
|
3685
3875
|
}
|
|
3686
|
-
})
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3691
|
-
|
|
3692
|
-
|
|
3693
|
-
|
|
3876
|
+
});
|
|
3877
|
+
else {
|
|
3878
|
+
let t = Hr({
|
|
3879
|
+
helpers: D,
|
|
3880
|
+
prepared: A
|
|
3881
|
+
}), n = N.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`).replace("</head>", ` ${e(t.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${P}"`);
|
|
3882
|
+
a.statusCode = 200, a.setHeader("content-type", "text/html; charset=utf-8"), a.setHeader("x-voltro-rendered-by", "spa-shell-dev"), a.end(n);
|
|
3883
|
+
}
|
|
3884
|
+
} else if (j) {
|
|
3694
3885
|
let e = (e) => [
|
|
3695
|
-
|
|
3886
|
+
re,
|
|
3696
3887
|
D.renderMetaToHtml(e),
|
|
3697
3888
|
`<meta name="voltro-interactive" content="${k}" />`,
|
|
3698
|
-
...
|
|
3699
|
-
D.renderRouterStateScript(
|
|
3889
|
+
...j.hasDeferred ? [D.renderDeferredRegistryScript()] : [],
|
|
3890
|
+
D.renderRouterStateScript(j.stateInput)
|
|
3700
3891
|
].filter((e) => e.length > 0).join("\n "), t = {
|
|
3701
3892
|
descriptor: te,
|
|
3702
3893
|
params: d.params,
|
|
3703
3894
|
pathname: u,
|
|
3704
|
-
loaderData:
|
|
3705
|
-
segmentLoaderData:
|
|
3895
|
+
loaderData: j.loaderData,
|
|
3896
|
+
segmentLoaderData: j.segmentLoaderData,
|
|
3706
3897
|
requestContext: O
|
|
3707
3898
|
};
|
|
3708
|
-
if (v === "ssr" && k === "full")
|
|
3899
|
+
if (v === "ssr" && k === "full") Qr({
|
|
3709
3900
|
res: a,
|
|
3710
|
-
shell:
|
|
3901
|
+
shell: Xr({
|
|
3711
3902
|
shell: N,
|
|
3712
3903
|
inlineModuleScriptsAsync: !0
|
|
3713
3904
|
}),
|
|
3714
|
-
htmlLang:
|
|
3905
|
+
htmlLang: P,
|
|
3715
3906
|
headers: {
|
|
3716
3907
|
"content-type": "text/html; charset=utf-8",
|
|
3717
3908
|
"x-voltro-rendered-by": "ssr-dev"
|
|
@@ -3722,58 +3913,58 @@ import {
|
|
|
3722
3913
|
...e
|
|
3723
3914
|
}),
|
|
3724
3915
|
onShellError: (e) => {
|
|
3725
|
-
|
|
3916
|
+
Q.warn("ssr-dev shell render failed; falling back to SPA shell", {
|
|
3726
3917
|
pathname: u,
|
|
3727
3918
|
pattern: d.route.pattern
|
|
3728
3919
|
}, e), o();
|
|
3729
3920
|
}
|
|
3730
3921
|
});
|
|
3731
3922
|
else {
|
|
3732
|
-
let { html: n, meta: r } = D.renderPageToHtml(t), i = N.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${
|
|
3923
|
+
let { html: n, meta: r } = D.renderPageToHtml(t), i = N.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${P}"`);
|
|
3733
3924
|
a.statusCode = 200, a.setHeader("content-type", "text/html; charset=utf-8"), a.setHeader("x-voltro-rendered-by", "ssr-dev"), a.end(i);
|
|
3734
3925
|
}
|
|
3735
3926
|
}
|
|
3736
|
-
m.render = Date.now() -
|
|
3737
|
-
let
|
|
3738
|
-
f ? (
|
|
3927
|
+
m.render = Date.now() - ie;
|
|
3928
|
+
let F = Date.now() - p;
|
|
3929
|
+
f ? (fe.add(d.route.pattern), Q.info(`ssr compiled ${d.route.pattern} in ${F}ms`, {
|
|
3739
3930
|
pattern: d.route.pattern,
|
|
3740
3931
|
pathname: u,
|
|
3741
|
-
elapsedMs:
|
|
3932
|
+
elapsedMs: F,
|
|
3742
3933
|
cold: !0,
|
|
3743
3934
|
phases: m
|
|
3744
|
-
})) :
|
|
3935
|
+
})) : F > 200 && Q.info(`ssr rendered ${u} in ${F}ms`, {
|
|
3745
3936
|
pattern: d.route.pattern,
|
|
3746
3937
|
pathname: u,
|
|
3747
|
-
elapsedMs:
|
|
3938
|
+
elapsedMs: F,
|
|
3748
3939
|
cold: !1,
|
|
3749
3940
|
phases: m
|
|
3750
3941
|
});
|
|
3751
3942
|
} catch (e) {
|
|
3752
|
-
if (
|
|
3753
|
-
|
|
3943
|
+
if (zr(e)) {
|
|
3944
|
+
Q.error("ssr-dev render refused", {
|
|
3754
3945
|
pathname: u,
|
|
3755
3946
|
pattern: d.route.pattern
|
|
3756
3947
|
}, e), a.statusCode = 500, a.setHeader("content-type", "text/plain; charset=utf-8"), a.end(e.message);
|
|
3757
3948
|
return;
|
|
3758
3949
|
}
|
|
3759
|
-
|
|
3950
|
+
Q.warn("ssr-dev render failed; falling back to SPA shell", {
|
|
3760
3951
|
pathname: u,
|
|
3761
3952
|
pattern: d.route.pattern
|
|
3762
3953
|
}, e), o();
|
|
3763
3954
|
}
|
|
3764
3955
|
});
|
|
3765
3956
|
}
|
|
3766
|
-
},
|
|
3957
|
+
}, R = Date.now(), _e = b.version ?? "?", ve = await ti(), ye = r(t, "node_modules", "@voltro", "ui-shadcn"), z = y(r(ye, "package.json")) ? ye : null, be = [], xe = await (async () => {
|
|
3767
3958
|
let e = [];
|
|
3768
3959
|
for (let n of s) {
|
|
3769
3960
|
if (!n.proxyTarget) continue;
|
|
3770
|
-
let i = await
|
|
3961
|
+
let i = await wi(t, n.pkg);
|
|
3771
3962
|
if (i) try {
|
|
3772
3963
|
e.push(await S.readFile(r(i, "rpcGroup.generated.ts"), "utf8"));
|
|
3773
3964
|
} catch {}
|
|
3774
3965
|
}
|
|
3775
3966
|
if (e.length === 0) return !1;
|
|
3776
|
-
let n =
|
|
3967
|
+
let n = ue("sha1").update(e.join("\0")).digest("hex"), i = r(w, ".voltro-rpcgroup-optimize"), a = "";
|
|
3777
3968
|
try {
|
|
3778
3969
|
a = (await S.readFile(i, "utf8")).trim();
|
|
3779
3970
|
} catch {}
|
|
@@ -3783,83 +3974,83 @@ import {
|
|
|
3783
3974
|
} catch {}
|
|
3784
3975
|
return !0;
|
|
3785
3976
|
})();
|
|
3786
|
-
|
|
3977
|
+
xe && Q.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await b.createServer({
|
|
3787
3978
|
root: w,
|
|
3788
3979
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3789
3980
|
ssr: { noExternal: ["react-intl"] },
|
|
3790
3981
|
resolve: {
|
|
3791
3982
|
dedupe: ["react", "react-dom"],
|
|
3792
3983
|
alias: [
|
|
3793
|
-
...
|
|
3984
|
+
...ve ? [{
|
|
3794
3985
|
find: "@voltro/devtools/styles.css",
|
|
3795
|
-
replacement: r(
|
|
3986
|
+
replacement: r(ve, "src/styles.css")
|
|
3796
3987
|
}, {
|
|
3797
3988
|
find: "@voltro/devtools",
|
|
3798
|
-
replacement: r(
|
|
3989
|
+
replacement: r(ve, "src/index.ts")
|
|
3799
3990
|
}] : [],
|
|
3800
|
-
...
|
|
3991
|
+
...z ? [
|
|
3801
3992
|
{
|
|
3802
3993
|
find: "@voltro/ui-shadcn/tokens.css",
|
|
3803
|
-
replacement: r(
|
|
3994
|
+
replacement: r(z, "src/tokens.css")
|
|
3804
3995
|
},
|
|
3805
3996
|
{
|
|
3806
3997
|
find: "@voltro/ui-shadcn/cn",
|
|
3807
|
-
replacement: r(
|
|
3998
|
+
replacement: r(z, "src/cn.ts")
|
|
3808
3999
|
},
|
|
3809
4000
|
{
|
|
3810
4001
|
find: "@voltro/ui-shadcn/brand",
|
|
3811
|
-
replacement: r(
|
|
4002
|
+
replacement: r(z, "src/brand/voltroLogo.tsx")
|
|
3812
4003
|
},
|
|
3813
4004
|
{
|
|
3814
4005
|
find: "@voltro/ui-shadcn",
|
|
3815
|
-
replacement: r(
|
|
4006
|
+
replacement: r(z, "src/index.ts")
|
|
3816
4007
|
}
|
|
3817
4008
|
] : [],
|
|
3818
4009
|
...Ue(t)
|
|
3819
4010
|
]
|
|
3820
4011
|
},
|
|
3821
4012
|
optimizeDeps: {
|
|
3822
|
-
include: [...s.map((e) => `${e.pkg}/rpcGroup`), ...
|
|
3823
|
-
force:
|
|
4013
|
+
include: [...s.map((e) => `${e.pkg}/rpcGroup`), ...be],
|
|
4014
|
+
force: xe
|
|
3824
4015
|
},
|
|
3825
|
-
customLogger:
|
|
4016
|
+
customLogger: yt(),
|
|
3826
4017
|
plugins: [
|
|
3827
|
-
|
|
4018
|
+
$n(r(t, "src", "pages")),
|
|
3828
4019
|
x(),
|
|
3829
4020
|
C(),
|
|
3830
4021
|
ee,
|
|
3831
4022
|
A,
|
|
3832
|
-
|
|
3833
|
-
|
|
4023
|
+
P,
|
|
4024
|
+
F,
|
|
3834
4025
|
ae,
|
|
3835
|
-
|
|
4026
|
+
se,
|
|
3836
4027
|
ge,
|
|
3837
|
-
...
|
|
4028
|
+
...ce ? [ce] : []
|
|
3838
4029
|
],
|
|
3839
4030
|
server: {
|
|
3840
4031
|
port: u,
|
|
3841
4032
|
strictPort: !0,
|
|
3842
4033
|
host: !0,
|
|
3843
4034
|
allowedHosts: n.allowedHosts === !0 || [...n.allowedHosts ?? []],
|
|
3844
|
-
proxy:
|
|
3845
|
-
fs: { allow: [t, ...
|
|
4035
|
+
proxy: I,
|
|
4036
|
+
fs: { allow: [t, ...si(t)] }
|
|
3846
4037
|
},
|
|
3847
4038
|
appType: "spa",
|
|
3848
4039
|
cacheDir: r(w, ".vite"),
|
|
3849
4040
|
publicDir: r(t, "public")
|
|
3850
|
-
})).listen(),
|
|
3851
|
-
version:
|
|
3852
|
-
bootMs: Date.now() -
|
|
3853
|
-
}),
|
|
4041
|
+
})).listen(), $r.info(`v${_e} ready in ${Date.now() - R}ms`, {
|
|
4042
|
+
version: _e,
|
|
4043
|
+
bootMs: Date.now() - R
|
|
4044
|
+
}), Q.info(`listening on http://localhost:${u}`, {
|
|
3854
4045
|
port: u,
|
|
3855
4046
|
app: n.name ?? "(unnamed)"
|
|
3856
4047
|
});
|
|
3857
|
-
for (let e of s) e.proxyTarget && (
|
|
4048
|
+
for (let e of s) e.proxyTarget && (Q.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
|
|
3858
4049
|
api: e.name,
|
|
3859
4050
|
target: e.proxyTarget
|
|
3860
|
-
}),
|
|
4051
|
+
}), Q.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
|
|
3861
4052
|
try {
|
|
3862
|
-
await
|
|
4053
|
+
await pr({
|
|
3863
4054
|
id: f,
|
|
3864
4055
|
name: d,
|
|
3865
4056
|
kind: "web",
|
|
@@ -3868,13 +4059,13 @@ import {
|
|
|
3868
4059
|
status: "live",
|
|
3869
4060
|
logFile: p.path
|
|
3870
4061
|
});
|
|
3871
|
-
let e =
|
|
4062
|
+
let e = Dr(t);
|
|
3872
4063
|
if (e) {
|
|
3873
|
-
let t = await
|
|
3874
|
-
t.status === "launched" ?
|
|
4064
|
+
let t = await Lr({ dashboardAppPath: e });
|
|
4065
|
+
t.status === "launched" ? Q.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Q.debug(`dashboard already running on :${t.port}`, { port: t.port });
|
|
3875
4066
|
}
|
|
3876
4067
|
setInterval(() => {
|
|
3877
|
-
|
|
4068
|
+
pr({
|
|
3878
4069
|
id: f,
|
|
3879
4070
|
name: d,
|
|
3880
4071
|
kind: "web",
|
|
@@ -3885,50 +4076,50 @@ import {
|
|
|
3885
4076
|
}).catch(() => {});
|
|
3886
4077
|
}, 1e4).unref();
|
|
3887
4078
|
let n = () => {
|
|
3888
|
-
|
|
4079
|
+
mr(f), p.dispose();
|
|
3889
4080
|
};
|
|
3890
4081
|
process.on("SIGINT", n), process.on("SIGTERM", n);
|
|
3891
4082
|
} catch (e) {
|
|
3892
|
-
|
|
4083
|
+
Q.warn("runtime-registry write failed", {}, e);
|
|
3893
4084
|
}
|
|
3894
4085
|
return _({
|
|
3895
4086
|
app: n.name ?? "unnamed",
|
|
3896
4087
|
kind: "web",
|
|
3897
4088
|
url: `http://localhost:${u}`,
|
|
3898
|
-
bootMs: Date.now() -
|
|
4089
|
+
bootMs: Date.now() - R
|
|
3899
4090
|
}), new Promise(() => {});
|
|
3900
|
-
},
|
|
4091
|
+
}, Li = async (e) => {
|
|
3901
4092
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
3902
|
-
let t = await
|
|
4093
|
+
let t = await Fi(e);
|
|
3903
4094
|
if (!t) return {
|
|
3904
4095
|
ran: !1,
|
|
3905
4096
|
exitCode: 0
|
|
3906
4097
|
};
|
|
3907
|
-
let n = Date.now(), i =
|
|
4098
|
+
let n = Date.now(), i = Q.child("serve");
|
|
3908
4099
|
i.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
|
|
3909
|
-
let a = await
|
|
4100
|
+
let a = await ki(e, t);
|
|
3910
4101
|
for (let e of a) i.info("api wired", {
|
|
3911
4102
|
name: e.name,
|
|
3912
4103
|
pkg: e.pkg
|
|
3913
4104
|
});
|
|
3914
|
-
await
|
|
4105
|
+
await Mi(e, t, a);
|
|
3915
4106
|
{
|
|
3916
|
-
let { pages: t } = await
|
|
3917
|
-
await
|
|
4107
|
+
let { pages: t } = await gi(r(e, "src", "pages"));
|
|
4108
|
+
await Mt({
|
|
3918
4109
|
appRoot: e,
|
|
3919
4110
|
pages: t
|
|
3920
4111
|
});
|
|
3921
4112
|
}
|
|
3922
4113
|
let o = t.port ?? 5173, s = await Ge("vite", () => import("vite")), c = (await import("@vitejs/plugin-react")).default, l = r(e, ".framework");
|
|
3923
|
-
|
|
4114
|
+
Q.info("running production build"), await s.build({
|
|
3924
4115
|
root: l,
|
|
3925
4116
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3926
4117
|
plugins: [c()],
|
|
3927
|
-
customLogger:
|
|
4118
|
+
customLogger: yt(),
|
|
3928
4119
|
resolve: { dedupe: ["react", "react-dom"] },
|
|
3929
4120
|
build: {
|
|
3930
4121
|
outDir: "dist",
|
|
3931
|
-
rollupOptions: { output: { manualChunks:
|
|
4122
|
+
rollupOptions: { output: { manualChunks: ui } }
|
|
3932
4123
|
},
|
|
3933
4124
|
publicDir: r(e, "public")
|
|
3934
4125
|
});
|
|
@@ -3948,14 +4139,14 @@ import {
|
|
|
3948
4139
|
extras: f,
|
|
3949
4140
|
bootMs: Date.now() - n
|
|
3950
4141
|
}), new Promise(() => {});
|
|
3951
|
-
},
|
|
4142
|
+
}, Ri = 5e3, zi = 6e4, Bi = (e, t) => {
|
|
3952
4143
|
if (e.length === 0) return 0;
|
|
3953
4144
|
if (e.length === 1) return e[0];
|
|
3954
4145
|
let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
|
|
3955
4146
|
if (r === i) return e[r];
|
|
3956
4147
|
let a = n - r;
|
|
3957
4148
|
return e[r] * (1 - a) + e[i] * a;
|
|
3958
|
-
},
|
|
4149
|
+
}, Vi = (e) => {
|
|
3959
4150
|
if (e.length === 0) return {
|
|
3960
4151
|
p50: 0,
|
|
3961
4152
|
p95: 0,
|
|
@@ -3967,15 +4158,15 @@ import {
|
|
|
3967
4158
|
let t = e.slice().sort((e, t) => e - t), n = 0;
|
|
3968
4159
|
for (let e of t) n += e;
|
|
3969
4160
|
return {
|
|
3970
|
-
p50:
|
|
3971
|
-
p95:
|
|
3972
|
-
p99:
|
|
4161
|
+
p50: Bi(t, .5),
|
|
4162
|
+
p95: Bi(t, .95),
|
|
4163
|
+
p99: Bi(t, .99),
|
|
3973
4164
|
mean: n / t.length,
|
|
3974
4165
|
min: t[0],
|
|
3975
4166
|
max: t[t.length - 1]
|
|
3976
4167
|
};
|
|
3977
|
-
},
|
|
3978
|
-
let t = e.maxSamples ??
|
|
4168
|
+
}, Hi = (e = {}) => {
|
|
4169
|
+
let t = e.maxSamples ?? Ri, n = e.defaultWindowMs ?? zi, r = [];
|
|
3979
4170
|
return {
|
|
3980
4171
|
record(e) {
|
|
3981
4172
|
A(e), r.push({
|
|
@@ -4004,7 +4195,7 @@ import {
|
|
|
4004
4195
|
tag: e.tag,
|
|
4005
4196
|
count: e.samples.length,
|
|
4006
4197
|
errorCount: n,
|
|
4007
|
-
latencyMs:
|
|
4198
|
+
latencyMs: Vi(t)
|
|
4008
4199
|
});
|
|
4009
4200
|
}
|
|
4010
4201
|
return c.sort((e, t) => t.count - e.count), {
|
|
@@ -4017,4 +4208,4 @@ import {
|
|
|
4017
4208
|
};
|
|
4018
4209
|
};
|
|
4019
4210
|
//#endregion
|
|
4020
|
-
export { Kt as $,
|
|
4211
|
+
export { Kt as $, mr as A, Ke as At, hn as B, Lr as C, rt as Ct, Cr as D, Je as Dt, Sr as E, nt as Et, Fn as F, Ve as Ft, Bt as G, sn as H, An as I, ve as It, rn as J, W as K, En as L, ye as Lt, Bn as M, Ge as Mt, Rn as N, Ue as Nt, hr as O, Ye as Ot, Ln as P, Be as Pt, Ht as Q, wn as R, Er as S, Ze as St, xr as T, et as Tt, ln as U, cn as V, H as W, an as X, Gt as Y, Wt as Z, Br as _, St as _t, vi as a, $t as at, Ur as b, ct as bt, ki as c, Zt as ct, ui as d, K as dt, Vt as et, gi as f, U as ft, zr as g, Mt as gt, Qr as h, Ft as ht, ji as i, tn as it, pr as j, qe as jt, fr as k, Xe as kt, Ii as l, qt as lt, Xr as m, Pt as mt, di as n, Ut as nt, _i as o, en as ot, Mi as p, It as pt, Xt as q, Ai as r, nn as rt, Fi as s, Qt as st, Hi as t, Yt as tt, Li as u, Jt as ut, Vr as v, bt as vt, Dr as w, Qe as wt, Or as x, st as xt, Hr as y, ut as yt, _n as z };
|