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