@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
@@ -0,0 +1,3 @@
1
+ import "./renderModeScan-D7J1B7Kw.js";
2
+ import { t as e } from "./start-9LiUOfES.js";
3
+ export { e as runStartCommand };
@@ -1,3 +1,3 @@
1
- import { ct as e } from "./inspectMetrics-1xzTKAFx.js";
2
- import { t } from "./start-C0koT0UO.js";
1
+ import { t as e } from "./loadEnv-D9nEOClM.js";
2
+ import { t } from "./start-9LiUOfES.js";
3
3
  export { e as loadDotEnv, t as runStartCommand };
@@ -0,0 +1,304 @@
1
+ import { t as e } from "./cliRuntime-Dh7UDinH.js";
2
+ import { t } from "./renderProfile-1OWWAAtx.js";
3
+ import { t as n } from "./commandRunner-BLAEFLjp.js";
4
+ import { join as r, relative as i, resolve as a } from "node:path";
5
+ import { Effect as o } from "effect";
6
+ import { access as s, readFile as c, writeFile as l } from "node:fs/promises";
7
+ import { StaticDeployError as u } from "@voltro/serverless";
8
+ //#region src/static/staticConfig.ts
9
+ var d = async (e) => {
10
+ try {
11
+ return await s(e), !0;
12
+ } catch {
13
+ return !1;
14
+ }
15
+ }, f = "# AUTO-GENERATED by @voltro/cli — hashed assets are immutable for a year.\n/assets/*\n Cache-Control: public, max-age=31536000, immutable\n", p = "# AUTO-GENERATED by @voltro/cli — single-page-app fallback.\n/* /index.html 200\n", m = (e, t) => o.promise(async () => {
16
+ let n = [], i = r(e, "_headers");
17
+ if (await d(i) || (await l(i, f, "utf8"), n.push("_headers")), t) {
18
+ let t = r(e, "_redirects");
19
+ await d(t) || (await l(t, p, "utf8"), n.push("_redirects"));
20
+ }
21
+ return n;
22
+ }), h = /https:\/\/[^\s'"()<>]+\.pages\.dev[^\s'"()<>]*/, g = (e) => ({
23
+ id: "cloudflare-pages",
24
+ label: "Cloudflare Pages",
25
+ deploy: (t, n) => o.gen(function* () {
26
+ let r = n.options ?? {};
27
+ yield* m(t, n.spaFallback ?? !1);
28
+ let i = [
29
+ "pages",
30
+ "deploy",
31
+ t,
32
+ ...r.projectName ? ["--project-name", r.projectName] : [],
33
+ ...r.branch ? ["--branch", r.branch] : []
34
+ ];
35
+ if (n.dryRun) return yield* o.logInfo("dry-run: would deploy to Cloudflare Pages", { command: `wrangler ${i.join(" ")}` }), {
36
+ host: "cloudflare-pages",
37
+ filesUploaded: 0,
38
+ filesSkipped: 0
39
+ };
40
+ if (!r.projectName) return yield* o.fail(new u({
41
+ host: "cloudflare-pages",
42
+ message: "missing options.projectName"
43
+ }));
44
+ let a = n.env.CLOUDFLARE_API_TOKEN, s = n.env.CLOUDFLARE_ACCOUNT_ID;
45
+ if (!a || !s) return yield* o.fail(new u({
46
+ host: "cloudflare-pages",
47
+ message: "missing CLOUDFLARE_API_TOKEN and/or CLOUDFLARE_ACCOUNT_ID"
48
+ }));
49
+ if (!(yield* e.which("wrangler"))) return yield* o.fail(new u({
50
+ host: "cloudflare-pages",
51
+ message: "`wrangler` not found on PATH (install: npm i -g wrangler)"
52
+ }));
53
+ let c = yield* e.exec("wrangler", i, { env: {
54
+ CLOUDFLARE_API_TOKEN: a,
55
+ CLOUDFLARE_ACCOUNT_ID: s
56
+ } }).pipe(o.mapError((e) => new u({
57
+ host: "cloudflare-pages",
58
+ message: `wrangler pages deploy failed (exit ${e.exitCode})`,
59
+ detail: e.stderr
60
+ }))), l = h.exec(c.stdout)?.[0];
61
+ return {
62
+ host: "cloudflare-pages",
63
+ filesUploaded: 0,
64
+ filesSkipped: 0,
65
+ ...l ? { url: l } : {}
66
+ };
67
+ })
68
+ }), _ = (e) => (e.match(/^upload:/gm) ?? []).length, v = (e) => ({
69
+ id: "s3",
70
+ label: "S3-compatible bucket (aws s3 sync)",
71
+ deploy: (t, n) => o.gen(function* () {
72
+ let r = n.options ?? {}, i = r.bucket, a = r.endpoint ? ["--endpoint-url", r.endpoint] : [], s = `s3://${i ?? "<bucket>"}`, c = [
73
+ "s3",
74
+ "sync",
75
+ t,
76
+ s,
77
+ "--delete",
78
+ "--exclude",
79
+ "*.html",
80
+ "--cache-control",
81
+ "public, max-age=31536000, immutable",
82
+ ...a
83
+ ], l = [
84
+ "s3",
85
+ "sync",
86
+ t,
87
+ s,
88
+ "--exclude",
89
+ "*",
90
+ "--include",
91
+ "*.html",
92
+ "--cache-control",
93
+ "no-cache",
94
+ "--content-type",
95
+ "text/html",
96
+ ...a
97
+ ];
98
+ if (n.dryRun) return yield* o.logInfo("dry-run: would sync to S3", {
99
+ assets: `aws ${c.join(" ")}`,
100
+ html: `aws ${l.join(" ")}`
101
+ }), n.spaFallback && (yield* o.logInfo("note: SPA fallback for a raw bucket is bucket-website / CDN config, not a _redirects file")), {
102
+ host: "s3",
103
+ filesUploaded: 0,
104
+ filesSkipped: 0
105
+ };
106
+ if (!i) return yield* o.fail(new u({
107
+ host: "s3",
108
+ message: "missing options.bucket"
109
+ }));
110
+ if (!n.env.AWS_ACCESS_KEY_ID || !n.env.AWS_SECRET_ACCESS_KEY) return yield* o.fail(new u({
111
+ host: "s3",
112
+ message: "missing AWS_ACCESS_KEY_ID and/or AWS_SECRET_ACCESS_KEY (set these to your S3 provider keys)"
113
+ }));
114
+ if (!(yield* e.which("aws"))) return yield* o.fail(new u({
115
+ host: "s3",
116
+ message: "`aws` CLI not found on PATH (install the AWS CLI v2)"
117
+ }));
118
+ let d = (t, r) => e.exec("aws", t, { env: n.env }).pipe(o.mapError((e) => new u({
119
+ host: "s3",
120
+ message: `${r} failed (exit ${e.exitCode})`,
121
+ detail: e.stderr
122
+ }))), f = yield* d(c, "aws s3 sync (assets)"), p = yield* d(l, "aws s3 sync (html)");
123
+ return {
124
+ host: "s3",
125
+ filesUploaded: _(f.stdout) + _(p.stdout),
126
+ filesSkipped: 0,
127
+ ...r.websiteUrl ? { url: r.websiteUrl } : {}
128
+ };
129
+ })
130
+ }), y = (e) => {
131
+ try {
132
+ let t = JSON.parse(e);
133
+ return t.ssl_url ?? t.url ?? t.deploy_url;
134
+ } catch {
135
+ return;
136
+ }
137
+ }, b = (e) => ({
138
+ id: "netlify",
139
+ label: "Netlify",
140
+ deploy: (t, n) => o.gen(function* () {
141
+ let r = n.options ?? {};
142
+ yield* m(t, n.spaFallback ?? !1);
143
+ let i = [
144
+ "deploy",
145
+ "--dir",
146
+ t,
147
+ "--prod",
148
+ "--no-build",
149
+ "--json",
150
+ ...r.siteId ? ["--site", r.siteId] : []
151
+ ];
152
+ if (n.dryRun) return yield* o.logInfo("dry-run: would deploy to Netlify", { command: `netlify ${i.join(" ")}` }), {
153
+ host: "netlify",
154
+ filesUploaded: 0,
155
+ filesSkipped: 0
156
+ };
157
+ if (!n.env.NETLIFY_AUTH_TOKEN) return yield* o.fail(new u({
158
+ host: "netlify",
159
+ message: "missing NETLIFY_AUTH_TOKEN"
160
+ }));
161
+ if (!(yield* e.which("netlify"))) return yield* o.fail(new u({
162
+ host: "netlify",
163
+ message: "`netlify` CLI not found on PATH (install: npm i -g netlify-cli)"
164
+ }));
165
+ let a = y((yield* e.exec("netlify", i, { env: n.env }).pipe(o.mapError((e) => new u({
166
+ host: "netlify",
167
+ message: `netlify deploy failed (exit ${e.exitCode})`,
168
+ detail: e.stderr
169
+ })))).stdout);
170
+ return {
171
+ host: "netlify",
172
+ filesUploaded: 0,
173
+ filesSkipped: 0,
174
+ ...a ? { url: a } : {}
175
+ };
176
+ })
177
+ }), x = [
178
+ "cloudflare-pages",
179
+ "s3",
180
+ "netlify"
181
+ ], S = (e) => x.includes(e), C = (e, t) => {
182
+ switch (e) {
183
+ case "cloudflare-pages": return g(t);
184
+ case "s3": return v(t);
185
+ case "netlify": return b(t);
186
+ }
187
+ }, w = (e) => o.sync(() => console.log(e)), T = (e) => o.promise(() => s(e).then(() => !0, () => !1)), E = (e, t) => {
188
+ let n = "", r = a(t, "dist"), i = t, o = !1, s = !1, c = !1, l = {}, u;
189
+ for (let d = 0; d < e.length; d++) {
190
+ let f = e[d];
191
+ switch (f) {
192
+ case "--host":
193
+ n = e[++d] ?? "";
194
+ break;
195
+ case "--dir":
196
+ r = a(t, e[++d] ?? ".");
197
+ break;
198
+ case "--app":
199
+ i = a(t, e[++d] ?? ".");
200
+ break;
201
+ case "--allow-dynamic":
202
+ o = !0;
203
+ break;
204
+ case "--dry-run":
205
+ s = !0;
206
+ break;
207
+ case "--spa":
208
+ c = !0;
209
+ break;
210
+ case "--bucket":
211
+ l.bucket = e[++d];
212
+ break;
213
+ case "--endpoint":
214
+ l.endpoint = e[++d];
215
+ break;
216
+ case "--project-name":
217
+ l.projectName = e[++d];
218
+ break;
219
+ case "--branch":
220
+ l.branch = e[++d];
221
+ break;
222
+ case "--site-id":
223
+ l.siteId = e[++d];
224
+ break;
225
+ case "--website-url":
226
+ l.websiteUrl = e[++d];
227
+ break;
228
+ default: f.startsWith("-") && (u = `unknown flag '${f}'`);
229
+ }
230
+ }
231
+ return {
232
+ host: n,
233
+ dir: r,
234
+ app: i,
235
+ allowDynamic: o,
236
+ dryRun: s,
237
+ spaFallback: c,
238
+ options: l,
239
+ error: u
240
+ };
241
+ }, D = (e, n) => o.gen(function* () {
242
+ return (yield* o.promise(() => c(r(e, ".voltro-build.json"), "utf8").then((e) => {
243
+ try {
244
+ let t = JSON.parse(e).profile;
245
+ return t && Array.isArray(t.pages) ? t : void 0;
246
+ } catch {
247
+ return;
248
+ }
249
+ }, () => void 0))) ?? (yield* t(n));
250
+ }), O = () => w([
251
+ "voltro static <hosts|deploy> [options]",
252
+ "",
253
+ " hosts list supported static hosts",
254
+ " deploy --host <id> deploy ./dist to a host",
255
+ "",
256
+ "Options:",
257
+ ` --host <id> ${x.join(" | ")}`,
258
+ " --dir <dir> static dir to deploy (default dist)",
259
+ " --app <dir> web app source root for the render-mode gate (default cwd)",
260
+ " --allow-dynamic deploy even with ssr/isr pages (they become client-rendered)",
261
+ " --spa single-page-app fallback (serve index.html)",
262
+ " --dry-run print the plan, no upload",
263
+ " --bucket <name> s3: target bucket",
264
+ " --endpoint <url> s3: non-AWS endpoint (Scaleway/R2/B2/MinIO)",
265
+ " --project-name <name> cloudflare-pages: project",
266
+ " --branch <name> cloudflare-pages: branch",
267
+ " --site-id <id> netlify: site",
268
+ " --website-url <url> s3: public URL to report"
269
+ ].join("\n")).pipe(o.as(0)), k = (e) => o.gen(function* () {
270
+ let [t, ...r] = e, a = process.cwd();
271
+ if (t === void 0 || t === "help" || t === "--help" || t === "-h") return yield* O();
272
+ if (t === "hosts") {
273
+ yield* w("Supported static hosts:");
274
+ for (let e of x) yield* w(` ${e}`);
275
+ return 0;
276
+ }
277
+ if (t !== "deploy") return yield* w(`voltro static: unknown subcommand '${t}'`), 2;
278
+ let s = E(r, a);
279
+ if (s.error) return yield* w(`voltro static: ${s.error}`), 2;
280
+ if (!S(s.host)) return yield* w(`voltro static deploy: --host must be one of ${x.join(", ")}`), 2;
281
+ if (!(yield* T(s.dir))) return yield* w(`voltro static deploy: directory not found: ${s.dir} (run \`voltro build\` first?)`), 1;
282
+ let c = yield* D(s.dir, s.app);
283
+ if (!c.staticSafe) {
284
+ if (!s.allowDynamic) return yield* w(`voltro static deploy: "${i(process.cwd(), s.app) || "."}" is NOT pure-static —`), c.counts.ssr > 0 && (yield* w(` • ${c.counts.ssr} ssr page(s): need a runtime; a CDN can't render them`)), c.counts.isr > 0 && (yield* w(` • ${c.counts.isr} isr page(s): need a runtime for revalidation`)), c.dynamicMissing.length > 0 && (yield* w(` • ${c.dynamicMissing.length} dynamic route(s) without getStaticPaths → no artifact built (missing on a CDN): ${c.dynamicMissing.join(", ")}`)), yield* w(" → Serve those on a runtime (`voltro start` / a container), OR add getStaticPaths /"), yield* w(" set the pages to `static` / `spa`. To ship anyway (ssr/isr become client-rendered), pass --allow-dynamic."), 2;
285
+ yield* w(" ⚠ --allow-dynamic: ssr/isr pages will be client-rendered only (no server first-paint).");
286
+ }
287
+ let l = C(s.host, n), u = {
288
+ env: process.env,
289
+ options: s.options,
290
+ spaFallback: s.spaFallback,
291
+ dryRun: s.dryRun
292
+ }, d = yield* l.deploy(s.dir, u).pipe(o.map((e) => ({
293
+ ok: !0,
294
+ r: e
295
+ })), o.catchAll((e) => o.succeed({
296
+ ok: !1,
297
+ message: `${e.message}${e.detail ? ` — ${String(e.detail)}` : ""}`
298
+ })));
299
+ if (!d.ok) return yield* w(` ✗ ${l.label}: ${d.message}`), 1;
300
+ let f = d.r.url ? ` → ${d.r.url}` : s.dryRun ? " (dry-run)" : "", p = s.dryRun ? "" : ` (${d.r.filesUploaded} uploaded)`;
301
+ return yield* w(` ✓ deployed ${s.dir} to ${l.label}${p}${f}`), 0;
302
+ }), A = (t) => e(k(t), { scope: "voltro:static" });
303
+ //#endregion
304
+ export { A as runStaticCommand };
@@ -0,0 +1,42 @@
1
+ import { Effect as e } from "effect";
2
+ import { resolveStorageProvider as t } from "@voltro/plugin-storage";
3
+ //#region src/storageCommand.ts
4
+ var n = (e) => {
5
+ let t = process.env[e];
6
+ return t && t.length > 0 ? t : void 0;
7
+ }, r = async () => {
8
+ let r = (n("STORAGE_PROVIDER") ?? "memory").toLowerCase(), i = n("S3_BUCKET") ?? n("STORAGE_BUCKET") ?? "voltro", a = n("VOLTRO_PUBLIC_URL") ?? n("STORAGE_CDN_URL"), o = t({}), s = !0;
9
+ console.log(`storage: provider=${o.name} bucket=${i} presign=${o.presigns ? "yes" : "no"} publicUrl=${a ? "yes" : "no"} allowedOrigins=${n("STORAGE_ALLOWED_ORIGINS") ?? "(none)"}`), r === "memory" && process.env.NODE_ENV !== "test" && (console.warn("⚠ provider=memory — uploads are IN-MEMORY and LOST on restart. Set STORAGE_PROVIDER for real storage."), s = !1), !a && !o.presigns && (console.warn("⚠ no VOLTRO_PUBLIC_URL / STORAGE_CDN_URL and this provider can't presign — serve URLs are RELATIVE and break cross-origin (<img> / AI fetches)."), s = !1);
10
+ let c = `_voltro_doctor/probe-${Date.now()}`, l = new TextEncoder().encode("voltro storage doctor probe"), u = await e.runPromise(o.put(c, l, { contentType: "text/plain" }).pipe(e.flatMap(() => o.get(c)), e.flatMap((t) => o.delete(c).pipe(e.as(t))), e.map((e) => ({ ok: new TextDecoder().decode(e.bytes) === "voltro storage doctor probe" })), e.catchAll((t) => e.succeed({
11
+ ok: !1,
12
+ error: String(t?.message ?? t)
13
+ }))));
14
+ return u.ok ? console.log("✓ read/write round-trip OK") : (console.error(`✗ read/write probe FAILED: ${"error" in u ? u.error : "unknown"}`), s = !1), console.log(s ? "✓ storage doctor: healthy" : "✗ storage doctor: issues found (see above)"), +!s;
15
+ }, i = async () => {
16
+ let e = [{
17
+ AllowedOrigins: (n("STORAGE_ALLOWED_ORIGINS") ?? "*").split(",").map((e) => e.trim()).filter(Boolean),
18
+ AllowedMethods: [
19
+ "GET",
20
+ "PUT",
21
+ "POST",
22
+ "HEAD"
23
+ ],
24
+ AllowedHeaders: ["*"],
25
+ ExposeHeaders: [
26
+ "ETag",
27
+ "Content-Type",
28
+ "Content-Length"
29
+ ],
30
+ MaxAgeSeconds: 3600
31
+ }];
32
+ return console.log("# Recommended bucket CORS (S3 / R2) for browser presigned uploads."), console.log("# Apply in your provider console, or: aws s3api put-bucket-cors --bucket <b> --cors-configuration file://cors.json"), console.log(JSON.stringify({ CORSRules: e }, null, 2)), console.log("# (The through-app upload route already sets CORS from STORAGE_ALLOWED_ORIGINS — this is only for direct-to-bucket presigned PUT.)"), 0;
33
+ }, a = async (e) => {
34
+ let t = e[0];
35
+ switch (t) {
36
+ case "doctor": return r();
37
+ case "cors": return i();
38
+ default: return console.error("usage: voltro storage <doctor|cors>"), console.error(" doctor probe the configured provider (reachable, read/write, publicUrl, memory-in-prod)"), console.error(" cors print the recommended bucket CORS for presigned browser uploads"), t === void 0 ? 1 : 2;
39
+ }
40
+ };
41
+ //#endregion
42
+ export { a as runStorageCommand };
@@ -0,0 +1,102 @@
1
+ import { dirname as e, join as t, relative as n, resolve as r } from "node:path";
2
+ import { existsSync as i, mkdirSync as a, promises as o } from "node:fs";
3
+ import { fileURLToPath as s } from "node:url";
4
+ //#region src/templates.ts
5
+ var c = e(s(import.meta.url)), l = (() => {
6
+ let n = process.env.VOLTRO_TEMPLATES_DIR;
7
+ if (n) {
8
+ let e = t(n, "apps");
9
+ if (i(e)) return e;
10
+ }
11
+ let a = r(c, "..", "templates", "apps"), o = c;
12
+ for (let n = 0; n < 12; n++) {
13
+ for (let e of ["voltro-templates", ".voltro-templates"]) {
14
+ let n = t(o, e, "apps");
15
+ if (i(n)) return n;
16
+ }
17
+ let n = e(o);
18
+ if (n === o) break;
19
+ o = n;
20
+ }
21
+ return a;
22
+ })(), u = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), d = (e) => e.replace(/([A-Z])/g, (e, t) => `-${t.toLowerCase()}`).replace(/^-/, ""), f = (e) => {
23
+ let t = u(e);
24
+ return t.length === 0 ? t : t[0].toUpperCase() + t.slice(1);
25
+ }, p = (e) => /[A-Z]/.test(e) ? d(e) : e, m = async (e) => {
26
+ let n = t(e, "template.json");
27
+ if (!i(n)) return null;
28
+ try {
29
+ let e = await o.readFile(n, "utf8"), t = JSON.parse(e);
30
+ return typeof t.id != "string" || typeof t.summary != "string" || !t.kind || t.kind !== "api" && t.kind !== "web" && t.kind !== "serverless" && t.kind !== "mobile" ? null : {
31
+ id: t.id,
32
+ kind: t.kind,
33
+ summary: t.summary,
34
+ ...t.tags ? { tags: t.tags } : {}
35
+ };
36
+ } catch {
37
+ return null;
38
+ }
39
+ }, h = async () => {
40
+ if (!i(l)) return [];
41
+ let e = await o.readdir(l, { withFileTypes: !0 }), n = [];
42
+ for (let r of e) {
43
+ if (!r.isDirectory()) continue;
44
+ let e = t(l, r.name), i = await m(e);
45
+ i && i.id === r.name && n.push({
46
+ ...i,
47
+ path: e
48
+ });
49
+ }
50
+ return n.sort((e, t) => e.id.localeCompare(t.id));
51
+ }, g = async (e) => {
52
+ if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(e)) return null;
53
+ let n = t(l, e);
54
+ if (!i(n)) return null;
55
+ let r = await m(n);
56
+ return !r || r.id !== e ? null : {
57
+ ...r,
58
+ path: n
59
+ };
60
+ }, _ = /\{\{(appNameCamel|projectNameCamel|appNamePascal|projectNamePascal|appNameSnake|projectNameSnake|capAppName|capProjectName|appName|projectName|port)\}\}/g, v = (e, t) => e.replace(_, (e, n) => t[n]), y = async (e) => {
61
+ let r = (e) => e === "node_modules" || e === ".framework" || e === "dist", i = [], a = async (s) => {
62
+ let c = await o.readdir(s, { withFileTypes: !0 });
63
+ for (let o of c) {
64
+ let c = t(s, o.name);
65
+ if (o.isDirectory()) {
66
+ r(o.name) || await a(c);
67
+ continue;
68
+ }
69
+ let l = n(e, c);
70
+ l !== "template.json" && i.push(l);
71
+ }
72
+ };
73
+ return await a(e), i;
74
+ }, b = async (n) => {
75
+ if (i(n.targetDir)) throw Error(`target directory already exists: ${n.targetDir}`);
76
+ a(n.targetDir, { recursive: !0 });
77
+ let r = await y(n.template.path), s = [];
78
+ for (let i of r) {
79
+ let r = t(n.template.path, i), c = v(i, n.vars), l = t(n.targetDir, c);
80
+ a(e(l), { recursive: !0 });
81
+ let u = v(await o.readFile(r, "utf8"), n.vars);
82
+ await o.writeFile(l, u, "utf8"), s.push(c);
83
+ }
84
+ return { written: s };
85
+ }, x = (e, t, n) => {
86
+ let r = p(e), i = p(t), a = u(r), o = u(i), s = f(r), c = f(i);
87
+ return {
88
+ appName: r,
89
+ projectName: i,
90
+ appNameCamel: a,
91
+ projectNameCamel: o,
92
+ appNamePascal: s,
93
+ projectNamePascal: c,
94
+ capAppName: s,
95
+ capProjectName: c,
96
+ appNameSnake: r.replace(/-/g, "_"),
97
+ projectNameSnake: i.replace(/-/g, "_"),
98
+ port: String(n)
99
+ };
100
+ };
101
+ //#endregion
102
+ export { b as a, p as i, g as n, h as r, x as t };
@@ -0,0 +1,115 @@
1
+ import { i as e, n as t, r as n } from "./cliArgs-D4p8n7EE.js";
2
+ import { n as r } from "./tsconfigPaths-BWXBWgcl.js";
3
+ import { join as i, resolve as a } from "node:path";
4
+ import { existsSync as o, readdirSync as s, statSync as c } from "node:fs";
5
+ import { createLogger as l } from "@voltro/logger";
6
+ import { createRequire as u } from "node:module";
7
+ //#region src/test.ts
8
+ var d = l({ scope: "voltro:test" }), f = (e) => {
9
+ try {
10
+ return c(e).isDirectory();
11
+ } catch {
12
+ return !1;
13
+ }
14
+ }, p = ["-t", "--testNamePattern"], m = (r, i = process.cwd()) => {
15
+ let o = e(r, p), s = o[0], c = s !== void 0 && f(a(i, s)) ? s : void 0, l = a(i, c ?? "."), u = c === void 0 ? o : o.slice(1), d = t(r, "-t") ?? t(r, "--testNamePattern");
16
+ return {
17
+ root: l,
18
+ filters: u,
19
+ watch: n(r, "--watch", "-w"),
20
+ passWithNoTests: u.length === 0 && d === void 0,
21
+ ...d === void 0 ? {} : { testNamePattern: d }
22
+ };
23
+ }, h = (e, t) => {
24
+ try {
25
+ let n = t(["vitest", "run"], { allowUnknownOptions: !0 }).options, r = t([
26
+ "vitest",
27
+ "run",
28
+ ...e
29
+ ], { allowUnknownOptions: !0 }).options, i = {};
30
+ for (let [e, t] of Object.entries(r)) JSON.stringify(n[e]) !== JSON.stringify(t) && (i[e] = t);
31
+ return i;
32
+ } catch (e) {
33
+ return d.warn("could not parse extra vitest flags; running without them", { reason: e?.message ?? String(e) }), {};
34
+ }
35
+ }, g = (e) => r(e).map((e) => e.wildcard ? {
36
+ find: e.prefix,
37
+ replacement: `${e.target}/`
38
+ } : {
39
+ find: RegExp(`^${e.prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`),
40
+ replacement: e.target
41
+ }), _ = "**/e2e/**/*.spec.?(c|m)[jt]s?(x)", v = (e) => [...e, _], y = (e, t = s) => {
42
+ let n = [], r = (e, a, o) => {
43
+ let s;
44
+ try {
45
+ s = t(e, { withFileTypes: !0 });
46
+ } catch {
47
+ return;
48
+ }
49
+ for (let t of s) {
50
+ let s = t.name;
51
+ if (s === "node_modules" || s === ".framework" || s === "dist" || s.startsWith(".")) continue;
52
+ let c = a === "" ? s : `${a}/${s}`;
53
+ if (t.isDirectory()) {
54
+ r(i(e, s), c, o || s === "e2e");
55
+ continue;
56
+ }
57
+ o && /\.spec\.(c|m)?[jt]sx?$/.test(s) && n.push(c);
58
+ }
59
+ };
60
+ return r(e, "", !1), n;
61
+ }, b = {
62
+ v8: "@vitest/coverage-v8",
63
+ istanbul: "@vitest/coverage-istanbul"
64
+ }, x = (e, t) => {
65
+ let r = t.coverage, i = typeof r == "object" && r ? r : void 0;
66
+ return i?.enabled === !1 || !(i?.enabled === !0 || n(e, "--coverage") || e.some((e) => e.startsWith("--coverage."))) ? void 0 : b[typeof i?.provider == "string" ? i.provider : "v8"];
67
+ }, S = (e, t = (e) => import.meta.resolve(e)) => {
68
+ let n;
69
+ try {
70
+ n = t("vitest/node");
71
+ } catch {
72
+ return !0;
73
+ }
74
+ try {
75
+ return u(n).resolve(e), !0;
76
+ } catch {
77
+ return !1;
78
+ }
79
+ }, C = async (e) => {
80
+ let t = m(e);
81
+ if (!o(t.root)) return console.error(`voltro test: no such directory: ${t.root}`), 1;
82
+ let { checkRpcGroupFreshness: n } = await import("./codegen-ChBi_hVa.js"), r = await n(t.root);
83
+ if (r.kind === "stale") return console.error(`voltro test: ${r.file} is stale — ${r.reason}.`), console.error(" The tests would run against the previously generated procedure group, pass, and prove nothing about the descriptors you just edited.\n Run `voltro codegen` (or boot `voltro dev` once) and try again."), 1;
84
+ d.info("running vitest", {
85
+ root: t.root,
86
+ ...t.filters.length > 0 ? { filters: t.filters.join(", ") } : {},
87
+ ...t.testNamePattern === void 0 ? {} : { testNamePattern: t.testNamePattern },
88
+ ...t.watch ? { watch: !0 } : {}
89
+ });
90
+ let i = await import("vitest/node"), a = h(e, i.parseCLI), s = x(e, a);
91
+ if (s !== void 0 && !S(s)) return console.error(`voltro test: \`voltro test --coverage\` needs the coverage provider \`${s}\`, which this project does not have.\n\n vitest ships coverage providers as OPTIONAL peer dependencies, so nothing\n installs one for you. Add it to the app you are testing, beside vitest:\n\n pnpm add -D ${s}\n\n npm i -D, yarn add -D and bun add -d take the same argument. Apps scaffolded\n by \`voltro create-project\` already ship it.`), 1;
92
+ let c = g(t.root), { configDefaults: l } = await import("vitest/config");
93
+ if (a.exclude === void 0) {
94
+ let e = y(t.root);
95
+ e.length > 0 && d.info(`skipped ${e.length} e2e spec(s) — \`voltro e2e\` runs those`, {
96
+ files: e.slice(0, 5).join(", ") + (e.length > 5 ? ` (+${e.length - 5})` : ""),
97
+ note: "if these are vitest tests, rename them off *.spec.* or pass your own --exclude"
98
+ });
99
+ }
100
+ let u = await i.startVitest("test", [...t.filters], {
101
+ ...a,
102
+ ...a.exclude === void 0 ? { exclude: [...v(l.exclude)] } : {},
103
+ root: t.root,
104
+ watch: t.watch,
105
+ passWithNoTests: t.passWithNoTests,
106
+ ...t.testNamePattern === void 0 ? {} : { testNamePattern: t.testNamePattern }
107
+ }, c.length > 0 ? { resolve: { alias: c } } : void 0);
108
+ if (!u) return 1;
109
+ if (t.watch) return 0;
110
+ await u.close();
111
+ let f = u.state.getFiles();
112
+ return f.length === 0 && !t.passWithNoTests ? (console.error(`voltro test: no test files matched ${t.filters.map((e) => `"${e}"`).join(", ") || "the given filter"}`), 1) : +!f.every((e) => e.result?.state !== "fail");
113
+ };
114
+ //#endregion
115
+ export { C as runTestCommand };