@voltro/cli 0.32.0 → 0.34.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 (339) hide show
  1. package/CHANGELOG.md +2006 -0
  2. package/THIRD-PARTY-NOTICES.md +1 -29
  3. package/bin/nodeEnvironment.d.mts +30 -0
  4. package/bin/nodeEnvironment.mjs +158 -0
  5. package/bin/voltro.mjs +69 -5
  6. package/dist/addCommand-BNeoeSxe.js +124 -0
  7. package/dist/addCommand-aXSQveak.js +2 -0
  8. package/dist/agentsMd-BTchIZku.js +2 -0
  9. package/dist/agentsMd-mhQMF1bx.js +254 -0
  10. package/dist/apiBuild-BICVGnEC.js +2 -0
  11. package/dist/{apiBuild-C4uEbs3s.js → apiBuild-DZF_f0_I.js} +46 -46
  12. package/dist/appPort-B_HpJ_ck.js +48 -0
  13. package/dist/baselineCommand-C2ClWZN3.js +2 -0
  14. package/dist/baselineCommand-DIttzO8A.js +227 -0
  15. package/dist/bin.js +71 -28
  16. package/dist/build-CE7Ca9gm.js +711 -0
  17. package/dist/cacheCommand-DA4OH9xt.js +42 -0
  18. package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
  19. package/dist/checkCommand-Dv8r9tGO.js +231 -0
  20. package/dist/checkCommand-YZDmkAGd.js +2 -0
  21. package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
  22. package/dist/cliError-BmdYnghb.js +10 -0
  23. package/dist/cliOutput-D1tSBoRM.js +15 -0
  24. package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
  25. package/dist/cloudClient-DWL-Hw_T.js +67 -0
  26. package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
  27. package/dist/clusterCmd-CNXKlcvD.js +54 -0
  28. package/dist/codegen-CYM3Zqrf.js +605 -0
  29. package/dist/codegen-ChBi_hVa.js +2 -0
  30. package/dist/codegenCommand-DC6w2tNZ.js +30 -0
  31. package/dist/codemodRunner-DRRqXR74.js +5243 -0
  32. package/dist/commandRunner-BLAEFLjp.js +47 -0
  33. package/dist/commands-gutsz-Ac.js +808 -0
  34. package/dist/connectionConfig-UFlIEiys.js +66 -0
  35. package/dist/dashboardCommand-3YG8p-UA.js +25 -0
  36. package/dist/dataCommand-qL0r7fPO.js +535 -0
  37. package/dist/dataProfile-dW-PsfLB.js +15 -0
  38. package/dist/dbCommand-B6X0FZbq.js +1621 -0
  39. package/dist/dbCommand-CpdKLeQq.js +2 -0
  40. package/dist/{dev-5ficNnvF.js → dev-CerMd0mW.js} +3155 -3110
  41. package/dist/dev-CoG-ZPx8.js +3 -0
  42. package/dist/devActivity-Dx_3nnGv.js +100 -0
  43. package/dist/devActivity.js +1 -1
  44. package/dist/dialectDriver-CgXnDfec.js +39 -0
  45. package/dist/discover-C9XKJDco.js +25 -0
  46. package/dist/doctorCommand-BvqGBwNG.js +2 -0
  47. package/dist/{checkCommand-dm7OHtPt.js → doctorCommand-CnDXQxfa.js} +520 -1278
  48. package/dist/dormancyCommand-Dszo57d6.js +69 -0
  49. package/dist/e2eCmd-BRabZww-.js +147 -0
  50. package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
  51. package/dist/envCommand-DPgdV1Bq.js +60 -0
  52. package/dist/evalCommand-6RUfPen4.js +118 -0
  53. package/dist/evolveCommand-DHpkgjgH.js +281 -0
  54. package/dist/fileTaxonomy-CJfgOllU.js +457 -0
  55. package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
  56. package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
  57. package/dist/generateCommand-oibemh97.js +147 -0
  58. package/dist/index.d.ts +45 -0
  59. package/dist/index.js +4 -3
  60. package/dist/infoCommand-BJw9nLUR.js +60 -0
  61. package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
  62. package/dist/inspect-C_T_WGvl.js +2 -0
  63. package/dist/inspectCmd-Bppy-GGw.js +224 -0
  64. package/dist/inspectFetch-Cm8_wVvp.js +151 -0
  65. package/dist/inspectMetrics-CfdKLh6t.js +72 -0
  66. package/dist/loadEnv-D9nEOClM.js +44 -0
  67. package/dist/logFileSink-C_D2wRN1.js +105 -0
  68. package/dist/logsCmd-CCca3KRZ.js +260 -0
  69. package/dist/manifestBuild-ChsKAhmn.js +2 -0
  70. package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
  71. package/dist/metaCommands-7MJfZ5cf.js +196 -0
  72. package/dist/migrate-CBwOt_iV.js +83 -0
  73. package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
  74. package/dist/newCommand-COWOJ1_E.js +156 -0
  75. package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
  76. package/dist/packageCommand-Cug_3Ogl.js +271 -0
  77. package/dist/pageConvention-cEiRxdab.js +5 -0
  78. package/dist/privacyCommand-C-Df56U_.js +146 -0
  79. package/dist/projectScaffold-DmzEKHib.js +2 -0
  80. package/dist/projectScaffold-LMMtaavR.js +814 -0
  81. package/dist/renderModeScan-D7J1B7Kw.js +105 -0
  82. package/dist/renderProfile-1OWWAAtx.js +81 -0
  83. package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
  84. package/dist/runtimeTrace-CRxalXTs.js +91 -0
  85. package/dist/scheduleCmd--jksTrf6.js +69 -0
  86. package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
  87. package/dist/schemaIr-UJybUUZW.js +103 -0
  88. package/dist/{sdkgen-B_5mHQS2.js → sdkgen-CYJscZC7.js} +111 -209
  89. package/dist/seedRunner-TFHHiToI.js +329 -0
  90. package/dist/serveCommand-B_isw7q4.js +1647 -0
  91. package/dist/serveCommand-DOvbgRnQ.js +2 -0
  92. package/dist/serveEntry.js +5 -5
  93. package/dist/serverlessCommand-CfJZy6dS.js +482 -0
  94. package/dist/start-9LiUOfES.js +1087 -0
  95. package/dist/start-B-9Nsp-S.js +3 -0
  96. package/dist/startEntry.js +2 -2
  97. package/dist/staticCommand-Dr2M6tpU.js +304 -0
  98. package/dist/storageCommand-Co6NfLqN.js +42 -0
  99. package/dist/templates-De8IR5-c.js +102 -0
  100. package/dist/test-CI6iDsYc.js +115 -0
  101. package/dist/tracesCmd-CkEZQrtt.js +232 -0
  102. package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
  103. package/dist/tsxLoader-EuXmSJ1K.js +51 -0
  104. package/dist/typecheckCommand-BlsWiCNq.js +61 -0
  105. package/dist/updateCommand-Bkptutss.js +585 -0
  106. package/dist/updateCommand-us1_hdIC.js +2 -0
  107. package/dist/{inspectMetrics-BqO4E9G0.js → webDev-CBYvPqQr.js} +1006 -1567
  108. package/dist/webDev-Cg-fFiyd2.js +2 -0
  109. package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
  110. package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
  111. package/dist/webhooksCommand-CID96Rga.js +267 -0
  112. package/dist/workflowsCmd-D1VTmLMY.js +608 -0
  113. package/package.json +193 -18
  114. package/templates/AGENTS.core.md +58 -3
  115. package/templates/AGENTS.md +64 -7
  116. package/templates/agent-docs/_index.md +6 -4
  117. package/templates/agent-docs/_manifest.json +22 -5
  118. package/templates/agent-docs/ai.md +370 -0
  119. package/templates/agent-docs/authentication.md +265 -31
  120. package/templates/agent-docs/caching.md +6 -0
  121. package/templates/agent-docs/cli.md +794 -50
  122. package/templates/agent-docs/data.md +550 -11
  123. package/templates/agent-docs/database/migrations.md +174 -25
  124. package/templates/agent-docs/database/misc.md +193 -40
  125. package/templates/agent-docs/database/querying.md +19 -1
  126. package/templates/agent-docs/database/scaling.md +60 -0
  127. package/templates/agent-docs/database/schema.md +5 -2
  128. package/templates/agent-docs/database/seedsdialects.md +208 -19
  129. package/templates/agent-docs/database/transactions.md +68 -0
  130. package/templates/agent-docs/deployment.md +156 -4
  131. package/templates/agent-docs/introduction.md +87 -16
  132. package/templates/agent-docs/local-first-mobile.md +79 -4
  133. package/templates/agent-docs/multi-tenancy.md +95 -20
  134. package/templates/agent-docs/observability.md +58 -3
  135. package/templates/agent-docs/plugins/ai-flows.md +161 -2
  136. package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
  137. package/templates/agent-docs/plugins/audit.md +37 -1
  138. package/templates/agent-docs/plugins/auth-social.md +143 -0
  139. package/templates/agent-docs/plugins/auth-workos.md +4 -2
  140. package/templates/agent-docs/plugins/auth.md +131 -6
  141. package/templates/agent-docs/plugins/billing.md +132 -15
  142. package/templates/agent-docs/plugins/cdc-out.md +46 -7
  143. package/templates/agent-docs/plugins/clickhouse.md +1 -1
  144. package/templates/agent-docs/plugins/duckdb.md +1 -1
  145. package/templates/agent-docs/plugins/flags.md +132 -0
  146. package/templates/agent-docs/plugins/governance.md +105 -7
  147. package/templates/agent-docs/plugins/multitenancy.md +9 -4
  148. package/templates/agent-docs/plugins/presence.md +13 -2
  149. package/templates/agent-docs/plugins/ratelimit.md +9 -0
  150. package/templates/agent-docs/plugins/search.md +157 -6
  151. package/templates/agent-docs/plugins/sso-saml.md +47 -8
  152. package/templates/agent-docs/plugins/webhooks.md +105 -0
  153. package/templates/agent-docs/plugins.md +200 -18
  154. package/templates/agent-docs/reference.md +60 -3
  155. package/templates/agent-docs/releases.md +1117 -0
  156. package/templates/agent-docs/routing.md +43 -25
  157. package/templates/agent-docs/scheduling.md +14 -1
  158. package/templates/agent-docs/schema-driven-ui.md +92 -12
  159. package/templates/agent-docs/security.md +449 -2
  160. package/templates/agent-docs/templates/apibackends.md +87 -18
  161. package/templates/agent-docs/templates/appshells.md +32 -14
  162. package/templates/agent-docs/templates/overview.md +13 -8
  163. package/templates/agent-docs/testing.md +211 -14
  164. package/templates/agent-docs/whats-new.md +1722 -84
  165. package/templates/agent-docs/workflows.md +130 -14
  166. package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
  167. package/templates/apps/api-ai/package.json +8 -7
  168. package/templates/apps/api-auth/actions/me.action.ts +13 -0
  169. package/templates/apps/api-auth/package.json +9 -8
  170. package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
  171. package/templates/apps/api-backend/package.json +12 -8
  172. package/templates/apps/api-backend/queries/notes.query.ts +30 -8
  173. package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
  174. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
  175. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
  176. package/templates/apps/api-backend-deactivation/package.json +8 -7
  177. package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
  178. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
  179. package/templates/apps/api-backend-mail/package.json +9 -8
  180. package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
  181. package/templates/apps/api-backend-mariadb/.env.example +14 -0
  182. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
  183. package/templates/apps/api-backend-mariadb/package.json +10 -9
  184. package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
  185. package/templates/apps/api-backend-sqlite/.env.example +14 -0
  186. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
  187. package/templates/apps/api-backend-sqlite/package.json +9 -8
  188. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
  189. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
  190. package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
  191. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
  192. package/templates/apps/api-backend-storage/package.json +9 -8
  193. package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
  194. package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
  195. package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
  196. package/templates/apps/api-cms/actions/me.action.ts +13 -0
  197. package/templates/apps/api-cms/app.config.ts +19 -0
  198. package/templates/apps/api-cms/authz.ts +63 -0
  199. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
  200. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
  201. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
  202. package/templates/apps/api-cms/package.json +11 -10
  203. package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
  204. package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
  205. package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
  206. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
  207. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
  208. package/templates/apps/api-collab/package.json +9 -8
  209. package/templates/apps/api-collab/queries/documents.query.ts +19 -7
  210. package/templates/apps/api-data-advanced/package.json +9 -8
  211. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
  212. package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
  213. package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
  214. package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
  215. package/templates/apps/api-durable/package.json +9 -8
  216. package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
  217. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
  218. package/templates/apps/api-feature-flags/package.json +10 -9
  219. package/templates/apps/api-governance/README.md +30 -8
  220. package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
  221. package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
  222. package/templates/apps/api-governance/database/schema.ts +16 -4
  223. package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
  224. package/templates/apps/api-governance/package.json +9 -8
  225. package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
  226. package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
  227. package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
  228. package/templates/apps/api-kv/package.json +9 -8
  229. package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
  230. package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
  231. package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
  232. package/templates/apps/api-moderation/package.json +9 -8
  233. package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
  234. package/templates/apps/api-observability/package.json +9 -8
  235. package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
  236. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
  237. package/templates/apps/api-ratelimit/package.json +9 -8
  238. package/templates/apps/api-rbac/package.json +9 -8
  239. package/templates/apps/api-rest/package.json +8 -7
  240. package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
  241. package/templates/apps/api-saas/package.json +12 -11
  242. package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
  243. package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
  244. package/templates/apps/api-saas-starter/app.config.ts +19 -0
  245. package/templates/apps/api-saas-starter/authz.ts +75 -0
  246. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
  247. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
  248. package/templates/apps/api-saas-starter/package.json +15 -11
  249. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
  250. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
  251. package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
  252. package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
  253. package/templates/apps/api-search/package.json +9 -8
  254. package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
  255. package/templates/apps/api-status/README.md +10 -3
  256. package/templates/apps/api-status/app.config.ts +8 -3
  257. package/templates/apps/api-status/authz.ts +5 -3
  258. package/templates/apps/api-status/package.json +9 -8
  259. package/templates/apps/api-status/queries/components.list.query.ts +14 -6
  260. package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
  261. package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
  262. package/templates/apps/api-status/tests/status.test.ts +9 -1
  263. package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
  264. package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
  265. package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
  266. package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
  267. package/templates/apps/api-versioning/package.json +9 -8
  268. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
  269. package/templates/apps/api-webhooks/package.json +10 -9
  270. package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
  271. package/templates/apps/changelog/package.json +8 -6
  272. package/templates/apps/edge-functions/package.json +2 -2
  273. package/templates/apps/frontend-admin/package.json +10 -8
  274. package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
  275. package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
  276. package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
  277. package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
  278. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
  279. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
  280. package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
  281. package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
  282. package/templates/apps/frontend-app/app.config.ts +4 -3
  283. package/templates/apps/frontend-app/package.json +11 -8
  284. package/templates/apps/frontend-app/src/lib/api.ts +25 -0
  285. package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
  286. package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
  287. package/templates/apps/frontend-auth/package.json +10 -8
  288. package/templates/apps/frontend-blank/package.json +9 -7
  289. package/templates/apps/frontend-cms/package.json +11 -9
  290. package/templates/apps/frontend-collab/package.json +12 -9
  291. package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
  292. package/templates/apps/frontend-contact/package.json +9 -7
  293. package/templates/apps/frontend-dashboard/package.json +9 -7
  294. package/templates/apps/frontend-docs/package.json +9 -7
  295. package/templates/apps/frontend-i18n/package.json +8 -6
  296. package/templates/apps/frontend-landing/package.json +9 -7
  297. package/templates/apps/frontend-portal/package.json +10 -8
  298. package/templates/apps/frontend-saas/app.config.ts +10 -6
  299. package/templates/apps/frontend-saas/package.json +10 -8
  300. package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
  301. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
  302. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
  303. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
  304. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
  305. package/templates/apps/frontend-spa/package.json +9 -7
  306. package/templates/apps/frontend-ssr/package.json +9 -7
  307. package/templates/apps/frontend-ssr-api/package.json +10 -8
  308. package/templates/apps/frontend-static-blog/package.json +8 -6
  309. package/templates/apps/frontend-status/package.json +10 -8
  310. package/templates/apps/mobile-app/README.md +1 -0
  311. package/templates/apps/mobile-app/package.json +4 -2
  312. package/templates/apps/mobile-app/src/app/index.tsx +22 -12
  313. package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
  314. package/templates/apps/mobile-app/src/lib/api.ts +34 -0
  315. package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
  316. package/templates/baselines/bare/.env.example +14 -0
  317. package/templates/baselines/bare/baseline.json +4 -4
  318. package/templates/baselines/compose/.env.example +14 -0
  319. package/templates/baselines/compose/README.md +1 -1
  320. package/templates/baselines/compose/baseline.json +5 -5
  321. package/templates/baselines/compose-mariadb/.env.example +14 -0
  322. package/templates/baselines/compose-mariadb/README.md +1 -1
  323. package/templates/baselines/compose-mariadb/baseline.json +5 -5
  324. package/templates/baselines/helm/.env.example +14 -0
  325. package/templates/baselines/helm/baseline.json +4 -4
  326. package/dist/apiBuild-OJEjtwcn.js +0 -2
  327. package/dist/checkCommand-CwMrzAgV.js +0 -2
  328. package/dist/commands-C0nEePif.js +0 -11457
  329. package/dist/dbCommand-By__Ev0R.js +0 -2
  330. package/dist/dbCommand-ifOMafuG.js +0 -1311
  331. package/dist/dev-rc3fwPSZ.js +0 -3
  332. package/dist/devActivity-BhIu6ncs.js +0 -159
  333. package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
  334. package/dist/inspect-mmBuRXmy.js +0 -2
  335. package/dist/manifestBuild-Dj8Jjoto.js +0 -2
  336. package/dist/seedRunner-Bqxgp7HZ.js +0 -230
  337. package/dist/serveCommand-PxMmn96o.js +0 -1578
  338. package/dist/start-D1-8eKrO.js +0 -1084
  339. /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
@@ -1,354 +1,39 @@
1
- import { t as e } from "./cliRuntime-Oh517vCV.js";
2
- import { T as t, h as n, m as r } from "./fileConventions-Cof68_BL.js";
3
- import { A as i, E as a, O as o, a as s, k as c, m as l } from "./inspect-BUUjt773.js";
4
- import { basename as u, dirname as d, isAbsolute as f, join as p, relative as m, resolve as h } from "node:path";
5
- import { fileURLToPath as g, pathToFileURL as _ } from "node:url";
6
- import { FileSystem as v } from "@effect/platform";
7
- import { NodeContext as y } from "@effect/platform-node";
8
- import { Effect as b } from "effect";
9
- import { addSink as x, createLogger as S, printReadyBlock as C } from "@voltro/logger";
10
- import { closeSync as w, existsSync as T, mkdirSync as E, openSync as D, promises as O, readFileSync as k, readdirSync as A, statSync as j, unlinkSync as M, unwatchFile as N, watchFile as ee, writeSync as P } from "node:fs";
11
- import { currentTraceContext as F, recordSample as I, resolveSecret as te } from "@voltro/runtime";
12
- import { homedir as L } from "node:os";
1
+ import { t as e } from "./nodeEnvironment-cGFAj1J8.js";
2
+ import { n as t } from "./loadEnv-D9nEOClM.js";
3
+ import { r as n } from "./appPort-B_HpJ_ck.js";
4
+ import { h as r, m as i } from "./fileConventions-Cof68_BL.js";
5
+ import { A as a, D as o, a as s, h as c, j as l, k as u } from "./inspect-CBqFtAKA.js";
6
+ import { n as d } from "./agentsMd-mhQMF1bx.js";
7
+ import { c as f, p, t as m } from "./renderModeScan-D7J1B7Kw.js";
8
+ import { t as h } from "./pageConvention-cEiRxdab.js";
9
+ import { i as g, n as _, r as v, t as y } from "./runtimeRegistry-DMeKfTHP.js";
10
+ import { n as b } from "./logFileSink-C_D2wRN1.js";
11
+ import { basename as x, dirname as S, join as C, relative as w, resolve as T } from "node:path";
12
+ import { existsSync as E, promises as D, readFileSync as O, readdirSync as k, statSync as A, unwatchFile as j, watchFile as M } from "node:fs";
13
+ import { fileURLToPath as N, pathToFileURL as P } from "node:url";
14
+ import { addSink as F, createLogger as I, printReadyBlock as L } from "@voltro/logger";
13
15
  import { createRequire as R } from "node:module";
14
- import { FRAMEWORK_ENV_CATALOG as ne, appEnvEntries as re, checkEnvNaming as z, formatEnvErrors as ie, installEnvSnapshot as B, isEnvContract as ae, pluginEnvEntries as V, renderDotEnvExample as oe, resolveEnv as se } from "@voltro/env";
15
- import { __installPublicEnv as ce } from "@voltro/env/public";
16
- import { mkdir as H, readFile as le, writeFile as ue } from "node:fs/promises";
17
- import { createHash as de } from "node:crypto";
18
- import { spawn as fe } from "node:child_process";
19
- import { createConnection as pe } from "node:net";
20
- import { PassThrough as me } from "node:stream";
21
- //#region src/agentsMd.ts
22
- var he = d(g(import.meta.url)), U = [h(he, "..", "templates"), h(he, "..", "..", "templates")], ge = (e) => ({
23
- _tag: "TemplateNotFoundError",
24
- searched: e
25
- }), W = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", ve = 2048, ye = "<!-- VOLTRO:INDEX -->", G = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), K = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), be = (e, t) => e.readFileString(t).pipe(b.map((e) => {
26
- try {
27
- return JSON.parse(e).workspaces !== void 0;
28
- } catch {
29
- return !1;
30
- }
31
- }), b.orElseSucceed(() => !1)), q = (e) => b.gen(function* () {
32
- let t = yield* v.FileSystem, n = h(e);
33
- for (;;) {
34
- if ((yield* G(t, p(n, ".git"))) || (yield* G(t, p(n, "pnpm-workspace.yaml"))) || (yield* be(t, p(n, "package.json")))) return n;
35
- let r = d(n);
36
- if (r === n) return h(e);
37
- n = r;
38
- }
39
- }), xe = (e, t, n) => b.gen(function* () {
40
- yield* e.makeDirectory(n, { recursive: !0 }).pipe(b.orElseSucceed(() => void 0));
41
- let r = yield* e.readDirectory(t).pipe(b.orElseSucceed(() => []));
42
- for (let i of r) {
43
- let r = p(t, i), a = p(n, i);
44
- (yield* e.stat(r).pipe(b.orElseSucceed(() => null)))?.type === "Directory" ? yield* xe(e, r, a) : yield* e.copyFile(r, a).pipe(b.orElseSucceed(() => void 0));
45
- }
46
- }), Se = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Ce = (e, t) => b.gen(function* () {
47
- let n = p(t, "app.config.ts");
48
- if (!(yield* G(e, n))) return null;
49
- let r = (yield* b.tryPromise(() => import(_(n).href)).pipe(b.orElseSucceed(() => null)))?.default;
50
- return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(Se).filter((e) => e !== null);
51
- }), we = (e, t) => b.gen(function* () {
52
- let n = [], r = [], i = p(t, "apps");
53
- if (!(yield* G(e, i))) return {
54
- apis: n,
55
- webs: r
56
- };
57
- for (let t of yield* e.readDirectory(i).pipe(b.orElseSucceed(() => []))) {
58
- let a = p(i, t);
59
- if ((yield* e.stat(a).pipe(b.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(b.orElseSucceed(() => []))) {
60
- let i = p(a, t), o = p(i, "app.config.ts");
61
- if (!(yield* G(e, o))) continue;
62
- let s = yield* K(e, o);
63
- /type:\s*['"]web['"]/.test(s) ? r.push(i) : n.push(i);
64
- }
65
- }
66
- return {
67
- apis: n,
68
- webs: r
69
- };
70
- }), Te = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Ee = (e, t, n) => {
71
- let r = [
72
- "<!-- voltro agent-docs index — regenerated at seed time -->",
73
- "## Deep reference (read on demand)",
74
- "",
75
- "Each row is a file to OPEN when you work on that topic — not loaded into",
76
- "context by default. Paths are from the repo root.",
77
- "",
78
- "### Topics",
79
- "",
80
- "| Topic | Open | Summary |",
81
- "|---|---|---|",
82
- ...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${Te(e.description)} |`),
83
- ""
84
- ], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = (e, t) => e.module === void 0 ? `\`node_modules/${t}/README.md\`` : `\`${n}${e.module}\` (or \`node_modules/${t}/README.md\`)`, o = t === null ? e.plugins.map((e) => `| ${e.slug} | ${a(e, e.pkg)} | ${Te(e.description)} |`) : t.map((e) => {
85
- let t = i.get(e);
86
- return t ? `| ${t.slug} | ${a(t, e)} | ${Te(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
87
- });
88
- return r.push(`### Plugins${t === null ? "" : " (installed)"}`, "", "| Plugin | Open | Summary |", "|---|---|---|"), r.push(o.length ? o.join("\n") : "| _(none installed)_ | | |", ""), r.join("\n");
89
- }, De = (e, t, n) => {
90
- let r = t.templates?.[e] ?? t.templates?.[e.replace(/^frontend-/, "")];
91
- return `\nScaffolded from the \`${e}\` template — see \`${r ? `${n}${r}` : `${n}agent-docs/templates/overview.md`}\`.\n`;
92
- }, Oe = {
93
- api: (e, t, n = "") => `# api — agent notes
94
-
95
- You are in a Voltro **api** app. Server primitives live here: \`queries/\`,
96
- \`mutations/\`, \`actions/\`, \`workflows/\`, \`database/\`, \`schedules/\`.
97
-
98
- - Every RPC primitive is a descriptor + \`*.server.ts\` executor pair. Descriptors
99
- are **browser-loaded** — keep them free of \`node:*\` / \`@voltro/database\` /
100
- server-only imports (transitively too).
101
- - Pick the primitive with the rubric in the repo-root \`AGENTS.md\`.
102
-
103
- Deep reference (paths from the repo root):
104
- - Data primitives → \`${e}agent-docs/data.md\`
105
- - Schema / queries → \`${e}agent-docs/database/schema.md\`, \`${e}agent-docs/database/querying.md\`
106
- - Workflows → \`${e}agent-docs/workflows.md\`
107
- ${t && t.length ? `\nThis api's plugins: ${t.join(", ")} (API in each \`node_modules/<pkg>/README.md\`).` : ""}
108
- ${n}`,
109
- database: (e) => `# database — agent notes
110
-
111
- Schema lives here: one table per \`*.entity.ts\`; \`index.ts\` builds the handle.
112
-
113
- - Mixins compose via \`.with(...)\` and auto-stamp columns; declare \`.index([...])\`
114
- AFTER \`.with(...)\`. Indexes are table-level (no column-level \`.index()\`).
115
- - Don't add tenant filters on \`tenant()\` tables — the runtime does it.
116
-
117
- Deep reference (paths from the repo root): \`${e}agent-docs/database/schema.md\`,
118
- \`${e}agent-docs/database/columntypes.md\`, \`${e}agent-docs/database/querying.md\`,
119
- \`${e}agent-docs/database/migrations.md\`.
120
- `,
121
- web: (e, t = "") => `# web — agent notes
122
-
123
- You are in a Voltro **web** app. File-based routing under \`src/pages/**\`.
124
-
125
- - Use \`useSubscription\` / \`useMutation\` / \`useAction\` from \`@voltro/client\`.
126
- - Never read \`window.location\` (use \`useLocation()\`); never toggle \`dark\` from
127
- \`useEffect\` (set \`theme\` in \`app.config.ts\`).
128
-
129
- Deep reference (paths from the repo root): \`${e}agent-docs/routing.md\`,
130
- \`${e}agent-docs/schema-driven-ui.md\`, \`${e}agent-docs/internationalization.md\`.
131
- ${t}`
132
- }, ke = [
133
- {
134
- name: "voltro-schema",
135
- description: "Define or change a Voltro database table/schema (columns, mixins, indexes, relations).",
136
- module: "database/schema.md"
137
- },
138
- {
139
- name: "voltro-data",
140
- description: "Write a Voltro query, mutation, action, or stream (the descriptor + server executor pair).",
141
- module: "data.md"
142
- },
143
- {
144
- name: "voltro-workflows",
145
- description: "Write or debug a durable Voltro workflow (steps, signals, retries).",
146
- module: "workflows.md"
147
- },
148
- {
149
- name: "voltro-routing",
150
- description: "Add or change a Voltro web page, layout, loader, or render mode.",
151
- module: "routing.md"
152
- },
153
- {
154
- name: "voltro-plugins",
155
- description: "Wire a Voltro plugin (storage, mail, billing, auth, rbac, …) into an app.",
156
- module: "plugins.md"
157
- },
158
- {
159
- name: "voltro-data-transfer",
160
- description: "Export/import + backup/restore Voltro data & assets, and copy prod→dev/stage SAFELY with fail-closed masking/anonymization (.sensitive()/.safe()) + referential subsetting. Use for data takeout, seeding lower envs, backups, or cross-dialect moves.",
161
- module: "cli.md"
162
- }
163
- ], Ae = (e, t) => `---
164
- name: ${e.name}
165
- description: ${e.description}
166
- ---
167
-
168
- Open the full reference and follow the patterns there:
169
-
170
- \`${t}agent-docs/${e.module}\`
171
-
172
- Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
173
- boundary, naming, anti-patterns) before editing.
174
- `, je = (e, t, n, r) => b.gen(function* () {
175
- let i = yield* G(e, t);
176
- if (i) {
177
- if ((yield* K(e, t)).slice(0, ve).includes("voltro:agents-md:keep")) return {
178
- path: t,
179
- action: "protected"
180
- };
181
- if (!r) return {
182
- path: t,
183
- action: "present"
184
- };
185
- }
186
- return yield* e.makeDirectory(d(t), { recursive: !0 }).pipe(b.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(b.orDie), {
187
- path: t,
188
- action: i ? "overwritten" : "created"
189
- };
190
- }), Me = (e, t = {}) => b.gen(function* () {
191
- let n = yield* v.FileSystem, r = yield* q(e), i = null;
192
- for (let e of U) if (yield* G(n, p(e, "AGENTS.core.md"))) {
193
- i = e;
194
- break;
195
- }
196
- if (i === null) {
197
- for (let e of U) if (yield* G(n, p(e, "AGENTS.md"))) {
198
- let i = yield* K(n, p(e, "AGENTS.md")), a = [];
199
- for (let e of W) a.push(yield* je(n, p(r, e), i, t.force ?? !1));
200
- return { files: a };
201
- }
202
- return yield* b.fail(ge(U.map((e) => p(e, "AGENTS.core.md"))));
203
- }
204
- let a = yield* K(n, p(i, "AGENTS.core.md")), o = yield* K(n, p(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
205
- modules: [],
206
- plugins: []
207
- }, c = (t.preferPointer ?? !1) || (yield* G(n, p(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), l = c ? "node_modules/@voltro/cli/templates/" : "", u = t.force ?? !1, d = W.map((e) => p(r, e));
208
- if ((yield* b.forEach(d, (e) => K(n, e).pipe(b.map((e) => e.slice(0, ve))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
209
- path: e,
210
- action: "protected"
211
- })) };
212
- let { apis: f, webs: m } = yield* we(n, r), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), y = !1;
213
- for (let e of f) {
214
- let t = yield* Ce(n, e);
215
- if (g.set(e, t), t !== null) {
216
- y = !0;
217
- for (let e of t) _.add(e);
218
- }
219
- }
220
- let x = t.plugins ? t.plugins.map(Se).filter((e) => e !== null) : y ? [..._] : null, S = a.includes(ye) ? a.replace(ye, Ee(s, x, l)) : a, C = [];
221
- for (let e of d) C.push(yield* je(n, e, S, u));
222
- c || (yield* xe(n, p(i, "agent-docs"), p(r, "agent-docs")));
223
- let w = new Map((t.appTemplates ?? []).map((e) => [h(e.dir), e.template])), T = (e) => {
224
- let t = w.get(h(e));
225
- return t ? De(t, s, l) : "";
226
- }, E = (e, t) => b.forEach(W, (r) => je(n, p(e, r), t, u));
227
- for (let e of f) C.push(...yield* E(e, Oe.api(l, g.get(e) ?? null, T(e)))), (yield* G(n, p(e, "database"))) && C.push(...yield* E(p(e, "database"), Oe.database(l)));
228
- for (let e of m) C.push(...yield* E(e, Oe.web(l, T(e))));
229
- for (let e of ke) C.push(yield* je(n, p(r, ".claude", "skills", e.name, "SKILL.md"), Ae(e, l), u));
230
- return { files: C };
231
- }), Ne = (e, t = {}) => b.runPromise(Me(e, t).pipe(b.provide(y.layer))), Pe = async (t) => {
232
- let n = t.includes("--force"), r = t.find((e) => !e.startsWith("-")) ?? process.cwd();
233
- return e(b.gen(function* () {
234
- let e = yield* Me(r, { force: n });
235
- for (let t of e.files) {
236
- let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${_e}")` : "present (use --force to overwrite)";
237
- yield* b.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
238
- }
239
- return 0;
240
- }).pipe(b.catchTag("TemplateNotFoundError", (e) => b.gen(function* () {
241
- return yield* b.logError("AGENTS.md template not found", { searched: e.searched }), 1;
242
- }))), { scope: "voltro:agents-md" });
243
- }, Fe = p(L(), ".voltro"), Ie = p(Fe, "runtime-registry.json"), Le = 3e4, Re = () => {
244
- let e = Math.random().toString(36).slice(2, 10);
245
- return `${Ie}.${process.pid}.${Date.now()}.${e}.tmp`;
246
- }, ze = async () => {
247
- await O.mkdir(Fe, { recursive: !0 });
248
- }, Be = async () => {
249
- try {
250
- let e = await O.readFile(Ie, "utf8"), t = JSON.parse(e);
251
- return t.version !== 1 || !Array.isArray(t.apps) ? {
252
- version: 1,
253
- apps: []
254
- } : t;
255
- } catch {
256
- return {
257
- version: 1,
258
- apps: []
259
- };
260
- }
261
- }, Ve = async (e) => {
262
- await ze();
263
- let t = Re();
264
- try {
265
- await O.writeFile(t, JSON.stringify(e, null, 2), {
266
- encoding: "utf8",
267
- mode: 384
268
- }), await O.rename(t, Ie), await O.chmod(Ie, 384).catch(() => {});
269
- } catch (e) {
270
- try {
271
- await O.unlink(t);
272
- } catch {}
273
- throw e;
274
- }
275
- }, He = (e) => {
276
- try {
277
- return process.kill(e, 0), !0;
278
- } catch {
279
- return !1;
280
- }
281
- }, Ue = (e) => {
282
- let t = Date.now();
283
- return e.filter((e) => He(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Le : !1);
284
- }, We = async () => {
285
- let e = await Be(), t = Ue(e.apps);
286
- if (t.length === e.apps.length) return e;
287
- try {
288
- await Ve({
289
- version: 1,
290
- apps: t
291
- });
292
- } catch {}
293
- return {
294
- version: 1,
295
- apps: t
296
- };
297
- }, Ge = async (e) => {
298
- let t = await Be(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
299
- ...e,
300
- ...i !== void 0 && i !== "" ? { inspectToken: i } : {},
301
- registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
302
- heartbeatAt: n
303
- };
304
- await Ve({
305
- version: 1,
306
- apps: r >= 0 ? t.apps.map((e, t) => t === r ? a : e) : [...t.apps, a]
307
- });
308
- }, Ke = async (e) => {
309
- try {
310
- let t = await Be(), n = t.apps.filter((t) => t.id !== e);
311
- if (n.length === t.apps.length) return;
312
- await Ve({
313
- version: 1,
314
- apps: n
315
- });
316
- } catch {}
317
- }, qe = (e, t, n) => `${e}:${t}:${n}`, Je = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Ye = (e) => {
318
- try {
319
- let t = p(e, "tsconfig.json");
320
- if (!T(t)) return [];
321
- let n = JSON.parse(Je(k(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = h(e, n.baseUrl ?? "."), a = [];
322
- for (let [e, t] of Object.entries(r)) {
323
- let n = t[0];
324
- if (!n) continue;
325
- let r = n.replace(/\\/g, "/");
326
- if (!(r.includes("/@types/") || r.endsWith(".d.ts"))) if (e.endsWith("/*") && n.endsWith("/*")) {
327
- let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
328
- a.push({
329
- find: RegExp(`^${t}/(.*)$`),
330
- replacement: `${p(i, n.slice(0, -2))}/$1`
331
- });
332
- } else a.push({
333
- find: e,
334
- replacement: p(i, n)
335
- });
336
- }
337
- return a;
338
- } catch {
339
- return [];
340
- }
341
- }, Xe = (e) => {
16
+ import { homedir as ee } from "node:os";
17
+ import { currentTraceContext as z, resolveSecret as B } from "@voltro/runtime";
18
+ import { FRAMEWORK_ENV_CATALOG as V, appEnvEntries as te, checkEnvNaming as H, formatEnvErrors as ne, installEnvSnapshot as U, isEnvContract as re, pluginEnvEntries as W, renderDotEnvExample as ie, resolveEnv as ae } from "@voltro/env";
19
+ import { __installPublicEnv as oe } from "@voltro/env/public";
20
+ import { mkdir as G, writeFile as K } from "node:fs/promises";
21
+ import { createHash as se } from "node:crypto";
22
+ import { spawn as ce } from "node:child_process";
23
+ import { createConnection as le } from "node:net";
24
+ import { PassThrough as ue } from "node:stream";
25
+ //#region src/buildToolImport.ts
26
+ var de = (e) => {
342
27
  let t = e;
343
28
  return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
344
- }, Ze = async (e, t) => {
29
+ }, fe = async (e, t) => {
345
30
  try {
346
31
  return await t();
347
32
  } catch (t) {
348
- throw Xe(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
33
+ throw de(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
349
34
  }
350
- }, Qe = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", $e = (e, t) => t ? `${e} | undefined` : e, et = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${$e(t.tsType, t.optional)}`).join("\n"), tt = async (e, t) => {
351
- let n = et(t, () => !0), r = `${Qe}
35
+ }, pe = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", me = (e, t) => t ? `${e} | undefined` : e, q = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${me(t.tsType, t.optional)}`).join("\n"), he = async (e, t) => {
36
+ let n = q(t, () => !0), r = `${pe}
352
37
  import '@voltro/env/server'
353
38
 
354
39
  declare module '@voltro/env/server' {
@@ -357,9 +42,9 @@ ${n.length > 0 ? n : " // (no variables declared)"}
357
42
  }
358
43
  }
359
44
  `;
360
- await ue(p(e, "env.generated.d.ts"), r, "utf8");
361
- }, nt = async (e, t) => {
362
- let n = et(t, (e) => e === "public"), r = `${Qe}
45
+ await K(C(e, "env.generated.d.ts"), r, "utf8");
46
+ }, ge = async (e, t) => {
47
+ let n = q(t, (e) => e === "public"), r = `${pe}
363
48
  import '@voltro/env/public'
364
49
 
365
50
  declare module '@voltro/env/public' {
@@ -367,10 +52,10 @@ declare module '@voltro/env/public' {
367
52
  ${n.length > 0 ? n : " // (no public variables declared)"}
368
53
  }
369
54
  }
370
- `, i = p(e, "src");
371
- await H(i, { recursive: !0 }), await ue(p(i, "voltro-env.d.ts"), r, "utf8");
372
- }, rt = async (e, t) => {
373
- let n = `${Qe}
55
+ `, i = C(e, "src");
56
+ await G(i, { recursive: !0 }), await K(C(i, "voltro-env.d.ts"), r, "utf8");
57
+ }, J = async (e, t) => {
58
+ let n = `${pe}
374
59
  import { __installPublicEnv } from '@voltro/env/public'
375
60
 
376
61
  export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
@@ -378,14 +63,14 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
378
63
  // Set the browser/SSR-shared global the \`publicEnv\` accessor reads.
379
64
  __installPublicEnv(publicEnvValues)
380
65
  `;
381
- await H(e, { recursive: !0 }), await ue(p(e, "env.public.ts"), n, "utf8");
382
- }, it = async (e) => {
383
- let t = ae(e.rawEnv) ? e.rawEnv : void 0, n = await se({
66
+ await G(e, { recursive: !0 }), await K(C(e, "env.public.ts"), n, "utf8");
67
+ }, _e = async (e) => {
68
+ let t = re(e.rawEnv) ? e.rawEnv : void 0, n = await ae({
384
69
  contract: t,
385
- resolveSecret: te
386
- }), r = [...n.errors, ...z(t, e.appType)];
387
- if (r.length > 0) throw Error(ie(r));
388
- B(n.values), e.appType === "web" && ce(n.publicValues);
70
+ resolveSecret: B
71
+ }), r = [...n.errors, ...H(t, e.appType)];
72
+ if (r.length > 0) throw Error(ne(r));
73
+ U(n.values), e.appType === "web" && oe(n.publicValues);
389
74
  let i = t ? Object.keys(t.vars).length : 0;
390
75
  if (i > 0) {
391
76
  let r = Object.keys(n.publicValues).length;
@@ -397,20 +82,20 @@ __installPublicEnv(publicEnvValues)
397
82
  n.length > 0 && e.log.warn(`env: ${n.length} secret var(s) declared on a web app — secrets are reachable only from server-side render code and are NEVER bundled. Prefer declaring secrets on the api.`, { keys: n });
398
83
  }
399
84
  }
400
- return e.generateTypes && t && (e.appType === "api" ? await tt(e.root, t) : await nt(e.root, t)), {
85
+ return e.generateTypes && t && (e.appType === "api" ? await he(e.root, t) : await ge(e.root, t)), {
401
86
  resolved: n,
402
87
  contract: t
403
88
  };
404
- }, at = (e) => {
405
- let t = re(e.contract), n = (e.plugins ?? []).flatMap((e) => V(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ne, i = /* @__PURE__ */ new Set(), a = [];
89
+ }, ve = (e) => {
90
+ let t = te(e.contract), n = (e.plugins ?? []).flatMap((e) => W(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : V, i = /* @__PURE__ */ new Set(), a = [];
406
91
  for (let e of [
407
92
  ...t,
408
93
  ...n,
409
94
  ...r
410
95
  ]) i.has(e.key) || (i.add(e.key), a.push(e));
411
96
  return a;
412
- }, ot = (e, t, n = (e) => process.env[e]) => {
413
- let r = at(t).map((e) => {
97
+ }, ye = (e, t, n = (e) => process.env[e]) => {
98
+ let r = ve(t).map((e) => {
414
99
  let t = n(e.key) !== void 0;
415
100
  return {
416
101
  ...e,
@@ -427,93 +112,56 @@ __installPublicEnv(publicEnvValues)
427
112
  missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
428
113
  }
429
114
  };
430
- }, st = (e, t) => oe(at({
115
+ }, be = (e, t) => ie(ve({
431
116
  ...e,
432
117
  includeFramework: !1
433
118
  }), {
434
119
  includeFramework: e.includeFramework !== !1,
435
120
  ...t ? { header: t } : {}
436
- }), ct = () => {
437
- let e = /* @__PURE__ */ new Map();
438
- return {
439
- get(t) {
440
- return e.get(t);
441
- },
442
- set(t, n) {
443
- e.set(t, n);
444
- },
445
- invalidate(t) {
446
- e.delete(t);
447
- },
448
- invalidateBy(t) {
449
- let n = 0;
450
- for (let r of e.keys()) t(r) && (e.delete(r), n++);
451
- return n;
452
- },
453
- clear() {
454
- e.clear();
455
- },
456
- size() {
457
- return e.size;
458
- },
459
- snapshot() {
460
- return Array.from(e.entries());
461
- }
462
- };
463
- }, lt = (e) => {
464
- if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
465
- if (typeof e != "string") return null;
466
- let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
467
- if (!t) return null;
468
- let n = parseInt(t[1], 10);
469
- if (!Number.isFinite(n) || n <= 0) return null;
470
- let r = t[2].toLowerCase();
471
- return r === "s" || r.startsWith("second") ? n * 1e3 : r === "m" || r.startsWith("minute") ? n * 6e4 : r === "h" || r.startsWith("hour") ? n * 36e5 : r === "d" || r.startsWith("day") ? n * 864e5 : null;
472
- }, ut = (e, t = {}) => {
473
- let n = [e];
474
- return t.tenant !== void 0 && t.tenant !== "" && n.push(`tenant=${t.tenant}`), t.locale !== void 0 && t.locale !== "" && n.push(`lang=${t.locale}`), n.join("|");
475
- }, dt = (e, t) => e.expiresAt > t, ft = (e, t) => e.expiresAt <= t && e.servableUntil > t, pt = S({ scope: "voltro:cli" }), mt = (e, t) => {
476
- if (t?.code !== "EACCES") return "";
477
- if (typeof process.getuid != "function") return " — permission denied";
121
+ }), xe = async (e, t) => {
122
+ let n = e;
123
+ for (;;) {
124
+ let e = C(n, "node_modules", t);
125
+ try {
126
+ if ((await D.stat(e)).isDirectory()) {
127
+ let t = await D.realpath(e);
128
+ return t.includes("/node_modules/") ? null : t;
129
+ }
130
+ } catch {}
131
+ let r = S(n);
132
+ if (r === n) return null;
133
+ n = r;
134
+ }
135
+ }, Se = async (e) => {
136
+ let t;
478
137
  try {
479
- let t = j(e);
480
- return ` — permission denied: the file is owned by uid ${t.uid} (mode ${(t.mode & 511).toString(8)}) and this process is uid ${process.getuid()}. A container running as root with the workspace bind-mounted writes files the host user cannot read; run it as \`--user <your-uid>:<your-gid>\`, or delete the file and let the owning user recreate it.`;
138
+ let n = await D.readFile(C(e, "package.json"), "utf8"), r = JSON.parse(n);
139
+ t = Object.keys({
140
+ ...r.dependencies,
141
+ ...r.devDependencies
142
+ });
481
143
  } catch {
482
- return " — permission denied (and the file could not be stat-ed either)";
144
+ return [];
483
145
  }
484
- }, ht = [], gt = (e) => {
485
- ht.length = 0;
486
- let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? f(t) ? t : h(process.cwd(), t) : process.cwd(), r = [], i = n;
487
- for (;;) {
488
- r.push(i);
489
- let e = d(i);
490
- if (e === i) break;
491
- i = e;
492
- }
493
- for (let e of r) for (let t of [".env.local", ".env"]) {
494
- let n = h(e, t);
495
- if (T(n)) {
496
- ht.push(n);
497
- try {
498
- let e = k(n, "utf8");
499
- for (let t of e.split(/\r?\n/)) {
500
- let e = t.trim();
501
- if (e === "" || e.startsWith("#")) continue;
502
- let n = e.indexOf("=");
503
- if (n < 1) continue;
504
- let r = e.slice(0, n).trim(), i = e.slice(n + 1).trim();
505
- (i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
506
- }
507
- } catch (e) {
508
- pt.warn(`failed to load env file (continuing)${mt(n, e)}`, { path: n }, e);
509
- }
146
+ return (await Promise.all(t.map(async (t) => {
147
+ let n = await xe(e, t);
148
+ if (n === null) return null;
149
+ let r = C(n, "src");
150
+ try {
151
+ if (!(await D.stat(r)).isDirectory()) return null;
152
+ } catch {
153
+ return null;
510
154
  }
511
- }
512
- }, _t = 500, vt = (e, t, n = {}) => {
155
+ return {
156
+ pkg: t,
157
+ dir: r
158
+ };
159
+ }))).filter((e) => e !== null);
160
+ }, Ce = 500, we = (e, t, n = {}) => {
513
161
  if (e.length === 0) return () => {};
514
- let r = (e) => n.root ? m(n.root, e) : e, i = !1, a = (e) => {
162
+ let r = (e) => n.root ? w(n.root, e) : e, i = !1, a = (e) => {
515
163
  i || (i = !0, t.warn(`.env changed (${r(e)}) — hard-restarting: process.env is read once at boot, a reload would keep stale values`, { file: r(e) }), Promise.resolve().then(() => n.onBeforeRestart?.()).catch((e) => t.warn(".env restart: onBeforeRestart failed (continuing)", {}, e)).finally(() => {
516
- let e = fe(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
164
+ let e = ce(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
517
165
  stdio: "inherit",
518
166
  env: process.env,
519
167
  cwd: n.cwd ?? process.cwd()
@@ -527,25 +175,25 @@ __installPublicEnv(publicEnvValues)
527
175
  });
528
176
  }));
529
177
  };
530
- for (let t of e) ee(t, { interval: _t }, (e, n) => {
178
+ for (let t of e) M(t, { interval: Ce }, (e, n) => {
531
179
  e.mtimeMs !== n.mtimeMs && a(t);
532
180
  });
533
181
  return t.info("watching .env files for changes", {
534
182
  files: e.map(r),
535
- intervalMs: _t
183
+ intervalMs: Ce
536
184
  }), () => {
537
- for (let t of e) N(t);
185
+ for (let t of e) j(t);
538
186
  };
539
- }, yt = "VoltroBootRefusal", bt = (e) => {
187
+ }, Te = "VoltroBootRefusal", Ee = (e) => {
540
188
  let t = Error(e);
541
- return t.name = yt, t;
542
- }, xt = [{
189
+ return t.name = Te, t;
190
+ }, De = [{
543
191
  host: "127.0.0.1",
544
192
  family: "IPv4"
545
193
  }, {
546
194
  host: "::1",
547
195
  family: "IPv6"
548
- }], St = (e, t, n) => new Promise((r) => {
196
+ }], Oe = (e, t, n) => new Promise((r) => {
549
197
  let i = !1, a = (e) => {
550
198
  if (!i) {
551
199
  i = !0;
@@ -554,15 +202,15 @@ __installPublicEnv(publicEnvValues)
554
202
  } catch {}
555
203
  r(e);
556
204
  }
557
- }, o = pe({
205
+ }, o = le({
558
206
  host: e,
559
207
  port: t
560
208
  });
561
209
  o.once("connect", () => a(!0)), o.once("error", () => a(!1)), o.setTimeout(n, () => a(!1));
562
- }), Ct = async (e, t = 400) => ({ families: (await Promise.all(xt.map(async (n) => ({
210
+ }), ke = async (e, t = 400) => ({ families: (await Promise.all(De.map(async (n) => ({
563
211
  family: n.family,
564
- taken: await St(n.host, e, t)
565
- })))).filter((e) => e.taken).map((e) => e.family) }), wt = (e, t, n) => [
212
+ taken: await Oe(n.host, e, t)
213
+ })))).filter((e) => e.taken).map((e) => e.family) }), Ae = (e, t, n) => [
566
214
  `${t}: port ${e} is already being served (${n.join(" + ")}).`,
567
215
  "",
568
216
  " Refusing to start. This is NOT a spurious check — a second listener can",
@@ -577,26 +225,26 @@ __installPublicEnv(publicEnvValues)
577
225
  "",
578
226
  " Then re-run. To use a different port instead, change `port` in",
579
227
  " app.config.ts."
580
- ].join("\n"), Tt = async (e, t) => {
581
- let { families: n } = await Ct(e);
582
- if (n.length !== 0) throw bt(wt(e, t, n));
583
- }, Et = (e) => e === "effect" || e.startsWith("@effect/") || e.startsWith("@voltro/") || e === "react" || e === "react-dom", Dt = /(^|\/)(\.bin|\.cache|\.pnpm-store|dist|build)(\/|$)/, Ot = (e) => {
228
+ ].join("\n"), je = async (e, t) => {
229
+ let { families: n } = await ke(e);
230
+ if (n.length !== 0) throw Ee(Ae(e, t, n));
231
+ }, Me = (e) => e === "effect" || e.startsWith("@effect/") || e.startsWith("@voltro/") || e === "react" || e === "react-dom", Ne = /(^|\/)(\.bin|\.cache|\.pnpm-store|dist|build)(\/|$)/, Pe = (e) => {
584
232
  let t = [], n = e;
585
233
  for (let e = 0; e < 12; e++) {
586
- let e = p(n, "node_modules");
587
- T(e) && t.push(e);
588
- let r = d(n);
234
+ let e = C(n, "node_modules");
235
+ E(e) && t.push(e);
236
+ let r = S(n);
589
237
  if (r === n) break;
590
238
  n = r;
591
239
  }
592
240
  return t;
593
- }, kt = (e) => {
241
+ }, Fe = (e) => {
594
242
  let t = /* @__PURE__ */ new Set([e]), n = e;
595
243
  for (let e = 0; e < 12; e++) {
596
244
  for (let e of ["pnpm-workspace.yaml", "pnpm-workspace.yml"]) {
597
245
  let r;
598
246
  try {
599
- r = k(p(n, e), "utf8");
247
+ r = O(C(n, e), "utf8");
600
248
  } catch {
601
249
  continue;
602
250
  }
@@ -607,38 +255,38 @@ __installPublicEnv(publicEnvValues)
607
255
  if (i === "" || i.includes("*")) continue;
608
256
  let a;
609
257
  try {
610
- a = A(p(n, i), { withFileTypes: !0 });
258
+ a = k(C(n, i), { withFileTypes: !0 });
611
259
  } catch {
612
260
  continue;
613
261
  }
614
- for (let e of a) e.isDirectory() && t.add(p(n, i, e.name));
262
+ for (let e of a) e.isDirectory() && t.add(C(n, i, e.name));
615
263
  }
616
264
  }
617
265
  for (let e of ["packages", "apps"]) {
618
266
  let r;
619
267
  try {
620
- r = A(p(n, e), { withFileTypes: !0 });
268
+ r = k(C(n, e), { withFileTypes: !0 });
621
269
  } catch {
622
270
  continue;
623
271
  }
624
- for (let i of r) i.isDirectory() && t.add(p(n, e, i.name));
272
+ for (let i of r) i.isDirectory() && t.add(C(n, e, i.name));
625
273
  }
626
- let e = d(n);
274
+ let e = S(n);
627
275
  if (e === n) break;
628
276
  n = e;
629
277
  }
630
278
  return [...t];
631
- }, At = (e) => {
279
+ }, Y = (e) => {
632
280
  let t = [];
633
- for (let n of kt(e)) {
634
- let e = p(n, "node_modules", "@voltro"), r;
281
+ for (let n of Fe(e)) {
282
+ let e = C(n, "node_modules", "@voltro"), r;
635
283
  try {
636
- r = A(e);
284
+ r = k(e);
637
285
  } catch {
638
286
  continue;
639
287
  }
640
288
  for (let n of r) {
641
- let r = p(e, n), i = jt(r);
289
+ let r = C(e, n), i = Ie(r);
642
290
  i !== void 0 && t.push({
643
291
  pkg: `@voltro/${n}`,
644
292
  version: i,
@@ -647,38 +295,38 @@ __installPublicEnv(publicEnvValues)
647
295
  }
648
296
  }
649
297
  return t;
650
- }, jt = (e) => {
298
+ }, Ie = (e) => {
651
299
  try {
652
- let t = JSON.parse(k(p(e, "package.json"), "utf8"));
300
+ let t = JSON.parse(O(C(e, "package.json"), "utf8"));
653
301
  return typeof t.version == "string" ? t.version : void 0;
654
302
  } catch {
655
303
  return;
656
304
  }
657
- }, Mt = (e) => {
305
+ }, Le = (e) => {
658
306
  let t = [], n;
659
307
  try {
660
- n = A(e);
308
+ n = k(e);
661
309
  } catch {
662
310
  return t;
663
311
  }
664
312
  for (let r of n) {
665
- if (r.startsWith(".") || Dt.test(r)) continue;
666
- let n = p(e, r);
313
+ if (r.startsWith(".") || Ne.test(r)) continue;
314
+ let n = C(e, r);
667
315
  if (r.startsWith("@")) {
668
316
  let e;
669
317
  try {
670
- e = A(n);
318
+ e = k(n);
671
319
  } catch {
672
320
  continue;
673
321
  }
674
322
  for (let i of e) t.push({
675
323
  pkg: `${r}/${i}`,
676
- dir: p(n, i)
324
+ dir: C(n, i)
677
325
  });
678
326
  continue;
679
327
  }
680
328
  try {
681
- if (!j(n).isDirectory()) continue;
329
+ if (!A(n).isDirectory()) continue;
682
330
  } catch {
683
331
  continue;
684
332
  }
@@ -688,25 +336,25 @@ __installPublicEnv(publicEnvValues)
688
336
  });
689
337
  }
690
338
  return t;
691
- }, Nt = (e) => {
339
+ }, Re = (e) => {
692
340
  let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
693
- if (!Et(e)) return;
341
+ if (!Me(e)) return;
694
342
  let i = t.get(e) ?? /* @__PURE__ */ new Map();
695
343
  i.has(n) || i.set(n, r), t.set(e, i);
696
344
  };
697
- for (let t of Ot(e)) for (let { pkg: e, dir: r } of Mt(t)) {
698
- let t = jt(r);
345
+ for (let t of Pe(e)) for (let { pkg: e, dir: r } of Le(t)) {
346
+ let t = Ie(r);
699
347
  t !== void 0 && n(e, t, r);
700
348
  }
701
- for (let { pkg: t, version: r, dir: i } of At(e)) n(t, r, i);
349
+ for (let { pkg: t, version: r, dir: i } of Y(e)) n(t, r, i);
702
350
  let r = [];
703
351
  for (let [n, i] of t) i.size < 2 || r.push({
704
352
  pkg: n,
705
353
  versions: [...i.keys()].sort(),
706
- paths: [...i.values()].map((t) => m(e, t)).sort()
354
+ paths: [...i.values()].map((t) => w(e, t)).sort()
707
355
  });
708
356
  return r.sort((e, t) => e.pkg.localeCompare(t.pkg));
709
- }, Pt = (e) => {
357
+ }, ze = (e) => {
710
358
  if (e.length !== 0) return [
711
359
  `• ${e.length} package(s) resolved at more than one version:`,
712
360
  ...e.flatMap((e) => [` ${e.pkg} — ${e.versions.join(", ")}`, ...e.paths.map((e) => ` ${e}`)]),
@@ -724,11 +372,11 @@ __installPublicEnv(publicEnvValues)
724
372
  " instrument), then reinstall. Do not silence the generated file — it is where",
725
373
  " a genuine mistake in your own descriptors surfaces."
726
374
  ].join("\n");
727
- }, Ft = (e) => {
375
+ }, Be = (e) => {
728
376
  let t = /* @__PURE__ */ new Map();
729
- for (let n of Ot(e)) for (let { pkg: e, dir: r } of Mt(n)) {
377
+ for (let n of Pe(e)) for (let { pkg: e, dir: r } of Le(n)) {
730
378
  if (!e.startsWith("@voltro/")) continue;
731
- let n = jt(r);
379
+ let n = Ie(r);
732
380
  n !== void 0 && !t.has(e) && t.set(e, n);
733
381
  }
734
382
  if (t.size < 2) return;
@@ -743,7 +391,7 @@ __installPublicEnv(publicEnvValues)
743
391
  version: t
744
392
  })).sort((e, t) => e.pkg.localeCompare(t.pkg))
745
393
  };
746
- }, It = (e) => {
394
+ }, Ve = (e) => {
747
395
  if (e !== void 0) return [
748
396
  `• ${e.behind.length} @voltro/* package(s) are not on ${e.majority}:`,
749
397
  ...e.behind.map((e) => ` ${e.pkg} ${e.version}`),
@@ -761,60 +409,84 @@ __installPublicEnv(publicEnvValues)
761
409
  " its pattern: the one that produced this report was `@voltro/[a-z-]+`,",
762
410
  " which silently skips `@voltro/i18n` because the name contains digits."
763
411
  ].join("\n");
764
- }, Lt = (e, t) => {
765
- let n = Ft(e);
412
+ }, He = (e, t) => {
413
+ let n = Be(e);
766
414
  n !== void 0 && t.warn?.(`@voltro/* version skew: ${n.behind.length} package(s) are not on ${n.majority}`, {
767
415
  majority: n.majority,
768
416
  behind: n.behind.map((e) => `${e.pkg}@${e.version}`),
769
417
  fix: "the framework ships in lockstep; bump the listed packages and reinstall"
770
418
  });
771
- }, Rt = S({ scope: "vite" }), zt = /\x1b\[[0-9;]*m/g, Bt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Vt = (e) => e.replace(zt, "").replace(Bt, "").trim(), Ht = /proxy error/i, Ut = [
419
+ }, Ue = I({ scope: "vite" }), We = /\x1b\[[0-9;]*m/g, Ge = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Ke = (e) => e.replace(We, "").replace(Ge, "").trim(), qe = /proxy error/i, Je = [
772
420
  "ECONNREFUSED",
773
421
  "ECONNRESET",
774
422
  "ECONNABORTED",
775
423
  "EPIPE",
776
424
  "ETIMEDOUT"
777
- ], Wt = (e, t = 0) => {
425
+ ], Ye = (e, t = 0) => {
778
426
  if (e == null || t > 5) return !1;
779
427
  let n = e;
780
- return typeof n.code == "string" && Ut.includes(n.code) || typeof n.message == "string" && Ut.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Wt(e, t + 1)) ? !0 : Wt(n.cause, t + 1);
781
- }, Gt = 4e3, Kt = () => {
428
+ return typeof n.code == "string" && Je.includes(n.code) || typeof n.message == "string" && Je.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Ye(e, t + 1)) ? !0 : Ye(n.cause, t + 1);
429
+ }, Xe = 4e3, Ze = () => {
782
430
  let e = /* @__PURE__ */ new Set(), t = 0, n = {
783
431
  hasWarned: !1,
784
432
  info: (e) => {
785
- let t = Vt(e);
786
- t.length !== 0 && Rt.info(t);
433
+ let t = Ke(e);
434
+ t.length !== 0 && Ue.info(t);
787
435
  },
788
436
  warn: (e) => {
789
437
  n.hasWarned = !0;
790
- let t = Vt(e);
791
- t.length !== 0 && Rt.warn(t);
438
+ let t = Ke(e);
439
+ t.length !== 0 && Ue.warn(t);
792
440
  },
793
441
  warnOnce: (t) => {
794
- let r = Vt(t);
795
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Rt.warn(r));
442
+ let r = Ke(t);
443
+ e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Ue.warn(r));
796
444
  },
797
445
  error: (e, n) => {
798
- let r = Vt(e), i = n?.error;
446
+ let r = Ke(e), i = n?.error;
799
447
  if (r.length !== 0) {
800
- if (Ht.test(r) && Wt(i)) {
448
+ if (qe.test(r) && Ye(i)) {
801
449
  let e = Date.now();
802
- e - t > Gt && (t = e, Rt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
450
+ e - t > Xe && (t = e, Ue.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
803
451
  return;
804
452
  }
805
- Rt.error(r, {}, i);
453
+ Ue.error(r, {}, i);
806
454
  }
807
455
  },
808
456
  clearScreen: () => {},
809
457
  hasErrorLogged: (e) => !1
810
458
  };
811
459
  return n;
812
- }, qt = (e = process.env) => {
460
+ }, Qe = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), $e = (e) => {
461
+ try {
462
+ let t = C(e, "tsconfig.json");
463
+ if (!E(t)) return [];
464
+ let n = JSON.parse(Qe(O(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = T(e, n.baseUrl ?? "."), a = [];
465
+ for (let [e, t] of Object.entries(r)) {
466
+ let n = t[0];
467
+ if (!n) continue;
468
+ let r = n.replace(/\\/g, "/");
469
+ if (!(r.includes("/@types/") || r.endsWith(".d.ts"))) if (e.endsWith("/*") && n.endsWith("/*")) {
470
+ let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
471
+ a.push({
472
+ find: RegExp(`^${t}/(.*)$`),
473
+ replacement: `${C(i, n.slice(0, -2))}/$1`
474
+ });
475
+ } else a.push({
476
+ find: e,
477
+ replacement: C(i, n)
478
+ });
479
+ }
480
+ return a;
481
+ } catch {
482
+ return [];
483
+ }
484
+ }, et = (e = process.env) => {
813
485
  let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
814
486
  if (t === void 0 || t.trim() === "") return 4;
815
487
  let n = Number(t);
816
488
  return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
817
- }, Jt = (e) => {
489
+ }, tt = (e) => {
818
490
  let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
819
491
  let e = r.shift();
820
492
  e ? e() : n--;
@@ -832,8 +504,8 @@ __installPublicEnv(publicEnvValues)
832
504
  return n;
833
505
  }
834
506
  };
835
- }, Yt = (e) => {
836
- let t = Jt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
507
+ }, nt = (e) => {
508
+ let t = tt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
837
509
  return {
838
510
  load: (i, a) => {
839
511
  if (r.has(i)) return a();
@@ -863,7 +535,7 @@ __installPublicEnv(publicEnvValues)
863
535
  return r.size;
864
536
  }
865
537
  };
866
- }, Xt = (e) => {
538
+ }, rt = (e) => {
867
539
  let t = [];
868
540
  for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
869
541
  name: n.slice(5, -2),
@@ -879,12 +551,12 @@ __installPublicEnv(publicEnvValues)
879
551
  optional: !1
880
552
  });
881
553
  return t;
882
- }, Zt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Qt = async (e) => {
883
- let t = h(e);
554
+ }, it = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), at = async (e) => {
555
+ let t = T(e);
884
556
  for (let e = 0; e < 4; e++) {
885
- let e = p(t, "project.json");
886
- if (T(e)) try {
887
- let n = await O.readFile(e, "utf8");
557
+ let e = C(t, "project.json");
558
+ if (E(e)) try {
559
+ let n = await D.readFile(e, "utf8");
888
560
  return {
889
561
  projectDir: t,
890
562
  manifest: JSON.parse(n)
@@ -892,38 +564,38 @@ __installPublicEnv(publicEnvValues)
892
564
  } catch {
893
565
  return null;
894
566
  }
895
- let n = d(t);
567
+ let n = S(t);
896
568
  if (n === t) break;
897
569
  t = n;
898
570
  }
899
571
  return null;
900
- }, $t = async (e) => {
901
- let t = await Qt(e);
572
+ }, ot = async (e) => {
573
+ let t = await at(e);
902
574
  if (!t) return [];
903
- let { projectDir: n, manifest: r } = t, i = u(e), a = r.apps ?? {}, o = [];
575
+ let { projectDir: n, manifest: r } = t, i = x(e), a = r.apps ?? {}, o = [];
904
576
  for (let [e, t] of Object.entries(a)) {
905
577
  if (e === i || t.kind !== "web" || typeof t.port != "number") continue;
906
- let r = p(p(n, t.path ?? e), "src", "pages");
907
- if (!T(r)) continue;
578
+ let r = C(C(n, t.path ?? e), "src", "pages");
579
+ if (!E(r)) continue;
908
580
  let a;
909
581
  try {
910
- let { pages: e } = await Q(r);
582
+ let { pages: e } = await $(r);
911
583
  a = e.map((e) => ({
912
584
  pattern: e.pattern,
913
- params: Xt(e.pattern)
585
+ params: rt(e.pattern)
914
586
  }));
915
587
  } catch {
916
588
  continue;
917
589
  }
918
590
  o.push({
919
- key: Zt(e),
591
+ key: it(e),
920
592
  origin: `http://localhost:${t.port}`,
921
593
  ...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
922
594
  routes: a
923
595
  });
924
596
  }
925
597
  return o;
926
- }, en = (e) => {
598
+ }, st = (e) => {
927
599
  if (e.params.length === 0) return `'${e.pattern}'`;
928
600
  let t = e.pattern;
929
601
  for (let n of e.params) {
@@ -931,21 +603,21 @@ __installPublicEnv(publicEnvValues)
931
603
  t = t.replace(e, r);
932
604
  }
933
605
  return "`" + t + "`";
934
- }, tn = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
606
+ }, ct = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
935
607
  let t = "string";
936
608
  return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
937
- }).join("; ")} }`, nn = (e, t, n) => {
938
- let r = tn(e), i = en(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
609
+ }).join("; ")} }`, lt = (e, t, n) => {
610
+ let r = ct(e), i = st(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
939
611
  return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
940
- }, rn = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${nn(e, !1)},`).join("\n")}\n}`, an = (e, t) => {
612
+ }, ut = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${lt(e, !1)},`).join("\n")}\n}`, dt = (e, t) => {
941
613
  if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
942
- 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)}: ${nn(e, !0, i)},`);
614
+ 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)}: ${lt(e, !0, i)},`);
943
615
  return ` ${e.key}: {\n${a.join("\n")}\n },`;
944
- }, on = async (e) => {
616
+ }, ft = async (e) => {
945
617
  let t = e.pages.map((e) => ({
946
618
  pattern: e.pattern,
947
- params: Xt(e.pattern)
948
- })), n = await $t(e.appRoot), r = [
619
+ params: rt(e.pattern)
620
+ })), n = await ot(e.appRoot), r = [
949
621
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
950
622
  "// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
951
623
  "// Type-safe route builders consumed by <Link to={...}>.",
@@ -954,50 +626,50 @@ __installPublicEnv(publicEnvValues)
954
626
  "",
955
627
  "type EmptyParams = Record<string, never>",
956
628
  ""
957
- ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${rn(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => an(e, i)).join("\n")}\n} as const\n`}`, o = p(e.appRoot, ".framework", "routes.generated.ts");
958
- await O.mkdir(d(o), { recursive: !0 });
629
+ ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${ut(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => dt(e, i)).join("\n")}\n} as const\n`}`, o = C(e.appRoot, ".framework", "routes.generated.ts");
630
+ await D.mkdir(S(o), { recursive: !0 });
959
631
  let s = null;
960
632
  try {
961
- s = await O.readFile(o, "utf8");
633
+ s = await D.readFile(o, "utf8");
962
634
  } catch {}
963
635
  return s === a ? {
964
636
  path: o,
965
637
  wrote: !1
966
- } : (await O.writeFile(o, a, "utf8"), {
638
+ } : (await D.writeFile(o, a, "utf8"), {
967
639
  path: o,
968
640
  wrote: !0
969
641
  });
970
- }, sn = (e) => {
642
+ }, pt = (e) => {
971
643
  if (e === "" || e === "/") return "/";
972
644
  let t = e.startsWith("/") ? e : `/${e}`;
973
645
  return t.endsWith("/") ? t.slice(0, -1) : t;
974
- }, cn = (e, t) => {
975
- let n = e.endsWith("/") ? e.slice(0, -1) : e, r = sn(t);
646
+ }, mt = (e, t) => {
647
+ let n = e.endsWith("/") ? e.slice(0, -1) : e, r = pt(t);
976
648
  return r === "/" ? `${n}/` : `${n}${r}`;
977
- }, ln = (e, t, n) => {
978
- let r = sn(e);
649
+ }, ht = (e, t, n) => {
650
+ let r = pt(e);
979
651
  return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
980
- }, un = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), dn = (e) => {
652
+ }, gt = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), _t = (e) => {
981
653
  let { siteUrl: t, entries: n } = e, r = e.locales && e.locales.length > 1 ? e.locales : void 0, i = e.defaultLocale ?? r?.[0] ?? "en", a = r !== void 0, o = /* @__PURE__ */ new Map(), s = (e) => {
982
654
  if (!r) return "";
983
- let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${un(n)}" href="${un(cn(t, ln(e, n, i)))}" />`);
984
- return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${un(cn(t, ln(e, i, i)))}" />`), `\n${n.join("\n")}`;
655
+ let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${gt(n)}" href="${gt(mt(t, ht(e, n, i)))}" />`);
656
+ return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${gt(mt(t, ht(e, i, i)))}" />`), `\n${n.join("\n")}`;
985
657
  };
986
658
  for (let e of n) {
987
659
  let n = r ?? [i];
988
660
  for (let r of n) {
989
- let n = cn(t, ln(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${un(e.lastmod)}</lastmod>` : "";
990
- o.set(n, ` <url>\n <loc>${un(n)}</loc>${a}${s(e.path)}\n </url>`);
661
+ let n = mt(t, ht(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${gt(e.lastmod)}</lastmod>` : "";
662
+ o.set(n, ` <url>\n <loc>${gt(n)}</loc>${a}${s(e.path)}\n </url>`);
991
663
  }
992
664
  }
993
665
  let c = [...o.keys()].sort().map((e) => o.get(e)).join("\n");
994
666
  return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset${a ? " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"" : " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\""}>\n${c}\n</urlset>\n`;
995
- }, fn = (e) => {
667
+ }, vt = (e) => {
996
668
  if (!e.indexable) return "User-agent: *\nDisallow: /\n";
997
669
  let t = ["User-agent: *", "Allow: /"];
998
- for (let n of e.disallow ?? []) t.push(`Disallow: ${sn(n)}`);
670
+ for (let n of e.disallow ?? []) t.push(`Disallow: ${pt(n)}`);
999
671
  return e.sitemapUrl && t.push("", `Sitemap: ${e.sitemapUrl}`), `${t.join("\n")}\n`;
1000
- }, pn = 256, mn = (e = pn) => {
672
+ }, yt = 256, bt = (e = yt) => {
1001
673
  let t = [], n = /* @__PURE__ */ new Set();
1002
674
  return {
1003
675
  emit(r, i) {
@@ -1020,17 +692,17 @@ __installPublicEnv(publicEnvValues)
1020
692
  return t.slice();
1021
693
  }
1022
694
  };
1023
- }, hn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, gn = () => `: keep-alive ${Date.now()}\n\n`, _n = 8e3, vn = (e, t = _n) => {
1024
- let n = bn(e);
695
+ }, xt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, St = () => `: keep-alive ${Date.now()}\n\n`, Ct = 8e3, wt = (e, t = Ct) => {
696
+ let n = Et(e);
1025
697
  return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
1026
- }, yn = 4, bn = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
698
+ }, Tt = 4, Et = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
1027
699
  if (e instanceof Error) {
1028
700
  let r = e.stack ?? `${e.name}: ${e.message}`;
1029
701
  if (n.has(e)) return `${r}\n [cycle]`;
1030
702
  n.add(e);
1031
703
  let i = [];
1032
- if (t < yn) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${xn(bn(a, t + 1, n))}`);
1033
- else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${xn(bn(e.cause, t + 1, n))}`);
704
+ if (t < Tt) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${Dt(Et(a, t + 1, n))}`);
705
+ else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${Dt(Et(e.cause, t + 1, n))}`);
1034
706
  return r + i.join("");
1035
707
  }
1036
708
  try {
@@ -1038,30 +710,30 @@ __installPublicEnv(publicEnvValues)
1038
710
  } catch {
1039
711
  return "[unstringifiable thrown value]";
1040
712
  }
1041
- }, xn = (e) => {
713
+ }, Dt = (e) => {
1042
714
  let t = e.split("\n");
1043
715
  return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
1044
- }, Sn = {
716
+ }, Ot = {
1045
717
  trace: 0,
1046
718
  debug: 1,
1047
719
  info: 2,
1048
720
  warn: 3,
1049
721
  error: 4,
1050
722
  fatal: 5
1051
- }, Cn = 2e3, wn = 200, Tn = class {
723
+ }, kt = 2e3, At = 200, jt = class {
1052
724
  capacity;
1053
725
  buffer = [];
1054
- constructor(e = Cn) {
726
+ constructor(e = kt) {
1055
727
  this.capacity = e;
1056
728
  }
1057
729
  append(e) {
1058
730
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
1059
731
  }
1060
732
  query(e = {}) {
1061
- let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? wn, this.capacity), i = e.minLevel === void 0 ? Sn.trace : Sn[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
733
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? At, this.capacity), i = e.minLevel === void 0 ? Ot.trace : Ot[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
1062
734
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
1063
735
  let r = this.buffer[e];
1064
- r.ts < t || r.ts > n || Sn[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);
736
+ r.ts < t || r.ts > n || Ot[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);
1065
737
  }
1066
738
  return l.reverse();
1067
739
  }
@@ -1074,7 +746,7 @@ __installPublicEnv(publicEnvValues)
1074
746
  clear() {
1075
747
  this.buffer = [];
1076
748
  }
1077
- }, En = null, Dn = () => (En === null && (En = new Tn()), En), On = (e) => {
749
+ }, Mt = null, Nt = () => (Mt === null && (Mt = new jt()), Mt), Pt = (e) => {
1078
750
  if (typeof e == "string") return e;
1079
751
  if (e instanceof Error) return e.message;
1080
752
  try {
@@ -1082,28 +754,28 @@ __installPublicEnv(publicEnvValues)
1082
754
  } catch {
1083
755
  return String(e);
1084
756
  }
1085
- }, kn = 8e3, An = (e) => typeof e == "string" ? e.length <= kn ? e : `${e.slice(0, kn)}… [voltro: truncated]` : typeof e != "object" || !e ? e : vn(e, kn), jn = (e, t) => {
757
+ }, Ft = 8e3, It = (e) => typeof e == "string" ? e.length <= Ft ? e : `${e.slice(0, Ft)}… [voltro: truncated]` : typeof e != "object" || !e ? e : wt(e, Ft), Lt = (e, t) => {
1086
758
  try {
1087
759
  e(...t);
1088
760
  } catch (n) {
1089
761
  try {
1090
- e(...t.map(An)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${kn} chars per argument.`);
762
+ e(...t.map(It)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${Ft} chars per argument.`);
1091
763
  } catch {
1092
764
  e(`[voltro] a console.error argument could not be formatted at all (${t.length} arg(s)).`);
1093
765
  }
1094
766
  }
1095
- }, Mn = (e) => {
767
+ }, Rt = (e) => {
1096
768
  let t = {
1097
769
  log: console.log.bind(console),
1098
770
  info: console.info.bind(console),
1099
771
  warn: console.warn.bind(console),
1100
772
  error: console.error.bind(console),
1101
773
  debug: console.debug.bind(console)
1102
- }, n = Dn(), r = !1, i = (i) => (...a) => {
1103
- if (jn(t[i], a), !r) {
774
+ }, n = Nt(), r = !1, i = (i) => (...a) => {
775
+ if (Lt(t[i], a), !r) {
1104
776
  r = !0;
1105
777
  try {
1106
- let t = a.length > 0 ? On(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = F();
778
+ let t = a.length > 0 ? Pt(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = z();
1107
779
  e.emit("log", {
1108
780
  level: i,
1109
781
  message: r,
@@ -1130,7 +802,7 @@ __installPublicEnv(publicEnvValues)
1130
802
  }
1131
803
  };
1132
804
  console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
1133
- let a = x((t) => {
805
+ let a = F((t) => {
1134
806
  if (!r) {
1135
807
  r = !0;
1136
808
  try {
@@ -1141,7 +813,7 @@ __installPublicEnv(publicEnvValues)
1141
813
  argsCount: 1,
1142
814
  ...t.scope === void 0 ? {} : { scope: t.scope }
1143
815
  });
1144
- let a = F(), o = a !== void 0 && t.fields.traceId === void 0 ? {
816
+ let a = z(), o = a !== void 0 && t.fields.traceId === void 0 ? {
1145
817
  ...t.fields,
1146
818
  traceId: a.traceId
1147
819
  } : t.fields;
@@ -1161,24 +833,24 @@ __installPublicEnv(publicEnvValues)
1161
833
  return () => {
1162
834
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
1163
835
  };
1164
- }, Nn = 2e3, Pn = 8, Fn = 1e3, In = 200, J = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Ln = (e) => {
836
+ }, zt = 2e3, Bt = 8, Vt = 1e3, Ht = 200, X = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Ut = (e) => {
1165
837
  switch (e) {
1166
838
  case "error": return "error";
1167
839
  case "warn": return "warn";
1168
840
  case "debug": return "debug";
1169
841
  default: return "info";
1170
842
  }
1171
- }, Rn = S({ scope: "client" }), zn = (e, t) => {
843
+ }, Wt = I({ scope: "client" }), Gt = (e, t) => {
1172
844
  let n;
1173
845
  try {
1174
846
  n = JSON.parse(e);
1175
847
  } catch {
1176
- return Bn(400, { error: "invalid JSON body" });
848
+ return Kt(400, { error: "invalid JSON body" });
1177
849
  }
1178
- if (typeof n != "object" || !n) return Bn(400, { error: "body must be a JSON object" });
850
+ if (typeof n != "object" || !n) return Kt(400, { error: "body must be a JSON object" });
1179
851
  let r = n;
1180
- if (!Array.isArray(r.entries)) return Bn(400, { error: "entries must be an array" });
1181
- let i = typeof r.app == "string" ? J(r.app, 120) : void 0, a = typeof r.page == "string" ? J(r.page, 200) : void 0, o = typeof r.ua == "string" ? J(r.ua, 200) : void 0, s = r.entries.slice(0, In), c = 0;
852
+ if (!Array.isArray(r.entries)) return Kt(400, { error: "entries must be an array" });
853
+ let i = typeof r.app == "string" ? X(r.app, 120) : void 0, a = typeof r.page == "string" ? X(r.page, 200) : void 0, o = typeof r.ua == "string" ? X(r.ua, 200) : void 0, s = r.entries.slice(0, Ht), c = 0;
1182
854
  for (let e of s) {
1183
855
  if (typeof e != "object" || !e) continue;
1184
856
  let n = e;
@@ -1189,7 +861,7 @@ __installPublicEnv(publicEnvValues)
1189
861
  "warn",
1190
862
  "error",
1191
863
  "debug"
1192
- ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = J(n.message, Nn), u = Array.isArray(n.args) ? n.args.slice(0, Pn).filter((e) => typeof e == "string").map((e) => J(e, Fn)) : void 0, d = typeof n.stack == "string" ? J(n.stack, Nn) : void 0;
864
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = X(n.message, zt), u = Array.isArray(n.args) ? n.args.slice(0, Bt).filter((e) => typeof e == "string").map((e) => X(e, Vt)) : void 0, d = typeof n.stack == "string" ? X(n.stack, zt) : void 0;
1193
865
  t.emit("clientLog", {
1194
866
  ts: s,
1195
867
  level: r,
@@ -1204,36 +876,36 @@ __installPublicEnv(publicEnvValues)
1204
876
  ...i === void 0 ? {} : { app: i },
1205
877
  ...a === void 0 ? {} : { page: a },
1206
878
  ...u !== void 0 && u.length > 0 ? { args: u } : {}
1207
- }, p = Ln(r);
1208
- (p === "error" || p === "warn") && d !== void 0 ? Rn[p](l, f, { stack: d }) : Rn[p](l, {
879
+ }, p = Ut(r);
880
+ (p === "error" || p === "warn") && d !== void 0 ? Wt[p](l, f, { stack: d }) : Wt[p](l, {
1209
881
  ...f,
1210
882
  ...d === void 0 ? {} : { stack: d }
1211
883
  }), c++;
1212
884
  }
1213
- return Bn(202, {
885
+ return Kt(202, {
1214
886
  accepted: c,
1215
887
  dropped: r.entries.length - c
1216
888
  });
1217
- }, Bn = (e, t) => ({
889
+ }, Kt = (e, t) => ({
1218
890
  status: e,
1219
891
  contentType: "application/json; charset=utf-8",
1220
892
  body: JSON.stringify(t)
1221
- }), Vn = "/_voltro/inspect/clientLog", Hn = [
893
+ }), qt = "/_voltro/inspect/clientLog", Jt = [
1222
894
  "trace",
1223
895
  "debug",
1224
896
  "info",
1225
897
  "warn",
1226
898
  "error",
1227
899
  "fatal"
1228
- ], Un = {
900
+ ], Yt = {
1229
901
  trace: "TRACE",
1230
902
  debug: "DEBUG",
1231
903
  info: "INFO ",
1232
904
  warn: "WARN ",
1233
905
  error: "ERROR",
1234
906
  fatal: "FATAL"
1235
- }, Wn = (e) => Hn.includes(e), Gn = (e, t, n = {}) => {
1236
- if (c()) return {
907
+ }, Xt = (e) => Jt.includes(e), Zt = (e, t, n = {}) => {
908
+ if (a()) return {
1237
909
  status: 503,
1238
910
  contentType: "application/json",
1239
911
  body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
@@ -1247,36 +919,36 @@ __installPublicEnv(publicEnvValues)
1247
919
  reason: r.reason
1248
920
  })
1249
921
  };
1250
- let i = e.indexOf("?"), a = i === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(i + 1)), o = {}, l = a.get("since");
922
+ let i = e.indexOf("?"), o = i === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(i + 1)), c = {}, l = o.get("since");
1251
923
  if (l !== null) {
1252
924
  let e = Number(l);
1253
- Number.isFinite(e) && (o.since = e);
925
+ Number.isFinite(e) && (c.since = e);
1254
926
  }
1255
- let u = a.get("until");
927
+ let u = o.get("until");
1256
928
  if (u !== null) {
1257
929
  let e = Number(u);
1258
- Number.isFinite(e) && (o.until = e);
930
+ Number.isFinite(e) && (c.until = e);
1259
931
  }
1260
- let d = a.get("max");
932
+ let d = o.get("max");
1261
933
  if (d !== null) {
1262
934
  let e = Number(d);
1263
- Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
1264
- }
1265
- let f = a.get("level");
1266
- f !== null && Wn(f) && (o.minLevel = f);
1267
- let p = a.get("source");
1268
- (p === "server" || p === "client") && (o.source = p);
1269
- let m = a.get("scope");
1270
- m !== null && m.length > 0 && (o.scope = m);
1271
- let h = a.get("filter");
1272
- h !== null && h.length > 0 && (o.filter = h);
1273
- let g = a.get("trace");
1274
- g !== null && g.length > 0 && (o.traceId = g);
1275
- let _ = t.query(o);
1276
- if ((a.get("format") ?? "json") === "text") return {
935
+ Number.isFinite(e) && e > 0 && (c.max = Math.floor(e));
936
+ }
937
+ let f = o.get("level");
938
+ f !== null && Xt(f) && (c.minLevel = f);
939
+ let p = o.get("source");
940
+ (p === "server" || p === "client") && (c.source = p);
941
+ let m = o.get("scope");
942
+ m !== null && m.length > 0 && (c.scope = m);
943
+ let h = o.get("filter");
944
+ h !== null && h.length > 0 && (c.filter = h);
945
+ let g = o.get("trace");
946
+ g !== null && g.length > 0 && (c.traceId = g);
947
+ let _ = t.query(c);
948
+ if ((o.get("format") ?? "json") === "text") return {
1277
949
  status: 200,
1278
950
  contentType: "text/plain; charset=utf-8",
1279
- body: _.map(Kn).join("\n") + (_.length > 0 ? "\n" : "")
951
+ body: _.map(Qt).join("\n") + (_.length > 0 ? "\n" : "")
1280
952
  };
1281
953
  let v = {
1282
954
  capturedAt: Date.now(),
@@ -1290,40 +962,40 @@ __installPublicEnv(publicEnvValues)
1290
962
  contentType: "application/json; charset=utf-8",
1291
963
  body: JSON.stringify(v)
1292
964
  };
1293
- }, Kn = (e) => {
1294
- 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 = Jn(e.fields);
1295
- return `${n}:${r}:${i}.${a} ${Un[e.level]} ${o} ${e.message}${s}`;
1296
- }, qn = 80, Jn = (e) => {
965
+ }, Qt = (e) => {
966
+ 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 = en(e.fields);
967
+ return `${n}:${r}:${i}.${a} ${Yt[e.level]} ${o} ${e.message}${s}`;
968
+ }, $t = 80, en = (e) => {
1297
969
  let t = Object.entries(e);
1298
970
  if (t.length === 0) return "";
1299
971
  let n = [];
1300
972
  for (let [e, r] of t) {
1301
973
  if (r === void 0) continue;
1302
- let t = Yn(r);
974
+ let t = tn(r);
1303
975
  n.push(`${e}=${t}`);
1304
976
  }
1305
977
  return n.length > 0 ? " " + n.join(" ") : "";
1306
- }, Yn = (e) => {
978
+ }, tn = (e) => {
1307
979
  if (typeof e == "string") {
1308
- let t = e.length > qn ? e.slice(0, qn) + "…" : e;
980
+ let t = e.length > $t ? e.slice(0, $t) + "…" : e;
1309
981
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1310
982
  }
1311
983
  if (e === null) return "null";
1312
984
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1313
985
  try {
1314
986
  let t = JSON.stringify(e);
1315
- return t.length > qn ? t.slice(0, qn) + "…" : t;
987
+ return t.length > $t ? t.slice(0, $t) + "…" : t;
1316
988
  } catch {
1317
989
  return "[unserialisable]";
1318
990
  }
1319
- }, Xn = "/_voltro/inspect/logs", Zn = (e, t, n) => {
991
+ }, nn = "/_voltro/inspect/logs", rn = (e, t, n) => {
1320
992
  if (t.headers.authorization !== void 0) return !1;
1321
993
  let { token: r } = n;
1322
994
  if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
1323
995
  e.setHeader("authorization", `Bearer ${r}`);
1324
996
  let i = n.writeToken;
1325
997
  return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
1326
- }, Qn = [{
998
+ }, an = [{
1327
999
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1328
1000
  handle: (e, t) => {
1329
1001
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1335,13 +1007,13 @@ __installPublicEnv(publicEnvValues)
1335
1007
  });
1336
1008
  } else t.info(n);
1337
1009
  }
1338
- }], $n = () => {
1010
+ }], on = () => {
1339
1011
  let e = {
1340
1012
  warn: console.warn.bind(console),
1341
1013
  error: console.error.bind(console)
1342
- }, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1014
+ }, t = I({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1343
1015
  if (!n) {
1344
- for (let e of Qn) if (e.match(i[0])) {
1016
+ for (let e of an) if (e.match(i[0])) {
1345
1017
  n = !0;
1346
1018
  try {
1347
1019
  e.handle(i, t);
@@ -1356,7 +1028,7 @@ __installPublicEnv(publicEnvValues)
1356
1028
  return console.warn = r("warn"), console.error = r("error"), () => {
1357
1029
  console.warn = e.warn, console.error = e.error;
1358
1030
  };
1359
- }, er = {
1031
+ }, sn = {
1360
1032
  loader: "it runs on the server, and the router caches its result per route + params",
1361
1033
  renderMode: "it picks the server render strategy",
1362
1034
  dynamic: "it picks the server render strategy",
@@ -1367,7 +1039,7 @@ __installPublicEnv(publicEnvValues)
1367
1039
  cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1368
1040
  interactive: "it decides how much client JS the server ships",
1369
1041
  tenantAware: "it is part of the server-side cache key"
1370
- }, tr = Object.keys(er), nr = (e) => t.test(e), rr = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), ir = "virtual:voltro-route-refresh", ar = `\0${ir}`, or = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, sr = () => `
1042
+ }, cn = Object.keys(sn), ln = "virtual:voltro-route-refresh", un = `\0${ln}`, dn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, fn = () => `
1371
1043
  // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1372
1044
 
1373
1045
  /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
@@ -1396,11 +1068,11 @@ const stableForm = (value) => {
1396
1068
  * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1397
1069
  * one of THESE cannot be hot-applied: the server already ran with the old
1398
1070
  * value. Everything else a page exports is plain client-side data. */
1399
- const serverRelevantExports = ${JSON.stringify(tr)}
1071
+ const serverRelevantExports = ${JSON.stringify(cn)}
1400
1072
 
1401
1073
  /** Name → the server step that already consumed it, so the reload message can
1402
1074
  * say WHY rather than just WHAT. Injected from the same single source. */
1403
- const serverExportEffect = ${JSON.stringify(er)}
1075
+ const serverExportEffect = ${JSON.stringify(sn)}
1404
1076
 
1405
1077
  /** The reason \`name\` forces a reload, for the console line. */
1406
1078
  export const serverEffectOf = (name) =>
@@ -1443,7 +1115,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
1443
1115
  const previousHook = globalThis.__getReactRefreshIgnoredExports
1444
1116
  globalThis.__getReactRefreshIgnoredExports = (args) =>
1445
1117
  ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
1446
- `, cr = (e) => `
1118
+ `, pn = (e) => `
1447
1119
  if (import.meta.hot) {
1448
1120
  // Self-import to read our OWN exports, the same technique the react plugin
1449
1121
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -1470,254 +1142,97 @@ import {
1470
1142
  registerRouteModule as __voltro_registerRouteModule,
1471
1143
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
1472
1144
  serverEffectOf as __voltro_serverEffect,
1473
- } from '${ir}'
1474
- `, lr = (e) => e.replace(/\\/g, "/"), ur = (e, t) => {
1475
- let [i = "", a] = lr(e).split("?");
1476
- if (!i.endsWith(".tsx") || a !== void 0 && or.test(a)) return !1;
1477
- let o = lr(t).replace(/\/$/, "");
1478
- return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
1479
- }, dr = (e, t, n) => ur(t, n) ? `${e}${cr(lr(t).split("?")[0] ?? t)}` : null, fr = (e) => ({
1145
+ } from '${ln}'
1146
+ `, mn = (e) => e.replace(/\\/g, "/"), hn = (e, t) => {
1147
+ let [n = "", a] = mn(e).split("?");
1148
+ if (!n.endsWith(".tsx") || a !== void 0 && dn.test(a)) return !1;
1149
+ let o = mn(t).replace(/\/$/, "");
1150
+ return n.startsWith(`${o}/`) ? i.test(n) || r.has(n.slice(n.lastIndexOf("/") + 1)) : !1;
1151
+ }, gn = (e, t, n) => hn(t, n) ? `${e}${pn(mn(t).split("?")[0] ?? t)}` : null, _n = (e) => ({
1480
1152
  name: "voltro:route-fast-refresh",
1481
1153
  enforce: "pre",
1482
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? ar : void 0,
1483
- load: (e) => e === ar ? sr() : void 0,
1154
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? un : void 0,
1155
+ load: (e) => e === un ? fn() : void 0,
1484
1156
  transform: (t, n, r) => {
1485
1157
  if (r?.ssr === !0) return null;
1486
- let i = dr(t, n, e);
1158
+ let i = gn(t, n, e);
1487
1159
  return i === null ? null : {
1488
1160
  code: i,
1489
1161
  map: null
1490
1162
  };
1491
1163
  }
1492
- }), pr = [
1493
- "static",
1494
- "spa",
1495
- "ssr",
1496
- "isr"
1497
- ], mr = (e) => typeof e == "string" && pr.includes(e), hr = pr.map((e) => `'${e}'`).join(" | "), gr = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${hr}.${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)." : ""}`, _r = class extends Error {
1498
- page;
1499
- value;
1500
- name = "InvalidRenderModeError";
1501
- constructor(e, t) {
1502
- super(gr(e, t)), this.page = e, this.value = t;
1503
- }
1504
- }, vr = (e, t = "<page>") => {
1505
- if (e.renderMode !== void 0 && e.renderMode !== null) {
1506
- if (!mr(e.renderMode)) throw new _r(t, String(e.renderMode));
1507
- return e.renderMode;
1508
- }
1509
- return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
1510
- }, yr = (e, t = "<page>") => ({
1511
- renderMode: vr(e, t),
1512
- tenantAware: e.tenantAware === !0,
1513
- revalidateMs: lt(e.revalidate),
1514
- staleWhileRevalidateMs: lt(e.staleWhileRevalidate) ?? 0,
1515
- cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
1516
- interactive: e.interactive ?? "full",
1517
- hasLoader: typeof e.loader == "function",
1518
- hasMeta: e.meta != null,
1519
- hasGetStaticPaths: typeof e.getStaticPaths == "function"
1520
- }), br = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, xr = (e) => br.exec(e)?.[1] ?? null, Sr = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, Cr = (e) => {
1521
- Sr.lastIndex = 0;
1522
- let t;
1523
- for (; (t = Sr.exec(e)) !== null;) {
1524
- let e = t[2];
1525
- if (e.startsWith(".")) for (let n of t[1].split(",")) {
1526
- let t = n.lastIndexOf(" as ");
1527
- if ((t === -1 ? n : n.slice(t + 4)).trim() === "renderMode") return e;
1528
- }
1529
- }
1530
- return null;
1531
- }, wr = /export\s*\{([^}]*)\}/g, Tr = (e) => {
1532
- if (/export\s+default\b/.test(e)) return !0;
1533
- wr.lastIndex = 0;
1534
- let t;
1535
- for (; (t = wr.exec(e)) !== null;) for (let e of t[1].split(",")) {
1536
- let t = e.lastIndexOf(" as ");
1537
- if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
1538
- }
1539
- return !1;
1540
- }, Er = async (e, t) => {
1541
- let n = (await Promise.all(t.map(async (t) => {
1542
- let n;
1543
- try {
1544
- n = await le(p(e, t.file), "utf8");
1545
- } catch {
1546
- return null;
1547
- }
1548
- let r = xr(n);
1549
- return r !== null && !mr(r) ? gr(p("src", "pages", t.file), r) : Tr(n) ? null : `${p("src", "pages", t.file)} is a route (a \`page.tsx\` under src/pages/) but exports no default.\n\n A page's default export IS its component — the router has nothing to render without it,\n and the failure would otherwise surface only in \`voltro build\`'s prerender as\n "SSR received a descriptor with no Component", long after the file was written.\n\n Fix: \`export default function Page() { … }\`, or re-export another page's component\n (\`export { default } from '../page'\`). If this file is NOT a route, rename it —\n only the reserved names route, and anything else under src/pages/ is ordinary code\n that may live beside the page that uses it.`;
1550
- }))).filter((e) => e !== null);
1551
- if (n.length !== 0) throw Error(n.join("\n\n"));
1552
- }, Y = p(L(), ".voltro", "logs"), Dr = () => {
1553
- let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
1554
- return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
1555
- }, Or = !1, kr = () => {
1556
- if (Or) return;
1557
- Or = !0;
1558
- let e = Date.now() - Dr(), t = [];
1559
- try {
1560
- t = A(Y);
1561
- } catch {
1562
- return;
1563
- }
1564
- for (let n of t) {
1565
- if (!n.endsWith(".log")) continue;
1566
- let t = p(Y, n);
1567
- try {
1568
- j(t).mtimeMs < e && M(t);
1569
- } catch {}
1570
- }
1571
- }, Ar = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), jr = (e, t) => p(Y, `${Ar(e)}-${t}.log`), Mr = (e) => {
1572
- let t = Ar(e), n = [];
1573
- try {
1574
- n = A(Y);
1575
- } catch {
1576
- return;
1577
- }
1578
- let r = n.filter((e) => e.startsWith(`${t}-`) && e.endsWith(".log"));
1579
- if (r.length === 0) return;
1580
- let i, a = -1;
1581
- for (let e of r) {
1582
- let t = p(Y, e);
1583
- try {
1584
- let e = j(t);
1585
- e.mtimeMs > a && (a = e.mtimeMs, i = t);
1586
- } catch {}
1587
- }
1588
- return i;
1589
- }, Nr = (e) => {
1590
- try {
1591
- E(Y, { recursive: !0 });
1592
- } catch {}
1593
- kr();
1594
- let t = jr(e, process.pid), n = D(t, "w"), r = (e) => {
1595
- let t = {
1596
- ts: e.ts.getTime(),
1597
- level: e.level,
1598
- source: e.scope === "client" ? "client" : "server",
1599
- message: e.message,
1600
- fields: e.fields
1601
- };
1602
- e.scope !== void 0 && (t.scope = e.scope);
1603
- try {
1604
- return JSON.stringify(t) + "\n";
1605
- } catch {
1606
- return JSON.stringify({
1607
- ts: e.ts.getTime(),
1608
- level: e.level,
1609
- source: t.source,
1610
- message: e.message,
1611
- fields: {},
1612
- ...e.scope === void 0 ? {} : { scope: e.scope }
1613
- }) + "\n";
1614
- }
1615
- }, i = !1, a = x((e) => {
1616
- if (!i) try {
1617
- P(n, r(e));
1618
- } catch {}
1619
- }), o = () => {
1620
- if (!i) {
1621
- i = !0;
1622
- try {
1623
- w(n);
1624
- } catch {}
1625
- }
1626
- };
1627
- process.once("exit", o);
1628
- let s = () => o();
1629
- return process.on("uncaughtException", s), process.on("unhandledRejection", s), {
1630
- path: t,
1631
- dispose: async () => {
1632
- a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
1633
- }
1634
- };
1635
- }, Pr = async (e, t) => {
1636
- let n;
1637
- try {
1638
- n = await O.readFile(e, "utf8");
1639
- } catch {
1640
- return [];
1641
- }
1642
- let r = n.split("\n"), i = [], a = t?.since ?? 0;
1643
- for (let e of r) if (e.length !== 0) try {
1644
- let t = JSON.parse(e);
1645
- if (typeof t.ts != "number" || t.ts < a) continue;
1646
- i.push(t);
1647
- } catch {}
1648
- return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
1649
- }, Fr = S({ scope: "voltro:dashboard" }), Ir = R(import.meta.url), Lr = 5179, Rr = (e) => {
1164
+ }), vn = I({ scope: "voltro:dashboard" }), yn = R(import.meta.url), bn = 5179, xn = (e) => {
1650
1165
  let t = process.env.VOLTRO_DASHBOARD_PATH;
1651
- if (t && T(p(h(t), "app.config.ts"))) return h(t);
1166
+ if (t && E(C(T(t), "app.config.ts"))) return T(t);
1652
1167
  try {
1653
- let e = d(Ir.resolve("@voltro/dashboard/package.json"));
1654
- if (T(p(e, "app.config.ts"))) return e;
1168
+ let e = S(yn.resolve("@voltro/dashboard/package.json"));
1169
+ if (E(C(e, "app.config.ts"))) return e;
1655
1170
  } catch {}
1656
- let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
1171
+ let n = C("voltro-devtools", "apps", "dashboard"), r = T(e);
1657
1172
  for (let e = 0; e < 10; e++) {
1658
- let e = p(r, n);
1659
- if (T(p(e, "app.config.ts"))) return e;
1660
- let t = d(r);
1173
+ let e = C(r, n);
1174
+ if (E(C(e, "app.config.ts"))) return e;
1175
+ let t = S(r);
1661
1176
  if (t === r) break;
1662
1177
  r = t;
1663
1178
  }
1664
1179
  return null;
1665
- }, zr = "VOLTRO_IS_DASHBOARD", Br = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1666
- let i = pe({
1180
+ }, Sn = "VOLTRO_IS_DASHBOARD", Cn = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1181
+ let i = le({
1667
1182
  port: e,
1668
1183
  host: t
1669
1184
  }), a = !1, o = (e) => {
1670
1185
  a || (a = !0, i.destroy(), r(e));
1671
1186
  };
1672
1187
  i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
1673
- }), Vr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Hr = () => process.env[zr] === "1", Ur = () => process.stdout.isTTY === !0, Wr = p(L(), ".voltro", "dashboard-launch.lock"), Gr = 1e4, Kr = async () => {
1188
+ }), wn = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Tn = () => process.env[Sn] === "1", En = () => process.stdout.isTTY === !0, Dn = C(ee(), ".voltro", "dashboard-launch.lock"), On = 1e4, kn = async () => {
1674
1189
  try {
1675
- await O.mkdir(d(Wr), { recursive: !0 });
1676
- let e = await O.open(Wr, "wx");
1190
+ await D.mkdir(S(Dn), { recursive: !0 });
1191
+ let e = await D.open(Dn, "wx");
1677
1192
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
1678
1193
  } catch {
1679
1194
  try {
1680
- let e = await O.stat(Wr);
1681
- if (Date.now() - e.mtimeMs > Gr) return await O.unlink(Wr).catch(() => void 0), Kr();
1195
+ let e = await D.stat(Dn);
1196
+ if (Date.now() - e.mtimeMs > On) return await D.unlink(Dn).catch(() => void 0), kn();
1682
1197
  } catch {}
1683
1198
  return !1;
1684
1199
  }
1685
- }, qr = async () => {
1200
+ }, An = async () => {
1686
1201
  try {
1687
- await O.unlink(Wr);
1202
+ await D.unlink(Dn);
1688
1203
  } catch {}
1689
- }, Jr = async (e) => {
1204
+ }, jn = async (e) => {
1690
1205
  let t = e.port ?? 5179;
1691
- if (Vr()) return {
1206
+ if (wn()) return {
1692
1207
  status: "skipped",
1693
1208
  reason: "disabled by flag/env",
1694
1209
  port: t
1695
1210
  };
1696
- if (Hr()) return {
1211
+ if (Tn()) return {
1697
1212
  status: "skipped",
1698
1213
  reason: "this process IS the dashboard",
1699
1214
  port: t
1700
1215
  };
1701
- if (!Ur()) return {
1216
+ if (!En()) return {
1702
1217
  status: "skipped",
1703
1218
  reason: "stdout is not a TTY (CI/smoke)",
1704
1219
  port: t
1705
1220
  };
1706
- if (!await Kr()) return {
1221
+ if (!await kn()) return {
1707
1222
  status: "skipped",
1708
1223
  reason: "another voltro process is currently launching the dashboard",
1709
1224
  port: t
1710
1225
  };
1711
- if (await Br(t)) return await qr(), {
1226
+ if (await Cn(t)) return await An(), {
1712
1227
  status: "already-running",
1713
1228
  port: t
1714
1229
  };
1715
1230
  let n = e.voltroBin;
1716
1231
  if (!n) {
1717
1232
  let e = process.argv[1];
1718
- n = e && e.endsWith("/src/bin.ts") ? p(d(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1233
+ n = e && e.endsWith("/src/bin.ts") ? C(S(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1719
1234
  }
1720
- let r = T(p(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = fe(process.execPath, [
1235
+ let r = E(C(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = ce(process.execPath, [
1721
1236
  n,
1722
1237
  i,
1723
1238
  e.dashboardAppPath
@@ -1725,7 +1240,7 @@ import {
1725
1240
  stdio: "ignore",
1726
1241
  env: {
1727
1242
  ...process.env,
1728
- [zr]: "1",
1243
+ [Sn]: "1",
1729
1244
  VOLTRO_DASHBOARD_PORT: String(t)
1730
1245
  }
1731
1246
  });
@@ -1733,22 +1248,22 @@ import {
1733
1248
  if (a.exitCode === null && a.signalCode === null) try {
1734
1249
  a.kill("SIGTERM");
1735
1250
  } catch {}
1736
- }), Fr.info(`auto-launching dashboard at http://localhost:${t}`, {
1251
+ }), vn.info(`auto-launching dashboard at http://localhost:${t}`, {
1737
1252
  port: t,
1738
1253
  mode: i,
1739
1254
  prebuilt: r
1740
- }), r || Fr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Fr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1741
- qr();
1255
+ }), r || vn.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), vn.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1256
+ An();
1742
1257
  }, 4e3).unref(), {
1743
1258
  status: "launched",
1744
1259
  port: t
1745
1260
  };
1746
- }, Yr = class extends Error {
1261
+ }, Mn = class extends Error {
1747
1262
  _voltroDeferral = !0;
1748
1263
  constructor(e) {
1749
1264
  super(e), this.name = "DeferralNotSupportedError";
1750
1265
  }
1751
- }, Xr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Zr = (e) => {
1266
+ }, Nn = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Pn = (e) => {
1752
1267
  if (!(e instanceof Error)) return;
1753
1268
  let t = e._voltroControl;
1754
1269
  if (t === "redirect") {
@@ -1770,7 +1285,7 @@ import {
1770
1285
  },
1771
1286
  body: "not found"
1772
1287
  };
1773
- }, Qr = (e) => {
1288
+ }, Fn = (e) => {
1774
1289
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
1775
1290
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
1776
1291
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -1785,7 +1300,7 @@ import {
1785
1300
  ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
1786
1301
  });
1787
1302
  } catch (e) {
1788
- throw new Yr(e instanceof Error ? e.message : String(e));
1303
+ throw new Mn(e instanceof Error ? e.message : String(e));
1789
1304
  }
1790
1305
  return {
1791
1306
  loaderData: n.renderData,
@@ -1801,8 +1316,8 @@ import {
1801
1316
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
1802
1317
  }
1803
1318
  };
1804
- }, $r = (e) => {
1805
- let { helpers: t, renderInput: n } = e, r = Qr({
1319
+ }, In = (e) => {
1320
+ let { helpers: t, renderInput: n } = e, r = Fn({
1806
1321
  helpers: t,
1807
1322
  page: e.page,
1808
1323
  pathname: n.pathname,
@@ -1823,19 +1338,19 @@ import {
1823
1338
  stateScript: t.renderRouterStateScript(r.stateInput),
1824
1339
  hasDeferred: r.hasDeferred
1825
1340
  };
1826
- }, ei = (e) => {
1341
+ }, Ln = (e) => {
1827
1342
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
1828
1343
  return {
1829
1344
  body: t,
1830
1345
  meta: n
1831
1346
  };
1832
- }, ti = (e) => [
1347
+ }, Rn = (e) => [
1833
1348
  ...e.extra ?? [],
1834
1349
  e.helpers.renderMetaToHtml(e.meta),
1835
1350
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
1836
1351
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
1837
1352
  e.prepared.stateScript
1838
- ].filter((e) => e.length > 0).join("\n "), ni = (e) => {
1353
+ ].filter((e) => e.length > 0).join("\n "), zn = (e) => {
1839
1354
  let t = e.indexOf("?");
1840
1355
  return t === -1 ? {
1841
1356
  pathname: e || "/",
@@ -1844,9 +1359,9 @@ import {
1844
1359
  pathname: e.slice(0, t) || "/",
1845
1360
  search: e.slice(t)
1846
1361
  };
1847
- }, ri = /Could not find required `intl` object/, ii = "__voltro_i18n_instances__", ai = (e = globalThis) => {
1362
+ }, Bn = /Could not find required `intl` object/, Vn = "__voltro_i18n_instances__", Hn = (e = globalThis) => {
1848
1363
  try {
1849
- let t = e[ii]?.records;
1364
+ let t = e[Vn]?.records;
1850
1365
  return t === void 0 || t.length === 0 ? void 0 : {
1851
1366
  instances: t.length,
1852
1367
  reactIntlCopies: new Set(t.map((e) => e.intlProvider)).size,
@@ -1855,7 +1370,7 @@ import {
1855
1370
  } catch {
1856
1371
  return;
1857
1372
  }
1858
- }, oi = (e, t) => [
1373
+ }, Un = (e, t) => [
1859
1374
  "",
1860
1375
  "── voltro diagnosis ───────────────────────────────────────────────────",
1861
1376
  `${e} DID wrap this render in <I18nProvider>, and this process`,
@@ -1873,7 +1388,7 @@ import {
1873
1388
  " versions on disk; this counts instances in the running process, and one",
1874
1389
  " file loaded down two paths is two instances.",
1875
1390
  "───────────────────────────────────────────────────────────────────────"
1876
- ].join("\n"), si = (e, t) => [
1391
+ ].join("\n"), Wn = (e, t) => [
1877
1392
  "",
1878
1393
  "── voltro diagnosis ───────────────────────────────────────────────────",
1879
1394
  `${e} DID wrap this render in <I18nProvider>, and this process`,
@@ -1889,7 +1404,7 @@ import {
1889
1404
  " direct import can land on a second copy that this count does not see —",
1890
1405
  " it counts what @voltro/i18n is bound to.",
1891
1406
  "───────────────────────────────────────────────────────────────────────"
1892
- ].join("\n"), ci = (e) => [
1407
+ ].join("\n"), Gn = (e) => [
1893
1408
  "",
1894
1409
  "── voltro diagnosis ───────────────────────────────────────────────────",
1895
1410
  `${e} DID wrap this render in <I18nProvider> — the framework`,
@@ -1905,34 +1420,34 @@ import {
1905
1420
  " Do NOT use `pnpm ls` to rule that out: it lists versions on disk, and",
1906
1421
  " the duplication here is of module instances in one process.",
1907
1422
  "───────────────────────────────────────────────────────────────────────"
1908
- ].join("\n"), li = (e, t, n, r = ai()) => {
1423
+ ].join("\n"), Kn = (e, t, n, r = Hn()) => {
1909
1424
  if (!t) return;
1910
1425
  let i = String(e?.message ?? e);
1911
- if (ri.test(i)) return r === void 0 ? ci(n) : r.reactIntlCopies > 1 || r.instances > 1 ? oi(n, r) : si(n, r);
1912
- }, ui = "<div id=\"root\"></div>", di = "<div id=\"root\">", fi = "</div>", pi = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, mi = /\bsrc=["']([^"']+)["']/i, hi = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, gi = (e) => {
1913
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(pi, (e) => {
1914
- let r = mi.exec(e)?.[1];
1426
+ if (Bn.test(i)) return r === void 0 ? Gn(n) : r.reactIntlCopies > 1 || r.instances > 1 ? Un(n, r) : Wn(n, r);
1427
+ }, qn = "<div id=\"root\"></div>", Jn = "<div id=\"root\">", Yn = "</div>", Xn = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Zn = /\bsrc=["']([^"']+)["']/i, Qn = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, $n = (e) => {
1428
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Xn, (e) => {
1429
+ let r = Zn.exec(e)?.[1];
1915
1430
  return r === void 0 || t(r) ? e : (n.push(r), "");
1916
1431
  });
1917
- e.inlineModuleScriptsAsync && (r = r.replace(hi, "<script async$1>"));
1918
- let i = r.indexOf(ui);
1919
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${ui}\` 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.`);
1432
+ e.inlineModuleScriptsAsync && (r = r.replace(Qn, "<script async$1>"));
1433
+ let i = r.indexOf(qn);
1434
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${qn}\` 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.`);
1920
1435
  return {
1921
- head: `${r.slice(0, i)}${di}`,
1922
- tail: `${fi}${r.slice(i + 21)}`,
1436
+ head: `${r.slice(0, i)}${Jn}`,
1437
+ tail: `${Yn}${r.slice(i + 21)}`,
1923
1438
  bootstrapModules: n
1924
1439
  };
1925
- }, _i = (e, t) => (/<title>/i.test(t) ? e.replace(/[^\S\n]*<title>[\s\S]*?<\/title>\n?/i, "") : e).replace("</head>", ` ${t}\n </head>`), vi = (e) => _i(e.head, e.headInjection).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), yi = (e) => {
1440
+ }, er = (e, t) => (/<title>/i.test(t) ? e.replace(/[^\S\n]*<title>[\s\S]*?<\/title>\n?/i, "") : e).replace("</head>", ` ${t}\n </head>`), tr = (e) => er(e.head, e.headInjection).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), nr = (e) => {
1926
1441
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
1927
1442
  if (s || !o || a === null) return;
1928
1443
  s = !0, t.statusCode = e.statusCode ?? 200;
1929
1444
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
1930
- t.flushHeaders?.(), t.write(vi({
1445
+ t.flushHeaders?.(), t.write(tr({
1931
1446
  head: n.head,
1932
1447
  headInjection: i(a.meta),
1933
1448
  htmlLang: r
1934
1449
  }));
1935
- let c = new me();
1450
+ let c = new ue();
1936
1451
  c.pipe(t, { end: !1 }), c.on("end", () => {
1937
1452
  t.end(n.tail);
1938
1453
  }), a.stream.pipe(c);
@@ -1957,16 +1472,16 @@ import {
1957
1472
  return;
1958
1473
  }
1959
1474
  c();
1960
- }, bi = (e) => Array.isArray(e.preload) && e.preload.length > 0, xi = (e, t) => typeof e == "string" ? {
1475
+ }, rr = (e) => Array.isArray(e.preload) && e.preload.length > 0, ir = (e, t) => typeof e == "string" ? {
1961
1476
  tag: e,
1962
1477
  input: {}
1963
1478
  } : {
1964
1479
  tag: e.tag,
1965
1480
  input: e.input?.(t) ?? {}
1966
- }, Si = async (e) => {
1481
+ }, ar = async (e) => {
1967
1482
  let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
1968
- if (bi(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
1969
- let { tag: t, input: s } = xi(e, n);
1483
+ if (rr(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
1484
+ let { tag: t, input: s } = ir(e, n);
1970
1485
  try {
1971
1486
  a(i, t, s, await r(t, s));
1972
1487
  } catch (e) {
@@ -1976,23 +1491,23 @@ import {
1976
1491
  }, e);
1977
1492
  }
1978
1493
  }
1979
- }, X = S({ scope: "voltro:dev:web" }), Ci = S({ scope: "vite" }), wi = await (async () => {
1494
+ }, Z = I({ scope: "voltro:dev:web" }), or = I({ scope: "vite" }), sr = await (async () => {
1980
1495
  try {
1981
- let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
1496
+ let e = C(S(N(import.meta.url)), "..", "package.json"), t = await D.readFile(e, "utf8");
1982
1497
  return JSON.parse(t).version ?? "0.0.0";
1983
1498
  } catch {
1984
1499
  return "0.0.0";
1985
1500
  }
1986
- })(), Ti = async () => {
1501
+ })(), cr = async () => {
1987
1502
  try {
1988
- let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
1989
- if (T(p(t, "package.json"))) return t;
1990
- let n = h(e, "..", "..", "..", "devtools");
1991
- return T(p(n, "package.json")) ? n : null;
1503
+ let e = S(N(import.meta.url)), t = T(e, "..", "..", "devtools");
1504
+ if (E(C(t, "package.json"))) return t;
1505
+ let n = T(e, "..", "..", "..", "devtools");
1506
+ return E(C(n, "package.json")) ? n : null;
1992
1507
  } catch {
1993
1508
  return null;
1994
1509
  }
1995
- }, Ei = (e, t) => e.disableDevtools || !t ? [] : [
1510
+ }, lr = (e, t) => e.disableDevtools || !t ? [] : [
1996
1511
  "",
1997
1512
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
1998
1513
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -2002,71 +1517,71 @@ import {
2002
1517
  " await import('@voltro/devtools/styles.css')",
2003
1518
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
2004
1519
  "}"
2005
- ], Di = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Oi = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ki = (e) => e.sentry ? [
1520
+ ], ur = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], dr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], fr = (e) => e.sentry ? [
2006
1521
  "",
2007
1522
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
2008
1523
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
2009
1524
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
2010
- ] : [], Ai = (e) => e.env ? ["import './env.public'"] : [], ji = (e) => {
2011
- let t = [], n = h(e);
1525
+ ] : [], pr = (e) => e.env ? ["import './env.public'"] : [], mr = (e) => {
1526
+ let t = [], n = T(e);
2012
1527
  for (;;) {
2013
- T(p(n, "pnpm-workspace.yaml")) && t.push(n);
2014
- let e = d(n);
1528
+ E(C(n, "pnpm-workspace.yaml")) && t.push(n);
1529
+ let e = S(n);
2015
1530
  if (e === n) break;
2016
1531
  n = e;
2017
1532
  }
2018
1533
  return t;
2019
- }, Mi = nr, Ni = (e) => {
1534
+ }, hr = h, gr = (e) => {
2020
1535
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
2021
1536
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
2022
1537
  if (t) return `island-${t[1]}`;
2023
- }, Pi = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Fi = (e) => e.startsWith("(") && e.endsWith(")"), Ii = (e) => e.filter((e) => !Fi(e)), Li = (e) => {
2024
- let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !Fi(e));
1538
+ }, _r = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, vr = (e) => e.startsWith("(") && e.endsWith(")"), yr = (e) => e.filter((e) => !vr(e)), br = (e) => {
1539
+ let t = e.replace(i, "").split("/").filter(Boolean).filter((e) => !vr(e));
2025
1540
  return t.length === 0 ? "/" : "/" + t.join("/");
2026
- }, Ri = (e) => `${e.replace(r, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, Z = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, Q = async (e) => {
2027
- let t = [], i = [], a = async (e, o) => {
1541
+ }, xr = (e) => `${e.replace(i, "").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) => {
1542
+ let t = [], n = [], a = async (e, o) => {
2028
1543
  let s = [];
2029
1544
  try {
2030
- s = await O.readdir(e, { withFileTypes: !0 });
1545
+ s = await D.readdir(e, { withFileTypes: !0 });
2031
1546
  } catch {
2032
1547
  return;
2033
1548
  }
2034
- let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Mi(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
2035
- if (l.some((e) => n.has(e))) {
2036
- let t = u.has("layout.tsx"), r = !1;
1549
+ let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !hr(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1550
+ if (l.some((e) => r.has(e))) {
1551
+ let t = u.has("layout.tsx"), i = !1;
2037
1552
  if (t) try {
2038
- let t = await O.readFile(p(e, "layout.tsx"), "utf8");
2039
- r = Pi.test(t);
1553
+ let t = await D.readFile(C(e, "layout.tsx"), "utf8");
1554
+ i = _r.test(t);
2040
1555
  } catch {}
2041
- i.push({
1556
+ n.push({
2042
1557
  dir: d,
2043
1558
  chain: o,
2044
- contributesToUrl: o.length === 0 || !Fi(o[o.length - 1]),
1559
+ contributesToUrl: o.length === 0 || !vr(o[o.length - 1]),
2045
1560
  hasLayout: t,
2046
- hasLayoutLoader: r,
1561
+ hasLayoutLoader: i,
2047
1562
  hasError: u.has("error.tsx"),
2048
1563
  hasPending: u.has("loading.tsx"),
2049
1564
  hasNotFound: u.has("not-found.tsx"),
2050
- specialFiles: l.filter((e) => n.has(e))
1565
+ specialFiles: l.filter((e) => r.has(e))
2051
1566
  });
2052
1567
  }
2053
1568
  for (let e of l) {
2054
- if (!r.test(e)) continue;
1569
+ if (!i.test(e)) continue;
2055
1570
  let n = d ? `${d}/${e}` : e;
2056
1571
  t.push({
2057
1572
  file: n,
2058
- pattern: Li(n),
2059
- ident: Ri(n),
1573
+ pattern: br(n),
1574
+ ident: xr(n),
2060
1575
  dirChain: o
2061
1576
  });
2062
1577
  }
2063
- for (let t of c) await a(p(e, t), [...o, t]);
1578
+ for (let t of c) await a(C(e, t), [...o, t]);
2064
1579
  };
2065
1580
  await a(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
2066
1581
  let o = /* @__PURE__ */ new Set();
2067
1582
  for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
2068
1583
  let s = [], c = [];
2069
- for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
1584
+ for (let { specialFiles: e, ...t } of n) o.has(t.dir) ? s.push(t) : c.push({
2070
1585
  dir: t.dir,
2071
1586
  files: e
2072
1587
  });
@@ -2075,14 +1590,14 @@ import {
2075
1590
  dirs: s,
2076
1591
  orphanedSpecials: c
2077
1592
  };
2078
- }, zi = (e, t) => {
1593
+ }, Sr = (e, t) => {
2079
1594
  let n = [];
2080
1595
  for (let r = 0; r <= t.length; r++) {
2081
1596
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
2082
1597
  a && n.push(a);
2083
1598
  }
2084
1599
  return n;
2085
- }, Bi = async (e) => {
1600
+ }, Cr = async (e) => {
2086
1601
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
2087
1602
  return {
2088
1603
  chain: await Promise.all(t.map(async (e, t) => {
@@ -2105,10 +1620,10 @@ import {
2105
1620
  })),
2106
1621
  segmentLoaderData: o
2107
1622
  };
2108
- }, Vi = (e) => {
2109
- let t = Ii(e);
1623
+ }, wr = (e) => {
1624
+ let t = yr(e);
2110
1625
  return t.length === 0 ? "" : "/" + t.join("/");
2111
- }, Hi = [
1626
+ }, Tr = [
2112
1627
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
2113
1628
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
2114
1629
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -2201,7 +1716,7 @@ import {
2201
1716
  " _vdtErrorStart('Build error')",
2202
1717
  " })",
2203
1718
  "}"
2204
- ].join("\n"), Ui = (e) => {
1719
+ ].join("\n"), Er = (e) => {
2205
1720
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
2206
1721
  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, "\\$&"));
2207
1722
  let a = i.join("/");
@@ -2210,8 +1725,8 @@ import {
2210
1725
  paramNames: t,
2211
1726
  priority: n
2212
1727
  };
2213
- }, Wi = (e) => e.map((e) => {
2214
- let { regex: t, paramNames: n, priority: r } = Ui(e.pattern);
1728
+ }, Dr = (e) => e.map((e) => {
1729
+ let { regex: t, paramNames: n, priority: r } = Er(e.pattern);
2215
1730
  return {
2216
1731
  pattern: e.pattern,
2217
1732
  file: e.file,
@@ -2220,7 +1735,7 @@ import {
2220
1735
  paramNames: n,
2221
1736
  priority: r
2222
1737
  };
2223
- }).slice().sort((e, t) => e.priority - t.priority), Gi = (e, t) => {
1738
+ }).slice().sort((e, t) => e.priority - t.priority), Or = (e, t) => {
2224
1739
  for (let n of t) {
2225
1740
  let t = n.regex.exec(e);
2226
1741
  if (!t) continue;
@@ -2232,30 +1747,23 @@ import {
2232
1747
  };
2233
1748
  }
2234
1749
  return null;
2235
- }, Ki = async (e, t) => {
2236
- let n = e;
2237
- for (;;) {
2238
- let e = p(n, "node_modules", t);
2239
- try {
2240
- if ((await O.stat(e)).isDirectory()) {
2241
- let t = await O.realpath(e);
2242
- return t.includes("/node_modules/") ? null : t;
2243
- }
2244
- } catch {}
2245
- let r = d(n);
2246
- if (r === n) return null;
2247
- n = r;
2248
- }
2249
- }, qi = async (e) => {
1750
+ }, kr = xe, Ar = async (e) => {
2250
1751
  try {
2251
- let t = await import(_(p(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
2252
- return a ? {
2253
- port: r,
2254
- wsPath: a
2255
- } : { port: r };
1752
+ let t = await import(P(C(e, "app.config.ts")).href), r = t.default?.port, i = n({
1753
+ kind: "api",
1754
+ configPort: typeof r == "number" ? r : void 0,
1755
+ env: {}
1756
+ }).port, a = t.default?.transport?.wsPath, o = typeof a == "string" && a.startsWith("/") ? a : void 0;
1757
+ return o ? {
1758
+ port: i,
1759
+ wsPath: o
1760
+ } : { port: i };
2256
1761
  } catch {}
2257
- return { port: 4e3 };
2258
- }, Ji = (e, t) => ({
1762
+ return { port: n({
1763
+ kind: "api",
1764
+ env: {}
1765
+ }).port };
1766
+ }, jr = (e, t) => ({
2259
1767
  name: e,
2260
1768
  pkg: t.package,
2261
1769
  browserWsUrl: t.url,
@@ -2263,7 +1771,7 @@ import {
2263
1771
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
2264
1772
  ...t.headers ? { headers: t.headers } : {},
2265
1773
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
2266
- }), Yi = (e, t, n) => {
1774
+ }), Mr = (e, t, n) => {
2267
1775
  let r = t.transport?.wsPath ?? n.wsPath;
2268
1776
  return {
2269
1777
  name: e,
@@ -2275,7 +1783,7 @@ import {
2275
1783
  ...t.headers ? { headers: t.headers } : {},
2276
1784
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
2277
1785
  };
2278
- }, Xi = (e) => {
1786
+ }, Nr = (e) => {
2279
1787
  let t = /* @__PURE__ */ new Map();
2280
1788
  for (let n of e) {
2281
1789
  if (n.proxyTarget === void 0) continue;
@@ -2283,43 +1791,43 @@ import {
2283
1791
  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>.`);
2284
1792
  t.set(n.browserWsUrl, n.name);
2285
1793
  }
2286
- }, Zi = async (e, t) => {
1794
+ }, Pr = async (e, t) => {
2287
1795
  let n = Object.entries(t.apis ?? {}), r = [];
2288
1796
  for (let [t, i] of n) {
2289
1797
  if (i.url) {
2290
- r.push(Ji(t, i));
1798
+ r.push(jr(t, i));
2291
1799
  continue;
2292
1800
  }
2293
- let n = await Ki(e, i.package);
1801
+ let n = await kr(e, i.package);
2294
1802
  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.`);
2295
- r.push(Yi(t, i, await qi(n)));
1803
+ r.push(Mr(t, i, await Ar(n)));
2296
1804
  }
2297
- return Xi(r), r;
2298
- }, Qi = (e) => {
1805
+ return Nr(r), r;
1806
+ }, Fr = (e) => {
2299
1807
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
2300
1808
  let t = new URL(e);
2301
1809
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
2302
1810
  } catch {
2303
1811
  return;
2304
1812
  }
2305
- }, $i = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, ea = (e) => process.env[$i(e)] ?? process.env.VOLTRO_API_ORIGIN, ta = (e, t) => {
1813
+ }, Ir = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Lr = (e) => process.env[Ir(e)] ?? process.env.VOLTRO_API_ORIGIN, Rr = (e, t) => {
2306
1814
  if (!e) return;
2307
- let n = ea(e.name) ?? e.serverOrigin;
1815
+ let n = Lr(e.name) ?? e.serverOrigin;
2308
1816
  if (n) {
2309
- let e = Qi(n);
1817
+ let e = Fr(n);
2310
1818
  if (e) return e;
2311
1819
  }
2312
1820
  if (t?.allowDevProxy && e.proxyTarget) {
2313
- let t = Qi(e.proxyTarget);
1821
+ let t = Fr(e.proxyTarget);
2314
1822
  if (t) return t;
2315
1823
  }
2316
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Qi(e.browserWsUrl);
2317
- }, na = (e, t, n) => {
1824
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Fr(e.browserWsUrl);
1825
+ }, zr = (e, t, n) => {
2318
1826
  if (!e) {
2319
1827
  if (n?.apiName === void 0) return;
2320
1828
  let e = n.apiName;
2321
1829
  return async () => {
2322
- throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${$i(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
1830
+ 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 ${Ir(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.`);
2323
1831
  };
2324
1832
  }
2325
1833
  return async (r, i) => {
@@ -2341,7 +1849,7 @@ import {
2341
1849
  });
2342
1850
  } catch (t) {
2343
1851
  let i = t?.cause?.code ?? String(t?.message ?? t);
2344
- throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${$i(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
1852
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Ir(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 });
2345
1853
  }
2346
1854
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
2347
1855
  let s = await o.json();
@@ -2359,8 +1867,8 @@ import {
2359
1867
  }
2360
1868
  if (u) return l;
2361
1869
  };
2362
- }, $ = async (e, t, n, r = {}) => {
2363
- let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(p(e, "node_modules", "@voltro", "devtools", "package.json")) || await Ti() !== null, s = t.theme === "system" ? [
1870
+ }, Br = async (e, t, n, r = {}) => {
1871
+ let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = E(C(e, "node_modules", "@voltro", "devtools", "package.json")) || await cr() !== null, s = t.theme === "system" ? [
2364
1872
  " <script>",
2365
1873
  " (function () {",
2366
1874
  " var root = document.documentElement",
@@ -2398,53 +1906,53 @@ import {
2398
1906
  " </body>",
2399
1907
  "</html>",
2400
1908
  ""
2401
- ].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await Q(l);
2402
- await Er(l, u);
2403
- for (let e of f) X.warn(`src/pages/${e.dir || "."}/ contains ${e.files.join(", ")} but no page.tsx at or below it — ${e.files.length > 1 ? "those files are" : "that file is"} inert. A layout/error/loading/not-found file only applies to routes in its own directory tree; if this is an ordinary component, rename it so it does not read as a route boundary.`);
2404
- let m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, h = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, g = n.map((e) => `import { appGroup as ${m(e.name)}, appDescriptors as ${h(e.name)} } from '${e.pkg}/rpcGroup'`);
1909
+ ].join("\n"), l = C(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await $(l);
1910
+ await m(l, u);
1911
+ for (let e of f) Z.warn(`src/pages/${e.dir || "."}/ contains ${e.files.join(", ")} but no page.tsx at or below it — ${e.files.length > 1 ? "those files are" : "that file is"} inert. A layout/error/loading/not-found file only applies to routes in its own directory tree; if this is an ordinary component, rename it so it does not read as a route boundary.`);
1912
+ let p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, h = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, g = n.map((e) => `import { appGroup as ${p(e.name)}, appDescriptors as ${h(e.name)} } from '${e.pkg}/rpcGroup'`);
2405
1913
  n.some((e) => e.hasAuthHeaders) && (g.push("import __voltroAppConfig from '../app.config'"), g.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
2406
1914
  let _ = n.map((e) => {
2407
- let t = [`group: ${m(e.name)}`];
1915
+ let t = [`group: ${p(e.name)}`];
2408
1916
  return t.push(`descriptors: ${h(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.hasAuthHeaders ? t.push(`headers: __voltroAuthHeaders?.[${JSON.stringify(e.name)}]?.authHeaders`) : e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
2409
1917
  }), v, y, b;
2410
1918
  if (u.length > 0) {
2411
1919
  let n = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), r = [];
2412
1920
  for (let e of d) {
2413
1921
  let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
2414
- e.hasLayout && e.hasLayoutLoader ? r.push(`import * as ${Z(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && r.push(`import ${Z(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && r.push(`import ${Z(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && r.push(`import ${Z(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && r.push(`import ${Z(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
1922
+ e.hasLayout && e.hasLayoutLoader ? r.push(`import * as ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && r.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && r.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && r.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && r.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2415
1923
  }
2416
1924
  let i = u.map((e) => {
2417
- let t = zi(d, e.dirChain).map((e) => {
1925
+ let t = Sr(d, e.dirChain).map((e) => {
2418
1926
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2419
1927
  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(", ")} }`;
2420
1928
  }).join(",\n");
2421
1929
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2422
1930
  }), a = d.filter((e) => e.hasNotFound).map((e) => {
2423
- let t = Vi(e.chain), n = zi(d, e.chain).map((e) => {
1931
+ let t = wr(e.chain), n = Sr(d, e.chain).map((e) => {
2424
1932
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2425
1933
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2426
1934
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
2427
1935
  return ` {\n prefix: ${JSON.stringify(t)},\n Component: refs.notFounds[${JSON.stringify(e.dir)}],${r}\n },`;
2428
- }), s = [], c = [], l = [], f = [], m = [], h = [];
1936
+ }), s = [], c = [], l = [], f = [], p = [], m = [];
2429
1937
  for (let e of d) {
2430
1938
  let t = e.dir === "" ? "../src/pages/layout.tsx" : `../src/pages/${e.dir}/layout.tsx`, n = e.dir === "" ? "../src/pages/error.tsx" : `../src/pages/${e.dir}/error.tsx`, r = e.dir === "" ? "../src/pages/loading.tsx" : `../src/pages/${e.dir}/loading.tsx`, i = e.dir === "" ? "../src/pages/not-found.tsx" : `../src/pages/${e.dir}/not-found.tsx`, a = JSON.stringify(e.dir);
2431
- e.hasLayout && e.hasLayoutLoader ? (c.push(` ${a}: ${Z(e.dir, "Layout")}Mod.default,`), l.push(` ${a}: ${Z(e.dir, "Layout")}Mod.loader,`), s.push({
1939
+ e.hasLayout && e.hasLayoutLoader ? (c.push(` ${a}: ${Q(e.dir, "Layout")}Mod.default,`), l.push(` ${a}: ${Q(e.dir, "Layout")}Mod.loader,`), s.push({
2432
1940
  relPath: t,
2433
1941
  kind: "layout",
2434
1942
  slotKey: e.dir
2435
- })) : e.hasLayout && (c.push(` ${a}: ${Z(e.dir, "Layout")},`), s.push({
1943
+ })) : e.hasLayout && (c.push(` ${a}: ${Q(e.dir, "Layout")},`), s.push({
2436
1944
  relPath: t,
2437
1945
  kind: "layout",
2438
1946
  slotKey: e.dir
2439
- })), e.hasError && (f.push(` ${a}: ${Z(e.dir, "Error")},`), s.push({
1947
+ })), e.hasError && (f.push(` ${a}: ${Q(e.dir, "Error")},`), s.push({
2440
1948
  relPath: n,
2441
1949
  kind: "error",
2442
1950
  slotKey: e.dir
2443
- })), e.hasPending && (m.push(` ${a}: ${Z(e.dir, "Pending")},`), s.push({
1951
+ })), e.hasPending && (p.push(` ${a}: ${Q(e.dir, "Pending")},`), s.push({
2444
1952
  relPath: r,
2445
1953
  kind: "pending",
2446
1954
  slotKey: e.dir
2447
- })), e.hasNotFound && (h.push(` ${a}: ${Z(e.dir, "NotFound")},`), s.push({
1955
+ })), e.hasNotFound && (m.push(` ${a}: ${Q(e.dir, "NotFound")},`), s.push({
2448
1956
  relPath: i,
2449
1957
  kind: "notFound",
2450
1958
  slotKey: e.dir
@@ -2455,16 +1963,16 @@ import {
2455
1963
  kind: "page",
2456
1964
  slotKey: e.pattern
2457
1965
  });
2458
- let x = s.map((e) => ` ${JSON.stringify(e.relPath)},`), S = s.map((e, t) => {
1966
+ let h = s.map((e) => ` ${JSON.stringify(e.relPath)},`), x = s.map((e, t) => {
2459
1967
  let n = JSON.stringify(e.slotKey);
2460
1968
  return e.kind === "page" ? ` if (newMods[${t}] && refs.pages[${n}] !== undefined) { refs.pages[${n}] = newMods[${t}]; changed = true }` : ` if (newMods[${t}]?.default) { refs.${e.kind === "layout" ? "layouts" : e.kind === "error" ? "errors" : e.kind === "pending" ? "pendings" : "notFounds"}[${n}] = newMods[${t}].default;${e.kind === "layout" ? ` refs.layoutLoaders[${n}] = newMods[${t}].loader;` : ""} changed = true }`;
2461
- }), C = t.locales ?? [], w = C.length > 0 && C.every((t) => T(p(e, "src", "locales", `${t}.ts`)) || T(p(e, "src", "locales", `${t}.tsx`))), E = w, D = t.defaultLocale ?? C[0] ?? "en";
2462
- if (C.length > 0 && !w && X.info(`i18n: locales [${C.join(", ")}] declared with no src/locales/<code>.ts — using them for <html lang> and the resolved locale only. Add the catalogs to get <I18nProvider> wired, or keep your own i18n stack.`), C.length > 0 && !C.includes(D)) throw Error(`[voltro dev] app.config.ts: defaultLocale '${D}' must be one of locales [${C.join(", ")}]`);
2463
- let O = E ? [
1969
+ }), S = t.locales ?? [], w = S.length > 0 && S.every((t) => E(C(e, "src", "locales", `${t}.ts`)) || E(C(e, "src", "locales", `${t}.tsx`))), T = w, D = t.defaultLocale ?? S[0] ?? "en";
1970
+ if (S.length > 0 && !w && Z.info(`i18n: locales [${S.join(", ")}] declared with no src/locales/<code>.ts — using them for <html lang> and the resolved locale only. Add the catalogs to get <I18nProvider> wired, or keep your own i18n stack.`), S.length > 0 && !S.includes(D)) throw Error(`[voltro dev] app.config.ts: defaultLocale '${D}' must be one of locales [${S.join(", ")}]`);
1971
+ let O = T ? [
2464
1972
  "import { I18nProvider } from '@voltro/i18n'",
2465
1973
  "import { resolveLocale } from '@voltro/i18n/server'",
2466
1974
  "import { useServerRequest } from '@voltro/web'",
2467
- ...C.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
1975
+ ...S.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
2468
1976
  ] : [];
2469
1977
  y = [
2470
1978
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -2509,10 +2017,10 @@ import {
2509
2017
  ...f,
2510
2018
  " },",
2511
2019
  " pendings: {",
2512
- ...m,
2020
+ ...p,
2513
2021
  " },",
2514
2022
  " notFounds: {",
2515
- ...h,
2023
+ ...m,
2516
2024
  " },",
2517
2025
  " pages: {},",
2518
2026
  "}",
@@ -2577,11 +2085,11 @@ import {
2577
2085
  "if (import.meta.hot) {",
2578
2086
  " import.meta.hot.accept(",
2579
2087
  " [",
2580
- ...x,
2088
+ ...h,
2581
2089
  " ],",
2582
2090
  " (newMods: Array<Record<string, unknown> | undefined>) => {",
2583
2091
  " let changed = false",
2584
- ...S,
2092
+ ...x,
2585
2093
  " if (changed) bump()",
2586
2094
  " },",
2587
2095
  " )",
@@ -2601,12 +2109,12 @@ import {
2601
2109
  ...O,
2602
2110
  "import { subscribe, getVersion, buildRoutes, buildNotFounds } from './routeTable'",
2603
2111
  "",
2604
- ...E ? [
2605
- `// i18n auto-wiring (config.locales = [${C.map((e) => JSON.stringify(e)).join(", ")}]).`,
2112
+ ...T ? [
2113
+ `// i18n auto-wiring (config.locales = [${S.map((e) => JSON.stringify(e)).join(", ")}]).`,
2606
2114
  "const I18N_CATALOGS: Record<string, import('@voltro/i18n').MessageCatalog> = {",
2607
- ...C.map((e) => ` ${JSON.stringify(e)}: i18nCatalog_${e},`),
2115
+ ...S.map((e) => ` ${JSON.stringify(e)}: i18nCatalog_${e},`),
2608
2116
  "}",
2609
- `const I18N_SUPPORTED: ReadonlyArray<string> = [${C.map((e) => JSON.stringify(e)).join(", ")}]`,
2117
+ `const I18N_SUPPORTED: ReadonlyArray<string> = [${S.map((e) => JSON.stringify(e)).join(", ")}]`,
2610
2118
  `const I18N_DEFAULT = ${JSON.stringify(D)}`,
2611
2119
  "",
2612
2120
  "const pickI18nLocale = (ssr: ReturnType<typeof useServerRequest>): string => {",
@@ -2658,7 +2166,7 @@ import {
2658
2166
  " const v = useSyncExternalStore(subscribe, getVersion, getVersion)",
2659
2167
  " const routes = useMemo(() => buildRoutes(), [v])",
2660
2168
  " const notFounds = useMemo(() => buildNotFounds(), [v])",
2661
- ...E ? [
2169
+ ...T ? [
2662
2170
  " const ssr = useServerRequest()",
2663
2171
  " const locale = pickI18nLocale(ssr)",
2664
2172
  " const messages = I18N_CATALOGS[locale] ?? I18N_CATALOGS[I18N_DEFAULT]!",
@@ -2676,14 +2184,14 @@ import {
2676
2184
  "// resolved apis map. Side-effect only — no local component definitions —",
2677
2185
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2678
2186
  "",
2679
- ...Ai(t),
2187
+ ...pr(t),
2680
2188
  "import { mount } from '@voltro/web'",
2681
2189
  ...g,
2682
2190
  "import { App } from './app'",
2683
2191
  "import { preloadCurrentRoute } from './routeTable'",
2684
- ...Oi(t),
2685
- ...Ei(t, o),
2686
- ...ki(t),
2192
+ ...dr(t),
2193
+ ...lr(t, o),
2194
+ ...fr(t),
2687
2195
  "",
2688
2196
  "// Preload the current route's page chunk BEFORE hydration so the first",
2689
2197
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2700,10 +2208,10 @@ import {
2700
2208
  " apis: {",
2701
2209
  ..._,
2702
2210
  " },",
2703
- ...Di(t, o),
2211
+ ...ur(t, o),
2704
2212
  "})",
2705
2213
  "",
2706
- Hi
2214
+ Tr
2707
2215
  ].join("\n");
2708
2216
  } else v = "", y = "", b = [
2709
2217
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -2711,117 +2219,124 @@ import {
2711
2219
  "// and calls mount(). Side-effect only, no component definitions, so the",
2712
2220
  "// user's component file remains the Fast Refresh boundary.",
2713
2221
  "",
2714
- ...Ai(t),
2222
+ ...pr(t),
2715
2223
  "import { mount } from '@voltro/web'",
2716
2224
  ...g,
2717
2225
  "import App from '../src/App'",
2718
- ...Oi(t),
2719
- ...Ei(t, o),
2720
- ...ki(t),
2226
+ ...dr(t),
2227
+ ...lr(t, o),
2228
+ ...fr(t),
2721
2229
  "",
2722
2230
  "mount(App, {",
2723
2231
  " apis: {",
2724
2232
  ..._,
2725
2233
  " },",
2726
- ...Di(t, o),
2234
+ ...ur(t, o),
2727
2235
  "})",
2728
2236
  "",
2729
- Hi
2237
+ Tr
2730
2238
  ].join("\n");
2731
- let x = p(e, ".framework");
2732
- await O.mkdir(x, { recursive: !0 }), t.env ? await rt(x, r) : await O.rm(p(x, "env.public.ts"), { force: !0 }), await O.writeFile(p(x, "index.html"), c, "utf8"), await O.writeFile(p(x, "main.tsx"), b, "utf8"), v ? (await O.writeFile(p(x, "app.tsx"), v, "utf8"), await O.writeFile(p(x, "routeTable.ts"), y, "utf8")) : (await O.rm(p(x, "app.tsx"), { force: !0 }), await O.rm(p(x, "routeTable.ts"), { force: !0 }));
2733
- let S = p(e, ".gitignore"), C = "";
2239
+ let x = C(e, ".framework");
2240
+ await D.mkdir(x, { recursive: !0 }), t.env ? await J(x, r) : await D.rm(C(x, "env.public.ts"), { force: !0 }), await D.writeFile(C(x, "index.html"), c, "utf8"), await D.writeFile(C(x, "main.tsx"), b, "utf8"), v ? (await D.writeFile(C(x, "app.tsx"), v, "utf8"), await D.writeFile(C(x, "routeTable.ts"), y, "utf8")) : (await D.rm(C(x, "app.tsx"), { force: !0 }), await D.rm(C(x, "routeTable.ts"), { force: !0 }));
2241
+ let S = C(e, ".gitignore"), w = "";
2734
2242
  try {
2735
- C = await O.readFile(S, "utf8");
2243
+ w = await D.readFile(S, "utf8");
2736
2244
  } catch {}
2737
- let w = ["/.framework/"], E = new Set(C.split("\n").map((e) => e.trim())), D = w.filter((e) => !E.has(e));
2738
- if (D.length > 0) {
2739
- let e = C === "" || C.endsWith("\n") ? "" : "\n";
2245
+ let T = ["/.framework/"], O = new Set(w.split("\n").map((e) => e.trim())), k = T.filter((e) => !O.has(e));
2246
+ if (k.length > 0) {
2247
+ let e = w === "" || w.endsWith("\n") ? "" : "\n";
2740
2248
  try {
2741
- await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
2249
+ await D.appendFile(S, `${e}${k.join("\n")}\n`, "utf8");
2742
2250
  } catch (e) {
2743
- X.warn(`could not add ${D.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2251
+ Z.warn(`could not add ${k.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2744
2252
  }
2745
2253
  }
2746
- }, ra = async (e, t) => {
2254
+ }, Vr = async (e, t) => {
2747
2255
  try {
2748
- let n = p(d(e), "project.json");
2749
- if (!T(n)) return;
2750
- let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2256
+ let n = C(S(e), "project.json");
2257
+ if (!E(n)) return;
2258
+ let r = await D.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2751
2259
  for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
2752
2260
  if (o.length === 0) return;
2753
- X.warn("sibling app(s) claim the same port — only one boots", {
2261
+ Z.warn("sibling app(s) claim the same port — only one boots", {
2754
2262
  port: t,
2755
2263
  conflicts: o,
2756
2264
  projectJson: n
2757
2265
  });
2758
2266
  } catch {}
2759
- }, ia = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), aa = async (e, t = {}) => {
2760
- let n = ia(e), r = t.preferSource !== !0 && T(n) ? n : p(e, "app.config.ts");
2267
+ }, Hr = (e) => C(e, ".framework", "dist", "server", "appConfig.js"), Ur = async (e, t = {}) => {
2268
+ let n = Hr(e), r = t.preferSource !== !0 && E(n) ? n : C(e, "app.config.ts");
2761
2269
  try {
2762
- let e = (await import(_(r).href)).default;
2270
+ let e = (await import(P(r).href)).default;
2763
2271
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
2764
2272
  } catch {
2765
2273
  return null;
2766
2274
  }
2767
- }, oa = async (e) => {
2768
- let t = await aa(e, { preferSource: !0 });
2769
- if (!t) return {
2275
+ }, Wr = async (e) => {
2276
+ let r = await Ur(e, { preferSource: !0 });
2277
+ if (!r) return {
2770
2278
  ran: !1,
2771
2279
  exitCode: 0
2772
2280
  };
2773
- $n();
2774
- let n = mn();
2775
- Mn(n), X.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" }), Lt(e, X);
2776
- let r = await Zi(e, t);
2777
- for (let e of r) X.info("api wired", {
2281
+ on();
2282
+ let i = bt();
2283
+ Rt(i), Z.info("booting voltro dev (web)", { app: r.name ?? "(unnamed)" }), He(e, Z);
2284
+ let m = await Pr(e, r);
2285
+ for (let e of m) Z.info("api wired", {
2778
2286
  name: e.name,
2779
2287
  pkg: e.pkg,
2780
2288
  ...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
2781
2289
  });
2782
- Ne(e).then((e) => {
2290
+ d(e).then((e) => {
2783
2291
  for (let t of e.files) if (t.action === "created") {
2784
2292
  let e = t.path.split("/").pop() ?? t.path;
2785
- X.info(`${e} seeded`, { path: t.path });
2293
+ Z.info(`${e} seeded`, { path: t.path });
2786
2294
  }
2787
2295
  }).catch(() => {});
2788
- let { resolved: d } = await it({
2789
- rawEnv: t.env,
2296
+ let { resolved: h } = await _e({
2297
+ rawEnv: r.env,
2790
2298
  appType: "web",
2791
2299
  root: e,
2792
- log: X,
2300
+ log: Z,
2793
2301
  generateTypes: !0
2794
- }), f = d.publicValues;
2795
- await $(e, t, r, f), X.debug("generated framework entry files", { files: [
2302
+ }), S = h.publicValues;
2303
+ await Br(e, r, m, S), Z.debug("generated framework entry files", { files: [
2796
2304
  "index.html",
2797
2305
  ".framework/main.tsx",
2798
- ...t.env ? [".framework/env.public.ts"] : []
2306
+ ...r.env ? [".framework/env.public.ts"] : []
2799
2307
  ] });
2800
- let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v = qe("web", _, g), y = Nr(_);
2801
- await Ge({
2802
- id: v,
2803
- name: _,
2308
+ let O = n({
2804
2309
  kind: "web",
2805
- url: `http://localhost:${g}`,
2310
+ configPort: r.port,
2311
+ env: process.env,
2312
+ dashboardPin: process.env[Sn] === "1"
2313
+ });
2314
+ for (let e of O.warnings) Z.warn(e);
2315
+ let k = O.port, A = r.name ?? "unnamed", j = y("web", A, k), M = b(A);
2316
+ await g({
2317
+ id: j,
2318
+ name: A,
2319
+ kind: "web",
2320
+ url: `http://localhost:${k}`,
2806
2321
  pid: process.pid,
2807
2322
  status: "booting",
2808
- logFile: y.path
2809
- }).catch(() => {}), await ra(e, g);
2810
- let { pages: b, dirs: x } = await Q(p(e, "src", "pages")), S = {
2811
- dirs: x,
2812
- ssrRoutes: Wi(b)
2813
- }, w = x.map((e) => ({
2323
+ logFile: M.path
2324
+ }).catch(() => {}), await Vr(e, k);
2325
+ let { pages: N, dirs: P } = await $(C(e, "src", "pages")), F = {
2326
+ dirs: P,
2327
+ ssrRoutes: Dr(N)
2328
+ }, I = P.map((e) => ({
2814
2329
  dir: e.dir,
2815
2330
  hasLayout: e.hasLayout,
2816
2331
  hasError: e.hasError,
2817
2332
  hasPending: e.hasPending,
2818
2333
  hasNotFound: e.hasNotFound
2819
- })), E = await on({
2334
+ })), R = await ft({
2820
2335
  appRoot: e,
2821
- pages: b
2336
+ pages: N
2822
2337
  });
2823
- E.wrote && X.debug("routes codegen wrote", { path: m(e, E.path) });
2824
- let D = await Ze("vite", () => import("vite")), k = (await import("@vitejs/plugin-react")).default, A = (await import("@tailwindcss/vite")).default, j = p(e, ".framework"), M = p(e, "src"), N = /* @__PURE__ */ new Set([
2338
+ R.wrote && Z.debug("routes codegen wrote", { path: w(e, R.path) });
2339
+ let ee = await fe("vite", () => import("vite")), z = (await import("@vitejs/plugin-react")).default, B = (await import("@tailwindcss/vite")).default, V = C(e, ".framework"), te = C(e, "src"), H = /* @__PURE__ */ new Set([
2825
2340
  ".framework",
2826
2341
  "node_modules",
2827
2342
  "dist",
@@ -2829,174 +2344,161 @@ import {
2829
2344
  ".vite",
2830
2345
  ".turbo",
2831
2346
  ".cache"
2832
- ]), ee = {
2347
+ ]), ne = {
2833
2348
  name: "framework:watch-app-sources",
2834
2349
  async configureServer(t) {
2835
2350
  try {
2836
- let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !N.has(e.name));
2837
- for (let r of n) t.watcher.add(p(e, r.name));
2838
- n.length === 0 && t.watcher.add(M);
2351
+ let n = (await D.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !H.has(e.name));
2352
+ for (let r of n) t.watcher.add(C(e, r.name));
2353
+ n.length === 0 && t.watcher.add(te);
2839
2354
  } catch {
2840
- t.watcher.add(M);
2355
+ t.watcher.add(te);
2841
2356
  }
2842
- try {
2843
- let n = await O.readFile(p(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2844
- ...r.dependencies,
2845
- ...r.devDependencies
2846
- });
2847
- await Promise.all(i.map(async (n) => {
2848
- let r = await Ki(e, n);
2849
- if (!r) return;
2850
- let i = p(r, "src");
2851
- try {
2852
- (await O.stat(i)).isDirectory() && t.watcher.add(i);
2853
- } catch {}
2854
- }));
2855
- } catch {}
2357
+ for (let n of await Se(e)) t.watcher.add(n.dir);
2856
2358
  }
2857
- }, P = p(e, "src", "pages"), F = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), I = (e) => e === P || e.startsWith(P + "/"), te = async (n) => {
2359
+ }, U = C(e, "src", "pages"), W = (e) => e.endsWith(".tsx") && (e === U || e.startsWith(U + "/")), ie = (e) => e === U || e.startsWith(U + "/"), ae = async (t) => {
2858
2360
  try {
2859
- let i = Date.now();
2860
- await $(e, t, r, f);
2861
- let { pages: a, dirs: o } = await Q(P);
2862
- await on({
2361
+ let n = Date.now();
2362
+ await Br(e, r, m, S);
2363
+ let { pages: i, dirs: a } = await $(U);
2364
+ await ft({
2863
2365
  appRoot: e,
2864
- pages: a
2865
- }), S.dirs = o, S.ssrRoutes = Wi(a), X.info("page tree regenerated", {
2866
- reason: n,
2867
- ms: Date.now() - i,
2868
- routes: S.ssrRoutes.length
2366
+ pages: i
2367
+ }), F.dirs = a, F.ssrRoutes = Dr(i), Z.info("page tree regenerated", {
2368
+ reason: t,
2369
+ ms: Date.now() - n,
2370
+ routes: F.ssrRoutes.length
2869
2371
  });
2870
2372
  } catch (e) {
2871
- X.error("page tree regen failed", { reason: n }, e);
2373
+ Z.error("page tree regen failed", { reason: t }, e);
2872
2374
  }
2873
- }, L = {
2375
+ }, oe = {
2874
2376
  name: "framework:regenerate-on-page-tree-change",
2875
2377
  configureServer(t) {
2876
2378
  let n = null, r = [], i = (e) => {
2877
2379
  r.push(e), n && clearTimeout(n), n = setTimeout(() => {
2878
2380
  n = null;
2879
2381
  let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
2880
- r.length = 0, te(e);
2382
+ r.length = 0, ae(e);
2881
2383
  }, 50);
2882
2384
  };
2883
2385
  t.watcher.on("add", (t) => {
2884
- F(t) && i(`add ${m(e, t)}`);
2386
+ W(t) && i(`add ${w(e, t)}`);
2885
2387
  }), t.watcher.on("unlink", (t) => {
2886
- F(t) && i(`unlink ${m(e, t)}`);
2388
+ W(t) && i(`unlink ${w(e, t)}`);
2887
2389
  }), t.watcher.on("addDir", (t) => {
2888
- I(t) && i(`addDir ${m(e, t)}`);
2390
+ ie(t) && i(`addDir ${w(e, t)}`);
2889
2391
  }), t.watcher.on("unlinkDir", (t) => {
2890
- I(t) && i(`unlinkDir ${m(e, t)}`);
2392
+ ie(t) && i(`unlinkDir ${w(e, t)}`);
2891
2393
  });
2892
2394
  }
2893
- }, R = p(e, "app.config.ts"), ne = (e) => {
2894
- if (!ae(e.env)) return "";
2395
+ }, G = C(e, "app.config.ts"), K = (e) => {
2396
+ if (!re(e.env)) return "";
2895
2397
  let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
2896
2398
  return `${String(e.env.publicPrefix)}|${t.join(",")}`;
2897
- }, re = (e, t) => {
2399
+ }, le = (e, t) => {
2898
2400
  let n = [];
2899
- return e.port !== t.port && n.push(`port ${e.port ?? "(default)"} → ${t.port ?? "(default)"}`), JSON.stringify(e.proxies) !== JSON.stringify(t.proxies) && n.push("proxies"), JSON.stringify(e.allowedHosts) !== JSON.stringify(t.allowedHosts) && n.push("allowedHosts"), JSON.stringify(e.apis) !== JSON.stringify(t.apis) && n.push("apis"), ne(e) !== ne(t) && n.push("env"), n;
2900
- }, z = t, ie = h(R), B = {
2401
+ return e.port !== t.port && n.push(`port ${e.port ?? "(default)"} → ${t.port ?? "(default)"}`), JSON.stringify(e.proxies) !== JSON.stringify(t.proxies) && n.push("proxies"), JSON.stringify(e.allowedHosts) !== JSON.stringify(t.allowedHosts) && n.push("allowedHosts"), JSON.stringify(e.apis) !== JSON.stringify(t.apis) && n.push("apis"), K(e) !== K(t) && n.push("env"), n;
2402
+ }, ue = r, de = T(G), pe = {
2901
2403
  name: "framework:watch-app-config",
2902
- async configureServer(t) {
2903
- t.watcher.add(R), X.info("watching app.config.ts for changes", { path: m(e, R) });
2904
- let n = async () => {
2404
+ async configureServer(n) {
2405
+ n.watcher.add(G), Z.info("watching app.config.ts for changes", { path: w(e, G) });
2406
+ let r = async () => {
2905
2407
  try {
2906
2408
  try {
2907
- let e = t.moduleGraph.getModuleById(R);
2908
- e && t.moduleGraph.invalidateModule(e);
2409
+ let e = n.moduleGraph.getModuleById(G);
2410
+ e && n.moduleGraph.invalidateModule(e);
2909
2411
  } catch {}
2910
- let e = (await t.ssrLoadModule(R, { fixStacktrace: !0 })).default;
2911
- return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (X.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
2412
+ let e = (await n.ssrLoadModule(G, { fixStacktrace: !0 })).default;
2413
+ return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Z.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
2912
2414
  } catch (e) {
2913
- return X.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2415
+ return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2914
2416
  }
2915
- }, r = null, i = () => {
2916
- r && clearTimeout(r), r = setTimeout(() => {
2917
- r = null, a();
2417
+ }, i = null, a = () => {
2418
+ i && clearTimeout(i), i = setTimeout(() => {
2419
+ i = null, o();
2918
2420
  }, 100);
2919
- }, a = async () => {
2920
- let r = await n();
2921
- if (!r) {
2922
- X.info("app.config.ts onConfigChange: load returned null — skipping");
2421
+ }, o = async () => {
2422
+ let t = await r();
2423
+ if (!t) {
2424
+ Z.info("app.config.ts onConfigChange: load returned null — skipping");
2923
2425
  return;
2924
2426
  }
2925
- if (X.info("app.config.ts onConfigChange: loaded", {
2926
- theme: r.theme,
2927
- port: r.port,
2928
- name: r.name
2929
- }), JSON.stringify(r) === JSON.stringify(z)) {
2930
- X.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2427
+ if (Z.info("app.config.ts onConfigChange: loaded", {
2428
+ theme: t.theme,
2429
+ port: t.port,
2430
+ name: t.name
2431
+ }), JSON.stringify(t) === JSON.stringify(ue)) {
2432
+ Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2931
2433
  return;
2932
2434
  }
2933
- let i = re(z, r);
2435
+ let i = le(ue, t);
2934
2436
  if (i.length > 0) {
2935
- X.warn("app.config.ts changed — hard restart required", { fields: i });
2437
+ Z.warn("app.config.ts changed — hard restart required", { fields: i });
2936
2438
  try {
2937
- await t.close();
2439
+ await n.close();
2938
2440
  } catch {}
2939
- let e = fe(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2441
+ let e = ce(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2940
2442
  stdio: "inherit",
2941
2443
  env: process.env,
2942
2444
  cwd: process.cwd()
2943
- }), n = (t) => {
2445
+ }), t = (t) => {
2944
2446
  e.kill(t);
2945
- }, r = () => n("SIGINT"), a = () => n("SIGTERM");
2447
+ }, r = () => t("SIGINT"), a = () => t("SIGTERM");
2946
2448
  process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
2947
2449
  process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
2948
2450
  }), e.on("error", (e) => {
2949
- X.error("restart spawn failed", {}, e), process.exit(1);
2451
+ Z.error("restart spawn failed", {}, e), process.exit(1);
2950
2452
  });
2951
2453
  return;
2952
2454
  }
2953
2455
  try {
2954
- let n = Date.now();
2955
- await $(e, r, await Zi(e, r)), z = r, t.ws && t.ws.send({
2456
+ let r = Date.now();
2457
+ await Br(e, t, await Pr(e, t)), ue = t, n.ws && n.ws.send({
2956
2458
  type: "full-reload",
2957
2459
  path: "*"
2958
- }), X.info("app.config.ts soft-regen", {
2959
- ms: Date.now() - n,
2460
+ }), Z.info("app.config.ts soft-regen", {
2461
+ ms: Date.now() - r,
2960
2462
  reload: "full"
2961
2463
  });
2962
2464
  } catch (e) {
2963
- X.error("app.config.ts soft-regen failed", {}, e);
2465
+ Z.error("app.config.ts soft-regen failed", {}, e);
2964
2466
  }
2965
- }, o = (e) => u(e) === "app.config.ts" ? e === R || h(e) === ie : !1;
2966
- t.watcher.on("change", (e) => {
2967
- o(e) && (X.info("app.config.ts change event (chokidar)", { file: e }), i());
2968
- }), t.watcher.on("add", (e) => {
2969
- o(e) && (X.info("app.config.ts add event (chokidar)", { file: e }), i());
2467
+ }, s = (e) => x(e) === "app.config.ts" ? e === G || T(e) === de : !1;
2468
+ n.watcher.on("change", (e) => {
2469
+ s(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), a());
2470
+ }), n.watcher.on("add", (e) => {
2471
+ s(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), a());
2970
2472
  });
2971
2473
  try {
2972
2474
  let { watchFile: e } = await import("node:fs");
2973
- e(R, { interval: 500 }, (e, t) => {
2974
- e.mtimeMs !== t.mtimeMs && (X.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2975
- }), X.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2475
+ e(G, { interval: 500 }, (e, t) => {
2476
+ e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), a());
2477
+ }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2976
2478
  } catch (e) {
2977
- X.warn("app.config.ts polling watcher could not attach", {}, e);
2479
+ Z.warn("app.config.ts polling watcher could not attach", {}, e);
2978
2480
  }
2979
- vt(ht, X, {
2481
+ we(t, Z, {
2980
2482
  root: e,
2981
- onBeforeRestart: () => t.close()
2483
+ onBeforeRestart: () => n.close()
2982
2484
  });
2983
2485
  }
2984
- }, V = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, oe = 0, se = {
2486
+ }, me = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, q = 0, he = {
2985
2487
  name: "framework:suppress-api-hmr",
2986
2488
  handleHotUpdate(e) {
2987
- if (oe += 1, V.test(e.file)) return [];
2489
+ if (q += 1, me.test(e.file)) return [];
2988
2490
  }
2989
- }, ce = {
2491
+ }, ge = {
2990
2492
  name: "framework:reoptimize-on-rpcgroup-change",
2991
2493
  async configureServer(t) {
2992
2494
  let n = /* @__PURE__ */ new Map();
2993
- for (let i of r) {
2994
- if (!i.proxyTarget) continue;
2995
- let r = await Ki(e, i.pkg);
2996
- if (!r) continue;
2997
- let a = p(r, "rpcGroup.generated.ts");
2495
+ for (let r of m) {
2496
+ if (!r.proxyTarget) continue;
2497
+ let i = await kr(e, r.pkg);
2498
+ if (!i) continue;
2499
+ let a = C(i, "rpcGroup.generated.ts");
2998
2500
  try {
2999
- n.set(a, await O.readFile(a, "utf8"));
2501
+ n.set(a, await D.readFile(a, "utf8"));
3000
2502
  } catch {
3001
2503
  n.set(a, "");
3002
2504
  }
@@ -3005,179 +2507,179 @@ import {
3005
2507
  } catch {}
3006
2508
  }
3007
2509
  if (n.size === 0) return;
3008
- let i = null, a = !1, o = async () => {
3009
- if (a) return;
2510
+ let r = null, i = !1, a = async () => {
2511
+ if (i) return;
3010
2512
  let r = null;
3011
2513
  for (let [e, t] of n) {
3012
2514
  let i;
3013
2515
  try {
3014
- i = await O.readFile(e, "utf8");
2516
+ i = await D.readFile(e, "utf8");
3015
2517
  } catch {
3016
2518
  continue;
3017
2519
  }
3018
2520
  i !== t && (n.set(e, i), r = e);
3019
2521
  }
3020
2522
  if (r !== null) {
3021
- a = !0, X.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2523
+ i = !0, Z.info(`rpcGroup changed (${w(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
3022
2524
  try {
3023
- await O.rm(p(j, ".vite", "deps"), {
2525
+ await D.rm(C(V, ".vite", "deps"), {
3024
2526
  recursive: !0,
3025
2527
  force: !0
3026
2528
  }), await t.restart(!0);
3027
2529
  } catch (e) {
3028
- a = !1, X.error("rpcGroup re-optimize failed", {}, e);
2530
+ i = !1, Z.error("rpcGroup re-optimize failed", {}, e);
3029
2531
  }
3030
2532
  }
3031
- }, s = (e) => {
3032
- n.has(h(e)) && (i && clearTimeout(i), i = setTimeout(() => {
3033
- o();
2533
+ }, o = (e) => {
2534
+ n.has(T(e)) && (r && clearTimeout(r), r = setTimeout(() => {
2535
+ a();
3034
2536
  }, 120));
3035
2537
  };
3036
- t.watcher.on("change", s), t.watcher.on("add", s);
2538
+ t.watcher.on("change", o), t.watcher.on("add", o);
3037
2539
  }
3038
- }, H = {}, le = (e) => (t) => {
2540
+ }, J = {}, ve = (e) => (t) => {
3039
2541
  t.on("proxyReq", (t, n) => {
3040
- Zn(t, n, {
2542
+ rn(t, n, {
3041
2543
  target: e,
3042
2544
  token: process.env.VOLTRO_INSPECT_TOKEN,
3043
2545
  writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
3044
- isLoopback: i
2546
+ isLoopback: l
3045
2547
  });
3046
2548
  });
3047
2549
  };
3048
- for (let e of r) {
2550
+ for (let e of m) {
3049
2551
  if (!e.proxyTarget) continue;
3050
- H[e.browserWsUrl] = {
2552
+ J[e.browserWsUrl] = {
3051
2553
  target: e.proxyTarget,
3052
2554
  ws: !0,
3053
2555
  changeOrigin: !0,
3054
2556
  ...e.wsPath ? {} : { rewrite: () => "/ws" }
3055
2557
  };
3056
2558
  let t = e.proxyTarget.replace(/^ws/, "http");
3057
- H[`/_voltro/api/${e.name}`] = {
2559
+ J[`/_voltro/api/${e.name}`] = {
3058
2560
  target: t,
3059
2561
  changeOrigin: !0,
3060
2562
  rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
3061
- configure: le(t)
2563
+ configure: ve(t)
3062
2564
  };
3063
2565
  }
3064
- for (let [e, n] of Object.entries(t.proxies ?? {})) {
3065
- if (H[e]) {
3066
- X.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
2566
+ for (let [e, t] of Object.entries(r.proxies ?? {})) {
2567
+ if (J[e]) {
2568
+ Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
3067
2569
  continue;
3068
2570
  }
3069
- H[e] = {
3070
- target: n.target,
3071
- changeOrigin: n.changeOrigin ?? !0,
3072
- ...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
3073
- }, X.info(`proxy ${e} → ${n.target}`, {
2571
+ J[e] = {
2572
+ target: t.target,
2573
+ changeOrigin: t.changeOrigin ?? !0,
2574
+ ...t.rewrite === void 0 ? {} : { rewrite: (n) => n.replace(RegExp(`^${e}`), t.rewrite) }
2575
+ }, Z.info(`proxy ${e} → ${t.target}`, {
3074
2576
  prefix: e,
3075
- target: n.target,
3076
- ...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
2577
+ target: t.target,
2578
+ ...t.rewrite === void 0 ? {} : { rewrite: t.rewrite }
3077
2579
  });
3078
2580
  }
3079
- let ue = {
2581
+ let be = {
3080
2582
  name: "framework:inspect",
3081
- configureServer(r) {
3082
- let u = null, d = async () => {
3083
- if (u !== null) return u;
3084
- let t = [];
3085
- for (let n of b) try {
3086
- let i = await r.ssrLoadModule(p(e, "src", "pages", n.file));
3087
- t.push({
2583
+ configureServer(t) {
2584
+ let n = null, d = async () => {
2585
+ if (n !== null) return n;
2586
+ let r = [];
2587
+ for (let n of N) try {
2588
+ let i = await t.ssrLoadModule(C(e, "src", "pages", n.file));
2589
+ r.push({
3088
2590
  pattern: n.pattern,
3089
2591
  file: n.file,
3090
2592
  dirChain: n.dirChain,
3091
- renderMode: vr(i, p("src", "pages", n.file)),
2593
+ renderMode: f(i, C("src", "pages", n.file)),
3092
2594
  interactive: i.interactive ?? "full",
3093
2595
  tenantAware: i.tenantAware === !0,
3094
- revalidateMs: lt(i.revalidate),
3095
- staleWhileRevalidateMs: lt(i.staleWhileRevalidate) ?? 0,
2596
+ revalidateMs: p(i.revalidate),
2597
+ staleWhileRevalidateMs: p(i.staleWhileRevalidate) ?? 0,
3096
2598
  cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
3097
2599
  hasLoader: typeof i.loader == "function",
3098
2600
  hasMeta: i.meta != null,
3099
2601
  hasGetStaticPaths: typeof i.getStaticPaths == "function"
3100
2602
  });
3101
2603
  } catch (e) {
3102
- X.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2604
+ Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
3103
2605
  }
3104
- return u = t, t;
2606
+ return n = r, r;
3105
2607
  };
3106
- r.middlewares.use((e, t, r) => {
3107
- let i = e.url ?? "/";
3108
- if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
2608
+ t.middlewares.use((e, t, n) => {
2609
+ let r = e.url ?? "/";
2610
+ if (r.startsWith("/_voltro/inspect") || r.startsWith("/api/dashboard/proxy")) return n();
3109
2611
  let a = Date.now(), o = t.end.bind(t);
3110
2612
  t.end = ((...e) => {
3111
2613
  try {
3112
- n.emit("request", {
3113
- url: i.split("?")[0],
2614
+ i.emit("request", {
2615
+ url: r.split("?")[0],
3114
2616
  status: t.statusCode ?? 0,
3115
2617
  durationMs: Date.now() - a
3116
2618
  });
3117
2619
  } catch {}
3118
2620
  return o(...e);
3119
- }), r();
3120
- }), r.middlewares.use((t, n, r) => {
2621
+ }), n();
2622
+ }), t.middlewares.use((t, n, r) => {
3121
2623
  if (t.method !== "GET" && t.method !== "HEAD") return r();
3122
- let { pathname: i } = ni(t.url ?? "/");
3123
- if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
3124
- n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(fn({ indexable: !1 }));
3125
- }), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
3126
- let r = e.url ?? "", a = r.split("?")[0];
3127
- if (a === "/api/dashboard/proxy") {
2624
+ let { pathname: i } = zn(t.url ?? "/");
2625
+ if (i !== "/robots.txt" || E(C(e, "public", "robots.txt"))) return r();
2626
+ n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(vt({ indexable: !1 }));
2627
+ }), r.name === "voltroDashboard" && t.middlewares.use(async (e, t, n) => {
2628
+ let r = e.url ?? "", i = r.split("?")[0];
2629
+ if (i === "/api/dashboard/proxy") {
3128
2630
  let n = new URL(r, "http://x").searchParams.get("target");
3129
2631
  if (!n) {
3130
2632
  t.statusCode = 400, t.end("missing ?target=");
3131
2633
  return;
3132
2634
  }
3133
- if (!o(n)) {
2635
+ if (!u(n)) {
3134
2636
  t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
3135
2637
  return;
3136
2638
  }
3137
2639
  try {
3138
2640
  let r = { accept: String(e.headers.accept ?? "application/json") };
3139
- e.headers.authorization ? r.authorization = String(e.headers.authorization) : i(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
3140
- let a;
2641
+ e.headers.authorization ? r.authorization = String(e.headers.authorization) : l(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2642
+ let i;
3141
2643
  if (e.method && e.method !== "GET" && e.method !== "HEAD") {
3142
2644
  let t = [];
3143
2645
  for await (let n of e) t.push(n);
3144
- a = Buffer.concat(t);
2646
+ i = Buffer.concat(t);
3145
2647
  let n = e.headers["content-type"];
3146
2648
  n && (r["content-type"] = Array.isArray(n) ? n[0] : String(n));
3147
2649
  }
3148
- let o = await fetch(n, {
2650
+ let a = await fetch(n, {
3149
2651
  redirect: "manual",
3150
2652
  ...e.method ? { method: e.method } : {},
3151
2653
  headers: r,
3152
- ...a && a.length ? { body: new Uint8Array(a.buffer, a.byteOffset, a.byteLength) } : {}
3153
- }), s = Buffer.from(await o.arrayBuffer());
3154
- t.statusCode = o.status, t.setHeader("content-type", o.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
2654
+ ...i && i.length ? { body: new Uint8Array(i.buffer, i.byteOffset, i.byteLength) } : {}
2655
+ }), o = Buffer.from(await a.arrayBuffer());
2656
+ t.statusCode = a.status, t.setHeader("content-type", a.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(o.length)), t.end(o);
3155
2657
  } catch (e) {
3156
2658
  t.statusCode = 502, t.end(`proxy error: ${e.message}`);
3157
2659
  }
3158
2660
  return;
3159
2661
  }
3160
- if (a === "/api/dashboard/proxy/stream") {
2662
+ if (i === "/api/dashboard/proxy/stream") {
3161
2663
  let n = new URL(r, "http://x").searchParams.get("target");
3162
2664
  if (!n) {
3163
2665
  t.statusCode = 400, t.end("missing ?target=");
3164
2666
  return;
3165
2667
  }
3166
- if (!o(n)) {
2668
+ if (!u(n)) {
3167
2669
  t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
3168
2670
  return;
3169
2671
  }
3170
- let a = new AbortController();
3171
- e.on("close", () => a.abort()), t.on("close", () => a.abort());
2672
+ let i = new AbortController();
2673
+ e.on("close", () => i.abort()), t.on("close", () => i.abort());
3172
2674
  try {
3173
2675
  let r = await fetch(n, {
3174
2676
  redirect: "manual",
3175
2677
  method: "GET",
3176
2678
  headers: {
3177
2679
  accept: "text/event-stream",
3178
- ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : i(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2680
+ ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : l(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
3179
2681
  },
3180
- signal: a.signal
2682
+ signal: i.signal
3181
2683
  });
3182
2684
  if (!r.ok || !r.body) {
3183
2685
  t.statusCode = r.status, t.end(`upstream ${r.status}`);
@@ -3189,15 +2691,15 @@ import {
3189
2691
  connection: "keep-alive",
3190
2692
  "x-accel-buffering": "no"
3191
2693
  });
3192
- let o = r.body.getReader();
2694
+ let a = r.body.getReader();
3193
2695
  try {
3194
2696
  for (;;) {
3195
- let { done: e, value: n } = await o.read();
2697
+ let { done: e, value: n } = await a.read();
3196
2698
  if (e) break;
3197
2699
  n && t.write(Buffer.from(n));
3198
2700
  }
3199
2701
  } finally {
3200
- o.releaseLock(), t.end();
2702
+ a.releaseLock(), t.end();
3201
2703
  }
3202
2704
  } catch (e) {
3203
2705
  e.name !== "AbortError" && (t.statusCode = 502, t.end(`proxy stream error: ${e.message}`));
@@ -3205,86 +2707,86 @@ import {
3205
2707
  return;
3206
2708
  }
3207
2709
  n();
3208
- }), r.middlewares.use(async (e, r, i) => {
3209
- let o = e.url ?? "";
3210
- if (!o.startsWith("/_voltro/inspect")) return i();
2710
+ }), t.middlewares.use(async (e, t, n) => {
2711
+ let l = e.url ?? "";
2712
+ if (!l.startsWith("/_voltro/inspect")) return n();
3211
2713
  let u = {};
3212
2714
  for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (u[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
3213
- let f = o.split("?")[0];
3214
- if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
3215
- let e = a(u.origin), t = Gn(o, Dn(), u);
3216
- r.statusCode = t.status, r.setHeader("content-type", t.contentType);
3217
- for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
3218
- r.end(t.body);
2715
+ let f = l.split("?")[0];
2716
+ if (e.method === "GET" && (f === "/_voltro/inspect/logs" || l.startsWith("/_voltro/inspect/logs?"))) {
2717
+ let e = o(u.origin), n = Zt(l, Nt(), u);
2718
+ t.statusCode = n.status, t.setHeader("content-type", n.contentType);
2719
+ for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
2720
+ t.end(n.body);
3219
2721
  return;
3220
2722
  }
3221
2723
  if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
3222
- let t = a(u.origin);
3223
- if (c()) {
3224
- r.statusCode = 503, r.setHeader("content-type", "application/json");
3225
- for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
3226
- r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2724
+ let n = o(u.origin);
2725
+ if (a()) {
2726
+ t.statusCode = 503, t.setHeader("content-type", "application/json");
2727
+ for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
2728
+ t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
3227
2729
  return;
3228
2730
  }
3229
- let i = "";
2731
+ let r = "";
3230
2732
  e.setEncoding("utf-8"), e.on("data", (e) => {
3231
- i += e;
2733
+ r += e;
3232
2734
  }), e.on("end", () => {
3233
- let e = zn(i, n);
3234
- r.statusCode = e.status, r.setHeader("content-type", e.contentType);
3235
- for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
3236
- r.end(e.body);
2735
+ let e = Gt(r, i);
2736
+ t.statusCode = e.status, t.setHeader("content-type", e.contentType);
2737
+ for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
2738
+ t.end(e.body);
3237
2739
  }), e.on("error", () => {
3238
- r.statusCode = 400, r.setHeader("content-type", "application/json"), r.end(JSON.stringify({ error: "read failed" }));
2740
+ t.statusCode = 400, t.setHeader("content-type", "application/json"), t.end(JSON.stringify({ error: "read failed" }));
3239
2741
  });
3240
2742
  return;
3241
2743
  }
3242
2744
  if (f === "/_voltro/inspect/stream") {
3243
- let t = a(u.origin);
3244
- if (c()) {
3245
- r.statusCode = 503, r.setHeader("content-type", "application/json");
3246
- for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
3247
- r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2745
+ let n = o(u.origin);
2746
+ if (a()) {
2747
+ t.statusCode = 503, t.setHeader("content-type", "application/json");
2748
+ for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
2749
+ t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
3248
2750
  return;
3249
2751
  }
3250
- let i = s(u, "GET");
3251
- if (!i.ok) {
3252
- r.statusCode = 401, r.setHeader("content-type", "application/json");
3253
- for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
3254
- r.end(JSON.stringify({
2752
+ let r = s(u, "GET");
2753
+ if (!r.ok) {
2754
+ t.statusCode = 401, t.setHeader("content-type", "application/json");
2755
+ for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
2756
+ t.end(JSON.stringify({
3255
2757
  error: "unauthorized",
3256
- reason: i.reason
2758
+ reason: r.reason
3257
2759
  }));
3258
2760
  return;
3259
2761
  }
3260
- r.statusCode = 200, r.setHeader("content-type", "text/event-stream; charset=utf-8"), r.setHeader("cache-control", "no-cache, no-transform"), r.setHeader("connection", "keep-alive"), r.setHeader("x-accel-buffering", "no");
3261
- for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
3262
- r.flushHeaders?.(), r.write("retry: 5000\n\n");
3263
- let l = o.indexOf("?");
3264
- if (!(l !== -1 && new URLSearchParams(o.slice(l + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(hn(e));
3265
- let d = n.subscribe((e) => {
2762
+ t.statusCode = 200, t.setHeader("content-type", "text/event-stream; charset=utf-8"), t.setHeader("cache-control", "no-cache, no-transform"), t.setHeader("connection", "keep-alive"), t.setHeader("x-accel-buffering", "no");
2763
+ for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
2764
+ t.flushHeaders?.(), t.write("retry: 5000\n\n");
2765
+ let c = l.indexOf("?");
2766
+ if (!(c !== -1 && new URLSearchParams(l.slice(c + 1)).get("live") === "1")) for (let e of i.buffered()) t.write(xt(e));
2767
+ let d = i.subscribe((e) => {
3266
2768
  try {
3267
- r.write(hn(e));
2769
+ t.write(xt(e));
3268
2770
  } catch {}
3269
2771
  }), f = setInterval(() => {
3270
2772
  try {
3271
- r.write(gn());
2773
+ t.write(St());
3272
2774
  } catch {}
3273
2775
  }, 15e3), p = () => {
3274
2776
  clearInterval(f), d();
3275
2777
  };
3276
- e.on("close", p), r.on("close", p);
2778
+ e.on("close", p), t.on("close", p);
3277
2779
  return;
3278
2780
  }
3279
2781
  try {
3280
- let n = l(o, {
2782
+ let i = c(l, {
3281
2783
  kind: "web",
3282
2784
  meta: {
3283
- name: t.name ?? "(unnamed)",
3284
- voltroVersion: wi,
3285
- port: g,
2785
+ name: r.name ?? "(unnamed)",
2786
+ voltroVersion: sr,
2787
+ port: k,
3286
2788
  mode: "dev",
3287
- apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
2789
+ apis: Object.entries(r.apis ?? {}).map(([e, t]) => {
3288
2790
  let n = {
3289
2791
  name: e,
3290
2792
  package: t.package
@@ -3293,42 +2795,42 @@ import {
3293
2795
  })
3294
2796
  },
3295
2797
  routes: await d(),
3296
- dirs: w,
2798
+ dirs: I,
3297
2799
  cache: () => ({
3298
2800
  backend: "memory",
3299
2801
  size: 0,
3300
2802
  entries: []
3301
2803
  }),
3302
- env: () => ot(t.name ?? "app", { contract: ae(t.env) ? t.env : void 0 })
2804
+ env: () => ye(r.name ?? "app", { contract: re(r.env) ? r.env : void 0 })
3303
2805
  }, u, { method: e.method ?? "GET" });
3304
- if (n === null) return i();
3305
- r.statusCode = n.status, r.setHeader("content-type", n.contentType);
3306
- for (let [e, t] of Object.entries(n.headers ?? {})) r.setHeader(e, t);
3307
- r.end(n.body);
2806
+ if (i === null) return n();
2807
+ t.statusCode = i.status, t.setHeader("content-type", i.contentType);
2808
+ for (let [e, n] of Object.entries(i.headers ?? {})) t.setHeader(e, n);
2809
+ t.end(i.body);
3308
2810
  } catch (e) {
3309
- r.statusCode = 500, r.setHeader("content-type", "text/plain"), r.end(`inspect handler error: ${e.message}`);
2811
+ t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`inspect handler error: ${e.message}`);
3310
2812
  }
3311
2813
  });
3312
2814
  }
3313
- }, pe = t.name === "voltroDashboard" ? {
2815
+ }, xe = r.name === "voltroDashboard" ? {
3314
2816
  name: "framework:dashboard-registry",
3315
2817
  configureServer(e) {
3316
2818
  e.middlewares.use(async (e, t, n) => {
3317
2819
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
3318
2820
  try {
3319
- let e = await We();
2821
+ let e = await _();
3320
2822
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
3321
2823
  } catch (e) {
3322
2824
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
3323
2825
  }
3324
2826
  });
3325
2827
  }
3326
- } : null, me = /* @__PURE__ */ new Set(), he = (e, t, n, r, i, a = !1) => {
3327
- let o = li(i, a, t) ?? "";
3328
- if (X.error(`${t} render failed`, {
2828
+ } : null, Ce = /* @__PURE__ */ new Set(), Te = (e, t, n, r, i, a = !1) => {
2829
+ let o = Kn(i, a, t) ?? "";
2830
+ if (Z.error(`${t} render failed`, {
3329
2831
  pathname: n,
3330
2832
  pattern: r,
3331
- cause: vn(i) + o
2833
+ cause: wt(i) + o
3332
2834
  }), e.headersSent) {
3333
2835
  e.end();
3334
2836
  return;
@@ -3336,98 +2838,98 @@ import {
3336
2838
  e.writeHead(500, {
3337
2839
  "content-type": "text/plain; charset=utf-8",
3338
2840
  "x-voltro-rendered-by": `${t}-failed`,
3339
- "x-voltro-ssr-generation": String(oe)
2841
+ "x-voltro-ssr-generation": String(q)
3340
2842
  });
3341
- let s = oe === 0 ? "" : `\n[voltro] this process has absorbed ${oe} hot update(s) since boot, so its SSR\nmodule graph may not match the files on disk. Before reporting this — to us or to\nyourself — restart \`voltro dev\` and measure once from a fresh boot.\n`;
3342
- e.end(`${t} render failed for ${n}\n\n${vn(i)}\n${o}\n${s}`);
3343
- }, U = qt(), ge = Yt({
3344
- limit: U,
3345
- onColdStart: (e) => X.debug("ssr cold-compile start", { id: e }),
3346
- onColdEnd: (e, { durationMs: t, failed: n }) => X.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
2843
+ let s = q === 0 ? "" : `\n[voltro] this process has absorbed ${q} hot update(s) since boot, so its SSR\nmodule graph may not match the files on disk. Before reporting this — to us or to\nyourself — restart \`voltro dev\` and measure once from a fresh boot.\n`;
2844
+ e.end(`${t} render failed for ${n}\n\n${wt(i)}\n${o}\n${s}`);
2845
+ }, Ee = et(), De = nt({
2846
+ limit: Ee,
2847
+ onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
2848
+ onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
3347
2849
  id: e,
3348
2850
  ms: t,
3349
2851
  ...n ? { failed: !0 } : {}
3350
2852
  })
3351
2853
  });
3352
- X.debug(`ssr cold-compile concurrency ${U}`, { concurrency: U });
3353
- let W = null, _e = async () => (W === null && (W = await O.readFile(p(e, ".framework", "index.html"), "utf8")), W), ve = {
2854
+ Z.debug(`ssr cold-compile concurrency ${Ee}`, { concurrency: Ee });
2855
+ let Oe = null, ke = async () => (Oe === null && (Oe = await D.readFile(C(e, ".framework", "index.html"), "utf8")), Oe), Ae = {
3354
2856
  name: "framework:ssr",
3355
- configureServer(n) {
3356
- let i = (e) => ge.load(e, async () => await n.ssrLoadModule(e)), a, o = !1, s = () => {
3357
- if (a !== void 0) return a;
3358
- let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
3359
- return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
3360
- let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), s = {};
3361
- for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
3362
- let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
3363
- n !== void 0 && (s[a] = t(a, n, r));
2857
+ configureServer(t) {
2858
+ let n = (e) => De.load(e, async () => await t.ssrLoadModule(e)), i, a = !1, o = () => {
2859
+ if (i !== void 0) return i;
2860
+ let t = r.locales ?? [], o = r.defaultLocale ?? t[0] ?? "en";
2861
+ return t.length === 0 ? (i = Promise.resolve(() => void 0), i) : (i = (async () => {
2862
+ let [{ makeSsgWrap: r }, { makeSsrI18nResolver: i }] = await Promise.all([n("@voltro/i18n"), n("@voltro/i18n/server")]), s = {};
2863
+ for (let i of t) if (E(C(e, "src", "locales", `${i}.ts`))) try {
2864
+ let t = (await n(C(e, "src", "locales", `${i}.ts`))).default;
2865
+ t !== void 0 && (s[i] = r(i, t, o));
3364
2866
  } catch (e) {
3365
- X.warn("locale catalog failed to load for SSR", { locale: a }, e);
2867
+ Z.warn("locale catalog failed to load for SSR", { locale: i }, e);
3366
2868
  }
3367
- if (o = Object.keys(s).length > 0, Object.keys(s).length === 0) {
3368
- let { resolveLocale: e } = await i("@voltro/i18n/server");
3369
- return (t, i) => ({
2869
+ if (a = Object.keys(s).length > 0, Object.keys(s).length === 0) {
2870
+ let { resolveLocale: e } = await n("@voltro/i18n/server");
2871
+ return (n, r) => ({
3370
2872
  locale: e({
3371
- cookieHeader: t ?? null,
3372
- acceptLanguageHeader: i ?? null,
3373
- supported: n,
3374
- defaultLocale: r
2873
+ cookieHeader: n ?? null,
2874
+ acceptLanguageHeader: r ?? null,
2875
+ supported: t,
2876
+ defaultLocale: o
3375
2877
  }),
3376
2878
  outerWrap: (e) => e
3377
2879
  });
3378
2880
  }
3379
- return a({
2881
+ return i({
3380
2882
  wraps: s,
3381
- supported: n,
3382
- defaultLocale: r
2883
+ supported: t,
2884
+ defaultLocale: o
3383
2885
  });
3384
- })(), a);
2886
+ })(), i);
3385
2887
  };
3386
- n.middlewares.use(async (a, c, l) => {
3387
- if (a.method !== "GET" && a.method !== "HEAD") return l();
3388
- let u = a.url ?? "/";
3389
- u.indexOf("?");
3390
- let { pathname: d, search: f } = ni(u);
3391
- if (d.startsWith("/@") || d.startsWith("/node_modules/") || d.startsWith("/.framework/") || d.startsWith("/_voltro/") || d === "/main.tsx" || d === "/index.html" || d === "/sw.js" || d === "/favicon.ico" || d === "/robots.txt" || /\.[a-z0-9]+$/i.test(d)) return l();
3392
- let m = Gi(d, S.ssrRoutes);
3393
- if (!m) return l();
3394
- let h = !me.has(m.route.pattern), g = Date.now();
3395
- h && X.info(`ssr compiling ${m.route.pattern}`, {
3396
- pattern: m.route.pattern,
3397
- pathname: d
2888
+ t.middlewares.use(async (i, s, c) => {
2889
+ if (i.method !== "GET" && i.method !== "HEAD") return c();
2890
+ let l = i.url ?? "/";
2891
+ l.indexOf("?");
2892
+ let { pathname: u, search: d } = zn(l);
2893
+ 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 c();
2894
+ let p = Or(u, F.ssrRoutes);
2895
+ if (!p) return c();
2896
+ let h = !Ce.has(p.route.pattern), g = Date.now();
2897
+ h && Z.info(`ssr compiling ${p.route.pattern}`, {
2898
+ pattern: p.route.pattern,
2899
+ pathname: u
3398
2900
  });
3399
2901
  let _ = {}, v = async (e, t) => {
3400
2902
  let n = Date.now(), r = await t();
3401
2903
  return _[e] = (_[e] ?? 0) + (Date.now() - n), r;
3402
- }, y = async (e, t, r) => {
3403
- let i = await n.moduleGraph.getModuleById(e);
3404
- if (!(!i || t.has(e))) {
3405
- if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
2904
+ }, y = async (e, n, r) => {
2905
+ let i = await t.moduleGraph.getModuleById(e);
2906
+ if (!(!i || n.has(e))) {
2907
+ if (n.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
3406
2908
  let e = i.url.replace(/\?.*$/, "");
3407
2909
  r.includes(e) || r.push(e);
3408
2910
  return;
3409
2911
  }
3410
- for (let e of i.importedModules ?? []) e.id && await y(e.id, t, r);
2912
+ for (let e of i.importedModules ?? []) e.id && await y(e.id, n, r);
3411
2913
  }
3412
2914
  }, b = !1;
3413
2915
  try {
3414
- let x = await v("loadPage", async () => await i(p(e, "src", "pages", m.route.file))), C = vr(x, p("src", "pages", m.route.file)), w = zi(S.dirs, m.route.dirChain), T = C === "spa" && w.some((e) => e.hasLayout);
3415
- if (C !== "ssr" && C !== "isr" && !T) return l();
2916
+ let x = await v("loadPage", async () => await n(C(e, "src", "pages", p.route.file))), S = f(x, C("src", "pages", p.route.file)), w = Sr(F.dirs, p.route.dirChain), T = S === "spa" && w.some((e) => e.hasLayout);
2917
+ if (S !== "ssr" && S !== "isr" && !T) return c();
3416
2918
  let E = {};
3417
- for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? E[e] = t : Array.isArray(t) && (E[e] = t.join(", "));
3418
- let D = na(ta(r[0], { allowDevProxy: !0 }), E.cookie, { apiName: r[0]?.name }), O = new AbortController(), k = () => O.abort();
3419
- c.once("close", k);
2919
+ for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ? E[e] = t : Array.isArray(t) && (E[e] = t.join(", "));
2920
+ let D = zr(Rr(m[0], { allowDevProxy: !0 }), E.cookie, { apiName: m[0]?.name }), O = new AbortController(), k = () => O.abort();
2921
+ s.once("close", k);
3420
2922
  let A = null, j = [], M = {};
3421
2923
  try {
3422
- (await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: j, segmentLoaderData: M} = await v("loadChain", () => Bi({
2924
+ (await n("@voltro/web/ssr")).beginStoreSeeds(), {chain: j, segmentLoaderData: M} = await v("loadChain", () => Cr({
3423
2925
  entries: w,
3424
- loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
3425
- loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
3426
- loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
2926
+ loadLayout: (t) => n(C(e, "src", "pages", t.dir, "layout.tsx")),
2927
+ loadError: (t) => n(C(e, "src", "pages", t.dir, "error.tsx")),
2928
+ loadPending: (t) => n(C(e, "src", "pages", t.dir, "loading.tsx")),
3427
2929
  ctx: {
3428
- params: m.params,
3429
- pathname: d,
3430
- search: f,
2930
+ params: p.params,
2931
+ pathname: u,
2932
+ search: d,
3431
2933
  signal: O.signal,
3432
2934
  headers: E,
3433
2935
  query: D
@@ -3435,143 +2937,143 @@ import {
3435
2937
  }));
3436
2938
  let t = x.loader;
3437
2939
  typeof t == "function" && !T && (A = await v("loader", () => t({
3438
- params: m.params,
3439
- pathname: d,
3440
- search: f,
2940
+ params: p.params,
2941
+ pathname: u,
2942
+ search: d,
3441
2943
  signal: O.signal,
3442
2944
  headers: E,
3443
2945
  query: D
3444
2946
  })));
3445
2947
  } finally {
3446
- c.off("close", k);
2948
+ s.off("close", k);
3447
2949
  }
3448
- let N = await v("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
3449
- T || await Si({
2950
+ let N = await v("loadSsrHelpers", async () => await n("@voltro/web/ssr"));
2951
+ T || await ar({
3450
2952
  pageMod: x,
3451
- params: m.params,
2953
+ params: p.params,
3452
2954
  query: D,
3453
- apiName: r[0]?.name,
2955
+ apiName: m[0]?.name,
3454
2956
  seed: N.seedPreloadedSubscription,
3455
- onError: ({ tag: e, apiName: t }, n) => X.warn("preload seed failed", {
2957
+ onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
3456
2958
  tag: e,
3457
2959
  apiName: t,
3458
- pathname: d
2960
+ pathname: u
3459
2961
  }, n)
3460
2962
  });
3461
- let ee = {
3462
- pattern: m.route.pattern,
2963
+ let P = {
2964
+ pattern: p.route.pattern,
3463
2965
  Component: x.default,
3464
2966
  meta: x.meta,
3465
2967
  loader: x.loader,
3466
2968
  ErrorBoundary: x.ErrorBoundary,
3467
2969
  Pending: x.Pending,
3468
- renderMode: C,
2970
+ renderMode: S,
3469
2971
  chain: j
3470
- }, P = {
2972
+ }, I = {
3471
2973
  cookies: N.parseCookieHeader(E.cookie),
3472
2974
  headers: E,
3473
- url: u
3474
- }, F = x.interactive ?? "full", I = (await s())(E.cookie, E["accept-language"]);
3475
- b = I !== void 0 && o;
3476
- let te = I ? {
3477
- outerWrap: I.outerWrap,
3478
- locale: I.locale
3479
- } : {}, L = T ? $r({
2975
+ url: l
2976
+ }, L = x.interactive ?? "full", R = (await o())(E.cookie, E["accept-language"]);
2977
+ b = R !== void 0 && a;
2978
+ let ee = R ? {
2979
+ outerWrap: R.outerWrap,
2980
+ locale: R.locale
2981
+ } : {}, z = T ? In({
3480
2982
  helpers: N,
3481
- page: `src/pages/${m.route.file}`,
3482
- interactive: F,
2983
+ page: `src/pages/${p.route.file}`,
2984
+ interactive: L,
3483
2985
  delivery: "stream",
3484
2986
  renderInput: {
3485
- descriptor: ee,
3486
- params: m.params,
3487
- pathname: d,
3488
- search: f,
2987
+ descriptor: P,
2988
+ params: p.params,
2989
+ pathname: u,
2990
+ search: d,
3489
2991
  segmentLoaderData: M,
3490
- requestContext: P,
3491
- ...te
2992
+ requestContext: I,
2993
+ ...ee
3492
2994
  }
3493
- }) : null, R = T ? null : Qr({
2995
+ }) : null, B = T ? null : Fn({
3494
2996
  helpers: N,
3495
- page: `src/pages/${m.route.file}`,
3496
- pathname: d,
3497
- renderMode: C,
3498
- interactive: F,
2997
+ page: `src/pages/${p.route.file}`,
2998
+ pathname: u,
2999
+ renderMode: S,
3000
+ interactive: L,
3499
3001
  loaderData: A,
3500
3002
  segmentLoaderData: M,
3501
3003
  pageLoaderRan: typeof x.loader == "function"
3502
- }), ne = [];
3004
+ }), V = [];
3503
3005
  await v("collectCss", async () => {
3504
3006
  let t = /* @__PURE__ */ new Set(), n = [
3505
- p(e, "src", "pages", m.route.file),
3007
+ C(e, "src", "pages", p.route.file),
3506
3008
  ...w.flatMap((t) => [
3507
- ...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
3508
- ...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
3509
- ...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
3009
+ ...t.hasLayout ? [C(e, "src", "pages", t.dir, "layout.tsx")] : [],
3010
+ ...t.hasError ? [C(e, "src", "pages", t.dir, "error.tsx")] : [],
3011
+ ...t.hasPending ? [C(e, "src", "pages", t.dir, "loading.tsx")] : []
3510
3012
  ]),
3511
- p(e, ".framework", "main.tsx")
3013
+ C(e, ".framework", "main.tsx")
3512
3014
  ];
3513
- for (let e of n) await y(e, t, ne);
3015
+ for (let e of n) await y(e, t, V);
3514
3016
  });
3515
- let re = await v("readShell", _e), z = await v("transformShell", () => n.transformIndexHtml(u, re)), ie = ne.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), B = I?.locale ?? P.cookies["voltro:locale"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", ae = Date.now();
3516
- if (L) {
3517
- let e = (e) => ti({
3017
+ let te = await v("readShell", ke), H = await v("transformShell", () => t.transformIndexHtml(l, te)), ne = V.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), U = R?.locale ?? I.cookies["voltro:locale"] ?? r.defaultLocale ?? (r.locales ?? [])[0] ?? "en", re = Date.now();
3018
+ if (z) {
3019
+ let e = (e) => Rn({
3518
3020
  helpers: N,
3519
- prepared: L,
3021
+ prepared: z,
3520
3022
  meta: e,
3521
- interactive: F,
3522
- extra: [ie]
3023
+ interactive: L,
3024
+ extra: [ne]
3523
3025
  });
3524
- if (L.hasDeferred) yi({
3525
- res: c,
3526
- shell: gi({
3527
- shell: z,
3026
+ if (z.hasDeferred) nr({
3027
+ res: s,
3028
+ shell: $n({
3029
+ shell: H,
3528
3030
  inlineModuleScriptsAsync: !0
3529
3031
  }),
3530
- htmlLang: B,
3032
+ htmlLang: U,
3531
3033
  headers: {
3532
3034
  "content-type": "text/html; charset=utf-8",
3533
3035
  "x-voltro-rendered-by": "spa-shell-dev"
3534
3036
  },
3535
3037
  headInjection: e,
3536
3038
  render: (e) => N.renderPageToStream({
3537
- ...L.renderInput,
3039
+ ...z.renderInput,
3538
3040
  ...e
3539
3041
  }),
3540
3042
  onShellError: (e) => {
3541
- he(c, "spa-shell-dev", d, m.route.pattern, e, b);
3043
+ Te(s, "spa-shell-dev", u, p.route.pattern, e, b);
3542
3044
  }
3543
3045
  });
3544
3046
  else {
3545
- let t = ei({
3047
+ let t = Ln({
3546
3048
  helpers: N,
3547
- prepared: L
3548
- }), n = z.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="${B}"`);
3549
- c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "spa-shell-dev"), c.end(n);
3049
+ prepared: z
3050
+ }), n = H.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="${U}"`);
3051
+ s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "spa-shell-dev"), s.end(n);
3550
3052
  }
3551
- } else if (R) {
3053
+ } else if (B) {
3552
3054
  let e = (e) => [
3553
- ie,
3055
+ ne,
3554
3056
  N.renderMetaToHtml(e),
3555
- `<meta name="voltro-interactive" content="${F}" />`,
3556
- ...R.hasDeferred ? [N.renderDeferredRegistryScript()] : [],
3557
- N.renderRouterStateScript(R.stateInput)
3057
+ `<meta name="voltro-interactive" content="${L}" />`,
3058
+ ...B.hasDeferred ? [N.renderDeferredRegistryScript()] : [],
3059
+ N.renderRouterStateScript(B.stateInput)
3558
3060
  ].filter((e) => e.length > 0).join("\n "), t = {
3559
- descriptor: ee,
3560
- params: m.params,
3561
- pathname: d,
3562
- search: f,
3563
- loaderData: R.loaderData,
3564
- segmentLoaderData: R.segmentLoaderData,
3565
- requestContext: P,
3566
- ...te
3061
+ descriptor: P,
3062
+ params: p.params,
3063
+ pathname: u,
3064
+ search: d,
3065
+ loaderData: B.loaderData,
3066
+ segmentLoaderData: B.segmentLoaderData,
3067
+ requestContext: I,
3068
+ ...ee
3567
3069
  };
3568
- if (C === "ssr" && F === "full") yi({
3569
- res: c,
3570
- shell: gi({
3571
- shell: z,
3070
+ if (S === "ssr" && L === "full") nr({
3071
+ res: s,
3072
+ shell: $n({
3073
+ shell: H,
3572
3074
  inlineModuleScriptsAsync: !0
3573
3075
  }),
3574
- htmlLang: B,
3076
+ htmlLang: U,
3575
3077
  headers: {
3576
3078
  "content-type": "text/html; charset=utf-8",
3577
3079
  "x-voltro-rendered-by": "ssr-dev"
@@ -3582,76 +3084,76 @@ import {
3582
3084
  ...e
3583
3085
  }),
3584
3086
  onShellError: (e) => {
3585
- he(c, "ssr-dev", d, m.route.pattern, e, b);
3087
+ Te(s, "ssr-dev", u, p.route.pattern, e, b);
3586
3088
  }
3587
3089
  });
3588
3090
  else {
3589
- let { html: n, meta: r } = N.renderPageToHtml(t), i = z.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${B}"`);
3590
- c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "ssr-dev"), c.end(i);
3091
+ let { html: n, meta: r } = N.renderPageToHtml(t), i = H.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${U}"`);
3092
+ s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
3591
3093
  }
3592
3094
  }
3593
- _.render = Date.now() - ae;
3594
- let V = Date.now() - g;
3595
- h ? (me.add(m.route.pattern), X.info(`ssr compiled ${m.route.pattern} in ${V}ms`, {
3596
- pattern: m.route.pattern,
3597
- pathname: d,
3598
- elapsedMs: V,
3095
+ _.render = Date.now() - re;
3096
+ let W = Date.now() - g;
3097
+ h ? (Ce.add(p.route.pattern), Z.info(`ssr compiled ${p.route.pattern} in ${W}ms`, {
3098
+ pattern: p.route.pattern,
3099
+ pathname: u,
3100
+ elapsedMs: W,
3599
3101
  cold: !0,
3600
3102
  phases: _
3601
- })) : V > 200 && X.info(`ssr rendered ${d} in ${V}ms`, {
3602
- pattern: m.route.pattern,
3603
- pathname: d,
3604
- elapsedMs: V,
3103
+ })) : W > 200 && Z.info(`ssr rendered ${u} in ${W}ms`, {
3104
+ pattern: p.route.pattern,
3105
+ pathname: u,
3106
+ elapsedMs: W,
3605
3107
  cold: !1,
3606
3108
  phases: _
3607
3109
  });
3608
3110
  } catch (e) {
3609
- if (Xr(e)) {
3610
- X.error("ssr-dev render refused", {
3611
- pathname: d,
3612
- pattern: m.route.pattern
3613
- }, e), c.statusCode = 500, c.setHeader("content-type", "text/plain; charset=utf-8"), c.end(e.message);
3111
+ if (Nn(e)) {
3112
+ Z.error("ssr-dev render refused", {
3113
+ pathname: u,
3114
+ pattern: p.route.pattern
3115
+ }, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
3614
3116
  return;
3615
3117
  }
3616
- let t = Zr(e);
3118
+ let t = Pn(e);
3617
3119
  if (t) {
3618
- c.statusCode = t.status;
3619
- for (let [e, n] of Object.entries(t.headers)) c.setHeader(e, String(n));
3620
- c.end(t.body);
3120
+ s.statusCode = t.status;
3121
+ for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
3122
+ s.end(t.body);
3621
3123
  return;
3622
3124
  }
3623
- he(c, "ssr-dev", d, m.route.pattern, e, b);
3125
+ Te(s, "ssr-dev", u, p.route.pattern, e, b);
3624
3126
  }
3625
3127
  });
3626
3128
  }
3627
- }, ye = Date.now(), G = D.version ?? "?", K = await Ti(), be = p(e, "node_modules", "@voltro", "ui-shadcn"), q = T(p(be, "package.json")) ? be : null, xe = [], Se = await (async () => {
3129
+ }, Me = Date.now(), Ne = ee.version ?? "?", Pe = await cr(), Fe = C(e, "node_modules", "@voltro", "ui-shadcn"), Y = E(C(Fe, "package.json")) ? Fe : null, Ie = [], Le = await (async () => {
3628
3130
  let t = [];
3629
- for (let n of r) {
3131
+ for (let n of m) {
3630
3132
  if (!n.proxyTarget) continue;
3631
- let r = await Ki(e, n.pkg);
3133
+ let r = await kr(e, n.pkg);
3632
3134
  if (r) try {
3633
- t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
3135
+ t.push(await D.readFile(C(r, "rpcGroup.generated.ts"), "utf8"));
3634
3136
  } catch {}
3635
3137
  }
3636
3138
  if (t.length === 0) return !1;
3637
- let n = de("sha1").update(t.join("\0")).digest("hex"), i = p(j, ".voltro-rpcgroup-optimize"), a = "";
3139
+ let n = se("sha1").update(t.join("\0")).digest("hex"), r = C(V, ".voltro-rpcgroup-optimize"), i = "";
3638
3140
  try {
3639
- a = (await O.readFile(i, "utf8")).trim();
3141
+ i = (await D.readFile(r, "utf8")).trim();
3640
3142
  } catch {}
3641
- if (a === n) return !1;
3143
+ if (i === n) return !1;
3642
3144
  try {
3643
- await O.writeFile(i, n);
3145
+ await D.writeFile(r, n);
3644
3146
  } catch {}
3645
3147
  return !0;
3646
3148
  })();
3647
- Se && X.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client");
3149
+ Le && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client");
3648
3150
  try {
3649
- await Tt(g, "voltro dev (web)");
3151
+ await je(k, "voltro dev (web)");
3650
3152
  } catch (e) {
3651
- X.error(String(e.message ?? e)), process.exit(1);
3153
+ Z.error(String(e.message ?? e)), process.exit(1);
3652
3154
  }
3653
- await (await D.createServer({
3654
- root: j,
3155
+ await (await ee.createServer({
3156
+ root: V,
3655
3157
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3656
3158
  ssr: { noExternal: ["react-intl", "@voltro/i18n"] },
3657
3159
  resolve: {
@@ -3662,141 +3164,145 @@ import {
3662
3164
  "@voltro/i18n"
3663
3165
  ],
3664
3166
  alias: [
3665
- ...K ? [{
3167
+ ...Pe ? [{
3666
3168
  find: "@voltro/devtools/styles.css",
3667
- replacement: p(K, "src/styles.css")
3169
+ replacement: C(Pe, "src/styles.css")
3668
3170
  }, {
3669
3171
  find: "@voltro/devtools",
3670
- replacement: p(K, "src/index.ts")
3172
+ replacement: C(Pe, "src/index.ts")
3671
3173
  }] : [],
3672
- ...q ? [
3174
+ ...Y ? [
3673
3175
  {
3674
3176
  find: "@voltro/ui-shadcn/tokens.css",
3675
- replacement: p(q, "src/tokens.css")
3177
+ replacement: C(Y, "src/tokens.css")
3676
3178
  },
3677
3179
  {
3678
3180
  find: "@voltro/ui-shadcn/cn",
3679
- replacement: p(q, "src/cn.ts")
3181
+ replacement: C(Y, "src/cn.ts")
3680
3182
  },
3681
3183
  {
3682
3184
  find: "@voltro/ui-shadcn/brand",
3683
- replacement: p(q, "src/brand/voltroLogo.tsx")
3185
+ replacement: C(Y, "src/brand/voltroLogo.tsx")
3684
3186
  },
3685
3187
  {
3686
3188
  find: "@voltro/ui-shadcn",
3687
- replacement: p(q, "src/index.ts")
3189
+ replacement: C(Y, "src/index.ts")
3688
3190
  }
3689
3191
  ] : [],
3690
- ...Ye(e)
3192
+ ...$e(e)
3691
3193
  ]
3692
3194
  },
3693
3195
  optimizeDeps: {
3694
- include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...xe],
3695
- force: Se
3196
+ include: [...m.map((e) => `${e.pkg}/rpcGroup`), ...Ie],
3197
+ force: Le
3696
3198
  },
3697
- customLogger: Kt(),
3199
+ customLogger: Ze(),
3698
3200
  plugins: [
3699
- fr(p(e, "src", "pages")),
3700
- k(),
3701
- A(),
3702
- ee,
3703
- L,
3704
- B,
3705
- se,
3706
- ce,
3707
- ue,
3708
- ve,
3709
- ...pe ? [pe] : []
3201
+ _n(C(e, "src", "pages")),
3202
+ z(),
3203
+ B(),
3204
+ ne,
3205
+ oe,
3206
+ pe,
3207
+ he,
3208
+ ge,
3209
+ be,
3210
+ Ae,
3211
+ ...xe ? [xe] : []
3710
3212
  ],
3711
3213
  server: {
3712
- port: g,
3214
+ port: k,
3713
3215
  strictPort: !0,
3714
3216
  host: !0,
3715
- allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
3716
- proxy: H,
3717
- fs: { allow: [e, ...ji(e)] }
3217
+ allowedHosts: r.allowedHosts === !0 || [...r.allowedHosts ?? []],
3218
+ proxy: J,
3219
+ fs: { allow: [e, ...mr(e)] }
3718
3220
  },
3719
3221
  appType: "spa",
3720
- cacheDir: p(j, ".vite"),
3721
- publicDir: p(e, "public")
3722
- })).listen(), Ci.info(`v${G} ready in ${Date.now() - ye}ms`, {
3723
- version: G,
3724
- bootMs: Date.now() - ye
3725
- }), X.info(`listening on http://localhost:${g}`, {
3726
- port: g,
3727
- app: t.name ?? "(unnamed)"
3222
+ cacheDir: C(V, ".vite"),
3223
+ publicDir: C(e, "public")
3224
+ })).listen(), or.info(`v${Ne} ready in ${Date.now() - Me}ms`, {
3225
+ version: Ne,
3226
+ bootMs: Date.now() - Me
3227
+ }), Z.info(`listening on http://localhost:${k}`, {
3228
+ port: k,
3229
+ app: r.name ?? "(unnamed)"
3728
3230
  });
3729
- for (let e of r) e.proxyTarget && (X.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3231
+ for (let e of m) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3730
3232
  api: e.name,
3731
3233
  target: e.proxyTarget
3732
- }), X.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3234
+ }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3733
3235
  try {
3734
- await Ge({
3735
- id: v,
3736
- name: _,
3236
+ await g({
3237
+ id: j,
3238
+ name: A,
3737
3239
  kind: "web",
3738
- url: `http://localhost:${g}`,
3240
+ url: `http://localhost:${k}`,
3739
3241
  pid: process.pid,
3740
3242
  status: "live",
3741
- logFile: y.path
3243
+ logFile: M.path
3742
3244
  });
3743
- let t = Rr(e);
3245
+ let t = xn(e);
3744
3246
  if (t) {
3745
- let e = await Jr({ dashboardAppPath: t });
3746
- e.status === "launched" ? X.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && X.debug(`dashboard already running on :${e.port}`, { port: e.port });
3247
+ let e = await jn({ dashboardAppPath: t });
3248
+ e.status === "launched" ? Z.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && Z.debug(`dashboard already running on :${e.port}`, { port: e.port });
3747
3249
  }
3748
3250
  setInterval(() => {
3749
- Ge({
3750
- id: v,
3751
- name: _,
3251
+ g({
3252
+ id: j,
3253
+ name: A,
3752
3254
  kind: "web",
3753
- url: `http://localhost:${g}`,
3255
+ url: `http://localhost:${k}`,
3754
3256
  pid: process.pid,
3755
3257
  status: "live",
3756
- logFile: y.path
3258
+ logFile: M.path
3757
3259
  }).catch(() => {});
3758
3260
  }, 1e4).unref();
3759
3261
  let n = () => {
3760
- Ke(v), y.dispose();
3262
+ v(j), M.dispose();
3761
3263
  };
3762
3264
  process.on("SIGINT", n), process.on("SIGTERM", n);
3763
3265
  } catch (e) {
3764
- X.warn("runtime-registry write failed", {}, e);
3266
+ Z.warn("runtime-registry write failed", {}, e);
3765
3267
  }
3766
- return C({
3767
- app: t.name ?? "unnamed",
3268
+ return L({
3269
+ app: r.name ?? "unnamed",
3768
3270
  kind: "web",
3769
- url: `http://localhost:${g}`,
3770
- bootMs: Date.now() - ye
3271
+ url: `http://localhost:${k}`,
3272
+ bootMs: Date.now() - Me
3771
3273
  }), new Promise(() => {});
3772
- }, sa = async (e) => {
3773
- process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3774
- let t = await aa(e);
3775
- if (!t) return {
3274
+ }, Gr = async (t) => {
3275
+ e("serve");
3276
+ let r = await Ur(t);
3277
+ if (!r) return {
3776
3278
  ran: !1,
3777
3279
  exitCode: 0
3778
3280
  };
3779
- let n = Date.now(), r = X.child("serve");
3780
- r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3781
- let i = await Zi(e, t);
3782
- for (let e of i) r.info("api wired", {
3281
+ let i = Date.now(), a = Z.child("serve");
3282
+ a.info("booting voltro serve (preview)", { app: r.name ?? "(unnamed)" });
3283
+ let o = await Pr(t, r);
3284
+ for (let e of o) a.info("api wired", {
3783
3285
  name: e.name,
3784
3286
  pkg: e.pkg
3785
3287
  });
3786
- await $(e, t, i);
3288
+ await Br(t, r, o);
3787
3289
  {
3788
- let { pages: t } = await Q(p(e, "src", "pages"));
3789
- await on({
3790
- appRoot: e,
3791
- pages: t
3290
+ let { pages: e } = await $(C(t, "src", "pages"));
3291
+ await ft({
3292
+ appRoot: t,
3293
+ pages: e
3792
3294
  });
3793
3295
  }
3794
- let a = t.port ?? 5173, o = await Ze("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
3795
- X.info("running production build"), await o.build({
3796
- root: c,
3296
+ let s = n({
3297
+ kind: "web",
3298
+ configPort: r.port,
3299
+ env: process.env
3300
+ }).port, c = await fe("vite", () => import("vite")), l = (await import("@vitejs/plugin-react")).default, u = C(t, ".framework");
3301
+ Z.info("running production build"), await c.build({
3302
+ root: u,
3797
3303
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3798
- plugins: [s()],
3799
- customLogger: Kt(),
3304
+ plugins: [l()],
3305
+ customLogger: Ze(),
3800
3306
  resolve: { dedupe: [
3801
3307
  "react",
3802
3308
  "react-dom",
@@ -3805,93 +3311,26 @@ import {
3805
3311
  ] },
3806
3312
  build: {
3807
3313
  outDir: "dist",
3808
- rollupOptions: { output: { manualChunks: Ni } }
3314
+ rollupOptions: { output: { manualChunks: gr } }
3809
3315
  },
3810
- publicDir: p(e, "public")
3316
+ publicDir: C(t, "public")
3811
3317
  });
3812
- let l = (await o.preview({
3813
- root: c,
3318
+ let d = (await c.preview({
3319
+ root: u,
3814
3320
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3815
- preview: { port: a },
3321
+ preview: { port: s },
3816
3322
  build: { outDir: "dist" }
3817
- })).resolvedUrls, u = l?.local[0] ?? `http://localhost:${a}`, d = l?.local.slice(1).map((e) => ({
3323
+ })).resolvedUrls, f = d?.local[0] ?? `http://localhost:${s}`, p = d?.local.slice(1).map((e) => ({
3818
3324
  label: "Local",
3819
3325
  url: e
3820
3326
  })) ?? [];
3821
- return C({
3822
- app: t.name ?? "unnamed",
3327
+ return L({
3328
+ app: r.name ?? "unnamed",
3823
3329
  kind: "preview",
3824
- url: u,
3825
- extras: d,
3826
- bootMs: Date.now() - n
3330
+ url: f,
3331
+ extras: p,
3332
+ bootMs: Date.now() - i
3827
3333
  }), new Promise(() => {});
3828
- }, ca = 5e3, la = 6e4, ua = (e, t) => {
3829
- if (e.length === 0) return 0;
3830
- if (e.length === 1) return e[0];
3831
- let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3832
- if (r === i) return e[r];
3833
- let a = n - r;
3834
- return e[r] * (1 - a) + e[i] * a;
3835
- }, da = (e) => {
3836
- if (e.length === 0) return {
3837
- p50: 0,
3838
- p95: 0,
3839
- p99: 0,
3840
- mean: 0,
3841
- min: 0,
3842
- max: 0
3843
- };
3844
- let t = e.slice().sort((e, t) => e - t), n = 0;
3845
- for (let e of t) n += e;
3846
- return {
3847
- p50: ua(t, .5),
3848
- p95: ua(t, .95),
3849
- p99: ua(t, .99),
3850
- mean: n / t.length,
3851
- min: t[0],
3852
- max: t[t.length - 1]
3853
- };
3854
- }, fa = (e = {}) => {
3855
- let t = e.maxSamples ?? ca, n = e.defaultWindowMs ?? la, r = [];
3856
- return {
3857
- record(e) {
3858
- I(e), r.push({
3859
- ...e,
3860
- ts: Date.now()
3861
- }), r.length > t && r.shift();
3862
- },
3863
- snapshot(e) {
3864
- let t = e ?? n, i = Date.now(), a = i - t, o = /* @__PURE__ */ new Map(), s = 0;
3865
- for (let e of r) {
3866
- if (e.ts < a) continue;
3867
- s++;
3868
- let t = `${e.kind}\u0000${e.tag}`, n = o.get(t);
3869
- n || (n = {
3870
- kind: e.kind,
3871
- tag: e.tag,
3872
- samples: []
3873
- }, o.set(t, n)), n.samples.push(e);
3874
- }
3875
- let c = [];
3876
- for (let e of o.values()) {
3877
- let t = e.samples.map((e) => e.durationMs), n = 0;
3878
- for (let t of e.samples) t.status === "error" && n++;
3879
- c.push({
3880
- kind: e.kind,
3881
- tag: e.tag,
3882
- count: e.samples.length,
3883
- errorCount: n,
3884
- latencyMs: da(t)
3885
- });
3886
- }
3887
- return c.sort((e, t) => t.count - e.count), {
3888
- windowMs: t,
3889
- capturedAt: i,
3890
- totalSamples: s,
3891
- buckets: c
3892
- };
3893
- }
3894
- };
3895
3334
  };
3896
3335
  //#endregion
3897
- export { qt as $, Pr as A, Xn as B, ni as C, We as Ct, Rr as D, Pe as Dt, Jr as E, Ne as Et, mr as F, Dn as G, Vn as H, gr as I, gn as J, hn as K, vr as L, Cr as M, pr as N, Mr as O, yr as P, Yt as Q, nr as R, ti as S, qe as St, Lr as T, Ge as Tt, zn as U, Gn as V, Mn as W, dn as X, fn as Y, on as Z, yi as _, it as _t, Bi as a, Tt as at, $r as b, Ze as bt, Zi as c, gt as ct, Ni as d, dt, Nt as et, Q as f, ft, gi as g, st as gt, _i as h, ot as ht, na as i, Lt as it, xr as j, Nr as k, oa as l, ht as lt, Si as m, lt as mt, Pi as n, Pt as nt, zi as o, bt as ot, $ as p, ct as pt, mn as q, ta as r, It as rt, aa as s, vt as st, fa as t, Ft as tt, sa as u, ut, Xr as v, nt as vt, zr as w, Ke as wt, ei as x, Ye as xt, Qr as y, tt as yt, rr as z };
3336
+ export { Ve as $, zn as A, Nt as B, $n as C, In as D, Fn as E, nn as F, _t as G, bt as H, Zt as I, et as J, ft as K, qt as L, bn as M, jn as N, Ln as O, xn as P, ze as Q, Gt as R, er as S, Nn as T, St as U, xt as V, vt as W, Re as X, $e as Y, Be as Z, Gr as _, Cr as a, ye as at, Br as b, br as c, ge as ct, Ur as d, He as et, Pr as f, Wr as g, Ir as h, zr as i, Se as it, Sn as j, Rn as k, Q as l, he as lt, Mr as m, Rr as n, Ee as nt, Hr as o, be as ot, jr as p, nt as q, Nr as r, we as rt, Sr as s, _e as st, _r as t, je as tt, xr as u, fe as ut, gr as v, nr as w, ar as x, $ as y, Rt as z };