@voltro/cli 0.50.0 → 0.51.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 (111) hide show
  1. package/CHANGELOG.md +160 -0
  2. package/dist/{apiBuild-CFYXo06U.js → apiBuild-CPDHXF72.js} +2 -2
  3. package/dist/apiBuild-GDKuGOMV.js +2 -0
  4. package/dist/appGraph-CFmFKHb2.js +2 -0
  5. package/dist/appGraph-yRuKjOba.js +111 -0
  6. package/dist/bin.js +1 -1
  7. package/dist/{build-CnSH-zru.js → build-DETLZAFt.js} +271 -240
  8. package/dist/{checkCommand-OL41BMIb.js → checkCommand-CWcnDArJ.js} +1 -1
  9. package/dist/{checkCommand-Do3SQbLx.js → checkCommand-DNuPiWMc.js} +56 -46
  10. package/dist/{codegenCommand-BJzaRz6q.js → codegenCommand-BNBHcNNj.js} +2 -2
  11. package/dist/{codemodRunner-De3k0pRd.js → codemodRunner-BDVixlSw.js} +278 -136
  12. package/dist/{commands-By23Ljny.js → commands-B1OiS9bX.js} +24 -23
  13. package/dist/{dashboardCommand-DN1rAABE.js → dashboardCommand-C-vvPY1B.js} +5 -5
  14. package/dist/{dataCommand-B93TUBIx.js → dataCommand-C1GxXW5q.js} +458 -384
  15. package/dist/dbCommand-C27HIsGE.js +2 -0
  16. package/dist/{dbCommand-Bf7Cy0mn.js → dbCommand-If4Y1xQ-.js} +1 -1
  17. package/dist/{dev-BWwE0QjK.js → dev-CK522MV5.js} +1 -1
  18. package/dist/{dev-1yu42ubu.js → dev-kdAg9Q7l.js} +1246 -1246
  19. package/dist/doctorCommand-BK4l18eG.js +2 -0
  20. package/dist/{doctorCommand-y-EbP8st.js → doctorCommand-nKmeW78u.js} +42 -26
  21. package/dist/{doctorSourceRelations-Dd48LPvO.js → doctorSourceRelations-c5mlN5HI.js} +66 -34
  22. package/dist/{dormancyCommand-Dc7KRNCG.js → dormancyCommand-CY3wa_SW.js} +1 -1
  23. package/dist/{embeddingsCommand-kPs132bB.js → embeddingsCommand-BDLIgje_.js} +1 -1
  24. package/dist/{envCommand-E12zSt51.js → envCommand-C6V_xVlT.js} +13 -13
  25. package/dist/{evolveCommand-B3nagPVc.js → evolveCommand-D3c4DSfN.js} +2 -2
  26. package/dist/{generateCommand-CcyvH2ve.js → generateCommand-DTNPGjxo.js} +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/{infoCommand-Cq0Yz98u.js → infoCommand-BnRFEF1o.js} +1 -1
  29. package/dist/{inspect-B7U7Cl_Z.js → inspect-CtL_xTbu.js} +1 -0
  30. package/dist/inspect-CuGDYES0.js +2 -0
  31. package/dist/manifestBuild-CPjhvM62.js +2 -0
  32. package/dist/{manifestBuild-BK42hu0k.js → manifestBuild-CuU1VrSm.js} +2 -2
  33. package/dist/{migrate-D3MK9BpK.js → migrate-DehuBakM.js} +1 -1
  34. package/dist/{runtimeTrace-BpLUcrfy.js → runtimeTrace-ZsBU7Tkx.js} +1 -1
  35. package/dist/{sdkgen-dl4-WKF6.js → sdkgen-O4XqWOjM.js} +1 -1
  36. package/dist/serveCommand-BRnPCxVd.js +2 -0
  37. package/dist/{serveCommand-8CTzQCY0.js → serveCommand-DdiYNBBu.js} +4 -4
  38. package/dist/serveEntry.js +1 -1
  39. package/dist/{start-7HcSIKEp.js → start-BLNmWkLa.js} +331 -327
  40. package/dist/{start-DvlYDyAr.js → start-Dzicuyw8.js} +1 -1
  41. package/dist/startEntry.js +1 -1
  42. package/dist/{updateCommand-i8JbrLAA.js → updateCommand-Bs322Q78.js} +1 -1
  43. package/dist/updateCommand-eXB35SEv.js +2 -0
  44. package/dist/{webDev-B4IEMB0n.js → webDev-B-ubQEMX.js} +283 -224
  45. package/dist/webDev-DposiF3j.js +2 -0
  46. package/dist/{webhooksCommand-B0bdyuQ4.js → webhooksCommand-FLYY9IXh.js} +1 -1
  47. package/package.json +41 -17
  48. package/templates/AGENTS.core.md +15 -5
  49. package/templates/AGENTS.md +16 -6
  50. package/templates/agent-docs/_index.md +1 -1
  51. package/templates/agent-docs/cli.md +92 -3
  52. package/templates/agent-docs/data.md +36 -0
  53. package/templates/agent-docs/internationalization.md +131 -13
  54. package/templates/agent-docs/whats-new.md +73 -27
  55. package/templates/apps/api-ai/package.json +7 -7
  56. package/templates/apps/api-auth/package.json +8 -8
  57. package/templates/apps/api-backend/package.json +7 -7
  58. package/templates/apps/api-backend-deactivation/package.json +7 -7
  59. package/templates/apps/api-backend-mail/package.json +8 -8
  60. package/templates/apps/api-backend-mariadb/package.json +9 -9
  61. package/templates/apps/api-backend-sqlite/package.json +8 -8
  62. package/templates/apps/api-backend-storage/package.json +8 -8
  63. package/templates/apps/api-cms/package.json +10 -10
  64. package/templates/apps/api-collab/package.json +8 -8
  65. package/templates/apps/api-data-advanced/package.json +8 -8
  66. package/templates/apps/api-durable/package.json +8 -8
  67. package/templates/apps/api-feature-flags/package.json +9 -9
  68. package/templates/apps/api-governance/package.json +8 -8
  69. package/templates/apps/api-kv/package.json +8 -8
  70. package/templates/apps/api-moderation/package.json +8 -8
  71. package/templates/apps/api-observability/package.json +8 -8
  72. package/templates/apps/api-ratelimit/package.json +8 -8
  73. package/templates/apps/api-rbac/package.json +8 -8
  74. package/templates/apps/api-rest/package.json +7 -7
  75. package/templates/apps/api-saas/package.json +11 -11
  76. package/templates/apps/api-saas-starter/package.json +10 -10
  77. package/templates/apps/api-search/package.json +8 -8
  78. package/templates/apps/api-status/package.json +8 -8
  79. package/templates/apps/api-versioning/package.json +8 -8
  80. package/templates/apps/api-webhooks/package.json +9 -9
  81. package/templates/apps/changelog/package.json +6 -6
  82. package/templates/apps/edge-functions/package.json +2 -2
  83. package/templates/apps/frontend-admin/package.json +8 -8
  84. package/templates/apps/frontend-app/package.json +9 -9
  85. package/templates/apps/frontend-auth/package.json +8 -8
  86. package/templates/apps/frontend-blank/package.json +7 -7
  87. package/templates/apps/frontend-cms/package.json +9 -9
  88. package/templates/apps/frontend-collab/package.json +10 -10
  89. package/templates/apps/frontend-contact/package.json +7 -7
  90. package/templates/apps/frontend-dashboard/package.json +7 -7
  91. package/templates/apps/frontend-docs/package.json +7 -7
  92. package/templates/apps/frontend-i18n/package.json +6 -6
  93. package/templates/apps/frontend-landing/package.json +7 -7
  94. package/templates/apps/frontend-portal/package.json +8 -8
  95. package/templates/apps/frontend-saas/package.json +8 -8
  96. package/templates/apps/frontend-spa/package.json +7 -7
  97. package/templates/apps/frontend-ssr/package.json +7 -7
  98. package/templates/apps/frontend-ssr-api/package.json +8 -8
  99. package/templates/apps/frontend-static-blog/package.json +6 -6
  100. package/templates/apps/frontend-status/package.json +8 -8
  101. package/templates/apps/mobile-app/package.json +4 -4
  102. package/dist/apiBuild-BWo8KI6n.js +0 -2
  103. package/dist/appGraph-KGDPTuTy.js +0 -110
  104. package/dist/appGraph-zuMGKVYX.js +0 -2
  105. package/dist/dbCommand-Bnl7MSGC.js +0 -2
  106. package/dist/doctorCommand-BmovAwb7.js +0 -2
  107. package/dist/inspect-DUze25t0.js +0 -2
  108. package/dist/manifestBuild-j0n109tt.js +0 -2
  109. package/dist/serveCommand-C_WI4TTG.js +0 -2
  110. package/dist/updateCommand-D91-TZ7E.js +0 -2
  111. package/dist/webDev-B79ji8M5.js +0 -2
@@ -1,21 +1,21 @@
1
1
  import { i as e, t } from "./nodeEnvironment-cGFAj1J8.js";
2
2
  import { r as n } from "./appPort-B_HpJ_ck.js";
3
- import { A as r, C as i, D as a, E as o, F as s, H as c, I as l, J as ee, L as u, M as d, N as f, O as te, P as p, R as m, S as h, T as ne, V as g, W as re, X as _, Y as v, Z as y, a as b, b as x, d as S, f as C, ht as w, i as ie, j as T, k as E, n as D, nt as O, q as k, s as ae, tt as A, vt as j, x as oe, y as M, z as se } from "./webDev-B4IEMB0n.js";
4
- import { o as N, t as P } from "./connectionConfig-Bk9IC7D0.js";
5
- import { A as F, D as I, a as ce, h as le, j as ue, k as de } from "./inspect-B7U7Cl_Z.js";
6
- import { a as fe, c as L, d as pe, f as R, l as me, p as he, u as ge } from "./renderModeScan-D7J1B7Kw.js";
7
- import { i as _e, n as ve, r as ye, t as be } from "./runtimeRegistry-DMeKfTHP.js";
8
- import { n as xe } from "./logFileSink-B4uP8pvf.js";
9
- import { t as Se } from "./inspectMetrics-CfdKLh6t.js";
10
- import { t as Ce } from "./bootTiming-BdyP9nYw.js";
11
- import { dirname as we, extname as Te, join as z, resolve as Ee } from "node:path";
3
+ import { A as r, B as i, C as a, D as o, E as s, F as c, G as l, H as u, I as d, J as f, L as ee, M as p, N as m, O as te, P as ne, Q as re, R as h, S as g, T as ie, U as _, X as v, Y as y, Z as b, a as x, b as S, d as C, f as w, gt as ae, i as oe, j as T, k as E, n as D, nt as O, rt as k, s as se, x as ce, y as A, yt as j, z as le } from "./webDev-B-ubQEMX.js";
4
+ import { o as M, t as N } from "./connectionConfig-Bk9IC7D0.js";
5
+ import { A as P, D as F, a as I, h as ue, j as de, k as fe } from "./inspect-CtL_xTbu.js";
6
+ import { a as pe, c as me, d as he, f as L, l as ge, p as _e, u as ve } from "./renderModeScan-D7J1B7Kw.js";
7
+ import { i as ye, n as be, r as xe, t as Se } from "./runtimeRegistry-DMeKfTHP.js";
8
+ import { n as Ce } from "./logFileSink-B4uP8pvf.js";
9
+ import { t as we } from "./inspectMetrics-CfdKLh6t.js";
10
+ import { t as Te } from "./bootTiming-BdyP9nYw.js";
11
+ import { dirname as Ee, extname as De, join as R, resolve as z } from "node:path";
12
12
  import { promises as B } from "node:fs";
13
13
  import { fileURLToPath as V, pathToFileURL as H } from "node:url";
14
- import { createLogger as U, printReadyBlock as De } from "@voltro/logger";
15
- import { snapshotMetricsSync as Oe } from "@voltro/runtime";
16
- import { createServer as ke } from "node:http";
14
+ import { createLogger as U, printReadyBlock as Oe } from "@voltro/logger";
15
+ import { snapshotMetricsSync as ke } from "@voltro/runtime";
16
+ import { createServer as Ae } from "node:http";
17
17
  //#region src/isrCdcInvalidator.ts
18
- var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
18
+ var W = U({ scope: "voltro:start:cdc" }), je = (e) => (t) => {
19
19
  let n = 0;
20
20
  for (let [r, i] of e.tableSubscriptionsByPattern) {
21
21
  if (!i.includes(t)) continue;
@@ -26,8 +26,8 @@ var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
26
26
  }));
27
27
  }
28
28
  return n;
29
- }, G = () => P() ? N() : null, je = (e) => {
30
- let t = e.channel ?? "framework_changes", n = Ae(e), r = null, i = null;
29
+ }, G = () => N() ? M() : null, Me = (e) => {
30
+ let t = e.channel ?? "framework_changes", n = je(e), r = null, i = null;
31
31
  return {
32
32
  start: async () => {
33
33
  if (e.tableSubscriptionsByPattern.size === 0) {
@@ -72,7 +72,7 @@ var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
72
72
  }
73
73
  }
74
74
  };
75
- }, K = U({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", J = (e) => `
75
+ }, K = U({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", Ne = (e) => `
76
76
  CREATE TABLE IF NOT EXISTS ${e} (
77
77
  cache_key TEXT PRIMARY KEY,
78
78
  html TEXT NOT NULL,
@@ -83,9 +83,9 @@ CREATE TABLE IF NOT EXISTS ${e} (
83
83
  stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
84
84
  );
85
85
  CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
86
- `, Me = (e) => {
86
+ `, Pe = (e) => {
87
87
  let t = e.tableName ?? q, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
88
- i || (i = !0, await n.query(J(t)));
88
+ i || (i = !0, await n.query(Ne(t)));
89
89
  })().then(async () => {
90
90
  let e = await n.query(`SELECT * FROM ${t}`);
91
91
  for (let t of e.rows) r.set(t.cache_key, {
@@ -145,14 +145,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
145
145
  return Array.from(r.entries());
146
146
  }
147
147
  };
148
- }, Y = U({ scope: "voltro:start" }), Ne = await (async () => {
148
+ }, J = U({ scope: "voltro:start" }), Fe = await (async () => {
149
149
  try {
150
- let e = z(we(V(import.meta.url)), "..", "package.json"), t = await B.readFile(e, "utf8");
150
+ let e = R(Ee(V(import.meta.url)), "..", "package.json"), t = await B.readFile(e, "utf8");
151
151
  return JSON.parse(t).version ?? "0.0.0";
152
152
  } catch {
153
153
  return "0.0.0";
154
154
  }
155
- })(), Pe = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", X = (e) => e instanceof Error && e._voltroControl === "not-found", Fe = {
155
+ })(), Y = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", Ie = (e) => e instanceof Error && e._voltroControl === "not-found", X = {
156
156
  ".html": "text/html; charset=utf-8",
157
157
  ".js": "application/javascript",
158
158
  ".mjs": "application/javascript",
@@ -170,13 +170,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
170
170
  ".woff": "font/woff",
171
171
  ".woff2": "font/woff2",
172
172
  ".txt": "text/plain; charset=utf-8"
173
- }, Ie = (e) => Fe[Te(e).toLowerCase()] ?? "application/octet-stream", Z = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Q = async (e) => {
173
+ }, Le = (e) => X[De(e).toLowerCase()] ?? "application/octet-stream", Re = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Z = async (e) => {
174
174
  try {
175
175
  return await B.stat(e), !0;
176
176
  } catch {
177
177
  return !1;
178
178
  }
179
- }, Le = (e) => {
179
+ }, Q = (e) => {
180
180
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
181
181
  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, "\\$&"));
182
182
  let a = i.join("/");
@@ -185,8 +185,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
185
185
  paramNames: t,
186
186
  priority: n
187
187
  };
188
- }, Re = (e) => e.map((e) => {
189
- let { regex: t, paramNames: n, priority: r } = Le(e.pattern);
188
+ }, ze = (e) => e.map((e) => {
189
+ let { regex: t, paramNames: n, priority: r } = Q(e.pattern);
190
190
  return {
191
191
  pattern: e.pattern,
192
192
  file: e.file,
@@ -195,7 +195,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
195
195
  paramNames: n,
196
196
  priority: r
197
197
  };
198
- }).slice().sort((e, t) => e.priority - t.priority), ze = (e, t) => {
198
+ }).slice().sort((e, t) => e.priority - t.priority), Be = (e, t) => {
199
199
  for (let n of t) {
200
200
  let t = n.regex.exec(e);
201
201
  if (!t) continue;
@@ -207,209 +207,213 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
207
207
  };
208
208
  }
209
209
  return null;
210
- }, Be = async (e) => {
211
- let { provider: t, route: n, params: i, pathname: c, dirs: ee, shellTemplate: f, requestHeaders: te, requestUrl: g = "", apiOrigin: re, apiName: _ } = e, { search: v } = m(g), y = await o(a(e.middlewares ?? [], {
210
+ }, Ve = async (e) => {
211
+ let { provider: t, route: n, params: i, pathname: a, dirs: l, shellTemplate: u, requestHeaders: f, requestUrl: te = "", apiOrigin: ne, apiName: re } = e, { search: _ } = le(te), v = await s(o(e.middlewares ?? [], {
212
212
  route: n.pattern,
213
- pathname: c
213
+ pathname: a
214
214
  }), {
215
- pathname: c,
216
- search: v,
217
- headers: te,
218
- cookies: ne(te.cookie),
215
+ pathname: a,
216
+ search: _,
217
+ headers: f,
218
+ cookies: ie(f.cookie),
219
219
  route: n.pattern
220
- }, e.onCookieWarning), x = y.headers, S = ie(re, x.cookie, {
221
- apiName: _,
222
- headers: x
223
- }), C = await t.getPage(n.pattern, n.file), w = L(C, n.file), D = w === "spa" && ae(ee, n.dirChain).some((e) => e.hasLayout);
224
- if (w !== "ssr" && w !== "isr" && !D) return null;
225
- let O = ae(ee, n.dirChain), k = {}, A = null, j, oe = new AbortController();
220
+ }, e.onCookieWarning), y = v.headers, b = oe(ne, y.cookie, {
221
+ apiName: re,
222
+ headers: y
223
+ }), S = await t.getPage(n.pattern, n.file), C = me(S, n.file), w = C === "spa" && se(l, n.dirChain).some((e) => e.hasLayout);
224
+ if (C !== "ssr" && C !== "isr" && !w) return null;
225
+ let ae = se(l, n.dirChain), D = {}, O = null, k, ce = new AbortController();
226
226
  try {
227
- (await t.getHelpers()).beginStoreSeeds(), {chain: j, segmentLoaderData: k} = await b({
228
- entries: O,
227
+ (await t.getHelpers()).beginStoreSeeds(), {chain: k, segmentLoaderData: D} = await x({
228
+ entries: ae,
229
229
  loadLayout: (e) => t.getLayout(e.dir),
230
230
  loadError: (e) => t.getError(e.dir),
231
231
  loadPending: (e) => t.getPending(e.dir),
232
232
  ctx: {
233
233
  params: i,
234
- pathname: c,
235
- search: v,
236
- signal: oe.signal,
237
- headers: x,
238
- query: S,
234
+ pathname: a,
235
+ search: _,
236
+ signal: ce.signal,
237
+ headers: y,
238
+ query: b,
239
239
  isServer: !0
240
240
  }
241
- }), typeof C.loader == "function" && !D && (A = await C.loader({
241
+ }), typeof S.loader == "function" && !w && (O = await S.loader({
242
242
  params: i,
243
- pathname: c,
244
- search: v,
245
- signal: oe.signal,
246
- headers: x,
247
- query: S,
243
+ pathname: a,
244
+ search: _,
245
+ signal: ce.signal,
246
+ headers: y,
247
+ query: b,
248
248
  isServer: !0
249
249
  }));
250
250
  } catch (e) {
251
- if (Pe(e)) return {
251
+ if (Y(e)) return {
252
252
  control: "redirect",
253
253
  status: e.status,
254
254
  location: e.location,
255
- setCookies: y.setCookies
255
+ setCookies: v.setCookies
256
256
  };
257
- if (X(e)) return {
257
+ if (Ie(e)) return {
258
258
  control: "not-found",
259
- setCookies: y.setCookies
259
+ setCookies: v.setCookies
260
260
  };
261
261
  throw e;
262
262
  }
263
- let M = await t.getHelpers();
264
- D || await E({
265
- pageMod: C,
263
+ let A = await t.getHelpers();
264
+ w || await E({
265
+ pageMod: S,
266
266
  params: i,
267
- query: S,
268
- apiName: _,
269
- seed: M.seedPreloadedSubscription,
270
- seedFailure: M.seedPreloadedSubscriptionFailure,
271
- onError: ({ tag: e, apiName: t }, n) => Y.warn("preload seed failed", {
267
+ query: b,
268
+ apiName: re,
269
+ seed: A.seedPreloadedSubscription,
270
+ seedFailure: A.seedPreloadedSubscriptionFailure,
271
+ onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
272
272
  tag: e,
273
273
  apiName: t,
274
- pathname: c
274
+ pathname: a
275
275
  }, n)
276
276
  });
277
- let se = {
277
+ let j = {
278
278
  pattern: n.pattern,
279
- Component: C.default,
280
- meta: C.meta,
281
- loader: C.loader,
282
- ErrorBoundary: C.ErrorBoundary,
283
- Pending: C.Pending,
284
- renderMode: w,
285
- chain: j
286
- }, N = {
287
- cookies: y.cookies,
288
- headers: x,
289
- url: g
290
- }, P = M.i18n?.resolve(x.cookie, x["accept-language"]), F = C.interactive ?? "full";
291
- if (D) {
292
- let e = s({
293
- helpers: M,
279
+ Component: S.default,
280
+ meta: S.meta,
281
+ loader: S.loader,
282
+ ErrorBoundary: S.ErrorBoundary,
283
+ Pending: S.Pending,
284
+ renderMode: C,
285
+ chain: k
286
+ }, M = {
287
+ cookies: v.cookies,
288
+ headers: y,
289
+ url: te
290
+ }, N = A.i18n?.resolve(y.cookie, y["accept-language"]), P = {
291
+ lang: N?.locale ?? M.cookies["voltro:locale"] ?? "en",
292
+ ...N?.timeZone === void 0 ? {} : { timeZone: N.timeZone },
293
+ renderedAt: Date.now()
294
+ }, F = S.interactive ?? "full";
295
+ if (w) {
296
+ let e = d({
297
+ helpers: A,
294
298
  page: n.pattern,
295
299
  interactive: F,
296
300
  delivery: "stream",
297
301
  renderInput: {
298
- descriptor: se,
302
+ descriptor: j,
299
303
  params: i,
300
- pathname: c,
301
- search: v,
302
- segmentLoaderData: k,
303
- requestContext: N,
304
- ...P ? {
305
- outerWrap: P.outerWrap,
306
- locale: P.locale
304
+ pathname: a,
305
+ search: _,
306
+ segmentLoaderData: D,
307
+ requestContext: M,
308
+ ...N ? {
309
+ outerWrap: N.outerWrap,
310
+ locale: N.locale
307
311
  } : {}
308
312
  }
309
- }), t = P?.locale ?? N.cookies["voltro:locale"] ?? "en", a = (t) => u({
310
- helpers: M,
313
+ }), t = (t) => h({
314
+ helpers: A,
311
315
  prepared: e,
312
316
  meta: t,
313
317
  interactive: F
314
318
  });
315
319
  if (e.hasDeferred) {
316
- let n = T({ shell: f });
320
+ let n = p({ shell: u });
317
321
  return {
318
322
  renderMode: "spa",
319
- setCookies: y.setCookies,
320
- stream: (r) => d({
323
+ setCookies: v.setCookies,
324
+ stream: (r) => m({
321
325
  res: r,
322
326
  shell: n,
323
- htmlLang: t,
327
+ documentAttrs: P,
324
328
  headers: {
325
329
  "content-type": "text/html; charset=utf-8",
326
330
  "x-voltro-rendered-by": "spa",
327
- ...h(y.setCookies)
331
+ ...g(v.setCookies)
328
332
  },
329
- headInjection: a,
330
- render: (t) => M.renderPageToStream({
333
+ headInjection: t,
334
+ render: (t) => A.renderPageToStream({
331
335
  ...e.renderInput,
332
336
  ...t
333
337
  }),
334
338
  onShellError: (e) => {
335
- Y.error("spa layout shell render failed", { pathname: c }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
339
+ J.error("spa layout shell render failed", { pathname: a }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
336
340
  }
337
341
  })
338
342
  };
339
343
  }
340
- let o = l({
341
- helpers: M,
344
+ let o = ee({
345
+ helpers: A,
342
346
  prepared: e
343
347
  });
344
348
  return {
345
- html: r(f.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), a(o.meta)).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
349
+ html: r(T(u.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), t(o.meta)), P),
346
350
  renderMode: "spa",
347
351
  revalidateMs: null,
348
- setCookies: y.setCookies
352
+ setCookies: v.setCookies
349
353
  };
350
354
  }
351
- let I = p({
352
- helpers: M,
355
+ let I = c({
356
+ helpers: A,
353
357
  page: n.pattern,
354
- pathname: c,
355
- renderMode: w,
358
+ pathname: a,
359
+ renderMode: C,
356
360
  interactive: F,
357
- loaderData: A,
358
- segmentLoaderData: k,
359
- pageLoaderRan: typeof C.loader == "function"
360
- }), ce = {
361
- descriptor: se,
361
+ loaderData: O,
362
+ segmentLoaderData: D,
363
+ pageLoaderRan: typeof S.loader == "function"
364
+ }), ue = {
365
+ descriptor: j,
362
366
  params: i,
363
- pathname: c,
364
- search: v,
367
+ pathname: a,
368
+ search: _,
365
369
  loaderData: I.loaderData,
366
370
  segmentLoaderData: I.segmentLoaderData,
367
- requestContext: N,
368
- ...P ? {
369
- outerWrap: P.outerWrap,
370
- locale: P.locale
371
+ requestContext: M,
372
+ ...N ? {
373
+ outerWrap: N.outerWrap,
374
+ locale: N.locale
371
375
  } : {}
372
- }, le = (e) => [
373
- M.renderMetaToHtml(e),
376
+ }, de = (e) => [
377
+ A.renderMetaToHtml(e),
374
378
  `<meta name="voltro-interactive" content="${F}" />`,
375
- ...I.hasDeferred ? [M.renderDeferredRegistryScript()] : [],
376
- M.renderRouterStateScript(I.stateInput)
379
+ ...I.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
380
+ A.renderRouterStateScript(I.stateInput)
377
381
  ].filter((e) => e.length > 0).join("\n ");
378
- if (w === "ssr" && F === "full" && e.buffered !== !0) {
379
- let e = P?.locale ?? N.cookies["voltro:locale"] ?? "en", t = T({ shell: f });
382
+ if (C === "ssr" && F === "full" && e.buffered !== !0) {
383
+ let e = p({ shell: u });
380
384
  return {
381
385
  renderMode: "ssr",
382
- setCookies: y.setCookies,
383
- stream: (n) => d({
384
- res: n,
385
- shell: t,
386
- htmlLang: e,
386
+ setCookies: v.setCookies,
387
+ stream: (t) => m({
388
+ res: t,
389
+ shell: e,
390
+ documentAttrs: P,
387
391
  headers: {
388
392
  "content-type": "text/html; charset=utf-8",
389
393
  "x-voltro-rendered-by": "ssr",
390
- ...h(y.setCookies)
394
+ ...g(v.setCookies)
391
395
  },
392
- headInjection: le,
393
- render: (e) => M.renderPageToStream({
394
- ...ce,
396
+ headInjection: de,
397
+ render: (e) => A.renderPageToStream({
398
+ ...ue,
395
399
  ...e
396
400
  }),
397
401
  onShellError: (e) => {
398
- Y.error("ssr shell render failed", { pathname: c }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
402
+ J.error("ssr shell render failed", { pathname: a }, e), t.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), t.end("server error");
399
403
  }
400
404
  })
401
405
  };
402
406
  }
403
- let { html: ue, meta: de } = M.renderPageToHtml(ce), fe = le(de), pe = P?.locale ?? N.cookies["voltro:locale"] ?? "en", R = r(f.replace("<div id=\"root\"></div>", `<div id="root">${ue}</div>`), fe).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${pe}"`);
404
- F === "none" && (R = Z(R));
405
- let me = w === "isr" ? he(C.revalidate) : null;
407
+ let { html: fe, meta: pe } = A.renderPageToHtml(ue), he = de(pe), L = r(T(u.replace("<div id=\"root\"></div>", `<div id="root">${fe}</div>`), he), P);
408
+ F === "none" && (L = Re(L));
409
+ let ge = C === "isr" ? _e(S.revalidate) : null;
406
410
  return {
407
- html: R,
408
- renderMode: w,
409
- revalidateMs: me,
410
- setCookies: y.setCookies
411
+ html: L,
412
+ renderMode: C,
413
+ revalidateMs: ge,
414
+ setCookies: v.setCookies
411
415
  };
412
- }, $ = (e) => e === "" ? "/" : e, Ve = async (e) => {
416
+ }, $ = (e) => e === "" ? "/" : e, He = async (e) => {
413
417
  let t = await import(H(e).href);
414
418
  return {
415
419
  kind: "bundle",
@@ -439,7 +443,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
439
443
  },
440
444
  async close() {}
441
445
  };
442
- }, He = async (e, t) => {
446
+ }, Ue = async (e, t) => {
443
447
  let n = await j("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
444
448
  root: t,
445
449
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
@@ -457,10 +461,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
457
461
  },
458
462
  appType: "custom",
459
463
  logLevel: "warn"
460
- }), o = z(e, "src", "pages"), s = (e) => e === "" ? o : z(o, e), c = A({
461
- limit: O(),
462
- onColdStart: (e) => Y.debug("ssr cold-compile start", { id: e }),
463
- onColdEnd: (e, { durationMs: t, failed: n }) => Y.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
464
+ }), o = R(e, "src", "pages"), s = (e) => e === "" ? o : R(o, e), c = O({
465
+ limit: k(),
466
+ onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
467
+ onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
464
468
  id: e,
465
469
  ms: t,
466
470
  ...n ? { failed: !0 } : {}
@@ -469,16 +473,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
469
473
  return {
470
474
  kind: "middleware",
471
475
  async getPage(e, t) {
472
- return l(z(o, t));
476
+ return l(R(o, t));
473
477
  },
474
478
  async getLayout(e) {
475
- return l(z(s(e), "layout.tsx"));
479
+ return l(R(s(e), "layout.tsx"));
476
480
  },
477
481
  async getError(e) {
478
- return l(z(s(e), "error.tsx"));
482
+ return l(R(s(e), "error.tsx"));
479
483
  },
480
484
  async getPending(e) {
481
- return l(z(s(e), "loading.tsx"));
485
+ return l(R(s(e), "loading.tsx"));
482
486
  },
483
487
  async getHelpers() {
484
488
  return await l("@voltro/web/ssr");
@@ -487,106 +491,106 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
487
491
  await a.close();
488
492
  }
489
493
  };
490
- }, Ue = async (t) => {
491
- let r = Ce(), s = await S(t);
492
- if (!s) return {
494
+ }, We = async (t) => {
495
+ let r = Te(), c = await C(t);
496
+ if (!c) return {
493
497
  ran: !1,
494
498
  exitCode: 0
495
499
  };
496
- if (s.type !== "web") return Y.error("only web apps are supported by `voltro start`"), {
500
+ if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
497
501
  ran: !0,
498
502
  exitCode: 1
499
503
  };
500
- let { resolved: l } = await w({
501
- rawEnv: s.env,
504
+ let { resolved: d } = await ae({
505
+ rawEnv: c.env,
502
506
  appType: "web",
503
507
  root: t,
504
- log: Y,
508
+ log: J,
505
509
  generateTypes: !1
506
- }), u = l.publicValues;
510
+ }), ee = d.publicValues;
507
511
  r.mark("config");
508
- let d = _();
509
- k(d), Y.info("booting voltro start", { app: s.name ?? "(unnamed)" });
510
- let p = n({
512
+ let p = b();
513
+ f(p), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
514
+ let m = n({
511
515
  kind: "web",
512
- configPort: s.port,
516
+ configPort: c.port,
513
517
  env: process.env,
514
- dashboardPin: process.env[se] === "1"
518
+ dashboardPin: process.env[i] === "1"
515
519
  });
516
- for (let e of p.warnings) Y.warn(e);
517
- let m = p.port, h = z(t, ".framework"), b = z(h, "dist"), ie = z(b, "index.html");
518
- if (!await Q(ie)) return Y.error("no built dist found — run `voltro build` first", { distDir: b }), {
520
+ for (let e of m.warnings) J.warn(e);
521
+ let h = m.port, g = R(t, ".framework"), x = R(g, "dist"), oe = R(x, "index.html");
522
+ if (!await Z(oe)) return J.error("no built dist found — run `voltro build` first", { distDir: x }), {
519
523
  ran: !0,
520
524
  exitCode: 1
521
525
  };
522
- let T = s.name ?? "unnamed", E = be("web", T, m), O = xe(T);
523
- await _e({
526
+ let T = c.name ?? "unnamed", E = Se("web", T, h), O = Ce(T);
527
+ await ye({
524
528
  id: E,
525
529
  name: T,
526
530
  kind: "web",
527
- url: `http://localhost:${m}`,
531
+ url: `http://localhost:${h}`,
528
532
  pid: process.pid,
529
533
  status: "booting",
530
534
  logFile: O.path
531
535
  }).catch(() => {});
532
- let A = z(b, "_voltro", "shell.html"), j = await Q(A) ? await B.readFile(A, "utf8") : await B.readFile(ie, "utf8"), L = await C(t, s), he = D(L[0]), we = L[0]?.name, Te = /* @__PURE__ */ new Set(), Ee = (e) => {
533
- Te.has(e.name) || (Te.add(e.name), Y.warn(`middleware.ts wrote the cookie "${e.name}" with the HttpOnly default — a browser SDK cannot read it`, {
536
+ let k = R(x, "_voltro", "shell.html"), j = await Z(k) ? await B.readFile(k, "utf8") : await B.readFile(oe, "utf8"), le = await w(t, c), me = D(le[0]), _e = le[0]?.name, Ee = /* @__PURE__ */ new Set(), De = (e) => {
537
+ Ee.has(e.name) || (Ee.add(e.name), J.warn(`middleware.ts wrote the cookie "${e.name}" with the HttpOnly default — a browser SDK cannot read it`, {
534
538
  cookie: e.name,
535
539
  hint: "If your IdP client reads this from `document.cookie` (Supabase's `createBrowserClient` does), pass `httpOnly: false`. Otherwise the SSR render succeeds and the user is signed out at the first client-side call. Set `httpOnly: true` explicitly to silence this."
536
540
  }));
537
- }, V = await i(t);
538
- V.length > 0 && Y.info(`middleware.ts loaded — ${V.length} middleware(s): ` + V.map((e) => e.exportName).join(", "));
539
- let H, U = null, W = process.env.SSR_CACHE === "postgres";
540
- if (W && P()) U = new (await (import("pg"))).default.Client(N()), await U.connect(), H = Me({ client: U }), Y.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
541
- else if (W) {
541
+ }, z = await a(t);
542
+ z.length > 0 && J.info(`middleware.ts loaded — ${z.length} middleware(s): ` + z.map((e) => e.exportName).join(", "));
543
+ let V, H = null, U = process.env.SSR_CACHE === "postgres";
544
+ if (U && N()) H = new (await (import("pg"))).default.Client(M()), await H.connect(), V = Pe({ client: H }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
545
+ else if (U) {
542
546
  let t = "SSR_CACHE=postgres, but nothing in the environment names a database (looked for DB_URL, DB_PRIMARY_URL, DB_DIRECT_URL, DB_MIGRATE_URL, DB_HOST, PG_HOST).";
543
- if (e()) throw Y.fatal(`${t} Refusing to fall back to the per-process memory cache: it is not shared between instances and does not survive a restart, so the pages this process serves would differ from its replicas' with nothing to indicate it.`), Error("[voltro start] SSR_CACHE=postgres with no database configured");
544
- H = R(), Y.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
545
- } else H = R(), Y.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
546
- await x(t, s, L, u);
547
- let Ae = z(t, "src", "pages"), { pages: G, dirs: K } = await M(Ae), q = Re(G);
548
- oe(V, q.map((e) => e.pattern)), r.mark("scan");
549
- let J = z(b, "server", "ssrEntry.js"), Pe = await Q(J);
550
- if (!Pe && process.env.NODE_ENV === "production") throw Y.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${J} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${J}`);
551
- let X = Pe ? await Ve(J) : await He(t, h);
552
- Y.info(`ssr loader: ${X.kind}`, {
553
- kind: X.kind,
554
- ...X.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
547
+ if (e()) throw J.fatal(`${t} Refusing to fall back to the per-process memory cache: it is not shared between instances and does not survive a restart, so the pages this process serves would differ from its replicas' with nothing to indicate it.`), Error("[voltro start] SSR_CACHE=postgres with no database configured");
548
+ V = L(), J.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
549
+ } else V = L(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
550
+ await S(t, c, le, ee);
551
+ let W = R(t, "src", "pages"), { pages: je, dirs: G } = await A(W), K = ze(je);
552
+ ce(z, K.map((e) => e.pattern)), r.mark("scan");
553
+ let q = R(x, "server", "ssrEntry.js"), Ne = await Z(q);
554
+ if (!Ne && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${q} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${q}`);
555
+ let Y = Ne ? await He(q) : await Ue(t, g);
556
+ J.info(`ssr loader: ${Y.kind}`, {
557
+ kind: Y.kind,
558
+ ...Y.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
555
559
  }), r.mark("provider");
556
- let Fe = X.getPageMeta?.(), Z = /* @__PURE__ */ new Map(), Le = 0;
557
- for (let e of G) {
558
- let t = Fe?.[e.pattern];
560
+ let Ie = Y.getPageMeta?.(), X = /* @__PURE__ */ new Map(), Re = 0;
561
+ for (let e of je) {
562
+ let t = Ie?.[e.pattern];
559
563
  if (t) {
560
- Z.set(e.pattern, t);
564
+ X.set(e.pattern, t);
561
565
  continue;
562
566
  }
563
567
  try {
564
- let t = await X.getPage(e.pattern, e.file);
565
- Z.set(e.pattern, fe(t, e.file)), Le++;
568
+ let t = await Y.getPage(e.pattern, e.file);
569
+ X.set(e.pattern, pe(t, e.file)), Re++;
566
570
  } catch (t) {
567
- Y.warn("failed to load page metadata", { pattern: e.pattern }, t);
571
+ J.warn("failed to load page metadata", { pattern: e.pattern }, t);
568
572
  }
569
573
  }
570
- Y.info(`registered ${Z.size} route(s)`, {
571
- count: Z.size,
572
- fromManifest: Z.size - Le,
573
- fromModules: Le
574
+ J.info(`registered ${X.size} route(s)`, {
575
+ count: X.size,
576
+ fromManifest: X.size - Re,
577
+ fromModules: Re
574
578
  }), r.mark("routes");
575
- let $ = /* @__PURE__ */ new Set();
576
- for (let e of q) Z.get(e.pattern)?.renderMode === "spa" && ae(K, e.dirChain).some((e) => e.hasLayout) && $.add(e.pattern);
577
- $.size > 0 && Y.info(`${$.size} spa route(s) render an SSR layout shell`, { patterns: [...$] });
578
- let Ue = /* @__PURE__ */ new Map();
579
- for (let [e, t] of Z) t.cacheInvalidatesOn.length > 0 && Ue.set(e, t.cacheInvalidatesOn);
579
+ let Q = /* @__PURE__ */ new Set();
580
+ for (let e of K) X.get(e.pattern)?.renderMode === "spa" && se(G, e.dirChain).some((e) => e.hasLayout) && Q.add(e.pattern);
581
+ Q.size > 0 && J.info(`${Q.size} spa route(s) render an SSR layout shell`, { patterns: [...Q] });
582
+ let $ = /* @__PURE__ */ new Map();
583
+ for (let [e, t] of X) t.cacheInvalidatesOn.length > 0 && $.set(e, t.cacheInvalidatesOn);
580
584
  let We = /* @__PURE__ */ new Map();
581
- for (let e of q) We.set(e.pattern, e.regex);
582
- let Ge = je({
583
- cache: H,
584
- tableSubscriptionsByPattern: Ue,
585
+ for (let e of K) We.set(e.pattern, e.regex);
586
+ let Ge = Me({
587
+ cache: V,
588
+ tableSubscriptionsByPattern: $,
585
589
  regexByPattern: We
586
590
  });
587
591
  await Ge.start(), r.mark("cdc");
588
- let Ke = Se(), qe = G.map((e) => {
589
- let t = Z.get(e.pattern);
592
+ let Ke = we(), qe = je.map((e) => {
593
+ let t = X.get(e.pattern);
590
594
  return {
591
595
  pattern: e.pattern,
592
596
  file: e.file,
@@ -601,20 +605,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
601
605
  hasMeta: t?.hasMeta ?? !1,
602
606
  hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
603
607
  };
604
- }), Je = K.map((e) => ({
608
+ }), Je = G.map((e) => ({
605
609
  dir: e.dir,
606
610
  hasLayout: e.hasLayout,
607
611
  hasError: e.hasError,
608
612
  hasPending: e.hasPending,
609
613
  hasNotFound: e.hasNotFound
610
- })), Ye = U ? "postgres" : "memory", Xe = {
614
+ })), Ye = H ? "postgres" : "memory", Xe = {
611
615
  kind: "web",
612
616
  meta: {
613
- name: s.name ?? "(unnamed)",
614
- voltroVersion: Ne,
615
- port: m,
617
+ name: c.name ?? "(unnamed)",
618
+ voltroVersion: Fe,
619
+ port: h,
616
620
  mode: "start",
617
- apis: Object.entries(s.apis ?? {}).map(([e, t]) => {
621
+ apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
618
622
  let n = {
619
623
  name: e,
620
624
  package: t.package
@@ -625,7 +629,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
625
629
  routes: qe,
626
630
  dirs: Je,
627
631
  cache: () => {
628
- let e = Date.now(), t = H.snapshot().map(([t, n]) => ({
632
+ let e = Date.now(), t = V.snapshot().map(([t, n]) => ({
629
633
  key: t,
630
634
  renderedAt: n.renderedAt,
631
635
  expiresAt: n.expiresAt,
@@ -637,15 +641,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
637
641
  }));
638
642
  return {
639
643
  backend: Ye,
640
- size: H.size(),
644
+ size: V.size(),
641
645
  entries: t
642
646
  };
643
647
  },
644
- metrics: () => Oe()
648
+ metrics: () => ke()
645
649
  }, Ze = async (e, n) => {
646
650
  let r = e.split("?")[0] ?? "/";
647
- if (s.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
648
- let e = await ve();
651
+ if (c.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
652
+ let e = await be();
649
653
  return {
650
654
  status: 200,
651
655
  headers: { "content-type": "application/json; charset=utf-8" },
@@ -658,7 +662,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
658
662
  body: `registry read error: ${e.message}`
659
663
  };
660
664
  }
661
- if (s.name === "voltroDashboard" && r === "/api/dashboard/config") {
665
+ if (c.name === "voltroDashboard" && r === "/api/dashboard/config") {
662
666
  let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
663
667
  if (e && e.trim().length > 0) {
664
668
  let n;
@@ -688,18 +692,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
688
692
  };
689
693
  }
690
694
  if (r === "/_voltro/inspect/logs") {
691
- let t = re(e, ee(), n);
695
+ let t = l(e, y(), n);
692
696
  return {
693
697
  status: t.status,
694
698
  headers: {
695
699
  "content-type": t.contentType,
696
- ...I(n.origin)
700
+ ...F(n.origin)
697
701
  },
698
702
  body: t.body
699
703
  };
700
704
  }
701
705
  if (r !== "/_voltro/inspect/stream") {
702
- let t = le(e, Xe, n);
706
+ let t = ue(e, Xe, n);
703
707
  if (t !== null) return {
704
708
  status: t.status,
705
709
  headers: {
@@ -709,96 +713,96 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
709
713
  body: t.body
710
714
  };
711
715
  }
712
- let i = ze(r, q), c = i ? Z.get(i.route.pattern)?.renderMode : void 0, l = c === "ssr" || c === "isr" || (i ? $.has(i.route.pattern) : !1), u = [];
713
- if (!l && V.length > 0) {
714
- let t = a(V, {
716
+ let i = Be(r, K), a = i ? X.get(i.route.pattern)?.renderMode : void 0, u = a === "ssr" || a === "isr" || (i ? Q.has(i.route.pattern) : !1), d = [];
717
+ if (!u && z.length > 0) {
718
+ let t = o(z, {
715
719
  route: void 0,
716
720
  pathname: r
717
721
  });
718
722
  if (t !== void 0) {
719
- let i = await o(t, {
723
+ let i = await s(t, {
720
724
  pathname: r,
721
725
  search: e.slice(r.length),
722
726
  headers: n,
723
- cookies: ne(n.cookie),
727
+ cookies: ie(n.cookie),
724
728
  route: void 0
725
729
  });
726
- u.push(...i.setCookies);
730
+ d.push(...i.setCookies);
727
731
  }
728
732
  }
729
- let p = (e) => u.length === 0 ? e : {
733
+ let f = (e) => d.length === 0 ? e : {
730
734
  ...e,
731
- "set-cookie": u.map(te)
732
- }, m = r === "/" ? z(b, "index.html") : z(b, r.replace(/^\//, ""), "index.html");
733
- if (!l && await Q(m)) {
734
- let e = await B.readFile(m);
735
+ "set-cookie": d.map(te)
736
+ }, ee = r === "/" ? R(x, "index.html") : R(x, r.replace(/^\//, ""), "index.html");
737
+ if (!u && await Z(ee)) {
738
+ let e = await B.readFile(ee);
735
739
  return {
736
740
  status: 200,
737
- headers: p({ "content-type": "text/html; charset=utf-8" }),
741
+ headers: f({ "content-type": "text/html; charset=utf-8" }),
738
742
  body: e
739
743
  };
740
744
  }
741
745
  if (/\.[a-z0-9]+$/i.test(r)) {
742
- let e = z(b, r.replace(/^\//, ""));
743
- if (await Q(e)) {
746
+ let e = R(x, r.replace(/^\//, ""));
747
+ if (await Z(e)) {
744
748
  let t = await B.readFile(e);
745
749
  return {
746
750
  status: 200,
747
- headers: p({ "content-type": Ie(e) }),
751
+ headers: f({ "content-type": Le(e) }),
748
752
  body: t
749
753
  };
750
754
  }
751
755
  }
752
- let h = ze(r, q);
753
- if (!h) return {
756
+ let m = Be(r, K);
757
+ if (!m) return {
754
758
  status: 404,
755
- headers: p({ "content-type": "text/plain" }),
759
+ headers: f({ "content-type": "text/plain" }),
756
760
  body: "not found"
757
761
  };
758
- let g = Z.get(h.route.pattern), _ = n["x-tenant"] ?? "anonymous", v = (await X.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, y = me(r, {
759
- ...g?.tenantAware ? { tenant: _ } : {},
760
- ...v ? { locale: v } : {}
761
- }), x = H.get(y), S = Date.now();
762
- if (x && ge(x, S)) return d.emit("cache", {
762
+ let re = X.get(m.route.pattern), h = n["x-tenant"] ?? "anonymous", g = (await Y.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, _ = ge(r, {
763
+ ...re?.tenantAware ? { tenant: h } : {},
764
+ ...g ? { locale: g } : {}
765
+ }), v = V.get(_), b = Date.now();
766
+ if (v && ve(v, b)) return p.emit("cache", {
763
767
  kind: "HIT",
764
- key: y,
765
- ageMs: S - x.renderedAt
768
+ key: _,
769
+ ageMs: b - v.renderedAt
766
770
  }), {
767
771
  status: 200,
768
772
  headers: {
769
773
  "content-type": "text/html; charset=utf-8",
770
774
  "x-voltro-rendered-by": "isr",
771
775
  "x-voltro-cache": "HIT",
772
- "x-voltro-cache-key": y,
773
- "x-voltro-cache-age-ms": String(S - x.renderedAt)
776
+ "x-voltro-cache-key": _,
777
+ "x-voltro-cache-age-ms": String(b - v.renderedAt)
774
778
  },
775
- body: x.html
779
+ body: v.html
776
780
  };
777
- if (x && pe(x, S)) return d.emit("cache", {
781
+ if (v && he(v, b)) return p.emit("cache", {
778
782
  kind: "STALE",
779
- key: y,
780
- ageMs: S - x.renderedAt
783
+ key: _,
784
+ ageMs: b - v.renderedAt
781
785
  }), (async () => {
782
786
  try {
783
- let i = await Be({
784
- provider: X,
787
+ let i = await Ve({
788
+ provider: Y,
785
789
  root: t,
786
- route: h.route,
787
- params: h.params,
790
+ route: m.route,
791
+ params: m.params,
788
792
  pathname: r,
789
- dirs: K,
793
+ dirs: G,
790
794
  shellTemplate: j,
791
795
  requestHeaders: n,
792
- apiOrigin: he,
793
- apiName: we,
794
- middlewares: V,
795
- onCookieWarning: Ee,
796
+ apiOrigin: me,
797
+ apiName: _e,
798
+ middlewares: z,
799
+ onCookieWarning: De,
796
800
  requestUrl: e,
797
801
  buffered: !0
798
802
  });
799
803
  if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
800
- let e = Z.get(h.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
801
- H.set(y, {
804
+ let e = X.get(m.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
805
+ V.set(_, {
802
806
  html: i.html,
803
807
  renderedAt: t,
804
808
  expiresAt: t + i.revalidateMs,
@@ -808,7 +812,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
808
812
  });
809
813
  }
810
814
  } catch (e) {
811
- Y.warn("background SWR refresh failed", { url: r }, e);
815
+ J.warn("background SWR refresh failed", { url: r }, e);
812
816
  }
813
817
  })(), {
814
818
  status: 200,
@@ -816,25 +820,25 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
816
820
  "content-type": "text/html; charset=utf-8",
817
821
  "x-voltro-rendered-by": "isr",
818
822
  "x-voltro-cache": "STALE",
819
- "x-voltro-cache-key": y,
820
- "x-voltro-cache-age-ms": String(S - x.renderedAt)
823
+ "x-voltro-cache-key": _,
824
+ "x-voltro-cache-age-ms": String(b - v.renderedAt)
821
825
  },
822
- body: x.html
826
+ body: v.html
823
827
  };
824
828
  try {
825
- let i = await Be({
826
- provider: X,
829
+ let i = await Ve({
830
+ provider: Y,
827
831
  root: t,
828
- route: h.route,
829
- params: h.params,
832
+ route: m.route,
833
+ params: m.params,
830
834
  pathname: r,
831
- dirs: K,
835
+ dirs: G,
832
836
  shellTemplate: j,
833
837
  requestHeaders: n,
834
- apiOrigin: he,
835
- apiName: we,
836
- middlewares: V,
837
- onCookieWarning: Ee,
838
+ apiOrigin: me,
839
+ apiName: _e,
840
+ middlewares: z,
841
+ onCookieWarning: De,
838
842
  requestUrl: e
839
843
  });
840
844
  if (!i) return {
@@ -875,23 +879,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
875
879
  "x-voltro-rendered-by": i.renderMode
876
880
  });
877
881
  if (i.renderMode === "isr" && i.revalidateMs !== null) {
878
- let e = Date.now(), t = Z.get(h.route.pattern)?.staleWhileRevalidateMs ?? 0;
879
- H.set(y, {
882
+ let e = Date.now(), t = X.get(m.route.pattern)?.staleWhileRevalidateMs ?? 0;
883
+ V.set(_, {
880
884
  html: i.html,
881
885
  renderedAt: e,
882
886
  expiresAt: e + i.revalidateMs,
883
887
  servableUntil: e + i.revalidateMs + t,
884
888
  revalidateMs: i.revalidateMs,
885
889
  staleWhileRevalidateMs: t
886
- }), s["x-voltro-cache"] = "MISS", s["x-voltro-cache-key"] = y, s["x-voltro-cache-revalidate-ms"] = String(i.revalidateMs), t > 0 && (s["x-voltro-cache-swr-ms"] = String(t)), d.emit("cache", {
890
+ }), s["x-voltro-cache"] = "MISS", s["x-voltro-cache-key"] = _, s["x-voltro-cache-revalidate-ms"] = String(i.revalidateMs), t > 0 && (s["x-voltro-cache-swr-ms"] = String(t)), p.emit("cache", {
887
891
  kind: "MISS",
888
- key: y,
892
+ key: _,
889
893
  revalidateMs: i.revalidateMs,
890
894
  swrMs: t
891
895
  });
892
- } else i.renderMode === "isr" && (s["x-voltro-cache"] = "BYPASS", d.emit("cache", {
896
+ } else i.renderMode === "isr" && (s["x-voltro-cache"] = "BYPASS", p.emit("cache", {
893
897
  kind: "BYPASS",
894
- key: y
898
+ key: _
895
899
  }));
896
900
  return {
897
901
  status: 200,
@@ -899,7 +903,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
899
903
  body: i.html
900
904
  };
901
905
  } catch (e) {
902
- return Y.error("render error", { url: r }, e), f(e) ? {
906
+ return J.error("render error", { url: r }, e), ne(e) ? {
903
907
  status: 500,
904
908
  headers: {
905
909
  "content-type": "text/plain; charset=utf-8",
@@ -912,7 +916,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
912
916
  body: "server error"
913
917
  };
914
918
  }
915
- }, Qe = !1, $e = ke(async (e, t) => {
919
+ }, Qe = !1, $e = Ae(async (e, t) => {
916
920
  let n = e.url ?? "/", r = Date.now(), i = {};
917
921
  for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
918
922
  let a = n.split("?")[0] ?? "/", o = (e.method ?? "GET").toUpperCase();
@@ -932,23 +936,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
932
936
  return;
933
937
  }
934
938
  if (o === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
935
- let e = I(i.origin);
939
+ let e = F(i.origin);
936
940
  t.writeHead(204, e), t.end();
937
941
  return;
938
942
  }
939
- if (s.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
943
+ if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
940
944
  let r = new URL(n, "http://x").searchParams.get("target");
941
945
  if (!r) {
942
946
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
943
947
  return;
944
948
  }
945
- if (!de(r)) {
949
+ if (!fe(r)) {
946
950
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
947
951
  return;
948
952
  }
949
953
  try {
950
954
  let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
951
- a ? n.authorization = Array.isArray(a) ? a[0] : a : ue(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
955
+ a ? n.authorization = Array.isArray(a) ? a[0] : a : de(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
952
956
  let s;
953
957
  if (o && o !== "GET" && o !== "HEAD") {
954
958
  let t = [];
@@ -972,20 +976,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
972
976
  }
973
977
  return;
974
978
  }
975
- if (s.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
979
+ if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
976
980
  let r = new URL(n, "http://x").searchParams.get("target");
977
981
  if (!r) {
978
982
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
979
983
  return;
980
984
  }
981
- if (!de(r)) {
985
+ if (!fe(r)) {
982
986
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
983
987
  return;
984
988
  }
985
989
  let a = new AbortController();
986
990
  e.on("close", () => a.abort()), t.on("close", () => a.abort());
987
991
  try {
988
- let e = i.authorization ?? (ue(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
992
+ let e = i.authorization ?? (de(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
989
993
  redirect: "manual",
990
994
  method: "GET",
991
995
  headers: {
@@ -1020,15 +1024,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1020
1024
  return;
1021
1025
  }
1022
1026
  if (a === "/_voltro/inspect/stream") {
1023
- let n = I(i.origin);
1024
- if (F()) {
1027
+ let n = F(i.origin);
1028
+ if (P()) {
1025
1029
  t.writeHead(503, {
1026
1030
  "content-type": "application/json",
1027
1031
  ...n
1028
1032
  }), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
1029
1033
  return;
1030
1034
  }
1031
- let r = ce(i, "GET");
1035
+ let r = I(i, "GET");
1032
1036
  if (!r.ok) {
1033
1037
  t.writeHead(401, {
1034
1038
  "content-type": "application/json",
@@ -1046,11 +1050,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1046
1050
  "x-accel-buffering": "no",
1047
1051
  ...n
1048
1052
  }), t.flushHeaders(), t.write("retry: 5000\n\n");
1049
- for (let e of d.buffered()) t.write(v(e));
1050
- let a = d.subscribe((e) => {
1053
+ for (let e of p.buffered()) t.write(v(e));
1054
+ let a = p.subscribe((e) => {
1051
1055
  t.write(v(e));
1052
1056
  }), o = setInterval(() => {
1053
- t.write(y());
1057
+ t.write(re());
1054
1058
  }, 15e3), s = () => {
1055
1059
  clearInterval(o), a();
1056
1060
  };
@@ -1061,14 +1065,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1061
1065
  let e = await Ze(n, i);
1062
1066
  if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
1063
1067
  let t = Date.now() - r;
1064
- d.emit("request", {
1068
+ p.emit("request", {
1065
1069
  url: a,
1066
1070
  status: e.status,
1067
1071
  durationMs: t,
1068
1072
  renderedBy: e.headers["x-voltro-rendered-by"],
1069
1073
  cache: e.headers["x-voltro-cache"]
1070
1074
  });
1071
- let n = ze(a, q)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1075
+ let n = Be(a, K)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1072
1076
  Ke.record({
1073
1077
  kind: "request",
1074
1078
  tag: n,
@@ -1080,56 +1084,56 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1080
1084
  t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
1081
1085
  }
1082
1086
  });
1083
- await new Promise((e) => $e.listen(m, "::", e)), Qe = !0, r.mark("ready"), Y.info(`listening on http://localhost:${m}`, {
1084
- port: m,
1085
- distDir: b
1086
- }), Y.debug("dynamic + ssr/isr routes resolve via SSR loader");
1087
+ await new Promise((e) => $e.listen(h, "::", e)), Qe = !0, r.mark("ready"), J.info(`listening on http://localhost:${h}`, {
1088
+ port: h,
1089
+ distDir: x
1090
+ }), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
1087
1091
  try {
1088
- await _e({
1092
+ await ye({
1089
1093
  id: E,
1090
1094
  name: T,
1091
1095
  kind: "web",
1092
- url: `http://localhost:${m}`,
1096
+ url: `http://localhost:${h}`,
1093
1097
  pid: process.pid,
1094
1098
  status: "live",
1095
1099
  logFile: O.path
1096
1100
  });
1097
- let e = c(t);
1101
+ let e = _(t);
1098
1102
  if (e) {
1099
- let t = await g({ dashboardAppPath: e });
1100
- t.status === "launched" ? Y.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Y.debug(`dashboard already running on :${t.port}`, { port: t.port });
1103
+ let t = await u({ dashboardAppPath: e });
1104
+ t.status === "launched" ? J.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && J.debug(`dashboard already running on :${t.port}`, { port: t.port });
1101
1105
  }
1102
1106
  setInterval(() => {
1103
- _e({
1107
+ ye({
1104
1108
  id: E,
1105
1109
  name: T,
1106
1110
  kind: "web",
1107
- url: `http://localhost:${m}`,
1111
+ url: `http://localhost:${h}`,
1108
1112
  pid: process.pid,
1109
1113
  status: "live",
1110
1114
  logFile: O.path
1111
1115
  }).catch(() => {});
1112
1116
  }, 1e4).unref();
1113
1117
  } catch (e) {
1114
- Y.warn("runtime-registry write failed", {}, e);
1118
+ J.warn("runtime-registry write failed", {}, e);
1115
1119
  }
1116
- De({
1117
- app: s.name ?? "unnamed",
1120
+ Oe({
1121
+ app: c.name ?? "unnamed",
1118
1122
  kind: "web",
1119
- url: `http://localhost:${m}`,
1123
+ url: `http://localhost:${h}`,
1120
1124
  bootMs: r.total()
1121
1125
  });
1122
1126
  let et = r.phaseBreakdown();
1123
- Y.info(`start: ready in ${r.total()}ms`, {
1127
+ J.info(`start: ready in ${r.total()}ms`, {
1124
1128
  bootMs: r.total(),
1125
1129
  ...et ? { phases: et } : {}
1126
1130
  });
1127
1131
  let tt = !1, nt = (e) => async () => {
1128
1132
  if (!tt) {
1129
- if (tt = !0, Y.info(`received ${e}, shutting down`, { signal: e }), $e.close(), await Ge.stop(), U) try {
1130
- await U.end();
1133
+ if (tt = !0, J.info(`received ${e}, shutting down`, { signal: e }), $e.close(), await Ge.stop(), H) try {
1134
+ await H.end();
1131
1135
  } catch {}
1132
- await X.close(), await ye(E), await O.dispose(), process.exit(0);
1136
+ await Y.close(), await xe(E), await O.dispose(), process.exit(0);
1133
1137
  }
1134
1138
  };
1135
1139
  process.on("SIGINT", nt("SIGINT")), process.on("SIGTERM", nt("SIGTERM"));
@@ -1141,10 +1145,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1141
1145
  e.unref();
1142
1146
  }
1143
1147
  return new Promise(() => {});
1144
- }, We = async (e) => {
1148
+ }, Ge = async (e) => {
1145
1149
  t("start");
1146
- let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await Ue(Ee(n));
1147
- return r.ran ? r.exitCode : (Y.error("no web app found at this path"), 1);
1150
+ let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await We(z(n));
1151
+ return r.ran ? r.exitCode : (J.error("no web app found at this path"), 1);
1148
1152
  };
1149
1153
  //#endregion
1150
- export { Ue as n, We as t };
1154
+ export { We as n, Ge as t };