@voltro/cli 0.33.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 (337) hide show
  1. package/CHANGELOG.md +1801 -0
  2. package/bin/nodeEnvironment.d.mts +30 -0
  3. package/bin/nodeEnvironment.mjs +158 -0
  4. package/bin/voltro.mjs +69 -5
  5. package/dist/addCommand-BNeoeSxe.js +124 -0
  6. package/dist/addCommand-aXSQveak.js +2 -0
  7. package/dist/agentsMd-BTchIZku.js +2 -0
  8. package/dist/agentsMd-mhQMF1bx.js +254 -0
  9. package/dist/apiBuild-BICVGnEC.js +2 -0
  10. package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DZF_f0_I.js} +46 -46
  11. package/dist/appPort-B_HpJ_ck.js +48 -0
  12. package/dist/baselineCommand-C2ClWZN3.js +2 -0
  13. package/dist/baselineCommand-DIttzO8A.js +227 -0
  14. package/dist/bin.js +71 -28
  15. package/dist/build-CE7Ca9gm.js +711 -0
  16. package/dist/cacheCommand-DA4OH9xt.js +42 -0
  17. package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
  18. package/dist/checkCommand-Dv8r9tGO.js +231 -0
  19. package/dist/checkCommand-YZDmkAGd.js +2 -0
  20. package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
  21. package/dist/cliError-BmdYnghb.js +10 -0
  22. package/dist/cliOutput-D1tSBoRM.js +15 -0
  23. package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
  24. package/dist/cloudClient-DWL-Hw_T.js +67 -0
  25. package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
  26. package/dist/clusterCmd-CNXKlcvD.js +54 -0
  27. package/dist/codegen-CYM3Zqrf.js +605 -0
  28. package/dist/codegen-ChBi_hVa.js +2 -0
  29. package/dist/codegenCommand-DC6w2tNZ.js +30 -0
  30. package/dist/codemodRunner-DRRqXR74.js +5243 -0
  31. package/dist/commandRunner-BLAEFLjp.js +47 -0
  32. package/dist/commands-gutsz-Ac.js +808 -0
  33. package/dist/connectionConfig-UFlIEiys.js +66 -0
  34. package/dist/dashboardCommand-3YG8p-UA.js +25 -0
  35. package/dist/dataCommand-qL0r7fPO.js +535 -0
  36. package/dist/dataProfile-dW-PsfLB.js +15 -0
  37. package/dist/{dbCommand-DTLKAfbA.js → dbCommand-B6X0FZbq.js} +551 -401
  38. package/dist/dbCommand-CpdKLeQq.js +2 -0
  39. package/dist/{dev-C_P8FLSx.js → dev-CerMd0mW.js} +3122 -3129
  40. package/dist/dev-CoG-ZPx8.js +3 -0
  41. package/dist/devActivity-Dx_3nnGv.js +100 -0
  42. package/dist/devActivity.js +1 -1
  43. package/dist/dialectDriver-CgXnDfec.js +39 -0
  44. package/dist/discover-C9XKJDco.js +25 -0
  45. package/dist/doctorCommand-BvqGBwNG.js +2 -0
  46. package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-CnDXQxfa.js} +520 -1278
  47. package/dist/dormancyCommand-Dszo57d6.js +69 -0
  48. package/dist/e2eCmd-BRabZww-.js +147 -0
  49. package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
  50. package/dist/envCommand-DPgdV1Bq.js +60 -0
  51. package/dist/evalCommand-6RUfPen4.js +118 -0
  52. package/dist/evolveCommand-DHpkgjgH.js +281 -0
  53. package/dist/fileTaxonomy-CJfgOllU.js +457 -0
  54. package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
  55. package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
  56. package/dist/generateCommand-oibemh97.js +147 -0
  57. package/dist/index.d.ts +45 -0
  58. package/dist/index.js +4 -3
  59. package/dist/infoCommand-BJw9nLUR.js +60 -0
  60. package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
  61. package/dist/inspect-C_T_WGvl.js +2 -0
  62. package/dist/inspectCmd-Bppy-GGw.js +224 -0
  63. package/dist/inspectFetch-Cm8_wVvp.js +151 -0
  64. package/dist/inspectMetrics-CfdKLh6t.js +72 -0
  65. package/dist/loadEnv-D9nEOClM.js +44 -0
  66. package/dist/logFileSink-C_D2wRN1.js +105 -0
  67. package/dist/logsCmd-CCca3KRZ.js +260 -0
  68. package/dist/manifestBuild-ChsKAhmn.js +2 -0
  69. package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
  70. package/dist/metaCommands-7MJfZ5cf.js +196 -0
  71. package/dist/migrate-CBwOt_iV.js +83 -0
  72. package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
  73. package/dist/newCommand-COWOJ1_E.js +156 -0
  74. package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
  75. package/dist/packageCommand-Cug_3Ogl.js +271 -0
  76. package/dist/pageConvention-cEiRxdab.js +5 -0
  77. package/dist/privacyCommand-C-Df56U_.js +146 -0
  78. package/dist/projectScaffold-DmzEKHib.js +2 -0
  79. package/dist/projectScaffold-LMMtaavR.js +814 -0
  80. package/dist/renderModeScan-D7J1B7Kw.js +105 -0
  81. package/dist/renderProfile-1OWWAAtx.js +81 -0
  82. package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
  83. package/dist/runtimeTrace-CRxalXTs.js +91 -0
  84. package/dist/scheduleCmd--jksTrf6.js +69 -0
  85. package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
  86. package/dist/schemaIr-UJybUUZW.js +103 -0
  87. package/dist/{sdkgen-C81QIkiL.js → sdkgen-CYJscZC7.js} +111 -209
  88. package/dist/seedRunner-TFHHiToI.js +329 -0
  89. package/dist/serveCommand-B_isw7q4.js +1647 -0
  90. package/dist/serveCommand-DOvbgRnQ.js +2 -0
  91. package/dist/serveEntry.js +5 -5
  92. package/dist/serverlessCommand-CfJZy6dS.js +482 -0
  93. package/dist/start-9LiUOfES.js +1087 -0
  94. package/dist/start-B-9Nsp-S.js +3 -0
  95. package/dist/startEntry.js +2 -2
  96. package/dist/staticCommand-Dr2M6tpU.js +304 -0
  97. package/dist/storageCommand-Co6NfLqN.js +42 -0
  98. package/dist/templates-De8IR5-c.js +102 -0
  99. package/dist/test-CI6iDsYc.js +115 -0
  100. package/dist/tracesCmd-CkEZQrtt.js +232 -0
  101. package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
  102. package/dist/tsxLoader-EuXmSJ1K.js +51 -0
  103. package/dist/typecheckCommand-BlsWiCNq.js +61 -0
  104. package/dist/updateCommand-Bkptutss.js +585 -0
  105. package/dist/updateCommand-us1_hdIC.js +2 -0
  106. package/dist/{inspectMetrics-1xzTKAFx.js → webDev-CBYvPqQr.js} +975 -1559
  107. package/dist/webDev-Cg-fFiyd2.js +2 -0
  108. package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
  109. package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
  110. package/dist/webhooksCommand-CID96Rga.js +267 -0
  111. package/dist/workflowsCmd-D1VTmLMY.js +608 -0
  112. package/package.json +179 -17
  113. package/templates/AGENTS.core.md +58 -3
  114. package/templates/AGENTS.md +64 -7
  115. package/templates/agent-docs/_index.md +6 -4
  116. package/templates/agent-docs/_manifest.json +22 -5
  117. package/templates/agent-docs/ai.md +370 -0
  118. package/templates/agent-docs/authentication.md +265 -31
  119. package/templates/agent-docs/caching.md +6 -0
  120. package/templates/agent-docs/cli.md +794 -50
  121. package/templates/agent-docs/data.md +550 -11
  122. package/templates/agent-docs/database/migrations.md +174 -25
  123. package/templates/agent-docs/database/misc.md +156 -40
  124. package/templates/agent-docs/database/querying.md +19 -1
  125. package/templates/agent-docs/database/scaling.md +60 -0
  126. package/templates/agent-docs/database/schema.md +1 -0
  127. package/templates/agent-docs/database/seedsdialects.md +208 -19
  128. package/templates/agent-docs/database/transactions.md +68 -0
  129. package/templates/agent-docs/deployment.md +69 -3
  130. package/templates/agent-docs/introduction.md +87 -16
  131. package/templates/agent-docs/local-first-mobile.md +79 -4
  132. package/templates/agent-docs/multi-tenancy.md +95 -20
  133. package/templates/agent-docs/observability.md +58 -3
  134. package/templates/agent-docs/plugins/ai-flows.md +161 -2
  135. package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
  136. package/templates/agent-docs/plugins/audit.md +37 -1
  137. package/templates/agent-docs/plugins/auth-social.md +143 -0
  138. package/templates/agent-docs/plugins/auth-workos.md +4 -2
  139. package/templates/agent-docs/plugins/auth.md +131 -6
  140. package/templates/agent-docs/plugins/billing.md +132 -15
  141. package/templates/agent-docs/plugins/cdc-out.md +46 -7
  142. package/templates/agent-docs/plugins/clickhouse.md +1 -1
  143. package/templates/agent-docs/plugins/duckdb.md +1 -1
  144. package/templates/agent-docs/plugins/flags.md +132 -0
  145. package/templates/agent-docs/plugins/governance.md +105 -7
  146. package/templates/agent-docs/plugins/multitenancy.md +9 -4
  147. package/templates/agent-docs/plugins/presence.md +13 -2
  148. package/templates/agent-docs/plugins/ratelimit.md +9 -0
  149. package/templates/agent-docs/plugins/search.md +157 -6
  150. package/templates/agent-docs/plugins/sso-saml.md +47 -8
  151. package/templates/agent-docs/plugins/webhooks.md +105 -0
  152. package/templates/agent-docs/plugins.md +150 -18
  153. package/templates/agent-docs/reference.md +60 -3
  154. package/templates/agent-docs/releases.md +1117 -0
  155. package/templates/agent-docs/routing.md +43 -25
  156. package/templates/agent-docs/scheduling.md +10 -0
  157. package/templates/agent-docs/schema-driven-ui.md +92 -12
  158. package/templates/agent-docs/security.md +426 -0
  159. package/templates/agent-docs/templates/apibackends.md +87 -18
  160. package/templates/agent-docs/templates/appshells.md +32 -14
  161. package/templates/agent-docs/templates/overview.md +13 -8
  162. package/templates/agent-docs/testing.md +211 -14
  163. package/templates/agent-docs/whats-new.md +1700 -104
  164. package/templates/agent-docs/workflows.md +130 -14
  165. package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
  166. package/templates/apps/api-ai/package.json +8 -7
  167. package/templates/apps/api-auth/actions/me.action.ts +13 -0
  168. package/templates/apps/api-auth/package.json +9 -8
  169. package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
  170. package/templates/apps/api-backend/package.json +12 -8
  171. package/templates/apps/api-backend/queries/notes.query.ts +30 -8
  172. package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
  173. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
  174. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
  175. package/templates/apps/api-backend-deactivation/package.json +8 -7
  176. package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
  177. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
  178. package/templates/apps/api-backend-mail/package.json +9 -8
  179. package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
  180. package/templates/apps/api-backend-mariadb/.env.example +14 -0
  181. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
  182. package/templates/apps/api-backend-mariadb/package.json +10 -9
  183. package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
  184. package/templates/apps/api-backend-sqlite/.env.example +14 -0
  185. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
  186. package/templates/apps/api-backend-sqlite/package.json +9 -8
  187. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
  188. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
  189. package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
  190. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
  191. package/templates/apps/api-backend-storage/package.json +9 -8
  192. package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
  193. package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
  194. package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
  195. package/templates/apps/api-cms/actions/me.action.ts +13 -0
  196. package/templates/apps/api-cms/app.config.ts +19 -0
  197. package/templates/apps/api-cms/authz.ts +63 -0
  198. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
  199. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
  200. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
  201. package/templates/apps/api-cms/package.json +11 -10
  202. package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
  203. package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
  204. package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
  205. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
  206. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
  207. package/templates/apps/api-collab/package.json +9 -8
  208. package/templates/apps/api-collab/queries/documents.query.ts +19 -7
  209. package/templates/apps/api-data-advanced/package.json +9 -8
  210. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
  211. package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
  212. package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
  213. package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
  214. package/templates/apps/api-durable/package.json +9 -8
  215. package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
  216. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
  217. package/templates/apps/api-feature-flags/package.json +10 -9
  218. package/templates/apps/api-governance/README.md +30 -8
  219. package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
  220. package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
  221. package/templates/apps/api-governance/database/schema.ts +16 -4
  222. package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
  223. package/templates/apps/api-governance/package.json +9 -8
  224. package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
  225. package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
  226. package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
  227. package/templates/apps/api-kv/package.json +9 -8
  228. package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
  229. package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
  230. package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
  231. package/templates/apps/api-moderation/package.json +9 -8
  232. package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
  233. package/templates/apps/api-observability/package.json +9 -8
  234. package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
  235. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
  236. package/templates/apps/api-ratelimit/package.json +9 -8
  237. package/templates/apps/api-rbac/package.json +9 -8
  238. package/templates/apps/api-rest/package.json +8 -7
  239. package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
  240. package/templates/apps/api-saas/package.json +12 -11
  241. package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
  242. package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
  243. package/templates/apps/api-saas-starter/app.config.ts +19 -0
  244. package/templates/apps/api-saas-starter/authz.ts +75 -0
  245. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
  246. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
  247. package/templates/apps/api-saas-starter/package.json +15 -11
  248. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
  249. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
  250. package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
  251. package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
  252. package/templates/apps/api-search/package.json +9 -8
  253. package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
  254. package/templates/apps/api-status/README.md +10 -3
  255. package/templates/apps/api-status/app.config.ts +8 -3
  256. package/templates/apps/api-status/authz.ts +5 -3
  257. package/templates/apps/api-status/package.json +9 -8
  258. package/templates/apps/api-status/queries/components.list.query.ts +14 -6
  259. package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
  260. package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
  261. package/templates/apps/api-status/tests/status.test.ts +9 -1
  262. package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
  263. package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
  264. package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
  265. package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
  266. package/templates/apps/api-versioning/package.json +9 -8
  267. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
  268. package/templates/apps/api-webhooks/package.json +10 -9
  269. package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
  270. package/templates/apps/changelog/package.json +8 -6
  271. package/templates/apps/edge-functions/package.json +2 -2
  272. package/templates/apps/frontend-admin/package.json +10 -8
  273. package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
  274. package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
  275. package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
  276. package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
  277. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
  278. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
  279. package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
  280. package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
  281. package/templates/apps/frontend-app/app.config.ts +4 -3
  282. package/templates/apps/frontend-app/package.json +11 -8
  283. package/templates/apps/frontend-app/src/lib/api.ts +25 -0
  284. package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
  285. package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
  286. package/templates/apps/frontend-auth/package.json +10 -8
  287. package/templates/apps/frontend-blank/package.json +9 -7
  288. package/templates/apps/frontend-cms/package.json +11 -9
  289. package/templates/apps/frontend-collab/package.json +12 -9
  290. package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
  291. package/templates/apps/frontend-contact/package.json +9 -7
  292. package/templates/apps/frontend-dashboard/package.json +9 -7
  293. package/templates/apps/frontend-docs/package.json +9 -7
  294. package/templates/apps/frontend-i18n/package.json +8 -6
  295. package/templates/apps/frontend-landing/package.json +9 -7
  296. package/templates/apps/frontend-portal/package.json +10 -8
  297. package/templates/apps/frontend-saas/app.config.ts +10 -6
  298. package/templates/apps/frontend-saas/package.json +10 -8
  299. package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
  300. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
  301. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
  302. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
  303. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
  304. package/templates/apps/frontend-spa/package.json +9 -7
  305. package/templates/apps/frontend-ssr/package.json +9 -7
  306. package/templates/apps/frontend-ssr-api/package.json +10 -8
  307. package/templates/apps/frontend-static-blog/package.json +8 -6
  308. package/templates/apps/frontend-status/package.json +10 -8
  309. package/templates/apps/mobile-app/README.md +1 -0
  310. package/templates/apps/mobile-app/package.json +4 -2
  311. package/templates/apps/mobile-app/src/app/index.tsx +22 -12
  312. package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
  313. package/templates/apps/mobile-app/src/lib/api.ts +34 -0
  314. package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
  315. package/templates/baselines/bare/.env.example +14 -0
  316. package/templates/baselines/bare/baseline.json +4 -4
  317. package/templates/baselines/compose/.env.example +14 -0
  318. package/templates/baselines/compose/README.md +1 -1
  319. package/templates/baselines/compose/baseline.json +5 -5
  320. package/templates/baselines/compose-mariadb/.env.example +14 -0
  321. package/templates/baselines/compose-mariadb/README.md +1 -1
  322. package/templates/baselines/compose-mariadb/baseline.json +5 -5
  323. package/templates/baselines/helm/.env.example +14 -0
  324. package/templates/baselines/helm/baseline.json +4 -4
  325. package/dist/apiBuild-C-x9YacA.js +0 -2
  326. package/dist/checkCommand-DRovTKza.js +0 -2
  327. package/dist/commands-CJfepbm4.js +0 -11541
  328. package/dist/dbCommand-b1gum4td.js +0 -2
  329. package/dist/dev-iiMtlkfs.js +0 -3
  330. package/dist/devActivity-BhIu6ncs.js +0 -159
  331. package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
  332. package/dist/inspect-mmBuRXmy.js +0 -2
  333. package/dist/manifestBuild-Dj8Jjoto.js +0 -2
  334. package/dist/seedRunner-Bqxgp7HZ.js +0 -230
  335. package/dist/serveCommand-DdaM4Hup.js +0 -1608
  336. package/dist/start-C0koT0UO.js +0 -1084
  337. /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
@@ -1,1084 +0,0 @@
1
- import { $ as e, C as t, Ct as n, D as r, E as i, G as a, J as o, K as s, L as c, P as l, Q as u, S as d, St as ee, Tt as f, V as p, W as m, _ as h, _t as g, a as _, b as v, bt as y, c as b, dt as te, f as x, ft as S, g as C, h as w, i as T, k as E, m as D, mt as O, o as ne, p as re, pt as k, q as ie, r as A, s as j, t as M, ut as N, v as ae, wt as oe, x as P, y as F } from "./inspectMetrics-1xzTKAFx.js";
2
- import { A as se, E as I, O as ce, a as le, k as L, m as ue } from "./inspect-BUUjt773.js";
3
- import { t as de } from "./bootTiming-BdyP9nYw.js";
4
- import { dirname as fe, extname as pe, join as R, resolve as z } from "node:path";
5
- import { fileURLToPath as B, pathToFileURL as V } from "node:url";
6
- import { createLogger as H, printReadyBlock as me } from "@voltro/logger";
7
- import { promises as U } from "node:fs";
8
- import { snapshotMetricsSync as he } from "@voltro/runtime";
9
- import { createServer as ge } from "node:http";
10
- //#region src/isrCdcInvalidator.ts
11
- var W = H({ scope: "voltro:start:cdc" }), G = (e) => (t) => {
12
- let n = 0;
13
- for (let [r, i] of e.tableSubscriptionsByPattern) {
14
- if (!i.includes(t)) continue;
15
- let a = e.regexByPattern.get(r);
16
- a && (n += e.cache.invalidateBy((e) => {
17
- let t = e.split("|")[0] ?? e;
18
- return a.test(t);
19
- }));
20
- }
21
- return n;
22
- }, _e = () => !process.env.PG_HOST && !process.env.PG_DATABASE ? null : {
23
- host: process.env.PG_HOST ?? "localhost",
24
- port: Number(process.env.PG_PORT ?? 5432),
25
- user: process.env.PG_USER ?? "app",
26
- password: process.env.PG_PASSWORD ?? "app",
27
- database: process.env.PG_DATABASE ?? "app"
28
- }, ve = (e) => {
29
- let t = e.channel ?? "framework_changes", n = G(e), r = null, i = null;
30
- return {
31
- start: async () => {
32
- let a = _e();
33
- if (!a) {
34
- W.debug("skipped — no PG_* env vars set");
35
- return;
36
- }
37
- if (e.tableSubscriptionsByPattern.size === 0) {
38
- W.debug("skipped — no pages declare cacheInvalidatesOn");
39
- return;
40
- }
41
- r = new (await (import("pg"))).default.Client(a), await r.connect(), i = (e) => {
42
- if (e.channel !== t || !e.payload) return;
43
- let r;
44
- try {
45
- r = JSON.parse(e.payload);
46
- } catch (e) {
47
- W.warn("bad CDC payload", {}, e);
48
- return;
49
- }
50
- let i = n(r.table);
51
- i > 0 && W.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
52
- op: r.op,
53
- table: r.table,
54
- dropped: i
55
- });
56
- }, r.on("notification", i), await r.query(`LISTEN ${t}`), W.info(`LISTEN ${t}`, {
57
- channel: t,
58
- host: a.host,
59
- port: a.port,
60
- database: a.database
61
- });
62
- },
63
- stop: async () => {
64
- if (r) {
65
- try {
66
- i && r.off("notification", i), await r.end();
67
- } catch {}
68
- r = null, i = null;
69
- }
70
- }
71
- };
72
- }, K = H({ scope: "voltro:start:isr-cache" }), ye = "voltro_isr_cache", q = (e) => `
73
- CREATE TABLE IF NOT EXISTS ${e} (
74
- cache_key TEXT PRIMARY KEY,
75
- html TEXT NOT NULL,
76
- rendered_at BIGINT NOT NULL,
77
- expires_at BIGINT NOT NULL,
78
- servable_until BIGINT NOT NULL,
79
- revalidate_ms BIGINT NOT NULL,
80
- stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
81
- );
82
- CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
83
- `, be = (e) => {
84
- let t = e.tableName ?? ye, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
85
- i || (i = !0, await n.query(q(t)));
86
- })().then(async () => {
87
- let e = await n.query(`SELECT * FROM ${t}`);
88
- for (let t of e.rows) r.set(t.cache_key, {
89
- html: t.html,
90
- renderedAt: Number(t.rendered_at),
91
- expiresAt: Number(t.expires_at),
92
- servableUntil: Number(t.servable_until),
93
- revalidateMs: Number(t.revalidate_ms),
94
- staleWhileRevalidateMs: Number(t.stale_while_revalidate_ms)
95
- });
96
- }).catch((e) => {
97
- K.warn("postgres bootstrap failed", {}, e);
98
- }), o = (e, t) => {
99
- a.then(() => n.query(e, t)).catch((e) => {
100
- K.warn("postgres write failed", {}, e);
101
- });
102
- };
103
- return {
104
- get(e) {
105
- return r.get(e);
106
- },
107
- set(e, n) {
108
- r.set(e, n), o(`INSERT INTO ${t}
109
- (cache_key, html, rendered_at, expires_at, servable_until, revalidate_ms, stale_while_revalidate_ms)
110
- VALUES ($1, $2, $3, $4, $5, $6, $7)
111
- ON CONFLICT (cache_key) DO UPDATE SET
112
- html = EXCLUDED.html,
113
- rendered_at = EXCLUDED.rendered_at,
114
- expires_at = EXCLUDED.expires_at,
115
- servable_until = EXCLUDED.servable_until,
116
- revalidate_ms = EXCLUDED.revalidate_ms,
117
- stale_while_revalidate_ms = EXCLUDED.stale_while_revalidate_ms`, [
118
- e,
119
- n.html,
120
- n.renderedAt,
121
- n.expiresAt,
122
- n.servableUntil,
123
- n.revalidateMs,
124
- n.staleWhileRevalidateMs
125
- ]);
126
- },
127
- invalidate(e) {
128
- r.delete(e), o(`DELETE FROM ${t} WHERE cache_key = $1`, [e]);
129
- },
130
- invalidateBy(e) {
131
- let n = 0, i = [];
132
- for (let t of r.keys()) e(t) && (r.delete(t), i.push(t), n++);
133
- return i.length > 0 && o(`DELETE FROM ${t} WHERE cache_key = ANY($1)`, [i]), n;
134
- },
135
- clear() {
136
- r.clear(), o(`DELETE FROM ${t}`, []);
137
- },
138
- size() {
139
- return r.size;
140
- },
141
- snapshot() {
142
- return Array.from(r.entries());
143
- }
144
- };
145
- }, J = H({ scope: "voltro:start" }), xe = await (async () => {
146
- try {
147
- let e = R(fe(B(import.meta.url)), "..", "package.json"), t = await U.readFile(e, "utf8");
148
- return JSON.parse(t).version ?? "0.0.0";
149
- } catch {
150
- return "0.0.0";
151
- }
152
- })(), Y = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", X = (e) => e instanceof Error && e._voltroControl === "not-found", Se = {
153
- ".html": "text/html; charset=utf-8",
154
- ".js": "application/javascript",
155
- ".mjs": "application/javascript",
156
- ".css": "text/css",
157
- ".json": "application/json",
158
- ".xml": "application/xml; charset=utf-8",
159
- ".rss": "application/rss+xml; charset=utf-8",
160
- ".atom": "application/atom+xml; charset=utf-8",
161
- ".svg": "image/svg+xml",
162
- ".png": "image/png",
163
- ".jpg": "image/jpeg",
164
- ".jpeg": "image/jpeg",
165
- ".webp": "image/webp",
166
- ".ico": "image/x-icon",
167
- ".woff": "font/woff",
168
- ".woff2": "font/woff2",
169
- ".txt": "text/plain; charset=utf-8"
170
- }, Ce = (e) => Se[pe(e).toLowerCase()] ?? "application/octet-stream", we = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Z = async (e) => {
171
- try {
172
- return await U.stat(e), !0;
173
- } catch {
174
- return !1;
175
- }
176
- }, Q = (e) => {
177
- let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
178
- for (let e of r) e.startsWith("[[...") && e.endsWith("]]") ? (i.push("(.*)"), t.push(e.slice(5, -2)), n += 2) : e.startsWith("[...") && e.endsWith("]") ? (i.push("(.+)"), t.push(e.slice(4, -1)), n += 3) : e.startsWith("[") && e.endsWith("]") ? (i.push("([^/]+)"), t.push(e.slice(1, -1)), n += 1) : i.push(e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
179
- let a = i.join("/");
180
- return {
181
- regex: a.length === 0 ? /^\/?$/ : RegExp(`^/${a}/?$`),
182
- paramNames: t,
183
- priority: n
184
- };
185
- }, Te = (e) => e.map((e) => {
186
- let { regex: t, paramNames: n, priority: r } = Q(e.pattern);
187
- return {
188
- pattern: e.pattern,
189
- file: e.file,
190
- dirChain: e.dirChain,
191
- regex: t,
192
- paramNames: n,
193
- priority: r
194
- };
195
- }).slice().sort((e, t) => e.priority - t.priority), Ee = (e, t) => {
196
- for (let n of t) {
197
- let t = n.regex.exec(e);
198
- if (!t) continue;
199
- let r = {};
200
- for (let e = 0; e < n.paramNames.length; e++) r[n.paramNames[e]] = t[e + 1] ?? "";
201
- return {
202
- route: n,
203
- params: r
204
- };
205
- }
206
- return null;
207
- }, De = async (e) => {
208
- let { provider: n, route: r, params: i, pathname: a, dirs: o, shellTemplate: s, requestHeaders: l, requestUrl: u = "", apiOrigin: ee, apiName: f } = e, { search: p } = t(u), m = T(ee, l.cookie, { apiName: f }), g = await n.getPage(r.pattern, r.file), y = c(g, r.file), b = y === "spa" && ne(o, r.dirChain).some((e) => e.hasLayout);
209
- if (y !== "ssr" && y !== "isr" && !b) return null;
210
- let te = ne(o, r.dirChain), x = {}, S = null, E, re = new AbortController();
211
- try {
212
- (await n.getHelpers()).beginStoreSeeds(), {chain: E, segmentLoaderData: x} = await _({
213
- entries: te,
214
- loadLayout: (e) => n.getLayout(e.dir),
215
- loadError: (e) => n.getError(e.dir),
216
- loadPending: (e) => n.getPending(e.dir),
217
- ctx: {
218
- params: i,
219
- pathname: a,
220
- search: p,
221
- signal: re.signal,
222
- headers: l,
223
- query: m
224
- }
225
- }), typeof g.loader == "function" && !b && (S = await g.loader({
226
- params: i,
227
- pathname: a,
228
- search: p,
229
- signal: re.signal,
230
- headers: l,
231
- query: m
232
- }));
233
- } catch (e) {
234
- if (Y(e)) return {
235
- control: "redirect",
236
- status: e.status,
237
- location: e.location
238
- };
239
- if (X(e)) return { control: "not-found" };
240
- throw e;
241
- }
242
- let k = await n.getHelpers();
243
- b || await D({
244
- pageMod: g,
245
- params: i,
246
- query: m,
247
- apiName: f,
248
- seed: k.seedPreloadedSubscription,
249
- onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
250
- tag: e,
251
- apiName: t,
252
- pathname: a
253
- }, n)
254
- });
255
- let ie = {
256
- pattern: r.pattern,
257
- Component: g.default,
258
- meta: g.meta,
259
- loader: g.loader,
260
- ErrorBoundary: g.ErrorBoundary,
261
- Pending: g.Pending,
262
- renderMode: y,
263
- chain: E
264
- }, A = {
265
- cookies: k.parseCookieHeader(l.cookie),
266
- headers: l,
267
- url: u
268
- }, j = k.i18n?.resolve(l.cookie, l["accept-language"]), M = g.interactive ?? "full";
269
- if (b) {
270
- let e = v({
271
- helpers: k,
272
- page: r.pattern,
273
- interactive: M,
274
- delivery: "stream",
275
- renderInput: {
276
- descriptor: ie,
277
- params: i,
278
- pathname: a,
279
- search: p,
280
- segmentLoaderData: x,
281
- requestContext: A,
282
- ...j ? {
283
- outerWrap: j.outerWrap,
284
- locale: j.locale
285
- } : {}
286
- }
287
- }), t = j?.locale ?? A.cookies["voltro:locale"] ?? "en", n = (t) => d({
288
- helpers: k,
289
- prepared: e,
290
- meta: t,
291
- interactive: M
292
- });
293
- if (e.hasDeferred) {
294
- let r = C({ shell: s });
295
- return {
296
- renderMode: "spa",
297
- stream: (i) => h({
298
- res: i,
299
- shell: r,
300
- htmlLang: t,
301
- headers: {
302
- "content-type": "text/html; charset=utf-8",
303
- "x-voltro-rendered-by": "spa"
304
- },
305
- headInjection: n,
306
- render: (t) => k.renderPageToStream({
307
- ...e.renderInput,
308
- ...t
309
- }),
310
- onShellError: (e) => {
311
- J.error("spa layout shell render failed", { pathname: a }, e), i.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), i.end("server error");
312
- }
313
- })
314
- };
315
- }
316
- let o = P({
317
- helpers: k,
318
- prepared: e
319
- });
320
- return {
321
- html: w(s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), n(o.meta)).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
322
- renderMode: "spa",
323
- revalidateMs: null
324
- };
325
- }
326
- let N = F({
327
- helpers: k,
328
- page: r.pattern,
329
- pathname: a,
330
- renderMode: y,
331
- interactive: M,
332
- loaderData: S,
333
- segmentLoaderData: x,
334
- pageLoaderRan: typeof g.loader == "function"
335
- }), ae = {
336
- descriptor: ie,
337
- params: i,
338
- pathname: a,
339
- search: p,
340
- loaderData: N.loaderData,
341
- segmentLoaderData: N.segmentLoaderData,
342
- requestContext: A,
343
- ...j ? {
344
- outerWrap: j.outerWrap,
345
- locale: j.locale
346
- } : {}
347
- }, oe = (e) => [
348
- k.renderMetaToHtml(e),
349
- `<meta name="voltro-interactive" content="${M}" />`,
350
- ...N.hasDeferred ? [k.renderDeferredRegistryScript()] : [],
351
- k.renderRouterStateScript(N.stateInput)
352
- ].filter((e) => e.length > 0).join("\n ");
353
- if (y === "ssr" && M === "full" && e.buffered !== !0) {
354
- let e = j?.locale ?? A.cookies["voltro:locale"] ?? "en", t = C({ shell: s });
355
- return {
356
- renderMode: "ssr",
357
- stream: (n) => h({
358
- res: n,
359
- shell: t,
360
- htmlLang: e,
361
- headers: {
362
- "content-type": "text/html; charset=utf-8",
363
- "x-voltro-rendered-by": "ssr"
364
- },
365
- headInjection: oe,
366
- render: (e) => k.renderPageToStream({
367
- ...ae,
368
- ...e
369
- }),
370
- onShellError: (e) => {
371
- J.error("ssr shell render failed", { pathname: a }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
372
- }
373
- })
374
- };
375
- }
376
- let { html: se, meta: I } = k.renderPageToHtml(ae), ce = oe(I), le = j?.locale ?? A.cookies["voltro:locale"] ?? "en", L = w(s.replace("<div id=\"root\"></div>", `<div id="root">${se}</div>`), ce).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${le}"`);
377
- M === "none" && (L = we(L));
378
- let ue = y === "isr" ? O(g.revalidate) : null;
379
- return {
380
- html: L,
381
- renderMode: y,
382
- revalidateMs: ue
383
- };
384
- }, $ = (e) => e === "" ? "/" : e, Oe = async (e) => {
385
- let t = await import(V(e).href);
386
- return {
387
- kind: "bundle",
388
- getPageMeta: () => t.pageMeta,
389
- async getPage(e, n) {
390
- let r = t.pages[e];
391
- if (!r) throw Error(`[voltro start] ssr bundle missing page for pattern ${e}`);
392
- return typeof r == "function" ? await r() : r;
393
- },
394
- async getLayout(e) {
395
- let n = t.layouts[$(e)];
396
- if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${$(e)}`);
397
- return typeof n == "function" ? await n() : n;
398
- },
399
- async getError(e) {
400
- let n = t.errors[$(e)];
401
- if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${$(e)}`);
402
- return typeof n == "function" ? await n() : n;
403
- },
404
- async getPending(e) {
405
- let n = t.pendings[$(e)];
406
- if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${$(e)}`);
407
- return typeof n == "function" ? await n() : n;
408
- },
409
- async getHelpers() {
410
- return t.helpers;
411
- },
412
- async close() {}
413
- };
414
- }, ke = async (t, n) => {
415
- let r = await y("vite", () => import("vite")), i = (await import("@vitejs/plugin-react")).default, a = (await import("@tailwindcss/vite")).default, o = await r.createServer({
416
- root: n,
417
- envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
418
- plugins: [i(), a()],
419
- resolve: { dedupe: [
420
- "react",
421
- "react-dom",
422
- "react-intl",
423
- "@voltro/i18n"
424
- ] },
425
- ssr: { noExternal: ["react-intl", "@voltro/i18n"] },
426
- server: {
427
- middlewareMode: !0,
428
- hmr: !1
429
- },
430
- appType: "custom",
431
- logLevel: "warn"
432
- }), s = R(t, "src", "pages"), c = (e) => e === "" ? s : R(s, e), l = u({
433
- limit: e(),
434
- onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
435
- onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
436
- id: e,
437
- ms: t,
438
- ...n ? { failed: !0 } : {}
439
- })
440
- }), d = (e) => l.load(e, async () => await o.ssrLoadModule(e));
441
- return {
442
- kind: "middleware",
443
- async getPage(e, t) {
444
- return d(R(s, t));
445
- },
446
- async getLayout(e) {
447
- return d(R(c(e), "layout.tsx"));
448
- },
449
- async getError(e) {
450
- return d(R(c(e), "error.tsx"));
451
- },
452
- async getPending(e) {
453
- return d(R(c(e), "loading.tsx"));
454
- },
455
- async getHelpers() {
456
- return await d("@voltro/web/ssr");
457
- },
458
- async close() {
459
- await o.close();
460
- }
461
- };
462
- }, Ae = async (e) => {
463
- let t = de(), c = await j(e);
464
- if (!c) return {
465
- ran: !1,
466
- exitCode: 0
467
- };
468
- if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
469
- ran: !0,
470
- exitCode: 1
471
- };
472
- let { resolved: u } = await g({
473
- rawEnv: c.env,
474
- appType: "web",
475
- root: e,
476
- log: J,
477
- generateTypes: !1
478
- }), d = u.publicValues;
479
- t.mark("config");
480
- let h = ie();
481
- m(h), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
482
- let _ = (() => {
483
- if (process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT) return Number(process.env.VOLTRO_DASHBOARD_PORT);
484
- if (process.env.PORT) {
485
- let e = Number(process.env.PORT);
486
- if (Number.isFinite(e) && e > 0) return e;
487
- }
488
- return c.port ?? 5173;
489
- })(), v = R(e, ".framework"), y = R(v, "dist"), C = R(y, "index.html");
490
- if (!await Z(C)) return J.error("no built dist found — run `voltro build` first", { distDir: y }), {
491
- ran: !0,
492
- exitCode: 1
493
- };
494
- let w = c.name ?? "unnamed", T = ee("web", w, _), D = E(w);
495
- await f({
496
- id: T,
497
- name: w,
498
- kind: "web",
499
- url: `http://localhost:${_}`,
500
- pid: process.pid,
501
- status: "booting",
502
- logFile: D.path
503
- }).catch(() => {});
504
- let O = R(y, "_voltro", "shell.html"), P = await Z(O) ? await U.readFile(O, "utf8") : await U.readFile(C, "utf8"), F = await b(e, c), fe = A(F[0]), pe = F[0]?.name, z, B = null;
505
- process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (B = new (await (import("pg"))).default.Client({
506
- host: process.env.PG_HOST,
507
- port: Number(process.env.PG_PORT ?? 5432),
508
- user: process.env.PG_USER ?? "app",
509
- password: process.env.PG_PASSWORD ?? "app",
510
- database: process.env.PG_DATABASE ?? "app"
511
- }), await B.connect(), z = be({ client: B }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = k(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await re(e, c, F, d);
512
- let { pages: V, dirs: H } = await x(R(e, "src", "pages")), W = Te(V);
513
- t.mark("scan");
514
- let G = R(y, "server", "ssrEntry.js"), _e = await Z(G);
515
- if (!_e && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${G} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${G}`);
516
- let K = _e ? await Oe(G) : await ke(e, v);
517
- J.info(`ssr loader: ${K.kind}`, {
518
- kind: K.kind,
519
- ...K.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
520
- }), t.mark("provider");
521
- let ye = K.getPageMeta?.(), q = /* @__PURE__ */ new Map(), Y = 0;
522
- for (let e of V) {
523
- let t = ye?.[e.pattern];
524
- if (t) {
525
- q.set(e.pattern, t);
526
- continue;
527
- }
528
- try {
529
- let t = await K.getPage(e.pattern, e.file);
530
- q.set(e.pattern, l(t, e.file)), Y++;
531
- } catch (t) {
532
- J.warn("failed to load page metadata", { pattern: e.pattern }, t);
533
- }
534
- }
535
- J.info(`registered ${q.size} route(s)`, {
536
- count: q.size,
537
- fromManifest: q.size - Y,
538
- fromModules: Y
539
- }), t.mark("routes");
540
- let X = /* @__PURE__ */ new Set();
541
- for (let e of W) q.get(e.pattern)?.renderMode === "spa" && ne(H, e.dirChain).some((e) => e.hasLayout) && X.add(e.pattern);
542
- X.size > 0 && J.info(`${X.size} spa route(s) render an SSR layout shell`, { patterns: [...X] });
543
- let Se = /* @__PURE__ */ new Map();
544
- for (let [e, t] of q) t.cacheInvalidatesOn.length > 0 && Se.set(e, t.cacheInvalidatesOn);
545
- let we = /* @__PURE__ */ new Map();
546
- for (let e of W) we.set(e.pattern, e.regex);
547
- let Q = ve({
548
- cache: z,
549
- tableSubscriptionsByPattern: Se,
550
- regexByPattern: we
551
- });
552
- await Q.start(), t.mark("cdc");
553
- let $ = M(), Ae = V.map((e) => {
554
- let t = q.get(e.pattern);
555
- return {
556
- pattern: e.pattern,
557
- file: e.file,
558
- dirChain: e.dirChain,
559
- renderMode: t?.renderMode ?? "static",
560
- interactive: t?.interactive ?? "full",
561
- tenantAware: t?.tenantAware ?? !1,
562
- revalidateMs: t?.revalidateMs ?? null,
563
- staleWhileRevalidateMs: t?.staleWhileRevalidateMs ?? 0,
564
- cacheInvalidatesOn: t?.cacheInvalidatesOn ?? [],
565
- hasLoader: t?.hasLoader ?? !1,
566
- hasMeta: t?.hasMeta ?? !1,
567
- hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
568
- };
569
- }), je = H.map((e) => ({
570
- dir: e.dir,
571
- hasLayout: e.hasLayout,
572
- hasError: e.hasError,
573
- hasPending: e.hasPending,
574
- hasNotFound: e.hasNotFound
575
- })), Me = B ? "postgres" : "memory", Ne = {
576
- kind: "web",
577
- meta: {
578
- name: c.name ?? "(unnamed)",
579
- voltroVersion: xe,
580
- port: _,
581
- mode: "start",
582
- apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
583
- let n = {
584
- name: e,
585
- package: t.package
586
- };
587
- return t.url !== void 0 && (n.url = t.url), n;
588
- })
589
- },
590
- routes: Ae,
591
- dirs: je,
592
- cache: () => {
593
- let e = Date.now(), t = z.snapshot().map(([t, n]) => ({
594
- key: t,
595
- renderedAt: n.renderedAt,
596
- expiresAt: n.expiresAt,
597
- servableUntil: n.servableUntil,
598
- ageMs: e - n.renderedAt,
599
- htmlBytes: Buffer.byteLength(n.html, "utf8"),
600
- revalidateMs: n.revalidateMs,
601
- staleWhileRevalidateMs: n.staleWhileRevalidateMs
602
- }));
603
- return {
604
- backend: Me,
605
- size: z.size(),
606
- entries: t
607
- };
608
- },
609
- metrics: () => he()
610
- }, Pe = async (t, r) => {
611
- let i = t.split("?")[0] ?? "/";
612
- if (c.name === "voltroDashboard" && i === "/api/dashboard/registry") try {
613
- let e = await n();
614
- return {
615
- status: 200,
616
- headers: { "content-type": "application/json; charset=utf-8" },
617
- body: JSON.stringify(e)
618
- };
619
- } catch (e) {
620
- return {
621
- status: 500,
622
- headers: { "content-type": "text/plain" },
623
- body: `registry read error: ${e.message}`
624
- };
625
- }
626
- if (c.name === "voltroDashboard" && i === "/api/dashboard/config") {
627
- let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
628
- if (e && e.trim().length > 0) {
629
- let n;
630
- try {
631
- n = JSON.parse(e);
632
- } catch (e) {
633
- return {
634
- status: 500,
635
- headers: { "content-type": "text/plain" },
636
- body: `VOLTRO_DASHBOARD_APPS is not valid JSON: ${e.message}`
637
- };
638
- }
639
- for (let e of Array.isArray(n) ? n : []) {
640
- if (typeof e != "object" || !e) continue;
641
- let n = e;
642
- typeof n.url != "string" || n.url.length === 0 || t.push({
643
- url: n.url,
644
- ...typeof n.name == "string" ? { name: n.name } : {},
645
- ...typeof n.token == "string" ? { token: n.token } : {}
646
- });
647
- }
648
- }
649
- return {
650
- status: 200,
651
- headers: { "content-type": "application/json; charset=utf-8" },
652
- body: JSON.stringify({ apps: t })
653
- };
654
- }
655
- if (i === "/_voltro/inspect/logs") {
656
- let e = p(t, a(), r);
657
- return {
658
- status: e.status,
659
- headers: {
660
- "content-type": e.contentType,
661
- ...I(r.origin)
662
- },
663
- body: e.body
664
- };
665
- }
666
- if (i !== "/_voltro/inspect/stream") {
667
- let e = ue(t, Ne, r);
668
- if (e !== null) return {
669
- status: e.status,
670
- headers: {
671
- "content-type": e.contentType,
672
- ...e.headers ?? {}
673
- },
674
- body: e.body
675
- };
676
- }
677
- let o = Ee(i, W), s = o ? q.get(o.route.pattern)?.renderMode : void 0, l = s === "ssr" || s === "isr" || (o ? X.has(o.route.pattern) : !1), u = i === "/" ? R(y, "index.html") : R(y, i.replace(/^\//, ""), "index.html");
678
- if (!l && await Z(u)) return {
679
- status: 200,
680
- headers: { "content-type": "text/html; charset=utf-8" },
681
- body: await U.readFile(u)
682
- };
683
- if (/\.[a-z0-9]+$/i.test(i)) {
684
- let e = R(y, i.replace(/^\//, ""));
685
- if (await Z(e)) {
686
- let t = await U.readFile(e);
687
- return {
688
- status: 200,
689
- headers: { "content-type": Ce(e) },
690
- body: t
691
- };
692
- }
693
- }
694
- let d = Ee(i, W);
695
- if (!d) return {
696
- status: 404,
697
- headers: { "content-type": "text/plain" },
698
- body: "not found"
699
- };
700
- let ee = q.get(d.route.pattern), f = r["x-tenant"] ?? "anonymous", m = (await K.getHelpers()).i18n?.resolve(r.cookie, r["accept-language"])?.locale, g = N(i, {
701
- ...ee?.tenantAware ? { tenant: f } : {},
702
- ...m ? { locale: m } : {}
703
- }), _ = z.get(g), v = Date.now();
704
- if (_ && te(_, v)) return h.emit("cache", {
705
- kind: "HIT",
706
- key: g,
707
- ageMs: v - _.renderedAt
708
- }), {
709
- status: 200,
710
- headers: {
711
- "content-type": "text/html; charset=utf-8",
712
- "x-voltro-rendered-by": "isr",
713
- "x-voltro-cache": "HIT",
714
- "x-voltro-cache-key": g,
715
- "x-voltro-cache-age-ms": String(v - _.renderedAt)
716
- },
717
- body: _.html
718
- };
719
- if (_ && S(_, v)) return h.emit("cache", {
720
- kind: "STALE",
721
- key: g,
722
- ageMs: v - _.renderedAt
723
- }), (async () => {
724
- try {
725
- let n = await De({
726
- provider: K,
727
- root: e,
728
- route: d.route,
729
- params: d.params,
730
- pathname: i,
731
- dirs: H,
732
- shellTemplate: P,
733
- requestHeaders: r,
734
- apiOrigin: fe,
735
- apiName: pe,
736
- requestUrl: t,
737
- buffered: !0
738
- });
739
- if (n && "html" in n && n.renderMode === "isr" && n.revalidateMs !== null) {
740
- let e = q.get(d.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
741
- z.set(g, {
742
- html: n.html,
743
- renderedAt: t,
744
- expiresAt: t + n.revalidateMs,
745
- servableUntil: t + n.revalidateMs + e,
746
- revalidateMs: n.revalidateMs,
747
- staleWhileRevalidateMs: e
748
- });
749
- }
750
- } catch (e) {
751
- J.warn("background SWR refresh failed", { url: i }, e);
752
- }
753
- })(), {
754
- status: 200,
755
- headers: {
756
- "content-type": "text/html; charset=utf-8",
757
- "x-voltro-rendered-by": "isr",
758
- "x-voltro-cache": "STALE",
759
- "x-voltro-cache-key": g,
760
- "x-voltro-cache-age-ms": String(v - _.renderedAt)
761
- },
762
- body: _.html
763
- };
764
- try {
765
- let n = await De({
766
- provider: K,
767
- root: e,
768
- route: d.route,
769
- params: d.params,
770
- pathname: i,
771
- dirs: H,
772
- shellTemplate: P,
773
- requestHeaders: r,
774
- apiOrigin: fe,
775
- apiName: pe,
776
- requestUrl: t
777
- });
778
- if (!n) return {
779
- status: 200,
780
- headers: {
781
- "content-type": "text/html; charset=utf-8",
782
- "x-voltro-rendered-by": "spa-fallback"
783
- },
784
- body: P
785
- };
786
- if ("stream" in n) return {
787
- status: 200,
788
- headers: { "x-voltro-rendered-by": n.renderMode },
789
- body: "",
790
- stream: n.stream
791
- };
792
- if ("control" in n) return n.control === "redirect" ? {
793
- status: n.status,
794
- headers: {
795
- location: n.location,
796
- "x-voltro-rendered-by": "loader-redirect"
797
- },
798
- body: ""
799
- } : {
800
- status: 404,
801
- headers: {
802
- "content-type": "text/plain; charset=utf-8",
803
- "x-voltro-rendered-by": "loader-not-found"
804
- },
805
- body: "not found"
806
- };
807
- let a = {
808
- "content-type": "text/html; charset=utf-8",
809
- "x-voltro-rendered-by": n.renderMode
810
- };
811
- if (n.renderMode === "isr" && n.revalidateMs !== null) {
812
- let e = Date.now(), t = q.get(d.route.pattern)?.staleWhileRevalidateMs ?? 0;
813
- z.set(g, {
814
- html: n.html,
815
- renderedAt: e,
816
- expiresAt: e + n.revalidateMs,
817
- servableUntil: e + n.revalidateMs + t,
818
- revalidateMs: n.revalidateMs,
819
- staleWhileRevalidateMs: t
820
- }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = g, a["x-voltro-cache-revalidate-ms"] = String(n.revalidateMs), t > 0 && (a["x-voltro-cache-swr-ms"] = String(t)), h.emit("cache", {
821
- kind: "MISS",
822
- key: g,
823
- revalidateMs: n.revalidateMs,
824
- swrMs: t
825
- });
826
- } else n.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", h.emit("cache", {
827
- kind: "BYPASS",
828
- key: g
829
- }));
830
- return {
831
- status: 200,
832
- headers: a,
833
- body: n.html
834
- };
835
- } catch (e) {
836
- return J.error("render error", { url: i }, e), ae(e) ? {
837
- status: 500,
838
- headers: {
839
- "content-type": "text/plain; charset=utf-8",
840
- "x-voltro-rendered-by": "defer-unsupported"
841
- },
842
- body: e.message
843
- } : {
844
- status: 500,
845
- headers: { "content-type": "text/plain" },
846
- body: "server error"
847
- };
848
- }
849
- }, Fe = !1, Ie = ge(async (e, t) => {
850
- let n = e.url ?? "/", r = Date.now(), i = {};
851
- for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
852
- let a = n.split("?")[0] ?? "/", l = (e.method ?? "GET").toUpperCase();
853
- if (a === "/internal/liveness") {
854
- t.writeHead(200, {
855
- "content-type": "text/plain",
856
- "cache-control": "no-store"
857
- }), t.end("ok");
858
- return;
859
- }
860
- if (a === "/internal/readiness") {
861
- let e = Fe ? 200 : 503;
862
- t.writeHead(e, {
863
- "content-type": "text/plain",
864
- "cache-control": "no-store"
865
- }), t.end(Fe ? "ready" : "not-ready");
866
- return;
867
- }
868
- if (l === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
869
- let e = I(i.origin);
870
- t.writeHead(204, e), t.end();
871
- return;
872
- }
873
- if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
874
- let r = new URL(n, "http://x").searchParams.get("target");
875
- if (!r) {
876
- t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
877
- return;
878
- }
879
- if (!ce(r)) {
880
- t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
881
- return;
882
- }
883
- try {
884
- let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
885
- a ? n.authorization = Array.isArray(a) ? a[0] : a : se(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
886
- let o;
887
- if (l && l !== "GET" && l !== "HEAD") {
888
- let t = [];
889
- for await (let n of e) t.push(n);
890
- o = Buffer.concat(t);
891
- let r = i["content-type"];
892
- r && (n["content-type"] = Array.isArray(r) ? r[0] : r);
893
- }
894
- let s = await fetch(r, {
895
- redirect: "manual",
896
- method: l,
897
- headers: n,
898
- ...o ? { body: new Uint8Array(o.buffer, o.byteOffset, o.byteLength) } : {}
899
- }), c = Buffer.from(await s.arrayBuffer());
900
- t.writeHead(s.status, {
901
- "content-type": s.headers.get("content-type") ?? "application/octet-stream",
902
- "content-length": String(c.length)
903
- }), t.end(c);
904
- } catch (e) {
905
- t.writeHead(502, { "content-type": "text/plain" }), t.end(`proxy error: ${e.message}`);
906
- }
907
- return;
908
- }
909
- if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
910
- let r = new URL(n, "http://x").searchParams.get("target");
911
- if (!r) {
912
- t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
913
- return;
914
- }
915
- if (!ce(r)) {
916
- t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
917
- return;
918
- }
919
- let a = new AbortController();
920
- e.on("close", () => a.abort()), t.on("close", () => a.abort());
921
- try {
922
- let e = i.authorization ?? (se(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
923
- redirect: "manual",
924
- method: "GET",
925
- headers: {
926
- accept: "text/event-stream",
927
- ...e ? { authorization: Array.isArray(e) ? e[0] : e } : {}
928
- },
929
- signal: a.signal
930
- });
931
- if (!n.ok || !n.body) {
932
- t.writeHead(n.status, { "content-type": "text/plain" }), t.end(`upstream ${n.status}`);
933
- return;
934
- }
935
- t.writeHead(200, {
936
- "content-type": "text/event-stream; charset=utf-8",
937
- "cache-control": "no-cache, no-transform",
938
- connection: "keep-alive",
939
- "x-accel-buffering": "no"
940
- }), t.flushHeaders();
941
- let o = n.body.getReader();
942
- try {
943
- for (;;) {
944
- let { done: e, value: n } = await o.read();
945
- if (e) break;
946
- n && t.write(Buffer.from(n));
947
- }
948
- } finally {
949
- o.releaseLock(), t.end();
950
- }
951
- } catch (e) {
952
- e.name !== "AbortError" && (t.writeHead(502, { "content-type": "text/plain" }), t.end(`proxy stream error: ${e.message}`));
953
- }
954
- return;
955
- }
956
- if (a === "/_voltro/inspect/stream") {
957
- let n = I(i.origin);
958
- if (L()) {
959
- t.writeHead(503, {
960
- "content-type": "application/json",
961
- ...n
962
- }), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
963
- return;
964
- }
965
- let r = le(i, "GET");
966
- if (!r.ok) {
967
- t.writeHead(401, {
968
- "content-type": "application/json",
969
- ...n
970
- }), t.end(JSON.stringify({
971
- error: "unauthorized",
972
- reason: r.reason
973
- }));
974
- return;
975
- }
976
- t.writeHead(200, {
977
- "content-type": "text/event-stream; charset=utf-8",
978
- "cache-control": "no-cache, no-transform",
979
- connection: "keep-alive",
980
- "x-accel-buffering": "no",
981
- ...n
982
- }), t.flushHeaders(), t.write("retry: 5000\n\n");
983
- for (let e of h.buffered()) t.write(s(e));
984
- let a = h.subscribe((e) => {
985
- t.write(s(e));
986
- }), c = setInterval(() => {
987
- t.write(o());
988
- }, 15e3), l = () => {
989
- clearInterval(c), a();
990
- };
991
- e.on("close", l), t.on("close", l);
992
- return;
993
- }
994
- try {
995
- let e = await Pe(n, i);
996
- if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
997
- let t = Date.now() - r;
998
- h.emit("request", {
999
- url: a,
1000
- status: e.status,
1001
- durationMs: t,
1002
- renderedBy: e.headers["x-voltro-rendered-by"],
1003
- cache: e.headers["x-voltro-cache"]
1004
- });
1005
- let n = Ee(a, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1006
- $.record({
1007
- kind: "request",
1008
- tag: n,
1009
- durationMs: t,
1010
- status: e.status >= 500 ? "error" : "ok"
1011
- });
1012
- }
1013
- } catch (e) {
1014
- t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
1015
- }
1016
- });
1017
- await new Promise((e) => Ie.listen(_, "::", e)), Fe = !0, t.mark("ready"), J.info(`listening on http://localhost:${_}`, {
1018
- port: _,
1019
- distDir: y
1020
- }), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
1021
- try {
1022
- await f({
1023
- id: T,
1024
- name: w,
1025
- kind: "web",
1026
- url: `http://localhost:${_}`,
1027
- pid: process.pid,
1028
- status: "live",
1029
- logFile: D.path
1030
- });
1031
- let t = r(e);
1032
- if (t) {
1033
- let e = await i({ dashboardAppPath: t });
1034
- e.status === "launched" ? J.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && J.debug(`dashboard already running on :${e.port}`, { port: e.port });
1035
- }
1036
- setInterval(() => {
1037
- f({
1038
- id: T,
1039
- name: w,
1040
- kind: "web",
1041
- url: `http://localhost:${_}`,
1042
- pid: process.pid,
1043
- status: "live",
1044
- logFile: D.path
1045
- }).catch(() => {});
1046
- }, 1e4).unref();
1047
- } catch (e) {
1048
- J.warn("runtime-registry write failed", {}, e);
1049
- }
1050
- me({
1051
- app: c.name ?? "unnamed",
1052
- kind: "web",
1053
- url: `http://localhost:${_}`,
1054
- bootMs: t.total()
1055
- });
1056
- let Le = t.phaseBreakdown();
1057
- J.info(`start: ready in ${t.total()}ms`, {
1058
- bootMs: t.total(),
1059
- ...Le ? { phases: Le } : {}
1060
- });
1061
- let Re = !1, ze = (e) => async () => {
1062
- if (!Re) {
1063
- if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await Q.stop(), B) try {
1064
- await B.end();
1065
- } catch {}
1066
- await K.close(), await oe(T), await D.dispose(), process.exit(0);
1067
- }
1068
- };
1069
- process.on("SIGINT", ze("SIGINT")), process.on("SIGTERM", ze("SIGTERM"));
1070
- let Be = process.ppid;
1071
- if (Be > 1) {
1072
- let e = setInterval(() => {
1073
- (process.ppid !== Be || process.ppid === 1) && (clearInterval(e), ze("SIGTERM")());
1074
- }, 2e3);
1075
- e.unref();
1076
- }
1077
- return new Promise(() => {});
1078
- }, je = async (e) => {
1079
- process.env.NODE_ENV || (process.env.NODE_ENV = "production");
1080
- let t = await Ae(z(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
1081
- return t.ran ? t.exitCode : (J.error("no web app found at this path"), 1);
1082
- };
1083
- //#endregion
1084
- export { je as t };