@voltro/cli 0.31.0 → 0.32.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 +163 -0
- package/dist/{apiBuild-CLPt-pX6.js → apiBuild-C4uEbs3s.js} +2 -2
- package/dist/apiBuild-OJEjtwcn.js +2 -0
- package/dist/bin.js +3 -3
- package/dist/checkCommand-CwMrzAgV.js +2 -0
- package/dist/{checkCommand-D7r6_pk7.js → checkCommand-dm7OHtPt.js} +328 -288
- package/dist/{commands-CNVVv03h.js → commands-C0nEePif.js} +53 -11
- package/dist/dbCommand-By__Ev0R.js +2 -0
- package/dist/{dbCommand-BH8GAYuf.js → dbCommand-ifOMafuG.js} +90 -82
- package/dist/{dev-DdQEn2Ia.js → dev-5ficNnvF.js} +1232 -1224
- package/dist/{dev-DOZVMVfi.js → dev-rc3fwPSZ.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/{inspectMetrics-BeEAnjqw.js → inspectMetrics-BqO4E9G0.js} +757 -715
- package/dist/{sdkgen-v9WV8zRi.js → sdkgen-B_5mHQS2.js} +1 -1
- package/dist/{serveCommand-KsKXXWn4.js → serveCommand-PxMmn96o.js} +366 -366
- package/dist/serveEntry.js +2 -2
- package/dist/{start-CI2QdKy9.js → start-D1-8eKrO.js} +1 -1
- package/dist/startEntry.js +2 -2
- package/package.json +417 -17
- package/templates/AGENTS.md +1 -1
- package/templates/agent-docs/_index.md +1 -1
- package/templates/agent-docs/plugins/audit.md +24 -0
- package/templates/agent-docs/security.md +9 -0
- package/templates/agent-docs/whats-new.md +109 -61
- 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-sqlite/package.json +8 -8
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/package.json +10 -10
- package/templates/apps/api-collab/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-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-saas-starter/package.json +10 -10
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-status/package.json +8 -8
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- 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-auth/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-cms/package.json +9 -9
- package/templates/apps/frontend-collab/package.json +9 -9
- 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-portal/package.json +8 -8
- package/templates/apps/frontend-saas/package.json +8 -8
- 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/templates/apps/frontend-status/package.json +8 -8
- package/templates/apps/mobile-app/package.json +2 -2
- package/dist/apiBuild-BOqL1dlg.js +0 -2
- package/dist/checkCommand-ClRvH_SN.js +0 -2
- package/dist/dbCommand-BwQ_Jl98.js +0 -2
|
@@ -7,11 +7,11 @@ import { FileSystem as v } from "@effect/platform";
|
|
|
7
7
|
import { NodeContext as y } from "@effect/platform-node";
|
|
8
8
|
import { Effect as b } from "effect";
|
|
9
9
|
import { addSink as x, createLogger as S, printReadyBlock as C } from "@voltro/logger";
|
|
10
|
-
import { closeSync as w, existsSync as T, mkdirSync as E, openSync as D, promises as O, readFileSync as k, readdirSync as A, statSync as j, unlinkSync as M, unwatchFile as
|
|
11
|
-
import { currentTraceContext as
|
|
12
|
-
import { homedir as
|
|
13
|
-
import { createRequire as
|
|
14
|
-
import { FRAMEWORK_ENV_CATALOG as
|
|
10
|
+
import { closeSync as w, existsSync as T, mkdirSync as E, openSync as D, promises as O, readFileSync as k, readdirSync as A, statSync as j, unlinkSync as M, unwatchFile as N, watchFile as ee, writeSync as P } from "node:fs";
|
|
11
|
+
import { currentTraceContext as F, recordSample as I, resolveSecret as te } from "@voltro/runtime";
|
|
12
|
+
import { homedir as L } from "node:os";
|
|
13
|
+
import { createRequire as R } from "node:module";
|
|
14
|
+
import { FRAMEWORK_ENV_CATALOG as ne, appEnvEntries as re, checkEnvNaming as z, formatEnvErrors as ie, installEnvSnapshot as B, isEnvContract as ae, pluginEnvEntries as V, renderDotEnvExample as oe, resolveEnv as se } from "@voltro/env";
|
|
15
15
|
import { __installPublicEnv as ce } from "@voltro/env/public";
|
|
16
16
|
import { mkdir as H, readFile as le, writeFile as ue } from "node:fs/promises";
|
|
17
17
|
import { createHash as de } from "node:crypto";
|
|
@@ -22,35 +22,35 @@ import { PassThrough as me } from "node:stream";
|
|
|
22
22
|
var he = d(g(import.meta.url)), U = [h(he, "..", "templates"), h(he, "..", "..", "templates")], ge = (e) => ({
|
|
23
23
|
_tag: "TemplateNotFoundError",
|
|
24
24
|
searched: e
|
|
25
|
-
}), W = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", ve = 2048,
|
|
25
|
+
}), W = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", ve = 2048, ye = "<!-- VOLTRO:INDEX -->", G = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), K = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), be = (e, t) => e.readFileString(t).pipe(b.map((e) => {
|
|
26
26
|
try {
|
|
27
27
|
return JSON.parse(e).workspaces !== void 0;
|
|
28
28
|
} catch {
|
|
29
29
|
return !1;
|
|
30
30
|
}
|
|
31
|
-
}), b.orElseSucceed(() => !1)),
|
|
31
|
+
}), b.orElseSucceed(() => !1)), q = (e) => b.gen(function* () {
|
|
32
32
|
let t = yield* v.FileSystem, n = h(e);
|
|
33
33
|
for (;;) {
|
|
34
|
-
if ((yield*
|
|
34
|
+
if ((yield* G(t, p(n, ".git"))) || (yield* G(t, p(n, "pnpm-workspace.yaml"))) || (yield* be(t, p(n, "package.json")))) return n;
|
|
35
35
|
let r = d(n);
|
|
36
36
|
if (r === n) return h(e);
|
|
37
37
|
n = r;
|
|
38
38
|
}
|
|
39
|
-
}),
|
|
39
|
+
}), xe = (e, t, n) => b.gen(function* () {
|
|
40
40
|
yield* e.makeDirectory(n, { recursive: !0 }).pipe(b.orElseSucceed(() => void 0));
|
|
41
41
|
let r = yield* e.readDirectory(t).pipe(b.orElseSucceed(() => []));
|
|
42
42
|
for (let i of r) {
|
|
43
43
|
let r = p(t, i), a = p(n, i);
|
|
44
|
-
(yield* e.stat(r).pipe(b.orElseSucceed(() => null)))?.type === "Directory" ? yield*
|
|
44
|
+
(yield* e.stat(r).pipe(b.orElseSucceed(() => null)))?.type === "Directory" ? yield* xe(e, r, a) : yield* e.copyFile(r, a).pipe(b.orElseSucceed(() => void 0));
|
|
45
45
|
}
|
|
46
|
-
}),
|
|
46
|
+
}), Se = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Ce = (e, t) => b.gen(function* () {
|
|
47
47
|
let n = p(t, "app.config.ts");
|
|
48
|
-
if (!(yield*
|
|
48
|
+
if (!(yield* G(e, n))) return null;
|
|
49
49
|
let r = (yield* b.tryPromise(() => import(_(n).href)).pipe(b.orElseSucceed(() => null)))?.default;
|
|
50
|
-
return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(
|
|
51
|
-
}),
|
|
50
|
+
return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(Se).filter((e) => e !== null);
|
|
51
|
+
}), we = (e, t) => b.gen(function* () {
|
|
52
52
|
let n = [], r = [], i = p(t, "apps");
|
|
53
|
-
if (!(yield*
|
|
53
|
+
if (!(yield* G(e, i))) return {
|
|
54
54
|
apis: n,
|
|
55
55
|
webs: r
|
|
56
56
|
};
|
|
@@ -58,8 +58,8 @@ var he = d(g(import.meta.url)), U = [h(he, "..", "templates"), h(he, "..", "..",
|
|
|
58
58
|
let a = p(i, t);
|
|
59
59
|
if ((yield* e.stat(a).pipe(b.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(b.orElseSucceed(() => []))) {
|
|
60
60
|
let i = p(a, t), o = p(i, "app.config.ts");
|
|
61
|
-
if (!(yield*
|
|
62
|
-
let s = yield*
|
|
61
|
+
if (!(yield* G(e, o))) continue;
|
|
62
|
+
let s = yield* K(e, o);
|
|
63
63
|
/type:\s*['"]web['"]/.test(s) ? r.push(i) : n.push(i);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -67,7 +67,7 @@ var he = d(g(import.meta.url)), U = [h(he, "..", "templates"), h(he, "..", "..",
|
|
|
67
67
|
apis: n,
|
|
68
68
|
webs: r
|
|
69
69
|
};
|
|
70
|
-
}),
|
|
70
|
+
}), Te = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Ee = (e, t, n) => {
|
|
71
71
|
let r = [
|
|
72
72
|
"<!-- voltro agent-docs index — regenerated at seed time -->",
|
|
73
73
|
"## Deep reference (read on demand)",
|
|
@@ -79,17 +79,17 @@ var he = d(g(import.meta.url)), U = [h(he, "..", "templates"), h(he, "..", "..",
|
|
|
79
79
|
"",
|
|
80
80
|
"| Topic | Open | Summary |",
|
|
81
81
|
"|---|---|---|",
|
|
82
|
-
...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${
|
|
82
|
+
...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${Te(e.description)} |`),
|
|
83
83
|
""
|
|
84
|
-
], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = (e, t) => e.module === void 0 ? `\`node_modules/${t}/README.md\`` : `\`${n}${e.module}\` (or \`node_modules/${t}/README.md\`)`, o = t === null ? e.plugins.map((e) => `| ${e.slug} | ${a(e, e.pkg)} | ${
|
|
84
|
+
], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = (e, t) => e.module === void 0 ? `\`node_modules/${t}/README.md\`` : `\`${n}${e.module}\` (or \`node_modules/${t}/README.md\`)`, o = t === null ? e.plugins.map((e) => `| ${e.slug} | ${a(e, e.pkg)} | ${Te(e.description)} |`) : t.map((e) => {
|
|
85
85
|
let t = i.get(e);
|
|
86
|
-
return t ? `| ${t.slug} | ${a(t, e)} | ${
|
|
86
|
+
return t ? `| ${t.slug} | ${a(t, e)} | ${Te(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
|
|
87
87
|
});
|
|
88
88
|
return r.push(`### Plugins${t === null ? "" : " (installed)"}`, "", "| Plugin | Open | Summary |", "|---|---|---|"), r.push(o.length ? o.join("\n") : "| _(none installed)_ | | |", ""), r.join("\n");
|
|
89
|
-
},
|
|
89
|
+
}, De = (e, t, n) => {
|
|
90
90
|
let r = t.templates?.[e] ?? t.templates?.[e.replace(/^frontend-/, "")];
|
|
91
91
|
return `\nScaffolded from the \`${e}\` template — see \`${r ? `${n}${r}` : `${n}agent-docs/templates/overview.md`}\`.\n`;
|
|
92
|
-
},
|
|
92
|
+
}, Oe = {
|
|
93
93
|
api: (e, t, n = "") => `# api — agent notes
|
|
94
94
|
|
|
95
95
|
You are in a Voltro **api** app. Server primitives live here: \`queries/\`,
|
|
@@ -129,7 +129,7 @@ You are in a Voltro **web** app. File-based routing under \`src/pages/**\`.
|
|
|
129
129
|
Deep reference (paths from the repo root): \`${e}agent-docs/routing.md\`,
|
|
130
130
|
\`${e}agent-docs/schema-driven-ui.md\`, \`${e}agent-docs/internationalization.md\`.
|
|
131
131
|
${t}`
|
|
132
|
-
},
|
|
132
|
+
}, ke = [
|
|
133
133
|
{
|
|
134
134
|
name: "voltro-schema",
|
|
135
135
|
description: "Define or change a Voltro database table/schema (columns, mixins, indexes, relations).",
|
|
@@ -160,7 +160,7 @@ ${t}`
|
|
|
160
160
|
description: "Export/import + backup/restore Voltro data & assets, and copy prod→dev/stage SAFELY with fail-closed masking/anonymization (.sensitive()/.safe()) + referential subsetting. Use for data takeout, seeding lower envs, backups, or cross-dialect moves.",
|
|
161
161
|
module: "cli.md"
|
|
162
162
|
}
|
|
163
|
-
],
|
|
163
|
+
], Ae = (e, t) => `---
|
|
164
164
|
name: ${e.name}
|
|
165
165
|
description: ${e.description}
|
|
166
166
|
---
|
|
@@ -171,10 +171,10 @@ Open the full reference and follow the patterns there:
|
|
|
171
171
|
|
|
172
172
|
Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
|
|
173
173
|
boundary, naming, anti-patterns) before editing.
|
|
174
|
-
`,
|
|
175
|
-
let i = yield*
|
|
174
|
+
`, je = (e, t, n, r) => b.gen(function* () {
|
|
175
|
+
let i = yield* G(e, t);
|
|
176
176
|
if (i) {
|
|
177
|
-
if ((yield*
|
|
177
|
+
if ((yield* K(e, t)).slice(0, ve).includes("voltro:agents-md:keep")) return {
|
|
178
178
|
path: t,
|
|
179
179
|
action: "protected"
|
|
180
180
|
};
|
|
@@ -187,51 +187,51 @@ boundary, naming, anti-patterns) before editing.
|
|
|
187
187
|
path: t,
|
|
188
188
|
action: i ? "overwritten" : "created"
|
|
189
189
|
};
|
|
190
|
-
}),
|
|
191
|
-
let n = yield* v.FileSystem, r = yield*
|
|
192
|
-
for (let e of U) if (yield*
|
|
190
|
+
}), Me = (e, t = {}) => b.gen(function* () {
|
|
191
|
+
let n = yield* v.FileSystem, r = yield* q(e), i = null;
|
|
192
|
+
for (let e of U) if (yield* G(n, p(e, "AGENTS.core.md"))) {
|
|
193
193
|
i = e;
|
|
194
194
|
break;
|
|
195
195
|
}
|
|
196
196
|
if (i === null) {
|
|
197
|
-
for (let e of U) if (yield*
|
|
198
|
-
let i = yield*
|
|
199
|
-
for (let e of W) a.push(yield*
|
|
197
|
+
for (let e of U) if (yield* G(n, p(e, "AGENTS.md"))) {
|
|
198
|
+
let i = yield* K(n, p(e, "AGENTS.md")), a = [];
|
|
199
|
+
for (let e of W) a.push(yield* je(n, p(r, e), i, t.force ?? !1));
|
|
200
200
|
return { files: a };
|
|
201
201
|
}
|
|
202
202
|
return yield* b.fail(ge(U.map((e) => p(e, "AGENTS.core.md"))));
|
|
203
203
|
}
|
|
204
|
-
let a = yield*
|
|
204
|
+
let a = yield* K(n, p(i, "AGENTS.core.md")), o = yield* K(n, p(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
|
|
205
205
|
modules: [],
|
|
206
206
|
plugins: []
|
|
207
|
-
}, c = (t.preferPointer ?? !1) || (yield*
|
|
208
|
-
if ((yield* b.forEach(d, (e) =>
|
|
207
|
+
}, c = (t.preferPointer ?? !1) || (yield* G(n, p(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), l = c ? "node_modules/@voltro/cli/templates/" : "", u = t.force ?? !1, d = W.map((e) => p(r, e));
|
|
208
|
+
if ((yield* b.forEach(d, (e) => K(n, e).pipe(b.map((e) => e.slice(0, ve))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
|
|
209
209
|
path: e,
|
|
210
210
|
action: "protected"
|
|
211
211
|
})) };
|
|
212
|
-
let { apis: f, webs: m } = yield*
|
|
212
|
+
let { apis: f, webs: m } = yield* we(n, r), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), y = !1;
|
|
213
213
|
for (let e of f) {
|
|
214
|
-
let t = yield*
|
|
214
|
+
let t = yield* Ce(n, e);
|
|
215
215
|
if (g.set(e, t), t !== null) {
|
|
216
216
|
y = !0;
|
|
217
217
|
for (let e of t) _.add(e);
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
-
let x = t.plugins ? t.plugins.map(
|
|
221
|
-
for (let e of d) C.push(yield*
|
|
222
|
-
c || (yield*
|
|
220
|
+
let x = t.plugins ? t.plugins.map(Se).filter((e) => e !== null) : y ? [..._] : null, S = a.includes(ye) ? a.replace(ye, Ee(s, x, l)) : a, C = [];
|
|
221
|
+
for (let e of d) C.push(yield* je(n, e, S, u));
|
|
222
|
+
c || (yield* xe(n, p(i, "agent-docs"), p(r, "agent-docs")));
|
|
223
223
|
let w = new Map((t.appTemplates ?? []).map((e) => [h(e.dir), e.template])), T = (e) => {
|
|
224
224
|
let t = w.get(h(e));
|
|
225
|
-
return t ?
|
|
226
|
-
}, E = (e, t) => b.forEach(W, (r) =>
|
|
227
|
-
for (let e of f) C.push(...yield* E(e,
|
|
228
|
-
for (let e of m) C.push(...yield* E(e,
|
|
229
|
-
for (let e of
|
|
225
|
+
return t ? De(t, s, l) : "";
|
|
226
|
+
}, E = (e, t) => b.forEach(W, (r) => je(n, p(e, r), t, u));
|
|
227
|
+
for (let e of f) C.push(...yield* E(e, Oe.api(l, g.get(e) ?? null, T(e)))), (yield* G(n, p(e, "database"))) && C.push(...yield* E(p(e, "database"), Oe.database(l)));
|
|
228
|
+
for (let e of m) C.push(...yield* E(e, Oe.web(l, T(e))));
|
|
229
|
+
for (let e of ke) C.push(yield* je(n, p(r, ".claude", "skills", e.name, "SKILL.md"), Ae(e, l), u));
|
|
230
230
|
return { files: C };
|
|
231
|
-
}),
|
|
231
|
+
}), Ne = (e, t = {}) => b.runPromise(Me(e, t).pipe(b.provide(y.layer))), Pe = async (t) => {
|
|
232
232
|
let n = t.includes("--force"), r = t.find((e) => !e.startsWith("-")) ?? process.cwd();
|
|
233
233
|
return e(b.gen(function* () {
|
|
234
|
-
let e = yield*
|
|
234
|
+
let e = yield* Me(r, { force: n });
|
|
235
235
|
for (let t of e.files) {
|
|
236
236
|
let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${_e}")` : "present (use --force to overwrite)";
|
|
237
237
|
yield* b.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
|
|
@@ -240,14 +240,14 @@ boundary, naming, anti-patterns) before editing.
|
|
|
240
240
|
}).pipe(b.catchTag("TemplateNotFoundError", (e) => b.gen(function* () {
|
|
241
241
|
return yield* b.logError("AGENTS.md template not found", { searched: e.searched }), 1;
|
|
242
242
|
}))), { scope: "voltro:agents-md" });
|
|
243
|
-
},
|
|
243
|
+
}, Fe = p(L(), ".voltro"), Ie = p(Fe, "runtime-registry.json"), Le = 3e4, Re = () => {
|
|
244
244
|
let e = Math.random().toString(36).slice(2, 10);
|
|
245
|
-
return `${
|
|
246
|
-
}, Re = async () => {
|
|
247
|
-
await O.mkdir(Pe, { recursive: !0 });
|
|
245
|
+
return `${Ie}.${process.pid}.${Date.now()}.${e}.tmp`;
|
|
248
246
|
}, ze = async () => {
|
|
247
|
+
await O.mkdir(Fe, { recursive: !0 });
|
|
248
|
+
}, Be = async () => {
|
|
249
249
|
try {
|
|
250
|
-
let e = await O.readFile(
|
|
250
|
+
let e = await O.readFile(Ie, "utf8"), t = JSON.parse(e);
|
|
251
251
|
return t.version !== 1 || !Array.isArray(t.apps) ? {
|
|
252
252
|
version: 1,
|
|
253
253
|
apps: []
|
|
@@ -258,34 +258,34 @@ boundary, naming, anti-patterns) before editing.
|
|
|
258
258
|
apps: []
|
|
259
259
|
};
|
|
260
260
|
}
|
|
261
|
-
},
|
|
262
|
-
await
|
|
263
|
-
let t =
|
|
261
|
+
}, Ve = async (e) => {
|
|
262
|
+
await ze();
|
|
263
|
+
let t = Re();
|
|
264
264
|
try {
|
|
265
265
|
await O.writeFile(t, JSON.stringify(e, null, 2), {
|
|
266
266
|
encoding: "utf8",
|
|
267
267
|
mode: 384
|
|
268
|
-
}), await O.rename(t,
|
|
268
|
+
}), await O.rename(t, Ie), await O.chmod(Ie, 384).catch(() => {});
|
|
269
269
|
} catch (e) {
|
|
270
270
|
try {
|
|
271
271
|
await O.unlink(t);
|
|
272
272
|
} catch {}
|
|
273
273
|
throw e;
|
|
274
274
|
}
|
|
275
|
-
},
|
|
275
|
+
}, He = (e) => {
|
|
276
276
|
try {
|
|
277
277
|
return process.kill(e, 0), !0;
|
|
278
278
|
} catch {
|
|
279
279
|
return !1;
|
|
280
280
|
}
|
|
281
|
-
},
|
|
281
|
+
}, Ue = (e) => {
|
|
282
282
|
let t = Date.now();
|
|
283
|
-
return e.filter((e) =>
|
|
284
|
-
},
|
|
285
|
-
let e = await
|
|
283
|
+
return e.filter((e) => He(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Le : !1);
|
|
284
|
+
}, We = async () => {
|
|
285
|
+
let e = await Be(), t = Ue(e.apps);
|
|
286
286
|
if (t.length === e.apps.length) return e;
|
|
287
287
|
try {
|
|
288
|
-
await
|
|
288
|
+
await Ve({
|
|
289
289
|
version: 1,
|
|
290
290
|
apps: t
|
|
291
291
|
});
|
|
@@ -294,31 +294,31 @@ boundary, naming, anti-patterns) before editing.
|
|
|
294
294
|
version: 1,
|
|
295
295
|
apps: t
|
|
296
296
|
};
|
|
297
|
-
},
|
|
298
|
-
let t = await
|
|
297
|
+
}, Ge = async (e) => {
|
|
298
|
+
let t = await Be(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
|
|
299
299
|
...e,
|
|
300
300
|
...i !== void 0 && i !== "" ? { inspectToken: i } : {},
|
|
301
301
|
registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
|
|
302
302
|
heartbeatAt: n
|
|
303
303
|
};
|
|
304
|
-
await
|
|
304
|
+
await Ve({
|
|
305
305
|
version: 1,
|
|
306
306
|
apps: r >= 0 ? t.apps.map((e, t) => t === r ? a : e) : [...t.apps, a]
|
|
307
307
|
});
|
|
308
|
-
},
|
|
308
|
+
}, Ke = async (e) => {
|
|
309
309
|
try {
|
|
310
|
-
let t = await
|
|
310
|
+
let t = await Be(), n = t.apps.filter((t) => t.id !== e);
|
|
311
311
|
if (n.length === t.apps.length) return;
|
|
312
|
-
await
|
|
312
|
+
await Ve({
|
|
313
313
|
version: 1,
|
|
314
314
|
apps: n
|
|
315
315
|
});
|
|
316
316
|
} catch {}
|
|
317
|
-
},
|
|
317
|
+
}, qe = (e, t, n) => `${e}:${t}:${n}`, Je = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Ye = (e) => {
|
|
318
318
|
try {
|
|
319
319
|
let t = p(e, "tsconfig.json");
|
|
320
320
|
if (!T(t)) return [];
|
|
321
|
-
let n = JSON.parse(
|
|
321
|
+
let n = JSON.parse(Je(k(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = h(e, n.baseUrl ?? "."), a = [];
|
|
322
322
|
for (let [e, t] of Object.entries(r)) {
|
|
323
323
|
let n = t[0];
|
|
324
324
|
if (!n) continue;
|
|
@@ -338,17 +338,17 @@ boundary, naming, anti-patterns) before editing.
|
|
|
338
338
|
} catch {
|
|
339
339
|
return [];
|
|
340
340
|
}
|
|
341
|
-
},
|
|
341
|
+
}, Xe = (e) => {
|
|
342
342
|
let t = e;
|
|
343
343
|
return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
|
|
344
|
-
},
|
|
344
|
+
}, Ze = async (e, t) => {
|
|
345
345
|
try {
|
|
346
346
|
return await t();
|
|
347
347
|
} catch (t) {
|
|
348
|
-
throw
|
|
348
|
+
throw Xe(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;
|
|
349
349
|
}
|
|
350
|
-
},
|
|
351
|
-
let n =
|
|
350
|
+
}, Qe = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", $e = (e, t) => t ? `${e} | undefined` : e, et = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${$e(t.tsType, t.optional)}`).join("\n"), tt = async (e, t) => {
|
|
351
|
+
let n = et(t, () => !0), r = `${Qe}
|
|
352
352
|
import '@voltro/env/server'
|
|
353
353
|
|
|
354
354
|
declare module '@voltro/env/server' {
|
|
@@ -358,8 +358,8 @@ ${n.length > 0 ? n : " // (no variables declared)"}
|
|
|
358
358
|
}
|
|
359
359
|
`;
|
|
360
360
|
await ue(p(e, "env.generated.d.ts"), r, "utf8");
|
|
361
|
-
},
|
|
362
|
-
let n =
|
|
361
|
+
}, nt = async (e, t) => {
|
|
362
|
+
let n = et(t, (e) => e === "public"), r = `${Qe}
|
|
363
363
|
import '@voltro/env/public'
|
|
364
364
|
|
|
365
365
|
declare module '@voltro/env/public' {
|
|
@@ -369,8 +369,8 @@ ${n.length > 0 ? n : " // (no public variables declared)"}
|
|
|
369
369
|
}
|
|
370
370
|
`, i = p(e, "src");
|
|
371
371
|
await H(i, { recursive: !0 }), await ue(p(i, "voltro-env.d.ts"), r, "utf8");
|
|
372
|
-
},
|
|
373
|
-
let n = `${
|
|
372
|
+
}, rt = async (e, t) => {
|
|
373
|
+
let n = `${Qe}
|
|
374
374
|
import { __installPublicEnv } from '@voltro/env/public'
|
|
375
375
|
|
|
376
376
|
export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
@@ -379,13 +379,13 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
|
379
379
|
__installPublicEnv(publicEnvValues)
|
|
380
380
|
`;
|
|
381
381
|
await H(e, { recursive: !0 }), await ue(p(e, "env.public.ts"), n, "utf8");
|
|
382
|
-
},
|
|
383
|
-
let t =
|
|
382
|
+
}, it = async (e) => {
|
|
383
|
+
let t = ae(e.rawEnv) ? e.rawEnv : void 0, n = await se({
|
|
384
384
|
contract: t,
|
|
385
|
-
resolveSecret:
|
|
385
|
+
resolveSecret: te
|
|
386
386
|
}), r = [...n.errors, ...z(t, e.appType)];
|
|
387
|
-
if (r.length > 0) throw Error(
|
|
388
|
-
|
|
387
|
+
if (r.length > 0) throw Error(ie(r));
|
|
388
|
+
B(n.values), e.appType === "web" && ce(n.publicValues);
|
|
389
389
|
let i = t ? Object.keys(t.vars).length : 0;
|
|
390
390
|
if (i > 0) {
|
|
391
391
|
let r = Object.keys(n.publicValues).length;
|
|
@@ -397,20 +397,20 @@ __installPublicEnv(publicEnvValues)
|
|
|
397
397
|
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 });
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
|
-
return e.generateTypes && t && (e.appType === "api" ? await
|
|
400
|
+
return e.generateTypes && t && (e.appType === "api" ? await tt(e.root, t) : await nt(e.root, t)), {
|
|
401
401
|
resolved: n,
|
|
402
402
|
contract: t
|
|
403
403
|
};
|
|
404
|
-
},
|
|
405
|
-
let t =
|
|
404
|
+
}, at = (e) => {
|
|
405
|
+
let t = re(e.contract), n = (e.plugins ?? []).flatMap((e) => V(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ne, i = /* @__PURE__ */ new Set(), a = [];
|
|
406
406
|
for (let e of [
|
|
407
407
|
...t,
|
|
408
408
|
...n,
|
|
409
409
|
...r
|
|
410
410
|
]) i.has(e.key) || (i.add(e.key), a.push(e));
|
|
411
411
|
return a;
|
|
412
|
-
},
|
|
413
|
-
let r =
|
|
412
|
+
}, ot = (e, t, n = (e) => process.env[e]) => {
|
|
413
|
+
let r = at(t).map((e) => {
|
|
414
414
|
let t = n(e.key) !== void 0;
|
|
415
415
|
return {
|
|
416
416
|
...e,
|
|
@@ -427,13 +427,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
427
427
|
missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
|
|
428
428
|
}
|
|
429
429
|
};
|
|
430
|
-
},
|
|
430
|
+
}, st = (e, t) => oe(at({
|
|
431
431
|
...e,
|
|
432
432
|
includeFramework: !1
|
|
433
433
|
}), {
|
|
434
434
|
includeFramework: e.includeFramework !== !1,
|
|
435
435
|
...t ? { header: t } : {}
|
|
436
|
-
}),
|
|
436
|
+
}), ct = () => {
|
|
437
437
|
let e = /* @__PURE__ */ new Map();
|
|
438
438
|
return {
|
|
439
439
|
get(t) {
|
|
@@ -460,7 +460,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
460
460
|
return Array.from(e.entries());
|
|
461
461
|
}
|
|
462
462
|
};
|
|
463
|
-
},
|
|
463
|
+
}, lt = (e) => {
|
|
464
464
|
if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
|
|
465
465
|
if (typeof e != "string") return null;
|
|
466
466
|
let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
|
|
@@ -469,10 +469,10 @@ __installPublicEnv(publicEnvValues)
|
|
|
469
469
|
if (!Number.isFinite(n) || n <= 0) return null;
|
|
470
470
|
let r = t[2].toLowerCase();
|
|
471
471
|
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;
|
|
472
|
-
},
|
|
472
|
+
}, ut = (e, t = {}) => {
|
|
473
473
|
let n = [e];
|
|
474
474
|
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("|");
|
|
475
|
-
},
|
|
475
|
+
}, dt = (e, t) => e.expiresAt > t, ft = (e, t) => e.expiresAt <= t && e.servableUntil > t, pt = S({ scope: "voltro:cli" }), mt = (e, t) => {
|
|
476
476
|
if (t?.code !== "EACCES") return "";
|
|
477
477
|
if (typeof process.getuid != "function") return " — permission denied";
|
|
478
478
|
try {
|
|
@@ -481,8 +481,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
481
481
|
} catch {
|
|
482
482
|
return " — permission denied (and the file could not be stat-ed either)";
|
|
483
483
|
}
|
|
484
|
-
},
|
|
485
|
-
|
|
484
|
+
}, ht = [], gt = (e) => {
|
|
485
|
+
ht.length = 0;
|
|
486
486
|
let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? f(t) ? t : h(process.cwd(), t) : process.cwd(), r = [], i = n;
|
|
487
487
|
for (;;) {
|
|
488
488
|
r.push(i);
|
|
@@ -493,7 +493,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
493
493
|
for (let e of r) for (let t of [".env.local", ".env"]) {
|
|
494
494
|
let n = h(e, t);
|
|
495
495
|
if (T(n)) {
|
|
496
|
-
|
|
496
|
+
ht.push(n);
|
|
497
497
|
try {
|
|
498
498
|
let e = k(n, "utf8");
|
|
499
499
|
for (let t of e.split(/\r?\n/)) {
|
|
@@ -505,11 +505,11 @@ __installPublicEnv(publicEnvValues)
|
|
|
505
505
|
(i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
|
|
506
506
|
}
|
|
507
507
|
} catch (e) {
|
|
508
|
-
|
|
508
|
+
pt.warn(`failed to load env file (continuing)${mt(n, e)}`, { path: n }, e);
|
|
509
509
|
}
|
|
510
510
|
}
|
|
511
511
|
}
|
|
512
|
-
},
|
|
512
|
+
}, _t = 500, vt = (e, t, n = {}) => {
|
|
513
513
|
if (e.length === 0) return () => {};
|
|
514
514
|
let r = (e) => n.root ? m(n.root, e) : e, i = !1, a = (e) => {
|
|
515
515
|
i || (i = !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(() => {
|
|
@@ -527,25 +527,25 @@ __installPublicEnv(publicEnvValues)
|
|
|
527
527
|
});
|
|
528
528
|
}));
|
|
529
529
|
};
|
|
530
|
-
for (let t of e)
|
|
530
|
+
for (let t of e) ee(t, { interval: _t }, (e, n) => {
|
|
531
531
|
e.mtimeMs !== n.mtimeMs && a(t);
|
|
532
532
|
});
|
|
533
533
|
return t.info("watching .env files for changes", {
|
|
534
534
|
files: e.map(r),
|
|
535
|
-
intervalMs:
|
|
535
|
+
intervalMs: _t
|
|
536
536
|
}), () => {
|
|
537
|
-
for (let t of e)
|
|
537
|
+
for (let t of e) N(t);
|
|
538
538
|
};
|
|
539
|
-
},
|
|
539
|
+
}, yt = "VoltroBootRefusal", bt = (e) => {
|
|
540
540
|
let t = Error(e);
|
|
541
|
-
return t.name =
|
|
542
|
-
},
|
|
541
|
+
return t.name = yt, t;
|
|
542
|
+
}, xt = [{
|
|
543
543
|
host: "127.0.0.1",
|
|
544
544
|
family: "IPv4"
|
|
545
545
|
}, {
|
|
546
546
|
host: "::1",
|
|
547
547
|
family: "IPv6"
|
|
548
|
-
}],
|
|
548
|
+
}], St = (e, t, n) => new Promise((r) => {
|
|
549
549
|
let i = !1, a = (e) => {
|
|
550
550
|
if (!i) {
|
|
551
551
|
i = !0;
|
|
@@ -559,10 +559,10 @@ __installPublicEnv(publicEnvValues)
|
|
|
559
559
|
port: t
|
|
560
560
|
});
|
|
561
561
|
o.once("connect", () => a(!0)), o.once("error", () => a(!1)), o.setTimeout(n, () => a(!1));
|
|
562
|
-
}),
|
|
562
|
+
}), Ct = async (e, t = 400) => ({ families: (await Promise.all(xt.map(async (n) => ({
|
|
563
563
|
family: n.family,
|
|
564
|
-
taken: await
|
|
565
|
-
})))).filter((e) => e.taken).map((e) => e.family) }),
|
|
564
|
+
taken: await St(n.host, e, t)
|
|
565
|
+
})))).filter((e) => e.taken).map((e) => e.family) }), wt = (e, t, n) => [
|
|
566
566
|
`${t}: port ${e} is already being served (${n.join(" + ")}).`,
|
|
567
567
|
"",
|
|
568
568
|
" Refusing to start. This is NOT a spurious check — a second listener can",
|
|
@@ -577,52 +577,84 @@ __installPublicEnv(publicEnvValues)
|
|
|
577
577
|
"",
|
|
578
578
|
" Then re-run. To use a different port instead, change `port` in",
|
|
579
579
|
" app.config.ts."
|
|
580
|
-
].join("\n"),
|
|
581
|
-
let { families: n } = await
|
|
582
|
-
if (n.length !== 0) throw
|
|
583
|
-
},
|
|
584
|
-
let t = [], n =
|
|
580
|
+
].join("\n"), Tt = async (e, t) => {
|
|
581
|
+
let { families: n } = await Ct(e);
|
|
582
|
+
if (n.length !== 0) throw bt(wt(e, t, n));
|
|
583
|
+
}, Et = (e) => e === "effect" || e.startsWith("@effect/") || e.startsWith("@voltro/") || e === "react" || e === "react-dom", Dt = /(^|\/)(\.bin|\.cache|\.pnpm-store|dist|build)(\/|$)/, Ot = (e) => {
|
|
584
|
+
let t = [], n = e;
|
|
585
585
|
for (let e = 0; e < 12; e++) {
|
|
586
|
-
let e = p(
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
586
|
+
let e = p(n, "node_modules");
|
|
587
|
+
T(e) && t.push(e);
|
|
588
|
+
let r = d(n);
|
|
589
|
+
if (r === n) break;
|
|
590
|
+
n = r;
|
|
591
|
+
}
|
|
592
|
+
return t;
|
|
593
|
+
}, kt = (e) => {
|
|
594
|
+
let t = /* @__PURE__ */ new Set([e]), n = e;
|
|
595
|
+
for (let e = 0; e < 12; e++) {
|
|
596
|
+
for (let e of ["pnpm-workspace.yaml", "pnpm-workspace.yml"]) {
|
|
597
|
+
let r;
|
|
598
|
+
try {
|
|
599
|
+
r = k(p(n, e), "utf8");
|
|
600
|
+
} catch {
|
|
601
|
+
continue;
|
|
602
|
+
}
|
|
603
|
+
for (let e of r.matchAll(/^\s*-\s*['"]?([^'"\n#]+?)['"]?\s*$/gm)) {
|
|
604
|
+
let r = (e[1] ?? "").trim();
|
|
605
|
+
if (r === "" || r.startsWith("!")) continue;
|
|
606
|
+
let i = r.split("/")[0] ?? "";
|
|
607
|
+
if (i === "" || i.includes("*")) continue;
|
|
608
|
+
let a;
|
|
609
|
+
try {
|
|
610
|
+
a = A(p(n, i), { withFileTypes: !0 });
|
|
611
|
+
} catch {
|
|
612
|
+
continue;
|
|
613
|
+
}
|
|
614
|
+
for (let e of a) e.isDirectory() && t.add(p(n, i, e.name));
|
|
615
|
+
}
|
|
591
616
|
}
|
|
592
|
-
let
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
617
|
+
for (let e of ["packages", "apps"]) {
|
|
618
|
+
let r;
|
|
619
|
+
try {
|
|
620
|
+
r = A(p(n, e), { withFileTypes: !0 });
|
|
621
|
+
} catch {
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
for (let i of r) i.isDirectory() && t.add(p(n, e, i.name));
|
|
625
|
+
}
|
|
626
|
+
let e = d(n);
|
|
627
|
+
if (e === n) break;
|
|
628
|
+
n = e;
|
|
629
|
+
}
|
|
630
|
+
return [...t];
|
|
631
|
+
}, At = (e) => {
|
|
632
|
+
let t = [];
|
|
633
|
+
for (let n of kt(e)) {
|
|
634
|
+
let e = p(n, "node_modules", "@voltro"), r;
|
|
601
635
|
try {
|
|
602
|
-
|
|
636
|
+
r = A(e);
|
|
603
637
|
} catch {
|
|
604
638
|
continue;
|
|
605
639
|
}
|
|
606
|
-
for (let
|
|
607
|
-
let n = r
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
version: a,
|
|
613
|
-
dir: p(t, r)
|
|
640
|
+
for (let n of r) {
|
|
641
|
+
let r = p(e, n), i = jt(r);
|
|
642
|
+
i !== void 0 && t.push({
|
|
643
|
+
pkg: `@voltro/${n}`,
|
|
644
|
+
version: i,
|
|
645
|
+
dir: r
|
|
614
646
|
});
|
|
615
647
|
}
|
|
616
648
|
}
|
|
617
|
-
return
|
|
618
|
-
},
|
|
649
|
+
return t;
|
|
650
|
+
}, jt = (e) => {
|
|
619
651
|
try {
|
|
620
652
|
let t = JSON.parse(k(p(e, "package.json"), "utf8"));
|
|
621
653
|
return typeof t.version == "string" ? t.version : void 0;
|
|
622
654
|
} catch {
|
|
623
655
|
return;
|
|
624
656
|
}
|
|
625
|
-
},
|
|
657
|
+
}, Mt = (e) => {
|
|
626
658
|
let t = [], n;
|
|
627
659
|
try {
|
|
628
660
|
n = A(e);
|
|
@@ -630,7 +662,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
630
662
|
return t;
|
|
631
663
|
}
|
|
632
664
|
for (let r of n) {
|
|
633
|
-
if (r.startsWith(".") ||
|
|
665
|
+
if (r.startsWith(".") || Dt.test(r)) continue;
|
|
634
666
|
let n = p(e, r);
|
|
635
667
|
if (r.startsWith("@")) {
|
|
636
668
|
let e;
|
|
@@ -656,18 +688,17 @@ __installPublicEnv(publicEnvValues)
|
|
|
656
688
|
});
|
|
657
689
|
}
|
|
658
690
|
return t;
|
|
659
|
-
},
|
|
691
|
+
}, Nt = (e) => {
|
|
660
692
|
let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
|
|
661
|
-
if (!
|
|
693
|
+
if (!Et(e)) return;
|
|
662
694
|
let i = t.get(e) ?? /* @__PURE__ */ new Map();
|
|
663
695
|
i.has(n) || i.set(n, r), t.set(e, i);
|
|
664
696
|
};
|
|
665
|
-
Ot
|
|
666
|
-
|
|
667
|
-
let t = At(r);
|
|
697
|
+
for (let t of Ot(e)) for (let { pkg: e, dir: r } of Mt(t)) {
|
|
698
|
+
let t = jt(r);
|
|
668
699
|
t !== void 0 && n(e, t, r);
|
|
669
700
|
}
|
|
670
|
-
for (let { pkg:
|
|
701
|
+
for (let { pkg: t, version: r, dir: i } of At(e)) n(t, r, i);
|
|
671
702
|
let r = [];
|
|
672
703
|
for (let [n, i] of t) i.size < 2 || r.push({
|
|
673
704
|
pkg: n,
|
|
@@ -675,7 +706,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
675
706
|
paths: [...i.values()].map((t) => m(e, t)).sort()
|
|
676
707
|
});
|
|
677
708
|
return r.sort((e, t) => e.pkg.localeCompare(t.pkg));
|
|
678
|
-
},
|
|
709
|
+
}, Pt = (e) => {
|
|
679
710
|
if (e.length !== 0) return [
|
|
680
711
|
`• ${e.length} package(s) resolved at more than one version:`,
|
|
681
712
|
...e.flatMap((e) => [` ${e.pkg} — ${e.versions.join(", ")}`, ...e.paths.map((e) => ` ${e}`)]),
|
|
@@ -693,12 +724,11 @@ __installPublicEnv(publicEnvValues)
|
|
|
693
724
|
" instrument), then reinstall. Do not silence the generated file — it is where",
|
|
694
725
|
" a genuine mistake in your own descriptors surfaces."
|
|
695
726
|
].join("\n");
|
|
696
|
-
},
|
|
727
|
+
}, Ft = (e) => {
|
|
697
728
|
let t = /* @__PURE__ */ new Map();
|
|
698
|
-
Ot
|
|
699
|
-
for (let n of Dt(e)) for (let { pkg: e, dir: r } of jt(n)) {
|
|
729
|
+
for (let n of Ot(e)) for (let { pkg: e, dir: r } of Mt(n)) {
|
|
700
730
|
if (!e.startsWith("@voltro/")) continue;
|
|
701
|
-
let n =
|
|
731
|
+
let n = jt(r);
|
|
702
732
|
n !== void 0 && !t.has(e) && t.set(e, n);
|
|
703
733
|
}
|
|
704
734
|
if (t.size < 2) return;
|
|
@@ -713,7 +743,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
713
743
|
version: t
|
|
714
744
|
})).sort((e, t) => e.pkg.localeCompare(t.pkg))
|
|
715
745
|
};
|
|
716
|
-
},
|
|
746
|
+
}, It = (e) => {
|
|
717
747
|
if (e !== void 0) return [
|
|
718
748
|
`• ${e.behind.length} @voltro/* package(s) are not on ${e.majority}:`,
|
|
719
749
|
...e.behind.map((e) => ` ${e.pkg} ${e.version}`),
|
|
@@ -731,60 +761,60 @@ __installPublicEnv(publicEnvValues)
|
|
|
731
761
|
" its pattern: the one that produced this report was `@voltro/[a-z-]+`,",
|
|
732
762
|
" which silently skips `@voltro/i18n` because the name contains digits."
|
|
733
763
|
].join("\n");
|
|
734
|
-
},
|
|
735
|
-
let n =
|
|
764
|
+
}, Lt = (e, t) => {
|
|
765
|
+
let n = Ft(e);
|
|
736
766
|
n !== void 0 && t.warn?.(`@voltro/* version skew: ${n.behind.length} package(s) are not on ${n.majority}`, {
|
|
737
767
|
majority: n.majority,
|
|
738
768
|
behind: n.behind.map((e) => `${e.pkg}@${e.version}`),
|
|
739
769
|
fix: "the framework ships in lockstep; bump the listed packages and reinstall"
|
|
740
770
|
});
|
|
741
|
-
},
|
|
771
|
+
}, Rt = S({ scope: "vite" }), zt = /\x1b\[[0-9;]*m/g, Bt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Vt = (e) => e.replace(zt, "").replace(Bt, "").trim(), Ht = /proxy error/i, Ut = [
|
|
742
772
|
"ECONNREFUSED",
|
|
743
773
|
"ECONNRESET",
|
|
744
774
|
"ECONNABORTED",
|
|
745
775
|
"EPIPE",
|
|
746
776
|
"ETIMEDOUT"
|
|
747
|
-
],
|
|
777
|
+
], Wt = (e, t = 0) => {
|
|
748
778
|
if (e == null || t > 5) return !1;
|
|
749
779
|
let n = e;
|
|
750
|
-
return typeof n.code == "string" &&
|
|
751
|
-
},
|
|
780
|
+
return typeof n.code == "string" && Ut.includes(n.code) || typeof n.message == "string" && Ut.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Wt(e, t + 1)) ? !0 : Wt(n.cause, t + 1);
|
|
781
|
+
}, Gt = 4e3, Kt = () => {
|
|
752
782
|
let e = /* @__PURE__ */ new Set(), t = 0, n = {
|
|
753
783
|
hasWarned: !1,
|
|
754
784
|
info: (e) => {
|
|
755
|
-
let t =
|
|
756
|
-
t.length !== 0 &&
|
|
785
|
+
let t = Vt(e);
|
|
786
|
+
t.length !== 0 && Rt.info(t);
|
|
757
787
|
},
|
|
758
788
|
warn: (e) => {
|
|
759
789
|
n.hasWarned = !0;
|
|
760
|
-
let t =
|
|
761
|
-
t.length !== 0 &&
|
|
790
|
+
let t = Vt(e);
|
|
791
|
+
t.length !== 0 && Rt.warn(t);
|
|
762
792
|
},
|
|
763
793
|
warnOnce: (t) => {
|
|
764
|
-
let r =
|
|
765
|
-
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 &&
|
|
794
|
+
let r = Vt(t);
|
|
795
|
+
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Rt.warn(r));
|
|
766
796
|
},
|
|
767
797
|
error: (e, n) => {
|
|
768
|
-
let r =
|
|
798
|
+
let r = Vt(e), i = n?.error;
|
|
769
799
|
if (r.length !== 0) {
|
|
770
|
-
if (
|
|
800
|
+
if (Ht.test(r) && Wt(i)) {
|
|
771
801
|
let e = Date.now();
|
|
772
|
-
e - t >
|
|
802
|
+
e - t > Gt && (t = e, Rt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
|
|
773
803
|
return;
|
|
774
804
|
}
|
|
775
|
-
|
|
805
|
+
Rt.error(r, {}, i);
|
|
776
806
|
}
|
|
777
807
|
},
|
|
778
808
|
clearScreen: () => {},
|
|
779
809
|
hasErrorLogged: (e) => !1
|
|
780
810
|
};
|
|
781
811
|
return n;
|
|
782
|
-
},
|
|
812
|
+
}, qt = (e = process.env) => {
|
|
783
813
|
let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
|
|
784
814
|
if (t === void 0 || t.trim() === "") return 4;
|
|
785
815
|
let n = Number(t);
|
|
786
816
|
return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
|
|
787
|
-
},
|
|
817
|
+
}, Jt = (e) => {
|
|
788
818
|
let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
|
|
789
819
|
let e = r.shift();
|
|
790
820
|
e ? e() : n--;
|
|
@@ -802,8 +832,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
802
832
|
return n;
|
|
803
833
|
}
|
|
804
834
|
};
|
|
805
|
-
},
|
|
806
|
-
let t =
|
|
835
|
+
}, Yt = (e) => {
|
|
836
|
+
let t = Jt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
|
|
807
837
|
return {
|
|
808
838
|
load: (i, a) => {
|
|
809
839
|
if (r.has(i)) return a();
|
|
@@ -833,7 +863,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
833
863
|
return r.size;
|
|
834
864
|
}
|
|
835
865
|
};
|
|
836
|
-
},
|
|
866
|
+
}, Xt = (e) => {
|
|
837
867
|
let t = [];
|
|
838
868
|
for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
|
|
839
869
|
name: n.slice(5, -2),
|
|
@@ -849,7 +879,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
849
879
|
optional: !1
|
|
850
880
|
});
|
|
851
881
|
return t;
|
|
852
|
-
},
|
|
882
|
+
}, Zt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Qt = async (e) => {
|
|
853
883
|
let t = h(e);
|
|
854
884
|
for (let e = 0; e < 4; e++) {
|
|
855
885
|
let e = p(t, "project.json");
|
|
@@ -867,8 +897,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
867
897
|
t = n;
|
|
868
898
|
}
|
|
869
899
|
return null;
|
|
870
|
-
},
|
|
871
|
-
let t = await
|
|
900
|
+
}, $t = async (e) => {
|
|
901
|
+
let t = await Qt(e);
|
|
872
902
|
if (!t) return [];
|
|
873
903
|
let { projectDir: n, manifest: r } = t, i = u(e), a = r.apps ?? {}, o = [];
|
|
874
904
|
for (let [e, t] of Object.entries(a)) {
|
|
@@ -877,23 +907,23 @@ __installPublicEnv(publicEnvValues)
|
|
|
877
907
|
if (!T(r)) continue;
|
|
878
908
|
let a;
|
|
879
909
|
try {
|
|
880
|
-
let { pages: e } = await
|
|
910
|
+
let { pages: e } = await Q(r);
|
|
881
911
|
a = e.map((e) => ({
|
|
882
912
|
pattern: e.pattern,
|
|
883
|
-
params:
|
|
913
|
+
params: Xt(e.pattern)
|
|
884
914
|
}));
|
|
885
915
|
} catch {
|
|
886
916
|
continue;
|
|
887
917
|
}
|
|
888
918
|
o.push({
|
|
889
|
-
key:
|
|
919
|
+
key: Zt(e),
|
|
890
920
|
origin: `http://localhost:${t.port}`,
|
|
891
921
|
...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
|
|
892
922
|
routes: a
|
|
893
923
|
});
|
|
894
924
|
}
|
|
895
925
|
return o;
|
|
896
|
-
},
|
|
926
|
+
}, en = (e) => {
|
|
897
927
|
if (e.params.length === 0) return `'${e.pattern}'`;
|
|
898
928
|
let t = e.pattern;
|
|
899
929
|
for (let n of e.params) {
|
|
@@ -901,21 +931,21 @@ __installPublicEnv(publicEnvValues)
|
|
|
901
931
|
t = t.replace(e, r);
|
|
902
932
|
}
|
|
903
933
|
return "`" + t + "`";
|
|
904
|
-
},
|
|
934
|
+
}, tn = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
|
|
905
935
|
let t = "string";
|
|
906
936
|
return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
|
|
907
|
-
}).join("; ")} }`,
|
|
908
|
-
let r =
|
|
937
|
+
}).join("; ")} }`, nn = (e, t, n) => {
|
|
938
|
+
let r = tn(e), i = en(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
|
|
909
939
|
return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
|
|
910
|
-
},
|
|
940
|
+
}, rn = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${nn(e, !1)},`).join("\n")}\n}`, an = (e, t) => {
|
|
911
941
|
if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
|
|
912
|
-
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)}: ${
|
|
942
|
+
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)}: ${nn(e, !0, i)},`);
|
|
913
943
|
return ` ${e.key}: {\n${a.join("\n")}\n },`;
|
|
914
|
-
},
|
|
944
|
+
}, on = async (e) => {
|
|
915
945
|
let t = e.pages.map((e) => ({
|
|
916
946
|
pattern: e.pattern,
|
|
917
|
-
params:
|
|
918
|
-
})), n = await
|
|
947
|
+
params: Xt(e.pattern)
|
|
948
|
+
})), n = await $t(e.appRoot), r = [
|
|
919
949
|
"// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
|
|
920
950
|
"// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
|
|
921
951
|
"// Type-safe route builders consumed by <Link to={...}>.",
|
|
@@ -924,7 +954,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
924
954
|
"",
|
|
925
955
|
"type EmptyParams = Record<string, never>",
|
|
926
956
|
""
|
|
927
|
-
].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${
|
|
957
|
+
].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${rn(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => an(e, i)).join("\n")}\n} as const\n`}`, o = p(e.appRoot, ".framework", "routes.generated.ts");
|
|
928
958
|
await O.mkdir(d(o), { recursive: !0 });
|
|
929
959
|
let s = null;
|
|
930
960
|
try {
|
|
@@ -937,37 +967,37 @@ __installPublicEnv(publicEnvValues)
|
|
|
937
967
|
path: o,
|
|
938
968
|
wrote: !0
|
|
939
969
|
});
|
|
940
|
-
},
|
|
970
|
+
}, sn = (e) => {
|
|
941
971
|
if (e === "" || e === "/") return "/";
|
|
942
972
|
let t = e.startsWith("/") ? e : `/${e}`;
|
|
943
973
|
return t.endsWith("/") ? t.slice(0, -1) : t;
|
|
944
|
-
},
|
|
945
|
-
let n = e.endsWith("/") ? e.slice(0, -1) : e, r =
|
|
974
|
+
}, cn = (e, t) => {
|
|
975
|
+
let n = e.endsWith("/") ? e.slice(0, -1) : e, r = sn(t);
|
|
946
976
|
return r === "/" ? `${n}/` : `${n}${r}`;
|
|
947
|
-
},
|
|
948
|
-
let r =
|
|
977
|
+
}, ln = (e, t, n) => {
|
|
978
|
+
let r = sn(e);
|
|
949
979
|
return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
|
|
950
|
-
},
|
|
980
|
+
}, un = (e) => e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"), dn = (e) => {
|
|
951
981
|
let { siteUrl: t, entries: n } = e, r = e.locales && e.locales.length > 1 ? e.locales : void 0, i = e.defaultLocale ?? r?.[0] ?? "en", a = r !== void 0, o = /* @__PURE__ */ new Map(), s = (e) => {
|
|
952
982
|
if (!r) return "";
|
|
953
|
-
let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${
|
|
954
|
-
return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${
|
|
983
|
+
let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${un(n)}" href="${un(cn(t, ln(e, n, i)))}" />`);
|
|
984
|
+
return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${un(cn(t, ln(e, i, i)))}" />`), `\n${n.join("\n")}`;
|
|
955
985
|
};
|
|
956
986
|
for (let e of n) {
|
|
957
987
|
let n = r ?? [i];
|
|
958
988
|
for (let r of n) {
|
|
959
|
-
let n =
|
|
960
|
-
o.set(n, ` <url>\n <loc>${
|
|
989
|
+
let n = cn(t, ln(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${un(e.lastmod)}</lastmod>` : "";
|
|
990
|
+
o.set(n, ` <url>\n <loc>${un(n)}</loc>${a}${s(e.path)}\n </url>`);
|
|
961
991
|
}
|
|
962
992
|
}
|
|
963
993
|
let c = [...o.keys()].sort().map((e) => o.get(e)).join("\n");
|
|
964
994
|
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset${a ? " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"" : " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\""}>\n${c}\n</urlset>\n`;
|
|
965
|
-
},
|
|
995
|
+
}, fn = (e) => {
|
|
966
996
|
if (!e.indexable) return "User-agent: *\nDisallow: /\n";
|
|
967
997
|
let t = ["User-agent: *", "Allow: /"];
|
|
968
|
-
for (let n of e.disallow ?? []) t.push(`Disallow: ${
|
|
998
|
+
for (let n of e.disallow ?? []) t.push(`Disallow: ${sn(n)}`);
|
|
969
999
|
return e.sitemapUrl && t.push("", `Sitemap: ${e.sitemapUrl}`), `${t.join("\n")}\n`;
|
|
970
|
-
},
|
|
1000
|
+
}, pn = 256, mn = (e = pn) => {
|
|
971
1001
|
let t = [], n = /* @__PURE__ */ new Set();
|
|
972
1002
|
return {
|
|
973
1003
|
emit(r, i) {
|
|
@@ -990,17 +1020,17 @@ __installPublicEnv(publicEnvValues)
|
|
|
990
1020
|
return t.slice();
|
|
991
1021
|
}
|
|
992
1022
|
};
|
|
993
|
-
},
|
|
994
|
-
let n =
|
|
1023
|
+
}, hn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, gn = () => `: keep-alive ${Date.now()}\n\n`, _n = 8e3, vn = (e, t = _n) => {
|
|
1024
|
+
let n = bn(e);
|
|
995
1025
|
return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
|
|
996
|
-
},
|
|
1026
|
+
}, yn = 4, bn = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
|
|
997
1027
|
if (e instanceof Error) {
|
|
998
1028
|
let r = e.stack ?? `${e.name}: ${e.message}`;
|
|
999
1029
|
if (n.has(e)) return `${r}\n [cycle]`;
|
|
1000
1030
|
n.add(e);
|
|
1001
1031
|
let i = [];
|
|
1002
|
-
if (t <
|
|
1003
|
-
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${bn(
|
|
1032
|
+
if (t < yn) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${xn(bn(a, t + 1, n))}`);
|
|
1033
|
+
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${xn(bn(e.cause, t + 1, n))}`);
|
|
1004
1034
|
return r + i.join("");
|
|
1005
1035
|
}
|
|
1006
1036
|
try {
|
|
@@ -1008,30 +1038,30 @@ __installPublicEnv(publicEnvValues)
|
|
|
1008
1038
|
} catch {
|
|
1009
1039
|
return "[unstringifiable thrown value]";
|
|
1010
1040
|
}
|
|
1011
|
-
},
|
|
1041
|
+
}, xn = (e) => {
|
|
1012
1042
|
let t = e.split("\n");
|
|
1013
1043
|
return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
|
|
1014
|
-
},
|
|
1044
|
+
}, Sn = {
|
|
1015
1045
|
trace: 0,
|
|
1016
1046
|
debug: 1,
|
|
1017
1047
|
info: 2,
|
|
1018
1048
|
warn: 3,
|
|
1019
1049
|
error: 4,
|
|
1020
1050
|
fatal: 5
|
|
1021
|
-
},
|
|
1051
|
+
}, Cn = 2e3, wn = 200, Tn = class {
|
|
1022
1052
|
capacity;
|
|
1023
1053
|
buffer = [];
|
|
1024
|
-
constructor(e =
|
|
1054
|
+
constructor(e = Cn) {
|
|
1025
1055
|
this.capacity = e;
|
|
1026
1056
|
}
|
|
1027
1057
|
append(e) {
|
|
1028
1058
|
this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
|
|
1029
1059
|
}
|
|
1030
1060
|
query(e = {}) {
|
|
1031
|
-
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ??
|
|
1061
|
+
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? wn, this.capacity), i = e.minLevel === void 0 ? Sn.trace : Sn[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
|
|
1032
1062
|
for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
|
|
1033
1063
|
let r = this.buffer[e];
|
|
1034
|
-
r.ts < t || r.ts > n ||
|
|
1064
|
+
r.ts < t || r.ts > n || Sn[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);
|
|
1035
1065
|
}
|
|
1036
1066
|
return l.reverse();
|
|
1037
1067
|
}
|
|
@@ -1044,7 +1074,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1044
1074
|
clear() {
|
|
1045
1075
|
this.buffer = [];
|
|
1046
1076
|
}
|
|
1047
|
-
},
|
|
1077
|
+
}, En = null, Dn = () => (En === null && (En = new Tn()), En), On = (e) => {
|
|
1048
1078
|
if (typeof e == "string") return e;
|
|
1049
1079
|
if (e instanceof Error) return e.message;
|
|
1050
1080
|
try {
|
|
@@ -1052,28 +1082,28 @@ __installPublicEnv(publicEnvValues)
|
|
|
1052
1082
|
} catch {
|
|
1053
1083
|
return String(e);
|
|
1054
1084
|
}
|
|
1055
|
-
},
|
|
1085
|
+
}, kn = 8e3, An = (e) => typeof e == "string" ? e.length <= kn ? e : `${e.slice(0, kn)}… [voltro: truncated]` : typeof e != "object" || !e ? e : vn(e, kn), jn = (e, t) => {
|
|
1056
1086
|
try {
|
|
1057
1087
|
e(...t);
|
|
1058
1088
|
} catch (n) {
|
|
1059
1089
|
try {
|
|
1060
|
-
e(...t.map(
|
|
1090
|
+
e(...t.map(An)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${kn} chars per argument.`);
|
|
1061
1091
|
} catch {
|
|
1062
1092
|
e(`[voltro] a console.error argument could not be formatted at all (${t.length} arg(s)).`);
|
|
1063
1093
|
}
|
|
1064
1094
|
}
|
|
1065
|
-
},
|
|
1095
|
+
}, Mn = (e) => {
|
|
1066
1096
|
let t = {
|
|
1067
1097
|
log: console.log.bind(console),
|
|
1068
1098
|
info: console.info.bind(console),
|
|
1069
1099
|
warn: console.warn.bind(console),
|
|
1070
1100
|
error: console.error.bind(console),
|
|
1071
1101
|
debug: console.debug.bind(console)
|
|
1072
|
-
}, n =
|
|
1073
|
-
if (
|
|
1102
|
+
}, n = Dn(), r = !1, i = (i) => (...a) => {
|
|
1103
|
+
if (jn(t[i], a), !r) {
|
|
1074
1104
|
r = !0;
|
|
1075
1105
|
try {
|
|
1076
|
-
let t = a.length > 0 ?
|
|
1106
|
+
let t = a.length > 0 ? On(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = F();
|
|
1077
1107
|
e.emit("log", {
|
|
1078
1108
|
level: i,
|
|
1079
1109
|
message: r,
|
|
@@ -1111,7 +1141,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1111
1141
|
argsCount: 1,
|
|
1112
1142
|
...t.scope === void 0 ? {} : { scope: t.scope }
|
|
1113
1143
|
});
|
|
1114
|
-
let a =
|
|
1144
|
+
let a = F(), o = a !== void 0 && t.fields.traceId === void 0 ? {
|
|
1115
1145
|
...t.fields,
|
|
1116
1146
|
traceId: a.traceId
|
|
1117
1147
|
} : t.fields;
|
|
@@ -1131,24 +1161,24 @@ __installPublicEnv(publicEnvValues)
|
|
|
1131
1161
|
return () => {
|
|
1132
1162
|
console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
|
|
1133
1163
|
};
|
|
1134
|
-
},
|
|
1164
|
+
}, Nn = 2e3, Pn = 8, Fn = 1e3, In = 200, J = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Ln = (e) => {
|
|
1135
1165
|
switch (e) {
|
|
1136
1166
|
case "error": return "error";
|
|
1137
1167
|
case "warn": return "warn";
|
|
1138
1168
|
case "debug": return "debug";
|
|
1139
1169
|
default: return "info";
|
|
1140
1170
|
}
|
|
1141
|
-
},
|
|
1171
|
+
}, Rn = S({ scope: "client" }), zn = (e, t) => {
|
|
1142
1172
|
let n;
|
|
1143
1173
|
try {
|
|
1144
1174
|
n = JSON.parse(e);
|
|
1145
1175
|
} catch {
|
|
1146
|
-
return
|
|
1176
|
+
return Bn(400, { error: "invalid JSON body" });
|
|
1147
1177
|
}
|
|
1148
|
-
if (typeof n != "object" || !n) return
|
|
1178
|
+
if (typeof n != "object" || !n) return Bn(400, { error: "body must be a JSON object" });
|
|
1149
1179
|
let r = n;
|
|
1150
|
-
if (!Array.isArray(r.entries)) return
|
|
1151
|
-
let i = typeof r.app == "string" ?
|
|
1180
|
+
if (!Array.isArray(r.entries)) return Bn(400, { error: "entries must be an array" });
|
|
1181
|
+
let i = typeof r.app == "string" ? J(r.app, 120) : void 0, a = typeof r.page == "string" ? J(r.page, 200) : void 0, o = typeof r.ua == "string" ? J(r.ua, 200) : void 0, s = r.entries.slice(0, In), c = 0;
|
|
1152
1182
|
for (let e of s) {
|
|
1153
1183
|
if (typeof e != "object" || !e) continue;
|
|
1154
1184
|
let n = e;
|
|
@@ -1159,7 +1189,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1159
1189
|
"warn",
|
|
1160
1190
|
"error",
|
|
1161
1191
|
"debug"
|
|
1162
|
-
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l =
|
|
1192
|
+
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = J(n.message, Nn), u = Array.isArray(n.args) ? n.args.slice(0, Pn).filter((e) => typeof e == "string").map((e) => J(e, Fn)) : void 0, d = typeof n.stack == "string" ? J(n.stack, Nn) : void 0;
|
|
1163
1193
|
t.emit("clientLog", {
|
|
1164
1194
|
ts: s,
|
|
1165
1195
|
level: r,
|
|
@@ -1174,35 +1204,35 @@ __installPublicEnv(publicEnvValues)
|
|
|
1174
1204
|
...i === void 0 ? {} : { app: i },
|
|
1175
1205
|
...a === void 0 ? {} : { page: a },
|
|
1176
1206
|
...u !== void 0 && u.length > 0 ? { args: u } : {}
|
|
1177
|
-
}, p =
|
|
1178
|
-
(p === "error" || p === "warn") && d !== void 0 ?
|
|
1207
|
+
}, p = Ln(r);
|
|
1208
|
+
(p === "error" || p === "warn") && d !== void 0 ? Rn[p](l, f, { stack: d }) : Rn[p](l, {
|
|
1179
1209
|
...f,
|
|
1180
1210
|
...d === void 0 ? {} : { stack: d }
|
|
1181
1211
|
}), c++;
|
|
1182
1212
|
}
|
|
1183
|
-
return
|
|
1213
|
+
return Bn(202, {
|
|
1184
1214
|
accepted: c,
|
|
1185
1215
|
dropped: r.entries.length - c
|
|
1186
1216
|
});
|
|
1187
|
-
},
|
|
1217
|
+
}, Bn = (e, t) => ({
|
|
1188
1218
|
status: e,
|
|
1189
1219
|
contentType: "application/json; charset=utf-8",
|
|
1190
1220
|
body: JSON.stringify(t)
|
|
1191
|
-
}),
|
|
1221
|
+
}), Vn = "/_voltro/inspect/clientLog", Hn = [
|
|
1192
1222
|
"trace",
|
|
1193
1223
|
"debug",
|
|
1194
1224
|
"info",
|
|
1195
1225
|
"warn",
|
|
1196
1226
|
"error",
|
|
1197
1227
|
"fatal"
|
|
1198
|
-
],
|
|
1228
|
+
], Un = {
|
|
1199
1229
|
trace: "TRACE",
|
|
1200
1230
|
debug: "DEBUG",
|
|
1201
1231
|
info: "INFO ",
|
|
1202
1232
|
warn: "WARN ",
|
|
1203
1233
|
error: "ERROR",
|
|
1204
1234
|
fatal: "FATAL"
|
|
1205
|
-
},
|
|
1235
|
+
}, Wn = (e) => Hn.includes(e), Gn = (e, t, n = {}) => {
|
|
1206
1236
|
if (c()) return {
|
|
1207
1237
|
status: 503,
|
|
1208
1238
|
contentType: "application/json",
|
|
@@ -1233,7 +1263,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1233
1263
|
Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
|
|
1234
1264
|
}
|
|
1235
1265
|
let f = a.get("level");
|
|
1236
|
-
f !== null &&
|
|
1266
|
+
f !== null && Wn(f) && (o.minLevel = f);
|
|
1237
1267
|
let p = a.get("source");
|
|
1238
1268
|
(p === "server" || p === "client") && (o.source = p);
|
|
1239
1269
|
let m = a.get("scope");
|
|
@@ -1246,7 +1276,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1246
1276
|
if ((a.get("format") ?? "json") === "text") return {
|
|
1247
1277
|
status: 200,
|
|
1248
1278
|
contentType: "text/plain; charset=utf-8",
|
|
1249
|
-
body: _.map(
|
|
1279
|
+
body: _.map(Kn).join("\n") + (_.length > 0 ? "\n" : "")
|
|
1250
1280
|
};
|
|
1251
1281
|
let v = {
|
|
1252
1282
|
capturedAt: Date.now(),
|
|
@@ -1260,40 +1290,40 @@ __installPublicEnv(publicEnvValues)
|
|
|
1260
1290
|
contentType: "application/json; charset=utf-8",
|
|
1261
1291
|
body: JSON.stringify(v)
|
|
1262
1292
|
};
|
|
1263
|
-
},
|
|
1264
|
-
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 =
|
|
1265
|
-
return `${n}:${r}:${i}.${a} ${
|
|
1266
|
-
},
|
|
1293
|
+
}, Kn = (e) => {
|
|
1294
|
+
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 = Jn(e.fields);
|
|
1295
|
+
return `${n}:${r}:${i}.${a} ${Un[e.level]} ${o} ${e.message}${s}`;
|
|
1296
|
+
}, qn = 80, Jn = (e) => {
|
|
1267
1297
|
let t = Object.entries(e);
|
|
1268
1298
|
if (t.length === 0) return "";
|
|
1269
1299
|
let n = [];
|
|
1270
1300
|
for (let [e, r] of t) {
|
|
1271
1301
|
if (r === void 0) continue;
|
|
1272
|
-
let t =
|
|
1302
|
+
let t = Yn(r);
|
|
1273
1303
|
n.push(`${e}=${t}`);
|
|
1274
1304
|
}
|
|
1275
1305
|
return n.length > 0 ? " " + n.join(" ") : "";
|
|
1276
|
-
},
|
|
1306
|
+
}, Yn = (e) => {
|
|
1277
1307
|
if (typeof e == "string") {
|
|
1278
|
-
let t = e.length >
|
|
1308
|
+
let t = e.length > qn ? e.slice(0, qn) + "…" : e;
|
|
1279
1309
|
return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
|
|
1280
1310
|
}
|
|
1281
1311
|
if (e === null) return "null";
|
|
1282
1312
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
1283
1313
|
try {
|
|
1284
1314
|
let t = JSON.stringify(e);
|
|
1285
|
-
return t.length >
|
|
1315
|
+
return t.length > qn ? t.slice(0, qn) + "…" : t;
|
|
1286
1316
|
} catch {
|
|
1287
1317
|
return "[unserialisable]";
|
|
1288
1318
|
}
|
|
1289
|
-
},
|
|
1319
|
+
}, Xn = "/_voltro/inspect/logs", Zn = (e, t, n) => {
|
|
1290
1320
|
if (t.headers.authorization !== void 0) return !1;
|
|
1291
1321
|
let { token: r } = n;
|
|
1292
1322
|
if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
|
|
1293
1323
|
e.setHeader("authorization", `Bearer ${r}`);
|
|
1294
1324
|
let i = n.writeToken;
|
|
1295
1325
|
return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
|
|
1296
|
-
},
|
|
1326
|
+
}, Qn = [{
|
|
1297
1327
|
match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
|
|
1298
1328
|
handle: (e, t) => {
|
|
1299
1329
|
let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
|
|
@@ -1305,13 +1335,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
1305
1335
|
});
|
|
1306
1336
|
} else t.info(n);
|
|
1307
1337
|
}
|
|
1308
|
-
}],
|
|
1338
|
+
}], $n = () => {
|
|
1309
1339
|
let e = {
|
|
1310
1340
|
warn: console.warn.bind(console),
|
|
1311
1341
|
error: console.error.bind(console)
|
|
1312
1342
|
}, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
|
|
1313
1343
|
if (!n) {
|
|
1314
|
-
for (let e of
|
|
1344
|
+
for (let e of Qn) if (e.match(i[0])) {
|
|
1315
1345
|
n = !0;
|
|
1316
1346
|
try {
|
|
1317
1347
|
e.handle(i, t);
|
|
@@ -1326,7 +1356,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1326
1356
|
return console.warn = r("warn"), console.error = r("error"), () => {
|
|
1327
1357
|
console.warn = e.warn, console.error = e.error;
|
|
1328
1358
|
};
|
|
1329
|
-
},
|
|
1359
|
+
}, er = {
|
|
1330
1360
|
loader: "it runs on the server, and the router caches its result per route + params",
|
|
1331
1361
|
renderMode: "it picks the server render strategy",
|
|
1332
1362
|
dynamic: "it picks the server render strategy",
|
|
@@ -1337,7 +1367,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1337
1367
|
cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
|
|
1338
1368
|
interactive: "it decides how much client JS the server ships",
|
|
1339
1369
|
tenantAware: "it is part of the server-side cache key"
|
|
1340
|
-
},
|
|
1370
|
+
}, tr = Object.keys(er), nr = (e) => t.test(e), rr = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), ir = "virtual:voltro-route-refresh", ar = `\0${ir}`, or = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, sr = () => `
|
|
1341
1371
|
// GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
|
|
1342
1372
|
|
|
1343
1373
|
/** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
|
|
@@ -1366,11 +1396,11 @@ const stableForm = (value) => {
|
|
|
1366
1396
|
* readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
|
|
1367
1397
|
* one of THESE cannot be hot-applied: the server already ran with the old
|
|
1368
1398
|
* value. Everything else a page exports is plain client-side data. */
|
|
1369
|
-
const serverRelevantExports = ${JSON.stringify(
|
|
1399
|
+
const serverRelevantExports = ${JSON.stringify(tr)}
|
|
1370
1400
|
|
|
1371
1401
|
/** Name → the server step that already consumed it, so the reload message can
|
|
1372
1402
|
* say WHY rather than just WHAT. Injected from the same single source. */
|
|
1373
|
-
const serverExportEffect = ${JSON.stringify(
|
|
1403
|
+
const serverExportEffect = ${JSON.stringify(er)}
|
|
1374
1404
|
|
|
1375
1405
|
/** The reason \`name\` forces a reload, for the console line. */
|
|
1376
1406
|
export const serverEffectOf = (name) =>
|
|
@@ -1413,7 +1443,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
|
|
|
1413
1443
|
const previousHook = globalThis.__getReactRefreshIgnoredExports
|
|
1414
1444
|
globalThis.__getReactRefreshIgnoredExports = (args) =>
|
|
1415
1445
|
ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
|
|
1416
|
-
`,
|
|
1446
|
+
`, cr = (e) => `
|
|
1417
1447
|
if (import.meta.hot) {
|
|
1418
1448
|
// Self-import to read our OWN exports, the same technique the react plugin
|
|
1419
1449
|
// uses; the namespace is only complete after evaluation, hence the promise.
|
|
@@ -1440,57 +1470,57 @@ import {
|
|
|
1440
1470
|
registerRouteModule as __voltro_registerRouteModule,
|
|
1441
1471
|
routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
|
|
1442
1472
|
serverEffectOf as __voltro_serverEffect,
|
|
1443
|
-
} from '${
|
|
1444
|
-
`,
|
|
1445
|
-
let [i = "", a] =
|
|
1446
|
-
if (!i.endsWith(".tsx") || a !== void 0 &&
|
|
1447
|
-
let o =
|
|
1473
|
+
} from '${ir}'
|
|
1474
|
+
`, lr = (e) => e.replace(/\\/g, "/"), ur = (e, t) => {
|
|
1475
|
+
let [i = "", a] = lr(e).split("?");
|
|
1476
|
+
if (!i.endsWith(".tsx") || a !== void 0 && or.test(a)) return !1;
|
|
1477
|
+
let o = lr(t).replace(/\/$/, "");
|
|
1448
1478
|
return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
|
|
1449
|
-
},
|
|
1479
|
+
}, dr = (e, t, n) => ur(t, n) ? `${e}${cr(lr(t).split("?")[0] ?? t)}` : null, fr = (e) => ({
|
|
1450
1480
|
name: "voltro:route-fast-refresh",
|
|
1451
1481
|
enforce: "pre",
|
|
1452
|
-
resolveId: (e) => e === "virtual:voltro-route-refresh" ?
|
|
1453
|
-
load: (e) => e ===
|
|
1482
|
+
resolveId: (e) => e === "virtual:voltro-route-refresh" ? ar : void 0,
|
|
1483
|
+
load: (e) => e === ar ? sr() : void 0,
|
|
1454
1484
|
transform: (t, n, r) => {
|
|
1455
1485
|
if (r?.ssr === !0) return null;
|
|
1456
|
-
let i =
|
|
1486
|
+
let i = dr(t, n, e);
|
|
1457
1487
|
return i === null ? null : {
|
|
1458
1488
|
code: i,
|
|
1459
1489
|
map: null
|
|
1460
1490
|
};
|
|
1461
1491
|
}
|
|
1462
|
-
}),
|
|
1492
|
+
}), pr = [
|
|
1463
1493
|
"static",
|
|
1464
1494
|
"spa",
|
|
1465
1495
|
"ssr",
|
|
1466
1496
|
"isr"
|
|
1467
|
-
],
|
|
1497
|
+
], mr = (e) => typeof e == "string" && pr.includes(e), hr = pr.map((e) => `'${e}'`).join(" | "), gr = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${hr}.${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)." : ""}`, _r = class extends Error {
|
|
1468
1498
|
page;
|
|
1469
1499
|
value;
|
|
1470
1500
|
name = "InvalidRenderModeError";
|
|
1471
1501
|
constructor(e, t) {
|
|
1472
|
-
super(
|
|
1502
|
+
super(gr(e, t)), this.page = e, this.value = t;
|
|
1473
1503
|
}
|
|
1474
|
-
},
|
|
1504
|
+
}, vr = (e, t = "<page>") => {
|
|
1475
1505
|
if (e.renderMode !== void 0 && e.renderMode !== null) {
|
|
1476
|
-
if (!
|
|
1506
|
+
if (!mr(e.renderMode)) throw new _r(t, String(e.renderMode));
|
|
1477
1507
|
return e.renderMode;
|
|
1478
1508
|
}
|
|
1479
1509
|
return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
|
|
1480
|
-
},
|
|
1481
|
-
renderMode:
|
|
1510
|
+
}, yr = (e, t = "<page>") => ({
|
|
1511
|
+
renderMode: vr(e, t),
|
|
1482
1512
|
tenantAware: e.tenantAware === !0,
|
|
1483
|
-
revalidateMs:
|
|
1484
|
-
staleWhileRevalidateMs:
|
|
1513
|
+
revalidateMs: lt(e.revalidate),
|
|
1514
|
+
staleWhileRevalidateMs: lt(e.staleWhileRevalidate) ?? 0,
|
|
1485
1515
|
cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
|
|
1486
1516
|
interactive: e.interactive ?? "full",
|
|
1487
1517
|
hasLoader: typeof e.loader == "function",
|
|
1488
1518
|
hasMeta: e.meta != null,
|
|
1489
1519
|
hasGetStaticPaths: typeof e.getStaticPaths == "function"
|
|
1490
|
-
}),
|
|
1491
|
-
|
|
1520
|
+
}), br = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, xr = (e) => br.exec(e)?.[1] ?? null, Sr = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, Cr = (e) => {
|
|
1521
|
+
Sr.lastIndex = 0;
|
|
1492
1522
|
let t;
|
|
1493
|
-
for (; (t =
|
|
1523
|
+
for (; (t = Sr.exec(e)) !== null;) {
|
|
1494
1524
|
let e = t[2];
|
|
1495
1525
|
if (e.startsWith(".")) for (let n of t[1].split(",")) {
|
|
1496
1526
|
let t = n.lastIndexOf(" as ");
|
|
@@ -1498,16 +1528,16 @@ import {
|
|
|
1498
1528
|
}
|
|
1499
1529
|
}
|
|
1500
1530
|
return null;
|
|
1501
|
-
},
|
|
1531
|
+
}, wr = /export\s*\{([^}]*)\}/g, Tr = (e) => {
|
|
1502
1532
|
if (/export\s+default\b/.test(e)) return !0;
|
|
1503
|
-
|
|
1533
|
+
wr.lastIndex = 0;
|
|
1504
1534
|
let t;
|
|
1505
|
-
for (; (t =
|
|
1535
|
+
for (; (t = wr.exec(e)) !== null;) for (let e of t[1].split(",")) {
|
|
1506
1536
|
let t = e.lastIndexOf(" as ");
|
|
1507
1537
|
if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
|
|
1508
1538
|
}
|
|
1509
1539
|
return !1;
|
|
1510
|
-
},
|
|
1540
|
+
}, Er = async (e, t) => {
|
|
1511
1541
|
let n = (await Promise.all(t.map(async (t) => {
|
|
1512
1542
|
let n;
|
|
1513
1543
|
try {
|
|
@@ -1515,33 +1545,33 @@ import {
|
|
|
1515
1545
|
} catch {
|
|
1516
1546
|
return null;
|
|
1517
1547
|
}
|
|
1518
|
-
let r =
|
|
1519
|
-
return r !== null && !
|
|
1548
|
+
let r = xr(n);
|
|
1549
|
+
return r !== null && !mr(r) ? gr(p("src", "pages", t.file), r) : Tr(n) ? null : `${p("src", "pages", t.file)} is a route (a \`page.tsx\` under src/pages/) but exports no default.\n\n A page's default export IS its component — the router has nothing to render without it,\n and the failure would otherwise surface only in \`voltro build\`'s prerender as\n "SSR received a descriptor with no Component", long after the file was written.\n\n Fix: \`export default function Page() { … }\`, or re-export another page's component\n (\`export { default } from '../page'\`). If this file is NOT a route, rename it —\n only the reserved names route, and anything else under src/pages/ is ordinary code\n that may live beside the page that uses it.`;
|
|
1520
1550
|
}))).filter((e) => e !== null);
|
|
1521
1551
|
if (n.length !== 0) throw Error(n.join("\n\n"));
|
|
1522
|
-
},
|
|
1552
|
+
}, Y = p(L(), ".voltro", "logs"), Dr = () => {
|
|
1523
1553
|
let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
|
|
1524
1554
|
return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
|
|
1525
|
-
},
|
|
1526
|
-
if (
|
|
1527
|
-
|
|
1528
|
-
let e = Date.now() -
|
|
1555
|
+
}, Or = !1, kr = () => {
|
|
1556
|
+
if (Or) return;
|
|
1557
|
+
Or = !0;
|
|
1558
|
+
let e = Date.now() - Dr(), t = [];
|
|
1529
1559
|
try {
|
|
1530
|
-
t = A(
|
|
1560
|
+
t = A(Y);
|
|
1531
1561
|
} catch {
|
|
1532
1562
|
return;
|
|
1533
1563
|
}
|
|
1534
1564
|
for (let n of t) {
|
|
1535
1565
|
if (!n.endsWith(".log")) continue;
|
|
1536
|
-
let t = p(
|
|
1566
|
+
let t = p(Y, n);
|
|
1537
1567
|
try {
|
|
1538
1568
|
j(t).mtimeMs < e && M(t);
|
|
1539
1569
|
} catch {}
|
|
1540
1570
|
}
|
|
1541
|
-
},
|
|
1542
|
-
let t =
|
|
1571
|
+
}, Ar = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), jr = (e, t) => p(Y, `${Ar(e)}-${t}.log`), Mr = (e) => {
|
|
1572
|
+
let t = Ar(e), n = [];
|
|
1543
1573
|
try {
|
|
1544
|
-
n = A(
|
|
1574
|
+
n = A(Y);
|
|
1545
1575
|
} catch {
|
|
1546
1576
|
return;
|
|
1547
1577
|
}
|
|
@@ -1549,19 +1579,19 @@ import {
|
|
|
1549
1579
|
if (r.length === 0) return;
|
|
1550
1580
|
let i, a = -1;
|
|
1551
1581
|
for (let e of r) {
|
|
1552
|
-
let t = p(
|
|
1582
|
+
let t = p(Y, e);
|
|
1553
1583
|
try {
|
|
1554
1584
|
let e = j(t);
|
|
1555
1585
|
e.mtimeMs > a && (a = e.mtimeMs, i = t);
|
|
1556
1586
|
} catch {}
|
|
1557
1587
|
}
|
|
1558
1588
|
return i;
|
|
1559
|
-
},
|
|
1589
|
+
}, Nr = (e) => {
|
|
1560
1590
|
try {
|
|
1561
|
-
E(
|
|
1591
|
+
E(Y, { recursive: !0 });
|
|
1562
1592
|
} catch {}
|
|
1563
|
-
|
|
1564
|
-
let t =
|
|
1593
|
+
kr();
|
|
1594
|
+
let t = jr(e, process.pid), n = D(t, "w"), r = (e) => {
|
|
1565
1595
|
let t = {
|
|
1566
1596
|
ts: e.ts.getTime(),
|
|
1567
1597
|
level: e.level,
|
|
@@ -1584,7 +1614,7 @@ import {
|
|
|
1584
1614
|
}
|
|
1585
1615
|
}, i = !1, a = x((e) => {
|
|
1586
1616
|
if (!i) try {
|
|
1587
|
-
|
|
1617
|
+
P(n, r(e));
|
|
1588
1618
|
} catch {}
|
|
1589
1619
|
}), o = () => {
|
|
1590
1620
|
if (!i) {
|
|
@@ -1602,7 +1632,7 @@ import {
|
|
|
1602
1632
|
a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
|
|
1603
1633
|
}
|
|
1604
1634
|
};
|
|
1605
|
-
},
|
|
1635
|
+
}, Pr = async (e, t) => {
|
|
1606
1636
|
let n;
|
|
1607
1637
|
try {
|
|
1608
1638
|
n = await O.readFile(e, "utf8");
|
|
@@ -1616,11 +1646,11 @@ import {
|
|
|
1616
1646
|
i.push(t);
|
|
1617
1647
|
} catch {}
|
|
1618
1648
|
return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
|
|
1619
|
-
},
|
|
1649
|
+
}, Fr = S({ scope: "voltro:dashboard" }), Ir = R(import.meta.url), Lr = 5179, Rr = (e) => {
|
|
1620
1650
|
let t = process.env.VOLTRO_DASHBOARD_PATH;
|
|
1621
1651
|
if (t && T(p(h(t), "app.config.ts"))) return h(t);
|
|
1622
1652
|
try {
|
|
1623
|
-
let e = d(
|
|
1653
|
+
let e = d(Ir.resolve("@voltro/dashboard/package.json"));
|
|
1624
1654
|
if (T(p(e, "app.config.ts"))) return e;
|
|
1625
1655
|
} catch {}
|
|
1626
1656
|
let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
|
|
@@ -1632,7 +1662,7 @@ import {
|
|
|
1632
1662
|
r = t;
|
|
1633
1663
|
}
|
|
1634
1664
|
return null;
|
|
1635
|
-
},
|
|
1665
|
+
}, zr = "VOLTRO_IS_DASHBOARD", Br = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
|
|
1636
1666
|
let i = pe({
|
|
1637
1667
|
port: e,
|
|
1638
1668
|
host: t
|
|
@@ -1640,45 +1670,45 @@ import {
|
|
|
1640
1670
|
a || (a = !0, i.destroy(), r(e));
|
|
1641
1671
|
};
|
|
1642
1672
|
i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
|
|
1643
|
-
}),
|
|
1673
|
+
}), Vr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Hr = () => process.env[zr] === "1", Ur = () => process.stdout.isTTY === !0, Wr = p(L(), ".voltro", "dashboard-launch.lock"), Gr = 1e4, Kr = async () => {
|
|
1644
1674
|
try {
|
|
1645
|
-
await O.mkdir(d(
|
|
1646
|
-
let e = await O.open(
|
|
1675
|
+
await O.mkdir(d(Wr), { recursive: !0 });
|
|
1676
|
+
let e = await O.open(Wr, "wx");
|
|
1647
1677
|
return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
|
|
1648
1678
|
} catch {
|
|
1649
1679
|
try {
|
|
1650
|
-
let e = await O.stat(
|
|
1651
|
-
if (Date.now() - e.mtimeMs >
|
|
1680
|
+
let e = await O.stat(Wr);
|
|
1681
|
+
if (Date.now() - e.mtimeMs > Gr) return await O.unlink(Wr).catch(() => void 0), Kr();
|
|
1652
1682
|
} catch {}
|
|
1653
1683
|
return !1;
|
|
1654
1684
|
}
|
|
1655
|
-
},
|
|
1685
|
+
}, qr = async () => {
|
|
1656
1686
|
try {
|
|
1657
|
-
await O.unlink(
|
|
1687
|
+
await O.unlink(Wr);
|
|
1658
1688
|
} catch {}
|
|
1659
|
-
},
|
|
1689
|
+
}, Jr = async (e) => {
|
|
1660
1690
|
let t = e.port ?? 5179;
|
|
1661
|
-
if (
|
|
1691
|
+
if (Vr()) return {
|
|
1662
1692
|
status: "skipped",
|
|
1663
1693
|
reason: "disabled by flag/env",
|
|
1664
1694
|
port: t
|
|
1665
1695
|
};
|
|
1666
|
-
if (
|
|
1696
|
+
if (Hr()) return {
|
|
1667
1697
|
status: "skipped",
|
|
1668
1698
|
reason: "this process IS the dashboard",
|
|
1669
1699
|
port: t
|
|
1670
1700
|
};
|
|
1671
|
-
if (!
|
|
1701
|
+
if (!Ur()) return {
|
|
1672
1702
|
status: "skipped",
|
|
1673
1703
|
reason: "stdout is not a TTY (CI/smoke)",
|
|
1674
1704
|
port: t
|
|
1675
1705
|
};
|
|
1676
|
-
if (!await
|
|
1706
|
+
if (!await Kr()) return {
|
|
1677
1707
|
status: "skipped",
|
|
1678
1708
|
reason: "another voltro process is currently launching the dashboard",
|
|
1679
1709
|
port: t
|
|
1680
1710
|
};
|
|
1681
|
-
if (await
|
|
1711
|
+
if (await Br(t)) return await qr(), {
|
|
1682
1712
|
status: "already-running",
|
|
1683
1713
|
port: t
|
|
1684
1714
|
};
|
|
@@ -1695,7 +1725,7 @@ import {
|
|
|
1695
1725
|
stdio: "ignore",
|
|
1696
1726
|
env: {
|
|
1697
1727
|
...process.env,
|
|
1698
|
-
[
|
|
1728
|
+
[zr]: "1",
|
|
1699
1729
|
VOLTRO_DASHBOARD_PORT: String(t)
|
|
1700
1730
|
}
|
|
1701
1731
|
});
|
|
@@ -1703,22 +1733,22 @@ import {
|
|
|
1703
1733
|
if (a.exitCode === null && a.signalCode === null) try {
|
|
1704
1734
|
a.kill("SIGTERM");
|
|
1705
1735
|
} catch {}
|
|
1706
|
-
}),
|
|
1736
|
+
}), Fr.info(`auto-launching dashboard at http://localhost:${t}`, {
|
|
1707
1737
|
port: t,
|
|
1708
1738
|
mode: i,
|
|
1709
1739
|
prebuilt: r
|
|
1710
|
-
}), r ||
|
|
1711
|
-
|
|
1740
|
+
}), r || Fr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Fr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
|
|
1741
|
+
qr();
|
|
1712
1742
|
}, 4e3).unref(), {
|
|
1713
1743
|
status: "launched",
|
|
1714
1744
|
port: t
|
|
1715
1745
|
};
|
|
1716
|
-
},
|
|
1746
|
+
}, Yr = class extends Error {
|
|
1717
1747
|
_voltroDeferral = !0;
|
|
1718
1748
|
constructor(e) {
|
|
1719
1749
|
super(e), this.name = "DeferralNotSupportedError";
|
|
1720
1750
|
}
|
|
1721
|
-
},
|
|
1751
|
+
}, Xr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Zr = (e) => {
|
|
1722
1752
|
if (!(e instanceof Error)) return;
|
|
1723
1753
|
let t = e._voltroControl;
|
|
1724
1754
|
if (t === "redirect") {
|
|
@@ -1740,7 +1770,7 @@ import {
|
|
|
1740
1770
|
},
|
|
1741
1771
|
body: "not found"
|
|
1742
1772
|
};
|
|
1743
|
-
},
|
|
1773
|
+
}, Qr = (e) => {
|
|
1744
1774
|
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
1745
1775
|
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
1746
1776
|
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
@@ -1755,7 +1785,7 @@ import {
|
|
|
1755
1785
|
...e.layoutShell ? { layoutShell: e.layoutShell } : {}
|
|
1756
1786
|
});
|
|
1757
1787
|
} catch (e) {
|
|
1758
|
-
throw new
|
|
1788
|
+
throw new Yr(e instanceof Error ? e.message : String(e));
|
|
1759
1789
|
}
|
|
1760
1790
|
return {
|
|
1761
1791
|
loaderData: n.renderData,
|
|
@@ -1771,8 +1801,8 @@ import {
|
|
|
1771
1801
|
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
1772
1802
|
}
|
|
1773
1803
|
};
|
|
1774
|
-
},
|
|
1775
|
-
let { helpers: t, renderInput: n } = e, r =
|
|
1804
|
+
}, $r = (e) => {
|
|
1805
|
+
let { helpers: t, renderInput: n } = e, r = Qr({
|
|
1776
1806
|
helpers: t,
|
|
1777
1807
|
page: e.page,
|
|
1778
1808
|
pathname: n.pathname,
|
|
@@ -1793,19 +1823,19 @@ import {
|
|
|
1793
1823
|
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
1794
1824
|
hasDeferred: r.hasDeferred
|
|
1795
1825
|
};
|
|
1796
|
-
},
|
|
1826
|
+
}, ei = (e) => {
|
|
1797
1827
|
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
1798
1828
|
return {
|
|
1799
1829
|
body: t,
|
|
1800
1830
|
meta: n
|
|
1801
1831
|
};
|
|
1802
|
-
},
|
|
1832
|
+
}, ti = (e) => [
|
|
1803
1833
|
...e.extra ?? [],
|
|
1804
1834
|
e.helpers.renderMetaToHtml(e.meta),
|
|
1805
1835
|
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
1806
1836
|
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
1807
1837
|
e.prepared.stateScript
|
|
1808
|
-
].filter((e) => e.length > 0).join("\n "),
|
|
1838
|
+
].filter((e) => e.length > 0).join("\n "), ni = (e) => {
|
|
1809
1839
|
let t = e.indexOf("?");
|
|
1810
1840
|
return t === -1 ? {
|
|
1811
1841
|
pathname: e || "/",
|
|
@@ -1814,9 +1844,9 @@ import {
|
|
|
1814
1844
|
pathname: e.slice(0, t) || "/",
|
|
1815
1845
|
search: e.slice(t)
|
|
1816
1846
|
};
|
|
1817
|
-
},
|
|
1847
|
+
}, ri = /Could not find required `intl` object/, ii = "__voltro_i18n_instances__", ai = (e = globalThis) => {
|
|
1818
1848
|
try {
|
|
1819
|
-
let t = e[
|
|
1849
|
+
let t = e[ii]?.records;
|
|
1820
1850
|
return t === void 0 || t.length === 0 ? void 0 : {
|
|
1821
1851
|
instances: t.length,
|
|
1822
1852
|
reactIntlCopies: new Set(t.map((e) => e.intlProvider)).size,
|
|
@@ -1825,7 +1855,7 @@ import {
|
|
|
1825
1855
|
} catch {
|
|
1826
1856
|
return;
|
|
1827
1857
|
}
|
|
1828
|
-
},
|
|
1858
|
+
}, oi = (e, t) => [
|
|
1829
1859
|
"",
|
|
1830
1860
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
1831
1861
|
`${e} DID wrap this render in <I18nProvider>, and this process`,
|
|
@@ -1843,7 +1873,7 @@ import {
|
|
|
1843
1873
|
" versions on disk; this counts instances in the running process, and one",
|
|
1844
1874
|
" file loaded down two paths is two instances.",
|
|
1845
1875
|
"───────────────────────────────────────────────────────────────────────"
|
|
1846
|
-
].join("\n"),
|
|
1876
|
+
].join("\n"), si = (e, t) => [
|
|
1847
1877
|
"",
|
|
1848
1878
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
1849
1879
|
`${e} DID wrap this render in <I18nProvider>, and this process`,
|
|
@@ -1859,7 +1889,7 @@ import {
|
|
|
1859
1889
|
" direct import can land on a second copy that this count does not see —",
|
|
1860
1890
|
" it counts what @voltro/i18n is bound to.",
|
|
1861
1891
|
"───────────────────────────────────────────────────────────────────────"
|
|
1862
|
-
].join("\n"),
|
|
1892
|
+
].join("\n"), ci = (e) => [
|
|
1863
1893
|
"",
|
|
1864
1894
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
1865
1895
|
`${e} DID wrap this render in <I18nProvider> — the framework`,
|
|
@@ -1875,29 +1905,29 @@ import {
|
|
|
1875
1905
|
" Do NOT use `pnpm ls` to rule that out: it lists versions on disk, and",
|
|
1876
1906
|
" the duplication here is of module instances in one process.",
|
|
1877
1907
|
"───────────────────────────────────────────────────────────────────────"
|
|
1878
|
-
].join("\n"),
|
|
1908
|
+
].join("\n"), li = (e, t, n, r = ai()) => {
|
|
1879
1909
|
if (!t) return;
|
|
1880
1910
|
let i = String(e?.message ?? e);
|
|
1881
|
-
if (
|
|
1882
|
-
},
|
|
1883
|
-
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(
|
|
1884
|
-
let r =
|
|
1911
|
+
if (ri.test(i)) return r === void 0 ? ci(n) : r.reactIntlCopies > 1 || r.instances > 1 ? oi(n, r) : si(n, r);
|
|
1912
|
+
}, ui = "<div id=\"root\"></div>", di = "<div id=\"root\">", fi = "</div>", pi = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, mi = /\bsrc=["']([^"']+)["']/i, hi = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, gi = (e) => {
|
|
1913
|
+
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(pi, (e) => {
|
|
1914
|
+
let r = mi.exec(e)?.[1];
|
|
1885
1915
|
return r === void 0 || t(r) ? e : (n.push(r), "");
|
|
1886
1916
|
});
|
|
1887
|
-
e.inlineModuleScriptsAsync && (r = r.replace(
|
|
1888
|
-
let i = r.indexOf(
|
|
1889
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
1917
|
+
e.inlineModuleScriptsAsync && (r = r.replace(hi, "<script async$1>"));
|
|
1918
|
+
let i = r.indexOf(ui);
|
|
1919
|
+
if (i === -1) throw Error(`[voltro] the generated shell has no \`${ui}\` 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.`);
|
|
1890
1920
|
return {
|
|
1891
|
-
head: `${r.slice(0, i)}${
|
|
1892
|
-
tail: `${
|
|
1921
|
+
head: `${r.slice(0, i)}${di}`,
|
|
1922
|
+
tail: `${fi}${r.slice(i + 21)}`,
|
|
1893
1923
|
bootstrapModules: n
|
|
1894
1924
|
};
|
|
1895
|
-
},
|
|
1925
|
+
}, _i = (e, t) => (/<title>/i.test(t) ? e.replace(/[^\S\n]*<title>[\s\S]*?<\/title>\n?/i, "") : e).replace("</head>", ` ${t}\n </head>`), vi = (e) => _i(e.head, e.headInjection).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), yi = (e) => {
|
|
1896
1926
|
let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
|
|
1897
1927
|
if (s || !o || a === null) return;
|
|
1898
1928
|
s = !0, t.statusCode = e.statusCode ?? 200;
|
|
1899
1929
|
for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
|
|
1900
|
-
t.flushHeaders?.(), t.write(
|
|
1930
|
+
t.flushHeaders?.(), t.write(vi({
|
|
1901
1931
|
head: n.head,
|
|
1902
1932
|
headInjection: i(a.meta),
|
|
1903
1933
|
htmlLang: r
|
|
@@ -1927,16 +1957,16 @@ import {
|
|
|
1927
1957
|
return;
|
|
1928
1958
|
}
|
|
1929
1959
|
c();
|
|
1930
|
-
},
|
|
1960
|
+
}, bi = (e) => Array.isArray(e.preload) && e.preload.length > 0, xi = (e, t) => typeof e == "string" ? {
|
|
1931
1961
|
tag: e,
|
|
1932
1962
|
input: {}
|
|
1933
1963
|
} : {
|
|
1934
1964
|
tag: e.tag,
|
|
1935
1965
|
input: e.input?.(t) ?? {}
|
|
1936
|
-
},
|
|
1966
|
+
}, Si = async (e) => {
|
|
1937
1967
|
let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
|
|
1938
|
-
if (
|
|
1939
|
-
let { tag: t, input: s } =
|
|
1968
|
+
if (bi(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
|
|
1969
|
+
let { tag: t, input: s } = xi(e, n);
|
|
1940
1970
|
try {
|
|
1941
1971
|
a(i, t, s, await r(t, s));
|
|
1942
1972
|
} catch (e) {
|
|
@@ -1946,14 +1976,14 @@ import {
|
|
|
1946
1976
|
}, e);
|
|
1947
1977
|
}
|
|
1948
1978
|
}
|
|
1949
|
-
},
|
|
1979
|
+
}, X = S({ scope: "voltro:dev:web" }), Ci = S({ scope: "vite" }), wi = await (async () => {
|
|
1950
1980
|
try {
|
|
1951
1981
|
let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
|
|
1952
1982
|
return JSON.parse(t).version ?? "0.0.0";
|
|
1953
1983
|
} catch {
|
|
1954
1984
|
return "0.0.0";
|
|
1955
1985
|
}
|
|
1956
|
-
})(),
|
|
1986
|
+
})(), Ti = async () => {
|
|
1957
1987
|
try {
|
|
1958
1988
|
let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
|
|
1959
1989
|
if (T(p(t, "package.json"))) return t;
|
|
@@ -1962,7 +1992,7 @@ import {
|
|
|
1962
1992
|
} catch {
|
|
1963
1993
|
return null;
|
|
1964
1994
|
}
|
|
1965
|
-
},
|
|
1995
|
+
}, Ei = (e, t) => e.disableDevtools || !t ? [] : [
|
|
1966
1996
|
"",
|
|
1967
1997
|
"// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
|
|
1968
1998
|
"// compile-time constant, so prod builds strip this whole `if` block — the",
|
|
@@ -1972,12 +2002,12 @@ import {
|
|
|
1972
2002
|
" await import('@voltro/devtools/styles.css')",
|
|
1973
2003
|
" Devtools = (await import('@voltro/devtools')).VoltroDevtools",
|
|
1974
2004
|
"}"
|
|
1975
|
-
],
|
|
2005
|
+
], Di = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Oi = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ki = (e) => e.sentry ? [
|
|
1976
2006
|
"",
|
|
1977
2007
|
"// Browser-side Sentry (frontend half of the deep integration). Errors +",
|
|
1978
2008
|
"// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
|
|
1979
2009
|
`await initSentryBrowser(${JSON.stringify(e.sentry)})`
|
|
1980
|
-
] : [],
|
|
2010
|
+
] : [], Ai = (e) => e.env ? ["import './env.public'"] : [], ji = (e) => {
|
|
1981
2011
|
let t = [], n = h(e);
|
|
1982
2012
|
for (;;) {
|
|
1983
2013
|
T(p(n, "pnpm-workspace.yaml")) && t.push(n);
|
|
@@ -1986,14 +2016,14 @@ import {
|
|
|
1986
2016
|
n = e;
|
|
1987
2017
|
}
|
|
1988
2018
|
return t;
|
|
1989
|
-
},
|
|
2019
|
+
}, Mi = nr, Ni = (e) => {
|
|
1990
2020
|
if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
|
|
1991
2021
|
let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
|
|
1992
2022
|
if (t) return `island-${t[1]}`;
|
|
1993
|
-
},
|
|
1994
|
-
let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !
|
|
2023
|
+
}, Pi = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Fi = (e) => e.startsWith("(") && e.endsWith(")"), Ii = (e) => e.filter((e) => !Fi(e)), Li = (e) => {
|
|
2024
|
+
let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !Fi(e));
|
|
1995
2025
|
return t.length === 0 ? "/" : "/" + t.join("/");
|
|
1996
|
-
},
|
|
2026
|
+
}, Ri = (e) => `${e.replace(r, "").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`, Z = (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}`, Q = async (e) => {
|
|
1997
2027
|
let t = [], i = [], a = async (e, o) => {
|
|
1998
2028
|
let s = [];
|
|
1999
2029
|
try {
|
|
@@ -2001,17 +2031,17 @@ import {
|
|
|
2001
2031
|
} catch {
|
|
2002
2032
|
return;
|
|
2003
2033
|
}
|
|
2004
|
-
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !
|
|
2034
|
+
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Mi(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
|
|
2005
2035
|
if (l.some((e) => n.has(e))) {
|
|
2006
2036
|
let t = u.has("layout.tsx"), r = !1;
|
|
2007
2037
|
if (t) try {
|
|
2008
2038
|
let t = await O.readFile(p(e, "layout.tsx"), "utf8");
|
|
2009
|
-
r =
|
|
2039
|
+
r = Pi.test(t);
|
|
2010
2040
|
} catch {}
|
|
2011
2041
|
i.push({
|
|
2012
2042
|
dir: d,
|
|
2013
2043
|
chain: o,
|
|
2014
|
-
contributesToUrl: o.length === 0 || !
|
|
2044
|
+
contributesToUrl: o.length === 0 || !Fi(o[o.length - 1]),
|
|
2015
2045
|
hasLayout: t,
|
|
2016
2046
|
hasLayoutLoader: r,
|
|
2017
2047
|
hasError: u.has("error.tsx"),
|
|
@@ -2025,8 +2055,8 @@ import {
|
|
|
2025
2055
|
let n = d ? `${d}/${e}` : e;
|
|
2026
2056
|
t.push({
|
|
2027
2057
|
file: n,
|
|
2028
|
-
pattern:
|
|
2029
|
-
ident:
|
|
2058
|
+
pattern: Li(n),
|
|
2059
|
+
ident: Ri(n),
|
|
2030
2060
|
dirChain: o
|
|
2031
2061
|
});
|
|
2032
2062
|
}
|
|
@@ -2045,14 +2075,14 @@ import {
|
|
|
2045
2075
|
dirs: s,
|
|
2046
2076
|
orphanedSpecials: c
|
|
2047
2077
|
};
|
|
2048
|
-
},
|
|
2078
|
+
}, zi = (e, t) => {
|
|
2049
2079
|
let n = [];
|
|
2050
2080
|
for (let r = 0; r <= t.length; r++) {
|
|
2051
2081
|
let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
|
|
2052
2082
|
a && n.push(a);
|
|
2053
2083
|
}
|
|
2054
2084
|
return n;
|
|
2055
|
-
},
|
|
2085
|
+
}, Bi = async (e) => {
|
|
2056
2086
|
let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
|
|
2057
2087
|
return {
|
|
2058
2088
|
chain: await Promise.all(t.map(async (e, t) => {
|
|
@@ -2075,10 +2105,10 @@ import {
|
|
|
2075
2105
|
})),
|
|
2076
2106
|
segmentLoaderData: o
|
|
2077
2107
|
};
|
|
2078
|
-
},
|
|
2079
|
-
let t =
|
|
2108
|
+
}, Vi = (e) => {
|
|
2109
|
+
let t = Ii(e);
|
|
2080
2110
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
2081
|
-
},
|
|
2111
|
+
}, Hi = [
|
|
2082
2112
|
"// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
|
|
2083
2113
|
"// in sync with Vite's CSS HMR. Without this, edits to .css files",
|
|
2084
2114
|
"// only update the JS-injected <style> overlay; the underlying <link>",
|
|
@@ -2171,7 +2201,7 @@ import {
|
|
|
2171
2201
|
" _vdtErrorStart('Build error')",
|
|
2172
2202
|
" })",
|
|
2173
2203
|
"}"
|
|
2174
|
-
].join("\n"),
|
|
2204
|
+
].join("\n"), Ui = (e) => {
|
|
2175
2205
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
2176
2206
|
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, "\\$&"));
|
|
2177
2207
|
let a = i.join("/");
|
|
@@ -2180,8 +2210,8 @@ import {
|
|
|
2180
2210
|
paramNames: t,
|
|
2181
2211
|
priority: n
|
|
2182
2212
|
};
|
|
2183
|
-
},
|
|
2184
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
2213
|
+
}, Wi = (e) => e.map((e) => {
|
|
2214
|
+
let { regex: t, paramNames: n, priority: r } = Ui(e.pattern);
|
|
2185
2215
|
return {
|
|
2186
2216
|
pattern: e.pattern,
|
|
2187
2217
|
file: e.file,
|
|
@@ -2190,7 +2220,7 @@ import {
|
|
|
2190
2220
|
paramNames: n,
|
|
2191
2221
|
priority: r
|
|
2192
2222
|
};
|
|
2193
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
2223
|
+
}).slice().sort((e, t) => e.priority - t.priority), Gi = (e, t) => {
|
|
2194
2224
|
for (let n of t) {
|
|
2195
2225
|
let t = n.regex.exec(e);
|
|
2196
2226
|
if (!t) continue;
|
|
@@ -2202,7 +2232,7 @@ import {
|
|
|
2202
2232
|
};
|
|
2203
2233
|
}
|
|
2204
2234
|
return null;
|
|
2205
|
-
},
|
|
2235
|
+
}, Ki = async (e, t) => {
|
|
2206
2236
|
let n = e;
|
|
2207
2237
|
for (;;) {
|
|
2208
2238
|
let e = p(n, "node_modules", t);
|
|
@@ -2216,7 +2246,7 @@ import {
|
|
|
2216
2246
|
if (r === n) return null;
|
|
2217
2247
|
n = r;
|
|
2218
2248
|
}
|
|
2219
|
-
},
|
|
2249
|
+
}, qi = async (e) => {
|
|
2220
2250
|
try {
|
|
2221
2251
|
let t = await import(_(p(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
|
|
2222
2252
|
return a ? {
|
|
@@ -2225,7 +2255,7 @@ import {
|
|
|
2225
2255
|
} : { port: r };
|
|
2226
2256
|
} catch {}
|
|
2227
2257
|
return { port: 4e3 };
|
|
2228
|
-
},
|
|
2258
|
+
}, Ji = (e, t) => ({
|
|
2229
2259
|
name: e,
|
|
2230
2260
|
pkg: t.package,
|
|
2231
2261
|
browserWsUrl: t.url,
|
|
@@ -2233,7 +2263,7 @@ import {
|
|
|
2233
2263
|
...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
|
|
2234
2264
|
...t.headers ? { headers: t.headers } : {},
|
|
2235
2265
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
2236
|
-
}),
|
|
2266
|
+
}), Yi = (e, t, n) => {
|
|
2237
2267
|
let r = t.transport?.wsPath ?? n.wsPath;
|
|
2238
2268
|
return {
|
|
2239
2269
|
name: e,
|
|
@@ -2245,7 +2275,7 @@ import {
|
|
|
2245
2275
|
...t.headers ? { headers: t.headers } : {},
|
|
2246
2276
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
2247
2277
|
};
|
|
2248
|
-
},
|
|
2278
|
+
}, Xi = (e) => {
|
|
2249
2279
|
let t = /* @__PURE__ */ new Map();
|
|
2250
2280
|
for (let n of e) {
|
|
2251
2281
|
if (n.proxyTarget === void 0) continue;
|
|
@@ -2253,43 +2283,43 @@ import {
|
|
|
2253
2283
|
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>.`);
|
|
2254
2284
|
t.set(n.browserWsUrl, n.name);
|
|
2255
2285
|
}
|
|
2256
|
-
},
|
|
2286
|
+
}, Zi = async (e, t) => {
|
|
2257
2287
|
let n = Object.entries(t.apis ?? {}), r = [];
|
|
2258
2288
|
for (let [t, i] of n) {
|
|
2259
2289
|
if (i.url) {
|
|
2260
|
-
r.push(
|
|
2290
|
+
r.push(Ji(t, i));
|
|
2261
2291
|
continue;
|
|
2262
2292
|
}
|
|
2263
|
-
let n = await
|
|
2293
|
+
let n = await Ki(e, i.package);
|
|
2264
2294
|
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.`);
|
|
2265
|
-
r.push(
|
|
2295
|
+
r.push(Yi(t, i, await qi(n)));
|
|
2266
2296
|
}
|
|
2267
|
-
return
|
|
2268
|
-
},
|
|
2297
|
+
return Xi(r), r;
|
|
2298
|
+
}, Qi = (e) => {
|
|
2269
2299
|
if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
|
|
2270
2300
|
let t = new URL(e);
|
|
2271
2301
|
return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
|
|
2272
2302
|
} catch {
|
|
2273
2303
|
return;
|
|
2274
2304
|
}
|
|
2275
|
-
},
|
|
2305
|
+
}, $i = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, ea = (e) => process.env[$i(e)] ?? process.env.VOLTRO_API_ORIGIN, ta = (e, t) => {
|
|
2276
2306
|
if (!e) return;
|
|
2277
|
-
let n =
|
|
2307
|
+
let n = ea(e.name) ?? e.serverOrigin;
|
|
2278
2308
|
if (n) {
|
|
2279
|
-
let e =
|
|
2309
|
+
let e = Qi(n);
|
|
2280
2310
|
if (e) return e;
|
|
2281
2311
|
}
|
|
2282
2312
|
if (t?.allowDevProxy && e.proxyTarget) {
|
|
2283
|
-
let t =
|
|
2313
|
+
let t = Qi(e.proxyTarget);
|
|
2284
2314
|
if (t) return t;
|
|
2285
2315
|
}
|
|
2286
|
-
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return
|
|
2287
|
-
},
|
|
2316
|
+
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Qi(e.browserWsUrl);
|
|
2317
|
+
}, na = (e, t, n) => {
|
|
2288
2318
|
if (!e) {
|
|
2289
2319
|
if (n?.apiName === void 0) return;
|
|
2290
2320
|
let e = n.apiName;
|
|
2291
2321
|
return async () => {
|
|
2292
|
-
throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${
|
|
2322
|
+
throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${$i(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
|
|
2293
2323
|
};
|
|
2294
2324
|
}
|
|
2295
2325
|
return async (r, i) => {
|
|
@@ -2311,7 +2341,7 @@ import {
|
|
|
2311
2341
|
});
|
|
2312
2342
|
} catch (t) {
|
|
2313
2343
|
let i = t?.cause?.code ?? String(t?.message ?? t);
|
|
2314
|
-
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${
|
|
2344
|
+
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${$i(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
|
|
2315
2345
|
}
|
|
2316
2346
|
if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
|
|
2317
2347
|
let s = await o.json();
|
|
@@ -2329,8 +2359,8 @@ import {
|
|
|
2329
2359
|
}
|
|
2330
2360
|
if (u) return l;
|
|
2331
2361
|
};
|
|
2332
|
-
},
|
|
2333
|
-
let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(p(e, "node_modules", "@voltro", "devtools", "package.json")) || await
|
|
2362
|
+
}, $ = async (e, t, n, r = {}) => {
|
|
2363
|
+
let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(p(e, "node_modules", "@voltro", "devtools", "package.json")) || await Ti() !== null, s = t.theme === "system" ? [
|
|
2334
2364
|
" <script>",
|
|
2335
2365
|
" (function () {",
|
|
2336
2366
|
" var root = document.documentElement",
|
|
@@ -2368,9 +2398,9 @@ import {
|
|
|
2368
2398
|
" </body>",
|
|
2369
2399
|
"</html>",
|
|
2370
2400
|
""
|
|
2371
|
-
].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await
|
|
2372
|
-
await
|
|
2373
|
-
for (let e of f)
|
|
2401
|
+
].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await Q(l);
|
|
2402
|
+
await Er(l, u);
|
|
2403
|
+
for (let e of f) X.warn(`src/pages/${e.dir || "."}/ contains ${e.files.join(", ")} but no page.tsx at or below it — ${e.files.length > 1 ? "those files are" : "that file is"} inert. A layout/error/loading/not-found file only applies to routes in its own directory tree; if this is an ordinary component, rename it so it does not read as a route boundary.`);
|
|
2374
2404
|
let m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, h = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, g = n.map((e) => `import { appGroup as ${m(e.name)}, appDescriptors as ${h(e.name)} } from '${e.pkg}/rpcGroup'`);
|
|
2375
2405
|
n.some((e) => e.hasAuthHeaders) && (g.push("import __voltroAppConfig from '../app.config'"), g.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
|
|
2376
2406
|
let _ = n.map((e) => {
|
|
@@ -2381,16 +2411,16 @@ import {
|
|
|
2381
2411
|
let n = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), r = [];
|
|
2382
2412
|
for (let e of d) {
|
|
2383
2413
|
let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
|
|
2384
|
-
e.hasLayout && e.hasLayoutLoader ? r.push(`import * as ${
|
|
2414
|
+
e.hasLayout && e.hasLayoutLoader ? r.push(`import * as ${Z(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && r.push(`import ${Z(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && r.push(`import ${Z(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && r.push(`import ${Z(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && r.push(`import ${Z(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
|
|
2385
2415
|
}
|
|
2386
2416
|
let i = u.map((e) => {
|
|
2387
|
-
let t =
|
|
2417
|
+
let t = zi(d, e.dirChain).map((e) => {
|
|
2388
2418
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2389
2419
|
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(", ")} }`;
|
|
2390
2420
|
}).join(",\n");
|
|
2391
2421
|
return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
|
|
2392
2422
|
}), a = d.filter((e) => e.hasNotFound).map((e) => {
|
|
2393
|
-
let t =
|
|
2423
|
+
let t = Vi(e.chain), n = zi(d, e.chain).map((e) => {
|
|
2394
2424
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2395
2425
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
|
|
2396
2426
|
}).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
|
|
@@ -2398,23 +2428,23 @@ import {
|
|
|
2398
2428
|
}), s = [], c = [], l = [], f = [], m = [], h = [];
|
|
2399
2429
|
for (let e of d) {
|
|
2400
2430
|
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`, a = JSON.stringify(e.dir);
|
|
2401
|
-
e.hasLayout && e.hasLayoutLoader ? (c.push(` ${a}: ${
|
|
2431
|
+
e.hasLayout && e.hasLayoutLoader ? (c.push(` ${a}: ${Z(e.dir, "Layout")}Mod.default,`), l.push(` ${a}: ${Z(e.dir, "Layout")}Mod.loader,`), s.push({
|
|
2402
2432
|
relPath: t,
|
|
2403
2433
|
kind: "layout",
|
|
2404
2434
|
slotKey: e.dir
|
|
2405
|
-
})) : e.hasLayout && (c.push(` ${a}: ${
|
|
2435
|
+
})) : e.hasLayout && (c.push(` ${a}: ${Z(e.dir, "Layout")},`), s.push({
|
|
2406
2436
|
relPath: t,
|
|
2407
2437
|
kind: "layout",
|
|
2408
2438
|
slotKey: e.dir
|
|
2409
|
-
})), e.hasError && (f.push(` ${a}: ${
|
|
2439
|
+
})), e.hasError && (f.push(` ${a}: ${Z(e.dir, "Error")},`), s.push({
|
|
2410
2440
|
relPath: n,
|
|
2411
2441
|
kind: "error",
|
|
2412
2442
|
slotKey: e.dir
|
|
2413
|
-
})), e.hasPending && (m.push(` ${a}: ${
|
|
2443
|
+
})), e.hasPending && (m.push(` ${a}: ${Z(e.dir, "Pending")},`), s.push({
|
|
2414
2444
|
relPath: r,
|
|
2415
2445
|
kind: "pending",
|
|
2416
2446
|
slotKey: e.dir
|
|
2417
|
-
})), e.hasNotFound && (h.push(` ${a}: ${
|
|
2447
|
+
})), e.hasNotFound && (h.push(` ${a}: ${Z(e.dir, "NotFound")},`), s.push({
|
|
2418
2448
|
relPath: i,
|
|
2419
2449
|
kind: "notFound",
|
|
2420
2450
|
slotKey: e.dir
|
|
@@ -2429,7 +2459,7 @@ import {
|
|
|
2429
2459
|
let n = JSON.stringify(e.slotKey);
|
|
2430
2460
|
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 }`;
|
|
2431
2461
|
}), C = t.locales ?? [], w = C.length > 0 && C.every((t) => T(p(e, "src", "locales", `${t}.ts`)) || T(p(e, "src", "locales", `${t}.tsx`))), E = w, D = t.defaultLocale ?? C[0] ?? "en";
|
|
2432
|
-
if (C.length > 0 && !w &&
|
|
2462
|
+
if (C.length > 0 && !w && X.info(`i18n: locales [${C.join(", ")}] declared with no src/locales/<code>.ts — using them for <html lang> and the resolved locale only. Add the catalogs to get <I18nProvider> wired, or keep your own i18n stack.`), C.length > 0 && !C.includes(D)) throw Error(`[voltro dev] app.config.ts: defaultLocale '${D}' must be one of locales [${C.join(", ")}]`);
|
|
2433
2463
|
let O = E ? [
|
|
2434
2464
|
"import { I18nProvider } from '@voltro/i18n'",
|
|
2435
2465
|
"import { resolveLocale } from '@voltro/i18n/server'",
|
|
@@ -2646,14 +2676,14 @@ import {
|
|
|
2646
2676
|
"// resolved apis map. Side-effect only — no local component definitions —",
|
|
2647
2677
|
"// so downstream invalidations (user page edits) terminate at app.tsx.",
|
|
2648
2678
|
"",
|
|
2649
|
-
...
|
|
2679
|
+
...Ai(t),
|
|
2650
2680
|
"import { mount } from '@voltro/web'",
|
|
2651
2681
|
...g,
|
|
2652
2682
|
"import { App } from './app'",
|
|
2653
2683
|
"import { preloadCurrentRoute } from './routeTable'",
|
|
2654
|
-
...Di(t),
|
|
2655
|
-
...Ti(t, o),
|
|
2656
2684
|
...Oi(t),
|
|
2685
|
+
...Ei(t, o),
|
|
2686
|
+
...ki(t),
|
|
2657
2687
|
"",
|
|
2658
2688
|
"// Preload the current route's page chunk BEFORE hydration so the first",
|
|
2659
2689
|
"// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
|
|
@@ -2670,10 +2700,10 @@ import {
|
|
|
2670
2700
|
" apis: {",
|
|
2671
2701
|
..._,
|
|
2672
2702
|
" },",
|
|
2673
|
-
...
|
|
2703
|
+
...Di(t, o),
|
|
2674
2704
|
"})",
|
|
2675
2705
|
"",
|
|
2676
|
-
|
|
2706
|
+
Hi
|
|
2677
2707
|
].join("\n");
|
|
2678
2708
|
} else v = "", y = "", b = [
|
|
2679
2709
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
@@ -2681,25 +2711,25 @@ import {
|
|
|
2681
2711
|
"// and calls mount(). Side-effect only, no component definitions, so the",
|
|
2682
2712
|
"// user's component file remains the Fast Refresh boundary.",
|
|
2683
2713
|
"",
|
|
2684
|
-
...
|
|
2714
|
+
...Ai(t),
|
|
2685
2715
|
"import { mount } from '@voltro/web'",
|
|
2686
2716
|
...g,
|
|
2687
2717
|
"import App from '../src/App'",
|
|
2688
|
-
...Di(t),
|
|
2689
|
-
...Ti(t, o),
|
|
2690
2718
|
...Oi(t),
|
|
2719
|
+
...Ei(t, o),
|
|
2720
|
+
...ki(t),
|
|
2691
2721
|
"",
|
|
2692
2722
|
"mount(App, {",
|
|
2693
2723
|
" apis: {",
|
|
2694
2724
|
..._,
|
|
2695
2725
|
" },",
|
|
2696
|
-
...
|
|
2726
|
+
...Di(t, o),
|
|
2697
2727
|
"})",
|
|
2698
2728
|
"",
|
|
2699
|
-
|
|
2729
|
+
Hi
|
|
2700
2730
|
].join("\n");
|
|
2701
2731
|
let x = p(e, ".framework");
|
|
2702
|
-
await O.mkdir(x, { recursive: !0 }), t.env ? await
|
|
2732
|
+
await O.mkdir(x, { recursive: !0 }), t.env ? await rt(x, r) : await O.rm(p(x, "env.public.ts"), { force: !0 }), await O.writeFile(p(x, "index.html"), c, "utf8"), await O.writeFile(p(x, "main.tsx"), b, "utf8"), v ? (await O.writeFile(p(x, "app.tsx"), v, "utf8"), await O.writeFile(p(x, "routeTable.ts"), y, "utf8")) : (await O.rm(p(x, "app.tsx"), { force: !0 }), await O.rm(p(x, "routeTable.ts"), { force: !0 }));
|
|
2703
2733
|
let S = p(e, ".gitignore"), C = "";
|
|
2704
2734
|
try {
|
|
2705
2735
|
C = await O.readFile(S, "utf8");
|
|
@@ -2710,7 +2740,7 @@ import {
|
|
|
2710
2740
|
try {
|
|
2711
2741
|
await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
|
|
2712
2742
|
} catch (e) {
|
|
2713
|
-
|
|
2743
|
+
X.warn(`could not add ${D.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
|
|
2714
2744
|
}
|
|
2715
2745
|
}
|
|
2716
2746
|
}, ra = async (e, t) => {
|
|
@@ -2720,55 +2750,55 @@ import {
|
|
|
2720
2750
|
let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
|
|
2721
2751
|
for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
|
|
2722
2752
|
if (o.length === 0) return;
|
|
2723
|
-
|
|
2753
|
+
X.warn("sibling app(s) claim the same port — only one boots", {
|
|
2724
2754
|
port: t,
|
|
2725
2755
|
conflicts: o,
|
|
2726
2756
|
projectJson: n
|
|
2727
2757
|
});
|
|
2728
2758
|
} catch {}
|
|
2729
|
-
}, ia = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), aa = async (e) => {
|
|
2730
|
-
let
|
|
2759
|
+
}, ia = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), aa = async (e, t = {}) => {
|
|
2760
|
+
let n = ia(e), r = t.preferSource !== !0 && T(n) ? n : p(e, "app.config.ts");
|
|
2731
2761
|
try {
|
|
2732
|
-
let e = (await import(_(
|
|
2762
|
+
let e = (await import(_(r).href)).default;
|
|
2733
2763
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
|
|
2734
2764
|
} catch {
|
|
2735
2765
|
return null;
|
|
2736
2766
|
}
|
|
2737
2767
|
}, oa = async (e) => {
|
|
2738
|
-
let t = await aa(e);
|
|
2768
|
+
let t = await aa(e, { preferSource: !0 });
|
|
2739
2769
|
if (!t) return {
|
|
2740
2770
|
ran: !1,
|
|
2741
2771
|
exitCode: 0
|
|
2742
2772
|
};
|
|
2743
|
-
|
|
2744
|
-
let n =
|
|
2745
|
-
|
|
2746
|
-
let r = await
|
|
2747
|
-
for (let e of r)
|
|
2773
|
+
$n();
|
|
2774
|
+
let n = mn();
|
|
2775
|
+
Mn(n), X.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" }), Lt(e, X);
|
|
2776
|
+
let r = await Zi(e, t);
|
|
2777
|
+
for (let e of r) X.info("api wired", {
|
|
2748
2778
|
name: e.name,
|
|
2749
2779
|
pkg: e.pkg,
|
|
2750
2780
|
...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
|
|
2751
2781
|
});
|
|
2752
|
-
|
|
2782
|
+
Ne(e).then((e) => {
|
|
2753
2783
|
for (let t of e.files) if (t.action === "created") {
|
|
2754
2784
|
let e = t.path.split("/").pop() ?? t.path;
|
|
2755
|
-
|
|
2785
|
+
X.info(`${e} seeded`, { path: t.path });
|
|
2756
2786
|
}
|
|
2757
2787
|
}).catch(() => {});
|
|
2758
|
-
let { resolved: d } = await
|
|
2788
|
+
let { resolved: d } = await it({
|
|
2759
2789
|
rawEnv: t.env,
|
|
2760
2790
|
appType: "web",
|
|
2761
2791
|
root: e,
|
|
2762
|
-
log:
|
|
2792
|
+
log: X,
|
|
2763
2793
|
generateTypes: !0
|
|
2764
2794
|
}), f = d.publicValues;
|
|
2765
|
-
await
|
|
2795
|
+
await $(e, t, r, f), X.debug("generated framework entry files", { files: [
|
|
2766
2796
|
"index.html",
|
|
2767
2797
|
".framework/main.tsx",
|
|
2768
2798
|
...t.env ? [".framework/env.public.ts"] : []
|
|
2769
2799
|
] });
|
|
2770
|
-
let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v =
|
|
2771
|
-
await
|
|
2800
|
+
let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v = qe("web", _, g), y = Nr(_);
|
|
2801
|
+
await Ge({
|
|
2772
2802
|
id: v,
|
|
2773
2803
|
name: _,
|
|
2774
2804
|
kind: "web",
|
|
@@ -2777,21 +2807,21 @@ import {
|
|
|
2777
2807
|
status: "booting",
|
|
2778
2808
|
logFile: y.path
|
|
2779
2809
|
}).catch(() => {}), await ra(e, g);
|
|
2780
|
-
let { pages: b, dirs: x } = await
|
|
2810
|
+
let { pages: b, dirs: x } = await Q(p(e, "src", "pages")), S = {
|
|
2781
2811
|
dirs: x,
|
|
2782
|
-
ssrRoutes:
|
|
2812
|
+
ssrRoutes: Wi(b)
|
|
2783
2813
|
}, w = x.map((e) => ({
|
|
2784
2814
|
dir: e.dir,
|
|
2785
2815
|
hasLayout: e.hasLayout,
|
|
2786
2816
|
hasError: e.hasError,
|
|
2787
2817
|
hasPending: e.hasPending,
|
|
2788
2818
|
hasNotFound: e.hasNotFound
|
|
2789
|
-
})), E = await
|
|
2819
|
+
})), E = await on({
|
|
2790
2820
|
appRoot: e,
|
|
2791
2821
|
pages: b
|
|
2792
2822
|
});
|
|
2793
|
-
E.wrote &&
|
|
2794
|
-
let D = await
|
|
2823
|
+
E.wrote && X.debug("routes codegen wrote", { path: m(e, E.path) });
|
|
2824
|
+
let D = await Ze("vite", () => import("vite")), k = (await import("@vitejs/plugin-react")).default, A = (await import("@tailwindcss/vite")).default, j = p(e, ".framework"), M = p(e, "src"), N = /* @__PURE__ */ new Set([
|
|
2795
2825
|
".framework",
|
|
2796
2826
|
"node_modules",
|
|
2797
2827
|
"dist",
|
|
@@ -2799,11 +2829,11 @@ import {
|
|
|
2799
2829
|
".vite",
|
|
2800
2830
|
".turbo",
|
|
2801
2831
|
".cache"
|
|
2802
|
-
]),
|
|
2832
|
+
]), ee = {
|
|
2803
2833
|
name: "framework:watch-app-sources",
|
|
2804
2834
|
async configureServer(t) {
|
|
2805
2835
|
try {
|
|
2806
|
-
let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !
|
|
2836
|
+
let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !N.has(e.name));
|
|
2807
2837
|
for (let r of n) t.watcher.add(p(e, r.name));
|
|
2808
2838
|
n.length === 0 && t.watcher.add(M);
|
|
2809
2839
|
} catch {
|
|
@@ -2815,7 +2845,7 @@ import {
|
|
|
2815
2845
|
...r.devDependencies
|
|
2816
2846
|
});
|
|
2817
2847
|
await Promise.all(i.map(async (n) => {
|
|
2818
|
-
let r = await
|
|
2848
|
+
let r = await Ki(e, n);
|
|
2819
2849
|
if (!r) return;
|
|
2820
2850
|
let i = p(r, "src");
|
|
2821
2851
|
try {
|
|
@@ -2824,63 +2854,63 @@ import {
|
|
|
2824
2854
|
}));
|
|
2825
2855
|
} catch {}
|
|
2826
2856
|
}
|
|
2827
|
-
},
|
|
2857
|
+
}, P = p(e, "src", "pages"), F = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), I = (e) => e === P || e.startsWith(P + "/"), te = async (n) => {
|
|
2828
2858
|
try {
|
|
2829
2859
|
let i = Date.now();
|
|
2830
|
-
await
|
|
2831
|
-
let { pages: a, dirs: o } = await
|
|
2832
|
-
await
|
|
2860
|
+
await $(e, t, r, f);
|
|
2861
|
+
let { pages: a, dirs: o } = await Q(P);
|
|
2862
|
+
await on({
|
|
2833
2863
|
appRoot: e,
|
|
2834
2864
|
pages: a
|
|
2835
|
-
}), S.dirs = o, S.ssrRoutes =
|
|
2865
|
+
}), S.dirs = o, S.ssrRoutes = Wi(a), X.info("page tree regenerated", {
|
|
2836
2866
|
reason: n,
|
|
2837
2867
|
ms: Date.now() - i,
|
|
2838
2868
|
routes: S.ssrRoutes.length
|
|
2839
2869
|
});
|
|
2840
2870
|
} catch (e) {
|
|
2841
|
-
|
|
2871
|
+
X.error("page tree regen failed", { reason: n }, e);
|
|
2842
2872
|
}
|
|
2843
|
-
},
|
|
2873
|
+
}, L = {
|
|
2844
2874
|
name: "framework:regenerate-on-page-tree-change",
|
|
2845
2875
|
configureServer(t) {
|
|
2846
2876
|
let n = null, r = [], i = (e) => {
|
|
2847
2877
|
r.push(e), n && clearTimeout(n), n = setTimeout(() => {
|
|
2848
2878
|
n = null;
|
|
2849
2879
|
let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
|
|
2850
|
-
r.length = 0,
|
|
2880
|
+
r.length = 0, te(e);
|
|
2851
2881
|
}, 50);
|
|
2852
2882
|
};
|
|
2853
2883
|
t.watcher.on("add", (t) => {
|
|
2854
|
-
|
|
2884
|
+
F(t) && i(`add ${m(e, t)}`);
|
|
2855
2885
|
}), t.watcher.on("unlink", (t) => {
|
|
2856
|
-
|
|
2886
|
+
F(t) && i(`unlink ${m(e, t)}`);
|
|
2857
2887
|
}), t.watcher.on("addDir", (t) => {
|
|
2858
|
-
|
|
2888
|
+
I(t) && i(`addDir ${m(e, t)}`);
|
|
2859
2889
|
}), t.watcher.on("unlinkDir", (t) => {
|
|
2860
|
-
|
|
2890
|
+
I(t) && i(`unlinkDir ${m(e, t)}`);
|
|
2861
2891
|
});
|
|
2862
2892
|
}
|
|
2863
|
-
},
|
|
2864
|
-
if (!
|
|
2893
|
+
}, R = p(e, "app.config.ts"), ne = (e) => {
|
|
2894
|
+
if (!ae(e.env)) return "";
|
|
2865
2895
|
let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
|
|
2866
2896
|
return `${String(e.env.publicPrefix)}|${t.join(",")}`;
|
|
2867
|
-
},
|
|
2897
|
+
}, re = (e, t) => {
|
|
2868
2898
|
let n = [];
|
|
2869
|
-
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"),
|
|
2870
|
-
}, z = t,
|
|
2899
|
+
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"), ne(e) !== ne(t) && n.push("env"), n;
|
|
2900
|
+
}, z = t, ie = h(R), B = {
|
|
2871
2901
|
name: "framework:watch-app-config",
|
|
2872
2902
|
async configureServer(t) {
|
|
2873
|
-
t.watcher.add(
|
|
2903
|
+
t.watcher.add(R), X.info("watching app.config.ts for changes", { path: m(e, R) });
|
|
2874
2904
|
let n = async () => {
|
|
2875
2905
|
try {
|
|
2876
2906
|
try {
|
|
2877
|
-
let e = t.moduleGraph.getModuleById(
|
|
2907
|
+
let e = t.moduleGraph.getModuleById(R);
|
|
2878
2908
|
e && t.moduleGraph.invalidateModule(e);
|
|
2879
2909
|
} catch {}
|
|
2880
|
-
let e = (await t.ssrLoadModule(
|
|
2881
|
-
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (
|
|
2910
|
+
let e = (await t.ssrLoadModule(R, { fixStacktrace: !0 })).default;
|
|
2911
|
+
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (X.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
|
|
2882
2912
|
} catch (e) {
|
|
2883
|
-
return
|
|
2913
|
+
return X.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
|
|
2884
2914
|
}
|
|
2885
2915
|
}, r = null, i = () => {
|
|
2886
2916
|
r && clearTimeout(r), r = setTimeout(() => {
|
|
@@ -2889,20 +2919,20 @@ import {
|
|
|
2889
2919
|
}, a = async () => {
|
|
2890
2920
|
let r = await n();
|
|
2891
2921
|
if (!r) {
|
|
2892
|
-
|
|
2922
|
+
X.info("app.config.ts onConfigChange: load returned null — skipping");
|
|
2893
2923
|
return;
|
|
2894
2924
|
}
|
|
2895
|
-
if (
|
|
2925
|
+
if (X.info("app.config.ts onConfigChange: loaded", {
|
|
2896
2926
|
theme: r.theme,
|
|
2897
2927
|
port: r.port,
|
|
2898
2928
|
name: r.name
|
|
2899
2929
|
}), JSON.stringify(r) === JSON.stringify(z)) {
|
|
2900
|
-
|
|
2930
|
+
X.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
|
|
2901
2931
|
return;
|
|
2902
2932
|
}
|
|
2903
|
-
let i =
|
|
2933
|
+
let i = re(z, r);
|
|
2904
2934
|
if (i.length > 0) {
|
|
2905
|
-
|
|
2935
|
+
X.warn("app.config.ts changed — hard restart required", { fields: i });
|
|
2906
2936
|
try {
|
|
2907
2937
|
await t.close();
|
|
2908
2938
|
} catch {}
|
|
@@ -2916,45 +2946,45 @@ import {
|
|
|
2916
2946
|
process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
|
|
2917
2947
|
process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
|
|
2918
2948
|
}), e.on("error", (e) => {
|
|
2919
|
-
|
|
2949
|
+
X.error("restart spawn failed", {}, e), process.exit(1);
|
|
2920
2950
|
});
|
|
2921
2951
|
return;
|
|
2922
2952
|
}
|
|
2923
2953
|
try {
|
|
2924
2954
|
let n = Date.now();
|
|
2925
|
-
await
|
|
2955
|
+
await $(e, r, await Zi(e, r)), z = r, t.ws && t.ws.send({
|
|
2926
2956
|
type: "full-reload",
|
|
2927
2957
|
path: "*"
|
|
2928
|
-
}),
|
|
2958
|
+
}), X.info("app.config.ts soft-regen", {
|
|
2929
2959
|
ms: Date.now() - n,
|
|
2930
2960
|
reload: "full"
|
|
2931
2961
|
});
|
|
2932
2962
|
} catch (e) {
|
|
2933
|
-
|
|
2963
|
+
X.error("app.config.ts soft-regen failed", {}, e);
|
|
2934
2964
|
}
|
|
2935
|
-
}, o = (e) => u(e) === "app.config.ts" ? e ===
|
|
2965
|
+
}, o = (e) => u(e) === "app.config.ts" ? e === R || h(e) === ie : !1;
|
|
2936
2966
|
t.watcher.on("change", (e) => {
|
|
2937
|
-
o(e) && (
|
|
2967
|
+
o(e) && (X.info("app.config.ts change event (chokidar)", { file: e }), i());
|
|
2938
2968
|
}), t.watcher.on("add", (e) => {
|
|
2939
|
-
o(e) && (
|
|
2969
|
+
o(e) && (X.info("app.config.ts add event (chokidar)", { file: e }), i());
|
|
2940
2970
|
});
|
|
2941
2971
|
try {
|
|
2942
2972
|
let { watchFile: e } = await import("node:fs");
|
|
2943
|
-
e(
|
|
2944
|
-
e.mtimeMs !== t.mtimeMs && (
|
|
2945
|
-
}),
|
|
2973
|
+
e(R, { interval: 500 }, (e, t) => {
|
|
2974
|
+
e.mtimeMs !== t.mtimeMs && (X.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
|
|
2975
|
+
}), X.info("app.config.ts polling watcher attached", { intervalMs: 500 });
|
|
2946
2976
|
} catch (e) {
|
|
2947
|
-
|
|
2977
|
+
X.warn("app.config.ts polling watcher could not attach", {}, e);
|
|
2948
2978
|
}
|
|
2949
|
-
|
|
2979
|
+
vt(ht, X, {
|
|
2950
2980
|
root: e,
|
|
2951
2981
|
onBeforeRestart: () => t.close()
|
|
2952
2982
|
});
|
|
2953
2983
|
}
|
|
2954
|
-
},
|
|
2984
|
+
}, V = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, oe = 0, se = {
|
|
2955
2985
|
name: "framework:suppress-api-hmr",
|
|
2956
2986
|
handleHotUpdate(e) {
|
|
2957
|
-
if (oe += 1,
|
|
2987
|
+
if (oe += 1, V.test(e.file)) return [];
|
|
2958
2988
|
}
|
|
2959
2989
|
}, ce = {
|
|
2960
2990
|
name: "framework:reoptimize-on-rpcgroup-change",
|
|
@@ -2962,7 +2992,7 @@ import {
|
|
|
2962
2992
|
let n = /* @__PURE__ */ new Map();
|
|
2963
2993
|
for (let i of r) {
|
|
2964
2994
|
if (!i.proxyTarget) continue;
|
|
2965
|
-
let r = await
|
|
2995
|
+
let r = await Ki(e, i.pkg);
|
|
2966
2996
|
if (!r) continue;
|
|
2967
2997
|
let a = p(r, "rpcGroup.generated.ts");
|
|
2968
2998
|
try {
|
|
@@ -2988,14 +3018,14 @@ import {
|
|
|
2988
3018
|
i !== t && (n.set(e, i), r = e);
|
|
2989
3019
|
}
|
|
2990
3020
|
if (r !== null) {
|
|
2991
|
-
a = !0,
|
|
3021
|
+
a = !0, X.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
|
|
2992
3022
|
try {
|
|
2993
3023
|
await O.rm(p(j, ".vite", "deps"), {
|
|
2994
3024
|
recursive: !0,
|
|
2995
3025
|
force: !0
|
|
2996
3026
|
}), await t.restart(!0);
|
|
2997
3027
|
} catch (e) {
|
|
2998
|
-
a = !1,
|
|
3028
|
+
a = !1, X.error("rpcGroup re-optimize failed", {}, e);
|
|
2999
3029
|
}
|
|
3000
3030
|
}
|
|
3001
3031
|
}, s = (e) => {
|
|
@@ -3007,7 +3037,7 @@ import {
|
|
|
3007
3037
|
}
|
|
3008
3038
|
}, H = {}, le = (e) => (t) => {
|
|
3009
3039
|
t.on("proxyReq", (t, n) => {
|
|
3010
|
-
|
|
3040
|
+
Zn(t, n, {
|
|
3011
3041
|
target: e,
|
|
3012
3042
|
token: process.env.VOLTRO_INSPECT_TOKEN,
|
|
3013
3043
|
writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
|
|
@@ -3033,14 +3063,14 @@ import {
|
|
|
3033
3063
|
}
|
|
3034
3064
|
for (let [e, n] of Object.entries(t.proxies ?? {})) {
|
|
3035
3065
|
if (H[e]) {
|
|
3036
|
-
|
|
3066
|
+
X.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
|
|
3037
3067
|
continue;
|
|
3038
3068
|
}
|
|
3039
3069
|
H[e] = {
|
|
3040
3070
|
target: n.target,
|
|
3041
3071
|
changeOrigin: n.changeOrigin ?? !0,
|
|
3042
3072
|
...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
|
|
3043
|
-
},
|
|
3073
|
+
}, X.info(`proxy ${e} → ${n.target}`, {
|
|
3044
3074
|
prefix: e,
|
|
3045
3075
|
target: n.target,
|
|
3046
3076
|
...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
|
|
@@ -3058,18 +3088,18 @@ import {
|
|
|
3058
3088
|
pattern: n.pattern,
|
|
3059
3089
|
file: n.file,
|
|
3060
3090
|
dirChain: n.dirChain,
|
|
3061
|
-
renderMode:
|
|
3091
|
+
renderMode: vr(i, p("src", "pages", n.file)),
|
|
3062
3092
|
interactive: i.interactive ?? "full",
|
|
3063
3093
|
tenantAware: i.tenantAware === !0,
|
|
3064
|
-
revalidateMs:
|
|
3065
|
-
staleWhileRevalidateMs:
|
|
3094
|
+
revalidateMs: lt(i.revalidate),
|
|
3095
|
+
staleWhileRevalidateMs: lt(i.staleWhileRevalidate) ?? 0,
|
|
3066
3096
|
cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
|
|
3067
3097
|
hasLoader: typeof i.loader == "function",
|
|
3068
3098
|
hasMeta: i.meta != null,
|
|
3069
3099
|
hasGetStaticPaths: typeof i.getStaticPaths == "function"
|
|
3070
3100
|
});
|
|
3071
3101
|
} catch (e) {
|
|
3072
|
-
|
|
3102
|
+
X.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
|
|
3073
3103
|
}
|
|
3074
3104
|
return u = t, t;
|
|
3075
3105
|
};
|
|
@@ -3089,9 +3119,9 @@ import {
|
|
|
3089
3119
|
}), r();
|
|
3090
3120
|
}), r.middlewares.use((t, n, r) => {
|
|
3091
3121
|
if (t.method !== "GET" && t.method !== "HEAD") return r();
|
|
3092
|
-
let { pathname: i } =
|
|
3122
|
+
let { pathname: i } = ni(t.url ?? "/");
|
|
3093
3123
|
if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
|
|
3094
|
-
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(
|
|
3124
|
+
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(fn({ indexable: !1 }));
|
|
3095
3125
|
}), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
|
|
3096
3126
|
let r = e.url ?? "", a = r.split("?")[0];
|
|
3097
3127
|
if (a === "/api/dashboard/proxy") {
|
|
@@ -3182,7 +3212,7 @@ import {
|
|
|
3182
3212
|
for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (u[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
|
|
3183
3213
|
let f = o.split("?")[0];
|
|
3184
3214
|
if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
|
|
3185
|
-
let e = a(u.origin), t =
|
|
3215
|
+
let e = a(u.origin), t = Gn(o, Dn(), u);
|
|
3186
3216
|
r.statusCode = t.status, r.setHeader("content-type", t.contentType);
|
|
3187
3217
|
for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
|
|
3188
3218
|
r.end(t.body);
|
|
@@ -3200,7 +3230,7 @@ import {
|
|
|
3200
3230
|
e.setEncoding("utf-8"), e.on("data", (e) => {
|
|
3201
3231
|
i += e;
|
|
3202
3232
|
}), e.on("end", () => {
|
|
3203
|
-
let e =
|
|
3233
|
+
let e = zn(i, n);
|
|
3204
3234
|
r.statusCode = e.status, r.setHeader("content-type", e.contentType);
|
|
3205
3235
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
3206
3236
|
r.end(e.body);
|
|
@@ -3231,14 +3261,14 @@ import {
|
|
|
3231
3261
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
3232
3262
|
r.flushHeaders?.(), r.write("retry: 5000\n\n");
|
|
3233
3263
|
let l = o.indexOf("?");
|
|
3234
|
-
if (!(l !== -1 && new URLSearchParams(o.slice(l + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(
|
|
3264
|
+
if (!(l !== -1 && new URLSearchParams(o.slice(l + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(hn(e));
|
|
3235
3265
|
let d = n.subscribe((e) => {
|
|
3236
3266
|
try {
|
|
3237
|
-
r.write(
|
|
3267
|
+
r.write(hn(e));
|
|
3238
3268
|
} catch {}
|
|
3239
3269
|
}), f = setInterval(() => {
|
|
3240
3270
|
try {
|
|
3241
|
-
r.write(
|
|
3271
|
+
r.write(gn());
|
|
3242
3272
|
} catch {}
|
|
3243
3273
|
}, 15e3), p = () => {
|
|
3244
3274
|
clearInterval(f), d();
|
|
@@ -3251,7 +3281,7 @@ import {
|
|
|
3251
3281
|
kind: "web",
|
|
3252
3282
|
meta: {
|
|
3253
3283
|
name: t.name ?? "(unnamed)",
|
|
3254
|
-
voltroVersion:
|
|
3284
|
+
voltroVersion: wi,
|
|
3255
3285
|
port: g,
|
|
3256
3286
|
mode: "dev",
|
|
3257
3287
|
apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
|
|
@@ -3269,7 +3299,7 @@ import {
|
|
|
3269
3299
|
size: 0,
|
|
3270
3300
|
entries: []
|
|
3271
3301
|
}),
|
|
3272
|
-
env: () =>
|
|
3302
|
+
env: () => ot(t.name ?? "app", { contract: ae(t.env) ? t.env : void 0 })
|
|
3273
3303
|
}, u, { method: e.method ?? "GET" });
|
|
3274
3304
|
if (n === null) return i();
|
|
3275
3305
|
r.statusCode = n.status, r.setHeader("content-type", n.contentType);
|
|
@@ -3286,7 +3316,7 @@ import {
|
|
|
3286
3316
|
e.middlewares.use(async (e, t, n) => {
|
|
3287
3317
|
if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
|
|
3288
3318
|
try {
|
|
3289
|
-
let e = await
|
|
3319
|
+
let e = await We();
|
|
3290
3320
|
t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
|
|
3291
3321
|
} catch (e) {
|
|
3292
3322
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
|
|
@@ -3294,11 +3324,11 @@ import {
|
|
|
3294
3324
|
});
|
|
3295
3325
|
}
|
|
3296
3326
|
} : null, me = /* @__PURE__ */ new Set(), he = (e, t, n, r, i, a = !1) => {
|
|
3297
|
-
let o =
|
|
3298
|
-
if (
|
|
3327
|
+
let o = li(i, a, t) ?? "";
|
|
3328
|
+
if (X.error(`${t} render failed`, {
|
|
3299
3329
|
pathname: n,
|
|
3300
3330
|
pattern: r,
|
|
3301
|
-
cause:
|
|
3331
|
+
cause: vn(i) + o
|
|
3302
3332
|
}), e.headersSent) {
|
|
3303
3333
|
e.end();
|
|
3304
3334
|
return;
|
|
@@ -3309,55 +3339,67 @@ import {
|
|
|
3309
3339
|
"x-voltro-ssr-generation": String(oe)
|
|
3310
3340
|
});
|
|
3311
3341
|
let s = oe === 0 ? "" : `\n[voltro] this process has absorbed ${oe} hot update(s) since boot, so its SSR\nmodule graph may not match the files on disk. Before reporting this — to us or to\nyourself — restart \`voltro dev\` and measure once from a fresh boot.\n`;
|
|
3312
|
-
e.end(`${t} render failed for ${n}\n\n${
|
|
3313
|
-
}, U =
|
|
3342
|
+
e.end(`${t} render failed for ${n}\n\n${vn(i)}\n${o}\n${s}`);
|
|
3343
|
+
}, U = qt(), ge = Yt({
|
|
3314
3344
|
limit: U,
|
|
3315
|
-
onColdStart: (e) =>
|
|
3316
|
-
onColdEnd: (e, { durationMs: t, failed: n }) =>
|
|
3345
|
+
onColdStart: (e) => X.debug("ssr cold-compile start", { id: e }),
|
|
3346
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => X.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
3317
3347
|
id: e,
|
|
3318
3348
|
ms: t,
|
|
3319
3349
|
...n ? { failed: !0 } : {}
|
|
3320
3350
|
})
|
|
3321
3351
|
});
|
|
3322
|
-
|
|
3352
|
+
X.debug(`ssr cold-compile concurrency ${U}`, { concurrency: U });
|
|
3323
3353
|
let W = null, _e = async () => (W === null && (W = await O.readFile(p(e, ".framework", "index.html"), "utf8")), W), ve = {
|
|
3324
3354
|
name: "framework:ssr",
|
|
3325
3355
|
configureServer(n) {
|
|
3326
|
-
let i = (e) => ge.load(e, async () => await n.ssrLoadModule(e)), a, o = () => {
|
|
3356
|
+
let i = (e) => ge.load(e, async () => await n.ssrLoadModule(e)), a, o = !1, s = () => {
|
|
3327
3357
|
if (a !== void 0) return a;
|
|
3328
3358
|
let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
|
|
3329
3359
|
return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
|
|
3330
|
-
let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]),
|
|
3360
|
+
let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), s = {};
|
|
3331
3361
|
for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
|
|
3332
3362
|
let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
|
|
3333
|
-
n !== void 0 && (
|
|
3363
|
+
n !== void 0 && (s[a] = t(a, n, r));
|
|
3334
3364
|
} catch (e) {
|
|
3335
|
-
|
|
3365
|
+
X.warn("locale catalog failed to load for SSR", { locale: a }, e);
|
|
3366
|
+
}
|
|
3367
|
+
if (o = Object.keys(s).length > 0, Object.keys(s).length === 0) {
|
|
3368
|
+
let { resolveLocale: e } = await i("@voltro/i18n/server");
|
|
3369
|
+
return (t, i) => ({
|
|
3370
|
+
locale: e({
|
|
3371
|
+
cookieHeader: t ?? null,
|
|
3372
|
+
acceptLanguageHeader: i ?? null,
|
|
3373
|
+
supported: n,
|
|
3374
|
+
defaultLocale: r
|
|
3375
|
+
}),
|
|
3376
|
+
outerWrap: (e) => e
|
|
3377
|
+
});
|
|
3336
3378
|
}
|
|
3337
3379
|
return a({
|
|
3338
|
-
wraps:
|
|
3380
|
+
wraps: s,
|
|
3339
3381
|
supported: n,
|
|
3340
3382
|
defaultLocale: r
|
|
3341
3383
|
});
|
|
3342
3384
|
})(), a);
|
|
3343
3385
|
};
|
|
3344
|
-
n.middlewares.use(async (a,
|
|
3345
|
-
if (a.method !== "GET" && a.method !== "HEAD") return
|
|
3346
|
-
let
|
|
3347
|
-
|
|
3348
|
-
let { pathname:
|
|
3349
|
-
if (
|
|
3350
|
-
let
|
|
3351
|
-
if (!
|
|
3352
|
-
let
|
|
3353
|
-
|
|
3354
|
-
pattern:
|
|
3355
|
-
pathname:
|
|
3386
|
+
n.middlewares.use(async (a, c, l) => {
|
|
3387
|
+
if (a.method !== "GET" && a.method !== "HEAD") return l();
|
|
3388
|
+
let u = a.url ?? "/";
|
|
3389
|
+
u.indexOf("?");
|
|
3390
|
+
let { pathname: d, search: f } = ni(u);
|
|
3391
|
+
if (d.startsWith("/@") || d.startsWith("/node_modules/") || d.startsWith("/.framework/") || d.startsWith("/_voltro/") || d === "/main.tsx" || d === "/index.html" || d === "/sw.js" || d === "/favicon.ico" || d === "/robots.txt" || /\.[a-z0-9]+$/i.test(d)) return l();
|
|
3392
|
+
let m = Gi(d, S.ssrRoutes);
|
|
3393
|
+
if (!m) return l();
|
|
3394
|
+
let h = !me.has(m.route.pattern), g = Date.now();
|
|
3395
|
+
h && X.info(`ssr compiling ${m.route.pattern}`, {
|
|
3396
|
+
pattern: m.route.pattern,
|
|
3397
|
+
pathname: d
|
|
3356
3398
|
});
|
|
3357
|
-
let
|
|
3399
|
+
let _ = {}, v = async (e, t) => {
|
|
3358
3400
|
let n = Date.now(), r = await t();
|
|
3359
|
-
return
|
|
3360
|
-
},
|
|
3401
|
+
return _[e] = (_[e] ?? 0) + (Date.now() - n), r;
|
|
3402
|
+
}, y = async (e, t, r) => {
|
|
3361
3403
|
let i = await n.moduleGraph.getModuleById(e);
|
|
3362
3404
|
if (!(!i || t.has(e))) {
|
|
3363
3405
|
if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
|
|
@@ -3365,124 +3407,124 @@ import {
|
|
|
3365
3407
|
r.includes(e) || r.push(e);
|
|
3366
3408
|
return;
|
|
3367
3409
|
}
|
|
3368
|
-
for (let e of i.importedModules ?? []) e.id && await
|
|
3410
|
+
for (let e of i.importedModules ?? []) e.id && await y(e.id, t, r);
|
|
3369
3411
|
}
|
|
3370
|
-
},
|
|
3412
|
+
}, b = !1;
|
|
3371
3413
|
try {
|
|
3372
|
-
let
|
|
3373
|
-
if (
|
|
3374
|
-
let
|
|
3375
|
-
for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ?
|
|
3376
|
-
let
|
|
3377
|
-
|
|
3378
|
-
let
|
|
3414
|
+
let x = await v("loadPage", async () => await i(p(e, "src", "pages", m.route.file))), C = vr(x, p("src", "pages", m.route.file)), w = zi(S.dirs, m.route.dirChain), T = C === "spa" && w.some((e) => e.hasLayout);
|
|
3415
|
+
if (C !== "ssr" && C !== "isr" && !T) return l();
|
|
3416
|
+
let E = {};
|
|
3417
|
+
for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? E[e] = t : Array.isArray(t) && (E[e] = t.join(", "));
|
|
3418
|
+
let D = na(ta(r[0], { allowDevProxy: !0 }), E.cookie, { apiName: r[0]?.name }), O = new AbortController(), k = () => O.abort();
|
|
3419
|
+
c.once("close", k);
|
|
3420
|
+
let A = null, j = [], M = {};
|
|
3379
3421
|
try {
|
|
3380
|
-
(await i("@voltro/web/ssr")).beginStoreSeeds(), {chain:
|
|
3381
|
-
entries:
|
|
3422
|
+
(await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: j, segmentLoaderData: M} = await v("loadChain", () => Bi({
|
|
3423
|
+
entries: w,
|
|
3382
3424
|
loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
|
|
3383
3425
|
loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
|
|
3384
3426
|
loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
|
|
3385
3427
|
ctx: {
|
|
3386
|
-
params:
|
|
3387
|
-
pathname:
|
|
3388
|
-
search:
|
|
3389
|
-
signal:
|
|
3390
|
-
headers:
|
|
3391
|
-
query:
|
|
3428
|
+
params: m.params,
|
|
3429
|
+
pathname: d,
|
|
3430
|
+
search: f,
|
|
3431
|
+
signal: O.signal,
|
|
3432
|
+
headers: E,
|
|
3433
|
+
query: D
|
|
3392
3434
|
}
|
|
3393
3435
|
}));
|
|
3394
|
-
let t =
|
|
3395
|
-
typeof t == "function" && !
|
|
3396
|
-
params:
|
|
3397
|
-
pathname:
|
|
3398
|
-
search:
|
|
3399
|
-
signal:
|
|
3400
|
-
headers:
|
|
3401
|
-
query:
|
|
3436
|
+
let t = x.loader;
|
|
3437
|
+
typeof t == "function" && !T && (A = await v("loader", () => t({
|
|
3438
|
+
params: m.params,
|
|
3439
|
+
pathname: d,
|
|
3440
|
+
search: f,
|
|
3441
|
+
signal: O.signal,
|
|
3442
|
+
headers: E,
|
|
3443
|
+
query: D
|
|
3402
3444
|
})));
|
|
3403
3445
|
} finally {
|
|
3404
|
-
|
|
3446
|
+
c.off("close", k);
|
|
3405
3447
|
}
|
|
3406
|
-
let
|
|
3407
|
-
|
|
3408
|
-
pageMod:
|
|
3409
|
-
params:
|
|
3410
|
-
query:
|
|
3448
|
+
let N = await v("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
|
|
3449
|
+
T || await Si({
|
|
3450
|
+
pageMod: x,
|
|
3451
|
+
params: m.params,
|
|
3452
|
+
query: D,
|
|
3411
3453
|
apiName: r[0]?.name,
|
|
3412
|
-
seed:
|
|
3413
|
-
onError: ({ tag: e, apiName: t }, n) =>
|
|
3454
|
+
seed: N.seedPreloadedSubscription,
|
|
3455
|
+
onError: ({ tag: e, apiName: t }, n) => X.warn("preload seed failed", {
|
|
3414
3456
|
tag: e,
|
|
3415
3457
|
apiName: t,
|
|
3416
|
-
pathname:
|
|
3458
|
+
pathname: d
|
|
3417
3459
|
}, n)
|
|
3418
3460
|
});
|
|
3419
3461
|
let ee = {
|
|
3420
|
-
pattern:
|
|
3421
|
-
Component:
|
|
3422
|
-
meta:
|
|
3423
|
-
loader:
|
|
3424
|
-
ErrorBoundary:
|
|
3425
|
-
Pending:
|
|
3426
|
-
renderMode:
|
|
3427
|
-
chain:
|
|
3428
|
-
},
|
|
3429
|
-
cookies:
|
|
3430
|
-
headers:
|
|
3431
|
-
url:
|
|
3432
|
-
},
|
|
3433
|
-
|
|
3434
|
-
let
|
|
3435
|
-
outerWrap:
|
|
3436
|
-
locale:
|
|
3437
|
-
} : {},
|
|
3438
|
-
helpers:
|
|
3439
|
-
page: `src/pages/${
|
|
3440
|
-
interactive:
|
|
3462
|
+
pattern: m.route.pattern,
|
|
3463
|
+
Component: x.default,
|
|
3464
|
+
meta: x.meta,
|
|
3465
|
+
loader: x.loader,
|
|
3466
|
+
ErrorBoundary: x.ErrorBoundary,
|
|
3467
|
+
Pending: x.Pending,
|
|
3468
|
+
renderMode: C,
|
|
3469
|
+
chain: j
|
|
3470
|
+
}, P = {
|
|
3471
|
+
cookies: N.parseCookieHeader(E.cookie),
|
|
3472
|
+
headers: E,
|
|
3473
|
+
url: u
|
|
3474
|
+
}, F = x.interactive ?? "full", I = (await s())(E.cookie, E["accept-language"]);
|
|
3475
|
+
b = I !== void 0 && o;
|
|
3476
|
+
let te = I ? {
|
|
3477
|
+
outerWrap: I.outerWrap,
|
|
3478
|
+
locale: I.locale
|
|
3479
|
+
} : {}, L = T ? $r({
|
|
3480
|
+
helpers: N,
|
|
3481
|
+
page: `src/pages/${m.route.file}`,
|
|
3482
|
+
interactive: F,
|
|
3441
3483
|
delivery: "stream",
|
|
3442
3484
|
renderInput: {
|
|
3443
3485
|
descriptor: ee,
|
|
3444
|
-
params:
|
|
3445
|
-
pathname:
|
|
3446
|
-
search:
|
|
3447
|
-
segmentLoaderData:
|
|
3448
|
-
requestContext:
|
|
3449
|
-
...
|
|
3486
|
+
params: m.params,
|
|
3487
|
+
pathname: d,
|
|
3488
|
+
search: f,
|
|
3489
|
+
segmentLoaderData: M,
|
|
3490
|
+
requestContext: P,
|
|
3491
|
+
...te
|
|
3450
3492
|
}
|
|
3451
|
-
}) : null,
|
|
3452
|
-
helpers:
|
|
3453
|
-
page: `src/pages/${
|
|
3454
|
-
pathname:
|
|
3455
|
-
renderMode:
|
|
3456
|
-
interactive:
|
|
3457
|
-
loaderData:
|
|
3458
|
-
segmentLoaderData:
|
|
3459
|
-
pageLoaderRan: typeof
|
|
3460
|
-
}),
|
|
3461
|
-
await
|
|
3493
|
+
}) : null, R = T ? null : Qr({
|
|
3494
|
+
helpers: N,
|
|
3495
|
+
page: `src/pages/${m.route.file}`,
|
|
3496
|
+
pathname: d,
|
|
3497
|
+
renderMode: C,
|
|
3498
|
+
interactive: F,
|
|
3499
|
+
loaderData: A,
|
|
3500
|
+
segmentLoaderData: M,
|
|
3501
|
+
pageLoaderRan: typeof x.loader == "function"
|
|
3502
|
+
}), ne = [];
|
|
3503
|
+
await v("collectCss", async () => {
|
|
3462
3504
|
let t = /* @__PURE__ */ new Set(), n = [
|
|
3463
|
-
p(e, "src", "pages",
|
|
3464
|
-
...
|
|
3505
|
+
p(e, "src", "pages", m.route.file),
|
|
3506
|
+
...w.flatMap((t) => [
|
|
3465
3507
|
...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
|
|
3466
3508
|
...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
|
|
3467
3509
|
...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
|
|
3468
3510
|
]),
|
|
3469
3511
|
p(e, ".framework", "main.tsx")
|
|
3470
3512
|
];
|
|
3471
|
-
for (let e of n) await
|
|
3513
|
+
for (let e of n) await y(e, t, ne);
|
|
3472
3514
|
});
|
|
3473
|
-
let re = await
|
|
3474
|
-
if (
|
|
3475
|
-
let e = (e) =>
|
|
3476
|
-
helpers:
|
|
3477
|
-
prepared:
|
|
3515
|
+
let re = await v("readShell", _e), z = await v("transformShell", () => n.transformIndexHtml(u, re)), ie = ne.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), B = I?.locale ?? P.cookies["voltro:locale"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", ae = Date.now();
|
|
3516
|
+
if (L) {
|
|
3517
|
+
let e = (e) => ti({
|
|
3518
|
+
helpers: N,
|
|
3519
|
+
prepared: L,
|
|
3478
3520
|
meta: e,
|
|
3479
|
-
interactive:
|
|
3480
|
-
extra: [
|
|
3521
|
+
interactive: F,
|
|
3522
|
+
extra: [ie]
|
|
3481
3523
|
});
|
|
3482
|
-
if (
|
|
3483
|
-
res:
|
|
3484
|
-
shell:
|
|
3485
|
-
shell:
|
|
3524
|
+
if (L.hasDeferred) yi({
|
|
3525
|
+
res: c,
|
|
3526
|
+
shell: gi({
|
|
3527
|
+
shell: z,
|
|
3486
3528
|
inlineModuleScriptsAsync: !0
|
|
3487
3529
|
}),
|
|
3488
3530
|
htmlLang: B,
|
|
@@ -3491,42 +3533,42 @@ import {
|
|
|
3491
3533
|
"x-voltro-rendered-by": "spa-shell-dev"
|
|
3492
3534
|
},
|
|
3493
3535
|
headInjection: e,
|
|
3494
|
-
render: (e) =>
|
|
3495
|
-
...
|
|
3536
|
+
render: (e) => N.renderPageToStream({
|
|
3537
|
+
...L.renderInput,
|
|
3496
3538
|
...e
|
|
3497
3539
|
}),
|
|
3498
3540
|
onShellError: (e) => {
|
|
3499
|
-
he(
|
|
3541
|
+
he(c, "spa-shell-dev", d, m.route.pattern, e, b);
|
|
3500
3542
|
}
|
|
3501
3543
|
});
|
|
3502
3544
|
else {
|
|
3503
|
-
let t =
|
|
3504
|
-
helpers:
|
|
3505
|
-
prepared:
|
|
3506
|
-
}), n =
|
|
3507
|
-
|
|
3545
|
+
let t = ei({
|
|
3546
|
+
helpers: N,
|
|
3547
|
+
prepared: L
|
|
3548
|
+
}), n = z.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="${B}"`);
|
|
3549
|
+
c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "spa-shell-dev"), c.end(n);
|
|
3508
3550
|
}
|
|
3509
|
-
} else if (
|
|
3551
|
+
} else if (R) {
|
|
3510
3552
|
let e = (e) => [
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
`<meta name="voltro-interactive" content="${
|
|
3514
|
-
...
|
|
3515
|
-
|
|
3553
|
+
ie,
|
|
3554
|
+
N.renderMetaToHtml(e),
|
|
3555
|
+
`<meta name="voltro-interactive" content="${F}" />`,
|
|
3556
|
+
...R.hasDeferred ? [N.renderDeferredRegistryScript()] : [],
|
|
3557
|
+
N.renderRouterStateScript(R.stateInput)
|
|
3516
3558
|
].filter((e) => e.length > 0).join("\n "), t = {
|
|
3517
3559
|
descriptor: ee,
|
|
3518
|
-
params:
|
|
3519
|
-
pathname:
|
|
3520
|
-
search:
|
|
3521
|
-
loaderData:
|
|
3522
|
-
segmentLoaderData:
|
|
3523
|
-
requestContext:
|
|
3524
|
-
...
|
|
3560
|
+
params: m.params,
|
|
3561
|
+
pathname: d,
|
|
3562
|
+
search: f,
|
|
3563
|
+
loaderData: R.loaderData,
|
|
3564
|
+
segmentLoaderData: R.segmentLoaderData,
|
|
3565
|
+
requestContext: P,
|
|
3566
|
+
...te
|
|
3525
3567
|
};
|
|
3526
|
-
if (
|
|
3527
|
-
res:
|
|
3528
|
-
shell:
|
|
3529
|
-
shell:
|
|
3568
|
+
if (C === "ssr" && F === "full") yi({
|
|
3569
|
+
res: c,
|
|
3570
|
+
shell: gi({
|
|
3571
|
+
shell: z,
|
|
3530
3572
|
inlineModuleScriptsAsync: !0
|
|
3531
3573
|
}),
|
|
3532
3574
|
htmlLang: B,
|
|
@@ -3535,58 +3577,58 @@ import {
|
|
|
3535
3577
|
"x-voltro-rendered-by": "ssr-dev"
|
|
3536
3578
|
},
|
|
3537
3579
|
headInjection: e,
|
|
3538
|
-
render: (e) =>
|
|
3580
|
+
render: (e) => N.renderPageToStream({
|
|
3539
3581
|
...t,
|
|
3540
3582
|
...e
|
|
3541
3583
|
}),
|
|
3542
3584
|
onShellError: (e) => {
|
|
3543
|
-
he(
|
|
3585
|
+
he(c, "ssr-dev", d, m.route.pattern, e, b);
|
|
3544
3586
|
}
|
|
3545
3587
|
});
|
|
3546
3588
|
else {
|
|
3547
|
-
let { html: n, meta: r } =
|
|
3548
|
-
|
|
3589
|
+
let { html: n, meta: r } = N.renderPageToHtml(t), i = z.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${B}"`);
|
|
3590
|
+
c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "ssr-dev"), c.end(i);
|
|
3549
3591
|
}
|
|
3550
3592
|
}
|
|
3551
|
-
|
|
3552
|
-
let V = Date.now() -
|
|
3553
|
-
|
|
3554
|
-
pattern:
|
|
3555
|
-
pathname:
|
|
3593
|
+
_.render = Date.now() - ae;
|
|
3594
|
+
let V = Date.now() - g;
|
|
3595
|
+
h ? (me.add(m.route.pattern), X.info(`ssr compiled ${m.route.pattern} in ${V}ms`, {
|
|
3596
|
+
pattern: m.route.pattern,
|
|
3597
|
+
pathname: d,
|
|
3556
3598
|
elapsedMs: V,
|
|
3557
3599
|
cold: !0,
|
|
3558
|
-
phases:
|
|
3559
|
-
})) : V > 200 &&
|
|
3560
|
-
pattern:
|
|
3561
|
-
pathname:
|
|
3600
|
+
phases: _
|
|
3601
|
+
})) : V > 200 && X.info(`ssr rendered ${d} in ${V}ms`, {
|
|
3602
|
+
pattern: m.route.pattern,
|
|
3603
|
+
pathname: d,
|
|
3562
3604
|
elapsedMs: V,
|
|
3563
3605
|
cold: !1,
|
|
3564
|
-
phases:
|
|
3606
|
+
phases: _
|
|
3565
3607
|
});
|
|
3566
3608
|
} catch (e) {
|
|
3567
|
-
if (
|
|
3568
|
-
|
|
3569
|
-
pathname:
|
|
3570
|
-
pattern:
|
|
3571
|
-
}, e),
|
|
3609
|
+
if (Xr(e)) {
|
|
3610
|
+
X.error("ssr-dev render refused", {
|
|
3611
|
+
pathname: d,
|
|
3612
|
+
pattern: m.route.pattern
|
|
3613
|
+
}, e), c.statusCode = 500, c.setHeader("content-type", "text/plain; charset=utf-8"), c.end(e.message);
|
|
3572
3614
|
return;
|
|
3573
3615
|
}
|
|
3574
|
-
let t =
|
|
3616
|
+
let t = Zr(e);
|
|
3575
3617
|
if (t) {
|
|
3576
|
-
|
|
3577
|
-
for (let [e, n] of Object.entries(t.headers))
|
|
3578
|
-
|
|
3618
|
+
c.statusCode = t.status;
|
|
3619
|
+
for (let [e, n] of Object.entries(t.headers)) c.setHeader(e, String(n));
|
|
3620
|
+
c.end(t.body);
|
|
3579
3621
|
return;
|
|
3580
3622
|
}
|
|
3581
|
-
he(
|
|
3623
|
+
he(c, "ssr-dev", d, m.route.pattern, e, b);
|
|
3582
3624
|
}
|
|
3583
3625
|
});
|
|
3584
3626
|
}
|
|
3585
|
-
},
|
|
3627
|
+
}, ye = Date.now(), G = D.version ?? "?", K = await Ti(), be = p(e, "node_modules", "@voltro", "ui-shadcn"), q = T(p(be, "package.json")) ? be : null, xe = [], Se = await (async () => {
|
|
3586
3628
|
let t = [];
|
|
3587
3629
|
for (let n of r) {
|
|
3588
3630
|
if (!n.proxyTarget) continue;
|
|
3589
|
-
let r = await
|
|
3631
|
+
let r = await Ki(e, n.pkg);
|
|
3590
3632
|
if (r) try {
|
|
3591
3633
|
t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
|
|
3592
3634
|
} catch {}
|
|
@@ -3602,11 +3644,11 @@ import {
|
|
|
3602
3644
|
} catch {}
|
|
3603
3645
|
return !0;
|
|
3604
3646
|
})();
|
|
3605
|
-
|
|
3647
|
+
Se && X.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client");
|
|
3606
3648
|
try {
|
|
3607
|
-
await
|
|
3649
|
+
await Tt(g, "voltro dev (web)");
|
|
3608
3650
|
} catch (e) {
|
|
3609
|
-
|
|
3651
|
+
X.error(String(e.message ?? e)), process.exit(1);
|
|
3610
3652
|
}
|
|
3611
3653
|
await (await D.createServer({
|
|
3612
3654
|
root: j,
|
|
@@ -3620,46 +3662,46 @@ import {
|
|
|
3620
3662
|
"@voltro/i18n"
|
|
3621
3663
|
],
|
|
3622
3664
|
alias: [
|
|
3623
|
-
...
|
|
3665
|
+
...K ? [{
|
|
3624
3666
|
find: "@voltro/devtools/styles.css",
|
|
3625
|
-
replacement: p(
|
|
3667
|
+
replacement: p(K, "src/styles.css")
|
|
3626
3668
|
}, {
|
|
3627
3669
|
find: "@voltro/devtools",
|
|
3628
|
-
replacement: p(
|
|
3670
|
+
replacement: p(K, "src/index.ts")
|
|
3629
3671
|
}] : [],
|
|
3630
|
-
...
|
|
3672
|
+
...q ? [
|
|
3631
3673
|
{
|
|
3632
3674
|
find: "@voltro/ui-shadcn/tokens.css",
|
|
3633
|
-
replacement: p(
|
|
3675
|
+
replacement: p(q, "src/tokens.css")
|
|
3634
3676
|
},
|
|
3635
3677
|
{
|
|
3636
3678
|
find: "@voltro/ui-shadcn/cn",
|
|
3637
|
-
replacement: p(
|
|
3679
|
+
replacement: p(q, "src/cn.ts")
|
|
3638
3680
|
},
|
|
3639
3681
|
{
|
|
3640
3682
|
find: "@voltro/ui-shadcn/brand",
|
|
3641
|
-
replacement: p(
|
|
3683
|
+
replacement: p(q, "src/brand/voltroLogo.tsx")
|
|
3642
3684
|
},
|
|
3643
3685
|
{
|
|
3644
3686
|
find: "@voltro/ui-shadcn",
|
|
3645
|
-
replacement: p(
|
|
3687
|
+
replacement: p(q, "src/index.ts")
|
|
3646
3688
|
}
|
|
3647
3689
|
] : [],
|
|
3648
|
-
...
|
|
3690
|
+
...Ye(e)
|
|
3649
3691
|
]
|
|
3650
3692
|
},
|
|
3651
3693
|
optimizeDeps: {
|
|
3652
|
-
include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...
|
|
3653
|
-
force:
|
|
3694
|
+
include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...xe],
|
|
3695
|
+
force: Se
|
|
3654
3696
|
},
|
|
3655
|
-
customLogger:
|
|
3697
|
+
customLogger: Kt(),
|
|
3656
3698
|
plugins: [
|
|
3657
|
-
|
|
3699
|
+
fr(p(e, "src", "pages")),
|
|
3658
3700
|
k(),
|
|
3659
3701
|
A(),
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3702
|
+
ee,
|
|
3703
|
+
L,
|
|
3704
|
+
B,
|
|
3663
3705
|
se,
|
|
3664
3706
|
ce,
|
|
3665
3707
|
ue,
|
|
@@ -3672,24 +3714,24 @@ import {
|
|
|
3672
3714
|
host: !0,
|
|
3673
3715
|
allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
|
|
3674
3716
|
proxy: H,
|
|
3675
|
-
fs: { allow: [e, ...
|
|
3717
|
+
fs: { allow: [e, ...ji(e)] }
|
|
3676
3718
|
},
|
|
3677
3719
|
appType: "spa",
|
|
3678
3720
|
cacheDir: p(j, ".vite"),
|
|
3679
3721
|
publicDir: p(e, "public")
|
|
3680
|
-
})).listen(),
|
|
3681
|
-
version:
|
|
3682
|
-
bootMs: Date.now() -
|
|
3683
|
-
}),
|
|
3722
|
+
})).listen(), Ci.info(`v${G} ready in ${Date.now() - ye}ms`, {
|
|
3723
|
+
version: G,
|
|
3724
|
+
bootMs: Date.now() - ye
|
|
3725
|
+
}), X.info(`listening on http://localhost:${g}`, {
|
|
3684
3726
|
port: g,
|
|
3685
3727
|
app: t.name ?? "(unnamed)"
|
|
3686
3728
|
});
|
|
3687
|
-
for (let e of r) e.proxyTarget && (
|
|
3729
|
+
for (let e of r) e.proxyTarget && (X.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
|
|
3688
3730
|
api: e.name,
|
|
3689
3731
|
target: e.proxyTarget
|
|
3690
|
-
}),
|
|
3732
|
+
}), X.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
|
|
3691
3733
|
try {
|
|
3692
|
-
await
|
|
3734
|
+
await Ge({
|
|
3693
3735
|
id: v,
|
|
3694
3736
|
name: _,
|
|
3695
3737
|
kind: "web",
|
|
@@ -3698,13 +3740,13 @@ import {
|
|
|
3698
3740
|
status: "live",
|
|
3699
3741
|
logFile: y.path
|
|
3700
3742
|
});
|
|
3701
|
-
let t =
|
|
3743
|
+
let t = Rr(e);
|
|
3702
3744
|
if (t) {
|
|
3703
|
-
let e = await
|
|
3704
|
-
e.status === "launched" ?
|
|
3745
|
+
let e = await Jr({ dashboardAppPath: t });
|
|
3746
|
+
e.status === "launched" ? X.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && X.debug(`dashboard already running on :${e.port}`, { port: e.port });
|
|
3705
3747
|
}
|
|
3706
3748
|
setInterval(() => {
|
|
3707
|
-
|
|
3749
|
+
Ge({
|
|
3708
3750
|
id: v,
|
|
3709
3751
|
name: _,
|
|
3710
3752
|
kind: "web",
|
|
@@ -3715,17 +3757,17 @@ import {
|
|
|
3715
3757
|
}).catch(() => {});
|
|
3716
3758
|
}, 1e4).unref();
|
|
3717
3759
|
let n = () => {
|
|
3718
|
-
|
|
3760
|
+
Ke(v), y.dispose();
|
|
3719
3761
|
};
|
|
3720
3762
|
process.on("SIGINT", n), process.on("SIGTERM", n);
|
|
3721
3763
|
} catch (e) {
|
|
3722
|
-
|
|
3764
|
+
X.warn("runtime-registry write failed", {}, e);
|
|
3723
3765
|
}
|
|
3724
3766
|
return C({
|
|
3725
3767
|
app: t.name ?? "unnamed",
|
|
3726
3768
|
kind: "web",
|
|
3727
3769
|
url: `http://localhost:${g}`,
|
|
3728
|
-
bootMs: Date.now() -
|
|
3770
|
+
bootMs: Date.now() - ye
|
|
3729
3771
|
}), new Promise(() => {});
|
|
3730
3772
|
}, sa = async (e) => {
|
|
3731
3773
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
@@ -3734,27 +3776,27 @@ import {
|
|
|
3734
3776
|
ran: !1,
|
|
3735
3777
|
exitCode: 0
|
|
3736
3778
|
};
|
|
3737
|
-
let n = Date.now(), r =
|
|
3779
|
+
let n = Date.now(), r = X.child("serve");
|
|
3738
3780
|
r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
|
|
3739
|
-
let i = await
|
|
3781
|
+
let i = await Zi(e, t);
|
|
3740
3782
|
for (let e of i) r.info("api wired", {
|
|
3741
3783
|
name: e.name,
|
|
3742
3784
|
pkg: e.pkg
|
|
3743
3785
|
});
|
|
3744
|
-
await
|
|
3786
|
+
await $(e, t, i);
|
|
3745
3787
|
{
|
|
3746
|
-
let { pages: t } = await
|
|
3747
|
-
await
|
|
3788
|
+
let { pages: t } = await Q(p(e, "src", "pages"));
|
|
3789
|
+
await on({
|
|
3748
3790
|
appRoot: e,
|
|
3749
3791
|
pages: t
|
|
3750
3792
|
});
|
|
3751
3793
|
}
|
|
3752
|
-
let a = t.port ?? 5173, o = await
|
|
3753
|
-
|
|
3794
|
+
let a = t.port ?? 5173, o = await Ze("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
|
|
3795
|
+
X.info("running production build"), await o.build({
|
|
3754
3796
|
root: c,
|
|
3755
3797
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3756
3798
|
plugins: [s()],
|
|
3757
|
-
customLogger:
|
|
3799
|
+
customLogger: Kt(),
|
|
3758
3800
|
resolve: { dedupe: [
|
|
3759
3801
|
"react",
|
|
3760
3802
|
"react-dom",
|
|
@@ -3763,7 +3805,7 @@ import {
|
|
|
3763
3805
|
] },
|
|
3764
3806
|
build: {
|
|
3765
3807
|
outDir: "dist",
|
|
3766
|
-
rollupOptions: { output: { manualChunks:
|
|
3808
|
+
rollupOptions: { output: { manualChunks: Ni } }
|
|
3767
3809
|
},
|
|
3768
3810
|
publicDir: p(e, "public")
|
|
3769
3811
|
});
|
|
@@ -3813,7 +3855,7 @@ import {
|
|
|
3813
3855
|
let t = e.maxSamples ?? ca, n = e.defaultWindowMs ?? la, r = [];
|
|
3814
3856
|
return {
|
|
3815
3857
|
record(e) {
|
|
3816
|
-
|
|
3858
|
+
I(e), r.push({
|
|
3817
3859
|
...e,
|
|
3818
3860
|
ts: Date.now()
|
|
3819
3861
|
}), r.length > t && r.shift();
|
|
@@ -3852,4 +3894,4 @@ import {
|
|
|
3852
3894
|
};
|
|
3853
3895
|
};
|
|
3854
3896
|
//#endregion
|
|
3855
|
-
export {
|
|
3897
|
+
export { qt as $, Pr as A, Xn as B, ni as C, We as Ct, Rr as D, Pe as Dt, Jr as E, Ne as Et, mr as F, Dn as G, Vn as H, gr as I, gn as J, hn as K, vr as L, Cr as M, pr as N, Mr as O, yr as P, Yt as Q, nr as R, ti as S, qe as St, Lr as T, Ge as Tt, zn as U, Gn as V, Mn as W, dn as X, fn as Y, on as Z, yi as _, it as _t, Bi as a, Tt as at, $r as b, Ze as bt, Zi as c, gt as ct, Ni as d, dt, Nt as et, Q as f, ft, gi as g, st as gt, _i as h, ot as ht, na as i, Lt as it, xr as j, Nr as k, oa as l, ht as lt, Si as m, lt as mt, Pi as n, Pt as nt, zi as o, bt as ot, $ as p, ct as pt, mn as q, ta as r, It as rt, aa as s, vt as st, fa as t, Ft as tt, sa as u, ut, Xr as v, nt as vt, zr as w, Ke as wt, ei as x, Ye as xt, Qr as y, tt as yt, rr as z };
|