@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.
- package/CHANGELOG.md +316 -0
- package/dist/apiBuild-COyPDf3R.js +2 -0
- package/dist/{apiBuild-BHOtsQkp.js → apiBuild-DiWxVz-M.js} +2 -2
- package/dist/bin.js +3 -3
- package/dist/{commands-BZoimvvS.js → commands-BxRaIOBG.js} +1548 -1246
- package/dist/dbCommand-CO3eSAZR.js +2 -0
- package/dist/{dbCommand-CDBbZ-Ac.js → dbCommand-DVASmZj2.js} +295 -253
- package/dist/{dev-DKb92NYX.js → dev-BRiPgbKw.js} +1738 -1702
- package/dist/{dev-CZQ73Yoh.js → dev-Dd3EZzj5.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/inspect-BA67TF6v.js +2 -0
- package/dist/inspect-_ldwsAwH.js +945 -0
- package/dist/{inspectMetrics-DMjWBQif.js → inspectMetrics-9ZSuDeqD.js} +148 -115
- package/dist/{manifestBuild-P9yuCY2d.js → manifestBuild-Bs1Uw22_.js} +1 -1
- package/dist/manifestBuild-i-fRHg_H.js +2 -0
- package/dist/{serveCommand-qHJCs0cX.js → serveCommand-DXJOARkO.js} +305 -306
- package/dist/serveEntry.js +2 -2
- package/dist/{start-B1x6Z60h.js → start-CsIjcOi-.js} +3 -3
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.md +1 -1
- package/templates/agent-docs/_index.md +1 -1
- package/templates/agent-docs/cli.md +118 -5
- package/templates/agent-docs/data.md +58 -0
- package/templates/agent-docs/database/migrations.md +142 -20
- package/templates/agent-docs/plugins.md +1 -1
- package/templates/agent-docs/schema-driven-ui.md +2 -2
- package/templates/agent-docs/templates/apibackends.md +1 -1
- package/templates/agent-docs/whats-new.md +32 -114
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/dist/apiBuild-K7M6Rt0U.js +0 -2
- package/dist/dbCommand-oADAj6ez.js +0 -2
- package/dist/inspect-DcZ04OME.js +0 -2
- package/dist/inspect-Dwx0_tUj.js +0 -921
- 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-
|
|
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
|
-
|
|
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
|
-
},
|
|
1575
|
-
let { helpers: t, renderInput: n } = e, r =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 "),
|
|
1609
|
-
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(
|
|
1610
|
-
let r =
|
|
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(
|
|
1614
|
-
let i = r.indexOf(
|
|
1615
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
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)}${
|
|
1618
|
-
tail: `${
|
|
1642
|
+
head: `${r.slice(0, i)}${Nr}`,
|
|
1643
|
+
tail: `${Pr}${r.slice(i + 21)}`,
|
|
1619
1644
|
bootstrapModules: n
|
|
1620
1645
|
};
|
|
1621
|
-
},
|
|
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(
|
|
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" }),
|
|
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
|
-
})(),
|
|
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
|
-
},
|
|
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
|
-
],
|
|
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
|
-
] : [],
|
|
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
|
-
},
|
|
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
|
-
},
|
|
1701
|
-
let n = e.replace(t, "").split("/").filter(Boolean).filter((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
|
-
},
|
|
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") && !
|
|
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 =
|
|
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 ||
|
|
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:
|
|
1736
|
-
ident:
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
1785
|
-
let t =
|
|
1809
|
+
}, ai = (e) => {
|
|
1810
|
+
let t = ei(e);
|
|
1786
1811
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
1787
|
-
},
|
|
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"),
|
|
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
|
-
},
|
|
1890
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
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),
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
}),
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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(
|
|
1991
|
+
r.push(fi(t, i));
|
|
1967
1992
|
continue;
|
|
1968
1993
|
}
|
|
1969
|
-
let n = await
|
|
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(
|
|
1996
|
+
r.push(pi(t, i, await di(n)));
|
|
1972
1997
|
}
|
|
1973
|
-
return
|
|
1974
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
2008
|
+
let n = vi(e.name) ?? e.serverOrigin;
|
|
1984
2009
|
if (n) {
|
|
1985
|
-
let e =
|
|
2010
|
+
let e = gi(n);
|
|
1986
2011
|
if (e) return e;
|
|
1987
2012
|
}
|
|
1988
2013
|
if (t?.allowDevProxy && e.proxyTarget) {
|
|
1989
|
-
let t =
|
|
2014
|
+
let t = gi(e.proxyTarget);
|
|
1990
2015
|
if (t) return t;
|
|
1991
2016
|
}
|
|
1992
|
-
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return
|
|
1993
|
-
},
|
|
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 ${
|
|
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 ${
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
...
|
|
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
|
-
...
|
|
2387
|
+
...Gr(t, o),
|
|
2363
2388
|
"})",
|
|
2364
2389
|
"",
|
|
2365
|
-
|
|
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
|
-
...
|
|
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
|
-
...
|
|
2410
|
+
...Gr(t, o),
|
|
2386
2411
|
"})",
|
|
2387
2412
|
"",
|
|
2388
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
2419
|
-
let t =
|
|
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
|
-
},
|
|
2427
|
-
let t = await
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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:
|
|
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 =
|
|
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 =
|
|
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(
|
|
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", () =>
|
|
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 ?
|
|
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 :
|
|
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) =>
|
|
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)
|
|
3147
|
+
if (j.hasDeferred) Br({
|
|
3122
3148
|
res: i,
|
|
3123
|
-
shell:
|
|
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 =
|
|
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")
|
|
3189
|
+
if (_ === "ssr" && A === "full") Br({
|
|
3164
3190
|
res: i,
|
|
3165
|
-
shell:
|
|
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
|
|
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
|
|
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, ...
|
|
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(),
|
|
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
|
-
},
|
|
3382
|
+
}, Ti = async (e) => {
|
|
3350
3383
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
3351
|
-
let t = await
|
|
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
|
|
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:
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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:
|
|
3420
|
-
p95:
|
|
3421
|
-
p99:
|
|
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
|
-
},
|
|
3427
|
-
let t = e.maxSamples ??
|
|
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:
|
|
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,
|
|
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 };
|