@voltro/cli 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +513 -0
  2. package/THIRD-PARTY-NOTICES.md +88 -2
  3. package/dist/{apiBuild-D22_EpoR.js → apiBuild-BESZbTjA.js} +4 -4
  4. package/dist/apiBuild-C8d74T6g.js +2 -0
  5. package/dist/bin.js +3 -3
  6. package/dist/checkCommand-BPAtyWs8.js +2420 -0
  7. package/dist/checkCommand-DBvZvCh1.js +2 -0
  8. package/dist/cliRuntime-Oh517vCV.js +96 -0
  9. package/dist/{commands-jBX8no1I.js → commands-82BDEktg.js} +6476 -7672
  10. package/dist/dbCommand-CaIVTp-a.js +2 -0
  11. package/dist/{dbCommand-uuNCrFAb.js → dbCommand-bCBbk6tz.js} +3 -3
  12. package/dist/{dev-DcbIJrWg.js → dev-Cg4BKLmi.js} +3034 -2619
  13. package/dist/dev-DeEJj5T4.js +3 -0
  14. package/dist/fileConventions-Cof68_BL.js +33 -0
  15. package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-4Db40V23.js} +2 -2
  16. package/dist/frameworkTableAssembly-BTNirAAk.js +2 -0
  17. package/dist/index.js +1 -1
  18. package/dist/{inspect-CUCCzw2I.js → inspect-BMvQpwqy.js} +211 -190
  19. package/dist/inspect-DHeaMZak.js +2 -0
  20. package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-DHYygE4s.js} +999 -961
  21. package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-C4R1EdHn.js} +1 -1
  22. package/dist/manifestBuild-Ck_90gZy.js +2 -0
  23. package/dist/sdkgen-CW5NbYF0.js +582 -0
  24. package/dist/{seedRunner-D6eu-u5U.js → seedRunner-Bqxgp7HZ.js} +60 -59
  25. package/dist/serveCommand-BXl8mhZD.js +1489 -0
  26. package/dist/serveEntry.js +3 -3
  27. package/dist/{start-BGXIf6zT.js → start-CsCIaW4-.js} +282 -269
  28. package/dist/startEntry.js +2 -2
  29. package/package.json +17 -17
  30. package/templates/AGENTS.md +2 -1
  31. package/templates/agent-docs/_index.md +2 -1
  32. package/templates/agent-docs/_manifest.json +10 -1
  33. package/templates/agent-docs/ai.md +135 -0
  34. package/templates/agent-docs/cli.md +124 -6
  35. package/templates/agent-docs/configuration.md +32 -0
  36. package/templates/agent-docs/data.md +282 -0
  37. package/templates/agent-docs/database/migrations.md +47 -0
  38. package/templates/agent-docs/database/misc.md +57 -0
  39. package/templates/agent-docs/database/schema.md +3 -1
  40. package/templates/agent-docs/deployment.md +56 -0
  41. package/templates/agent-docs/internationalization.md +161 -1
  42. package/templates/agent-docs/local-first-mobile.md +414 -0
  43. package/templates/agent-docs/routing.md +93 -2
  44. package/templates/agent-docs/schema-driven-ui.md +12 -0
  45. package/templates/agent-docs/templates/apibackends.md +1 -1
  46. package/templates/agent-docs/testing.md +42 -0
  47. package/templates/agent-docs/whats-new.md +165 -131
  48. package/templates/agent-docs/workflows.md +11 -0
  49. package/templates/apps/api-ai/package.json +7 -7
  50. package/templates/apps/api-auth/package.json +8 -8
  51. package/templates/apps/api-backend/package.json +7 -7
  52. package/templates/apps/api-backend-deactivation/package.json +7 -7
  53. package/templates/apps/api-backend-mail/package.json +8 -8
  54. package/templates/apps/api-backend-mariadb/package.json +9 -9
  55. package/templates/apps/api-backend-sqlite/.env.example +19 -0
  56. package/templates/apps/api-backend-sqlite/README.md +38 -0
  57. package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
  58. package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
  59. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
  60. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
  61. package/templates/apps/api-backend-sqlite/package.json +30 -0
  62. package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
  63. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
  64. package/templates/apps/api-backend-sqlite/template.json +6 -0
  65. package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
  66. package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
  67. package/templates/apps/api-backend-storage/package.json +8 -8
  68. package/templates/apps/api-cms/README.md +104 -0
  69. package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
  70. package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
  71. package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
  72. package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
  73. package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
  74. package/templates/apps/api-cms/actions/me.action.ts +16 -0
  75. package/templates/apps/api-cms/app.config.ts +61 -0
  76. package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
  77. package/templates/apps/api-cms/content/index.ts +18 -0
  78. package/templates/apps/api-cms/content/page.contentType.ts +24 -0
  79. package/templates/apps/api-cms/database/schema.ts +64 -0
  80. package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
  81. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
  82. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
  83. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
  84. package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
  85. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
  86. package/templates/apps/api-cms/package.json +32 -0
  87. package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
  88. package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
  89. package/templates/apps/api-cms/template.json +6 -0
  90. package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
  91. package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
  92. package/templates/apps/api-cms/tsconfig.json +5 -0
  93. package/templates/apps/api-data-advanced/package.json +8 -8
  94. package/templates/apps/api-durable/package.json +8 -8
  95. package/templates/apps/api-feature-flags/package.json +9 -9
  96. package/templates/apps/api-governance/package.json +8 -8
  97. package/templates/apps/api-kv/package.json +8 -8
  98. package/templates/apps/api-moderation/package.json +8 -8
  99. package/templates/apps/api-observability/package.json +8 -8
  100. package/templates/apps/api-ratelimit/package.json +8 -8
  101. package/templates/apps/api-rbac/package.json +8 -8
  102. package/templates/apps/api-rest/package.json +7 -7
  103. package/templates/apps/api-saas/package.json +11 -11
  104. package/templates/apps/api-saas-starter/README.md +103 -0
  105. package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
  106. package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
  107. package/templates/apps/api-saas-starter/app.config.ts +87 -0
  108. package/templates/apps/api-saas-starter/database/schema.ts +57 -0
  109. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
  110. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
  111. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
  112. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
  113. package/templates/apps/api-saas-starter/package.json +32 -0
  114. package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
  115. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
  116. package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
  117. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
  118. package/templates/apps/api-saas-starter/template.json +6 -0
  119. package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
  120. package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
  121. package/templates/apps/api-saas-starter/tsconfig.json +5 -0
  122. package/templates/apps/api-search/package.json +8 -8
  123. package/templates/apps/api-status/README.md +88 -0
  124. package/templates/apps/api-status/app.config.ts +36 -0
  125. package/templates/apps/api-status/authz.ts +33 -0
  126. package/templates/apps/api-status/database/schema.ts +70 -0
  127. package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
  128. package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
  129. package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
  130. package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
  131. package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
  132. package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
  133. package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
  134. package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
  135. package/templates/apps/api-status/package.json +30 -0
  136. package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
  137. package/templates/apps/api-status/queries/components.list.query.ts +13 -0
  138. package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
  139. package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
  140. package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
  141. package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
  142. package/templates/apps/api-status/template.json +6 -0
  143. package/templates/apps/api-status/tests/status.test.ts +70 -0
  144. package/templates/apps/api-status/tsconfig.json +5 -0
  145. package/templates/apps/api-versioning/package.json +8 -8
  146. package/templates/apps/api-webhooks/package.json +9 -9
  147. package/templates/apps/changelog/package.json +6 -6
  148. package/templates/apps/edge-functions/package.json +2 -2
  149. package/templates/apps/frontend-admin/package.json +8 -8
  150. package/templates/apps/frontend-app/package.json +8 -8
  151. package/templates/apps/frontend-auth/README.md +78 -0
  152. package/templates/apps/frontend-auth/app.config.ts +34 -0
  153. package/templates/apps/frontend-auth/package.json +32 -0
  154. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
  155. package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
  156. package/templates/apps/frontend-auth/src/config.ts +11 -0
  157. package/templates/apps/frontend-auth/src/globals.css +105 -0
  158. package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
  159. package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
  160. package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
  161. package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
  162. package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
  163. package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
  164. package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
  165. package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
  166. package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
  167. package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
  168. package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
  169. package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
  170. package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
  171. package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
  172. package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
  173. package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
  174. package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
  175. package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
  176. package/templates/apps/frontend-auth/template.json +6 -0
  177. package/templates/apps/frontend-auth/tsconfig.json +5 -0
  178. package/templates/apps/frontend-blank/package.json +7 -7
  179. package/templates/apps/frontend-cms/README.md +47 -0
  180. package/templates/apps/frontend-cms/app.config.ts +37 -0
  181. package/templates/apps/frontend-cms/package.json +33 -0
  182. package/templates/apps/frontend-cms/src/config.ts +8 -0
  183. package/templates/apps/frontend-cms/src/globals.css +105 -0
  184. package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
  185. package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
  186. package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
  187. package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
  188. package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
  189. package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
  190. package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
  191. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
  192. package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
  193. package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
  194. package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
  195. package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
  196. package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
  197. package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
  198. package/templates/apps/frontend-cms/template.json +6 -0
  199. package/templates/apps/frontend-cms/tsconfig.json +5 -0
  200. package/templates/apps/frontend-contact/package.json +7 -7
  201. package/templates/apps/frontend-dashboard/package.json +7 -7
  202. package/templates/apps/frontend-docs/package.json +7 -7
  203. package/templates/apps/frontend-i18n/package.json +6 -6
  204. package/templates/apps/frontend-landing/package.json +7 -7
  205. package/templates/apps/frontend-portal/README.md +71 -0
  206. package/templates/apps/frontend-portal/app.config.ts +37 -0
  207. package/templates/apps/frontend-portal/package.json +32 -0
  208. package/templates/apps/frontend-portal/src/config.ts +8 -0
  209. package/templates/apps/frontend-portal/src/globals.css +93 -0
  210. package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
  211. package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
  212. package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
  213. package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
  214. package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
  215. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
  216. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
  217. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
  218. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
  219. package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
  220. package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
  221. package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
  222. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
  223. package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
  224. package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
  225. package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
  226. package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
  227. package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
  228. package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
  229. package/templates/apps/frontend-portal/template.json +6 -0
  230. package/templates/apps/frontend-portal/tsconfig.json +5 -0
  231. package/templates/apps/frontend-saas/README.md +73 -0
  232. package/templates/apps/frontend-saas/app.config.ts +46 -0
  233. package/templates/apps/frontend-saas/package.json +32 -0
  234. package/templates/apps/frontend-saas/src/config.ts +8 -0
  235. package/templates/apps/frontend-saas/src/globals.css +85 -0
  236. package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
  237. package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
  238. package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
  239. package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
  240. package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
  241. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
  242. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
  243. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
  244. package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
  245. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
  246. package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
  247. package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
  248. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
  249. package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
  250. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
  251. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
  252. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
  253. package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
  254. package/templates/apps/frontend-saas/template.json +6 -0
  255. package/templates/apps/frontend-saas/tsconfig.json +5 -0
  256. package/templates/apps/frontend-spa/package.json +7 -7
  257. package/templates/apps/frontend-ssr/package.json +7 -7
  258. package/templates/apps/frontend-ssr-api/package.json +8 -8
  259. package/templates/apps/frontend-static-blog/package.json +6 -6
  260. package/templates/apps/frontend-status/README.md +51 -0
  261. package/templates/apps/frontend-status/app.config.ts +39 -0
  262. package/templates/apps/frontend-status/package.json +32 -0
  263. package/templates/apps/frontend-status/src/config.ts +7 -0
  264. package/templates/apps/frontend-status/src/globals.css +70 -0
  265. package/templates/apps/frontend-status/src/globals.d.ts +6 -0
  266. package/templates/apps/frontend-status/src/lib/status.ts +81 -0
  267. package/templates/apps/frontend-status/src/locales/de.ts +41 -0
  268. package/templates/apps/frontend-status/src/locales/en.ts +45 -0
  269. package/templates/apps/frontend-status/src/locales/index.ts +13 -0
  270. package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
  271. package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
  272. package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
  273. package/templates/apps/frontend-status/template.json +6 -0
  274. package/templates/apps/frontend-status/tsconfig.json +11 -0
  275. package/templates/baselines/compose/docker-compose.prod.yml +15 -0
  276. package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
  277. package/dist/apiBuild-BrjrVJJh.js +0 -2
  278. package/dist/dbCommand-DrzXimKf.js +0 -2
  279. package/dist/dev-DNkso403.js +0 -3
  280. package/dist/fileConventions-3bffWssN.js +0 -30
  281. package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
  282. package/dist/inspect-gt8bq-Tz.js +0 -2
  283. package/dist/manifestBuild-ifczArzr.js +0 -2
  284. package/dist/serveCommand-DfkisVWP.js +0 -1310
@@ -1,12 +1,12 @@
1
- import { $ as e, D as t, F as n, G as r, H as i, J as a, K as o, M as s, T as c, U as l, W as u, Y as d, _ as ee, a as te, b as f, c as p, dt as m, et as h, f as g, ft as _, g as ne, h as v, i as re, lt as y, m as b, mt as x, nt as ie, o as S, ot as C, p as w, pt as ae, r as T, rt as E, s as D, t as O, tt as k, v as A, w as j, x as M, y as oe, z as se } from "./inspectMetrics-BU90mvJN.js";
2
- import { D as ce, E as le, T as ue, a as de, p as N, w as P } from "./inspect-CUCCzw2I.js";
1
+ import { B as e, E as t, G as n, I as r, K as i, N as a, O as o, Q as s, S as c, T as l, U as u, W as ee, Z as d, _ as te, _t as f, a as p, at as m, b as h, c as g, f as _, ft as v, g as y, gt as b, h as x, ht as ne, i as re, it as ie, lt as ae, m as S, mt as C, nt as oe, o as se, ot as w, p as T, q as E, r as D, rt as O, s as k, t as A, v as j, x as ce, y as M } from "./inspectMetrics-DHYygE4s.js";
2
+ import { D as le, E as ue, O as N, a as de, p as P, w as F } from "./inspect-BMvQpwqy.js";
3
3
  import { t as fe } from "./bootTiming-BdyP9nYw.js";
4
- import { dirname as F, extname as I, join as L, resolve as R } from "node:path";
4
+ import { dirname as I, extname as pe, join as L, resolve as R } from "node:path";
5
5
  import { fileURLToPath as z, pathToFileURL as B } from "node:url";
6
- import { createLogger as V, printReadyBlock as pe } from "@voltro/logger";
6
+ import { createLogger as V, printReadyBlock as me } from "@voltro/logger";
7
7
  import { promises as H } from "node:fs";
8
- import { snapshotMetricsSync as me } from "@voltro/runtime";
9
- import { createServer as he } from "node:http";
8
+ import { snapshotMetricsSync as he } from "@voltro/runtime";
9
+ import { createServer as ge } from "node:http";
10
10
  //#region src/isrCdcInvalidator.ts
11
11
  var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
12
12
  let n = 0;
@@ -25,7 +25,7 @@ var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
25
25
  user: process.env.PG_USER ?? "app",
26
26
  password: process.env.PG_PASSWORD ?? "app",
27
27
  database: process.env.PG_DATABASE ?? "app"
28
- }, ge = (e) => {
28
+ }, _e = (e) => {
29
29
  let t = e.channel ?? "framework_changes", n = W(e), r = null, i = null;
30
30
  return {
31
31
  start: async () => {
@@ -69,7 +69,7 @@ var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
69
69
  }
70
70
  }
71
71
  };
72
- }, K = V({ scope: "voltro:start:isr-cache" }), _e = "voltro_isr_cache", q = (e) => `
72
+ }, K = V({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", ve = (e) => `
73
73
  CREATE TABLE IF NOT EXISTS ${e} (
74
74
  cache_key TEXT PRIMARY KEY,
75
75
  html TEXT NOT NULL,
@@ -80,9 +80,9 @@ CREATE TABLE IF NOT EXISTS ${e} (
80
80
  stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
81
81
  );
82
82
  CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
83
- `, ve = (e) => {
84
- let t = e.tableName ?? _e, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
85
- i || (i = !0, await n.query(q(t)));
83
+ `, ye = (e) => {
84
+ let t = e.tableName ?? q, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
85
+ i || (i = !0, await n.query(ve(t)));
86
86
  })().then(async () => {
87
87
  let e = await n.query(`SELECT * FROM ${t}`);
88
88
  for (let t of e.rows) r.set(t.cache_key, {
@@ -142,14 +142,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
142
142
  return Array.from(r.entries());
143
143
  }
144
144
  };
145
- }, J = V({ scope: "voltro:start" }), ye = await (async () => {
145
+ }, J = V({ scope: "voltro:start" }), be = await (async () => {
146
146
  try {
147
- let e = L(F(z(import.meta.url)), "..", "package.json"), t = await H.readFile(e, "utf8");
147
+ let e = L(I(z(import.meta.url)), "..", "package.json"), t = await H.readFile(e, "utf8");
148
148
  return JSON.parse(t).version ?? "0.0.0";
149
149
  } catch {
150
150
  return "0.0.0";
151
151
  }
152
- })(), be = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", Y = (e) => e instanceof Error && e._voltroControl === "not-found", X = {
152
+ })(), Y = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", X = (e) => e instanceof Error && e._voltroControl === "not-found", Z = {
153
153
  ".html": "text/html; charset=utf-8",
154
154
  ".js": "application/javascript",
155
155
  ".mjs": "application/javascript",
@@ -167,13 +167,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
167
167
  ".woff": "font/woff",
168
168
  ".woff2": "font/woff2",
169
169
  ".txt": "text/plain; charset=utf-8"
170
- }, xe = (e) => X[I(e).toLowerCase()] ?? "application/octet-stream", Z = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Q = async (e) => {
170
+ }, xe = (e) => Z[pe(e).toLowerCase()] ?? "application/octet-stream", Se = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Q = async (e) => {
171
171
  try {
172
172
  return await H.stat(e), !0;
173
173
  } catch {
174
174
  return !1;
175
175
  }
176
- }, Se = (e) => {
176
+ }, Ce = (e) => {
177
177
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
178
178
  for (let e of r) e.startsWith("[[...") && e.endsWith("]]") ? (i.push("(.*)"), t.push(e.slice(5, -2)), n += 2) : e.startsWith("[...") && e.endsWith("]") ? (i.push("(.+)"), t.push(e.slice(4, -1)), n += 3) : e.startsWith("[") && e.endsWith("]") ? (i.push("([^/]+)"), t.push(e.slice(1, -1)), n += 1) : i.push(e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
179
179
  let a = i.join("/");
@@ -182,8 +182,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
182
182
  paramNames: t,
183
183
  priority: n
184
184
  };
185
- }, Ce = (e) => e.map((e) => {
186
- let { regex: t, paramNames: n, priority: r } = Se(e.pattern);
185
+ }, we = (e) => e.map((e) => {
186
+ let { regex: t, paramNames: n, priority: r } = Ce(e.pattern);
187
187
  return {
188
188
  pattern: e.pattern,
189
189
  file: e.file,
@@ -192,7 +192,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
192
192
  paramNames: n,
193
193
  priority: r
194
194
  };
195
- }).slice().sort((e, t) => e.priority - t.priority), we = (e, t) => {
195
+ }).slice().sort((e, t) => e.priority - t.priority), Te = (e, t) => {
196
196
  for (let n of t) {
197
197
  let t = n.regex.exec(e);
198
198
  if (!t) continue;
@@ -204,92 +204,105 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
204
204
  };
205
205
  }
206
206
  return null;
207
- }, Te = async (e) => {
208
- let { provider: t, route: r, params: i, pathname: a, dirs: o, shellTemplate: s, requestHeaders: c, requestUrl: l = "", apiOrigin: u, apiName: d } = e, { search: p } = M(l), m = re(u, c.cookie, { apiName: d }), h = await t.getPage(r.pattern, r.file), g = n(h, r.file), _ = g === "spa" && S(o, r.dirChain).some((e) => e.hasLayout);
207
+ }, Ee = async (e) => {
208
+ let { provider: t, route: n, params: i, pathname: a, dirs: o, shellTemplate: s, requestHeaders: l, requestUrl: u = "", apiOrigin: ee, apiName: d } = e, { search: te } = c(u), f = re(ee, l.cookie, { apiName: d }), m = await t.getPage(n.pattern, n.file), g = r(m, n.file), _ = g === "spa" && se(o, n.dirChain).some((e) => e.hasLayout);
209
209
  if (g !== "ssr" && g !== "isr" && !_) return null;
210
- let ne = S(o, r.dirChain), y = {}, x = null, ie, C = new AbortController();
210
+ let v = se(o, n.dirChain), b = {}, ne = null, ie, ae = new AbortController();
211
211
  try {
212
- (await t.getHelpers()).beginStoreSeeds(), {chain: ie, segmentLoaderData: y} = await te({
213
- entries: ne,
212
+ (await t.getHelpers()).beginStoreSeeds(), {chain: ie, segmentLoaderData: b} = await p({
213
+ entries: v,
214
214
  loadLayout: (e) => t.getLayout(e.dir),
215
215
  loadError: (e) => t.getError(e.dir),
216
216
  loadPending: (e) => t.getPending(e.dir),
217
217
  ctx: {
218
218
  params: i,
219
219
  pathname: a,
220
- search: p,
221
- signal: C.signal,
222
- headers: c,
223
- query: m
220
+ search: te,
221
+ signal: ae.signal,
222
+ headers: l,
223
+ query: f
224
224
  }
225
- }), typeof h.loader == "function" && !_ && (x = await h.loader({
225
+ }), typeof m.loader == "function" && !_ && (ne = await m.loader({
226
226
  params: i,
227
227
  pathname: a,
228
- search: p,
229
- signal: C.signal,
230
- headers: c,
231
- query: m
228
+ search: te,
229
+ signal: ae.signal,
230
+ headers: l,
231
+ query: f
232
232
  }));
233
233
  } catch (e) {
234
- if (be(e)) return {
234
+ if (Y(e)) return {
235
235
  control: "redirect",
236
236
  status: e.status,
237
237
  location: e.location
238
238
  };
239
- if (Y(e)) return { control: "not-found" };
239
+ if (X(e)) return { control: "not-found" };
240
240
  throw e;
241
241
  }
242
- let w = await t.getHelpers(), ae = {
243
- pattern: r.pattern,
244
- Component: h.default,
245
- meta: h.meta,
246
- loader: h.loader,
247
- ErrorBoundary: h.ErrorBoundary,
248
- Pending: h.Pending,
242
+ let C = await t.getHelpers();
243
+ _ || await S({
244
+ pageMod: m,
245
+ params: i,
246
+ query: f,
247
+ apiName: d,
248
+ seed: C.seedPreloadedSubscription,
249
+ onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
250
+ tag: e,
251
+ apiName: t,
252
+ pathname: a
253
+ }, n)
254
+ });
255
+ let oe = {
256
+ pattern: n.pattern,
257
+ Component: m.default,
258
+ meta: m.meta,
259
+ loader: m.loader,
260
+ ErrorBoundary: m.ErrorBoundary,
261
+ Pending: m.Pending,
249
262
  renderMode: g,
250
263
  chain: ie
251
264
  }, T = {
252
- cookies: w.parseCookieHeader(c.cookie),
253
- headers: c,
254
- url: l
255
- }, D = w.i18n?.resolve(c.cookie, c["accept-language"]), O = h.interactive ?? "full";
265
+ cookies: C.parseCookieHeader(l.cookie),
266
+ headers: l,
267
+ url: u
268
+ }, E = C.i18n?.resolve(l.cookie, l["accept-language"]), D = m.interactive ?? "full";
256
269
  if (_) {
257
- let e = A({
258
- helpers: w,
259
- page: r.pattern,
260
- interactive: O,
270
+ let e = M({
271
+ helpers: C,
272
+ page: n.pattern,
273
+ interactive: D,
261
274
  delivery: "stream",
262
275
  renderInput: {
263
- descriptor: ae,
276
+ descriptor: oe,
264
277
  params: i,
265
278
  pathname: a,
266
- segmentLoaderData: y,
279
+ segmentLoaderData: b,
267
280
  requestContext: T,
268
- ...D ? {
269
- outerWrap: D.outerWrap,
270
- locale: D.locale
281
+ ...E ? {
282
+ outerWrap: E.outerWrap,
283
+ locale: E.locale
271
284
  } : {}
272
285
  }
273
- }), t = D?.locale ?? T.cookies["voltro:lang"] ?? "en", n = (t) => f({
274
- helpers: w,
286
+ }), t = E?.locale ?? T.cookies["voltro:lang"] ?? "en", r = (t) => ce({
287
+ helpers: C,
275
288
  prepared: e,
276
289
  meta: t,
277
- interactive: O
290
+ interactive: D
278
291
  });
279
292
  if (e.hasDeferred) {
280
- let r = b({ shell: s });
293
+ let n = x({ shell: s });
281
294
  return {
282
295
  renderMode: "spa",
283
- stream: (i) => v({
296
+ stream: (i) => y({
284
297
  res: i,
285
- shell: r,
298
+ shell: n,
286
299
  htmlLang: t,
287
300
  headers: {
288
301
  "content-type": "text/html; charset=utf-8",
289
302
  "x-voltro-rendered-by": "spa"
290
303
  },
291
- headInjection: n,
292
- render: (t) => w.renderPageToStream({
304
+ headInjection: r,
305
+ render: (t) => C.renderPageToStream({
293
306
  ...e.renderInput,
294
307
  ...t
295
308
  }),
@@ -299,47 +312,47 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
299
312
  })
300
313
  };
301
314
  }
302
- let o = oe({
303
- helpers: w,
315
+ let o = h({
316
+ helpers: C,
304
317
  prepared: e
305
318
  });
306
319
  return {
307
- html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${n(o.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
320
+ html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${r(o.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
308
321
  renderMode: "spa",
309
322
  revalidateMs: null
310
323
  };
311
324
  }
312
- let k = ee({
313
- helpers: w,
314
- page: r.pattern,
325
+ let O = j({
326
+ helpers: C,
327
+ page: n.pattern,
315
328
  pathname: a,
316
329
  renderMode: g,
317
- interactive: O,
318
- loaderData: x,
319
- segmentLoaderData: y,
320
- pageLoaderRan: typeof h.loader == "function"
321
- }), j = {
322
- descriptor: ae,
330
+ interactive: D,
331
+ loaderData: ne,
332
+ segmentLoaderData: b,
333
+ pageLoaderRan: typeof m.loader == "function"
334
+ }), k = {
335
+ descriptor: oe,
323
336
  params: i,
324
337
  pathname: a,
325
- loaderData: k.loaderData,
326
- segmentLoaderData: k.segmentLoaderData,
338
+ loaderData: O.loaderData,
339
+ segmentLoaderData: O.segmentLoaderData,
327
340
  requestContext: T,
328
- ...D ? {
329
- outerWrap: D.outerWrap,
330
- locale: D.locale
341
+ ...E ? {
342
+ outerWrap: E.outerWrap,
343
+ locale: E.locale
331
344
  } : {}
332
- }, se = (e) => [
333
- w.renderMetaToHtml(e),
334
- `<meta name="voltro-interactive" content="${O}" />`,
335
- ...k.hasDeferred ? [w.renderDeferredRegistryScript()] : [],
336
- w.renderRouterStateScript(k.stateInput)
345
+ }, A = (e) => [
346
+ C.renderMetaToHtml(e),
347
+ `<meta name="voltro-interactive" content="${D}" />`,
348
+ ...O.hasDeferred ? [C.renderDeferredRegistryScript()] : [],
349
+ C.renderRouterStateScript(O.stateInput)
337
350
  ].filter((e) => e.length > 0).join("\n ");
338
- if (g === "ssr" && O === "full" && e.buffered !== !0) {
339
- let e = D?.locale ?? T.cookies["voltro:lang"] ?? "en", t = b({ shell: s });
351
+ if (g === "ssr" && D === "full" && e.buffered !== !0) {
352
+ let e = E?.locale ?? T.cookies["voltro:lang"] ?? "en", t = x({ shell: s });
340
353
  return {
341
354
  renderMode: "ssr",
342
- stream: (n) => v({
355
+ stream: (n) => y({
343
356
  res: n,
344
357
  shell: t,
345
358
  htmlLang: e,
@@ -347,9 +360,9 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
347
360
  "content-type": "text/html; charset=utf-8",
348
361
  "x-voltro-rendered-by": "ssr"
349
362
  },
350
- headInjection: se,
351
- render: (e) => w.renderPageToStream({
352
- ...j,
363
+ headInjection: A,
364
+ render: (e) => C.renderPageToStream({
365
+ ...k,
353
366
  ...e
354
367
  }),
355
368
  onShellError: (e) => {
@@ -358,15 +371,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
358
371
  })
359
372
  };
360
373
  }
361
- let { html: ce, meta: le } = w.renderPageToHtml(j), ue = se(le), de = D?.locale ?? T.cookies["voltro:lang"] ?? "en", N = s.replace("<div id=\"root\"></div>", `<div id="root">${ce}</div>`).replace("</head>", ` ${ue}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${de}"`);
362
- O === "none" && (N = Z(N));
363
- let P = g === "isr" ? E(h.revalidate) : null;
374
+ let { html: le, meta: ue } = C.renderPageToHtml(k), N = A(ue), de = E?.locale ?? T.cookies["voltro:lang"] ?? "en", P = s.replace("<div id=\"root\"></div>", `<div id="root">${le}</div>`).replace("</head>", ` ${N}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${de}"`);
375
+ D === "none" && (P = Se(P));
376
+ let F = g === "isr" ? w(m.revalidate) : null;
364
377
  return {
365
- html: N,
378
+ html: P,
366
379
  renderMode: g,
367
- revalidateMs: P
380
+ revalidateMs: F
368
381
  };
369
- }, $ = (e) => e === "" ? "/" : e, Ee = async (e) => {
382
+ }, $ = (e) => e === "" ? "/" : e, De = async (e) => {
370
383
  let t = await import(B(e).href);
371
384
  return {
372
385
  kind: "bundle",
@@ -396,8 +409,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
396
409
  },
397
410
  async close() {}
398
411
  };
399
- }, De = async (e, t) => {
400
- let n = await y("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, o = await n.createServer({
412
+ }, Oe = async (e, t) => {
413
+ let n = await v("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
401
414
  root: t,
402
415
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
403
416
  plugins: [r(), i()],
@@ -409,19 +422,19 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
409
422
  },
410
423
  appType: "custom",
411
424
  logLevel: "warn"
412
- }), s = L(e, "src", "pages"), c = (e) => e === "" ? s : L(s, e), l = a({
413
- limit: d(),
425
+ }), o = L(e, "src", "pages"), c = (e) => e === "" ? o : L(o, e), l = d({
426
+ limit: s(),
414
427
  onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
415
428
  onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
416
429
  id: e,
417
430
  ms: t,
418
431
  ...n ? { failed: !0 } : {}
419
432
  })
420
- }), u = (e) => l.load(e, async () => await o.ssrLoadModule(e));
433
+ }), u = (e) => l.load(e, async () => await a.ssrLoadModule(e));
421
434
  return {
422
435
  kind: "middleware",
423
436
  async getPage(e, t) {
424
- return u(L(s, t));
437
+ return u(L(o, t));
425
438
  },
426
439
  async getLayout(e) {
427
440
  return u(L(c(e), "layout.tsx"));
@@ -436,78 +449,78 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
436
449
  return await u("@voltro/web/ssr");
437
450
  },
438
451
  async close() {
439
- await o.close();
452
+ await a.close();
440
453
  }
441
454
  };
442
- }, Oe = async (n) => {
443
- let a = fe(), d = await D(n);
444
- if (!d) return {
455
+ }, ke = async (r) => {
456
+ let s = fe(), c = await k(r);
457
+ if (!c) return {
445
458
  ran: !1,
446
459
  exitCode: 0
447
460
  };
448
- if (d.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
461
+ if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
449
462
  ran: !0,
450
463
  exitCode: 1
451
464
  };
452
- let { resolved: ee } = await C({
453
- rawEnv: d.env,
465
+ let { resolved: d } = await ae({
466
+ rawEnv: c.env,
454
467
  appType: "web",
455
- root: n,
468
+ root: r,
456
469
  log: J,
457
470
  generateTypes: !1
458
- }), te = ee.publicValues;
459
- a.mark("config");
460
- let f = r();
461
- i(f), J.info("booting voltro start", { app: d.name ?? "(unnamed)" });
471
+ }), p = d.publicValues;
472
+ s.mark("config");
473
+ let h = i();
474
+ u(h), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
462
475
  let v = (() => {
463
476
  if (process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT) return Number(process.env.VOLTRO_DASHBOARD_PORT);
464
477
  if (process.env.PORT) {
465
478
  let e = Number(process.env.PORT);
466
479
  if (Number.isFinite(e) && e > 0) return e;
467
480
  }
468
- return d.port ?? 5173;
469
- })(), re = L(n, ".framework"), y = L(re, "dist"), b = L(y, "index.html");
470
- if (!await Q(b)) return J.error("no built dist found — run `voltro build` first", { distDir: y }), {
481
+ return c.port ?? 5173;
482
+ })(), y = L(r, ".framework"), x = L(y, "dist"), re = L(x, "index.html");
483
+ if (!await Q(re)) return J.error("no built dist found — run `voltro build` first", { distDir: x }), {
471
484
  ran: !0,
472
485
  exitCode: 1
473
486
  };
474
- let E = d.name ?? "unnamed", A = m("web", E, v), M = t(E);
475
- await x({
476
- id: A,
477
- name: E,
487
+ let S = c.name ?? "unnamed", w = C("web", S, v), j = o(S);
488
+ await f({
489
+ id: w,
490
+ name: S,
478
491
  kind: "web",
479
492
  url: `http://localhost:${v}`,
480
493
  pid: process.pid,
481
494
  status: "booting",
482
- logFile: M.path
495
+ logFile: j.path
483
496
  }).catch(() => {});
484
- let oe = L(y, "_voltro", "shell.html"), F = await Q(oe) ? await H.readFile(oe, "utf8") : await H.readFile(b, "utf8"), I = await p(n, d), R = T(I[0]), z = I[0]?.name, B, V = null;
485
- process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (V = new (await (import("pg"))).default.Client({
497
+ let ce = L(x, "_voltro", "shell.html"), M = await Q(ce) ? await H.readFile(ce, "utf8") : await H.readFile(re, "utf8"), I = await g(r, c), pe = D(I[0]), R = I[0]?.name, z, B = null;
498
+ process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (B = new (await (import("pg"))).default.Client({
486
499
  host: process.env.PG_HOST,
487
500
  port: Number(process.env.PG_PORT ?? 5432),
488
501
  user: process.env.PG_USER ?? "app",
489
502
  password: process.env.PG_PASSWORD ?? "app",
490
503
  database: process.env.PG_DATABASE ?? "app"
491
- }), await V.connect(), B = ve({ client: V }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (B = ie(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await w(n, d, I, te);
492
- let { pages: U, dirs: W } = await g(L(n, "src", "pages")), G = Ce(U);
493
- a.mark("scan");
494
- let K = L(y, "server", "ssrEntry.js"), _e = await Q(K);
495
- if (!_e && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${K} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${K}`);
496
- let q = _e ? await Ee(K) : await De(n, re);
504
+ }), await B.connect(), z = ye({ client: B }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = m(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await T(r, c, I, p);
505
+ let { pages: V, dirs: U } = await _(L(r, "src", "pages")), W = we(V);
506
+ s.mark("scan");
507
+ let G = L(x, "server", "ssrEntry.js"), K = await Q(G);
508
+ if (!K && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${G} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${G}`);
509
+ let q = K ? await De(G) : await Oe(r, y);
497
510
  J.info(`ssr loader: ${q.kind}`, {
498
511
  kind: q.kind,
499
512
  ...q.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
500
- }), a.mark("provider");
501
- let be = q.getPageMeta?.(), Y = /* @__PURE__ */ new Map(), X = 0;
502
- for (let e of U) {
503
- let t = be?.[e.pattern];
513
+ }), s.mark("provider");
514
+ let ve = q.getPageMeta?.(), Y = /* @__PURE__ */ new Map(), X = 0;
515
+ for (let e of V) {
516
+ let t = ve?.[e.pattern];
504
517
  if (t) {
505
518
  Y.set(e.pattern, t);
506
519
  continue;
507
520
  }
508
521
  try {
509
522
  let t = await q.getPage(e.pattern, e.file);
510
- Y.set(e.pattern, s(t, e.file)), X++;
523
+ Y.set(e.pattern, a(t, e.file)), X++;
511
524
  } catch (t) {
512
525
  J.warn("failed to load page metadata", { pattern: e.pattern }, t);
513
526
  }
@@ -516,21 +529,21 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
516
529
  count: Y.size,
517
530
  fromManifest: Y.size - X,
518
531
  fromModules: X
519
- }), a.mark("routes");
532
+ }), s.mark("routes");
520
533
  let Z = /* @__PURE__ */ new Set();
521
- for (let e of G) Y.get(e.pattern)?.renderMode === "spa" && S(W, e.dirChain).some((e) => e.hasLayout) && Z.add(e.pattern);
534
+ for (let e of W) Y.get(e.pattern)?.renderMode === "spa" && se(U, e.dirChain).some((e) => e.hasLayout) && Z.add(e.pattern);
522
535
  Z.size > 0 && J.info(`${Z.size} spa route(s) render an SSR layout shell`, { patterns: [...Z] });
523
536
  let Se = /* @__PURE__ */ new Map();
524
537
  for (let [e, t] of Y) t.cacheInvalidatesOn.length > 0 && Se.set(e, t.cacheInvalidatesOn);
525
- let $ = /* @__PURE__ */ new Map();
526
- for (let e of G) $.set(e.pattern, e.regex);
527
- let Oe = ge({
528
- cache: B,
538
+ let Ce = /* @__PURE__ */ new Map();
539
+ for (let e of W) Ce.set(e.pattern, e.regex);
540
+ let $ = _e({
541
+ cache: z,
529
542
  tableSubscriptionsByPattern: Se,
530
- regexByPattern: $
543
+ regexByPattern: Ce
531
544
  });
532
- await Oe.start(), a.mark("cdc");
533
- let ke = O(), Ae = U.map((e) => {
545
+ await $.start(), s.mark("cdc");
546
+ let ke = A(), Ae = V.map((e) => {
534
547
  let t = Y.get(e.pattern);
535
548
  return {
536
549
  pattern: e.pattern,
@@ -546,20 +559,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
546
559
  hasMeta: t?.hasMeta ?? !1,
547
560
  hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
548
561
  };
549
- }), je = W.map((e) => ({
562
+ }), je = U.map((e) => ({
550
563
  dir: e.dir,
551
564
  hasLayout: e.hasLayout,
552
565
  hasError: e.hasError,
553
566
  hasPending: e.hasPending,
554
567
  hasNotFound: e.hasNotFound
555
- })), Me = V ? "postgres" : "memory", Ne = {
568
+ })), Me = B ? "postgres" : "memory", Ne = {
556
569
  kind: "web",
557
570
  meta: {
558
- name: d.name ?? "(unnamed)",
559
- voltroVersion: ye,
571
+ name: c.name ?? "(unnamed)",
572
+ voltroVersion: be,
560
573
  port: v,
561
574
  mode: "start",
562
- apis: Object.entries(d.apis ?? {}).map(([e, t]) => {
575
+ apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
563
576
  let n = {
564
577
  name: e,
565
578
  package: t.package
@@ -570,7 +583,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
570
583
  routes: Ae,
571
584
  dirs: je,
572
585
  cache: () => {
573
- let e = Date.now(), t = B.snapshot().map(([t, n]) => ({
586
+ let e = Date.now(), t = z.snapshot().map(([t, n]) => ({
574
587
  key: t,
575
588
  renderedAt: n.renderedAt,
576
589
  expiresAt: n.expiresAt,
@@ -582,15 +595,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
582
595
  }));
583
596
  return {
584
597
  backend: Me,
585
- size: B.size(),
598
+ size: z.size(),
586
599
  entries: t
587
600
  };
588
601
  },
589
- metrics: () => me()
590
- }, Pe = async (t, r) => {
602
+ metrics: () => he()
603
+ }, Pe = async (t, n) => {
591
604
  let i = t.split("?")[0] ?? "/";
592
- if (d.name === "voltroDashboard" && i === "/api/dashboard/registry") try {
593
- let e = await _();
605
+ if (c.name === "voltroDashboard" && i === "/api/dashboard/registry") try {
606
+ let e = await ne();
594
607
  return {
595
608
  status: 200,
596
609
  headers: { "content-type": "application/json; charset=utf-8" },
@@ -603,7 +616,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
603
616
  body: `registry read error: ${e.message}`
604
617
  };
605
618
  }
606
- if (d.name === "voltroDashboard" && i === "/api/dashboard/config") {
619
+ if (c.name === "voltroDashboard" && i === "/api/dashboard/config") {
607
620
  let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
608
621
  if (e && e.trim().length > 0) {
609
622
  let n;
@@ -633,18 +646,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
633
646
  };
634
647
  }
635
648
  if (i === "/_voltro/inspect/logs") {
636
- let e = se(t, l(), r);
649
+ let r = e(t, ee(), n);
637
650
  return {
638
- status: e.status,
651
+ status: r.status,
639
652
  headers: {
640
- "content-type": e.contentType,
641
- ...P(r.origin)
653
+ "content-type": r.contentType,
654
+ ...F(n.origin)
642
655
  },
643
- body: e.body
656
+ body: r.body
644
657
  };
645
658
  }
646
659
  if (i !== "/_voltro/inspect/stream") {
647
- let e = N(t, Ne, r);
660
+ let e = P(t, Ne, n);
648
661
  if (e !== null) return {
649
662
  status: e.status,
650
663
  headers: {
@@ -654,14 +667,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
654
667
  body: e.body
655
668
  };
656
669
  }
657
- let a = we(i, G), o = a ? Y.get(a.route.pattern)?.renderMode : void 0, s = o === "ssr" || o === "isr" || (a ? Z.has(a.route.pattern) : !1), c = i === "/" ? L(y, "index.html") : L(y, i.replace(/^\//, ""), "index.html");
658
- if (!s && await Q(c)) return {
670
+ let a = Te(i, W), o = a ? Y.get(a.route.pattern)?.renderMode : void 0, s = o === "ssr" || o === "isr" || (a ? Z.has(a.route.pattern) : !1), l = i === "/" ? L(x, "index.html") : L(x, i.replace(/^\//, ""), "index.html");
671
+ if (!s && await Q(l)) return {
659
672
  status: 200,
660
673
  headers: { "content-type": "text/html; charset=utf-8" },
661
- body: await H.readFile(c)
674
+ body: await H.readFile(l)
662
675
  };
663
676
  if (/\.[a-z0-9]+$/i.test(i)) {
664
- let e = L(y, i.replace(/^\//, ""));
677
+ let e = L(x, i.replace(/^\//, ""));
665
678
  if (await Q(e)) {
666
679
  let t = await H.readFile(e);
667
680
  return {
@@ -671,20 +684,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
671
684
  };
672
685
  }
673
686
  }
674
- let u = we(i, G);
687
+ let u = Te(i, W);
675
688
  if (!u) return {
676
689
  status: 404,
677
690
  headers: { "content-type": "text/plain" },
678
691
  body: "not found"
679
692
  };
680
- let ee = Y.get(u.route.pattern), te = r["x-tenant"] ?? "anonymous", p = (await q.getHelpers()).i18n?.resolve(r.cookie, r["accept-language"])?.locale, m = e(i, {
681
- ...ee?.tenantAware ? { tenant: te } : {},
693
+ let d = Y.get(u.route.pattern), f = n["x-tenant"] ?? "anonymous", p = (await q.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, m = oe(i, {
694
+ ...d?.tenantAware ? { tenant: f } : {},
682
695
  ...p ? { locale: p } : {}
683
- }), g = B.get(m), v = Date.now();
684
- if (g && h(g, v)) return f.emit("cache", {
696
+ }), g = z.get(m), _ = Date.now();
697
+ if (g && O(g, _)) return h.emit("cache", {
685
698
  kind: "HIT",
686
699
  key: m,
687
- ageMs: v - g.renderedAt
700
+ ageMs: _ - g.renderedAt
688
701
  }), {
689
702
  status: 200,
690
703
  headers: {
@@ -692,33 +705,33 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
692
705
  "x-voltro-rendered-by": "isr",
693
706
  "x-voltro-cache": "HIT",
694
707
  "x-voltro-cache-key": m,
695
- "x-voltro-cache-age-ms": String(v - g.renderedAt)
708
+ "x-voltro-cache-age-ms": String(_ - g.renderedAt)
696
709
  },
697
710
  body: g.html
698
711
  };
699
- if (g && k(g, v)) return f.emit("cache", {
712
+ if (g && ie(g, _)) return h.emit("cache", {
700
713
  kind: "STALE",
701
714
  key: m,
702
- ageMs: v - g.renderedAt
715
+ ageMs: _ - g.renderedAt
703
716
  }), (async () => {
704
717
  try {
705
- let e = await Te({
718
+ let e = await Ee({
706
719
  provider: q,
707
- root: n,
720
+ root: r,
708
721
  route: u.route,
709
722
  params: u.params,
710
723
  pathname: i,
711
- dirs: W,
712
- shellTemplate: F,
713
- requestHeaders: r,
714
- apiOrigin: R,
715
- apiName: z,
724
+ dirs: U,
725
+ shellTemplate: M,
726
+ requestHeaders: n,
727
+ apiOrigin: pe,
728
+ apiName: R,
716
729
  requestUrl: t,
717
730
  buffered: !0
718
731
  });
719
732
  if (e && "html" in e && e.renderMode === "isr" && e.revalidateMs !== null) {
720
733
  let t = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0, n = Date.now();
721
- B.set(m, {
734
+ z.set(m, {
722
735
  html: e.html,
723
736
  renderedAt: n,
724
737
  expiresAt: n + e.revalidateMs,
@@ -737,22 +750,22 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
737
750
  "x-voltro-rendered-by": "isr",
738
751
  "x-voltro-cache": "STALE",
739
752
  "x-voltro-cache-key": m,
740
- "x-voltro-cache-age-ms": String(v - g.renderedAt)
753
+ "x-voltro-cache-age-ms": String(_ - g.renderedAt)
741
754
  },
742
755
  body: g.html
743
756
  };
744
757
  try {
745
- let e = await Te({
758
+ let e = await Ee({
746
759
  provider: q,
747
- root: n,
760
+ root: r,
748
761
  route: u.route,
749
762
  params: u.params,
750
763
  pathname: i,
751
- dirs: W,
752
- shellTemplate: F,
753
- requestHeaders: r,
754
- apiOrigin: R,
755
- apiName: z,
764
+ dirs: U,
765
+ shellTemplate: M,
766
+ requestHeaders: n,
767
+ apiOrigin: pe,
768
+ apiName: R,
756
769
  requestUrl: t
757
770
  });
758
771
  if (!e) return {
@@ -761,7 +774,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
761
774
  "content-type": "text/html; charset=utf-8",
762
775
  "x-voltro-rendered-by": "spa-fallback"
763
776
  },
764
- body: F
777
+ body: M
765
778
  };
766
779
  if ("stream" in e) return {
767
780
  status: 200,
@@ -790,20 +803,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
790
803
  };
791
804
  if (e.renderMode === "isr" && e.revalidateMs !== null) {
792
805
  let t = Date.now(), n = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0;
793
- B.set(m, {
806
+ z.set(m, {
794
807
  html: e.html,
795
808
  renderedAt: t,
796
809
  expiresAt: t + e.revalidateMs,
797
810
  servableUntil: t + e.revalidateMs + n,
798
811
  revalidateMs: e.revalidateMs,
799
812
  staleWhileRevalidateMs: n
800
- }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = m, a["x-voltro-cache-revalidate-ms"] = String(e.revalidateMs), n > 0 && (a["x-voltro-cache-swr-ms"] = String(n)), f.emit("cache", {
813
+ }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = m, a["x-voltro-cache-revalidate-ms"] = String(e.revalidateMs), n > 0 && (a["x-voltro-cache-swr-ms"] = String(n)), h.emit("cache", {
801
814
  kind: "MISS",
802
815
  key: m,
803
816
  revalidateMs: e.revalidateMs,
804
817
  swrMs: n
805
818
  });
806
- } else e.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", f.emit("cache", {
819
+ } else e.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", h.emit("cache", {
807
820
  kind: "BYPASS",
808
821
  key: m
809
822
  }));
@@ -813,7 +826,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
813
826
  body: e.html
814
827
  };
815
828
  } catch (e) {
816
- return J.error("render error", { url: i }, e), ne(e) ? {
829
+ return J.error("render error", { url: i }, e), te(e) ? {
817
830
  status: 500,
818
831
  headers: {
819
832
  "content-type": "text/plain; charset=utf-8",
@@ -826,18 +839,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
826
839
  body: "server error"
827
840
  };
828
841
  }
829
- }, Fe = !1, Ie = he(async (e, t) => {
830
- let n = e.url ?? "/", r = Date.now(), i = {};
831
- for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
832
- let a = n.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
833
- if (a === "/internal/liveness") {
842
+ }, Fe = !1, Ie = ge(async (e, t) => {
843
+ let r = e.url ?? "/", i = Date.now(), a = {};
844
+ for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (a[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
845
+ let o = r.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
846
+ if (o === "/internal/liveness") {
834
847
  t.writeHead(200, {
835
848
  "content-type": "text/plain",
836
849
  "cache-control": "no-store"
837
850
  }), t.end("ok");
838
851
  return;
839
852
  }
840
- if (a === "/internal/readiness") {
853
+ if (o === "/internal/readiness") {
841
854
  let e = Fe ? 200 : 503;
842
855
  t.writeHead(e, {
843
856
  "content-type": "text/plain",
@@ -845,36 +858,36 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
845
858
  }), t.end(Fe ? "ready" : "not-ready");
846
859
  return;
847
860
  }
848
- if (s === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
849
- let e = P(i.origin);
861
+ if (s === "OPTIONS" && o.startsWith("/_voltro/inspect")) {
862
+ let e = F(a.origin);
850
863
  t.writeHead(204, e), t.end();
851
864
  return;
852
865
  }
853
- if (d.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
854
- let r = new URL(n, "http://x").searchParams.get("target");
855
- if (!r) {
866
+ if (c.name === "voltroDashboard" && o === "/api/dashboard/proxy") {
867
+ let n = new URL(r, "http://x").searchParams.get("target");
868
+ if (!n) {
856
869
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
857
870
  return;
858
871
  }
859
- if (!ue(r)) {
872
+ if (!ue(n)) {
860
873
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
861
874
  return;
862
875
  }
863
876
  try {
864
- let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
865
- a ? n.authorization = Array.isArray(a) ? a[0] : a : ce(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
877
+ let r = { accept: a.accept ?? "application/json" }, i = a.authorization;
878
+ i ? r.authorization = Array.isArray(i) ? i[0] : i : N(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
866
879
  let o;
867
880
  if (s && s !== "GET" && s !== "HEAD") {
868
881
  let t = [];
869
882
  for await (let n of e) t.push(n);
870
883
  o = Buffer.concat(t);
871
- let r = i["content-type"];
872
- r && (n["content-type"] = Array.isArray(r) ? r[0] : r);
884
+ let n = a["content-type"];
885
+ n && (r["content-type"] = Array.isArray(n) ? n[0] : n);
873
886
  }
874
- let c = await fetch(r, {
887
+ let c = await fetch(n, {
875
888
  redirect: "manual",
876
889
  method: s,
877
- headers: n,
890
+ headers: r,
878
891
  ...o ? { body: new Uint8Array(o.buffer, o.byteOffset, o.byteLength) } : {}
879
892
  }), l = Buffer.from(await c.arrayBuffer());
880
893
  t.writeHead(c.status, {
@@ -886,30 +899,30 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
886
899
  }
887
900
  return;
888
901
  }
889
- if (d.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
890
- let r = new URL(n, "http://x").searchParams.get("target");
891
- if (!r) {
902
+ if (c.name === "voltroDashboard" && o === "/api/dashboard/proxy/stream") {
903
+ let n = new URL(r, "http://x").searchParams.get("target");
904
+ if (!n) {
892
905
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
893
906
  return;
894
907
  }
895
- if (!ue(r)) {
908
+ if (!ue(n)) {
896
909
  t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
897
910
  return;
898
911
  }
899
- let a = new AbortController();
900
- e.on("close", () => a.abort()), t.on("close", () => a.abort());
912
+ let i = new AbortController();
913
+ e.on("close", () => i.abort()), t.on("close", () => i.abort());
901
914
  try {
902
- let e = i.authorization ?? (ce(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
915
+ let e = a.authorization ?? (N(n) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), r = await fetch(n, {
903
916
  redirect: "manual",
904
917
  method: "GET",
905
918
  headers: {
906
919
  accept: "text/event-stream",
907
920
  ...e ? { authorization: Array.isArray(e) ? e[0] : e } : {}
908
921
  },
909
- signal: a.signal
922
+ signal: i.signal
910
923
  });
911
- if (!n.ok || !n.body) {
912
- t.writeHead(n.status, { "content-type": "text/plain" }), t.end(`upstream ${n.status}`);
924
+ if (!r.ok || !r.body) {
925
+ t.writeHead(r.status, { "content-type": "text/plain" }), t.end(`upstream ${r.status}`);
913
926
  return;
914
927
  }
915
928
  t.writeHead(200, {
@@ -918,7 +931,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
918
931
  connection: "keep-alive",
919
932
  "x-accel-buffering": "no"
920
933
  }), t.flushHeaders();
921
- let o = n.body.getReader();
934
+ let o = r.body.getReader();
922
935
  try {
923
936
  for (;;) {
924
937
  let { done: e, value: n } = await o.read();
@@ -933,23 +946,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
933
946
  }
934
947
  return;
935
948
  }
936
- if (a === "/_voltro/inspect/stream") {
937
- let n = P(i.origin);
949
+ if (o === "/_voltro/inspect/stream") {
950
+ let r = F(a.origin);
938
951
  if (le()) {
939
952
  t.writeHead(503, {
940
953
  "content-type": "application/json",
941
- ...n
954
+ ...r
942
955
  }), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
943
956
  return;
944
957
  }
945
- let r = de(i, "GET");
946
- if (!r.ok) {
958
+ let i = de(a, "GET");
959
+ if (!i.ok) {
947
960
  t.writeHead(401, {
948
961
  "content-type": "application/json",
949
- ...n
962
+ ...r
950
963
  }), t.end(JSON.stringify({
951
964
  error: "unauthorized",
952
- reason: r.reason
965
+ reason: i.reason
953
966
  }));
954
967
  return;
955
968
  }
@@ -958,31 +971,31 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
958
971
  "cache-control": "no-cache, no-transform",
959
972
  connection: "keep-alive",
960
973
  "x-accel-buffering": "no",
961
- ...n
974
+ ...r
962
975
  }), t.flushHeaders(), t.write("retry: 5000\n\n");
963
- for (let e of f.buffered()) t.write(u(e));
964
- let a = f.subscribe((e) => {
965
- t.write(u(e));
976
+ for (let e of h.buffered()) t.write(n(e));
977
+ let o = h.subscribe((e) => {
978
+ t.write(n(e));
966
979
  }), s = setInterval(() => {
967
- t.write(o());
980
+ t.write(E());
968
981
  }, 15e3), c = () => {
969
- clearInterval(s), a();
982
+ clearInterval(s), o();
970
983
  };
971
984
  e.on("close", c), t.on("close", c);
972
985
  return;
973
986
  }
974
987
  try {
975
- let e = await Pe(n, i);
976
- if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
977
- let t = Date.now() - r;
978
- f.emit("request", {
979
- url: a,
988
+ let e = await Pe(r, a);
989
+ if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !o.startsWith("/_voltro/inspect")) {
990
+ let t = Date.now() - i;
991
+ h.emit("request", {
992
+ url: o,
980
993
  status: e.status,
981
994
  durationMs: t,
982
995
  renderedBy: e.headers["x-voltro-rendered-by"],
983
996
  cache: e.headers["x-voltro-cache"]
984
997
  });
985
- let n = we(a, G)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
998
+ let n = Te(o, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
986
999
  ke.record({
987
1000
  kind: "request",
988
1001
  tag: n,
@@ -994,56 +1007,56 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
994
1007
  t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
995
1008
  }
996
1009
  });
997
- await new Promise((e) => Ie.listen(v, "::", e)), Fe = !0, a.mark("ready"), J.info(`listening on http://localhost:${v}`, {
1010
+ await new Promise((e) => Ie.listen(v, "::", e)), Fe = !0, s.mark("ready"), J.info(`listening on http://localhost:${v}`, {
998
1011
  port: v,
999
- distDir: y
1012
+ distDir: x
1000
1013
  }), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
1001
1014
  try {
1002
- await x({
1003
- id: A,
1004
- name: E,
1015
+ await f({
1016
+ id: w,
1017
+ name: S,
1005
1018
  kind: "web",
1006
1019
  url: `http://localhost:${v}`,
1007
1020
  pid: process.pid,
1008
1021
  status: "live",
1009
- logFile: M.path
1022
+ logFile: j.path
1010
1023
  });
1011
- let e = c(n);
1024
+ let e = t(r);
1012
1025
  if (e) {
1013
- let t = await j({ dashboardAppPath: e });
1026
+ let t = await l({ dashboardAppPath: e });
1014
1027
  t.status === "launched" ? J.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && J.debug(`dashboard already running on :${t.port}`, { port: t.port });
1015
1028
  }
1016
1029
  setInterval(() => {
1017
- x({
1018
- id: A,
1019
- name: E,
1030
+ f({
1031
+ id: w,
1032
+ name: S,
1020
1033
  kind: "web",
1021
1034
  url: `http://localhost:${v}`,
1022
1035
  pid: process.pid,
1023
1036
  status: "live",
1024
- logFile: M.path
1037
+ logFile: j.path
1025
1038
  }).catch(() => {});
1026
1039
  }, 1e4).unref();
1027
1040
  } catch (e) {
1028
1041
  J.warn("runtime-registry write failed", {}, e);
1029
1042
  }
1030
- pe({
1031
- app: d.name ?? "unnamed",
1043
+ me({
1044
+ app: c.name ?? "unnamed",
1032
1045
  kind: "web",
1033
1046
  url: `http://localhost:${v}`,
1034
- bootMs: a.total()
1047
+ bootMs: s.total()
1035
1048
  });
1036
- let Le = a.phaseBreakdown();
1037
- J.info(`start: ready in ${a.total()}ms`, {
1038
- bootMs: a.total(),
1049
+ let Le = s.phaseBreakdown();
1050
+ J.info(`start: ready in ${s.total()}ms`, {
1051
+ bootMs: s.total(),
1039
1052
  ...Le ? { phases: Le } : {}
1040
1053
  });
1041
1054
  let Re = !1, ze = (e) => async () => {
1042
1055
  if (!Re) {
1043
- if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await Oe.stop(), V) try {
1044
- await V.end();
1056
+ if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await $.stop(), B) try {
1057
+ await B.end();
1045
1058
  } catch {}
1046
- await q.close(), await ae(A), await M.dispose(), process.exit(0);
1059
+ await q.close(), await b(w), await j.dispose(), process.exit(0);
1047
1060
  }
1048
1061
  };
1049
1062
  process.on("SIGINT", ze("SIGINT")), process.on("SIGTERM", ze("SIGTERM"));
@@ -1055,10 +1068,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1055
1068
  e.unref();
1056
1069
  }
1057
1070
  return new Promise(() => {});
1058
- }, ke = async (e) => {
1071
+ }, Ae = async (e) => {
1059
1072
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
1060
- let t = await Oe(R(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1073
+ let t = await ke(R(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1061
1074
  return t.ran ? t.exitCode : (J.error("no web app found at this path"), 1);
1062
1075
  };
1063
1076
  //#endregion
1064
- export { ke as t };
1077
+ export { Ae as t };