@voltro/cli 0.11.3 → 0.11.4

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 (64) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/THIRD-PARTY-NOTICES.md +4 -4
  3. package/dist/apiBuild-D9MtlD02.js +2 -0
  4. package/dist/{apiBuild-zFDv0u8y.js → apiBuild-DHHuiwXF.js} +4 -4
  5. package/dist/bin.js +13 -6
  6. package/dist/{commands-BDGYrBhK.js → commands-BwbMqR-1.js} +1982 -1854
  7. package/dist/dev-BsBsIv93.js +2 -0
  8. package/dist/{dev-CGt0PP1f.js → dev-Cvojvb_J.js} +1696 -1654
  9. package/dist/{devActivity-1WtIVyHc.js → devActivity-BhIu6ncs.js} +7 -1
  10. package/dist/devActivity.js +1 -1
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.js +1 -1
  13. package/dist/{inspectMetrics-SRtv8KDy.js → inspectMetrics-D4EJ8LTi.js} +331 -323
  14. package/dist/{serveCommand-p6e5Ahgx.js → serveCommand-ARqSs73o.js} +397 -350
  15. package/dist/serveEntry.js +3 -3
  16. package/dist/{start-Crl39M38.js → start-DyJE6w1R.js} +281 -273
  17. package/dist/startEntry.js +2 -2
  18. package/package.json +17 -17
  19. package/templates/agent-docs/_manifest.json +1 -1
  20. package/templates/agent-docs/cli.md +86 -2
  21. package/templates/agent-docs/data.md +104 -1
  22. package/templates/agent-docs/database/misc.md +32 -0
  23. package/templates/agent-docs/database/querying.md +14 -1
  24. package/templates/agent-docs/internationalization.md +3 -8
  25. package/templates/agent-docs/reference.md +35 -0
  26. package/templates/agent-docs/workflows.md +31 -0
  27. package/templates/apps/api-ai/package.json +7 -7
  28. package/templates/apps/api-auth/package.json +8 -8
  29. package/templates/apps/api-backend/package.json +7 -7
  30. package/templates/apps/api-backend-deactivation/package.json +7 -7
  31. package/templates/apps/api-backend-mail/package.json +8 -8
  32. package/templates/apps/api-backend-mariadb/package.json +9 -9
  33. package/templates/apps/api-backend-storage/package.json +8 -8
  34. package/templates/apps/api-data-advanced/package.json +8 -8
  35. package/templates/apps/api-durable/package.json +8 -8
  36. package/templates/apps/api-feature-flags/package.json +9 -9
  37. package/templates/apps/api-governance/package.json +8 -8
  38. package/templates/apps/api-kv/package.json +8 -8
  39. package/templates/apps/api-moderation/package.json +8 -8
  40. package/templates/apps/api-observability/package.json +8 -8
  41. package/templates/apps/api-ratelimit/package.json +8 -8
  42. package/templates/apps/api-rbac/package.json +8 -8
  43. package/templates/apps/api-rest/package.json +7 -7
  44. package/templates/apps/api-saas/package.json +11 -11
  45. package/templates/apps/api-search/package.json +8 -8
  46. package/templates/apps/api-versioning/package.json +8 -8
  47. package/templates/apps/api-webhooks/README.md +3 -1
  48. package/templates/apps/api-webhooks/package.json +8 -8
  49. package/templates/apps/changelog/package.json +6 -6
  50. package/templates/apps/edge-functions/package.json +2 -2
  51. package/templates/apps/frontend-admin/package.json +8 -8
  52. package/templates/apps/frontend-app/package.json +8 -8
  53. package/templates/apps/frontend-blank/package.json +7 -7
  54. package/templates/apps/frontend-contact/package.json +7 -7
  55. package/templates/apps/frontend-dashboard/package.json +7 -7
  56. package/templates/apps/frontend-docs/package.json +7 -7
  57. package/templates/apps/frontend-i18n/package.json +6 -6
  58. package/templates/apps/frontend-landing/package.json +7 -7
  59. package/templates/apps/frontend-spa/package.json +7 -7
  60. package/templates/apps/frontend-ssr/package.json +7 -7
  61. package/templates/apps/frontend-ssr-api/package.json +8 -8
  62. package/templates/apps/frontend-static-blog/package.json +6 -6
  63. package/dist/apiBuild-BmPdmhgi.js +0 -2
  64. package/dist/dev-D_PGP9Kx.js +0 -2
@@ -581,20 +581,28 @@ __installPublicEnv(publicEnvValues)
581
581
  contentType: "application/json; charset=utf-8",
582
582
  body: JSON.stringify(t),
583
583
  headers: n
584
- }), G = (e) => !e || e.length === 0 ? {} : {
584
+ }), mt = (e) => {
585
+ let t;
586
+ try {
587
+ t = new URL(e).hostname;
588
+ } catch {
589
+ return !1;
590
+ }
591
+ return t = t.replace(/^\[|\]$/g, ""), t === "localhost" || t.endsWith(".localhost") || t === "::1" ? !0 : /^127(?:\.\d{1,3}){3}$/.test(t);
592
+ }, G = (e) => !e || e.length === 0 ? {} : mt(e) ? {
585
593
  "access-control-allow-origin": e,
586
594
  "access-control-allow-credentials": "true",
587
595
  "access-control-allow-methods": "GET, POST, OPTIONS",
588
596
  "access-control-allow-headers": "authorization, content-type, accept",
589
597
  "access-control-expose-headers": "content-type, content-length",
590
598
  vary: "Origin"
591
- }, K = (e) => {
599
+ } : { vary: "Origin" }, K = (e) => {
592
600
  let t = e.indexOf("?");
593
601
  return t === -1 ? e : e.slice(0, t);
594
- }, mt = (e) => {
602
+ }, ht = (e) => {
595
603
  let t = e.indexOf("?");
596
604
  return t === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
597
- }, ht = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), gt = [
605
+ }, gt = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), _t = [
598
606
  "text",
599
607
  "textarea",
600
608
  "number",
@@ -610,7 +618,7 @@ __installPublicEnv(publicEnvValues)
610
618
  "file",
611
619
  "hidden",
612
620
  "custom"
613
- ], _t = (e, t, n = []) => ({
621
+ ], vt = (e, t, n = []) => ({
614
622
  version: 2,
615
623
  procedures: [...e].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({
616
624
  tag: e.tag,
@@ -624,7 +632,7 @@ __installPublicEnv(publicEnvValues)
624
632
  ...e.exposeAsTool === void 0 ? {} : { exposeAsTool: e.exposeAsTool }
625
633
  })),
626
634
  workflows: [...t].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({ name: e.tag })),
627
- widgets: gt,
635
+ widgets: _t,
628
636
  tables: [...n].filter((e) => !e.isFrameworkTable).sort((e, t) => e.name.localeCompare(t.name)).map((e) => ({
629
637
  name: e.name,
630
638
  reactive: e.isReactive,
@@ -637,9 +645,9 @@ __installPublicEnv(publicEnvValues)
637
645
  ...e.oneOf === void 0 ? {} : { enum: e.oneOf }
638
646
  }))
639
647
  }))
640
- }), vt = (e, t, n = {}, r = {}) => {
648
+ }), yt = (e, t, n = {}, r = {}) => {
641
649
  let i = K(e);
642
- if (!ht(i)) return null;
650
+ if (!gt(i)) return null;
643
651
  let a = G(n.origin ?? n.Origin);
644
652
  if ((r.method ?? "GET").toUpperCase() === "OPTIONS") return {
645
653
  status: 204,
@@ -669,7 +677,7 @@ __installPublicEnv(publicEnvValues)
669
677
  if (i === "/_voltro/inspect/manifest") {
670
678
  if (t.kind !== "api") return W(404, { error: "manifest endpoint is api-only" }, a);
671
679
  let e = t.inspectTables?.().tables ?? [];
672
- return W(200, _t(t.rpc, t.workflows, e), a);
680
+ return W(200, vt(t.rpc, t.workflows, e), a);
673
681
  }
674
682
  return i === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? W(200, [], a) : W(200, t.metrics(), a) : i === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? W(200, {
675
683
  subscriptions: [],
@@ -700,7 +708,7 @@ __installPublicEnv(publicEnvValues)
700
708
  error: "unknown inspect endpoint",
701
709
  path: i
702
710
  }, a);
703
- }, yt = async (e, t, n, r = {}) => {
711
+ }, bt = async (e, t, n, r = {}) => {
704
712
  let i = G(t.origin ?? t.Origin);
705
713
  if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
706
714
  if ((r.method ?? "POST").toUpperCase() !== "POST") return W(405, {
@@ -734,9 +742,9 @@ __installPublicEnv(publicEnvValues)
734
742
  n !== "cookie" && (u[n] = t);
735
743
  }
736
744
  return W(200, await c(s.input, u), i);
737
- }, bt = async (e, t, n, r, i = {}) => {
745
+ }, xt = async (e, t, n, r, i = {}) => {
738
746
  let a = K(e);
739
- if (!ht(a) || !a.startsWith("/_voltro/inspect/webhooks/")) return null;
747
+ if (!gt(a) || !a.startsWith("/_voltro/inspect/webhooks/")) return null;
740
748
  let o = G(n.origin ?? n.Origin);
741
749
  if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
742
750
  if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
@@ -792,9 +800,9 @@ __installPublicEnv(publicEnvValues)
792
800
  message: e?.message ?? String(e)
793
801
  }, o);
794
802
  }
795
- }, xt = async (e, t, n, r, i = {}) => {
803
+ }, St = async (e, t, n, r, i = {}) => {
796
804
  let a = K(e);
797
- if (!ht(a)) return null;
805
+ if (!gt(a)) return null;
798
806
  let o = G(n.origin ?? n.Origin);
799
807
  if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
800
808
  if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
@@ -835,7 +843,7 @@ __installPublicEnv(publicEnvValues)
835
843
  message: e?.message ?? String(e)
836
844
  }, o);
837
845
  }
838
- }, St = async (e, t, n, r = {}) => {
846
+ }, Ct = async (e, t, n, r = {}) => {
839
847
  if (K(e) !== "/_voltro/inspect/data/rows") return null;
840
848
  let i = G(n.origin ?? n.Origin);
841
849
  if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
@@ -877,7 +885,7 @@ __installPublicEnv(publicEnvValues)
877
885
  message: e?.message ?? String(e)
878
886
  }, i);
879
887
  }
880
- }, Ct = async (e, t, n, r = {}) => {
888
+ }, wt = async (e, t, n, r = {}) => {
881
889
  if (K(e) !== "/_voltro/inspect/provenance") return null;
882
890
  let i = G(n.origin ?? n.Origin);
883
891
  if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
@@ -926,7 +934,7 @@ __installPublicEnv(publicEnvValues)
926
934
  if (e === null || e === "") return;
927
935
  let t = Number(e);
928
936
  return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
929
- }, wt = async (e, t, n, r = {}) => {
937
+ }, Tt = async (e, t, n, r = {}) => {
930
938
  if (K(e) !== "/_voltro/inspect/workflows/runs") return null;
931
939
  let i = G(n.origin ?? n.Origin);
932
940
  if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
@@ -960,7 +968,7 @@ __installPublicEnv(publicEnvValues)
960
968
  message: e?.message ?? String(e)
961
969
  }, i);
962
970
  }
963
- }, Tt = async (e, t, n, r, i = {}) => {
971
+ }, Et = async (e, t, n, r, i = {}) => {
964
972
  let a = K(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
965
973
  if (!a) return null;
966
974
  let o = decodeURIComponent(a[1] ?? ""), s = G(n.origin ?? n.Origin);
@@ -993,7 +1001,7 @@ __installPublicEnv(publicEnvValues)
993
1001
  message: e?.message ?? String(e)
994
1002
  }, s);
995
1003
  }
996
- }, Et = async (e, t, n, r = {}) => {
1004
+ }, Dt = async (e, t, n, r = {}) => {
997
1005
  let i = K(e);
998
1006
  if (!i.startsWith("/_voltro/inspect/schedules")) return null;
999
1007
  let a = G(n.origin ?? n.Origin);
@@ -1059,7 +1067,7 @@ __installPublicEnv(publicEnvValues)
1059
1067
  error: "unknown schedules endpoint",
1060
1068
  path: i
1061
1069
  }, a);
1062
- }, Dt = async (e, t, n, r = {}) => {
1070
+ }, Ot = async (e, t, n, r = {}) => {
1063
1071
  if (K(e) !== "/_voltro/inspect/cluster") return null;
1064
1072
  let i = G(n.origin ?? n.Origin);
1065
1073
  if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
@@ -1105,7 +1113,7 @@ __installPublicEnv(publicEnvValues)
1105
1113
  message: e?.message ?? String(e)
1106
1114
  }, i);
1107
1115
  }
1108
- }, Ot = async (e, t, n, r = {}) => {
1116
+ }, kt = async (e, t, n, r = {}) => {
1109
1117
  let i = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
1110
1118
  if (!i) return null;
1111
1119
  let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
@@ -1129,7 +1137,7 @@ __installPublicEnv(publicEnvValues)
1129
1137
  message: e?.message ?? String(e)
1130
1138
  }, o);
1131
1139
  }
1132
- }, kt = async (e, t, n, r = {}) => {
1140
+ }, At = async (e, t, n, r = {}) => {
1133
1141
  let i = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
1134
1142
  if (!i) return null;
1135
1143
  let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
@@ -1153,7 +1161,7 @@ __installPublicEnv(publicEnvValues)
1153
1161
  message: e?.message ?? String(e)
1154
1162
  }, o);
1155
1163
  }
1156
- }, At = async (e, t, n, r = {}) => {
1164
+ }, jt = async (e, t, n, r = {}) => {
1157
1165
  if (K(t) !== "/_voltro/inspect/workflows/events") return null;
1158
1166
  let i = G(n.origin ?? n.Origin);
1159
1167
  if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
@@ -1173,7 +1181,7 @@ __installPublicEnv(publicEnvValues)
1173
1181
  offset: 0,
1174
1182
  limit: 100
1175
1183
  }, i);
1176
- let o = mt(t), s = o.get("name") ?? void 0, c = Number(o.get("offset") ?? "0"), l = Number(o.get("limit") ?? "100");
1184
+ let o = ht(t), s = o.get("name") ?? void 0, c = Number(o.get("offset") ?? "0"), l = Number(o.get("limit") ?? "100");
1177
1185
  try {
1178
1186
  return W(200, await e.inspectWorkflowDomainEvents({
1179
1187
  ...s !== void 0 && s !== "" ? { name: s } : {},
@@ -1186,7 +1194,7 @@ __installPublicEnv(publicEnvValues)
1186
1194
  message: e?.message ?? String(e)
1187
1195
  }, i);
1188
1196
  }
1189
- }, jt = async (e, t, n, r = {}) => {
1197
+ }, Mt = async (e, t, n, r = {}) => {
1190
1198
  let i = K(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
1191
1199
  if (!i) return null;
1192
1200
  let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
@@ -1210,7 +1218,7 @@ __installPublicEnv(publicEnvValues)
1210
1218
  message: e?.message ?? String(e)
1211
1219
  }, o);
1212
1220
  }
1213
- }, Mt = async (e, t, n, r = {}) => {
1221
+ }, Nt = async (e, t, n, r = {}) => {
1214
1222
  if (K(e) !== "/_voltro/inspect/workflows/children") return null;
1215
1223
  let i = G(n.origin ?? n.Origin);
1216
1224
  if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
@@ -1240,7 +1248,7 @@ __installPublicEnv(publicEnvValues)
1240
1248
  message: e?.message ?? String(e)
1241
1249
  }, i);
1242
1250
  }
1243
- }, Nt = async (e, t, n, r, i = {}) => {
1251
+ }, Pt = async (e, t, n, r, i = {}) => {
1244
1252
  let a = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume|signal|update)$/);
1245
1253
  if (!a) return null;
1246
1254
  let o = decodeURIComponent(a[1] ?? ""), s = a[2], c = G(n.origin ?? n.Origin);
@@ -1291,7 +1299,7 @@ __installPublicEnv(publicEnvValues)
1291
1299
  message: e?.message ?? String(e)
1292
1300
  }, c);
1293
1301
  }
1294
- }, Pt = async (e, t, n, r, i = {}) => {
1302
+ }, Ft = async (e, t, n, r, i = {}) => {
1295
1303
  if (K(e) !== "/_voltro/inspect/data/import" || (i.method ?? "POST").toUpperCase() !== "POST") return null;
1296
1304
  let a = G(n.origin ?? n.Origin);
1297
1305
  if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
@@ -1322,7 +1330,7 @@ __installPublicEnv(publicEnvValues)
1322
1330
  message: e?.message ?? String(e)
1323
1331
  }, a);
1324
1332
  }
1325
- }, Ft = async (e, t, n, r, i = {}) => {
1333
+ }, It = async (e, t, n, r, i = {}) => {
1326
1334
  let a = K(e);
1327
1335
  if (!a.startsWith("/_voltro/inspect/data/rows")) return null;
1328
1336
  let o = (i.method ?? "POST").toUpperCase();
@@ -1402,53 +1410,53 @@ __installPublicEnv(publicEnvValues)
1402
1410
  error: "method not allowed",
1403
1411
  expected: "POST | PATCH | DELETE"
1404
1412
  }, s);
1405
- }, It = g({ scope: "vite" }), Lt = /\x1b\[[0-9;]*m/g, Rt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, zt = (e) => e.replace(Lt, "").replace(Rt, "").trim(), Bt = /proxy error/i, Vt = [
1413
+ }, Lt = g({ scope: "vite" }), Rt = /\x1b\[[0-9;]*m/g, zt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Bt = (e) => e.replace(Rt, "").replace(zt, "").trim(), Vt = /proxy error/i, Ht = [
1406
1414
  "ECONNREFUSED",
1407
1415
  "ECONNRESET",
1408
1416
  "ECONNABORTED",
1409
1417
  "EPIPE",
1410
1418
  "ETIMEDOUT"
1411
- ], Ht = (e, t = 0) => {
1419
+ ], Ut = (e, t = 0) => {
1412
1420
  if (e == null || t > 5) return !1;
1413
1421
  let n = e;
1414
- return typeof n.code == "string" && Vt.includes(n.code) || typeof n.message == "string" && Vt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Ht(e, t + 1)) ? !0 : Ht(n.cause, t + 1);
1415
- }, Ut = 4e3, Wt = () => {
1422
+ return typeof n.code == "string" && Ht.includes(n.code) || typeof n.message == "string" && Ht.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Ut(e, t + 1)) ? !0 : Ut(n.cause, t + 1);
1423
+ }, Wt = 4e3, Gt = () => {
1416
1424
  let e = /* @__PURE__ */ new Set(), t = 0, n = {
1417
1425
  hasWarned: !1,
1418
1426
  info: (e) => {
1419
- let t = zt(e);
1420
- t.length !== 0 && It.info(t);
1427
+ let t = Bt(e);
1428
+ t.length !== 0 && Lt.info(t);
1421
1429
  },
1422
1430
  warn: (e) => {
1423
1431
  n.hasWarned = !0;
1424
- let t = zt(e);
1425
- t.length !== 0 && It.warn(t);
1432
+ let t = Bt(e);
1433
+ t.length !== 0 && Lt.warn(t);
1426
1434
  },
1427
1435
  warnOnce: (t) => {
1428
- let r = zt(t);
1429
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && It.warn(r));
1436
+ let r = Bt(t);
1437
+ e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Lt.warn(r));
1430
1438
  },
1431
1439
  error: (e, n) => {
1432
- let r = zt(e), i = n?.error;
1440
+ let r = Bt(e), i = n?.error;
1433
1441
  if (r.length !== 0) {
1434
- if (Bt.test(r) && Ht(i)) {
1442
+ if (Vt.test(r) && Ut(i)) {
1435
1443
  let e = Date.now();
1436
- e - t > Ut && (t = e, It.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
1444
+ e - t > Wt && (t = e, Lt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
1437
1445
  return;
1438
1446
  }
1439
- It.error(r, {}, i);
1447
+ Lt.error(r, {}, i);
1440
1448
  }
1441
1449
  },
1442
1450
  clearScreen: () => {},
1443
1451
  hasErrorLogged: (e) => !1
1444
1452
  };
1445
1453
  return n;
1446
- }, Gt = (e = process.env) => {
1454
+ }, Kt = (e = process.env) => {
1447
1455
  let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
1448
1456
  if (t === void 0 || t.trim() === "") return 4;
1449
1457
  let n = Number(t);
1450
1458
  return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
1451
- }, Kt = (e) => {
1459
+ }, qt = (e) => {
1452
1460
  let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
1453
1461
  let e = r.shift();
1454
1462
  e ? e() : n--;
@@ -1466,8 +1474,8 @@ __installPublicEnv(publicEnvValues)
1466
1474
  return n;
1467
1475
  }
1468
1476
  };
1469
- }, qt = (e) => {
1470
- let t = Kt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
1477
+ }, Jt = (e) => {
1478
+ let t = qt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
1471
1479
  return {
1472
1480
  load: (i, a) => {
1473
1481
  if (r.has(i)) return a();
@@ -1492,7 +1500,7 @@ __installPublicEnv(publicEnvValues)
1492
1500
  return r.size;
1493
1501
  }
1494
1502
  };
1495
- }, Jt = (e) => {
1503
+ }, Yt = (e) => {
1496
1504
  let t = [];
1497
1505
  for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
1498
1506
  name: n.slice(5, -2),
@@ -1508,7 +1516,7 @@ __installPublicEnv(publicEnvValues)
1508
1516
  optional: !1
1509
1517
  });
1510
1518
  return t;
1511
- }, Yt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Xt = async (e) => {
1519
+ }, Xt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Zt = async (e) => {
1512
1520
  let n = a(e);
1513
1521
  for (let e = 0; e < 4; e++) {
1514
1522
  let e = r(n, "project.json");
@@ -1526,8 +1534,8 @@ __installPublicEnv(publicEnvValues)
1526
1534
  n = i;
1527
1535
  }
1528
1536
  return null;
1529
- }, Zt = async (t) => {
1530
- let n = await Xt(t);
1537
+ }, Qt = async (t) => {
1538
+ let n = await Zt(t);
1531
1539
  if (!n) return [];
1532
1540
  let { projectDir: i, manifest: a } = n, o = e(t), s = a.apps ?? {}, c = [];
1533
1541
  for (let [e, t] of Object.entries(s)) {
@@ -1539,20 +1547,20 @@ __installPublicEnv(publicEnvValues)
1539
1547
  let { pages: e } = await $(n);
1540
1548
  a = e.map((e) => ({
1541
1549
  pattern: e.pattern,
1542
- params: Jt(e.pattern)
1550
+ params: Yt(e.pattern)
1543
1551
  }));
1544
1552
  } catch {
1545
1553
  continue;
1546
1554
  }
1547
1555
  c.push({
1548
- key: Yt(e),
1556
+ key: Xt(e),
1549
1557
  origin: `http://localhost:${t.port}`,
1550
1558
  ...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
1551
1559
  routes: a
1552
1560
  });
1553
1561
  }
1554
1562
  return c;
1555
- }, Qt = (e) => {
1563
+ }, $t = (e) => {
1556
1564
  if (e.params.length === 0) return `'${e.pattern}'`;
1557
1565
  let t = e.pattern;
1558
1566
  for (let n of e.params) {
@@ -1560,21 +1568,21 @@ __installPublicEnv(publicEnvValues)
1560
1568
  t = t.replace(e, r);
1561
1569
  }
1562
1570
  return "`" + t + "`";
1563
- }, $t = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
1571
+ }, en = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
1564
1572
  let t = "string";
1565
1573
  return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
1566
- }).join("; ")} }`, en = (e, t, n) => {
1567
- let r = $t(e), i = Qt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
1574
+ }).join("; ")} }`, tn = (e, t, n) => {
1575
+ let r = en(e), i = $t(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
1568
1576
  return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
1569
- }, tn = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${en(e, !1)},`).join("\n")}\n}`, nn = (e, t) => {
1577
+ }, nn = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${tn(e, !1)},`).join("\n")}\n}`, rn = (e, t) => {
1570
1578
  if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
1571
- let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${en(e, !0, i)},`);
1579
+ let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${tn(e, !0, i)},`);
1572
1580
  return ` ${e.key}: {\n${a.join("\n")}\n },`;
1573
- }, rn = async (e) => {
1581
+ }, an = async (e) => {
1574
1582
  let n = e.pages.map((e) => ({
1575
1583
  pattern: e.pattern,
1576
- params: Jt(e.pattern)
1577
- })), i = await Zt(e.appRoot), a = [
1584
+ params: Yt(e.pattern)
1585
+ })), i = await Qt(e.appRoot), a = [
1578
1586
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
1579
1587
  "// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
1580
1588
  "// Type-safe route builders consumed by <Link to={...}>.",
@@ -1583,7 +1591,7 @@ __installPublicEnv(publicEnvValues)
1583
1591
  "",
1584
1592
  "type EmptyParams = Record<string, never>",
1585
1593
  ""
1586
- ].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${tn(n)} as const\n`}\n${i.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${i.map((e) => nn(e, o)).join("\n")}\n} as const\n`}`, c = r(e.appRoot, ".framework", "routes.generated.ts");
1594
+ ].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${nn(n)} as const\n`}\n${i.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${i.map((e) => rn(e, o)).join("\n")}\n} as const\n`}`, c = r(e.appRoot, ".framework", "routes.generated.ts");
1587
1595
  await S.mkdir(t(c), { recursive: !0 });
1588
1596
  let l = null;
1589
1597
  try {
@@ -1596,7 +1604,7 @@ __installPublicEnv(publicEnvValues)
1596
1604
  path: c,
1597
1605
  wrote: !0
1598
1606
  });
1599
- }, an = 256, on = (e = an) => {
1607
+ }, on = 256, sn = (e = on) => {
1600
1608
  let t = [], n = /* @__PURE__ */ new Set();
1601
1609
  return {
1602
1610
  emit(r, i) {
@@ -1619,27 +1627,27 @@ __installPublicEnv(publicEnvValues)
1619
1627
  return t.slice();
1620
1628
  }
1621
1629
  };
1622
- }, sn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, cn = () => `: keep-alive ${Date.now()}\n\n`, ln = {
1630
+ }, cn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, ln = () => `: keep-alive ${Date.now()}\n\n`, un = {
1623
1631
  trace: 0,
1624
1632
  debug: 1,
1625
1633
  info: 2,
1626
1634
  warn: 3,
1627
1635
  error: 4,
1628
1636
  fatal: 5
1629
- }, un = 2e3, dn = 200, fn = class {
1637
+ }, dn = 2e3, fn = 200, pn = class {
1630
1638
  capacity;
1631
1639
  buffer = [];
1632
- constructor(e = un) {
1640
+ constructor(e = dn) {
1633
1641
  this.capacity = e;
1634
1642
  }
1635
1643
  append(e) {
1636
1644
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
1637
1645
  }
1638
1646
  query(e = {}) {
1639
- let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? dn, this.capacity), i = e.minLevel === void 0 ? ln.trace : ln[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
1647
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? fn, this.capacity), i = e.minLevel === void 0 ? un.trace : un[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
1640
1648
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
1641
1649
  let r = this.buffer[e];
1642
- r.ts < t || r.ts > n || ln[r.level] < i || o !== void 0 && r.source !== o || a !== void 0 && (r.scope === void 0 || !r.scope.toLowerCase().includes(a)) || s !== void 0 && !r.message.toLowerCase().includes(s) || c !== void 0 && r.fields.traceId !== c || l.push(r);
1650
+ r.ts < t || r.ts > n || un[r.level] < i || o !== void 0 && r.source !== o || a !== void 0 && (r.scope === void 0 || !r.scope.toLowerCase().includes(a)) || s !== void 0 && !r.message.toLowerCase().includes(s) || c !== void 0 && r.fields.traceId !== c || l.push(r);
1643
1651
  }
1644
1652
  return l.reverse();
1645
1653
  }
@@ -1652,7 +1660,7 @@ __installPublicEnv(publicEnvValues)
1652
1660
  clear() {
1653
1661
  this.buffer = [];
1654
1662
  }
1655
- }, pn = null, mn = () => (pn === null && (pn = new fn()), pn), hn = (e) => {
1663
+ }, mn = null, hn = () => (mn === null && (mn = new pn()), mn), gn = (e) => {
1656
1664
  if (typeof e == "string") return e;
1657
1665
  if (e instanceof Error) return e.message;
1658
1666
  try {
@@ -1660,18 +1668,18 @@ __installPublicEnv(publicEnvValues)
1660
1668
  } catch {
1661
1669
  return String(e);
1662
1670
  }
1663
- }, gn = (e) => {
1671
+ }, _n = (e) => {
1664
1672
  let t = {
1665
1673
  log: console.log.bind(console),
1666
1674
  info: console.info.bind(console),
1667
1675
  warn: console.warn.bind(console),
1668
1676
  error: console.error.bind(console),
1669
1677
  debug: console.debug.bind(console)
1670
- }, n = mn(), r = !1, i = (i) => (...a) => {
1678
+ }, n = hn(), r = !1, i = (i) => (...a) => {
1671
1679
  if (t[i](...a), !r) {
1672
1680
  r = !0;
1673
1681
  try {
1674
- let t = a.length > 0 ? hn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = O();
1682
+ let t = a.length > 0 ? gn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = O();
1675
1683
  e.emit("log", {
1676
1684
  level: i,
1677
1685
  message: r,
@@ -1729,24 +1737,24 @@ __installPublicEnv(publicEnvValues)
1729
1737
  return () => {
1730
1738
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
1731
1739
  };
1732
- }, _n = 2e3, vn = 8, yn = 1e3, bn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, xn = (e) => {
1740
+ }, vn = 2e3, yn = 8, bn = 1e3, xn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Sn = (e) => {
1733
1741
  switch (e) {
1734
1742
  case "error": return "error";
1735
1743
  case "warn": return "warn";
1736
1744
  case "debug": return "debug";
1737
1745
  default: return "info";
1738
1746
  }
1739
- }, Sn = g({ scope: "client" }), Cn = (e, t) => {
1747
+ }, Cn = g({ scope: "client" }), wn = (e, t) => {
1740
1748
  let n;
1741
1749
  try {
1742
1750
  n = JSON.parse(e);
1743
1751
  } catch {
1744
- return wn(400, { error: "invalid JSON body" });
1752
+ return Tn(400, { error: "invalid JSON body" });
1745
1753
  }
1746
- if (typeof n != "object" || !n) return wn(400, { error: "body must be a JSON object" });
1754
+ if (typeof n != "object" || !n) return Tn(400, { error: "body must be a JSON object" });
1747
1755
  let r = n;
1748
- if (!Array.isArray(r.entries)) return wn(400, { error: "entries must be an array" });
1749
- let i = typeof r.app == "string" ? Y(r.app, 120) : void 0, a = typeof r.page == "string" ? Y(r.page, 200) : void 0, o = typeof r.ua == "string" ? Y(r.ua, 200) : void 0, s = r.entries.slice(0, bn), c = 0;
1756
+ if (!Array.isArray(r.entries)) return Tn(400, { error: "entries must be an array" });
1757
+ let i = typeof r.app == "string" ? Y(r.app, 120) : void 0, a = typeof r.page == "string" ? Y(r.page, 200) : void 0, o = typeof r.ua == "string" ? Y(r.ua, 200) : void 0, s = r.entries.slice(0, xn), c = 0;
1750
1758
  for (let e of s) {
1751
1759
  if (typeof e != "object" || !e) continue;
1752
1760
  let n = e;
@@ -1757,7 +1765,7 @@ __installPublicEnv(publicEnvValues)
1757
1765
  "warn",
1758
1766
  "error",
1759
1767
  "debug"
1760
- ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, _n), u = Array.isArray(n.args) ? n.args.slice(0, vn).filter((e) => typeof e == "string").map((e) => Y(e, yn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, _n) : void 0;
1768
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, vn), u = Array.isArray(n.args) ? n.args.slice(0, yn).filter((e) => typeof e == "string").map((e) => Y(e, bn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, vn) : void 0;
1761
1769
  t.emit("clientLog", {
1762
1770
  ts: s,
1763
1771
  level: r,
@@ -1772,35 +1780,35 @@ __installPublicEnv(publicEnvValues)
1772
1780
  ...i === void 0 ? {} : { app: i },
1773
1781
  ...a === void 0 ? {} : { page: a },
1774
1782
  ...u !== void 0 && u.length > 0 ? { args: u } : {}
1775
- }, p = xn(r);
1776
- (p === "error" || p === "warn") && d !== void 0 ? Sn[p](l, f, { stack: d }) : Sn[p](l, {
1783
+ }, p = Sn(r);
1784
+ (p === "error" || p === "warn") && d !== void 0 ? Cn[p](l, f, { stack: d }) : Cn[p](l, {
1777
1785
  ...f,
1778
1786
  ...d === void 0 ? {} : { stack: d }
1779
1787
  }), c++;
1780
1788
  }
1781
- return wn(202, {
1789
+ return Tn(202, {
1782
1790
  accepted: c,
1783
1791
  dropped: r.entries.length - c
1784
1792
  });
1785
- }, wn = (e, t) => ({
1793
+ }, Tn = (e, t) => ({
1786
1794
  status: e,
1787
1795
  contentType: "application/json; charset=utf-8",
1788
1796
  body: JSON.stringify(t)
1789
- }), Tn = "/_voltro/inspect/clientLog", En = [
1797
+ }), En = "/_voltro/inspect/clientLog", Dn = [
1790
1798
  "trace",
1791
1799
  "debug",
1792
1800
  "info",
1793
1801
  "warn",
1794
1802
  "error",
1795
1803
  "fatal"
1796
- ], Dn = {
1804
+ ], On = {
1797
1805
  trace: "TRACE",
1798
1806
  debug: "DEBUG",
1799
1807
  info: "INFO ",
1800
1808
  warn: "WARN ",
1801
1809
  error: "ERROR",
1802
1810
  fatal: "FATAL"
1803
- }, On = (e) => En.includes(e), kn = (e, t, n = {}) => {
1811
+ }, kn = (e) => Dn.includes(e), An = (e, t, n = {}) => {
1804
1812
  if (H()) return {
1805
1813
  status: 503,
1806
1814
  contentType: "application/json",
@@ -1831,7 +1839,7 @@ __installPublicEnv(publicEnvValues)
1831
1839
  Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
1832
1840
  }
1833
1841
  let u = a.get("level");
1834
- u !== null && On(u) && (o.minLevel = u);
1842
+ u !== null && kn(u) && (o.minLevel = u);
1835
1843
  let d = a.get("source");
1836
1844
  (d === "server" || d === "client") && (o.source = d);
1837
1845
  let f = a.get("scope");
@@ -1844,7 +1852,7 @@ __installPublicEnv(publicEnvValues)
1844
1852
  if ((a.get("format") ?? "json") === "text") return {
1845
1853
  status: 200,
1846
1854
  contentType: "text/plain; charset=utf-8",
1847
- body: h.map(An).join("\n") + (h.length > 0 ? "\n" : "")
1855
+ body: h.map(jn).join("\n") + (h.length > 0 ? "\n" : "")
1848
1856
  };
1849
1857
  let g = {
1850
1858
  capturedAt: Date.now(),
@@ -1858,33 +1866,33 @@ __installPublicEnv(publicEnvValues)
1858
1866
  contentType: "application/json; charset=utf-8",
1859
1867
  body: JSON.stringify(g)
1860
1868
  };
1861
- }, An = (e) => {
1862
- let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s = Mn(e.fields);
1863
- return `${n}:${r}:${i}.${a} ${Dn[e.level]} ${o} ${e.message}${s}`;
1864
- }, jn = 80, Mn = (e) => {
1869
+ }, jn = (e) => {
1870
+ let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s = Nn(e.fields);
1871
+ return `${n}:${r}:${i}.${a} ${On[e.level]} ${o} ${e.message}${s}`;
1872
+ }, Mn = 80, Nn = (e) => {
1865
1873
  let t = Object.entries(e);
1866
1874
  if (t.length === 0) return "";
1867
1875
  let n = [];
1868
1876
  for (let [e, r] of t) {
1869
1877
  if (r === void 0) continue;
1870
- let t = Nn(r);
1878
+ let t = Pn(r);
1871
1879
  n.push(`${e}=${t}`);
1872
1880
  }
1873
1881
  return n.length > 0 ? " " + n.join(" ") : "";
1874
- }, Nn = (e) => {
1882
+ }, Pn = (e) => {
1875
1883
  if (typeof e == "string") {
1876
- let t = e.length > jn ? e.slice(0, jn) + "…" : e;
1884
+ let t = e.length > Mn ? e.slice(0, Mn) + "…" : e;
1877
1885
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1878
1886
  }
1879
1887
  if (e === null) return "null";
1880
1888
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1881
1889
  try {
1882
1890
  let t = JSON.stringify(e);
1883
- return t.length > jn ? t.slice(0, jn) + "…" : t;
1891
+ return t.length > Mn ? t.slice(0, Mn) + "…" : t;
1884
1892
  } catch {
1885
1893
  return "[unserialisable]";
1886
1894
  }
1887
- }, Pn = "/_voltro/inspect/logs", Fn = [{
1895
+ }, Fn = "/_voltro/inspect/logs", In = [{
1888
1896
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1889
1897
  handle: (e, t) => {
1890
1898
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1896,13 +1904,13 @@ __installPublicEnv(publicEnvValues)
1896
1904
  });
1897
1905
  } else t.info(n);
1898
1906
  }
1899
- }], In = () => {
1907
+ }], Ln = () => {
1900
1908
  let e = {
1901
1909
  warn: console.warn.bind(console),
1902
1910
  error: console.error.bind(console)
1903
1911
  }, t = g({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1904
1912
  if (!n) {
1905
- for (let e of Fn) if (e.match(i[0])) {
1913
+ for (let e of In) if (e.match(i[0])) {
1906
1914
  n = !0;
1907
1915
  try {
1908
1916
  e.handle(i, t);
@@ -1917,7 +1925,7 @@ __installPublicEnv(publicEnvValues)
1917
1925
  return console.warn = r("warn"), console.error = r("error"), () => {
1918
1926
  console.warn = e.warn, console.error = e.error;
1919
1927
  };
1920
- }, Ln = {
1928
+ }, Rn = {
1921
1929
  loader: "it runs on the server, and the router caches its result per route + params",
1922
1930
  renderMode: "it picks the server render strategy",
1923
1931
  dynamic: "it picks the server render strategy",
@@ -1928,7 +1936,7 @@ __installPublicEnv(publicEnvValues)
1928
1936
  cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1929
1937
  interactive: "it decides how much client JS the server ships",
1930
1938
  tenantAware: "it is part of the server-side cache key"
1931
- }, Rn = Object.keys(Ln), zn = "virtual:voltro-route-refresh", Bn = `\0${zn}`, Vn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Hn = () => `
1939
+ }, zn = Object.keys(Rn), Bn = "virtual:voltro-route-refresh", Vn = `\0${Bn}`, Hn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Un = () => `
1932
1940
  // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1933
1941
 
1934
1942
  /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
@@ -1957,11 +1965,11 @@ const stableForm = (value) => {
1957
1965
  * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1958
1966
  * one of THESE cannot be hot-applied: the server already ran with the old
1959
1967
  * value. Everything else a page exports is plain client-side data. */
1960
- const serverRelevantExports = ${JSON.stringify(Rn)}
1968
+ const serverRelevantExports = ${JSON.stringify(zn)}
1961
1969
 
1962
1970
  /** Name → the server step that already consumed it, so the reload message can
1963
1971
  * say WHY rather than just WHAT. Injected from the same single source. */
1964
- const serverExportEffect = ${JSON.stringify(Ln)}
1972
+ const serverExportEffect = ${JSON.stringify(Rn)}
1965
1973
 
1966
1974
  /** The reason \`name\` forces a reload, for the console line. */
1967
1975
  export const serverEffectOf = (name) =>
@@ -2004,7 +2012,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
2004
2012
  const previousHook = globalThis.__getReactRefreshIgnoredExports
2005
2013
  globalThis.__getReactRefreshIgnoredExports = (args) =>
2006
2014
  ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
2007
- `, Un = (e) => `
2015
+ `, Wn = (e) => `
2008
2016
  if (import.meta.hot) {
2009
2017
  // Self-import to read our OWN exports, the same technique the react plugin
2010
2018
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -2031,45 +2039,45 @@ import {
2031
2039
  registerRouteModule as __voltro_registerRouteModule,
2032
2040
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
2033
2041
  serverEffectOf as __voltro_serverEffect,
2034
- } from '${zn}'
2035
- `, Wn = (e) => e.replace(/\\/g, "/"), Gn = (e, t) => {
2036
- let [n = "", r] = Wn(e).split("?");
2037
- if (!n.endsWith(".tsx") || r !== void 0 && Vn.test(r)) return !1;
2038
- let i = Wn(t).replace(/\/$/, "");
2042
+ } from '${Bn}'
2043
+ `, Gn = (e) => e.replace(/\\/g, "/"), Kn = (e, t) => {
2044
+ let [n = "", r] = Gn(e).split("?");
2045
+ if (!n.endsWith(".tsx") || r !== void 0 && Hn.test(r)) return !1;
2046
+ let i = Gn(t).replace(/\/$/, "");
2039
2047
  return n.startsWith(`${i}/`);
2040
- }, Kn = (e, t, n) => Gn(t, n) ? `${e}${Un(Wn(t).split("?")[0] ?? t)}` : null, qn = (e) => ({
2048
+ }, qn = (e, t, n) => Kn(t, n) ? `${e}${Wn(Gn(t).split("?")[0] ?? t)}` : null, Jn = (e) => ({
2041
2049
  name: "voltro:route-fast-refresh",
2042
2050
  enforce: "pre",
2043
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? Bn : void 0,
2044
- load: (e) => e === Bn ? Hn() : void 0,
2051
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? Vn : void 0,
2052
+ load: (e) => e === Vn ? Un() : void 0,
2045
2053
  transform: (t, n, r) => {
2046
2054
  if (r?.ssr === !0) return null;
2047
- let i = Kn(t, n, e);
2055
+ let i = qn(t, n, e);
2048
2056
  return i === null ? null : {
2049
2057
  code: i,
2050
2058
  map: null
2051
2059
  };
2052
2060
  }
2053
- }), Jn = [
2061
+ }), Yn = [
2054
2062
  "static",
2055
2063
  "spa",
2056
2064
  "ssr",
2057
2065
  "isr"
2058
- ], Yn = (e) => typeof e == "string" && Jn.includes(e), Xn = Jn.map((e) => `'${e}'`).join(" | "), Zn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Xn}.${t === "client" || t === "csr" || t === "browser" ? "\n A page that renders only in the browser is 'spa': it is skipped by the prerender and mounts on the client. If its route has a layout, that layout still renders server-side as an SSR shell." : t === "server" || t === "dynamic" ? "\n A page rendered per request is 'ssr'." : t === "ssg" || t === "prerender" ? "\n A page rendered once at build time is 'static' (the default)." : ""}`, Qn = class extends Error {
2066
+ ], Xn = (e) => typeof e == "string" && Yn.includes(e), Zn = Yn.map((e) => `'${e}'`).join(" | "), Qn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Zn}.${t === "client" || t === "csr" || t === "browser" ? "\n A page that renders only in the browser is 'spa': it is skipped by the prerender and mounts on the client. If its route has a layout, that layout still renders server-side as an SSR shell." : t === "server" || t === "dynamic" ? "\n A page rendered per request is 'ssr'." : t === "ssg" || t === "prerender" ? "\n A page rendered once at build time is 'static' (the default)." : ""}`, $n = class extends Error {
2059
2067
  page;
2060
2068
  value;
2061
2069
  name = "InvalidRenderModeError";
2062
2070
  constructor(e, t) {
2063
- super(Zn(e, t)), this.page = e, this.value = t;
2071
+ super(Qn(e, t)), this.page = e, this.value = t;
2064
2072
  }
2065
- }, $n = (e, t = "<page>") => {
2073
+ }, er = (e, t = "<page>") => {
2066
2074
  if (e.renderMode !== void 0 && e.renderMode !== null) {
2067
- if (!Yn(e.renderMode)) throw new Qn(t, String(e.renderMode));
2075
+ if (!Xn(e.renderMode)) throw new $n(t, String(e.renderMode));
2068
2076
  return e.renderMode;
2069
2077
  }
2070
2078
  return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
2071
- }, er = (e, t = "<page>") => ({
2072
- renderMode: $n(e, t),
2079
+ }, tr = (e, t = "<page>") => ({
2080
+ renderMode: er(e, t),
2073
2081
  tenantAware: e.tenantAware === !0,
2074
2082
  revalidateMs: it(e.revalidate),
2075
2083
  staleWhileRevalidateMs: it(e.staleWhileRevalidate) ?? 0,
@@ -2078,7 +2086,7 @@ import {
2078
2086
  hasLoader: typeof e.loader == "function",
2079
2087
  hasMeta: e.meta != null,
2080
2088
  hasGetStaticPaths: typeof e.getStaticPaths == "function"
2081
- }), tr = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, nr = (e) => tr.exec(e)?.[1] ?? null, rr = async (e, t) => {
2089
+ }), nr = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, rr = (e) => nr.exec(e)?.[1] ?? null, ir = async (e, t) => {
2082
2090
  let n = (await Promise.all(t.map(async (t) => {
2083
2091
  let n;
2084
2092
  try {
@@ -2086,21 +2094,21 @@ import {
2086
2094
  } catch {
2087
2095
  return null;
2088
2096
  }
2089
- let i = nr(n);
2090
- return i === null || Yn(i) ? null : {
2097
+ let i = rr(n);
2098
+ return i === null || Xn(i) ? null : {
2091
2099
  file: t.file,
2092
2100
  value: i
2093
2101
  };
2094
2102
  }))).filter((e) => e !== null);
2095
- if (n.length !== 0) throw Error(n.map((e) => Zn(r("src", "pages", e.file), e.value)).join("\n\n"));
2096
- }, ir = r(re(), ".voltro"), ar = r(ir, "runtime-registry.json"), or = 3e4, sr = () => {
2103
+ if (n.length !== 0) throw Error(n.map((e) => Qn(r("src", "pages", e.file), e.value)).join("\n\n"));
2104
+ }, ar = r(re(), ".voltro"), or = r(ar, "runtime-registry.json"), sr = 3e4, cr = () => {
2097
2105
  let e = Math.random().toString(36).slice(2, 10);
2098
- return `${ar}.${process.pid}.${Date.now()}.${e}.tmp`;
2099
- }, cr = async () => {
2100
- await S.mkdir(ir, { recursive: !0 });
2106
+ return `${or}.${process.pid}.${Date.now()}.${e}.tmp`;
2101
2107
  }, lr = async () => {
2108
+ await S.mkdir(ar, { recursive: !0 });
2109
+ }, ur = async () => {
2102
2110
  try {
2103
- let e = await S.readFile(ar, "utf8"), t = JSON.parse(e);
2111
+ let e = await S.readFile(or, "utf8"), t = JSON.parse(e);
2104
2112
  return t.version !== 1 || !Array.isArray(t.apps) ? {
2105
2113
  version: 1,
2106
2114
  apps: []
@@ -2111,31 +2119,31 @@ import {
2111
2119
  apps: []
2112
2120
  };
2113
2121
  }
2114
- }, ur = async (e) => {
2115
- await cr();
2116
- let t = sr();
2122
+ }, dr = async (e) => {
2123
+ await lr();
2124
+ let t = cr();
2117
2125
  try {
2118
- await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t, ar);
2126
+ await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t, or);
2119
2127
  } catch (e) {
2120
2128
  try {
2121
2129
  await S.unlink(t);
2122
2130
  } catch {}
2123
2131
  throw e;
2124
2132
  }
2125
- }, dr = (e) => {
2133
+ }, fr = (e) => {
2126
2134
  try {
2127
2135
  return process.kill(e, 0), !0;
2128
2136
  } catch {
2129
2137
  return !1;
2130
2138
  }
2131
- }, fr = (e) => {
2139
+ }, pr = (e) => {
2132
2140
  let t = Date.now();
2133
- return e.filter((e) => dr(e.pid) ? t - new Date(e.heartbeatAt).getTime() < or : !1);
2134
- }, pr = async () => {
2135
- let e = await lr(), t = fr(e.apps);
2141
+ return e.filter((e) => fr(e.pid) ? t - new Date(e.heartbeatAt).getTime() < sr : !1);
2142
+ }, mr = async () => {
2143
+ let e = await ur(), t = pr(e.apps);
2136
2144
  if (t.length === e.apps.length) return e;
2137
2145
  try {
2138
- await ur({
2146
+ await dr({
2139
2147
  version: 1,
2140
2148
  apps: t
2141
2149
  });
@@ -2144,32 +2152,32 @@ import {
2144
2152
  version: 1,
2145
2153
  apps: t
2146
2154
  };
2147
- }, mr = async (e) => {
2148
- let t = await lr(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = {
2155
+ }, hr = async (e) => {
2156
+ let t = await ur(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = {
2149
2157
  ...e,
2150
2158
  registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
2151
2159
  heartbeatAt: n
2152
2160
  };
2153
- await ur({
2161
+ await dr({
2154
2162
  version: 1,
2155
2163
  apps: r >= 0 ? t.apps.map((e, t) => t === r ? i : e) : [...t.apps, i]
2156
2164
  });
2157
- }, hr = async (e) => {
2165
+ }, gr = async (e) => {
2158
2166
  try {
2159
- let t = await lr(), n = t.apps.filter((t) => t.id !== e);
2167
+ let t = await ur(), n = t.apps.filter((t) => t.id !== e);
2160
2168
  if (n.length === t.apps.length) return;
2161
- await ur({
2169
+ await dr({
2162
2170
  version: 1,
2163
2171
  apps: n
2164
2172
  });
2165
2173
  } catch {}
2166
- }, gr = (e, t, n) => `${e}:${t}:${n}`, X = r(re(), ".voltro", "logs"), _r = () => {
2174
+ }, _r = (e, t, n) => `${e}:${t}:${n}`, X = r(re(), ".voltro", "logs"), vr = () => {
2167
2175
  let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
2168
2176
  return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
2169
- }, vr = !1, yr = () => {
2170
- if (vr) return;
2171
- vr = !0;
2172
- let e = Date.now() - _r(), t = [];
2177
+ }, yr = !1, br = () => {
2178
+ if (yr) return;
2179
+ yr = !0;
2180
+ let e = Date.now() - vr(), t = [];
2173
2181
  try {
2174
2182
  t = w(X);
2175
2183
  } catch {
@@ -2182,8 +2190,8 @@ import {
2182
2190
  T(t).mtimeMs < e && E(t);
2183
2191
  } catch {}
2184
2192
  }
2185
- }, br = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), xr = (e, t) => r(X, `${br(e)}-${t}.log`), Sr = (e) => {
2186
- let t = br(e), n = [];
2193
+ }, xr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), Sr = (e, t) => r(X, `${xr(e)}-${t}.log`), Cr = (e) => {
2194
+ let t = xr(e), n = [];
2187
2195
  try {
2188
2196
  n = w(X);
2189
2197
  } catch {
@@ -2200,12 +2208,12 @@ import {
2200
2208
  } catch {}
2201
2209
  }
2202
2210
  return a;
2203
- }, Cr = (e) => {
2211
+ }, wr = (e) => {
2204
2212
  try {
2205
2213
  b(X, { recursive: !0 });
2206
2214
  } catch {}
2207
- yr();
2208
- let t = xr(e, process.pid), n = x(t, "w"), r = (e) => {
2215
+ br();
2216
+ let t = Sr(e, process.pid), n = x(t, "w"), r = (e) => {
2209
2217
  let t = {
2210
2218
  ts: e.ts.getTime(),
2211
2219
  level: e.level,
@@ -2246,7 +2254,7 @@ import {
2246
2254
  a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
2247
2255
  }
2248
2256
  };
2249
- }, wr = async (e, t) => {
2257
+ }, Tr = async (e, t) => {
2250
2258
  let n;
2251
2259
  try {
2252
2260
  n = await S.readFile(e, "utf8");
@@ -2260,11 +2268,11 @@ import {
2260
2268
  i.push(t);
2261
2269
  } catch {}
2262
2270
  return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
2263
- }, Tr = g({ scope: "voltro:dashboard" }), Er = ne(import.meta.url), Dr = 5179, Or = (e) => {
2271
+ }, Er = g({ scope: "voltro:dashboard" }), Dr = ne(import.meta.url), Or = 5179, kr = (e) => {
2264
2272
  let n = process.env.VOLTRO_DASHBOARD_PATH;
2265
2273
  if (n && y(r(a(n), "app.config.ts"))) return a(n);
2266
2274
  try {
2267
- let e = t(Er.resolve("@voltro/dashboard/package.json"));
2275
+ let e = t(Dr.resolve("@voltro/dashboard/package.json"));
2268
2276
  if (y(r(e, "app.config.ts"))) return e;
2269
2277
  } catch {}
2270
2278
  let i = r("voltro-devtools", "apps", "dashboard"), o = a(e);
@@ -2276,7 +2284,7 @@ import {
2276
2284
  o = n;
2277
2285
  }
2278
2286
  return null;
2279
- }, kr = "VOLTRO_IS_DASHBOARD", Ar = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
2287
+ }, Ar = "VOLTRO_IS_DASHBOARD", jr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
2280
2288
  let i = he({
2281
2289
  port: e,
2282
2290
  host: t
@@ -2284,45 +2292,45 @@ import {
2284
2292
  a || (a = !0, i.destroy(), r(e));
2285
2293
  };
2286
2294
  i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
2287
- }), jr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Mr = () => process.env[kr] === "1", Nr = () => process.stdout.isTTY === !0, Pr = r(re(), ".voltro", "dashboard-launch.lock"), Fr = 1e4, Ir = async () => {
2295
+ }), Mr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Nr = () => process.env[Ar] === "1", Pr = () => process.stdout.isTTY === !0, Fr = r(re(), ".voltro", "dashboard-launch.lock"), Ir = 1e4, Lr = async () => {
2288
2296
  try {
2289
- await S.mkdir(t(Pr), { recursive: !0 });
2290
- let e = await S.open(Pr, "wx");
2297
+ await S.mkdir(t(Fr), { recursive: !0 });
2298
+ let e = await S.open(Fr, "wx");
2291
2299
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
2292
2300
  } catch {
2293
2301
  try {
2294
- let e = await S.stat(Pr);
2295
- if (Date.now() - e.mtimeMs > Fr) return await S.unlink(Pr).catch(() => void 0), Ir();
2302
+ let e = await S.stat(Fr);
2303
+ if (Date.now() - e.mtimeMs > Ir) return await S.unlink(Fr).catch(() => void 0), Lr();
2296
2304
  } catch {}
2297
2305
  return !1;
2298
2306
  }
2299
- }, Lr = async () => {
2307
+ }, Rr = async () => {
2300
2308
  try {
2301
- await S.unlink(Pr);
2309
+ await S.unlink(Fr);
2302
2310
  } catch {}
2303
- }, Rr = async (e) => {
2311
+ }, zr = async (e) => {
2304
2312
  let n = e.port ?? 5179;
2305
- if (jr()) return {
2313
+ if (Mr()) return {
2306
2314
  status: "skipped",
2307
2315
  reason: "disabled by flag/env",
2308
2316
  port: n
2309
2317
  };
2310
- if (Mr()) return {
2318
+ if (Nr()) return {
2311
2319
  status: "skipped",
2312
2320
  reason: "this process IS the dashboard",
2313
2321
  port: n
2314
2322
  };
2315
- if (!Nr()) return {
2323
+ if (!Pr()) return {
2316
2324
  status: "skipped",
2317
2325
  reason: "stdout is not a TTY (CI/smoke)",
2318
2326
  port: n
2319
2327
  };
2320
- if (!await Ir()) return {
2328
+ if (!await Lr()) return {
2321
2329
  status: "skipped",
2322
2330
  reason: "another voltro process is currently launching the dashboard",
2323
2331
  port: n
2324
2332
  };
2325
- if (await Ar(n)) return await Lr(), {
2333
+ if (await jr(n)) return await Rr(), {
2326
2334
  status: "already-running",
2327
2335
  port: n
2328
2336
  };
@@ -2339,7 +2347,7 @@ import {
2339
2347
  stdio: "ignore",
2340
2348
  env: {
2341
2349
  ...process.env,
2342
- [kr]: "1",
2350
+ [Ar]: "1",
2343
2351
  VOLTRO_DASHBOARD_PORT: String(n)
2344
2352
  }
2345
2353
  });
@@ -2347,22 +2355,22 @@ import {
2347
2355
  if (s.exitCode === null && s.signalCode === null) try {
2348
2356
  s.kill("SIGTERM");
2349
2357
  } catch {}
2350
- }), Tr.info(`auto-launching dashboard at http://localhost:${n}`, {
2358
+ }), Er.info(`auto-launching dashboard at http://localhost:${n}`, {
2351
2359
  port: n,
2352
2360
  mode: o,
2353
2361
  prebuilt: a
2354
- }), a || Tr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Tr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
2355
- Lr();
2362
+ }), a || Er.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Er.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
2363
+ Rr();
2356
2364
  }, 4e3).unref(), {
2357
2365
  status: "launched",
2358
2366
  port: n
2359
2367
  };
2360
- }, zr = class extends Error {
2368
+ }, Br = class extends Error {
2361
2369
  _voltroDeferral = !0;
2362
2370
  constructor(e) {
2363
2371
  super(e), this.name = "DeferralNotSupportedError";
2364
2372
  }
2365
- }, Br = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Vr = (e) => {
2373
+ }, Vr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Hr = (e) => {
2366
2374
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
2367
2375
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
2368
2376
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -2377,7 +2385,7 @@ import {
2377
2385
  ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
2378
2386
  });
2379
2387
  } catch (e) {
2380
- throw new zr(e instanceof Error ? e.message : String(e));
2388
+ throw new Br(e instanceof Error ? e.message : String(e));
2381
2389
  }
2382
2390
  return {
2383
2391
  loaderData: n.renderData,
@@ -2393,8 +2401,8 @@ import {
2393
2401
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
2394
2402
  }
2395
2403
  };
2396
- }, Hr = (e) => {
2397
- let { helpers: t, renderInput: n } = e, r = Vr({
2404
+ }, Ur = (e) => {
2405
+ let { helpers: t, renderInput: n } = e, r = Hr({
2398
2406
  helpers: t,
2399
2407
  page: e.page,
2400
2408
  pathname: n.pathname,
@@ -2415,37 +2423,37 @@ import {
2415
2423
  stateScript: t.renderRouterStateScript(r.stateInput),
2416
2424
  hasDeferred: r.hasDeferred
2417
2425
  };
2418
- }, Ur = (e) => {
2426
+ }, Wr = (e) => {
2419
2427
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
2420
2428
  return {
2421
2429
  body: t,
2422
2430
  meta: n
2423
2431
  };
2424
- }, Wr = (e) => [
2432
+ }, Gr = (e) => [
2425
2433
  ...e.extra ?? [],
2426
2434
  e.helpers.renderMetaToHtml(e.meta),
2427
2435
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
2428
2436
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
2429
2437
  e.prepared.stateScript
2430
- ].filter((e) => e.length > 0).join("\n "), Gr = "<div id=\"root\"></div>", Kr = "<div id=\"root\">", qr = "</div>", Jr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Yr = /\bsrc=["']([^"']+)["']/i, Xr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Zr = (e) => {
2431
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Jr, (e) => {
2432
- let r = Yr.exec(e)?.[1];
2438
+ ].filter((e) => e.length > 0).join("\n "), Kr = "<div id=\"root\"></div>", qr = "<div id=\"root\">", Jr = "</div>", Yr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Xr = /\bsrc=["']([^"']+)["']/i, Zr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Qr = (e) => {
2439
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Yr, (e) => {
2440
+ let r = Xr.exec(e)?.[1];
2433
2441
  return r === void 0 || t(r) ? e : (n.push(r), "");
2434
2442
  });
2435
- e.inlineModuleScriptsAsync && (r = r.replace(Xr, "<script async$1>"));
2436
- let i = r.indexOf(Gr);
2437
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${Gr}\` 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.`);
2443
+ e.inlineModuleScriptsAsync && (r = r.replace(Zr, "<script async$1>"));
2444
+ let i = r.indexOf(Kr);
2445
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Kr}\` 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.`);
2438
2446
  return {
2439
- head: `${r.slice(0, i)}${Kr}`,
2440
- tail: `${qr}${r.slice(i + 21)}`,
2447
+ head: `${r.slice(0, i)}${qr}`,
2448
+ tail: `${Jr}${r.slice(i + 21)}`,
2441
2449
  bootstrapModules: n
2442
2450
  };
2443
- }, Qr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), $r = (e) => {
2451
+ }, $r = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), ei = (e) => {
2444
2452
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
2445
2453
  if (s || !o || a === null) return;
2446
2454
  s = !0, t.statusCode = e.statusCode ?? 200;
2447
2455
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
2448
- t.flushHeaders?.(), t.write(Qr({
2456
+ t.flushHeaders?.(), t.write($r({
2449
2457
  head: n.head,
2450
2458
  headInjection: i(a.meta),
2451
2459
  htmlLang: r
@@ -2475,14 +2483,14 @@ import {
2475
2483
  return;
2476
2484
  }
2477
2485
  c();
2478
- }, Z = g({ scope: "voltro:dev:web" }), ei = g({ scope: "vite" }), ti = await (async () => {
2486
+ }, Z = g({ scope: "voltro:dev:web" }), ti = g({ scope: "vite" }), ni = await (async () => {
2479
2487
  try {
2480
2488
  let e = r(t(o(import.meta.url)), "..", "package.json"), n = await S.readFile(e, "utf8");
2481
2489
  return JSON.parse(n).version ?? "0.0.0";
2482
2490
  } catch {
2483
2491
  return "0.0.0";
2484
2492
  }
2485
- })(), ni = async () => {
2493
+ })(), ri = async () => {
2486
2494
  try {
2487
2495
  let e = t(o(import.meta.url)), n = a(e, "..", "..", "devtools");
2488
2496
  if (y(r(n, "package.json"))) return n;
@@ -2491,7 +2499,7 @@ import {
2491
2499
  } catch {
2492
2500
  return null;
2493
2501
  }
2494
- }, ri = (e, t) => e.disableDevtools || !t ? [] : [
2502
+ }, ii = (e, t) => e.disableDevtools || !t ? [] : [
2495
2503
  "",
2496
2504
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
2497
2505
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -2501,12 +2509,12 @@ import {
2501
2509
  " await import('@voltro/devtools/styles.css')",
2502
2510
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
2503
2511
  "}"
2504
- ], ii = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], ai = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], oi = (e) => e.sentry ? [
2512
+ ], ai = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], oi = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], si = (e) => e.sentry ? [
2505
2513
  "",
2506
2514
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
2507
2515
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
2508
2516
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
2509
- ] : [], si = (e) => e.env ? ["import './env.public'"] : [], ci = (e) => {
2517
+ ] : [], ci = (e) => e.env ? ["import './env.public'"] : [], li = (e) => {
2510
2518
  let n = [], i = a(e);
2511
2519
  for (;;) {
2512
2520
  y(r(i, "pnpm-workspace.yaml")) && n.push(i);
@@ -2515,19 +2523,19 @@ import {
2515
2523
  i = e;
2516
2524
  }
2517
2525
  return n;
2518
- }, li = /* @__PURE__ */ new Set([
2526
+ }, ui = /* @__PURE__ */ new Set([
2519
2527
  "layout.tsx",
2520
2528
  "error.tsx",
2521
2529
  "loading.tsx",
2522
2530
  "not-found.tsx"
2523
- ]), ui = (e) => /\.(test|spec)\.tsx$/.test(e), di = (e) => {
2531
+ ]), di = (e) => /\.(test|spec)\.tsx$/.test(e), fi = (e) => {
2524
2532
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
2525
2533
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
2526
2534
  if (t) return `island-${t[1]}`;
2527
- }, fi = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, pi = (e) => e.startsWith("(") && e.endsWith(")"), mi = (e) => e.filter((e) => !pi(e)), hi = (e) => {
2528
- let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !pi(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
2535
+ }, pi = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, mi = (e) => e.startsWith("(") && e.endsWith(")"), hi = (e) => e.filter((e) => !mi(e)), gi = (e) => {
2536
+ let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !mi(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
2529
2537
  return n.length === 0 ? "/" : "/" + n.join("/");
2530
- }, gi = (e) => `${e.replace(/\.tsx$/, "").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`, Q = (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}`, $ = async (e) => {
2538
+ }, _i = (e) => `${e.replace(/\.tsx$/, "").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`, Q = (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}`, $ = async (e) => {
2531
2539
  let t = [], n = [], i = async (e, a) => {
2532
2540
  let o = [];
2533
2541
  try {
@@ -2535,17 +2543,17 @@ import {
2535
2543
  } catch {
2536
2544
  return;
2537
2545
  }
2538
- let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !ui(e.name)).map((e) => e.name).sort(), l = new Set(c), u = a.join("/");
2539
- if (c.some((e) => li.has(e))) {
2546
+ let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !di(e.name)).map((e) => e.name).sort(), l = new Set(c), u = a.join("/");
2547
+ if (c.some((e) => ui.has(e))) {
2540
2548
  let t = l.has("layout.tsx"), i = !1;
2541
2549
  if (t) try {
2542
2550
  let t = await S.readFile(r(e, "layout.tsx"), "utf8");
2543
- i = fi.test(t);
2551
+ i = pi.test(t);
2544
2552
  } catch {}
2545
2553
  n.push({
2546
2554
  dir: u,
2547
2555
  chain: a,
2548
- contributesToUrl: a.length === 0 || !pi(a[a.length - 1]),
2556
+ contributesToUrl: a.length === 0 || !mi(a[a.length - 1]),
2549
2557
  hasLayout: t,
2550
2558
  hasLayoutLoader: i,
2551
2559
  hasError: l.has("error.tsx"),
@@ -2554,12 +2562,12 @@ import {
2554
2562
  });
2555
2563
  }
2556
2564
  for (let e of c) {
2557
- if (li.has(e)) continue;
2565
+ if (ui.has(e)) continue;
2558
2566
  let n = u ? `${u}/${e}` : e;
2559
2567
  t.push({
2560
2568
  file: n,
2561
- pattern: hi(n),
2562
- ident: gi(n),
2569
+ pattern: gi(n),
2570
+ ident: _i(n),
2563
2571
  dirChain: a
2564
2572
  });
2565
2573
  }
@@ -2569,14 +2577,14 @@ import {
2569
2577
  pages: t,
2570
2578
  dirs: n
2571
2579
  };
2572
- }, _i = (e, t) => {
2580
+ }, vi = (e, t) => {
2573
2581
  let n = [];
2574
2582
  for (let r = 0; r <= t.length; r++) {
2575
2583
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
2576
2584
  a && n.push(a);
2577
2585
  }
2578
2586
  return n;
2579
- }, vi = async (e) => {
2587
+ }, yi = async (e) => {
2580
2588
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
2581
2589
  return {
2582
2590
  chain: await Promise.all(t.map(async (e, t) => {
@@ -2598,10 +2606,10 @@ import {
2598
2606
  })),
2599
2607
  segmentLoaderData: o
2600
2608
  };
2601
- }, yi = (e) => {
2602
- let t = mi(e);
2609
+ }, bi = (e) => {
2610
+ let t = hi(e);
2603
2611
  return t.length === 0 ? "" : "/" + t.join("/");
2604
- }, bi = [
2612
+ }, xi = [
2605
2613
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
2606
2614
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
2607
2615
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -2694,7 +2702,7 @@ import {
2694
2702
  " _vdtErrorStart('Build error')",
2695
2703
  " })",
2696
2704
  "}"
2697
- ].join("\n"), xi = (e) => {
2705
+ ].join("\n"), Si = (e) => {
2698
2706
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
2699
2707
  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, "\\$&"));
2700
2708
  let a = i.join("/");
@@ -2703,8 +2711,8 @@ import {
2703
2711
  paramNames: t,
2704
2712
  priority: n
2705
2713
  };
2706
- }, Si = (e) => e.map((e) => {
2707
- let { regex: t, paramNames: n, priority: r } = xi(e.pattern);
2714
+ }, Ci = (e) => e.map((e) => {
2715
+ let { regex: t, paramNames: n, priority: r } = Si(e.pattern);
2708
2716
  return {
2709
2717
  pattern: e.pattern,
2710
2718
  file: e.file,
@@ -2713,7 +2721,7 @@ import {
2713
2721
  paramNames: n,
2714
2722
  priority: r
2715
2723
  };
2716
- }).slice().sort((e, t) => e.priority - t.priority), Ci = (e, t) => {
2724
+ }).slice().sort((e, t) => e.priority - t.priority), wi = (e, t) => {
2717
2725
  for (let n of t) {
2718
2726
  let t = n.regex.exec(e);
2719
2727
  if (!t) continue;
@@ -2725,7 +2733,7 @@ import {
2725
2733
  };
2726
2734
  }
2727
2735
  return null;
2728
- }, wi = async (e, n) => {
2736
+ }, Ti = async (e, n) => {
2729
2737
  let i = e;
2730
2738
  for (;;) {
2731
2739
  let e = r(i, "node_modules", n);
@@ -2739,7 +2747,7 @@ import {
2739
2747
  if (a === i) return null;
2740
2748
  i = a;
2741
2749
  }
2742
- }, Ti = async (e) => {
2750
+ }, Ei = async (e) => {
2743
2751
  try {
2744
2752
  let t = await import(s(r(e, "app.config.ts")).href), n = t.default?.port, i = typeof n == "number" ? n : 4e3, a = t.default?.transport?.wsPath, o = typeof a == "string" && a.startsWith("/") ? a : void 0;
2745
2753
  return o ? {
@@ -2748,7 +2756,7 @@ import {
2748
2756
  } : { port: i };
2749
2757
  } catch {}
2750
2758
  return { port: 4e3 };
2751
- }, Ei = (e, t) => ({
2759
+ }, Di = (e, t) => ({
2752
2760
  name: e,
2753
2761
  pkg: t.package,
2754
2762
  browserWsUrl: t.url,
@@ -2756,7 +2764,7 @@ import {
2756
2764
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
2757
2765
  ...t.headers ? { headers: t.headers } : {},
2758
2766
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
2759
- }), Di = (e, t, n) => {
2767
+ }), Oi = (e, t, n) => {
2760
2768
  let r = t.transport?.wsPath ?? n.wsPath;
2761
2769
  return {
2762
2770
  name: e,
@@ -2768,7 +2776,7 @@ import {
2768
2776
  ...t.headers ? { headers: t.headers } : {},
2769
2777
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
2770
2778
  };
2771
- }, Oi = (e) => {
2779
+ }, ki = (e) => {
2772
2780
  let t = /* @__PURE__ */ new Map();
2773
2781
  for (let n of e) {
2774
2782
  if (n.proxyTarget === void 0) continue;
@@ -2776,43 +2784,43 @@ import {
2776
2784
  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>.`);
2777
2785
  t.set(n.browserWsUrl, n.name);
2778
2786
  }
2779
- }, ki = async (e, t) => {
2787
+ }, Ai = async (e, t) => {
2780
2788
  let n = Object.entries(t.apis ?? {}), r = [];
2781
2789
  for (let [t, i] of n) {
2782
2790
  if (i.url) {
2783
- r.push(Ei(t, i));
2791
+ r.push(Di(t, i));
2784
2792
  continue;
2785
2793
  }
2786
- let n = await wi(e, i.package);
2794
+ let n = await Ti(e, i.package);
2787
2795
  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.`);
2788
- r.push(Di(t, i, await Ti(n)));
2796
+ r.push(Oi(t, i, await Ei(n)));
2789
2797
  }
2790
- return Oi(r), r;
2791
- }, Ai = (e) => {
2798
+ return ki(r), r;
2799
+ }, ji = (e) => {
2792
2800
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
2793
2801
  let t = new URL(e);
2794
2802
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
2795
2803
  } catch {
2796
2804
  return;
2797
2805
  }
2798
- }, ji = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Mi = (e) => process.env[ji(e)] ?? process.env.VOLTRO_API_ORIGIN, Ni = (e, t) => {
2806
+ }, Mi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Ni = (e) => process.env[Mi(e)] ?? process.env.VOLTRO_API_ORIGIN, Pi = (e, t) => {
2799
2807
  if (!e) return;
2800
- let n = Mi(e.name) ?? e.serverOrigin;
2808
+ let n = Ni(e.name) ?? e.serverOrigin;
2801
2809
  if (n) {
2802
- let e = Ai(n);
2810
+ let e = ji(n);
2803
2811
  if (e) return e;
2804
2812
  }
2805
2813
  if (t?.allowDevProxy && e.proxyTarget) {
2806
- let t = Ai(e.proxyTarget);
2814
+ let t = ji(e.proxyTarget);
2807
2815
  if (t) return t;
2808
2816
  }
2809
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Ai(e.browserWsUrl);
2810
- }, Pi = (e, t, n) => {
2817
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return ji(e.browserWsUrl);
2818
+ }, Fi = (e, t, n) => {
2811
2819
  if (!e) {
2812
2820
  if (n?.apiName === void 0) return;
2813
2821
  let e = n.apiName;
2814
2822
  return async () => {
2815
- 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 ${ji(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.`);
2823
+ 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 ${Mi(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.`);
2816
2824
  };
2817
2825
  }
2818
2826
  return async (r, i) => {
@@ -2834,7 +2842,7 @@ import {
2834
2842
  });
2835
2843
  } catch (t) {
2836
2844
  let i = t?.cause?.code ?? String(t?.message ?? t);
2837
- throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${ji(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 });
2845
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Mi(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 });
2838
2846
  }
2839
2847
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
2840
2848
  let s = await o.json();
@@ -2852,8 +2860,8 @@ import {
2852
2860
  }
2853
2861
  if (u) return l;
2854
2862
  };
2855
- }, Fi = async (e, t, n, i = {}) => {
2856
- let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await ni() !== null, c = t.theme === "system" ? [
2863
+ }, Ii = async (e, t, n, i = {}) => {
2864
+ let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await ri() !== null, c = t.theme === "system" ? [
2857
2865
  " <script>",
2858
2866
  " (function () {",
2859
2867
  " var root = document.documentElement",
@@ -2892,7 +2900,7 @@ import {
2892
2900
  "</html>",
2893
2901
  ""
2894
2902
  ].join("\n"), u = r(e, "src", "pages"), { pages: d, dirs: f } = await $(u);
2895
- await rr(u, d);
2903
+ await ir(u, d);
2896
2904
  let p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, h = n.map((e) => `import { appGroup as ${p(e.name)}, appDescriptors as ${m(e.name)} } from '${e.pkg}/rpcGroup'`);
2897
2905
  n.some((e) => e.hasAuthHeaders) && (h.push("import __voltroAppConfig from '../app.config'"), h.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
2898
2906
  let g = n.map((e) => {
@@ -2906,13 +2914,13 @@ import {
2906
2914
  e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2907
2915
  }
2908
2916
  let r = d.map((e) => {
2909
- let t = _i(f, e.dirChain).map((e) => {
2917
+ let t = vi(f, e.dirChain).map((e) => {
2910
2918
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2911
2919
  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(", ")} }`;
2912
2920
  }).join(",\n");
2913
2921
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2914
2922
  }), i = f.filter((e) => e.hasNotFound).map((e) => {
2915
- let t = yi(e.chain), n = _i(f, e.chain).map((e) => {
2923
+ let t = bi(e.chain), n = vi(f, e.chain).map((e) => {
2916
2924
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2917
2925
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2918
2926
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
@@ -3151,14 +3159,14 @@ import {
3151
3159
  "// resolved apis map. Side-effect only — no local component definitions —",
3152
3160
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
3153
3161
  "",
3154
- ...si(t),
3162
+ ...ci(t),
3155
3163
  "import { mount } from '@voltro/web'",
3156
3164
  ...h,
3157
3165
  "import { App } from './app'",
3158
3166
  "import { preloadCurrentRoute } from './routeTable'",
3159
- ...ai(t),
3160
- ...ri(t, s),
3161
3167
  ...oi(t),
3168
+ ...ii(t, s),
3169
+ ...si(t),
3162
3170
  "",
3163
3171
  "// Preload the current route's page chunk BEFORE hydration so the first",
3164
3172
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -3175,10 +3183,10 @@ import {
3175
3183
  " apis: {",
3176
3184
  ...g,
3177
3185
  " },",
3178
- ...ii(t, s),
3186
+ ...ai(t, s),
3179
3187
  "})",
3180
3188
  "",
3181
- bi
3189
+ xi
3182
3190
  ].join("\n");
3183
3191
  } else _ = "", v = "", b = [
3184
3192
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -3186,22 +3194,22 @@ import {
3186
3194
  "// and calls mount(). Side-effect only, no component definitions, so the",
3187
3195
  "// user's component file remains the Fast Refresh boundary.",
3188
3196
  "",
3189
- ...si(t),
3197
+ ...ci(t),
3190
3198
  "import { mount } from '@voltro/web'",
3191
3199
  ...h,
3192
3200
  "import App from '../src/App'",
3193
- ...ai(t),
3194
- ...ri(t, s),
3195
3201
  ...oi(t),
3202
+ ...ii(t, s),
3203
+ ...si(t),
3196
3204
  "",
3197
3205
  "mount(App, {",
3198
3206
  " apis: {",
3199
3207
  ...g,
3200
3208
  " },",
3201
- ...ii(t, s),
3209
+ ...ai(t, s),
3202
3210
  "})",
3203
3211
  "",
3204
- bi
3212
+ xi
3205
3213
  ].join("\n");
3206
3214
  let x = r(e, ".framework");
3207
3215
  await S.mkdir(x, { recursive: !0 }), t.env ? await Qe(x, i) : await S.rm(r(x, "env.public.ts"), { force: !0 }), await S.writeFile(r(x, "index.html"), l, "utf8"), await S.writeFile(r(x, "main.tsx"), b, "utf8"), _ ? (await S.writeFile(r(x, "app.tsx"), _, "utf8"), await S.writeFile(r(x, "routeTable.ts"), v, "utf8")) : (await S.rm(r(x, "app.tsx"), { force: !0 }), await S.rm(r(x, "routeTable.ts"), { force: !0 }));
@@ -3212,7 +3220,7 @@ import {
3212
3220
  let T = ["/.framework/"], E = w.split("\n").filter((e) => e.trim() !== "");
3213
3221
  for (let e of T) E.includes(e) || E.push(e);
3214
3222
  await S.writeFile(C, E.join("\n") + "\n", "utf8");
3215
- }, Ii = async (e, n) => {
3223
+ }, Li = async (e, n) => {
3216
3224
  try {
3217
3225
  let i = r(t(e), "project.json");
3218
3226
  if (!y(i)) return;
@@ -3225,24 +3233,24 @@ import {
3225
3233
  projectJson: i
3226
3234
  });
3227
3235
  } catch {}
3228
- }, Li = (e) => r(e, ".framework", "dist", "server", "appConfig.js"), Ri = async (e) => {
3229
- let t = Li(e), n = y(t) ? t : r(e, "app.config.ts");
3236
+ }, Ri = (e) => r(e, ".framework", "dist", "server", "appConfig.js"), zi = async (e) => {
3237
+ let t = Ri(e), n = y(t) ? t : r(e, "app.config.ts");
3230
3238
  try {
3231
3239
  let e = (await import(s(n).href)).default;
3232
3240
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
3233
3241
  } catch {
3234
3242
  return null;
3235
3243
  }
3236
- }, zi = async (t) => {
3237
- let n = await Ri(t);
3244
+ }, Bi = async (t) => {
3245
+ let n = await zi(t);
3238
3246
  if (!n) return {
3239
3247
  ran: !1,
3240
3248
  exitCode: 0
3241
3249
  };
3242
- In();
3243
- let o = on();
3244
- gn(o), Z.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" });
3245
- let s = await ki(t, n);
3250
+ Ln();
3251
+ let o = sn();
3252
+ _n(o), Z.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" });
3253
+ let s = await Ai(t, n);
3246
3254
  for (let e of s) Z.info("api wired", {
3247
3255
  name: e.name,
3248
3256
  pkg: e.pkg,
@@ -3261,13 +3269,13 @@ import {
3261
3269
  log: Z,
3262
3270
  generateTypes: !0
3263
3271
  }), l = c.publicValues;
3264
- await Fi(t, n, s, l), Z.debug("generated framework entry files", { files: [
3272
+ await Ii(t, n, s, l), Z.debug("generated framework entry files", { files: [
3265
3273
  "index.html",
3266
3274
  ".framework/main.tsx",
3267
3275
  ...n.env ? [".framework/env.public.ts"] : []
3268
3276
  ] });
3269
- let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f = gr("web", d, u), p = Cr(d);
3270
- await mr({
3277
+ let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f = _r("web", d, u), p = wr(d);
3278
+ await hr({
3271
3279
  id: f,
3272
3280
  name: d,
3273
3281
  kind: "web",
@@ -3275,14 +3283,14 @@ import {
3275
3283
  pid: process.pid,
3276
3284
  status: "booting",
3277
3285
  logFile: p.path
3278
- }).catch(() => {}), await Ii(t, u);
3286
+ }).catch(() => {}), await Li(t, u);
3279
3287
  let { pages: m, dirs: h } = await $(r(t, "src", "pages")), g = h.map((e) => ({
3280
3288
  dir: e.dir,
3281
3289
  hasLayout: e.hasLayout,
3282
3290
  hasError: e.hasError,
3283
3291
  hasPending: e.hasPending,
3284
3292
  hasNotFound: e.hasNotFound
3285
- })), v = await rn({
3293
+ })), v = await an({
3286
3294
  appRoot: t,
3287
3295
  pages: m
3288
3296
  });
@@ -3311,7 +3319,7 @@ import {
3311
3319
  ...i.devDependencies
3312
3320
  });
3313
3321
  await Promise.all(a.map(async (n) => {
3314
- let i = await wi(t, n);
3322
+ let i = await Ti(t, n);
3315
3323
  if (!i) return;
3316
3324
  let a = r(i, "src");
3317
3325
  try {
@@ -3323,9 +3331,9 @@ import {
3323
3331
  }, D = r(t, "src", "pages"), te = (e) => e.endsWith(".tsx") && (e === D || e.startsWith(D + "/")), O = (e) => e === D || e.startsWith(D + "/"), k = async (e) => {
3324
3332
  try {
3325
3333
  let r = Date.now();
3326
- await Fi(t, n, s, l);
3334
+ await Ii(t, n, s, l);
3327
3335
  let { pages: i } = await $(D);
3328
- await rn({
3336
+ await an({
3329
3337
  appRoot: t,
3330
3338
  pages: i
3331
3339
  }), Z.info("page tree regenerated", {
@@ -3417,7 +3425,7 @@ import {
3417
3425
  }
3418
3426
  try {
3419
3427
  let r = Date.now();
3420
- await Fi(t, e, await ki(t, e)), M = e, n.ws && n.ws.send({
3428
+ await Ii(t, e, await Ai(t, e)), M = e, n.ws && n.ws.send({
3421
3429
  type: "full-reload",
3422
3430
  path: "*"
3423
3431
  }), Z.info("app.config.ts soft-regen", {
@@ -3457,7 +3465,7 @@ import {
3457
3465
  let n = /* @__PURE__ */ new Map();
3458
3466
  for (let i of s) {
3459
3467
  if (!i.proxyTarget) continue;
3460
- let a = await wi(t, i.pkg);
3468
+ let a = await Ti(t, i.pkg);
3461
3469
  if (!a) continue;
3462
3470
  let o = r(a, "rpcGroup.generated.ts");
3463
3471
  try {
@@ -3543,7 +3551,7 @@ import {
3543
3551
  pattern: i.pattern,
3544
3552
  file: i.file,
3545
3553
  dirChain: i.dirChain,
3546
- renderMode: $n(a, r("src", "pages", i.file)),
3554
+ renderMode: er(a, r("src", "pages", i.file)),
3547
3555
  interactive: a.interactive ?? "full",
3548
3556
  tenantAware: a.tenantAware === !0,
3549
3557
  revalidateMs: it(a.revalidate),
@@ -3652,7 +3660,7 @@ import {
3652
3660
  for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (s[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
3653
3661
  let c = i.split("?")[0];
3654
3662
  if (e.method === "GET" && (c === "/_voltro/inspect/logs" || i.startsWith("/_voltro/inspect/logs?"))) {
3655
- let e = G(s.origin), n = kn(i, mn(), s);
3663
+ let e = G(s.origin), n = An(i, hn(), s);
3656
3664
  t.statusCode = n.status, t.setHeader("content-type", n.contentType);
3657
3665
  for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
3658
3666
  t.end(n.body);
@@ -3670,7 +3678,7 @@ import {
3670
3678
  e.setEncoding("utf-8"), e.on("data", (e) => {
3671
3679
  r += e;
3672
3680
  }), e.on("end", () => {
3673
- let e = Cn(r, o);
3681
+ let e = wn(r, o);
3674
3682
  t.statusCode = e.status, t.setHeader("content-type", e.contentType);
3675
3683
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3676
3684
  t.end(e.body);
@@ -3701,14 +3709,14 @@ import {
3701
3709
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3702
3710
  t.flushHeaders?.(), t.write("retry: 5000\n\n");
3703
3711
  let a = i.indexOf("?");
3704
- if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(sn(e));
3712
+ if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(cn(e));
3705
3713
  let c = o.subscribe((e) => {
3706
3714
  try {
3707
- t.write(sn(e));
3715
+ t.write(cn(e));
3708
3716
  } catch {}
3709
3717
  }), l = setInterval(() => {
3710
3718
  try {
3711
- t.write(cn());
3719
+ t.write(ln());
3712
3720
  } catch {}
3713
3721
  }, 15e3), u = () => {
3714
3722
  clearInterval(l), c();
@@ -3717,11 +3725,11 @@ import {
3717
3725
  return;
3718
3726
  }
3719
3727
  try {
3720
- let o = vt(i, {
3728
+ let o = yt(i, {
3721
3729
  kind: "web",
3722
3730
  meta: {
3723
3731
  name: n.name ?? "(unnamed)",
3724
- voltroVersion: ti,
3732
+ voltroVersion: ni,
3725
3733
  port: u,
3726
3734
  mode: "dev",
3727
3735
  apis: Object.entries(n.apis ?? {}).map(([e, t]) => {
@@ -3756,14 +3764,14 @@ import {
3756
3764
  e.middlewares.use(async (e, t, n) => {
3757
3765
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
3758
3766
  try {
3759
- let e = await pr();
3767
+ let e = await mr();
3760
3768
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
3761
3769
  } catch (e) {
3762
3770
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
3763
3771
  }
3764
3772
  });
3765
3773
  }
3766
- } : null, ue = Si(m), de = /* @__PURE__ */ new Set(), I = Gt(), pe = qt({
3774
+ } : null, ue = Ci(m), de = /* @__PURE__ */ new Set(), I = Kt(), pe = Jt({
3767
3775
  limit: I,
3768
3776
  onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
3769
3777
  onColdEnd: (e) => Z.debug("ssr cold-compile end", { id: e })
@@ -3777,7 +3785,7 @@ import {
3777
3785
  if (i.method !== "GET" && i.method !== "HEAD") return o();
3778
3786
  let c = i.url ?? "/", l = c.indexOf("?"), u = (l === -1 ? c : c.slice(0, l)) || "/";
3779
3787
  if (u.startsWith("/@") || u.startsWith("/node_modules/") || u.startsWith("/.framework/") || u.startsWith("/_voltro/") || u === "/main.tsx" || u === "/index.html" || u === "/sw.js" || u === "/favicon.ico" || u === "/robots.txt" || /\.[a-z0-9]+$/i.test(u)) return o();
3780
- let d = Ci(u, ue);
3788
+ let d = wi(u, ue);
3781
3789
  if (!d) return o();
3782
3790
  let f = !de.has(d.route.pattern), p = Date.now();
3783
3791
  f && Z.info(`ssr compiling ${d.route.pattern}`, {
@@ -3799,15 +3807,15 @@ import {
3799
3807
  }
3800
3808
  };
3801
3809
  try {
3802
- let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = $n(l, r("src", "pages", d.route.file)), y = _i(h, d.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
3810
+ let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = er(l, r("src", "pages", d.route.file)), y = vi(h, d.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
3803
3811
  if (v !== "ssr" && v !== "isr" && !b) return o();
3804
3812
  let x = {};
3805
3813
  for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ? x[e] = t : Array.isArray(t) && (x[e] = t.join(", "));
3806
- let S = Pi(Ni(s[0], { allowDevProxy: !0 }), x.cookie, { apiName: s[0]?.name }), C = new AbortController(), w = () => C.abort();
3814
+ let S = Fi(Pi(s[0], { allowDevProxy: !0 }), x.cookie, { apiName: s[0]?.name }), C = new AbortController(), w = () => C.abort();
3807
3815
  a.once("close", w);
3808
3816
  let T = null, E = [], ee = {};
3809
3817
  try {
3810
- ({chain: E, segmentLoaderData: ee} = await g("loadChain", () => vi({
3818
+ ({chain: E, segmentLoaderData: ee} = await g("loadChain", () => yi({
3811
3819
  entries: y,
3812
3820
  loadLayout: (e) => n(r(t, "src", "pages", e.dir, "layout.tsx")),
3813
3821
  loadError: (e) => n(r(t, "src", "pages", e.dir, "error.tsx")),
@@ -3844,7 +3852,7 @@ import {
3844
3852
  cookies: D.parseCookieHeader(x.cookie),
3845
3853
  headers: x,
3846
3854
  url: c
3847
- }, k = l.interactive ?? "full", A = b ? Hr({
3855
+ }, k = l.interactive ?? "full", A = b ? Ur({
3848
3856
  helpers: D,
3849
3857
  page: `src/pages/${d.route.file}`,
3850
3858
  interactive: k,
@@ -3856,7 +3864,7 @@ import {
3856
3864
  segmentLoaderData: ee,
3857
3865
  requestContext: O
3858
3866
  }
3859
- }) : null, j = b ? null : Vr({
3867
+ }) : null, j = b ? null : Hr({
3860
3868
  helpers: D,
3861
3869
  page: `src/pages/${d.route.file}`,
3862
3870
  pathname: u,
@@ -3880,16 +3888,16 @@ import {
3880
3888
  });
3881
3889
  let re = await g("readShell", ge), M = await g("transformShell", () => e.transformIndexHtml(c, re)), ie = ne.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), N = O.cookies["voltro:locale"] ?? "en", ae = Date.now();
3882
3890
  if (A) {
3883
- let e = (e) => Wr({
3891
+ let e = (e) => Gr({
3884
3892
  helpers: D,
3885
3893
  prepared: A,
3886
3894
  meta: e,
3887
3895
  interactive: k,
3888
3896
  extra: [ie]
3889
3897
  });
3890
- if (A.hasDeferred) $r({
3898
+ if (A.hasDeferred) ei({
3891
3899
  res: a,
3892
- shell: Zr({
3900
+ shell: Qr({
3893
3901
  shell: M,
3894
3902
  inlineModuleScriptsAsync: !0
3895
3903
  }),
@@ -3911,7 +3919,7 @@ import {
3911
3919
  }
3912
3920
  });
3913
3921
  else {
3914
- let t = Ur({
3922
+ let t = Wr({
3915
3923
  helpers: D,
3916
3924
  prepared: A
3917
3925
  }), n = M.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="${N}"`);
@@ -3932,9 +3940,9 @@ import {
3932
3940
  segmentLoaderData: j.segmentLoaderData,
3933
3941
  requestContext: O
3934
3942
  };
3935
- if (v === "ssr" && k === "full") $r({
3943
+ if (v === "ssr" && k === "full") ei({
3936
3944
  res: a,
3937
- shell: Zr({
3945
+ shell: Qr({
3938
3946
  shell: M,
3939
3947
  inlineModuleScriptsAsync: !0
3940
3948
  }),
@@ -3976,7 +3984,7 @@ import {
3976
3984
  phases: m
3977
3985
  });
3978
3986
  } catch (e) {
3979
- if (Br(e)) {
3987
+ if (Vr(e)) {
3980
3988
  Z.error("ssr-dev render refused", {
3981
3989
  pathname: u,
3982
3990
  pattern: d.route.pattern
@@ -3990,11 +3998,11 @@ import {
3990
3998
  }
3991
3999
  });
3992
4000
  }
3993
- }, L = Date.now(), ve = b.version ?? "?", ye = await ni(), be = r(t, "node_modules", "@voltro", "ui-shadcn"), R = y(r(be, "package.json")) ? be : null, xe = [], Se = await (async () => {
4001
+ }, L = Date.now(), ve = b.version ?? "?", ye = await ri(), be = r(t, "node_modules", "@voltro", "ui-shadcn"), R = y(r(be, "package.json")) ? be : null, xe = [], Se = await (async () => {
3994
4002
  let e = [];
3995
4003
  for (let n of s) {
3996
4004
  if (!n.proxyTarget) continue;
3997
- let i = await wi(t, n.pkg);
4005
+ let i = await Ti(t, n.pkg);
3998
4006
  if (i) try {
3999
4007
  e.push(await S.readFile(r(i, "rpcGroup.generated.ts"), "utf8"));
4000
4008
  } catch {}
@@ -4049,9 +4057,9 @@ import {
4049
4057
  include: [...s.map((e) => `${e.pkg}/rpcGroup`), ...xe],
4050
4058
  force: Se
4051
4059
  },
4052
- customLogger: Wt(),
4060
+ customLogger: Gt(),
4053
4061
  plugins: [
4054
- qn(r(t, "src", "pages")),
4062
+ Jn(r(t, "src", "pages")),
4055
4063
  x(),
4056
4064
  C(),
4057
4065
  ee,
@@ -4069,12 +4077,12 @@ import {
4069
4077
  host: !0,
4070
4078
  allowedHosts: n.allowedHosts === !0 || [...n.allowedHosts ?? []],
4071
4079
  proxy: F,
4072
- fs: { allow: [t, ...ci(t)] }
4080
+ fs: { allow: [t, ...li(t)] }
4073
4081
  },
4074
4082
  appType: "spa",
4075
4083
  cacheDir: r(w, ".vite"),
4076
4084
  publicDir: r(t, "public")
4077
- })).listen(), ei.info(`v${ve} ready in ${Date.now() - L}ms`, {
4085
+ })).listen(), ti.info(`v${ve} ready in ${Date.now() - L}ms`, {
4078
4086
  version: ve,
4079
4087
  bootMs: Date.now() - L
4080
4088
  }), Z.info(`listening on http://localhost:${u}`, {
@@ -4086,7 +4094,7 @@ import {
4086
4094
  target: e.proxyTarget
4087
4095
  }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
4088
4096
  try {
4089
- await mr({
4097
+ await hr({
4090
4098
  id: f,
4091
4099
  name: d,
4092
4100
  kind: "web",
@@ -4095,13 +4103,13 @@ import {
4095
4103
  status: "live",
4096
4104
  logFile: p.path
4097
4105
  });
4098
- let e = Or(t);
4106
+ let e = kr(t);
4099
4107
  if (e) {
4100
- let t = await Rr({ dashboardAppPath: e });
4108
+ let t = await zr({ dashboardAppPath: e });
4101
4109
  t.status === "launched" ? Z.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Z.debug(`dashboard already running on :${t.port}`, { port: t.port });
4102
4110
  }
4103
4111
  setInterval(() => {
4104
- mr({
4112
+ hr({
4105
4113
  id: f,
4106
4114
  name: d,
4107
4115
  kind: "web",
@@ -4112,7 +4120,7 @@ import {
4112
4120
  }).catch(() => {});
4113
4121
  }, 1e4).unref();
4114
4122
  let n = () => {
4115
- hr(f), p.dispose();
4123
+ gr(f), p.dispose();
4116
4124
  };
4117
4125
  process.on("SIGINT", n), process.on("SIGTERM", n);
4118
4126
  } catch (e) {
@@ -4124,24 +4132,24 @@ import {
4124
4132
  url: `http://localhost:${u}`,
4125
4133
  bootMs: Date.now() - L
4126
4134
  }), new Promise(() => {});
4127
- }, Bi = async (e) => {
4135
+ }, Vi = async (e) => {
4128
4136
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
4129
- let t = await Ri(e);
4137
+ let t = await zi(e);
4130
4138
  if (!t) return {
4131
4139
  ran: !1,
4132
4140
  exitCode: 0
4133
4141
  };
4134
4142
  let n = Date.now(), i = Z.child("serve");
4135
4143
  i.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
4136
- let a = await ki(e, t);
4144
+ let a = await Ai(e, t);
4137
4145
  for (let e of a) i.info("api wired", {
4138
4146
  name: e.name,
4139
4147
  pkg: e.pkg
4140
4148
  });
4141
- await Fi(e, t, a);
4149
+ await Ii(e, t, a);
4142
4150
  {
4143
4151
  let { pages: t } = await $(r(e, "src", "pages"));
4144
- await rn({
4152
+ await an({
4145
4153
  appRoot: e,
4146
4154
  pages: t
4147
4155
  });
@@ -4151,11 +4159,11 @@ import {
4151
4159
  root: l,
4152
4160
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
4153
4161
  plugins: [c()],
4154
- customLogger: Wt(),
4162
+ customLogger: Gt(),
4155
4163
  resolve: { dedupe: ["react", "react-dom"] },
4156
4164
  build: {
4157
4165
  outDir: "dist",
4158
- rollupOptions: { output: { manualChunks: di } }
4166
+ rollupOptions: { output: { manualChunks: fi } }
4159
4167
  },
4160
4168
  publicDir: r(e, "public")
4161
4169
  });
@@ -4175,14 +4183,14 @@ import {
4175
4183
  extras: f,
4176
4184
  bootMs: Date.now() - n
4177
4185
  }), new Promise(() => {});
4178
- }, Vi = 5e3, Hi = 6e4, Ui = (e, t) => {
4186
+ }, Hi = 5e3, Ui = 6e4, Wi = (e, t) => {
4179
4187
  if (e.length === 0) return 0;
4180
4188
  if (e.length === 1) return e[0];
4181
4189
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
4182
4190
  if (r === i) return e[r];
4183
4191
  let a = n - r;
4184
4192
  return e[r] * (1 - a) + e[i] * a;
4185
- }, Wi = (e) => {
4193
+ }, Gi = (e) => {
4186
4194
  if (e.length === 0) return {
4187
4195
  p50: 0,
4188
4196
  p95: 0,
@@ -4194,15 +4202,15 @@ import {
4194
4202
  let t = e.slice().sort((e, t) => e - t), n = 0;
4195
4203
  for (let e of t) n += e;
4196
4204
  return {
4197
- p50: Ui(t, .5),
4198
- p95: Ui(t, .95),
4199
- p99: Ui(t, .99),
4205
+ p50: Wi(t, .5),
4206
+ p95: Wi(t, .95),
4207
+ p99: Wi(t, .99),
4200
4208
  mean: n / t.length,
4201
4209
  min: t[0],
4202
4210
  max: t[t.length - 1]
4203
4211
  };
4204
- }, Gi = (e = {}) => {
4205
- let t = e.maxSamples ?? Vi, n = e.defaultWindowMs ?? Hi, r = [];
4212
+ }, Ki = (e = {}) => {
4213
+ let t = e.maxSamples ?? Hi, n = e.defaultWindowMs ?? Ui, r = [];
4206
4214
  return {
4207
4215
  record(e) {
4208
4216
  A(e), r.push({
@@ -4231,7 +4239,7 @@ import {
4231
4239
  tag: e.tag,
4232
4240
  count: e.samples.length,
4233
4241
  errorCount: n,
4234
- latencyMs: Wi(t)
4242
+ latencyMs: Gi(t)
4235
4243
  });
4236
4244
  }
4237
4245
  return c.sort((e, t) => t.count - e.count), {
@@ -4244,4 +4252,4 @@ import {
4244
4252
  };
4245
4253
  };
4246
4254
  //#endregion
4247
- export { Pt as $, hr as A, Ze as At, Cn as B, Rr as C, ot as Ct, wr as D, tt as Dt, Cr as E, it as Et, Zn as F, He as Ft, cn as G, mn as H, $n as I, ye as It, Gt as J, rn as K, Pn as L, be as Lt, Jn as M, Ke as Mt, er as N, We as Nt, gr as O, nt as Ot, Yn as P, Ve as Pt, Dt as Q, kn as R, Dr as S, at as St, Sr as T, rt as Tt, sn as U, gn as V, on as W, _t as X, V as Y, U as Z, Vr as _, H as _t, vi as a, vt as at, Wr as b, ut as bt, ki as c, Nt as ct, di as d, jt as dt, St as et, $ as f, kt as ft, Br as g, G as gt, $r as h, Tt as ht, Pi as i, Ct as it, mr as j, Xe as jt, pr as k, $e as kt, zi as l, Mt as lt, Zr as m, wt as mt, fi as n, xt as nt, _i as o, Et as ot, Fi as p, Ot as pt, qt as q, Ni as r, yt as rt, Ri as s, bt as st, Gi as t, Ft as tt, Bi as u, At as ut, Hr as v, pt as vt, Or as w, st as wt, kr as x, lt as xt, Ur as y, ft as yt, Tn as z };
4255
+ export { Ft as $, gr as A, $e as At, wn as B, zr as C, at as Ct, Tr as D, it as Dt, wr as E, rt as Et, Qn as F, Ve as Ft, ln as G, hn as H, er as I, He as It, Kt as J, an as K, Fn as L, ye as Lt, Yn as M, Xe as Mt, tr as N, Ke as Nt, _r as O, tt as Ot, Xn as P, We as Pt, Ot as Q, An as R, be as Rt, Or as S, lt as St, Cr as T, st as Tt, cn as U, _n as V, sn as W, vt as X, V as Y, U as Z, Hr as _, H as _t, yi as a, yt as at, Gr as b, ft as bt, Ai as c, Pt as ct, fi as d, Mt as dt, Ct as et, $ as f, At as ft, Vr as g, G as gt, ei as h, Et as ht, Fi as i, wt as it, hr as j, Ze as jt, mr as k, nt as kt, Bi as l, Nt as lt, Qr as m, Tt as mt, pi as n, St as nt, vi as o, Dt as ot, Ii as p, kt as pt, Jt as q, Pi as r, bt as rt, zi as s, xt as st, Ki as t, It as tt, Vi as u, jt as ut, Ur as v, mt as vt, kr as w, ot as wt, Ar as x, ut as xt, Wr as y, pt as yt, En as z };