@voltro/cli 0.27.0 → 0.29.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 +513 -0
- package/THIRD-PARTY-NOTICES.md +88 -2
- package/dist/{apiBuild-D22_EpoR.js → apiBuild-BESZbTjA.js} +4 -4
- package/dist/apiBuild-C8d74T6g.js +2 -0
- package/dist/bin.js +3 -3
- package/dist/checkCommand-BPAtyWs8.js +2420 -0
- package/dist/checkCommand-DBvZvCh1.js +2 -0
- package/dist/cliRuntime-Oh517vCV.js +96 -0
- package/dist/{commands-jBX8no1I.js → commands-82BDEktg.js} +6476 -7672
- package/dist/dbCommand-CaIVTp-a.js +2 -0
- package/dist/{dbCommand-uuNCrFAb.js → dbCommand-bCBbk6tz.js} +3 -3
- package/dist/{dev-DcbIJrWg.js → dev-Cg4BKLmi.js} +3034 -2619
- package/dist/dev-DeEJj5T4.js +3 -0
- package/dist/fileConventions-Cof68_BL.js +33 -0
- package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-4Db40V23.js} +2 -2
- package/dist/frameworkTableAssembly-BTNirAAk.js +2 -0
- package/dist/index.js +1 -1
- package/dist/{inspect-CUCCzw2I.js → inspect-BMvQpwqy.js} +211 -190
- package/dist/inspect-DHeaMZak.js +2 -0
- package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-DHYygE4s.js} +999 -961
- package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-C4R1EdHn.js} +1 -1
- package/dist/manifestBuild-Ck_90gZy.js +2 -0
- package/dist/sdkgen-CW5NbYF0.js +582 -0
- package/dist/{seedRunner-D6eu-u5U.js → seedRunner-Bqxgp7HZ.js} +60 -59
- package/dist/serveCommand-BXl8mhZD.js +1489 -0
- package/dist/serveEntry.js +3 -3
- package/dist/{start-BGXIf6zT.js → start-CsCIaW4-.js} +282 -269
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.md +2 -1
- package/templates/agent-docs/_index.md +2 -1
- package/templates/agent-docs/_manifest.json +10 -1
- package/templates/agent-docs/ai.md +135 -0
- package/templates/agent-docs/cli.md +124 -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/deployment.md +56 -0
- package/templates/agent-docs/internationalization.md +161 -1
- package/templates/agent-docs/local-first-mobile.md +414 -0
- package/templates/agent-docs/routing.md +93 -2
- package/templates/agent-docs/schema-driven-ui.md +12 -0
- package/templates/agent-docs/templates/apibackends.md +1 -1
- package/templates/agent-docs/testing.md +42 -0
- package/templates/agent-docs/whats-new.md +165 -131
- package/templates/agent-docs/workflows.md +11 -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-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/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- 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/package.json +7 -7
- 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-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- 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/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- 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/baselines/compose/docker-compose.prod.yml +15 -0
- package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
- package/dist/apiBuild-BrjrVJJh.js +0 -2
- package/dist/dbCommand-DrzXimKf.js +0 -2
- package/dist/dev-DNkso403.js +0 -3
- 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-DfkisVWP.js +0 -1310
|
@@ -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 { D as i, E as a, O as o, a as s, p as c, w as l } from "./inspect-BMvQpwqy.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 k, statSync as A, unlinkSync as j, unwatchFile as M, watchFile as N, writeSync as P } from "node:fs";
|
|
11
|
+
import { currentTraceContext as F, recordSample as I, resolveSecret as L } from "@voltro/runtime";
|
|
12
|
+
import { homedir as R } from "node:os";
|
|
13
|
+
import { createRequire as z } from "node:module";
|
|
14
|
+
import { FRAMEWORK_ENV_CATALOG as B, appEnvEntries as te, checkEnvNaming as V, formatEnvErrors as ne, installEnvSnapshot as H, isEnvContract as re, pluginEnvEntries as ie, renderDotEnvExample as ae, resolveEnv as oe } from "@voltro/env";
|
|
15
|
+
import { __installPublicEnv as U } from "@voltro/env/public";
|
|
16
|
+
import { mkdir as se, readFile as ce, writeFile as W } from "node:fs/promises";
|
|
17
|
+
import { createHash as le } from "node:crypto";
|
|
18
|
+
import { spawn as ue } from "node:child_process";
|
|
19
|
+
import { createConnection as de } from "node:net";
|
|
20
|
+
import { PassThrough as fe } from "node:stream";
|
|
21
|
+
//#region src/agentsMd.ts
|
|
22
|
+
var pe = d(g(import.meta.url)), me = [h(pe, "..", "templates"), h(pe, "..", "..", "templates")], he = (e) => ({
|
|
111
23
|
_tag: "TemplateNotFoundError",
|
|
112
24
|
searched: e
|
|
113
|
-
}),
|
|
25
|
+
}), ge = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", G = 2048, ve = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), J = (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)), ye = (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* J(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, G).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* ye(e), i = null;
|
|
192
|
+
for (let e of me) 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 me) if (yield* K(n, p(e, "AGENTS.md"))) {
|
|
198
|
+
let i = yield* q(n, p(e, "AGENTS.md")), a = [];
|
|
199
|
+
for (let e of ge) 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(he(me.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 = ge.map((e) => p(r, e));
|
|
208
|
+
if ((yield* b.forEach(d, (e) => q(n, e).pipe(b.map((e) => e.slice(0, G))))).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(ve) ? a.replace(ve, 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(ge, (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(R(), ".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 W(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 se(i, { recursive: !0 }), await W(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 se(e, { recursive: !0 }), await W(p(e, "env.public.ts"), n, "utf8");
|
|
382
|
+
}, rt = async (e) => {
|
|
383
|
+
let t = re(e.rawEnv) ? e.rawEnv : void 0, n = await oe({
|
|
472
384
|
contract: t,
|
|
473
|
-
resolveSecret:
|
|
474
|
-
}), r = [...n.errors, ...
|
|
475
|
-
if (r.length > 0) throw Error(
|
|
476
|
-
|
|
385
|
+
resolveSecret: L
|
|
386
|
+
}), r = [...n.errors, ...V(t, e.appType)];
|
|
387
|
+
if (r.length > 0) throw Error(ne(r));
|
|
388
|
+
H(n.values), e.appType === "web" && U(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 = te(e.contract), n = (e.plugins ?? []).flatMap((e) => ie(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : B, 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) => ae(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 = A(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 = ue(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) N(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) M(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,27 @@ __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 = {
|
|
850
792
|
trace: 0,
|
|
851
793
|
debug: 1,
|
|
852
794
|
info: 2,
|
|
853
795
|
warn: 3,
|
|
854
796
|
error: 4,
|
|
855
797
|
fatal: 5
|
|
856
|
-
},
|
|
798
|
+
}, Zt = 2e3, Qt = 200, $t = class {
|
|
857
799
|
capacity;
|
|
858
800
|
buffer = [];
|
|
859
|
-
constructor(e =
|
|
801
|
+
constructor(e = Zt) {
|
|
860
802
|
this.capacity = e;
|
|
861
803
|
}
|
|
862
804
|
append(e) {
|
|
863
805
|
this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
|
|
864
806
|
}
|
|
865
807
|
query(e = {}) {
|
|
866
|
-
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ??
|
|
808
|
+
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? Qt, this.capacity), i = e.minLevel === void 0 ? Xt.trace : Xt[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
|
|
867
809
|
for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
|
|
868
810
|
let r = this.buffer[e];
|
|
869
|
-
r.ts < t || r.ts > n ||
|
|
811
|
+
r.ts < t || r.ts > n || Xt[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
812
|
}
|
|
871
813
|
return l.reverse();
|
|
872
814
|
}
|
|
@@ -879,7 +821,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
879
821
|
clear() {
|
|
880
822
|
this.buffer = [];
|
|
881
823
|
}
|
|
882
|
-
},
|
|
824
|
+
}, en = null, tn = () => (en === null && (en = new $t()), en), nn = (e) => {
|
|
883
825
|
if (typeof e == "string") return e;
|
|
884
826
|
if (e instanceof Error) return e.message;
|
|
885
827
|
try {
|
|
@@ -887,18 +829,18 @@ __installPublicEnv(publicEnvValues)
|
|
|
887
829
|
} catch {
|
|
888
830
|
return String(e);
|
|
889
831
|
}
|
|
890
|
-
},
|
|
832
|
+
}, rn = (e) => {
|
|
891
833
|
let t = {
|
|
892
834
|
log: console.log.bind(console),
|
|
893
835
|
info: console.info.bind(console),
|
|
894
836
|
warn: console.warn.bind(console),
|
|
895
837
|
error: console.error.bind(console),
|
|
896
838
|
debug: console.debug.bind(console)
|
|
897
|
-
}, n =
|
|
839
|
+
}, n = tn(), r = !1, i = (i) => (...a) => {
|
|
898
840
|
if (t[i](...a), !r) {
|
|
899
841
|
r = !0;
|
|
900
842
|
try {
|
|
901
|
-
let t = a.length > 0 ?
|
|
843
|
+
let t = a.length > 0 ? nn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = F();
|
|
902
844
|
e.emit("log", {
|
|
903
845
|
level: i,
|
|
904
846
|
message: r,
|
|
@@ -925,7 +867,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
925
867
|
}
|
|
926
868
|
};
|
|
927
869
|
console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
|
|
928
|
-
let a =
|
|
870
|
+
let a = x((t) => {
|
|
929
871
|
if (!r) {
|
|
930
872
|
r = !0;
|
|
931
873
|
try {
|
|
@@ -936,7 +878,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
936
878
|
argsCount: 1,
|
|
937
879
|
...t.scope === void 0 ? {} : { scope: t.scope }
|
|
938
880
|
});
|
|
939
|
-
let a =
|
|
881
|
+
let a = F(), o = a !== void 0 && t.fields.traceId === void 0 ? {
|
|
940
882
|
...t.fields,
|
|
941
883
|
traceId: a.traceId
|
|
942
884
|
} : t.fields;
|
|
@@ -956,24 +898,24 @@ __installPublicEnv(publicEnvValues)
|
|
|
956
898
|
return () => {
|
|
957
899
|
console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
|
|
958
900
|
};
|
|
959
|
-
},
|
|
901
|
+
}, an = 2e3, on = 8, sn = 1e3, cn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, ln = (e) => {
|
|
960
902
|
switch (e) {
|
|
961
903
|
case "error": return "error";
|
|
962
904
|
case "warn": return "warn";
|
|
963
905
|
case "debug": return "debug";
|
|
964
906
|
default: return "info";
|
|
965
907
|
}
|
|
966
|
-
},
|
|
908
|
+
}, un = S({ scope: "client" }), dn = (e, t) => {
|
|
967
909
|
let n;
|
|
968
910
|
try {
|
|
969
911
|
n = JSON.parse(e);
|
|
970
912
|
} catch {
|
|
971
|
-
return
|
|
913
|
+
return fn(400, { error: "invalid JSON body" });
|
|
972
914
|
}
|
|
973
|
-
if (typeof n != "object" || !n) return
|
|
915
|
+
if (typeof n != "object" || !n) return fn(400, { error: "body must be a JSON object" });
|
|
974
916
|
let r = n;
|
|
975
|
-
if (!Array.isArray(r.entries)) return
|
|
976
|
-
let i = typeof r.app == "string" ?
|
|
917
|
+
if (!Array.isArray(r.entries)) return fn(400, { error: "entries must be an array" });
|
|
918
|
+
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, cn), c = 0;
|
|
977
919
|
for (let e of s) {
|
|
978
920
|
if (typeof e != "object" || !e) continue;
|
|
979
921
|
let n = e;
|
|
@@ -984,7 +926,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
984
926
|
"warn",
|
|
985
927
|
"error",
|
|
986
928
|
"debug"
|
|
987
|
-
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l =
|
|
929
|
+
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, an), u = Array.isArray(n.args) ? n.args.slice(0, on).filter((e) => typeof e == "string").map((e) => Y(e, sn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, an) : void 0;
|
|
988
930
|
t.emit("clientLog", {
|
|
989
931
|
ts: s,
|
|
990
932
|
level: r,
|
|
@@ -999,41 +941,41 @@ __installPublicEnv(publicEnvValues)
|
|
|
999
941
|
...i === void 0 ? {} : { app: i },
|
|
1000
942
|
...a === void 0 ? {} : { page: a },
|
|
1001
943
|
...u !== void 0 && u.length > 0 ? { args: u } : {}
|
|
1002
|
-
}, p =
|
|
1003
|
-
(p === "error" || p === "warn") && d !== void 0 ?
|
|
944
|
+
}, p = ln(r);
|
|
945
|
+
(p === "error" || p === "warn") && d !== void 0 ? un[p](l, f, { stack: d }) : un[p](l, {
|
|
1004
946
|
...f,
|
|
1005
947
|
...d === void 0 ? {} : { stack: d }
|
|
1006
948
|
}), c++;
|
|
1007
949
|
}
|
|
1008
|
-
return
|
|
950
|
+
return fn(202, {
|
|
1009
951
|
accepted: c,
|
|
1010
952
|
dropped: r.entries.length - c
|
|
1011
953
|
});
|
|
1012
|
-
},
|
|
954
|
+
}, fn = (e, t) => ({
|
|
1013
955
|
status: e,
|
|
1014
956
|
contentType: "application/json; charset=utf-8",
|
|
1015
957
|
body: JSON.stringify(t)
|
|
1016
|
-
}),
|
|
958
|
+
}), pn = "/_voltro/inspect/clientLog", mn = [
|
|
1017
959
|
"trace",
|
|
1018
960
|
"debug",
|
|
1019
961
|
"info",
|
|
1020
962
|
"warn",
|
|
1021
963
|
"error",
|
|
1022
964
|
"fatal"
|
|
1023
|
-
],
|
|
965
|
+
], hn = {
|
|
1024
966
|
trace: "TRACE",
|
|
1025
967
|
debug: "DEBUG",
|
|
1026
968
|
info: "INFO ",
|
|
1027
969
|
warn: "WARN ",
|
|
1028
970
|
error: "ERROR",
|
|
1029
971
|
fatal: "FATAL"
|
|
1030
|
-
},
|
|
972
|
+
}, gn = (e) => mn.includes(e), _n = (e, t, n = {}) => {
|
|
1031
973
|
if (i()) return {
|
|
1032
974
|
status: 503,
|
|
1033
975
|
contentType: "application/json",
|
|
1034
976
|
body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
|
|
1035
977
|
};
|
|
1036
|
-
let r =
|
|
978
|
+
let r = s(n, "GET");
|
|
1037
979
|
if (!r.ok) return {
|
|
1038
980
|
status: 401,
|
|
1039
981
|
contentType: "application/json",
|
|
@@ -1042,36 +984,36 @@ __installPublicEnv(publicEnvValues)
|
|
|
1042
984
|
reason: r.reason
|
|
1043
985
|
})
|
|
1044
986
|
};
|
|
1045
|
-
let a = e.indexOf("?"),
|
|
987
|
+
let a = e.indexOf("?"), o = a === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(a + 1)), c = {}, l = o.get("since");
|
|
1046
988
|
if (l !== null) {
|
|
1047
989
|
let e = Number(l);
|
|
1048
990
|
Number.isFinite(e) && (c.since = e);
|
|
1049
991
|
}
|
|
1050
|
-
let u =
|
|
992
|
+
let u = o.get("until");
|
|
1051
993
|
if (u !== null) {
|
|
1052
994
|
let e = Number(u);
|
|
1053
995
|
Number.isFinite(e) && (c.until = e);
|
|
1054
996
|
}
|
|
1055
|
-
let d =
|
|
997
|
+
let d = o.get("max");
|
|
1056
998
|
if (d !== null) {
|
|
1057
999
|
let e = Number(d);
|
|
1058
1000
|
Number.isFinite(e) && e > 0 && (c.max = Math.floor(e));
|
|
1059
1001
|
}
|
|
1060
|
-
let f =
|
|
1061
|
-
f !== null &&
|
|
1062
|
-
let p =
|
|
1002
|
+
let f = o.get("level");
|
|
1003
|
+
f !== null && gn(f) && (c.minLevel = f);
|
|
1004
|
+
let p = o.get("source");
|
|
1063
1005
|
(p === "server" || p === "client") && (c.source = p);
|
|
1064
|
-
let m =
|
|
1006
|
+
let m = o.get("scope");
|
|
1065
1007
|
m !== null && m.length > 0 && (c.scope = m);
|
|
1066
|
-
let h =
|
|
1008
|
+
let h = o.get("filter");
|
|
1067
1009
|
h !== null && h.length > 0 && (c.filter = h);
|
|
1068
|
-
let g =
|
|
1010
|
+
let g = o.get("trace");
|
|
1069
1011
|
g !== null && g.length > 0 && (c.traceId = g);
|
|
1070
1012
|
let _ = t.query(c);
|
|
1071
|
-
if ((
|
|
1013
|
+
if ((o.get("format") ?? "json") === "text") return {
|
|
1072
1014
|
status: 200,
|
|
1073
1015
|
contentType: "text/plain; charset=utf-8",
|
|
1074
|
-
body: _.map(
|
|
1016
|
+
body: _.map(vn).join("\n") + (_.length > 0 ? "\n" : "")
|
|
1075
1017
|
};
|
|
1076
1018
|
let v = {
|
|
1077
1019
|
capturedAt: Date.now(),
|
|
@@ -1085,40 +1027,40 @@ __installPublicEnv(publicEnvValues)
|
|
|
1085
1027
|
contentType: "application/json; charset=utf-8",
|
|
1086
1028
|
body: JSON.stringify(v)
|
|
1087
1029
|
};
|
|
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
|
-
},
|
|
1030
|
+
}, vn = (e) => {
|
|
1031
|
+
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 = bn(e.fields);
|
|
1032
|
+
return `${n}:${r}:${i}.${a} ${hn[e.level]} ${o} ${e.message}${s}`;
|
|
1033
|
+
}, yn = 80, bn = (e) => {
|
|
1092
1034
|
let t = Object.entries(e);
|
|
1093
1035
|
if (t.length === 0) return "";
|
|
1094
1036
|
let n = [];
|
|
1095
1037
|
for (let [e, r] of t) {
|
|
1096
1038
|
if (r === void 0) continue;
|
|
1097
|
-
let t =
|
|
1039
|
+
let t = xn(r);
|
|
1098
1040
|
n.push(`${e}=${t}`);
|
|
1099
1041
|
}
|
|
1100
1042
|
return n.length > 0 ? " " + n.join(" ") : "";
|
|
1101
|
-
},
|
|
1043
|
+
}, xn = (e) => {
|
|
1102
1044
|
if (typeof e == "string") {
|
|
1103
|
-
let t = e.length >
|
|
1045
|
+
let t = e.length > yn ? e.slice(0, yn) + "…" : e;
|
|
1104
1046
|
return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
|
|
1105
1047
|
}
|
|
1106
1048
|
if (e === null) return "null";
|
|
1107
1049
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
1108
1050
|
try {
|
|
1109
1051
|
let t = JSON.stringify(e);
|
|
1110
|
-
return t.length >
|
|
1052
|
+
return t.length > yn ? t.slice(0, yn) + "…" : t;
|
|
1111
1053
|
} catch {
|
|
1112
1054
|
return "[unserialisable]";
|
|
1113
1055
|
}
|
|
1114
|
-
},
|
|
1056
|
+
}, Sn = "/_voltro/inspect/logs", Cn = (e, t, n) => {
|
|
1115
1057
|
if (t.headers.authorization !== void 0) return !1;
|
|
1116
1058
|
let { token: r } = n;
|
|
1117
1059
|
if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
|
|
1118
1060
|
e.setHeader("authorization", `Bearer ${r}`);
|
|
1119
1061
|
let i = n.writeToken;
|
|
1120
1062
|
return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
|
|
1121
|
-
},
|
|
1063
|
+
}, wn = [{
|
|
1122
1064
|
match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
|
|
1123
1065
|
handle: (e, t) => {
|
|
1124
1066
|
let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
|
|
@@ -1130,13 +1072,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
1130
1072
|
});
|
|
1131
1073
|
} else t.info(n);
|
|
1132
1074
|
}
|
|
1133
|
-
}],
|
|
1075
|
+
}], Tn = () => {
|
|
1134
1076
|
let e = {
|
|
1135
1077
|
warn: console.warn.bind(console),
|
|
1136
1078
|
error: console.error.bind(console)
|
|
1137
|
-
}, t =
|
|
1079
|
+
}, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
|
|
1138
1080
|
if (!n) {
|
|
1139
|
-
for (let e of
|
|
1081
|
+
for (let e of wn) if (e.match(i[0])) {
|
|
1140
1082
|
n = !0;
|
|
1141
1083
|
try {
|
|
1142
1084
|
e.handle(i, t);
|
|
@@ -1151,7 +1093,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1151
1093
|
return console.warn = r("warn"), console.error = r("error"), () => {
|
|
1152
1094
|
console.warn = e.warn, console.error = e.error;
|
|
1153
1095
|
};
|
|
1154
|
-
},
|
|
1096
|
+
}, En = {
|
|
1155
1097
|
loader: "it runs on the server, and the router caches its result per route + params",
|
|
1156
1098
|
renderMode: "it picks the server render strategy",
|
|
1157
1099
|
dynamic: "it picks the server render strategy",
|
|
@@ -1162,7 +1104,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1162
1104
|
cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
|
|
1163
1105
|
interactive: "it decides how much client JS the server ships",
|
|
1164
1106
|
tenantAware: "it is part of the server-side cache key"
|
|
1165
|
-
},
|
|
1107
|
+
}, Dn = Object.keys(En), On = (e) => t.test(e), kn = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), An = "virtual:voltro-route-refresh", jn = `\0${An}`, Mn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Nn = () => `
|
|
1166
1108
|
// GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
|
|
1167
1109
|
|
|
1168
1110
|
/** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
|
|
@@ -1191,11 +1133,11 @@ const stableForm = (value) => {
|
|
|
1191
1133
|
* readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
|
|
1192
1134
|
* one of THESE cannot be hot-applied: the server already ran with the old
|
|
1193
1135
|
* value. Everything else a page exports is plain client-side data. */
|
|
1194
|
-
const serverRelevantExports = ${JSON.stringify(
|
|
1136
|
+
const serverRelevantExports = ${JSON.stringify(Dn)}
|
|
1195
1137
|
|
|
1196
1138
|
/** Name → the server step that already consumed it, so the reload message can
|
|
1197
1139
|
* say WHY rather than just WHAT. Injected from the same single source. */
|
|
1198
|
-
const serverExportEffect = ${JSON.stringify(
|
|
1140
|
+
const serverExportEffect = ${JSON.stringify(En)}
|
|
1199
1141
|
|
|
1200
1142
|
/** The reason \`name\` forces a reload, for the console line. */
|
|
1201
1143
|
export const serverEffectOf = (name) =>
|
|
@@ -1238,7 +1180,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
|
|
|
1238
1180
|
const previousHook = globalThis.__getReactRefreshIgnoredExports
|
|
1239
1181
|
globalThis.__getReactRefreshIgnoredExports = (args) =>
|
|
1240
1182
|
ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
|
|
1241
|
-
`,
|
|
1183
|
+
`, Pn = (e) => `
|
|
1242
1184
|
if (import.meta.hot) {
|
|
1243
1185
|
// Self-import to read our OWN exports, the same technique the react plugin
|
|
1244
1186
|
// uses; the namespace is only complete after evaluation, hence the promise.
|
|
@@ -1265,57 +1207,57 @@ import {
|
|
|
1265
1207
|
registerRouteModule as __voltro_registerRouteModule,
|
|
1266
1208
|
routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
|
|
1267
1209
|
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
|
-
},
|
|
1210
|
+
} from '${An}'
|
|
1211
|
+
`, Fn = (e) => e.replace(/\\/g, "/"), In = (e, t) => {
|
|
1212
|
+
let [i = "", a] = Fn(e).split("?");
|
|
1213
|
+
if (!i.endsWith(".tsx") || a !== void 0 && Mn.test(a)) return !1;
|
|
1214
|
+
let o = Fn(t).replace(/\/$/, "");
|
|
1215
|
+
return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
|
|
1216
|
+
}, Ln = (e, t, n) => In(t, n) ? `${e}${Pn(Fn(t).split("?")[0] ?? t)}` : null, Rn = (e) => ({
|
|
1275
1217
|
name: "voltro:route-fast-refresh",
|
|
1276
1218
|
enforce: "pre",
|
|
1277
|
-
resolveId: (e) => e === "virtual:voltro-route-refresh" ?
|
|
1278
|
-
load: (e) => e ===
|
|
1219
|
+
resolveId: (e) => e === "virtual:voltro-route-refresh" ? jn : void 0,
|
|
1220
|
+
load: (e) => e === jn ? Nn() : void 0,
|
|
1279
1221
|
transform: (t, n, r) => {
|
|
1280
1222
|
if (r?.ssr === !0) return null;
|
|
1281
|
-
let i =
|
|
1223
|
+
let i = Ln(t, n, e);
|
|
1282
1224
|
return i === null ? null : {
|
|
1283
1225
|
code: i,
|
|
1284
1226
|
map: null
|
|
1285
1227
|
};
|
|
1286
1228
|
}
|
|
1287
|
-
}),
|
|
1229
|
+
}), zn = [
|
|
1288
1230
|
"static",
|
|
1289
1231
|
"spa",
|
|
1290
1232
|
"ssr",
|
|
1291
1233
|
"isr"
|
|
1292
|
-
],
|
|
1234
|
+
], Bn = (e) => typeof e == "string" && zn.includes(e), Vn = zn.map((e) => `'${e}'`).join(" | "), Hn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Vn}.${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)." : ""}`, Un = class extends Error {
|
|
1293
1235
|
page;
|
|
1294
1236
|
value;
|
|
1295
1237
|
name = "InvalidRenderModeError";
|
|
1296
1238
|
constructor(e, t) {
|
|
1297
|
-
super(
|
|
1239
|
+
super(Hn(e, t)), this.page = e, this.value = t;
|
|
1298
1240
|
}
|
|
1299
|
-
},
|
|
1241
|
+
}, Wn = (e, t = "<page>") => {
|
|
1300
1242
|
if (e.renderMode !== void 0 && e.renderMode !== null) {
|
|
1301
|
-
if (!
|
|
1243
|
+
if (!Bn(e.renderMode)) throw new Un(t, String(e.renderMode));
|
|
1302
1244
|
return e.renderMode;
|
|
1303
1245
|
}
|
|
1304
1246
|
return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
|
|
1305
|
-
},
|
|
1306
|
-
renderMode:
|
|
1247
|
+
}, Gn = (e, t = "<page>") => ({
|
|
1248
|
+
renderMode: Wn(e, t),
|
|
1307
1249
|
tenantAware: e.tenantAware === !0,
|
|
1308
|
-
revalidateMs:
|
|
1309
|
-
staleWhileRevalidateMs:
|
|
1250
|
+
revalidateMs: ct(e.revalidate),
|
|
1251
|
+
staleWhileRevalidateMs: ct(e.staleWhileRevalidate) ?? 0,
|
|
1310
1252
|
cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
|
|
1311
1253
|
interactive: e.interactive ?? "full",
|
|
1312
1254
|
hasLoader: typeof e.loader == "function",
|
|
1313
1255
|
hasMeta: e.meta != null,
|
|
1314
1256
|
hasGetStaticPaths: typeof e.getStaticPaths == "function"
|
|
1315
|
-
}),
|
|
1316
|
-
|
|
1257
|
+
}), Kn = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, qn = (e) => Kn.exec(e)?.[1] ?? null, Jn = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, Yn = (e) => {
|
|
1258
|
+
Jn.lastIndex = 0;
|
|
1317
1259
|
let t;
|
|
1318
|
-
for (; (t =
|
|
1260
|
+
for (; (t = Jn.exec(e)) !== null;) {
|
|
1319
1261
|
let e = t[2];
|
|
1320
1262
|
if (e.startsWith(".")) for (let n of t[1].split(",")) {
|
|
1321
1263
|
let t = n.lastIndexOf(" as ");
|
|
@@ -1323,50 +1265,50 @@ import {
|
|
|
1323
1265
|
}
|
|
1324
1266
|
}
|
|
1325
1267
|
return null;
|
|
1326
|
-
},
|
|
1268
|
+
}, Xn = /export\s*\{([^}]*)\}/g, Zn = (e) => {
|
|
1327
1269
|
if (/export\s+default\b/.test(e)) return !0;
|
|
1328
|
-
|
|
1270
|
+
Xn.lastIndex = 0;
|
|
1329
1271
|
let t;
|
|
1330
|
-
for (; (t =
|
|
1272
|
+
for (; (t = Xn.exec(e)) !== null;) for (let e of t[1].split(",")) {
|
|
1331
1273
|
let t = e.lastIndexOf(" as ");
|
|
1332
1274
|
if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
|
|
1333
1275
|
}
|
|
1334
1276
|
return !1;
|
|
1335
|
-
},
|
|
1277
|
+
}, Qn = async (e, t) => {
|
|
1336
1278
|
let n = (await Promise.all(t.map(async (t) => {
|
|
1337
1279
|
let n;
|
|
1338
1280
|
try {
|
|
1339
|
-
n = await
|
|
1281
|
+
n = await ce(p(e, t.file), "utf8");
|
|
1340
1282
|
} catch {
|
|
1341
1283
|
return null;
|
|
1342
1284
|
}
|
|
1343
|
-
let r =
|
|
1344
|
-
return r !== null && !
|
|
1285
|
+
let r = qn(n);
|
|
1286
|
+
return r !== null && !Bn(r) ? Hn(p("src", "pages", t.file), r) : Zn(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
1287
|
}))).filter((e) => e !== null);
|
|
1346
1288
|
if (n.length !== 0) throw Error(n.join("\n\n"));
|
|
1347
|
-
},
|
|
1289
|
+
}, X = p(R(), ".voltro", "logs"), $n = () => {
|
|
1348
1290
|
let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
|
|
1349
1291
|
return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
|
|
1350
|
-
},
|
|
1351
|
-
if (
|
|
1352
|
-
|
|
1353
|
-
let e = Date.now() -
|
|
1292
|
+
}, er = !1, tr = () => {
|
|
1293
|
+
if (er) return;
|
|
1294
|
+
er = !0;
|
|
1295
|
+
let e = Date.now() - $n(), t = [];
|
|
1354
1296
|
try {
|
|
1355
|
-
t =
|
|
1297
|
+
t = k(X);
|
|
1356
1298
|
} catch {
|
|
1357
1299
|
return;
|
|
1358
1300
|
}
|
|
1359
1301
|
for (let n of t) {
|
|
1360
1302
|
if (!n.endsWith(".log")) continue;
|
|
1361
|
-
let t =
|
|
1303
|
+
let t = p(X, n);
|
|
1362
1304
|
try {
|
|
1363
|
-
|
|
1305
|
+
A(t).mtimeMs < e && j(t);
|
|
1364
1306
|
} catch {}
|
|
1365
1307
|
}
|
|
1366
|
-
},
|
|
1367
|
-
let t =
|
|
1308
|
+
}, nr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), rr = (e, t) => p(X, `${nr(e)}-${t}.log`), ir = (e) => {
|
|
1309
|
+
let t = nr(e), n = [];
|
|
1368
1310
|
try {
|
|
1369
|
-
n =
|
|
1311
|
+
n = k(X);
|
|
1370
1312
|
} catch {
|
|
1371
1313
|
return;
|
|
1372
1314
|
}
|
|
@@ -1374,19 +1316,19 @@ import {
|
|
|
1374
1316
|
if (r.length === 0) return;
|
|
1375
1317
|
let i, a = -1;
|
|
1376
1318
|
for (let e of r) {
|
|
1377
|
-
let t =
|
|
1319
|
+
let t = p(X, e);
|
|
1378
1320
|
try {
|
|
1379
|
-
let e =
|
|
1321
|
+
let e = A(t);
|
|
1380
1322
|
e.mtimeMs > a && (a = e.mtimeMs, i = t);
|
|
1381
1323
|
} catch {}
|
|
1382
1324
|
}
|
|
1383
1325
|
return i;
|
|
1384
|
-
},
|
|
1326
|
+
}, ar = (e) => {
|
|
1385
1327
|
try {
|
|
1386
|
-
|
|
1328
|
+
E(X, { recursive: !0 });
|
|
1387
1329
|
} catch {}
|
|
1388
|
-
|
|
1389
|
-
let t =
|
|
1330
|
+
tr();
|
|
1331
|
+
let t = rr(e, process.pid), n = D(t, "w"), r = (e) => {
|
|
1390
1332
|
let t = {
|
|
1391
1333
|
ts: e.ts.getTime(),
|
|
1392
1334
|
level: e.level,
|
|
@@ -1407,15 +1349,15 @@ import {
|
|
|
1407
1349
|
...e.scope === void 0 ? {} : { scope: e.scope }
|
|
1408
1350
|
}) + "\n";
|
|
1409
1351
|
}
|
|
1410
|
-
}, i = !1, a =
|
|
1352
|
+
}, i = !1, a = x((e) => {
|
|
1411
1353
|
if (!i) try {
|
|
1412
|
-
|
|
1354
|
+
P(n, r(e));
|
|
1413
1355
|
} catch {}
|
|
1414
1356
|
}), o = () => {
|
|
1415
1357
|
if (!i) {
|
|
1416
1358
|
i = !0;
|
|
1417
1359
|
try {
|
|
1418
|
-
|
|
1360
|
+
w(n);
|
|
1419
1361
|
} catch {}
|
|
1420
1362
|
}
|
|
1421
1363
|
};
|
|
@@ -1427,10 +1369,10 @@ import {
|
|
|
1427
1369
|
a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
|
|
1428
1370
|
}
|
|
1429
1371
|
};
|
|
1430
|
-
},
|
|
1372
|
+
}, or = async (e, t) => {
|
|
1431
1373
|
let n;
|
|
1432
1374
|
try {
|
|
1433
|
-
n = await
|
|
1375
|
+
n = await O.readFile(e, "utf8");
|
|
1434
1376
|
} catch {
|
|
1435
1377
|
return [];
|
|
1436
1378
|
}
|
|
@@ -1441,78 +1383,78 @@ import {
|
|
|
1441
1383
|
i.push(t);
|
|
1442
1384
|
} catch {}
|
|
1443
1385
|
return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
|
|
1444
|
-
},
|
|
1386
|
+
}, sr = S({ scope: "voltro:dashboard" }), cr = z(import.meta.url), lr = 5179, ur = (e) => {
|
|
1445
1387
|
let t = process.env.VOLTRO_DASHBOARD_PATH;
|
|
1446
|
-
if (t &&
|
|
1388
|
+
if (t && T(p(h(t), "app.config.ts"))) return h(t);
|
|
1447
1389
|
try {
|
|
1448
|
-
let e =
|
|
1449
|
-
if (
|
|
1390
|
+
let e = d(cr.resolve("@voltro/dashboard/package.json"));
|
|
1391
|
+
if (T(p(e, "app.config.ts"))) return e;
|
|
1450
1392
|
} catch {}
|
|
1451
|
-
let n =
|
|
1393
|
+
let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
|
|
1452
1394
|
for (let e = 0; e < 10; e++) {
|
|
1453
|
-
let e =
|
|
1454
|
-
if (
|
|
1455
|
-
let t =
|
|
1395
|
+
let e = p(r, n);
|
|
1396
|
+
if (T(p(e, "app.config.ts"))) return e;
|
|
1397
|
+
let t = d(r);
|
|
1456
1398
|
if (t === r) break;
|
|
1457
1399
|
r = t;
|
|
1458
1400
|
}
|
|
1459
1401
|
return null;
|
|
1460
|
-
},
|
|
1461
|
-
let i =
|
|
1402
|
+
}, dr = "VOLTRO_IS_DASHBOARD", fr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
|
|
1403
|
+
let i = de({
|
|
1462
1404
|
port: e,
|
|
1463
1405
|
host: t
|
|
1464
1406
|
}), a = !1, o = (e) => {
|
|
1465
1407
|
a || (a = !0, i.destroy(), r(e));
|
|
1466
1408
|
};
|
|
1467
1409
|
i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
|
|
1468
|
-
}),
|
|
1410
|
+
}), pr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), mr = () => process.env[dr] === "1", hr = () => process.stdout.isTTY === !0, gr = p(R(), ".voltro", "dashboard-launch.lock"), _r = 1e4, vr = async () => {
|
|
1469
1411
|
try {
|
|
1470
|
-
await
|
|
1471
|
-
let e = await
|
|
1412
|
+
await O.mkdir(d(gr), { recursive: !0 });
|
|
1413
|
+
let e = await O.open(gr, "wx");
|
|
1472
1414
|
return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
|
|
1473
1415
|
} catch {
|
|
1474
1416
|
try {
|
|
1475
|
-
let e = await
|
|
1476
|
-
if (Date.now() - e.mtimeMs >
|
|
1417
|
+
let e = await O.stat(gr);
|
|
1418
|
+
if (Date.now() - e.mtimeMs > _r) return await O.unlink(gr).catch(() => void 0), vr();
|
|
1477
1419
|
} catch {}
|
|
1478
1420
|
return !1;
|
|
1479
1421
|
}
|
|
1480
|
-
},
|
|
1422
|
+
}, yr = async () => {
|
|
1481
1423
|
try {
|
|
1482
|
-
await
|
|
1424
|
+
await O.unlink(gr);
|
|
1483
1425
|
} catch {}
|
|
1484
|
-
},
|
|
1426
|
+
}, br = async (e) => {
|
|
1485
1427
|
let t = e.port ?? 5179;
|
|
1486
|
-
if (
|
|
1428
|
+
if (pr()) return {
|
|
1487
1429
|
status: "skipped",
|
|
1488
1430
|
reason: "disabled by flag/env",
|
|
1489
1431
|
port: t
|
|
1490
1432
|
};
|
|
1491
|
-
if (
|
|
1433
|
+
if (mr()) return {
|
|
1492
1434
|
status: "skipped",
|
|
1493
1435
|
reason: "this process IS the dashboard",
|
|
1494
1436
|
port: t
|
|
1495
1437
|
};
|
|
1496
|
-
if (!
|
|
1438
|
+
if (!hr()) return {
|
|
1497
1439
|
status: "skipped",
|
|
1498
1440
|
reason: "stdout is not a TTY (CI/smoke)",
|
|
1499
1441
|
port: t
|
|
1500
1442
|
};
|
|
1501
|
-
if (!await
|
|
1443
|
+
if (!await vr()) return {
|
|
1502
1444
|
status: "skipped",
|
|
1503
1445
|
reason: "another voltro process is currently launching the dashboard",
|
|
1504
1446
|
port: t
|
|
1505
1447
|
};
|
|
1506
|
-
if (await
|
|
1448
|
+
if (await fr(t)) return await yr(), {
|
|
1507
1449
|
status: "already-running",
|
|
1508
1450
|
port: t
|
|
1509
1451
|
};
|
|
1510
1452
|
let n = e.voltroBin;
|
|
1511
1453
|
if (!n) {
|
|
1512
1454
|
let e = process.argv[1];
|
|
1513
|
-
n = e && e.endsWith("/src/bin.ts") ?
|
|
1455
|
+
n = e && e.endsWith("/src/bin.ts") ? p(d(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
|
|
1514
1456
|
}
|
|
1515
|
-
let r =
|
|
1457
|
+
let r = T(p(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = ue(process.execPath, [
|
|
1516
1458
|
n,
|
|
1517
1459
|
i,
|
|
1518
1460
|
e.dashboardAppPath
|
|
@@ -1520,7 +1462,7 @@ import {
|
|
|
1520
1462
|
stdio: "ignore",
|
|
1521
1463
|
env: {
|
|
1522
1464
|
...process.env,
|
|
1523
|
-
[
|
|
1465
|
+
[dr]: "1",
|
|
1524
1466
|
VOLTRO_DASHBOARD_PORT: String(t)
|
|
1525
1467
|
}
|
|
1526
1468
|
});
|
|
@@ -1528,22 +1470,22 @@ import {
|
|
|
1528
1470
|
if (a.exitCode === null && a.signalCode === null) try {
|
|
1529
1471
|
a.kill("SIGTERM");
|
|
1530
1472
|
} catch {}
|
|
1531
|
-
}),
|
|
1473
|
+
}), sr.info(`auto-launching dashboard at http://localhost:${t}`, {
|
|
1532
1474
|
port: t,
|
|
1533
1475
|
mode: i,
|
|
1534
1476
|
prebuilt: r
|
|
1535
|
-
}), r ||
|
|
1536
|
-
|
|
1477
|
+
}), r || sr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), sr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
|
|
1478
|
+
yr();
|
|
1537
1479
|
}, 4e3).unref(), {
|
|
1538
1480
|
status: "launched",
|
|
1539
1481
|
port: t
|
|
1540
1482
|
};
|
|
1541
|
-
},
|
|
1483
|
+
}, xr = class extends Error {
|
|
1542
1484
|
_voltroDeferral = !0;
|
|
1543
1485
|
constructor(e) {
|
|
1544
1486
|
super(e), this.name = "DeferralNotSupportedError";
|
|
1545
1487
|
}
|
|
1546
|
-
},
|
|
1488
|
+
}, Sr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Cr = (e) => {
|
|
1547
1489
|
if (!(e instanceof Error)) return;
|
|
1548
1490
|
let t = e._voltroControl;
|
|
1549
1491
|
if (t === "redirect") {
|
|
@@ -1565,7 +1507,7 @@ import {
|
|
|
1565
1507
|
},
|
|
1566
1508
|
body: "not found"
|
|
1567
1509
|
};
|
|
1568
|
-
},
|
|
1510
|
+
}, wr = (e) => {
|
|
1569
1511
|
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
1570
1512
|
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
1571
1513
|
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
@@ -1580,7 +1522,7 @@ import {
|
|
|
1580
1522
|
...e.layoutShell ? { layoutShell: e.layoutShell } : {}
|
|
1581
1523
|
});
|
|
1582
1524
|
} catch (e) {
|
|
1583
|
-
throw new
|
|
1525
|
+
throw new xr(e instanceof Error ? e.message : String(e));
|
|
1584
1526
|
}
|
|
1585
1527
|
return {
|
|
1586
1528
|
loaderData: n.renderData,
|
|
@@ -1596,8 +1538,8 @@ import {
|
|
|
1596
1538
|
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
1597
1539
|
}
|
|
1598
1540
|
};
|
|
1599
|
-
},
|
|
1600
|
-
let { helpers: t, renderInput: n } = e, r =
|
|
1541
|
+
}, Tr = (e) => {
|
|
1542
|
+
let { helpers: t, renderInput: n } = e, r = wr({
|
|
1601
1543
|
helpers: t,
|
|
1602
1544
|
page: e.page,
|
|
1603
1545
|
pathname: n.pathname,
|
|
@@ -1618,19 +1560,19 @@ import {
|
|
|
1618
1560
|
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
1619
1561
|
hasDeferred: r.hasDeferred
|
|
1620
1562
|
};
|
|
1621
|
-
},
|
|
1563
|
+
}, Er = (e) => {
|
|
1622
1564
|
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
1623
1565
|
return {
|
|
1624
1566
|
body: t,
|
|
1625
1567
|
meta: n
|
|
1626
1568
|
};
|
|
1627
|
-
},
|
|
1569
|
+
}, Dr = (e) => [
|
|
1628
1570
|
...e.extra ?? [],
|
|
1629
1571
|
e.helpers.renderMetaToHtml(e.meta),
|
|
1630
1572
|
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
1631
1573
|
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
1632
1574
|
e.prepared.stateScript
|
|
1633
|
-
].filter((e) => e.length > 0).join("\n "),
|
|
1575
|
+
].filter((e) => e.length > 0).join("\n "), Or = (e) => {
|
|
1634
1576
|
let t = e.indexOf("?");
|
|
1635
1577
|
return t === -1 ? {
|
|
1636
1578
|
pathname: e || "/",
|
|
@@ -1639,30 +1581,51 @@ import {
|
|
|
1639
1581
|
pathname: e.slice(0, t) || "/",
|
|
1640
1582
|
search: e.slice(t)
|
|
1641
1583
|
};
|
|
1642
|
-
},
|
|
1643
|
-
let
|
|
1644
|
-
|
|
1584
|
+
}, kr = 8e3, Ar = (e, t = kr) => {
|
|
1585
|
+
let n = Mr(e);
|
|
1586
|
+
return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
|
|
1587
|
+
}, jr = 4, Mr = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
|
|
1588
|
+
if (e instanceof Error) {
|
|
1589
|
+
let r = e.stack ?? `${e.name}: ${e.message}`;
|
|
1590
|
+
if (n.has(e)) return `${r}\n [cycle]`;
|
|
1591
|
+
n.add(e);
|
|
1592
|
+
let i = [];
|
|
1593
|
+
if (t < jr) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${Nr(Mr(a, t + 1, n))}`);
|
|
1594
|
+
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${Nr(Mr(e.cause, t + 1, n))}`);
|
|
1595
|
+
return r + i.join("");
|
|
1596
|
+
}
|
|
1597
|
+
try {
|
|
1598
|
+
return String(e);
|
|
1599
|
+
} catch {
|
|
1600
|
+
return "[unstringifiable thrown value]";
|
|
1601
|
+
}
|
|
1602
|
+
}, Nr = (e) => {
|
|
1603
|
+
let t = e.split("\n");
|
|
1604
|
+
return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
|
|
1605
|
+
}, Pr = "<div id=\"root\"></div>", Fr = "<div id=\"root\">", Ir = "</div>", Lr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Rr = /\bsrc=["']([^"']+)["']/i, zr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Br = (e) => {
|
|
1606
|
+
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Lr, (e) => {
|
|
1607
|
+
let r = Rr.exec(e)?.[1];
|
|
1645
1608
|
return r === void 0 || t(r) ? e : (n.push(r), "");
|
|
1646
1609
|
});
|
|
1647
|
-
e.inlineModuleScriptsAsync && (r = r.replace(
|
|
1648
|
-
let i = r.indexOf(
|
|
1649
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
1610
|
+
e.inlineModuleScriptsAsync && (r = r.replace(zr, "<script async$1>"));
|
|
1611
|
+
let i = r.indexOf(Pr);
|
|
1612
|
+
if (i === -1) throw Error(`[voltro] the generated shell has no \`${Pr}\` 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
1613
|
return {
|
|
1651
|
-
head: `${r.slice(0, i)}${
|
|
1652
|
-
tail: `${
|
|
1614
|
+
head: `${r.slice(0, i)}${Fr}`,
|
|
1615
|
+
tail: `${Ir}${r.slice(i + 21)}`,
|
|
1653
1616
|
bootstrapModules: n
|
|
1654
1617
|
};
|
|
1655
|
-
},
|
|
1618
|
+
}, Vr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Hr = (e) => {
|
|
1656
1619
|
let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
|
|
1657
1620
|
if (s || !o || a === null) return;
|
|
1658
1621
|
s = !0, t.statusCode = e.statusCode ?? 200;
|
|
1659
1622
|
for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
|
|
1660
|
-
t.flushHeaders?.(), t.write(
|
|
1623
|
+
t.flushHeaders?.(), t.write(Vr({
|
|
1661
1624
|
head: n.head,
|
|
1662
1625
|
headInjection: i(a.meta),
|
|
1663
1626
|
htmlLang: r
|
|
1664
1627
|
}));
|
|
1665
|
-
let c = new
|
|
1628
|
+
let c = new fe();
|
|
1666
1629
|
c.pipe(t, { end: !1 }), c.on("end", () => {
|
|
1667
1630
|
t.end(n.tail);
|
|
1668
1631
|
}), a.stream.pipe(c);
|
|
@@ -1687,23 +1650,42 @@ import {
|
|
|
1687
1650
|
return;
|
|
1688
1651
|
}
|
|
1689
1652
|
c();
|
|
1690
|
-
},
|
|
1653
|
+
}, Ur = (e) => Array.isArray(e.preload) && e.preload.length > 0, Wr = (e, t) => typeof e == "string" ? {
|
|
1654
|
+
tag: e,
|
|
1655
|
+
input: {}
|
|
1656
|
+
} : {
|
|
1657
|
+
tag: e.tag,
|
|
1658
|
+
input: e.input?.(t) ?? {}
|
|
1659
|
+
}, Gr = async (e) => {
|
|
1660
|
+
let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
|
|
1661
|
+
if (Ur(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
|
|
1662
|
+
let { tag: t, input: s } = Wr(e, n);
|
|
1663
|
+
try {
|
|
1664
|
+
a(i, t, s, await r(t, s));
|
|
1665
|
+
} catch (e) {
|
|
1666
|
+
o?.({
|
|
1667
|
+
tag: t,
|
|
1668
|
+
apiName: i
|
|
1669
|
+
}, e);
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
}, Z = S({ scope: "voltro:dev:web" }), Kr = S({ scope: "vite" }), qr = await (async () => {
|
|
1691
1673
|
try {
|
|
1692
|
-
let e =
|
|
1674
|
+
let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
|
|
1693
1675
|
return JSON.parse(t).version ?? "0.0.0";
|
|
1694
1676
|
} catch {
|
|
1695
1677
|
return "0.0.0";
|
|
1696
1678
|
}
|
|
1697
|
-
})(),
|
|
1679
|
+
})(), Jr = async () => {
|
|
1698
1680
|
try {
|
|
1699
|
-
let e =
|
|
1700
|
-
if (
|
|
1701
|
-
let n =
|
|
1702
|
-
return
|
|
1681
|
+
let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
|
|
1682
|
+
if (T(p(t, "package.json"))) return t;
|
|
1683
|
+
let n = h(e, "..", "..", "..", "devtools");
|
|
1684
|
+
return T(p(n, "package.json")) ? n : null;
|
|
1703
1685
|
} catch {
|
|
1704
1686
|
return null;
|
|
1705
1687
|
}
|
|
1706
|
-
},
|
|
1688
|
+
}, Yr = (e, t) => e.disableDevtools || !t ? [] : [
|
|
1707
1689
|
"",
|
|
1708
1690
|
"// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
|
|
1709
1691
|
"// compile-time constant, so prod builds strip this whole `if` block — the",
|
|
@@ -1713,46 +1695,46 @@ import {
|
|
|
1713
1695
|
" await import('@voltro/devtools/styles.css')",
|
|
1714
1696
|
" Devtools = (await import('@voltro/devtools')).VoltroDevtools",
|
|
1715
1697
|
"}"
|
|
1716
|
-
],
|
|
1698
|
+
], Xr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Zr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Qr = (e) => e.sentry ? [
|
|
1717
1699
|
"",
|
|
1718
1700
|
"// Browser-side Sentry (frontend half of the deep integration). Errors +",
|
|
1719
1701
|
"// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
|
|
1720
1702
|
`await initSentryBrowser(${JSON.stringify(e.sentry)})`
|
|
1721
|
-
] : [],
|
|
1722
|
-
let t = [], n =
|
|
1703
|
+
] : [], $r = (e) => e.env ? ["import './env.public'"] : [], ei = (e) => {
|
|
1704
|
+
let t = [], n = h(e);
|
|
1723
1705
|
for (;;) {
|
|
1724
|
-
|
|
1725
|
-
let e =
|
|
1706
|
+
T(p(n, "pnpm-workspace.yaml")) && t.push(n);
|
|
1707
|
+
let e = d(n);
|
|
1726
1708
|
if (e === n) break;
|
|
1727
1709
|
n = e;
|
|
1728
1710
|
}
|
|
1729
1711
|
return t;
|
|
1730
|
-
},
|
|
1712
|
+
}, ti = On, ni = (e) => {
|
|
1731
1713
|
if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
|
|
1732
1714
|
let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
|
|
1733
1715
|
if (t) return `island-${t[1]}`;
|
|
1734
|
-
},
|
|
1735
|
-
let
|
|
1736
|
-
return
|
|
1737
|
-
},
|
|
1738
|
-
let
|
|
1716
|
+
}, ri = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, ii = (e) => e.startsWith("(") && e.endsWith(")"), ai = (e) => e.filter((e) => !ii(e)), oi = (e) => {
|
|
1717
|
+
let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !ii(e));
|
|
1718
|
+
return t.length === 0 ? "/" : "/" + t.join("/");
|
|
1719
|
+
}, si = (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) => {
|
|
1720
|
+
let t = [], i = [], a = async (e, o) => {
|
|
1739
1721
|
let s = [];
|
|
1740
1722
|
try {
|
|
1741
|
-
s = await
|
|
1723
|
+
s = await O.readdir(e, { withFileTypes: !0 });
|
|
1742
1724
|
} catch {
|
|
1743
1725
|
return;
|
|
1744
1726
|
}
|
|
1745
|
-
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !
|
|
1727
|
+
let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !ti(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
|
|
1746
1728
|
if (l.some((e) => n.has(e))) {
|
|
1747
1729
|
let t = u.has("layout.tsx"), r = !1;
|
|
1748
1730
|
if (t) try {
|
|
1749
|
-
let t = await
|
|
1750
|
-
r =
|
|
1731
|
+
let t = await O.readFile(p(e, "layout.tsx"), "utf8");
|
|
1732
|
+
r = ri.test(t);
|
|
1751
1733
|
} catch {}
|
|
1752
1734
|
i.push({
|
|
1753
1735
|
dir: d,
|
|
1754
1736
|
chain: o,
|
|
1755
|
-
contributesToUrl: o.length === 0 || !
|
|
1737
|
+
contributesToUrl: o.length === 0 || !ii(o[o.length - 1]),
|
|
1756
1738
|
hasLayout: t,
|
|
1757
1739
|
hasLayoutLoader: r,
|
|
1758
1740
|
hasError: u.has("error.tsx"),
|
|
@@ -1762,38 +1744,38 @@ import {
|
|
|
1762
1744
|
});
|
|
1763
1745
|
}
|
|
1764
1746
|
for (let e of l) {
|
|
1765
|
-
if (!
|
|
1747
|
+
if (!r.test(e)) continue;
|
|
1766
1748
|
let n = d ? `${d}/${e}` : e;
|
|
1767
|
-
|
|
1749
|
+
t.push({
|
|
1768
1750
|
file: n,
|
|
1769
|
-
pattern:
|
|
1770
|
-
ident:
|
|
1751
|
+
pattern: oi(n),
|
|
1752
|
+
ident: si(n),
|
|
1771
1753
|
dirChain: o
|
|
1772
1754
|
});
|
|
1773
1755
|
}
|
|
1774
|
-
for (let t of c) await a(
|
|
1756
|
+
for (let t of c) await a(p(e, t), [...o, t]);
|
|
1775
1757
|
};
|
|
1776
|
-
await a(e, []),
|
|
1758
|
+
await a(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
|
|
1777
1759
|
let o = /* @__PURE__ */ new Set();
|
|
1778
|
-
for (let e of
|
|
1760
|
+
for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
|
|
1779
1761
|
let s = [], c = [];
|
|
1780
1762
|
for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
|
|
1781
1763
|
dir: t.dir,
|
|
1782
1764
|
files: e
|
|
1783
1765
|
});
|
|
1784
1766
|
return {
|
|
1785
|
-
pages:
|
|
1767
|
+
pages: t,
|
|
1786
1768
|
dirs: s,
|
|
1787
1769
|
orphanedSpecials: c
|
|
1788
1770
|
};
|
|
1789
|
-
},
|
|
1771
|
+
}, ci = (e, t) => {
|
|
1790
1772
|
let n = [];
|
|
1791
1773
|
for (let r = 0; r <= t.length; r++) {
|
|
1792
1774
|
let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
|
|
1793
1775
|
a && n.push(a);
|
|
1794
1776
|
}
|
|
1795
1777
|
return n;
|
|
1796
|
-
},
|
|
1778
|
+
}, li = async (e) => {
|
|
1797
1779
|
let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
|
|
1798
1780
|
return {
|
|
1799
1781
|
chain: await Promise.all(t.map(async (e, t) => {
|
|
@@ -1816,10 +1798,10 @@ import {
|
|
|
1816
1798
|
})),
|
|
1817
1799
|
segmentLoaderData: o
|
|
1818
1800
|
};
|
|
1819
|
-
},
|
|
1820
|
-
let t =
|
|
1801
|
+
}, ui = (e) => {
|
|
1802
|
+
let t = ai(e);
|
|
1821
1803
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
1822
|
-
},
|
|
1804
|
+
}, di = [
|
|
1823
1805
|
"// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
|
|
1824
1806
|
"// in sync with Vite's CSS HMR. Without this, edits to .css files",
|
|
1825
1807
|
"// only update the JS-injected <style> overlay; the underlying <link>",
|
|
@@ -1912,7 +1894,7 @@ import {
|
|
|
1912
1894
|
" _vdtErrorStart('Build error')",
|
|
1913
1895
|
" })",
|
|
1914
1896
|
"}"
|
|
1915
|
-
].join("\n"),
|
|
1897
|
+
].join("\n"), fi = (e) => {
|
|
1916
1898
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
1917
1899
|
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
1900
|
let a = i.join("/");
|
|
@@ -1921,8 +1903,8 @@ import {
|
|
|
1921
1903
|
paramNames: t,
|
|
1922
1904
|
priority: n
|
|
1923
1905
|
};
|
|
1924
|
-
},
|
|
1925
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
1906
|
+
}, pi = (e) => e.map((e) => {
|
|
1907
|
+
let { regex: t, paramNames: n, priority: r } = fi(e.pattern);
|
|
1926
1908
|
return {
|
|
1927
1909
|
pattern: e.pattern,
|
|
1928
1910
|
file: e.file,
|
|
@@ -1931,7 +1913,7 @@ import {
|
|
|
1931
1913
|
paramNames: n,
|
|
1932
1914
|
priority: r
|
|
1933
1915
|
};
|
|
1934
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
1916
|
+
}).slice().sort((e, t) => e.priority - t.priority), mi = (e, t) => {
|
|
1935
1917
|
for (let n of t) {
|
|
1936
1918
|
let t = n.regex.exec(e);
|
|
1937
1919
|
if (!t) continue;
|
|
@@ -1943,30 +1925,30 @@ import {
|
|
|
1943
1925
|
};
|
|
1944
1926
|
}
|
|
1945
1927
|
return null;
|
|
1946
|
-
},
|
|
1928
|
+
}, hi = async (e, t) => {
|
|
1947
1929
|
let n = e;
|
|
1948
1930
|
for (;;) {
|
|
1949
|
-
let e =
|
|
1931
|
+
let e = p(n, "node_modules", t);
|
|
1950
1932
|
try {
|
|
1951
|
-
if ((await
|
|
1952
|
-
let t = await
|
|
1933
|
+
if ((await O.stat(e)).isDirectory()) {
|
|
1934
|
+
let t = await O.realpath(e);
|
|
1953
1935
|
return t.includes("/node_modules/") ? null : t;
|
|
1954
1936
|
}
|
|
1955
1937
|
} catch {}
|
|
1956
|
-
let r =
|
|
1938
|
+
let r = d(n);
|
|
1957
1939
|
if (r === n) return null;
|
|
1958
1940
|
n = r;
|
|
1959
1941
|
}
|
|
1960
|
-
},
|
|
1942
|
+
}, gi = async (e) => {
|
|
1961
1943
|
try {
|
|
1962
|
-
let t = await import(
|
|
1944
|
+
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
1945
|
return a ? {
|
|
1964
1946
|
port: r,
|
|
1965
1947
|
wsPath: a
|
|
1966
1948
|
} : { port: r };
|
|
1967
1949
|
} catch {}
|
|
1968
1950
|
return { port: 4e3 };
|
|
1969
|
-
},
|
|
1951
|
+
}, _i = (e, t) => ({
|
|
1970
1952
|
name: e,
|
|
1971
1953
|
pkg: t.package,
|
|
1972
1954
|
browserWsUrl: t.url,
|
|
@@ -1974,7 +1956,7 @@ import {
|
|
|
1974
1956
|
...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
|
|
1975
1957
|
...t.headers ? { headers: t.headers } : {},
|
|
1976
1958
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
1977
|
-
}),
|
|
1959
|
+
}), vi = (e, t, n) => {
|
|
1978
1960
|
let r = t.transport?.wsPath ?? n.wsPath;
|
|
1979
1961
|
return {
|
|
1980
1962
|
name: e,
|
|
@@ -1986,7 +1968,7 @@ import {
|
|
|
1986
1968
|
...t.headers ? { headers: t.headers } : {},
|
|
1987
1969
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
1988
1970
|
};
|
|
1989
|
-
},
|
|
1971
|
+
}, yi = (e) => {
|
|
1990
1972
|
let t = /* @__PURE__ */ new Map();
|
|
1991
1973
|
for (let n of e) {
|
|
1992
1974
|
if (n.proxyTarget === void 0) continue;
|
|
@@ -1994,43 +1976,43 @@ import {
|
|
|
1994
1976
|
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
1977
|
t.set(n.browserWsUrl, n.name);
|
|
1996
1978
|
}
|
|
1997
|
-
},
|
|
1979
|
+
}, bi = async (e, t) => {
|
|
1998
1980
|
let n = Object.entries(t.apis ?? {}), r = [];
|
|
1999
1981
|
for (let [t, i] of n) {
|
|
2000
1982
|
if (i.url) {
|
|
2001
|
-
r.push(
|
|
1983
|
+
r.push(_i(t, i));
|
|
2002
1984
|
continue;
|
|
2003
1985
|
}
|
|
2004
|
-
let n = await
|
|
1986
|
+
let n = await hi(e, i.package);
|
|
2005
1987
|
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(
|
|
1988
|
+
r.push(vi(t, i, await gi(n)));
|
|
2007
1989
|
}
|
|
2008
|
-
return
|
|
2009
|
-
},
|
|
1990
|
+
return yi(r), r;
|
|
1991
|
+
}, xi = (e) => {
|
|
2010
1992
|
if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
|
|
2011
1993
|
let t = new URL(e);
|
|
2012
1994
|
return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
|
|
2013
1995
|
} catch {
|
|
2014
1996
|
return;
|
|
2015
1997
|
}
|
|
2016
|
-
},
|
|
1998
|
+
}, Si = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Ci = (e) => process.env[Si(e)] ?? process.env.VOLTRO_API_ORIGIN, wi = (e, t) => {
|
|
2017
1999
|
if (!e) return;
|
|
2018
|
-
let n =
|
|
2000
|
+
let n = Ci(e.name) ?? e.serverOrigin;
|
|
2019
2001
|
if (n) {
|
|
2020
|
-
let e =
|
|
2002
|
+
let e = xi(n);
|
|
2021
2003
|
if (e) return e;
|
|
2022
2004
|
}
|
|
2023
2005
|
if (t?.allowDevProxy && e.proxyTarget) {
|
|
2024
|
-
let t =
|
|
2006
|
+
let t = xi(e.proxyTarget);
|
|
2025
2007
|
if (t) return t;
|
|
2026
2008
|
}
|
|
2027
|
-
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return
|
|
2028
|
-
},
|
|
2009
|
+
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return xi(e.browserWsUrl);
|
|
2010
|
+
}, Ti = (e, t, n) => {
|
|
2029
2011
|
if (!e) {
|
|
2030
2012
|
if (n?.apiName === void 0) return;
|
|
2031
2013
|
let e = n.apiName;
|
|
2032
2014
|
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 ${
|
|
2015
|
+
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 ${Si(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
2016
|
};
|
|
2035
2017
|
}
|
|
2036
2018
|
return async (r, i) => {
|
|
@@ -2052,7 +2034,7 @@ import {
|
|
|
2052
2034
|
});
|
|
2053
2035
|
} catch (t) {
|
|
2054
2036
|
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 ${
|
|
2037
|
+
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Si(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
2038
|
}
|
|
2057
2039
|
if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
|
|
2058
2040
|
let s = await o.json();
|
|
@@ -2070,8 +2052,8 @@ import {
|
|
|
2070
2052
|
}
|
|
2071
2053
|
if (u) return l;
|
|
2072
2054
|
};
|
|
2073
|
-
},
|
|
2074
|
-
let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o =
|
|
2055
|
+
}, Ei = async (e, t, n, r = {}) => {
|
|
2056
|
+
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 Jr() !== null, s = t.theme === "system" ? [
|
|
2075
2057
|
" <script>",
|
|
2076
2058
|
" (function () {",
|
|
2077
2059
|
" var root = document.documentElement",
|
|
@@ -2109,9 +2091,9 @@ import {
|
|
|
2109
2091
|
" </body>",
|
|
2110
2092
|
"</html>",
|
|
2111
2093
|
""
|
|
2112
|
-
].join("\n"), l =
|
|
2113
|
-
await
|
|
2114
|
-
for (let e of
|
|
2094
|
+
].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await $(l);
|
|
2095
|
+
await Qn(l, u);
|
|
2096
|
+
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
2097
|
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
2098
|
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
2099
|
let _ = n.map((e) => {
|
|
@@ -2122,16 +2104,16 @@ import {
|
|
|
2122
2104
|
let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
|
|
2123
2105
|
for (let e of d) {
|
|
2124
2106
|
let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
|
|
2125
|
-
e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${
|
|
2107
|
+
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
2108
|
}
|
|
2127
2109
|
let r = u.map((e) => {
|
|
2128
|
-
let t =
|
|
2110
|
+
let t = ci(d, e.dirChain).map((e) => {
|
|
2129
2111
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2130
2112
|
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
2113
|
}).join(",\n");
|
|
2132
2114
|
return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
|
|
2133
2115
|
}), i = d.filter((e) => e.hasNotFound).map((e) => {
|
|
2134
|
-
let t =
|
|
2116
|
+
let t = ui(e.chain), n = ci(d, e.chain).map((e) => {
|
|
2135
2117
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2136
2118
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
|
|
2137
2119
|
}).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
|
|
@@ -2139,23 +2121,23 @@ import {
|
|
|
2139
2121
|
}), a = [], s = [], c = [], l = [], f = [], p = [];
|
|
2140
2122
|
for (let e of d) {
|
|
2141
2123
|
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}: ${
|
|
2124
|
+
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
2125
|
relPath: t,
|
|
2144
2126
|
kind: "layout",
|
|
2145
2127
|
slotKey: e.dir
|
|
2146
|
-
})) : e.hasLayout && (s.push(` ${o}: ${
|
|
2128
|
+
})) : e.hasLayout && (s.push(` ${o}: ${Q(e.dir, "Layout")},`), a.push({
|
|
2147
2129
|
relPath: t,
|
|
2148
2130
|
kind: "layout",
|
|
2149
2131
|
slotKey: e.dir
|
|
2150
|
-
})), e.hasError && (l.push(` ${o}: ${
|
|
2132
|
+
})), e.hasError && (l.push(` ${o}: ${Q(e.dir, "Error")},`), a.push({
|
|
2151
2133
|
relPath: n,
|
|
2152
2134
|
kind: "error",
|
|
2153
2135
|
slotKey: e.dir
|
|
2154
|
-
})), e.hasPending && (f.push(` ${o}: ${
|
|
2136
|
+
})), e.hasPending && (f.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
|
|
2155
2137
|
relPath: r,
|
|
2156
2138
|
kind: "pending",
|
|
2157
2139
|
slotKey: e.dir
|
|
2158
|
-
})), e.hasNotFound && (p.push(` ${o}: ${
|
|
2140
|
+
})), e.hasNotFound && (p.push(` ${o}: ${Q(e.dir, "NotFound")},`), a.push({
|
|
2159
2141
|
relPath: i,
|
|
2160
2142
|
kind: "notFound",
|
|
2161
2143
|
slotKey: e.dir
|
|
@@ -2329,11 +2311,28 @@ import {
|
|
|
2329
2311
|
" defaultLocale: I18N_DEFAULT,",
|
|
2330
2312
|
" })",
|
|
2331
2313
|
" }",
|
|
2332
|
-
" // Client-side:
|
|
2333
|
-
" //
|
|
2334
|
-
" //
|
|
2335
|
-
" //
|
|
2314
|
+
" // Client-side: ADOPT what the server resolved, from <html lang>.",
|
|
2315
|
+
" //",
|
|
2316
|
+
" // Dropping the Accept-Language signal here is not the same as",
|
|
2317
|
+
" // agreeing with the server about it, and the difference is every",
|
|
2318
|
+
" // FIRST visit: with no cookie yet, the server negotiated",
|
|
2319
|
+
" // Accept-Language while the client fell through to the default, so",
|
|
2320
|
+
" // an English browser on a German-default app hydrated 'de' over an",
|
|
2321
|
+
" // 'en' tree and React discarded the whole server render — exactly",
|
|
2322
|
+
" // what SSR was turned on to avoid. It stops the moment anything",
|
|
2323
|
+
" // writes the cookie, which is why it is invisible after one",
|
|
2324
|
+
" // language switch and reproduces on every new visitor.",
|
|
2325
|
+
" //",
|
|
2326
|
+
" // navigator.languages is still NOT read: it can diverge from what",
|
|
2327
|
+
" // the server saw. The server publishes its answer instead, and the",
|
|
2328
|
+
" // <html lang> attribute is that answer — set from the SAME resolver",
|
|
2329
|
+
" // that built the provider, on the same request.",
|
|
2336
2330
|
" if (typeof document === 'undefined') return I18N_DEFAULT",
|
|
2331
|
+
" const published = document.documentElement.lang",
|
|
2332
|
+
" if (published && I18N_SUPPORTED.includes(published)) return published",
|
|
2333
|
+
" // No published locale (a page served by something else, or an",
|
|
2334
|
+
" // attribute a consumer overwrote): fall back to the cookie, which",
|
|
2335
|
+
" // both halves can read, and never to a client-only signal.",
|
|
2337
2336
|
" return resolveLocale({",
|
|
2338
2337
|
" cookieHeader: document.cookie,",
|
|
2339
2338
|
" acceptLanguageHeader: null,",
|
|
@@ -2370,14 +2369,14 @@ import {
|
|
|
2370
2369
|
"// resolved apis map. Side-effect only — no local component definitions —",
|
|
2371
2370
|
"// so downstream invalidations (user page edits) terminate at app.tsx.",
|
|
2372
2371
|
"",
|
|
2373
|
-
|
|
2372
|
+
...$r(t),
|
|
2374
2373
|
"import { mount } from '@voltro/web'",
|
|
2375
2374
|
...g,
|
|
2376
2375
|
"import { App } from './app'",
|
|
2377
2376
|
"import { preloadCurrentRoute } from './routeTable'",
|
|
2378
|
-
...
|
|
2379
|
-
...
|
|
2380
|
-
...
|
|
2377
|
+
...Zr(t),
|
|
2378
|
+
...Yr(t, o),
|
|
2379
|
+
...Qr(t),
|
|
2381
2380
|
"",
|
|
2382
2381
|
"// Preload the current route's page chunk BEFORE hydration so the first",
|
|
2383
2382
|
"// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
|
|
@@ -2394,10 +2393,10 @@ import {
|
|
|
2394
2393
|
" apis: {",
|
|
2395
2394
|
..._,
|
|
2396
2395
|
" },",
|
|
2397
|
-
...
|
|
2396
|
+
...Xr(t, o),
|
|
2398
2397
|
"})",
|
|
2399
2398
|
"",
|
|
2400
|
-
|
|
2399
|
+
di
|
|
2401
2400
|
].join("\n");
|
|
2402
2401
|
} else v = "", y = "", b = [
|
|
2403
2402
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
@@ -2405,94 +2404,94 @@ import {
|
|
|
2405
2404
|
"// and calls mount(). Side-effect only, no component definitions, so the",
|
|
2406
2405
|
"// user's component file remains the Fast Refresh boundary.",
|
|
2407
2406
|
"",
|
|
2408
|
-
|
|
2407
|
+
...$r(t),
|
|
2409
2408
|
"import { mount } from '@voltro/web'",
|
|
2410
2409
|
...g,
|
|
2411
2410
|
"import App from '../src/App'",
|
|
2412
|
-
...
|
|
2413
|
-
...
|
|
2414
|
-
...
|
|
2411
|
+
...Zr(t),
|
|
2412
|
+
...Yr(t, o),
|
|
2413
|
+
...Qr(t),
|
|
2415
2414
|
"",
|
|
2416
2415
|
"mount(App, {",
|
|
2417
2416
|
" apis: {",
|
|
2418
2417
|
..._,
|
|
2419
2418
|
" },",
|
|
2420
|
-
...
|
|
2419
|
+
...Xr(t, o),
|
|
2421
2420
|
"})",
|
|
2422
2421
|
"",
|
|
2423
|
-
|
|
2422
|
+
di
|
|
2424
2423
|
].join("\n");
|
|
2425
|
-
let x =
|
|
2426
|
-
await
|
|
2427
|
-
let S =
|
|
2424
|
+
let x = p(e, ".framework");
|
|
2425
|
+
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 }));
|
|
2426
|
+
let S = p(e, ".gitignore"), C = "";
|
|
2428
2427
|
try {
|
|
2429
|
-
C = await
|
|
2428
|
+
C = await O.readFile(S, "utf8");
|
|
2430
2429
|
} catch {}
|
|
2431
|
-
let w = ["/.framework/"],
|
|
2432
|
-
if (
|
|
2430
|
+
let w = ["/.framework/"], E = new Set(C.split("\n").map((e) => e.trim())), D = w.filter((e) => !E.has(e));
|
|
2431
|
+
if (D.length > 0) {
|
|
2433
2432
|
let e = C === "" || C.endsWith("\n") ? "" : "\n";
|
|
2434
2433
|
try {
|
|
2435
|
-
await
|
|
2434
|
+
await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
|
|
2436
2435
|
} catch (e) {
|
|
2437
|
-
|
|
2436
|
+
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
2437
|
}
|
|
2439
2438
|
}
|
|
2440
|
-
},
|
|
2439
|
+
}, Di = async (e, t) => {
|
|
2441
2440
|
try {
|
|
2442
|
-
let n =
|
|
2443
|
-
if (!
|
|
2444
|
-
let r = await
|
|
2441
|
+
let n = p(d(e), "project.json");
|
|
2442
|
+
if (!T(n)) return;
|
|
2443
|
+
let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
|
|
2445
2444
|
for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
|
|
2446
2445
|
if (o.length === 0) return;
|
|
2447
|
-
|
|
2446
|
+
Z.warn("sibling app(s) claim the same port — only one boots", {
|
|
2448
2447
|
port: t,
|
|
2449
2448
|
conflicts: o,
|
|
2450
2449
|
projectJson: n
|
|
2451
2450
|
});
|
|
2452
2451
|
} catch {}
|
|
2453
|
-
},
|
|
2454
|
-
let t =
|
|
2452
|
+
}, Oi = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), ki = async (e) => {
|
|
2453
|
+
let t = Oi(e), n = T(t) ? t : p(e, "app.config.ts");
|
|
2455
2454
|
try {
|
|
2456
|
-
let e = (await import(
|
|
2455
|
+
let e = (await import(_(n).href)).default;
|
|
2457
2456
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
|
|
2458
2457
|
} catch {
|
|
2459
2458
|
return null;
|
|
2460
2459
|
}
|
|
2461
|
-
},
|
|
2462
|
-
let t = await
|
|
2460
|
+
}, Ai = async (e) => {
|
|
2461
|
+
let t = await ki(e);
|
|
2463
2462
|
if (!t) return {
|
|
2464
2463
|
ran: !1,
|
|
2465
2464
|
exitCode: 0
|
|
2466
2465
|
};
|
|
2467
|
-
|
|
2468
|
-
let n =
|
|
2469
|
-
|
|
2470
|
-
let
|
|
2471
|
-
for (let e of
|
|
2466
|
+
Tn();
|
|
2467
|
+
let n = qt();
|
|
2468
|
+
rn(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
|
|
2469
|
+
let r = await bi(e, t);
|
|
2470
|
+
for (let e of r) Z.info("api wired", {
|
|
2472
2471
|
name: e.name,
|
|
2473
2472
|
pkg: e.pkg,
|
|
2474
2473
|
...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
|
|
2475
2474
|
});
|
|
2476
|
-
|
|
2475
|
+
Me(e).then((e) => {
|
|
2477
2476
|
for (let t of e.files) if (t.action === "created") {
|
|
2478
2477
|
let e = t.path.split("/").pop() ?? t.path;
|
|
2479
|
-
|
|
2478
|
+
Z.info(`${e} seeded`, { path: t.path });
|
|
2480
2479
|
}
|
|
2481
2480
|
}).catch(() => {});
|
|
2482
|
-
let { resolved: d } = await
|
|
2481
|
+
let { resolved: d } = await rt({
|
|
2483
2482
|
rawEnv: t.env,
|
|
2484
2483
|
appType: "web",
|
|
2485
2484
|
root: e,
|
|
2486
|
-
log:
|
|
2485
|
+
log: Z,
|
|
2487
2486
|
generateTypes: !0
|
|
2488
|
-
}),
|
|
2489
|
-
await
|
|
2487
|
+
}), f = d.publicValues;
|
|
2488
|
+
await Ei(e, t, r, f), Z.debug("generated framework entry files", { files: [
|
|
2490
2489
|
"index.html",
|
|
2491
2490
|
".framework/main.tsx",
|
|
2492
2491
|
...t.env ? [".framework/env.public.ts"] : []
|
|
2493
2492
|
] });
|
|
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
|
|
2493
|
+
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 = ar(_);
|
|
2494
|
+
await We({
|
|
2496
2495
|
id: v,
|
|
2497
2496
|
name: _,
|
|
2498
2497
|
kind: "web",
|
|
@@ -2500,22 +2499,22 @@ import {
|
|
|
2500
2499
|
pid: process.pid,
|
|
2501
2500
|
status: "booting",
|
|
2502
2501
|
logFile: y.path
|
|
2503
|
-
}).catch(() => {}), await
|
|
2504
|
-
let { pages: b, dirs: x } = await
|
|
2502
|
+
}).catch(() => {}), await Di(e, g);
|
|
2503
|
+
let { pages: b, dirs: x } = await $(p(e, "src", "pages")), S = {
|
|
2505
2504
|
dirs: x,
|
|
2506
|
-
ssrRoutes:
|
|
2507
|
-
},
|
|
2505
|
+
ssrRoutes: pi(b)
|
|
2506
|
+
}, w = x.map((e) => ({
|
|
2508
2507
|
dir: e.dir,
|
|
2509
2508
|
hasLayout: e.hasLayout,
|
|
2510
2509
|
hasError: e.hasError,
|
|
2511
2510
|
hasPending: e.hasPending,
|
|
2512
2511
|
hasNotFound: e.hasNotFound
|
|
2513
|
-
})),
|
|
2512
|
+
})), E = await zt({
|
|
2514
2513
|
appRoot: e,
|
|
2515
2514
|
pages: b
|
|
2516
2515
|
});
|
|
2517
|
-
|
|
2518
|
-
let
|
|
2516
|
+
E.wrote && Z.debug("routes codegen wrote", { path: m(e, E.path) });
|
|
2517
|
+
let D = await Xe("vite", () => import("vite")), ee = (await import("@vitejs/plugin-react")).default, k = (await import("@tailwindcss/vite")).default, A = p(e, ".framework"), j = p(e, "src"), M = /* @__PURE__ */ new Set([
|
|
2519
2518
|
".framework",
|
|
2520
2519
|
"node_modules",
|
|
2521
2520
|
"dist",
|
|
@@ -2527,84 +2526,84 @@ import {
|
|
|
2527
2526
|
name: "framework:watch-app-sources",
|
|
2528
2527
|
async configureServer(t) {
|
|
2529
2528
|
try {
|
|
2530
|
-
let n = (await
|
|
2531
|
-
for (let r of n) t.watcher.add(
|
|
2529
|
+
let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
|
|
2530
|
+
for (let r of n) t.watcher.add(p(e, r.name));
|
|
2532
2531
|
n.length === 0 && t.watcher.add(j);
|
|
2533
2532
|
} catch {
|
|
2534
2533
|
t.watcher.add(j);
|
|
2535
2534
|
}
|
|
2536
2535
|
try {
|
|
2537
|
-
let n = await
|
|
2536
|
+
let n = await O.readFile(p(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
|
|
2538
2537
|
...r.dependencies,
|
|
2539
2538
|
...r.devDependencies
|
|
2540
2539
|
});
|
|
2541
2540
|
await Promise.all(i.map(async (n) => {
|
|
2542
|
-
let r = await
|
|
2541
|
+
let r = await hi(e, n);
|
|
2543
2542
|
if (!r) return;
|
|
2544
|
-
let i =
|
|
2543
|
+
let i = p(r, "src");
|
|
2545
2544
|
try {
|
|
2546
|
-
(await
|
|
2545
|
+
(await O.stat(i)).isDirectory() && t.watcher.add(i);
|
|
2547
2546
|
} catch {}
|
|
2548
2547
|
}));
|
|
2549
2548
|
} catch {}
|
|
2550
2549
|
}
|
|
2551
|
-
}, P =
|
|
2550
|
+
}, P = p(e, "src", "pages"), F = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), I = (e) => e === P || e.startsWith(P + "/"), L = async (n) => {
|
|
2552
2551
|
try {
|
|
2553
|
-
let
|
|
2554
|
-
await
|
|
2555
|
-
let { pages:
|
|
2556
|
-
await
|
|
2552
|
+
let i = Date.now();
|
|
2553
|
+
await Ei(e, t, r, f);
|
|
2554
|
+
let { pages: a, dirs: o } = await $(P);
|
|
2555
|
+
await zt({
|
|
2557
2556
|
appRoot: e,
|
|
2558
|
-
pages:
|
|
2559
|
-
}), S.dirs =
|
|
2557
|
+
pages: a
|
|
2558
|
+
}), S.dirs = o, S.ssrRoutes = pi(a), Z.info("page tree regenerated", {
|
|
2560
2559
|
reason: n,
|
|
2561
|
-
ms: Date.now() -
|
|
2560
|
+
ms: Date.now() - i,
|
|
2562
2561
|
routes: S.ssrRoutes.length
|
|
2563
2562
|
});
|
|
2564
2563
|
} catch (e) {
|
|
2565
|
-
|
|
2564
|
+
Z.error("page tree regen failed", { reason: n }, e);
|
|
2566
2565
|
}
|
|
2567
|
-
},
|
|
2566
|
+
}, R = {
|
|
2568
2567
|
name: "framework:regenerate-on-page-tree-change",
|
|
2569
2568
|
configureServer(t) {
|
|
2570
2569
|
let n = null, r = [], i = (e) => {
|
|
2571
2570
|
r.push(e), n && clearTimeout(n), n = setTimeout(() => {
|
|
2572
2571
|
n = null;
|
|
2573
2572
|
let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
|
|
2574
|
-
r.length = 0,
|
|
2573
|
+
r.length = 0, L(e);
|
|
2575
2574
|
}, 50);
|
|
2576
2575
|
};
|
|
2577
2576
|
t.watcher.on("add", (t) => {
|
|
2578
|
-
|
|
2577
|
+
F(t) && i(`add ${m(e, t)}`);
|
|
2579
2578
|
}), t.watcher.on("unlink", (t) => {
|
|
2580
|
-
|
|
2579
|
+
F(t) && i(`unlink ${m(e, t)}`);
|
|
2581
2580
|
}), t.watcher.on("addDir", (t) => {
|
|
2582
|
-
|
|
2581
|
+
I(t) && i(`addDir ${m(e, t)}`);
|
|
2583
2582
|
}), t.watcher.on("unlinkDir", (t) => {
|
|
2584
|
-
|
|
2583
|
+
I(t) && i(`unlinkDir ${m(e, t)}`);
|
|
2585
2584
|
});
|
|
2586
2585
|
}
|
|
2587
|
-
},
|
|
2588
|
-
if (!
|
|
2586
|
+
}, z = p(e, "app.config.ts"), B = (e) => {
|
|
2587
|
+
if (!re(e.env)) return "";
|
|
2589
2588
|
let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
|
|
2590
2589
|
return `${String(e.env.publicPrefix)}|${t.join(",")}`;
|
|
2591
|
-
},
|
|
2590
|
+
}, te = (e, t) => {
|
|
2592
2591
|
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
|
-
},
|
|
2592
|
+
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"), B(e) !== B(t) && n.push("env"), n;
|
|
2593
|
+
}, V = t, ne = h(z), H = {
|
|
2595
2594
|
name: "framework:watch-app-config",
|
|
2596
2595
|
async configureServer(t) {
|
|
2597
|
-
t.watcher.add(
|
|
2596
|
+
t.watcher.add(z), Z.info("watching app.config.ts for changes", { path: m(e, z) });
|
|
2598
2597
|
let n = async () => {
|
|
2599
2598
|
try {
|
|
2600
2599
|
try {
|
|
2601
|
-
let e = t.moduleGraph.getModuleById(
|
|
2600
|
+
let e = t.moduleGraph.getModuleById(z);
|
|
2602
2601
|
e && t.moduleGraph.invalidateModule(e);
|
|
2603
2602
|
} catch {}
|
|
2604
|
-
let e = (await t.ssrLoadModule(
|
|
2605
|
-
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (
|
|
2603
|
+
let e = (await t.ssrLoadModule(z, { fixStacktrace: !0 })).default;
|
|
2604
|
+
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
2605
|
} catch (e) {
|
|
2607
|
-
return
|
|
2606
|
+
return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
|
|
2608
2607
|
}
|
|
2609
2608
|
}, r = null, i = () => {
|
|
2610
2609
|
r && clearTimeout(r), r = setTimeout(() => {
|
|
@@ -2613,24 +2612,24 @@ import {
|
|
|
2613
2612
|
}, a = async () => {
|
|
2614
2613
|
let r = await n();
|
|
2615
2614
|
if (!r) {
|
|
2616
|
-
|
|
2615
|
+
Z.info("app.config.ts onConfigChange: load returned null — skipping");
|
|
2617
2616
|
return;
|
|
2618
2617
|
}
|
|
2619
|
-
if (
|
|
2618
|
+
if (Z.info("app.config.ts onConfigChange: loaded", {
|
|
2620
2619
|
theme: r.theme,
|
|
2621
2620
|
port: r.port,
|
|
2622
2621
|
name: r.name
|
|
2623
|
-
}), JSON.stringify(r) === JSON.stringify(
|
|
2624
|
-
|
|
2622
|
+
}), JSON.stringify(r) === JSON.stringify(V)) {
|
|
2623
|
+
Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
|
|
2625
2624
|
return;
|
|
2626
2625
|
}
|
|
2627
|
-
let i =
|
|
2626
|
+
let i = te(V, r);
|
|
2628
2627
|
if (i.length > 0) {
|
|
2629
|
-
|
|
2628
|
+
Z.warn("app.config.ts changed — hard restart required", { fields: i });
|
|
2630
2629
|
try {
|
|
2631
2630
|
await t.close();
|
|
2632
2631
|
} catch {}
|
|
2633
|
-
let e =
|
|
2632
|
+
let e = ue(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
2634
2633
|
stdio: "inherit",
|
|
2635
2634
|
env: process.env,
|
|
2636
2635
|
cwd: process.cwd()
|
|
@@ -2640,57 +2639,57 @@ import {
|
|
|
2640
2639
|
process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
|
|
2641
2640
|
process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
|
|
2642
2641
|
}), e.on("error", (e) => {
|
|
2643
|
-
|
|
2642
|
+
Z.error("restart spawn failed", {}, e), process.exit(1);
|
|
2644
2643
|
});
|
|
2645
2644
|
return;
|
|
2646
2645
|
}
|
|
2647
2646
|
try {
|
|
2648
2647
|
let n = Date.now();
|
|
2649
|
-
await
|
|
2648
|
+
await Ei(e, r, await bi(e, r)), V = r, t.ws && t.ws.send({
|
|
2650
2649
|
type: "full-reload",
|
|
2651
2650
|
path: "*"
|
|
2652
|
-
}),
|
|
2651
|
+
}), Z.info("app.config.ts soft-regen", {
|
|
2653
2652
|
ms: Date.now() - n,
|
|
2654
2653
|
reload: "full"
|
|
2655
2654
|
});
|
|
2656
2655
|
} catch (e) {
|
|
2657
|
-
|
|
2656
|
+
Z.error("app.config.ts soft-regen failed", {}, e);
|
|
2658
2657
|
}
|
|
2659
|
-
}, o = (e) =>
|
|
2658
|
+
}, o = (e) => u(e) === "app.config.ts" ? e === z || h(e) === ne : !1;
|
|
2660
2659
|
t.watcher.on("change", (e) => {
|
|
2661
|
-
o(e) && (
|
|
2660
|
+
o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
|
|
2662
2661
|
}), t.watcher.on("add", (e) => {
|
|
2663
|
-
o(e) && (
|
|
2662
|
+
o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
|
|
2664
2663
|
});
|
|
2665
2664
|
try {
|
|
2666
2665
|
let { watchFile: e } = await import("node:fs");
|
|
2667
|
-
e(
|
|
2668
|
-
e.mtimeMs !== t.mtimeMs && (
|
|
2669
|
-
}),
|
|
2666
|
+
e(z, { interval: 500 }, (e, t) => {
|
|
2667
|
+
e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
|
|
2668
|
+
}), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
|
|
2670
2669
|
} catch (e) {
|
|
2671
|
-
|
|
2670
|
+
Z.warn("app.config.ts polling watcher could not attach", {}, e);
|
|
2672
2671
|
}
|
|
2673
|
-
|
|
2672
|
+
_t(mt, Z, {
|
|
2674
2673
|
root: e,
|
|
2675
2674
|
onBeforeRestart: () => t.close()
|
|
2676
2675
|
});
|
|
2677
2676
|
}
|
|
2678
|
-
},
|
|
2677
|
+
}, ie = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ae = {
|
|
2679
2678
|
name: "framework:suppress-api-hmr",
|
|
2680
2679
|
handleHotUpdate(e) {
|
|
2681
|
-
if (
|
|
2680
|
+
if (ie.test(e.file)) return [];
|
|
2682
2681
|
}
|
|
2683
|
-
},
|
|
2682
|
+
}, oe = {
|
|
2684
2683
|
name: "framework:reoptimize-on-rpcgroup-change",
|
|
2685
2684
|
async configureServer(t) {
|
|
2686
2685
|
let n = /* @__PURE__ */ new Map();
|
|
2687
|
-
for (let
|
|
2688
|
-
if (!
|
|
2689
|
-
let
|
|
2690
|
-
if (!
|
|
2691
|
-
let a =
|
|
2686
|
+
for (let i of r) {
|
|
2687
|
+
if (!i.proxyTarget) continue;
|
|
2688
|
+
let r = await hi(e, i.pkg);
|
|
2689
|
+
if (!r) continue;
|
|
2690
|
+
let a = p(r, "rpcGroup.generated.ts");
|
|
2692
2691
|
try {
|
|
2693
|
-
n.set(a, await
|
|
2692
|
+
n.set(a, await O.readFile(a, "utf8"));
|
|
2694
2693
|
} catch {
|
|
2695
2694
|
n.set(a, "");
|
|
2696
2695
|
}
|
|
@@ -2699,105 +2698,105 @@ import {
|
|
|
2699
2698
|
} catch {}
|
|
2700
2699
|
}
|
|
2701
2700
|
if (n.size === 0) return;
|
|
2702
|
-
let
|
|
2703
|
-
if (
|
|
2701
|
+
let i = null, a = !1, o = async () => {
|
|
2702
|
+
if (a) return;
|
|
2704
2703
|
let r = null;
|
|
2705
2704
|
for (let [e, t] of n) {
|
|
2706
2705
|
let i;
|
|
2707
2706
|
try {
|
|
2708
|
-
i = await
|
|
2707
|
+
i = await O.readFile(e, "utf8");
|
|
2709
2708
|
} catch {
|
|
2710
2709
|
continue;
|
|
2711
2710
|
}
|
|
2712
2711
|
i !== t && (n.set(e, i), r = e);
|
|
2713
2712
|
}
|
|
2714
2713
|
if (r !== null) {
|
|
2715
|
-
|
|
2714
|
+
a = !0, Z.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
|
|
2716
2715
|
try {
|
|
2717
|
-
await
|
|
2716
|
+
await O.rm(p(A, ".vite", "deps"), {
|
|
2718
2717
|
recursive: !0,
|
|
2719
2718
|
force: !0
|
|
2720
2719
|
}), await t.restart(!0);
|
|
2721
2720
|
} catch (e) {
|
|
2722
|
-
|
|
2721
|
+
a = !1, Z.error("rpcGroup re-optimize failed", {}, e);
|
|
2723
2722
|
}
|
|
2724
2723
|
}
|
|
2725
|
-
},
|
|
2726
|
-
n.has(
|
|
2727
|
-
|
|
2724
|
+
}, s = (e) => {
|
|
2725
|
+
n.has(h(e)) && (i && clearTimeout(i), i = setTimeout(() => {
|
|
2726
|
+
o();
|
|
2728
2727
|
}, 120));
|
|
2729
2728
|
};
|
|
2730
|
-
t.watcher.on("change",
|
|
2729
|
+
t.watcher.on("change", s), t.watcher.on("add", s);
|
|
2731
2730
|
}
|
|
2732
|
-
},
|
|
2731
|
+
}, U = {}, se = (e) => (t) => {
|
|
2733
2732
|
t.on("proxyReq", (t, n) => {
|
|
2734
|
-
|
|
2733
|
+
Cn(t, n, {
|
|
2735
2734
|
target: e,
|
|
2736
2735
|
token: process.env.VOLTRO_INSPECT_TOKEN,
|
|
2737
2736
|
writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
|
|
2738
|
-
isLoopback:
|
|
2737
|
+
isLoopback: o
|
|
2739
2738
|
});
|
|
2740
2739
|
});
|
|
2741
2740
|
};
|
|
2742
|
-
for (let e of
|
|
2741
|
+
for (let e of r) {
|
|
2743
2742
|
if (!e.proxyTarget) continue;
|
|
2744
|
-
|
|
2743
|
+
U[e.browserWsUrl] = {
|
|
2745
2744
|
target: e.proxyTarget,
|
|
2746
2745
|
ws: !0,
|
|
2747
2746
|
changeOrigin: !0,
|
|
2748
2747
|
...e.wsPath ? {} : { rewrite: () => "/ws" }
|
|
2749
2748
|
};
|
|
2750
2749
|
let t = e.proxyTarget.replace(/^ws/, "http");
|
|
2751
|
-
|
|
2750
|
+
U[`/_voltro/api/${e.name}`] = {
|
|
2752
2751
|
target: t,
|
|
2753
2752
|
changeOrigin: !0,
|
|
2754
2753
|
rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
|
|
2755
|
-
configure:
|
|
2754
|
+
configure: se(t)
|
|
2756
2755
|
};
|
|
2757
2756
|
}
|
|
2758
2757
|
for (let [e, n] of Object.entries(t.proxies ?? {})) {
|
|
2759
|
-
if (
|
|
2760
|
-
|
|
2758
|
+
if (U[e]) {
|
|
2759
|
+
Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
|
|
2761
2760
|
continue;
|
|
2762
2761
|
}
|
|
2763
|
-
|
|
2762
|
+
U[e] = {
|
|
2764
2763
|
target: n.target,
|
|
2765
2764
|
changeOrigin: n.changeOrigin ?? !0,
|
|
2766
2765
|
...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
|
|
2767
|
-
},
|
|
2766
|
+
}, Z.info(`proxy ${e} → ${n.target}`, {
|
|
2768
2767
|
prefix: e,
|
|
2769
2768
|
target: n.target,
|
|
2770
2769
|
...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
|
|
2771
2770
|
});
|
|
2772
2771
|
}
|
|
2773
|
-
let
|
|
2772
|
+
let ce = {
|
|
2774
2773
|
name: "framework:inspect",
|
|
2775
|
-
configureServer(
|
|
2774
|
+
configureServer(r) {
|
|
2776
2775
|
let u = null, d = async () => {
|
|
2777
2776
|
if (u !== null) return u;
|
|
2778
2777
|
let t = [];
|
|
2779
2778
|
for (let n of b) try {
|
|
2780
|
-
let
|
|
2779
|
+
let i = await r.ssrLoadModule(p(e, "src", "pages", n.file));
|
|
2781
2780
|
t.push({
|
|
2782
2781
|
pattern: n.pattern,
|
|
2783
2782
|
file: n.file,
|
|
2784
2783
|
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
|
|
2784
|
+
renderMode: Wn(i, p("src", "pages", n.file)),
|
|
2785
|
+
interactive: i.interactive ?? "full",
|
|
2786
|
+
tenantAware: i.tenantAware === !0,
|
|
2787
|
+
revalidateMs: ct(i.revalidate),
|
|
2788
|
+
staleWhileRevalidateMs: ct(i.staleWhileRevalidate) ?? 0,
|
|
2789
|
+
cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
|
|
2790
|
+
hasLoader: typeof i.loader == "function",
|
|
2791
|
+
hasMeta: i.meta != null,
|
|
2792
|
+
hasGetStaticPaths: typeof i.getStaticPaths == "function"
|
|
2794
2793
|
});
|
|
2795
2794
|
} catch (e) {
|
|
2796
|
-
|
|
2795
|
+
Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
|
|
2797
2796
|
}
|
|
2798
2797
|
return u = t, t;
|
|
2799
2798
|
};
|
|
2800
|
-
|
|
2799
|
+
r.middlewares.use((e, t, r) => {
|
|
2801
2800
|
let i = e.url ?? "/";
|
|
2802
2801
|
if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
|
|
2803
2802
|
let a = Date.now(), o = t.end.bind(t);
|
|
@@ -2811,10 +2810,15 @@ import {
|
|
|
2811
2810
|
} catch {}
|
|
2812
2811
|
return o(...e);
|
|
2813
2812
|
}), r();
|
|
2814
|
-
}),
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2813
|
+
}), r.middlewares.use((t, n, r) => {
|
|
2814
|
+
if (t.method !== "GET" && t.method !== "HEAD") return r();
|
|
2815
|
+
let { pathname: i } = Or(t.url ?? "/");
|
|
2816
|
+
if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
|
|
2817
|
+
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(Gt({ indexable: !1 }));
|
|
2818
|
+
}), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
|
|
2819
|
+
let r = e.url ?? "", i = r.split("?")[0];
|
|
2820
|
+
if (i === "/api/dashboard/proxy") {
|
|
2821
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
2818
2822
|
if (!n) {
|
|
2819
2823
|
t.statusCode = 400, t.end("missing ?target=");
|
|
2820
2824
|
return;
|
|
@@ -2824,30 +2828,30 @@ import {
|
|
|
2824
2828
|
return;
|
|
2825
2829
|
}
|
|
2826
2830
|
try {
|
|
2827
|
-
let
|
|
2828
|
-
e.headers.authorization ?
|
|
2829
|
-
let
|
|
2831
|
+
let r = { accept: String(e.headers.accept ?? "application/json") };
|
|
2832
|
+
e.headers.authorization ? r.authorization = String(e.headers.authorization) : o(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
2833
|
+
let i;
|
|
2830
2834
|
if (e.method && e.method !== "GET" && e.method !== "HEAD") {
|
|
2831
2835
|
let t = [];
|
|
2832
2836
|
for await (let n of e) t.push(n);
|
|
2833
|
-
|
|
2837
|
+
i = Buffer.concat(t);
|
|
2834
2838
|
let n = e.headers["content-type"];
|
|
2835
|
-
n && (
|
|
2839
|
+
n && (r["content-type"] = Array.isArray(n) ? n[0] : String(n));
|
|
2836
2840
|
}
|
|
2837
|
-
let
|
|
2841
|
+
let a = await fetch(n, {
|
|
2838
2842
|
redirect: "manual",
|
|
2839
2843
|
...e.method ? { method: e.method } : {},
|
|
2840
|
-
headers:
|
|
2841
|
-
...
|
|
2842
|
-
}), s = Buffer.from(await
|
|
2843
|
-
t.statusCode =
|
|
2844
|
+
headers: r,
|
|
2845
|
+
...i && i.length ? { body: new Uint8Array(i.buffer, i.byteOffset, i.byteLength) } : {}
|
|
2846
|
+
}), s = Buffer.from(await a.arrayBuffer());
|
|
2847
|
+
t.statusCode = a.status, t.setHeader("content-type", a.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
|
|
2844
2848
|
} catch (e) {
|
|
2845
2849
|
t.statusCode = 502, t.end(`proxy error: ${e.message}`);
|
|
2846
2850
|
}
|
|
2847
2851
|
return;
|
|
2848
2852
|
}
|
|
2849
|
-
if (
|
|
2850
|
-
let n = new URL(
|
|
2853
|
+
if (i === "/api/dashboard/proxy/stream") {
|
|
2854
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
2851
2855
|
if (!n) {
|
|
2852
2856
|
t.statusCode = 400, t.end("missing ?target=");
|
|
2853
2857
|
return;
|
|
@@ -2856,20 +2860,20 @@ import {
|
|
|
2856
2860
|
t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
2857
2861
|
return;
|
|
2858
2862
|
}
|
|
2859
|
-
let
|
|
2860
|
-
e.on("close", () =>
|
|
2863
|
+
let i = new AbortController();
|
|
2864
|
+
e.on("close", () => i.abort()), t.on("close", () => i.abort());
|
|
2861
2865
|
try {
|
|
2862
|
-
let
|
|
2866
|
+
let r = await fetch(n, {
|
|
2863
2867
|
redirect: "manual",
|
|
2864
2868
|
method: "GET",
|
|
2865
2869
|
headers: {
|
|
2866
2870
|
accept: "text/event-stream",
|
|
2867
|
-
...e.headers.authorization ? { authorization: String(e.headers.authorization) } :
|
|
2871
|
+
...e.headers.authorization ? { authorization: String(e.headers.authorization) } : o(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
|
|
2868
2872
|
},
|
|
2869
|
-
signal:
|
|
2873
|
+
signal: i.signal
|
|
2870
2874
|
});
|
|
2871
|
-
if (!
|
|
2872
|
-
t.statusCode =
|
|
2875
|
+
if (!r.ok || !r.body) {
|
|
2876
|
+
t.statusCode = r.status, t.end(`upstream ${r.status}`);
|
|
2873
2877
|
return;
|
|
2874
2878
|
}
|
|
2875
2879
|
t.writeHead(200, {
|
|
@@ -2878,7 +2882,7 @@ import {
|
|
|
2878
2882
|
connection: "keep-alive",
|
|
2879
2883
|
"x-accel-buffering": "no"
|
|
2880
2884
|
});
|
|
2881
|
-
let a =
|
|
2885
|
+
let a = r.body.getReader();
|
|
2882
2886
|
try {
|
|
2883
2887
|
for (;;) {
|
|
2884
2888
|
let { done: e, value: n } = await a.read();
|
|
@@ -2894,21 +2898,21 @@ import {
|
|
|
2894
2898
|
return;
|
|
2895
2899
|
}
|
|
2896
2900
|
n();
|
|
2897
|
-
}),
|
|
2898
|
-
let
|
|
2899
|
-
if (!
|
|
2901
|
+
}), r.middlewares.use(async (e, r, a) => {
|
|
2902
|
+
let o = e.url ?? "";
|
|
2903
|
+
if (!o.startsWith("/_voltro/inspect")) return a();
|
|
2900
2904
|
let u = {};
|
|
2901
2905
|
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 =
|
|
2906
|
+
let f = o.split("?")[0];
|
|
2907
|
+
if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
|
|
2908
|
+
let e = l(u.origin), t = _n(o, tn(), u);
|
|
2905
2909
|
r.statusCode = t.status, r.setHeader("content-type", t.contentType);
|
|
2906
2910
|
for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
|
|
2907
2911
|
r.end(t.body);
|
|
2908
2912
|
return;
|
|
2909
2913
|
}
|
|
2910
2914
|
if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
|
|
2911
|
-
let t =
|
|
2915
|
+
let t = l(u.origin);
|
|
2912
2916
|
if (i()) {
|
|
2913
2917
|
r.statusCode = 503, r.setHeader("content-type", "application/json");
|
|
2914
2918
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
@@ -2919,7 +2923,7 @@ import {
|
|
|
2919
2923
|
e.setEncoding("utf-8"), e.on("data", (e) => {
|
|
2920
2924
|
a += e;
|
|
2921
2925
|
}), e.on("end", () => {
|
|
2922
|
-
let e =
|
|
2926
|
+
let e = dn(a, n);
|
|
2923
2927
|
r.statusCode = e.status, r.setHeader("content-type", e.contentType);
|
|
2924
2928
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2925
2929
|
r.end(e.body);
|
|
@@ -2929,14 +2933,14 @@ import {
|
|
|
2929
2933
|
return;
|
|
2930
2934
|
}
|
|
2931
2935
|
if (f === "/_voltro/inspect/stream") {
|
|
2932
|
-
let t =
|
|
2936
|
+
let t = l(u.origin);
|
|
2933
2937
|
if (i()) {
|
|
2934
2938
|
r.statusCode = 503, r.setHeader("content-type", "application/json");
|
|
2935
2939
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2936
2940
|
r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
2937
2941
|
return;
|
|
2938
2942
|
}
|
|
2939
|
-
let a =
|
|
2943
|
+
let a = s(u, "GET");
|
|
2940
2944
|
if (!a.ok) {
|
|
2941
2945
|
r.statusCode = 401, r.setHeader("content-type", "application/json");
|
|
2942
2946
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
@@ -2949,15 +2953,15 @@ import {
|
|
|
2949
2953
|
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
2954
|
for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
|
|
2951
2955
|
r.flushHeaders?.(), r.write("retry: 5000\n\n");
|
|
2952
|
-
let
|
|
2953
|
-
if (!(
|
|
2956
|
+
let c = o.indexOf("?");
|
|
2957
|
+
if (!(c !== -1 && new URLSearchParams(o.slice(c + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Jt(e));
|
|
2954
2958
|
let d = n.subscribe((e) => {
|
|
2955
2959
|
try {
|
|
2956
|
-
r.write(
|
|
2960
|
+
r.write(Jt(e));
|
|
2957
2961
|
} catch {}
|
|
2958
2962
|
}), f = setInterval(() => {
|
|
2959
2963
|
try {
|
|
2960
|
-
r.write(
|
|
2964
|
+
r.write(Yt());
|
|
2961
2965
|
} catch {}
|
|
2962
2966
|
}, 15e3), p = () => {
|
|
2963
2967
|
clearInterval(f), d();
|
|
@@ -2966,11 +2970,11 @@ import {
|
|
|
2966
2970
|
return;
|
|
2967
2971
|
}
|
|
2968
2972
|
try {
|
|
2969
|
-
let n =
|
|
2973
|
+
let n = c(o, {
|
|
2970
2974
|
kind: "web",
|
|
2971
2975
|
meta: {
|
|
2972
2976
|
name: t.name ?? "(unnamed)",
|
|
2973
|
-
voltroVersion:
|
|
2977
|
+
voltroVersion: qr,
|
|
2974
2978
|
port: g,
|
|
2975
2979
|
mode: "dev",
|
|
2976
2980
|
apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
|
|
@@ -2982,13 +2986,13 @@ import {
|
|
|
2982
2986
|
})
|
|
2983
2987
|
},
|
|
2984
2988
|
routes: await d(),
|
|
2985
|
-
dirs:
|
|
2989
|
+
dirs: w,
|
|
2986
2990
|
cache: () => ({
|
|
2987
2991
|
backend: "memory",
|
|
2988
2992
|
size: 0,
|
|
2989
2993
|
entries: []
|
|
2990
2994
|
}),
|
|
2991
|
-
env: () =>
|
|
2995
|
+
env: () => at(t.name ?? "app", { contract: re(t.env) ? t.env : void 0 })
|
|
2992
2996
|
}, u, { method: e.method ?? "GET" });
|
|
2993
2997
|
if (n === null) return a();
|
|
2994
2998
|
r.statusCode = n.status, r.setHeader("content-type", n.contentType);
|
|
@@ -2999,363 +3003,397 @@ import {
|
|
|
2999
3003
|
}
|
|
3000
3004
|
});
|
|
3001
3005
|
}
|
|
3002
|
-
},
|
|
3006
|
+
}, W = t.name === "voltroDashboard" ? {
|
|
3003
3007
|
name: "framework:dashboard-registry",
|
|
3004
3008
|
configureServer(e) {
|
|
3005
3009
|
e.middlewares.use(async (e, t, n) => {
|
|
3006
3010
|
if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
|
|
3007
3011
|
try {
|
|
3008
|
-
let e = await
|
|
3012
|
+
let e = await Ue();
|
|
3009
3013
|
t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
|
|
3010
3014
|
} catch (e) {
|
|
3011
3015
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
|
|
3012
3016
|
}
|
|
3013
3017
|
});
|
|
3014
3018
|
}
|
|
3015
|
-
} : null,
|
|
3016
|
-
if (
|
|
3019
|
+
} : null, de = /* @__PURE__ */ new Set(), fe = (e, t, n, r, i) => {
|
|
3020
|
+
if (Z.error(`${t} render failed`, {
|
|
3017
3021
|
pathname: n,
|
|
3018
|
-
pattern: r
|
|
3019
|
-
|
|
3022
|
+
pattern: r,
|
|
3023
|
+
cause: Ar(i)
|
|
3024
|
+
}), e.headersSent) {
|
|
3020
3025
|
e.end();
|
|
3021
3026
|
return;
|
|
3022
3027
|
}
|
|
3023
3028
|
e.writeHead(500, {
|
|
3024
3029
|
"content-type": "text/plain; charset=utf-8",
|
|
3025
3030
|
"x-voltro-rendered-by": `${t}-failed`
|
|
3026
|
-
});
|
|
3027
|
-
|
|
3028
|
-
|
|
3029
|
-
|
|
3030
|
-
|
|
3031
|
-
onColdStart: (e) => X.debug("ssr cold-compile start", { id: e }),
|
|
3032
|
-
onColdEnd: (e, { durationMs: t, failed: n }) => X.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
3031
|
+
}), e.end(`${t} render failed for ${n}\n\n${Ar(i)}\n`);
|
|
3032
|
+
}, pe = Dt(), me = kt({
|
|
3033
|
+
limit: pe,
|
|
3034
|
+
onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
|
|
3035
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
3033
3036
|
id: e,
|
|
3034
3037
|
ms: t,
|
|
3035
3038
|
...n ? { failed: !0 } : {}
|
|
3036
3039
|
})
|
|
3037
3040
|
});
|
|
3038
|
-
|
|
3039
|
-
let
|
|
3041
|
+
Z.debug(`ssr cold-compile concurrency ${pe}`, { concurrency: pe });
|
|
3042
|
+
let he = null, ge = async () => (he === null && (he = await O.readFile(p(e, ".framework", "index.html"), "utf8")), he), _e = {
|
|
3040
3043
|
name: "framework:ssr",
|
|
3041
|
-
configureServer(
|
|
3042
|
-
let
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3044
|
+
configureServer(n) {
|
|
3045
|
+
let i = (e) => me.load(e, async () => await n.ssrLoadModule(e)), a, o = () => {
|
|
3046
|
+
if (a !== void 0) return a;
|
|
3047
|
+
let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
|
|
3048
|
+
return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
|
|
3049
|
+
let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), o = {};
|
|
3050
|
+
for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
|
|
3051
|
+
let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
|
|
3052
|
+
n !== void 0 && (o[a] = t(a, n, r));
|
|
3053
|
+
} catch (e) {
|
|
3054
|
+
Z.warn("locale catalog failed to load for SSR", { locale: a }, e);
|
|
3055
|
+
}
|
|
3056
|
+
return a({
|
|
3057
|
+
wraps: o,
|
|
3058
|
+
supported: n,
|
|
3059
|
+
defaultLocale: r
|
|
3060
|
+
});
|
|
3061
|
+
})(), a);
|
|
3062
|
+
};
|
|
3063
|
+
n.middlewares.use(async (a, s, c) => {
|
|
3064
|
+
if (a.method !== "GET" && a.method !== "HEAD") return c();
|
|
3065
|
+
let l = a.url ?? "/";
|
|
3066
|
+
l.indexOf("?");
|
|
3067
|
+
let { pathname: u, search: d } = Or(l);
|
|
3068
|
+
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();
|
|
3069
|
+
let f = mi(u, S.ssrRoutes);
|
|
3070
|
+
if (!f) return c();
|
|
3071
|
+
let m = !de.has(f.route.pattern), h = Date.now();
|
|
3072
|
+
m && Z.info(`ssr compiling ${f.route.pattern}`, {
|
|
3073
|
+
pattern: f.route.pattern,
|
|
3074
|
+
pathname: u
|
|
3055
3075
|
});
|
|
3056
|
-
let
|
|
3076
|
+
let g = {}, _ = async (e, t) => {
|
|
3057
3077
|
let n = Date.now(), r = await t();
|
|
3058
|
-
return
|
|
3059
|
-
},
|
|
3060
|
-
let i = await
|
|
3061
|
-
if (!(!i ||
|
|
3062
|
-
if (
|
|
3078
|
+
return g[e] = (g[e] ?? 0) + (Date.now() - n), r;
|
|
3079
|
+
}, v = async (e, t, r) => {
|
|
3080
|
+
let i = await n.moduleGraph.getModuleById(e);
|
|
3081
|
+
if (!(!i || t.has(e))) {
|
|
3082
|
+
if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
|
|
3063
3083
|
let e = i.url.replace(/\?.*$/, "");
|
|
3064
3084
|
r.includes(e) || r.push(e);
|
|
3065
3085
|
return;
|
|
3066
3086
|
}
|
|
3067
|
-
for (let e of i.importedModules ?? []) e.id && await
|
|
3087
|
+
for (let e of i.importedModules ?? []) e.id && await v(e.id, t, r);
|
|
3068
3088
|
}
|
|
3069
3089
|
};
|
|
3070
3090
|
try {
|
|
3071
|
-
let
|
|
3072
|
-
if (
|
|
3073
|
-
let
|
|
3074
|
-
for (let [e, t] of Object.entries(
|
|
3075
|
-
let
|
|
3076
|
-
|
|
3077
|
-
let
|
|
3091
|
+
let y = await _("loadPage", async () => await i(p(e, "src", "pages", f.route.file))), b = Wn(y, p("src", "pages", f.route.file)), x = ci(S.dirs, f.route.dirChain), C = b === "spa" && x.some((e) => e.hasLayout);
|
|
3092
|
+
if (b !== "ssr" && b !== "isr" && !C) return c();
|
|
3093
|
+
let w = {};
|
|
3094
|
+
for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? w[e] = t : Array.isArray(t) && (w[e] = t.join(", "));
|
|
3095
|
+
let T = Ti(wi(r[0], { allowDevProxy: !0 }), w.cookie, { apiName: r[0]?.name }), E = new AbortController(), D = () => E.abort();
|
|
3096
|
+
s.once("close", D);
|
|
3097
|
+
let O = null, ee = [], k = {};
|
|
3078
3098
|
try {
|
|
3079
|
-
(await
|
|
3080
|
-
entries:
|
|
3081
|
-
loadLayout: (t) =>
|
|
3082
|
-
loadError: (t) =>
|
|
3083
|
-
loadPending: (t) =>
|
|
3099
|
+
(await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: ee, segmentLoaderData: k} = await _("loadChain", () => li({
|
|
3100
|
+
entries: x,
|
|
3101
|
+
loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
|
|
3102
|
+
loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
|
|
3103
|
+
loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
|
|
3084
3104
|
ctx: {
|
|
3085
|
-
params:
|
|
3086
|
-
pathname:
|
|
3087
|
-
search:
|
|
3088
|
-
signal:
|
|
3089
|
-
headers:
|
|
3090
|
-
query:
|
|
3105
|
+
params: f.params,
|
|
3106
|
+
pathname: u,
|
|
3107
|
+
search: d,
|
|
3108
|
+
signal: E.signal,
|
|
3109
|
+
headers: w,
|
|
3110
|
+
query: T
|
|
3091
3111
|
}
|
|
3092
3112
|
}));
|
|
3093
|
-
let t =
|
|
3094
|
-
typeof t == "function" && !
|
|
3095
|
-
params:
|
|
3096
|
-
pathname:
|
|
3097
|
-
search:
|
|
3098
|
-
signal:
|
|
3099
|
-
headers:
|
|
3100
|
-
query:
|
|
3113
|
+
let t = y.loader;
|
|
3114
|
+
typeof t == "function" && !C && (O = await _("loader", () => t({
|
|
3115
|
+
params: f.params,
|
|
3116
|
+
pathname: u,
|
|
3117
|
+
search: d,
|
|
3118
|
+
signal: E.signal,
|
|
3119
|
+
headers: w,
|
|
3120
|
+
query: T
|
|
3101
3121
|
})));
|
|
3102
3122
|
} finally {
|
|
3103
|
-
|
|
3123
|
+
s.off("close", D);
|
|
3104
3124
|
}
|
|
3105
|
-
let
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3125
|
+
let A = await _("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
|
|
3126
|
+
C || await Gr({
|
|
3127
|
+
pageMod: y,
|
|
3128
|
+
params: f.params,
|
|
3129
|
+
query: T,
|
|
3130
|
+
apiName: r[0]?.name,
|
|
3131
|
+
seed: A.seedPreloadedSubscription,
|
|
3132
|
+
onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
|
|
3133
|
+
tag: e,
|
|
3134
|
+
apiName: t,
|
|
3135
|
+
pathname: u
|
|
3136
|
+
}, n)
|
|
3137
|
+
});
|
|
3138
|
+
let j = {
|
|
3139
|
+
pattern: f.route.pattern,
|
|
3140
|
+
Component: y.default,
|
|
3141
|
+
meta: y.meta,
|
|
3142
|
+
loader: y.loader,
|
|
3143
|
+
ErrorBoundary: y.ErrorBoundary,
|
|
3144
|
+
Pending: y.Pending,
|
|
3145
|
+
renderMode: b,
|
|
3113
3146
|
chain: ee
|
|
3114
|
-
},
|
|
3115
|
-
cookies:
|
|
3116
|
-
headers:
|
|
3117
|
-
url:
|
|
3118
|
-
},
|
|
3119
|
-
|
|
3120
|
-
|
|
3121
|
-
|
|
3147
|
+
}, M = {
|
|
3148
|
+
cookies: A.parseCookieHeader(w.cookie),
|
|
3149
|
+
headers: w,
|
|
3150
|
+
url: l
|
|
3151
|
+
}, N = y.interactive ?? "full", P = (await o())(w.cookie, w["accept-language"]), F = P ? {
|
|
3152
|
+
outerWrap: P.outerWrap,
|
|
3153
|
+
locale: P.locale
|
|
3154
|
+
} : {}, I = C ? Tr({
|
|
3155
|
+
helpers: A,
|
|
3156
|
+
page: `src/pages/${f.route.file}`,
|
|
3157
|
+
interactive: N,
|
|
3122
3158
|
delivery: "stream",
|
|
3123
3159
|
renderInput: {
|
|
3124
|
-
descriptor:
|
|
3125
|
-
params:
|
|
3126
|
-
pathname:
|
|
3127
|
-
segmentLoaderData:
|
|
3128
|
-
requestContext:
|
|
3160
|
+
descriptor: j,
|
|
3161
|
+
params: f.params,
|
|
3162
|
+
pathname: u,
|
|
3163
|
+
segmentLoaderData: k,
|
|
3164
|
+
requestContext: M,
|
|
3165
|
+
...F
|
|
3129
3166
|
}
|
|
3130
|
-
}) : null,
|
|
3131
|
-
helpers:
|
|
3132
|
-
page: `src/pages/${
|
|
3133
|
-
pathname:
|
|
3134
|
-
renderMode:
|
|
3135
|
-
interactive:
|
|
3136
|
-
loaderData:
|
|
3137
|
-
segmentLoaderData:
|
|
3138
|
-
pageLoaderRan: typeof
|
|
3139
|
-
}),
|
|
3140
|
-
await
|
|
3167
|
+
}) : null, L = C ? null : wr({
|
|
3168
|
+
helpers: A,
|
|
3169
|
+
page: `src/pages/${f.route.file}`,
|
|
3170
|
+
pathname: u,
|
|
3171
|
+
renderMode: b,
|
|
3172
|
+
interactive: N,
|
|
3173
|
+
loaderData: O,
|
|
3174
|
+
segmentLoaderData: k,
|
|
3175
|
+
pageLoaderRan: typeof y.loader == "function"
|
|
3176
|
+
}), R = [];
|
|
3177
|
+
await _("collectCss", async () => {
|
|
3141
3178
|
let t = /* @__PURE__ */ new Set(), n = [
|
|
3142
|
-
|
|
3143
|
-
...
|
|
3144
|
-
...t.hasLayout ? [
|
|
3145
|
-
...t.hasError ? [
|
|
3146
|
-
...t.hasPending ? [
|
|
3179
|
+
p(e, "src", "pages", f.route.file),
|
|
3180
|
+
...x.flatMap((t) => [
|
|
3181
|
+
...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
|
|
3182
|
+
...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
|
|
3183
|
+
...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
|
|
3147
3184
|
]),
|
|
3148
|
-
|
|
3185
|
+
p(e, ".framework", "main.tsx")
|
|
3149
3186
|
];
|
|
3150
|
-
for (let e of n) await
|
|
3187
|
+
for (let e of n) await v(e, t, R);
|
|
3151
3188
|
});
|
|
3152
|
-
let
|
|
3153
|
-
if (
|
|
3154
|
-
let e = (e) =>
|
|
3155
|
-
helpers:
|
|
3156
|
-
prepared:
|
|
3189
|
+
let z = await _("readShell", ge), B = await _("transformShell", () => n.transformIndexHtml(l, z)), te = R.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), V = P?.locale ?? M.cookies["voltro:lang"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", ne = Date.now();
|
|
3190
|
+
if (I) {
|
|
3191
|
+
let e = (e) => Dr({
|
|
3192
|
+
helpers: A,
|
|
3193
|
+
prepared: I,
|
|
3157
3194
|
meta: e,
|
|
3158
|
-
interactive:
|
|
3159
|
-
extra: [
|
|
3195
|
+
interactive: N,
|
|
3196
|
+
extra: [te]
|
|
3160
3197
|
});
|
|
3161
|
-
if (
|
|
3162
|
-
res:
|
|
3163
|
-
shell:
|
|
3164
|
-
shell:
|
|
3198
|
+
if (I.hasDeferred) Hr({
|
|
3199
|
+
res: s,
|
|
3200
|
+
shell: Br({
|
|
3201
|
+
shell: B,
|
|
3165
3202
|
inlineModuleScriptsAsync: !0
|
|
3166
3203
|
}),
|
|
3167
|
-
htmlLang:
|
|
3204
|
+
htmlLang: V,
|
|
3168
3205
|
headers: {
|
|
3169
3206
|
"content-type": "text/html; charset=utf-8",
|
|
3170
3207
|
"x-voltro-rendered-by": "spa-shell-dev"
|
|
3171
3208
|
},
|
|
3172
3209
|
headInjection: e,
|
|
3173
|
-
render: (e) =>
|
|
3174
|
-
...
|
|
3210
|
+
render: (e) => A.renderPageToStream({
|
|
3211
|
+
...I.renderInput,
|
|
3175
3212
|
...e
|
|
3176
3213
|
}),
|
|
3177
3214
|
onShellError: (e) => {
|
|
3178
|
-
|
|
3215
|
+
fe(s, "spa-shell-dev", u, f.route.pattern, e);
|
|
3179
3216
|
}
|
|
3180
3217
|
});
|
|
3181
3218
|
else {
|
|
3182
|
-
let t =
|
|
3183
|
-
helpers:
|
|
3184
|
-
prepared:
|
|
3185
|
-
}), n =
|
|
3186
|
-
|
|
3219
|
+
let t = Er({
|
|
3220
|
+
helpers: A,
|
|
3221
|
+
prepared: I
|
|
3222
|
+
}), n = B.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="${V}"`);
|
|
3223
|
+
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
3224
|
}
|
|
3188
|
-
} else if (
|
|
3225
|
+
} else if (L) {
|
|
3189
3226
|
let e = (e) => [
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
`<meta name="voltro-interactive" content="${
|
|
3193
|
-
...
|
|
3194
|
-
|
|
3227
|
+
te,
|
|
3228
|
+
A.renderMetaToHtml(e),
|
|
3229
|
+
`<meta name="voltro-interactive" content="${N}" />`,
|
|
3230
|
+
...L.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
|
|
3231
|
+
A.renderRouterStateScript(L.stateInput)
|
|
3195
3232
|
].filter((e) => e.length > 0).join("\n "), t = {
|
|
3196
|
-
descriptor:
|
|
3197
|
-
params:
|
|
3198
|
-
pathname:
|
|
3199
|
-
loaderData:
|
|
3200
|
-
segmentLoaderData:
|
|
3201
|
-
requestContext:
|
|
3233
|
+
descriptor: j,
|
|
3234
|
+
params: f.params,
|
|
3235
|
+
pathname: u,
|
|
3236
|
+
loaderData: L.loaderData,
|
|
3237
|
+
segmentLoaderData: L.segmentLoaderData,
|
|
3238
|
+
requestContext: M,
|
|
3239
|
+
...F
|
|
3202
3240
|
};
|
|
3203
|
-
if (
|
|
3204
|
-
res:
|
|
3205
|
-
shell:
|
|
3206
|
-
shell:
|
|
3241
|
+
if (b === "ssr" && N === "full") Hr({
|
|
3242
|
+
res: s,
|
|
3243
|
+
shell: Br({
|
|
3244
|
+
shell: B,
|
|
3207
3245
|
inlineModuleScriptsAsync: !0
|
|
3208
3246
|
}),
|
|
3209
|
-
htmlLang:
|
|
3247
|
+
htmlLang: V,
|
|
3210
3248
|
headers: {
|
|
3211
3249
|
"content-type": "text/html; charset=utf-8",
|
|
3212
3250
|
"x-voltro-rendered-by": "ssr-dev"
|
|
3213
3251
|
},
|
|
3214
3252
|
headInjection: e,
|
|
3215
|
-
render: (e) =>
|
|
3253
|
+
render: (e) => A.renderPageToStream({
|
|
3216
3254
|
...t,
|
|
3217
3255
|
...e
|
|
3218
3256
|
}),
|
|
3219
3257
|
onShellError: (e) => {
|
|
3220
|
-
|
|
3258
|
+
fe(s, "ssr-dev", u, f.route.pattern, e);
|
|
3221
3259
|
}
|
|
3222
3260
|
});
|
|
3223
3261
|
else {
|
|
3224
|
-
let { html: n, meta: r } =
|
|
3225
|
-
|
|
3262
|
+
let { html: n, meta: r } = A.renderPageToHtml(t), i = B.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${V}"`);
|
|
3263
|
+
s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
|
|
3226
3264
|
}
|
|
3227
3265
|
}
|
|
3228
|
-
|
|
3229
|
-
let
|
|
3230
|
-
|
|
3231
|
-
pattern:
|
|
3232
|
-
pathname:
|
|
3233
|
-
elapsedMs:
|
|
3266
|
+
g.render = Date.now() - ne;
|
|
3267
|
+
let H = Date.now() - h;
|
|
3268
|
+
m ? (de.add(f.route.pattern), Z.info(`ssr compiled ${f.route.pattern} in ${H}ms`, {
|
|
3269
|
+
pattern: f.route.pattern,
|
|
3270
|
+
pathname: u,
|
|
3271
|
+
elapsedMs: H,
|
|
3234
3272
|
cold: !0,
|
|
3235
|
-
phases:
|
|
3236
|
-
})) :
|
|
3237
|
-
pattern:
|
|
3238
|
-
pathname:
|
|
3239
|
-
elapsedMs:
|
|
3273
|
+
phases: g
|
|
3274
|
+
})) : H > 200 && Z.info(`ssr rendered ${u} in ${H}ms`, {
|
|
3275
|
+
pattern: f.route.pattern,
|
|
3276
|
+
pathname: u,
|
|
3277
|
+
elapsedMs: H,
|
|
3240
3278
|
cold: !1,
|
|
3241
|
-
phases:
|
|
3279
|
+
phases: g
|
|
3242
3280
|
});
|
|
3243
3281
|
} catch (e) {
|
|
3244
|
-
if (
|
|
3245
|
-
|
|
3246
|
-
pathname:
|
|
3247
|
-
pattern:
|
|
3248
|
-
}, e),
|
|
3282
|
+
if (Sr(e)) {
|
|
3283
|
+
Z.error("ssr-dev render refused", {
|
|
3284
|
+
pathname: u,
|
|
3285
|
+
pattern: f.route.pattern
|
|
3286
|
+
}, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
|
|
3249
3287
|
return;
|
|
3250
3288
|
}
|
|
3251
|
-
let t =
|
|
3289
|
+
let t = Cr(e);
|
|
3252
3290
|
if (t) {
|
|
3253
|
-
|
|
3254
|
-
for (let [e, n] of Object.entries(t.headers))
|
|
3255
|
-
|
|
3291
|
+
s.statusCode = t.status;
|
|
3292
|
+
for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
|
|
3293
|
+
s.end(t.body);
|
|
3256
3294
|
return;
|
|
3257
3295
|
}
|
|
3258
|
-
|
|
3296
|
+
fe(s, "ssr-dev", u, f.route.pattern, e);
|
|
3259
3297
|
}
|
|
3260
3298
|
});
|
|
3261
3299
|
}
|
|
3262
|
-
},
|
|
3300
|
+
}, G = Date.now(), ve = D.version ?? "?", K = await Jr(), q = p(e, "node_modules", "@voltro", "ui-shadcn"), J = T(p(q, "package.json")) ? q : null, ye = [], be = await (async () => {
|
|
3263
3301
|
let t = [];
|
|
3264
|
-
for (let n of
|
|
3302
|
+
for (let n of r) {
|
|
3265
3303
|
if (!n.proxyTarget) continue;
|
|
3266
|
-
let r = await
|
|
3304
|
+
let r = await hi(e, n.pkg);
|
|
3267
3305
|
if (r) try {
|
|
3268
|
-
t.push(await
|
|
3306
|
+
t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
|
|
3269
3307
|
} catch {}
|
|
3270
3308
|
}
|
|
3271
3309
|
if (t.length === 0) return !1;
|
|
3272
|
-
let n =
|
|
3310
|
+
let n = le("sha1").update(t.join("\0")).digest("hex"), i = p(A, ".voltro-rpcgroup-optimize"), a = "";
|
|
3273
3311
|
try {
|
|
3274
|
-
|
|
3312
|
+
a = (await O.readFile(i, "utf8")).trim();
|
|
3275
3313
|
} catch {}
|
|
3276
|
-
if (
|
|
3314
|
+
if (a === n) return !1;
|
|
3277
3315
|
try {
|
|
3278
|
-
await
|
|
3316
|
+
await O.writeFile(i, n);
|
|
3279
3317
|
} catch {}
|
|
3280
3318
|
return !0;
|
|
3281
3319
|
})();
|
|
3282
|
-
|
|
3283
|
-
root:
|
|
3320
|
+
be && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await D.createServer({
|
|
3321
|
+
root: A,
|
|
3284
3322
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3285
3323
|
ssr: { noExternal: ["react-intl"] },
|
|
3286
3324
|
resolve: {
|
|
3287
3325
|
dedupe: ["react", "react-dom"],
|
|
3288
3326
|
alias: [
|
|
3289
|
-
...
|
|
3327
|
+
...K ? [{
|
|
3290
3328
|
find: "@voltro/devtools/styles.css",
|
|
3291
|
-
replacement:
|
|
3329
|
+
replacement: p(K, "src/styles.css")
|
|
3292
3330
|
}, {
|
|
3293
3331
|
find: "@voltro/devtools",
|
|
3294
|
-
replacement:
|
|
3332
|
+
replacement: p(K, "src/index.ts")
|
|
3295
3333
|
}] : [],
|
|
3296
|
-
...
|
|
3334
|
+
...J ? [
|
|
3297
3335
|
{
|
|
3298
3336
|
find: "@voltro/ui-shadcn/tokens.css",
|
|
3299
|
-
replacement:
|
|
3337
|
+
replacement: p(J, "src/tokens.css")
|
|
3300
3338
|
},
|
|
3301
3339
|
{
|
|
3302
3340
|
find: "@voltro/ui-shadcn/cn",
|
|
3303
|
-
replacement:
|
|
3341
|
+
replacement: p(J, "src/cn.ts")
|
|
3304
3342
|
},
|
|
3305
3343
|
{
|
|
3306
3344
|
find: "@voltro/ui-shadcn/brand",
|
|
3307
|
-
replacement:
|
|
3345
|
+
replacement: p(J, "src/brand/voltroLogo.tsx")
|
|
3308
3346
|
},
|
|
3309
3347
|
{
|
|
3310
3348
|
find: "@voltro/ui-shadcn",
|
|
3311
|
-
replacement:
|
|
3349
|
+
replacement: p(J, "src/index.ts")
|
|
3312
3350
|
}
|
|
3313
3351
|
] : [],
|
|
3314
|
-
...
|
|
3352
|
+
...Je(e)
|
|
3315
3353
|
]
|
|
3316
3354
|
},
|
|
3317
3355
|
optimizeDeps: {
|
|
3318
|
-
include: [...
|
|
3319
|
-
force:
|
|
3356
|
+
include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...ye],
|
|
3357
|
+
force: be
|
|
3320
3358
|
},
|
|
3321
|
-
customLogger:
|
|
3359
|
+
customLogger: Et(),
|
|
3322
3360
|
plugins: [
|
|
3323
|
-
|
|
3361
|
+
Rn(p(e, "src", "pages")),
|
|
3324
3362
|
ee(),
|
|
3325
|
-
|
|
3363
|
+
k(),
|
|
3326
3364
|
N,
|
|
3327
|
-
|
|
3365
|
+
R,
|
|
3366
|
+
H,
|
|
3367
|
+
ae,
|
|
3328
3368
|
oe,
|
|
3329
3369
|
ce,
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
xe,
|
|
3333
|
-
...pe ? [pe] : []
|
|
3370
|
+
_e,
|
|
3371
|
+
...W ? [W] : []
|
|
3334
3372
|
],
|
|
3335
3373
|
server: {
|
|
3336
3374
|
port: g,
|
|
3337
3375
|
strictPort: !0,
|
|
3338
3376
|
host: !0,
|
|
3339
3377
|
allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
|
|
3340
|
-
proxy:
|
|
3341
|
-
fs: { allow: [e, ...
|
|
3378
|
+
proxy: U,
|
|
3379
|
+
fs: { allow: [e, ...ei(e)] }
|
|
3342
3380
|
},
|
|
3343
3381
|
appType: "spa",
|
|
3344
|
-
cacheDir:
|
|
3345
|
-
publicDir:
|
|
3346
|
-
})).listen(),
|
|
3347
|
-
version:
|
|
3348
|
-
bootMs: Date.now() -
|
|
3349
|
-
}),
|
|
3382
|
+
cacheDir: p(A, ".vite"),
|
|
3383
|
+
publicDir: p(e, "public")
|
|
3384
|
+
})).listen(), Kr.info(`v${ve} ready in ${Date.now() - G}ms`, {
|
|
3385
|
+
version: ve,
|
|
3386
|
+
bootMs: Date.now() - G
|
|
3387
|
+
}), Z.info(`listening on http://localhost:${g}`, {
|
|
3350
3388
|
port: g,
|
|
3351
3389
|
app: t.name ?? "(unnamed)"
|
|
3352
3390
|
});
|
|
3353
|
-
for (let e of
|
|
3391
|
+
for (let e of r) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
|
|
3354
3392
|
api: e.name,
|
|
3355
3393
|
target: e.proxyTarget
|
|
3356
|
-
}),
|
|
3394
|
+
}), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
|
|
3357
3395
|
try {
|
|
3358
|
-
await
|
|
3396
|
+
await We({
|
|
3359
3397
|
id: v,
|
|
3360
3398
|
name: _,
|
|
3361
3399
|
kind: "web",
|
|
@@ -3364,13 +3402,13 @@ import {
|
|
|
3364
3402
|
status: "live",
|
|
3365
3403
|
logFile: y.path
|
|
3366
3404
|
});
|
|
3367
|
-
let t =
|
|
3405
|
+
let t = ur(e);
|
|
3368
3406
|
if (t) {
|
|
3369
|
-
let e = await
|
|
3370
|
-
e.status === "launched" ?
|
|
3407
|
+
let e = await br({ dashboardAppPath: t });
|
|
3408
|
+
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
3409
|
}
|
|
3372
3410
|
setInterval(() => {
|
|
3373
|
-
|
|
3411
|
+
We({
|
|
3374
3412
|
id: v,
|
|
3375
3413
|
name: _,
|
|
3376
3414
|
kind: "web",
|
|
@@ -3381,52 +3419,52 @@ import {
|
|
|
3381
3419
|
}).catch(() => {});
|
|
3382
3420
|
}, 1e4).unref();
|
|
3383
3421
|
let n = () => {
|
|
3384
|
-
|
|
3422
|
+
Ge(v), y.dispose();
|
|
3385
3423
|
};
|
|
3386
3424
|
process.on("SIGINT", n), process.on("SIGTERM", n);
|
|
3387
3425
|
} catch (e) {
|
|
3388
|
-
|
|
3426
|
+
Z.warn("runtime-registry write failed", {}, e);
|
|
3389
3427
|
}
|
|
3390
|
-
return
|
|
3428
|
+
return C({
|
|
3391
3429
|
app: t.name ?? "unnamed",
|
|
3392
3430
|
kind: "web",
|
|
3393
3431
|
url: `http://localhost:${g}`,
|
|
3394
|
-
bootMs: Date.now() -
|
|
3432
|
+
bootMs: Date.now() - G
|
|
3395
3433
|
}), new Promise(() => {});
|
|
3396
|
-
},
|
|
3434
|
+
}, ji = async (e) => {
|
|
3397
3435
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
3398
|
-
let t = await
|
|
3436
|
+
let t = await ki(e);
|
|
3399
3437
|
if (!t) return {
|
|
3400
3438
|
ran: !1,
|
|
3401
3439
|
exitCode: 0
|
|
3402
3440
|
};
|
|
3403
|
-
let n = Date.now(), r =
|
|
3441
|
+
let n = Date.now(), r = Z.child("serve");
|
|
3404
3442
|
r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
|
|
3405
|
-
let i = await
|
|
3443
|
+
let i = await bi(e, t);
|
|
3406
3444
|
for (let e of i) r.info("api wired", {
|
|
3407
3445
|
name: e.name,
|
|
3408
3446
|
pkg: e.pkg
|
|
3409
3447
|
});
|
|
3410
|
-
await
|
|
3448
|
+
await Ei(e, t, i);
|
|
3411
3449
|
{
|
|
3412
|
-
let { pages: t } = await
|
|
3413
|
-
await
|
|
3450
|
+
let { pages: t } = await $(p(e, "src", "pages"));
|
|
3451
|
+
await zt({
|
|
3414
3452
|
appRoot: e,
|
|
3415
3453
|
pages: t
|
|
3416
3454
|
});
|
|
3417
3455
|
}
|
|
3418
|
-
let a = t.port ?? 5173, o = await
|
|
3419
|
-
|
|
3456
|
+
let a = t.port ?? 5173, o = await Xe("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
|
|
3457
|
+
Z.info("running production build"), await o.build({
|
|
3420
3458
|
root: c,
|
|
3421
3459
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
3422
3460
|
plugins: [s()],
|
|
3423
|
-
customLogger:
|
|
3461
|
+
customLogger: Et(),
|
|
3424
3462
|
resolve: { dedupe: ["react", "react-dom"] },
|
|
3425
3463
|
build: {
|
|
3426
3464
|
outDir: "dist",
|
|
3427
|
-
rollupOptions: { output: { manualChunks:
|
|
3465
|
+
rollupOptions: { output: { manualChunks: ni } }
|
|
3428
3466
|
},
|
|
3429
|
-
publicDir:
|
|
3467
|
+
publicDir: p(e, "public")
|
|
3430
3468
|
});
|
|
3431
3469
|
let l = (await o.preview({
|
|
3432
3470
|
root: c,
|
|
@@ -3437,21 +3475,21 @@ import {
|
|
|
3437
3475
|
label: "Local",
|
|
3438
3476
|
url: e
|
|
3439
3477
|
})) ?? [];
|
|
3440
|
-
return
|
|
3478
|
+
return C({
|
|
3441
3479
|
app: t.name ?? "unnamed",
|
|
3442
3480
|
kind: "preview",
|
|
3443
3481
|
url: u,
|
|
3444
3482
|
extras: d,
|
|
3445
3483
|
bootMs: Date.now() - n
|
|
3446
3484
|
}), new Promise(() => {});
|
|
3447
|
-
},
|
|
3485
|
+
}, Mi = 5e3, Ni = 6e4, Pi = (e, t) => {
|
|
3448
3486
|
if (e.length === 0) return 0;
|
|
3449
3487
|
if (e.length === 1) return e[0];
|
|
3450
3488
|
let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
|
|
3451
3489
|
if (r === i) return e[r];
|
|
3452
3490
|
let a = n - r;
|
|
3453
3491
|
return e[r] * (1 - a) + e[i] * a;
|
|
3454
|
-
},
|
|
3492
|
+
}, Fi = (e) => {
|
|
3455
3493
|
if (e.length === 0) return {
|
|
3456
3494
|
p50: 0,
|
|
3457
3495
|
p95: 0,
|
|
@@ -3463,18 +3501,18 @@ import {
|
|
|
3463
3501
|
let t = e.slice().sort((e, t) => e - t), n = 0;
|
|
3464
3502
|
for (let e of t) n += e;
|
|
3465
3503
|
return {
|
|
3466
|
-
p50:
|
|
3467
|
-
p95:
|
|
3468
|
-
p99:
|
|
3504
|
+
p50: Pi(t, .5),
|
|
3505
|
+
p95: Pi(t, .95),
|
|
3506
|
+
p99: Pi(t, .99),
|
|
3469
3507
|
mean: n / t.length,
|
|
3470
3508
|
min: t[0],
|
|
3471
3509
|
max: t[t.length - 1]
|
|
3472
3510
|
};
|
|
3473
|
-
},
|
|
3474
|
-
let t = e.maxSamples ??
|
|
3511
|
+
}, Ii = (e = {}) => {
|
|
3512
|
+
let t = e.maxSamples ?? Mi, n = e.defaultWindowMs ?? Ni, r = [];
|
|
3475
3513
|
return {
|
|
3476
3514
|
record(e) {
|
|
3477
|
-
|
|
3515
|
+
I(e), r.push({
|
|
3478
3516
|
...e,
|
|
3479
3517
|
ts: Date.now()
|
|
3480
3518
|
}), r.length > t && r.shift();
|
|
@@ -3500,7 +3538,7 @@ import {
|
|
|
3500
3538
|
tag: e.tag,
|
|
3501
3539
|
count: e.samples.length,
|
|
3502
3540
|
errorCount: n,
|
|
3503
|
-
latencyMs:
|
|
3541
|
+
latencyMs: Fi(t)
|
|
3504
3542
|
});
|
|
3505
3543
|
}
|
|
3506
3544
|
return c.sort((e, t) => t.count - e.count), {
|
|
@@ -3513,4 +3551,4 @@ import {
|
|
|
3513
3551
|
};
|
|
3514
3552
|
};
|
|
3515
3553
|
//#endregion
|
|
3516
|
-
export {
|
|
3554
|
+
export { _t as $, qn as A, _n as B, dr as C, ir as D, ur as E, Hn as F, Jt as G, dn as H, Wn as I, Gt as J, qt as K, On as L, zn as M, Gn as N, ar as O, Bn as P, Dt as Q, kn as R, Or as S, br as T, rn as U, pn as V, tn as W, zt as X, Wt as Y, kt as Z, Sr as _, We as _t, li as a, st as at, Er as b, bi as c, ot as ct, ni as d, et as dt, ht as et, $ as f, Xe as ft, Hr as g, Ge as gt, Br as h, Ue as ht, Ti as i, dt as it, Yn as j, or as k, Ai as l, rt as lt, Gr as m, Ke as mt, ri as n, lt as nt, ci as o, ct as ot, Ei as p, Je as pt, Yt as q, wi as r, ut as rt, ki as s, at as st, Ii as t, mt as tt, ji as u, tt as ut, wr as v, Me as vt, lr as w, Dr as x, Tr as y, Ne as yt, Sn as z };
|