@voltro/cli 0.12.0 → 0.14.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 (189) hide show
  1. package/CHANGELOG.md +378 -0
  2. package/dist/{apiBuild-GefjNI5d.js → apiBuild-370ITNRk.js} +3 -3
  3. package/dist/apiBuild-DatWP5hh.js +2 -0
  4. package/dist/bin.js +3 -3
  5. package/dist/{commands-BmNi1RgZ.js → commands-D-teL_TM.js} +3756 -2539
  6. package/dist/dbCommand-B3CeMU3u.js +2 -0
  7. package/dist/{dbCommand-DNrkb58g.js → dbCommand-Dmi-vHfA.js} +72 -57
  8. package/dist/{dev-d0LjACxE.js → dev-CKyW_LAv.js} +1511 -1331
  9. package/dist/dev-CPKbckaN.js +3 -0
  10. package/dist/fileConventions-COg0ZytD.js +9 -0
  11. package/dist/frameworkTableAssembly-DCLhpHsF.js +601 -0
  12. package/dist/frameworkTableAssembly-DYzb2elg.js +2 -0
  13. package/dist/index.js +1 -1
  14. package/dist/{inspectMetrics-uEfIS1vp.js → inspectMetrics-CyVMeofr.js} +962 -943
  15. package/dist/seedRunner-D6eu-u5U.js +229 -0
  16. package/dist/serveCommand-CU3Sw4ZM.js +1127 -0
  17. package/dist/serveEntry.js +3 -3
  18. package/dist/{start-DKcQd52a.js → start-D8ATvTzo.js} +246 -246
  19. package/dist/startEntry.js +2 -2
  20. package/package.json +17 -17
  21. package/templates/AGENTS.core.md +77 -3
  22. package/templates/AGENTS.md +78 -4
  23. package/templates/agent-docs/_index.md +1 -1
  24. package/templates/agent-docs/_manifest.json +2 -2
  25. package/templates/agent-docs/authentication.md +39 -0
  26. package/templates/agent-docs/cli.md +114 -6
  27. package/templates/agent-docs/configuration.md +48 -0
  28. package/templates/agent-docs/data.md +193 -1
  29. package/templates/agent-docs/database/hosting.md +2 -2
  30. package/templates/agent-docs/database/migrations.md +88 -3
  31. package/templates/agent-docs/database/overview.md +11 -0
  32. package/templates/agent-docs/database/seedsdialects.md +53 -1
  33. package/templates/agent-docs/database/transactions.md +31 -0
  34. package/templates/agent-docs/internationalization.md +3 -3
  35. package/templates/agent-docs/introduction.md +133 -2
  36. package/templates/agent-docs/plugins.md +2 -1
  37. package/templates/agent-docs/reference.md +4 -4
  38. package/templates/agent-docs/routing.md +48 -43
  39. package/templates/agent-docs/schema-driven-ui.md +12 -2
  40. package/templates/agent-docs/templates/apibackends.md +1 -8
  41. package/templates/agent-docs/templates/appshells.md +24 -24
  42. package/templates/agent-docs/testing.md +40 -1
  43. package/templates/agent-docs/whats-new.md +51 -131
  44. package/templates/apps/api-ai/database/schema.ts +0 -2
  45. package/templates/apps/api-ai/package.json +7 -7
  46. package/templates/apps/api-auth/package.json +8 -8
  47. package/templates/apps/api-backend/database/schema.ts +0 -3
  48. package/templates/apps/api-backend/package.json +7 -7
  49. package/templates/apps/api-backend-deactivation/database/schema.ts +0 -1
  50. package/templates/apps/api-backend-deactivation/package.json +7 -7
  51. package/templates/apps/api-backend-deactivation/tests/users.deactivate.test.ts +1 -1
  52. package/templates/apps/api-backend-mail/database/schema.ts +0 -3
  53. package/templates/apps/api-backend-mail/package.json +8 -8
  54. package/templates/apps/api-backend-mariadb/database/schema.ts +0 -3
  55. package/templates/apps/api-backend-mariadb/package.json +9 -9
  56. package/templates/apps/api-backend-storage/database/schema.ts +0 -3
  57. package/templates/apps/api-backend-storage/package.json +8 -8
  58. package/templates/apps/api-data-advanced/database/authors.entity.ts +0 -2
  59. package/templates/apps/api-data-advanced/database/books.entity.ts +0 -1
  60. package/templates/apps/api-data-advanced/package.json +8 -8
  61. package/templates/apps/api-data-advanced/tests/queries.test.ts +6 -1
  62. package/templates/apps/api-durable/database/schema.ts +0 -3
  63. package/templates/apps/api-durable/package.json +8 -8
  64. package/templates/apps/api-feature-flags/database/schema.ts +0 -1
  65. package/templates/apps/api-feature-flags/package.json +9 -9
  66. package/templates/apps/api-governance/app.config.ts +0 -1
  67. package/templates/apps/api-governance/database/schema.ts +0 -1
  68. package/templates/apps/api-governance/package.json +8 -8
  69. package/templates/apps/api-kv/database/schema.ts +0 -3
  70. package/templates/apps/api-kv/package.json +8 -8
  71. package/templates/apps/api-kv/tests/sync.test.ts +2 -2
  72. package/templates/apps/api-moderation/database/schema.ts +0 -2
  73. package/templates/apps/api-moderation/package.json +8 -8
  74. package/templates/apps/api-observability/database/schema.ts +0 -1
  75. package/templates/apps/api-observability/package.json +8 -8
  76. package/templates/apps/api-ratelimit/database/schema.ts +0 -1
  77. package/templates/apps/api-ratelimit/package.json +8 -8
  78. package/templates/apps/api-rbac/README.md +53 -14
  79. package/templates/apps/api-rbac/app.config.ts +24 -26
  80. package/templates/apps/api-rbac/authz.ts +76 -0
  81. package/templates/apps/api-rbac/database/schema.ts +22 -7
  82. package/templates/apps/api-rbac/mutations/notes.create.mutation.server.ts +7 -5
  83. package/templates/apps/api-rbac/mutations/notes.create.mutation.ts +15 -8
  84. package/templates/apps/api-rbac/mutations/notes.delete.mutation.server.ts +54 -0
  85. package/templates/apps/api-rbac/mutations/notes.delete.mutation.ts +43 -0
  86. package/templates/apps/api-rbac/mutations/teams.rename.mutation.server.ts +19 -0
  87. package/templates/apps/api-rbac/mutations/teams.rename.mutation.ts +37 -0
  88. package/templates/apps/api-rbac/package.json +8 -8
  89. package/templates/apps/api-rbac/queries/notes.list.query.server.ts +12 -0
  90. package/templates/apps/api-rbac/queries/notes.list.query.ts +26 -0
  91. package/templates/apps/api-rbac/template.json +2 -2
  92. package/templates/apps/api-rbac/tests/authz.test.ts +233 -0
  93. package/templates/apps/api-rest/database/schema.ts +0 -3
  94. package/templates/apps/api-rest/package.json +7 -7
  95. package/templates/apps/api-saas/database/schema.ts +0 -1
  96. package/templates/apps/api-saas/package.json +11 -11
  97. package/templates/apps/api-search/database/schema.ts +0 -1
  98. package/templates/apps/api-search/package.json +8 -8
  99. package/templates/apps/api-versioning/database/schema.ts +0 -1
  100. package/templates/apps/api-versioning/package.json +8 -8
  101. package/templates/apps/api-webhooks/database/schema.ts +0 -1
  102. package/templates/apps/api-webhooks/package.json +9 -8
  103. package/templates/apps/changelog/package.json +6 -6
  104. package/templates/apps/changelog/src/pages/[locale]/{[slug].tsx → [slug].page.tsx} +2 -2
  105. package/templates/apps/changelog/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  106. package/templates/apps/changelog/src/pages/[locale]/mirrors.test.tsx +2 -2
  107. package/templates/apps/changelog/src/pages/{[slug].test.tsx → [slug].page.test.tsx} +1 -1
  108. package/templates/apps/changelog/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  109. package/templates/apps/edge-functions/package.json +2 -2
  110. package/templates/apps/frontend-admin/package.json +8 -8
  111. package/templates/apps/frontend-admin/src/pages/(marketing)/{index.test.tsx → index.page.test.tsx} +1 -1
  112. package/templates/apps/frontend-admin/src/pages/(marketing)/{login.test.tsx → login.page.test.tsx} +1 -1
  113. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +1 -1
  114. package/templates/apps/frontend-admin/src/pages/admin/{index.test.tsx → index.page.test.tsx} +1 -1
  115. package/templates/apps/frontend-app/package.json +8 -8
  116. package/templates/apps/frontend-app/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  117. package/templates/apps/frontend-app/src/pages/{schema-ui.test.tsx → schema-ui.page.test.tsx} +1 -1
  118. package/templates/apps/frontend-blank/package.json +7 -7
  119. package/templates/apps/frontend-blank/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  120. package/templates/apps/frontend-contact/package.json +7 -7
  121. package/templates/apps/frontend-contact/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  122. package/templates/apps/frontend-contact/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  123. package/templates/apps/frontend-dashboard/package.json +7 -7
  124. package/templates/apps/frontend-dashboard/src/pages/(marketing)/{index.test.tsx → index.page.test.tsx} +1 -1
  125. package/templates/apps/frontend-dashboard/src/pages/(marketing)/{login.test.tsx → login.page.test.tsx} +1 -1
  126. package/templates/apps/frontend-dashboard/src/pages/dashboard/{index.test.tsx → index.page.test.tsx} +1 -1
  127. package/templates/apps/frontend-dashboard/src/pages/dashboard/{settings.test.tsx → settings.page.test.tsx} +1 -1
  128. package/templates/apps/frontend-docs/package.json +7 -7
  129. package/templates/apps/frontend-docs/src/pages/[locale]/docs/{[...slug].tsx → [...slug].page.tsx} +3 -3
  130. package/templates/apps/frontend-docs/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  131. package/templates/apps/frontend-docs/src/pages/[locale]/mirrors.test.tsx +2 -2
  132. package/templates/apps/frontend-docs/src/pages/docs/{[...slug].test.tsx → [...slug].page.test.tsx} +1 -1
  133. package/templates/apps/frontend-docs/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  134. package/templates/apps/frontend-i18n/package.json +6 -6
  135. package/templates/apps/frontend-i18n/src/pages/[locale]/{about.tsx → about.page.tsx} +2 -2
  136. package/templates/apps/frontend-i18n/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  137. package/templates/apps/frontend-i18n/src/pages/[locale]/mirrors.test.tsx +2 -2
  138. package/templates/apps/frontend-i18n/src/pages/{about.test.tsx → about.page.test.tsx} +1 -1
  139. package/templates/apps/frontend-i18n/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  140. package/templates/apps/frontend-landing/package.json +7 -7
  141. package/templates/apps/frontend-landing/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  142. package/templates/apps/frontend-landing/src/pages/[locale]/mirrors.test.tsx +1 -1
  143. package/templates/apps/frontend-landing/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  144. package/templates/apps/frontend-spa/package.json +7 -7
  145. package/templates/apps/frontend-spa/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  146. package/templates/apps/frontend-ssr/package.json +7 -7
  147. package/templates/apps/frontend-ssr/src/pages/{feed-swr.test.tsx → feed-swr.page.test.tsx} +1 -1
  148. package/templates/apps/frontend-ssr/src/pages/{feed.test.tsx → feed.page.test.tsx} +1 -1
  149. package/templates/apps/frontend-ssr/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  150. package/templates/apps/frontend-ssr-api/package.json +8 -8
  151. package/templates/apps/frontend-ssr-api/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  152. package/templates/apps/frontend-static-blog/package.json +6 -6
  153. package/templates/apps/frontend-static-blog/src/pages/[locale]/blog/{[slug].tsx → [slug].page.tsx} +2 -2
  154. package/templates/apps/frontend-static-blog/src/pages/[locale]/{index.tsx → index.page.tsx} +2 -2
  155. package/templates/apps/frontend-static-blog/src/pages/[locale]/mirrors.test.tsx +2 -2
  156. package/templates/apps/frontend-static-blog/src/pages/blog/{[slug].test.tsx → [slug].page.test.tsx} +1 -1
  157. package/templates/apps/frontend-static-blog/src/pages/{index.test.tsx → index.page.test.tsx} +1 -1
  158. package/dist/apiBuild-s7swuEU5.js +0 -2
  159. package/dist/dbCommand-Bt6BCG7g.js +0 -2
  160. package/dist/dev-YHbHmeXt.js +0 -3
  161. package/dist/seedRunner-DZmhoqNt.js +0 -821
  162. package/dist/serveCommand-B2-YV9TU.js +0 -1112
  163. package/templates/apps/api-rbac/tests/notes.create.test.ts +0 -80
  164. /package/templates/apps/changelog/src/pages/{[slug].tsx → [slug].page.tsx} +0 -0
  165. /package/templates/apps/changelog/src/pages/{index.tsx → index.page.tsx} +0 -0
  166. /package/templates/apps/frontend-admin/src/pages/(marketing)/{index.tsx → index.page.tsx} +0 -0
  167. /package/templates/apps/frontend-admin/src/pages/(marketing)/{login.tsx → login.page.tsx} +0 -0
  168. /package/templates/apps/frontend-admin/src/pages/admin/{[entity].tsx → [entity].page.tsx} +0 -0
  169. /package/templates/apps/frontend-admin/src/pages/admin/{index.tsx → index.page.tsx} +0 -0
  170. /package/templates/apps/frontend-app/src/pages/{index.tsx → index.page.tsx} +0 -0
  171. /package/templates/apps/frontend-app/src/pages/{schema-ui.tsx → schema-ui.page.tsx} +0 -0
  172. /package/templates/apps/frontend-blank/src/pages/{index.tsx → index.page.tsx} +0 -0
  173. /package/templates/apps/frontend-contact/src/pages/{index.tsx → index.page.tsx} +0 -0
  174. /package/templates/apps/frontend-dashboard/src/pages/(marketing)/{index.tsx → index.page.tsx} +0 -0
  175. /package/templates/apps/frontend-dashboard/src/pages/(marketing)/{login.tsx → login.page.tsx} +0 -0
  176. /package/templates/apps/frontend-dashboard/src/pages/dashboard/{index.tsx → index.page.tsx} +0 -0
  177. /package/templates/apps/frontend-dashboard/src/pages/dashboard/{settings.tsx → settings.page.tsx} +0 -0
  178. /package/templates/apps/frontend-docs/src/pages/docs/{[...slug].tsx → [...slug].page.tsx} +0 -0
  179. /package/templates/apps/frontend-docs/src/pages/{index.tsx → index.page.tsx} +0 -0
  180. /package/templates/apps/frontend-i18n/src/pages/{about.tsx → about.page.tsx} +0 -0
  181. /package/templates/apps/frontend-i18n/src/pages/{index.tsx → index.page.tsx} +0 -0
  182. /package/templates/apps/frontend-landing/src/pages/{index.tsx → index.page.tsx} +0 -0
  183. /package/templates/apps/frontend-spa/src/pages/{index.tsx → index.page.tsx} +0 -0
  184. /package/templates/apps/frontend-ssr/src/pages/{feed-swr.tsx → feed-swr.page.tsx} +0 -0
  185. /package/templates/apps/frontend-ssr/src/pages/{feed.tsx → feed.page.tsx} +0 -0
  186. /package/templates/apps/frontend-ssr/src/pages/{index.tsx → index.page.tsx} +0 -0
  187. /package/templates/apps/frontend-ssr-api/src/pages/{index.tsx → index.page.tsx} +0 -0
  188. /package/templates/apps/frontend-static-blog/src/pages/blog/{[slug].tsx → [slug].page.tsx} +0 -0
  189. /package/templates/apps/frontend-static-blog/src/pages/{index.tsx → index.page.tsx} +0 -0
@@ -1,23 +1,24 @@
1
- import { D as e, E as t, T as n, a as r, p as i, w as a } from "./inspect-Dwx0_tUj.js";
2
- import { basename as o, dirname as s, isAbsolute as c, join as l, relative as u, resolve as d } from "node:path";
3
- import { fileURLToPath as f, pathToFileURL as p } from "node:url";
4
- import { FileSystem as m } from "@effect/platform";
5
- import { NodeContext as h, NodeRuntime as g } from "@effect/platform-node";
6
- import { Cause as _, Effect as v, Layer as y } from "effect";
7
- import { LoggerLayer as b, addSink as x, createLogger as S, printReadyBlock as C } from "@voltro/logger";
8
- 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 P, writeSync as ee } from "node:fs";
9
- import { currentTraceContext as F, recordSample as te, resolveSecret as I } from "@voltro/runtime";
10
- import { createRequire as L } from "node:module";
11
- import { homedir as R } from "node:os";
12
- import { FRAMEWORK_ENV_CATALOG as ne, appEnvEntries as re, checkEnvNaming as ie, formatEnvErrors as ae, installEnvSnapshot as oe, isEnvContract as se, pluginEnvEntries as ce, renderDotEnvExample as le, resolveEnv as z } from "@voltro/env";
13
- import { __installPublicEnv as ue } from "@voltro/env/public";
14
- import { mkdir as de, readFile as fe, writeFile as B } from "node:fs/promises";
15
- import { createHash as pe } from "node:crypto";
16
- import { spawn as me } from "node:child_process";
17
- import { createConnection as he } from "node:net";
18
- import { PassThrough as ge } from "node:stream";
1
+ import { d as e, u as t, x as n } from "./fileConventions-COg0ZytD.js";
2
+ import { D as r, E as i, T as a, a as o, p as s, w as c } from "./inspect-Dwx0_tUj.js";
3
+ import { basename as l, dirname as u, isAbsolute as d, join as f, relative as p, resolve as m } from "node:path";
4
+ import { fileURLToPath as h, pathToFileURL as g } from "node:url";
5
+ import { FileSystem as _ } from "@effect/platform";
6
+ import { NodeContext as v, NodeRuntime as y } from "@effect/platform-node";
7
+ import { Cause as b, Effect as x, Layer as S } from "effect";
8
+ import { LoggerLayer as C, addSink as w, createLogger as T, printReadyBlock as E } from "@voltro/logger";
9
+ import { closeSync as D, existsSync as O, mkdirSync as k, openSync as A, promises as j, readFileSync as M, readdirSync as N, statSync as P, unlinkSync as ee, unwatchFile as F, watchFile as te, writeSync as I } from "node:fs";
10
+ import { currentTraceContext as L, recordSample as R, resolveSecret as ne } from "@voltro/runtime";
11
+ import { createRequire as re } from "node:module";
12
+ import { homedir as ie } from "node:os";
13
+ import { FRAMEWORK_ENV_CATALOG as ae, appEnvEntries as oe, checkEnvNaming as se, formatEnvErrors as ce, installEnvSnapshot as z, isEnvContract as le, pluginEnvEntries as ue, renderDotEnvExample as de, resolveEnv as fe } from "@voltro/env";
14
+ import { __installPublicEnv as pe } from "@voltro/env/public";
15
+ import { mkdir as B, readFile as me, writeFile as V } from "node:fs/promises";
16
+ import { createHash as he } from "node:crypto";
17
+ import { spawn as ge } from "node:child_process";
18
+ import { createConnection as _e } from "node:net";
19
+ import { PassThrough as ve } from "node:stream";
19
20
  //#region src/cliRuntime.ts
20
- var _e = [
21
+ var ye = [
21
22
  "severity",
22
23
  "code",
23
24
  "detail",
@@ -34,14 +35,14 @@ var _e = [
34
35
  "file",
35
36
  "line",
36
37
  "routine"
37
- ], ve = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
38
+ ], H = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
38
39
  if (t > 10 || typeof e != "object" || !e || n.has(e)) return null;
39
40
  n.add(e);
40
41
  let r = e, i = r.message;
41
42
  if (typeof i == "string" && i.length > 0 && i !== "Failed to execute statement") {
42
43
  let e = { message: i };
43
44
  typeof r.stack == "string" && (e.stack = r.stack);
44
- for (let t of _e) r[t] !== void 0 && (e[t] = r[t]);
45
+ for (let t of ye) r[t] !== void 0 && (e[t] = r[t]);
45
46
  return e;
46
47
  }
47
48
  for (let e of [
@@ -54,24 +55,24 @@ var _e = [
54
55
  ]) {
55
56
  let i = r[e];
56
57
  if (i !== void 0) {
57
- let e = ve(i, t + 1, n);
58
+ let e = H(i, t + 1, n);
58
59
  if (e) return e;
59
60
  }
60
61
  }
61
62
  if (Array.isArray(r.failures)) for (let e of r.failures) {
62
- let r = ve(e, t + 1, n);
63
+ let r = H(e, t + 1, n);
63
64
  if (r) return r;
64
65
  }
65
66
  return null;
66
- }, ye = (e = {}) => y.merge(h.layer, b({
67
+ }, U = (e = {}) => S.merge(v.layer, C({
67
68
  ...e.scope ? { defaultScope: e.scope } : {},
68
69
  ...e.logger
69
- })), V = async (e, t = {}) => {
70
- let n = e.pipe(v.provide(ye(t)));
71
- return await v.runPromise(v.matchCauseEffect(n, {
72
- onSuccess: (e) => v.succeed(e),
70
+ })), be = async (e, t = {}) => {
71
+ let n = e.pipe(x.provide(U(t)));
72
+ return await x.runPromise(x.matchCauseEffect(n, {
73
+ onSuccess: (e) => x.succeed(e),
73
74
  onFailure: (e) => {
74
- let t = [..._.defects(e)];
75
+ let t = [...b.defects(e)];
75
76
  if (process.env.VOLTRO_CAUSE_DEBUG === "1") for (let [e, n] of t.entries()) {
76
77
  let t = Object.getOwnPropertyNames(n);
77
78
  process.stderr.write(`[VOLTRO_CAUSE_DEBUG] defect[${e}] ctor=${n?.constructor?.name} props=${JSON.stringify(t)}\n`);
@@ -83,7 +84,7 @@ var _e = [
83
84
  }
84
85
  let n = null;
85
86
  for (let e of t) {
86
- let t = ve(e);
87
+ let t = H(e);
87
88
  if (t) {
88
89
  n = t;
89
90
  break;
@@ -98,55 +99,55 @@ var _e = [
98
99
  ...n.column ? { pgColumn: n.column } : {},
99
100
  ...n.constraint ? { pgConstraint: n.constraint } : {},
100
101
  ...n.routine ? { pgRoutine: n.routine } : {},
101
- causePretty: _.pretty(e)
102
- } : { causePretty: _.pretty(e) };
103
- return v.zipRight(v.logError("cli command failed", r), v.succeed(1));
102
+ causePretty: b.pretty(e)
103
+ } : { causePretty: b.pretty(e) };
104
+ return x.zipRight(x.logError("cli command failed", r), x.succeed(1));
104
105
  }
105
- }).pipe(v.provide(b(t.logger ?? {}))));
106
- }, be = (e, t = {}) => {
107
- let n = e.pipe(v.provide(ye(t)));
108
- g.runMain(n, { disableErrorReporting: !1 });
109
- }, xe = s(f(import.meta.url)), H = [d(xe, "..", "templates"), d(xe, "..", "..", "templates")], U = (e) => ({
106
+ }).pipe(x.provide(C(t.logger ?? {}))));
107
+ }, W = (e, t = {}) => {
108
+ let n = e.pipe(x.provide(U(t)));
109
+ y.runMain(n, { disableErrorReporting: !1 });
110
+ }, xe = u(h(import.meta.url)), G = [m(xe, "..", "templates"), m(xe, "..", "..", "templates")], Se = (e) => ({
110
111
  _tag: "TemplateNotFoundError",
111
112
  searched: e
112
- }), Se = ["AGENTS.md", "CLAUDE.md"], Ce = "voltro:agents-md:keep", we = 2048, Te = "<!-- VOLTRO:INDEX -->", W = (e, t) => e.exists(t).pipe(v.orElseSucceed(() => !1)), G = (e, t) => e.readFileString(t).pipe(v.orElseSucceed(() => "")), Ee = (e, t) => e.readFileString(t).pipe(v.map((e) => {
113
+ }), Ce = ["AGENTS.md", "CLAUDE.md"], we = "voltro:agents-md:keep", Te = 2048, Ee = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(x.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(x.orElseSucceed(() => "")), De = (e, t) => e.readFileString(t).pipe(x.map((e) => {
113
114
  try {
114
115
  return JSON.parse(e).workspaces !== void 0;
115
116
  } catch {
116
117
  return !1;
117
118
  }
118
- }), v.orElseSucceed(() => !1)), De = (e) => v.gen(function* () {
119
- let t = yield* m.FileSystem, n = d(e);
119
+ }), x.orElseSucceed(() => !1)), Oe = (e) => x.gen(function* () {
120
+ let t = yield* _.FileSystem, n = m(e);
120
121
  for (;;) {
121
- if ((yield* W(t, l(n, ".git"))) || (yield* W(t, l(n, "pnpm-workspace.yaml"))) || (yield* Ee(t, l(n, "package.json")))) return n;
122
- let r = s(n);
123
- if (r === n) return d(e);
122
+ if ((yield* K(t, f(n, ".git"))) || (yield* K(t, f(n, "pnpm-workspace.yaml"))) || (yield* De(t, f(n, "package.json")))) return n;
123
+ let r = u(n);
124
+ if (r === n) return m(e);
124
125
  n = r;
125
126
  }
126
- }), Oe = (e, t, n) => v.gen(function* () {
127
- yield* e.makeDirectory(n, { recursive: !0 }).pipe(v.orElseSucceed(() => void 0));
128
- let r = yield* e.readDirectory(t).pipe(v.orElseSucceed(() => []));
127
+ }), ke = (e, t, n) => x.gen(function* () {
128
+ yield* e.makeDirectory(n, { recursive: !0 }).pipe(x.orElseSucceed(() => void 0));
129
+ let r = yield* e.readDirectory(t).pipe(x.orElseSucceed(() => []));
129
130
  for (let i of r) {
130
- let r = l(t, i), a = l(n, i);
131
- (yield* e.stat(r).pipe(v.orElseSucceed(() => null)))?.type === "Directory" ? yield* Oe(e, r, a) : yield* e.copyFile(r, a).pipe(v.orElseSucceed(() => void 0));
132
- }
133
- }), ke = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Ae = (e, t) => v.gen(function* () {
134
- let n = l(t, "app.config.ts");
135
- if (!(yield* W(e, n))) return null;
136
- let r = (yield* v.tryPromise(() => import(p(n).href)).pipe(v.orElseSucceed(() => null)))?.default;
137
- return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(ke).filter((e) => e !== null);
138
- }), je = (e, t) => v.gen(function* () {
139
- let n = [], r = [], i = l(t, "apps");
140
- if (!(yield* W(e, i))) return {
131
+ let r = f(t, i), a = f(n, i);
132
+ (yield* e.stat(r).pipe(x.orElseSucceed(() => null)))?.type === "Directory" ? yield* ke(e, r, a) : yield* e.copyFile(r, a).pipe(x.orElseSucceed(() => void 0));
133
+ }
134
+ }), Ae = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, je = (e, t) => x.gen(function* () {
135
+ let n = f(t, "app.config.ts");
136
+ if (!(yield* K(e, n))) return null;
137
+ let r = (yield* x.tryPromise(() => import(g(n).href)).pipe(x.orElseSucceed(() => null)))?.default;
138
+ return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(Ae).filter((e) => e !== null);
139
+ }), Me = (e, t) => x.gen(function* () {
140
+ let n = [], r = [], i = f(t, "apps");
141
+ if (!(yield* K(e, i))) return {
141
142
  apis: n,
142
143
  webs: r
143
144
  };
144
- for (let t of yield* e.readDirectory(i).pipe(v.orElseSucceed(() => []))) {
145
- let a = l(i, t);
146
- if ((yield* e.stat(a).pipe(v.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(v.orElseSucceed(() => []))) {
147
- let i = l(a, t), o = l(i, "app.config.ts");
148
- if (!(yield* W(e, o))) continue;
149
- let s = yield* G(e, o);
145
+ for (let t of yield* e.readDirectory(i).pipe(x.orElseSucceed(() => []))) {
146
+ let a = f(i, t);
147
+ if ((yield* e.stat(a).pipe(x.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(x.orElseSucceed(() => []))) {
148
+ let i = f(a, t), o = f(i, "app.config.ts");
149
+ if (!(yield* K(e, o))) continue;
150
+ let s = yield* q(e, o);
150
151
  /type:\s*['"]web['"]/.test(s) ? r.push(i) : n.push(i);
151
152
  }
152
153
  }
@@ -154,7 +155,7 @@ var _e = [
154
155
  apis: n,
155
156
  webs: r
156
157
  };
157
- }), Me = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Ne = (e, t, n) => {
158
+ }), Ne = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Pe = (e, t, n) => {
158
159
  let r = [
159
160
  "<!-- voltro agent-docs index — regenerated at seed time -->",
160
161
  "## Deep reference (read on demand)",
@@ -166,17 +167,17 @@ var _e = [
166
167
  "",
167
168
  "| Topic | Open | Summary |",
168
169
  "|---|---|---|",
169
- ...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${Me(e.description)} |`),
170
+ ...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${Ne(e.description)} |`),
170
171
  ""
171
- ], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${Me(e.description)} |`) : t.map((e) => {
172
+ ], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${Ne(e.description)} |`) : t.map((e) => {
172
173
  let t = i.get(e);
173
- return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${Me(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
174
+ return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${Ne(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
174
175
  });
175
176
  return r.push(`### Plugins${t === null ? "" : " (installed)"}`, "", "| Plugin | Open | Summary |", "|---|---|---|"), r.push(a.length ? a.join("\n") : "| _(none installed)_ | | |", ""), r.join("\n");
176
- }, Pe = (e, t, n) => {
177
+ }, Fe = (e, t, n) => {
177
178
  let r = t.templates?.[e] ?? t.templates?.[e.replace(/^frontend-/, "")];
178
179
  return `\nScaffolded from the \`${e}\` template — see \`${r ? `${n}${r}` : `${n}agent-docs/templates/overview.md`}\`.\n`;
179
- }, Fe = {
180
+ }, Ie = {
180
181
  api: (e, t, n = "") => `# api — agent notes
181
182
 
182
183
  You are in a Voltro **api** app. Server primitives live here: \`queries/\`,
@@ -216,7 +217,7 @@ You are in a Voltro **web** app. File-based routing under \`src/pages/**\`.
216
217
  Deep reference (paths from the repo root): \`${e}agent-docs/routing.md\`,
217
218
  \`${e}agent-docs/schema-driven-ui.md\`, \`${e}agent-docs/internationalization.md\`.
218
219
  ${t}`
219
- }, Ie = [
220
+ }, Le = [
220
221
  {
221
222
  name: "voltro-schema",
222
223
  description: "Define or change a Voltro database table/schema (columns, mixins, indexes, relations).",
@@ -247,7 +248,7 @@ ${t}`
247
248
  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.",
248
249
  module: "cli.md"
249
250
  }
250
- ], Le = (e, t) => `---
251
+ ], Re = (e, t) => `---
251
252
  name: ${e.name}
252
253
  description: ${e.description}
253
254
  ---
@@ -258,10 +259,10 @@ Open the full reference and follow the patterns there:
258
259
 
259
260
  Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
260
261
  boundary, naming, anti-patterns) before editing.
261
- `, Re = (e, t, n, r) => v.gen(function* () {
262
- let i = yield* W(e, t);
262
+ `, ze = (e, t, n, r) => x.gen(function* () {
263
+ let i = yield* K(e, t);
263
264
  if (i) {
264
- if ((yield* G(e, t)).slice(0, we).includes("voltro:agents-md:keep")) return {
265
+ if ((yield* q(e, t)).slice(0, Te).includes("voltro:agents-md:keep")) return {
265
266
  path: t,
266
267
  action: "protected"
267
268
  };
@@ -270,68 +271,68 @@ boundary, naming, anti-patterns) before editing.
270
271
  action: "present"
271
272
  };
272
273
  }
273
- return yield* e.makeDirectory(s(t), { recursive: !0 }).pipe(v.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(v.orDie), {
274
+ return yield* e.makeDirectory(u(t), { recursive: !0 }).pipe(x.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(x.orDie), {
274
275
  path: t,
275
276
  action: i ? "overwritten" : "created"
276
277
  };
277
- }), ze = (e, t = {}) => v.gen(function* () {
278
- let n = yield* m.FileSystem, r = yield* De(e), i = null;
279
- for (let e of H) if (yield* W(n, l(e, "AGENTS.core.md"))) {
278
+ }), Be = (e, t = {}) => x.gen(function* () {
279
+ let n = yield* _.FileSystem, r = yield* Oe(e), i = null;
280
+ for (let e of G) if (yield* K(n, f(e, "AGENTS.core.md"))) {
280
281
  i = e;
281
282
  break;
282
283
  }
283
284
  if (i === null) {
284
- for (let e of H) if (yield* W(n, l(e, "AGENTS.md"))) {
285
- let i = yield* G(n, l(e, "AGENTS.md")), a = [];
286
- for (let e of Se) a.push(yield* Re(n, l(r, e), i, t.force ?? !1));
285
+ for (let e of G) if (yield* K(n, f(e, "AGENTS.md"))) {
286
+ let i = yield* q(n, f(e, "AGENTS.md")), a = [];
287
+ for (let e of Ce) a.push(yield* ze(n, f(r, e), i, t.force ?? !1));
287
288
  return { files: a };
288
289
  }
289
- return yield* v.fail(U(H.map((e) => l(e, "AGENTS.core.md"))));
290
+ return yield* x.fail(Se(G.map((e) => f(e, "AGENTS.core.md"))));
290
291
  }
291
- let a = yield* G(n, l(i, "AGENTS.core.md")), o = yield* G(n, l(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
292
+ let a = yield* q(n, f(i, "AGENTS.core.md")), o = yield* q(n, f(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
292
293
  modules: [],
293
294
  plugins: []
294
- }, c = (t.preferPointer ?? !1) || (yield* W(n, l(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), u = c ? "node_modules/@voltro/cli/templates/" : "", f = t.force ?? !1, p = Se.map((e) => l(r, e));
295
- if ((yield* v.forEach(p, (e) => G(n, e).pipe(v.map((e) => e.slice(0, we))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: p.map((e) => ({
295
+ }, c = (t.preferPointer ?? !1) || (yield* K(n, f(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), l = c ? "node_modules/@voltro/cli/templates/" : "", u = t.force ?? !1, d = Ce.map((e) => f(r, e));
296
+ if ((yield* x.forEach(d, (e) => q(n, e).pipe(x.map((e) => e.slice(0, Te))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
296
297
  path: e,
297
298
  action: "protected"
298
299
  })) };
299
- let { apis: h, webs: g } = yield* je(n, r), _ = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Set(), b = !1;
300
- for (let e of h) {
301
- let t = yield* Ae(n, e);
302
- if (_.set(e, t), t !== null) {
303
- b = !0;
304
- for (let e of t) y.add(e);
300
+ let { apis: p, webs: h } = yield* Me(n, r), g = /* @__PURE__ */ new Map(), v = /* @__PURE__ */ new Set(), y = !1;
301
+ for (let e of p) {
302
+ let t = yield* je(n, e);
303
+ if (g.set(e, t), t !== null) {
304
+ y = !0;
305
+ for (let e of t) v.add(e);
305
306
  }
306
307
  }
307
- let x = t.plugins ? t.plugins.map(ke).filter((e) => e !== null) : b ? [...y] : null, S = a.includes(Te) ? a.replace(Te, Ne(s, x, u)) : a, C = [];
308
- for (let e of p) C.push(yield* Re(n, e, S, f));
309
- c || (yield* Oe(n, l(i, "agent-docs"), l(r, "agent-docs")));
310
- let w = new Map((t.appTemplates ?? []).map((e) => [d(e.dir), e.template])), T = (e) => {
311
- let t = w.get(d(e));
312
- return t ? Pe(t, s, u) : "";
313
- }, E = (e, t) => v.forEach(Se, (r) => Re(n, l(e, r), t, f));
314
- for (let e of h) C.push(...yield* E(e, Fe.api(u, _.get(e) ?? null, T(e)))), (yield* W(n, l(e, "database"))) && C.push(...yield* E(l(e, "database"), Fe.database(u)));
315
- for (let e of g) C.push(...yield* E(e, Fe.web(u, T(e))));
316
- for (let e of Ie) C.push(yield* Re(n, l(r, ".claude", "skills", e.name, "SKILL.md"), Le(e, u), f));
308
+ let b = t.plugins ? t.plugins.map(Ae).filter((e) => e !== null) : y ? [...v] : null, S = a.includes(Ee) ? a.replace(Ee, Pe(s, b, l)) : a, C = [];
309
+ for (let e of d) C.push(yield* ze(n, e, S, u));
310
+ c || (yield* ke(n, f(i, "agent-docs"), f(r, "agent-docs")));
311
+ let w = new Map((t.appTemplates ?? []).map((e) => [m(e.dir), e.template])), T = (e) => {
312
+ let t = w.get(m(e));
313
+ return t ? Fe(t, s, l) : "";
314
+ }, E = (e, t) => x.forEach(Ce, (r) => ze(n, f(e, r), t, u));
315
+ for (let e of p) C.push(...yield* E(e, Ie.api(l, g.get(e) ?? null, T(e)))), (yield* K(n, f(e, "database"))) && C.push(...yield* E(f(e, "database"), Ie.database(l)));
316
+ for (let e of h) C.push(...yield* E(e, Ie.web(l, T(e))));
317
+ for (let e of Le) C.push(yield* ze(n, f(r, ".claude", "skills", e.name, "SKILL.md"), Re(e, l), u));
317
318
  return { files: C };
318
- }), Be = (e, t = {}) => v.runPromise(ze(e, t).pipe(v.provide(h.layer))), Ve = async (e) => {
319
+ }), Ve = (e, t = {}) => x.runPromise(Be(e, t).pipe(x.provide(v.layer))), He = async (e) => {
319
320
  let t = e.includes("--force"), n = e.find((e) => !e.startsWith("-")) ?? process.cwd();
320
- return V(v.gen(function* () {
321
- let e = yield* ze(n, { force: t });
321
+ return be(x.gen(function* () {
322
+ let e = yield* Be(n, { force: t });
322
323
  for (let t of e.files) {
323
- let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${Ce}")` : "present (use --force to overwrite)";
324
- yield* v.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
324
+ let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${we}")` : "present (use --force to overwrite)";
325
+ yield* x.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
325
326
  }
326
327
  return 0;
327
- }).pipe(v.catchTag("TemplateNotFoundError", (e) => v.gen(function* () {
328
- return yield* v.logError("AGENTS.md template not found", { searched: e.searched }), 1;
328
+ }).pipe(x.catchTag("TemplateNotFoundError", (e) => x.gen(function* () {
329
+ return yield* x.logError("AGENTS.md template not found", { searched: e.searched }), 1;
329
330
  }))), { scope: "voltro:agents-md" });
330
- }, He = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Ue = (e) => {
331
+ }, Ue = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), We = (e) => {
331
332
  try {
332
- let t = l(e, "tsconfig.json");
333
- if (!T(t)) return [];
334
- let n = JSON.parse(He(k(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = d(e, n.baseUrl ?? "."), a = [];
333
+ let t = f(e, "tsconfig.json");
334
+ if (!O(t)) return [];
335
+ let n = JSON.parse(Ue(M(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = m(e, n.baseUrl ?? "."), a = [];
335
336
  for (let [e, t] of Object.entries(r)) {
336
337
  let n = t[0];
337
338
  if (!n) continue;
@@ -340,28 +341,28 @@ boundary, naming, anti-patterns) before editing.
340
341
  let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
341
342
  a.push({
342
343
  find: RegExp(`^${t}/(.*)$`),
343
- replacement: `${l(i, n.slice(0, -2))}/$1`
344
+ replacement: `${f(i, n.slice(0, -2))}/$1`
344
345
  });
345
346
  } else a.push({
346
347
  find: e,
347
- replacement: l(i, n)
348
+ replacement: f(i, n)
348
349
  });
349
350
  }
350
351
  return a;
351
352
  } catch {
352
353
  return [];
353
354
  }
354
- }, We = (e) => {
355
+ }, Ge = (e) => {
355
356
  let t = e;
356
357
  return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
357
- }, Ge = async (e, t) => {
358
+ }, Ke = async (e, t) => {
358
359
  try {
359
360
  return await t();
360
361
  } catch (t) {
361
- throw We(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
362
+ throw Ge(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
362
363
  }
363
- }, Ke = "// 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, Je = (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"), Ye = async (e, t) => {
364
- let n = Je(t, () => !0), r = `${Ke}
364
+ }, qe = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", Je = (e, t) => t ? `${e} | undefined` : e, Ye = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${Je(t.tsType, t.optional)}`).join("\n"), Xe = async (e, t) => {
365
+ let n = Ye(t, () => !0), r = `${qe}
365
366
  import '@voltro/env/server'
366
367
 
367
368
  declare module '@voltro/env/server' {
@@ -370,9 +371,9 @@ ${n.length > 0 ? n : " // (no variables declared)"}
370
371
  }
371
372
  }
372
373
  `;
373
- await B(l(e, "env.generated.d.ts"), r, "utf8");
374
- }, Xe = async (e, t) => {
375
- let n = Je(t, (e) => e === "public"), r = `${Ke}
374
+ await V(f(e, "env.generated.d.ts"), r, "utf8");
375
+ }, Ze = async (e, t) => {
376
+ let n = Ye(t, (e) => e === "public"), r = `${qe}
376
377
  import '@voltro/env/public'
377
378
 
378
379
  declare module '@voltro/env/public' {
@@ -380,10 +381,10 @@ declare module '@voltro/env/public' {
380
381
  ${n.length > 0 ? n : " // (no public variables declared)"}
381
382
  }
382
383
  }
383
- `, i = l(e, "src");
384
- await de(i, { recursive: !0 }), await B(l(i, "voltro-env.d.ts"), r, "utf8");
385
- }, Ze = async (e, t) => {
386
- let n = `${Ke}
384
+ `, i = f(e, "src");
385
+ await B(i, { recursive: !0 }), await V(f(i, "voltro-env.d.ts"), r, "utf8");
386
+ }, Qe = async (e, t) => {
387
+ let n = `${qe}
387
388
  import { __installPublicEnv } from '@voltro/env/public'
388
389
 
389
390
  export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
@@ -391,14 +392,14 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
391
392
  // Set the browser/SSR-shared global the \`publicEnv\` accessor reads.
392
393
  __installPublicEnv(publicEnvValues)
393
394
  `;
394
- await de(e, { recursive: !0 }), await B(l(e, "env.public.ts"), n, "utf8");
395
- }, Qe = async (e) => {
396
- let t = se(e.rawEnv) ? e.rawEnv : void 0, n = await z({
395
+ await B(e, { recursive: !0 }), await V(f(e, "env.public.ts"), n, "utf8");
396
+ }, $e = async (e) => {
397
+ let t = le(e.rawEnv) ? e.rawEnv : void 0, n = await fe({
397
398
  contract: t,
398
- resolveSecret: I
399
- }), r = [...n.errors, ...ie(t, e.appType)];
400
- if (r.length > 0) throw Error(ae(r));
401
- oe(n.values), e.appType === "web" && ue(n.publicValues);
399
+ resolveSecret: ne
400
+ }), r = [...n.errors, ...se(t, e.appType)];
401
+ if (r.length > 0) throw Error(ce(r));
402
+ z(n.values), e.appType === "web" && pe(n.publicValues);
402
403
  let i = t ? Object.keys(t.vars).length : 0;
403
404
  if (i > 0) {
404
405
  let r = Object.keys(n.publicValues).length;
@@ -410,20 +411,20 @@ __installPublicEnv(publicEnvValues)
410
411
  n.length > 0 && e.log.warn(`env: ${n.length} secret var(s) declared on a web app — secrets are reachable only from server-side render code and are NEVER bundled. Prefer declaring secrets on the api.`, { keys: n });
411
412
  }
412
413
  }
413
- return e.generateTypes && t && (e.appType === "api" ? await Ye(e.root, t) : await Xe(e.root, t)), {
414
+ return e.generateTypes && t && (e.appType === "api" ? await Xe(e.root, t) : await Ze(e.root, t)), {
414
415
  resolved: n,
415
416
  contract: t
416
417
  };
417
- }, $e = (e) => {
418
- let t = re(e.contract), n = (e.plugins ?? []).flatMap((e) => ce(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ne, i = /* @__PURE__ */ new Set(), a = [];
418
+ }, et = (e) => {
419
+ let t = oe(e.contract), n = (e.plugins ?? []).flatMap((e) => ue(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ae, i = /* @__PURE__ */ new Set(), a = [];
419
420
  for (let e of [
420
421
  ...t,
421
422
  ...n,
422
423
  ...r
423
424
  ]) i.has(e.key) || (i.add(e.key), a.push(e));
424
425
  return a;
425
- }, et = (e, t, n = (e) => process.env[e]) => {
426
- let r = $e(t).map((e) => {
426
+ }, tt = (e, t, n = (e) => process.env[e]) => {
427
+ let r = et(t).map((e) => {
427
428
  let t = n(e.key) !== void 0;
428
429
  return {
429
430
  ...e,
@@ -440,13 +441,13 @@ __installPublicEnv(publicEnvValues)
440
441
  missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
441
442
  }
442
443
  };
443
- }, tt = (e, t) => le($e({
444
+ }, nt = (e, t) => de(et({
444
445
  ...e,
445
446
  includeFramework: !1
446
447
  }), {
447
448
  includeFramework: e.includeFramework !== !1,
448
449
  ...t ? { header: t } : {}
449
- }), nt = () => {
450
+ }), rt = () => {
450
451
  let e = /* @__PURE__ */ new Map();
451
452
  return {
452
453
  get(t) {
@@ -473,7 +474,7 @@ __installPublicEnv(publicEnvValues)
473
474
  return Array.from(e.entries());
474
475
  }
475
476
  };
476
- }, K = (e) => {
477
+ }, J = (e) => {
477
478
  if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
478
479
  if (typeof e != "string") return null;
479
480
  let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
@@ -482,24 +483,33 @@ __installPublicEnv(publicEnvValues)
482
483
  if (!Number.isFinite(n) || n <= 0) return null;
483
484
  let r = t[2].toLowerCase();
484
485
  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;
485
- }, rt = (e, t = {}) => {
486
+ }, it = (e, t = {}) => {
486
487
  let n = [e];
487
488
  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("|");
488
- }, it = (e, t) => e.expiresAt > t, at = (e, t) => e.expiresAt <= t && e.servableUntil > t, ot = S({ scope: "voltro:cli" }), st = [], ct = (e) => {
489
- st.length = 0;
490
- let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? c(t) ? t : d(process.cwd(), t) : process.cwd(), r = [], i = n;
489
+ }, at = (e, t) => e.expiresAt > t, ot = (e, t) => e.expiresAt <= t && e.servableUntil > t, st = T({ scope: "voltro:cli" }), ct = (e, t) => {
490
+ if (t?.code !== "EACCES") return "";
491
+ if (typeof process.getuid != "function") return " permission denied";
492
+ try {
493
+ let t = P(e);
494
+ return ` — permission denied: the file is owned by uid ${t.uid} (mode ${(t.mode & 511).toString(8)}) and this process is uid ${process.getuid()}. A container running as root with the workspace bind-mounted writes files the host user cannot read; run it as \`--user <your-uid>:<your-gid>\`, or delete the file and let the owning user recreate it.`;
495
+ } catch {
496
+ return " — permission denied (and the file could not be stat-ed either)";
497
+ }
498
+ }, lt = [], ut = (e) => {
499
+ lt.length = 0;
500
+ let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? d(t) ? t : m(process.cwd(), t) : process.cwd(), r = [], i = n;
491
501
  for (;;) {
492
502
  r.push(i);
493
- let e = s(i);
503
+ let e = u(i);
494
504
  if (e === i) break;
495
505
  i = e;
496
506
  }
497
507
  for (let e of r) for (let t of [".env.local", ".env"]) {
498
- let n = d(e, t);
499
- if (T(n)) {
500
- st.push(n);
508
+ let n = m(e, t);
509
+ if (O(n)) {
510
+ lt.push(n);
501
511
  try {
502
- let e = k(n, "utf8");
512
+ let e = M(n, "utf8");
503
513
  for (let t of e.split(/\r?\n/)) {
504
514
  let e = t.trim();
505
515
  if (e === "" || e.startsWith("#")) continue;
@@ -509,15 +519,15 @@ __installPublicEnv(publicEnvValues)
509
519
  (i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
510
520
  }
511
521
  } catch (e) {
512
- ot.warn("failed to load env file (continuing)", { path: n }, e);
522
+ st.warn(`failed to load env file (continuing)${ct(n, e)}`, { path: n }, e);
513
523
  }
514
524
  }
515
525
  }
516
- }, lt = 500, ut = (e, t, n = {}) => {
526
+ }, dt = 500, ft = (e, t, n = {}) => {
517
527
  if (e.length === 0) return () => {};
518
- let r = (e) => n.root ? u(n.root, e) : e, i = !1, a = (e) => {
528
+ let r = (e) => n.root ? p(n.root, e) : e, i = !1, a = (e) => {
519
529
  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(() => {
520
- let e = me(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
530
+ let e = ge(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
521
531
  stdio: "inherit",
522
532
  env: process.env,
523
533
  cwd: n.cwd ?? process.cwd()
@@ -531,62 +541,62 @@ __installPublicEnv(publicEnvValues)
531
541
  });
532
542
  }));
533
543
  };
534
- for (let t of e) P(t, { interval: lt }, (e, n) => {
544
+ for (let t of e) te(t, { interval: dt }, (e, n) => {
535
545
  e.mtimeMs !== n.mtimeMs && a(t);
536
546
  });
537
547
  return t.info("watching .env files for changes", {
538
548
  files: e.map(r),
539
- intervalMs: lt
549
+ intervalMs: dt
540
550
  }), () => {
541
- for (let t of e) N(t);
551
+ for (let t of e) F(t);
542
552
  };
543
- }, q = S({ scope: "vite" }), dt = /\x1b\[[0-9;]*m/g, ft = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, pt = (e) => e.replace(dt, "").replace(ft, "").trim(), mt = /proxy error/i, ht = [
553
+ }, pt = T({ scope: "vite" }), mt = /\x1b\[[0-9;]*m/g, ht = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, gt = (e) => e.replace(mt, "").replace(ht, "").trim(), _t = /proxy error/i, vt = [
544
554
  "ECONNREFUSED",
545
555
  "ECONNRESET",
546
556
  "ECONNABORTED",
547
557
  "EPIPE",
548
558
  "ETIMEDOUT"
549
- ], gt = (e, t = 0) => {
559
+ ], yt = (e, t = 0) => {
550
560
  if (e == null || t > 5) return !1;
551
561
  let n = e;
552
- 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) => gt(e, t + 1)) ? !0 : gt(n.cause, t + 1);
553
- }, _t = 4e3, vt = () => {
562
+ return typeof n.code == "string" && vt.includes(n.code) || typeof n.message == "string" && vt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => yt(e, t + 1)) ? !0 : yt(n.cause, t + 1);
563
+ }, bt = 4e3, xt = () => {
554
564
  let e = /* @__PURE__ */ new Set(), t = 0, n = {
555
565
  hasWarned: !1,
556
566
  info: (e) => {
557
- let t = pt(e);
558
- t.length !== 0 && q.info(t);
567
+ let t = gt(e);
568
+ t.length !== 0 && pt.info(t);
559
569
  },
560
570
  warn: (e) => {
561
571
  n.hasWarned = !0;
562
- let t = pt(e);
563
- t.length !== 0 && q.warn(t);
572
+ let t = gt(e);
573
+ t.length !== 0 && pt.warn(t);
564
574
  },
565
575
  warnOnce: (t) => {
566
- let r = pt(t);
567
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && q.warn(r));
576
+ let r = gt(t);
577
+ e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && pt.warn(r));
568
578
  },
569
579
  error: (e, n) => {
570
- let r = pt(e), i = n?.error;
580
+ let r = gt(e), i = n?.error;
571
581
  if (r.length !== 0) {
572
- if (mt.test(r) && gt(i)) {
582
+ if (_t.test(r) && yt(i)) {
573
583
  let e = Date.now();
574
- e - t > _t && (t = e, q.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
584
+ e - t > bt && (t = e, pt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
575
585
  return;
576
586
  }
577
- q.error(r, {}, i);
587
+ pt.error(r, {}, i);
578
588
  }
579
589
  },
580
590
  clearScreen: () => {},
581
591
  hasErrorLogged: (e) => !1
582
592
  };
583
593
  return n;
584
- }, yt = (e = process.env) => {
594
+ }, St = (e = process.env) => {
585
595
  let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
586
596
  if (t === void 0 || t.trim() === "") return 4;
587
597
  let n = Number(t);
588
598
  return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
589
- }, bt = (e) => {
599
+ }, Ct = (e) => {
590
600
  let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
591
601
  let e = r.shift();
592
602
  e ? e() : n--;
@@ -604,8 +614,8 @@ __installPublicEnv(publicEnvValues)
604
614
  return n;
605
615
  }
606
616
  };
607
- }, xt = (e) => {
608
- let t = bt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
617
+ }, wt = (e) => {
618
+ let t = Ct(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
609
619
  return {
610
620
  load: (i, a) => {
611
621
  if (r.has(i)) return a();
@@ -630,7 +640,7 @@ __installPublicEnv(publicEnvValues)
630
640
  return r.size;
631
641
  }
632
642
  };
633
- }, St = (e) => {
643
+ }, Tt = (e) => {
634
644
  let t = [];
635
645
  for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
636
646
  name: n.slice(5, -2),
@@ -646,12 +656,12 @@ __installPublicEnv(publicEnvValues)
646
656
  optional: !1
647
657
  });
648
658
  return t;
649
- }, Ct = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), wt = async (e) => {
650
- let t = d(e);
659
+ }, Et = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Dt = async (e) => {
660
+ let t = m(e);
651
661
  for (let e = 0; e < 4; e++) {
652
- let e = l(t, "project.json");
653
- if (T(e)) try {
654
- let n = await O.readFile(e, "utf8");
662
+ let e = f(t, "project.json");
663
+ if (O(e)) try {
664
+ let n = await j.readFile(e, "utf8");
655
665
  return {
656
666
  projectDir: t,
657
667
  manifest: JSON.parse(n)
@@ -659,38 +669,38 @@ __installPublicEnv(publicEnvValues)
659
669
  } catch {
660
670
  return null;
661
671
  }
662
- let n = s(t);
672
+ let n = u(t);
663
673
  if (n === t) break;
664
674
  t = n;
665
675
  }
666
676
  return null;
667
- }, Tt = async (e) => {
668
- let t = await wt(e);
677
+ }, Ot = async (e) => {
678
+ let t = await Dt(e);
669
679
  if (!t) return [];
670
- let { projectDir: n, manifest: r } = t, i = o(e), a = r.apps ?? {}, s = [];
680
+ let { projectDir: n, manifest: r } = t, i = l(e), a = r.apps ?? {}, o = [];
671
681
  for (let [e, t] of Object.entries(a)) {
672
682
  if (e === i || t.kind !== "web" || typeof t.port != "number") continue;
673
- let r = l(l(n, t.path ?? e), "src", "pages");
674
- if (!T(r)) continue;
683
+ let r = f(f(n, t.path ?? e), "src", "pages");
684
+ if (!O(r)) continue;
675
685
  let a;
676
686
  try {
677
687
  let { pages: e } = await $(r);
678
688
  a = e.map((e) => ({
679
689
  pattern: e.pattern,
680
- params: St(e.pattern)
690
+ params: Tt(e.pattern)
681
691
  }));
682
692
  } catch {
683
693
  continue;
684
694
  }
685
- s.push({
686
- key: Ct(e),
695
+ o.push({
696
+ key: Et(e),
687
697
  origin: `http://localhost:${t.port}`,
688
698
  ...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
689
699
  routes: a
690
700
  });
691
701
  }
692
- return s;
693
- }, Et = (e) => {
702
+ return o;
703
+ }, kt = (e) => {
694
704
  if (e.params.length === 0) return `'${e.pattern}'`;
695
705
  let t = e.pattern;
696
706
  for (let n of e.params) {
@@ -698,21 +708,21 @@ __installPublicEnv(publicEnvValues)
698
708
  t = t.replace(e, r);
699
709
  }
700
710
  return "`" + t + "`";
701
- }, Dt = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
711
+ }, At = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
702
712
  let t = "string";
703
713
  return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
704
- }).join("; ")} }`, Ot = (e, t, n) => {
705
- let r = Dt(e), i = Et(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
714
+ }).join("; ")} }`, jt = (e, t, n) => {
715
+ let r = At(e), i = kt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
706
716
  return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
707
- }, kt = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${Ot(e, !1)},`).join("\n")}\n}`, At = (e, t) => {
717
+ }, Mt = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${jt(e, !1)},`).join("\n")}\n}`, Nt = (e, t) => {
708
718
  if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
709
- 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)}: ${Ot(e, !0, i)},`);
719
+ 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)}: ${jt(e, !0, i)},`);
710
720
  return ` ${e.key}: {\n${a.join("\n")}\n },`;
711
- }, jt = async (e) => {
721
+ }, Pt = async (e) => {
712
722
  let t = e.pages.map((e) => ({
713
723
  pattern: e.pattern,
714
- params: St(e.pattern)
715
- })), n = await Tt(e.appRoot), r = [
724
+ params: Tt(e.pattern)
725
+ })), n = await Ot(e.appRoot), r = [
716
726
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
717
727
  "// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
718
728
  "// Type-safe route builders consumed by <Link to={...}>.",
@@ -721,20 +731,20 @@ __installPublicEnv(publicEnvValues)
721
731
  "",
722
732
  "type EmptyParams = Record<string, never>",
723
733
  ""
724
- ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${kt(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => At(e, i)).join("\n")}\n} as const\n`}`, o = l(e.appRoot, ".framework", "routes.generated.ts");
725
- await O.mkdir(s(o), { recursive: !0 });
726
- let c = null;
734
+ ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${Mt(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => Nt(e, i)).join("\n")}\n} as const\n`}`, o = f(e.appRoot, ".framework", "routes.generated.ts");
735
+ await j.mkdir(u(o), { recursive: !0 });
736
+ let s = null;
727
737
  try {
728
- c = await O.readFile(o, "utf8");
738
+ s = await j.readFile(o, "utf8");
729
739
  } catch {}
730
- return c === a ? {
740
+ return s === a ? {
731
741
  path: o,
732
742
  wrote: !1
733
- } : (await O.writeFile(o, a, "utf8"), {
743
+ } : (await j.writeFile(o, a, "utf8"), {
734
744
  path: o,
735
745
  wrote: !0
736
746
  });
737
- }, Mt = 256, Nt = (e = Mt) => {
747
+ }, Ft = 256, It = (e = Ft) => {
738
748
  let t = [], n = /* @__PURE__ */ new Set();
739
749
  return {
740
750
  emit(r, i) {
@@ -757,27 +767,27 @@ __installPublicEnv(publicEnvValues)
757
767
  return t.slice();
758
768
  }
759
769
  };
760
- }, Pt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, Ft = () => `: keep-alive ${Date.now()}\n\n`, It = {
770
+ }, Lt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, Rt = () => `: keep-alive ${Date.now()}\n\n`, zt = {
761
771
  trace: 0,
762
772
  debug: 1,
763
773
  info: 2,
764
774
  warn: 3,
765
775
  error: 4,
766
776
  fatal: 5
767
- }, Lt = 2e3, Rt = 200, zt = class {
777
+ }, Bt = 2e3, Vt = 200, Ht = class {
768
778
  capacity;
769
779
  buffer = [];
770
- constructor(e = Lt) {
780
+ constructor(e = Bt) {
771
781
  this.capacity = e;
772
782
  }
773
783
  append(e) {
774
784
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
775
785
  }
776
786
  query(e = {}) {
777
- let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? Rt, this.capacity), i = e.minLevel === void 0 ? It.trace : It[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
787
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? Vt, this.capacity), i = e.minLevel === void 0 ? zt.trace : zt[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
778
788
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
779
789
  let r = this.buffer[e];
780
- r.ts < t || r.ts > n || It[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);
790
+ r.ts < t || r.ts > n || zt[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);
781
791
  }
782
792
  return l.reverse();
783
793
  }
@@ -790,7 +800,7 @@ __installPublicEnv(publicEnvValues)
790
800
  clear() {
791
801
  this.buffer = [];
792
802
  }
793
- }, Bt = null, Vt = () => (Bt === null && (Bt = new zt()), Bt), Ht = (e) => {
803
+ }, Ut = null, Wt = () => (Ut === null && (Ut = new Ht()), Ut), Gt = (e) => {
794
804
  if (typeof e == "string") return e;
795
805
  if (e instanceof Error) return e.message;
796
806
  try {
@@ -798,18 +808,18 @@ __installPublicEnv(publicEnvValues)
798
808
  } catch {
799
809
  return String(e);
800
810
  }
801
- }, Ut = (e) => {
811
+ }, Kt = (e) => {
802
812
  let t = {
803
813
  log: console.log.bind(console),
804
814
  info: console.info.bind(console),
805
815
  warn: console.warn.bind(console),
806
816
  error: console.error.bind(console),
807
817
  debug: console.debug.bind(console)
808
- }, n = Vt(), r = !1, i = (i) => (...a) => {
818
+ }, n = Wt(), r = !1, i = (i) => (...a) => {
809
819
  if (t[i](...a), !r) {
810
820
  r = !0;
811
821
  try {
812
- let t = a.length > 0 ? Ht(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = F();
822
+ let t = a.length > 0 ? Gt(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = L();
813
823
  e.emit("log", {
814
824
  level: i,
815
825
  message: r,
@@ -836,7 +846,7 @@ __installPublicEnv(publicEnvValues)
836
846
  }
837
847
  };
838
848
  console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
839
- let a = x((t) => {
849
+ let a = w((t) => {
840
850
  if (!r) {
841
851
  r = !0;
842
852
  try {
@@ -847,7 +857,7 @@ __installPublicEnv(publicEnvValues)
847
857
  argsCount: 1,
848
858
  ...t.scope === void 0 ? {} : { scope: t.scope }
849
859
  });
850
- let a = F(), o = a !== void 0 && t.fields.traceId === void 0 ? {
860
+ let a = L(), o = a !== void 0 && t.fields.traceId === void 0 ? {
851
861
  ...t.fields,
852
862
  traceId: a.traceId
853
863
  } : t.fields;
@@ -867,24 +877,24 @@ __installPublicEnv(publicEnvValues)
867
877
  return () => {
868
878
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
869
879
  };
870
- }, Wt = 2e3, Gt = 8, Kt = 1e3, qt = 200, J = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Jt = (e) => {
880
+ }, qt = 2e3, Jt = 8, Yt = 1e3, Xt = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Zt = (e) => {
871
881
  switch (e) {
872
882
  case "error": return "error";
873
883
  case "warn": return "warn";
874
884
  case "debug": return "debug";
875
885
  default: return "info";
876
886
  }
877
- }, Yt = S({ scope: "client" }), Xt = (e, t) => {
887
+ }, Qt = T({ scope: "client" }), $t = (e, t) => {
878
888
  let n;
879
889
  try {
880
890
  n = JSON.parse(e);
881
891
  } catch {
882
- return Zt(400, { error: "invalid JSON body" });
892
+ return en(400, { error: "invalid JSON body" });
883
893
  }
884
- if (typeof n != "object" || !n) return Zt(400, { error: "body must be a JSON object" });
894
+ if (typeof n != "object" || !n) return en(400, { error: "body must be a JSON object" });
885
895
  let r = n;
886
- if (!Array.isArray(r.entries)) return Zt(400, { error: "entries must be an array" });
887
- 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, qt), c = 0;
896
+ if (!Array.isArray(r.entries)) return en(400, { error: "entries must be an array" });
897
+ 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, Xt), c = 0;
888
898
  for (let e of s) {
889
899
  if (typeof e != "object" || !e) continue;
890
900
  let n = e;
@@ -895,7 +905,7 @@ __installPublicEnv(publicEnvValues)
895
905
  "warn",
896
906
  "error",
897
907
  "debug"
898
- ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = J(n.message, Wt), u = Array.isArray(n.args) ? n.args.slice(0, Gt).filter((e) => typeof e == "string").map((e) => J(e, Kt)) : void 0, d = typeof n.stack == "string" ? J(n.stack, Wt) : void 0;
908
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, qt), u = Array.isArray(n.args) ? n.args.slice(0, Jt).filter((e) => typeof e == "string").map((e) => Y(e, Yt)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, qt) : void 0;
899
909
  t.emit("clientLog", {
900
910
  ts: s,
901
911
  level: r,
@@ -910,50 +920,50 @@ __installPublicEnv(publicEnvValues)
910
920
  ...i === void 0 ? {} : { app: i },
911
921
  ...a === void 0 ? {} : { page: a },
912
922
  ...u !== void 0 && u.length > 0 ? { args: u } : {}
913
- }, p = Jt(r);
914
- (p === "error" || p === "warn") && d !== void 0 ? Yt[p](l, f, { stack: d }) : Yt[p](l, {
923
+ }, p = Zt(r);
924
+ (p === "error" || p === "warn") && d !== void 0 ? Qt[p](l, f, { stack: d }) : Qt[p](l, {
915
925
  ...f,
916
926
  ...d === void 0 ? {} : { stack: d }
917
927
  }), c++;
918
928
  }
919
- return Zt(202, {
929
+ return en(202, {
920
930
  accepted: c,
921
931
  dropped: r.entries.length - c
922
932
  });
923
- }, Zt = (e, t) => ({
933
+ }, en = (e, t) => ({
924
934
  status: e,
925
935
  contentType: "application/json; charset=utf-8",
926
936
  body: JSON.stringify(t)
927
- }), Qt = "/_voltro/inspect/clientLog", $t = [
937
+ }), tn = "/_voltro/inspect/clientLog", nn = [
928
938
  "trace",
929
939
  "debug",
930
940
  "info",
931
941
  "warn",
932
942
  "error",
933
943
  "fatal"
934
- ], en = {
944
+ ], rn = {
935
945
  trace: "TRACE",
936
946
  debug: "DEBUG",
937
947
  info: "INFO ",
938
948
  warn: "WARN ",
939
949
  error: "ERROR",
940
950
  fatal: "FATAL"
941
- }, tn = (e) => $t.includes(e), nn = (e, n, i = {}) => {
942
- if (t()) return {
951
+ }, an = (e) => nn.includes(e), on = (e, t, n = {}) => {
952
+ if (i()) return {
943
953
  status: 503,
944
954
  contentType: "application/json",
945
955
  body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
946
956
  };
947
- let a = r(i);
948
- if (!a.ok) return {
957
+ let r = o(n);
958
+ if (!r.ok) return {
949
959
  status: 401,
950
960
  contentType: "application/json",
951
961
  body: JSON.stringify({
952
962
  error: "unauthorized",
953
- reason: a.reason
963
+ reason: r.reason
954
964
  })
955
965
  };
956
- let o = e.indexOf("?"), s = o === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(o + 1)), c = {}, l = s.get("since");
966
+ let a = e.indexOf("?"), s = a === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(a + 1)), c = {}, l = s.get("since");
957
967
  if (l !== null) {
958
968
  let e = Number(l);
959
969
  Number.isFinite(e) && (c.since = e);
@@ -969,7 +979,7 @@ __installPublicEnv(publicEnvValues)
969
979
  Number.isFinite(e) && e > 0 && (c.max = Math.floor(e));
970
980
  }
971
981
  let f = s.get("level");
972
- f !== null && tn(f) && (c.minLevel = f);
982
+ f !== null && an(f) && (c.minLevel = f);
973
983
  let p = s.get("source");
974
984
  (p === "server" || p === "client") && (c.source = p);
975
985
  let m = s.get("scope");
@@ -978,16 +988,16 @@ __installPublicEnv(publicEnvValues)
978
988
  h !== null && h.length > 0 && (c.filter = h);
979
989
  let g = s.get("trace");
980
990
  g !== null && g.length > 0 && (c.traceId = g);
981
- let _ = n.query(c);
991
+ let _ = t.query(c);
982
992
  if ((s.get("format") ?? "json") === "text") return {
983
993
  status: 200,
984
994
  contentType: "text/plain; charset=utf-8",
985
- body: _.map(rn).join("\n") + (_.length > 0 ? "\n" : "")
995
+ body: _.map(sn).join("\n") + (_.length > 0 ? "\n" : "")
986
996
  };
987
997
  let v = {
988
998
  capturedAt: Date.now(),
989
- bufferCapacity: n.capacityHint(),
990
- bufferSize: n.size(),
999
+ bufferCapacity: t.capacityHint(),
1000
+ bufferSize: t.size(),
991
1001
  returned: _.length,
992
1002
  records: _
993
1003
  };
@@ -996,33 +1006,33 @@ __installPublicEnv(publicEnvValues)
996
1006
  contentType: "application/json; charset=utf-8",
997
1007
  body: JSON.stringify(v)
998
1008
  };
999
- }, rn = (e) => {
1000
- 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 = on(e.fields);
1001
- return `${n}:${r}:${i}.${a} ${en[e.level]} ${o} ${e.message}${s}`;
1002
- }, an = 80, on = (e) => {
1009
+ }, sn = (e) => {
1010
+ 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 = ln(e.fields);
1011
+ return `${n}:${r}:${i}.${a} ${rn[e.level]} ${o} ${e.message}${s}`;
1012
+ }, cn = 80, ln = (e) => {
1003
1013
  let t = Object.entries(e);
1004
1014
  if (t.length === 0) return "";
1005
1015
  let n = [];
1006
1016
  for (let [e, r] of t) {
1007
1017
  if (r === void 0) continue;
1008
- let t = sn(r);
1018
+ let t = un(r);
1009
1019
  n.push(`${e}=${t}`);
1010
1020
  }
1011
1021
  return n.length > 0 ? " " + n.join(" ") : "";
1012
- }, sn = (e) => {
1022
+ }, un = (e) => {
1013
1023
  if (typeof e == "string") {
1014
- let t = e.length > an ? e.slice(0, an) + "…" : e;
1024
+ let t = e.length > cn ? e.slice(0, cn) + "…" : e;
1015
1025
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1016
1026
  }
1017
1027
  if (e === null) return "null";
1018
1028
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1019
1029
  try {
1020
1030
  let t = JSON.stringify(e);
1021
- return t.length > an ? t.slice(0, an) + "…" : t;
1031
+ return t.length > cn ? t.slice(0, cn) + "…" : t;
1022
1032
  } catch {
1023
1033
  return "[unserialisable]";
1024
1034
  }
1025
- }, cn = "/_voltro/inspect/logs", ln = [{
1035
+ }, dn = "/_voltro/inspect/logs", fn = [{
1026
1036
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1027
1037
  handle: (e, t) => {
1028
1038
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1034,13 +1044,13 @@ __installPublicEnv(publicEnvValues)
1034
1044
  });
1035
1045
  } else t.info(n);
1036
1046
  }
1037
- }], un = () => {
1047
+ }], pn = () => {
1038
1048
  let e = {
1039
1049
  warn: console.warn.bind(console),
1040
1050
  error: console.error.bind(console)
1041
- }, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1051
+ }, t = T({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1042
1052
  if (!n) {
1043
- for (let e of ln) if (e.match(i[0])) {
1053
+ for (let e of fn) if (e.match(i[0])) {
1044
1054
  n = !0;
1045
1055
  try {
1046
1056
  e.handle(i, t);
@@ -1055,7 +1065,7 @@ __installPublicEnv(publicEnvValues)
1055
1065
  return console.warn = r("warn"), console.error = r("error"), () => {
1056
1066
  console.warn = e.warn, console.error = e.error;
1057
1067
  };
1058
- }, dn = {
1068
+ }, mn = {
1059
1069
  loader: "it runs on the server, and the router caches its result per route + params",
1060
1070
  renderMode: "it picks the server render strategy",
1061
1071
  dynamic: "it picks the server render strategy",
@@ -1066,7 +1076,7 @@ __installPublicEnv(publicEnvValues)
1066
1076
  cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1067
1077
  interactive: "it decides how much client JS the server ships",
1068
1078
  tenantAware: "it is part of the server-side cache key"
1069
- }, fn = Object.keys(dn), pn = "virtual:voltro-route-refresh", mn = `\0${pn}`, hn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, gn = () => `
1079
+ }, hn = Object.keys(mn), gn = (e) => n.test(e), _n = (e) => e.replace(t, ".page.test.tsx"), vn = (t) => t.endsWith(".tsx") && !e.has(t) && !gn(t), yn = "virtual:voltro-route-refresh", bn = `\0${yn}`, xn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Sn = () => `
1070
1080
  // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1071
1081
 
1072
1082
  /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
@@ -1095,11 +1105,11 @@ const stableForm = (value) => {
1095
1105
  * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1096
1106
  * one of THESE cannot be hot-applied: the server already ran with the old
1097
1107
  * value. Everything else a page exports is plain client-side data. */
1098
- const serverRelevantExports = ${JSON.stringify(fn)}
1108
+ const serverRelevantExports = ${JSON.stringify(hn)}
1099
1109
 
1100
1110
  /** Name → the server step that already consumed it, so the reload message can
1101
1111
  * say WHY rather than just WHAT. Injected from the same single source. */
1102
- const serverExportEffect = ${JSON.stringify(dn)}
1112
+ const serverExportEffect = ${JSON.stringify(mn)}
1103
1113
 
1104
1114
  /** The reason \`name\` forces a reload, for the console line. */
1105
1115
  export const serverEffectOf = (name) =>
@@ -1142,7 +1152,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
1142
1152
  const previousHook = globalThis.__getReactRefreshIgnoredExports
1143
1153
  globalThis.__getReactRefreshIgnoredExports = (args) =>
1144
1154
  ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
1145
- `, _n = (e) => `
1155
+ `, Cn = (e) => `
1146
1156
  if (import.meta.hot) {
1147
1157
  // Self-import to read our OWN exports, the same technique the react plugin
1148
1158
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -1169,76 +1179,73 @@ import {
1169
1179
  registerRouteModule as __voltro_registerRouteModule,
1170
1180
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
1171
1181
  serverEffectOf as __voltro_serverEffect,
1172
- } from '${pn}'
1173
- `, vn = (e) => e.replace(/\\/g, "/"), yn = (e, t) => {
1174
- let [n = "", r] = vn(e).split("?");
1175
- if (!n.endsWith(".tsx") || r !== void 0 && hn.test(r)) return !1;
1176
- let i = vn(t).replace(/\/$/, "");
1177
- return n.startsWith(`${i}/`);
1178
- }, bn = (e, t, n) => yn(t, n) ? `${e}${_n(vn(t).split("?")[0] ?? t)}` : null, xn = (e) => ({
1182
+ } from '${yn}'
1183
+ `, wn = (e) => e.replace(/\\/g, "/"), Tn = (n, r) => {
1184
+ let [i = "", a] = wn(n).split("?");
1185
+ if (!i.endsWith(".tsx") || a !== void 0 && xn.test(a)) return !1;
1186
+ let o = wn(r).replace(/\/$/, "");
1187
+ return i.startsWith(`${o}/`) ? t.test(i) || e.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
1188
+ }, En = (e, t, n) => Tn(t, n) ? `${e}${Cn(wn(t).split("?")[0] ?? t)}` : null, Dn = (e) => ({
1179
1189
  name: "voltro:route-fast-refresh",
1180
1190
  enforce: "pre",
1181
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? mn : void 0,
1182
- load: (e) => e === mn ? gn() : void 0,
1191
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? bn : void 0,
1192
+ load: (e) => e === bn ? Sn() : void 0,
1183
1193
  transform: (t, n, r) => {
1184
1194
  if (r?.ssr === !0) return null;
1185
- let i = bn(t, n, e);
1195
+ let i = En(t, n, e);
1186
1196
  return i === null ? null : {
1187
1197
  code: i,
1188
1198
  map: null
1189
1199
  };
1190
1200
  }
1191
- }), Sn = [
1201
+ }), On = [
1192
1202
  "static",
1193
1203
  "spa",
1194
1204
  "ssr",
1195
1205
  "isr"
1196
- ], Cn = (e) => typeof e == "string" && Sn.includes(e), wn = Sn.map((e) => `'${e}'`).join(" | "), Tn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${wn}.${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)." : ""}`, En = class extends Error {
1206
+ ], kn = (e) => typeof e == "string" && On.includes(e), An = On.map((e) => `'${e}'`).join(" | "), jn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${An}.${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)." : ""}`, Mn = class extends Error {
1197
1207
  page;
1198
1208
  value;
1199
1209
  name = "InvalidRenderModeError";
1200
1210
  constructor(e, t) {
1201
- super(Tn(e, t)), this.page = e, this.value = t;
1211
+ super(jn(e, t)), this.page = e, this.value = t;
1202
1212
  }
1203
- }, Dn = (e, t = "<page>") => {
1213
+ }, Nn = (e, t = "<page>") => {
1204
1214
  if (e.renderMode !== void 0 && e.renderMode !== null) {
1205
- if (!Cn(e.renderMode)) throw new En(t, String(e.renderMode));
1215
+ if (!kn(e.renderMode)) throw new Mn(t, String(e.renderMode));
1206
1216
  return e.renderMode;
1207
1217
  }
1208
1218
  return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
1209
- }, On = (e, t = "<page>") => ({
1210
- renderMode: Dn(e, t),
1219
+ }, Pn = (e, t = "<page>") => ({
1220
+ renderMode: Nn(e, t),
1211
1221
  tenantAware: e.tenantAware === !0,
1212
- revalidateMs: K(e.revalidate),
1213
- staleWhileRevalidateMs: K(e.staleWhileRevalidate) ?? 0,
1222
+ revalidateMs: J(e.revalidate),
1223
+ staleWhileRevalidateMs: J(e.staleWhileRevalidate) ?? 0,
1214
1224
  cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
1215
1225
  interactive: e.interactive ?? "full",
1216
1226
  hasLoader: typeof e.loader == "function",
1217
1227
  hasMeta: e.meta != null,
1218
1228
  hasGetStaticPaths: typeof e.getStaticPaths == "function"
1219
- }), kn = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, An = (e) => kn.exec(e)?.[1] ?? null, jn = async (e, t) => {
1229
+ }), Fn = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, In = (e) => Fn.exec(e)?.[1] ?? null, Ln = /export\s+default\b|export\s*\{[^}]*\bas\s+default\b/, Rn = async (e, t) => {
1220
1230
  let n = (await Promise.all(t.map(async (t) => {
1221
1231
  let n;
1222
1232
  try {
1223
- n = await fe(l(e, t.file), "utf8");
1233
+ n = await me(f(e, t.file), "utf8");
1224
1234
  } catch {
1225
1235
  return null;
1226
1236
  }
1227
- let r = An(n);
1228
- return r === null || Cn(r) ? null : {
1229
- file: t.file,
1230
- value: r
1231
- };
1237
+ let r = In(n);
1238
+ return r !== null && !kn(r) ? jn(f("src", "pages", t.file), r) : Ln.test(n) ? null : `${f("src", "pages", t.file)} is a route (it ends in .page.tsx) 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 — if this file is NOT a route —\n drop the .page suffix. Anything under src/pages/ without it is ordinary code and may\n live beside the page that uses it.`;
1232
1239
  }))).filter((e) => e !== null);
1233
- if (n.length !== 0) throw Error(n.map((e) => Tn(l("src", "pages", e.file), e.value)).join("\n\n"));
1234
- }, Mn = l(R(), ".voltro"), Nn = l(Mn, "runtime-registry.json"), Pn = 3e4, Fn = () => {
1240
+ if (n.length !== 0) throw Error(n.join("\n\n"));
1241
+ }, zn = f(ie(), ".voltro"), Bn = f(zn, "runtime-registry.json"), Vn = 3e4, Hn = () => {
1235
1242
  let e = Math.random().toString(36).slice(2, 10);
1236
- return `${Nn}.${process.pid}.${Date.now()}.${e}.tmp`;
1237
- }, In = async () => {
1238
- await O.mkdir(Mn, { recursive: !0 });
1239
- }, Ln = async () => {
1243
+ return `${Bn}.${process.pid}.${Date.now()}.${e}.tmp`;
1244
+ }, Un = async () => {
1245
+ await j.mkdir(zn, { recursive: !0 });
1246
+ }, Wn = async () => {
1240
1247
  try {
1241
- let e = await O.readFile(Nn, "utf8"), t = JSON.parse(e);
1248
+ let e = await j.readFile(Bn, "utf8"), t = JSON.parse(e);
1242
1249
  return t.version !== 1 || !Array.isArray(t.apps) ? {
1243
1250
  version: 1,
1244
1251
  apps: []
@@ -1249,34 +1256,34 @@ import {
1249
1256
  apps: []
1250
1257
  };
1251
1258
  }
1252
- }, Rn = async (e) => {
1253
- await In();
1254
- let t = Fn();
1259
+ }, Gn = async (e) => {
1260
+ await Un();
1261
+ let t = Hn();
1255
1262
  try {
1256
- await O.writeFile(t, JSON.stringify(e, null, 2), {
1263
+ await j.writeFile(t, JSON.stringify(e, null, 2), {
1257
1264
  encoding: "utf8",
1258
1265
  mode: 384
1259
- }), await O.rename(t, Nn), await O.chmod(Nn, 384).catch(() => {});
1266
+ }), await j.rename(t, Bn), await j.chmod(Bn, 384).catch(() => {});
1260
1267
  } catch (e) {
1261
1268
  try {
1262
- await O.unlink(t);
1269
+ await j.unlink(t);
1263
1270
  } catch {}
1264
1271
  throw e;
1265
1272
  }
1266
- }, zn = (e) => {
1273
+ }, Kn = (e) => {
1267
1274
  try {
1268
1275
  return process.kill(e, 0), !0;
1269
1276
  } catch {
1270
1277
  return !1;
1271
1278
  }
1272
- }, Bn = (e) => {
1279
+ }, qn = (e) => {
1273
1280
  let t = Date.now();
1274
- return e.filter((e) => zn(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Pn : !1);
1275
- }, Vn = async () => {
1276
- let e = await Ln(), t = Bn(e.apps);
1281
+ return e.filter((e) => Kn(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Vn : !1);
1282
+ }, Jn = async () => {
1283
+ let e = await Wn(), t = qn(e.apps);
1277
1284
  if (t.length === e.apps.length) return e;
1278
1285
  try {
1279
- await Rn({
1286
+ await Gn({
1280
1287
  version: 1,
1281
1288
  apps: t
1282
1289
  });
@@ -1285,49 +1292,49 @@ import {
1285
1292
  version: 1,
1286
1293
  apps: t
1287
1294
  };
1288
- }, Hn = async (e) => {
1289
- let t = await Ln(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
1295
+ }, Yn = async (e) => {
1296
+ let t = await Wn(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
1290
1297
  ...e,
1291
1298
  ...i !== void 0 && i !== "" ? { inspectToken: i } : {},
1292
1299
  registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
1293
1300
  heartbeatAt: n
1294
1301
  };
1295
- await Rn({
1302
+ await Gn({
1296
1303
  version: 1,
1297
1304
  apps: r >= 0 ? t.apps.map((e, t) => t === r ? a : e) : [...t.apps, a]
1298
1305
  });
1299
- }, Un = async (e) => {
1306
+ }, Xn = async (e) => {
1300
1307
  try {
1301
- let t = await Ln(), n = t.apps.filter((t) => t.id !== e);
1308
+ let t = await Wn(), n = t.apps.filter((t) => t.id !== e);
1302
1309
  if (n.length === t.apps.length) return;
1303
- await Rn({
1310
+ await Gn({
1304
1311
  version: 1,
1305
1312
  apps: n
1306
1313
  });
1307
1314
  } catch {}
1308
- }, Wn = (e, t, n) => `${e}:${t}:${n}`, Y = l(R(), ".voltro", "logs"), Gn = () => {
1315
+ }, Zn = (e, t, n) => `${e}:${t}:${n}`, X = f(ie(), ".voltro", "logs"), Qn = () => {
1309
1316
  let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
1310
1317
  return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
1311
- }, Kn = !1, qn = () => {
1312
- if (Kn) return;
1313
- Kn = !0;
1314
- let e = Date.now() - Gn(), t = [];
1318
+ }, $n = !1, er = () => {
1319
+ if ($n) return;
1320
+ $n = !0;
1321
+ let e = Date.now() - Qn(), t = [];
1315
1322
  try {
1316
- t = A(Y);
1323
+ t = N(X);
1317
1324
  } catch {
1318
1325
  return;
1319
1326
  }
1320
1327
  for (let n of t) {
1321
1328
  if (!n.endsWith(".log")) continue;
1322
- let t = l(Y, n);
1329
+ let t = f(X, n);
1323
1330
  try {
1324
- j(t).mtimeMs < e && M(t);
1331
+ P(t).mtimeMs < e && ee(t);
1325
1332
  } catch {}
1326
1333
  }
1327
- }, Jn = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), Yn = (e, t) => l(Y, `${Jn(e)}-${t}.log`), Xn = (e) => {
1328
- let t = Jn(e), n = [];
1334
+ }, tr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), nr = (e, t) => f(X, `${tr(e)}-${t}.log`), rr = (e) => {
1335
+ let t = tr(e), n = [];
1329
1336
  try {
1330
- n = A(Y);
1337
+ n = N(X);
1331
1338
  } catch {
1332
1339
  return;
1333
1340
  }
@@ -1335,19 +1342,19 @@ import {
1335
1342
  if (r.length === 0) return;
1336
1343
  let i, a = -1;
1337
1344
  for (let e of r) {
1338
- let t = l(Y, e);
1345
+ let t = f(X, e);
1339
1346
  try {
1340
- let e = j(t);
1347
+ let e = P(t);
1341
1348
  e.mtimeMs > a && (a = e.mtimeMs, i = t);
1342
1349
  } catch {}
1343
1350
  }
1344
1351
  return i;
1345
- }, Zn = (e) => {
1352
+ }, ir = (e) => {
1346
1353
  try {
1347
- E(Y, { recursive: !0 });
1354
+ k(X, { recursive: !0 });
1348
1355
  } catch {}
1349
- qn();
1350
- let t = Yn(e, process.pid), n = D(t, "w"), r = (e) => {
1356
+ er();
1357
+ let t = nr(e, process.pid), n = A(t, "w"), r = (e) => {
1351
1358
  let t = {
1352
1359
  ts: e.ts.getTime(),
1353
1360
  level: e.level,
@@ -1368,15 +1375,15 @@ import {
1368
1375
  ...e.scope === void 0 ? {} : { scope: e.scope }
1369
1376
  }) + "\n";
1370
1377
  }
1371
- }, i = !1, a = x((e) => {
1378
+ }, i = !1, a = w((e) => {
1372
1379
  if (!i) try {
1373
- ee(n, r(e));
1380
+ I(n, r(e));
1374
1381
  } catch {}
1375
1382
  }), o = () => {
1376
1383
  if (!i) {
1377
1384
  i = !0;
1378
1385
  try {
1379
- w(n);
1386
+ D(n);
1380
1387
  } catch {}
1381
1388
  }
1382
1389
  };
@@ -1388,10 +1395,10 @@ import {
1388
1395
  a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
1389
1396
  }
1390
1397
  };
1391
- }, Qn = async (e, t) => {
1398
+ }, ar = async (e, t) => {
1392
1399
  let n;
1393
1400
  try {
1394
- n = await O.readFile(e, "utf8");
1401
+ n = await j.readFile(e, "utf8");
1395
1402
  } catch {
1396
1403
  return [];
1397
1404
  }
@@ -1402,78 +1409,78 @@ import {
1402
1409
  i.push(t);
1403
1410
  } catch {}
1404
1411
  return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
1405
- }, $n = S({ scope: "voltro:dashboard" }), er = L(import.meta.url), tr = 5179, nr = (e) => {
1412
+ }, or = T({ scope: "voltro:dashboard" }), sr = re(import.meta.url), cr = 5179, lr = (e) => {
1406
1413
  let t = process.env.VOLTRO_DASHBOARD_PATH;
1407
- if (t && T(l(d(t), "app.config.ts"))) return d(t);
1414
+ if (t && O(f(m(t), "app.config.ts"))) return m(t);
1408
1415
  try {
1409
- let e = s(er.resolve("@voltro/dashboard/package.json"));
1410
- if (T(l(e, "app.config.ts"))) return e;
1416
+ let e = u(sr.resolve("@voltro/dashboard/package.json"));
1417
+ if (O(f(e, "app.config.ts"))) return e;
1411
1418
  } catch {}
1412
- let n = l("voltro-devtools", "apps", "dashboard"), r = d(e);
1419
+ let n = f("voltro-devtools", "apps", "dashboard"), r = m(e);
1413
1420
  for (let e = 0; e < 10; e++) {
1414
- let e = l(r, n);
1415
- if (T(l(e, "app.config.ts"))) return e;
1416
- let t = s(r);
1421
+ let e = f(r, n);
1422
+ if (O(f(e, "app.config.ts"))) return e;
1423
+ let t = u(r);
1417
1424
  if (t === r) break;
1418
1425
  r = t;
1419
1426
  }
1420
1427
  return null;
1421
- }, rr = "VOLTRO_IS_DASHBOARD", ir = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1422
- let i = he({
1428
+ }, ur = "VOLTRO_IS_DASHBOARD", dr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1429
+ let i = _e({
1423
1430
  port: e,
1424
1431
  host: t
1425
1432
  }), a = !1, o = (e) => {
1426
1433
  a || (a = !0, i.destroy(), r(e));
1427
1434
  };
1428
1435
  i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
1429
- }), ar = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), or = () => process.env[rr] === "1", sr = () => process.stdout.isTTY === !0, X = l(R(), ".voltro", "dashboard-launch.lock"), cr = 1e4, lr = async () => {
1436
+ }), fr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), pr = () => process.env[ur] === "1", mr = () => process.stdout.isTTY === !0, hr = f(ie(), ".voltro", "dashboard-launch.lock"), gr = 1e4, _r = async () => {
1430
1437
  try {
1431
- await O.mkdir(s(X), { recursive: !0 });
1432
- let e = await O.open(X, "wx");
1438
+ await j.mkdir(u(hr), { recursive: !0 });
1439
+ let e = await j.open(hr, "wx");
1433
1440
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
1434
1441
  } catch {
1435
1442
  try {
1436
- let e = await O.stat(X);
1437
- if (Date.now() - e.mtimeMs > cr) return await O.unlink(X).catch(() => void 0), lr();
1443
+ let e = await j.stat(hr);
1444
+ if (Date.now() - e.mtimeMs > gr) return await j.unlink(hr).catch(() => void 0), _r();
1438
1445
  } catch {}
1439
1446
  return !1;
1440
1447
  }
1441
- }, ur = async () => {
1448
+ }, vr = async () => {
1442
1449
  try {
1443
- await O.unlink(X);
1450
+ await j.unlink(hr);
1444
1451
  } catch {}
1445
- }, dr = async (e) => {
1452
+ }, yr = async (e) => {
1446
1453
  let t = e.port ?? 5179;
1447
- if (ar()) return {
1454
+ if (fr()) return {
1448
1455
  status: "skipped",
1449
1456
  reason: "disabled by flag/env",
1450
1457
  port: t
1451
1458
  };
1452
- if (or()) return {
1459
+ if (pr()) return {
1453
1460
  status: "skipped",
1454
1461
  reason: "this process IS the dashboard",
1455
1462
  port: t
1456
1463
  };
1457
- if (!sr()) return {
1464
+ if (!mr()) return {
1458
1465
  status: "skipped",
1459
1466
  reason: "stdout is not a TTY (CI/smoke)",
1460
1467
  port: t
1461
1468
  };
1462
- if (!await lr()) return {
1469
+ if (!await _r()) return {
1463
1470
  status: "skipped",
1464
1471
  reason: "another voltro process is currently launching the dashboard",
1465
1472
  port: t
1466
1473
  };
1467
- if (await ir(t)) return await ur(), {
1474
+ if (await dr(t)) return await vr(), {
1468
1475
  status: "already-running",
1469
1476
  port: t
1470
1477
  };
1471
1478
  let n = e.voltroBin;
1472
1479
  if (!n) {
1473
1480
  let e = process.argv[1];
1474
- n = e && e.endsWith("/src/bin.ts") ? l(s(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1481
+ n = e && e.endsWith("/src/bin.ts") ? f(u(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1475
1482
  }
1476
- let r = T(l(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = me(process.execPath, [
1483
+ let r = O(f(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = ge(process.execPath, [
1477
1484
  n,
1478
1485
  i,
1479
1486
  e.dashboardAppPath
@@ -1481,7 +1488,7 @@ import {
1481
1488
  stdio: "ignore",
1482
1489
  env: {
1483
1490
  ...process.env,
1484
- [rr]: "1",
1491
+ [ur]: "1",
1485
1492
  VOLTRO_DASHBOARD_PORT: String(t)
1486
1493
  }
1487
1494
  });
@@ -1489,22 +1496,22 @@ import {
1489
1496
  if (a.exitCode === null && a.signalCode === null) try {
1490
1497
  a.kill("SIGTERM");
1491
1498
  } catch {}
1492
- }), $n.info(`auto-launching dashboard at http://localhost:${t}`, {
1499
+ }), or.info(`auto-launching dashboard at http://localhost:${t}`, {
1493
1500
  port: t,
1494
1501
  mode: i,
1495
1502
  prebuilt: r
1496
- }), r || $n.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), $n.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1497
- ur();
1503
+ }), r || or.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), or.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1504
+ vr();
1498
1505
  }, 4e3).unref(), {
1499
1506
  status: "launched",
1500
1507
  port: t
1501
1508
  };
1502
- }, fr = class extends Error {
1509
+ }, br = class extends Error {
1503
1510
  _voltroDeferral = !0;
1504
1511
  constructor(e) {
1505
1512
  super(e), this.name = "DeferralNotSupportedError";
1506
1513
  }
1507
- }, pr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, mr = (e) => {
1514
+ }, xr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Sr = (e) => {
1508
1515
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
1509
1516
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
1510
1517
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -1519,7 +1526,7 @@ import {
1519
1526
  ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
1520
1527
  });
1521
1528
  } catch (e) {
1522
- throw new fr(e instanceof Error ? e.message : String(e));
1529
+ throw new br(e instanceof Error ? e.message : String(e));
1523
1530
  }
1524
1531
  return {
1525
1532
  loaderData: n.renderData,
@@ -1535,8 +1542,8 @@ import {
1535
1542
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
1536
1543
  }
1537
1544
  };
1538
- }, hr = (e) => {
1539
- let { helpers: t, renderInput: n } = e, r = mr({
1545
+ }, Cr = (e) => {
1546
+ let { helpers: t, renderInput: n } = e, r = Sr({
1540
1547
  helpers: t,
1541
1548
  page: e.page,
1542
1549
  pathname: n.pathname,
@@ -1557,42 +1564,42 @@ import {
1557
1564
  stateScript: t.renderRouterStateScript(r.stateInput),
1558
1565
  hasDeferred: r.hasDeferred
1559
1566
  };
1560
- }, gr = (e) => {
1567
+ }, wr = (e) => {
1561
1568
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
1562
1569
  return {
1563
1570
  body: t,
1564
1571
  meta: n
1565
1572
  };
1566
- }, _r = (e) => [
1573
+ }, Tr = (e) => [
1567
1574
  ...e.extra ?? [],
1568
1575
  e.helpers.renderMetaToHtml(e.meta),
1569
1576
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
1570
1577
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
1571
1578
  e.prepared.stateScript
1572
- ].filter((e) => e.length > 0).join("\n "), vr = "<div id=\"root\"></div>", yr = "<div id=\"root\">", br = "</div>", xr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Sr = /\bsrc=["']([^"']+)["']/i, Cr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, wr = (e) => {
1573
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(xr, (e) => {
1574
- let r = Sr.exec(e)?.[1];
1579
+ ].filter((e) => e.length > 0).join("\n "), Er = "<div id=\"root\"></div>", Dr = "<div id=\"root\">", Or = "</div>", kr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Ar = /\bsrc=["']([^"']+)["']/i, jr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Mr = (e) => {
1580
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(kr, (e) => {
1581
+ let r = Ar.exec(e)?.[1];
1575
1582
  return r === void 0 || t(r) ? e : (n.push(r), "");
1576
1583
  });
1577
- e.inlineModuleScriptsAsync && (r = r.replace(Cr, "<script async$1>"));
1578
- let i = r.indexOf(vr);
1579
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${vr}\` 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.`);
1584
+ e.inlineModuleScriptsAsync && (r = r.replace(jr, "<script async$1>"));
1585
+ let i = r.indexOf(Er);
1586
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Er}\` 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.`);
1580
1587
  return {
1581
- head: `${r.slice(0, i)}${yr}`,
1582
- tail: `${br}${r.slice(i + 21)}`,
1588
+ head: `${r.slice(0, i)}${Dr}`,
1589
+ tail: `${Or}${r.slice(i + 21)}`,
1583
1590
  bootstrapModules: n
1584
1591
  };
1585
- }, Tr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Er = (e) => {
1592
+ }, Nr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Pr = (e) => {
1586
1593
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
1587
1594
  if (s || !o || a === null) return;
1588
1595
  s = !0, t.statusCode = e.statusCode ?? 200;
1589
1596
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
1590
- t.flushHeaders?.(), t.write(Tr({
1597
+ t.flushHeaders?.(), t.write(Nr({
1591
1598
  head: n.head,
1592
1599
  headInjection: i(a.meta),
1593
1600
  htmlLang: r
1594
1601
  }));
1595
- let c = new ge();
1602
+ let c = new ve();
1596
1603
  c.pipe(t, { end: !1 }), c.on("end", () => {
1597
1604
  t.end(n.tail);
1598
1605
  }), a.stream.pipe(c);
@@ -1617,23 +1624,23 @@ import {
1617
1624
  return;
1618
1625
  }
1619
1626
  c();
1620
- }, Z = S({ scope: "voltro:dev:web" }), Dr = S({ scope: "vite" }), Or = await (async () => {
1627
+ }, Z = T({ scope: "voltro:dev:web" }), Fr = T({ scope: "vite" }), Ir = await (async () => {
1621
1628
  try {
1622
- let e = l(s(f(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
1629
+ let e = f(u(h(import.meta.url)), "..", "package.json"), t = await j.readFile(e, "utf8");
1623
1630
  return JSON.parse(t).version ?? "0.0.0";
1624
1631
  } catch {
1625
1632
  return "0.0.0";
1626
1633
  }
1627
- })(), kr = async () => {
1634
+ })(), Lr = async () => {
1628
1635
  try {
1629
- let e = s(f(import.meta.url)), t = d(e, "..", "..", "devtools");
1630
- if (T(l(t, "package.json"))) return t;
1631
- let n = d(e, "..", "..", "..", "devtools");
1632
- return T(l(n, "package.json")) ? n : null;
1636
+ let e = u(h(import.meta.url)), t = m(e, "..", "..", "devtools");
1637
+ if (O(f(t, "package.json"))) return t;
1638
+ let n = m(e, "..", "..", "..", "devtools");
1639
+ return O(f(n, "package.json")) ? n : null;
1633
1640
  } catch {
1634
1641
  return null;
1635
1642
  }
1636
- }, Ar = (e, t) => e.disableDevtools || !t ? [] : [
1643
+ }, Rr = (e, t) => e.disableDevtools || !t ? [] : [
1637
1644
  "",
1638
1645
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
1639
1646
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -1643,82 +1650,87 @@ import {
1643
1650
  " await import('@voltro/devtools/styles.css')",
1644
1651
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
1645
1652
  "}"
1646
- ], jr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Mr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Nr = (e) => e.sentry ? [
1653
+ ], zr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Br = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Vr = (e) => e.sentry ? [
1647
1654
  "",
1648
1655
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
1649
1656
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
1650
1657
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
1651
- ] : [], Pr = (e) => e.env ? ["import './env.public'"] : [], Fr = (e) => {
1652
- let t = [], n = d(e);
1658
+ ] : [], Hr = (e) => e.env ? ["import './env.public'"] : [], Ur = (e) => {
1659
+ let t = [], n = m(e);
1653
1660
  for (;;) {
1654
- T(l(n, "pnpm-workspace.yaml")) && t.push(n);
1655
- let e = s(n);
1661
+ O(f(n, "pnpm-workspace.yaml")) && t.push(n);
1662
+ let e = u(n);
1656
1663
  if (e === n) break;
1657
1664
  n = e;
1658
1665
  }
1659
1666
  return t;
1660
- }, Ir = /* @__PURE__ */ new Set([
1661
- "layout.tsx",
1662
- "error.tsx",
1663
- "loading.tsx",
1664
- "not-found.tsx"
1665
- ]), Lr = (e) => /\.(test|spec)\.tsx$/.test(e), Rr = (e) => {
1667
+ }, Wr = gn, Gr = (e) => {
1666
1668
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
1667
1669
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
1668
1670
  if (t) return `island-${t[1]}`;
1669
- }, zr = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Br = (e) => e.startsWith("(") && e.endsWith(")"), Vr = (e) => e.filter((e) => !Br(e)), Hr = (e) => {
1670
- let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !Br(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
1671
- return n.length === 0 ? "/" : "/" + n.join("/");
1672
- }, Ur = (e) => `${e.replace(/\.tsx$/, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, 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) => {
1673
- let t = [], n = [], r = async (e, i) => {
1674
- let a = [];
1671
+ }, Kr = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, qr = (e) => e.startsWith("(") && e.endsWith(")"), Jr = (e) => e.filter((e) => !qr(e)), Yr = (e) => {
1672
+ let n = e.replace(t, "").split("/").filter(Boolean).filter((e) => !qr(e)), r = n.length > 0 && n[n.length - 1] === "index" ? n.slice(0, -1) : n;
1673
+ return r.length === 0 ? "/" : "/" + r.join("/");
1674
+ }, Xr = (e) => `${e.replace(t, "").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 (n) => {
1675
+ let r = [], i = [], a = async (n, o) => {
1676
+ let s = [];
1675
1677
  try {
1676
- a = await O.readdir(e, { withFileTypes: !0 });
1678
+ s = await j.readdir(n, { withFileTypes: !0 });
1677
1679
  } catch {
1678
1680
  return;
1679
1681
  }
1680
- let o = a.filter((e) => e.isDirectory()).map((e) => e.name).sort(), s = a.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Lr(e.name)).map((e) => e.name).sort(), c = new Set(s), u = i.join("/");
1681
- if (s.some((e) => Ir.has(e))) {
1682
- let t = c.has("layout.tsx"), r = !1;
1682
+ let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Wr(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1683
+ if (l.some((t) => e.has(t))) {
1684
+ let t = u.has("layout.tsx"), r = !1;
1683
1685
  if (t) try {
1684
- let t = await O.readFile(l(e, "layout.tsx"), "utf8");
1685
- r = zr.test(t);
1686
+ let e = await j.readFile(f(n, "layout.tsx"), "utf8");
1687
+ r = Kr.test(e);
1686
1688
  } catch {}
1687
- n.push({
1688
- dir: u,
1689
- chain: i,
1690
- contributesToUrl: i.length === 0 || !Br(i[i.length - 1]),
1689
+ i.push({
1690
+ dir: d,
1691
+ chain: o,
1692
+ contributesToUrl: o.length === 0 || !qr(o[o.length - 1]),
1691
1693
  hasLayout: t,
1692
1694
  hasLayoutLoader: r,
1693
- hasError: c.has("error.tsx"),
1694
- hasPending: c.has("loading.tsx"),
1695
- hasNotFound: c.has("not-found.tsx")
1695
+ hasError: u.has("error.tsx"),
1696
+ hasPending: u.has("loading.tsx"),
1697
+ hasNotFound: u.has("not-found.tsx"),
1698
+ specialFiles: l.filter((t) => e.has(t))
1696
1699
  });
1697
1700
  }
1698
- for (let e of s) {
1699
- if (Ir.has(e)) continue;
1700
- let n = u ? `${u}/${e}` : e;
1701
- t.push({
1701
+ for (let e of l) {
1702
+ if (!t.test(e)) continue;
1703
+ let n = d ? `${d}/${e}` : e;
1704
+ r.push({
1702
1705
  file: n,
1703
- pattern: Hr(n),
1704
- ident: Ur(n),
1705
- dirChain: i
1706
+ pattern: Yr(n),
1707
+ ident: Xr(n),
1708
+ dirChain: o
1706
1709
  });
1707
1710
  }
1708
- for (let t of o) await r(l(e, t), [...i, t]);
1711
+ for (let e of c) await a(f(n, e), [...o, e]);
1709
1712
  };
1710
- return await r(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1), {
1711
- pages: t,
1712
- dirs: n
1713
+ await a(n, []), r.sort((e, t) => e.file < t.file ? -1 : 1);
1714
+ let o = /* @__PURE__ */ new Set();
1715
+ for (let e of r) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
1716
+ let s = [], c = [];
1717
+ for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
1718
+ dir: t.dir,
1719
+ files: e
1720
+ });
1721
+ return {
1722
+ pages: r,
1723
+ dirs: s,
1724
+ orphanedSpecials: c
1713
1725
  };
1714
- }, Wr = (e, t) => {
1726
+ }, Zr = (e, t) => {
1715
1727
  let n = [];
1716
1728
  for (let r = 0; r <= t.length; r++) {
1717
1729
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
1718
1730
  a && n.push(a);
1719
1731
  }
1720
1732
  return n;
1721
- }, Gr = async (e) => {
1733
+ }, Qr = async (e) => {
1722
1734
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
1723
1735
  return {
1724
1736
  chain: await Promise.all(t.map(async (e, t) => {
@@ -1740,10 +1752,10 @@ import {
1740
1752
  })),
1741
1753
  segmentLoaderData: o
1742
1754
  };
1743
- }, Kr = (e) => {
1744
- let t = Vr(e);
1755
+ }, $r = (e) => {
1756
+ let t = Jr(e);
1745
1757
  return t.length === 0 ? "" : "/" + t.join("/");
1746
- }, qr = [
1758
+ }, ei = [
1747
1759
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
1748
1760
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
1749
1761
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -1836,7 +1848,7 @@ import {
1836
1848
  " _vdtErrorStart('Build error')",
1837
1849
  " })",
1838
1850
  "}"
1839
- ].join("\n"), Jr = (e) => {
1851
+ ].join("\n"), ti = (e) => {
1840
1852
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
1841
1853
  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, "\\$&"));
1842
1854
  let a = i.join("/");
@@ -1845,8 +1857,8 @@ import {
1845
1857
  paramNames: t,
1846
1858
  priority: n
1847
1859
  };
1848
- }, Yr = (e) => e.map((e) => {
1849
- let { regex: t, paramNames: n, priority: r } = Jr(e.pattern);
1860
+ }, ni = (e) => e.map((e) => {
1861
+ let { regex: t, paramNames: n, priority: r } = ti(e.pattern);
1850
1862
  return {
1851
1863
  pattern: e.pattern,
1852
1864
  file: e.file,
@@ -1855,7 +1867,7 @@ import {
1855
1867
  paramNames: n,
1856
1868
  priority: r
1857
1869
  };
1858
- }).slice().sort((e, t) => e.priority - t.priority), Xr = (e, t) => {
1870
+ }).slice().sort((e, t) => e.priority - t.priority), ri = (e, t) => {
1859
1871
  for (let n of t) {
1860
1872
  let t = n.regex.exec(e);
1861
1873
  if (!t) continue;
@@ -1867,30 +1879,30 @@ import {
1867
1879
  };
1868
1880
  }
1869
1881
  return null;
1870
- }, Zr = async (e, t) => {
1882
+ }, ii = async (e, t) => {
1871
1883
  let n = e;
1872
1884
  for (;;) {
1873
- let e = l(n, "node_modules", t);
1885
+ let e = f(n, "node_modules", t);
1874
1886
  try {
1875
- if ((await O.stat(e)).isDirectory()) {
1876
- let t = await O.realpath(e);
1887
+ if ((await j.stat(e)).isDirectory()) {
1888
+ let t = await j.realpath(e);
1877
1889
  return t.includes("/node_modules/") ? null : t;
1878
1890
  }
1879
1891
  } catch {}
1880
- let r = s(n);
1892
+ let r = u(n);
1881
1893
  if (r === n) return null;
1882
1894
  n = r;
1883
1895
  }
1884
- }, Qr = async (e) => {
1896
+ }, ai = async (e) => {
1885
1897
  try {
1886
- let t = await import(p(l(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;
1898
+ let t = await import(g(f(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;
1887
1899
  return a ? {
1888
1900
  port: r,
1889
1901
  wsPath: a
1890
1902
  } : { port: r };
1891
1903
  } catch {}
1892
1904
  return { port: 4e3 };
1893
- }, $r = (e, t) => ({
1905
+ }, oi = (e, t) => ({
1894
1906
  name: e,
1895
1907
  pkg: t.package,
1896
1908
  browserWsUrl: t.url,
@@ -1898,7 +1910,7 @@ import {
1898
1910
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
1899
1911
  ...t.headers ? { headers: t.headers } : {},
1900
1912
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1901
- }), ei = (e, t, n) => {
1913
+ }), si = (e, t, n) => {
1902
1914
  let r = t.transport?.wsPath ?? n.wsPath;
1903
1915
  return {
1904
1916
  name: e,
@@ -1910,7 +1922,7 @@ import {
1910
1922
  ...t.headers ? { headers: t.headers } : {},
1911
1923
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1912
1924
  };
1913
- }, ti = (e) => {
1925
+ }, ci = (e) => {
1914
1926
  let t = /* @__PURE__ */ new Map();
1915
1927
  for (let n of e) {
1916
1928
  if (n.proxyTarget === void 0) continue;
@@ -1918,43 +1930,43 @@ import {
1918
1930
  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>.`);
1919
1931
  t.set(n.browserWsUrl, n.name);
1920
1932
  }
1921
- }, ni = async (e, t) => {
1933
+ }, li = async (e, t) => {
1922
1934
  let n = Object.entries(t.apis ?? {}), r = [];
1923
1935
  for (let [t, i] of n) {
1924
1936
  if (i.url) {
1925
- r.push($r(t, i));
1937
+ r.push(oi(t, i));
1926
1938
  continue;
1927
1939
  }
1928
- let n = await Zr(e, i.package);
1940
+ let n = await ii(e, i.package);
1929
1941
  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.`);
1930
- r.push(ei(t, i, await Qr(n)));
1942
+ r.push(si(t, i, await ai(n)));
1931
1943
  }
1932
- return ti(r), r;
1933
- }, ri = (e) => {
1944
+ return ci(r), r;
1945
+ }, ui = (e) => {
1934
1946
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
1935
1947
  let t = new URL(e);
1936
1948
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
1937
1949
  } catch {
1938
1950
  return;
1939
1951
  }
1940
- }, ii = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, ai = (e) => process.env[ii(e)] ?? process.env.VOLTRO_API_ORIGIN, oi = (e, t) => {
1952
+ }, di = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, fi = (e) => process.env[di(e)] ?? process.env.VOLTRO_API_ORIGIN, pi = (e, t) => {
1941
1953
  if (!e) return;
1942
- let n = ai(e.name) ?? e.serverOrigin;
1954
+ let n = fi(e.name) ?? e.serverOrigin;
1943
1955
  if (n) {
1944
- let e = ri(n);
1956
+ let e = ui(n);
1945
1957
  if (e) return e;
1946
1958
  }
1947
1959
  if (t?.allowDevProxy && e.proxyTarget) {
1948
- let t = ri(e.proxyTarget);
1960
+ let t = ui(e.proxyTarget);
1949
1961
  if (t) return t;
1950
1962
  }
1951
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return ri(e.browserWsUrl);
1952
- }, si = (e, t, n) => {
1963
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return ui(e.browserWsUrl);
1964
+ }, mi = (e, t, n) => {
1953
1965
  if (!e) {
1954
1966
  if (n?.apiName === void 0) return;
1955
1967
  let e = n.apiName;
1956
1968
  return async () => {
1957
- 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 ${ii(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.`);
1969
+ 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 ${di(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.`);
1958
1970
  };
1959
1971
  }
1960
1972
  return async (r, i) => {
@@ -1976,7 +1988,7 @@ import {
1976
1988
  });
1977
1989
  } catch (t) {
1978
1990
  let i = t?.cause?.code ?? String(t?.message ?? t);
1979
- throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${ii(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 });
1991
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${di(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 });
1980
1992
  }
1981
1993
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
1982
1994
  let s = await o.json();
@@ -1994,8 +2006,8 @@ import {
1994
2006
  }
1995
2007
  if (u) return l;
1996
2008
  };
1997
- }, ci = async (e, t, n, r = {}) => {
1998
- let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(l(e, "node_modules", "@voltro", "devtools", "package.json")) || await kr() !== null, s = t.theme === "system" ? [
2009
+ }, hi = async (e, t, n, r = {}) => {
2010
+ let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = O(f(e, "node_modules", "@voltro", "devtools", "package.json")) || await Lr() !== null, s = t.theme === "system" ? [
1999
2011
  " <script>",
2000
2012
  " (function () {",
2001
2013
  " var root = document.documentElement",
@@ -2033,34 +2045,35 @@ import {
2033
2045
  " </body>",
2034
2046
  "</html>",
2035
2047
  ""
2036
- ].join("\n"), u = l(e, "src", "pages"), { pages: d, dirs: f } = await $(u);
2037
- await jn(u, d);
2038
- let p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, h = n.map((e) => `import { appGroup as ${p(e.name)}, appDescriptors as ${m(e.name)} } from '${e.pkg}/rpcGroup'`);
2039
- n.some((e) => e.hasAuthHeaders) && (h.push("import __voltroAppConfig from '../app.config'"), h.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
2040
- let g = n.map((e) => {
2041
- let t = [`group: ${p(e.name)}`];
2042
- return t.push(`descriptors: ${m(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.hasAuthHeaders ? t.push(`headers: __voltroAuthHeaders?.[${JSON.stringify(e.name)}]?.authHeaders`) : e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
2043
- }), _, v, y;
2044
- if (d.length > 0) {
2045
- let e = d.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2046
- for (let e of f) {
2048
+ ].join("\n"), l = f(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: p } = await $(l);
2049
+ await Rn(l, u);
2050
+ for (let e of p) 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.`);
2051
+ 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'`);
2052
+ 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"));
2053
+ let _ = n.map((e) => {
2054
+ let t = [`group: ${m(e.name)}`];
2055
+ return t.push(`descriptors: ${h(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.hasAuthHeaders ? t.push(`headers: __voltroAuthHeaders?.[${JSON.stringify(e.name)}]?.authHeaders`) : e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
2056
+ }), v, y, b;
2057
+ if (u.length > 0) {
2058
+ let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2059
+ for (let e of d) {
2047
2060
  let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
2048
2061
  e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2049
2062
  }
2050
- let r = d.map((e) => {
2051
- let t = Wr(f, e.dirChain).map((e) => {
2063
+ let r = u.map((e) => {
2064
+ let t = Zr(d, e.dirChain).map((e) => {
2052
2065
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2053
2066
  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(", ")} }`;
2054
2067
  }).join(",\n");
2055
2068
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2056
- }), i = f.filter((e) => e.hasNotFound).map((e) => {
2057
- let t = Kr(e.chain), n = Wr(f, e.chain).map((e) => {
2069
+ }), i = d.filter((e) => e.hasNotFound).map((e) => {
2070
+ let t = $r(e.chain), n = Zr(d, e.chain).map((e) => {
2058
2071
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2059
2072
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2060
2073
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
2061
2074
  return ` {\n prefix: ${JSON.stringify(t)},\n Component: refs.notFounds[${JSON.stringify(e.dir)}],${r}\n },`;
2062
- }), a = [], s = [], c = [], l = [], u = [], p = [];
2063
- for (let e of f) {
2075
+ }), a = [], s = [], c = [], l = [], f = [], p = [];
2076
+ for (let e of d) {
2064
2077
  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`, o = JSON.stringify(e.dir);
2065
2078
  e.hasLayout && e.hasLayoutLoader ? (s.push(` ${o}: ${Q(e.dir, "Layout")}Mod.default,`), c.push(` ${o}: ${Q(e.dir, "Layout")}Mod.loader,`), a.push({
2066
2079
  relPath: t,
@@ -2074,7 +2087,7 @@ import {
2074
2087
  relPath: n,
2075
2088
  kind: "error",
2076
2089
  slotKey: e.dir
2077
- })), e.hasPending && (u.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
2090
+ })), e.hasPending && (f.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
2078
2091
  relPath: r,
2079
2092
  kind: "pending",
2080
2093
  slotKey: e.dir
@@ -2084,12 +2097,12 @@ import {
2084
2097
  slotKey: e.dir
2085
2098
  }));
2086
2099
  }
2087
- for (let e of d) a.push({
2100
+ for (let e of u) a.push({
2088
2101
  relPath: `../src/pages/${e.file}`,
2089
2102
  kind: "page",
2090
2103
  slotKey: e.pattern
2091
2104
  });
2092
- let m = a.map((e) => ` ${JSON.stringify(e.relPath)},`), b = a.map((e, t) => {
2105
+ let m = a.map((e) => ` ${JSON.stringify(e.relPath)},`), h = a.map((e, t) => {
2093
2106
  let n = JSON.stringify(e.slotKey);
2094
2107
  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 }`;
2095
2108
  }), x = t.locales ?? [], S = x.length > 0, C = t.defaultLocale ?? x[0] ?? "en";
@@ -2100,7 +2113,7 @@ import {
2100
2113
  "import { useServerRequest } from '@voltro/web'",
2101
2114
  ...x.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
2102
2115
  ] : [];
2103
- v = [
2116
+ y = [
2104
2117
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2105
2118
  "// Routes + per-page chain + not-found scopes assembled from src/pages/.",
2106
2119
  "//",
@@ -2143,7 +2156,7 @@ import {
2143
2156
  ...l,
2144
2157
  " },",
2145
2158
  " pendings: {",
2146
- ...u,
2159
+ ...f,
2147
2160
  " },",
2148
2161
  " notFounds: {",
2149
2162
  ...p,
@@ -2215,13 +2228,13 @@ import {
2215
2228
  " ],",
2216
2229
  " (newMods: Array<Record<string, unknown> | undefined>) => {",
2217
2230
  " let changed = false",
2218
- ...b,
2231
+ ...h,
2219
2232
  " if (changed) bump()",
2220
2233
  " },",
2221
2234
  " )",
2222
2235
  "}",
2223
2236
  ""
2224
- ].join("\n"), _ = [
2237
+ ].join("\n"), v = [
2225
2238
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2226
2239
  "// The app's root component. It exports `App` and NOTHING ELSE: react-refresh",
2227
2240
  "// only accepts a module whose every export is a component, and a module it",
@@ -2287,20 +2300,20 @@ import {
2287
2300
  ] : [" return <Router routes={routes} notFounds={notFounds} />"],
2288
2301
  "}",
2289
2302
  ""
2290
- ].join("\n"), y = [
2303
+ ].join("\n"), b = [
2291
2304
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2292
2305
  "// Entry: imports the generated App component and calls mount() with the",
2293
2306
  "// resolved apis map. Side-effect only — no local component definitions —",
2294
2307
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2295
2308
  "",
2296
- ...Pr(t),
2309
+ ...Hr(t),
2297
2310
  "import { mount } from '@voltro/web'",
2298
- ...h,
2311
+ ...g,
2299
2312
  "import { App } from './app'",
2300
2313
  "import { preloadCurrentRoute } from './routeTable'",
2301
- ...Mr(t),
2302
- ...Ar(t, o),
2303
- ...Nr(t),
2314
+ ...Br(t),
2315
+ ...Rr(t, o),
2316
+ ...Vr(t),
2304
2317
  "",
2305
2318
  "// Preload the current route's page chunk BEFORE hydration so the first",
2306
2319
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2315,50 +2328,56 @@ import {
2315
2328
  "",
2316
2329
  "mount(App, {",
2317
2330
  " apis: {",
2318
- ...g,
2331
+ ..._,
2319
2332
  " },",
2320
- ...jr(t, o),
2333
+ ...zr(t, o),
2321
2334
  "})",
2322
2335
  "",
2323
- qr
2336
+ ei
2324
2337
  ].join("\n");
2325
- } else _ = "", v = "", y = [
2338
+ } else v = "", y = "", b = [
2326
2339
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2327
2340
  "// The user's root component lives at ../src/App.tsx; this file imports it",
2328
2341
  "// and calls mount(). Side-effect only, no component definitions, so the",
2329
2342
  "// user's component file remains the Fast Refresh boundary.",
2330
2343
  "",
2331
- ...Pr(t),
2344
+ ...Hr(t),
2332
2345
  "import { mount } from '@voltro/web'",
2333
- ...h,
2346
+ ...g,
2334
2347
  "import App from '../src/App'",
2335
- ...Mr(t),
2336
- ...Ar(t, o),
2337
- ...Nr(t),
2348
+ ...Br(t),
2349
+ ...Rr(t, o),
2350
+ ...Vr(t),
2338
2351
  "",
2339
2352
  "mount(App, {",
2340
2353
  " apis: {",
2341
- ...g,
2354
+ ..._,
2342
2355
  " },",
2343
- ...jr(t, o),
2356
+ ...zr(t, o),
2344
2357
  "})",
2345
2358
  "",
2346
- qr
2359
+ ei
2347
2360
  ].join("\n");
2348
- let b = l(e, ".framework");
2349
- await O.mkdir(b, { recursive: !0 }), t.env ? await Ze(b, r) : await O.rm(l(b, "env.public.ts"), { force: !0 }), await O.writeFile(l(b, "index.html"), c, "utf8"), await O.writeFile(l(b, "main.tsx"), y, "utf8"), _ ? (await O.writeFile(l(b, "app.tsx"), _, "utf8"), await O.writeFile(l(b, "routeTable.ts"), v, "utf8")) : (await O.rm(l(b, "app.tsx"), { force: !0 }), await O.rm(l(b, "routeTable.ts"), { force: !0 }));
2350
- let x = l(e, ".gitignore"), S = "";
2361
+ let x = f(e, ".framework");
2362
+ await j.mkdir(x, { recursive: !0 }), t.env ? await Qe(x, r) : await j.rm(f(x, "env.public.ts"), { force: !0 }), await j.writeFile(f(x, "index.html"), c, "utf8"), await j.writeFile(f(x, "main.tsx"), b, "utf8"), v ? (await j.writeFile(f(x, "app.tsx"), v, "utf8"), await j.writeFile(f(x, "routeTable.ts"), y, "utf8")) : (await j.rm(f(x, "app.tsx"), { force: !0 }), await j.rm(f(x, "routeTable.ts"), { force: !0 }));
2363
+ let S = f(e, ".gitignore"), C = "";
2351
2364
  try {
2352
- S = await O.readFile(x, "utf8");
2365
+ C = await j.readFile(S, "utf8");
2353
2366
  } catch {}
2354
- let C = ["/.framework/"], w = S.split("\n").filter((e) => e.trim() !== "");
2355
- for (let e of C) w.includes(e) || w.push(e);
2356
- await O.writeFile(x, w.join("\n") + "\n", "utf8");
2357
- }, li = async (e, t) => {
2367
+ let w = ["/.framework/"], T = new Set(C.split("\n").map((e) => e.trim())), E = w.filter((e) => !T.has(e));
2368
+ if (E.length > 0) {
2369
+ let e = C === "" || C.endsWith("\n") ? "" : "\n";
2370
+ try {
2371
+ await j.appendFile(S, `${e}${E.join("\n")}\n`, "utf8");
2372
+ } catch (e) {
2373
+ Z.warn(`could not add ${E.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2374
+ }
2375
+ }
2376
+ }, gi = async (e, t) => {
2358
2377
  try {
2359
- let n = l(s(e), "project.json");
2360
- if (!T(n)) return;
2361
- let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2378
+ let n = f(u(e), "project.json");
2379
+ if (!O(n)) return;
2380
+ let r = await j.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2362
2381
  for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
2363
2382
  if (o.length === 0) return;
2364
2383
  Z.warn("sibling app(s) claim the same port — only one boots", {
@@ -2367,49 +2386,49 @@ import {
2367
2386
  projectJson: n
2368
2387
  });
2369
2388
  } catch {}
2370
- }, ui = (e) => l(e, ".framework", "dist", "server", "appConfig.js"), di = async (e) => {
2371
- let t = ui(e), n = T(t) ? t : l(e, "app.config.ts");
2389
+ }, _i = (e) => f(e, ".framework", "dist", "server", "appConfig.js"), vi = async (e) => {
2390
+ let t = _i(e), n = O(t) ? t : f(e, "app.config.ts");
2372
2391
  try {
2373
- let e = (await import(p(n).href)).default;
2392
+ let e = (await import(g(n).href)).default;
2374
2393
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
2375
2394
  } catch {
2376
2395
  return null;
2377
2396
  }
2378
- }, fi = async (s) => {
2379
- let c = await di(s);
2380
- if (!c) return {
2397
+ }, yi = async (e) => {
2398
+ let t = await vi(e);
2399
+ if (!t) return {
2381
2400
  ran: !1,
2382
2401
  exitCode: 0
2383
2402
  };
2384
- un();
2385
- let f = Nt();
2386
- Ut(f), Z.info("booting voltro dev (web)", { app: c.name ?? "(unnamed)" });
2387
- let p = await ni(s, c);
2388
- for (let e of p) Z.info("api wired", {
2403
+ pn();
2404
+ let n = It();
2405
+ Kt(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
2406
+ let u = await li(e, t);
2407
+ for (let e of u) Z.info("api wired", {
2389
2408
  name: e.name,
2390
2409
  pkg: e.pkg,
2391
2410
  ...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
2392
2411
  });
2393
- Be(s).then((e) => {
2412
+ Ve(e).then((e) => {
2394
2413
  for (let t of e.files) if (t.action === "created") {
2395
2414
  let e = t.path.split("/").pop() ?? t.path;
2396
2415
  Z.info(`${e} seeded`, { path: t.path });
2397
2416
  }
2398
2417
  }).catch(() => {});
2399
- let { resolved: m } = await Qe({
2400
- rawEnv: c.env,
2418
+ let { resolved: d } = await $e({
2419
+ rawEnv: t.env,
2401
2420
  appType: "web",
2402
- root: s,
2421
+ root: e,
2403
2422
  log: Z,
2404
2423
  generateTypes: !0
2405
- }), h = m.publicValues;
2406
- await ci(s, c, p, h), Z.debug("generated framework entry files", { files: [
2424
+ }), h = d.publicValues;
2425
+ await hi(e, t, u, h), Z.debug("generated framework entry files", { files: [
2407
2426
  "index.html",
2408
2427
  ".framework/main.tsx",
2409
- ...c.env ? [".framework/env.public.ts"] : []
2428
+ ...t.env ? [".framework/env.public.ts"] : []
2410
2429
  ] });
2411
- let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : c.port ?? 5173, _ = c.name ?? "unnamed", v = Wn("web", _, g), y = Zn(_);
2412
- await Hn({
2430
+ 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 = Zn("web", _, g), y = ir(_);
2431
+ await Yn({
2413
2432
  id: v,
2414
2433
  name: _,
2415
2434
  kind: "web",
@@ -2417,19 +2436,19 @@ import {
2417
2436
  pid: process.pid,
2418
2437
  status: "booting",
2419
2438
  logFile: y.path
2420
- }).catch(() => {}), await li(s, g);
2421
- let { pages: b, dirs: x } = await $(l(s, "src", "pages")), S = x.map((e) => ({
2439
+ }).catch(() => {}), await gi(e, g);
2440
+ let { pages: b, dirs: x } = await $(f(e, "src", "pages")), S = x.map((e) => ({
2422
2441
  dir: e.dir,
2423
2442
  hasLayout: e.hasLayout,
2424
2443
  hasError: e.hasError,
2425
2444
  hasPending: e.hasPending,
2426
2445
  hasNotFound: e.hasNotFound
2427
- })), w = await jt({
2428
- appRoot: s,
2446
+ })), C = await Pt({
2447
+ appRoot: e,
2429
2448
  pages: b
2430
2449
  });
2431
- w.wrote && Z.debug("routes codegen wrote", { path: u(s, w.path) });
2432
- let E = await Ge("vite", () => import("vite")), D = (await import("@vitejs/plugin-react")).default, k = (await import("@tailwindcss/vite")).default, A = l(s, ".framework"), j = l(s, "src"), M = /* @__PURE__ */ new Set([
2450
+ C.wrote && Z.debug("routes codegen wrote", { path: p(e, C.path) });
2451
+ let w = await Ke("vite", () => import("vite")), T = (await import("@vitejs/plugin-react")).default, D = (await import("@tailwindcss/vite")).default, k = f(e, ".framework"), A = f(e, "src"), M = /* @__PURE__ */ new Set([
2433
2452
  ".framework",
2434
2453
  "node_modules",
2435
2454
  "dist",
@@ -2439,211 +2458,211 @@ import {
2439
2458
  ".cache"
2440
2459
  ]), N = {
2441
2460
  name: "framework:watch-app-sources",
2442
- async configureServer(e) {
2461
+ async configureServer(t) {
2443
2462
  try {
2444
- let t = (await O.readdir(s, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
2445
- for (let n of t) e.watcher.add(l(s, n.name));
2446
- t.length === 0 && e.watcher.add(j);
2463
+ let n = (await j.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
2464
+ for (let r of n) t.watcher.add(f(e, r.name));
2465
+ n.length === 0 && t.watcher.add(A);
2447
2466
  } catch {
2448
- e.watcher.add(j);
2467
+ t.watcher.add(A);
2449
2468
  }
2450
2469
  try {
2451
- let t = await O.readFile(l(s, "package.json"), "utf8"), n = JSON.parse(t), r = Object.keys({
2452
- ...n.dependencies,
2453
- ...n.devDependencies
2470
+ let n = await j.readFile(f(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2471
+ ...r.dependencies,
2472
+ ...r.devDependencies
2454
2473
  });
2455
- await Promise.all(r.map(async (t) => {
2456
- let n = await Zr(s, t);
2457
- if (!n) return;
2458
- let r = l(n, "src");
2474
+ await Promise.all(i.map(async (n) => {
2475
+ let r = await ii(e, n);
2476
+ if (!r) return;
2477
+ let i = f(r, "src");
2459
2478
  try {
2460
- (await O.stat(r)).isDirectory() && e.watcher.add(r);
2479
+ (await j.stat(i)).isDirectory() && t.watcher.add(i);
2461
2480
  } catch {}
2462
2481
  }));
2463
2482
  } catch {}
2464
2483
  }
2465
- }, P = l(s, "src", "pages"), ee = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), F = (e) => e === P || e.startsWith(P + "/"), te = async (e) => {
2484
+ }, P = f(e, "src", "pages"), ee = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), F = (e) => e === P || e.startsWith(P + "/"), te = async (n) => {
2466
2485
  try {
2467
- let t = Date.now();
2468
- await ci(s, c, p, h);
2469
- let { pages: n } = await $(P);
2470
- await jt({
2471
- appRoot: s,
2472
- pages: n
2486
+ let r = Date.now();
2487
+ await hi(e, t, u, h);
2488
+ let { pages: i } = await $(P);
2489
+ await Pt({
2490
+ appRoot: e,
2491
+ pages: i
2473
2492
  }), Z.info("page tree regenerated", {
2474
- reason: e,
2475
- ms: Date.now() - t
2493
+ reason: n,
2494
+ ms: Date.now() - r
2476
2495
  });
2477
- } catch (t) {
2478
- Z.error("page tree regen failed", { reason: e }, t);
2496
+ } catch (e) {
2497
+ Z.error("page tree regen failed", { reason: n }, e);
2479
2498
  }
2480
2499
  }, I = {
2481
2500
  name: "framework:regenerate-on-page-tree-change",
2482
- configureServer(e) {
2483
- let t = null, n = [], r = (e) => {
2484
- n.push(e), t && clearTimeout(t), t = setTimeout(() => {
2485
- t = null;
2486
- let e = n.length === 1 ? n[0] : `${n.length} events (${n[0]}, …)`;
2487
- n.length = 0, te(e);
2501
+ configureServer(t) {
2502
+ let n = null, r = [], i = (e) => {
2503
+ r.push(e), n && clearTimeout(n), n = setTimeout(() => {
2504
+ n = null;
2505
+ let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
2506
+ r.length = 0, te(e);
2488
2507
  }, 50);
2489
2508
  };
2490
- e.watcher.on("add", (e) => {
2491
- ee(e) && r(`add ${u(s, e)}`);
2492
- }), e.watcher.on("unlink", (e) => {
2493
- ee(e) && r(`unlink ${u(s, e)}`);
2494
- }), e.watcher.on("addDir", (e) => {
2495
- F(e) && r(`addDir ${u(s, e)}`);
2496
- }), e.watcher.on("unlinkDir", (e) => {
2497
- F(e) && r(`unlinkDir ${u(s, e)}`);
2509
+ t.watcher.on("add", (t) => {
2510
+ ee(t) && i(`add ${p(e, t)}`);
2511
+ }), t.watcher.on("unlink", (t) => {
2512
+ ee(t) && i(`unlink ${p(e, t)}`);
2513
+ }), t.watcher.on("addDir", (t) => {
2514
+ F(t) && i(`addDir ${p(e, t)}`);
2515
+ }), t.watcher.on("unlinkDir", (t) => {
2516
+ F(t) && i(`unlinkDir ${p(e, t)}`);
2498
2517
  });
2499
2518
  }
2500
- }, L = l(s, "app.config.ts"), R = (e) => {
2501
- if (!se(e.env)) return "";
2519
+ }, L = f(e, "app.config.ts"), R = (e) => {
2520
+ if (!le(e.env)) return "";
2502
2521
  let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
2503
2522
  return `${String(e.env.publicPrefix)}|${t.join(",")}`;
2504
2523
  }, ne = (e, t) => {
2505
2524
  let n = [];
2506
2525
  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"), R(e) !== R(t) && n.push("env"), n;
2507
- }, re = c, ie = d(L), ae = {
2526
+ }, re = t, ie = m(L), ae = {
2508
2527
  name: "framework:watch-app-config",
2509
- async configureServer(e) {
2510
- e.watcher.add(L), Z.info("watching app.config.ts for changes", { path: u(s, L) });
2511
- let t = async () => {
2528
+ async configureServer(t) {
2529
+ t.watcher.add(L), Z.info("watching app.config.ts for changes", { path: p(e, L) });
2530
+ let n = async () => {
2512
2531
  try {
2513
2532
  try {
2514
- let t = e.moduleGraph.getModuleById(L);
2515
- t && e.moduleGraph.invalidateModule(t);
2533
+ let e = t.moduleGraph.getModuleById(L);
2534
+ e && t.moduleGraph.invalidateModule(e);
2516
2535
  } catch {}
2517
- let t = (await e.ssrLoadModule(L, { fixStacktrace: !0 })).default;
2518
- return typeof t == "object" && t && "type" in t && t.type === "web" ? t : (Z.warn("app.config.ts re-load returned wrong shape", { hasDefault: t !== void 0 }), null);
2536
+ let e = (await t.ssrLoadModule(L, { fixStacktrace: !0 })).default;
2537
+ 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);
2519
2538
  } catch (e) {
2520
2539
  return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2521
2540
  }
2522
- }, n = null, r = () => {
2523
- n && clearTimeout(n), n = setTimeout(() => {
2524
- n = null, i();
2541
+ }, r = null, i = () => {
2542
+ r && clearTimeout(r), r = setTimeout(() => {
2543
+ r = null, a();
2525
2544
  }, 100);
2526
- }, i = async () => {
2527
- let n = await t();
2528
- if (!n) {
2545
+ }, a = async () => {
2546
+ let r = await n();
2547
+ if (!r) {
2529
2548
  Z.info("app.config.ts onConfigChange: load returned null — skipping");
2530
2549
  return;
2531
2550
  }
2532
2551
  if (Z.info("app.config.ts onConfigChange: loaded", {
2533
- theme: n.theme,
2534
- port: n.port,
2535
- name: n.name
2536
- }), JSON.stringify(n) === JSON.stringify(re)) {
2552
+ theme: r.theme,
2553
+ port: r.port,
2554
+ name: r.name
2555
+ }), JSON.stringify(r) === JSON.stringify(re)) {
2537
2556
  Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2538
2557
  return;
2539
2558
  }
2540
- let r = ne(re, n);
2541
- if (r.length > 0) {
2542
- Z.warn("app.config.ts changed — hard restart required", { fields: r });
2559
+ let i = ne(re, r);
2560
+ if (i.length > 0) {
2561
+ Z.warn("app.config.ts changed — hard restart required", { fields: i });
2543
2562
  try {
2544
- await e.close();
2563
+ await t.close();
2545
2564
  } catch {}
2546
- let t = me(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2565
+ let e = ge(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2547
2566
  stdio: "inherit",
2548
2567
  env: process.env,
2549
2568
  cwd: process.cwd()
2550
- }), n = (e) => {
2551
- t.kill(e);
2552
- }, i = () => n("SIGINT"), a = () => n("SIGTERM");
2553
- process.on("SIGINT", i), process.on("SIGTERM", a), t.on("exit", (e, t) => {
2554
- process.off("SIGINT", i), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
2555
- }), t.on("error", (e) => {
2569
+ }), n = (t) => {
2570
+ e.kill(t);
2571
+ }, r = () => n("SIGINT"), a = () => n("SIGTERM");
2572
+ process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
2573
+ process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
2574
+ }), e.on("error", (e) => {
2556
2575
  Z.error("restart spawn failed", {}, e), process.exit(1);
2557
2576
  });
2558
2577
  return;
2559
2578
  }
2560
2579
  try {
2561
- let t = Date.now();
2562
- await ci(s, n, await ni(s, n)), re = n, e.ws && e.ws.send({
2580
+ let n = Date.now();
2581
+ await hi(e, r, await li(e, r)), re = r, t.ws && t.ws.send({
2563
2582
  type: "full-reload",
2564
2583
  path: "*"
2565
2584
  }), Z.info("app.config.ts soft-regen", {
2566
- ms: Date.now() - t,
2585
+ ms: Date.now() - n,
2567
2586
  reload: "full"
2568
2587
  });
2569
2588
  } catch (e) {
2570
2589
  Z.error("app.config.ts soft-regen failed", {}, e);
2571
2590
  }
2572
- }, a = (e) => o(e) === "app.config.ts" ? e === L || d(e) === ie : !1;
2573
- e.watcher.on("change", (e) => {
2574
- a(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), r());
2575
- }), e.watcher.on("add", (e) => {
2576
- a(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), r());
2591
+ }, o = (e) => l(e) === "app.config.ts" ? e === L || m(e) === ie : !1;
2592
+ t.watcher.on("change", (e) => {
2593
+ o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
2594
+ }), t.watcher.on("add", (e) => {
2595
+ o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
2577
2596
  });
2578
2597
  try {
2579
2598
  let { watchFile: e } = await import("node:fs");
2580
2599
  e(L, { interval: 500 }, (e, t) => {
2581
- e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), r());
2600
+ e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2582
2601
  }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2583
2602
  } catch (e) {
2584
2603
  Z.warn("app.config.ts polling watcher could not attach", {}, e);
2585
2604
  }
2586
- ut(st, Z, {
2587
- root: s,
2588
- onBeforeRestart: () => e.close()
2605
+ ft(lt, Z, {
2606
+ root: e,
2607
+ onBeforeRestart: () => t.close()
2589
2608
  });
2590
2609
  }
2591
- }, oe = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ce = {
2610
+ }, oe = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, se = {
2592
2611
  name: "framework:suppress-api-hmr",
2593
2612
  handleHotUpdate(e) {
2594
2613
  if (oe.test(e.file)) return [];
2595
2614
  }
2596
- }, le = {
2615
+ }, ce = {
2597
2616
  name: "framework:reoptimize-on-rpcgroup-change",
2598
- async configureServer(e) {
2599
- let t = /* @__PURE__ */ new Map();
2600
- for (let n of p) {
2601
- if (!n.proxyTarget) continue;
2602
- let r = await Zr(s, n.pkg);
2603
- if (!r) continue;
2604
- let i = l(r, "rpcGroup.generated.ts");
2617
+ async configureServer(t) {
2618
+ let n = /* @__PURE__ */ new Map();
2619
+ for (let r of u) {
2620
+ if (!r.proxyTarget) continue;
2621
+ let i = await ii(e, r.pkg);
2622
+ if (!i) continue;
2623
+ let a = f(i, "rpcGroup.generated.ts");
2605
2624
  try {
2606
- t.set(i, await O.readFile(i, "utf8"));
2625
+ n.set(a, await j.readFile(a, "utf8"));
2607
2626
  } catch {
2608
- t.set(i, "");
2627
+ n.set(a, "");
2609
2628
  }
2610
2629
  try {
2611
- e.watcher.add(i);
2630
+ t.watcher.add(a);
2612
2631
  } catch {}
2613
2632
  }
2614
- if (t.size === 0) return;
2615
- let n = null, r = !1, i = async () => {
2616
- if (r) return;
2617
- let n = null;
2618
- for (let [e, r] of t) {
2633
+ if (n.size === 0) return;
2634
+ let r = null, i = !1, a = async () => {
2635
+ if (i) return;
2636
+ let r = null;
2637
+ for (let [e, t] of n) {
2619
2638
  let i;
2620
2639
  try {
2621
- i = await O.readFile(e, "utf8");
2640
+ i = await j.readFile(e, "utf8");
2622
2641
  } catch {
2623
2642
  continue;
2624
2643
  }
2625
- i !== r && (t.set(e, i), n = e);
2644
+ i !== t && (n.set(e, i), r = e);
2626
2645
  }
2627
- if (n !== null) {
2628
- r = !0, Z.info(`rpcGroup changed (${u(s, n)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2646
+ if (r !== null) {
2647
+ i = !0, Z.info(`rpcGroup changed (${p(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2629
2648
  try {
2630
- await O.rm(l(A, ".vite", "deps"), {
2649
+ await j.rm(f(k, ".vite", "deps"), {
2631
2650
  recursive: !0,
2632
2651
  force: !0
2633
- }), await e.restart(!0);
2652
+ }), await t.restart(!0);
2634
2653
  } catch (e) {
2635
- r = !1, Z.error("rpcGroup re-optimize failed", {}, e);
2654
+ i = !1, Z.error("rpcGroup re-optimize failed", {}, e);
2636
2655
  }
2637
2656
  }
2638
- }, a = (e) => {
2639
- t.has(d(e)) && (n && clearTimeout(n), n = setTimeout(() => {
2640
- i();
2657
+ }, o = (e) => {
2658
+ n.has(m(e)) && (r && clearTimeout(r), r = setTimeout(() => {
2659
+ a();
2641
2660
  }, 120));
2642
2661
  };
2643
- e.watcher.on("change", a), e.watcher.on("add", a);
2662
+ t.watcher.on("change", o), t.watcher.on("add", o);
2644
2663
  }
2645
2664
  }, z = {};
2646
- for (let e of p) {
2665
+ for (let e of u) {
2647
2666
  if (!e.proxyTarget) continue;
2648
2667
  z[e.browserWsUrl] = {
2649
2668
  target: e.proxyTarget,
@@ -2658,225 +2677,225 @@ import {
2658
2677
  rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), "")
2659
2678
  };
2660
2679
  }
2661
- for (let [e, t] of Object.entries(c.proxies ?? {})) {
2680
+ for (let [e, n] of Object.entries(t.proxies ?? {})) {
2662
2681
  if (z[e]) {
2663
2682
  Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
2664
2683
  continue;
2665
2684
  }
2666
2685
  z[e] = {
2667
- target: t.target,
2668
- changeOrigin: t.changeOrigin ?? !0,
2669
- ...t.rewrite === void 0 ? {} : { rewrite: (n) => n.replace(RegExp(`^${e}`), t.rewrite) }
2670
- }, Z.info(`proxy ${e} → ${t.target}`, {
2686
+ target: n.target,
2687
+ changeOrigin: n.changeOrigin ?? !0,
2688
+ ...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
2689
+ }, Z.info(`proxy ${e} → ${n.target}`, {
2671
2690
  prefix: e,
2672
- target: t.target,
2673
- ...t.rewrite === void 0 ? {} : { rewrite: t.rewrite }
2691
+ target: n.target,
2692
+ ...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
2674
2693
  });
2675
2694
  }
2676
2695
  let ue = {
2677
2696
  name: "framework:inspect",
2678
- configureServer(o) {
2697
+ configureServer(l) {
2679
2698
  let u = null, d = async () => {
2680
2699
  if (u !== null) return u;
2681
- let e = [];
2682
- for (let t of b) try {
2683
- let n = await o.ssrLoadModule(l(s, "src", "pages", t.file));
2684
- e.push({
2685
- pattern: t.pattern,
2686
- file: t.file,
2687
- dirChain: t.dirChain,
2688
- renderMode: Dn(n, l("src", "pages", t.file)),
2689
- interactive: n.interactive ?? "full",
2690
- tenantAware: n.tenantAware === !0,
2691
- revalidateMs: K(n.revalidate),
2692
- staleWhileRevalidateMs: K(n.staleWhileRevalidate) ?? 0,
2693
- cacheInvalidatesOn: Array.isArray(n.cacheInvalidatesOn) ? n.cacheInvalidatesOn : [],
2694
- hasLoader: typeof n.loader == "function",
2695
- hasMeta: n.meta != null,
2696
- hasGetStaticPaths: typeof n.getStaticPaths == "function"
2700
+ let t = [];
2701
+ for (let n of b) try {
2702
+ let r = await l.ssrLoadModule(f(e, "src", "pages", n.file));
2703
+ t.push({
2704
+ pattern: n.pattern,
2705
+ file: n.file,
2706
+ dirChain: n.dirChain,
2707
+ renderMode: Nn(r, f("src", "pages", n.file)),
2708
+ interactive: r.interactive ?? "full",
2709
+ tenantAware: r.tenantAware === !0,
2710
+ revalidateMs: J(r.revalidate),
2711
+ staleWhileRevalidateMs: J(r.staleWhileRevalidate) ?? 0,
2712
+ cacheInvalidatesOn: Array.isArray(r.cacheInvalidatesOn) ? r.cacheInvalidatesOn : [],
2713
+ hasLoader: typeof r.loader == "function",
2714
+ hasMeta: r.meta != null,
2715
+ hasGetStaticPaths: typeof r.getStaticPaths == "function"
2697
2716
  });
2698
2717
  } catch (e) {
2699
- Z.warn("inspect: failed to load page metadata", { pattern: t.pattern }, e);
2718
+ Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2700
2719
  }
2701
- return u = e, e;
2720
+ return u = t, t;
2702
2721
  };
2703
- o.middlewares.use((e, t, n) => {
2704
- let r = e.url ?? "/";
2705
- if (r.startsWith("/_voltro/inspect") || r.startsWith("/api/dashboard/proxy")) return n();
2706
- let i = Date.now(), a = t.end.bind(t);
2722
+ l.middlewares.use((e, t, r) => {
2723
+ let i = e.url ?? "/";
2724
+ if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
2725
+ let a = Date.now(), o = t.end.bind(t);
2707
2726
  t.end = ((...e) => {
2708
2727
  try {
2709
- f.emit("request", {
2710
- url: r.split("?")[0],
2728
+ n.emit("request", {
2729
+ url: i.split("?")[0],
2711
2730
  status: t.statusCode ?? 0,
2712
- durationMs: Date.now() - i
2731
+ durationMs: Date.now() - a
2713
2732
  });
2714
2733
  } catch {}
2715
- return a(...e);
2716
- }), n();
2717
- }), c.name === "voltroDashboard" && o.middlewares.use(async (t, r, i) => {
2718
- let a = t.url ?? "", o = a.split("?")[0];
2734
+ return o(...e);
2735
+ }), r();
2736
+ }), t.name === "voltroDashboard" && l.middlewares.use(async (e, t, n) => {
2737
+ let i = e.url ?? "", o = i.split("?")[0];
2719
2738
  if (o === "/api/dashboard/proxy") {
2720
- let i = new URL(a, "http://x").searchParams.get("target");
2721
- if (!i) {
2722
- r.statusCode = 400, r.end("missing ?target=");
2739
+ let n = new URL(i, "http://x").searchParams.get("target");
2740
+ if (!n) {
2741
+ t.statusCode = 400, t.end("missing ?target=");
2723
2742
  return;
2724
2743
  }
2725
- if (!n(i)) {
2726
- r.statusCode = 400, r.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2744
+ if (!a(n)) {
2745
+ t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2727
2746
  return;
2728
2747
  }
2729
2748
  try {
2730
- let n = { accept: String(t.headers.accept ?? "application/json") };
2731
- t.headers.authorization ? n.authorization = String(t.headers.authorization) : e(i) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2749
+ let i = { accept: String(e.headers.accept ?? "application/json") };
2750
+ e.headers.authorization ? i.authorization = String(e.headers.authorization) : r(n) && process.env.VOLTRO_INSPECT_TOKEN && (i.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2732
2751
  let a;
2733
- if (t.method && t.method !== "GET" && t.method !== "HEAD") {
2734
- let e = [];
2735
- for await (let n of t) e.push(n);
2736
- a = Buffer.concat(e);
2737
- let r = t.headers["content-type"];
2738
- r && (n["content-type"] = Array.isArray(r) ? r[0] : String(r));
2752
+ if (e.method && e.method !== "GET" && e.method !== "HEAD") {
2753
+ let t = [];
2754
+ for await (let n of e) t.push(n);
2755
+ a = Buffer.concat(t);
2756
+ let n = e.headers["content-type"];
2757
+ n && (i["content-type"] = Array.isArray(n) ? n[0] : String(n));
2739
2758
  }
2740
- let o = await fetch(i, {
2759
+ let o = await fetch(n, {
2741
2760
  redirect: "manual",
2742
- ...t.method ? { method: t.method } : {},
2743
- headers: n,
2761
+ ...e.method ? { method: e.method } : {},
2762
+ headers: i,
2744
2763
  ...a && a.length ? { body: new Uint8Array(a.buffer, a.byteOffset, a.byteLength) } : {}
2745
2764
  }), s = Buffer.from(await o.arrayBuffer());
2746
- r.statusCode = o.status, r.setHeader("content-type", o.headers.get("content-type") ?? "application/octet-stream"), r.setHeader("content-length", String(s.length)), r.end(s);
2765
+ t.statusCode = o.status, t.setHeader("content-type", o.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
2747
2766
  } catch (e) {
2748
- r.statusCode = 502, r.end(`proxy error: ${e.message}`);
2767
+ t.statusCode = 502, t.end(`proxy error: ${e.message}`);
2749
2768
  }
2750
2769
  return;
2751
2770
  }
2752
2771
  if (o === "/api/dashboard/proxy/stream") {
2753
- let i = new URL(a, "http://x").searchParams.get("target");
2754
- if (!i) {
2755
- r.statusCode = 400, r.end("missing ?target=");
2772
+ let n = new URL(i, "http://x").searchParams.get("target");
2773
+ if (!n) {
2774
+ t.statusCode = 400, t.end("missing ?target=");
2756
2775
  return;
2757
2776
  }
2758
- if (!n(i)) {
2759
- r.statusCode = 400, r.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2777
+ if (!a(n)) {
2778
+ t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2760
2779
  return;
2761
2780
  }
2762
2781
  let o = new AbortController();
2763
- t.on("close", () => o.abort()), r.on("close", () => o.abort());
2782
+ e.on("close", () => o.abort()), t.on("close", () => o.abort());
2764
2783
  try {
2765
- let n = await fetch(i, {
2784
+ let i = await fetch(n, {
2766
2785
  redirect: "manual",
2767
2786
  method: "GET",
2768
2787
  headers: {
2769
2788
  accept: "text/event-stream",
2770
- ...t.headers.authorization ? { authorization: String(t.headers.authorization) } : e(i) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2789
+ ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : r(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2771
2790
  },
2772
2791
  signal: o.signal
2773
2792
  });
2774
- if (!n.ok || !n.body) {
2775
- r.statusCode = n.status, r.end(`upstream ${n.status}`);
2793
+ if (!i.ok || !i.body) {
2794
+ t.statusCode = i.status, t.end(`upstream ${i.status}`);
2776
2795
  return;
2777
2796
  }
2778
- r.writeHead(200, {
2797
+ t.writeHead(200, {
2779
2798
  "content-type": "text/event-stream; charset=utf-8",
2780
2799
  "cache-control": "no-cache, no-transform",
2781
2800
  connection: "keep-alive",
2782
2801
  "x-accel-buffering": "no"
2783
2802
  });
2784
- let a = n.body.getReader();
2803
+ let a = i.body.getReader();
2785
2804
  try {
2786
2805
  for (;;) {
2787
- let { done: e, value: t } = await a.read();
2806
+ let { done: e, value: n } = await a.read();
2788
2807
  if (e) break;
2789
- t && r.write(Buffer.from(t));
2808
+ n && t.write(Buffer.from(n));
2790
2809
  }
2791
2810
  } finally {
2792
- a.releaseLock(), r.end();
2811
+ a.releaseLock(), t.end();
2793
2812
  }
2794
2813
  } catch (e) {
2795
- e.name !== "AbortError" && (r.statusCode = 502, r.end(`proxy stream error: ${e.message}`));
2814
+ e.name !== "AbortError" && (t.statusCode = 502, t.end(`proxy stream error: ${e.message}`));
2796
2815
  }
2797
2816
  return;
2798
2817
  }
2799
- i();
2800
- }), o.middlewares.use(async (e, n, o) => {
2801
- let s = e.url ?? "";
2802
- if (!s.startsWith("/_voltro/inspect")) return o();
2803
- let l = {};
2804
- for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (l[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
2805
- let u = s.split("?")[0];
2806
- if (e.method === "GET" && (u === "/_voltro/inspect/logs" || s.startsWith("/_voltro/inspect/logs?"))) {
2807
- let e = a(l.origin), t = nn(s, Vt(), l);
2808
- n.statusCode = t.status, n.setHeader("content-type", t.contentType);
2809
- for (let [t, r] of Object.entries(e)) n.setHeader(t, r);
2810
- n.end(t.body);
2818
+ n();
2819
+ }), l.middlewares.use(async (e, r, a) => {
2820
+ let l = e.url ?? "";
2821
+ if (!l.startsWith("/_voltro/inspect")) return a();
2822
+ let u = {};
2823
+ for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (u[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
2824
+ let f = l.split("?")[0];
2825
+ if (e.method === "GET" && (f === "/_voltro/inspect/logs" || l.startsWith("/_voltro/inspect/logs?"))) {
2826
+ let e = c(u.origin), t = on(l, Wt(), u);
2827
+ r.statusCode = t.status, r.setHeader("content-type", t.contentType);
2828
+ for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
2829
+ r.end(t.body);
2811
2830
  return;
2812
2831
  }
2813
- if (e.method === "POST" && u === "/_voltro/inspect/clientLog") {
2814
- let r = a(l.origin);
2815
- if (t()) {
2816
- n.statusCode = 503, n.setHeader("content-type", "application/json");
2817
- for (let [e, t] of Object.entries(r)) n.setHeader(e, t);
2818
- n.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2832
+ if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
2833
+ let t = c(u.origin);
2834
+ if (i()) {
2835
+ r.statusCode = 503, r.setHeader("content-type", "application/json");
2836
+ for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2837
+ r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2819
2838
  return;
2820
2839
  }
2821
- let i = "";
2840
+ let a = "";
2822
2841
  e.setEncoding("utf-8"), e.on("data", (e) => {
2823
- i += e;
2842
+ a += e;
2824
2843
  }), e.on("end", () => {
2825
- let e = Xt(i, f);
2826
- n.statusCode = e.status, n.setHeader("content-type", e.contentType);
2827
- for (let [e, t] of Object.entries(r)) n.setHeader(e, t);
2828
- n.end(e.body);
2844
+ let e = $t(a, n);
2845
+ r.statusCode = e.status, r.setHeader("content-type", e.contentType);
2846
+ for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2847
+ r.end(e.body);
2829
2848
  }), e.on("error", () => {
2830
- n.statusCode = 400, n.setHeader("content-type", "application/json"), n.end(JSON.stringify({ error: "read failed" }));
2849
+ r.statusCode = 400, r.setHeader("content-type", "application/json"), r.end(JSON.stringify({ error: "read failed" }));
2831
2850
  });
2832
2851
  return;
2833
2852
  }
2834
- if (u === "/_voltro/inspect/stream") {
2835
- let i = a(l.origin);
2836
- if (t()) {
2837
- n.statusCode = 503, n.setHeader("content-type", "application/json");
2838
- for (let [e, t] of Object.entries(i)) n.setHeader(e, t);
2839
- n.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2853
+ if (f === "/_voltro/inspect/stream") {
2854
+ let t = c(u.origin);
2855
+ if (i()) {
2856
+ r.statusCode = 503, r.setHeader("content-type", "application/json");
2857
+ for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2858
+ r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2840
2859
  return;
2841
2860
  }
2842
- let o = r(l);
2843
- if (!o.ok) {
2844
- n.statusCode = 401, n.setHeader("content-type", "application/json");
2845
- for (let [e, t] of Object.entries(i)) n.setHeader(e, t);
2846
- n.end(JSON.stringify({
2861
+ let a = o(u);
2862
+ if (!a.ok) {
2863
+ r.statusCode = 401, r.setHeader("content-type", "application/json");
2864
+ for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2865
+ r.end(JSON.stringify({
2847
2866
  error: "unauthorized",
2848
- reason: o.reason
2867
+ reason: a.reason
2849
2868
  }));
2850
2869
  return;
2851
2870
  }
2852
- n.statusCode = 200, n.setHeader("content-type", "text/event-stream; charset=utf-8"), n.setHeader("cache-control", "no-cache, no-transform"), n.setHeader("connection", "keep-alive"), n.setHeader("x-accel-buffering", "no");
2853
- for (let [e, t] of Object.entries(i)) n.setHeader(e, t);
2854
- n.flushHeaders?.(), n.write("retry: 5000\n\n");
2855
- let c = s.indexOf("?");
2856
- if (!(c !== -1 && new URLSearchParams(s.slice(c + 1)).get("live") === "1")) for (let e of f.buffered()) n.write(Pt(e));
2857
- let u = f.subscribe((e) => {
2871
+ r.statusCode = 200, r.setHeader("content-type", "text/event-stream; charset=utf-8"), r.setHeader("cache-control", "no-cache, no-transform"), r.setHeader("connection", "keep-alive"), r.setHeader("x-accel-buffering", "no");
2872
+ for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2873
+ r.flushHeaders?.(), r.write("retry: 5000\n\n");
2874
+ let s = l.indexOf("?");
2875
+ if (!(s !== -1 && new URLSearchParams(l.slice(s + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Lt(e));
2876
+ let d = n.subscribe((e) => {
2858
2877
  try {
2859
- n.write(Pt(e));
2878
+ r.write(Lt(e));
2860
2879
  } catch {}
2861
- }), d = setInterval(() => {
2880
+ }), f = setInterval(() => {
2862
2881
  try {
2863
- n.write(Ft());
2882
+ r.write(Rt());
2864
2883
  } catch {}
2865
2884
  }, 15e3), p = () => {
2866
- clearInterval(d), u();
2885
+ clearInterval(f), d();
2867
2886
  };
2868
- e.on("close", p), n.on("close", p);
2887
+ e.on("close", p), r.on("close", p);
2869
2888
  return;
2870
2889
  }
2871
2890
  try {
2872
- let t = i(s, {
2891
+ let n = s(l, {
2873
2892
  kind: "web",
2874
2893
  meta: {
2875
- name: c.name ?? "(unnamed)",
2876
- voltroVersion: Or,
2894
+ name: t.name ?? "(unnamed)",
2895
+ voltroVersion: Ir,
2877
2896
  port: g,
2878
2897
  mode: "dev",
2879
- apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
2898
+ apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
2880
2899
  let n = {
2881
2900
  name: e,
2882
2901
  package: t.package
@@ -2891,58 +2910,58 @@ import {
2891
2910
  size: 0,
2892
2911
  entries: []
2893
2912
  }),
2894
- env: () => et(c.name ?? "app", { contract: se(c.env) ? c.env : void 0 })
2895
- }, l, { method: e.method ?? "GET" });
2896
- if (t === null) return o();
2897
- n.statusCode = t.status, n.setHeader("content-type", t.contentType);
2898
- for (let [e, r] of Object.entries(t.headers ?? {})) n.setHeader(e, r);
2899
- n.end(t.body);
2913
+ env: () => tt(t.name ?? "app", { contract: le(t.env) ? t.env : void 0 })
2914
+ }, u, { method: e.method ?? "GET" });
2915
+ if (n === null) return a();
2916
+ r.statusCode = n.status, r.setHeader("content-type", n.contentType);
2917
+ for (let [e, t] of Object.entries(n.headers ?? {})) r.setHeader(e, t);
2918
+ r.end(n.body);
2900
2919
  } catch (e) {
2901
- n.statusCode = 500, n.setHeader("content-type", "text/plain"), n.end(`inspect handler error: ${e.message}`);
2920
+ r.statusCode = 500, r.setHeader("content-type", "text/plain"), r.end(`inspect handler error: ${e.message}`);
2902
2921
  }
2903
2922
  });
2904
2923
  }
2905
- }, de = c.name === "voltroDashboard" ? {
2924
+ }, de = t.name === "voltroDashboard" ? {
2906
2925
  name: "framework:dashboard-registry",
2907
2926
  configureServer(e) {
2908
2927
  e.middlewares.use(async (e, t, n) => {
2909
2928
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
2910
2929
  try {
2911
- let e = await Vn();
2930
+ let e = await Jn();
2912
2931
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
2913
2932
  } catch (e) {
2914
2933
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
2915
2934
  }
2916
2935
  });
2917
2936
  }
2918
- } : null, fe = Yr(b), B = /* @__PURE__ */ new Set(), he = yt(), ge = xt({
2919
- limit: he,
2937
+ } : null, fe = ni(b), pe = /* @__PURE__ */ new Set(), B = St(), me = wt({
2938
+ limit: B,
2920
2939
  onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
2921
2940
  onColdEnd: (e) => Z.debug("ssr cold-compile end", { id: e })
2922
2941
  });
2923
- Z.debug(`ssr cold-compile concurrency ${he}`, { concurrency: he });
2924
- let _e = null, ve = async () => (_e === null && (_e = await O.readFile(l(s, ".framework", "index.html"), "utf8")), _e), ye = {
2942
+ Z.debug(`ssr cold-compile concurrency ${B}`, { concurrency: B });
2943
+ let V = null, _e = async () => (V === null && (V = await j.readFile(f(e, ".framework", "index.html"), "utf8")), V), ve = {
2925
2944
  name: "framework:ssr",
2926
- configureServer(e) {
2927
- let t = (t) => ge.load(t, async () => await e.ssrLoadModule(t));
2928
- e.middlewares.use(async (n, r, i) => {
2929
- if (n.method !== "GET" && n.method !== "HEAD") return i();
2930
- let a = n.url ?? "/", o = a.indexOf("?"), c = (o === -1 ? a : a.slice(0, o)) || "/";
2931
- if (c.startsWith("/@") || c.startsWith("/node_modules/") || c.startsWith("/.framework/") || c.startsWith("/_voltro/") || c === "/main.tsx" || c === "/index.html" || c === "/sw.js" || c === "/favicon.ico" || c === "/robots.txt" || /\.[a-z0-9]+$/i.test(c)) return i();
2932
- let u = Xr(c, fe);
2933
- if (!u) return i();
2934
- let d = !B.has(u.route.pattern), f = Date.now();
2935
- d && Z.info(`ssr compiling ${u.route.pattern}`, {
2936
- pattern: u.route.pattern,
2945
+ configureServer(t) {
2946
+ let n = (e) => me.load(e, async () => await t.ssrLoadModule(e));
2947
+ t.middlewares.use(async (r, i, a) => {
2948
+ if (r.method !== "GET" && r.method !== "HEAD") return a();
2949
+ let o = r.url ?? "/", s = o.indexOf("?"), c = (s === -1 ? o : o.slice(0, s)) || "/";
2950
+ if (c.startsWith("/@") || c.startsWith("/node_modules/") || c.startsWith("/.framework/") || c.startsWith("/_voltro/") || c === "/main.tsx" || c === "/index.html" || c === "/sw.js" || c === "/favicon.ico" || c === "/robots.txt" || /\.[a-z0-9]+$/i.test(c)) return a();
2951
+ let l = ri(c, fe);
2952
+ if (!l) return a();
2953
+ let d = !pe.has(l.route.pattern), p = Date.now();
2954
+ d && Z.info(`ssr compiling ${l.route.pattern}`, {
2955
+ pattern: l.route.pattern,
2937
2956
  pathname: c
2938
2957
  });
2939
2958
  let m = {}, h = async (e, t) => {
2940
2959
  let n = Date.now(), r = await t();
2941
2960
  return m[e] = (m[e] ?? 0) + (Date.now() - n), r;
2942
- }, g = async (t, n, r) => {
2943
- let i = await e.moduleGraph.getModuleById(t);
2944
- if (!(!i || n.has(t))) {
2945
- if (n.add(t), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
2961
+ }, g = async (e, n, r) => {
2962
+ let i = await t.moduleGraph.getModuleById(e);
2963
+ if (!(!i || n.has(e))) {
2964
+ if (n.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
2946
2965
  let e = i.url.replace(/\?.*$/, "");
2947
2966
  r.includes(e) || r.push(e);
2948
2967
  return;
@@ -2951,97 +2970,97 @@ import {
2951
2970
  }
2952
2971
  };
2953
2972
  try {
2954
- let o = await h("loadPage", async () => await t(l(s, "src", "pages", u.route.file))), _ = Dn(o, l("src", "pages", u.route.file)), v = Wr(x, u.route.dirChain), y = _ === "spa" && v.some((e) => e.hasLayout);
2955
- if (_ !== "ssr" && _ !== "isr" && !y) return i();
2973
+ let s = await h("loadPage", async () => await n(f(e, "src", "pages", l.route.file))), _ = Nn(s, f("src", "pages", l.route.file)), v = Zr(x, l.route.dirChain), y = _ === "spa" && v.some((e) => e.hasLayout);
2974
+ if (_ !== "ssr" && _ !== "isr" && !y) return a();
2956
2975
  let b = {};
2957
- for (let [e, t] of Object.entries(n.headers ?? {})) typeof t == "string" ? b[e] = t : Array.isArray(t) && (b[e] = t.join(", "));
2958
- let S = si(oi(p[0], { allowDevProxy: !0 }), b.cookie, { apiName: p[0]?.name }), C = new AbortController(), w = () => C.abort();
2959
- r.once("close", w);
2976
+ for (let [e, t] of Object.entries(r.headers ?? {})) typeof t == "string" ? b[e] = t : Array.isArray(t) && (b[e] = t.join(", "));
2977
+ let S = mi(pi(u[0], { allowDevProxy: !0 }), b.cookie, { apiName: u[0]?.name }), C = new AbortController(), w = () => C.abort();
2978
+ i.once("close", w);
2960
2979
  let T = null, E = [], D = {};
2961
2980
  try {
2962
- ({chain: E, segmentLoaderData: D} = await h("loadChain", () => Gr({
2981
+ (await n("@voltro/web/ssr")).beginStoreSeeds(), {chain: E, segmentLoaderData: D} = await h("loadChain", () => Qr({
2963
2982
  entries: v,
2964
- loadLayout: (e) => t(l(s, "src", "pages", e.dir, "layout.tsx")),
2965
- loadError: (e) => t(l(s, "src", "pages", e.dir, "error.tsx")),
2966
- loadPending: (e) => t(l(s, "src", "pages", e.dir, "loading.tsx")),
2983
+ loadLayout: (t) => n(f(e, "src", "pages", t.dir, "layout.tsx")),
2984
+ loadError: (t) => n(f(e, "src", "pages", t.dir, "error.tsx")),
2985
+ loadPending: (t) => n(f(e, "src", "pages", t.dir, "loading.tsx")),
2967
2986
  ctx: {
2968
- params: u.params,
2987
+ params: l.params,
2969
2988
  pathname: c,
2970
2989
  signal: C.signal,
2971
2990
  headers: b,
2972
2991
  query: S
2973
2992
  }
2974
- })));
2975
- let e = o.loader;
2976
- typeof e == "function" && !y && (T = await h("loader", () => e({
2977
- params: u.params,
2993
+ }));
2994
+ let t = s.loader;
2995
+ typeof t == "function" && !y && (T = await h("loader", () => t({
2996
+ params: l.params,
2978
2997
  pathname: c,
2979
2998
  signal: C.signal,
2980
2999
  headers: b,
2981
3000
  query: S
2982
3001
  })));
2983
3002
  } finally {
2984
- r.off("close", w);
3003
+ i.off("close", w);
2985
3004
  }
2986
- let O = await h("loadSsrHelpers", async () => await t("@voltro/web/ssr")), k = {
2987
- pattern: u.route.pattern,
2988
- Component: o.default,
2989
- meta: o.meta,
2990
- loader: o.loader,
2991
- ErrorBoundary: o.ErrorBoundary,
2992
- Pending: o.Pending,
3005
+ let O = await h("loadSsrHelpers", async () => await n("@voltro/web/ssr")), k = {
3006
+ pattern: l.route.pattern,
3007
+ Component: s.default,
3008
+ meta: s.meta,
3009
+ loader: s.loader,
3010
+ ErrorBoundary: s.ErrorBoundary,
3011
+ Pending: s.Pending,
2993
3012
  renderMode: _,
2994
3013
  chain: E
2995
3014
  }, A = {
2996
3015
  cookies: O.parseCookieHeader(b.cookie),
2997
3016
  headers: b,
2998
- url: a
2999
- }, j = o.interactive ?? "full", M = y ? hr({
3017
+ url: o
3018
+ }, j = s.interactive ?? "full", M = y ? Cr({
3000
3019
  helpers: O,
3001
- page: `src/pages/${u.route.file}`,
3020
+ page: `src/pages/${l.route.file}`,
3002
3021
  interactive: j,
3003
3022
  delivery: "stream",
3004
3023
  renderInput: {
3005
3024
  descriptor: k,
3006
- params: u.params,
3025
+ params: l.params,
3007
3026
  pathname: c,
3008
3027
  segmentLoaderData: D,
3009
3028
  requestContext: A
3010
3029
  }
3011
- }) : null, N = y ? null : mr({
3030
+ }) : null, N = y ? null : Sr({
3012
3031
  helpers: O,
3013
- page: `src/pages/${u.route.file}`,
3032
+ page: `src/pages/${l.route.file}`,
3014
3033
  pathname: c,
3015
3034
  renderMode: _,
3016
3035
  interactive: j,
3017
3036
  loaderData: T,
3018
3037
  segmentLoaderData: D,
3019
- pageLoaderRan: typeof o.loader == "function"
3038
+ pageLoaderRan: typeof s.loader == "function"
3020
3039
  }), P = [];
3021
3040
  await h("collectCss", async () => {
3022
- let e = /* @__PURE__ */ new Set(), t = [
3023
- l(s, "src", "pages", u.route.file),
3024
- ...v.flatMap((e) => [
3025
- ...e.hasLayout ? [l(s, "src", "pages", e.dir, "layout.tsx")] : [],
3026
- ...e.hasError ? [l(s, "src", "pages", e.dir, "error.tsx")] : [],
3027
- ...e.hasPending ? [l(s, "src", "pages", e.dir, "loading.tsx")] : []
3041
+ let t = /* @__PURE__ */ new Set(), n = [
3042
+ f(e, "src", "pages", l.route.file),
3043
+ ...v.flatMap((t) => [
3044
+ ...t.hasLayout ? [f(e, "src", "pages", t.dir, "layout.tsx")] : [],
3045
+ ...t.hasError ? [f(e, "src", "pages", t.dir, "error.tsx")] : [],
3046
+ ...t.hasPending ? [f(e, "src", "pages", t.dir, "loading.tsx")] : []
3028
3047
  ]),
3029
- l(s, ".framework", "main.tsx")
3048
+ f(e, ".framework", "main.tsx")
3030
3049
  ];
3031
- for (let n of t) await g(n, e, P);
3050
+ for (let e of n) await g(e, t, P);
3032
3051
  });
3033
- let ee = await h("readShell", ve), F = await h("transformShell", () => e.transformIndexHtml(a, ee)), te = P.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), I = A.cookies["voltro:locale"] ?? "en", L = Date.now();
3052
+ let ee = await h("readShell", _e), F = await h("transformShell", () => t.transformIndexHtml(o, ee)), te = P.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), I = A.cookies["voltro:locale"] ?? "en", L = Date.now();
3034
3053
  if (M) {
3035
- let e = (e) => _r({
3054
+ let e = (e) => Tr({
3036
3055
  helpers: O,
3037
3056
  prepared: M,
3038
3057
  meta: e,
3039
3058
  interactive: j,
3040
3059
  extra: [te]
3041
3060
  });
3042
- if (M.hasDeferred) Er({
3043
- res: r,
3044
- shell: wr({
3061
+ if (M.hasDeferred) Pr({
3062
+ res: i,
3063
+ shell: Mr({
3045
3064
  shell: F,
3046
3065
  inlineModuleScriptsAsync: !0
3047
3066
  }),
@@ -3058,16 +3077,16 @@ import {
3058
3077
  onShellError: (e) => {
3059
3078
  Z.warn("spa-shell-dev shell render failed; falling back to SPA shell", {
3060
3079
  pathname: c,
3061
- pattern: u.route.pattern
3062
- }, e), i();
3080
+ pattern: l.route.pattern
3081
+ }, e), a();
3063
3082
  }
3064
3083
  });
3065
3084
  else {
3066
- let t = gr({
3085
+ let t = wr({
3067
3086
  helpers: O,
3068
3087
  prepared: M
3069
3088
  }), n = F.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="${I}"`);
3070
- r.statusCode = 200, r.setHeader("content-type", "text/html; charset=utf-8"), r.setHeader("x-voltro-rendered-by", "spa-shell-dev"), r.end(n);
3089
+ i.statusCode = 200, i.setHeader("content-type", "text/html; charset=utf-8"), i.setHeader("x-voltro-rendered-by", "spa-shell-dev"), i.end(n);
3071
3090
  }
3072
3091
  } else if (N) {
3073
3092
  let e = (e) => [
@@ -3078,15 +3097,15 @@ import {
3078
3097
  O.renderRouterStateScript(N.stateInput)
3079
3098
  ].filter((e) => e.length > 0).join("\n "), t = {
3080
3099
  descriptor: k,
3081
- params: u.params,
3100
+ params: l.params,
3082
3101
  pathname: c,
3083
3102
  loaderData: N.loaderData,
3084
3103
  segmentLoaderData: N.segmentLoaderData,
3085
3104
  requestContext: A
3086
3105
  };
3087
- if (_ === "ssr" && j === "full") Er({
3088
- res: r,
3089
- shell: wr({
3106
+ if (_ === "ssr" && j === "full") Pr({
3107
+ res: i,
3108
+ shell: Mr({
3090
3109
  shell: F,
3091
3110
  inlineModuleScriptsAsync: !0
3092
3111
  }),
@@ -3103,142 +3122,142 @@ import {
3103
3122
  onShellError: (e) => {
3104
3123
  Z.warn("ssr-dev shell render failed; falling back to SPA shell", {
3105
3124
  pathname: c,
3106
- pattern: u.route.pattern
3107
- }, e), i();
3125
+ pattern: l.route.pattern
3126
+ }, e), a();
3108
3127
  }
3109
3128
  });
3110
3129
  else {
3111
- let { html: n, meta: i } = O.renderPageToHtml(t), a = F.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(i)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${I}"`);
3112
- r.statusCode = 200, r.setHeader("content-type", "text/html; charset=utf-8"), r.setHeader("x-voltro-rendered-by", "ssr-dev"), r.end(a);
3130
+ let { html: n, meta: r } = O.renderPageToHtml(t), a = F.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${I}"`);
3131
+ i.statusCode = 200, i.setHeader("content-type", "text/html; charset=utf-8"), i.setHeader("x-voltro-rendered-by", "ssr-dev"), i.end(a);
3113
3132
  }
3114
3133
  }
3115
3134
  m.render = Date.now() - L;
3116
- let R = Date.now() - f;
3117
- d ? (B.add(u.route.pattern), Z.info(`ssr compiled ${u.route.pattern} in ${R}ms`, {
3118
- pattern: u.route.pattern,
3135
+ let R = Date.now() - p;
3136
+ d ? (pe.add(l.route.pattern), Z.info(`ssr compiled ${l.route.pattern} in ${R}ms`, {
3137
+ pattern: l.route.pattern,
3119
3138
  pathname: c,
3120
3139
  elapsedMs: R,
3121
3140
  cold: !0,
3122
3141
  phases: m
3123
3142
  })) : R > 200 && Z.info(`ssr rendered ${c} in ${R}ms`, {
3124
- pattern: u.route.pattern,
3143
+ pattern: l.route.pattern,
3125
3144
  pathname: c,
3126
3145
  elapsedMs: R,
3127
3146
  cold: !1,
3128
3147
  phases: m
3129
3148
  });
3130
3149
  } catch (e) {
3131
- if (pr(e)) {
3150
+ if (xr(e)) {
3132
3151
  Z.error("ssr-dev render refused", {
3133
3152
  pathname: c,
3134
- pattern: u.route.pattern
3135
- }, e), r.statusCode = 500, r.setHeader("content-type", "text/plain; charset=utf-8"), r.end(e.message);
3153
+ pattern: l.route.pattern
3154
+ }, e), i.statusCode = 500, i.setHeader("content-type", "text/plain; charset=utf-8"), i.end(e.message);
3136
3155
  return;
3137
3156
  }
3138
3157
  Z.warn("ssr-dev render failed; falling back to SPA shell", {
3139
3158
  pathname: c,
3140
- pattern: u.route.pattern
3141
- }, e), i();
3159
+ pattern: l.route.pattern
3160
+ }, e), a();
3142
3161
  }
3143
3162
  });
3144
3163
  }
3145
- }, V = Date.now(), be = E.version ?? "?", xe = await kr(), H = l(s, "node_modules", "@voltro", "ui-shadcn"), U = T(l(H, "package.json")) ? H : null, Se = [], Ce = await (async () => {
3146
- let e = [];
3147
- for (let t of p) {
3148
- if (!t.proxyTarget) continue;
3149
- let n = await Zr(s, t.pkg);
3150
- if (n) try {
3151
- e.push(await O.readFile(l(n, "rpcGroup.generated.ts"), "utf8"));
3164
+ }, ye = Date.now(), H = w.version ?? "?", U = await Lr(), be = f(e, "node_modules", "@voltro", "ui-shadcn"), W = O(f(be, "package.json")) ? be : null, xe = [], G = await (async () => {
3165
+ let t = [];
3166
+ for (let n of u) {
3167
+ if (!n.proxyTarget) continue;
3168
+ let r = await ii(e, n.pkg);
3169
+ if (r) try {
3170
+ t.push(await j.readFile(f(r, "rpcGroup.generated.ts"), "utf8"));
3152
3171
  } catch {}
3153
3172
  }
3154
- if (e.length === 0) return !1;
3155
- let t = pe("sha1").update(e.join("\0")).digest("hex"), n = l(A, ".voltro-rpcgroup-optimize"), r = "";
3173
+ if (t.length === 0) return !1;
3174
+ let n = he("sha1").update(t.join("\0")).digest("hex"), r = f(k, ".voltro-rpcgroup-optimize"), i = "";
3156
3175
  try {
3157
- r = (await O.readFile(n, "utf8")).trim();
3176
+ i = (await j.readFile(r, "utf8")).trim();
3158
3177
  } catch {}
3159
- if (r === t) return !1;
3178
+ if (i === n) return !1;
3160
3179
  try {
3161
- await O.writeFile(n, t);
3180
+ await j.writeFile(r, n);
3162
3181
  } catch {}
3163
3182
  return !0;
3164
3183
  })();
3165
- Ce && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await E.createServer({
3166
- root: A,
3184
+ G && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await w.createServer({
3185
+ root: k,
3167
3186
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3168
3187
  ssr: { noExternal: ["react-intl"] },
3169
3188
  resolve: {
3170
3189
  dedupe: ["react", "react-dom"],
3171
3190
  alias: [
3172
- ...xe ? [{
3191
+ ...U ? [{
3173
3192
  find: "@voltro/devtools/styles.css",
3174
- replacement: l(xe, "src/styles.css")
3193
+ replacement: f(U, "src/styles.css")
3175
3194
  }, {
3176
3195
  find: "@voltro/devtools",
3177
- replacement: l(xe, "src/index.ts")
3196
+ replacement: f(U, "src/index.ts")
3178
3197
  }] : [],
3179
- ...U ? [
3198
+ ...W ? [
3180
3199
  {
3181
3200
  find: "@voltro/ui-shadcn/tokens.css",
3182
- replacement: l(U, "src/tokens.css")
3201
+ replacement: f(W, "src/tokens.css")
3183
3202
  },
3184
3203
  {
3185
3204
  find: "@voltro/ui-shadcn/cn",
3186
- replacement: l(U, "src/cn.ts")
3205
+ replacement: f(W, "src/cn.ts")
3187
3206
  },
3188
3207
  {
3189
3208
  find: "@voltro/ui-shadcn/brand",
3190
- replacement: l(U, "src/brand/voltroLogo.tsx")
3209
+ replacement: f(W, "src/brand/voltroLogo.tsx")
3191
3210
  },
3192
3211
  {
3193
3212
  find: "@voltro/ui-shadcn",
3194
- replacement: l(U, "src/index.ts")
3213
+ replacement: f(W, "src/index.ts")
3195
3214
  }
3196
3215
  ] : [],
3197
- ...Ue(s)
3216
+ ...We(e)
3198
3217
  ]
3199
3218
  },
3200
3219
  optimizeDeps: {
3201
- include: [...p.map((e) => `${e.pkg}/rpcGroup`), ...Se],
3202
- force: Ce
3220
+ include: [...u.map((e) => `${e.pkg}/rpcGroup`), ...xe],
3221
+ force: G
3203
3222
  },
3204
- customLogger: vt(),
3223
+ customLogger: xt(),
3205
3224
  plugins: [
3206
- xn(l(s, "src", "pages")),
3225
+ Dn(f(e, "src", "pages")),
3226
+ T(),
3207
3227
  D(),
3208
- k(),
3209
3228
  N,
3210
3229
  I,
3211
3230
  ae,
3231
+ se,
3212
3232
  ce,
3213
- le,
3214
3233
  ue,
3215
- ye,
3234
+ ve,
3216
3235
  ...de ? [de] : []
3217
3236
  ],
3218
3237
  server: {
3219
3238
  port: g,
3220
3239
  strictPort: !0,
3221
3240
  host: !0,
3222
- allowedHosts: c.allowedHosts === !0 || [...c.allowedHosts ?? []],
3241
+ allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
3223
3242
  proxy: z,
3224
- fs: { allow: [s, ...Fr(s)] }
3243
+ fs: { allow: [e, ...Ur(e)] }
3225
3244
  },
3226
3245
  appType: "spa",
3227
- cacheDir: l(A, ".vite"),
3228
- publicDir: l(s, "public")
3229
- })).listen(), Dr.info(`v${be} ready in ${Date.now() - V}ms`, {
3230
- version: be,
3231
- bootMs: Date.now() - V
3246
+ cacheDir: f(k, ".vite"),
3247
+ publicDir: f(e, "public")
3248
+ })).listen(), Fr.info(`v${H} ready in ${Date.now() - ye}ms`, {
3249
+ version: H,
3250
+ bootMs: Date.now() - ye
3232
3251
  }), Z.info(`listening on http://localhost:${g}`, {
3233
3252
  port: g,
3234
- app: c.name ?? "(unnamed)"
3253
+ app: t.name ?? "(unnamed)"
3235
3254
  });
3236
- for (let e of p) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3255
+ for (let e of u) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3237
3256
  api: e.name,
3238
3257
  target: e.proxyTarget
3239
3258
  }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3240
3259
  try {
3241
- await Hn({
3260
+ await Yn({
3242
3261
  id: v,
3243
3262
  name: _,
3244
3263
  kind: "web",
@@ -3247,13 +3266,13 @@ import {
3247
3266
  status: "live",
3248
3267
  logFile: y.path
3249
3268
  });
3250
- let e = nr(s);
3251
- if (e) {
3252
- let t = await dr({ dashboardAppPath: e });
3253
- t.status === "launched" ? Z.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Z.debug(`dashboard already running on :${t.port}`, { port: t.port });
3269
+ let t = lr(e);
3270
+ if (t) {
3271
+ let e = await yr({ dashboardAppPath: t });
3272
+ 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 });
3254
3273
  }
3255
3274
  setInterval(() => {
3256
- Hn({
3275
+ Yn({
3257
3276
  id: v,
3258
3277
  name: _,
3259
3278
  kind: "web",
@@ -3263,78 +3282,78 @@ import {
3263
3282
  logFile: y.path
3264
3283
  }).catch(() => {});
3265
3284
  }, 1e4).unref();
3266
- let t = () => {
3267
- Un(v), y.dispose();
3285
+ let n = () => {
3286
+ Xn(v), y.dispose();
3268
3287
  };
3269
- process.on("SIGINT", t), process.on("SIGTERM", t);
3288
+ process.on("SIGINT", n), process.on("SIGTERM", n);
3270
3289
  } catch (e) {
3271
3290
  Z.warn("runtime-registry write failed", {}, e);
3272
3291
  }
3273
- return C({
3274
- app: c.name ?? "unnamed",
3292
+ return E({
3293
+ app: t.name ?? "unnamed",
3275
3294
  kind: "web",
3276
3295
  url: `http://localhost:${g}`,
3277
- bootMs: Date.now() - V
3296
+ bootMs: Date.now() - ye
3278
3297
  }), new Promise(() => {});
3279
- }, pi = async (e) => {
3298
+ }, bi = async (e) => {
3280
3299
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3281
- let t = await di(e);
3300
+ let t = await vi(e);
3282
3301
  if (!t) return {
3283
3302
  ran: !1,
3284
3303
  exitCode: 0
3285
3304
  };
3286
3305
  let n = Date.now(), r = Z.child("serve");
3287
3306
  r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3288
- let i = await ni(e, t);
3307
+ let i = await li(e, t);
3289
3308
  for (let e of i) r.info("api wired", {
3290
3309
  name: e.name,
3291
3310
  pkg: e.pkg
3292
3311
  });
3293
- await ci(e, t, i);
3312
+ await hi(e, t, i);
3294
3313
  {
3295
- let { pages: t } = await $(l(e, "src", "pages"));
3296
- await jt({
3314
+ let { pages: t } = await $(f(e, "src", "pages"));
3315
+ await Pt({
3297
3316
  appRoot: e,
3298
3317
  pages: t
3299
3318
  });
3300
3319
  }
3301
- let a = t.port ?? 5173, o = await Ge("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = l(e, ".framework");
3320
+ let a = t.port ?? 5173, o = await Ke("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = f(e, ".framework");
3302
3321
  Z.info("running production build"), await o.build({
3303
3322
  root: c,
3304
3323
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3305
3324
  plugins: [s()],
3306
- customLogger: vt(),
3325
+ customLogger: xt(),
3307
3326
  resolve: { dedupe: ["react", "react-dom"] },
3308
3327
  build: {
3309
3328
  outDir: "dist",
3310
- rollupOptions: { output: { manualChunks: Rr } }
3329
+ rollupOptions: { output: { manualChunks: Gr } }
3311
3330
  },
3312
- publicDir: l(e, "public")
3331
+ publicDir: f(e, "public")
3313
3332
  });
3314
- let u = (await o.preview({
3333
+ let l = (await o.preview({
3315
3334
  root: c,
3316
3335
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3317
3336
  preview: { port: a },
3318
3337
  build: { outDir: "dist" }
3319
- })).resolvedUrls, d = u?.local[0] ?? `http://localhost:${a}`, f = u?.local.slice(1).map((e) => ({
3338
+ })).resolvedUrls, u = l?.local[0] ?? `http://localhost:${a}`, d = l?.local.slice(1).map((e) => ({
3320
3339
  label: "Local",
3321
3340
  url: e
3322
3341
  })) ?? [];
3323
- return C({
3342
+ return E({
3324
3343
  app: t.name ?? "unnamed",
3325
3344
  kind: "preview",
3326
- url: d,
3327
- extras: f,
3345
+ url: u,
3346
+ extras: d,
3328
3347
  bootMs: Date.now() - n
3329
3348
  }), new Promise(() => {});
3330
- }, mi = 5e3, hi = 6e4, gi = (e, t) => {
3349
+ }, xi = 5e3, Si = 6e4, Ci = (e, t) => {
3331
3350
  if (e.length === 0) return 0;
3332
3351
  if (e.length === 1) return e[0];
3333
3352
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3334
3353
  if (r === i) return e[r];
3335
3354
  let a = n - r;
3336
3355
  return e[r] * (1 - a) + e[i] * a;
3337
- }, _i = (e) => {
3356
+ }, wi = (e) => {
3338
3357
  if (e.length === 0) return {
3339
3358
  p50: 0,
3340
3359
  p95: 0,
@@ -3346,18 +3365,18 @@ import {
3346
3365
  let t = e.slice().sort((e, t) => e - t), n = 0;
3347
3366
  for (let e of t) n += e;
3348
3367
  return {
3349
- p50: gi(t, .5),
3350
- p95: gi(t, .95),
3351
- p99: gi(t, .99),
3368
+ p50: Ci(t, .5),
3369
+ p95: Ci(t, .95),
3370
+ p99: Ci(t, .99),
3352
3371
  mean: n / t.length,
3353
3372
  min: t[0],
3354
3373
  max: t[t.length - 1]
3355
3374
  };
3356
- }, vi = (e = {}) => {
3357
- let t = e.maxSamples ?? mi, n = e.defaultWindowMs ?? hi, r = [];
3375
+ }, Ti = (e = {}) => {
3376
+ let t = e.maxSamples ?? xi, n = e.defaultWindowMs ?? Si, r = [];
3358
3377
  return {
3359
3378
  record(e) {
3360
- te(e), r.push({
3379
+ R(e), r.push({
3361
3380
  ...e,
3362
3381
  ts: Date.now()
3363
3382
  }), r.length > t && r.shift();
@@ -3383,7 +3402,7 @@ import {
3383
3402
  tag: e.tag,
3384
3403
  count: e.samples.length,
3385
3404
  errorCount: n,
3386
- latencyMs: _i(t)
3405
+ latencyMs: wi(t)
3387
3406
  });
3388
3407
  }
3389
3408
  return c.sort((e, t) => t.count - e.count), {
@@ -3396,4 +3415,4 @@ import {
3396
3415
  };
3397
3416
  };
3398
3417
  //#endregion
3399
- export { it as $, Un as A, Xt as B, dr as C, Qn as D, Zn as E, Tn as F, Ft as G, Vt as H, Dn as I, yt as J, jt as K, cn as L, Sn as M, On as N, Wn as O, Cn as P, rt as Q, nn as R, tr as S, Xn as T, Pt as U, Ut as V, Nt as W, ct as X, ut as Y, st as Z, mr as _, Gr as a, Qe as at, _r as b, ni as c, Ge as ct, Rr as d, Ve as dt, at as et, $ as f, V as ft, pr as g, Er as h, si as i, tt as it, Hn as j, Vn as k, fi as l, Ue as lt, wr as m, zr as n, K as nt, Wr as o, Xe as ot, ci as p, be as pt, xt as q, oi as r, et as rt, di as s, Ye as st, vi as t, nt as tt, pi as u, Be as ut, hr as v, nr as w, rr as x, gr as y, Qt as z };
3418
+ export { ut as $, Xn as A, dn as B, yr as C, ar as D, ir as E, jn as F, Wt as G, tn as H, Nn as I, Rt as J, Lt as K, gn as L, On as M, Pn as N, Zn as O, kn as P, ft as Q, _n as R, cr as S, rr as T, $t as U, on as V, Kt as W, wt as X, Pt as Y, St as Z, Sr as _, Qr as a, J as at, Tr as b, li as c, $e as ct, Gr as d, Ke as dt, lt as et, $ as f, We as ft, xr as g, W as gt, Pr as h, be as ht, mi as i, rt as it, Yn as j, Jn as k, yi as l, Ze as lt, Mr as m, He as mt, Kr as n, at as nt, Zr as o, tt as ot, hi as p, Ve as pt, It as q, pi as r, ot as rt, vi as s, nt as st, Ti as t, it as tt, bi as u, Xe as ut, Cr as v, lr as w, ur as x, wr as y, vn as z };