@voltro/cli 0.28.0 → 0.30.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 +655 -0
- package/THIRD-PARTY-NOTICES.md +90 -4
- package/dist/{apiBuild-eUM32r1u.js → apiBuild-BceikpQf.js} +3 -3
- package/dist/apiBuild-CxvR1Dwt.js +2 -0
- package/dist/bin.js +3 -3
- package/dist/checkCommand-BMr-X48w.js +2427 -0
- package/dist/checkCommand-BOk9y264.js +2 -0
- package/dist/cliRuntime-Oh517vCV.js +96 -0
- package/dist/{commands-CSkrUI1h.js → commands-D4Y1-Nlu.js} +8575 -9366
- package/dist/{dbCommand-CpYgmSw4.js → dbCommand-C7hbl5pk.js} +345 -266
- package/dist/dbCommand-D8nhyppR.js +2 -0
- package/dist/{dev-DlBWWnJQ.js → dev-Cr-teYsz.js} +1 -1
- package/dist/{dev-CEZwJhmb.js → dev-DmnkH-wr.js} +2939 -1832
- package/dist/fileConventions-Cof68_BL.js +33 -0
- package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-BzAajuUv.js} +115 -99
- package/dist/frameworkTableAssembly-DU0aOxjL.js +2 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +1 -1
- package/dist/{inspect-CUCCzw2I.js → inspect-BUUjt773.js} +349 -192
- package/dist/inspect-mmBuRXmy.js +2 -0
- package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-BeJdP_3b.js} +1068 -978
- package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-BLrVuSlM.js} +1 -1
- package/dist/manifestBuild-Dj8Jjoto.js +2 -0
- package/dist/sdkgen-CqpOq_fy.js +582 -0
- package/dist/serveCommand-Ciq_wIY8.js +1577 -0
- package/dist/serveEntry.js +2 -2
- package/dist/{start-BGXIf6zT.js → start-ocqB1seX.js} +283 -270
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.core.md +50 -0
- package/templates/AGENTS.md +54 -2
- package/templates/agent-docs/_index.md +4 -2
- package/templates/agent-docs/_manifest.json +26 -5
- package/templates/agent-docs/ai.md +191 -0
- package/templates/agent-docs/cli.md +143 -6
- package/templates/agent-docs/configuration.md +32 -0
- package/templates/agent-docs/data.md +282 -0
- package/templates/agent-docs/database/migrations.md +47 -0
- package/templates/agent-docs/database/misc.md +57 -0
- package/templates/agent-docs/database/schema.md +3 -1
- package/templates/agent-docs/internationalization.md +169 -8
- package/templates/agent-docs/local-first-mobile.md +426 -0
- package/templates/agent-docs/routing.md +94 -3
- package/templates/agent-docs/schema-driven-ui.md +12 -0
- package/templates/agent-docs/security.md +17 -0
- package/templates/agent-docs/templates/apibackends.md +210 -1
- package/templates/agent-docs/templates/appshells.md +144 -1
- package/templates/agent-docs/templates/mobile.md +60 -0
- package/templates/agent-docs/templates/overview.md +17 -7
- package/templates/agent-docs/whats-new.md +238 -158
- package/templates/agent-docs/workflows.md +376 -0
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-sqlite/.env.example +19 -0
- package/templates/apps/api-backend-sqlite/README.md +38 -0
- package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
- package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-sqlite/package.json +30 -0
- package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-sqlite/template.json +6 -0
- package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/README.md +104 -0
- package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
- package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
- package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
- package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
- package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
- package/templates/apps/api-cms/actions/me.action.ts +16 -0
- package/templates/apps/api-cms/app.config.ts +61 -0
- package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
- package/templates/apps/api-cms/content/index.ts +18 -0
- package/templates/apps/api-cms/content/page.contentType.ts +24 -0
- package/templates/apps/api-cms/database/schema.ts +64 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
- package/templates/apps/api-cms/package.json +32 -0
- package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
- package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
- package/templates/apps/api-cms/template.json +6 -0
- package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
- package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
- package/templates/apps/api-cms/tsconfig.json +5 -0
- package/templates/apps/api-collab/README.md +70 -0
- package/templates/apps/api-collab/app.config.ts +28 -0
- package/templates/apps/api-collab/database/schema.ts +63 -0
- package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +19 -0
- package/templates/apps/api-collab/mutations/documents.create.mutation.ts +36 -0
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +20 -0
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +30 -0
- package/templates/apps/api-collab/package.json +30 -0
- package/templates/apps/api-collab/queries/documents.query.server.ts +16 -0
- package/templates/apps/api-collab/queries/documents.query.ts +23 -0
- package/templates/apps/api-collab/template.json +6 -0
- package/templates/apps/api-collab/tests/documents.setBody.test.ts +89 -0
- package/templates/apps/api-collab/tsconfig.json +5 -0
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-saas-starter/README.md +103 -0
- package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
- package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
- package/templates/apps/api-saas-starter/app.config.ts +87 -0
- package/templates/apps/api-saas-starter/database/schema.ts +57 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
- package/templates/apps/api-saas-starter/package.json +32 -0
- package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
- package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
- package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
- package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
- package/templates/apps/api-saas-starter/template.json +6 -0
- package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
- package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
- package/templates/apps/api-saas-starter/tsconfig.json +5 -0
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-status/README.md +88 -0
- package/templates/apps/api-status/app.config.ts +36 -0
- package/templates/apps/api-status/authz.ts +33 -0
- package/templates/apps/api-status/database/schema.ts +70 -0
- package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
- package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
- package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
- package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
- package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
- package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
- package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
- package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
- package/templates/apps/api-status/package.json +30 -0
- package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
- package/templates/apps/api-status/queries/components.list.query.ts +13 -0
- package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
- package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
- package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
- package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
- package/templates/apps/api-status/template.json +6 -0
- package/templates/apps/api-status/tests/status.test.ts +70 -0
- package/templates/apps/api-status/tsconfig.json +5 -0
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/app.config.ts +1 -1
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-admin/src/locales/index.ts +1 -1
- package/templates/apps/frontend-app/app.config.ts +1 -1
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-app/src/locales/index.ts +1 -1
- package/templates/apps/frontend-app/src/pages/layout.tsx +1 -1
- package/templates/apps/frontend-app/src/pages/page.tsx +1 -1
- package/templates/apps/frontend-auth/README.md +78 -0
- package/templates/apps/frontend-auth/app.config.ts +34 -0
- package/templates/apps/frontend-auth/package.json +32 -0
- package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
- package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
- package/templates/apps/frontend-auth/src/config.ts +11 -0
- package/templates/apps/frontend-auth/src/globals.css +105 -0
- package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
- package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
- package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
- package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
- package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
- package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
- package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
- package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
- package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
- package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
- package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
- package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
- package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
- package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
- package/templates/apps/frontend-auth/template.json +6 -0
- package/templates/apps/frontend-auth/tsconfig.json +5 -0
- package/templates/apps/frontend-blank/app.config.ts +1 -1
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-blank/src/locales/index.ts +1 -1
- package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -1
- package/templates/apps/frontend-blank/src/pages/page.tsx +1 -1
- package/templates/apps/frontend-cms/README.md +47 -0
- package/templates/apps/frontend-cms/app.config.ts +37 -0
- package/templates/apps/frontend-cms/package.json +33 -0
- package/templates/apps/frontend-cms/src/config.ts +8 -0
- package/templates/apps/frontend-cms/src/globals.css +105 -0
- package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
- package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
- package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
- package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
- package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
- package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
- package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
- package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
- package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
- package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
- package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
- package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
- package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
- package/templates/apps/frontend-cms/template.json +6 -0
- package/templates/apps/frontend-cms/tsconfig.json +5 -0
- package/templates/apps/frontend-collab/README.md +80 -0
- package/templates/apps/frontend-collab/app.config.ts +38 -0
- package/templates/apps/frontend-collab/package.json +33 -0
- package/templates/apps/frontend-collab/src/locales/de.ts +29 -0
- package/templates/apps/frontend-collab/src/locales/en.ts +31 -0
- package/templates/apps/frontend-collab/src/locales/index.ts +15 -0
- package/templates/apps/frontend-collab/src/pages/layout.tsx +39 -0
- package/templates/apps/frontend-collab/src/pages/page.test.tsx +150 -0
- package/templates/apps/frontend-collab/src/pages/page.tsx +186 -0
- package/templates/apps/frontend-collab/template.json +6 -0
- package/templates/apps/frontend-collab/tsconfig.json +11 -0
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/app.config.ts +1 -1
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-dashboard/src/locales/index.ts +1 -1
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-portal/README.md +71 -0
- package/templates/apps/frontend-portal/app.config.ts +37 -0
- package/templates/apps/frontend-portal/package.json +32 -0
- package/templates/apps/frontend-portal/src/config.ts +8 -0
- package/templates/apps/frontend-portal/src/globals.css +93 -0
- package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
- package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
- package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
- package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
- package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
- package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
- package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
- package/templates/apps/frontend-portal/template.json +6 -0
- package/templates/apps/frontend-portal/tsconfig.json +5 -0
- package/templates/apps/frontend-saas/README.md +73 -0
- package/templates/apps/frontend-saas/app.config.ts +46 -0
- package/templates/apps/frontend-saas/package.json +32 -0
- package/templates/apps/frontend-saas/src/config.ts +8 -0
- package/templates/apps/frontend-saas/src/globals.css +85 -0
- package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
- package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
- package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
- package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
- package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
- package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-saas/template.json +6 -0
- package/templates/apps/frontend-saas/tsconfig.json +5 -0
- package/templates/apps/frontend-spa/app.config.ts +1 -1
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-spa/src/locales/index.ts +1 -1
- package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -1
- package/templates/apps/frontend-spa/src/pages/page.tsx +1 -1
- package/templates/apps/frontend-ssr/app.config.ts +1 -1
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr/src/locales/index.ts +1 -1
- package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -1
- package/templates/apps/frontend-ssr/src/pages/page.tsx +1 -1
- package/templates/apps/frontend-ssr-api/app.config.ts +1 -1
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-ssr-api/src/locales/index.ts +1 -1
- package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -1
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/templates/apps/frontend-status/README.md +51 -0
- package/templates/apps/frontend-status/app.config.ts +39 -0
- package/templates/apps/frontend-status/package.json +32 -0
- package/templates/apps/frontend-status/src/config.ts +7 -0
- package/templates/apps/frontend-status/src/globals.css +70 -0
- package/templates/apps/frontend-status/src/globals.d.ts +6 -0
- package/templates/apps/frontend-status/src/lib/status.ts +81 -0
- package/templates/apps/frontend-status/src/locales/de.ts +41 -0
- package/templates/apps/frontend-status/src/locales/en.ts +45 -0
- package/templates/apps/frontend-status/src/locales/index.ts +13 -0
- package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
- package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
- package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
- package/templates/apps/frontend-status/template.json +6 -0
- package/templates/apps/frontend-status/tsconfig.json +11 -0
- package/templates/apps/mobile-app/README.md +58 -0
- package/templates/apps/mobile-app/app.config.ts +33 -0
- package/templates/apps/mobile-app/babel.config.js +5 -0
- package/templates/apps/mobile-app/metro.config.js +20 -0
- package/templates/apps/mobile-app/package.json +33 -0
- package/templates/apps/mobile-app/src/app/_layout.tsx +61 -0
- package/templates/apps/mobile-app/src/app/index.tsx +62 -0
- package/templates/apps/mobile-app/src/app/orders/[id].tsx +19 -0
- package/templates/apps/mobile-app/src/app/settings.tsx +51 -0
- package/templates/apps/mobile-app/src/client.ts +74 -0
- package/templates/apps/mobile-app/src/lib/deeplinks.ts +39 -0
- package/templates/apps/mobile-app/src/lib/notifications.ts +31 -0
- package/templates/apps/mobile-app/src/lib/sync.ts +29 -0
- package/templates/apps/mobile-app/src/persistence.ts +38 -0
- package/templates/apps/mobile-app/template.json +6 -0
- package/templates/apps/mobile-app/tests/deeplinks.test.ts +32 -0
- package/templates/apps/mobile-app/tests/notifications.test.ts +26 -0
- package/templates/apps/mobile-app/tests/sync.test.ts +34 -0
- package/templates/apps/mobile-app/tsconfig.json +10 -0
- package/templates/apps/mobile-app/voltro.mobile.ts +11 -0
- package/templates/baselines/compose/docker-compose.prod.yml +15 -0
- package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
- package/templates/patches/@effect__cluster@0.60.0.patch +6 -6
- package/dist/apiBuild-DgBS9ayv.js +0 -2
- package/dist/dbCommand-DvguqlzF.js +0 -2
- package/dist/fileConventions-3bffWssN.js +0 -30
- package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
- package/dist/inspect-gt8bq-Tz.js +0 -2
- package/dist/manifestBuild-ifczArzr.js +0 -2
- package/dist/serveCommand-ZTn-dPFa.js +0 -1425
|
@@ -1,153 +1,65 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"code",
|
|
24
|
-
"detail",
|
|
25
|
-
"hint",
|
|
26
|
-
"position",
|
|
27
|
-
"internalPosition",
|
|
28
|
-
"internalQuery",
|
|
29
|
-
"where",
|
|
30
|
-
"schema",
|
|
31
|
-
"table",
|
|
32
|
-
"column",
|
|
33
|
-
"dataType",
|
|
34
|
-
"constraint",
|
|
35
|
-
"file",
|
|
36
|
-
"line",
|
|
37
|
-
"routine"
|
|
38
|
-
], xe = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
|
|
39
|
-
if (t > 10 || typeof e != "object" || !e || n.has(e)) return null;
|
|
40
|
-
n.add(e);
|
|
41
|
-
let r = e, i = r.message;
|
|
42
|
-
if (typeof i == "string" && i.length > 0 && i !== "Failed to execute statement") {
|
|
43
|
-
let e = { message: i };
|
|
44
|
-
typeof r.stack == "string" && (e.stack = r.stack);
|
|
45
|
-
for (let t of be) r[t] !== void 0 && (e[t] = r[t]);
|
|
46
|
-
return e;
|
|
47
|
-
}
|
|
48
|
-
for (let e of [
|
|
49
|
-
"cause",
|
|
50
|
-
"defect",
|
|
51
|
-
"left",
|
|
52
|
-
"right",
|
|
53
|
-
"failure",
|
|
54
|
-
"failures"
|
|
55
|
-
]) {
|
|
56
|
-
let i = r[e];
|
|
57
|
-
if (i !== void 0) {
|
|
58
|
-
let e = xe(i, t + 1, n);
|
|
59
|
-
if (e) return e;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (Array.isArray(r.failures)) for (let e of r.failures) {
|
|
63
|
-
let r = xe(e, t + 1, n);
|
|
64
|
-
if (r) return r;
|
|
65
|
-
}
|
|
66
|
-
return null;
|
|
67
|
-
}, V = (e) => ({
|
|
68
|
-
...e.scope ? { defaultScope: e.scope } : {},
|
|
69
|
-
...e.logger
|
|
70
|
-
}), Se = (e = {}) => S.merge(v.layer, C(V(e))), H = async (e, t = {}) => {
|
|
71
|
-
let n = e.pipe(x.provide(v.layer));
|
|
72
|
-
return await x.runPromise(x.matchCauseEffect(n, {
|
|
73
|
-
onSuccess: (e) => x.succeed(e),
|
|
74
|
-
onFailure: (e) => {
|
|
75
|
-
let t = [...b.defects(e)];
|
|
76
|
-
if (process.env.VOLTRO_CAUSE_DEBUG === "1") for (let [e, n] of t.entries()) {
|
|
77
|
-
let t = Object.getOwnPropertyNames(n);
|
|
78
|
-
process.stderr.write(`[VOLTRO_CAUSE_DEBUG] defect[${e}] ctor=${n?.constructor?.name} props=${JSON.stringify(t)}\n`);
|
|
79
|
-
let r = n;
|
|
80
|
-
if (r.message && process.stderr.write(` message: ${String(r.message)}\n`), r.cause) {
|
|
81
|
-
let e = r.cause;
|
|
82
|
-
process.stderr.write(` cause.ctor=${e.constructor?.name} cause.message=${String(e.message)} cause.code=${String(e.code)}\n`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
let n = null;
|
|
86
|
-
for (let e of t) {
|
|
87
|
-
let t = xe(e);
|
|
88
|
-
if (t) {
|
|
89
|
-
n = t;
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
let r = n ? {
|
|
94
|
-
pgMessage: n.message,
|
|
95
|
-
...n.code ? { pgCode: n.code } : {},
|
|
96
|
-
...n.detail ? { pgDetail: n.detail } : {},
|
|
97
|
-
...n.hint ? { pgHint: n.hint } : {},
|
|
98
|
-
...n.table ? { pgTable: n.table } : {},
|
|
99
|
-
...n.column ? { pgColumn: n.column } : {},
|
|
100
|
-
...n.constraint ? { pgConstraint: n.constraint } : {},
|
|
101
|
-
...n.routine ? { pgRoutine: n.routine } : {},
|
|
102
|
-
causePretty: b.pretty(e)
|
|
103
|
-
} : { causePretty: b.pretty(e) };
|
|
104
|
-
return x.zipRight(x.logError("cli command failed", r), x.succeed(1));
|
|
105
|
-
}
|
|
106
|
-
}).pipe(x.provide(C(V(t)))));
|
|
107
|
-
}, Ce = (e, t = {}) => {
|
|
108
|
-
let n = e.pipe(x.provide(Se(t)));
|
|
109
|
-
y.runMain(n, { disableErrorReporting: !1 });
|
|
110
|
-
}, U = u(h(import.meta.url)), we = [m(U, "..", "templates"), m(U, "..", "..", "templates")], Te = (e) => ({
|
|
1
|
+
import { t as e } from "./cliRuntime-Oh517vCV.js";
|
|
2
|
+
import { T as t, h as n, m as r } from "./fileConventions-Cof68_BL.js";
|
|
3
|
+
import { A as i, E as a, O as o, a as s, k as c, m as l } from "./inspect-BUUjt773.js";
|
|
4
|
+
import { basename as u, dirname as d, isAbsolute as f, join as p, relative as m, resolve as h } from "node:path";
|
|
5
|
+
import { fileURLToPath as g, pathToFileURL as _ } from "node:url";
|
|
6
|
+
import { FileSystem as v } from "@effect/platform";
|
|
7
|
+
import { NodeContext as y } from "@effect/platform-node";
|
|
8
|
+
import { Effect as b } from "effect";
|
|
9
|
+
import { addSink as x, createLogger as S, printReadyBlock as C } from "@voltro/logger";
|
|
10
|
+
import { closeSync as w, existsSync as T, mkdirSync as E, openSync as D, promises as O, readFileSync as ee, readdirSync as te, statSync as k, unlinkSync as A, unwatchFile as ne, watchFile as re, writeSync as j } from "node:fs";
|
|
11
|
+
import { currentTraceContext as M, recordSample as ie, resolveSecret as N } from "@voltro/runtime";
|
|
12
|
+
import { homedir as P } from "node:os";
|
|
13
|
+
import { createRequire as F } from "node:module";
|
|
14
|
+
import { FRAMEWORK_ENV_CATALOG as ae, appEnvEntries as I, checkEnvNaming as L, formatEnvErrors as R, installEnvSnapshot as oe, isEnvContract as z, pluginEnvEntries as se, renderDotEnvExample as B, resolveEnv as ce } from "@voltro/env";
|
|
15
|
+
import { __installPublicEnv as le } from "@voltro/env/public";
|
|
16
|
+
import { mkdir as V, readFile as ue, writeFile as de } from "node:fs/promises";
|
|
17
|
+
import { createHash as fe } from "node:crypto";
|
|
18
|
+
import { spawn as pe } from "node:child_process";
|
|
19
|
+
import { createConnection as me } from "node:net";
|
|
20
|
+
import { PassThrough as he } from "node:stream";
|
|
21
|
+
//#region src/agentsMd.ts
|
|
22
|
+
var H = d(g(import.meta.url)), U = [h(H, "..", "templates"), h(H, "..", "..", "templates")], ge = (e) => ({
|
|
111
23
|
_tag: "TemplateNotFoundError",
|
|
112
24
|
searched: e
|
|
113
|
-
}),
|
|
25
|
+
}), W = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", ve = 2048, G = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), ye = (e, t) => e.readFileString(t).pipe(b.map((e) => {
|
|
114
26
|
try {
|
|
115
27
|
return JSON.parse(e).workspaces !== void 0;
|
|
116
28
|
} catch {
|
|
117
29
|
return !1;
|
|
118
30
|
}
|
|
119
|
-
}),
|
|
120
|
-
let t = yield*
|
|
31
|
+
}), b.orElseSucceed(() => !1)), J = (e) => b.gen(function* () {
|
|
32
|
+
let t = yield* v.FileSystem, n = h(e);
|
|
121
33
|
for (;;) {
|
|
122
|
-
if ((yield*
|
|
123
|
-
let r =
|
|
124
|
-
if (r === n) return
|
|
34
|
+
if ((yield* K(t, p(n, ".git"))) || (yield* K(t, p(n, "pnpm-workspace.yaml"))) || (yield* ye(t, p(n, "package.json")))) return n;
|
|
35
|
+
let r = d(n);
|
|
36
|
+
if (r === n) return h(e);
|
|
125
37
|
n = r;
|
|
126
38
|
}
|
|
127
|
-
}),
|
|
128
|
-
yield* e.makeDirectory(n, { recursive: !0 }).pipe(
|
|
129
|
-
let r = yield* e.readDirectory(t).pipe(
|
|
39
|
+
}), be = (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(() => []));
|
|
130
42
|
for (let i of r) {
|
|
131
|
-
let r =
|
|
132
|
-
(yield* e.stat(r).pipe(
|
|
133
|
-
}
|
|
134
|
-
}),
|
|
135
|
-
let n =
|
|
136
|
-
if (!(yield*
|
|
137
|
-
let r = (yield*
|
|
138
|
-
return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(
|
|
139
|
-
}),
|
|
140
|
-
let n = [], r = [], i =
|
|
141
|
-
if (!(yield*
|
|
43
|
+
let r = p(t, i), a = p(n, i);
|
|
44
|
+
(yield* e.stat(r).pipe(b.orElseSucceed(() => null)))?.type === "Directory" ? yield* be(e, r, a) : yield* e.copyFile(r, a).pipe(b.orElseSucceed(() => void 0));
|
|
45
|
+
}
|
|
46
|
+
}), xe = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Se = (e, t) => b.gen(function* () {
|
|
47
|
+
let n = p(t, "app.config.ts");
|
|
48
|
+
if (!(yield* K(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(xe).filter((e) => e !== null);
|
|
51
|
+
}), Ce = (e, t) => b.gen(function* () {
|
|
52
|
+
let n = [], r = [], i = p(t, "apps");
|
|
53
|
+
if (!(yield* K(e, i))) return {
|
|
142
54
|
apis: n,
|
|
143
55
|
webs: r
|
|
144
56
|
};
|
|
145
|
-
for (let t of yield* e.readDirectory(i).pipe(
|
|
146
|
-
let a =
|
|
147
|
-
if ((yield* e.stat(a).pipe(
|
|
148
|
-
let i =
|
|
149
|
-
if (!(yield*
|
|
150
|
-
let s = yield*
|
|
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* K(e, o))) continue;
|
|
62
|
+
let s = yield* q(e, o);
|
|
151
63
|
/type:\s*['"]web['"]/.test(s) ? r.push(i) : n.push(i);
|
|
152
64
|
}
|
|
153
65
|
}
|
|
@@ -155,7 +67,7 @@ var be = [
|
|
|
155
67
|
apis: n,
|
|
156
68
|
webs: r
|
|
157
69
|
};
|
|
158
|
-
}),
|
|
70
|
+
}), we = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Te = (e, t, n) => {
|
|
159
71
|
let r = [
|
|
160
72
|
"<!-- voltro agent-docs index — regenerated at seed time -->",
|
|
161
73
|
"## Deep reference (read on demand)",
|
|
@@ -167,17 +79,17 @@ var be = [
|
|
|
167
79
|
"",
|
|
168
80
|
"| Topic | Open | Summary |",
|
|
169
81
|
"|---|---|---|",
|
|
170
|
-
...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${
|
|
82
|
+
...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${we(e.description)} |`),
|
|
171
83
|
""
|
|
172
|
-
], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${
|
|
84
|
+
], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${we(e.description)} |`) : t.map((e) => {
|
|
173
85
|
let t = i.get(e);
|
|
174
|
-
return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${
|
|
86
|
+
return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${we(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
|
|
175
87
|
});
|
|
176
88
|
return r.push(`### Plugins${t === null ? "" : " (installed)"}`, "", "| Plugin | Open | Summary |", "|---|---|---|"), r.push(a.length ? a.join("\n") : "| _(none installed)_ | | |", ""), r.join("\n");
|
|
177
|
-
},
|
|
89
|
+
}, Ee = (e, t, n) => {
|
|
178
90
|
let r = t.templates?.[e] ?? t.templates?.[e.replace(/^frontend-/, "")];
|
|
179
91
|
return `\nScaffolded from the \`${e}\` template — see \`${r ? `${n}${r}` : `${n}agent-docs/templates/overview.md`}\`.\n`;
|
|
180
|
-
},
|
|
92
|
+
}, De = {
|
|
181
93
|
api: (e, t, n = "") => `# api — agent notes
|
|
182
94
|
|
|
183
95
|
You are in a Voltro **api** app. Server primitives live here: \`queries/\`,
|
|
@@ -217,7 +129,7 @@ You are in a Voltro **web** app. File-based routing under \`src/pages/**\`.
|
|
|
217
129
|
Deep reference (paths from the repo root): \`${e}agent-docs/routing.md\`,
|
|
218
130
|
\`${e}agent-docs/schema-driven-ui.md\`, \`${e}agent-docs/internationalization.md\`.
|
|
219
131
|
${t}`
|
|
220
|
-
},
|
|
132
|
+
}, Oe = [
|
|
221
133
|
{
|
|
222
134
|
name: "voltro-schema",
|
|
223
135
|
description: "Define or change a Voltro database table/schema (columns, mixins, indexes, relations).",
|
|
@@ -248,7 +160,7 @@ ${t}`
|
|
|
248
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.",
|
|
249
161
|
module: "cli.md"
|
|
250
162
|
}
|
|
251
|
-
],
|
|
163
|
+
], ke = (e, t) => `---
|
|
252
164
|
name: ${e.name}
|
|
253
165
|
description: ${e.description}
|
|
254
166
|
---
|
|
@@ -259,10 +171,10 @@ Open the full reference and follow the patterns there:
|
|
|
259
171
|
|
|
260
172
|
Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
|
|
261
173
|
boundary, naming, anti-patterns) before editing.
|
|
262
|
-
`,
|
|
263
|
-
let i = yield*
|
|
174
|
+
`, Ae = (e, t, n, r) => b.gen(function* () {
|
|
175
|
+
let i = yield* K(e, t);
|
|
264
176
|
if (i) {
|
|
265
|
-
if ((yield*
|
|
177
|
+
if ((yield* q(e, t)).slice(0, ve).includes("voltro:agents-md:keep")) return {
|
|
266
178
|
path: t,
|
|
267
179
|
action: "protected"
|
|
268
180
|
};
|
|
@@ -271,71 +183,71 @@ boundary, naming, anti-patterns) before editing.
|
|
|
271
183
|
action: "present"
|
|
272
184
|
};
|
|
273
185
|
}
|
|
274
|
-
return yield* e.makeDirectory(
|
|
186
|
+
return yield* e.makeDirectory(d(t), { recursive: !0 }).pipe(b.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(b.orDie), {
|
|
275
187
|
path: t,
|
|
276
188
|
action: i ? "overwritten" : "created"
|
|
277
189
|
};
|
|
278
|
-
}),
|
|
279
|
-
let n = yield*
|
|
280
|
-
for (let e of
|
|
190
|
+
}), je = (e, t = {}) => b.gen(function* () {
|
|
191
|
+
let n = yield* v.FileSystem, r = yield* J(e), i = null;
|
|
192
|
+
for (let e of U) if (yield* K(n, p(e, "AGENTS.core.md"))) {
|
|
281
193
|
i = e;
|
|
282
194
|
break;
|
|
283
195
|
}
|
|
284
196
|
if (i === null) {
|
|
285
|
-
for (let e of
|
|
286
|
-
let i = yield*
|
|
287
|
-
for (let e of
|
|
197
|
+
for (let e of U) if (yield* K(n, p(e, "AGENTS.md"))) {
|
|
198
|
+
let i = yield* q(n, p(e, "AGENTS.md")), a = [];
|
|
199
|
+
for (let e of W) a.push(yield* Ae(n, p(r, e), i, t.force ?? !1));
|
|
288
200
|
return { files: a };
|
|
289
201
|
}
|
|
290
|
-
return yield*
|
|
202
|
+
return yield* b.fail(ge(U.map((e) => p(e, "AGENTS.core.md"))));
|
|
291
203
|
}
|
|
292
|
-
let a = yield*
|
|
204
|
+
let a = yield* q(n, p(i, "AGENTS.core.md")), o = yield* q(n, p(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
|
|
293
205
|
modules: [],
|
|
294
206
|
plugins: []
|
|
295
|
-
}, c = (t.preferPointer ?? !1) || (yield*
|
|
296
|
-
if ((yield*
|
|
207
|
+
}, c = (t.preferPointer ?? !1) || (yield* K(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) => q(n, e).pipe(b.map((e) => e.slice(0, ve))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
|
|
297
209
|
path: e,
|
|
298
210
|
action: "protected"
|
|
299
211
|
})) };
|
|
300
|
-
let { apis:
|
|
301
|
-
for (let e of
|
|
302
|
-
let t = yield*
|
|
212
|
+
let { apis: f, webs: m } = yield* Ce(n, r), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), y = !1;
|
|
213
|
+
for (let e of f) {
|
|
214
|
+
let t = yield* Se(n, e);
|
|
303
215
|
if (g.set(e, t), t !== null) {
|
|
304
216
|
y = !0;
|
|
305
|
-
for (let e of t)
|
|
217
|
+
for (let e of t) _.add(e);
|
|
306
218
|
}
|
|
307
219
|
}
|
|
308
|
-
let
|
|
309
|
-
for (let e of d) C.push(yield*
|
|
310
|
-
c || (yield*
|
|
311
|
-
let w = new Map((t.appTemplates ?? []).map((e) => [
|
|
312
|
-
let t = w.get(
|
|
313
|
-
return t ?
|
|
314
|
-
}, E = (e, t) =>
|
|
315
|
-
for (let e of
|
|
316
|
-
for (let e of
|
|
317
|
-
for (let e of
|
|
220
|
+
let x = t.plugins ? t.plugins.map(xe).filter((e) => e !== null) : y ? [..._] : null, S = a.includes(G) ? a.replace(G, Te(s, x, l)) : a, C = [];
|
|
221
|
+
for (let e of d) C.push(yield* Ae(n, e, S, u));
|
|
222
|
+
c || (yield* be(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 ? Ee(t, s, l) : "";
|
|
226
|
+
}, E = (e, t) => b.forEach(W, (r) => Ae(n, p(e, r), t, u));
|
|
227
|
+
for (let e of f) C.push(...yield* E(e, De.api(l, g.get(e) ?? null, T(e)))), (yield* K(n, p(e, "database"))) && C.push(...yield* E(p(e, "database"), De.database(l)));
|
|
228
|
+
for (let e of m) C.push(...yield* E(e, De.web(l, T(e))));
|
|
229
|
+
for (let e of Oe) C.push(yield* Ae(n, p(r, ".claude", "skills", e.name, "SKILL.md"), ke(e, l), u));
|
|
318
230
|
return { files: C };
|
|
319
|
-
}),
|
|
320
|
-
let
|
|
321
|
-
return
|
|
322
|
-
let e = yield*
|
|
231
|
+
}), Me = (e, t = {}) => b.runPromise(je(e, t).pipe(b.provide(y.layer))), Ne = 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* je(r, { force: n });
|
|
323
235
|
for (let t of e.files) {
|
|
324
|
-
let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${
|
|
325
|
-
yield*
|
|
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 });
|
|
326
238
|
}
|
|
327
239
|
return 0;
|
|
328
|
-
}).pipe(
|
|
329
|
-
return yield*
|
|
240
|
+
}).pipe(b.catchTag("TemplateNotFoundError", (e) => b.gen(function* () {
|
|
241
|
+
return yield* b.logError("AGENTS.md template not found", { searched: e.searched }), 1;
|
|
330
242
|
}))), { scope: "voltro:agents-md" });
|
|
331
|
-
},
|
|
243
|
+
}, Pe = p(P(), ".voltro"), Fe = p(Pe, "runtime-registry.json"), Ie = 3e4, Le = () => {
|
|
332
244
|
let e = Math.random().toString(36).slice(2, 10);
|
|
333
|
-
return `${
|
|
334
|
-
},
|
|
335
|
-
await
|
|
336
|
-
},
|
|
245
|
+
return `${Fe}.${process.pid}.${Date.now()}.${e}.tmp`;
|
|
246
|
+
}, Re = async () => {
|
|
247
|
+
await O.mkdir(Pe, { recursive: !0 });
|
|
248
|
+
}, ze = async () => {
|
|
337
249
|
try {
|
|
338
|
-
let e = await
|
|
250
|
+
let e = await O.readFile(Fe, "utf8"), t = JSON.parse(e);
|
|
339
251
|
return t.version !== 1 || !Array.isArray(t.apps) ? {
|
|
340
252
|
version: 1,
|
|
341
253
|
apps: []
|
|
@@ -346,34 +258,34 @@ boundary, naming, anti-patterns) before editing.
|
|
|
346
258
|
apps: []
|
|
347
259
|
};
|
|
348
260
|
}
|
|
349
|
-
},
|
|
350
|
-
await
|
|
351
|
-
let t =
|
|
261
|
+
}, Be = async (e) => {
|
|
262
|
+
await Re();
|
|
263
|
+
let t = Le();
|
|
352
264
|
try {
|
|
353
|
-
await
|
|
265
|
+
await O.writeFile(t, JSON.stringify(e, null, 2), {
|
|
354
266
|
encoding: "utf8",
|
|
355
267
|
mode: 384
|
|
356
|
-
}), await
|
|
268
|
+
}), await O.rename(t, Fe), await O.chmod(Fe, 384).catch(() => {});
|
|
357
269
|
} catch (e) {
|
|
358
270
|
try {
|
|
359
|
-
await
|
|
271
|
+
await O.unlink(t);
|
|
360
272
|
} catch {}
|
|
361
273
|
throw e;
|
|
362
274
|
}
|
|
363
|
-
},
|
|
275
|
+
}, Ve = (e) => {
|
|
364
276
|
try {
|
|
365
277
|
return process.kill(e, 0), !0;
|
|
366
278
|
} catch {
|
|
367
279
|
return !1;
|
|
368
280
|
}
|
|
369
|
-
},
|
|
281
|
+
}, He = (e) => {
|
|
370
282
|
let t = Date.now();
|
|
371
|
-
return e.filter((e) =>
|
|
372
|
-
},
|
|
373
|
-
let e = await
|
|
283
|
+
return e.filter((e) => Ve(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Ie : !1);
|
|
284
|
+
}, Ue = async () => {
|
|
285
|
+
let e = await ze(), t = He(e.apps);
|
|
374
286
|
if (t.length === e.apps.length) return e;
|
|
375
287
|
try {
|
|
376
|
-
await
|
|
288
|
+
await Be({
|
|
377
289
|
version: 1,
|
|
378
290
|
apps: t
|
|
379
291
|
});
|
|
@@ -382,31 +294,31 @@ boundary, naming, anti-patterns) before editing.
|
|
|
382
294
|
version: 1,
|
|
383
295
|
apps: t
|
|
384
296
|
};
|
|
385
|
-
},
|
|
386
|
-
let t = await
|
|
297
|
+
}, We = async (e) => {
|
|
298
|
+
let t = await ze(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
|
|
387
299
|
...e,
|
|
388
300
|
...i !== void 0 && i !== "" ? { inspectToken: i } : {},
|
|
389
301
|
registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
|
|
390
302
|
heartbeatAt: n
|
|
391
303
|
};
|
|
392
|
-
await
|
|
304
|
+
await Be({
|
|
393
305
|
version: 1,
|
|
394
306
|
apps: r >= 0 ? t.apps.map((e, t) => t === r ? a : e) : [...t.apps, a]
|
|
395
307
|
});
|
|
396
|
-
},
|
|
308
|
+
}, Ge = async (e) => {
|
|
397
309
|
try {
|
|
398
|
-
let t = await
|
|
310
|
+
let t = await ze(), n = t.apps.filter((t) => t.id !== e);
|
|
399
311
|
if (n.length === t.apps.length) return;
|
|
400
|
-
await
|
|
312
|
+
await Be({
|
|
401
313
|
version: 1,
|
|
402
314
|
apps: n
|
|
403
315
|
});
|
|
404
316
|
} catch {}
|
|
405
|
-
},
|
|
317
|
+
}, Ke = (e, t, n) => `${e}:${t}:${n}`, qe = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Je = (e) => {
|
|
406
318
|
try {
|
|
407
|
-
let t =
|
|
408
|
-
if (!
|
|
409
|
-
let n = JSON.parse(
|
|
319
|
+
let t = p(e, "tsconfig.json");
|
|
320
|
+
if (!T(t)) return [];
|
|
321
|
+
let n = JSON.parse(qe(ee(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = h(e, n.baseUrl ?? "."), a = [];
|
|
410
322
|
for (let [e, t] of Object.entries(r)) {
|
|
411
323
|
let n = t[0];
|
|
412
324
|
if (!n) continue;
|
|
@@ -415,28 +327,28 @@ boundary, naming, anti-patterns) before editing.
|
|
|
415
327
|
let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
416
328
|
a.push({
|
|
417
329
|
find: RegExp(`^${t}/(.*)$`),
|
|
418
|
-
replacement: `${
|
|
330
|
+
replacement: `${p(i, n.slice(0, -2))}/$1`
|
|
419
331
|
});
|
|
420
332
|
} else a.push({
|
|
421
333
|
find: e,
|
|
422
|
-
replacement:
|
|
334
|
+
replacement: p(i, n)
|
|
423
335
|
});
|
|
424
336
|
}
|
|
425
337
|
return a;
|
|
426
338
|
} catch {
|
|
427
339
|
return [];
|
|
428
340
|
}
|
|
429
|
-
},
|
|
341
|
+
}, Ye = (e) => {
|
|
430
342
|
let t = e;
|
|
431
343
|
return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
|
|
432
|
-
},
|
|
344
|
+
}, Xe = async (e, t) => {
|
|
433
345
|
try {
|
|
434
346
|
return await t();
|
|
435
347
|
} catch (t) {
|
|
436
|
-
throw
|
|
348
|
+
throw Ye(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;
|
|
437
349
|
}
|
|
438
|
-
},
|
|
439
|
-
let n =
|
|
350
|
+
}, Ze = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", Qe = (e, t) => t ? `${e} | undefined` : e, $e = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${Qe(t.tsType, t.optional)}`).join("\n"), et = async (e, t) => {
|
|
351
|
+
let n = $e(t, () => !0), r = `${Ze}
|
|
440
352
|
import '@voltro/env/server'
|
|
441
353
|
|
|
442
354
|
declare module '@voltro/env/server' {
|
|
@@ -445,9 +357,9 @@ ${n.length > 0 ? n : " // (no variables declared)"}
|
|
|
445
357
|
}
|
|
446
358
|
}
|
|
447
359
|
`;
|
|
448
|
-
await
|
|
449
|
-
},
|
|
450
|
-
let n =
|
|
360
|
+
await de(p(e, "env.generated.d.ts"), r, "utf8");
|
|
361
|
+
}, tt = async (e, t) => {
|
|
362
|
+
let n = $e(t, (e) => e === "public"), r = `${Ze}
|
|
451
363
|
import '@voltro/env/public'
|
|
452
364
|
|
|
453
365
|
declare module '@voltro/env/public' {
|
|
@@ -455,10 +367,10 @@ declare module '@voltro/env/public' {
|
|
|
455
367
|
${n.length > 0 ? n : " // (no public variables declared)"}
|
|
456
368
|
}
|
|
457
369
|
}
|
|
458
|
-
`, i =
|
|
459
|
-
await
|
|
460
|
-
},
|
|
461
|
-
let n = `${
|
|
370
|
+
`, i = p(e, "src");
|
|
371
|
+
await V(i, { recursive: !0 }), await de(p(i, "voltro-env.d.ts"), r, "utf8");
|
|
372
|
+
}, nt = async (e, t) => {
|
|
373
|
+
let n = `${Ze}
|
|
462
374
|
import { __installPublicEnv } from '@voltro/env/public'
|
|
463
375
|
|
|
464
376
|
export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
@@ -466,14 +378,14 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
|
466
378
|
// Set the browser/SSR-shared global the \`publicEnv\` accessor reads.
|
|
467
379
|
__installPublicEnv(publicEnvValues)
|
|
468
380
|
`;
|
|
469
|
-
await
|
|
470
|
-
},
|
|
471
|
-
let t =
|
|
381
|
+
await V(e, { recursive: !0 }), await de(p(e, "env.public.ts"), n, "utf8");
|
|
382
|
+
}, rt = async (e) => {
|
|
383
|
+
let t = z(e.rawEnv) ? e.rawEnv : void 0, n = await ce({
|
|
472
384
|
contract: t,
|
|
473
|
-
resolveSecret:
|
|
474
|
-
}), r = [...n.errors, ...
|
|
475
|
-
if (r.length > 0) throw Error(
|
|
476
|
-
|
|
385
|
+
resolveSecret: N
|
|
386
|
+
}), r = [...n.errors, ...L(t, e.appType)];
|
|
387
|
+
if (r.length > 0) throw Error(R(r));
|
|
388
|
+
oe(n.values), e.appType === "web" && le(n.publicValues);
|
|
477
389
|
let i = t ? Object.keys(t.vars).length : 0;
|
|
478
390
|
if (i > 0) {
|
|
479
391
|
let r = Object.keys(n.publicValues).length;
|
|
@@ -485,20 +397,20 @@ __installPublicEnv(publicEnvValues)
|
|
|
485
397
|
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 });
|
|
486
398
|
}
|
|
487
399
|
}
|
|
488
|
-
return e.generateTypes && t && (e.appType === "api" ? await
|
|
400
|
+
return e.generateTypes && t && (e.appType === "api" ? await et(e.root, t) : await tt(e.root, t)), {
|
|
489
401
|
resolved: n,
|
|
490
402
|
contract: t
|
|
491
403
|
};
|
|
492
|
-
},
|
|
493
|
-
let t =
|
|
404
|
+
}, it = (e) => {
|
|
405
|
+
let t = I(e.contract), n = (e.plugins ?? []).flatMap((e) => se(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ae, i = /* @__PURE__ */ new Set(), a = [];
|
|
494
406
|
for (let e of [
|
|
495
407
|
...t,
|
|
496
408
|
...n,
|
|
497
409
|
...r
|
|
498
410
|
]) i.has(e.key) || (i.add(e.key), a.push(e));
|
|
499
411
|
return a;
|
|
500
|
-
},
|
|
501
|
-
let r =
|
|
412
|
+
}, at = (e, t, n = (e) => process.env[e]) => {
|
|
413
|
+
let r = it(t).map((e) => {
|
|
502
414
|
let t = n(e.key) !== void 0;
|
|
503
415
|
return {
|
|
504
416
|
...e,
|
|
@@ -515,13 +427,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
515
427
|
missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
|
|
516
428
|
}
|
|
517
429
|
};
|
|
518
|
-
},
|
|
430
|
+
}, ot = (e, t) => B(it({
|
|
519
431
|
...e,
|
|
520
432
|
includeFramework: !1
|
|
521
433
|
}), {
|
|
522
434
|
includeFramework: e.includeFramework !== !1,
|
|
523
435
|
...t ? { header: t } : {}
|
|
524
|
-
}),
|
|
436
|
+
}), st = () => {
|
|
525
437
|
let e = /* @__PURE__ */ new Map();
|
|
526
438
|
return {
|
|
527
439
|
get(t) {
|
|
@@ -548,7 +460,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
548
460
|
return Array.from(e.entries());
|
|
549
461
|
}
|
|
550
462
|
};
|
|
551
|
-
},
|
|
463
|
+
}, ct = (e) => {
|
|
552
464
|
if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
|
|
553
465
|
if (typeof e != "string") return null;
|
|
554
466
|
let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
|
|
@@ -557,33 +469,33 @@ __installPublicEnv(publicEnvValues)
|
|
|
557
469
|
if (!Number.isFinite(n) || n <= 0) return null;
|
|
558
470
|
let r = t[2].toLowerCase();
|
|
559
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;
|
|
560
|
-
},
|
|
472
|
+
}, lt = (e, t = {}) => {
|
|
561
473
|
let n = [e];
|
|
562
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("|");
|
|
563
|
-
},
|
|
475
|
+
}, ut = (e, t) => e.expiresAt > t, dt = (e, t) => e.expiresAt <= t && e.servableUntil > t, ft = S({ scope: "voltro:cli" }), pt = (e, t) => {
|
|
564
476
|
if (t?.code !== "EACCES") return "";
|
|
565
477
|
if (typeof process.getuid != "function") return " — permission denied";
|
|
566
478
|
try {
|
|
567
|
-
let t =
|
|
479
|
+
let t = k(e);
|
|
568
480
|
return ` — permission denied: the file is owned by uid ${t.uid} (mode ${(t.mode & 511).toString(8)}) and this process is uid ${process.getuid()}. A container running as root with the workspace bind-mounted writes files the host user cannot read; run it as \`--user <your-uid>:<your-gid>\`, or delete the file and let the owning user recreate it.`;
|
|
569
481
|
} catch {
|
|
570
482
|
return " — permission denied (and the file could not be stat-ed either)";
|
|
571
483
|
}
|
|
572
|
-
},
|
|
573
|
-
|
|
574
|
-
let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ?
|
|
484
|
+
}, mt = [], ht = (e) => {
|
|
485
|
+
mt.length = 0;
|
|
486
|
+
let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? f(t) ? t : h(process.cwd(), t) : process.cwd(), r = [], i = n;
|
|
575
487
|
for (;;) {
|
|
576
488
|
r.push(i);
|
|
577
|
-
let e =
|
|
489
|
+
let e = d(i);
|
|
578
490
|
if (e === i) break;
|
|
579
491
|
i = e;
|
|
580
492
|
}
|
|
581
493
|
for (let e of r) for (let t of [".env.local", ".env"]) {
|
|
582
|
-
let n =
|
|
583
|
-
if (
|
|
584
|
-
|
|
494
|
+
let n = h(e, t);
|
|
495
|
+
if (T(n)) {
|
|
496
|
+
mt.push(n);
|
|
585
497
|
try {
|
|
586
|
-
let e =
|
|
498
|
+
let e = ee(n, "utf8");
|
|
587
499
|
for (let t of e.split(/\r?\n/)) {
|
|
588
500
|
let e = t.trim();
|
|
589
501
|
if (e === "" || e.startsWith("#")) continue;
|
|
@@ -593,15 +505,15 @@ __installPublicEnv(publicEnvValues)
|
|
|
593
505
|
(i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
|
|
594
506
|
}
|
|
595
507
|
} catch (e) {
|
|
596
|
-
|
|
508
|
+
ft.warn(`failed to load env file (continuing)${pt(n, e)}`, { path: n }, e);
|
|
597
509
|
}
|
|
598
510
|
}
|
|
599
511
|
}
|
|
600
|
-
},
|
|
512
|
+
}, gt = 500, _t = (e, t, n = {}) => {
|
|
601
513
|
if (e.length === 0) return () => {};
|
|
602
|
-
let r = (e) => n.root ?
|
|
514
|
+
let r = (e) => n.root ? m(n.root, e) : e, i = !1, a = (e) => {
|
|
603
515
|
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(() => {
|
|
604
|
-
let e =
|
|
516
|
+
let e = pe(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
605
517
|
stdio: "inherit",
|
|
606
518
|
env: process.env,
|
|
607
519
|
cwd: n.cwd ?? process.cwd()
|
|
@@ -615,62 +527,62 @@ __installPublicEnv(publicEnvValues)
|
|
|
615
527
|
});
|
|
616
528
|
}));
|
|
617
529
|
};
|
|
618
|
-
for (let t of e)
|
|
530
|
+
for (let t of e) re(t, { interval: gt }, (e, n) => {
|
|
619
531
|
e.mtimeMs !== n.mtimeMs && a(t);
|
|
620
532
|
});
|
|
621
533
|
return t.info("watching .env files for changes", {
|
|
622
534
|
files: e.map(r),
|
|
623
|
-
intervalMs:
|
|
535
|
+
intervalMs: gt
|
|
624
536
|
}), () => {
|
|
625
|
-
for (let t of e)
|
|
537
|
+
for (let t of e) ne(t);
|
|
626
538
|
};
|
|
627
|
-
},
|
|
539
|
+
}, vt = S({ scope: "vite" }), yt = /\x1b\[[0-9;]*m/g, bt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, xt = (e) => e.replace(yt, "").replace(bt, "").trim(), St = /proxy error/i, Ct = [
|
|
628
540
|
"ECONNREFUSED",
|
|
629
541
|
"ECONNRESET",
|
|
630
542
|
"ECONNABORTED",
|
|
631
543
|
"EPIPE",
|
|
632
544
|
"ETIMEDOUT"
|
|
633
|
-
],
|
|
545
|
+
], wt = (e, t = 0) => {
|
|
634
546
|
if (e == null || t > 5) return !1;
|
|
635
547
|
let n = e;
|
|
636
|
-
return typeof n.code == "string" &&
|
|
637
|
-
},
|
|
548
|
+
return typeof n.code == "string" && Ct.includes(n.code) || typeof n.message == "string" && Ct.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => wt(e, t + 1)) ? !0 : wt(n.cause, t + 1);
|
|
549
|
+
}, Tt = 4e3, Et = () => {
|
|
638
550
|
let e = /* @__PURE__ */ new Set(), t = 0, n = {
|
|
639
551
|
hasWarned: !1,
|
|
640
552
|
info: (e) => {
|
|
641
|
-
let t =
|
|
642
|
-
t.length !== 0 &&
|
|
553
|
+
let t = xt(e);
|
|
554
|
+
t.length !== 0 && vt.info(t);
|
|
643
555
|
},
|
|
644
556
|
warn: (e) => {
|
|
645
557
|
n.hasWarned = !0;
|
|
646
|
-
let t =
|
|
647
|
-
t.length !== 0 &&
|
|
558
|
+
let t = xt(e);
|
|
559
|
+
t.length !== 0 && vt.warn(t);
|
|
648
560
|
},
|
|
649
561
|
warnOnce: (t) => {
|
|
650
|
-
let r =
|
|
651
|
-
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 &&
|
|
562
|
+
let r = xt(t);
|
|
563
|
+
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && vt.warn(r));
|
|
652
564
|
},
|
|
653
565
|
error: (e, n) => {
|
|
654
|
-
let r =
|
|
566
|
+
let r = xt(e), i = n?.error;
|
|
655
567
|
if (r.length !== 0) {
|
|
656
|
-
if (
|
|
568
|
+
if (St.test(r) && wt(i)) {
|
|
657
569
|
let e = Date.now();
|
|
658
|
-
e - t >
|
|
570
|
+
e - t > Tt && (t = e, vt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
|
|
659
571
|
return;
|
|
660
572
|
}
|
|
661
|
-
|
|
573
|
+
vt.error(r, {}, i);
|
|
662
574
|
}
|
|
663
575
|
},
|
|
664
576
|
clearScreen: () => {},
|
|
665
577
|
hasErrorLogged: (e) => !1
|
|
666
578
|
};
|
|
667
579
|
return n;
|
|
668
|
-
},
|
|
580
|
+
}, Dt = (e = process.env) => {
|
|
669
581
|
let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
|
|
670
582
|
if (t === void 0 || t.trim() === "") return 4;
|
|
671
583
|
let n = Number(t);
|
|
672
584
|
return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
|
|
673
|
-
},
|
|
585
|
+
}, Ot = (e) => {
|
|
674
586
|
let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
|
|
675
587
|
let e = r.shift();
|
|
676
588
|
e ? e() : n--;
|
|
@@ -688,8 +600,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
688
600
|
return n;
|
|
689
601
|
}
|
|
690
602
|
};
|
|
691
|
-
},
|
|
692
|
-
let t =
|
|
603
|
+
}, kt = (e) => {
|
|
604
|
+
let t = Ot(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
|
|
693
605
|
return {
|
|
694
606
|
load: (i, a) => {
|
|
695
607
|
if (r.has(i)) return a();
|
|
@@ -719,7 +631,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
719
631
|
return r.size;
|
|
720
632
|
}
|
|
721
633
|
};
|
|
722
|
-
},
|
|
634
|
+
}, At = (e) => {
|
|
723
635
|
let t = [];
|
|
724
636
|
for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
|
|
725
637
|
name: n.slice(5, -2),
|
|
@@ -735,12 +647,12 @@ __installPublicEnv(publicEnvValues)
|
|
|
735
647
|
optional: !1
|
|
736
648
|
});
|
|
737
649
|
return t;
|
|
738
|
-
},
|
|
739
|
-
let t =
|
|
650
|
+
}, jt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Mt = async (e) => {
|
|
651
|
+
let t = h(e);
|
|
740
652
|
for (let e = 0; e < 4; e++) {
|
|
741
|
-
let e =
|
|
742
|
-
if (
|
|
743
|
-
let n = await
|
|
653
|
+
let e = p(t, "project.json");
|
|
654
|
+
if (T(e)) try {
|
|
655
|
+
let n = await O.readFile(e, "utf8");
|
|
744
656
|
return {
|
|
745
657
|
projectDir: t,
|
|
746
658
|
manifest: JSON.parse(n)
|
|
@@ -748,38 +660,38 @@ __installPublicEnv(publicEnvValues)
|
|
|
748
660
|
} catch {
|
|
749
661
|
return null;
|
|
750
662
|
}
|
|
751
|
-
let n =
|
|
663
|
+
let n = d(t);
|
|
752
664
|
if (n === t) break;
|
|
753
665
|
t = n;
|
|
754
666
|
}
|
|
755
667
|
return null;
|
|
756
|
-
},
|
|
757
|
-
let t = await
|
|
668
|
+
}, Nt = async (e) => {
|
|
669
|
+
let t = await Mt(e);
|
|
758
670
|
if (!t) return [];
|
|
759
|
-
let { projectDir: n, manifest: r } = t, i =
|
|
671
|
+
let { projectDir: n, manifest: r } = t, i = u(e), a = r.apps ?? {}, o = [];
|
|
760
672
|
for (let [e, t] of Object.entries(a)) {
|
|
761
673
|
if (e === i || t.kind !== "web" || typeof t.port != "number") continue;
|
|
762
|
-
let r =
|
|
763
|
-
if (!
|
|
674
|
+
let r = p(p(n, t.path ?? e), "src", "pages");
|
|
675
|
+
if (!T(r)) continue;
|
|
764
676
|
let a;
|
|
765
677
|
try {
|
|
766
|
-
let { pages: e } = await
|
|
678
|
+
let { pages: e } = await $(r);
|
|
767
679
|
a = e.map((e) => ({
|
|
768
680
|
pattern: e.pattern,
|
|
769
|
-
params:
|
|
681
|
+
params: At(e.pattern)
|
|
770
682
|
}));
|
|
771
683
|
} catch {
|
|
772
684
|
continue;
|
|
773
685
|
}
|
|
774
686
|
o.push({
|
|
775
|
-
key:
|
|
687
|
+
key: jt(e),
|
|
776
688
|
origin: `http://localhost:${t.port}`,
|
|
777
689
|
...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
|
|
778
690
|
routes: a
|
|
779
691
|
});
|
|
780
692
|
}
|
|
781
693
|
return o;
|
|
782
|
-
},
|
|
694
|
+
}, Pt = (e) => {
|
|
783
695
|
if (e.params.length === 0) return `'${e.pattern}'`;
|
|
784
696
|
let t = e.pattern;
|
|
785
697
|
for (let n of e.params) {
|
|
@@ -787,21 +699,21 @@ __installPublicEnv(publicEnvValues)
|
|
|
787
699
|
t = t.replace(e, r);
|
|
788
700
|
}
|
|
789
701
|
return "`" + t + "`";
|
|
790
|
-
},
|
|
702
|
+
}, Ft = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
|
|
791
703
|
let t = "string";
|
|
792
704
|
return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
|
|
793
|
-
}).join("; ")} }`,
|
|
794
|
-
let r =
|
|
705
|
+
}).join("; ")} }`, It = (e, t, n) => {
|
|
706
|
+
let r = Ft(e), i = Pt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
|
|
795
707
|
return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
|
|
796
|
-
},
|
|
708
|
+
}, Lt = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${It(e, !1)},`).join("\n")}\n}`, Rt = (e, t) => {
|
|
797
709
|
if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
|
|
798
|
-
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)}: ${
|
|
710
|
+
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)}: ${It(e, !0, i)},`);
|
|
799
711
|
return ` ${e.key}: {\n${a.join("\n")}\n },`;
|
|
800
|
-
},
|
|
712
|
+
}, zt = async (e) => {
|
|
801
713
|
let t = e.pages.map((e) => ({
|
|
802
714
|
pattern: e.pattern,
|
|
803
|
-
params:
|
|
804
|
-
})), n = await
|
|
715
|
+
params: At(e.pattern)
|
|
716
|
+
})), n = await Nt(e.appRoot), r = [
|
|
805
717
|
"// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
|
|
806
718
|
"// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
|
|
807
719
|
"// Type-safe route builders consumed by <Link to={...}>.",
|
|
@@ -810,20 +722,50 @@ __installPublicEnv(publicEnvValues)
|
|
|
810
722
|
"",
|
|
811
723
|
"type EmptyParams = Record<string, never>",
|
|
812
724
|
""
|
|
813
|
-
].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${
|
|
814
|
-
await
|
|
725
|
+
].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${Lt(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => Rt(e, i)).join("\n")}\n} as const\n`}`, o = p(e.appRoot, ".framework", "routes.generated.ts");
|
|
726
|
+
await O.mkdir(d(o), { recursive: !0 });
|
|
815
727
|
let s = null;
|
|
816
728
|
try {
|
|
817
|
-
s = await
|
|
729
|
+
s = await O.readFile(o, "utf8");
|
|
818
730
|
} catch {}
|
|
819
731
|
return s === a ? {
|
|
820
732
|
path: o,
|
|
821
733
|
wrote: !1
|
|
822
|
-
} : (await
|
|
734
|
+
} : (await O.writeFile(o, a, "utf8"), {
|
|
823
735
|
path: o,
|
|
824
736
|
wrote: !0
|
|
825
737
|
});
|
|
826
|
-
},
|
|
738
|
+
}, Bt = (e) => {
|
|
739
|
+
if (e === "" || e === "/") return "/";
|
|
740
|
+
let t = e.startsWith("/") ? e : `/${e}`;
|
|
741
|
+
return t.endsWith("/") ? t.slice(0, -1) : t;
|
|
742
|
+
}, Vt = (e, t) => {
|
|
743
|
+
let n = e.endsWith("/") ? e.slice(0, -1) : e, r = Bt(t);
|
|
744
|
+
return r === "/" ? `${n}/` : `${n}${r}`;
|
|
745
|
+
}, Ht = (e, t, n) => {
|
|
746
|
+
let r = Bt(e);
|
|
747
|
+
return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
|
|
748
|
+
}, Ut = (e) => e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"), Wt = (e) => {
|
|
749
|
+
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) => {
|
|
750
|
+
if (!r) return "";
|
|
751
|
+
let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${Ut(n)}" href="${Ut(Vt(t, Ht(e, n, i)))}" />`);
|
|
752
|
+
return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${Ut(Vt(t, Ht(e, i, i)))}" />`), `\n${n.join("\n")}`;
|
|
753
|
+
};
|
|
754
|
+
for (let e of n) {
|
|
755
|
+
let n = r ?? [i];
|
|
756
|
+
for (let r of n) {
|
|
757
|
+
let n = Vt(t, Ht(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${Ut(e.lastmod)}</lastmod>` : "";
|
|
758
|
+
o.set(n, ` <url>\n <loc>${Ut(n)}</loc>${a}${s(e.path)}\n </url>`);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
let c = [...o.keys()].sort().map((e) => o.get(e)).join("\n");
|
|
762
|
+
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`;
|
|
763
|
+
}, Gt = (e) => {
|
|
764
|
+
if (!e.indexable) return "User-agent: *\nDisallow: /\n";
|
|
765
|
+
let t = ["User-agent: *", "Allow: /"];
|
|
766
|
+
for (let n of e.disallow ?? []) t.push(`Disallow: ${Bt(n)}`);
|
|
767
|
+
return e.sitemapUrl && t.push("", `Sitemap: ${e.sitemapUrl}`), `${t.join("\n")}\n`;
|
|
768
|
+
}, Kt = 256, qt = (e = Kt) => {
|
|
827
769
|
let t = [], n = /* @__PURE__ */ new Set();
|
|
828
770
|
return {
|
|
829
771
|
emit(r, i) {
|
|
@@ -846,27 +788,48 @@ __installPublicEnv(publicEnvValues)
|
|
|
846
788
|
return t.slice();
|
|
847
789
|
}
|
|
848
790
|
};
|
|
849
|
-
},
|
|
791
|
+
}, Jt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, Yt = () => `: keep-alive ${Date.now()}\n\n`, Xt = 8e3, Zt = (e, t = Xt) => {
|
|
792
|
+
let n = $t(e);
|
|
793
|
+
return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
|
|
794
|
+
}, Qt = 4, $t = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
|
|
795
|
+
if (e instanceof Error) {
|
|
796
|
+
let r = e.stack ?? `${e.name}: ${e.message}`;
|
|
797
|
+
if (n.has(e)) return `${r}\n [cycle]`;
|
|
798
|
+
n.add(e);
|
|
799
|
+
let i = [];
|
|
800
|
+
if (t < Qt) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${en($t(a, t + 1, n))}`);
|
|
801
|
+
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${en($t(e.cause, t + 1, n))}`);
|
|
802
|
+
return r + i.join("");
|
|
803
|
+
}
|
|
804
|
+
try {
|
|
805
|
+
return String(e);
|
|
806
|
+
} catch {
|
|
807
|
+
return "[unstringifiable thrown value]";
|
|
808
|
+
}
|
|
809
|
+
}, en = (e) => {
|
|
810
|
+
let t = e.split("\n");
|
|
811
|
+
return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
|
|
812
|
+
}, tn = {
|
|
850
813
|
trace: 0,
|
|
851
814
|
debug: 1,
|
|
852
815
|
info: 2,
|
|
853
816
|
warn: 3,
|
|
854
817
|
error: 4,
|
|
855
818
|
fatal: 5
|
|
856
|
-
},
|
|
819
|
+
}, nn = 2e3, rn = 200, an = class {
|
|
857
820
|
capacity;
|
|
858
821
|
buffer = [];
|
|
859
|
-
constructor(e =
|
|
822
|
+
constructor(e = nn) {
|
|
860
823
|
this.capacity = e;
|
|
861
824
|
}
|
|
862
825
|
append(e) {
|
|
863
826
|
this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
|
|
864
827
|
}
|
|
865
828
|
query(e = {}) {
|
|
866
|
-
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ??
|
|
829
|
+
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? rn, this.capacity), i = e.minLevel === void 0 ? tn.trace : tn[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
|
|
867
830
|
for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
|
|
868
831
|
let r = this.buffer[e];
|
|
869
|
-
r.ts < t || r.ts > n ||
|
|
832
|
+
r.ts < t || r.ts > n || tn[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);
|
|
870
833
|
}
|
|
871
834
|
return l.reverse();
|
|
872
835
|
}
|
|
@@ -879,7 +842,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
879
842
|
clear() {
|
|
880
843
|
this.buffer = [];
|
|
881
844
|
}
|
|
882
|
-
},
|
|
845
|
+
}, on = null, sn = () => (on === null && (on = new an()), on), cn = (e) => {
|
|
883
846
|
if (typeof e == "string") return e;
|
|
884
847
|
if (e instanceof Error) return e.message;
|
|
885
848
|
try {
|
|
@@ -887,18 +850,28 @@ __installPublicEnv(publicEnvValues)
|
|
|
887
850
|
} catch {
|
|
888
851
|
return String(e);
|
|
889
852
|
}
|
|
890
|
-
},
|
|
853
|
+
}, ln = 8e3, un = (e) => typeof e == "string" ? e.length <= ln ? e : `${e.slice(0, ln)}… [voltro: truncated]` : typeof e != "object" || !e ? e : Zt(e, ln), dn = (e, t) => {
|
|
854
|
+
try {
|
|
855
|
+
e(...t);
|
|
856
|
+
} catch (n) {
|
|
857
|
+
try {
|
|
858
|
+
e(...t.map(un)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${ln} chars per argument.`);
|
|
859
|
+
} catch {
|
|
860
|
+
e(`[voltro] a console.error argument could not be formatted at all (${t.length} arg(s)).`);
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}, fn = (e) => {
|
|
891
864
|
let t = {
|
|
892
865
|
log: console.log.bind(console),
|
|
893
866
|
info: console.info.bind(console),
|
|
894
867
|
warn: console.warn.bind(console),
|
|
895
868
|
error: console.error.bind(console),
|
|
896
869
|
debug: console.debug.bind(console)
|
|
897
|
-
}, n =
|
|
898
|
-
if (t[i]
|
|
870
|
+
}, n = sn(), r = !1, i = (i) => (...a) => {
|
|
871
|
+
if (dn(t[i], a), !r) {
|
|
899
872
|
r = !0;
|
|
900
873
|
try {
|
|
901
|
-
let t = a.length > 0 ?
|
|
874
|
+
let t = a.length > 0 ? cn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = M();
|
|
902
875
|
e.emit("log", {
|
|
903
876
|
level: i,
|
|
904
877
|
message: r,
|
|
@@ -925,7 +898,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
925
898
|
}
|
|
926
899
|
};
|
|
927
900
|
console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
|
|
928
|
-
let a =
|
|
901
|
+
let a = x((t) => {
|
|
929
902
|
if (!r) {
|
|
930
903
|
r = !0;
|
|
931
904
|
try {
|
|
@@ -936,7 +909,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
936
909
|
argsCount: 1,
|
|
937
910
|
...t.scope === void 0 ? {} : { scope: t.scope }
|
|
938
911
|
});
|
|
939
|
-
let a =
|
|
912
|
+
let a = M(), o = a !== void 0 && t.fields.traceId === void 0 ? {
|
|
940
913
|
...t.fields,
|
|
941
914
|
traceId: a.traceId
|
|
942
915
|
} : t.fields;
|
|
@@ -956,24 +929,24 @@ __installPublicEnv(publicEnvValues)
|
|
|
956
929
|
return () => {
|
|
957
930
|
console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
|
|
958
931
|
};
|
|
959
|
-
},
|
|
932
|
+
}, pn = 2e3, mn = 8, hn = 1e3, gn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, _n = (e) => {
|
|
960
933
|
switch (e) {
|
|
961
934
|
case "error": return "error";
|
|
962
935
|
case "warn": return "warn";
|
|
963
936
|
case "debug": return "debug";
|
|
964
937
|
default: return "info";
|
|
965
938
|
}
|
|
966
|
-
},
|
|
939
|
+
}, vn = S({ scope: "client" }), yn = (e, t) => {
|
|
967
940
|
let n;
|
|
968
941
|
try {
|
|
969
942
|
n = JSON.parse(e);
|
|
970
943
|
} catch {
|
|
971
|
-
return
|
|
944
|
+
return bn(400, { error: "invalid JSON body" });
|
|
972
945
|
}
|
|
973
|
-
if (typeof n != "object" || !n) return
|
|
946
|
+
if (typeof n != "object" || !n) return bn(400, { error: "body must be a JSON object" });
|
|
974
947
|
let r = n;
|
|
975
|
-
if (!Array.isArray(r.entries)) return
|
|
976
|
-
let i = typeof r.app == "string" ?
|
|
948
|
+
if (!Array.isArray(r.entries)) return bn(400, { error: "entries must be an array" });
|
|
949
|
+
let i = typeof r.app == "string" ? Y(r.app, 120) : void 0, a = typeof r.page == "string" ? Y(r.page, 200) : void 0, o = typeof r.ua == "string" ? Y(r.ua, 200) : void 0, s = r.entries.slice(0, gn), c = 0;
|
|
977
950
|
for (let e of s) {
|
|
978
951
|
if (typeof e != "object" || !e) continue;
|
|
979
952
|
let n = e;
|
|
@@ -984,7 +957,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
984
957
|
"warn",
|
|
985
958
|
"error",
|
|
986
959
|
"debug"
|
|
987
|
-
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l =
|
|
960
|
+
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, pn), u = Array.isArray(n.args) ? n.args.slice(0, mn).filter((e) => typeof e == "string").map((e) => Y(e, hn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, pn) : void 0;
|
|
988
961
|
t.emit("clientLog", {
|
|
989
962
|
ts: s,
|
|
990
963
|
level: r,
|
|
@@ -999,41 +972,41 @@ __installPublicEnv(publicEnvValues)
|
|
|
999
972
|
...i === void 0 ? {} : { app: i },
|
|
1000
973
|
...a === void 0 ? {} : { page: a },
|
|
1001
974
|
...u !== void 0 && u.length > 0 ? { args: u } : {}
|
|
1002
|
-
}, p =
|
|
1003
|
-
(p === "error" || p === "warn") && d !== void 0 ?
|
|
975
|
+
}, p = _n(r);
|
|
976
|
+
(p === "error" || p === "warn") && d !== void 0 ? vn[p](l, f, { stack: d }) : vn[p](l, {
|
|
1004
977
|
...f,
|
|
1005
978
|
...d === void 0 ? {} : { stack: d }
|
|
1006
979
|
}), c++;
|
|
1007
980
|
}
|
|
1008
|
-
return
|
|
981
|
+
return bn(202, {
|
|
1009
982
|
accepted: c,
|
|
1010
983
|
dropped: r.entries.length - c
|
|
1011
984
|
});
|
|
1012
|
-
},
|
|
985
|
+
}, bn = (e, t) => ({
|
|
1013
986
|
status: e,
|
|
1014
987
|
contentType: "application/json; charset=utf-8",
|
|
1015
988
|
body: JSON.stringify(t)
|
|
1016
|
-
}),
|
|
989
|
+
}), xn = "/_voltro/inspect/clientLog", Sn = [
|
|
1017
990
|
"trace",
|
|
1018
991
|
"debug",
|
|
1019
992
|
"info",
|
|
1020
993
|
"warn",
|
|
1021
994
|
"error",
|
|
1022
995
|
"fatal"
|
|
1023
|
-
],
|
|
996
|
+
], Cn = {
|
|
1024
997
|
trace: "TRACE",
|
|
1025
998
|
debug: "DEBUG",
|
|
1026
999
|
info: "INFO ",
|
|
1027
1000
|
warn: "WARN ",
|
|
1028
1001
|
error: "ERROR",
|
|
1029
1002
|
fatal: "FATAL"
|
|
1030
|
-
},
|
|
1031
|
-
if (
|
|
1003
|
+
}, wn = (e) => Sn.includes(e), Tn = (e, t, n = {}) => {
|
|
1004
|
+
if (c()) return {
|
|
1032
1005
|
status: 503,
|
|
1033
1006
|
contentType: "application/json",
|
|
1034
1007
|
body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
|
|
1035
1008
|
};
|
|
1036
|
-
let r =
|
|
1009
|
+
let r = s(n, "GET");
|
|
1037
1010
|
if (!r.ok) return {
|
|
1038
1011
|
status: 401,
|
|
1039
1012
|
contentType: "application/json",
|
|
@@ -1042,36 +1015,36 @@ __installPublicEnv(publicEnvValues)
|
|
|
1042
1015
|
reason: r.reason
|
|
1043
1016
|
})
|
|
1044
1017
|
};
|
|
1045
|
-
let
|
|
1018
|
+
let i = e.indexOf("?"), a = i === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(i + 1)), o = {}, l = a.get("since");
|
|
1046
1019
|
if (l !== null) {
|
|
1047
1020
|
let e = Number(l);
|
|
1048
|
-
Number.isFinite(e) && (
|
|
1021
|
+
Number.isFinite(e) && (o.since = e);
|
|
1049
1022
|
}
|
|
1050
|
-
let u =
|
|
1023
|
+
let u = a.get("until");
|
|
1051
1024
|
if (u !== null) {
|
|
1052
1025
|
let e = Number(u);
|
|
1053
|
-
Number.isFinite(e) && (
|
|
1026
|
+
Number.isFinite(e) && (o.until = e);
|
|
1054
1027
|
}
|
|
1055
|
-
let d =
|
|
1028
|
+
let d = a.get("max");
|
|
1056
1029
|
if (d !== null) {
|
|
1057
1030
|
let e = Number(d);
|
|
1058
|
-
Number.isFinite(e) && e > 0 && (
|
|
1059
|
-
}
|
|
1060
|
-
let f =
|
|
1061
|
-
f !== null &&
|
|
1062
|
-
let p =
|
|
1063
|
-
(p === "server" || p === "client") && (
|
|
1064
|
-
let m =
|
|
1065
|
-
m !== null && m.length > 0 && (
|
|
1066
|
-
let h =
|
|
1067
|
-
h !== null && h.length > 0 && (
|
|
1068
|
-
let g =
|
|
1069
|
-
g !== null && g.length > 0 && (
|
|
1070
|
-
let _ = t.query(
|
|
1071
|
-
if ((
|
|
1031
|
+
Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
|
|
1032
|
+
}
|
|
1033
|
+
let f = a.get("level");
|
|
1034
|
+
f !== null && wn(f) && (o.minLevel = f);
|
|
1035
|
+
let p = a.get("source");
|
|
1036
|
+
(p === "server" || p === "client") && (o.source = p);
|
|
1037
|
+
let m = a.get("scope");
|
|
1038
|
+
m !== null && m.length > 0 && (o.scope = m);
|
|
1039
|
+
let h = a.get("filter");
|
|
1040
|
+
h !== null && h.length > 0 && (o.filter = h);
|
|
1041
|
+
let g = a.get("trace");
|
|
1042
|
+
g !== null && g.length > 0 && (o.traceId = g);
|
|
1043
|
+
let _ = t.query(o);
|
|
1044
|
+
if ((a.get("format") ?? "json") === "text") return {
|
|
1072
1045
|
status: 200,
|
|
1073
1046
|
contentType: "text/plain; charset=utf-8",
|
|
1074
|
-
body: _.map(
|
|
1047
|
+
body: _.map(En).join("\n") + (_.length > 0 ? "\n" : "")
|
|
1075
1048
|
};
|
|
1076
1049
|
let v = {
|
|
1077
1050
|
capturedAt: Date.now(),
|
|
@@ -1085,40 +1058,40 @@ __installPublicEnv(publicEnvValues)
|
|
|
1085
1058
|
contentType: "application/json; charset=utf-8",
|
|
1086
1059
|
body: JSON.stringify(v)
|
|
1087
1060
|
};
|
|
1088
|
-
},
|
|
1089
|
-
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 =
|
|
1090
|
-
return `${n}:${r}:${i}.${a} ${
|
|
1091
|
-
},
|
|
1061
|
+
}, En = (e) => {
|
|
1062
|
+
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 = On(e.fields);
|
|
1063
|
+
return `${n}:${r}:${i}.${a} ${Cn[e.level]} ${o} ${e.message}${s}`;
|
|
1064
|
+
}, Dn = 80, On = (e) => {
|
|
1092
1065
|
let t = Object.entries(e);
|
|
1093
1066
|
if (t.length === 0) return "";
|
|
1094
1067
|
let n = [];
|
|
1095
1068
|
for (let [e, r] of t) {
|
|
1096
1069
|
if (r === void 0) continue;
|
|
1097
|
-
let t =
|
|
1070
|
+
let t = kn(r);
|
|
1098
1071
|
n.push(`${e}=${t}`);
|
|
1099
1072
|
}
|
|
1100
1073
|
return n.length > 0 ? " " + n.join(" ") : "";
|
|
1101
|
-
},
|
|
1074
|
+
}, kn = (e) => {
|
|
1102
1075
|
if (typeof e == "string") {
|
|
1103
|
-
let t = e.length >
|
|
1076
|
+
let t = e.length > Dn ? e.slice(0, Dn) + "…" : e;
|
|
1104
1077
|
return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
|
|
1105
1078
|
}
|
|
1106
1079
|
if (e === null) return "null";
|
|
1107
1080
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
1108
1081
|
try {
|
|
1109
1082
|
let t = JSON.stringify(e);
|
|
1110
|
-
return t.length >
|
|
1083
|
+
return t.length > Dn ? t.slice(0, Dn) + "…" : t;
|
|
1111
1084
|
} catch {
|
|
1112
1085
|
return "[unserialisable]";
|
|
1113
1086
|
}
|
|
1114
|
-
},
|
|
1087
|
+
}, An = "/_voltro/inspect/logs", jn = (e, t, n) => {
|
|
1115
1088
|
if (t.headers.authorization !== void 0) return !1;
|
|
1116
1089
|
let { token: r } = n;
|
|
1117
1090
|
if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
|
|
1118
1091
|
e.setHeader("authorization", `Bearer ${r}`);
|
|
1119
1092
|
let i = n.writeToken;
|
|
1120
1093
|
return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
|
|
1121
|
-
},
|
|
1094
|
+
}, Mn = [{
|
|
1122
1095
|
match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
|
|
1123
1096
|
handle: (e, t) => {
|
|
1124
1097
|
let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
|
|
@@ -1130,13 +1103,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
1130
1103
|
});
|
|
1131
1104
|
} else t.info(n);
|
|
1132
1105
|
}
|
|
1133
|
-
}],
|
|
1106
|
+
}], Nn = () => {
|
|
1134
1107
|
let e = {
|
|
1135
1108
|
warn: console.warn.bind(console),
|
|
1136
1109
|
error: console.error.bind(console)
|
|
1137
|
-
}, t =
|
|
1110
|
+
}, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
|
|
1138
1111
|
if (!n) {
|
|
1139
|
-
for (let e of
|
|
1112
|
+
for (let e of Mn) if (e.match(i[0])) {
|
|
1140
1113
|
n = !0;
|
|
1141
1114
|
try {
|
|
1142
1115
|
e.handle(i, t);
|
|
@@ -1151,7 +1124,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1151
1124
|
return console.warn = r("warn"), console.error = r("error"), () => {
|
|
1152
1125
|
console.warn = e.warn, console.error = e.error;
|
|
1153
1126
|
};
|
|
1154
|
-
},
|
|
1127
|
+
}, Pn = {
|
|
1155
1128
|
loader: "it runs on the server, and the router caches its result per route + params",
|
|
1156
1129
|
renderMode: "it picks the server render strategy",
|
|
1157
1130
|
dynamic: "it picks the server render strategy",
|
|
@@ -1162,7 +1135,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1162
1135
|
cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
|
|
1163
1136
|
interactive: "it decides how much client JS the server ships",
|
|
1164
1137
|
tenantAware: "it is part of the server-side cache key"
|
|
1165
|
-
},
|
|
1138
|
+
}, Fn = Object.keys(Pn), In = (e) => t.test(e), Ln = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), Rn = "virtual:voltro-route-refresh", zn = `\0${Rn}`, Bn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Vn = () => `
|
|
1166
1139
|
// GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
|
|
1167
1140
|
|
|
1168
1141
|
/** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
|
|
@@ -1191,11 +1164,11 @@ const stableForm = (value) => {
|
|
|
1191
1164
|
* readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
|
|
1192
1165
|
* one of THESE cannot be hot-applied: the server already ran with the old
|
|
1193
1166
|
* value. Everything else a page exports is plain client-side data. */
|
|
1194
|
-
const serverRelevantExports = ${JSON.stringify(
|
|
1167
|
+
const serverRelevantExports = ${JSON.stringify(Fn)}
|
|
1195
1168
|
|
|
1196
1169
|
/** Name → the server step that already consumed it, so the reload message can
|
|
1197
1170
|
* say WHY rather than just WHAT. Injected from the same single source. */
|
|
1198
|
-
const serverExportEffect = ${JSON.stringify(
|
|
1171
|
+
const serverExportEffect = ${JSON.stringify(Pn)}
|
|
1199
1172
|
|
|
1200
1173
|
/** The reason \`name\` forces a reload, for the console line. */
|
|
1201
1174
|
export const serverEffectOf = (name) =>
|
|
@@ -1238,7 +1211,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
|
|
|
1238
1211
|
const previousHook = globalThis.__getReactRefreshIgnoredExports
|
|
1239
1212
|
globalThis.__getReactRefreshIgnoredExports = (args) =>
|
|
1240
1213
|
ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
|
|
1241
|
-
`,
|
|
1214
|
+
`, Hn = (e) => `
|
|
1242
1215
|
if (import.meta.hot) {
|
|
1243
1216
|
// Self-import to read our OWN exports, the same technique the react plugin
|
|
1244
1217
|
// uses; the namespace is only complete after evaluation, hence the promise.
|
|
@@ -1265,57 +1238,57 @@ import {
|
|
|
1265
1238
|
registerRouteModule as __voltro_registerRouteModule,
|
|
1266
1239
|
routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
|
|
1267
1240
|
serverEffectOf as __voltro_serverEffect,
|
|
1268
|
-
} from '${
|
|
1269
|
-
`,
|
|
1270
|
-
let [i = "", a] =
|
|
1271
|
-
if (!i.endsWith(".tsx") || a !== void 0 &&
|
|
1272
|
-
let o =
|
|
1273
|
-
return i.startsWith(`${o}/`) ?
|
|
1274
|
-
},
|
|
1241
|
+
} from '${Rn}'
|
|
1242
|
+
`, Un = (e) => e.replace(/\\/g, "/"), Wn = (e, t) => {
|
|
1243
|
+
let [i = "", a] = Un(e).split("?");
|
|
1244
|
+
if (!i.endsWith(".tsx") || a !== void 0 && Bn.test(a)) return !1;
|
|
1245
|
+
let o = Un(t).replace(/\/$/, "");
|
|
1246
|
+
return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
|
|
1247
|
+
}, Gn = (e, t, n) => Wn(t, n) ? `${e}${Hn(Un(t).split("?")[0] ?? t)}` : null, Kn = (e) => ({
|
|
1275
1248
|
name: "voltro:route-fast-refresh",
|
|
1276
1249
|
enforce: "pre",
|
|
1277
|
-
resolveId: (e) => e === "virtual:voltro-route-refresh" ?
|
|
1278
|
-
load: (e) => e ===
|
|
1250
|
+
resolveId: (e) => e === "virtual:voltro-route-refresh" ? zn : void 0,
|
|
1251
|
+
load: (e) => e === zn ? Vn() : void 0,
|
|
1279
1252
|
transform: (t, n, r) => {
|
|
1280
1253
|
if (r?.ssr === !0) return null;
|
|
1281
|
-
let i =
|
|
1254
|
+
let i = Gn(t, n, e);
|
|
1282
1255
|
return i === null ? null : {
|
|
1283
1256
|
code: i,
|
|
1284
1257
|
map: null
|
|
1285
1258
|
};
|
|
1286
1259
|
}
|
|
1287
|
-
}),
|
|
1260
|
+
}), qn = [
|
|
1288
1261
|
"static",
|
|
1289
1262
|
"spa",
|
|
1290
1263
|
"ssr",
|
|
1291
1264
|
"isr"
|
|
1292
|
-
],
|
|
1265
|
+
], Jn = (e) => typeof e == "string" && qn.includes(e), Yn = qn.map((e) => `'${e}'`).join(" | "), Xn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Yn}.${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)." : ""}`, Zn = class extends Error {
|
|
1293
1266
|
page;
|
|
1294
1267
|
value;
|
|
1295
1268
|
name = "InvalidRenderModeError";
|
|
1296
1269
|
constructor(e, t) {
|
|
1297
|
-
super(
|
|
1270
|
+
super(Xn(e, t)), this.page = e, this.value = t;
|
|
1298
1271
|
}
|
|
1299
|
-
},
|
|
1272
|
+
}, Qn = (e, t = "<page>") => {
|
|
1300
1273
|
if (e.renderMode !== void 0 && e.renderMode !== null) {
|
|
1301
|
-
if (!
|
|
1274
|
+
if (!Jn(e.renderMode)) throw new Zn(t, String(e.renderMode));
|
|
1302
1275
|
return e.renderMode;
|
|
1303
1276
|
}
|
|
1304
1277
|
return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
|
|
1305
|
-
},
|
|
1306
|
-
renderMode:
|
|
1278
|
+
}, $n = (e, t = "<page>") => ({
|
|
1279
|
+
renderMode: Qn(e, t),
|
|
1307
1280
|
tenantAware: e.tenantAware === !0,
|
|
1308
|
-
revalidateMs:
|
|
1309
|
-
staleWhileRevalidateMs:
|
|
1281
|
+
revalidateMs: ct(e.revalidate),
|
|
1282
|
+
staleWhileRevalidateMs: ct(e.staleWhileRevalidate) ?? 0,
|
|
1310
1283
|
cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
|
|
1311
1284
|
interactive: e.interactive ?? "full",
|
|
1312
1285
|
hasLoader: typeof e.loader == "function",
|
|
1313
1286
|
hasMeta: e.meta != null,
|
|
1314
1287
|
hasGetStaticPaths: typeof e.getStaticPaths == "function"
|
|
1315
|
-
}),
|
|
1316
|
-
|
|
1288
|
+
}), er = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, tr = (e) => er.exec(e)?.[1] ?? null, nr = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, rr = (e) => {
|
|
1289
|
+
nr.lastIndex = 0;
|
|
1317
1290
|
let t;
|
|
1318
|
-
for (; (t =
|
|
1291
|
+
for (; (t = nr.exec(e)) !== null;) {
|
|
1319
1292
|
let e = t[2];
|
|
1320
1293
|
if (e.startsWith(".")) for (let n of t[1].split(",")) {
|
|
1321
1294
|
let t = n.lastIndexOf(" as ");
|
|
@@ -1323,50 +1296,50 @@ import {
|
|
|
1323
1296
|
}
|
|
1324
1297
|
}
|
|
1325
1298
|
return null;
|
|
1326
|
-
},
|
|
1299
|
+
}, ir = /export\s*\{([^}]*)\}/g, ar = (e) => {
|
|
1327
1300
|
if (/export\s+default\b/.test(e)) return !0;
|
|
1328
|
-
|
|
1301
|
+
ir.lastIndex = 0;
|
|
1329
1302
|
let t;
|
|
1330
|
-
for (; (t =
|
|
1303
|
+
for (; (t = ir.exec(e)) !== null;) for (let e of t[1].split(",")) {
|
|
1331
1304
|
let t = e.lastIndexOf(" as ");
|
|
1332
1305
|
if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
|
|
1333
1306
|
}
|
|
1334
1307
|
return !1;
|
|
1335
|
-
},
|
|
1308
|
+
}, or = async (e, t) => {
|
|
1336
1309
|
let n = (await Promise.all(t.map(async (t) => {
|
|
1337
1310
|
let n;
|
|
1338
1311
|
try {
|
|
1339
|
-
n = await
|
|
1312
|
+
n = await ue(p(e, t.file), "utf8");
|
|
1340
1313
|
} catch {
|
|
1341
1314
|
return null;
|
|
1342
1315
|
}
|
|
1343
|
-
let r =
|
|
1344
|
-
return r !== null && !
|
|
1316
|
+
let r = tr(n);
|
|
1317
|
+
return r !== null && !Jn(r) ? Xn(p("src", "pages", t.file), r) : ar(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.`;
|
|
1345
1318
|
}))).filter((e) => e !== null);
|
|
1346
1319
|
if (n.length !== 0) throw Error(n.join("\n\n"));
|
|
1347
|
-
},
|
|
1320
|
+
}, X = p(P(), ".voltro", "logs"), sr = () => {
|
|
1348
1321
|
let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
|
|
1349
1322
|
return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
|
|
1350
|
-
},
|
|
1351
|
-
if (
|
|
1352
|
-
|
|
1353
|
-
let e = Date.now() -
|
|
1323
|
+
}, cr = !1, lr = () => {
|
|
1324
|
+
if (cr) return;
|
|
1325
|
+
cr = !0;
|
|
1326
|
+
let e = Date.now() - sr(), t = [];
|
|
1354
1327
|
try {
|
|
1355
|
-
t =
|
|
1328
|
+
t = te(X);
|
|
1356
1329
|
} catch {
|
|
1357
1330
|
return;
|
|
1358
1331
|
}
|
|
1359
1332
|
for (let n of t) {
|
|
1360
1333
|
if (!n.endsWith(".log")) continue;
|
|
1361
|
-
let t =
|
|
1334
|
+
let t = p(X, n);
|
|
1362
1335
|
try {
|
|
1363
|
-
|
|
1336
|
+
k(t).mtimeMs < e && A(t);
|
|
1364
1337
|
} catch {}
|
|
1365
1338
|
}
|
|
1366
|
-
},
|
|
1367
|
-
let t =
|
|
1339
|
+
}, ur = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), dr = (e, t) => p(X, `${ur(e)}-${t}.log`), fr = (e) => {
|
|
1340
|
+
let t = ur(e), n = [];
|
|
1368
1341
|
try {
|
|
1369
|
-
n =
|
|
1342
|
+
n = te(X);
|
|
1370
1343
|
} catch {
|
|
1371
1344
|
return;
|
|
1372
1345
|
}
|
|
@@ -1374,19 +1347,19 @@ import {
|
|
|
1374
1347
|
if (r.length === 0) return;
|
|
1375
1348
|
let i, a = -1;
|
|
1376
1349
|
for (let e of r) {
|
|
1377
|
-
let t =
|
|
1350
|
+
let t = p(X, e);
|
|
1378
1351
|
try {
|
|
1379
|
-
let e =
|
|
1352
|
+
let e = k(t);
|
|
1380
1353
|
e.mtimeMs > a && (a = e.mtimeMs, i = t);
|
|
1381
1354
|
} catch {}
|
|
1382
1355
|
}
|
|
1383
1356
|
return i;
|
|
1384
|
-
},
|
|
1357
|
+
}, pr = (e) => {
|
|
1385
1358
|
try {
|
|
1386
|
-
|
|
1359
|
+
E(X, { recursive: !0 });
|
|
1387
1360
|
} catch {}
|
|
1388
|
-
|
|
1389
|
-
let t =
|
|
1361
|
+
lr();
|
|
1362
|
+
let t = dr(e, process.pid), n = D(t, "w"), r = (e) => {
|
|
1390
1363
|
let t = {
|
|
1391
1364
|
ts: e.ts.getTime(),
|
|
1392
1365
|
level: e.level,
|
|
@@ -1407,15 +1380,15 @@ import {
|
|
|
1407
1380
|
...e.scope === void 0 ? {} : { scope: e.scope }
|
|
1408
1381
|
}) + "\n";
|
|
1409
1382
|
}
|
|
1410
|
-
}, i = !1, a =
|
|
1383
|
+
}, i = !1, a = x((e) => {
|
|
1411
1384
|
if (!i) try {
|
|
1412
|
-
|
|
1385
|
+
j(n, r(e));
|
|
1413
1386
|
} catch {}
|
|
1414
1387
|
}), o = () => {
|
|
1415
1388
|
if (!i) {
|
|
1416
1389
|
i = !0;
|
|
1417
1390
|
try {
|
|
1418
|
-
|
|
1391
|
+
w(n);
|
|
1419
1392
|
} catch {}
|
|
1420
1393
|
}
|
|
1421
1394
|
};
|
|
@@ -1427,10 +1400,10 @@ import {
|
|
|
1427
1400
|
a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
|
|
1428
1401
|
}
|
|
1429
1402
|
};
|
|
1430
|
-
},
|
|
1403
|
+
}, mr = async (e, t) => {
|
|
1431
1404
|
let n;
|
|
1432
1405
|
try {
|
|
1433
|
-
n = await
|
|
1406
|
+
n = await O.readFile(e, "utf8");
|
|
1434
1407
|
} catch {
|
|
1435
1408
|
return [];
|
|
1436
1409
|
}
|
|
@@ -1441,78 +1414,78 @@ import {
|
|
|
1441
1414
|
i.push(t);
|
|
1442
1415
|
} catch {}
|
|
1443
1416
|
return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
|
|
1444
|
-
},
|
|
1417
|
+
}, hr = S({ scope: "voltro:dashboard" }), gr = F(import.meta.url), _r = 5179, vr = (e) => {
|
|
1445
1418
|
let t = process.env.VOLTRO_DASHBOARD_PATH;
|
|
1446
|
-
if (t &&
|
|
1419
|
+
if (t && T(p(h(t), "app.config.ts"))) return h(t);
|
|
1447
1420
|
try {
|
|
1448
|
-
let e =
|
|
1449
|
-
if (
|
|
1421
|
+
let e = d(gr.resolve("@voltro/dashboard/package.json"));
|
|
1422
|
+
if (T(p(e, "app.config.ts"))) return e;
|
|
1450
1423
|
} catch {}
|
|
1451
|
-
let n =
|
|
1424
|
+
let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
|
|
1452
1425
|
for (let e = 0; e < 10; e++) {
|
|
1453
|
-
let e =
|
|
1454
|
-
if (
|
|
1455
|
-
let t =
|
|
1426
|
+
let e = p(r, n);
|
|
1427
|
+
if (T(p(e, "app.config.ts"))) return e;
|
|
1428
|
+
let t = d(r);
|
|
1456
1429
|
if (t === r) break;
|
|
1457
1430
|
r = t;
|
|
1458
1431
|
}
|
|
1459
1432
|
return null;
|
|
1460
|
-
},
|
|
1461
|
-
let i =
|
|
1433
|
+
}, yr = "VOLTRO_IS_DASHBOARD", br = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
|
|
1434
|
+
let i = me({
|
|
1462
1435
|
port: e,
|
|
1463
1436
|
host: t
|
|
1464
1437
|
}), a = !1, o = (e) => {
|
|
1465
1438
|
a || (a = !0, i.destroy(), r(e));
|
|
1466
1439
|
};
|
|
1467
1440
|
i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
|
|
1468
|
-
}),
|
|
1441
|
+
}), xr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Sr = () => process.env[yr] === "1", Cr = () => process.stdout.isTTY === !0, wr = p(P(), ".voltro", "dashboard-launch.lock"), Tr = 1e4, Er = async () => {
|
|
1469
1442
|
try {
|
|
1470
|
-
await
|
|
1471
|
-
let e = await
|
|
1443
|
+
await O.mkdir(d(wr), { recursive: !0 });
|
|
1444
|
+
let e = await O.open(wr, "wx");
|
|
1472
1445
|
return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
|
|
1473
1446
|
} catch {
|
|
1474
1447
|
try {
|
|
1475
|
-
let e = await
|
|
1476
|
-
if (Date.now() - e.mtimeMs >
|
|
1448
|
+
let e = await O.stat(wr);
|
|
1449
|
+
if (Date.now() - e.mtimeMs > Tr) return await O.unlink(wr).catch(() => void 0), Er();
|
|
1477
1450
|
} catch {}
|
|
1478
1451
|
return !1;
|
|
1479
1452
|
}
|
|
1480
|
-
},
|
|
1453
|
+
}, Dr = async () => {
|
|
1481
1454
|
try {
|
|
1482
|
-
await
|
|
1455
|
+
await O.unlink(wr);
|
|
1483
1456
|
} catch {}
|
|
1484
|
-
},
|
|
1457
|
+
}, Or = async (e) => {
|
|
1485
1458
|
let t = e.port ?? 5179;
|
|
1486
|
-
if (
|
|
1459
|
+
if (xr()) return {
|
|
1487
1460
|
status: "skipped",
|
|
1488
1461
|
reason: "disabled by flag/env",
|
|
1489
1462
|
port: t
|
|
1490
1463
|
};
|
|
1491
|
-
if (
|
|
1464
|
+
if (Sr()) return {
|
|
1492
1465
|
status: "skipped",
|
|
1493
1466
|
reason: "this process IS the dashboard",
|
|
1494
1467
|
port: t
|
|
1495
1468
|
};
|
|
1496
|
-
if (!
|
|
1469
|
+
if (!Cr()) return {
|
|
1497
1470
|
status: "skipped",
|
|
1498
1471
|
reason: "stdout is not a TTY (CI/smoke)",
|
|
1499
1472
|
port: t
|
|
1500
1473
|
};
|
|
1501
|
-
if (!await
|
|
1474
|
+
if (!await Er()) return {
|
|
1502
1475
|
status: "skipped",
|
|
1503
1476
|
reason: "another voltro process is currently launching the dashboard",
|
|
1504
1477
|
port: t
|
|
1505
1478
|
};
|
|
1506
|
-
if (await
|
|
1479
|
+
if (await br(t)) return await Dr(), {
|
|
1507
1480
|
status: "already-running",
|
|
1508
1481
|
port: t
|
|
1509
1482
|
};
|
|
1510
1483
|
let n = e.voltroBin;
|
|
1511
1484
|
if (!n) {
|
|
1512
1485
|
let e = process.argv[1];
|
|
1513
|
-
n = e && e.endsWith("/src/bin.ts") ?
|
|
1486
|
+
n = e && e.endsWith("/src/bin.ts") ? p(d(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
|
|
1514
1487
|
}
|
|
1515
|
-
let r =
|
|
1488
|
+
let r = T(p(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = pe(process.execPath, [
|
|
1516
1489
|
n,
|
|
1517
1490
|
i,
|
|
1518
1491
|
e.dashboardAppPath
|
|
@@ -1520,7 +1493,7 @@ import {
|
|
|
1520
1493
|
stdio: "ignore",
|
|
1521
1494
|
env: {
|
|
1522
1495
|
...process.env,
|
|
1523
|
-
[
|
|
1496
|
+
[yr]: "1",
|
|
1524
1497
|
VOLTRO_DASHBOARD_PORT: String(t)
|
|
1525
1498
|
}
|
|
1526
1499
|
});
|
|
@@ -1528,22 +1501,22 @@ import {
|
|
|
1528
1501
|
if (a.exitCode === null && a.signalCode === null) try {
|
|
1529
1502
|
a.kill("SIGTERM");
|
|
1530
1503
|
} catch {}
|
|
1531
|
-
}),
|
|
1504
|
+
}), hr.info(`auto-launching dashboard at http://localhost:${t}`, {
|
|
1532
1505
|
port: t,
|
|
1533
1506
|
mode: i,
|
|
1534
1507
|
prebuilt: r
|
|
1535
|
-
}), r ||
|
|
1536
|
-
|
|
1508
|
+
}), r || hr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), hr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
|
|
1509
|
+
Dr();
|
|
1537
1510
|
}, 4e3).unref(), {
|
|
1538
1511
|
status: "launched",
|
|
1539
1512
|
port: t
|
|
1540
1513
|
};
|
|
1541
|
-
},
|
|
1514
|
+
}, kr = class extends Error {
|
|
1542
1515
|
_voltroDeferral = !0;
|
|
1543
1516
|
constructor(e) {
|
|
1544
1517
|
super(e), this.name = "DeferralNotSupportedError";
|
|
1545
1518
|
}
|
|
1546
|
-
},
|
|
1519
|
+
}, Ar = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, jr = (e) => {
|
|
1547
1520
|
if (!(e instanceof Error)) return;
|
|
1548
1521
|
let t = e._voltroControl;
|
|
1549
1522
|
if (t === "redirect") {
|
|
@@ -1565,7 +1538,7 @@ import {
|
|
|
1565
1538
|
},
|
|
1566
1539
|
body: "not found"
|
|
1567
1540
|
};
|
|
1568
|
-
},
|
|
1541
|
+
}, Mr = (e) => {
|
|
1569
1542
|
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
1570
1543
|
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
1571
1544
|
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
@@ -1580,7 +1553,7 @@ import {
|
|
|
1580
1553
|
...e.layoutShell ? { layoutShell: e.layoutShell } : {}
|
|
1581
1554
|
});
|
|
1582
1555
|
} catch (e) {
|
|
1583
|
-
throw new
|
|
1556
|
+
throw new kr(e instanceof Error ? e.message : String(e));
|
|
1584
1557
|
}
|
|
1585
1558
|
return {
|
|
1586
1559
|
loaderData: n.renderData,
|
|
@@ -1596,8 +1569,8 @@ import {
|
|
|
1596
1569
|
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
1597
1570
|
}
|
|
1598
1571
|
};
|
|
1599
|
-
},
|
|
1600
|
-
let { helpers: t, renderInput: n } = e, r =
|
|
1572
|
+
}, Nr = (e) => {
|
|
1573
|
+
let { helpers: t, renderInput: n } = e, r = Mr({
|
|
1601
1574
|
helpers: t,
|
|
1602
1575
|
page: e.page,
|
|
1603
1576
|
pathname: n.pathname,
|
|
@@ -1618,19 +1591,19 @@ import {
|
|
|
1618
1591
|
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
1619
1592
|
hasDeferred: r.hasDeferred
|
|
1620
1593
|
};
|
|
1621
|
-
},
|
|
1594
|
+
}, Pr = (e) => {
|
|
1622
1595
|
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
1623
1596
|
return {
|
|
1624
1597
|
body: t,
|
|
1625
1598
|
meta: n
|
|
1626
1599
|
};
|
|
1627
|
-
},
|
|
1600
|
+
}, Fr = (e) => [
|
|
1628
1601
|
...e.extra ?? [],
|
|
1629
1602
|
e.helpers.renderMetaToHtml(e.meta),
|
|
1630
1603
|
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
1631
1604
|
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
1632
1605
|
e.prepared.stateScript
|
|
1633
|
-
].filter((e) => e.length > 0).join("\n "),
|
|
1606
|
+
].filter((e) => e.length > 0).join("\n "), Ir = (e) => {
|
|
1634
1607
|
let t = e.indexOf("?");
|
|
1635
1608
|
return t === -1 ? {
|
|
1636
1609
|
pathname: e || "/",
|
|
@@ -1639,30 +1612,58 @@ import {
|
|
|
1639
1612
|
pathname: e.slice(0, t) || "/",
|
|
1640
1613
|
search: e.slice(t)
|
|
1641
1614
|
};
|
|
1642
|
-
},
|
|
1643
|
-
|
|
1644
|
-
|
|
1615
|
+
}, Lr = /Could not find required `intl` object/, Rr = (e) => [
|
|
1616
|
+
"",
|
|
1617
|
+
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
1618
|
+
`${e} DID wrap this render in <I18nProvider> — the framework`,
|
|
1619
|
+
"resolved a locale for this request and supplied the provider. You are",
|
|
1620
|
+
"seeing this error anyway, which leaves one cause:",
|
|
1621
|
+
"",
|
|
1622
|
+
" TWO PHYSICAL COPIES OF react-intl (or of @voltro/i18n, which owns it).",
|
|
1623
|
+
"",
|
|
1624
|
+
"A React context is identified by object identity. The provider built from",
|
|
1625
|
+
"one copy is invisible to a `useT()` / `useIntl()` from the other, and the",
|
|
1626
|
+
"error is identical to having no provider at all.",
|
|
1627
|
+
"",
|
|
1628
|
+
"Check it:",
|
|
1629
|
+
"",
|
|
1630
|
+
" pnpm ls -r --depth 10 @voltro/i18n react-intl",
|
|
1631
|
+
"",
|
|
1632
|
+
"More than one version of either, anywhere in the workspace, is the cause.",
|
|
1633
|
+
"It usually means one package.json was left behind on an upgrade — the app",
|
|
1634
|
+
"still builds and every other test still passes.",
|
|
1635
|
+
"",
|
|
1636
|
+
"If both resolve to exactly one version, this diagnosis is wrong and the",
|
|
1637
|
+
"framework is at fault. Report it with that output attached.",
|
|
1638
|
+
"───────────────────────────────────────────────────────────────────────"
|
|
1639
|
+
].join("\n"), zr = (e, t, n) => {
|
|
1640
|
+
if (!t) return;
|
|
1641
|
+
let r = String(e?.message ?? e);
|
|
1642
|
+
return Lr.test(r) ? Rr(n) : void 0;
|
|
1643
|
+
}, Br = "<div id=\"root\"></div>", Vr = "<div id=\"root\">", Hr = "</div>", Ur = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Wr = /\bsrc=["']([^"']+)["']/i, Gr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Kr = (e) => {
|
|
1644
|
+
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Ur, (e) => {
|
|
1645
|
+
let r = Wr.exec(e)?.[1];
|
|
1645
1646
|
return r === void 0 || t(r) ? e : (n.push(r), "");
|
|
1646
1647
|
});
|
|
1647
|
-
e.inlineModuleScriptsAsync && (r = r.replace(
|
|
1648
|
-
let i = r.indexOf(
|
|
1649
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
1648
|
+
e.inlineModuleScriptsAsync && (r = r.replace(Gr, "<script async$1>"));
|
|
1649
|
+
let i = r.indexOf(Br);
|
|
1650
|
+
if (i === -1) throw Error(`[voltro] the generated shell has no \`${Br}\` 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.`);
|
|
1650
1651
|
return {
|
|
1651
|
-
head: `${r.slice(0, i)}${
|
|
1652
|
-
tail: `${
|
|
1652
|
+
head: `${r.slice(0, i)}${Vr}`,
|
|
1653
|
+
tail: `${Hr}${r.slice(i + 21)}`,
|
|
1653
1654
|
bootstrapModules: n
|
|
1654
1655
|
};
|
|
1655
|
-
},
|
|
1656
|
+
}, qr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Jr = (e) => {
|
|
1656
1657
|
let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
|
|
1657
1658
|
if (s || !o || a === null) return;
|
|
1658
1659
|
s = !0, t.statusCode = e.statusCode ?? 200;
|
|
1659
1660
|
for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
|
|
1660
|
-
t.flushHeaders?.(), t.write(
|
|
1661
|
+
t.flushHeaders?.(), t.write(qr({
|
|
1661
1662
|
head: n.head,
|
|
1662
1663
|
headInjection: i(a.meta),
|
|
1663
1664
|
htmlLang: r
|
|
1664
1665
|
}));
|
|
1665
|
-
let c = new
|
|
1666
|
+
let c = new he();
|
|
1666
1667
|
c.pipe(t, { end: !1 }), c.on("end", () => {
|
|
1667
1668
|
t.end(n.tail);
|
|
1668
1669
|
}), a.stream.pipe(c);
|
|
@@ -1687,23 +1688,42 @@ import {
|
|
|
1687
1688
|
return;
|
|
1688
1689
|
}
|
|
1689
1690
|
c();
|
|
1690
|
-
},
|
|
1691
|
+
}, Yr = (e) => Array.isArray(e.preload) && e.preload.length > 0, Xr = (e, t) => typeof e == "string" ? {
|
|
1692
|
+
tag: e,
|
|
1693
|
+
input: {}
|
|
1694
|
+
} : {
|
|
1695
|
+
tag: e.tag,
|
|
1696
|
+
input: e.input?.(t) ?? {}
|
|
1697
|
+
}, Zr = async (e) => {
|
|
1698
|
+
let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
|
|
1699
|
+
if (Yr(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
|
|
1700
|
+
let { tag: t, input: s } = Xr(e, n);
|
|
1701
|
+
try {
|
|
1702
|
+
a(i, t, s, await r(t, s));
|
|
1703
|
+
} catch (e) {
|
|
1704
|
+
o?.({
|
|
1705
|
+
tag: t,
|
|
1706
|
+
apiName: i
|
|
1707
|
+
}, e);
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
}, Z = S({ scope: "voltro:dev:web" }), Qr = S({ scope: "vite" }), $r = await (async () => {
|
|
1691
1711
|
try {
|
|
1692
|
-
let e =
|
|
1712
|
+
let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
|
|
1693
1713
|
return JSON.parse(t).version ?? "0.0.0";
|
|
1694
1714
|
} catch {
|
|
1695
1715
|
return "0.0.0";
|
|
1696
1716
|
}
|
|
1697
|
-
})(),
|
|
1717
|
+
})(), ei = async () => {
|
|
1698
1718
|
try {
|
|
1699
|
-
let e =
|
|
1700
|
-
if (
|
|
1701
|
-
let n =
|
|
1702
|
-
return
|
|
1719
|
+
let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
|
|
1720
|
+
if (T(p(t, "package.json"))) return t;
|
|
1721
|
+
let n = h(e, "..", "..", "..", "devtools");
|
|
1722
|
+
return T(p(n, "package.json")) ? n : null;
|
|
1703
1723
|
} catch {
|
|
1704
1724
|
return null;
|
|
1705
1725
|
}
|
|
1706
|
-
},
|
|
1726
|
+
}, ti = (e, t) => e.disableDevtools || !t ? [] : [
|
|
1707
1727
|
"",
|
|
1708
1728
|
"// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
|
|
1709
1729
|
"// compile-time constant, so prod builds strip this whole `if` block — the",
|
|
@@ -1713,46 +1733,46 @@ import {
|
|
|
1713
1733
|
" await import('@voltro/devtools/styles.css')",
|
|
1714
1734
|
" Devtools = (await import('@voltro/devtools')).VoltroDevtools",
|
|
1715
1735
|
"}"
|
|
1716
|
-
],
|
|
1736
|
+
], ni = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], ri = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ii = (e) => e.sentry ? [
|
|
1717
1737
|
"",
|
|
1718
1738
|
"// Browser-side Sentry (frontend half of the deep integration). Errors +",
|
|
1719
1739
|
"// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
|
|
1720
1740
|
`await initSentryBrowser(${JSON.stringify(e.sentry)})`
|
|
1721
|
-
] : [],
|
|
1722
|
-
let t = [], n =
|
|
1741
|
+
] : [], ai = (e) => e.env ? ["import './env.public'"] : [], oi = (e) => {
|
|
1742
|
+
let t = [], n = h(e);
|
|
1723
1743
|
for (;;) {
|
|
1724
|
-
|
|
1725
|
-
let e =
|
|
1744
|
+
T(p(n, "pnpm-workspace.yaml")) && t.push(n);
|
|
1745
|
+
let e = d(n);
|
|
1726
1746
|
if (e === n) break;
|
|
1727
1747
|
n = e;
|
|
1728
1748
|
}
|
|
1729
1749
|
return t;
|
|
1730
|
-
},
|
|
1750
|
+
}, si = In, ci = (e) => {
|
|
1731
1751
|
if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
|
|
1732
1752
|
let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
|
|
1733
1753
|
if (t) return `island-${t[1]}`;
|
|
1734
|
-
},
|
|
1735
|
-
let
|
|
1736
|
-
return
|
|
1737
|
-
},
|
|
1738
|
-
let
|
|
1754
|
+
}, li = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, ui = (e) => e.startsWith("(") && e.endsWith(")"), di = (e) => e.filter((e) => !ui(e)), fi = (e) => {
|
|
1755
|
+
let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !ui(e));
|
|
1756
|
+
return t.length === 0 ? "/" : "/" + t.join("/");
|
|
1757
|
+
}, pi = (e) => `${e.replace(r, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, 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) => {
|
|
1758
|
+
let t = [], i = [], a = async (e, o) => {
|
|
1739
1759
|
let s = [];
|
|
1740
1760
|
try {
|
|
1741
|
-
s = await
|
|
1761
|
+
s = await O.readdir(e, { withFileTypes: !0 });
|
|
1742
1762
|
} catch {
|
|
1743
1763
|
return;
|
|
1744
1764
|
}
|
|
1745
|
-
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !
|
|
1765
|
+
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !si(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
|
|
1746
1766
|
if (l.some((e) => n.has(e))) {
|
|
1747
1767
|
let t = u.has("layout.tsx"), r = !1;
|
|
1748
1768
|
if (t) try {
|
|
1749
|
-
let t = await
|
|
1750
|
-
r =
|
|
1769
|
+
let t = await O.readFile(p(e, "layout.tsx"), "utf8");
|
|
1770
|
+
r = li.test(t);
|
|
1751
1771
|
} catch {}
|
|
1752
1772
|
i.push({
|
|
1753
1773
|
dir: d,
|
|
1754
1774
|
chain: o,
|
|
1755
|
-
contributesToUrl: o.length === 0 || !
|
|
1775
|
+
contributesToUrl: o.length === 0 || !ui(o[o.length - 1]),
|
|
1756
1776
|
hasLayout: t,
|
|
1757
1777
|
hasLayoutLoader: r,
|
|
1758
1778
|
hasError: u.has("error.tsx"),
|
|
@@ -1762,38 +1782,38 @@ import {
|
|
|
1762
1782
|
});
|
|
1763
1783
|
}
|
|
1764
1784
|
for (let e of l) {
|
|
1765
|
-
if (!
|
|
1785
|
+
if (!r.test(e)) continue;
|
|
1766
1786
|
let n = d ? `${d}/${e}` : e;
|
|
1767
|
-
|
|
1787
|
+
t.push({
|
|
1768
1788
|
file: n,
|
|
1769
|
-
pattern:
|
|
1770
|
-
ident:
|
|
1789
|
+
pattern: fi(n),
|
|
1790
|
+
ident: pi(n),
|
|
1771
1791
|
dirChain: o
|
|
1772
1792
|
});
|
|
1773
1793
|
}
|
|
1774
|
-
for (let t of c) await a(
|
|
1794
|
+
for (let t of c) await a(p(e, t), [...o, t]);
|
|
1775
1795
|
};
|
|
1776
|
-
await a(e, []),
|
|
1796
|
+
await a(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
|
|
1777
1797
|
let o = /* @__PURE__ */ new Set();
|
|
1778
|
-
for (let e of
|
|
1798
|
+
for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
|
|
1779
1799
|
let s = [], c = [];
|
|
1780
1800
|
for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
|
|
1781
1801
|
dir: t.dir,
|
|
1782
1802
|
files: e
|
|
1783
1803
|
});
|
|
1784
1804
|
return {
|
|
1785
|
-
pages:
|
|
1805
|
+
pages: t,
|
|
1786
1806
|
dirs: s,
|
|
1787
1807
|
orphanedSpecials: c
|
|
1788
1808
|
};
|
|
1789
|
-
},
|
|
1809
|
+
}, mi = (e, t) => {
|
|
1790
1810
|
let n = [];
|
|
1791
1811
|
for (let r = 0; r <= t.length; r++) {
|
|
1792
1812
|
let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
|
|
1793
1813
|
a && n.push(a);
|
|
1794
1814
|
}
|
|
1795
1815
|
return n;
|
|
1796
|
-
},
|
|
1816
|
+
}, hi = async (e) => {
|
|
1797
1817
|
let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
|
|
1798
1818
|
return {
|
|
1799
1819
|
chain: await Promise.all(t.map(async (e, t) => {
|
|
@@ -1816,10 +1836,10 @@ import {
|
|
|
1816
1836
|
})),
|
|
1817
1837
|
segmentLoaderData: o
|
|
1818
1838
|
};
|
|
1819
|
-
},
|
|
1820
|
-
let t =
|
|
1839
|
+
}, gi = (e) => {
|
|
1840
|
+
let t = di(e);
|
|
1821
1841
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
1822
|
-
},
|
|
1842
|
+
}, _i = [
|
|
1823
1843
|
"// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
|
|
1824
1844
|
"// in sync with Vite's CSS HMR. Without this, edits to .css files",
|
|
1825
1845
|
"// only update the JS-injected <style> overlay; the underlying <link>",
|
|
@@ -1912,7 +1932,7 @@ import {
|
|
|
1912
1932
|
" _vdtErrorStart('Build error')",
|
|
1913
1933
|
" })",
|
|
1914
1934
|
"}"
|
|
1915
|
-
].join("\n"),
|
|
1935
|
+
].join("\n"), vi = (e) => {
|
|
1916
1936
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
1917
1937
|
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, "\\$&"));
|
|
1918
1938
|
let a = i.join("/");
|
|
@@ -1921,8 +1941,8 @@ import {
|
|
|
1921
1941
|
paramNames: t,
|
|
1922
1942
|
priority: n
|
|
1923
1943
|
};
|
|
1924
|
-
},
|
|
1925
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
1944
|
+
}, yi = (e) => e.map((e) => {
|
|
1945
|
+
let { regex: t, paramNames: n, priority: r } = vi(e.pattern);
|
|
1926
1946
|
return {
|
|
1927
1947
|
pattern: e.pattern,
|
|
1928
1948
|
file: e.file,
|
|
@@ -1931,7 +1951,7 @@ import {
|
|
|
1931
1951
|
paramNames: n,
|
|
1932
1952
|
priority: r
|
|
1933
1953
|
};
|
|
1934
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
1954
|
+
}).slice().sort((e, t) => e.priority - t.priority), bi = (e, t) => {
|
|
1935
1955
|
for (let n of t) {
|
|
1936
1956
|
let t = n.regex.exec(e);
|
|
1937
1957
|
if (!t) continue;
|
|
@@ -1943,30 +1963,30 @@ import {
|
|
|
1943
1963
|
};
|
|
1944
1964
|
}
|
|
1945
1965
|
return null;
|
|
1946
|
-
},
|
|
1966
|
+
}, xi = async (e, t) => {
|
|
1947
1967
|
let n = e;
|
|
1948
1968
|
for (;;) {
|
|
1949
|
-
let e =
|
|
1969
|
+
let e = p(n, "node_modules", t);
|
|
1950
1970
|
try {
|
|
1951
|
-
if ((await
|
|
1952
|
-
let t = await
|
|
1971
|
+
if ((await O.stat(e)).isDirectory()) {
|
|
1972
|
+
let t = await O.realpath(e);
|
|
1953
1973
|
return t.includes("/node_modules/") ? null : t;
|
|
1954
1974
|
}
|
|
1955
1975
|
} catch {}
|
|
1956
|
-
let r =
|
|
1976
|
+
let r = d(n);
|
|
1957
1977
|
if (r === n) return null;
|
|
1958
1978
|
n = r;
|
|
1959
1979
|
}
|
|
1960
|
-
},
|
|
1980
|
+
}, Si = async (e) => {
|
|
1961
1981
|
try {
|
|
1962
|
-
let t = await import(
|
|
1982
|
+
let t = await import(_(p(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
|
|
1963
1983
|
return a ? {
|
|
1964
1984
|
port: r,
|
|
1965
1985
|
wsPath: a
|
|
1966
1986
|
} : { port: r };
|
|
1967
1987
|
} catch {}
|
|
1968
1988
|
return { port: 4e3 };
|
|
1969
|
-
},
|
|
1989
|
+
}, Ci = (e, t) => ({
|
|
1970
1990
|
name: e,
|
|
1971
1991
|
pkg: t.package,
|
|
1972
1992
|
browserWsUrl: t.url,
|
|
@@ -1974,7 +1994,7 @@ import {
|
|
|
1974
1994
|
...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
|
|
1975
1995
|
...t.headers ? { headers: t.headers } : {},
|
|
1976
1996
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
1977
|
-
}),
|
|
1997
|
+
}), wi = (e, t, n) => {
|
|
1978
1998
|
let r = t.transport?.wsPath ?? n.wsPath;
|
|
1979
1999
|
return {
|
|
1980
2000
|
name: e,
|
|
@@ -1986,7 +2006,7 @@ import {
|
|
|
1986
2006
|
...t.headers ? { headers: t.headers } : {},
|
|
1987
2007
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
1988
2008
|
};
|
|
1989
|
-
},
|
|
2009
|
+
}, Ti = (e) => {
|
|
1990
2010
|
let t = /* @__PURE__ */ new Map();
|
|
1991
2011
|
for (let n of e) {
|
|
1992
2012
|
if (n.proxyTarget === void 0) continue;
|
|
@@ -1994,43 +2014,43 @@ import {
|
|
|
1994
2014
|
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>.`);
|
|
1995
2015
|
t.set(n.browserWsUrl, n.name);
|
|
1996
2016
|
}
|
|
1997
|
-
},
|
|
2017
|
+
}, Ei = async (e, t) => {
|
|
1998
2018
|
let n = Object.entries(t.apis ?? {}), r = [];
|
|
1999
2019
|
for (let [t, i] of n) {
|
|
2000
2020
|
if (i.url) {
|
|
2001
|
-
r.push(
|
|
2021
|
+
r.push(Ci(t, i));
|
|
2002
2022
|
continue;
|
|
2003
2023
|
}
|
|
2004
|
-
let n = await
|
|
2024
|
+
let n = await xi(e, i.package);
|
|
2005
2025
|
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.`);
|
|
2006
|
-
r.push(
|
|
2026
|
+
r.push(wi(t, i, await Si(n)));
|
|
2007
2027
|
}
|
|
2008
|
-
return
|
|
2009
|
-
},
|
|
2028
|
+
return Ti(r), r;
|
|
2029
|
+
}, Di = (e) => {
|
|
2010
2030
|
if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
|
|
2011
2031
|
let t = new URL(e);
|
|
2012
2032
|
return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
|
|
2013
2033
|
} catch {
|
|
2014
2034
|
return;
|
|
2015
2035
|
}
|
|
2016
|
-
},
|
|
2036
|
+
}, Oi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, ki = (e) => process.env[Oi(e)] ?? process.env.VOLTRO_API_ORIGIN, Ai = (e, t) => {
|
|
2017
2037
|
if (!e) return;
|
|
2018
|
-
let n =
|
|
2038
|
+
let n = ki(e.name) ?? e.serverOrigin;
|
|
2019
2039
|
if (n) {
|
|
2020
|
-
let e =
|
|
2040
|
+
let e = Di(n);
|
|
2021
2041
|
if (e) return e;
|
|
2022
2042
|
}
|
|
2023
2043
|
if (t?.allowDevProxy && e.proxyTarget) {
|
|
2024
|
-
let t =
|
|
2044
|
+
let t = Di(e.proxyTarget);
|
|
2025
2045
|
if (t) return t;
|
|
2026
2046
|
}
|
|
2027
|
-
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return
|
|
2028
|
-
},
|
|
2047
|
+
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Di(e.browserWsUrl);
|
|
2048
|
+
}, ji = (e, t, n) => {
|
|
2029
2049
|
if (!e) {
|
|
2030
2050
|
if (n?.apiName === void 0) return;
|
|
2031
2051
|
let e = n.apiName;
|
|
2032
2052
|
return async () => {
|
|
2033
|
-
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 ${
|
|
2053
|
+
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 ${Oi(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.`);
|
|
2034
2054
|
};
|
|
2035
2055
|
}
|
|
2036
2056
|
return async (r, i) => {
|
|
@@ -2052,7 +2072,7 @@ import {
|
|
|
2052
2072
|
});
|
|
2053
2073
|
} catch (t) {
|
|
2054
2074
|
let i = t?.cause?.code ?? String(t?.message ?? t);
|
|
2055
|
-
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${
|
|
2075
|
+
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Oi(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 });
|
|
2056
2076
|
}
|
|
2057
2077
|
if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
|
|
2058
2078
|
let s = await o.json();
|
|
@@ -2070,8 +2090,8 @@ import {
|
|
|
2070
2090
|
}
|
|
2071
2091
|
if (u) return l;
|
|
2072
2092
|
};
|
|
2073
|
-
},
|
|
2074
|
-
let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o =
|
|
2093
|
+
}, Mi = async (e, t, n, r = {}) => {
|
|
2094
|
+
let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(p(e, "node_modules", "@voltro", "devtools", "package.json")) || await ei() !== null, s = t.theme === "system" ? [
|
|
2075
2095
|
" <script>",
|
|
2076
2096
|
" (function () {",
|
|
2077
2097
|
" var root = document.documentElement",
|
|
@@ -2109,9 +2129,9 @@ import {
|
|
|
2109
2129
|
" </body>",
|
|
2110
2130
|
"</html>",
|
|
2111
2131
|
""
|
|
2112
|
-
].join("\n"), l =
|
|
2113
|
-
await
|
|
2114
|
-
for (let e of
|
|
2132
|
+
].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await $(l);
|
|
2133
|
+
await or(l, u);
|
|
2134
|
+
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.`);
|
|
2115
2135
|
let m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, h = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, g = n.map((e) => `import { appGroup as ${m(e.name)}, appDescriptors as ${h(e.name)} } from '${e.pkg}/rpcGroup'`);
|
|
2116
2136
|
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"));
|
|
2117
2137
|
let _ = n.map((e) => {
|
|
@@ -2122,16 +2142,16 @@ import {
|
|
|
2122
2142
|
let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
|
|
2123
2143
|
for (let e of d) {
|
|
2124
2144
|
let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
|
|
2125
|
-
e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${
|
|
2145
|
+
e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
|
|
2126
2146
|
}
|
|
2127
2147
|
let r = u.map((e) => {
|
|
2128
|
-
let t =
|
|
2148
|
+
let t = mi(d, e.dirChain).map((e) => {
|
|
2129
2149
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2130
2150
|
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(", ")} }`;
|
|
2131
2151
|
}).join(",\n");
|
|
2132
2152
|
return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
|
|
2133
2153
|
}), i = d.filter((e) => e.hasNotFound).map((e) => {
|
|
2134
|
-
let t =
|
|
2154
|
+
let t = gi(e.chain), n = mi(d, e.chain).map((e) => {
|
|
2135
2155
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2136
2156
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
|
|
2137
2157
|
}).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
|
|
@@ -2139,23 +2159,23 @@ import {
|
|
|
2139
2159
|
}), a = [], s = [], c = [], l = [], f = [], p = [];
|
|
2140
2160
|
for (let e of d) {
|
|
2141
2161
|
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`, o = JSON.stringify(e.dir);
|
|
2142
|
-
e.hasLayout && e.hasLayoutLoader ? (s.push(` ${o}: ${
|
|
2162
|
+
e.hasLayout && e.hasLayoutLoader ? (s.push(` ${o}: ${Q(e.dir, "Layout")}Mod.default,`), c.push(` ${o}: ${Q(e.dir, "Layout")}Mod.loader,`), a.push({
|
|
2143
2163
|
relPath: t,
|
|
2144
2164
|
kind: "layout",
|
|
2145
2165
|
slotKey: e.dir
|
|
2146
|
-
})) : e.hasLayout && (s.push(` ${o}: ${
|
|
2166
|
+
})) : e.hasLayout && (s.push(` ${o}: ${Q(e.dir, "Layout")},`), a.push({
|
|
2147
2167
|
relPath: t,
|
|
2148
2168
|
kind: "layout",
|
|
2149
2169
|
slotKey: e.dir
|
|
2150
|
-
})), e.hasError && (l.push(` ${o}: ${
|
|
2170
|
+
})), e.hasError && (l.push(` ${o}: ${Q(e.dir, "Error")},`), a.push({
|
|
2151
2171
|
relPath: n,
|
|
2152
2172
|
kind: "error",
|
|
2153
2173
|
slotKey: e.dir
|
|
2154
|
-
})), e.hasPending && (f.push(` ${o}: ${
|
|
2174
|
+
})), e.hasPending && (f.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
|
|
2155
2175
|
relPath: r,
|
|
2156
2176
|
kind: "pending",
|
|
2157
2177
|
slotKey: e.dir
|
|
2158
|
-
})), e.hasNotFound && (p.push(` ${o}: ${
|
|
2178
|
+
})), e.hasNotFound && (p.push(` ${o}: ${Q(e.dir, "NotFound")},`), a.push({
|
|
2159
2179
|
relPath: i,
|
|
2160
2180
|
kind: "notFound",
|
|
2161
2181
|
slotKey: e.dir
|
|
@@ -2329,11 +2349,28 @@ import {
|
|
|
2329
2349
|
" defaultLocale: I18N_DEFAULT,",
|
|
2330
2350
|
" })",
|
|
2331
2351
|
" }",
|
|
2332
|
-
" // Client-side:
|
|
2333
|
-
" //
|
|
2334
|
-
" //
|
|
2335
|
-
" //
|
|
2352
|
+
" // Client-side: ADOPT what the server resolved, from <html lang>.",
|
|
2353
|
+
" //",
|
|
2354
|
+
" // Dropping the Accept-Language signal here is not the same as",
|
|
2355
|
+
" // agreeing with the server about it, and the difference is every",
|
|
2356
|
+
" // FIRST visit: with no cookie yet, the server negotiated",
|
|
2357
|
+
" // Accept-Language while the client fell through to the default, so",
|
|
2358
|
+
" // an English browser on a German-default app hydrated 'de' over an",
|
|
2359
|
+
" // 'en' tree and React discarded the whole server render — exactly",
|
|
2360
|
+
" // what SSR was turned on to avoid. It stops the moment anything",
|
|
2361
|
+
" // writes the cookie, which is why it is invisible after one",
|
|
2362
|
+
" // language switch and reproduces on every new visitor.",
|
|
2363
|
+
" //",
|
|
2364
|
+
" // navigator.languages is still NOT read: it can diverge from what",
|
|
2365
|
+
" // the server saw. The server publishes its answer instead, and the",
|
|
2366
|
+
" // <html lang> attribute is that answer — set from the SAME resolver",
|
|
2367
|
+
" // that built the provider, on the same request.",
|
|
2336
2368
|
" if (typeof document === 'undefined') return I18N_DEFAULT",
|
|
2369
|
+
" const published = document.documentElement.lang",
|
|
2370
|
+
" if (published && I18N_SUPPORTED.includes(published)) return published",
|
|
2371
|
+
" // No published locale (a page served by something else, or an",
|
|
2372
|
+
" // attribute a consumer overwrote): fall back to the cookie, which",
|
|
2373
|
+
" // both halves can read, and never to a client-only signal.",
|
|
2337
2374
|
" return resolveLocale({",
|
|
2338
2375
|
" cookieHeader: document.cookie,",
|
|
2339
2376
|
" acceptLanguageHeader: null,",
|
|
@@ -2370,14 +2407,14 @@ import {
|
|
|
2370
2407
|
"// resolved apis map. Side-effect only — no local component definitions —",
|
|
2371
2408
|
"// so downstream invalidations (user page edits) terminate at app.tsx.",
|
|
2372
2409
|
"",
|
|
2373
|
-
...
|
|
2410
|
+
...ai(t),
|
|
2374
2411
|
"import { mount } from '@voltro/web'",
|
|
2375
2412
|
...g,
|
|
2376
2413
|
"import { App } from './app'",
|
|
2377
2414
|
"import { preloadCurrentRoute } from './routeTable'",
|
|
2378
|
-
...
|
|
2379
|
-
...
|
|
2380
|
-
...
|
|
2415
|
+
...ri(t),
|
|
2416
|
+
...ti(t, o),
|
|
2417
|
+
...ii(t),
|
|
2381
2418
|
"",
|
|
2382
2419
|
"// Preload the current route's page chunk BEFORE hydration so the first",
|
|
2383
2420
|
"// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
|
|
@@ -2394,10 +2431,10 @@ import {
|
|
|
2394
2431
|
" apis: {",
|
|
2395
2432
|
..._,
|
|
2396
2433
|
" },",
|
|
2397
|
-
...
|
|
2434
|
+
...ni(t, o),
|
|
2398
2435
|
"})",
|
|
2399
2436
|
"",
|
|
2400
|
-
|
|
2437
|
+
_i
|
|
2401
2438
|
].join("\n");
|
|
2402
2439
|
} else v = "", y = "", b = [
|
|
2403
2440
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
@@ -2405,94 +2442,94 @@ import {
|
|
|
2405
2442
|
"// and calls mount(). Side-effect only, no component definitions, so the",
|
|
2406
2443
|
"// user's component file remains the Fast Refresh boundary.",
|
|
2407
2444
|
"",
|
|
2408
|
-
...
|
|
2445
|
+
...ai(t),
|
|
2409
2446
|
"import { mount } from '@voltro/web'",
|
|
2410
2447
|
...g,
|
|
2411
2448
|
"import App from '../src/App'",
|
|
2412
|
-
...
|
|
2413
|
-
...
|
|
2414
|
-
...
|
|
2449
|
+
...ri(t),
|
|
2450
|
+
...ti(t, o),
|
|
2451
|
+
...ii(t),
|
|
2415
2452
|
"",
|
|
2416
2453
|
"mount(App, {",
|
|
2417
2454
|
" apis: {",
|
|
2418
2455
|
..._,
|
|
2419
2456
|
" },",
|
|
2420
|
-
...
|
|
2457
|
+
...ni(t, o),
|
|
2421
2458
|
"})",
|
|
2422
2459
|
"",
|
|
2423
|
-
|
|
2460
|
+
_i
|
|
2424
2461
|
].join("\n");
|
|
2425
|
-
let x =
|
|
2426
|
-
await
|
|
2427
|
-
let S =
|
|
2462
|
+
let x = p(e, ".framework");
|
|
2463
|
+
await O.mkdir(x, { recursive: !0 }), t.env ? await nt(x, r) : await O.rm(p(x, "env.public.ts"), { force: !0 }), await O.writeFile(p(x, "index.html"), c, "utf8"), await O.writeFile(p(x, "main.tsx"), b, "utf8"), v ? (await O.writeFile(p(x, "app.tsx"), v, "utf8"), await O.writeFile(p(x, "routeTable.ts"), y, "utf8")) : (await O.rm(p(x, "app.tsx"), { force: !0 }), await O.rm(p(x, "routeTable.ts"), { force: !0 }));
|
|
2464
|
+
let S = p(e, ".gitignore"), C = "";
|
|
2428
2465
|
try {
|
|
2429
|
-
C = await
|
|
2466
|
+
C = await O.readFile(S, "utf8");
|
|
2430
2467
|
} catch {}
|
|
2431
|
-
let w = ["/.framework/"],
|
|
2432
|
-
if (
|
|
2468
|
+
let w = ["/.framework/"], E = new Set(C.split("\n").map((e) => e.trim())), D = w.filter((e) => !E.has(e));
|
|
2469
|
+
if (D.length > 0) {
|
|
2433
2470
|
let e = C === "" || C.endsWith("\n") ? "" : "\n";
|
|
2434
2471
|
try {
|
|
2435
|
-
await
|
|
2472
|
+
await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
|
|
2436
2473
|
} catch (e) {
|
|
2437
|
-
|
|
2474
|
+
Z.warn(`could not add ${D.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
|
|
2438
2475
|
}
|
|
2439
2476
|
}
|
|
2440
|
-
},
|
|
2477
|
+
}, Ni = async (e, t) => {
|
|
2441
2478
|
try {
|
|
2442
|
-
let n =
|
|
2443
|
-
if (!
|
|
2444
|
-
let r = await
|
|
2479
|
+
let n = p(d(e), "project.json");
|
|
2480
|
+
if (!T(n)) return;
|
|
2481
|
+
let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
|
|
2445
2482
|
for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
|
|
2446
2483
|
if (o.length === 0) return;
|
|
2447
|
-
|
|
2484
|
+
Z.warn("sibling app(s) claim the same port — only one boots", {
|
|
2448
2485
|
port: t,
|
|
2449
2486
|
conflicts: o,
|
|
2450
2487
|
projectJson: n
|
|
2451
2488
|
});
|
|
2452
2489
|
} catch {}
|
|
2453
|
-
},
|
|
2454
|
-
let t =
|
|
2490
|
+
}, Pi = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), Fi = async (e) => {
|
|
2491
|
+
let t = Pi(e), n = T(t) ? t : p(e, "app.config.ts");
|
|
2455
2492
|
try {
|
|
2456
|
-
let e = (await import(
|
|
2493
|
+
let e = (await import(_(n).href)).default;
|
|
2457
2494
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
|
|
2458
2495
|
} catch {
|
|
2459
2496
|
return null;
|
|
2460
2497
|
}
|
|
2461
|
-
},
|
|
2462
|
-
let t = await
|
|
2498
|
+
}, Ii = async (e) => {
|
|
2499
|
+
let t = await Fi(e);
|
|
2463
2500
|
if (!t) return {
|
|
2464
2501
|
ran: !1,
|
|
2465
2502
|
exitCode: 0
|
|
2466
2503
|
};
|
|
2467
|
-
|
|
2468
|
-
let n =
|
|
2469
|
-
|
|
2470
|
-
let
|
|
2471
|
-
for (let e of
|
|
2504
|
+
Nn();
|
|
2505
|
+
let n = qt();
|
|
2506
|
+
fn(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
|
|
2507
|
+
let r = await Ei(e, t);
|
|
2508
|
+
for (let e of r) Z.info("api wired", {
|
|
2472
2509
|
name: e.name,
|
|
2473
2510
|
pkg: e.pkg,
|
|
2474
2511
|
...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
|
|
2475
2512
|
});
|
|
2476
|
-
|
|
2513
|
+
Me(e).then((e) => {
|
|
2477
2514
|
for (let t of e.files) if (t.action === "created") {
|
|
2478
2515
|
let e = t.path.split("/").pop() ?? t.path;
|
|
2479
|
-
|
|
2516
|
+
Z.info(`${e} seeded`, { path: t.path });
|
|
2480
2517
|
}
|
|
2481
2518
|
}).catch(() => {});
|
|
2482
|
-
let { resolved: d } = await
|
|
2519
|
+
let { resolved: d } = await rt({
|
|
2483
2520
|
rawEnv: t.env,
|
|
2484
2521
|
appType: "web",
|
|
2485
2522
|
root: e,
|
|
2486
|
-
log:
|
|
2523
|
+
log: Z,
|
|
2487
2524
|
generateTypes: !0
|
|
2488
|
-
}),
|
|
2489
|
-
await
|
|
2525
|
+
}), f = d.publicValues;
|
|
2526
|
+
await Mi(e, t, r, f), Z.debug("generated framework entry files", { files: [
|
|
2490
2527
|
"index.html",
|
|
2491
2528
|
".framework/main.tsx",
|
|
2492
2529
|
...t.env ? [".framework/env.public.ts"] : []
|
|
2493
2530
|
] });
|
|
2494
|
-
let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v =
|
|
2495
|
-
await
|
|
2531
|
+
let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v = Ke("web", _, g), y = pr(_);
|
|
2532
|
+
await We({
|
|
2496
2533
|
id: v,
|
|
2497
2534
|
name: _,
|
|
2498
2535
|
kind: "web",
|
|
@@ -2500,22 +2537,22 @@ import {
|
|
|
2500
2537
|
pid: process.pid,
|
|
2501
2538
|
status: "booting",
|
|
2502
2539
|
logFile: y.path
|
|
2503
|
-
}).catch(() => {}), await
|
|
2504
|
-
let { pages: b, dirs: x } = await
|
|
2540
|
+
}).catch(() => {}), await Ni(e, g);
|
|
2541
|
+
let { pages: b, dirs: x } = await $(p(e, "src", "pages")), S = {
|
|
2505
2542
|
dirs: x,
|
|
2506
|
-
ssrRoutes:
|
|
2507
|
-
},
|
|
2543
|
+
ssrRoutes: yi(b)
|
|
2544
|
+
}, w = x.map((e) => ({
|
|
2508
2545
|
dir: e.dir,
|
|
2509
2546
|
hasLayout: e.hasLayout,
|
|
2510
2547
|
hasError: e.hasError,
|
|
2511
2548
|
hasPending: e.hasPending,
|
|
2512
2549
|
hasNotFound: e.hasNotFound
|
|
2513
|
-
})),
|
|
2550
|
+
})), E = await zt({
|
|
2514
2551
|
appRoot: e,
|
|
2515
2552
|
pages: b
|
|
2516
2553
|
});
|
|
2517
|
-
|
|
2518
|
-
let
|
|
2554
|
+
E.wrote && Z.debug("routes codegen wrote", { path: m(e, E.path) });
|
|
2555
|
+
let D = await Xe("vite", () => import("vite")), ee = (await import("@vitejs/plugin-react")).default, te = (await import("@tailwindcss/vite")).default, k = p(e, ".framework"), A = p(e, "src"), ne = /* @__PURE__ */ new Set([
|
|
2519
2556
|
".framework",
|
|
2520
2557
|
"node_modules",
|
|
2521
2558
|
"dist",
|
|
@@ -2523,88 +2560,88 @@ import {
|
|
|
2523
2560
|
".vite",
|
|
2524
2561
|
".turbo",
|
|
2525
2562
|
".cache"
|
|
2526
|
-
]),
|
|
2563
|
+
]), re = {
|
|
2527
2564
|
name: "framework:watch-app-sources",
|
|
2528
2565
|
async configureServer(t) {
|
|
2529
2566
|
try {
|
|
2530
|
-
let n = (await
|
|
2531
|
-
for (let r of n) t.watcher.add(
|
|
2532
|
-
n.length === 0 && t.watcher.add(
|
|
2567
|
+
let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !ne.has(e.name));
|
|
2568
|
+
for (let r of n) t.watcher.add(p(e, r.name));
|
|
2569
|
+
n.length === 0 && t.watcher.add(A);
|
|
2533
2570
|
} catch {
|
|
2534
|
-
t.watcher.add(
|
|
2571
|
+
t.watcher.add(A);
|
|
2535
2572
|
}
|
|
2536
2573
|
try {
|
|
2537
|
-
let n = await
|
|
2574
|
+
let n = await O.readFile(p(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
|
|
2538
2575
|
...r.dependencies,
|
|
2539
2576
|
...r.devDependencies
|
|
2540
2577
|
});
|
|
2541
2578
|
await Promise.all(i.map(async (n) => {
|
|
2542
|
-
let r = await
|
|
2579
|
+
let r = await xi(e, n);
|
|
2543
2580
|
if (!r) return;
|
|
2544
|
-
let i =
|
|
2581
|
+
let i = p(r, "src");
|
|
2545
2582
|
try {
|
|
2546
|
-
(await
|
|
2583
|
+
(await O.stat(i)).isDirectory() && t.watcher.add(i);
|
|
2547
2584
|
} catch {}
|
|
2548
2585
|
}));
|
|
2549
2586
|
} catch {}
|
|
2550
2587
|
}
|
|
2551
|
-
},
|
|
2588
|
+
}, j = p(e, "src", "pages"), M = (e) => e.endsWith(".tsx") && (e === j || e.startsWith(j + "/")), ie = (e) => e === j || e.startsWith(j + "/"), N = async (n) => {
|
|
2552
2589
|
try {
|
|
2553
|
-
let
|
|
2554
|
-
await
|
|
2555
|
-
let { pages:
|
|
2556
|
-
await
|
|
2590
|
+
let i = Date.now();
|
|
2591
|
+
await Mi(e, t, r, f);
|
|
2592
|
+
let { pages: a, dirs: o } = await $(j);
|
|
2593
|
+
await zt({
|
|
2557
2594
|
appRoot: e,
|
|
2558
|
-
pages:
|
|
2559
|
-
}), S.dirs =
|
|
2595
|
+
pages: a
|
|
2596
|
+
}), S.dirs = o, S.ssrRoutes = yi(a), Z.info("page tree regenerated", {
|
|
2560
2597
|
reason: n,
|
|
2561
|
-
ms: Date.now() -
|
|
2598
|
+
ms: Date.now() - i,
|
|
2562
2599
|
routes: S.ssrRoutes.length
|
|
2563
2600
|
});
|
|
2564
2601
|
} catch (e) {
|
|
2565
|
-
|
|
2602
|
+
Z.error("page tree regen failed", { reason: n }, e);
|
|
2566
2603
|
}
|
|
2567
|
-
},
|
|
2604
|
+
}, P = {
|
|
2568
2605
|
name: "framework:regenerate-on-page-tree-change",
|
|
2569
2606
|
configureServer(t) {
|
|
2570
2607
|
let n = null, r = [], i = (e) => {
|
|
2571
2608
|
r.push(e), n && clearTimeout(n), n = setTimeout(() => {
|
|
2572
2609
|
n = null;
|
|
2573
2610
|
let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
|
|
2574
|
-
r.length = 0,
|
|
2611
|
+
r.length = 0, N(e);
|
|
2575
2612
|
}, 50);
|
|
2576
2613
|
};
|
|
2577
2614
|
t.watcher.on("add", (t) => {
|
|
2578
|
-
|
|
2615
|
+
M(t) && i(`add ${m(e, t)}`);
|
|
2579
2616
|
}), t.watcher.on("unlink", (t) => {
|
|
2580
|
-
|
|
2617
|
+
M(t) && i(`unlink ${m(e, t)}`);
|
|
2581
2618
|
}), t.watcher.on("addDir", (t) => {
|
|
2582
|
-
|
|
2619
|
+
ie(t) && i(`addDir ${m(e, t)}`);
|
|
2583
2620
|
}), t.watcher.on("unlinkDir", (t) => {
|
|
2584
|
-
|
|
2621
|
+
ie(t) && i(`unlinkDir ${m(e, t)}`);
|
|
2585
2622
|
});
|
|
2586
2623
|
}
|
|
2587
|
-
},
|
|
2588
|
-
if (!
|
|
2624
|
+
}, F = p(e, "app.config.ts"), ae = (e) => {
|
|
2625
|
+
if (!z(e.env)) return "";
|
|
2589
2626
|
let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
|
|
2590
2627
|
return `${String(e.env.publicPrefix)}|${t.join(",")}`;
|
|
2591
|
-
},
|
|
2628
|
+
}, I = (e, t) => {
|
|
2592
2629
|
let n = [];
|
|
2593
|
-
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"),
|
|
2594
|
-
},
|
|
2630
|
+
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"), ae(e) !== ae(t) && n.push("env"), n;
|
|
2631
|
+
}, L = t, R = h(F), oe = {
|
|
2595
2632
|
name: "framework:watch-app-config",
|
|
2596
2633
|
async configureServer(t) {
|
|
2597
|
-
t.watcher.add(
|
|
2634
|
+
t.watcher.add(F), Z.info("watching app.config.ts for changes", { path: m(e, F) });
|
|
2598
2635
|
let n = async () => {
|
|
2599
2636
|
try {
|
|
2600
2637
|
try {
|
|
2601
|
-
let e = t.moduleGraph.getModuleById(
|
|
2638
|
+
let e = t.moduleGraph.getModuleById(F);
|
|
2602
2639
|
e && t.moduleGraph.invalidateModule(e);
|
|
2603
2640
|
} catch {}
|
|
2604
|
-
let e = (await t.ssrLoadModule(
|
|
2605
|
-
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (
|
|
2641
|
+
let e = (await t.ssrLoadModule(F, { fixStacktrace: !0 })).default;
|
|
2642
|
+
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);
|
|
2606
2643
|
} catch (e) {
|
|
2607
|
-
return
|
|
2644
|
+
return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
|
|
2608
2645
|
}
|
|
2609
2646
|
}, r = null, i = () => {
|
|
2610
2647
|
r && clearTimeout(r), r = setTimeout(() => {
|
|
@@ -2613,24 +2650,24 @@ import {
|
|
|
2613
2650
|
}, a = async () => {
|
|
2614
2651
|
let r = await n();
|
|
2615
2652
|
if (!r) {
|
|
2616
|
-
|
|
2653
|
+
Z.info("app.config.ts onConfigChange: load returned null — skipping");
|
|
2617
2654
|
return;
|
|
2618
2655
|
}
|
|
2619
|
-
if (
|
|
2656
|
+
if (Z.info("app.config.ts onConfigChange: loaded", {
|
|
2620
2657
|
theme: r.theme,
|
|
2621
2658
|
port: r.port,
|
|
2622
2659
|
name: r.name
|
|
2623
|
-
}), JSON.stringify(r) === JSON.stringify(
|
|
2624
|
-
|
|
2660
|
+
}), JSON.stringify(r) === JSON.stringify(L)) {
|
|
2661
|
+
Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
|
|
2625
2662
|
return;
|
|
2626
2663
|
}
|
|
2627
|
-
let i =
|
|
2664
|
+
let i = I(L, r);
|
|
2628
2665
|
if (i.length > 0) {
|
|
2629
|
-
|
|
2666
|
+
Z.warn("app.config.ts changed — hard restart required", { fields: i });
|
|
2630
2667
|
try {
|
|
2631
2668
|
await t.close();
|
|
2632
2669
|
} catch {}
|
|
2633
|
-
let e =
|
|
2670
|
+
let e = pe(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
2634
2671
|
stdio: "inherit",
|
|
2635
2672
|
env: process.env,
|
|
2636
2673
|
cwd: process.cwd()
|
|
@@ -2640,57 +2677,57 @@ import {
|
|
|
2640
2677
|
process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
|
|
2641
2678
|
process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
|
|
2642
2679
|
}), e.on("error", (e) => {
|
|
2643
|
-
|
|
2680
|
+
Z.error("restart spawn failed", {}, e), process.exit(1);
|
|
2644
2681
|
});
|
|
2645
2682
|
return;
|
|
2646
2683
|
}
|
|
2647
2684
|
try {
|
|
2648
2685
|
let n = Date.now();
|
|
2649
|
-
await
|
|
2686
|
+
await Mi(e, r, await Ei(e, r)), L = r, t.ws && t.ws.send({
|
|
2650
2687
|
type: "full-reload",
|
|
2651
2688
|
path: "*"
|
|
2652
|
-
}),
|
|
2689
|
+
}), Z.info("app.config.ts soft-regen", {
|
|
2653
2690
|
ms: Date.now() - n,
|
|
2654
2691
|
reload: "full"
|
|
2655
2692
|
});
|
|
2656
2693
|
} catch (e) {
|
|
2657
|
-
|
|
2694
|
+
Z.error("app.config.ts soft-regen failed", {}, e);
|
|
2658
2695
|
}
|
|
2659
|
-
}, o = (e) =>
|
|
2696
|
+
}, o = (e) => u(e) === "app.config.ts" ? e === F || h(e) === R : !1;
|
|
2660
2697
|
t.watcher.on("change", (e) => {
|
|
2661
|
-
o(e) && (
|
|
2698
|
+
o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
|
|
2662
2699
|
}), t.watcher.on("add", (e) => {
|
|
2663
|
-
o(e) && (
|
|
2700
|
+
o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
|
|
2664
2701
|
});
|
|
2665
2702
|
try {
|
|
2666
2703
|
let { watchFile: e } = await import("node:fs");
|
|
2667
|
-
e(
|
|
2668
|
-
e.mtimeMs !== t.mtimeMs && (
|
|
2669
|
-
}),
|
|
2704
|
+
e(F, { interval: 500 }, (e, t) => {
|
|
2705
|
+
e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
|
|
2706
|
+
}), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
|
|
2670
2707
|
} catch (e) {
|
|
2671
|
-
|
|
2708
|
+
Z.warn("app.config.ts polling watcher could not attach", {}, e);
|
|
2672
2709
|
}
|
|
2673
|
-
|
|
2710
|
+
_t(mt, Z, {
|
|
2674
2711
|
root: e,
|
|
2675
2712
|
onBeforeRestart: () => t.close()
|
|
2676
2713
|
});
|
|
2677
2714
|
}
|
|
2678
|
-
}, se = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ce = {
|
|
2715
|
+
}, se = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, B = 0, ce = {
|
|
2679
2716
|
name: "framework:suppress-api-hmr",
|
|
2680
2717
|
handleHotUpdate(e) {
|
|
2681
|
-
if (se.test(e.file)) return [];
|
|
2718
|
+
if (B += 1, se.test(e.file)) return [];
|
|
2682
2719
|
}
|
|
2683
2720
|
}, le = {
|
|
2684
2721
|
name: "framework:reoptimize-on-rpcgroup-change",
|
|
2685
2722
|
async configureServer(t) {
|
|
2686
2723
|
let n = /* @__PURE__ */ new Map();
|
|
2687
|
-
for (let
|
|
2688
|
-
if (!
|
|
2689
|
-
let
|
|
2690
|
-
if (!
|
|
2691
|
-
let a =
|
|
2724
|
+
for (let i of r) {
|
|
2725
|
+
if (!i.proxyTarget) continue;
|
|
2726
|
+
let r = await xi(e, i.pkg);
|
|
2727
|
+
if (!r) continue;
|
|
2728
|
+
let a = p(r, "rpcGroup.generated.ts");
|
|
2692
2729
|
try {
|
|
2693
|
-
n.set(a, await
|
|
2730
|
+
n.set(a, await O.readFile(a, "utf8"));
|
|
2694
2731
|
} catch {
|
|
2695
2732
|
n.set(a, "");
|
|
2696
2733
|
}
|
|
@@ -2699,105 +2736,105 @@ import {
|
|
|
2699
2736
|
} catch {}
|
|
2700
2737
|
}
|
|
2701
2738
|
if (n.size === 0) return;
|
|
2702
|
-
let
|
|
2703
|
-
if (
|
|
2739
|
+
let i = null, a = !1, o = async () => {
|
|
2740
|
+
if (a) return;
|
|
2704
2741
|
let r = null;
|
|
2705
2742
|
for (let [e, t] of n) {
|
|
2706
2743
|
let i;
|
|
2707
2744
|
try {
|
|
2708
|
-
i = await
|
|
2745
|
+
i = await O.readFile(e, "utf8");
|
|
2709
2746
|
} catch {
|
|
2710
2747
|
continue;
|
|
2711
2748
|
}
|
|
2712
2749
|
i !== t && (n.set(e, i), r = e);
|
|
2713
2750
|
}
|
|
2714
2751
|
if (r !== null) {
|
|
2715
|
-
|
|
2752
|
+
a = !0, Z.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
|
|
2716
2753
|
try {
|
|
2717
|
-
await
|
|
2754
|
+
await O.rm(p(k, ".vite", "deps"), {
|
|
2718
2755
|
recursive: !0,
|
|
2719
2756
|
force: !0
|
|
2720
2757
|
}), await t.restart(!0);
|
|
2721
2758
|
} catch (e) {
|
|
2722
|
-
|
|
2759
|
+
a = !1, Z.error("rpcGroup re-optimize failed", {}, e);
|
|
2723
2760
|
}
|
|
2724
2761
|
}
|
|
2725
|
-
},
|
|
2726
|
-
n.has(
|
|
2727
|
-
|
|
2762
|
+
}, s = (e) => {
|
|
2763
|
+
n.has(h(e)) && (i && clearTimeout(i), i = setTimeout(() => {
|
|
2764
|
+
o();
|
|
2728
2765
|
}, 120));
|
|
2729
2766
|
};
|
|
2730
|
-
t.watcher.on("change",
|
|
2767
|
+
t.watcher.on("change", s), t.watcher.on("add", s);
|
|
2731
2768
|
}
|
|
2732
|
-
},
|
|
2769
|
+
}, V = {}, ue = (e) => (t) => {
|
|
2733
2770
|
t.on("proxyReq", (t, n) => {
|
|
2734
|
-
|
|
2771
|
+
jn(t, n, {
|
|
2735
2772
|
target: e,
|
|
2736
2773
|
token: process.env.VOLTRO_INSPECT_TOKEN,
|
|
2737
2774
|
writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
|
|
2738
|
-
isLoopback:
|
|
2775
|
+
isLoopback: i
|
|
2739
2776
|
});
|
|
2740
2777
|
});
|
|
2741
2778
|
};
|
|
2742
|
-
for (let e of
|
|
2779
|
+
for (let e of r) {
|
|
2743
2780
|
if (!e.proxyTarget) continue;
|
|
2744
|
-
|
|
2781
|
+
V[e.browserWsUrl] = {
|
|
2745
2782
|
target: e.proxyTarget,
|
|
2746
2783
|
ws: !0,
|
|
2747
2784
|
changeOrigin: !0,
|
|
2748
2785
|
...e.wsPath ? {} : { rewrite: () => "/ws" }
|
|
2749
2786
|
};
|
|
2750
2787
|
let t = e.proxyTarget.replace(/^ws/, "http");
|
|
2751
|
-
|
|
2788
|
+
V[`/_voltro/api/${e.name}`] = {
|
|
2752
2789
|
target: t,
|
|
2753
2790
|
changeOrigin: !0,
|
|
2754
2791
|
rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
|
|
2755
|
-
configure:
|
|
2792
|
+
configure: ue(t)
|
|
2756
2793
|
};
|
|
2757
2794
|
}
|
|
2758
2795
|
for (let [e, n] of Object.entries(t.proxies ?? {})) {
|
|
2759
|
-
if (
|
|
2760
|
-
|
|
2796
|
+
if (V[e]) {
|
|
2797
|
+
Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
|
|
2761
2798
|
continue;
|
|
2762
2799
|
}
|
|
2763
|
-
|
|
2800
|
+
V[e] = {
|
|
2764
2801
|
target: n.target,
|
|
2765
2802
|
changeOrigin: n.changeOrigin ?? !0,
|
|
2766
2803
|
...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
|
|
2767
|
-
},
|
|
2804
|
+
}, Z.info(`proxy ${e} → ${n.target}`, {
|
|
2768
2805
|
prefix: e,
|
|
2769
2806
|
target: n.target,
|
|
2770
2807
|
...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
|
|
2771
2808
|
});
|
|
2772
2809
|
}
|
|
2773
|
-
let
|
|
2810
|
+
let de = {
|
|
2774
2811
|
name: "framework:inspect",
|
|
2775
|
-
configureServer(
|
|
2812
|
+
configureServer(r) {
|
|
2776
2813
|
let u = null, d = async () => {
|
|
2777
2814
|
if (u !== null) return u;
|
|
2778
2815
|
let t = [];
|
|
2779
2816
|
for (let n of b) try {
|
|
2780
|
-
let
|
|
2817
|
+
let i = await r.ssrLoadModule(p(e, "src", "pages", n.file));
|
|
2781
2818
|
t.push({
|
|
2782
2819
|
pattern: n.pattern,
|
|
2783
2820
|
file: n.file,
|
|
2784
2821
|
dirChain: n.dirChain,
|
|
2785
|
-
renderMode:
|
|
2786
|
-
interactive:
|
|
2787
|
-
tenantAware:
|
|
2788
|
-
revalidateMs:
|
|
2789
|
-
staleWhileRevalidateMs:
|
|
2790
|
-
cacheInvalidatesOn: Array.isArray(
|
|
2791
|
-
hasLoader: typeof
|
|
2792
|
-
hasMeta:
|
|
2793
|
-
hasGetStaticPaths: typeof
|
|
2822
|
+
renderMode: Qn(i, p("src", "pages", n.file)),
|
|
2823
|
+
interactive: i.interactive ?? "full",
|
|
2824
|
+
tenantAware: i.tenantAware === !0,
|
|
2825
|
+
revalidateMs: ct(i.revalidate),
|
|
2826
|
+
staleWhileRevalidateMs: ct(i.staleWhileRevalidate) ?? 0,
|
|
2827
|
+
cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
|
|
2828
|
+
hasLoader: typeof i.loader == "function",
|
|
2829
|
+
hasMeta: i.meta != null,
|
|
2830
|
+
hasGetStaticPaths: typeof i.getStaticPaths == "function"
|
|
2794
2831
|
});
|
|
2795
2832
|
} catch (e) {
|
|
2796
|
-
|
|
2833
|
+
Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
|
|
2797
2834
|
}
|
|
2798
2835
|
return u = t, t;
|
|
2799
2836
|
};
|
|
2800
|
-
|
|
2837
|
+
r.middlewares.use((e, t, r) => {
|
|
2801
2838
|
let i = e.url ?? "/";
|
|
2802
2839
|
if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
|
|
2803
2840
|
let a = Date.now(), o = t.end.bind(t);
|
|
@@ -2811,33 +2848,38 @@ import {
|
|
|
2811
2848
|
} catch {}
|
|
2812
2849
|
return o(...e);
|
|
2813
2850
|
}), r();
|
|
2814
|
-
}),
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2851
|
+
}), r.middlewares.use((t, n, r) => {
|
|
2852
|
+
if (t.method !== "GET" && t.method !== "HEAD") return r();
|
|
2853
|
+
let { pathname: i } = Ir(t.url ?? "/");
|
|
2854
|
+
if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
|
|
2855
|
+
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(Gt({ indexable: !1 }));
|
|
2856
|
+
}), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
|
|
2857
|
+
let r = e.url ?? "", a = r.split("?")[0];
|
|
2858
|
+
if (a === "/api/dashboard/proxy") {
|
|
2859
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
2818
2860
|
if (!n) {
|
|
2819
2861
|
t.statusCode = 400, t.end("missing ?target=");
|
|
2820
2862
|
return;
|
|
2821
2863
|
}
|
|
2822
|
-
if (!
|
|
2864
|
+
if (!o(n)) {
|
|
2823
2865
|
t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
2824
2866
|
return;
|
|
2825
2867
|
}
|
|
2826
2868
|
try {
|
|
2827
|
-
let
|
|
2828
|
-
e.headers.authorization ?
|
|
2869
|
+
let r = { accept: String(e.headers.accept ?? "application/json") };
|
|
2870
|
+
e.headers.authorization ? r.authorization = String(e.headers.authorization) : i(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
2829
2871
|
let a;
|
|
2830
2872
|
if (e.method && e.method !== "GET" && e.method !== "HEAD") {
|
|
2831
2873
|
let t = [];
|
|
2832
2874
|
for await (let n of e) t.push(n);
|
|
2833
2875
|
a = Buffer.concat(t);
|
|
2834
2876
|
let n = e.headers["content-type"];
|
|
2835
|
-
n && (
|
|
2877
|
+
n && (r["content-type"] = Array.isArray(n) ? n[0] : String(n));
|
|
2836
2878
|
}
|
|
2837
2879
|
let o = await fetch(n, {
|
|
2838
2880
|
redirect: "manual",
|
|
2839
2881
|
...e.method ? { method: e.method } : {},
|
|
2840
|
-
headers:
|
|
2882
|
+
headers: r,
|
|
2841
2883
|
...a && a.length ? { body: new Uint8Array(a.buffer, a.byteOffset, a.byteLength) } : {}
|
|
2842
2884
|
}), s = Buffer.from(await o.arrayBuffer());
|
|
2843
2885
|
t.statusCode = o.status, t.setHeader("content-type", o.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
|
|
@@ -2846,30 +2888,30 @@ import {
|
|
|
2846
2888
|
}
|
|
2847
2889
|
return;
|
|
2848
2890
|
}
|
|
2849
|
-
if (
|
|
2850
|
-
let n = new URL(
|
|
2891
|
+
if (a === "/api/dashboard/proxy/stream") {
|
|
2892
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
2851
2893
|
if (!n) {
|
|
2852
2894
|
t.statusCode = 400, t.end("missing ?target=");
|
|
2853
2895
|
return;
|
|
2854
2896
|
}
|
|
2855
|
-
if (!
|
|
2897
|
+
if (!o(n)) {
|
|
2856
2898
|
t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
2857
2899
|
return;
|
|
2858
2900
|
}
|
|
2859
|
-
let
|
|
2860
|
-
e.on("close", () =>
|
|
2901
|
+
let a = new AbortController();
|
|
2902
|
+
e.on("close", () => a.abort()), t.on("close", () => a.abort());
|
|
2861
2903
|
try {
|
|
2862
|
-
let
|
|
2904
|
+
let r = await fetch(n, {
|
|
2863
2905
|
redirect: "manual",
|
|
2864
2906
|
method: "GET",
|
|
2865
2907
|
headers: {
|
|
2866
2908
|
accept: "text/event-stream",
|
|
2867
|
-
...e.headers.authorization ? { authorization: String(e.headers.authorization) } :
|
|
2909
|
+
...e.headers.authorization ? { authorization: String(e.headers.authorization) } : i(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
|
|
2868
2910
|
},
|
|
2869
|
-
signal:
|
|
2911
|
+
signal: a.signal
|
|
2870
2912
|
});
|
|
2871
|
-
if (!
|
|
2872
|
-
t.statusCode =
|
|
2913
|
+
if (!r.ok || !r.body) {
|
|
2914
|
+
t.statusCode = r.status, t.end(`upstream ${r.status}`);
|
|
2873
2915
|
return;
|
|
2874
2916
|
}
|
|
2875
2917
|
t.writeHead(200, {
|
|
@@ -2878,15 +2920,15 @@ import {
|
|
|
2878
2920
|
connection: "keep-alive",
|
|
2879
2921
|
"x-accel-buffering": "no"
|
|
2880
2922
|
});
|
|
2881
|
-
let
|
|
2923
|
+
let o = r.body.getReader();
|
|
2882
2924
|
try {
|
|
2883
2925
|
for (;;) {
|
|
2884
|
-
let { done: e, value: n } = await
|
|
2926
|
+
let { done: e, value: n } = await o.read();
|
|
2885
2927
|
if (e) break;
|
|
2886
2928
|
n && t.write(Buffer.from(n));
|
|
2887
2929
|
}
|
|
2888
2930
|
} finally {
|
|
2889
|
-
|
|
2931
|
+
o.releaseLock(), t.end();
|
|
2890
2932
|
}
|
|
2891
2933
|
} catch (e) {
|
|
2892
2934
|
e.name !== "AbortError" && (t.statusCode = 502, t.end(`proxy stream error: ${e.message}`));
|
|
@@ -2894,32 +2936,32 @@ import {
|
|
|
2894
2936
|
return;
|
|
2895
2937
|
}
|
|
2896
2938
|
n();
|
|
2897
|
-
}),
|
|
2898
|
-
let
|
|
2899
|
-
if (!
|
|
2939
|
+
}), r.middlewares.use(async (e, r, i) => {
|
|
2940
|
+
let o = e.url ?? "";
|
|
2941
|
+
if (!o.startsWith("/_voltro/inspect")) return i();
|
|
2900
2942
|
let u = {};
|
|
2901
2943
|
for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (u[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
|
|
2902
|
-
let f =
|
|
2903
|
-
if (e.method === "GET" && (f === "/_voltro/inspect/logs" ||
|
|
2904
|
-
let e =
|
|
2944
|
+
let f = o.split("?")[0];
|
|
2945
|
+
if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
|
|
2946
|
+
let e = a(u.origin), t = Tn(o, sn(), u);
|
|
2905
2947
|
r.statusCode = t.status, r.setHeader("content-type", t.contentType);
|
|
2906
2948
|
for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
|
|
2907
2949
|
r.end(t.body);
|
|
2908
2950
|
return;
|
|
2909
2951
|
}
|
|
2910
2952
|
if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
|
|
2911
|
-
let t =
|
|
2912
|
-
if (
|
|
2953
|
+
let t = a(u.origin);
|
|
2954
|
+
if (c()) {
|
|
2913
2955
|
r.statusCode = 503, r.setHeader("content-type", "application/json");
|
|
2914
2956
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2915
2957
|
r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
2916
2958
|
return;
|
|
2917
2959
|
}
|
|
2918
|
-
let
|
|
2960
|
+
let i = "";
|
|
2919
2961
|
e.setEncoding("utf-8"), e.on("data", (e) => {
|
|
2920
|
-
|
|
2962
|
+
i += e;
|
|
2921
2963
|
}), e.on("end", () => {
|
|
2922
|
-
let e =
|
|
2964
|
+
let e = yn(i, n);
|
|
2923
2965
|
r.statusCode = e.status, r.setHeader("content-type", e.contentType);
|
|
2924
2966
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2925
2967
|
r.end(e.body);
|
|
@@ -2929,35 +2971,35 @@ import {
|
|
|
2929
2971
|
return;
|
|
2930
2972
|
}
|
|
2931
2973
|
if (f === "/_voltro/inspect/stream") {
|
|
2932
|
-
let t =
|
|
2933
|
-
if (
|
|
2974
|
+
let t = a(u.origin);
|
|
2975
|
+
if (c()) {
|
|
2934
2976
|
r.statusCode = 503, r.setHeader("content-type", "application/json");
|
|
2935
2977
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2936
2978
|
r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
2937
2979
|
return;
|
|
2938
2980
|
}
|
|
2939
|
-
let
|
|
2940
|
-
if (!
|
|
2981
|
+
let i = s(u, "GET");
|
|
2982
|
+
if (!i.ok) {
|
|
2941
2983
|
r.statusCode = 401, r.setHeader("content-type", "application/json");
|
|
2942
2984
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2943
2985
|
r.end(JSON.stringify({
|
|
2944
2986
|
error: "unauthorized",
|
|
2945
|
-
reason:
|
|
2987
|
+
reason: i.reason
|
|
2946
2988
|
}));
|
|
2947
2989
|
return;
|
|
2948
2990
|
}
|
|
2949
2991
|
r.statusCode = 200, r.setHeader("content-type", "text/event-stream; charset=utf-8"), r.setHeader("cache-control", "no-cache, no-transform"), r.setHeader("connection", "keep-alive"), r.setHeader("x-accel-buffering", "no");
|
|
2950
2992
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2951
2993
|
r.flushHeaders?.(), r.write("retry: 5000\n\n");
|
|
2952
|
-
let
|
|
2953
|
-
if (!(
|
|
2994
|
+
let l = o.indexOf("?");
|
|
2995
|
+
if (!(l !== -1 && new URLSearchParams(o.slice(l + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Jt(e));
|
|
2954
2996
|
let d = n.subscribe((e) => {
|
|
2955
2997
|
try {
|
|
2956
|
-
r.write(
|
|
2998
|
+
r.write(Jt(e));
|
|
2957
2999
|
} catch {}
|
|
2958
3000
|
}), f = setInterval(() => {
|
|
2959
3001
|
try {
|
|
2960
|
-
r.write(
|
|
3002
|
+
r.write(Yt());
|
|
2961
3003
|
} catch {}
|
|
2962
3004
|
}, 15e3), p = () => {
|
|
2963
3005
|
clearInterval(f), d();
|
|
@@ -2966,11 +3008,11 @@ import {
|
|
|
2966
3008
|
return;
|
|
2967
3009
|
}
|
|
2968
3010
|
try {
|
|
2969
|
-
let n =
|
|
3011
|
+
let n = l(o, {
|
|
2970
3012
|
kind: "web",
|
|
2971
3013
|
meta: {
|
|
2972
3014
|
name: t.name ?? "(unnamed)",
|
|
2973
|
-
voltroVersion:
|
|
3015
|
+
voltroVersion: $r,
|
|
2974
3016
|
port: g,
|
|
2975
3017
|
mode: "dev",
|
|
2976
3018
|
apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
|
|
@@ -2982,15 +3024,15 @@ import {
|
|
|
2982
3024
|
})
|
|
2983
3025
|
},
|
|
2984
3026
|
routes: await d(),
|
|
2985
|
-
dirs:
|
|
3027
|
+
dirs: w,
|
|
2986
3028
|
cache: () => ({
|
|
2987
3029
|
backend: "memory",
|
|
2988
3030
|
size: 0,
|
|
2989
3031
|
entries: []
|
|
2990
3032
|
}),
|
|
2991
|
-
env: () =>
|
|
3033
|
+
env: () => at(t.name ?? "app", { contract: z(t.env) ? t.env : void 0 })
|
|
2992
3034
|
}, u, { method: e.method ?? "GET" });
|
|
2993
|
-
if (n === null) return
|
|
3035
|
+
if (n === null) return i();
|
|
2994
3036
|
r.statusCode = n.status, r.setHeader("content-type", n.contentType);
|
|
2995
3037
|
for (let [e, t] of Object.entries(n.headers ?? {})) r.setHeader(e, t);
|
|
2996
3038
|
r.end(n.body);
|
|
@@ -2999,363 +3041,407 @@ import {
|
|
|
2999
3041
|
}
|
|
3000
3042
|
});
|
|
3001
3043
|
}
|
|
3002
|
-
},
|
|
3044
|
+
}, me = t.name === "voltroDashboard" ? {
|
|
3003
3045
|
name: "framework:dashboard-registry",
|
|
3004
3046
|
configureServer(e) {
|
|
3005
3047
|
e.middlewares.use(async (e, t, n) => {
|
|
3006
3048
|
if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
|
|
3007
3049
|
try {
|
|
3008
|
-
let e = await
|
|
3050
|
+
let e = await Ue();
|
|
3009
3051
|
t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
|
|
3010
3052
|
} catch (e) {
|
|
3011
3053
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
|
|
3012
3054
|
}
|
|
3013
3055
|
});
|
|
3014
3056
|
}
|
|
3015
|
-
} : null,
|
|
3016
|
-
|
|
3057
|
+
} : null, he = /* @__PURE__ */ new Set(), H = (e, t, n, r, i, a = !1) => {
|
|
3058
|
+
let o = zr(i, a, t) ?? "";
|
|
3059
|
+
if (Z.error(`${t} render failed`, {
|
|
3017
3060
|
pathname: n,
|
|
3018
|
-
pattern: r
|
|
3019
|
-
|
|
3061
|
+
pattern: r,
|
|
3062
|
+
cause: Zt(i) + o
|
|
3063
|
+
}), e.headersSent) {
|
|
3020
3064
|
e.end();
|
|
3021
3065
|
return;
|
|
3022
3066
|
}
|
|
3023
3067
|
e.writeHead(500, {
|
|
3024
3068
|
"content-type": "text/plain; charset=utf-8",
|
|
3025
|
-
"x-voltro-rendered-by": `${t}-failed
|
|
3069
|
+
"x-voltro-rendered-by": `${t}-failed`,
|
|
3070
|
+
"x-voltro-ssr-generation": String(B)
|
|
3026
3071
|
});
|
|
3027
|
-
let
|
|
3028
|
-
e.end(`${t} render failed for ${n}\n\n${
|
|
3029
|
-
},
|
|
3030
|
-
limit:
|
|
3031
|
-
onColdStart: (e) =>
|
|
3032
|
-
onColdEnd: (e, { durationMs: t, failed: n }) =>
|
|
3072
|
+
let s = B === 0 ? "" : `\n[voltro] this process has absorbed ${B} 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`;
|
|
3073
|
+
e.end(`${t} render failed for ${n}\n\n${Zt(i)}\n${o}\n${s}`);
|
|
3074
|
+
}, U = Dt(), ge = kt({
|
|
3075
|
+
limit: U,
|
|
3076
|
+
onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
|
|
3077
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
3033
3078
|
id: e,
|
|
3034
3079
|
ms: t,
|
|
3035
3080
|
...n ? { failed: !0 } : {}
|
|
3036
3081
|
})
|
|
3037
3082
|
});
|
|
3038
|
-
|
|
3039
|
-
let
|
|
3083
|
+
Z.debug(`ssr cold-compile concurrency ${U}`, { concurrency: U });
|
|
3084
|
+
let W = null, _e = async () => (W === null && (W = await O.readFile(p(e, ".framework", "index.html"), "utf8")), W), ve = {
|
|
3040
3085
|
name: "framework:ssr",
|
|
3041
|
-
configureServer(
|
|
3042
|
-
let
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3086
|
+
configureServer(n) {
|
|
3087
|
+
let i = (e) => ge.load(e, async () => await n.ssrLoadModule(e)), a, o = () => {
|
|
3088
|
+
if (a !== void 0) return a;
|
|
3089
|
+
let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
|
|
3090
|
+
return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
|
|
3091
|
+
let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), o = {};
|
|
3092
|
+
for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
|
|
3093
|
+
let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
|
|
3094
|
+
n !== void 0 && (o[a] = t(a, n, r));
|
|
3095
|
+
} catch (e) {
|
|
3096
|
+
Z.warn("locale catalog failed to load for SSR", { locale: a }, e);
|
|
3097
|
+
}
|
|
3098
|
+
return a({
|
|
3099
|
+
wraps: o,
|
|
3100
|
+
supported: n,
|
|
3101
|
+
defaultLocale: r
|
|
3102
|
+
});
|
|
3103
|
+
})(), a);
|
|
3104
|
+
};
|
|
3105
|
+
n.middlewares.use(async (a, s, c) => {
|
|
3106
|
+
if (a.method !== "GET" && a.method !== "HEAD") return c();
|
|
3107
|
+
let l = a.url ?? "/";
|
|
3108
|
+
l.indexOf("?");
|
|
3109
|
+
let { pathname: u, search: d } = Ir(l);
|
|
3110
|
+
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();
|
|
3111
|
+
let f = bi(u, S.ssrRoutes);
|
|
3112
|
+
if (!f) return c();
|
|
3113
|
+
let m = !he.has(f.route.pattern), h = Date.now();
|
|
3114
|
+
m && Z.info(`ssr compiling ${f.route.pattern}`, {
|
|
3115
|
+
pattern: f.route.pattern,
|
|
3116
|
+
pathname: u
|
|
3055
3117
|
});
|
|
3056
|
-
let
|
|
3118
|
+
let g = {}, _ = async (e, t) => {
|
|
3057
3119
|
let n = Date.now(), r = await t();
|
|
3058
|
-
return
|
|
3059
|
-
},
|
|
3060
|
-
let i = await
|
|
3061
|
-
if (!(!i ||
|
|
3062
|
-
if (
|
|
3120
|
+
return g[e] = (g[e] ?? 0) + (Date.now() - n), r;
|
|
3121
|
+
}, v = async (e, t, r) => {
|
|
3122
|
+
let i = await n.moduleGraph.getModuleById(e);
|
|
3123
|
+
if (!(!i || t.has(e))) {
|
|
3124
|
+
if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
|
|
3063
3125
|
let e = i.url.replace(/\?.*$/, "");
|
|
3064
3126
|
r.includes(e) || r.push(e);
|
|
3065
3127
|
return;
|
|
3066
3128
|
}
|
|
3067
|
-
for (let e of i.importedModules ?? []) e.id && await
|
|
3129
|
+
for (let e of i.importedModules ?? []) e.id && await v(e.id, t, r);
|
|
3068
3130
|
}
|
|
3069
|
-
};
|
|
3131
|
+
}, y = !1;
|
|
3070
3132
|
try {
|
|
3071
|
-
let
|
|
3072
|
-
if (
|
|
3073
|
-
let
|
|
3074
|
-
for (let [e, t] of Object.entries(
|
|
3075
|
-
let
|
|
3076
|
-
|
|
3077
|
-
let
|
|
3133
|
+
let b = await _("loadPage", async () => await i(p(e, "src", "pages", f.route.file))), x = Qn(b, p("src", "pages", f.route.file)), C = mi(S.dirs, f.route.dirChain), w = x === "spa" && C.some((e) => e.hasLayout);
|
|
3134
|
+
if (x !== "ssr" && x !== "isr" && !w) return c();
|
|
3135
|
+
let T = {};
|
|
3136
|
+
for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? T[e] = t : Array.isArray(t) && (T[e] = t.join(", "));
|
|
3137
|
+
let E = ji(Ai(r[0], { allowDevProxy: !0 }), T.cookie, { apiName: r[0]?.name }), D = new AbortController(), O = () => D.abort();
|
|
3138
|
+
s.once("close", O);
|
|
3139
|
+
let ee = null, te = [], k = {};
|
|
3078
3140
|
try {
|
|
3079
|
-
(await
|
|
3080
|
-
entries:
|
|
3081
|
-
loadLayout: (t) =>
|
|
3082
|
-
loadError: (t) =>
|
|
3083
|
-
loadPending: (t) =>
|
|
3141
|
+
(await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: te, segmentLoaderData: k} = await _("loadChain", () => hi({
|
|
3142
|
+
entries: C,
|
|
3143
|
+
loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
|
|
3144
|
+
loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
|
|
3145
|
+
loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
|
|
3084
3146
|
ctx: {
|
|
3085
|
-
params:
|
|
3086
|
-
pathname:
|
|
3087
|
-
search:
|
|
3088
|
-
signal:
|
|
3089
|
-
headers:
|
|
3090
|
-
query:
|
|
3147
|
+
params: f.params,
|
|
3148
|
+
pathname: u,
|
|
3149
|
+
search: d,
|
|
3150
|
+
signal: D.signal,
|
|
3151
|
+
headers: T,
|
|
3152
|
+
query: E
|
|
3091
3153
|
}
|
|
3092
3154
|
}));
|
|
3093
|
-
let t =
|
|
3094
|
-
typeof t == "function" && !
|
|
3095
|
-
params:
|
|
3096
|
-
pathname:
|
|
3097
|
-
search:
|
|
3098
|
-
signal:
|
|
3099
|
-
headers:
|
|
3100
|
-
query:
|
|
3155
|
+
let t = b.loader;
|
|
3156
|
+
typeof t == "function" && !w && (ee = await _("loader", () => t({
|
|
3157
|
+
params: f.params,
|
|
3158
|
+
pathname: u,
|
|
3159
|
+
search: d,
|
|
3160
|
+
signal: D.signal,
|
|
3161
|
+
headers: T,
|
|
3162
|
+
query: E
|
|
3101
3163
|
})));
|
|
3102
3164
|
} finally {
|
|
3103
|
-
|
|
3165
|
+
s.off("close", O);
|
|
3104
3166
|
}
|
|
3105
|
-
let
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
3167
|
+
let A = await _("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
|
|
3168
|
+
w || await Zr({
|
|
3169
|
+
pageMod: b,
|
|
3170
|
+
params: f.params,
|
|
3171
|
+
query: E,
|
|
3172
|
+
apiName: r[0]?.name,
|
|
3173
|
+
seed: A.seedPreloadedSubscription,
|
|
3174
|
+
onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
|
|
3175
|
+
tag: e,
|
|
3176
|
+
apiName: t,
|
|
3177
|
+
pathname: u
|
|
3178
|
+
}, n)
|
|
3179
|
+
});
|
|
3180
|
+
let ne = {
|
|
3181
|
+
pattern: f.route.pattern,
|
|
3182
|
+
Component: b.default,
|
|
3183
|
+
meta: b.meta,
|
|
3184
|
+
loader: b.loader,
|
|
3185
|
+
ErrorBoundary: b.ErrorBoundary,
|
|
3186
|
+
Pending: b.Pending,
|
|
3187
|
+
renderMode: x,
|
|
3188
|
+
chain: te
|
|
3189
|
+
}, re = {
|
|
3190
|
+
cookies: A.parseCookieHeader(T.cookie),
|
|
3191
|
+
headers: T,
|
|
3192
|
+
url: l
|
|
3193
|
+
}, j = b.interactive ?? "full", M = (await o())(T.cookie, T["accept-language"]);
|
|
3194
|
+
y = M !== void 0;
|
|
3195
|
+
let ie = M ? {
|
|
3196
|
+
outerWrap: M.outerWrap,
|
|
3197
|
+
locale: M.locale
|
|
3198
|
+
} : {}, N = w ? Nr({
|
|
3199
|
+
helpers: A,
|
|
3200
|
+
page: `src/pages/${f.route.file}`,
|
|
3121
3201
|
interactive: j,
|
|
3122
3202
|
delivery: "stream",
|
|
3123
3203
|
renderInput: {
|
|
3124
|
-
descriptor:
|
|
3125
|
-
params:
|
|
3126
|
-
pathname:
|
|
3127
|
-
segmentLoaderData:
|
|
3128
|
-
requestContext:
|
|
3204
|
+
descriptor: ne,
|
|
3205
|
+
params: f.params,
|
|
3206
|
+
pathname: u,
|
|
3207
|
+
segmentLoaderData: k,
|
|
3208
|
+
requestContext: re,
|
|
3209
|
+
...ie
|
|
3129
3210
|
}
|
|
3130
|
-
}) : null,
|
|
3131
|
-
helpers:
|
|
3132
|
-
page: `src/pages/${
|
|
3133
|
-
pathname:
|
|
3134
|
-
renderMode:
|
|
3211
|
+
}) : null, P = w ? null : Mr({
|
|
3212
|
+
helpers: A,
|
|
3213
|
+
page: `src/pages/${f.route.file}`,
|
|
3214
|
+
pathname: u,
|
|
3215
|
+
renderMode: x,
|
|
3135
3216
|
interactive: j,
|
|
3136
|
-
loaderData:
|
|
3137
|
-
segmentLoaderData:
|
|
3138
|
-
pageLoaderRan: typeof
|
|
3139
|
-
}),
|
|
3140
|
-
await
|
|
3217
|
+
loaderData: ee,
|
|
3218
|
+
segmentLoaderData: k,
|
|
3219
|
+
pageLoaderRan: typeof b.loader == "function"
|
|
3220
|
+
}), F = [];
|
|
3221
|
+
await _("collectCss", async () => {
|
|
3141
3222
|
let t = /* @__PURE__ */ new Set(), n = [
|
|
3142
|
-
|
|
3143
|
-
...
|
|
3144
|
-
...t.hasLayout ? [
|
|
3145
|
-
...t.hasError ? [
|
|
3146
|
-
...t.hasPending ? [
|
|
3223
|
+
p(e, "src", "pages", f.route.file),
|
|
3224
|
+
...C.flatMap((t) => [
|
|
3225
|
+
...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
|
|
3226
|
+
...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
|
|
3227
|
+
...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
|
|
3147
3228
|
]),
|
|
3148
|
-
|
|
3229
|
+
p(e, ".framework", "main.tsx")
|
|
3149
3230
|
];
|
|
3150
|
-
for (let e of n) await
|
|
3231
|
+
for (let e of n) await v(e, t, F);
|
|
3151
3232
|
});
|
|
3152
|
-
let
|
|
3153
|
-
if (
|
|
3154
|
-
let e = (e) =>
|
|
3155
|
-
helpers:
|
|
3156
|
-
prepared:
|
|
3233
|
+
let ae = await _("readShell", _e), I = await _("transformShell", () => n.transformIndexHtml(l, ae)), L = F.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), R = M?.locale ?? re.cookies["voltro:locale"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", oe = Date.now();
|
|
3234
|
+
if (N) {
|
|
3235
|
+
let e = (e) => Fr({
|
|
3236
|
+
helpers: A,
|
|
3237
|
+
prepared: N,
|
|
3157
3238
|
meta: e,
|
|
3158
3239
|
interactive: j,
|
|
3159
|
-
extra: [
|
|
3240
|
+
extra: [L]
|
|
3160
3241
|
});
|
|
3161
|
-
if (
|
|
3162
|
-
res:
|
|
3163
|
-
shell:
|
|
3164
|
-
shell:
|
|
3242
|
+
if (N.hasDeferred) Jr({
|
|
3243
|
+
res: s,
|
|
3244
|
+
shell: Kr({
|
|
3245
|
+
shell: I,
|
|
3165
3246
|
inlineModuleScriptsAsync: !0
|
|
3166
3247
|
}),
|
|
3167
|
-
htmlLang:
|
|
3248
|
+
htmlLang: R,
|
|
3168
3249
|
headers: {
|
|
3169
3250
|
"content-type": "text/html; charset=utf-8",
|
|
3170
3251
|
"x-voltro-rendered-by": "spa-shell-dev"
|
|
3171
3252
|
},
|
|
3172
3253
|
headInjection: e,
|
|
3173
|
-
render: (e) =>
|
|
3174
|
-
...
|
|
3254
|
+
render: (e) => A.renderPageToStream({
|
|
3255
|
+
...N.renderInput,
|
|
3175
3256
|
...e
|
|
3176
3257
|
}),
|
|
3177
3258
|
onShellError: (e) => {
|
|
3178
|
-
|
|
3259
|
+
H(s, "spa-shell-dev", u, f.route.pattern, e, y);
|
|
3179
3260
|
}
|
|
3180
3261
|
});
|
|
3181
3262
|
else {
|
|
3182
|
-
let t =
|
|
3183
|
-
helpers:
|
|
3184
|
-
prepared:
|
|
3185
|
-
}), n =
|
|
3186
|
-
|
|
3263
|
+
let t = Pr({
|
|
3264
|
+
helpers: A,
|
|
3265
|
+
prepared: N
|
|
3266
|
+
}), n = I.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="${R}"`);
|
|
3267
|
+
s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "spa-shell-dev"), s.end(n);
|
|
3187
3268
|
}
|
|
3188
|
-
} else if (
|
|
3269
|
+
} else if (P) {
|
|
3189
3270
|
let e = (e) => [
|
|
3190
|
-
|
|
3191
|
-
|
|
3271
|
+
L,
|
|
3272
|
+
A.renderMetaToHtml(e),
|
|
3192
3273
|
`<meta name="voltro-interactive" content="${j}" />`,
|
|
3193
|
-
...
|
|
3194
|
-
|
|
3274
|
+
...P.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
|
|
3275
|
+
A.renderRouterStateScript(P.stateInput)
|
|
3195
3276
|
].filter((e) => e.length > 0).join("\n "), t = {
|
|
3196
|
-
descriptor:
|
|
3197
|
-
params:
|
|
3198
|
-
pathname:
|
|
3199
|
-
loaderData:
|
|
3200
|
-
segmentLoaderData:
|
|
3201
|
-
requestContext:
|
|
3277
|
+
descriptor: ne,
|
|
3278
|
+
params: f.params,
|
|
3279
|
+
pathname: u,
|
|
3280
|
+
loaderData: P.loaderData,
|
|
3281
|
+
segmentLoaderData: P.segmentLoaderData,
|
|
3282
|
+
requestContext: re,
|
|
3283
|
+
...ie
|
|
3202
3284
|
};
|
|
3203
|
-
if (
|
|
3204
|
-
res:
|
|
3205
|
-
shell:
|
|
3206
|
-
shell:
|
|
3285
|
+
if (x === "ssr" && j === "full") Jr({
|
|
3286
|
+
res: s,
|
|
3287
|
+
shell: Kr({
|
|
3288
|
+
shell: I,
|
|
3207
3289
|
inlineModuleScriptsAsync: !0
|
|
3208
3290
|
}),
|
|
3209
|
-
htmlLang:
|
|
3291
|
+
htmlLang: R,
|
|
3210
3292
|
headers: {
|
|
3211
3293
|
"content-type": "text/html; charset=utf-8",
|
|
3212
3294
|
"x-voltro-rendered-by": "ssr-dev"
|
|
3213
3295
|
},
|
|
3214
3296
|
headInjection: e,
|
|
3215
|
-
render: (e) =>
|
|
3297
|
+
render: (e) => A.renderPageToStream({
|
|
3216
3298
|
...t,
|
|
3217
3299
|
...e
|
|
3218
3300
|
}),
|
|
3219
3301
|
onShellError: (e) => {
|
|
3220
|
-
|
|
3302
|
+
H(s, "ssr-dev", u, f.route.pattern, e, y);
|
|
3221
3303
|
}
|
|
3222
3304
|
});
|
|
3223
3305
|
else {
|
|
3224
|
-
let { html: n, meta: r } =
|
|
3225
|
-
|
|
3306
|
+
let { html: n, meta: r } = A.renderPageToHtml(t), i = I.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${R}"`);
|
|
3307
|
+
s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
|
|
3226
3308
|
}
|
|
3227
3309
|
}
|
|
3228
|
-
|
|
3229
|
-
let
|
|
3230
|
-
|
|
3231
|
-
pattern:
|
|
3232
|
-
pathname:
|
|
3233
|
-
elapsedMs:
|
|
3310
|
+
g.render = Date.now() - oe;
|
|
3311
|
+
let z = Date.now() - h;
|
|
3312
|
+
m ? (he.add(f.route.pattern), Z.info(`ssr compiled ${f.route.pattern} in ${z}ms`, {
|
|
3313
|
+
pattern: f.route.pattern,
|
|
3314
|
+
pathname: u,
|
|
3315
|
+
elapsedMs: z,
|
|
3234
3316
|
cold: !0,
|
|
3235
|
-
phases:
|
|
3236
|
-
})) :
|
|
3237
|
-
pattern:
|
|
3238
|
-
pathname:
|
|
3239
|
-
elapsedMs:
|
|
3317
|
+
phases: g
|
|
3318
|
+
})) : z > 200 && Z.info(`ssr rendered ${u} in ${z}ms`, {
|
|
3319
|
+
pattern: f.route.pattern,
|
|
3320
|
+
pathname: u,
|
|
3321
|
+
elapsedMs: z,
|
|
3240
3322
|
cold: !1,
|
|
3241
|
-
phases:
|
|
3323
|
+
phases: g
|
|
3242
3324
|
});
|
|
3243
3325
|
} catch (e) {
|
|
3244
|
-
if (
|
|
3245
|
-
|
|
3246
|
-
pathname:
|
|
3247
|
-
pattern:
|
|
3248
|
-
}, e),
|
|
3326
|
+
if (Ar(e)) {
|
|
3327
|
+
Z.error("ssr-dev render refused", {
|
|
3328
|
+
pathname: u,
|
|
3329
|
+
pattern: f.route.pattern
|
|
3330
|
+
}, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
|
|
3249
3331
|
return;
|
|
3250
3332
|
}
|
|
3251
|
-
let t =
|
|
3333
|
+
let t = jr(e);
|
|
3252
3334
|
if (t) {
|
|
3253
|
-
|
|
3254
|
-
for (let [e, n] of Object.entries(t.headers))
|
|
3255
|
-
|
|
3335
|
+
s.statusCode = t.status;
|
|
3336
|
+
for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
|
|
3337
|
+
s.end(t.body);
|
|
3256
3338
|
return;
|
|
3257
3339
|
}
|
|
3258
|
-
|
|
3340
|
+
H(s, "ssr-dev", u, f.route.pattern, e, y);
|
|
3259
3341
|
}
|
|
3260
3342
|
});
|
|
3261
3343
|
}
|
|
3262
|
-
},
|
|
3344
|
+
}, G = Date.now(), K = D.version ?? "?", q = await ei(), ye = p(e, "node_modules", "@voltro", "ui-shadcn"), J = T(p(ye, "package.json")) ? ye : null, be = [], xe = await (async () => {
|
|
3263
3345
|
let t = [];
|
|
3264
|
-
for (let n of
|
|
3346
|
+
for (let n of r) {
|
|
3265
3347
|
if (!n.proxyTarget) continue;
|
|
3266
|
-
let r = await
|
|
3348
|
+
let r = await xi(e, n.pkg);
|
|
3267
3349
|
if (r) try {
|
|
3268
|
-
t.push(await
|
|
3350
|
+
t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
|
|
3269
3351
|
} catch {}
|
|
3270
3352
|
}
|
|
3271
3353
|
if (t.length === 0) return !1;
|
|
3272
|
-
let n =
|
|
3354
|
+
let n = fe("sha1").update(t.join("\0")).digest("hex"), i = p(k, ".voltro-rpcgroup-optimize"), a = "";
|
|
3273
3355
|
try {
|
|
3274
|
-
|
|
3356
|
+
a = (await O.readFile(i, "utf8")).trim();
|
|
3275
3357
|
} catch {}
|
|
3276
|
-
if (
|
|
3358
|
+
if (a === n) return !1;
|
|
3277
3359
|
try {
|
|
3278
|
-
await
|
|
3360
|
+
await O.writeFile(i, n);
|
|
3279
3361
|
} catch {}
|
|
3280
3362
|
return !0;
|
|
3281
3363
|
})();
|
|
3282
|
-
|
|
3364
|
+
xe && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await D.createServer({
|
|
3283
3365
|
root: k,
|
|
3284
3366
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3285
3367
|
ssr: { noExternal: ["react-intl"] },
|
|
3286
3368
|
resolve: {
|
|
3287
|
-
dedupe: [
|
|
3369
|
+
dedupe: [
|
|
3370
|
+
"react",
|
|
3371
|
+
"react-dom",
|
|
3372
|
+
"react-intl"
|
|
3373
|
+
],
|
|
3288
3374
|
alias: [
|
|
3289
|
-
...
|
|
3375
|
+
...q ? [{
|
|
3290
3376
|
find: "@voltro/devtools/styles.css",
|
|
3291
|
-
replacement:
|
|
3377
|
+
replacement: p(q, "src/styles.css")
|
|
3292
3378
|
}, {
|
|
3293
3379
|
find: "@voltro/devtools",
|
|
3294
|
-
replacement:
|
|
3380
|
+
replacement: p(q, "src/index.ts")
|
|
3295
3381
|
}] : [],
|
|
3296
|
-
...
|
|
3382
|
+
...J ? [
|
|
3297
3383
|
{
|
|
3298
3384
|
find: "@voltro/ui-shadcn/tokens.css",
|
|
3299
|
-
replacement:
|
|
3385
|
+
replacement: p(J, "src/tokens.css")
|
|
3300
3386
|
},
|
|
3301
3387
|
{
|
|
3302
3388
|
find: "@voltro/ui-shadcn/cn",
|
|
3303
|
-
replacement:
|
|
3389
|
+
replacement: p(J, "src/cn.ts")
|
|
3304
3390
|
},
|
|
3305
3391
|
{
|
|
3306
3392
|
find: "@voltro/ui-shadcn/brand",
|
|
3307
|
-
replacement:
|
|
3393
|
+
replacement: p(J, "src/brand/voltroLogo.tsx")
|
|
3308
3394
|
},
|
|
3309
3395
|
{
|
|
3310
3396
|
find: "@voltro/ui-shadcn",
|
|
3311
|
-
replacement:
|
|
3397
|
+
replacement: p(J, "src/index.ts")
|
|
3312
3398
|
}
|
|
3313
3399
|
] : [],
|
|
3314
|
-
...
|
|
3400
|
+
...Je(e)
|
|
3315
3401
|
]
|
|
3316
3402
|
},
|
|
3317
3403
|
optimizeDeps: {
|
|
3318
|
-
include: [...
|
|
3319
|
-
force:
|
|
3404
|
+
include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...be],
|
|
3405
|
+
force: xe
|
|
3320
3406
|
},
|
|
3321
|
-
customLogger:
|
|
3407
|
+
customLogger: Et(),
|
|
3322
3408
|
plugins: [
|
|
3323
|
-
|
|
3409
|
+
Kn(p(e, "src", "pages")),
|
|
3324
3410
|
ee(),
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3411
|
+
te(),
|
|
3412
|
+
re,
|
|
3413
|
+
P,
|
|
3328
3414
|
oe,
|
|
3329
3415
|
ce,
|
|
3330
3416
|
le,
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
...
|
|
3417
|
+
de,
|
|
3418
|
+
ve,
|
|
3419
|
+
...me ? [me] : []
|
|
3334
3420
|
],
|
|
3335
3421
|
server: {
|
|
3336
3422
|
port: g,
|
|
3337
3423
|
strictPort: !0,
|
|
3338
3424
|
host: !0,
|
|
3339
3425
|
allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
|
|
3340
|
-
proxy:
|
|
3341
|
-
fs: { allow: [e, ...
|
|
3426
|
+
proxy: V,
|
|
3427
|
+
fs: { allow: [e, ...oi(e)] }
|
|
3342
3428
|
},
|
|
3343
3429
|
appType: "spa",
|
|
3344
|
-
cacheDir:
|
|
3345
|
-
publicDir:
|
|
3346
|
-
})).listen(),
|
|
3347
|
-
version:
|
|
3348
|
-
bootMs: Date.now() -
|
|
3349
|
-
}),
|
|
3430
|
+
cacheDir: p(k, ".vite"),
|
|
3431
|
+
publicDir: p(e, "public")
|
|
3432
|
+
})).listen(), Qr.info(`v${K} ready in ${Date.now() - G}ms`, {
|
|
3433
|
+
version: K,
|
|
3434
|
+
bootMs: Date.now() - G
|
|
3435
|
+
}), Z.info(`listening on http://localhost:${g}`, {
|
|
3350
3436
|
port: g,
|
|
3351
3437
|
app: t.name ?? "(unnamed)"
|
|
3352
3438
|
});
|
|
3353
|
-
for (let e of
|
|
3439
|
+
for (let e of r) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
|
|
3354
3440
|
api: e.name,
|
|
3355
3441
|
target: e.proxyTarget
|
|
3356
|
-
}),
|
|
3442
|
+
}), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
|
|
3357
3443
|
try {
|
|
3358
|
-
await
|
|
3444
|
+
await We({
|
|
3359
3445
|
id: v,
|
|
3360
3446
|
name: _,
|
|
3361
3447
|
kind: "web",
|
|
@@ -3364,13 +3450,13 @@ import {
|
|
|
3364
3450
|
status: "live",
|
|
3365
3451
|
logFile: y.path
|
|
3366
3452
|
});
|
|
3367
|
-
let t =
|
|
3453
|
+
let t = vr(e);
|
|
3368
3454
|
if (t) {
|
|
3369
|
-
let e = await
|
|
3370
|
-
e.status === "launched" ?
|
|
3455
|
+
let e = await Or({ dashboardAppPath: t });
|
|
3456
|
+
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 });
|
|
3371
3457
|
}
|
|
3372
3458
|
setInterval(() => {
|
|
3373
|
-
|
|
3459
|
+
We({
|
|
3374
3460
|
id: v,
|
|
3375
3461
|
name: _,
|
|
3376
3462
|
kind: "web",
|
|
@@ -3381,52 +3467,56 @@ import {
|
|
|
3381
3467
|
}).catch(() => {});
|
|
3382
3468
|
}, 1e4).unref();
|
|
3383
3469
|
let n = () => {
|
|
3384
|
-
|
|
3470
|
+
Ge(v), y.dispose();
|
|
3385
3471
|
};
|
|
3386
3472
|
process.on("SIGINT", n), process.on("SIGTERM", n);
|
|
3387
3473
|
} catch (e) {
|
|
3388
|
-
|
|
3474
|
+
Z.warn("runtime-registry write failed", {}, e);
|
|
3389
3475
|
}
|
|
3390
|
-
return
|
|
3476
|
+
return C({
|
|
3391
3477
|
app: t.name ?? "unnamed",
|
|
3392
3478
|
kind: "web",
|
|
3393
3479
|
url: `http://localhost:${g}`,
|
|
3394
|
-
bootMs: Date.now() -
|
|
3480
|
+
bootMs: Date.now() - G
|
|
3395
3481
|
}), new Promise(() => {});
|
|
3396
|
-
},
|
|
3482
|
+
}, Li = async (e) => {
|
|
3397
3483
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
3398
|
-
let t = await
|
|
3484
|
+
let t = await Fi(e);
|
|
3399
3485
|
if (!t) return {
|
|
3400
3486
|
ran: !1,
|
|
3401
3487
|
exitCode: 0
|
|
3402
3488
|
};
|
|
3403
|
-
let n = Date.now(), r =
|
|
3489
|
+
let n = Date.now(), r = Z.child("serve");
|
|
3404
3490
|
r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
|
|
3405
|
-
let i = await
|
|
3491
|
+
let i = await Ei(e, t);
|
|
3406
3492
|
for (let e of i) r.info("api wired", {
|
|
3407
3493
|
name: e.name,
|
|
3408
3494
|
pkg: e.pkg
|
|
3409
3495
|
});
|
|
3410
|
-
await
|
|
3496
|
+
await Mi(e, t, i);
|
|
3411
3497
|
{
|
|
3412
|
-
let { pages: t } = await
|
|
3413
|
-
await
|
|
3498
|
+
let { pages: t } = await $(p(e, "src", "pages"));
|
|
3499
|
+
await zt({
|
|
3414
3500
|
appRoot: e,
|
|
3415
3501
|
pages: t
|
|
3416
3502
|
});
|
|
3417
3503
|
}
|
|
3418
|
-
let a = t.port ?? 5173, o = await
|
|
3419
|
-
|
|
3504
|
+
let a = t.port ?? 5173, o = await Xe("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
|
|
3505
|
+
Z.info("running production build"), await o.build({
|
|
3420
3506
|
root: c,
|
|
3421
3507
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3422
3508
|
plugins: [s()],
|
|
3423
|
-
customLogger:
|
|
3424
|
-
resolve: { dedupe: [
|
|
3509
|
+
customLogger: Et(),
|
|
3510
|
+
resolve: { dedupe: [
|
|
3511
|
+
"react",
|
|
3512
|
+
"react-dom",
|
|
3513
|
+
"react-intl"
|
|
3514
|
+
] },
|
|
3425
3515
|
build: {
|
|
3426
3516
|
outDir: "dist",
|
|
3427
|
-
rollupOptions: { output: { manualChunks:
|
|
3517
|
+
rollupOptions: { output: { manualChunks: ci } }
|
|
3428
3518
|
},
|
|
3429
|
-
publicDir:
|
|
3519
|
+
publicDir: p(e, "public")
|
|
3430
3520
|
});
|
|
3431
3521
|
let l = (await o.preview({
|
|
3432
3522
|
root: c,
|
|
@@ -3437,21 +3527,21 @@ import {
|
|
|
3437
3527
|
label: "Local",
|
|
3438
3528
|
url: e
|
|
3439
3529
|
})) ?? [];
|
|
3440
|
-
return
|
|
3530
|
+
return C({
|
|
3441
3531
|
app: t.name ?? "unnamed",
|
|
3442
3532
|
kind: "preview",
|
|
3443
3533
|
url: u,
|
|
3444
3534
|
extras: d,
|
|
3445
3535
|
bootMs: Date.now() - n
|
|
3446
3536
|
}), new Promise(() => {});
|
|
3447
|
-
},
|
|
3537
|
+
}, Ri = 5e3, zi = 6e4, Bi = (e, t) => {
|
|
3448
3538
|
if (e.length === 0) return 0;
|
|
3449
3539
|
if (e.length === 1) return e[0];
|
|
3450
3540
|
let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
|
|
3451
3541
|
if (r === i) return e[r];
|
|
3452
3542
|
let a = n - r;
|
|
3453
3543
|
return e[r] * (1 - a) + e[i] * a;
|
|
3454
|
-
},
|
|
3544
|
+
}, Vi = (e) => {
|
|
3455
3545
|
if (e.length === 0) return {
|
|
3456
3546
|
p50: 0,
|
|
3457
3547
|
p95: 0,
|
|
@@ -3463,18 +3553,18 @@ import {
|
|
|
3463
3553
|
let t = e.slice().sort((e, t) => e - t), n = 0;
|
|
3464
3554
|
for (let e of t) n += e;
|
|
3465
3555
|
return {
|
|
3466
|
-
p50:
|
|
3467
|
-
p95:
|
|
3468
|
-
p99:
|
|
3556
|
+
p50: Bi(t, .5),
|
|
3557
|
+
p95: Bi(t, .95),
|
|
3558
|
+
p99: Bi(t, .99),
|
|
3469
3559
|
mean: n / t.length,
|
|
3470
3560
|
min: t[0],
|
|
3471
3561
|
max: t[t.length - 1]
|
|
3472
3562
|
};
|
|
3473
|
-
},
|
|
3474
|
-
let t = e.maxSamples ??
|
|
3563
|
+
}, Hi = (e = {}) => {
|
|
3564
|
+
let t = e.maxSamples ?? Ri, n = e.defaultWindowMs ?? zi, r = [];
|
|
3475
3565
|
return {
|
|
3476
3566
|
record(e) {
|
|
3477
|
-
|
|
3567
|
+
ie(e), r.push({
|
|
3478
3568
|
...e,
|
|
3479
3569
|
ts: Date.now()
|
|
3480
3570
|
}), r.length > t && r.shift();
|
|
@@ -3500,7 +3590,7 @@ import {
|
|
|
3500
3590
|
tag: e.tag,
|
|
3501
3591
|
count: e.samples.length,
|
|
3502
3592
|
errorCount: n,
|
|
3503
|
-
latencyMs:
|
|
3593
|
+
latencyMs: Vi(t)
|
|
3504
3594
|
});
|
|
3505
3595
|
}
|
|
3506
3596
|
return c.sort((e, t) => t.count - e.count), {
|
|
@@ -3513,4 +3603,4 @@ import {
|
|
|
3513
3603
|
};
|
|
3514
3604
|
};
|
|
3515
3605
|
//#endregion
|
|
3516
|
-
export {
|
|
3606
|
+
export { _t as $, tr as A, Tn as B, yr as C, fr as D, vr as E, Xn as F, Jt as G, yn as H, Qn as I, Gt as J, qt as K, In as L, qn as M, $n as N, pr as O, Jn as P, Dt as Q, Ln as R, Ir as S, Or as T, fn as U, xn as V, sn as W, zt as X, Wt as Y, kt as Z, Ar as _, We as _t, hi as a, st as at, Pr as b, Ei as c, ot as ct, ci as d, et as dt, ht as et, $ as f, Xe as ft, Jr as g, Ge as gt, Kr as h, Ue as ht, ji as i, dt as it, rr as j, mr as k, Ii as l, rt as lt, Zr as m, Ke as mt, li as n, lt as nt, mi as o, ct as ot, Mi as p, Je as pt, Yt as q, Ai as r, ut as rt, Fi as s, at as st, Hi as t, mt as tt, Li as u, tt as ut, Mr as v, Me as vt, _r as w, Fr as x, Nr as y, Ne as yt, An as z };
|