@voltro/cli 0.16.0 → 0.17.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 (135) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/{apiBuild-BJtiqoOu.js → apiBuild-ChdlLqGv.js} +2 -2
  3. package/dist/apiBuild-D5WB119b.js +2 -0
  4. package/dist/bin.js +3 -3
  5. package/dist/{commands-8A5RU3MW.js → commands-DYQbv-DG.js} +2328 -2292
  6. package/dist/dbCommand-C3R5LrBZ.js +2 -0
  7. package/dist/{dbCommand-OPMtO0sX.js → dbCommand-DJSxnjPt.js} +2 -2
  8. package/dist/{dev-HdG7JdSk.js → dev-BCmoJfBm.js} +1 -1
  9. package/dist/{dev-DGjEvvkV.js → dev-DB7pbLob.js} +89 -89
  10. package/dist/{fileConventions-Cu0tM-Bl.js → fileConventions-CBNPZVOV.js} +1 -1
  11. package/dist/frameworkTableAssembly-DRJrAVr1.js +2 -0
  12. package/dist/{frameworkTableAssembly-BA2bAmYN.js → frameworkTableAssembly-sg41s14F.js} +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/{inspectMetrics-CYDSO3za.js → inspectMetrics-DWh56Qas.js} +205 -205
  15. package/dist/{serveCommand-C3lq3mFd.js → serveCommand-DO6qr5Ok.js} +5 -5
  16. package/dist/serveEntry.js +2 -2
  17. package/dist/{start-BtgatJN3.js → start-ksY0wMZG.js} +379 -379
  18. package/dist/startEntry.js +2 -2
  19. package/package.json +17 -17
  20. package/templates/AGENTS.core.md +24 -9
  21. package/templates/AGENTS.md +25 -10
  22. package/templates/agent-docs/_index.md +1 -1
  23. package/templates/agent-docs/cli.md +2 -2
  24. package/templates/agent-docs/database/migrations.md +3 -3
  25. package/templates/agent-docs/internationalization.md +3 -3
  26. package/templates/agent-docs/introduction.md +2 -2
  27. package/templates/agent-docs/reference.md +4 -4
  28. package/templates/agent-docs/routing.md +40 -40
  29. package/templates/agent-docs/templates/appshells.md +24 -24
  30. package/templates/agent-docs/whats-new.md +31 -95
  31. package/templates/apps/api-ai/package.json +7 -7
  32. package/templates/apps/api-auth/package.json +8 -8
  33. package/templates/apps/api-backend/package.json +7 -7
  34. package/templates/apps/api-backend-deactivation/package.json +7 -7
  35. package/templates/apps/api-backend-mail/package.json +8 -8
  36. package/templates/apps/api-backend-mariadb/package.json +9 -9
  37. package/templates/apps/api-backend-storage/package.json +8 -8
  38. package/templates/apps/api-data-advanced/package.json +8 -8
  39. package/templates/apps/api-durable/package.json +8 -8
  40. package/templates/apps/api-feature-flags/package.json +9 -9
  41. package/templates/apps/api-governance/package.json +8 -8
  42. package/templates/apps/api-kv/package.json +8 -8
  43. package/templates/apps/api-moderation/package.json +8 -8
  44. package/templates/apps/api-observability/package.json +8 -8
  45. package/templates/apps/api-ratelimit/package.json +8 -8
  46. package/templates/apps/api-rbac/package.json +8 -8
  47. package/templates/apps/api-rest/package.json +7 -7
  48. package/templates/apps/api-saas/package.json +11 -11
  49. package/templates/apps/api-search/package.json +8 -8
  50. package/templates/apps/api-versioning/package.json +8 -8
  51. package/templates/apps/api-webhooks/package.json +9 -9
  52. package/templates/apps/changelog/package.json +6 -6
  53. package/templates/apps/changelog/src/pages/[locale]/{[slug].page.tsx → [slug]/page.tsx} +4 -4
  54. package/templates/apps/changelog/src/pages/[locale]/mirrors.test.tsx +2 -2
  55. package/templates/apps/changelog/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  56. package/templates/apps/changelog/src/pages/{[slug].page.test.tsx → [slug]/page.test.tsx} +1 -1
  57. package/templates/apps/changelog/src/pages/{[slug].page.tsx → [slug]/page.tsx} +2 -2
  58. package/templates/apps/changelog/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  59. package/templates/apps/edge-functions/package.json +2 -2
  60. package/templates/apps/frontend-admin/package.json +8 -8
  61. package/templates/apps/frontend-admin/src/pages/(marketing)/{login.page.test.tsx → login/page.test.tsx} +2 -2
  62. package/templates/apps/frontend-admin/src/pages/(marketing)/{login.page.tsx → login/page.tsx} +2 -2
  63. package/templates/apps/frontend-admin/src/pages/(marketing)/{index.page.test.tsx → page.test.tsx} +1 -1
  64. package/templates/apps/frontend-admin/src/pages/admin/{[entity].page.tsx → [entity]/page.tsx} +1 -1
  65. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +1 -1
  66. package/templates/apps/frontend-admin/src/pages/admin/{index.page.test.tsx → page.test.tsx} +1 -1
  67. package/templates/apps/frontend-app/package.json +8 -8
  68. package/templates/apps/frontend-app/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  69. package/templates/apps/frontend-app/src/pages/{schema-ui.page.test.tsx → schema-ui/page.test.tsx} +2 -2
  70. package/templates/apps/frontend-app/src/pages/{schema-ui.page.tsx → schema-ui/page.tsx} +1 -1
  71. package/templates/apps/frontend-blank/package.json +7 -7
  72. package/templates/apps/frontend-blank/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  73. package/templates/apps/frontend-contact/package.json +7 -7
  74. package/templates/apps/frontend-contact/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  75. package/templates/apps/frontend-contact/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  76. package/templates/apps/frontend-dashboard/package.json +7 -7
  77. package/templates/apps/frontend-dashboard/src/pages/(marketing)/{login.page.test.tsx → login/page.test.tsx} +2 -2
  78. package/templates/apps/frontend-dashboard/src/pages/(marketing)/{login.page.tsx → login/page.tsx} +2 -2
  79. package/templates/apps/frontend-dashboard/src/pages/(marketing)/{index.page.test.tsx → page.test.tsx} +1 -1
  80. package/templates/apps/frontend-dashboard/src/pages/dashboard/{index.page.test.tsx → page.test.tsx} +1 -1
  81. package/templates/apps/frontend-dashboard/src/pages/dashboard/{settings.page.test.tsx → settings/page.test.tsx} +2 -2
  82. package/templates/apps/frontend-dashboard/src/pages/dashboard/{settings.page.tsx → settings/page.tsx} +2 -2
  83. package/templates/apps/frontend-docs/package.json +7 -7
  84. package/templates/apps/frontend-docs/src/pages/[locale]/docs/{[...slug].page.tsx → [...slug]/page.tsx} +4 -4
  85. package/templates/apps/frontend-docs/src/pages/[locale]/mirrors.test.tsx +2 -2
  86. package/templates/apps/frontend-docs/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  87. package/templates/apps/frontend-docs/src/pages/docs/{[...slug].page.test.tsx → [...slug]/page.test.tsx} +3 -3
  88. package/templates/apps/frontend-docs/src/pages/docs/{[...slug].page.tsx → [...slug]/page.tsx} +1 -1
  89. package/templates/apps/frontend-docs/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  90. package/templates/apps/frontend-i18n/package.json +6 -6
  91. package/templates/apps/frontend-i18n/src/pages/[locale]/{about.page.tsx → about/page.tsx} +3 -3
  92. package/templates/apps/frontend-i18n/src/pages/[locale]/mirrors.test.tsx +2 -2
  93. package/templates/apps/frontend-i18n/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  94. package/templates/apps/frontend-i18n/src/pages/{about.page.test.tsx → about/page.test.tsx} +3 -3
  95. package/templates/apps/frontend-i18n/src/pages/{about.page.tsx → about/page.tsx} +1 -1
  96. package/templates/apps/frontend-i18n/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  97. package/templates/apps/frontend-landing/package.json +7 -7
  98. package/templates/apps/frontend-landing/src/pages/[locale]/mirrors.test.tsx +1 -1
  99. package/templates/apps/frontend-landing/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  100. package/templates/apps/frontend-landing/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  101. package/templates/apps/frontend-spa/package.json +7 -7
  102. package/templates/apps/frontend-spa/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  103. package/templates/apps/frontend-ssr/package.json +7 -7
  104. package/templates/apps/frontend-ssr/src/pages/{feed.page.test.tsx → feed/page.test.tsx} +2 -2
  105. package/templates/apps/frontend-ssr/src/pages/{feed.page.tsx → feed/page.tsx} +1 -1
  106. package/templates/apps/frontend-ssr/src/pages/{feed-swr.page.test.tsx → feed-swr/page.test.tsx} +2 -2
  107. package/templates/apps/frontend-ssr/src/pages/{feed-swr.page.tsx → feed-swr/page.tsx} +1 -1
  108. package/templates/apps/frontend-ssr/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  109. package/templates/apps/frontend-ssr-api/package.json +8 -8
  110. package/templates/apps/frontend-ssr-api/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  111. package/templates/apps/frontend-static-blog/package.json +6 -6
  112. package/templates/apps/frontend-static-blog/src/pages/[locale]/blog/{[slug].page.tsx → [slug]/page.tsx} +4 -4
  113. package/templates/apps/frontend-static-blog/src/pages/[locale]/mirrors.test.tsx +2 -2
  114. package/templates/apps/frontend-static-blog/src/pages/[locale]/{index.page.tsx → page.tsx} +2 -2
  115. package/templates/apps/frontend-static-blog/src/pages/blog/{[slug].page.test.tsx → [slug]/page.test.tsx} +3 -3
  116. package/templates/apps/frontend-static-blog/src/pages/blog/{[slug].page.tsx → [slug]/page.tsx} +3 -3
  117. package/templates/apps/frontend-static-blog/src/pages/{index.page.test.tsx → page.test.tsx} +1 -1
  118. package/dist/apiBuild-BOczx9-m.js +0 -2
  119. package/dist/dbCommand-DNQ6l-su.js +0 -2
  120. package/dist/frameworkTableAssembly-D1zJSgOU.js +0 -2
  121. /package/templates/apps/changelog/src/pages/{index.page.tsx → page.tsx} +0 -0
  122. /package/templates/apps/frontend-admin/src/pages/(marketing)/{index.page.tsx → page.tsx} +0 -0
  123. /package/templates/apps/frontend-admin/src/pages/admin/{index.page.tsx → page.tsx} +0 -0
  124. /package/templates/apps/frontend-app/src/pages/{index.page.tsx → page.tsx} +0 -0
  125. /package/templates/apps/frontend-blank/src/pages/{index.page.tsx → page.tsx} +0 -0
  126. /package/templates/apps/frontend-contact/src/pages/{index.page.tsx → page.tsx} +0 -0
  127. /package/templates/apps/frontend-dashboard/src/pages/(marketing)/{index.page.tsx → page.tsx} +0 -0
  128. /package/templates/apps/frontend-dashboard/src/pages/dashboard/{index.page.tsx → page.tsx} +0 -0
  129. /package/templates/apps/frontend-docs/src/pages/{index.page.tsx → page.tsx} +0 -0
  130. /package/templates/apps/frontend-i18n/src/pages/{index.page.tsx → page.tsx} +0 -0
  131. /package/templates/apps/frontend-landing/src/pages/{index.page.tsx → page.tsx} +0 -0
  132. /package/templates/apps/frontend-spa/src/pages/{index.page.tsx → page.tsx} +0 -0
  133. /package/templates/apps/frontend-ssr/src/pages/{index.page.tsx → page.tsx} +0 -0
  134. /package/templates/apps/frontend-ssr-api/src/pages/{index.page.tsx → page.tsx} +0 -0
  135. /package/templates/apps/frontend-static-blog/src/pages/{index.page.tsx → page.tsx} +0 -0
@@ -1,14 +1,14 @@
1
- import { A as e, C as t, E as n, G as r, I as i, J as a, K as o, N as s, O as c, V as l, W as u, X as d, Z as f, _ as ee, a as p, at as m, b as h, c as g, ct as _, dt as v, f as te, g as y, h as b, i as x, it as ne, j as S, k as C, m as w, nt as T, o as re, p as ie, q as E, r as D, rt as O, s as k, t as A, tt as j, v as M, w as ae, y as N } from "./inspectMetrics-CYDSO3za.js";
2
- import { D as oe, E as se, T as ce, a as P, p as le, w as ue } from "./inspect-Dwx0_tUj.js";
3
- import { t as de } from "./bootTiming-BdyP9nYw.js";
4
- import { dirname as fe, extname as F, join as I, resolve as L } from "node:path";
5
- import { fileURLToPath as R, pathToFileURL as z } from "node:url";
6
- import { createLogger as B, printReadyBlock as pe } from "@voltro/logger";
7
- import { promises as V } from "node:fs";
8
- import { snapshotMetricsSync as me } from "@voltro/runtime";
9
- import { createServer as he } from "node:http";
1
+ import { A as e, B as t, C as n, E as r, G as i, I as a, K as o, N as s, O as c, U as l, W as ee, X as u, Y as d, _ as f, a as p, b as m, c as h, et as g, f as _, g as te, h as v, i as ne, it as y, j as b, k as x, m as S, nt as C, o as re, p as ie, q as w, r as ae, rt as T, s as E, st as D, t as O, tt as k, ut as A, v as j, w as oe, y as M } from "./inspectMetrics-DWh56Qas.js";
2
+ import { D as se, E as ce, T as le, a as N, p as ue, w as de } from "./inspect-Dwx0_tUj.js";
3
+ import { t as fe } from "./bootTiming-BdyP9nYw.js";
4
+ import { dirname as pe, extname as P, join as F, resolve as I } from "node:path";
5
+ import { fileURLToPath as L, pathToFileURL as R } from "node:url";
6
+ import { createLogger as z, printReadyBlock as me } from "@voltro/logger";
7
+ import { promises as B } from "node:fs";
8
+ import { snapshotMetricsSync as he } from "@voltro/runtime";
9
+ import { createServer as ge } from "node:http";
10
10
  //#region src/isrCdcInvalidator.ts
11
- var H = B({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
11
+ var V = z({ scope: "voltro:start:cdc" }), H = (e) => (t) => {
12
12
  let n = 0;
13
13
  for (let [r, i] of e.tableSubscriptionsByPattern) {
14
14
  if (!i.includes(t)) continue;
@@ -19,23 +19,23 @@ var H = B({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
19
19
  }));
20
20
  }
21
21
  return n;
22
- }, W = () => !process.env.PG_HOST && !process.env.PG_DATABASE ? null : {
22
+ }, U = () => !process.env.PG_HOST && !process.env.PG_DATABASE ? null : {
23
23
  host: process.env.PG_HOST ?? "localhost",
24
24
  port: Number(process.env.PG_PORT ?? 5432),
25
25
  user: process.env.PG_USER ?? "app",
26
26
  password: process.env.PG_PASSWORD ?? "app",
27
27
  database: process.env.PG_DATABASE ?? "app"
28
- }, ge = (e) => {
29
- let t = e.channel ?? "framework_changes", n = U(e), r = null, i = null;
28
+ }, _e = (e) => {
29
+ let t = e.channel ?? "framework_changes", n = H(e), r = null, i = null;
30
30
  return {
31
31
  start: async () => {
32
- let a = W();
32
+ let a = U();
33
33
  if (!a) {
34
- H.debug("skipped — no PG_* env vars set");
34
+ V.debug("skipped — no PG_* env vars set");
35
35
  return;
36
36
  }
37
37
  if (e.tableSubscriptionsByPattern.size === 0) {
38
- H.debug("skipped — no pages declare cacheInvalidatesOn");
38
+ V.debug("skipped — no pages declare cacheInvalidatesOn");
39
39
  return;
40
40
  }
41
41
  r = new (await (import("pg"))).default.Client(a), await r.connect(), i = (e) => {
@@ -44,16 +44,16 @@ var H = B({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
44
44
  try {
45
45
  r = JSON.parse(e.payload);
46
46
  } catch (e) {
47
- H.warn("bad CDC payload", {}, e);
47
+ V.warn("bad CDC payload", {}, e);
48
48
  return;
49
49
  }
50
50
  let i = n(r.table);
51
- i > 0 && H.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
51
+ i > 0 && V.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
52
52
  op: r.op,
53
53
  table: r.table,
54
54
  dropped: i
55
55
  });
56
- }, r.on("notification", i), await r.query(`LISTEN ${t}`), H.info(`LISTEN ${t}`, {
56
+ }, r.on("notification", i), await r.query(`LISTEN ${t}`), V.info(`LISTEN ${t}`, {
57
57
  channel: t,
58
58
  host: a.host,
59
59
  port: a.port,
@@ -69,7 +69,7 @@ var H = B({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
69
69
  }
70
70
  }
71
71
  };
72
- }, G = B({ scope: "voltro:start:isr-cache" }), K = "voltro_isr_cache", _e = (e) => `
72
+ }, W = z({ scope: "voltro:start:isr-cache" }), G = "voltro_isr_cache", ve = (e) => `
73
73
  CREATE TABLE IF NOT EXISTS ${e} (
74
74
  cache_key TEXT PRIMARY KEY,
75
75
  html TEXT NOT NULL,
@@ -80,9 +80,9 @@ CREATE TABLE IF NOT EXISTS ${e} (
80
80
  stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
81
81
  );
82
82
  CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
83
- `, ve = (e) => {
84
- let t = e.tableName ?? K, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
85
- i || (i = !0, await n.query(_e(t)));
83
+ `, ye = (e) => {
84
+ let t = e.tableName ?? G, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
85
+ i || (i = !0, await n.query(ve(t)));
86
86
  })().then(async () => {
87
87
  let e = await n.query(`SELECT * FROM ${t}`);
88
88
  for (let t of e.rows) r.set(t.cache_key, {
@@ -94,10 +94,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
94
94
  staleWhileRevalidateMs: Number(t.stale_while_revalidate_ms)
95
95
  });
96
96
  }).catch((e) => {
97
- G.warn("postgres bootstrap failed", {}, e);
97
+ W.warn("postgres bootstrap failed", {}, e);
98
98
  }), o = (e, t) => {
99
99
  a.then(() => n.query(e, t)).catch((e) => {
100
- G.warn("postgres write failed", {}, e);
100
+ W.warn("postgres write failed", {}, e);
101
101
  });
102
102
  };
103
103
  return {
@@ -142,14 +142,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
142
142
  return Array.from(r.entries());
143
143
  }
144
144
  };
145
- }, q = B({ scope: "voltro:start" }), ye = await (async () => {
145
+ }, K = z({ scope: "voltro:start" }), be = await (async () => {
146
146
  try {
147
- let e = I(fe(R(import.meta.url)), "..", "package.json"), t = await V.readFile(e, "utf8");
147
+ let e = F(pe(L(import.meta.url)), "..", "package.json"), t = await B.readFile(e, "utf8");
148
148
  return JSON.parse(t).version ?? "0.0.0";
149
149
  } catch {
150
150
  return "0.0.0";
151
151
  }
152
- })(), J = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", be = (e) => e instanceof Error && e._voltroControl === "not-found", Y = {
152
+ })(), q = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", xe = (e) => e instanceof Error && e._voltroControl === "not-found", J = {
153
153
  ".html": "text/html; charset=utf-8",
154
154
  ".js": "application/javascript",
155
155
  ".mjs": "application/javascript",
@@ -167,13 +167,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
167
167
  ".woff": "font/woff",
168
168
  ".woff2": "font/woff2",
169
169
  ".txt": "text/plain; charset=utf-8"
170
- }, xe = (e) => Y[F(e).toLowerCase()] ?? "application/octet-stream", X = (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) => {
170
+ }, Se = (e) => J[P(e).toLowerCase()] ?? "application/octet-stream", Y = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), X = async (e) => {
171
171
  try {
172
- return await V.stat(e), !0;
172
+ return await B.stat(e), !0;
173
173
  } catch {
174
174
  return !1;
175
175
  }
176
- }, Q = (e) => {
176
+ }, Z = (e) => {
177
177
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
178
178
  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, "\\$&"));
179
179
  let a = i.join("/");
@@ -182,8 +182,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
182
182
  paramNames: t,
183
183
  priority: n
184
184
  };
185
- }, Se = (e) => e.map((e) => {
186
- let { regex: t, paramNames: n, priority: r } = Q(e.pattern);
185
+ }, Ce = (e) => e.map((e) => {
186
+ let { regex: t, paramNames: n, priority: r } = Z(e.pattern);
187
187
  return {
188
188
  pattern: e.pattern,
189
189
  file: e.file,
@@ -192,7 +192,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
192
192
  paramNames: n,
193
193
  priority: r
194
194
  };
195
- }).slice().sort((e, t) => e.priority - t.priority), Ce = (e, t) => {
195
+ }).slice().sort((e, t) => e.priority - t.priority), we = (e, t) => {
196
196
  for (let n of t) {
197
197
  let t = n.regex.exec(e);
198
198
  if (!t) continue;
@@ -204,81 +204,81 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
204
204
  };
205
205
  }
206
206
  return null;
207
- }, we = async (e) => {
208
- let { provider: t, route: n, params: r, pathname: a, dirs: o, shellTemplate: s, requestHeaders: c, requestUrl: l = "", apiOrigin: u, apiName: d } = e, f = x(u, c.cookie, { apiName: d }), g = await t.getPage(n.pattern, n.file), _ = i(g, n.file), v = _ === "spa" && re(o, n.dirChain).some((e) => e.hasLayout);
209
- if (_ !== "ssr" && _ !== "isr" && !v) return null;
210
- let te = re(o, n.dirChain), y = {}, ne = null, S, C = new AbortController();
207
+ }, Te = async (e) => {
208
+ let { provider: t, route: n, params: r, pathname: i, dirs: o, shellTemplate: s, requestHeaders: c, requestUrl: l = "", apiOrigin: ee, apiName: u } = e, d = ne(ee, c.cookie, { apiName: u }), h = await t.getPage(n.pattern, n.file), g = a(h, n.file), _ = g === "spa" && re(o, n.dirChain).some((e) => e.hasLayout);
209
+ if (g !== "ssr" && g !== "isr" && !_) return null;
210
+ let te = re(o, n.dirChain), b = {}, x = null, C, ie = new AbortController();
211
211
  try {
212
- (await t.getHelpers()).beginStoreSeeds(), {chain: S, segmentLoaderData: y} = await p({
212
+ (await t.getHelpers()).beginStoreSeeds(), {chain: C, segmentLoaderData: b} = await p({
213
213
  entries: te,
214
214
  loadLayout: (e) => t.getLayout(e.dir),
215
215
  loadError: (e) => t.getError(e.dir),
216
216
  loadPending: (e) => t.getPending(e.dir),
217
217
  ctx: {
218
218
  params: r,
219
- pathname: a,
220
- signal: C.signal,
219
+ pathname: i,
220
+ signal: ie.signal,
221
221
  headers: c,
222
- query: f
222
+ query: d
223
223
  }
224
- }), typeof g.loader == "function" && !v && (ne = await g.loader({
224
+ }), typeof h.loader == "function" && !_ && (x = await h.loader({
225
225
  params: r,
226
- pathname: a,
227
- signal: C.signal,
226
+ pathname: i,
227
+ signal: ie.signal,
228
228
  headers: c,
229
- query: f
229
+ query: d
230
230
  }));
231
231
  } catch (e) {
232
- if (J(e)) return {
232
+ if (q(e)) return {
233
233
  control: "redirect",
234
234
  status: e.status,
235
235
  location: e.location
236
236
  };
237
- if (be(e)) return { control: "not-found" };
237
+ if (xe(e)) return { control: "not-found" };
238
238
  throw e;
239
239
  }
240
- let T = await t.getHelpers(), ie = {
240
+ let w = await t.getHelpers(), ae = {
241
241
  pattern: n.pattern,
242
- Component: g.default,
243
- meta: g.meta,
244
- loader: g.loader,
245
- ErrorBoundary: g.ErrorBoundary,
246
- Pending: g.Pending,
247
- renderMode: _,
248
- chain: S
249
- }, E = {
250
- cookies: T.parseCookieHeader(c.cookie),
242
+ Component: h.default,
243
+ meta: h.meta,
244
+ loader: h.loader,
245
+ ErrorBoundary: h.ErrorBoundary,
246
+ Pending: h.Pending,
247
+ renderMode: g,
248
+ chain: C
249
+ }, T = {
250
+ cookies: w.parseCookieHeader(c.cookie),
251
251
  headers: c,
252
252
  url: l
253
- }, D = T.i18n?.resolve(c.cookie, c["accept-language"]), O = g.interactive ?? "full";
254
- if (v) {
255
- let e = M({
256
- helpers: T,
253
+ }, E = w.i18n?.resolve(c.cookie, c["accept-language"]), D = h.interactive ?? "full";
254
+ if (_) {
255
+ let e = j({
256
+ helpers: w,
257
257
  page: n.pattern,
258
- interactive: O,
258
+ interactive: D,
259
259
  delivery: "stream",
260
260
  renderInput: {
261
- descriptor: ie,
261
+ descriptor: ae,
262
262
  params: r,
263
- pathname: a,
264
- segmentLoaderData: y,
265
- requestContext: E,
266
- ...D ? {
267
- outerWrap: D.outerWrap,
268
- locale: D.locale
263
+ pathname: i,
264
+ segmentLoaderData: b,
265
+ requestContext: T,
266
+ ...E ? {
267
+ outerWrap: E.outerWrap,
268
+ locale: E.locale
269
269
  } : {}
270
270
  }
271
- }), t = D?.locale ?? E.cookies["voltro:lang"] ?? "en", i = (t) => h({
272
- helpers: T,
271
+ }), t = E?.locale ?? T.cookies["voltro:lang"] ?? "en", a = (t) => m({
272
+ helpers: w,
273
273
  prepared: e,
274
274
  meta: t,
275
- interactive: O
275
+ interactive: D
276
276
  });
277
277
  if (e.hasDeferred) {
278
- let n = w({ shell: s });
278
+ let n = S({ shell: s });
279
279
  return {
280
280
  renderMode: "spa",
281
- stream: (r) => b({
281
+ stream: (r) => v({
282
282
  res: r,
283
283
  shell: n,
284
284
  htmlLang: t,
@@ -286,58 +286,58 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
286
286
  "content-type": "text/html; charset=utf-8",
287
287
  "x-voltro-rendered-by": "spa"
288
288
  },
289
- headInjection: i,
290
- render: (t) => T.renderPageToStream({
289
+ headInjection: a,
290
+ render: (t) => w.renderPageToStream({
291
291
  ...e.renderInput,
292
292
  ...t
293
293
  }),
294
294
  onShellError: (e) => {
295
- q.error("spa layout shell render failed", { pathname: a }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
295
+ K.error("spa layout shell render failed", { pathname: i }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
296
296
  }
297
297
  })
298
298
  };
299
299
  }
300
- let o = N({
301
- helpers: T,
300
+ let o = M({
301
+ helpers: w,
302
302
  prepared: e
303
303
  });
304
304
  return {
305
- html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${i(o.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
305
+ html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${a(o.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
306
306
  renderMode: "spa",
307
307
  revalidateMs: null
308
308
  };
309
309
  }
310
- let k = ee({
311
- helpers: T,
310
+ let O = f({
311
+ helpers: w,
312
312
  page: n.pattern,
313
- pathname: a,
314
- renderMode: _,
315
- interactive: O,
316
- loaderData: ne,
317
- segmentLoaderData: y,
318
- pageLoaderRan: typeof g.loader == "function"
319
- }), A = {
320
- descriptor: ie,
313
+ pathname: i,
314
+ renderMode: g,
315
+ interactive: D,
316
+ loaderData: x,
317
+ segmentLoaderData: b,
318
+ pageLoaderRan: typeof h.loader == "function"
319
+ }), k = {
320
+ descriptor: ae,
321
321
  params: r,
322
- pathname: a,
323
- loaderData: k.loaderData,
324
- segmentLoaderData: k.segmentLoaderData,
325
- requestContext: E,
326
- ...D ? {
327
- outerWrap: D.outerWrap,
328
- locale: D.locale
322
+ pathname: i,
323
+ loaderData: O.loaderData,
324
+ segmentLoaderData: O.segmentLoaderData,
325
+ requestContext: T,
326
+ ...E ? {
327
+ outerWrap: E.outerWrap,
328
+ locale: E.locale
329
329
  } : {}
330
- }, j = (e) => [
331
- T.renderMetaToHtml(e),
332
- `<meta name="voltro-interactive" content="${O}" />`,
333
- ...k.hasDeferred ? [T.renderDeferredRegistryScript()] : [],
334
- T.renderRouterStateScript(k.stateInput)
330
+ }, A = (e) => [
331
+ w.renderMetaToHtml(e),
332
+ `<meta name="voltro-interactive" content="${D}" />`,
333
+ ...O.hasDeferred ? [w.renderDeferredRegistryScript()] : [],
334
+ w.renderRouterStateScript(O.stateInput)
335
335
  ].filter((e) => e.length > 0).join("\n ");
336
- if (_ === "ssr" && O === "full" && e.buffered !== !0) {
337
- let e = D?.locale ?? E.cookies["voltro:lang"] ?? "en", t = w({ shell: s });
336
+ if (g === "ssr" && D === "full" && e.buffered !== !0) {
337
+ let e = E?.locale ?? T.cookies["voltro:lang"] ?? "en", t = S({ shell: s });
338
338
  return {
339
339
  renderMode: "ssr",
340
- stream: (n) => b({
340
+ stream: (n) => v({
341
341
  res: n,
342
342
  shell: t,
343
343
  htmlLang: e,
@@ -345,27 +345,27 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
345
345
  "content-type": "text/html; charset=utf-8",
346
346
  "x-voltro-rendered-by": "ssr"
347
347
  },
348
- headInjection: j,
349
- render: (e) => T.renderPageToStream({
350
- ...A,
348
+ headInjection: A,
349
+ render: (e) => w.renderPageToStream({
350
+ ...k,
351
351
  ...e
352
352
  }),
353
353
  onShellError: (e) => {
354
- q.error("ssr shell render failed", { pathname: a }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
354
+ K.error("ssr shell render failed", { pathname: i }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
355
355
  }
356
356
  })
357
357
  };
358
358
  }
359
- let { html: ae, meta: oe } = T.renderPageToHtml(A), se = j(oe), ce = D?.locale ?? E.cookies["voltro:lang"] ?? "en", P = s.replace("<div id=\"root\"></div>", `<div id="root">${ae}</div>`).replace("</head>", ` ${se}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${ce}"`);
360
- O === "none" && (P = X(P));
361
- let le = _ === "isr" ? m(g.revalidate) : null;
359
+ let { html: oe, meta: se } = w.renderPageToHtml(k), ce = A(se), le = E?.locale ?? T.cookies["voltro:lang"] ?? "en", N = s.replace("<div id=\"root\"></div>", `<div id="root">${oe}</div>`).replace("</head>", ` ${ce}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${le}"`);
360
+ D === "none" && (N = Y(N));
361
+ let ue = g === "isr" ? y(h.revalidate) : null;
362
362
  return {
363
- html: P,
364
- renderMode: _,
365
- revalidateMs: le
363
+ html: N,
364
+ renderMode: g,
365
+ revalidateMs: ue
366
366
  };
367
- }, $ = (e) => e === "" ? "/" : e, Te = async (e) => {
368
- let t = await import(z(e).href);
367
+ }, Q = (e) => e === "" ? "/" : e, Ee = async (e) => {
368
+ let t = await import(R(e).href);
369
369
  return {
370
370
  kind: "bundle",
371
371
  getPageMeta: () => t.pageMeta,
@@ -375,18 +375,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
375
375
  return typeof r == "function" ? await r() : r;
376
376
  },
377
377
  async getLayout(e) {
378
- let n = t.layouts[$(e)];
379
- if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${$(e)}`);
378
+ let n = t.layouts[Q(e)];
379
+ if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${Q(e)}`);
380
380
  return typeof n == "function" ? await n() : n;
381
381
  },
382
382
  async getError(e) {
383
- let n = t.errors[$(e)];
384
- if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${$(e)}`);
383
+ let n = t.errors[Q(e)];
384
+ if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${Q(e)}`);
385
385
  return typeof n == "function" ? await n() : n;
386
386
  },
387
387
  async getPending(e) {
388
- let n = t.pendings[$(e)];
389
- if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${$(e)}`);
388
+ let n = t.pendings[Q(e)];
389
+ if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${Q(e)}`);
390
390
  return typeof n == "function" ? await n() : n;
391
391
  },
392
392
  async getHelpers() {
@@ -394,8 +394,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
394
394
  },
395
395
  async close() {}
396
396
  };
397
- }, Ee = async (e, t) => {
398
- let n = await v("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
397
+ }, De = async (e, t) => {
398
+ let n = await A("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
399
399
  root: t,
400
400
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
401
401
  plugins: [r(), i()],
@@ -407,20 +407,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
407
407
  },
408
408
  appType: "custom",
409
409
  logLevel: "warn"
410
- }), o = I(e, "src", "pages"), s = (e) => e === "" ? o : I(o, e), c = d({ limit: f() }), l = (e) => c.load(e, async () => await a.ssrLoadModule(e));
410
+ }), o = F(e, "src", "pages"), s = (e) => e === "" ? o : F(o, e), c = d({ limit: u() }), l = (e) => c.load(e, async () => await a.ssrLoadModule(e));
411
411
  return {
412
412
  kind: "middleware",
413
413
  async getPage(e, t) {
414
- return l(I(o, t));
414
+ return l(F(o, t));
415
415
  },
416
416
  async getLayout(e) {
417
- return l(I(s(e), "layout.tsx"));
417
+ return l(F(s(e), "layout.tsx"));
418
418
  },
419
419
  async getError(e) {
420
- return l(I(s(e), "error.tsx"));
420
+ return l(F(s(e), "error.tsx"));
421
421
  },
422
422
  async getPending(e) {
423
- return l(I(s(e), "loading.tsx"));
423
+ return l(F(s(e), "loading.tsx"));
424
424
  },
425
425
  async getHelpers() {
426
426
  return await l("@voltro/web/ssr");
@@ -429,99 +429,99 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
429
429
  await a.close();
430
430
  }
431
431
  };
432
- }, De = async (i) => {
433
- let d = de(), f = await k(i);
434
- if (!f) return {
432
+ }, Oe = async (a) => {
433
+ let u = fe(), d = await E(a);
434
+ if (!d) return {
435
435
  ran: !1,
436
436
  exitCode: 0
437
437
  };
438
- if (f.type !== "web") return q.error("only web apps are supported by `voltro start`"), {
438
+ if (d.type !== "web") return K.error("only web apps are supported by `voltro start`"), {
439
439
  ran: !0,
440
440
  exitCode: 1
441
441
  };
442
- let { resolved: ee } = await _({
443
- rawEnv: f.env,
442
+ let { resolved: f } = await D({
443
+ rawEnv: d.env,
444
444
  appType: "web",
445
- root: i,
446
- log: q,
445
+ root: a,
446
+ log: K,
447
447
  generateTypes: !1
448
- }), p = ee.publicValues;
449
- d.mark("config");
450
- let m = E();
451
- u(m), q.info("booting voltro start", { app: f.name ?? "(unnamed)" });
452
- let h = (() => {
448
+ }), p = f.publicValues;
449
+ u.mark("config");
450
+ let m = o();
451
+ l(m), K.info("booting voltro start", { app: d.name ?? "(unnamed)" });
452
+ let v = (() => {
453
453
  if (process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT) return Number(process.env.VOLTRO_DASHBOARD_PORT);
454
454
  if (process.env.PORT) {
455
455
  let e = Number(process.env.PORT);
456
456
  if (Number.isFinite(e) && e > 0) return e;
457
457
  }
458
- return f.port ?? 5173;
459
- })(), v = I(i, ".framework"), b = I(v, "dist"), x = I(b, "index.html");
460
- if (!await Z(x)) return q.error("no built dist found — run `voltro build` first", { distDir: b }), {
458
+ return d.port ?? 5173;
459
+ })(), ne = F(a, ".framework"), y = F(ne, "dist"), S = F(y, "index.html");
460
+ if (!await X(S)) return K.error("no built dist found — run `voltro build` first", { distDir: y }), {
461
461
  ran: !0,
462
462
  exitCode: 1
463
463
  };
464
- let w = f.name ?? "unnamed", M = c("web", w, h), N = n(w);
465
- await S({
466
- id: M,
467
- name: w,
464
+ let A = d.name ?? "unnamed", j = c("web", A, v), M = r(A);
465
+ await b({
466
+ id: j,
467
+ name: A,
468
468
  kind: "web",
469
- url: `http://localhost:${h}`,
469
+ url: `http://localhost:${v}`,
470
470
  pid: process.pid,
471
471
  status: "booting",
472
- logFile: N.path
472
+ logFile: M.path
473
473
  }).catch(() => {});
474
- let fe = I(b, "_voltro", "shell.html"), F = await Z(fe) ? await V.readFile(fe, "utf8") : await V.readFile(x, "utf8"), L = await g(i, f), R = D(L[0]), z = L[0]?.name, B, H = null;
475
- process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (H = new (await (import("pg"))).default.Client({
474
+ let pe = F(y, "_voltro", "shell.html"), P = await X(pe) ? await B.readFile(pe, "utf8") : await B.readFile(S, "utf8"), I = await h(a, d), L = ae(I[0]), R = I[0]?.name, z, V = null;
475
+ process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (V = new (await (import("pg"))).default.Client({
476
476
  host: process.env.PG_HOST,
477
477
  port: Number(process.env.PG_PORT ?? 5432),
478
478
  user: process.env.PG_USER ?? "app",
479
479
  password: process.env.PG_PASSWORD ?? "app",
480
480
  database: process.env.PG_DATABASE ?? "app"
481
- }), await H.connect(), B = ve({ client: H }), q.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (B = ne(), q.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await ie(i, f, L, p);
482
- let { pages: U, dirs: W } = await te(I(i, "src", "pages")), G = Se(U);
483
- d.mark("scan");
484
- let K = I(b, "server", "ssrEntry.js"), _e = await Z(K);
485
- if (!_e && process.env.NODE_ENV === "production") throw q.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${K} 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 ${K}`);
486
- let J = _e ? await Te(K) : await Ee(i, v);
487
- q.info(`ssr loader: ${J.kind}`, {
488
- kind: J.kind,
489
- ...J.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
490
- }), d.mark("provider");
491
- let be = J.getPageMeta?.(), Y = /* @__PURE__ */ new Map(), X = 0;
492
- for (let e of U) {
493
- let t = be?.[e.pattern];
481
+ }), await V.connect(), z = ye({ client: V }), K.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = T(), K.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await ie(a, d, I, p);
482
+ let { pages: H, dirs: U } = await _(F(a, "src", "pages")), W = Ce(H);
483
+ u.mark("scan");
484
+ let G = F(y, "server", "ssrEntry.js"), ve = await X(G);
485
+ if (!ve && process.env.NODE_ENV === "production") throw K.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${G} 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 ${G}`);
486
+ let q = ve ? await Ee(G) : await De(a, ne);
487
+ K.info(`ssr loader: ${q.kind}`, {
488
+ kind: q.kind,
489
+ ...q.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
490
+ }), u.mark("provider");
491
+ let xe = q.getPageMeta?.(), J = /* @__PURE__ */ new Map(), Y = 0;
492
+ for (let e of H) {
493
+ let t = xe?.[e.pattern];
494
494
  if (t) {
495
- Y.set(e.pattern, t);
495
+ J.set(e.pattern, t);
496
496
  continue;
497
497
  }
498
498
  try {
499
- let t = await J.getPage(e.pattern, e.file);
500
- Y.set(e.pattern, s(t, e.file)), X++;
499
+ let t = await q.getPage(e.pattern, e.file);
500
+ J.set(e.pattern, s(t, e.file)), Y++;
501
501
  } catch (t) {
502
- q.warn("failed to load page metadata", { pattern: e.pattern }, t);
502
+ K.warn("failed to load page metadata", { pattern: e.pattern }, t);
503
503
  }
504
504
  }
505
- q.info(`registered ${Y.size} route(s)`, {
506
- count: Y.size,
507
- fromManifest: Y.size - X,
508
- fromModules: X
509
- }), d.mark("routes");
510
- let Q = /* @__PURE__ */ new Set();
511
- for (let e of G) Y.get(e.pattern)?.renderMode === "spa" && re(W, e.dirChain).some((e) => e.hasLayout) && Q.add(e.pattern);
512
- Q.size > 0 && q.info(`${Q.size} spa route(s) render an SSR layout shell`, { patterns: [...Q] });
513
- let $ = /* @__PURE__ */ new Map();
514
- for (let [e, t] of Y) t.cacheInvalidatesOn.length > 0 && $.set(e, t.cacheInvalidatesOn);
515
- let De = /* @__PURE__ */ new Map();
516
- for (let e of G) De.set(e.pattern, e.regex);
517
- let Oe = ge({
518
- cache: B,
519
- tableSubscriptionsByPattern: $,
520
- regexByPattern: De
505
+ K.info(`registered ${J.size} route(s)`, {
506
+ count: J.size,
507
+ fromManifest: J.size - Y,
508
+ fromModules: Y
509
+ }), u.mark("routes");
510
+ let Z = /* @__PURE__ */ new Set();
511
+ for (let e of W) J.get(e.pattern)?.renderMode === "spa" && re(U, e.dirChain).some((e) => e.hasLayout) && Z.add(e.pattern);
512
+ Z.size > 0 && K.info(`${Z.size} spa route(s) render an SSR layout shell`, { patterns: [...Z] });
513
+ let Q = /* @__PURE__ */ new Map();
514
+ for (let [e, t] of J) t.cacheInvalidatesOn.length > 0 && Q.set(e, t.cacheInvalidatesOn);
515
+ let Oe = /* @__PURE__ */ new Map();
516
+ for (let e of W) Oe.set(e.pattern, e.regex);
517
+ let ke = _e({
518
+ cache: z,
519
+ tableSubscriptionsByPattern: Q,
520
+ regexByPattern: Oe
521
521
  });
522
- await Oe.start(), d.mark("cdc");
523
- let ke = A(), Ae = U.map((e) => {
524
- let t = Y.get(e.pattern);
522
+ await ke.start(), u.mark("cdc");
523
+ let Ae = O(), je = H.map((e) => {
524
+ let t = J.get(e.pattern);
525
525
  return {
526
526
  pattern: e.pattern,
527
527
  file: e.file,
@@ -536,20 +536,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
536
536
  hasMeta: t?.hasMeta ?? !1,
537
537
  hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
538
538
  };
539
- }), je = W.map((e) => ({
539
+ }), Me = U.map((e) => ({
540
540
  dir: e.dir,
541
541
  hasLayout: e.hasLayout,
542
542
  hasError: e.hasError,
543
543
  hasPending: e.hasPending,
544
544
  hasNotFound: e.hasNotFound
545
- })), Me = H ? "postgres" : "memory", Ne = {
545
+ })), Ne = V ? "postgres" : "memory", Pe = {
546
546
  kind: "web",
547
547
  meta: {
548
- name: f.name ?? "(unnamed)",
549
- voltroVersion: ye,
550
- port: h,
548
+ name: d.name ?? "(unnamed)",
549
+ voltroVersion: be,
550
+ port: v,
551
551
  mode: "start",
552
- apis: Object.entries(f.apis ?? {}).map(([e, t]) => {
552
+ apis: Object.entries(d.apis ?? {}).map(([e, t]) => {
553
553
  let n = {
554
554
  name: e,
555
555
  package: t.package
@@ -557,10 +557,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
557
557
  return t.url !== void 0 && (n.url = t.url), n;
558
558
  })
559
559
  },
560
- routes: Ae,
561
- dirs: je,
560
+ routes: je,
561
+ dirs: Me,
562
562
  cache: () => {
563
- let e = Date.now(), t = B.snapshot().map(([t, n]) => ({
563
+ let e = Date.now(), t = z.snapshot().map(([t, n]) => ({
564
564
  key: t,
565
565
  renderedAt: n.renderedAt,
566
566
  expiresAt: n.expiresAt,
@@ -571,16 +571,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
571
571
  staleWhileRevalidateMs: n.staleWhileRevalidateMs
572
572
  }));
573
573
  return {
574
- backend: Me,
575
- size: B.size(),
574
+ backend: Ne,
575
+ size: z.size(),
576
576
  entries: t
577
577
  };
578
578
  },
579
- metrics: () => me()
580
- }, Pe = async (e, t) => {
581
- let n = e.split("?")[0] ?? "/";
582
- if (f.name === "voltroDashboard" && n === "/api/dashboard/registry") try {
583
- let e = await C();
579
+ metrics: () => he()
580
+ }, Fe = async (e, n) => {
581
+ let r = e.split("?")[0] ?? "/";
582
+ if (d.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
583
+ let e = await x();
584
584
  return {
585
585
  status: 200,
586
586
  headers: { "content-type": "application/json; charset=utf-8" },
@@ -593,7 +593,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
593
593
  body: `registry read error: ${e.message}`
594
594
  };
595
595
  }
596
- if (f.name === "voltroDashboard" && n === "/api/dashboard/config") {
596
+ if (d.name === "voltroDashboard" && r === "/api/dashboard/config") {
597
597
  let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
598
598
  if (e && e.trim().length > 0) {
599
599
  let n;
@@ -622,59 +622,59 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
622
622
  body: JSON.stringify({ apps: t })
623
623
  };
624
624
  }
625
- if (n === "/_voltro/inspect/logs") {
626
- let n = l(e, r(), t);
625
+ if (r === "/_voltro/inspect/logs") {
626
+ let r = t(e, ee(), n);
627
627
  return {
628
- status: n.status,
628
+ status: r.status,
629
629
  headers: {
630
- "content-type": n.contentType,
631
- ...ue(t.origin)
630
+ "content-type": r.contentType,
631
+ ...de(n.origin)
632
632
  },
633
- body: n.body
633
+ body: r.body
634
634
  };
635
635
  }
636
- if (n !== "/_voltro/inspect/stream") {
637
- let n = le(e, Ne, t);
638
- if (n !== null) return {
639
- status: n.status,
636
+ if (r !== "/_voltro/inspect/stream") {
637
+ let t = ue(e, Pe, n);
638
+ if (t !== null) return {
639
+ status: t.status,
640
640
  headers: {
641
- "content-type": n.contentType,
642
- ...n.headers ?? {}
641
+ "content-type": t.contentType,
642
+ ...t.headers ?? {}
643
643
  },
644
- body: n.body
644
+ body: t.body
645
645
  };
646
646
  }
647
- let a = Ce(n, G), o = a ? Y.get(a.route.pattern)?.renderMode : void 0, s = o === "ssr" || o === "isr" || (a ? Q.has(a.route.pattern) : !1), c = n === "/" ? I(b, "index.html") : I(b, n.replace(/^\//, ""), "index.html");
648
- if (!s && await Z(c)) return {
647
+ let i = we(r, W), o = i ? J.get(i.route.pattern)?.renderMode : void 0, s = o === "ssr" || o === "isr" || (i ? Z.has(i.route.pattern) : !1), c = r === "/" ? F(y, "index.html") : F(y, r.replace(/^\//, ""), "index.html");
648
+ if (!s && await X(c)) return {
649
649
  status: 200,
650
650
  headers: { "content-type": "text/html; charset=utf-8" },
651
- body: await V.readFile(c)
651
+ body: await B.readFile(c)
652
652
  };
653
- if (/\.[a-z0-9]+$/i.test(n)) {
654
- let e = I(b, n.replace(/^\//, ""));
655
- if (await Z(e)) {
656
- let t = await V.readFile(e);
653
+ if (/\.[a-z0-9]+$/i.test(r)) {
654
+ let e = F(y, r.replace(/^\//, ""));
655
+ if (await X(e)) {
656
+ let t = await B.readFile(e);
657
657
  return {
658
658
  status: 200,
659
- headers: { "content-type": xe(e) },
659
+ headers: { "content-type": Se(e) },
660
660
  body: t
661
661
  };
662
662
  }
663
663
  }
664
- let u = Ce(n, G);
665
- if (!u) return {
664
+ let l = we(r, W);
665
+ if (!l) return {
666
666
  status: 404,
667
667
  headers: { "content-type": "text/plain" },
668
668
  body: "not found"
669
669
  };
670
- let d = Y.get(u.route.pattern), ee = t["x-tenant"] ?? "anonymous", p = (await J.getHelpers()).i18n?.resolve(t.cookie, t["accept-language"])?.locale, h = j(n, {
671
- ...d?.tenantAware ? { tenant: ee } : {},
670
+ let u = J.get(l.route.pattern), f = n["x-tenant"] ?? "anonymous", p = (await q.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, h = g(r, {
671
+ ...u?.tenantAware ? { tenant: f } : {},
672
672
  ...p ? { locale: p } : {}
673
- }), g = B.get(h), _ = Date.now();
674
- if (g && T(g, _)) return m.emit("cache", {
673
+ }), _ = z.get(h), v = Date.now();
674
+ if (_ && k(_, v)) return m.emit("cache", {
675
675
  kind: "HIT",
676
676
  key: h,
677
- ageMs: _ - g.renderedAt
677
+ ageMs: v - _.renderedAt
678
678
  }), {
679
679
  status: 200,
680
680
  headers: {
@@ -682,43 +682,43 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
682
682
  "x-voltro-rendered-by": "isr",
683
683
  "x-voltro-cache": "HIT",
684
684
  "x-voltro-cache-key": h,
685
- "x-voltro-cache-age-ms": String(_ - g.renderedAt)
685
+ "x-voltro-cache-age-ms": String(v - _.renderedAt)
686
686
  },
687
- body: g.html
687
+ body: _.html
688
688
  };
689
- if (g && O(g, _)) return m.emit("cache", {
689
+ if (_ && C(_, v)) return m.emit("cache", {
690
690
  kind: "STALE",
691
691
  key: h,
692
- ageMs: _ - g.renderedAt
692
+ ageMs: v - _.renderedAt
693
693
  }), (async () => {
694
694
  try {
695
- let r = await we({
696
- provider: J,
697
- root: i,
698
- route: u.route,
699
- params: u.params,
700
- pathname: n,
701
- dirs: W,
702
- shellTemplate: F,
703
- requestHeaders: t,
704
- apiOrigin: R,
705
- apiName: z,
695
+ let t = await Te({
696
+ provider: q,
697
+ root: a,
698
+ route: l.route,
699
+ params: l.params,
700
+ pathname: r,
701
+ dirs: U,
702
+ shellTemplate: P,
703
+ requestHeaders: n,
704
+ apiOrigin: L,
705
+ apiName: R,
706
706
  requestUrl: e,
707
707
  buffered: !0
708
708
  });
709
- if (r && "html" in r && r.renderMode === "isr" && r.revalidateMs !== null) {
710
- let e = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
711
- B.set(h, {
712
- html: r.html,
713
- renderedAt: t,
714
- expiresAt: t + r.revalidateMs,
715
- servableUntil: t + r.revalidateMs + e,
716
- revalidateMs: r.revalidateMs,
709
+ if (t && "html" in t && t.renderMode === "isr" && t.revalidateMs !== null) {
710
+ let e = J.get(l.route.pattern)?.staleWhileRevalidateMs ?? 0, n = Date.now();
711
+ z.set(h, {
712
+ html: t.html,
713
+ renderedAt: n,
714
+ expiresAt: n + t.revalidateMs,
715
+ servableUntil: n + t.revalidateMs + e,
716
+ revalidateMs: t.revalidateMs,
717
717
  staleWhileRevalidateMs: e
718
718
  });
719
719
  }
720
720
  } catch (e) {
721
- q.warn("background SWR refresh failed", { url: n }, e);
721
+ K.warn("background SWR refresh failed", { url: r }, e);
722
722
  }
723
723
  })(), {
724
724
  status: 200,
@@ -727,42 +727,42 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
727
727
  "x-voltro-rendered-by": "isr",
728
728
  "x-voltro-cache": "STALE",
729
729
  "x-voltro-cache-key": h,
730
- "x-voltro-cache-age-ms": String(_ - g.renderedAt)
730
+ "x-voltro-cache-age-ms": String(v - _.renderedAt)
731
731
  },
732
- body: g.html
732
+ body: _.html
733
733
  };
734
734
  try {
735
- let r = await we({
736
- provider: J,
737
- root: i,
738
- route: u.route,
739
- params: u.params,
740
- pathname: n,
741
- dirs: W,
742
- shellTemplate: F,
743
- requestHeaders: t,
744
- apiOrigin: R,
745
- apiName: z,
735
+ let t = await Te({
736
+ provider: q,
737
+ root: a,
738
+ route: l.route,
739
+ params: l.params,
740
+ pathname: r,
741
+ dirs: U,
742
+ shellTemplate: P,
743
+ requestHeaders: n,
744
+ apiOrigin: L,
745
+ apiName: R,
746
746
  requestUrl: e
747
747
  });
748
- if (!r) return {
748
+ if (!t) return {
749
749
  status: 200,
750
750
  headers: {
751
751
  "content-type": "text/html; charset=utf-8",
752
752
  "x-voltro-rendered-by": "spa-fallback"
753
753
  },
754
- body: F
754
+ body: P
755
755
  };
756
- if ("stream" in r) return {
756
+ if ("stream" in t) return {
757
757
  status: 200,
758
- headers: { "x-voltro-rendered-by": r.renderMode },
758
+ headers: { "x-voltro-rendered-by": t.renderMode },
759
759
  body: "",
760
- stream: r.stream
760
+ stream: t.stream
761
761
  };
762
- if ("control" in r) return r.control === "redirect" ? {
763
- status: r.status,
762
+ if ("control" in t) return t.control === "redirect" ? {
763
+ status: t.status,
764
764
  headers: {
765
- location: r.location,
765
+ location: t.location,
766
766
  "x-voltro-rendered-by": "loader-redirect"
767
767
  },
768
768
  body: ""
@@ -774,36 +774,36 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
774
774
  },
775
775
  body: "not found"
776
776
  };
777
- let a = {
777
+ let i = {
778
778
  "content-type": "text/html; charset=utf-8",
779
- "x-voltro-rendered-by": r.renderMode
779
+ "x-voltro-rendered-by": t.renderMode
780
780
  };
781
- if (r.renderMode === "isr" && r.revalidateMs !== null) {
782
- let e = Date.now(), t = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0;
783
- B.set(h, {
784
- html: r.html,
781
+ if (t.renderMode === "isr" && t.revalidateMs !== null) {
782
+ let e = Date.now(), n = J.get(l.route.pattern)?.staleWhileRevalidateMs ?? 0;
783
+ z.set(h, {
784
+ html: t.html,
785
785
  renderedAt: e,
786
- expiresAt: e + r.revalidateMs,
787
- servableUntil: e + r.revalidateMs + t,
788
- revalidateMs: r.revalidateMs,
789
- staleWhileRevalidateMs: t
790
- }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = h, a["x-voltro-cache-revalidate-ms"] = String(r.revalidateMs), t > 0 && (a["x-voltro-cache-swr-ms"] = String(t)), m.emit("cache", {
786
+ expiresAt: e + t.revalidateMs,
787
+ servableUntil: e + t.revalidateMs + n,
788
+ revalidateMs: t.revalidateMs,
789
+ staleWhileRevalidateMs: n
790
+ }), i["x-voltro-cache"] = "MISS", i["x-voltro-cache-key"] = h, i["x-voltro-cache-revalidate-ms"] = String(t.revalidateMs), n > 0 && (i["x-voltro-cache-swr-ms"] = String(n)), m.emit("cache", {
791
791
  kind: "MISS",
792
792
  key: h,
793
- revalidateMs: r.revalidateMs,
794
- swrMs: t
793
+ revalidateMs: t.revalidateMs,
794
+ swrMs: n
795
795
  });
796
- } else r.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", m.emit("cache", {
796
+ } else t.renderMode === "isr" && (i["x-voltro-cache"] = "BYPASS", m.emit("cache", {
797
797
  kind: "BYPASS",
798
798
  key: h
799
799
  }));
800
800
  return {
801
801
  status: 200,
802
- headers: a,
803
- body: r.html
802
+ headers: i,
803
+ body: t.html
804
804
  };
805
805
  } catch (e) {
806
- return q.error("render error", { url: n }, e), y(e) ? {
806
+ return K.error("render error", { url: r }, e), te(e) ? {
807
807
  status: 500,
808
808
  headers: {
809
809
  "content-type": "text/plain; charset=utf-8",
@@ -816,59 +816,59 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
816
816
  body: "server error"
817
817
  };
818
818
  }
819
- }, Fe = !1, Ie = he(async (e, t) => {
820
- let n = e.url ?? "/", r = Date.now(), i = {};
821
- for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
822
- let s = n.split("?")[0] ?? "/", c = (e.method ?? "GET").toUpperCase();
823
- if (s === "/internal/liveness") {
819
+ }, Ie = !1, Le = ge(async (e, t) => {
820
+ let n = e.url ?? "/", r = Date.now(), a = {};
821
+ for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (a[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
822
+ let o = n.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
823
+ if (o === "/internal/liveness") {
824
824
  t.writeHead(200, {
825
825
  "content-type": "text/plain",
826
826
  "cache-control": "no-store"
827
827
  }), t.end("ok");
828
828
  return;
829
829
  }
830
- if (s === "/internal/readiness") {
831
- let e = Fe ? 200 : 503;
830
+ if (o === "/internal/readiness") {
831
+ let e = Ie ? 200 : 503;
832
832
  t.writeHead(e, {
833
833
  "content-type": "text/plain",
834
834
  "cache-control": "no-store"
835
- }), t.end(Fe ? "ready" : "not-ready");
835
+ }), t.end(Ie ? "ready" : "not-ready");
836
836
  return;
837
837
  }
838
- if (c === "OPTIONS" && s.startsWith("/_voltro/inspect")) {
839
- let e = ue(i.origin);
838
+ if (s === "OPTIONS" && o.startsWith("/_voltro/inspect")) {
839
+ let e = de(a.origin);
840
840
  t.writeHead(204, e), t.end();
841
841
  return;
842
842
  }
843
- if (f.name === "voltroDashboard" && s === "/api/dashboard/proxy") {
843
+ if (d.name === "voltroDashboard" && o === "/api/dashboard/proxy") {
844
844
  let r = new URL(n, "http://x").searchParams.get("target");
845
845
  if (!r) {
846
846
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
847
847
  return;
848
848
  }
849
- if (!ce(r)) {
849
+ if (!le(r)) {
850
850
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
851
851
  return;
852
852
  }
853
853
  try {
854
- let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
855
- a ? n.authorization = Array.isArray(a) ? a[0] : a : oe(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
854
+ let n = { accept: a.accept ?? "application/json" }, i = a.authorization;
855
+ i ? n.authorization = Array.isArray(i) ? i[0] : i : se(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
856
856
  let o;
857
- if (c && c !== "GET" && c !== "HEAD") {
857
+ if (s && s !== "GET" && s !== "HEAD") {
858
858
  let t = [];
859
859
  for await (let n of e) t.push(n);
860
860
  o = Buffer.concat(t);
861
- let r = i["content-type"];
861
+ let r = a["content-type"];
862
862
  r && (n["content-type"] = Array.isArray(r) ? r[0] : r);
863
863
  }
864
- let s = await fetch(r, {
864
+ let c = await fetch(r, {
865
865
  redirect: "manual",
866
- method: c,
866
+ method: s,
867
867
  headers: n,
868
868
  ...o ? { body: new Uint8Array(o.buffer, o.byteOffset, o.byteLength) } : {}
869
- }), l = Buffer.from(await s.arrayBuffer());
870
- t.writeHead(s.status, {
871
- "content-type": s.headers.get("content-type") ?? "application/octet-stream",
869
+ }), l = Buffer.from(await c.arrayBuffer());
870
+ t.writeHead(c.status, {
871
+ "content-type": c.headers.get("content-type") ?? "application/octet-stream",
872
872
  "content-length": String(l.length)
873
873
  }), t.end(l);
874
874
  } catch (e) {
@@ -876,27 +876,27 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
876
876
  }
877
877
  return;
878
878
  }
879
- if (f.name === "voltroDashboard" && s === "/api/dashboard/proxy/stream") {
879
+ if (d.name === "voltroDashboard" && o === "/api/dashboard/proxy/stream") {
880
880
  let r = new URL(n, "http://x").searchParams.get("target");
881
881
  if (!r) {
882
882
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
883
883
  return;
884
884
  }
885
- if (!ce(r)) {
885
+ if (!le(r)) {
886
886
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
887
887
  return;
888
888
  }
889
- let a = new AbortController();
890
- e.on("close", () => a.abort()), t.on("close", () => a.abort());
889
+ let i = new AbortController();
890
+ e.on("close", () => i.abort()), t.on("close", () => i.abort());
891
891
  try {
892
- let e = i.authorization ?? (oe(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
892
+ let e = a.authorization ?? (se(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
893
893
  redirect: "manual",
894
894
  method: "GET",
895
895
  headers: {
896
896
  accept: "text/event-stream",
897
897
  ...e ? { authorization: Array.isArray(e) ? e[0] : e } : {}
898
898
  },
899
- signal: a.signal
899
+ signal: i.signal
900
900
  });
901
901
  if (!n.ok || !n.body) {
902
902
  t.writeHead(n.status, { "content-type": "text/plain" }), t.end(`upstream ${n.status}`);
@@ -923,16 +923,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
923
923
  }
924
924
  return;
925
925
  }
926
- if (s === "/_voltro/inspect/stream") {
927
- let n = ue(i.origin);
928
- if (se()) {
926
+ if (o === "/_voltro/inspect/stream") {
927
+ let n = de(a.origin);
928
+ if (ce()) {
929
929
  t.writeHead(503, {
930
930
  "content-type": "application/json",
931
931
  ...n
932
932
  }), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
933
933
  return;
934
934
  }
935
- let r = P(i);
935
+ let r = N(a);
936
936
  if (!r.ok) {
937
937
  t.writeHead(401, {
938
938
  "content-type": "application/json",
@@ -950,30 +950,30 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
950
950
  "x-accel-buffering": "no",
951
951
  ...n
952
952
  }), t.flushHeaders(), t.write("retry: 5000\n\n");
953
- for (let e of m.buffered()) t.write(o(e));
954
- let s = m.subscribe((e) => {
955
- t.write(o(e));
956
- }), c = setInterval(() => {
957
- t.write(a());
958
- }, 15e3), l = () => {
959
- clearInterval(c), s();
953
+ for (let e of m.buffered()) t.write(i(e));
954
+ let o = m.subscribe((e) => {
955
+ t.write(i(e));
956
+ }), s = setInterval(() => {
957
+ t.write(w());
958
+ }, 15e3), c = () => {
959
+ clearInterval(s), o();
960
960
  };
961
- e.on("close", l), t.on("close", l);
961
+ e.on("close", c), t.on("close", c);
962
962
  return;
963
963
  }
964
964
  try {
965
- let e = await Pe(n, i);
966
- if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !s.startsWith("/_voltro/inspect")) {
965
+ let e = await Fe(n, a);
966
+ if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !o.startsWith("/_voltro/inspect")) {
967
967
  let t = Date.now() - r;
968
968
  m.emit("request", {
969
- url: s,
969
+ url: o,
970
970
  status: e.status,
971
971
  durationMs: t,
972
972
  renderedBy: e.headers["x-voltro-rendered-by"],
973
973
  cache: e.headers["x-voltro-cache"]
974
974
  });
975
- let n = Ce(s, G)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
976
- ke.record({
975
+ let n = we(o, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
976
+ Ae.record({
977
977
  kind: "request",
978
978
  tag: n,
979
979
  durationMs: t,
@@ -984,71 +984,71 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
984
984
  t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
985
985
  }
986
986
  });
987
- await new Promise((e) => Ie.listen(h, "::", e)), Fe = !0, d.mark("ready"), q.info(`listening on http://localhost:${h}`, {
988
- port: h,
989
- distDir: b
990
- }), q.debug("dynamic + ssr/isr routes resolve via SSR loader");
987
+ await new Promise((e) => Le.listen(v, "::", e)), Ie = !0, u.mark("ready"), K.info(`listening on http://localhost:${v}`, {
988
+ port: v,
989
+ distDir: y
990
+ }), K.debug("dynamic + ssr/isr routes resolve via SSR loader");
991
991
  try {
992
- await S({
993
- id: M,
994
- name: w,
992
+ await b({
993
+ id: j,
994
+ name: A,
995
995
  kind: "web",
996
- url: `http://localhost:${h}`,
996
+ url: `http://localhost:${v}`,
997
997
  pid: process.pid,
998
998
  status: "live",
999
- logFile: N.path
999
+ logFile: M.path
1000
1000
  });
1001
- let e = ae(i);
1001
+ let e = oe(a);
1002
1002
  if (e) {
1003
- let n = await t({ dashboardAppPath: e });
1004
- n.status === "launched" ? q.info(`dashboard launched at http://localhost:${n.port}`, { port: n.port }) : n.status === "already-running" && q.debug(`dashboard already running on :${n.port}`, { port: n.port });
1003
+ let t = await n({ dashboardAppPath: e });
1004
+ t.status === "launched" ? K.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && K.debug(`dashboard already running on :${t.port}`, { port: t.port });
1005
1005
  }
1006
1006
  setInterval(() => {
1007
- S({
1008
- id: M,
1009
- name: w,
1007
+ b({
1008
+ id: j,
1009
+ name: A,
1010
1010
  kind: "web",
1011
- url: `http://localhost:${h}`,
1011
+ url: `http://localhost:${v}`,
1012
1012
  pid: process.pid,
1013
1013
  status: "live",
1014
- logFile: N.path
1014
+ logFile: M.path
1015
1015
  }).catch(() => {});
1016
1016
  }, 1e4).unref();
1017
1017
  } catch (e) {
1018
- q.warn("runtime-registry write failed", {}, e);
1018
+ K.warn("runtime-registry write failed", {}, e);
1019
1019
  }
1020
- pe({
1021
- app: f.name ?? "unnamed",
1020
+ me({
1021
+ app: d.name ?? "unnamed",
1022
1022
  kind: "web",
1023
- url: `http://localhost:${h}`,
1024
- bootMs: d.total()
1023
+ url: `http://localhost:${v}`,
1024
+ bootMs: u.total()
1025
1025
  });
1026
- let Le = d.phaseBreakdown();
1027
- q.info(`start: ready in ${d.total()}ms`, {
1028
- bootMs: d.total(),
1029
- ...Le ? { phases: Le } : {}
1026
+ let Re = u.phaseBreakdown();
1027
+ K.info(`start: ready in ${u.total()}ms`, {
1028
+ bootMs: u.total(),
1029
+ ...Re ? { phases: Re } : {}
1030
1030
  });
1031
- let Re = !1, ze = (t) => async () => {
1032
- if (!Re) {
1033
- if (Re = !0, q.info(`received ${t}, shutting down`, { signal: t }), Ie.close(), await Oe.stop(), H) try {
1034
- await H.end();
1031
+ let ze = !1, $ = (t) => async () => {
1032
+ if (!ze) {
1033
+ if (ze = !0, K.info(`received ${t}, shutting down`, { signal: t }), Le.close(), await ke.stop(), V) try {
1034
+ await V.end();
1035
1035
  } catch {}
1036
- await J.close(), await e(M), await N.dispose(), process.exit(0);
1036
+ await q.close(), await e(j), await M.dispose(), process.exit(0);
1037
1037
  }
1038
1038
  };
1039
- process.on("SIGINT", ze("SIGINT")), process.on("SIGTERM", ze("SIGTERM"));
1039
+ process.on("SIGINT", $("SIGINT")), process.on("SIGTERM", $("SIGTERM"));
1040
1040
  let Be = process.ppid;
1041
1041
  if (Be > 1) {
1042
1042
  let e = setInterval(() => {
1043
- (process.ppid !== Be || process.ppid === 1) && (clearInterval(e), ze("SIGTERM")());
1043
+ (process.ppid !== Be || process.ppid === 1) && (clearInterval(e), $("SIGTERM")());
1044
1044
  }, 2e3);
1045
1045
  e.unref();
1046
1046
  }
1047
1047
  return new Promise(() => {});
1048
- }, Oe = async (e) => {
1048
+ }, ke = async (e) => {
1049
1049
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
1050
- let t = await De(L(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1051
- return t.ran ? t.exitCode : (q.error("no web app found at this path"), 1);
1050
+ let t = await Oe(I(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1051
+ return t.ran ? t.exitCode : (K.error("no web app found at this path"), 1);
1052
1052
  };
1053
1053
  //#endregion
1054
- export { Oe as t };
1054
+ export { ke as t };