@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.
Files changed (74) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/dist/{apiBuild-CLPt-pX6.js → apiBuild-C4uEbs3s.js} +2 -2
  3. package/dist/apiBuild-OJEjtwcn.js +2 -0
  4. package/dist/bin.js +3 -3
  5. package/dist/checkCommand-CwMrzAgV.js +2 -0
  6. package/dist/{checkCommand-D7r6_pk7.js → checkCommand-dm7OHtPt.js} +328 -288
  7. package/dist/{commands-CNVVv03h.js → commands-C0nEePif.js} +53 -11
  8. package/dist/dbCommand-By__Ev0R.js +2 -0
  9. package/dist/{dbCommand-BH8GAYuf.js → dbCommand-ifOMafuG.js} +90 -82
  10. package/dist/{dev-DdQEn2Ia.js → dev-5ficNnvF.js} +1232 -1224
  11. package/dist/{dev-DOZVMVfi.js → dev-rc3fwPSZ.js} +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/{inspectMetrics-BeEAnjqw.js → inspectMetrics-BqO4E9G0.js} +757 -715
  14. package/dist/{sdkgen-v9WV8zRi.js → sdkgen-B_5mHQS2.js} +1 -1
  15. package/dist/{serveCommand-KsKXXWn4.js → serveCommand-PxMmn96o.js} +366 -366
  16. package/dist/serveEntry.js +2 -2
  17. package/dist/{start-CI2QdKy9.js → start-D1-8eKrO.js} +1 -1
  18. package/dist/startEntry.js +2 -2
  19. package/package.json +417 -17
  20. package/templates/AGENTS.md +1 -1
  21. package/templates/agent-docs/_index.md +1 -1
  22. package/templates/agent-docs/plugins/audit.md +24 -0
  23. package/templates/agent-docs/security.md +9 -0
  24. package/templates/agent-docs/whats-new.md +109 -61
  25. package/templates/apps/api-ai/package.json +7 -7
  26. package/templates/apps/api-auth/package.json +8 -8
  27. package/templates/apps/api-backend/package.json +7 -7
  28. package/templates/apps/api-backend-deactivation/package.json +7 -7
  29. package/templates/apps/api-backend-mail/package.json +8 -8
  30. package/templates/apps/api-backend-mariadb/package.json +9 -9
  31. package/templates/apps/api-backend-sqlite/package.json +8 -8
  32. package/templates/apps/api-backend-storage/package.json +8 -8
  33. package/templates/apps/api-cms/package.json +10 -10
  34. package/templates/apps/api-collab/package.json +8 -8
  35. package/templates/apps/api-data-advanced/package.json +8 -8
  36. package/templates/apps/api-durable/package.json +8 -8
  37. package/templates/apps/api-feature-flags/package.json +9 -9
  38. package/templates/apps/api-governance/package.json +8 -8
  39. package/templates/apps/api-kv/package.json +8 -8
  40. package/templates/apps/api-moderation/package.json +8 -8
  41. package/templates/apps/api-observability/package.json +8 -8
  42. package/templates/apps/api-ratelimit/package.json +8 -8
  43. package/templates/apps/api-rbac/package.json +8 -8
  44. package/templates/apps/api-rest/package.json +7 -7
  45. package/templates/apps/api-saas/package.json +11 -11
  46. package/templates/apps/api-saas-starter/package.json +10 -10
  47. package/templates/apps/api-search/package.json +8 -8
  48. package/templates/apps/api-status/package.json +8 -8
  49. package/templates/apps/api-versioning/package.json +8 -8
  50. package/templates/apps/api-webhooks/package.json +9 -9
  51. package/templates/apps/changelog/package.json +6 -6
  52. package/templates/apps/edge-functions/package.json +2 -2
  53. package/templates/apps/frontend-admin/package.json +8 -8
  54. package/templates/apps/frontend-app/package.json +8 -8
  55. package/templates/apps/frontend-auth/package.json +8 -8
  56. package/templates/apps/frontend-blank/package.json +7 -7
  57. package/templates/apps/frontend-cms/package.json +9 -9
  58. package/templates/apps/frontend-collab/package.json +9 -9
  59. package/templates/apps/frontend-contact/package.json +7 -7
  60. package/templates/apps/frontend-dashboard/package.json +7 -7
  61. package/templates/apps/frontend-docs/package.json +7 -7
  62. package/templates/apps/frontend-i18n/package.json +6 -6
  63. package/templates/apps/frontend-landing/package.json +7 -7
  64. package/templates/apps/frontend-portal/package.json +8 -8
  65. package/templates/apps/frontend-saas/package.json +8 -8
  66. package/templates/apps/frontend-spa/package.json +7 -7
  67. package/templates/apps/frontend-ssr/package.json +7 -7
  68. package/templates/apps/frontend-ssr-api/package.json +8 -8
  69. package/templates/apps/frontend-static-blog/package.json +6 -6
  70. package/templates/apps/frontend-status/package.json +8 -8
  71. package/templates/apps/mobile-app/package.json +2 -2
  72. package/dist/apiBuild-BOqL1dlg.js +0 -2
  73. package/dist/checkCommand-ClRvH_SN.js +0 -2
  74. 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 ee, watchFile as te, writeSync as N } from "node:fs";
11
- import { currentTraceContext as P, recordSample as ne, resolveSecret as F } from "@voltro/runtime";
12
- import { homedir as I } from "node:os";
13
- import { createRequire as L } from "node:module";
14
- import { FRAMEWORK_ENV_CATALOG as re, appEnvEntries as R, checkEnvNaming as z, formatEnvErrors as B, installEnvSnapshot as ie, isEnvContract as V, pluginEnvEntries as ae, renderDotEnvExample as oe, resolveEnv as se } from "@voltro/env";
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, G = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), ye = (e, t) => e.readFileString(t).pipe(b.map((e) => {
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)), J = (e) => b.gen(function* () {
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* K(t, p(n, ".git"))) || (yield* K(t, p(n, "pnpm-workspace.yaml"))) || (yield* ye(t, p(n, "package.json")))) return n;
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
- }), be = (e, t, n) => b.gen(function* () {
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* be(e, r, a) : yield* e.copyFile(r, a).pipe(b.orElseSucceed(() => void 0));
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
- }), xe = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Se = (e, t) => b.gen(function* () {
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* K(e, n))) return null;
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(xe).filter((e) => e !== null);
51
- }), Ce = (e, t) => b.gen(function* () {
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* K(e, i))) return {
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* K(e, o))) continue;
62
- let s = yield* q(e, o);
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
- }), we = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Te = (e, t, n) => {
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}\` | ${we(e.description)} |`),
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)} | ${we(e.description)} |`) : t.map((e) => {
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)} | ${we(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
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
- }, Ee = (e, t, n) => {
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
- }, De = {
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
- }, Oe = [
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
- ], ke = (e, t) => `---
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
- `, Ae = (e, t, n, r) => b.gen(function* () {
175
- let i = yield* K(e, t);
174
+ `, je = (e, t, n, r) => b.gen(function* () {
175
+ let i = yield* G(e, t);
176
176
  if (i) {
177
- if ((yield* q(e, t)).slice(0, ve).includes("voltro:agents-md:keep")) return {
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
- }), je = (e, t = {}) => b.gen(function* () {
191
- let n = yield* v.FileSystem, r = yield* J(e), i = null;
192
- for (let e of U) if (yield* K(n, p(e, "AGENTS.core.md"))) {
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* K(n, p(e, "AGENTS.md"))) {
198
- let i = yield* q(n, p(e, "AGENTS.md")), a = [];
199
- for (let e of W) a.push(yield* Ae(n, p(r, e), i, t.force ?? !1));
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* q(n, p(i, "AGENTS.core.md")), o = yield* q(n, p(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
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* K(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) => q(n, e).pipe(b.map((e) => e.slice(0, ve))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((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* Ce(n, r), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), y = !1;
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* Se(n, e);
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(xe).filter((e) => e !== null) : y ? [..._] : null, S = a.includes(G) ? a.replace(G, Te(s, x, l)) : a, C = [];
221
- for (let e of d) C.push(yield* Ae(n, e, S, u));
222
- c || (yield* be(n, p(i, "agent-docs"), p(r, "agent-docs")));
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 ? Ee(t, s, l) : "";
226
- }, E = (e, t) => b.forEach(W, (r) => Ae(n, p(e, r), t, u));
227
- for (let e of f) C.push(...yield* E(e, De.api(l, g.get(e) ?? null, T(e)))), (yield* K(n, p(e, "database"))) && C.push(...yield* E(p(e, "database"), De.database(l)));
228
- for (let e of m) C.push(...yield* E(e, De.web(l, T(e))));
229
- for (let e of Oe) C.push(yield* Ae(n, p(r, ".claude", "skills", e.name, "SKILL.md"), ke(e, l), u));
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
- }), Me = (e, t = {}) => b.runPromise(je(e, t).pipe(b.provide(y.layer))), Ne = async (t) => {
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* je(r, { force: n });
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
- }, Pe = p(I(), ".voltro"), Fe = p(Pe, "runtime-registry.json"), Ie = 3e4, Le = () => {
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 `${Fe}.${process.pid}.${Date.now()}.${e}.tmp`;
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(Fe, "utf8"), t = JSON.parse(e);
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
- }, Be = async (e) => {
262
- await Re();
263
- let t = Le();
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, Fe), await O.chmod(Fe, 384).catch(() => {});
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
- }, Ve = (e) => {
275
+ }, He = (e) => {
276
276
  try {
277
277
  return process.kill(e, 0), !0;
278
278
  } catch {
279
279
  return !1;
280
280
  }
281
- }, He = (e) => {
281
+ }, Ue = (e) => {
282
282
  let t = Date.now();
283
- return e.filter((e) => Ve(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Ie : !1);
284
- }, Ue = async () => {
285
- let e = await ze(), t = He(e.apps);
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 Be({
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
- }, We = async (e) => {
298
- let t = await ze(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
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 Be({
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
- }, Ge = async (e) => {
308
+ }, Ke = async (e) => {
309
309
  try {
310
- let t = await ze(), n = t.apps.filter((t) => t.id !== e);
310
+ let t = await Be(), n = t.apps.filter((t) => t.id !== e);
311
311
  if (n.length === t.apps.length) return;
312
- await Be({
312
+ await Ve({
313
313
  version: 1,
314
314
  apps: n
315
315
  });
316
316
  } catch {}
317
- }, Ke = (e, t, n) => `${e}:${t}:${n}`, qe = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Je = (e) => {
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(qe(k(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = h(e, n.baseUrl ?? "."), a = [];
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
- }, Ye = (e) => {
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
- }, Xe = async (e, t) => {
344
+ }, Ze = async (e, t) => {
345
345
  try {
346
346
  return await t();
347
347
  } catch (t) {
348
- throw Ye(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;
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
- }, Ze = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", Qe = (e, t) => t ? `${e} | undefined` : e, $e = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${Qe(t.tsType, t.optional)}`).join("\n"), et = async (e, t) => {
351
- let n = $e(t, () => !0), r = `${Ze}
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
- }, tt = async (e, t) => {
362
- let n = $e(t, (e) => e === "public"), r = `${Ze}
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
- }, nt = async (e, t) => {
373
- let n = `${Ze}
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
- }, rt = async (e) => {
383
- let t = V(e.rawEnv) ? e.rawEnv : void 0, n = await se({
382
+ }, it = async (e) => {
383
+ let t = ae(e.rawEnv) ? e.rawEnv : void 0, n = await se({
384
384
  contract: t,
385
- resolveSecret: F
385
+ resolveSecret: te
386
386
  }), r = [...n.errors, ...z(t, e.appType)];
387
- if (r.length > 0) throw Error(B(r));
388
- ie(n.values), e.appType === "web" && ce(n.publicValues);
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 et(e.root, t) : await tt(e.root, t)), {
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
- }, it = (e) => {
405
- let t = R(e.contract), n = (e.plugins ?? []).flatMap((e) => ae(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : re, i = /* @__PURE__ */ new Set(), a = [];
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
- }, at = (e, t, n = (e) => process.env[e]) => {
413
- let r = it(t).map((e) => {
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
- }, ot = (e, t) => oe(it({
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
- }), st = () => {
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
- }, ct = (e) => {
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
- }, lt = (e, t = {}) => {
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
- }, ut = (e, t) => e.expiresAt > t, dt = (e, t) => e.expiresAt <= t && e.servableUntil > t, ft = S({ scope: "voltro:cli" }), pt = (e, t) => {
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
- }, mt = [], ht = (e) => {
485
- mt.length = 0;
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
- mt.push(n);
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
- ft.warn(`failed to load env file (continuing)${pt(n, e)}`, { path: n }, e);
508
+ pt.warn(`failed to load env file (continuing)${mt(n, e)}`, { path: n }, e);
509
509
  }
510
510
  }
511
511
  }
512
- }, gt = 500, _t = (e, t, n = {}) => {
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) te(t, { interval: gt }, (e, n) => {
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: gt
535
+ intervalMs: _t
536
536
  }), () => {
537
- for (let t of e) ee(t);
537
+ for (let t of e) N(t);
538
538
  };
539
- }, vt = "VoltroBootRefusal", yt = (e) => {
539
+ }, yt = "VoltroBootRefusal", bt = (e) => {
540
540
  let t = Error(e);
541
- return t.name = vt, t;
542
- }, bt = [{
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
- }], xt = (e, t, n) => new Promise((r) => {
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
- }), St = async (e, t = 400) => ({ families: (await Promise.all(bt.map(async (n) => ({
562
+ }), Ct = async (e, t = 400) => ({ families: (await Promise.all(xt.map(async (n) => ({
563
563
  family: n.family,
564
- taken: await xt(n.host, e, t)
565
- })))).filter((e) => e.taken).map((e) => e.family) }), Ct = (e, t, n) => [
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"), wt = async (e, t) => {
581
- let { families: n } = await St(e);
582
- if (n.length !== 0) throw yt(Ct(e, t, n));
583
- }, Tt = (e) => e === "effect" || e.startsWith("@effect/") || e.startsWith("@voltro/") || e === "react" || e === "react-dom", Et = /(^|\/)(\.bin|\.cache|\.pnpm-store|dist|build)(\/|$)/, Dt = (e) => {
584
- let t = [], n = [], r = e;
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(r, "node_modules");
587
- if (T(e)) {
588
- t.push(e);
589
- let r = p(e, ".pnpm");
590
- T(r) && n.push(r);
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 i = d(r);
593
- if (i === r) break;
594
- r = i;
595
- }
596
- return Ot.push(...n), t;
597
- }, Ot = [], kt = () => {
598
- let e = [];
599
- for (let t of Ot) {
600
- let n;
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
- n = A(t);
636
+ r = A(e);
603
637
  } catch {
604
638
  continue;
605
639
  }
606
- for (let r of n) {
607
- let n = r.lastIndexOf("@");
608
- if (n <= 0) continue;
609
- let i = r.slice(0, n).replace("+", "/"), a = (r.slice(n + 1).split("_")[0] ?? "").trim();
610
- a === "" || !/^\d/.test(a) || e.push({
611
- pkg: i,
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 e;
618
- }, At = (e) => {
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
- }, jt = (e) => {
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(".") || Et.test(r)) continue;
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
- }, Mt = (e) => {
691
+ }, Nt = (e) => {
660
692
  let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
661
- if (!Tt(e)) return;
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.length = 0;
666
- for (let t of Dt(e)) for (let { pkg: e, dir: r } of jt(t)) {
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: e, version: t, dir: r } of kt()) n(e, t, r);
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
- }, Nt = (e) => {
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
- }, Pt = (e) => {
727
+ }, Ft = (e) => {
697
728
  let t = /* @__PURE__ */ new Map();
698
- Ot.length = 0;
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 = At(r);
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
- }, Ft = (e) => {
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
- }, It = (e, t) => {
735
- let n = Pt(e);
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
- }, Lt = S({ scope: "vite" }), Rt = /\x1b\[[0-9;]*m/g, zt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Bt = (e) => e.replace(Rt, "").replace(zt, "").trim(), Vt = /proxy error/i, Ht = [
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
- ], Ut = (e, t = 0) => {
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" && Ht.includes(n.code) || typeof n.message == "string" && Ht.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Ut(e, t + 1)) ? !0 : Ut(n.cause, t + 1);
751
- }, Wt = 4e3, Gt = () => {
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 = Bt(e);
756
- t.length !== 0 && Lt.info(t);
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 = Bt(e);
761
- t.length !== 0 && Lt.warn(t);
790
+ let t = Vt(e);
791
+ t.length !== 0 && Rt.warn(t);
762
792
  },
763
793
  warnOnce: (t) => {
764
- let r = Bt(t);
765
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Lt.warn(r));
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 = Bt(e), i = n?.error;
798
+ let r = Vt(e), i = n?.error;
769
799
  if (r.length !== 0) {
770
- if (Vt.test(r) && Ut(i)) {
800
+ if (Ht.test(r) && Wt(i)) {
771
801
  let e = Date.now();
772
- e - t > Wt && (t = e, Lt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
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
- Lt.error(r, {}, i);
805
+ Rt.error(r, {}, i);
776
806
  }
777
807
  },
778
808
  clearScreen: () => {},
779
809
  hasErrorLogged: (e) => !1
780
810
  };
781
811
  return n;
782
- }, Kt = (e = process.env) => {
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
- }, qt = (e) => {
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
- }, Jt = (e) => {
806
- let t = qt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
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
- }, Yt = (e) => {
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
- }, Xt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Zt = async (e) => {
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
- }, Qt = async (e) => {
871
- let t = await Zt(e);
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 $(r);
910
+ let { pages: e } = await Q(r);
881
911
  a = e.map((e) => ({
882
912
  pattern: e.pattern,
883
- params: Yt(e.pattern)
913
+ params: Xt(e.pattern)
884
914
  }));
885
915
  } catch {
886
916
  continue;
887
917
  }
888
918
  o.push({
889
- key: Xt(e),
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
- }, $t = (e) => {
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
- }, en = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
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("; ")} }`, tn = (e, t, n) => {
908
- let r = en(e), i = $t(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
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
- }, nn = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${tn(e, !1)},`).join("\n")}\n}`, rn = (e, t) => {
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)}: ${tn(e, !0, i)},`);
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
- }, an = async (e) => {
944
+ }, on = async (e) => {
915
945
  let t = e.pages.map((e) => ({
916
946
  pattern: e.pattern,
917
- params: Yt(e.pattern)
918
- })), n = await Qt(e.appRoot), r = [
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 = ${nn(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => rn(e, i)).join("\n")}\n} as const\n`}`, o = p(e.appRoot, ".framework", "routes.generated.ts");
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
- }, on = (e) => {
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
- }, sn = (e, t) => {
945
- let n = e.endsWith("/") ? e.slice(0, -1) : e, r = on(t);
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
- }, cn = (e, t, n) => {
948
- let r = on(e);
977
+ }, ln = (e, t, n) => {
978
+ let r = sn(e);
949
979
  return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
950
- }, ln = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), un = (e) => {
980
+ }, un = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), 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="${ln(n)}" href="${ln(sn(t, cn(e, n, i)))}" />`);
954
- return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${ln(sn(t, cn(e, i, i)))}" />`), `\n${n.join("\n")}`;
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 = sn(t, cn(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${ln(e.lastmod)}</lastmod>` : "";
960
- o.set(n, ` <url>\n <loc>${ln(n)}</loc>${a}${s(e.path)}\n </url>`);
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
- }, dn = (e) => {
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: ${on(n)}`);
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
- }, fn = 256, pn = (e = fn) => {
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
- }, mn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, hn = () => `: keep-alive ${Date.now()}\n\n`, gn = 8e3, _n = (e, t = gn) => {
994
- let n = yn(e);
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
- }, vn = 4, yn = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
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 < vn) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${bn(yn(a, t + 1, n))}`);
1003
- else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${bn(yn(e.cause, t + 1, n))}`);
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
- }, bn = (e) => {
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
- }, xn = {
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
- }, Sn = 2e3, Cn = 200, wn = class {
1051
+ }, Cn = 2e3, wn = 200, Tn = class {
1022
1052
  capacity;
1023
1053
  buffer = [];
1024
- constructor(e = Sn) {
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 ?? Cn, this.capacity), i = e.minLevel === void 0 ? xn.trace : xn[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
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 || xn[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);
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
- }, Tn = null, En = () => (Tn === null && (Tn = new wn()), Tn), Dn = (e) => {
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
- }, On = 8e3, kn = (e) => typeof e == "string" ? e.length <= On ? e : `${e.slice(0, On)}… [voltro: truncated]` : typeof e != "object" || !e ? e : _n(e, On), An = (e, t) => {
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(kn)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${On} chars per argument.`);
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
- }, jn = (e) => {
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 = En(), r = !1, i = (i) => (...a) => {
1073
- if (An(t[i], a), !r) {
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 ? Dn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = P();
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 = P(), o = a !== void 0 && t.fields.traceId === void 0 ? {
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
- }, Mn = 2e3, Nn = 8, Pn = 1e3, Fn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, In = (e) => {
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
- }, Ln = S({ scope: "client" }), Rn = (e, t) => {
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 zn(400, { error: "invalid JSON body" });
1176
+ return Bn(400, { error: "invalid JSON body" });
1147
1177
  }
1148
- if (typeof n != "object" || !n) return zn(400, { error: "body must be a JSON object" });
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 zn(400, { error: "entries must be an array" });
1151
- let i = typeof r.app == "string" ? Y(r.app, 120) : void 0, a = typeof r.page == "string" ? Y(r.page, 200) : void 0, o = typeof r.ua == "string" ? Y(r.ua, 200) : void 0, s = r.entries.slice(0, Fn), c = 0;
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 = Y(n.message, Mn), u = Array.isArray(n.args) ? n.args.slice(0, Nn).filter((e) => typeof e == "string").map((e) => Y(e, Pn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, Mn) : void 0;
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 = In(r);
1178
- (p === "error" || p === "warn") && d !== void 0 ? Ln[p](l, f, { stack: d }) : Ln[p](l, {
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 zn(202, {
1213
+ return Bn(202, {
1184
1214
  accepted: c,
1185
1215
  dropped: r.entries.length - c
1186
1216
  });
1187
- }, zn = (e, t) => ({
1217
+ }, Bn = (e, t) => ({
1188
1218
  status: e,
1189
1219
  contentType: "application/json; charset=utf-8",
1190
1220
  body: JSON.stringify(t)
1191
- }), Bn = "/_voltro/inspect/clientLog", Vn = [
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
- ], Hn = {
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
- }, Un = (e) => Vn.includes(e), Wn = (e, t, n = {}) => {
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 && Un(f) && (o.minLevel = f);
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(Gn).join("\n") + (_.length > 0 ? "\n" : "")
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
- }, Gn = (e) => {
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 = qn(e.fields);
1265
- return `${n}:${r}:${i}.${a} ${Hn[e.level]} ${o} ${e.message}${s}`;
1266
- }, Kn = 80, qn = (e) => {
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 = Jn(r);
1302
+ let t = Yn(r);
1273
1303
  n.push(`${e}=${t}`);
1274
1304
  }
1275
1305
  return n.length > 0 ? " " + n.join(" ") : "";
1276
- }, Jn = (e) => {
1306
+ }, Yn = (e) => {
1277
1307
  if (typeof e == "string") {
1278
- let t = e.length > Kn ? e.slice(0, Kn) + "…" : e;
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 > Kn ? t.slice(0, Kn) + "…" : t;
1315
+ return t.length > qn ? t.slice(0, qn) + "…" : t;
1286
1316
  } catch {
1287
1317
  return "[unserialisable]";
1288
1318
  }
1289
- }, Yn = "/_voltro/inspect/logs", Xn = (e, t, n) => {
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
- }, Zn = [{
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
- }], Qn = () => {
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 Zn) if (e.match(i[0])) {
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
- }, $n = {
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
- }, er = Object.keys($n), tr = (e) => t.test(e), nr = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), rr = "virtual:voltro-route-refresh", ir = `\0${rr}`, ar = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, or = () => `
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(er)}
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($n)}
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
- `, sr = (e) => `
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 '${rr}'
1444
- `, cr = (e) => e.replace(/\\/g, "/"), lr = (e, t) => {
1445
- let [i = "", a] = cr(e).split("?");
1446
- if (!i.endsWith(".tsx") || a !== void 0 && ar.test(a)) return !1;
1447
- let o = cr(t).replace(/\/$/, "");
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
- }, ur = (e, t, n) => lr(t, n) ? `${e}${sr(cr(t).split("?")[0] ?? t)}` : null, dr = (e) => ({
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" ? ir : void 0,
1453
- load: (e) => e === ir ? or() : void 0,
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 = ur(t, n, e);
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
- }), fr = [
1492
+ }), pr = [
1463
1493
  "static",
1464
1494
  "spa",
1465
1495
  "ssr",
1466
1496
  "isr"
1467
- ], pr = (e) => typeof e == "string" && fr.includes(e), mr = fr.map((e) => `'${e}'`).join(" | "), hr = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${mr}.${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)." : ""}`, gr = class extends Error {
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(hr(e, t)), this.page = e, this.value = t;
1502
+ super(gr(e, t)), this.page = e, this.value = t;
1473
1503
  }
1474
- }, _r = (e, t = "<page>") => {
1504
+ }, vr = (e, t = "<page>") => {
1475
1505
  if (e.renderMode !== void 0 && e.renderMode !== null) {
1476
- if (!pr(e.renderMode)) throw new gr(t, String(e.renderMode));
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
- }, vr = (e, t = "<page>") => ({
1481
- renderMode: _r(e, t),
1510
+ }, yr = (e, t = "<page>") => ({
1511
+ renderMode: vr(e, t),
1482
1512
  tenantAware: e.tenantAware === !0,
1483
- revalidateMs: ct(e.revalidate),
1484
- staleWhileRevalidateMs: ct(e.staleWhileRevalidate) ?? 0,
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
- }), yr = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, br = (e) => yr.exec(e)?.[1] ?? null, xr = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, Sr = (e) => {
1491
- xr.lastIndex = 0;
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 = xr.exec(e)) !== null;) {
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
- }, Cr = /export\s*\{([^}]*)\}/g, wr = (e) => {
1531
+ }, wr = /export\s*\{([^}]*)\}/g, Tr = (e) => {
1502
1532
  if (/export\s+default\b/.test(e)) return !0;
1503
- Cr.lastIndex = 0;
1533
+ wr.lastIndex = 0;
1504
1534
  let t;
1505
- for (; (t = Cr.exec(e)) !== null;) for (let e of t[1].split(",")) {
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
- }, Tr = async (e, t) => {
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 = br(n);
1519
- return r !== null && !pr(r) ? hr(p("src", "pages", t.file), r) : wr(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.`;
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
- }, X = p(I(), ".voltro", "logs"), Er = () => {
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
- }, Dr = !1, Or = () => {
1526
- if (Dr) return;
1527
- Dr = !0;
1528
- let e = Date.now() - Er(), t = [];
1555
+ }, Or = !1, kr = () => {
1556
+ if (Or) return;
1557
+ Or = !0;
1558
+ let e = Date.now() - Dr(), t = [];
1529
1559
  try {
1530
- t = A(X);
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(X, n);
1566
+ let t = p(Y, n);
1537
1567
  try {
1538
1568
  j(t).mtimeMs < e && M(t);
1539
1569
  } catch {}
1540
1570
  }
1541
- }, kr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), Ar = (e, t) => p(X, `${kr(e)}-${t}.log`), jr = (e) => {
1542
- let t = kr(e), n = [];
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(X);
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(X, e);
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
- }, Mr = (e) => {
1589
+ }, Nr = (e) => {
1560
1590
  try {
1561
- E(X, { recursive: !0 });
1591
+ E(Y, { recursive: !0 });
1562
1592
  } catch {}
1563
- Or();
1564
- let t = Ar(e, process.pid), n = D(t, "w"), r = (e) => {
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
- N(n, r(e));
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
- }, Nr = async (e, t) => {
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
- }, Pr = S({ scope: "voltro:dashboard" }), Fr = L(import.meta.url), Ir = 5179, Lr = (e) => {
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(Fr.resolve("@voltro/dashboard/package.json"));
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
- }, Rr = "VOLTRO_IS_DASHBOARD", zr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
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
- }), Br = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Vr = () => process.env[Rr] === "1", Hr = () => process.stdout.isTTY === !0, Ur = p(I(), ".voltro", "dashboard-launch.lock"), Wr = 1e4, Gr = async () => {
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(Ur), { recursive: !0 });
1646
- let e = await O.open(Ur, "wx");
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(Ur);
1651
- if (Date.now() - e.mtimeMs > Wr) return await O.unlink(Ur).catch(() => void 0), Gr();
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
- }, Kr = async () => {
1685
+ }, qr = async () => {
1656
1686
  try {
1657
- await O.unlink(Ur);
1687
+ await O.unlink(Wr);
1658
1688
  } catch {}
1659
- }, qr = async (e) => {
1689
+ }, Jr = async (e) => {
1660
1690
  let t = e.port ?? 5179;
1661
- if (Br()) return {
1691
+ if (Vr()) return {
1662
1692
  status: "skipped",
1663
1693
  reason: "disabled by flag/env",
1664
1694
  port: t
1665
1695
  };
1666
- if (Vr()) return {
1696
+ if (Hr()) return {
1667
1697
  status: "skipped",
1668
1698
  reason: "this process IS the dashboard",
1669
1699
  port: t
1670
1700
  };
1671
- if (!Hr()) return {
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 Gr()) return {
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 zr(t)) return await Kr(), {
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
- [Rr]: "1",
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
- }), Pr.info(`auto-launching dashboard at http://localhost:${t}`, {
1736
+ }), Fr.info(`auto-launching dashboard at http://localhost:${t}`, {
1707
1737
  port: t,
1708
1738
  mode: i,
1709
1739
  prebuilt: r
1710
- }), r || Pr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Pr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1711
- Kr();
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
- }, Jr = class extends Error {
1746
+ }, Yr = class extends Error {
1717
1747
  _voltroDeferral = !0;
1718
1748
  constructor(e) {
1719
1749
  super(e), this.name = "DeferralNotSupportedError";
1720
1750
  }
1721
- }, Yr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Xr = (e) => {
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
- }, Zr = (e) => {
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 Jr(e instanceof Error ? e.message : String(e));
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
- }, Qr = (e) => {
1775
- let { helpers: t, renderInput: n } = e, r = Zr({
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
- }, $r = (e) => {
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
- }, ei = (e) => [
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 "), ti = (e) => {
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
- }, ni = /Could not find required `intl` object/, ri = "__voltro_i18n_instances__", ii = (e = globalThis) => {
1847
+ }, ri = /Could not find required `intl` object/, ii = "__voltro_i18n_instances__", ai = (e = globalThis) => {
1818
1848
  try {
1819
- let t = e[ri]?.records;
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
- }, ai = (e, t) => [
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"), oi = (e, t) => [
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"), si = (e) => [
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"), ci = (e, t, n, r = ii()) => {
1908
+ ].join("\n"), li = (e, t, n, r = ai()) => {
1879
1909
  if (!t) return;
1880
1910
  let i = String(e?.message ?? e);
1881
- if (ni.test(i)) return r === void 0 ? si(n) : r.reactIntlCopies > 1 || r.instances > 1 ? ai(n, r) : oi(n, r);
1882
- }, li = "<div id=\"root\"></div>", ui = "<div id=\"root\">", di = "</div>", fi = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, pi = /\bsrc=["']([^"']+)["']/i, mi = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, hi = (e) => {
1883
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(fi, (e) => {
1884
- let r = pi.exec(e)?.[1];
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(mi, "<script async$1>"));
1888
- let i = r.indexOf(li);
1889
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${li}\` 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.`);
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)}${ui}`,
1892
- tail: `${di}${r.slice(i + 21)}`,
1921
+ head: `${r.slice(0, i)}${di}`,
1922
+ tail: `${fi}${r.slice(i + 21)}`,
1893
1923
  bootstrapModules: n
1894
1924
  };
1895
- }, gi = (e, t) => (/<title>/i.test(t) ? e.replace(/[^\S\n]*<title>[\s\S]*?<\/title>\n?/i, "") : e).replace("</head>", ` ${t}\n </head>`), _i = (e) => gi(e.head, e.headInjection).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), vi = (e) => {
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(_i({
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
- }, yi = (e) => Array.isArray(e.preload) && e.preload.length > 0, bi = (e, t) => typeof e == "string" ? {
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
- }, xi = async (e) => {
1966
+ }, Si = async (e) => {
1937
1967
  let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
1938
- if (yi(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
1939
- let { tag: t, input: s } = bi(e, n);
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
- }, Z = S({ scope: "voltro:dev:web" }), Si = S({ scope: "vite" }), Ci = await (async () => {
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
- })(), wi = async () => {
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
- }, Ti = (e, t) => e.disableDevtools || !t ? [] : [
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
- ], Ei = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Di = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Oi = (e) => e.sentry ? [
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
- ] : [], ki = (e) => e.env ? ["import './env.public'"] : [], Ai = (e) => {
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
- }, ji = tr, Mi = (e) => {
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
- }, Ni = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Pi = (e) => e.startsWith("(") && e.endsWith(")"), Fi = (e) => e.filter((e) => !Pi(e)), Ii = (e) => {
1994
- let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !Pi(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
- }, Li = (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`, Q = (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}`, $ = async (e) => {
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") && !ji(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
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 = Ni.test(t);
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 || !Pi(o[o.length - 1]),
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: Ii(n),
2029
- ident: Li(n),
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
- }, Ri = (e, t) => {
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
- }, zi = async (e) => {
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
- }, Bi = (e) => {
2079
- let t = Fi(e);
2108
+ }, Vi = (e) => {
2109
+ let t = Ii(e);
2080
2110
  return t.length === 0 ? "" : "/" + t.join("/");
2081
- }, Vi = [
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"), Hi = (e) => {
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
- }, Ui = (e) => e.map((e) => {
2184
- let { regex: t, paramNames: n, priority: r } = Hi(e.pattern);
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), Wi = (e, t) => {
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
- }, Gi = async (e, t) => {
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
- }, Ki = async (e) => {
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
- }, qi = (e, t) => ({
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
- }), Ji = (e, t, n) => {
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
- }, Yi = (e) => {
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
- }, Xi = async (e, t) => {
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(qi(t, i));
2290
+ r.push(Ji(t, i));
2261
2291
  continue;
2262
2292
  }
2263
- let n = await Gi(e, i.package);
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(Ji(t, i, await Ki(n)));
2295
+ r.push(Yi(t, i, await qi(n)));
2266
2296
  }
2267
- return Yi(r), r;
2268
- }, Zi = (e) => {
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
- }, Qi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, $i = (e) => process.env[Qi(e)] ?? process.env.VOLTRO_API_ORIGIN, ea = (e, t) => {
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 = $i(e.name) ?? e.serverOrigin;
2307
+ let n = ea(e.name) ?? e.serverOrigin;
2278
2308
  if (n) {
2279
- let e = Zi(n);
2309
+ let e = Qi(n);
2280
2310
  if (e) return e;
2281
2311
  }
2282
2312
  if (t?.allowDevProxy && e.proxyTarget) {
2283
- let t = Zi(e.proxyTarget);
2313
+ let t = Qi(e.proxyTarget);
2284
2314
  if (t) return t;
2285
2315
  }
2286
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Zi(e.browserWsUrl);
2287
- }, ta = (e, t, n) => {
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 ${Qi(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.`);
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 ${Qi(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 });
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
- }, na = async (e, t, n, r = {}) => {
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 wi() !== null, s = t.theme === "system" ? [
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 $(l);
2372
- await Tr(l, u);
2373
- for (let e of f) Z.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.`);
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 ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && r.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && r.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && r.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && r.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
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 = Ri(d, e.dirChain).map((e) => {
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 = Bi(e.chain), n = Ri(d, e.chain).map((e) => {
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}: ${Q(e.dir, "Layout")}Mod.default,`), l.push(` ${a}: ${Q(e.dir, "Layout")}Mod.loader,`), s.push({
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}: ${Q(e.dir, "Layout")},`), s.push({
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}: ${Q(e.dir, "Error")},`), s.push({
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}: ${Q(e.dir, "Pending")},`), s.push({
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}: ${Q(e.dir, "NotFound")},`), s.push({
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 && Z.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(", ")}]`);
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
- ...ki(t),
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
- ...Ei(t, o),
2703
+ ...Di(t, o),
2674
2704
  "})",
2675
2705
  "",
2676
- Vi
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
- ...ki(t),
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
- ...Ei(t, o),
2726
+ ...Di(t, o),
2697
2727
  "})",
2698
2728
  "",
2699
- Vi
2729
+ Hi
2700
2730
  ].join("\n");
2701
2731
  let x = p(e, ".framework");
2702
- await O.mkdir(x, { recursive: !0 }), t.env ? await nt(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 }));
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
- Z.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) });
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
- Z.warn("sibling app(s) claim the same port — only one boots", {
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 t = ia(e), n = T(t) ? t : p(e, "app.config.ts");
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(_(n).href)).default;
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
- Qn();
2744
- let n = pn();
2745
- jn(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" }), It(e, Z);
2746
- let r = await Xi(e, t);
2747
- for (let e of r) Z.info("api wired", {
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
- Me(e).then((e) => {
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
- Z.info(`${e} seeded`, { path: t.path });
2785
+ X.info(`${e} seeded`, { path: t.path });
2756
2786
  }
2757
2787
  }).catch(() => {});
2758
- let { resolved: d } = await rt({
2788
+ let { resolved: d } = await it({
2759
2789
  rawEnv: t.env,
2760
2790
  appType: "web",
2761
2791
  root: e,
2762
- log: Z,
2792
+ log: X,
2763
2793
  generateTypes: !0
2764
2794
  }), f = d.publicValues;
2765
- await na(e, t, r, f), Z.debug("generated framework entry files", { files: [
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 = Ke("web", _, g), y = Mr(_);
2771
- await We({
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 $(p(e, "src", "pages")), S = {
2810
+ let { pages: b, dirs: x } = await Q(p(e, "src", "pages")), S = {
2781
2811
  dirs: x,
2782
- ssrRoutes: Ui(b)
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 an({
2819
+ })), E = await on({
2790
2820
  appRoot: e,
2791
2821
  pages: b
2792
2822
  });
2793
- E.wrote && Z.debug("routes codegen wrote", { path: m(e, E.path) });
2794
- let D = await Xe("vite", () => import("vite")), k = (await import("@vitejs/plugin-react")).default, A = (await import("@tailwindcss/vite")).default, j = p(e, ".framework"), M = p(e, "src"), ee = /* @__PURE__ */ new Set([
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
- ]), te = {
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() && !ee.has(e.name));
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 Gi(e, n);
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
- }, N = p(e, "src", "pages"), P = (e) => e.endsWith(".tsx") && (e === N || e.startsWith(N + "/")), ne = (e) => e === N || e.startsWith(N + "/"), F = async (n) => {
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 na(e, t, r, f);
2831
- let { pages: a, dirs: o } = await $(N);
2832
- await an({
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 = Ui(a), Z.info("page tree regenerated", {
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
- Z.error("page tree regen failed", { reason: n }, e);
2871
+ X.error("page tree regen failed", { reason: n }, e);
2842
2872
  }
2843
- }, I = {
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, F(e);
2880
+ r.length = 0, te(e);
2851
2881
  }, 50);
2852
2882
  };
2853
2883
  t.watcher.on("add", (t) => {
2854
- P(t) && i(`add ${m(e, t)}`);
2884
+ F(t) && i(`add ${m(e, t)}`);
2855
2885
  }), t.watcher.on("unlink", (t) => {
2856
- P(t) && i(`unlink ${m(e, t)}`);
2886
+ F(t) && i(`unlink ${m(e, t)}`);
2857
2887
  }), t.watcher.on("addDir", (t) => {
2858
- ne(t) && i(`addDir ${m(e, t)}`);
2888
+ I(t) && i(`addDir ${m(e, t)}`);
2859
2889
  }), t.watcher.on("unlinkDir", (t) => {
2860
- ne(t) && i(`unlinkDir ${m(e, t)}`);
2890
+ I(t) && i(`unlinkDir ${m(e, t)}`);
2861
2891
  });
2862
2892
  }
2863
- }, L = p(e, "app.config.ts"), re = (e) => {
2864
- if (!V(e.env)) return "";
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
- }, R = (e, t) => {
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"), re(e) !== re(t) && n.push("env"), n;
2870
- }, z = t, B = h(L), ie = {
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(L), Z.info("watching app.config.ts for changes", { path: m(e, L) });
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(L);
2907
+ let e = t.moduleGraph.getModuleById(R);
2878
2908
  e && t.moduleGraph.invalidateModule(e);
2879
2909
  } catch {}
2880
- let e = (await t.ssrLoadModule(L, { fixStacktrace: !0 })).default;
2881
- return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Z.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
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 Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
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
- Z.info("app.config.ts onConfigChange: load returned null — skipping");
2922
+ X.info("app.config.ts onConfigChange: load returned null — skipping");
2893
2923
  return;
2894
2924
  }
2895
- if (Z.info("app.config.ts onConfigChange: loaded", {
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
- Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2930
+ X.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2901
2931
  return;
2902
2932
  }
2903
- let i = R(z, r);
2933
+ let i = re(z, r);
2904
2934
  if (i.length > 0) {
2905
- Z.warn("app.config.ts changed — hard restart required", { fields: i });
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
- Z.error("restart spawn failed", {}, e), process.exit(1);
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 na(e, r, await Xi(e, r)), z = r, t.ws && t.ws.send({
2955
+ await $(e, r, await Zi(e, r)), z = r, t.ws && t.ws.send({
2926
2956
  type: "full-reload",
2927
2957
  path: "*"
2928
- }), Z.info("app.config.ts soft-regen", {
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
- Z.error("app.config.ts soft-regen failed", {}, e);
2963
+ X.error("app.config.ts soft-regen failed", {}, e);
2934
2964
  }
2935
- }, o = (e) => u(e) === "app.config.ts" ? e === L || h(e) === B : !1;
2965
+ }, o = (e) => u(e) === "app.config.ts" ? e === R || h(e) === ie : !1;
2936
2966
  t.watcher.on("change", (e) => {
2937
- o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
2967
+ o(e) && (X.info("app.config.ts change event (chokidar)", { file: e }), i());
2938
2968
  }), t.watcher.on("add", (e) => {
2939
- o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
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(L, { interval: 500 }, (e, t) => {
2944
- e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2945
- }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
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
- Z.warn("app.config.ts polling watcher could not attach", {}, e);
2977
+ X.warn("app.config.ts polling watcher could not attach", {}, e);
2948
2978
  }
2949
- _t(mt, Z, {
2979
+ vt(ht, X, {
2950
2980
  root: e,
2951
2981
  onBeforeRestart: () => t.close()
2952
2982
  });
2953
2983
  }
2954
- }, ae = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, oe = 0, se = {
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, ae.test(e.file)) return [];
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 Gi(e, i.pkg);
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, Z.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
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, Z.error("rpcGroup re-optimize failed", {}, e);
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
- Xn(t, n, {
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
- Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
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
- }, Z.info(`proxy ${e} → ${n.target}`, {
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: _r(i, p("src", "pages", n.file)),
3091
+ renderMode: vr(i, p("src", "pages", n.file)),
3062
3092
  interactive: i.interactive ?? "full",
3063
3093
  tenantAware: i.tenantAware === !0,
3064
- revalidateMs: ct(i.revalidate),
3065
- staleWhileRevalidateMs: ct(i.staleWhileRevalidate) ?? 0,
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
- Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
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 } = ti(t.url ?? "/");
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(dn({ indexable: !1 }));
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 = Wn(o, En(), u);
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 = Rn(i, n);
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(mn(e));
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(mn(e));
3267
+ r.write(hn(e));
3238
3268
  } catch {}
3239
3269
  }), f = setInterval(() => {
3240
3270
  try {
3241
- r.write(hn());
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: Ci,
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: () => at(t.name ?? "app", { contract: V(t.env) ? t.env : void 0 })
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 Ue();
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 = ci(i, a, t) ?? "";
3298
- if (Z.error(`${t} render failed`, {
3327
+ let o = li(i, a, t) ?? "";
3328
+ if (X.error(`${t} render failed`, {
3299
3329
  pathname: n,
3300
3330
  pattern: r,
3301
- cause: _n(i) + o
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${_n(i)}\n${o}\n${s}`);
3313
- }, U = Kt(), ge = Jt({
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) => Z.debug("ssr cold-compile start", { id: e }),
3316
- onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
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
- Z.debug(`ssr cold-compile concurrency ${U}`, { concurrency: U });
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")]), o = {};
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 && (o[a] = t(a, n, r));
3363
+ n !== void 0 && (s[a] = t(a, n, r));
3334
3364
  } catch (e) {
3335
- Z.warn("locale catalog failed to load for SSR", { locale: a }, e);
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: o,
3380
+ wraps: s,
3339
3381
  supported: n,
3340
3382
  defaultLocale: r
3341
3383
  });
3342
3384
  })(), a);
3343
3385
  };
3344
- n.middlewares.use(async (a, s, c) => {
3345
- if (a.method !== "GET" && a.method !== "HEAD") return c();
3346
- let l = a.url ?? "/";
3347
- l.indexOf("?");
3348
- let { pathname: u, search: d } = ti(l);
3349
- if (u.startsWith("/@") || u.startsWith("/node_modules/") || u.startsWith("/.framework/") || u.startsWith("/_voltro/") || u === "/main.tsx" || u === "/index.html" || u === "/sw.js" || u === "/favicon.ico" || u === "/robots.txt" || /\.[a-z0-9]+$/i.test(u)) return c();
3350
- let f = Wi(u, S.ssrRoutes);
3351
- if (!f) return c();
3352
- let m = !me.has(f.route.pattern), h = Date.now();
3353
- m && Z.info(`ssr compiling ${f.route.pattern}`, {
3354
- pattern: f.route.pattern,
3355
- pathname: u
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 g = {}, _ = async (e, t) => {
3399
+ let _ = {}, v = async (e, t) => {
3358
3400
  let n = Date.now(), r = await t();
3359
- return g[e] = (g[e] ?? 0) + (Date.now() - n), r;
3360
- }, v = async (e, t, r) => {
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 v(e.id, t, r);
3410
+ for (let e of i.importedModules ?? []) e.id && await y(e.id, t, r);
3369
3411
  }
3370
- }, y = !1;
3412
+ }, b = !1;
3371
3413
  try {
3372
- let b = await _("loadPage", async () => await i(p(e, "src", "pages", f.route.file))), x = _r(b, p("src", "pages", f.route.file)), C = Ri(S.dirs, f.route.dirChain), w = x === "spa" && C.some((e) => e.hasLayout);
3373
- if (x !== "ssr" && x !== "isr" && !w) return c();
3374
- let T = {};
3375
- for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? T[e] = t : Array.isArray(t) && (T[e] = t.join(", "));
3376
- let E = ta(ea(r[0], { allowDevProxy: !0 }), T.cookie, { apiName: r[0]?.name }), D = new AbortController(), O = () => D.abort();
3377
- s.once("close", O);
3378
- let k = null, A = [], j = {};
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: A, segmentLoaderData: j} = await _("loadChain", () => zi({
3381
- entries: C,
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: f.params,
3387
- pathname: u,
3388
- search: d,
3389
- signal: D.signal,
3390
- headers: T,
3391
- query: E
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 = b.loader;
3395
- typeof t == "function" && !w && (k = await _("loader", () => t({
3396
- params: f.params,
3397
- pathname: u,
3398
- search: d,
3399
- signal: D.signal,
3400
- headers: T,
3401
- query: E
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
- s.off("close", O);
3446
+ c.off("close", k);
3405
3447
  }
3406
- let M = await _("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
3407
- w || await xi({
3408
- pageMod: b,
3409
- params: f.params,
3410
- query: E,
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: M.seedPreloadedSubscription,
3413
- onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
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: u
3458
+ pathname: d
3417
3459
  }, n)
3418
3460
  });
3419
3461
  let ee = {
3420
- pattern: f.route.pattern,
3421
- Component: b.default,
3422
- meta: b.meta,
3423
- loader: b.loader,
3424
- ErrorBoundary: b.ErrorBoundary,
3425
- Pending: b.Pending,
3426
- renderMode: x,
3427
- chain: A
3428
- }, te = {
3429
- cookies: M.parseCookieHeader(T.cookie),
3430
- headers: T,
3431
- url: l
3432
- }, N = b.interactive ?? "full", P = (await o())(T.cookie, T["accept-language"]);
3433
- y = P !== void 0;
3434
- let ne = P ? {
3435
- outerWrap: P.outerWrap,
3436
- locale: P.locale
3437
- } : {}, F = w ? Qr({
3438
- helpers: M,
3439
- page: `src/pages/${f.route.file}`,
3440
- interactive: N,
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: f.params,
3445
- pathname: u,
3446
- search: d,
3447
- segmentLoaderData: j,
3448
- requestContext: te,
3449
- ...ne
3486
+ params: m.params,
3487
+ pathname: d,
3488
+ search: f,
3489
+ segmentLoaderData: M,
3490
+ requestContext: P,
3491
+ ...te
3450
3492
  }
3451
- }) : null, I = w ? null : Zr({
3452
- helpers: M,
3453
- page: `src/pages/${f.route.file}`,
3454
- pathname: u,
3455
- renderMode: x,
3456
- interactive: N,
3457
- loaderData: k,
3458
- segmentLoaderData: j,
3459
- pageLoaderRan: typeof b.loader == "function"
3460
- }), L = [];
3461
- await _("collectCss", async () => {
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", f.route.file),
3464
- ...C.flatMap((t) => [
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 v(e, t, L);
3513
+ for (let e of n) await y(e, t, ne);
3472
3514
  });
3473
- let re = await _("readShell", _e), R = await _("transformShell", () => n.transformIndexHtml(l, re)), z = L.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), B = P?.locale ?? te.cookies["voltro:locale"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", ie = Date.now();
3474
- if (F) {
3475
- let e = (e) => ei({
3476
- helpers: M,
3477
- prepared: F,
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: N,
3480
- extra: [z]
3521
+ interactive: F,
3522
+ extra: [ie]
3481
3523
  });
3482
- if (F.hasDeferred) vi({
3483
- res: s,
3484
- shell: hi({
3485
- shell: R,
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) => M.renderPageToStream({
3495
- ...F.renderInput,
3536
+ render: (e) => N.renderPageToStream({
3537
+ ...L.renderInput,
3496
3538
  ...e
3497
3539
  }),
3498
3540
  onShellError: (e) => {
3499
- he(s, "spa-shell-dev", u, f.route.pattern, e, y);
3541
+ he(c, "spa-shell-dev", d, m.route.pattern, e, b);
3500
3542
  }
3501
3543
  });
3502
3544
  else {
3503
- let t = $r({
3504
- helpers: M,
3505
- prepared: F
3506
- }), n = R.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}"`);
3507
- s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "spa-shell-dev"), s.end(n);
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 (I) {
3551
+ } else if (R) {
3510
3552
  let e = (e) => [
3511
- z,
3512
- M.renderMetaToHtml(e),
3513
- `<meta name="voltro-interactive" content="${N}" />`,
3514
- ...I.hasDeferred ? [M.renderDeferredRegistryScript()] : [],
3515
- M.renderRouterStateScript(I.stateInput)
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: f.params,
3519
- pathname: u,
3520
- search: d,
3521
- loaderData: I.loaderData,
3522
- segmentLoaderData: I.segmentLoaderData,
3523
- requestContext: te,
3524
- ...ne
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 (x === "ssr" && N === "full") vi({
3527
- res: s,
3528
- shell: hi({
3529
- shell: R,
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) => M.renderPageToStream({
3580
+ render: (e) => N.renderPageToStream({
3539
3581
  ...t,
3540
3582
  ...e
3541
3583
  }),
3542
3584
  onShellError: (e) => {
3543
- he(s, "ssr-dev", u, f.route.pattern, e, y);
3585
+ he(c, "ssr-dev", d, m.route.pattern, e, b);
3544
3586
  }
3545
3587
  });
3546
3588
  else {
3547
- let { html: n, meta: r } = M.renderPageToHtml(t), i = R.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${B}"`);
3548
- s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
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
- g.render = Date.now() - ie;
3552
- let V = Date.now() - h;
3553
- m ? (me.add(f.route.pattern), Z.info(`ssr compiled ${f.route.pattern} in ${V}ms`, {
3554
- pattern: f.route.pattern,
3555
- pathname: u,
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: g
3559
- })) : V > 200 && Z.info(`ssr rendered ${u} in ${V}ms`, {
3560
- pattern: f.route.pattern,
3561
- pathname: u,
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: g
3606
+ phases: _
3565
3607
  });
3566
3608
  } catch (e) {
3567
- if (Yr(e)) {
3568
- Z.error("ssr-dev render refused", {
3569
- pathname: u,
3570
- pattern: f.route.pattern
3571
- }, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
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 = Xr(e);
3616
+ let t = Zr(e);
3575
3617
  if (t) {
3576
- s.statusCode = t.status;
3577
- for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
3578
- s.end(t.body);
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(s, "ssr-dev", u, f.route.pattern, e, y);
3623
+ he(c, "ssr-dev", d, m.route.pattern, e, b);
3582
3624
  }
3583
3625
  });
3584
3626
  }
3585
- }, G = Date.now(), K = D.version ?? "?", q = await wi(), ye = p(e, "node_modules", "@voltro", "ui-shadcn"), J = T(p(ye, "package.json")) ? ye : null, be = [], xe = await (async () => {
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 Gi(e, n.pkg);
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
- xe && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client");
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 wt(g, "voltro dev (web)");
3649
+ await Tt(g, "voltro dev (web)");
3608
3650
  } catch (e) {
3609
- Z.error(String(e.message ?? e)), process.exit(1);
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
- ...q ? [{
3665
+ ...K ? [{
3624
3666
  find: "@voltro/devtools/styles.css",
3625
- replacement: p(q, "src/styles.css")
3667
+ replacement: p(K, "src/styles.css")
3626
3668
  }, {
3627
3669
  find: "@voltro/devtools",
3628
- replacement: p(q, "src/index.ts")
3670
+ replacement: p(K, "src/index.ts")
3629
3671
  }] : [],
3630
- ...J ? [
3672
+ ...q ? [
3631
3673
  {
3632
3674
  find: "@voltro/ui-shadcn/tokens.css",
3633
- replacement: p(J, "src/tokens.css")
3675
+ replacement: p(q, "src/tokens.css")
3634
3676
  },
3635
3677
  {
3636
3678
  find: "@voltro/ui-shadcn/cn",
3637
- replacement: p(J, "src/cn.ts")
3679
+ replacement: p(q, "src/cn.ts")
3638
3680
  },
3639
3681
  {
3640
3682
  find: "@voltro/ui-shadcn/brand",
3641
- replacement: p(J, "src/brand/voltroLogo.tsx")
3683
+ replacement: p(q, "src/brand/voltroLogo.tsx")
3642
3684
  },
3643
3685
  {
3644
3686
  find: "@voltro/ui-shadcn",
3645
- replacement: p(J, "src/index.ts")
3687
+ replacement: p(q, "src/index.ts")
3646
3688
  }
3647
3689
  ] : [],
3648
- ...Je(e)
3690
+ ...Ye(e)
3649
3691
  ]
3650
3692
  },
3651
3693
  optimizeDeps: {
3652
- include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...be],
3653
- force: xe
3694
+ include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...xe],
3695
+ force: Se
3654
3696
  },
3655
- customLogger: Gt(),
3697
+ customLogger: Kt(),
3656
3698
  plugins: [
3657
- dr(p(e, "src", "pages")),
3699
+ fr(p(e, "src", "pages")),
3658
3700
  k(),
3659
3701
  A(),
3660
- te,
3661
- I,
3662
- ie,
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, ...Ai(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(), Si.info(`v${K} ready in ${Date.now() - G}ms`, {
3681
- version: K,
3682
- bootMs: Date.now() - G
3683
- }), Z.info(`listening on http://localhost:${g}`, {
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 && (Z.info(`proxy /ws/${e.name} → ${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
- }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3732
+ }), X.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3691
3733
  try {
3692
- await We({
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 = Lr(e);
3743
+ let t = Rr(e);
3702
3744
  if (t) {
3703
- let e = await qr({ dashboardAppPath: t });
3704
- e.status === "launched" ? Z.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && Z.debug(`dashboard already running on :${e.port}`, { port: e.port });
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
- We({
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
- Ge(v), y.dispose();
3760
+ Ke(v), y.dispose();
3719
3761
  };
3720
3762
  process.on("SIGINT", n), process.on("SIGTERM", n);
3721
3763
  } catch (e) {
3722
- Z.warn("runtime-registry write failed", {}, e);
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() - G
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 = Z.child("serve");
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 Xi(e, t);
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 na(e, t, i);
3786
+ await $(e, t, i);
3745
3787
  {
3746
- let { pages: t } = await $(p(e, "src", "pages"));
3747
- await an({
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 Xe("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
3753
- Z.info("running production build"), await o.build({
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: Gt(),
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: Mi } }
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
- ne(e), r.push({
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 { Kt as $, Nr as A, Yn as B, ti as C, Ue as Ct, Lr as D, Ne as Dt, qr as E, Me as Et, pr as F, En as G, Bn as H, hr as I, hn as J, mn as K, _r as L, Sr as M, fr as N, jr as O, vr as P, Jt as Q, tr as R, ei as S, Ke as St, Ir as T, We as Tt, Rn as U, Wn as V, jn as W, un as X, dn as Y, an as Z, vi as _, rt as _t, zi as a, wt as at, Qr as b, Xe as bt, Xi as c, ht as ct, Mi as d, ut as dt, Mt as et, $ as f, dt as ft, hi as g, ot as gt, gi as h, at as ht, ta as i, It as it, br as j, Mr as k, oa as l, mt as lt, xi as m, ct as mt, Ni as n, Nt as nt, Ri as o, yt as ot, na as p, st as pt, pn as q, ea as r, Ft as rt, aa as s, _t as st, fa as t, Pt as tt, sa as u, lt as ut, Yr as v, tt as vt, Rr as w, Ge as wt, $r as x, Je as xt, Zr as y, et as yt, nr as z };
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 };