@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.
- package/CHANGELOG.md +1801 -0
- package/bin/nodeEnvironment.d.mts +30 -0
- package/bin/nodeEnvironment.mjs +158 -0
- package/bin/voltro.mjs +69 -5
- package/dist/addCommand-BNeoeSxe.js +124 -0
- package/dist/addCommand-aXSQveak.js +2 -0
- package/dist/agentsMd-BTchIZku.js +2 -0
- package/dist/agentsMd-mhQMF1bx.js +254 -0
- package/dist/apiBuild-BICVGnEC.js +2 -0
- package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DZF_f0_I.js} +46 -46
- package/dist/appPort-B_HpJ_ck.js +48 -0
- package/dist/baselineCommand-C2ClWZN3.js +2 -0
- package/dist/baselineCommand-DIttzO8A.js +227 -0
- package/dist/bin.js +71 -28
- package/dist/build-CE7Ca9gm.js +711 -0
- package/dist/cacheCommand-DA4OH9xt.js +42 -0
- package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
- package/dist/checkCommand-Dv8r9tGO.js +231 -0
- package/dist/checkCommand-YZDmkAGd.js +2 -0
- package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
- package/dist/cliError-BmdYnghb.js +10 -0
- package/dist/cliOutput-D1tSBoRM.js +15 -0
- package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
- package/dist/cloudClient-DWL-Hw_T.js +67 -0
- package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
- package/dist/clusterCmd-CNXKlcvD.js +54 -0
- package/dist/codegen-CYM3Zqrf.js +605 -0
- package/dist/codegen-ChBi_hVa.js +2 -0
- package/dist/codegenCommand-DC6w2tNZ.js +30 -0
- package/dist/codemodRunner-DRRqXR74.js +5243 -0
- package/dist/commandRunner-BLAEFLjp.js +47 -0
- package/dist/commands-gutsz-Ac.js +808 -0
- package/dist/connectionConfig-UFlIEiys.js +66 -0
- package/dist/dashboardCommand-3YG8p-UA.js +25 -0
- package/dist/dataCommand-qL0r7fPO.js +535 -0
- package/dist/dataProfile-dW-PsfLB.js +15 -0
- package/dist/{dbCommand-DTLKAfbA.js → dbCommand-B6X0FZbq.js} +551 -401
- package/dist/dbCommand-CpdKLeQq.js +2 -0
- package/dist/{dev-C_P8FLSx.js → dev-CerMd0mW.js} +3122 -3129
- package/dist/dev-CoG-ZPx8.js +3 -0
- package/dist/devActivity-Dx_3nnGv.js +100 -0
- package/dist/devActivity.js +1 -1
- package/dist/dialectDriver-CgXnDfec.js +39 -0
- package/dist/discover-C9XKJDco.js +25 -0
- package/dist/doctorCommand-BvqGBwNG.js +2 -0
- package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-CnDXQxfa.js} +520 -1278
- package/dist/dormancyCommand-Dszo57d6.js +69 -0
- package/dist/e2eCmd-BRabZww-.js +147 -0
- package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
- package/dist/envCommand-DPgdV1Bq.js +60 -0
- package/dist/evalCommand-6RUfPen4.js +118 -0
- package/dist/evolveCommand-DHpkgjgH.js +281 -0
- package/dist/fileTaxonomy-CJfgOllU.js +457 -0
- package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
- package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
- package/dist/generateCommand-oibemh97.js +147 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +4 -3
- package/dist/infoCommand-BJw9nLUR.js +60 -0
- package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
- package/dist/inspect-C_T_WGvl.js +2 -0
- package/dist/inspectCmd-Bppy-GGw.js +224 -0
- package/dist/inspectFetch-Cm8_wVvp.js +151 -0
- package/dist/inspectMetrics-CfdKLh6t.js +72 -0
- package/dist/loadEnv-D9nEOClM.js +44 -0
- package/dist/logFileSink-C_D2wRN1.js +105 -0
- package/dist/logsCmd-CCca3KRZ.js +260 -0
- package/dist/manifestBuild-ChsKAhmn.js +2 -0
- package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
- package/dist/metaCommands-7MJfZ5cf.js +196 -0
- package/dist/migrate-CBwOt_iV.js +83 -0
- package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
- package/dist/newCommand-COWOJ1_E.js +156 -0
- package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
- package/dist/packageCommand-Cug_3Ogl.js +271 -0
- package/dist/pageConvention-cEiRxdab.js +5 -0
- package/dist/privacyCommand-C-Df56U_.js +146 -0
- package/dist/projectScaffold-DmzEKHib.js +2 -0
- package/dist/projectScaffold-LMMtaavR.js +814 -0
- package/dist/renderModeScan-D7J1B7Kw.js +105 -0
- package/dist/renderProfile-1OWWAAtx.js +81 -0
- package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
- package/dist/runtimeTrace-CRxalXTs.js +91 -0
- package/dist/scheduleCmd--jksTrf6.js +69 -0
- package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
- package/dist/schemaIr-UJybUUZW.js +103 -0
- package/dist/{sdkgen-C81QIkiL.js → sdkgen-CYJscZC7.js} +111 -209
- package/dist/seedRunner-TFHHiToI.js +329 -0
- package/dist/serveCommand-B_isw7q4.js +1647 -0
- package/dist/serveCommand-DOvbgRnQ.js +2 -0
- package/dist/serveEntry.js +5 -5
- package/dist/serverlessCommand-CfJZy6dS.js +482 -0
- package/dist/start-9LiUOfES.js +1087 -0
- package/dist/start-B-9Nsp-S.js +3 -0
- package/dist/startEntry.js +2 -2
- package/dist/staticCommand-Dr2M6tpU.js +304 -0
- package/dist/storageCommand-Co6NfLqN.js +42 -0
- package/dist/templates-De8IR5-c.js +102 -0
- package/dist/test-CI6iDsYc.js +115 -0
- package/dist/tracesCmd-CkEZQrtt.js +232 -0
- package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
- package/dist/tsxLoader-EuXmSJ1K.js +51 -0
- package/dist/typecheckCommand-BlsWiCNq.js +61 -0
- package/dist/updateCommand-Bkptutss.js +585 -0
- package/dist/updateCommand-us1_hdIC.js +2 -0
- package/dist/{inspectMetrics-1xzTKAFx.js → webDev-CBYvPqQr.js} +975 -1559
- package/dist/webDev-Cg-fFiyd2.js +2 -0
- package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
- package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
- package/dist/webhooksCommand-CID96Rga.js +267 -0
- package/dist/workflowsCmd-D1VTmLMY.js +608 -0
- package/package.json +179 -17
- package/templates/AGENTS.core.md +58 -3
- package/templates/AGENTS.md +64 -7
- package/templates/agent-docs/_index.md +6 -4
- package/templates/agent-docs/_manifest.json +22 -5
- package/templates/agent-docs/ai.md +370 -0
- package/templates/agent-docs/authentication.md +265 -31
- package/templates/agent-docs/caching.md +6 -0
- package/templates/agent-docs/cli.md +794 -50
- package/templates/agent-docs/data.md +550 -11
- package/templates/agent-docs/database/migrations.md +174 -25
- package/templates/agent-docs/database/misc.md +156 -40
- package/templates/agent-docs/database/querying.md +19 -1
- package/templates/agent-docs/database/scaling.md +60 -0
- package/templates/agent-docs/database/schema.md +1 -0
- package/templates/agent-docs/database/seedsdialects.md +208 -19
- package/templates/agent-docs/database/transactions.md +68 -0
- package/templates/agent-docs/deployment.md +69 -3
- package/templates/agent-docs/introduction.md +87 -16
- package/templates/agent-docs/local-first-mobile.md +79 -4
- package/templates/agent-docs/multi-tenancy.md +95 -20
- package/templates/agent-docs/observability.md +58 -3
- package/templates/agent-docs/plugins/ai-flows.md +161 -2
- package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
- package/templates/agent-docs/plugins/audit.md +37 -1
- package/templates/agent-docs/plugins/auth-social.md +143 -0
- package/templates/agent-docs/plugins/auth-workos.md +4 -2
- package/templates/agent-docs/plugins/auth.md +131 -6
- package/templates/agent-docs/plugins/billing.md +132 -15
- package/templates/agent-docs/plugins/cdc-out.md +46 -7
- package/templates/agent-docs/plugins/clickhouse.md +1 -1
- package/templates/agent-docs/plugins/duckdb.md +1 -1
- package/templates/agent-docs/plugins/flags.md +132 -0
- package/templates/agent-docs/plugins/governance.md +105 -7
- package/templates/agent-docs/plugins/multitenancy.md +9 -4
- package/templates/agent-docs/plugins/presence.md +13 -2
- package/templates/agent-docs/plugins/ratelimit.md +9 -0
- package/templates/agent-docs/plugins/search.md +157 -6
- package/templates/agent-docs/plugins/sso-saml.md +47 -8
- package/templates/agent-docs/plugins/webhooks.md +105 -0
- package/templates/agent-docs/plugins.md +150 -18
- package/templates/agent-docs/reference.md +60 -3
- package/templates/agent-docs/releases.md +1117 -0
- package/templates/agent-docs/routing.md +43 -25
- package/templates/agent-docs/scheduling.md +10 -0
- package/templates/agent-docs/schema-driven-ui.md +92 -12
- package/templates/agent-docs/security.md +426 -0
- package/templates/agent-docs/templates/apibackends.md +87 -18
- package/templates/agent-docs/templates/appshells.md +32 -14
- package/templates/agent-docs/templates/overview.md +13 -8
- package/templates/agent-docs/testing.md +211 -14
- package/templates/agent-docs/whats-new.md +1700 -104
- package/templates/agent-docs/workflows.md +130 -14
- package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
- package/templates/apps/api-ai/package.json +8 -7
- package/templates/apps/api-auth/actions/me.action.ts +13 -0
- package/templates/apps/api-auth/package.json +9 -8
- package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend/package.json +12 -8
- package/templates/apps/api-backend/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
- package/templates/apps/api-backend-deactivation/package.json +8 -7
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mail/package.json +9 -8
- package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-mariadb/.env.example +14 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mariadb/package.json +10 -9
- package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-sqlite/.env.example +14 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-sqlite/package.json +9 -8
- package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-storage/package.json +9 -8
- package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
- package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
- package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
- package/templates/apps/api-cms/actions/me.action.ts +13 -0
- package/templates/apps/api-cms/app.config.ts +19 -0
- package/templates/apps/api-cms/authz.ts +63 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
- package/templates/apps/api-cms/package.json +11 -10
- package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
- package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
- package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
- package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
- package/templates/apps/api-collab/package.json +9 -8
- package/templates/apps/api-collab/queries/documents.query.ts +19 -7
- package/templates/apps/api-data-advanced/package.json +9 -8
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
- package/templates/apps/api-durable/package.json +9 -8
- package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
- package/templates/apps/api-feature-flags/package.json +10 -9
- package/templates/apps/api-governance/README.md +30 -8
- package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
- package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
- package/templates/apps/api-governance/database/schema.ts +16 -4
- package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
- package/templates/apps/api-governance/package.json +9 -8
- package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
- package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
- package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
- package/templates/apps/api-kv/package.json +9 -8
- package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
- package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
- package/templates/apps/api-moderation/package.json +9 -8
- package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
- package/templates/apps/api-observability/package.json +9 -8
- package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
- package/templates/apps/api-ratelimit/package.json +9 -8
- package/templates/apps/api-rbac/package.json +9 -8
- package/templates/apps/api-rest/package.json +8 -7
- package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
- package/templates/apps/api-saas/package.json +12 -11
- package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
- package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
- package/templates/apps/api-saas-starter/app.config.ts +19 -0
- package/templates/apps/api-saas-starter/authz.ts +75 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
- package/templates/apps/api-saas-starter/package.json +15 -11
- package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
- package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
- package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
- package/templates/apps/api-search/package.json +9 -8
- package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
- package/templates/apps/api-status/README.md +10 -3
- package/templates/apps/api-status/app.config.ts +8 -3
- package/templates/apps/api-status/authz.ts +5 -3
- package/templates/apps/api-status/package.json +9 -8
- package/templates/apps/api-status/queries/components.list.query.ts +14 -6
- package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
- package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
- package/templates/apps/api-status/tests/status.test.ts +9 -1
- package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
- package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
- package/templates/apps/api-versioning/package.json +9 -8
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
- package/templates/apps/api-webhooks/package.json +10 -9
- package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
- package/templates/apps/changelog/package.json +8 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +10 -8
- package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
- package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
- package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
- package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
- package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
- package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
- package/templates/apps/frontend-app/app.config.ts +4 -3
- package/templates/apps/frontend-app/package.json +11 -8
- package/templates/apps/frontend-app/src/lib/api.ts +25 -0
- package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
- package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
- package/templates/apps/frontend-auth/package.json +10 -8
- package/templates/apps/frontend-blank/package.json +9 -7
- package/templates/apps/frontend-cms/package.json +11 -9
- package/templates/apps/frontend-collab/package.json +12 -9
- package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
- package/templates/apps/frontend-contact/package.json +9 -7
- package/templates/apps/frontend-dashboard/package.json +9 -7
- package/templates/apps/frontend-docs/package.json +9 -7
- package/templates/apps/frontend-i18n/package.json +8 -6
- package/templates/apps/frontend-landing/package.json +9 -7
- package/templates/apps/frontend-portal/package.json +10 -8
- package/templates/apps/frontend-saas/app.config.ts +10 -6
- package/templates/apps/frontend-saas/package.json +10 -8
- package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
- package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
- package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
- package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
- package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
- package/templates/apps/frontend-spa/package.json +9 -7
- package/templates/apps/frontend-ssr/package.json +9 -7
- package/templates/apps/frontend-ssr-api/package.json +10 -8
- package/templates/apps/frontend-static-blog/package.json +8 -6
- package/templates/apps/frontend-status/package.json +10 -8
- package/templates/apps/mobile-app/README.md +1 -0
- package/templates/apps/mobile-app/package.json +4 -2
- package/templates/apps/mobile-app/src/app/index.tsx +22 -12
- package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
- package/templates/apps/mobile-app/src/lib/api.ts +34 -0
- package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
- package/templates/baselines/bare/.env.example +14 -0
- package/templates/baselines/bare/baseline.json +4 -4
- package/templates/baselines/compose/.env.example +14 -0
- package/templates/baselines/compose/README.md +1 -1
- package/templates/baselines/compose/baseline.json +5 -5
- package/templates/baselines/compose-mariadb/.env.example +14 -0
- package/templates/baselines/compose-mariadb/README.md +1 -1
- package/templates/baselines/compose-mariadb/baseline.json +5 -5
- package/templates/baselines/helm/.env.example +14 -0
- package/templates/baselines/helm/baseline.json +4 -4
- package/dist/apiBuild-C-x9YacA.js +0 -2
- package/dist/checkCommand-DRovTKza.js +0 -2
- package/dist/commands-CJfepbm4.js +0 -11541
- package/dist/dbCommand-b1gum4td.js +0 -2
- package/dist/dev-iiMtlkfs.js +0 -3
- package/dist/devActivity-BhIu6ncs.js +0 -159
- package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
- package/dist/inspect-mmBuRXmy.js +0 -2
- package/dist/manifestBuild-Dj8Jjoto.js +0 -2
- package/dist/seedRunner-Bqxgp7HZ.js +0 -230
- package/dist/serveCommand-DdaM4Hup.js +0 -1608
- package/dist/start-C0koT0UO.js +0 -1084
- /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
package/dist/startEntry.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./start-
|
|
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 };
|