@voltro/cli 0.21.0 → 0.22.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 (69) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/dist/apiBuild-COyPDf3R.js +2 -0
  3. package/dist/{apiBuild-BHOtsQkp.js → apiBuild-DiWxVz-M.js} +2 -2
  4. package/dist/bin.js +3 -3
  5. package/dist/{commands-BZoimvvS.js → commands-BxRaIOBG.js} +1548 -1246
  6. package/dist/dbCommand-CO3eSAZR.js +2 -0
  7. package/dist/{dbCommand-CDBbZ-Ac.js → dbCommand-DVASmZj2.js} +295 -253
  8. package/dist/{dev-DKb92NYX.js → dev-BRiPgbKw.js} +1738 -1702
  9. package/dist/{dev-CZQ73Yoh.js → dev-Dd3EZzj5.js} +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/inspect-BA67TF6v.js +2 -0
  12. package/dist/inspect-_ldwsAwH.js +945 -0
  13. package/dist/{inspectMetrics-DMjWBQif.js → inspectMetrics-9ZSuDeqD.js} +148 -115
  14. package/dist/{manifestBuild-P9yuCY2d.js → manifestBuild-Bs1Uw22_.js} +1 -1
  15. package/dist/manifestBuild-i-fRHg_H.js +2 -0
  16. package/dist/{serveCommand-qHJCs0cX.js → serveCommand-DXJOARkO.js} +305 -306
  17. package/dist/serveEntry.js +2 -2
  18. package/dist/{start-B1x6Z60h.js → start-CsIjcOi-.js} +3 -3
  19. package/dist/startEntry.js +2 -2
  20. package/package.json +17 -17
  21. package/templates/AGENTS.md +1 -1
  22. package/templates/agent-docs/_index.md +1 -1
  23. package/templates/agent-docs/cli.md +118 -5
  24. package/templates/agent-docs/data.md +58 -0
  25. package/templates/agent-docs/database/migrations.md +142 -20
  26. package/templates/agent-docs/plugins.md +1 -1
  27. package/templates/agent-docs/schema-driven-ui.md +2 -2
  28. package/templates/agent-docs/templates/apibackends.md +1 -1
  29. package/templates/agent-docs/whats-new.md +32 -114
  30. package/templates/apps/api-ai/package.json +7 -7
  31. package/templates/apps/api-auth/package.json +8 -8
  32. package/templates/apps/api-backend/package.json +7 -7
  33. package/templates/apps/api-backend-deactivation/package.json +7 -7
  34. package/templates/apps/api-backend-mail/package.json +8 -8
  35. package/templates/apps/api-backend-mariadb/package.json +9 -9
  36. package/templates/apps/api-backend-storage/package.json +8 -8
  37. package/templates/apps/api-data-advanced/package.json +8 -8
  38. package/templates/apps/api-durable/package.json +8 -8
  39. package/templates/apps/api-feature-flags/package.json +9 -9
  40. package/templates/apps/api-governance/package.json +8 -8
  41. package/templates/apps/api-kv/package.json +8 -8
  42. package/templates/apps/api-moderation/package.json +8 -8
  43. package/templates/apps/api-observability/package.json +8 -8
  44. package/templates/apps/api-ratelimit/package.json +8 -8
  45. package/templates/apps/api-rbac/package.json +8 -8
  46. package/templates/apps/api-rest/package.json +7 -7
  47. package/templates/apps/api-saas/package.json +11 -11
  48. package/templates/apps/api-search/package.json +8 -8
  49. package/templates/apps/api-versioning/package.json +8 -8
  50. package/templates/apps/api-webhooks/package.json +9 -9
  51. package/templates/apps/changelog/package.json +6 -6
  52. package/templates/apps/edge-functions/package.json +2 -2
  53. package/templates/apps/frontend-admin/package.json +8 -8
  54. package/templates/apps/frontend-app/package.json +8 -8
  55. package/templates/apps/frontend-blank/package.json +7 -7
  56. package/templates/apps/frontend-contact/package.json +7 -7
  57. package/templates/apps/frontend-dashboard/package.json +7 -7
  58. package/templates/apps/frontend-docs/package.json +7 -7
  59. package/templates/apps/frontend-i18n/package.json +6 -6
  60. package/templates/apps/frontend-landing/package.json +7 -7
  61. package/templates/apps/frontend-spa/package.json +7 -7
  62. package/templates/apps/frontend-ssr/package.json +7 -7
  63. package/templates/apps/frontend-ssr-api/package.json +8 -8
  64. package/templates/apps/frontend-static-blog/package.json +6 -6
  65. package/dist/apiBuild-K7M6Rt0U.js +0 -2
  66. package/dist/dbCommand-oADAj6ez.js +0 -2
  67. package/dist/inspect-DcZ04OME.js +0 -2
  68. package/dist/inspect-Dwx0_tUj.js +0 -921
  69. package/dist/manifestBuild-D1MzJAiQ.js +0 -2
@@ -1,5 +1,5 @@
1
1
  import { d as e, u as t, x as n } from "./fileConventions-CBNPZVOV.js";
2
- import { D as r, E as i, T as a, a as o, p as s, w as c } from "./inspect-Dwx0_tUj.js";
2
+ import { D as r, E as i, T as a, a as o, p as s, w as c } from "./inspect-_ldwsAwH.js";
3
3
  import { basename as l, dirname as u, isAbsolute as d, join as f, relative as p, resolve as m } from "node:path";
4
4
  import { fileURLToPath as h, pathToFileURL as g } from "node:url";
5
5
  import { FileSystem as _ } from "@effect/platform";
@@ -1033,7 +1033,7 @@ __installPublicEnv(publicEnvValues)
1033
1033
  contentType: "application/json",
1034
1034
  body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
1035
1035
  };
1036
- let r = o(n);
1036
+ let r = o(n, "GET");
1037
1037
  if (!r.ok) return {
1038
1038
  status: 401,
1039
1039
  contentType: "application/json",
@@ -1114,7 +1114,10 @@ __installPublicEnv(publicEnvValues)
1114
1114
  }, Dn = "/_voltro/inspect/logs", On = (e, t, n) => {
1115
1115
  if (t.headers.authorization !== void 0) return !1;
1116
1116
  let { token: r } = n;
1117
- return r === void 0 || r === "" || !n.isLoopback(n.target) ? !1 : (e.setHeader("authorization", `Bearer ${r}`), !0);
1117
+ if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
1118
+ e.setHeader("authorization", `Bearer ${r}`);
1119
+ let i = n.writeToken;
1120
+ return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
1118
1121
  }, kn = [{
1119
1122
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1120
1123
  handle: (e, t) => {
@@ -1541,6 +1544,28 @@ import {
1541
1544
  super(e), this.name = "DeferralNotSupportedError";
1542
1545
  }
1543
1546
  }, Er = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Dr = (e) => {
1547
+ if (!(e instanceof Error)) return;
1548
+ let t = e._voltroControl;
1549
+ if (t === "redirect") {
1550
+ let { location: t, status: n } = e;
1551
+ return typeof t == "string" ? {
1552
+ status: n === 307 || n === 308 ? n : 303,
1553
+ headers: {
1554
+ location: t,
1555
+ "x-voltro-rendered-by": "loader-redirect"
1556
+ },
1557
+ body: ""
1558
+ } : void 0;
1559
+ }
1560
+ if (t === "not-found") return {
1561
+ status: 404,
1562
+ headers: {
1563
+ "content-type": "text/plain; charset=utf-8",
1564
+ "x-voltro-rendered-by": "loader-not-found"
1565
+ },
1566
+ body: "not found"
1567
+ };
1568
+ }, Or = (e) => {
1544
1569
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
1545
1570
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
1546
1571
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -1571,8 +1596,8 @@ import {
1571
1596
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
1572
1597
  }
1573
1598
  };
1574
- }, Or = (e) => {
1575
- let { helpers: t, renderInput: n } = e, r = Dr({
1599
+ }, kr = (e) => {
1600
+ let { helpers: t, renderInput: n } = e, r = Or({
1576
1601
  helpers: t,
1577
1602
  page: e.page,
1578
1603
  pathname: n.pathname,
@@ -1593,37 +1618,37 @@ import {
1593
1618
  stateScript: t.renderRouterStateScript(r.stateInput),
1594
1619
  hasDeferred: r.hasDeferred
1595
1620
  };
1596
- }, kr = (e) => {
1621
+ }, Ar = (e) => {
1597
1622
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
1598
1623
  return {
1599
1624
  body: t,
1600
1625
  meta: n
1601
1626
  };
1602
- }, Ar = (e) => [
1627
+ }, jr = (e) => [
1603
1628
  ...e.extra ?? [],
1604
1629
  e.helpers.renderMetaToHtml(e.meta),
1605
1630
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
1606
1631
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
1607
1632
  e.prepared.stateScript
1608
- ].filter((e) => e.length > 0).join("\n "), jr = "<div id=\"root\"></div>", Mr = "<div id=\"root\">", Nr = "</div>", Pr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Fr = /\bsrc=["']([^"']+)["']/i, Ir = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Lr = (e) => {
1609
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Pr, (e) => {
1610
- let r = Fr.exec(e)?.[1];
1633
+ ].filter((e) => e.length > 0).join("\n "), Mr = "<div id=\"root\"></div>", Nr = "<div id=\"root\">", Pr = "</div>", Fr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Ir = /\bsrc=["']([^"']+)["']/i, Lr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Rr = (e) => {
1634
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Fr, (e) => {
1635
+ let r = Ir.exec(e)?.[1];
1611
1636
  return r === void 0 || t(r) ? e : (n.push(r), "");
1612
1637
  });
1613
- e.inlineModuleScriptsAsync && (r = r.replace(Ir, "<script async$1>"));
1614
- let i = r.indexOf(jr);
1615
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${jr}\` element, so a streamed response cannot be split around the page body. This is a framework bug unless the app overrode \`.framework/index.html\` by hand.`);
1638
+ e.inlineModuleScriptsAsync && (r = r.replace(Lr, "<script async$1>"));
1639
+ let i = r.indexOf(Mr);
1640
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Mr}\` element, so a streamed response cannot be split around the page body. This is a framework bug unless the app overrode \`.framework/index.html\` by hand.`);
1616
1641
  return {
1617
- head: `${r.slice(0, i)}${Mr}`,
1618
- tail: `${Nr}${r.slice(i + 21)}`,
1642
+ head: `${r.slice(0, i)}${Nr}`,
1643
+ tail: `${Pr}${r.slice(i + 21)}`,
1619
1644
  bootstrapModules: n
1620
1645
  };
1621
- }, Rr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), zr = (e) => {
1646
+ }, zr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Br = (e) => {
1622
1647
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
1623
1648
  if (s || !o || a === null) return;
1624
1649
  s = !0, t.statusCode = e.statusCode ?? 200;
1625
1650
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
1626
- t.flushHeaders?.(), t.write(Rr({
1651
+ t.flushHeaders?.(), t.write(zr({
1627
1652
  head: n.head,
1628
1653
  headInjection: i(a.meta),
1629
1654
  htmlLang: r
@@ -1653,14 +1678,14 @@ import {
1653
1678
  return;
1654
1679
  }
1655
1680
  c();
1656
- }, X = T({ scope: "voltro:dev:web" }), Br = T({ scope: "vite" }), Vr = await (async () => {
1681
+ }, X = T({ scope: "voltro:dev:web" }), Vr = T({ scope: "vite" }), Hr = await (async () => {
1657
1682
  try {
1658
1683
  let e = f(u(h(import.meta.url)), "..", "package.json"), t = await A.readFile(e, "utf8");
1659
1684
  return JSON.parse(t).version ?? "0.0.0";
1660
1685
  } catch {
1661
1686
  return "0.0.0";
1662
1687
  }
1663
- })(), Hr = async () => {
1688
+ })(), Ur = async () => {
1664
1689
  try {
1665
1690
  let e = u(h(import.meta.url)), t = m(e, "..", "..", "devtools");
1666
1691
  if (O(f(t, "package.json"))) return t;
@@ -1669,7 +1694,7 @@ import {
1669
1694
  } catch {
1670
1695
  return null;
1671
1696
  }
1672
- }, Ur = (e, t) => e.disableDevtools || !t ? [] : [
1697
+ }, Wr = (e, t) => e.disableDevtools || !t ? [] : [
1673
1698
  "",
1674
1699
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
1675
1700
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -1679,12 +1704,12 @@ import {
1679
1704
  " await import('@voltro/devtools/styles.css')",
1680
1705
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
1681
1706
  "}"
1682
- ], Wr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Gr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Kr = (e) => e.sentry ? [
1707
+ ], Gr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Kr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], qr = (e) => e.sentry ? [
1683
1708
  "",
1684
1709
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
1685
1710
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
1686
1711
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
1687
- ] : [], qr = (e) => e.env ? ["import './env.public'"] : [], Jr = (e) => {
1712
+ ] : [], Jr = (e) => e.env ? ["import './env.public'"] : [], Yr = (e) => {
1688
1713
  let t = [], n = m(e);
1689
1714
  for (;;) {
1690
1715
  O(f(n, "pnpm-workspace.yaml")) && t.push(n);
@@ -1693,14 +1718,14 @@ import {
1693
1718
  n = e;
1694
1719
  }
1695
1720
  return t;
1696
- }, Yr = Nn, Xr = (e) => {
1721
+ }, Xr = Nn, Zr = (e) => {
1697
1722
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
1698
1723
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
1699
1724
  if (t) return `island-${t[1]}`;
1700
- }, Zr = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Qr = (e) => e.startsWith("(") && e.endsWith(")"), $r = (e) => e.filter((e) => !Qr(e)), ei = (e) => {
1701
- let n = e.replace(t, "").split("/").filter(Boolean).filter((e) => !Qr(e));
1725
+ }, Qr = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, $r = (e) => e.startsWith("(") && e.endsWith(")"), ei = (e) => e.filter((e) => !$r(e)), ti = (e) => {
1726
+ let n = e.replace(t, "").split("/").filter(Boolean).filter((e) => !$r(e));
1702
1727
  return n.length === 0 ? "/" : "/" + n.join("/");
1703
- }, ti = (e) => `${e.replace(t, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, Z = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, Q = async (n) => {
1728
+ }, ni = (e) => `${e.replace(t, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, Z = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, Q = async (n) => {
1704
1729
  let r = [], i = [], a = async (n, o) => {
1705
1730
  let s = [];
1706
1731
  try {
@@ -1708,17 +1733,17 @@ import {
1708
1733
  } catch {
1709
1734
  return;
1710
1735
  }
1711
- let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Yr(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1736
+ let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Xr(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1712
1737
  if (l.some((t) => e.has(t))) {
1713
1738
  let t = u.has("layout.tsx"), r = !1;
1714
1739
  if (t) try {
1715
1740
  let e = await A.readFile(f(n, "layout.tsx"), "utf8");
1716
- r = Zr.test(e);
1741
+ r = Qr.test(e);
1717
1742
  } catch {}
1718
1743
  i.push({
1719
1744
  dir: d,
1720
1745
  chain: o,
1721
- contributesToUrl: o.length === 0 || !Qr(o[o.length - 1]),
1746
+ contributesToUrl: o.length === 0 || !$r(o[o.length - 1]),
1722
1747
  hasLayout: t,
1723
1748
  hasLayoutLoader: r,
1724
1749
  hasError: u.has("error.tsx"),
@@ -1732,8 +1757,8 @@ import {
1732
1757
  let n = d ? `${d}/${e}` : e;
1733
1758
  r.push({
1734
1759
  file: n,
1735
- pattern: ei(n),
1736
- ident: ti(n),
1760
+ pattern: ti(n),
1761
+ ident: ni(n),
1737
1762
  dirChain: o
1738
1763
  });
1739
1764
  }
@@ -1752,14 +1777,14 @@ import {
1752
1777
  dirs: s,
1753
1778
  orphanedSpecials: c
1754
1779
  };
1755
- }, ni = (e, t) => {
1780
+ }, ri = (e, t) => {
1756
1781
  let n = [];
1757
1782
  for (let r = 0; r <= t.length; r++) {
1758
1783
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
1759
1784
  a && n.push(a);
1760
1785
  }
1761
1786
  return n;
1762
- }, ri = async (e) => {
1787
+ }, ii = async (e) => {
1763
1788
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
1764
1789
  return {
1765
1790
  chain: await Promise.all(t.map(async (e, t) => {
@@ -1781,10 +1806,10 @@ import {
1781
1806
  })),
1782
1807
  segmentLoaderData: o
1783
1808
  };
1784
- }, ii = (e) => {
1785
- let t = $r(e);
1809
+ }, ai = (e) => {
1810
+ let t = ei(e);
1786
1811
  return t.length === 0 ? "" : "/" + t.join("/");
1787
- }, ai = [
1812
+ }, oi = [
1788
1813
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
1789
1814
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
1790
1815
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -1877,7 +1902,7 @@ import {
1877
1902
  " _vdtErrorStart('Build error')",
1878
1903
  " })",
1879
1904
  "}"
1880
- ].join("\n"), oi = (e) => {
1905
+ ].join("\n"), si = (e) => {
1881
1906
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
1882
1907
  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, "\\$&"));
1883
1908
  let a = i.join("/");
@@ -1886,8 +1911,8 @@ import {
1886
1911
  paramNames: t,
1887
1912
  priority: n
1888
1913
  };
1889
- }, si = (e) => e.map((e) => {
1890
- let { regex: t, paramNames: n, priority: r } = oi(e.pattern);
1914
+ }, ci = (e) => e.map((e) => {
1915
+ let { regex: t, paramNames: n, priority: r } = si(e.pattern);
1891
1916
  return {
1892
1917
  pattern: e.pattern,
1893
1918
  file: e.file,
@@ -1896,7 +1921,7 @@ import {
1896
1921
  paramNames: n,
1897
1922
  priority: r
1898
1923
  };
1899
- }).slice().sort((e, t) => e.priority - t.priority), ci = (e, t) => {
1924
+ }).slice().sort((e, t) => e.priority - t.priority), li = (e, t) => {
1900
1925
  for (let n of t) {
1901
1926
  let t = n.regex.exec(e);
1902
1927
  if (!t) continue;
@@ -1908,7 +1933,7 @@ import {
1908
1933
  };
1909
1934
  }
1910
1935
  return null;
1911
- }, li = async (e, t) => {
1936
+ }, ui = async (e, t) => {
1912
1937
  let n = e;
1913
1938
  for (;;) {
1914
1939
  let e = f(n, "node_modules", t);
@@ -1922,7 +1947,7 @@ import {
1922
1947
  if (r === n) return null;
1923
1948
  n = r;
1924
1949
  }
1925
- }, ui = async (e) => {
1950
+ }, di = async (e) => {
1926
1951
  try {
1927
1952
  let t = await import(g(f(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
1928
1953
  return a ? {
@@ -1931,7 +1956,7 @@ import {
1931
1956
  } : { port: r };
1932
1957
  } catch {}
1933
1958
  return { port: 4e3 };
1934
- }, di = (e, t) => ({
1959
+ }, fi = (e, t) => ({
1935
1960
  name: e,
1936
1961
  pkg: t.package,
1937
1962
  browserWsUrl: t.url,
@@ -1939,7 +1964,7 @@ import {
1939
1964
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
1940
1965
  ...t.headers ? { headers: t.headers } : {},
1941
1966
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1942
- }), fi = (e, t, n) => {
1967
+ }), pi = (e, t, n) => {
1943
1968
  let r = t.transport?.wsPath ?? n.wsPath;
1944
1969
  return {
1945
1970
  name: e,
@@ -1951,7 +1976,7 @@ import {
1951
1976
  ...t.headers ? { headers: t.headers } : {},
1952
1977
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1953
1978
  };
1954
- }, pi = (e) => {
1979
+ }, mi = (e) => {
1955
1980
  let t = /* @__PURE__ */ new Map();
1956
1981
  for (let n of e) {
1957
1982
  if (n.proxyTarget === void 0) continue;
@@ -1959,43 +1984,43 @@ import {
1959
1984
  if (e) throw Error(`[voltro] api ${JSON.stringify(n.name)} and ${JSON.stringify(e)} both resolve the same-origin WS path ${JSON.stringify(n.browserWsUrl)}. A custom transport.wsPath must be unique per origin (one api per origin may use a fixed path). Give each a distinct wsPath, or drop the override to use the default /ws/<name>.`);
1960
1985
  t.set(n.browserWsUrl, n.name);
1961
1986
  }
1962
- }, mi = async (e, t) => {
1987
+ }, hi = async (e, t) => {
1963
1988
  let n = Object.entries(t.apis ?? {}), r = [];
1964
1989
  for (let [t, i] of n) {
1965
1990
  if (i.url) {
1966
- r.push(di(t, i));
1991
+ r.push(fi(t, i));
1967
1992
  continue;
1968
1993
  }
1969
- let n = await li(e, i.package);
1994
+ let n = await ui(e, i.package);
1970
1995
  if (!n) throw Error(`[voltro dev] api ${JSON.stringify(t)} (package ${JSON.stringify(i.package)}) is not a workspace dep and has no \`url\` set in app.config.ts. External apis need an explicit \`url\` because the framework can't discover their dev port.`);
1971
- r.push(fi(t, i, await ui(n)));
1996
+ r.push(pi(t, i, await di(n)));
1972
1997
  }
1973
- return pi(r), r;
1974
- }, hi = (e) => {
1998
+ return mi(r), r;
1999
+ }, gi = (e) => {
1975
2000
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
1976
2001
  let t = new URL(e);
1977
2002
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
1978
2003
  } catch {
1979
2004
  return;
1980
2005
  }
1981
- }, gi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, _i = (e) => process.env[gi(e)] ?? process.env.VOLTRO_API_ORIGIN, vi = (e, t) => {
2006
+ }, _i = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, vi = (e) => process.env[_i(e)] ?? process.env.VOLTRO_API_ORIGIN, yi = (e, t) => {
1982
2007
  if (!e) return;
1983
- let n = _i(e.name) ?? e.serverOrigin;
2008
+ let n = vi(e.name) ?? e.serverOrigin;
1984
2009
  if (n) {
1985
- let e = hi(n);
2010
+ let e = gi(n);
1986
2011
  if (e) return e;
1987
2012
  }
1988
2013
  if (t?.allowDevProxy && e.proxyTarget) {
1989
- let t = hi(e.proxyTarget);
2014
+ let t = gi(e.proxyTarget);
1990
2015
  if (t) return t;
1991
2016
  }
1992
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return hi(e.browserWsUrl);
1993
- }, yi = (e, t, n) => {
2017
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return gi(e.browserWsUrl);
2018
+ }, bi = (e, t, n) => {
1994
2019
  if (!e) {
1995
2020
  if (n?.apiName === void 0) return;
1996
2021
  let e = n.apiName;
1997
2022
  return async () => {
1998
- throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${gi(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
2023
+ throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${_i(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
1999
2024
  };
2000
2025
  }
2001
2026
  return async (r, i) => {
@@ -2017,7 +2042,7 @@ import {
2017
2042
  });
2018
2043
  } catch (t) {
2019
2044
  let i = t?.cause?.code ?? String(t?.message ?? t);
2020
- throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${gi(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
2045
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${_i(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
2021
2046
  }
2022
2047
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
2023
2048
  let s = await o.json();
@@ -2036,7 +2061,7 @@ import {
2036
2061
  if (u) return l;
2037
2062
  };
2038
2063
  }, $ = async (e, t, n, r = {}) => {
2039
- let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = O(f(e, "node_modules", "@voltro", "devtools", "package.json")) || await Hr() !== null, s = t.theme === "system" ? [
2064
+ let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = O(f(e, "node_modules", "@voltro", "devtools", "package.json")) || await Ur() !== null, s = t.theme === "system" ? [
2040
2065
  " <script>",
2041
2066
  " (function () {",
2042
2067
  " var root = document.documentElement",
@@ -2090,13 +2115,13 @@ import {
2090
2115
  e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Z(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Z(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Z(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Z(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Z(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2091
2116
  }
2092
2117
  let r = u.map((e) => {
2093
- let t = ni(d, e.dirChain).map((e) => {
2118
+ let t = ri(d, e.dirChain).map((e) => {
2094
2119
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2095
2120
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasLayoutLoader && t.push(`loader: refs.layoutLoaders[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), e.hasPending && t.push(`Pending: refs.pendings[${n}]`), ` { ${t.join(", ")} }`;
2096
2121
  }).join(",\n");
2097
2122
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2098
2123
  }), i = d.filter((e) => e.hasNotFound).map((e) => {
2099
- let t = ii(e.chain), n = ni(d, e.chain).map((e) => {
2124
+ let t = ai(e.chain), n = ri(d, e.chain).map((e) => {
2100
2125
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2101
2126
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2102
2127
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
@@ -2335,14 +2360,14 @@ import {
2335
2360
  "// resolved apis map. Side-effect only — no local component definitions —",
2336
2361
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2337
2362
  "",
2338
- ...qr(t),
2363
+ ...Jr(t),
2339
2364
  "import { mount } from '@voltro/web'",
2340
2365
  ...g,
2341
2366
  "import { App } from './app'",
2342
2367
  "import { preloadCurrentRoute } from './routeTable'",
2343
- ...Gr(t),
2344
- ...Ur(t, o),
2345
2368
  ...Kr(t),
2369
+ ...Wr(t, o),
2370
+ ...qr(t),
2346
2371
  "",
2347
2372
  "// Preload the current route's page chunk BEFORE hydration so the first",
2348
2373
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2359,10 +2384,10 @@ import {
2359
2384
  " apis: {",
2360
2385
  ..._,
2361
2386
  " },",
2362
- ...Wr(t, o),
2387
+ ...Gr(t, o),
2363
2388
  "})",
2364
2389
  "",
2365
- ai
2390
+ oi
2366
2391
  ].join("\n");
2367
2392
  } else v = "", y = "", b = [
2368
2393
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -2370,22 +2395,22 @@ import {
2370
2395
  "// and calls mount(). Side-effect only, no component definitions, so the",
2371
2396
  "// user's component file remains the Fast Refresh boundary.",
2372
2397
  "",
2373
- ...qr(t),
2398
+ ...Jr(t),
2374
2399
  "import { mount } from '@voltro/web'",
2375
2400
  ...g,
2376
2401
  "import App from '../src/App'",
2377
- ...Gr(t),
2378
- ...Ur(t, o),
2379
2402
  ...Kr(t),
2403
+ ...Wr(t, o),
2404
+ ...qr(t),
2380
2405
  "",
2381
2406
  "mount(App, {",
2382
2407
  " apis: {",
2383
2408
  ..._,
2384
2409
  " },",
2385
- ...Wr(t, o),
2410
+ ...Gr(t, o),
2386
2411
  "})",
2387
2412
  "",
2388
- ai
2413
+ oi
2389
2414
  ].join("\n");
2390
2415
  let x = f(e, ".framework");
2391
2416
  await A.mkdir(x, { recursive: !0 }), t.env ? await ht(x, r) : await A.rm(f(x, "env.public.ts"), { force: !0 }), await A.writeFile(f(x, "index.html"), c, "utf8"), await A.writeFile(f(x, "main.tsx"), b, "utf8"), v ? (await A.writeFile(f(x, "app.tsx"), v, "utf8"), await A.writeFile(f(x, "routeTable.ts"), y, "utf8")) : (await A.rm(f(x, "app.tsx"), { force: !0 }), await A.rm(f(x, "routeTable.ts"), { force: !0 }));
@@ -2402,7 +2427,7 @@ import {
2402
2427
  X.warn(`could not add ${E.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2403
2428
  }
2404
2429
  }
2405
- }, bi = async (e, t) => {
2430
+ }, xi = async (e, t) => {
2406
2431
  try {
2407
2432
  let n = f(u(e), "project.json");
2408
2433
  if (!O(n)) return;
@@ -2415,16 +2440,16 @@ import {
2415
2440
  projectJson: n
2416
2441
  });
2417
2442
  } catch {}
2418
- }, xi = (e) => f(e, ".framework", "dist", "server", "appConfig.js"), Si = async (e) => {
2419
- let t = xi(e), n = O(t) ? t : f(e, "app.config.ts");
2443
+ }, Si = (e) => f(e, ".framework", "dist", "server", "appConfig.js"), Ci = async (e) => {
2444
+ let t = Si(e), n = O(t) ? t : f(e, "app.config.ts");
2420
2445
  try {
2421
2446
  let e = (await import(g(n).href)).default;
2422
2447
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
2423
2448
  } catch {
2424
2449
  return null;
2425
2450
  }
2426
- }, Ci = async (e) => {
2427
- let t = await Si(e);
2451
+ }, wi = async (e) => {
2452
+ let t = await Ci(e);
2428
2453
  if (!t) return {
2429
2454
  ran: !1,
2430
2455
  exitCode: 0
@@ -2432,7 +2457,7 @@ import {
2432
2457
  An();
2433
2458
  let n = Qt();
2434
2459
  ln(n), X.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
2435
- let u = await mi(e, t);
2460
+ let u = await hi(e, t);
2436
2461
  for (let e of u) X.info("api wired", {
2437
2462
  name: e.name,
2438
2463
  pkg: e.pkg,
@@ -2465,10 +2490,10 @@ import {
2465
2490
  pid: process.pid,
2466
2491
  status: "booting",
2467
2492
  logFile: y.path
2468
- }).catch(() => {}), await bi(e, g);
2493
+ }).catch(() => {}), await xi(e, g);
2469
2494
  let { pages: b, dirs: x } = await Q(f(e, "src", "pages")), S = {
2470
2495
  dirs: x,
2471
- ssrRoutes: si(b)
2496
+ ssrRoutes: ci(b)
2472
2497
  }, C = x.map((e) => ({
2473
2498
  dir: e.dir,
2474
2499
  hasLayout: e.hasLayout,
@@ -2504,7 +2529,7 @@ import {
2504
2529
  ...r.devDependencies
2505
2530
  });
2506
2531
  await Promise.all(i.map(async (n) => {
2507
- let r = await li(e, n);
2532
+ let r = await ui(e, n);
2508
2533
  if (!r) return;
2509
2534
  let i = f(r, "src");
2510
2535
  try {
@@ -2521,7 +2546,7 @@ import {
2521
2546
  await Xt({
2522
2547
  appRoot: e,
2523
2548
  pages: i
2524
- }), S.dirs = a, S.ssrRoutes = si(i), X.info("page tree regenerated", {
2549
+ }), S.dirs = a, S.ssrRoutes = ci(i), X.info("page tree regenerated", {
2525
2550
  reason: n,
2526
2551
  ms: Date.now() - r,
2527
2552
  routes: S.ssrRoutes.length
@@ -2611,7 +2636,7 @@ import {
2611
2636
  }
2612
2637
  try {
2613
2638
  let n = Date.now();
2614
- await $(e, r, await mi(e, r)), ae = r, t.ws && t.ws.send({
2639
+ await $(e, r, await hi(e, r)), ae = r, t.ws && t.ws.send({
2615
2640
  type: "full-reload",
2616
2641
  path: "*"
2617
2642
  }), X.info("app.config.ts soft-regen", {
@@ -2651,7 +2676,7 @@ import {
2651
2676
  let n = /* @__PURE__ */ new Map();
2652
2677
  for (let r of u) {
2653
2678
  if (!r.proxyTarget) continue;
2654
- let i = await li(e, r.pkg);
2679
+ let i = await ui(e, r.pkg);
2655
2680
  if (!i) continue;
2656
2681
  let a = f(i, "rpcGroup.generated.ts");
2657
2682
  try {
@@ -2699,6 +2724,7 @@ import {
2699
2724
  On(t, n, {
2700
2725
  target: e,
2701
2726
  token: process.env.VOLTRO_INSPECT_TOKEN,
2727
+ writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
2702
2728
  isLoopback: r
2703
2729
  });
2704
2730
  });
@@ -2900,7 +2926,7 @@ import {
2900
2926
  r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2901
2927
  return;
2902
2928
  }
2903
- let a = o(u);
2929
+ let a = o(u, "GET");
2904
2930
  if (!a.ok) {
2905
2931
  r.statusCode = 401, r.setHeader("content-type", "application/json");
2906
2932
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
@@ -2934,7 +2960,7 @@ import {
2934
2960
  kind: "web",
2935
2961
  meta: {
2936
2962
  name: t.name ?? "(unnamed)",
2937
- voltroVersion: Vr,
2963
+ voltroVersion: Hr,
2938
2964
  port: g,
2939
2965
  mode: "dev",
2940
2966
  apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
@@ -3008,7 +3034,7 @@ import {
3008
3034
  if (r.method !== "GET" && r.method !== "HEAD") return a();
3009
3035
  let o = r.url ?? "/", s = o.indexOf("?"), c = (s === -1 ? o : o.slice(0, s)) || "/";
3010
3036
  if (c.startsWith("/@") || c.startsWith("/node_modules/") || c.startsWith("/.framework/") || c.startsWith("/_voltro/") || c === "/main.tsx" || c === "/index.html" || c === "/sw.js" || c === "/favicon.ico" || c === "/robots.txt" || /\.[a-z0-9]+$/i.test(c)) return a();
3011
- let l = ci(c, S.ssrRoutes);
3037
+ let l = li(c, S.ssrRoutes);
3012
3038
  if (!l) return a();
3013
3039
  let d = !he.has(l.route.pattern), p = Date.now();
3014
3040
  d && X.info(`ssr compiling ${l.route.pattern}`, {
@@ -3030,15 +3056,15 @@ import {
3030
3056
  }
3031
3057
  };
3032
3058
  try {
3033
- let s = await h("loadPage", async () => await n(f(e, "src", "pages", l.route.file))), _ = Yn(s, f("src", "pages", l.route.file)), v = ni(S.dirs, l.route.dirChain), y = _ === "spa" && v.some((e) => e.hasLayout);
3059
+ let s = await h("loadPage", async () => await n(f(e, "src", "pages", l.route.file))), _ = Yn(s, f("src", "pages", l.route.file)), v = ri(S.dirs, l.route.dirChain), y = _ === "spa" && v.some((e) => e.hasLayout);
3034
3060
  if (_ !== "ssr" && _ !== "isr" && !y) return a();
3035
3061
  let b = {};
3036
3062
  for (let [e, t] of Object.entries(r.headers ?? {})) typeof t == "string" ? b[e] = t : Array.isArray(t) && (b[e] = t.join(", "));
3037
- let x = yi(vi(u[0], { allowDevProxy: !0 }), b.cookie, { apiName: u[0]?.name }), C = new AbortController(), w = () => C.abort();
3063
+ let x = bi(yi(u[0], { allowDevProxy: !0 }), b.cookie, { apiName: u[0]?.name }), C = new AbortController(), w = () => C.abort();
3038
3064
  i.once("close", w);
3039
3065
  let T = null, E = [], D = {};
3040
3066
  try {
3041
- (await n("@voltro/web/ssr")).beginStoreSeeds(), {chain: E, segmentLoaderData: D} = await h("loadChain", () => ri({
3067
+ (await n("@voltro/web/ssr")).beginStoreSeeds(), {chain: E, segmentLoaderData: D} = await h("loadChain", () => ii({
3042
3068
  entries: v,
3043
3069
  loadLayout: (t) => n(f(e, "src", "pages", t.dir, "layout.tsx")),
3044
3070
  loadError: (t) => n(f(e, "src", "pages", t.dir, "error.tsx")),
@@ -3075,7 +3101,7 @@ import {
3075
3101
  cookies: O.parseCookieHeader(b.cookie),
3076
3102
  headers: b,
3077
3103
  url: o
3078
- }, A = s.interactive ?? "full", j = y ? Or({
3104
+ }, A = s.interactive ?? "full", j = y ? kr({
3079
3105
  helpers: O,
3080
3106
  page: `src/pages/${l.route.file}`,
3081
3107
  interactive: A,
@@ -3087,7 +3113,7 @@ import {
3087
3113
  segmentLoaderData: D,
3088
3114
  requestContext: k
3089
3115
  }
3090
- }) : null, M = y ? null : Dr({
3116
+ }) : null, M = y ? null : Or({
3091
3117
  helpers: O,
3092
3118
  page: `src/pages/${l.route.file}`,
3093
3119
  pathname: c,
@@ -3111,16 +3137,16 @@ import {
3111
3137
  });
3112
3138
  let P = await h("readShell", xe), F = await h("transformShell", () => t.transformIndexHtml(o, P)), te = N.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), I = k.cookies["voltro:locale"] ?? "en", ne = Date.now();
3113
3139
  if (j) {
3114
- let e = (e) => Ar({
3140
+ let e = (e) => jr({
3115
3141
  helpers: O,
3116
3142
  prepared: j,
3117
3143
  meta: e,
3118
3144
  interactive: A,
3119
3145
  extra: [te]
3120
3146
  });
3121
- if (j.hasDeferred) zr({
3147
+ if (j.hasDeferred) Br({
3122
3148
  res: i,
3123
- shell: Lr({
3149
+ shell: Rr({
3124
3150
  shell: F,
3125
3151
  inlineModuleScriptsAsync: !0
3126
3152
  }),
@@ -3139,7 +3165,7 @@ import {
3139
3165
  }
3140
3166
  });
3141
3167
  else {
3142
- let t = kr({
3168
+ let t = Ar({
3143
3169
  helpers: O,
3144
3170
  prepared: j
3145
3171
  }), n = F.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`).replace("</head>", ` ${e(t.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${I}"`);
@@ -3160,9 +3186,9 @@ import {
3160
3186
  segmentLoaderData: M.segmentLoaderData,
3161
3187
  requestContext: k
3162
3188
  };
3163
- if (_ === "ssr" && A === "full") zr({
3189
+ if (_ === "ssr" && A === "full") Br({
3164
3190
  res: i,
3165
- shell: Lr({
3191
+ shell: Rr({
3166
3192
  shell: F,
3167
3193
  inlineModuleScriptsAsync: !0
3168
3194
  }),
@@ -3208,15 +3234,22 @@ import {
3208
3234
  }, e), i.statusCode = 500, i.setHeader("content-type", "text/plain; charset=utf-8"), i.end(e.message);
3209
3235
  return;
3210
3236
  }
3237
+ let t = Dr(e);
3238
+ if (t) {
3239
+ i.statusCode = t.status;
3240
+ for (let [e, n] of Object.entries(t.headers)) i.setHeader(e, String(n));
3241
+ i.end(t.body);
3242
+ return;
3243
+ }
3211
3244
  ge(i, "ssr-dev", c, l.route.pattern, e);
3212
3245
  }
3213
3246
  });
3214
3247
  }
3215
- }, B = Date.now(), Ce = T.version ?? "?", V = await Hr(), we = f(e, "node_modules", "@voltro", "ui-shadcn"), H = O(f(we, "package.json")) ? we : null, Te = [], Ee = await (async () => {
3248
+ }, B = Date.now(), Ce = T.version ?? "?", V = await Ur(), we = f(e, "node_modules", "@voltro", "ui-shadcn"), H = O(f(we, "package.json")) ? we : null, Te = [], Ee = await (async () => {
3216
3249
  let t = [];
3217
3250
  for (let n of u) {
3218
3251
  if (!n.proxyTarget) continue;
3219
- let r = await li(e, n.pkg);
3252
+ let r = await ui(e, n.pkg);
3220
3253
  if (r) try {
3221
3254
  t.push(await A.readFile(f(r, "rpcGroup.generated.ts"), "utf8"));
3222
3255
  } catch {}
@@ -3291,12 +3324,12 @@ import {
3291
3324
  host: !0,
3292
3325
  allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
3293
3326
  proxy: R,
3294
- fs: { allow: [e, ...Jr(e)] }
3327
+ fs: { allow: [e, ...Yr(e)] }
3295
3328
  },
3296
3329
  appType: "spa",
3297
3330
  cacheDir: f(k, ".vite"),
3298
3331
  publicDir: f(e, "public")
3299
- })).listen(), Br.info(`v${Ce} ready in ${Date.now() - B}ms`, {
3332
+ })).listen(), Vr.info(`v${Ce} ready in ${Date.now() - B}ms`, {
3300
3333
  version: Ce,
3301
3334
  bootMs: Date.now() - B
3302
3335
  }), X.info(`listening on http://localhost:${g}`, {
@@ -3346,16 +3379,16 @@ import {
3346
3379
  url: `http://localhost:${g}`,
3347
3380
  bootMs: Date.now() - B
3348
3381
  }), new Promise(() => {});
3349
- }, wi = async (e) => {
3382
+ }, Ti = async (e) => {
3350
3383
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3351
- let t = await Si(e);
3384
+ let t = await Ci(e);
3352
3385
  if (!t) return {
3353
3386
  ran: !1,
3354
3387
  exitCode: 0
3355
3388
  };
3356
3389
  let n = Date.now(), r = X.child("serve");
3357
3390
  r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3358
- let i = await mi(e, t);
3391
+ let i = await hi(e, t);
3359
3392
  for (let e of i) r.info("api wired", {
3360
3393
  name: e.name,
3361
3394
  pkg: e.pkg
@@ -3377,7 +3410,7 @@ import {
3377
3410
  resolve: { dedupe: ["react", "react-dom"] },
3378
3411
  build: {
3379
3412
  outDir: "dist",
3380
- rollupOptions: { output: { manualChunks: Xr } }
3413
+ rollupOptions: { output: { manualChunks: Zr } }
3381
3414
  },
3382
3415
  publicDir: f(e, "public")
3383
3416
  });
@@ -3397,14 +3430,14 @@ import {
3397
3430
  extras: d,
3398
3431
  bootMs: Date.now() - n
3399
3432
  }), new Promise(() => {});
3400
- }, Ti = 5e3, Ei = 6e4, Di = (e, t) => {
3433
+ }, Ei = 5e3, Di = 6e4, Oi = (e, t) => {
3401
3434
  if (e.length === 0) return 0;
3402
3435
  if (e.length === 1) return e[0];
3403
3436
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3404
3437
  if (r === i) return e[r];
3405
3438
  let a = n - r;
3406
3439
  return e[r] * (1 - a) + e[i] * a;
3407
- }, Oi = (e) => {
3440
+ }, ki = (e) => {
3408
3441
  if (e.length === 0) return {
3409
3442
  p50: 0,
3410
3443
  p95: 0,
@@ -3416,15 +3449,15 @@ import {
3416
3449
  let t = e.slice().sort((e, t) => e - t), n = 0;
3417
3450
  for (let e of t) n += e;
3418
3451
  return {
3419
- p50: Di(t, .5),
3420
- p95: Di(t, .95),
3421
- p99: Di(t, .99),
3452
+ p50: Oi(t, .5),
3453
+ p95: Oi(t, .95),
3454
+ p99: Oi(t, .99),
3422
3455
  mean: n / t.length,
3423
3456
  min: t[0],
3424
3457
  max: t[t.length - 1]
3425
3458
  };
3426
- }, ki = (e = {}) => {
3427
- let t = e.maxSamples ?? Ti, n = e.defaultWindowMs ?? Ei, r = [];
3459
+ }, Ai = (e = {}) => {
3460
+ let t = e.maxSamples ?? Ei, n = e.defaultWindowMs ?? Di, r = [];
3428
3461
  return {
3429
3462
  record(e) {
3430
3463
  L(e), r.push({
@@ -3453,7 +3486,7 @@ import {
3453
3486
  tag: e.tag,
3454
3487
  count: e.samples.length,
3455
3488
  errorCount: n,
3456
- latencyMs: Oi(t)
3489
+ latencyMs: ki(t)
3457
3490
  });
3458
3491
  }
3459
3492
  return c.sort((e, t) => t.count - e.count), {
@@ -3466,4 +3499,4 @@ import {
3466
3499
  };
3467
3500
  };
3468
3501
  //#endregion
3469
- export { St as $, Wn as A, gn as B, wr as C, dr as D, ur as E, Nn as F, en as G, sn as H, Pn as I, Rt as J, Xt as K, Dn as L, Gn as M, qn as N, Qn as O, Yn as P, xt as Q, Sn as R, mr as S, lr as T, $t as U, ln as V, Qt as W, Dt as X, kt as Y, Et as Z, Dr as _, we as _t, ri as a, gt as at, Ar as b, mi as c, lt as ct, Xr as d, nt as dt, Ct as et, Q as f, it as ft, Er as g, V as gt, zr as h, Ke as ht, yi as i, yt as it, Xn as j, er as k, Ci as l, st as lt, Lr as m, Ge as mt, Zr as n, G as nt, ni as o, mt as ot, $ as p, rt as pt, Bt as q, vi as r, vt as rt, Si as s, pt as st, ki as t, bt as tt, wi as u, at as ut, Or as v, hr as w, gr as x, kr as y, vn as z };
3502
+ export { St as $, Wn as A, gn as B, wr as C, dr as D, ur as E, Nn as F, en as G, sn as H, Pn as I, Rt as J, Xt as K, Dn as L, Gn as M, qn as N, Qn as O, Yn as P, xt as Q, Sn as R, mr as S, lr as T, $t as U, ln as V, Qt as W, Dt as X, kt as Y, Et as Z, Or as _, we as _t, ii as a, gt as at, jr as b, hi as c, lt as ct, Zr as d, nt as dt, Ct as et, Q as f, it as ft, Er as g, V as gt, Br as h, Ke as ht, bi as i, yt as it, Xn as j, er as k, wi as l, st as lt, Rr as m, Ge as mt, Qr as n, G as nt, ri as o, mt as ot, $ as p, rt as pt, Bt as q, yi as r, vt as rt, Ci as s, pt as st, Ai as t, bt as tt, Ti as u, at as ut, kr as v, hr as w, gr as x, Ar as y, vn as z };