@voltro/cli 0.38.0 → 0.39.1

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 (173) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/THIRD-PARTY-NOTICES.md +80 -45
  3. package/dist/{addCommand-BNeoeSxe.js → addCommand-C05L9tZh.js} +2 -2
  4. package/dist/addCommand-C3MdJG-a.js +2 -0
  5. package/dist/{agentsMd-mhQMF1bx.js → agentsMd-7zI2h5l9.js} +3 -3
  6. package/dist/agentsMd-BFCXh2gl.js +2 -0
  7. package/dist/apiBuild-BmR_bIxN.js +2 -0
  8. package/dist/{apiBuild-CvacV4zA.js → apiBuild-D9FB13_2.js} +3 -3
  9. package/dist/baselineCommand-CXv680Dc.js +2 -0
  10. package/dist/{baselineCommand-C6NMt-oa.js → baselineCommand-Ck2Xm8M7.js} +18 -18
  11. package/dist/bin.js +1 -1
  12. package/dist/{build-_LoTC1s0.js → build-DORV5mLM.js} +107 -100
  13. package/dist/{capabilitiesCommand-nq_pz5xd.js → capabilitiesCommand-D5gucwYa.js} +8 -8
  14. package/dist/{checkCommand-Pjk5sBl2.js → checkCommand-Bf6oMao4.js} +35 -35
  15. package/dist/{checkCommand-wibtQx-N.js → checkCommand-D9qK_gtA.js} +1 -1
  16. package/dist/{cloudCmd-NQSwe_Qk.js → cloudCmd-C42gaO8s.js} +16 -16
  17. package/dist/{clusterCmd-D5wsCmA_.js → clusterCmd-DrVFCzSj.js} +8 -4
  18. package/dist/{codegen-GYYcdpCg.js → codegen-CbpGCWLG.js} +1 -1
  19. package/dist/codegen-i8QGcHsi.js +2 -0
  20. package/dist/codegenCommand-CxOyKmc1.js +129 -0
  21. package/dist/{codemodRunner-CXgQ-ecJ.js → codemodRunner-D-jTyvWo.js} +622 -551
  22. package/dist/{commands-DaZVi9wi.js → commands-D6aW_6AR.js} +48 -48
  23. package/dist/{connectionConfig-UFlIEiys.js → connectionConfig-Bk9IC7D0.js} +1 -1
  24. package/dist/{dashboardCommand-Dxy_kmoW.js → dashboardCommand-CwTZh-XZ.js} +3 -3
  25. package/dist/{dataCommand-D6-Ha2lf.js → dataCommand-Cc9RiLQZ.js} +14 -11
  26. package/dist/{dbCommand-C4UW8cVN.js → dbCommand-DSwGv9wS.js} +50 -49
  27. package/dist/dbCommand-DcqEyxju.js +2 -0
  28. package/dist/{dev-E7Eo5GHc.js → dev-3mgc8c-H.js} +2260 -2184
  29. package/dist/dev-CjJAasDs.js +3 -0
  30. package/dist/{dialectDriver-CgXnDfec.js → dialectDriver-czCHYpeH.js} +2 -1
  31. package/dist/doctorCommand-Cghssndo.js +2 -0
  32. package/dist/{doctorCommand-gmDyALFL.js → doctorCommand-oLuzc-aC.js} +261 -244
  33. package/dist/{dormancyCommand-CE6wG8lj.js → dormancyCommand-Bxe4WtHU.js} +1 -1
  34. package/dist/{e2eCmd-BRabZww-.js → e2eCmd-uFHig1hV.js} +8 -2
  35. package/dist/{embeddingsCommand-C3uAuf6N.js → embeddingsCommand-CyNQkFIc.js} +6 -6
  36. package/dist/{envCommand-DzuWh8ya.js → envCommand-CAkSgBbh.js} +19 -19
  37. package/dist/{evolveCommand-DPLqcYb2.js → evolveCommand-CWhBoe_P.js} +6 -8
  38. package/dist/frameworkTableAssembly-DgylYh9_.js +2 -0
  39. package/dist/{generateCommand-DbgcUpGw.js → generateCommand-CcyvH2ve.js} +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/{infoCommand-CmczGj_l.js → infoCommand-CTo8Jnhq.js} +7 -7
  42. package/dist/inspect-B7U7Cl_Z.js +1192 -0
  43. package/dist/inspect-DUze25t0.js +2 -0
  44. package/dist/{inspectCmd-EHFZ9yYu.js → inspectCmd-niF97fAq.js} +5 -5
  45. package/dist/inspectGateHint-BjnFubmH.js +7 -0
  46. package/dist/{logFileSink-C_D2wRN1.js → logFileSink-B4uP8pvf.js} +1 -1
  47. package/dist/{logsCmd-D36xK7Zu.js → logsCmd-B6oNsfaZ.js} +10 -7
  48. package/dist/{manifestBuild-hpPLaGxV.js → manifestBuild-BK42hu0k.js} +1 -1
  49. package/dist/manifestBuild-j0n109tt.js +2 -0
  50. package/dist/{metaCommands-CIoQNlaQ.js → metaCommands-DUYR--Ts.js} +1 -1
  51. package/dist/{migrate-RwgUWXfc.js → migrate-BnPw2zC8.js} +7 -4
  52. package/dist/{packageCommand-Cug_3Ogl.js → packageCommand-9SVyvsSo.js} +3 -2
  53. package/dist/{probeCommand-BPEpwT32.js → probeCommand-C9gazU0H.js} +35 -24
  54. package/dist/{projectScaffold-CxgtJvlb.js → projectScaffold-BEhhHjPr.js} +1 -1
  55. package/dist/{projectScaffold-DDgWbNLe.js → projectScaffold-BvhLOrLq.js} +17 -15
  56. package/dist/{runtimeTrace-6jfznSzr.js → runtimeTrace-gNXeLf6H.js} +1 -1
  57. package/dist/{scheduleManifestCmd-D2x0CTTY.js → scheduleManifestCmd-kmWzrO_w.js} +6 -9
  58. package/dist/{sdkgen-CEJZZQUA.js → sdkgen-C8zz10-X.js} +4 -4
  59. package/dist/{seedRunner-ZmLSqNe2.js → seedRunner-IdHEprqf.js} +1 -4
  60. package/dist/serveCommand-BpK8-m1N.js +1770 -0
  61. package/dist/serveCommand-CW-goXvh.js +2 -0
  62. package/dist/serveEntry.js +2 -2
  63. package/dist/{serverlessCommand-CfJZy6dS.js → serverlessCommand-DbJ7Plg9.js} +3 -3
  64. package/dist/{start-CidwCcjl.js → start-BNuTWdRd.js} +1 -1
  65. package/dist/{start-RCh6qKFe.js → start-ft_KzFTd.js} +257 -254
  66. package/dist/startEntry.js +1 -1
  67. package/dist/{test-DIQ0jlkQ.js → test-CLYXrZ2F.js} +1 -1
  68. package/dist/{tracesCmd-DStmCJPi.js → tracesCmd-DgtgOUdi.js} +7 -4
  69. package/dist/{typecheckCommand-BlsWiCNq.js → typecheckCommand-BuCtT92o.js} +7 -7
  70. package/dist/updateCommand-6FMU2klq.js +2 -0
  71. package/dist/{updateCommand-CmksX7m_.js → updateCommand-CHBmCB17.js} +5 -3
  72. package/dist/{webDev-BKdD7c_a.js → webDev-CTpSY-e_.js} +813 -775
  73. package/dist/webDev-id3I5PvG.js +2 -0
  74. package/dist/{webhookDiscovery-D7VaeMlz.js → webhookDiscovery-CphsQe59.js} +4 -6
  75. package/dist/{webhookDiscovery-CrGAfhIG.js → webhookDiscovery-il9ti-HE.js} +1 -1
  76. package/dist/{webhooksCommand-BHeaF1ZJ.js → webhooksCommand-EccPZQZ4.js} +1 -1
  77. package/package.json +27 -21
  78. package/templates/AGENTS.md +2 -2
  79. package/templates/agent-docs/_index.md +2 -2
  80. package/templates/agent-docs/_manifest.json +2 -2
  81. package/templates/agent-docs/authentication.md +43 -4
  82. package/templates/agent-docs/cli.md +17 -13
  83. package/templates/agent-docs/data.md +44 -1
  84. package/templates/agent-docs/database/migrations.md +2 -2
  85. package/templates/agent-docs/database/seedsdialects.md +2 -2
  86. package/templates/agent-docs/deployment.md +21 -7
  87. package/templates/agent-docs/internationalization.md +10 -3
  88. package/templates/agent-docs/local-first-mobile.md +141 -20
  89. package/templates/agent-docs/plugins/mail.md +1 -1
  90. package/templates/agent-docs/plugins/ratelimit.md +1 -1
  91. package/templates/agent-docs/plugins.md +3 -1
  92. package/templates/agent-docs/releases.md +130 -1
  93. package/templates/agent-docs/routing.md +34 -2
  94. package/templates/agent-docs/templates/apibackends.md +1 -1
  95. package/templates/agent-docs/templates/mobile.md +1 -1
  96. package/templates/agent-docs/whats-new.md +26 -66
  97. package/templates/apps/api-ai/package.json +7 -7
  98. package/templates/apps/api-auth/package.json +8 -8
  99. package/templates/apps/api-backend/package.json +7 -7
  100. package/templates/apps/api-backend-deactivation/package.json +7 -7
  101. package/templates/apps/api-backend-mail/package.json +8 -8
  102. package/templates/apps/api-backend-mariadb/package.json +9 -9
  103. package/templates/apps/api-backend-sqlite/package.json +8 -8
  104. package/templates/apps/api-backend-storage/package.json +8 -8
  105. package/templates/apps/api-cms/package.json +10 -10
  106. package/templates/apps/api-collab/package.json +8 -8
  107. package/templates/apps/api-data-advanced/package.json +8 -8
  108. package/templates/apps/api-durable/package.json +8 -8
  109. package/templates/apps/api-durable/startup/warm.startup.tsx +16 -2
  110. package/templates/apps/api-feature-flags/package.json +9 -9
  111. package/templates/apps/api-governance/package.json +8 -8
  112. package/templates/apps/api-kv/package.json +8 -8
  113. package/templates/apps/api-moderation/package.json +8 -8
  114. package/templates/apps/api-observability/package.json +8 -8
  115. package/templates/apps/api-ratelimit/package.json +8 -8
  116. package/templates/apps/api-rbac/authz.ts +16 -1
  117. package/templates/apps/api-rbac/package.json +8 -8
  118. package/templates/apps/api-rest/package.json +7 -7
  119. package/templates/apps/api-saas/package.json +11 -11
  120. package/templates/apps/api-saas-starter/package.json +10 -10
  121. package/templates/apps/api-search/package.json +8 -8
  122. package/templates/apps/api-status/package.json +8 -8
  123. package/templates/apps/api-versioning/package.json +8 -8
  124. package/templates/apps/api-webhooks/package.json +9 -9
  125. package/templates/apps/changelog/package.json +6 -6
  126. package/templates/apps/edge-functions/package.json +2 -2
  127. package/templates/apps/frontend-admin/package.json +8 -8
  128. package/templates/apps/frontend-app/package.json +9 -9
  129. package/templates/apps/frontend-auth/package.json +8 -8
  130. package/templates/apps/frontend-blank/package.json +7 -7
  131. package/templates/apps/frontend-cms/package.json +9 -9
  132. package/templates/apps/frontend-collab/package.json +10 -10
  133. package/templates/apps/frontend-contact/package.json +7 -7
  134. package/templates/apps/frontend-dashboard/package.json +7 -7
  135. package/templates/apps/frontend-docs/package.json +7 -7
  136. package/templates/apps/frontend-i18n/package.json +6 -6
  137. package/templates/apps/frontend-landing/package.json +7 -7
  138. package/templates/apps/frontend-portal/package.json +8 -8
  139. package/templates/apps/frontend-saas/package.json +8 -8
  140. package/templates/apps/frontend-spa/package.json +7 -7
  141. package/templates/apps/frontend-ssr/package.json +7 -7
  142. package/templates/apps/frontend-ssr-api/package.json +8 -8
  143. package/templates/apps/frontend-static-blog/package.json +6 -6
  144. package/templates/apps/frontend-status/package.json +8 -8
  145. package/templates/apps/mobile-app/README.md +41 -17
  146. package/templates/apps/mobile-app/app.config.ts +1 -1
  147. package/templates/apps/mobile-app/package.json +15 -11
  148. package/templates/apps/mobile-app/src/app/_layout.tsx +44 -13
  149. package/templates/apps/mobile-app/src/app/index.tsx +1 -1
  150. package/templates/apps/mobile-app/src/app/settings.tsx +4 -1
  151. package/templates/apps/mobile-app/src/client.ts +74 -57
  152. package/templates/apps/mobile-app/src/lib/api.ts +4 -4
  153. package/templates/apps/mobile-app/src/lib/deeplinks.ts +6 -6
  154. package/templates/apps/mobile-app/src/persistence.ts +24 -3
  155. package/templates/apps/mobile-app/tsconfig.json +17 -3
  156. package/dist/addCommand-aXSQveak.js +0 -2
  157. package/dist/agentsMd-BTchIZku.js +0 -2
  158. package/dist/apiBuild-ttSDDOGp.js +0 -2
  159. package/dist/baselineCommand-Cfw2Afwm.js +0 -2
  160. package/dist/codegen-uYrrDzQv.js +0 -2
  161. package/dist/codegenCommand-C60m_LCp.js +0 -30
  162. package/dist/dbCommand-CC-qNzpz.js +0 -2
  163. package/dist/dev-CAOoXOkc.js +0 -3
  164. package/dist/doctorCommand-Cjl8Yii8.js +0 -2
  165. package/dist/frameworkTableAssembly-YyVe32Cb.js +0 -2
  166. package/dist/inspect-CjTYzAs_.js +0 -1190
  167. package/dist/inspect-P4pxoMaV.js +0 -2
  168. package/dist/inspectGateHint-BF6608UT.js +0 -4
  169. package/dist/manifestBuild-COkJoyAr.js +0 -2
  170. package/dist/serveCommand-DNRF2nDI.js +0 -2
  171. package/dist/serveCommand-DnY4VS3D.js +0 -1767
  172. package/dist/updateCommand-B0J_T9Vs.js +0 -2
  173. package/dist/webDev-CcJfdSjl2.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, B as i, C as a, D as o, E as s, H as c, I as l, J as u, N as d, O as f, P as p, S as m, T as ee, U as h, V as g, a as _, b as v, d as y, f as b, i as x, j as S, k as te, lt as C, n as w, ot as ne, q as T, s as re, w as E, x as ie, y as ae, z as D } from "./webDev-BKdD7c_a.js";
4
- import { o as O, t as k } from "./connectionConfig-UFlIEiys.js";
5
- import { A, D as j, a as M, h as oe, j as N, k as se } from "./inspect-CjTYzAs_.js";
6
- import { a as ce, c as P, d as le, f as ue, l as F, p as I, u as de } from "./renderModeScan-D7J1B7Kw.js";
7
- import { i as fe, n as pe, r as me, t as he } from "./runtimeRegistry-DMeKfTHP.js";
8
- import { n as ge } from "./logFileSink-C_D2wRN1.js";
9
- import { t as _e } from "./inspectMetrics-CfdKLh6t.js";
10
- import { t as ve } from "./bootTiming-BdyP9nYw.js";
11
- import { dirname as ye, extname as be, join as L, resolve as R } from "node:path";
12
- import { promises as z } from "node:fs";
13
- import { fileURLToPath as B, pathToFileURL as xe } from "node:url";
14
- import { createLogger as V, printReadyBlock as Se } from "@voltro/logger";
15
- import { snapshotMetricsSync as Ce } from "@voltro/runtime";
16
- import { createServer as we } from "node:http";
3
+ import { A as r, B as i, C as a, D as o, E as s, H as c, I as l, J as u, N as d, O as f, P as p, S as m, T as ee, U as h, V as g, a as _, b as v, d as y, f as b, i as x, j as S, k as te, n as ne, q as C, s as re, st as ie, ut as w, w as T, x as ae, y as oe, z as E } from "./webDev-CTpSY-e_.js";
4
+ import { o as D, t as O } from "./connectionConfig-Bk9IC7D0.js";
5
+ import { A as k, D as A, a as j, h as se, j as M, k as ce } from "./inspect-B7U7Cl_Z.js";
6
+ import { a as le, c as N, d as ue, f as de, l as P, p as F, u as fe } from "./renderModeScan-D7J1B7Kw.js";
7
+ import { i as pe, n as me, r as he, t as ge } from "./runtimeRegistry-DMeKfTHP.js";
8
+ import { n as _e } from "./logFileSink-B4uP8pvf.js";
9
+ import { t as ve } from "./inspectMetrics-CfdKLh6t.js";
10
+ import { t as ye } from "./bootTiming-BdyP9nYw.js";
11
+ import { dirname as be, extname as xe, join as I, resolve as L } from "node:path";
12
+ import { promises as R } from "node:fs";
13
+ import { fileURLToPath as z, pathToFileURL as Se } from "node:url";
14
+ import { createLogger as B, printReadyBlock as Ce } from "@voltro/logger";
15
+ import { snapshotMetricsSync as we } from "@voltro/runtime";
16
+ import { createServer as Te } from "node:http";
17
17
  //#region src/isrCdcInvalidator.ts
18
- var H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
18
+ var V = B({ scope: "voltro:start:cdc" }), H = (e) => (t) => {
19
19
  let n = 0;
20
20
  for (let [r, i] of e.tableSubscriptionsByPattern) {
21
21
  if (!i.includes(t)) continue;
@@ -26,17 +26,17 @@ var H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
26
26
  }));
27
27
  }
28
28
  return n;
29
- }, W = () => k() ? O() : null, Te = (e) => {
30
- let t = e.channel ?? "framework_changes", n = U(e), r = null, i = null;
29
+ }, U = () => O() ? D() : null, Ee = (e) => {
30
+ let t = e.channel ?? "framework_changes", n = H(e), r = null, i = null;
31
31
  return {
32
32
  start: async () => {
33
33
  if (e.tableSubscriptionsByPattern.size === 0) {
34
- H.debug("skipped — no pages declare cacheInvalidatesOn");
34
+ V.debug("skipped — no pages declare cacheInvalidatesOn");
35
35
  return;
36
36
  }
37
- let a = W();
37
+ let a = U();
38
38
  if (!a) {
39
- H.warn(`${e.tableSubscriptionsByPattern.size} route(s) declare \`cacheInvalidatesOn\` and will NOT be invalidated live — no database is configured for this web process. Set DB_URL (or DB_HOST / PG_HOST) so the CDC listener can connect; until then those routes go stale until their \`revalidate\` window expires.`, { routes: [...e.tableSubscriptionsByPattern.keys()] });
39
+ V.warn(`${e.tableSubscriptionsByPattern.size} route(s) declare \`cacheInvalidatesOn\` and will NOT be invalidated live — no database is configured for this web process. Set DB_URL (or DB_HOST / PG_HOST) so the CDC listener can connect; until then those routes go stale until their \`revalidate\` window expires.`, { routes: [...e.tableSubscriptionsByPattern.keys()] });
40
40
  return;
41
41
  }
42
42
  r = new (await (import("pg"))).default.Client(a), await r.connect(), i = (e) => {
@@ -45,16 +45,16 @@ var H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
45
45
  try {
46
46
  r = JSON.parse(e.payload);
47
47
  } catch (e) {
48
- H.warn("bad CDC payload", {}, e);
48
+ V.warn("bad CDC payload", {}, e);
49
49
  return;
50
50
  }
51
51
  let i = n(r.table);
52
- i > 0 && H.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
52
+ i > 0 && V.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
53
53
  op: r.op,
54
54
  table: r.table,
55
55
  dropped: i
56
56
  });
57
- }, r.on("notification", i), await r.query(`LISTEN ${t}`), H.info(`LISTEN ${t}`, {
57
+ }, r.on("notification", i), await r.query(`LISTEN ${t}`), V.info(`LISTEN ${t}`, {
58
58
  channel: t,
59
59
  ..."connectionString" in a ? { target: a.connectionString.replace(/\/\/[^@/]*@/, "//") } : {
60
60
  host: a.host,
@@ -72,7 +72,7 @@ var H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
72
72
  }
73
73
  }
74
74
  };
75
- }, G = V({ scope: "voltro:start:isr-cache" }), K = "voltro_isr_cache", Ee = (e) => `
75
+ }, W = B({ scope: "voltro:start:isr-cache" }), De = "voltro_isr_cache", G = (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
- `, De = (e) => {
87
- let t = e.tableName ?? K, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
88
- i || (i = !0, await n.query(Ee(t)));
86
+ `, Oe = (e) => {
87
+ let t = e.tableName ?? De, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
88
+ i || (i = !0, await n.query(G(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, {
@@ -97,10 +97,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
97
97
  staleWhileRevalidateMs: Number(t.stale_while_revalidate_ms)
98
98
  });
99
99
  }).catch((e) => {
100
- G.warn("postgres bootstrap failed", {}, e);
100
+ W.warn("postgres bootstrap failed", {}, e);
101
101
  }), o = (e, t) => {
102
102
  a.then(() => n.query(e, t)).catch((e) => {
103
- G.warn("postgres write failed", {}, e);
103
+ W.warn("postgres write failed", {}, e);
104
104
  });
105
105
  };
106
106
  return {
@@ -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
- }, q = V({ scope: "voltro:start" }), Oe = await (async () => {
148
+ }, K = B({ scope: "voltro:start" }), ke = await (async () => {
149
149
  try {
150
- let e = L(ye(B(import.meta.url)), "..", "package.json"), t = await z.readFile(e, "utf8");
150
+ let e = I(be(z(import.meta.url)), "..", "package.json"), t = await R.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
- })(), J = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", Y = (e) => e instanceof Error && e._voltroControl === "not-found", X = {
155
+ })(), Ae = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", q = (e) => e instanceof Error && e._voltroControl === "not-found", J = {
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
- }, ke = (e) => X[be(e).toLowerCase()] ?? "application/octet-stream", Ae = (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) => {
173
+ }, je = (e) => J[xe(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) => {
174
174
  try {
175
- return await z.stat(e), !0;
175
+ return await R.stat(e), !0;
176
176
  } catch {
177
177
  return !1;
178
178
  }
179
- }, je = (e) => {
179
+ }, Me = (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
- }, Me = (e) => e.map((e) => {
189
- let { regex: t, paramNames: n, priority: r } = je(e.pattern);
188
+ }, Ne = (e) => e.map((e) => {
189
+ let { regex: t, paramNames: n, priority: r } = Me(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), Q = (e, t) => {
198
+ }).slice().sort((e, t) => e.priority - t.priority), Z = (e, t) => {
199
199
  for (let n of t) {
200
200
  let t = n.regex.exec(e);
201
201
  if (!t) continue;
@@ -207,13 +207,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
207
207
  };
208
208
  }
209
209
  return null;
210
- }, Ne = async (e) => {
211
- let { provider: t, route: n, params: i, pathname: c, dirs: l, shellTemplate: u, requestHeaders: d, requestUrl: p = "", apiOrigin: ee, apiName: h } = e, { search: g } = r(p), v = x(ee, d.cookie, { apiName: h }), y = await t.getPage(n.pattern, n.file), b = P(y, n.file), S = b === "spa" && re(l, n.dirChain).some((e) => e.hasLayout);
210
+ }, Pe = async (e) => {
211
+ let { provider: t, route: n, params: i, pathname: c, dirs: l, shellTemplate: u, requestHeaders: d, requestUrl: p = "", apiOrigin: ee, apiName: h } = e, { search: g } = r(p), v = x(ee, d.cookie, { apiName: h }), y = await t.getPage(n.pattern, n.file), b = N(y, n.file), S = b === "spa" && re(l, n.dirChain).some((e) => e.hasLayout);
212
212
  if (b !== "ssr" && b !== "isr" && !S) return null;
213
- let C = re(l, n.dirChain), w = {}, ne = null, T, ae = new AbortController();
213
+ let ne = re(l, n.dirChain), C = {}, ie = null, w, oe = new AbortController();
214
214
  try {
215
- (await t.getHelpers()).beginStoreSeeds(), {chain: T, segmentLoaderData: w} = await _({
216
- entries: C,
215
+ (await t.getHelpers()).beginStoreSeeds(), {chain: w, segmentLoaderData: C} = await _({
216
+ entries: ne,
217
217
  loadLayout: (e) => t.getLayout(e.dir),
218
218
  loadError: (e) => t.getError(e.dir),
219
219
  loadPending: (e) => t.getPending(e.dir),
@@ -221,41 +221,44 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
221
221
  params: i,
222
222
  pathname: c,
223
223
  search: g,
224
- signal: ae.signal,
224
+ signal: oe.signal,
225
225
  headers: d,
226
- query: v
226
+ query: v,
227
+ isServer: !0
227
228
  }
228
- }), typeof y.loader == "function" && !S && (ne = await y.loader({
229
+ }), typeof y.loader == "function" && !S && (ie = await y.loader({
229
230
  params: i,
230
231
  pathname: c,
231
232
  search: g,
232
- signal: ae.signal,
233
+ signal: oe.signal,
233
234
  headers: d,
234
- query: v
235
+ query: v,
236
+ isServer: !0
235
237
  }));
236
238
  } catch (e) {
237
- if (J(e)) return {
239
+ if (Ae(e)) return {
238
240
  control: "redirect",
239
241
  status: e.status,
240
242
  location: e.location
241
243
  };
242
- if (Y(e)) return { control: "not-found" };
244
+ if (q(e)) return { control: "not-found" };
243
245
  throw e;
244
246
  }
245
- let D = await t.getHelpers();
246
- S || await ie({
247
+ let E = await t.getHelpers();
248
+ S || await ae({
247
249
  pageMod: y,
248
250
  params: i,
249
251
  query: v,
250
252
  apiName: h,
251
- seed: D.seedPreloadedSubscription,
252
- onError: ({ tag: e, apiName: t }, n) => q.warn("preload seed failed", {
253
+ seed: E.seedPreloadedSubscription,
254
+ seedFailure: E.seedPreloadedSubscriptionFailure,
255
+ onError: ({ tag: e, apiName: t }, n) => K.warn("preload seed failed", {
253
256
  tag: e,
254
257
  apiName: t,
255
258
  pathname: c
256
259
  }, n)
257
260
  });
258
- let O = {
261
+ let D = {
259
262
  pattern: n.pattern,
260
263
  Component: y.default,
261
264
  meta: y.meta,
@@ -263,41 +266,41 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
263
266
  ErrorBoundary: y.ErrorBoundary,
264
267
  Pending: y.Pending,
265
268
  renderMode: b,
266
- chain: T
267
- }, k = {
268
- cookies: D.parseCookieHeader(d.cookie),
269
+ chain: w
270
+ }, O = {
271
+ cookies: E.parseCookieHeader(d.cookie),
269
272
  headers: d,
270
273
  url: p
271
- }, A = D.i18n?.resolve(d.cookie, d["accept-language"]), j = y.interactive ?? "full";
274
+ }, k = E.i18n?.resolve(d.cookie, d["accept-language"]), A = y.interactive ?? "full";
272
275
  if (S) {
273
276
  let e = o({
274
- helpers: D,
277
+ helpers: E,
275
278
  page: n.pattern,
276
- interactive: j,
279
+ interactive: A,
277
280
  delivery: "stream",
278
281
  renderInput: {
279
- descriptor: O,
282
+ descriptor: D,
280
283
  params: i,
281
284
  pathname: c,
282
285
  search: g,
283
- segmentLoaderData: w,
284
- requestContext: k,
285
- ...A ? {
286
- outerWrap: A.outerWrap,
287
- locale: A.locale
286
+ segmentLoaderData: C,
287
+ requestContext: O,
288
+ ...k ? {
289
+ outerWrap: k.outerWrap,
290
+ locale: k.locale
288
291
  } : {}
289
292
  }
290
- }), t = A?.locale ?? k.cookies["voltro:locale"] ?? "en", r = (t) => te({
291
- helpers: D,
293
+ }), t = k?.locale ?? O.cookies["voltro:locale"] ?? "en", r = (t) => te({
294
+ helpers: E,
292
295
  prepared: e,
293
296
  meta: t,
294
- interactive: j
297
+ interactive: A
295
298
  });
296
299
  if (e.hasDeferred) {
297
300
  let n = a({ shell: u });
298
301
  return {
299
302
  renderMode: "spa",
300
- stream: (i) => E({
303
+ stream: (i) => T({
301
304
  res: i,
302
305
  shell: n,
303
306
  htmlLang: t,
@@ -306,18 +309,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
306
309
  "x-voltro-rendered-by": "spa"
307
310
  },
308
311
  headInjection: r,
309
- render: (t) => D.renderPageToStream({
312
+ render: (t) => E.renderPageToStream({
310
313
  ...e.renderInput,
311
314
  ...t
312
315
  }),
313
316
  onShellError: (e) => {
314
- q.error("spa layout shell render failed", { pathname: c }, e), i.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), i.end("server error");
317
+ K.error("spa layout shell render failed", { pathname: c }, e), i.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), i.end("server error");
315
318
  }
316
319
  })
317
320
  };
318
321
  }
319
322
  let s = f({
320
- helpers: D,
323
+ helpers: E,
321
324
  prepared: e
322
325
  });
323
326
  return {
@@ -326,38 +329,38 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
326
329
  revalidateMs: null
327
330
  };
328
331
  }
329
- let M = s({
330
- helpers: D,
332
+ let j = s({
333
+ helpers: E,
331
334
  page: n.pattern,
332
335
  pathname: c,
333
336
  renderMode: b,
334
- interactive: j,
335
- loaderData: ne,
336
- segmentLoaderData: w,
337
+ interactive: A,
338
+ loaderData: ie,
339
+ segmentLoaderData: C,
337
340
  pageLoaderRan: typeof y.loader == "function"
338
- }), oe = {
339
- descriptor: O,
341
+ }), se = {
342
+ descriptor: D,
340
343
  params: i,
341
344
  pathname: c,
342
345
  search: g,
343
- loaderData: M.loaderData,
344
- segmentLoaderData: M.segmentLoaderData,
345
- requestContext: k,
346
- ...A ? {
347
- outerWrap: A.outerWrap,
348
- locale: A.locale
346
+ loaderData: j.loaderData,
347
+ segmentLoaderData: j.segmentLoaderData,
348
+ requestContext: O,
349
+ ...k ? {
350
+ outerWrap: k.outerWrap,
351
+ locale: k.locale
349
352
  } : {}
350
- }, N = (e) => [
351
- D.renderMetaToHtml(e),
352
- `<meta name="voltro-interactive" content="${j}" />`,
353
- ...M.hasDeferred ? [D.renderDeferredRegistryScript()] : [],
354
- D.renderRouterStateScript(M.stateInput)
353
+ }, M = (e) => [
354
+ E.renderMetaToHtml(e),
355
+ `<meta name="voltro-interactive" content="${A}" />`,
356
+ ...j.hasDeferred ? [E.renderDeferredRegistryScript()] : [],
357
+ E.renderRouterStateScript(j.stateInput)
355
358
  ].filter((e) => e.length > 0).join("\n ");
356
- if (b === "ssr" && j === "full" && e.buffered !== !0) {
357
- let e = A?.locale ?? k.cookies["voltro:locale"] ?? "en", t = a({ shell: u });
359
+ if (b === "ssr" && A === "full" && e.buffered !== !0) {
360
+ let e = k?.locale ?? O.cookies["voltro:locale"] ?? "en", t = a({ shell: u });
358
361
  return {
359
362
  renderMode: "ssr",
360
- stream: (n) => E({
363
+ stream: (n) => T({
361
364
  res: n,
362
365
  shell: t,
363
366
  htmlLang: e,
@@ -365,27 +368,27 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
365
368
  "content-type": "text/html; charset=utf-8",
366
369
  "x-voltro-rendered-by": "ssr"
367
370
  },
368
- headInjection: N,
369
- render: (e) => D.renderPageToStream({
370
- ...oe,
371
+ headInjection: M,
372
+ render: (e) => E.renderPageToStream({
373
+ ...se,
371
374
  ...e
372
375
  }),
373
376
  onShellError: (e) => {
374
- q.error("ssr shell render failed", { pathname: c }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
377
+ K.error("ssr shell render failed", { pathname: c }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
375
378
  }
376
379
  })
377
380
  };
378
381
  }
379
- let { html: se, meta: ce } = D.renderPageToHtml(oe), le = N(ce), ue = A?.locale ?? k.cookies["voltro:locale"] ?? "en", F = m(u.replace("<div id=\"root\"></div>", `<div id="root">${se}</div>`), le).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${ue}"`);
380
- j === "none" && (F = Ae(F));
381
- let de = b === "isr" ? I(y.revalidate) : null;
382
+ let { html: ce, meta: le } = E.renderPageToHtml(se), ue = M(le), de = k?.locale ?? O.cookies["voltro:locale"] ?? "en", P = m(u.replace("<div id=\"root\"></div>", `<div id="root">${ce}</div>`), ue).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${de}"`);
383
+ A === "none" && (P = Y(P));
384
+ let fe = b === "isr" ? F(y.revalidate) : null;
382
385
  return {
383
- html: F,
386
+ html: P,
384
387
  renderMode: b,
385
- revalidateMs: de
388
+ revalidateMs: fe
386
389
  };
387
- }, $ = (e) => e === "" ? "/" : e, Pe = async (e) => {
388
- let t = await import(xe(e).href);
390
+ }, Q = (e) => e === "" ? "/" : e, Fe = async (e) => {
391
+ let t = await import(Se(e).href);
389
392
  return {
390
393
  kind: "bundle",
391
394
  getPageMeta: () => t.pageMeta,
@@ -395,18 +398,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
395
398
  return typeof r == "function" ? await r() : r;
396
399
  },
397
400
  async getLayout(e) {
398
- let n = t.layouts[$(e)];
399
- if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${$(e)}`);
401
+ let n = t.layouts[Q(e)];
402
+ if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${Q(e)}`);
400
403
  return typeof n == "function" ? await n() : n;
401
404
  },
402
405
  async getError(e) {
403
- let n = t.errors[$(e)];
404
- if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${$(e)}`);
406
+ let n = t.errors[Q(e)];
407
+ if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${Q(e)}`);
405
408
  return typeof n == "function" ? await n() : n;
406
409
  },
407
410
  async getPending(e) {
408
- let n = t.pendings[$(e)];
409
- if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${$(e)}`);
411
+ let n = t.pendings[Q(e)];
412
+ if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${Q(e)}`);
410
413
  return typeof n == "function" ? await n() : n;
411
414
  },
412
415
  async getHelpers() {
@@ -414,8 +417,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
414
417
  },
415
418
  async close() {}
416
419
  };
417
- }, Fe = async (e, t) => {
418
- let n = await C("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
420
+ }, Ie = async (e, t) => {
421
+ let n = await w("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
419
422
  root: t,
420
423
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
421
424
  plugins: [r(), i()],
@@ -432,10 +435,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
432
435
  },
433
436
  appType: "custom",
434
437
  logLevel: "warn"
435
- }), o = L(e, "src", "pages"), s = (e) => e === "" ? o : L(o, e), c = T({
438
+ }), o = I(e, "src", "pages"), s = (e) => e === "" ? o : I(o, e), c = C({
436
439
  limit: u(),
437
- onColdStart: (e) => q.debug("ssr cold-compile start", { id: e }),
438
- onColdEnd: (e, { durationMs: t, failed: n }) => q.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
440
+ onColdStart: (e) => K.debug("ssr cold-compile start", { id: e }),
441
+ onColdEnd: (e, { durationMs: t, failed: n }) => K.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
439
442
  id: e,
440
443
  ms: t,
441
444
  ...n ? { failed: !0 } : {}
@@ -444,16 +447,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
444
447
  return {
445
448
  kind: "middleware",
446
449
  async getPage(e, t) {
447
- return l(L(o, t));
450
+ return l(I(o, t));
448
451
  },
449
452
  async getLayout(e) {
450
- return l(L(s(e), "layout.tsx"));
453
+ return l(I(s(e), "layout.tsx"));
451
454
  },
452
455
  async getError(e) {
453
- return l(L(s(e), "error.tsx"));
456
+ return l(I(s(e), "error.tsx"));
454
457
  },
455
458
  async getPending(e) {
456
- return l(L(s(e), "loading.tsx"));
459
+ return l(I(s(e), "loading.tsx"));
457
460
  },
458
461
  async getHelpers() {
459
462
  return await l("@voltro/web/ssr");
@@ -462,99 +465,99 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
462
465
  await a.close();
463
466
  }
464
467
  };
465
- }, Ie = async (t) => {
466
- let r = ve(), a = await y(t);
468
+ }, $ = async (t) => {
469
+ let r = ye(), a = await y(t);
467
470
  if (!a) return {
468
471
  ran: !1,
469
472
  exitCode: 0
470
473
  };
471
- if (a.type !== "web") return q.error("only web apps are supported by `voltro start`"), {
474
+ if (a.type !== "web") return K.error("only web apps are supported by `voltro start`"), {
472
475
  ran: !0,
473
476
  exitCode: 1
474
477
  };
475
- let { resolved: o } = await ne({
478
+ let { resolved: o } = await ie({
476
479
  rawEnv: a.env,
477
480
  appType: "web",
478
481
  root: t,
479
- log: q,
482
+ log: K,
480
483
  generateTypes: !1
481
484
  }), s = o.publicValues;
482
485
  r.mark("config");
483
486
  let u = c();
484
- D(u), q.info("booting voltro start", { app: a.name ?? "(unnamed)" });
487
+ E(u), K.info("booting voltro start", { app: a.name ?? "(unnamed)" });
485
488
  let f = n({
486
489
  kind: "web",
487
490
  configPort: a.port,
488
491
  env: process.env,
489
492
  dashboardPin: process.env[S] === "1"
490
493
  });
491
- for (let e of f.warnings) q.warn(e);
492
- let m = f.port, _ = L(t, ".framework"), x = L(_, "dist"), te = L(x, "index.html");
493
- if (!await Z(te)) return q.error("no built dist found — run `voltro build` first", { distDir: x }), {
494
+ for (let e of f.warnings) K.warn(e);
495
+ let m = f.port, _ = I(t, ".framework"), x = I(_, "dist"), te = I(x, "index.html");
496
+ if (!await X(te)) return K.error("no built dist found — run `voltro build` first", { distDir: x }), {
494
497
  ran: !0,
495
498
  exitCode: 1
496
499
  };
497
- let C = a.name ?? "unnamed", T = he("web", C, m), E = ge(C);
498
- await fe({
499
- id: T,
500
+ let C = a.name ?? "unnamed", w = ge("web", C, m), T = _e(C);
501
+ await pe({
502
+ id: w,
500
503
  name: C,
501
504
  kind: "web",
502
505
  url: `http://localhost:${m}`,
503
506
  pid: process.pid,
504
507
  status: "booting",
505
- logFile: E.path
508
+ logFile: T.path
506
509
  }).catch(() => {});
507
- let ie = L(x, "_voltro", "shell.html"), P = await Z(ie) ? await z.readFile(ie, "utf8") : await z.readFile(te, "utf8"), I = await b(t, a), ye = w(I[0]), be = I[0]?.name, R, B = null, xe = process.env.SSR_CACHE === "postgres";
508
- if (xe && k()) B = new (await (import("pg"))).default.Client(O()), await B.connect(), R = De({ client: B }), q.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
509
- else if (xe) {
510
+ let ae = I(x, "_voltro", "shell.html"), N = await X(ae) ? await R.readFile(ae, "utf8") : await R.readFile(te, "utf8"), F = await b(t, a), be = ne(F[0]), xe = F[0]?.name, L, z = null, Se = process.env.SSR_CACHE === "postgres";
511
+ if (Se && O()) z = new (await (import("pg"))).default.Client(D()), await z.connect(), L = Oe({ client: z }), K.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
512
+ else if (Se) {
510
513
  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).";
511
- if (e()) throw q.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");
512
- R = ue(), q.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
513
- } else R = ue(), q.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
514
- await v(t, a, I, s);
515
- let { pages: V, dirs: H } = await ae(L(t, "src", "pages")), U = Me(V);
514
+ if (e()) throw K.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");
515
+ L = de(), K.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
516
+ } else L = de(), K.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
517
+ await v(t, a, F, s);
518
+ let B = I(t, "src", "pages"), { pages: V, dirs: H } = await oe(B), U = Ne(V);
516
519
  r.mark("scan");
517
- let W = L(x, "server", "ssrEntry.js"), G = await Z(W);
518
- if (!G && process.env.NODE_ENV === "production") throw q.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${W} 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 ${W}`);
519
- let K = G ? await Pe(W) : await Fe(t, _);
520
- q.info(`ssr loader: ${K.kind}`, {
521
- kind: K.kind,
522
- ...K.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
520
+ let W = I(x, "server", "ssrEntry.js"), De = await X(W);
521
+ if (!De && process.env.NODE_ENV === "production") throw K.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${W} 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 ${W}`);
522
+ let G = De ? await Fe(W) : await Ie(t, _);
523
+ K.info(`ssr loader: ${G.kind}`, {
524
+ kind: G.kind,
525
+ ...G.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
523
526
  }), r.mark("provider");
524
- let Ee = K.getPageMeta?.(), J = /* @__PURE__ */ new Map(), Y = 0;
527
+ let Ae = G.getPageMeta?.(), q = /* @__PURE__ */ new Map(), J = 0;
525
528
  for (let e of V) {
526
- let t = Ee?.[e.pattern];
529
+ let t = Ae?.[e.pattern];
527
530
  if (t) {
528
- J.set(e.pattern, t);
531
+ q.set(e.pattern, t);
529
532
  continue;
530
533
  }
531
534
  try {
532
- let t = await K.getPage(e.pattern, e.file);
533
- J.set(e.pattern, ce(t, e.file)), Y++;
535
+ let t = await G.getPage(e.pattern, e.file);
536
+ q.set(e.pattern, le(t, e.file)), J++;
534
537
  } catch (t) {
535
- q.warn("failed to load page metadata", { pattern: e.pattern }, t);
538
+ K.warn("failed to load page metadata", { pattern: e.pattern }, t);
536
539
  }
537
540
  }
538
- q.info(`registered ${J.size} route(s)`, {
539
- count: J.size,
540
- fromManifest: J.size - Y,
541
- fromModules: Y
541
+ K.info(`registered ${q.size} route(s)`, {
542
+ count: q.size,
543
+ fromManifest: q.size - J,
544
+ fromModules: J
542
545
  }), r.mark("routes");
543
- let X = /* @__PURE__ */ new Set();
544
- for (let e of U) J.get(e.pattern)?.renderMode === "spa" && re(H, e.dirChain).some((e) => e.hasLayout) && X.add(e.pattern);
545
- X.size > 0 && q.info(`${X.size} spa route(s) render an SSR layout shell`, { patterns: [...X] });
546
- let Ae = /* @__PURE__ */ new Map();
547
- for (let [e, t] of J) t.cacheInvalidatesOn.length > 0 && Ae.set(e, t.cacheInvalidatesOn);
548
- let je = /* @__PURE__ */ new Map();
549
- for (let e of U) je.set(e.pattern, e.regex);
550
- let $ = Te({
551
- cache: R,
552
- tableSubscriptionsByPattern: Ae,
553
- regexByPattern: je
546
+ let Y = /* @__PURE__ */ new Set();
547
+ for (let e of U) q.get(e.pattern)?.renderMode === "spa" && re(H, e.dirChain).some((e) => e.hasLayout) && Y.add(e.pattern);
548
+ Y.size > 0 && K.info(`${Y.size} spa route(s) render an SSR layout shell`, { patterns: [...Y] });
549
+ let Me = /* @__PURE__ */ new Map();
550
+ for (let [e, t] of q) t.cacheInvalidatesOn.length > 0 && Me.set(e, t.cacheInvalidatesOn);
551
+ let Q = /* @__PURE__ */ new Map();
552
+ for (let e of U) Q.set(e.pattern, e.regex);
553
+ let $ = Ee({
554
+ cache: L,
555
+ tableSubscriptionsByPattern: Me,
556
+ regexByPattern: Q
554
557
  });
555
558
  await $.start(), r.mark("cdc");
556
- let Ie = _e(), Le = V.map((e) => {
557
- let t = J.get(e.pattern);
559
+ let Le = ve(), Re = V.map((e) => {
560
+ let t = q.get(e.pattern);
558
561
  return {
559
562
  pattern: e.pattern,
560
563
  file: e.file,
@@ -569,17 +572,17 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
569
572
  hasMeta: t?.hasMeta ?? !1,
570
573
  hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
571
574
  };
572
- }), Re = H.map((e) => ({
575
+ }), ze = H.map((e) => ({
573
576
  dir: e.dir,
574
577
  hasLayout: e.hasLayout,
575
578
  hasError: e.hasError,
576
579
  hasPending: e.hasPending,
577
580
  hasNotFound: e.hasNotFound
578
- })), ze = B ? "postgres" : "memory", Be = {
581
+ })), Be = z ? "postgres" : "memory", Ve = {
579
582
  kind: "web",
580
583
  meta: {
581
584
  name: a.name ?? "(unnamed)",
582
- voltroVersion: Oe,
585
+ voltroVersion: ke,
583
586
  port: m,
584
587
  mode: "start",
585
588
  apis: Object.entries(a.apis ?? {}).map(([e, t]) => {
@@ -590,10 +593,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
590
593
  return t.url !== void 0 && (n.url = t.url), n;
591
594
  })
592
595
  },
593
- routes: Le,
594
- dirs: Re,
596
+ routes: Re,
597
+ dirs: ze,
595
598
  cache: () => {
596
- let e = Date.now(), t = R.snapshot().map(([t, n]) => ({
599
+ let e = Date.now(), t = L.snapshot().map(([t, n]) => ({
597
600
  key: t,
598
601
  renderedAt: n.renderedAt,
599
602
  expiresAt: n.expiresAt,
@@ -604,16 +607,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
604
607
  staleWhileRevalidateMs: n.staleWhileRevalidateMs
605
608
  }));
606
609
  return {
607
- backend: ze,
608
- size: R.size(),
610
+ backend: Be,
611
+ size: L.size(),
609
612
  entries: t
610
613
  };
611
614
  },
612
- metrics: () => Ce()
613
- }, Ve = async (e, n) => {
615
+ metrics: () => we()
616
+ }, He = async (e, n) => {
614
617
  let r = e.split("?")[0] ?? "/";
615
618
  if (a.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
616
- let e = await pe();
619
+ let e = await me();
617
620
  return {
618
621
  status: 200,
619
622
  headers: { "content-type": "application/json; charset=utf-8" },
@@ -642,7 +645,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
642
645
  for (let e of Array.isArray(n) ? n : []) {
643
646
  if (typeof e != "object" || !e) continue;
644
647
  let n = e;
645
- typeof n.url != "string" || n.url.length === 0 || t.push({
648
+ typeof n.url == "string" && n.url.length !== 0 && t.push({
646
649
  url: n.url,
647
650
  ...typeof n.name == "string" ? { name: n.name } : {},
648
651
  ...typeof n.token == "string" ? { token: n.token } : {}
@@ -661,13 +664,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
661
664
  status: t.status,
662
665
  headers: {
663
666
  "content-type": t.contentType,
664
- ...j(n.origin)
667
+ ...A(n.origin)
665
668
  },
666
669
  body: t.body
667
670
  };
668
671
  }
669
672
  if (r !== "/_voltro/inspect/stream") {
670
- let t = oe(e, Be, n);
673
+ let t = se(e, Ve, n);
671
674
  if (t !== null) return {
672
675
  status: t.status,
673
676
  headers: {
@@ -677,34 +680,34 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
677
680
  body: t.body
678
681
  };
679
682
  }
680
- let o = Q(r, U), s = o ? J.get(o.route.pattern)?.renderMode : void 0, c = s === "ssr" || s === "isr" || (o ? X.has(o.route.pattern) : !1), d = r === "/" ? L(x, "index.html") : L(x, r.replace(/^\//, ""), "index.html");
681
- if (!c && await Z(d)) return {
683
+ let o = Z(r, U), s = o ? q.get(o.route.pattern)?.renderMode : void 0, c = s === "ssr" || s === "isr" || (o ? Y.has(o.route.pattern) : !1), d = r === "/" ? I(x, "index.html") : I(x, r.replace(/^\//, ""), "index.html");
684
+ if (!c && await X(d)) return {
682
685
  status: 200,
683
686
  headers: { "content-type": "text/html; charset=utf-8" },
684
- body: await z.readFile(d)
687
+ body: await R.readFile(d)
685
688
  };
686
689
  if (/\.[a-z0-9]+$/i.test(r)) {
687
- let e = L(x, r.replace(/^\//, ""));
688
- if (await Z(e)) {
689
- let t = await z.readFile(e);
690
+ let e = I(x, r.replace(/^\//, ""));
691
+ if (await X(e)) {
692
+ let t = await R.readFile(e);
690
693
  return {
691
694
  status: 200,
692
- headers: { "content-type": ke(e) },
695
+ headers: { "content-type": je(e) },
693
696
  body: t
694
697
  };
695
698
  }
696
699
  }
697
- let f = Q(r, U);
700
+ let f = Z(r, U);
698
701
  if (!f) return {
699
702
  status: 404,
700
703
  headers: { "content-type": "text/plain" },
701
704
  body: "not found"
702
705
  };
703
- let p = J.get(f.route.pattern), m = n["x-tenant"] ?? "anonymous", h = (await K.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, g = F(r, {
706
+ let p = q.get(f.route.pattern), m = n["x-tenant"] ?? "anonymous", h = (await G.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, g = P(r, {
704
707
  ...p?.tenantAware ? { tenant: m } : {},
705
708
  ...h ? { locale: h } : {}
706
- }), _ = R.get(g), v = Date.now();
707
- if (_ && de(_, v)) return u.emit("cache", {
709
+ }), _ = L.get(g), v = Date.now();
710
+ if (_ && fe(_, v)) return u.emit("cache", {
708
711
  kind: "HIT",
709
712
  key: g,
710
713
  ageMs: v - _.renderedAt
@@ -719,29 +722,29 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
719
722
  },
720
723
  body: _.html
721
724
  };
722
- if (_ && le(_, v)) return u.emit("cache", {
725
+ if (_ && ue(_, v)) return u.emit("cache", {
723
726
  kind: "STALE",
724
727
  key: g,
725
728
  ageMs: v - _.renderedAt
726
729
  }), (async () => {
727
730
  try {
728
- let i = await Ne({
729
- provider: K,
731
+ let i = await Pe({
732
+ provider: G,
730
733
  root: t,
731
734
  route: f.route,
732
735
  params: f.params,
733
736
  pathname: r,
734
737
  dirs: H,
735
- shellTemplate: P,
738
+ shellTemplate: N,
736
739
  requestHeaders: n,
737
- apiOrigin: ye,
738
- apiName: be,
740
+ apiOrigin: be,
741
+ apiName: xe,
739
742
  requestUrl: e,
740
743
  buffered: !0
741
744
  });
742
745
  if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
743
- let e = J.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
744
- R.set(g, {
746
+ let e = q.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
747
+ L.set(g, {
745
748
  html: i.html,
746
749
  renderedAt: t,
747
750
  expiresAt: t + i.revalidateMs,
@@ -751,7 +754,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
751
754
  });
752
755
  }
753
756
  } catch (e) {
754
- q.warn("background SWR refresh failed", { url: r }, e);
757
+ K.warn("background SWR refresh failed", { url: r }, e);
755
758
  }
756
759
  })(), {
757
760
  status: 200,
@@ -765,17 +768,17 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
765
768
  body: _.html
766
769
  };
767
770
  try {
768
- let i = await Ne({
769
- provider: K,
771
+ let i = await Pe({
772
+ provider: G,
770
773
  root: t,
771
774
  route: f.route,
772
775
  params: f.params,
773
776
  pathname: r,
774
777
  dirs: H,
775
- shellTemplate: P,
778
+ shellTemplate: N,
776
779
  requestHeaders: n,
777
- apiOrigin: ye,
778
- apiName: be,
780
+ apiOrigin: be,
781
+ apiName: xe,
779
782
  requestUrl: e
780
783
  });
781
784
  if (!i) return {
@@ -784,7 +787,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
784
787
  "content-type": "text/html; charset=utf-8",
785
788
  "x-voltro-rendered-by": "spa-fallback"
786
789
  },
787
- body: P
790
+ body: N
788
791
  };
789
792
  if ("stream" in i) return {
790
793
  status: 200,
@@ -812,8 +815,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
812
815
  "x-voltro-rendered-by": i.renderMode
813
816
  };
814
817
  if (i.renderMode === "isr" && i.revalidateMs !== null) {
815
- let e = Date.now(), t = J.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0;
816
- R.set(g, {
818
+ let e = Date.now(), t = q.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0;
819
+ L.set(g, {
817
820
  html: i.html,
818
821
  renderedAt: e,
819
822
  expiresAt: e + i.revalidateMs,
@@ -836,7 +839,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
836
839
  body: i.html
837
840
  };
838
841
  } catch (e) {
839
- return q.error("render error", { url: r }, e), ee(e) ? {
842
+ return K.error("render error", { url: r }, e), ee(e) ? {
840
843
  status: 500,
841
844
  headers: {
842
845
  "content-type": "text/plain; charset=utf-8",
@@ -849,7 +852,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
849
852
  body: "server error"
850
853
  };
851
854
  }
852
- }, He = !1, Ue = we(async (e, t) => {
855
+ }, Ue = !1, We = Te(async (e, t) => {
853
856
  let n = e.url ?? "/", r = Date.now(), i = {};
854
857
  for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
855
858
  let o = n.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
@@ -861,15 +864,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
861
864
  return;
862
865
  }
863
866
  if (o === "/internal/readiness") {
864
- let e = He ? 200 : 503;
867
+ let e = Ue ? 200 : 503;
865
868
  t.writeHead(e, {
866
869
  "content-type": "text/plain",
867
870
  "cache-control": "no-store"
868
- }), t.end(He ? "ready" : "not-ready");
871
+ }), t.end(Ue ? "ready" : "not-ready");
869
872
  return;
870
873
  }
871
874
  if (s === "OPTIONS" && o.startsWith("/_voltro/inspect")) {
872
- let e = j(i.origin);
875
+ let e = A(i.origin);
873
876
  t.writeHead(204, e), t.end();
874
877
  return;
875
878
  }
@@ -879,13 +882,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
879
882
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
880
883
  return;
881
884
  }
882
- if (!se(r)) {
885
+ if (!ce(r)) {
883
886
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
884
887
  return;
885
888
  }
886
889
  try {
887
890
  let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
888
- a ? n.authorization = Array.isArray(a) ? a[0] : a : N(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
891
+ a ? n.authorization = Array.isArray(a) ? a[0] : a : M(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
889
892
  let o;
890
893
  if (s && s !== "GET" && s !== "HEAD") {
891
894
  let t = [];
@@ -915,14 +918,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
915
918
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
916
919
  return;
917
920
  }
918
- if (!se(r)) {
921
+ if (!ce(r)) {
919
922
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
920
923
  return;
921
924
  }
922
925
  let a = new AbortController();
923
926
  e.on("close", () => a.abort()), t.on("close", () => a.abort());
924
927
  try {
925
- let e = i.authorization ?? (N(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
928
+ let e = i.authorization ?? (M(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
926
929
  redirect: "manual",
927
930
  method: "GET",
928
931
  headers: {
@@ -957,15 +960,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
957
960
  return;
958
961
  }
959
962
  if (o === "/_voltro/inspect/stream") {
960
- let n = j(i.origin);
961
- if (A()) {
963
+ let n = A(i.origin);
964
+ if (k()) {
962
965
  t.writeHead(503, {
963
966
  "content-type": "application/json",
964
967
  ...n
965
968
  }), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
966
969
  return;
967
970
  }
968
- let r = M(i, "GET");
971
+ let r = j(i, "GET");
969
972
  if (!r.ok) {
970
973
  t.writeHead(401, {
971
974
  "content-type": "application/json",
@@ -995,7 +998,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
995
998
  return;
996
999
  }
997
1000
  try {
998
- let e = await Ve(n, i);
1001
+ let e = await He(n, i);
999
1002
  if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !o.startsWith("/_voltro/inspect")) {
1000
1003
  let t = Date.now() - r;
1001
1004
  u.emit("request", {
@@ -1005,8 +1008,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1005
1008
  renderedBy: e.headers["x-voltro-rendered-by"],
1006
1009
  cache: e.headers["x-voltro-cache"]
1007
1010
  });
1008
- let n = Q(o, U)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1009
- Ie.record({
1011
+ let n = Z(o, U)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1012
+ Le.record({
1010
1013
  kind: "request",
1011
1014
  tag: n,
1012
1015
  durationMs: t,
@@ -1017,71 +1020,71 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1017
1020
  t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
1018
1021
  }
1019
1022
  });
1020
- await new Promise((e) => Ue.listen(m, "::", e)), He = !0, r.mark("ready"), q.info(`listening on http://localhost:${m}`, {
1023
+ await new Promise((e) => We.listen(m, "::", e)), Ue = !0, r.mark("ready"), K.info(`listening on http://localhost:${m}`, {
1021
1024
  port: m,
1022
1025
  distDir: x
1023
- }), q.debug("dynamic + ssr/isr routes resolve via SSR loader");
1026
+ }), K.debug("dynamic + ssr/isr routes resolve via SSR loader");
1024
1027
  try {
1025
- await fe({
1026
- id: T,
1028
+ await pe({
1029
+ id: w,
1027
1030
  name: C,
1028
1031
  kind: "web",
1029
1032
  url: `http://localhost:${m}`,
1030
1033
  pid: process.pid,
1031
1034
  status: "live",
1032
- logFile: E.path
1035
+ logFile: T.path
1033
1036
  });
1034
1037
  let e = p(t);
1035
1038
  if (e) {
1036
1039
  let t = await d({ dashboardAppPath: e });
1037
- t.status === "launched" ? q.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && q.debug(`dashboard already running on :${t.port}`, { port: t.port });
1040
+ 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 });
1038
1041
  }
1039
1042
  setInterval(() => {
1040
- fe({
1041
- id: T,
1043
+ pe({
1044
+ id: w,
1042
1045
  name: C,
1043
1046
  kind: "web",
1044
1047
  url: `http://localhost:${m}`,
1045
1048
  pid: process.pid,
1046
1049
  status: "live",
1047
- logFile: E.path
1050
+ logFile: T.path
1048
1051
  }).catch(() => {});
1049
1052
  }, 1e4).unref();
1050
1053
  } catch (e) {
1051
- q.warn("runtime-registry write failed", {}, e);
1054
+ K.warn("runtime-registry write failed", {}, e);
1052
1055
  }
1053
- Se({
1056
+ Ce({
1054
1057
  app: a.name ?? "unnamed",
1055
1058
  kind: "web",
1056
1059
  url: `http://localhost:${m}`,
1057
1060
  bootMs: r.total()
1058
1061
  });
1059
- let We = r.phaseBreakdown();
1060
- q.info(`start: ready in ${r.total()}ms`, {
1062
+ let Ge = r.phaseBreakdown();
1063
+ K.info(`start: ready in ${r.total()}ms`, {
1061
1064
  bootMs: r.total(),
1062
- ...We ? { phases: We } : {}
1065
+ ...Ge ? { phases: Ge } : {}
1063
1066
  });
1064
- let Ge = !1, Ke = (e) => async () => {
1065
- if (!Ge) {
1066
- if (Ge = !0, q.info(`received ${e}, shutting down`, { signal: e }), Ue.close(), await $.stop(), B) try {
1067
- await B.end();
1067
+ let Ke = !1, qe = (e) => async () => {
1068
+ if (!Ke) {
1069
+ if (Ke = !0, K.info(`received ${e}, shutting down`, { signal: e }), We.close(), await $.stop(), z) try {
1070
+ await z.end();
1068
1071
  } catch {}
1069
- await K.close(), await me(T), await E.dispose(), process.exit(0);
1072
+ await G.close(), await he(w), await T.dispose(), process.exit(0);
1070
1073
  }
1071
1074
  };
1072
- process.on("SIGINT", Ke("SIGINT")), process.on("SIGTERM", Ke("SIGTERM"));
1073
- let qe = process.ppid;
1074
- if (qe > 1) {
1075
+ process.on("SIGINT", qe("SIGINT")), process.on("SIGTERM", qe("SIGTERM"));
1076
+ let Je = process.ppid;
1077
+ if (Je > 1) {
1075
1078
  let e = setInterval(() => {
1076
- (process.ppid !== qe || process.ppid === 1) && (clearInterval(e), Ke("SIGTERM")());
1079
+ (process.ppid !== Je || process.ppid === 1) && (clearInterval(e), qe("SIGTERM")());
1077
1080
  }, 2e3);
1078
1081
  e.unref();
1079
1082
  }
1080
1083
  return new Promise(() => {});
1081
1084
  }, Le = async (e) => {
1082
1085
  t("start");
1083
- let n = await Ie(R(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1084
- return n.ran ? n.exitCode : (q.error("no web app found at this path"), 1);
1086
+ let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await $(L(n));
1087
+ return r.ran ? r.exitCode : (K.error("no web app found at this path"), 1);
1085
1088
  };
1086
1089
  //#endregion
1087
- export { Ie as n, Le as t };
1090
+ export { $ as n, Le as t };