@voltro/cli 0.53.0 → 0.55.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 +335 -0
- package/dist/{agentsMd-0l980yhL.js → agentsMd-BaLC10Na.js} +110 -82
- package/dist/agentsMd-DCY1RSs8.js +2 -0
- package/dist/{apiBuild-CaPfoWku.js → apiBuild-CMvLJM_K.js} +2 -2
- package/dist/apiBuild-Cl0IDx8c.js +2 -0
- package/dist/bin.js +1 -1
- package/dist/{build-D-OnvNMf.js → build-S0QOzqPT.js} +115 -115
- package/dist/{checkCommand-D2ZduVlh.js → checkCommand-DNkY5kwF.js} +1 -1
- package/dist/{checkCommand-C5elt0tW.js → checkCommand-fbj9GDjN.js} +6 -6
- package/dist/{cloudCmd-QUXh-b5w.js → cloudCmd-DzKcSYuy.js} +1 -1
- package/dist/codegen-CN6vMM4J.js +2 -0
- package/dist/{codegen-FEk8AZHb.js → codegen-SIepQtUl.js} +76 -65
- package/dist/codegenCommand-3TDJezom.js +42 -0
- package/dist/{codemodRunner-BjtB2lq6.js → codemodRunner-C2zxZUIw.js} +64 -9
- package/dist/{commands-DyxAmhP0.js → commands-BBYJ7Q3B.js} +96 -73
- package/dist/{dashboardCommand-BdKTyT13.js → dashboardCommand-D2kmyCLL.js} +3 -3
- package/dist/{dataCommand-Bab9X7s8.js → dataCommand-BEPPQiTl.js} +267 -195
- package/dist/dbCommand-BTyBGhIA.js +2 -0
- package/dist/{dbCommand-06O2finM.js → dbCommand-DZTmOFT4.js} +3 -3
- package/dist/{dev-C6LGF4iY.js → dev-Ca_A_S9v.js} +2439 -2397
- package/dist/{dev-GjJWAYo2.js → dev-DfVZaoys.js} +1 -1
- package/dist/{doctorCommand-etMkflRc.js → doctorCommand-CGZJK_4o.js} +21 -21
- package/dist/doctorCommand-djmqEcDC.js +2 -0
- package/dist/{dormancyCommand-UwZ1AZzB.js → dormancyCommand-DY2rYpTa.js} +1 -1
- package/dist/{embeddingsCommand-C70zWHwo.js → embeddingsCommand-BoCqZsgp.js} +1 -1
- package/dist/{envCommand-dSyKvRkM.js → envCommand-Bxy2fOjc.js} +15 -15
- package/dist/{evolveCommand-CG0_ebO5.js → evolveCommand-BsbZ-XDg.js} +2 -2
- package/dist/fileConventions-l-RIXbx8.js +36 -0
- package/dist/{fileTaxonomy-B7uxipWS.js → fileTaxonomy-CbyMQYx_.js} +37 -37
- package/dist/frameworkTableAssembly-Df2Ymp2f.js +2 -0
- package/dist/{frameworkTableAssembly-DKx3ba3S.js → frameworkTableAssembly-Do-cf6RJ.js} +96 -102
- package/dist/index.js +2 -2
- package/dist/{infoCommand-_53iOc_j.js → infoCommand-EmM3jPKD.js} +1 -1
- package/dist/{inspect-Bd8-9wsi.js → inspect-DCqILJ1G.js} +4 -0
- package/dist/inspect-DGJwpOAb.js +2 -0
- package/dist/interruptedReplace-CwnkBb2X.js +41 -0
- package/dist/interruptedReplace-qzmFI020.js +2 -0
- package/dist/manifestBuild-CJ2zvPvT.js +2 -0
- package/dist/{manifestBuild-Cqgsx2bM.js → manifestBuild-DjX5MoXy.js} +1 -1
- package/dist/{metaCommands-Cn2oboG4.js → metaCommands-x7RCi2AF.js} +2 -2
- package/dist/{migrate-Cko9rswM.js → migrate-CGFZS-1a.js} +2 -2
- package/dist/mobileCommand-D9O6iq3D.js +428 -0
- package/dist/mobileCommand-DAum7tsG.js +2 -0
- package/dist/{pageConvention-C938S8oC.js → pageConvention-CMpfDN6r.js} +1 -1
- package/dist/{privacyCommand-DWTQMC6R.js → privacyCommand-BCa2OoZG.js} +2 -2
- package/dist/{probeCommand-DkGGLknv.js → probeCommand-Bs3iVBSL.js} +1 -1
- package/dist/{projectScaffold-EzlErR4E.js → projectScaffold-CJfP-xbT.js} +1 -1
- package/dist/{projectScaffold-B4dmTlwT.js → projectScaffold-CSN0OzBV.js} +2 -2
- package/dist/renderModeScan-43yQ2opo.js +147 -0
- package/dist/{renderProfile-CskIgAfn.js → renderProfile-DvrhVJHa.js} +2 -2
- package/dist/{runtimeTrace-c0APJz7E.js → runtimeTrace-C1BTpHGQ.js} +1 -1
- package/dist/{sdkgen-BiQCgIEr.js → sdkgen-CXMwLg9n.js} +1 -1
- package/dist/{serveCommand-CueKQgzl.js → serveCommand-C7IrCD58.js} +899 -897
- package/dist/serveCommand-Cjt5S9hD.js +2 -0
- package/dist/serveEntry.js +1 -1
- package/dist/start-DH7cat4-.js +3 -0
- package/dist/{start-ekPan8BT.js → start-EOV7s1NZ.js} +544 -527
- package/dist/startEntry.js +1 -1
- package/dist/{staticCommand-xlSL-IWk.js → staticCommand-ey0kYmOT.js} +1 -1
- package/dist/{subcommandNames-DpYs3DXr.js → subcommandNames-CDzfEtKV.js} +3 -3
- package/dist/{templates-BR-fb4SP.js → templates-BTWZkJJT.js} +41 -9
- package/dist/{test-BWPQcRoB.js → test-DO27-x2P.js} +1 -1
- package/dist/{updateCommand-C_8I8Rzo.js → updateCommand-C_jN1w18.js} +1 -1
- package/dist/updateCommand-nnFjDbl4.js +2 -0
- package/dist/{webDev-C7jWJ5dX.js → webDev-1XpVnYkW.js} +1 -1
- package/dist/{webDev-oczpugbx.js → webDev-B7vNj4Bq.js} +1231 -1186
- package/dist/{webhooksCommand-4SVPDjKg.js → webhooksCommand-B1LVcyO3.js} +1 -1
- package/dist/workspaceDeps-RKEkX92S.js +45 -0
- package/package.json +31 -19
- package/templates/AGENTS.core.md +2 -0
- package/templates/AGENTS.md +4 -2
- package/templates/agent-docs/_index.md +2 -2
- package/templates/agent-docs/_manifest.json +1 -1
- package/templates/agent-docs/ai.md +4 -4
- package/templates/agent-docs/authentication.md +115 -0
- package/templates/agent-docs/cli.md +98 -12
- package/templates/agent-docs/data.md +121 -21
- package/templates/agent-docs/database/advancedqueries.md +1 -1
- package/templates/agent-docs/database/migrations.md +1 -1
- package/templates/agent-docs/database/seedsdialects.md +64 -2
- package/templates/agent-docs/internationalization.md +2 -0
- package/templates/agent-docs/introduction.md +25 -0
- package/templates/agent-docs/local-first-mobile.md +139 -41
- package/templates/agent-docs/observability.md +4 -2
- package/templates/agent-docs/plugins/atlassian.md +2 -2
- package/templates/agent-docs/plugins/audit.md +2 -2
- package/templates/agent-docs/plugins/billing.md +1 -1
- package/templates/agent-docs/plugins/cdc-out.md +8 -3
- package/templates/agent-docs/plugins/comments.md +22 -0
- package/templates/agent-docs/plugins/presence.md +32 -3
- package/templates/agent-docs/plugins/prometheus.md +2 -0
- package/templates/agent-docs/plugins/queue.md +47 -4
- package/templates/agent-docs/plugins.md +52 -14
- package/templates/agent-docs/reference.md +25 -4
- package/templates/agent-docs/routing.md +81 -9
- package/templates/agent-docs/scheduling.md +1 -1
- package/templates/agent-docs/schema-driven-ui.md +137 -1
- package/templates/agent-docs/templates/appshells.md +36 -4
- package/templates/agent-docs/whats-new.md +75 -158
- package/templates/apps/api-ai/package.json +6 -6
- 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/package.json +8 -8
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/package.json +9 -9
- package/templates/apps/api-collab/README.md +3 -3
- package/templates/apps/api-collab/app.config.ts +1 -1
- package/templates/apps/api-collab/database/schema.ts +12 -8
- package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +1 -1
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +1 -1
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +1 -1
- package/templates/apps/api-collab/package.json +8 -8
- package/templates/apps/api-collab/template.json +1 -1
- package/templates/apps/api-collab/tests/documents.setBody.test.ts +10 -2
- 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-row-history/package.json +8 -8
- package/templates/apps/api-saas/package.json +11 -10
- package/templates/apps/api-saas-starter/package.json +10 -10
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-status/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +7 -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 +9 -9
- package/templates/apps/frontend-auth/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-cms/package.json +9 -9
- package/templates/apps/frontend-collab/README.md +43 -24
- package/templates/apps/frontend-collab/app.config.ts +3 -3
- package/templates/apps/frontend-collab/package.json +14 -10
- package/templates/apps/frontend-collab/src/locales/de.ts +1 -2
- package/templates/apps/frontend-collab/src/locales/en.ts +1 -2
- package/templates/apps/frontend-collab/src/pages/page.test.tsx +72 -76
- package/templates/apps/frontend-collab/src/pages/page.tsx +45 -22
- package/templates/apps/frontend-collab/template.json +2 -2
- 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 +8 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/README.md +48 -0
- package/templates/apps/frontend-landing/app.config.ts +28 -0
- package/templates/apps/frontend-landing/package.json +7 -6
- package/templates/apps/frontend-landing/src/assets/hero.jpg +0 -0
- package/templates/apps/frontend-landing/src/fonts/Geist-Variable.woff2 +0 -0
- package/templates/apps/frontend-landing/src/fonts/LICENSE-Geist.txt +92 -0
- package/templates/apps/frontend-landing/src/globals.css +15 -0
- package/templates/apps/frontend-landing/src/globals.d.ts +17 -0
- package/templates/apps/frontend-landing/src/locales/de.ts +3 -2
- package/templates/apps/frontend-landing/src/locales/en.ts +5 -2
- package/templates/apps/frontend-landing/src/pages/page.test.tsx +79 -0
- package/templates/apps/frontend-landing/src/pages/page.tsx +26 -3
- package/templates/apps/frontend-landing/template.json +2 -2
- package/templates/apps/frontend-portal/package.json +8 -8
- package/templates/apps/frontend-saas/package.json +8 -8
- 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 +8 -7
- package/templates/apps/frontend-status/package.json +8 -8
- package/templates/apps/mobile-app/package.json +12 -11
- package/templates/apps/mobile-app/src/lib/deeplinks.ts +29 -17
- package/templates/apps/mobile-app/tests/deeplinks.test.ts +16 -0
- package/dist/agentsMd-SDDSkyl4.js +0 -2
- package/dist/apiBuild-DHtLXYx9.js +0 -2
- package/dist/codegen-BWpt3VgF.js +0 -2
- package/dist/codegenCommand-BOiWQ5hz.js +0 -137
- package/dist/dbCommand-B1EXBC6f.js +0 -2
- package/dist/doctorCommand-B0hX0tdz.js +0 -2
- package/dist/fileConventions-DASGEmj-.js +0 -35
- package/dist/frameworkTableAssembly-C_7Z-rMs.js +0 -2
- package/dist/inspect-CuoDInfZ.js +0 -2
- package/dist/interruptedReplace-C3O3M1MM.js +0 -28
- package/dist/interruptedReplace-CvmiAM9K.js +0 -2
- package/dist/manifestBuild-C4-J1-m_.js +0 -2
- package/dist/renderModeScan-CUbOeOAg.js +0 -122
- package/dist/serveCommand-DsnrVN3U.js +0 -2
- package/dist/start-BJzZLbt8.js +0 -3
- package/dist/updateCommand-Bqql_rsQ.js +0 -2
|
@@ -2,43 +2,45 @@ import { t as e } from "./nodeEnvironment-cGFAj1J8.js";
|
|
|
2
2
|
import { n as t } from "./loadEnv-D9nEOClM.js";
|
|
3
3
|
import { t as n } from "./bootRefusal-pgvDxlrU.js";
|
|
4
4
|
import { r } from "./appPort-B_HpJ_ck.js";
|
|
5
|
-
import {
|
|
6
|
-
import { A as u, D as d, a as f, h as p, j as m, k as h } from "./inspect-
|
|
7
|
-
import { n as g } from "./
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { d as
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { n as
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
5
|
+
import { M as i, _ as a, c as o, g as s, v as c, y as l } from "./fileConventions-l-RIXbx8.js";
|
|
6
|
+
import { A as u, D as d, a as f, h as p, j as m, k as h } from "./inspect-DCqILJ1G.js";
|
|
7
|
+
import { n as g, t as _ } from "./workspaceDeps-RKEkX92S.js";
|
|
8
|
+
import { n as v } from "./agentsMd-BaLC10Na.js";
|
|
9
|
+
import { c as ee, f as te, p as y, t as b } from "./renderModeScan-43yQ2opo.js";
|
|
10
|
+
import { a as x, c as S, d as C, f as w, i as T, l as E, o as ne, p as D, r as O, s as re, t as k } from "./imagePipeline-CBZmjT4i.js";
|
|
11
|
+
import { d as A, n as j } from "./fontPipeline-Tsh8kZfA.js";
|
|
12
|
+
import { t as ie } from "./pageConvention-CMpfDN6r.js";
|
|
13
|
+
import { i as ae, n as oe, r as se, t as ce } from "./runtimeRegistry-DMeKfTHP.js";
|
|
14
|
+
import { n as le } from "./logFileSink-B4uP8pvf.js";
|
|
15
|
+
import { basename as ue, dirname as M, extname as de, join as N, relative as P, resolve as F, sep as I } from "node:path";
|
|
16
|
+
import { existsSync as L, mkdirSync as R, promises as z, readFileSync as B, readdirSync as fe, statSync as pe, unwatchFile as V, watchFile as me, writeFileSync as he } from "node:fs";
|
|
17
|
+
import { fileURLToPath as H, pathToFileURL as U } from "node:url";
|
|
18
|
+
import { addSink as ge, createLogger as W, printReadyBlock as _e } from "@voltro/logger";
|
|
19
|
+
import { Metric as G, MetricBoundaries as ve } from "effect";
|
|
20
|
+
import { createRequire as ye } from "node:module";
|
|
21
|
+
import { classifyRequestOrigin as be, currentTraceContext as xe, resolveOriginGuardConfig as Se, resolveSecret as Ce } from "@voltro/runtime";
|
|
22
|
+
import { homedir as we } from "node:os";
|
|
23
|
+
import { FRAMEWORK_ENV_CATALOG as Te, appEnvEntries as Ee, checkEnvNaming as De, formatEnvErrors as Oe, installEnvSnapshot as ke, isEnvContract as Ae, pluginEnvEntries as je, renderDotEnvExample as Me, resolveEnv as Ne } from "@voltro/env";
|
|
24
|
+
import { __installPublicEnv as Pe } from "@voltro/env/public";
|
|
25
|
+
import { mkdir as K, readFile as Fe, writeFile as q } from "node:fs/promises";
|
|
26
|
+
import { createHash as J, createHmac as Ie, randomBytes as Le, timingSafeEqual as Re } from "node:crypto";
|
|
27
|
+
import { spawn as ze } from "node:child_process";
|
|
28
|
+
import { createConnection as Y } from "node:net";
|
|
29
|
+
import { FORM_FLASH_SCRIPT_ID as Be, FORM_KEY_FIELD as Ve, FORM_PATH_PREFIX as He, FORM_PATH_PREFIX as Ue, FORM_REDIRECT_FIELD as We, formDataToInput as Ge, validateFields as Ke } from "@voltro/client/form";
|
|
30
|
+
import { buildFeed as qe, contentArtifactPath as Je, getCollection as Ye, getEntry as Xe, invalidateContentCache as Ze, registeredCollections as Qe, setContentAssetResolver as $e, setContentRoot as et, validateReferences as tt } from "@voltro/content";
|
|
31
|
+
import { PassThrough as nt } from "node:stream";
|
|
30
32
|
//#region src/buildToolImport.ts
|
|
31
|
-
var
|
|
33
|
+
var rt = (e) => {
|
|
32
34
|
let t = e;
|
|
33
35
|
return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
|
|
34
|
-
},
|
|
36
|
+
}, it = async (e, t) => {
|
|
35
37
|
try {
|
|
36
38
|
return await t();
|
|
37
39
|
} catch (t) {
|
|
38
|
-
throw
|
|
40
|
+
throw rt(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;
|
|
39
41
|
}
|
|
40
|
-
},
|
|
41
|
-
let n =
|
|
42
|
+
}, at = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", ot = (e, t) => t ? `${e} | undefined` : e, st = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${ot(t.tsType, t.optional)}`).join("\n"), ct = async (e, t) => {
|
|
43
|
+
let n = st(t, () => !0), r = `${at}
|
|
42
44
|
import '@voltro/env/server'
|
|
43
45
|
|
|
44
46
|
declare module '@voltro/env/server' {
|
|
@@ -47,9 +49,9 @@ ${n.length > 0 ? n : " // (no variables declared)"}
|
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
`;
|
|
50
|
-
await
|
|
51
|
-
},
|
|
52
|
-
let n =
|
|
52
|
+
await q(N(e, "env.generated.d.ts"), r, "utf8");
|
|
53
|
+
}, lt = async (e, t) => {
|
|
54
|
+
let n = st(t, (e) => e === "public"), r = `${at}
|
|
53
55
|
import '@voltro/env/public'
|
|
54
56
|
|
|
55
57
|
declare module '@voltro/env/public' {
|
|
@@ -57,10 +59,10 @@ declare module '@voltro/env/public' {
|
|
|
57
59
|
${n.length > 0 ? n : " // (no public variables declared)"}
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
|
-
`, i =
|
|
61
|
-
await
|
|
62
|
-
},
|
|
63
|
-
let n = `${
|
|
62
|
+
`, i = N(e, "src");
|
|
63
|
+
await K(i, { recursive: !0 }), await q(N(i, "voltro-env.d.ts"), r, "utf8");
|
|
64
|
+
}, ut = async (e, t) => {
|
|
65
|
+
let n = `${at}
|
|
64
66
|
import { __installPublicEnv } from '@voltro/env/public'
|
|
65
67
|
|
|
66
68
|
export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
@@ -68,14 +70,14 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
|
|
|
68
70
|
// Set the browser/SSR-shared global the \`publicEnv\` accessor reads.
|
|
69
71
|
__installPublicEnv(publicEnvValues)
|
|
70
72
|
`;
|
|
71
|
-
await
|
|
72
|
-
},
|
|
73
|
-
let t =
|
|
73
|
+
await K(e, { recursive: !0 }), await q(N(e, "env.public.ts"), n, "utf8");
|
|
74
|
+
}, dt = async (e) => {
|
|
75
|
+
let t = Ae(e.rawEnv) ? e.rawEnv : void 0, n = await Ne({
|
|
74
76
|
contract: t,
|
|
75
|
-
resolveSecret:
|
|
76
|
-
}), r = [...n.errors, ...
|
|
77
|
-
if (r.length > 0) throw Error(
|
|
78
|
-
|
|
77
|
+
resolveSecret: Ce
|
|
78
|
+
}), r = [...n.errors, ...De(t, e.appType)];
|
|
79
|
+
if (r.length > 0) throw Error(Oe(r));
|
|
80
|
+
ke(n.values), e.appType === "web" && Pe(n.publicValues);
|
|
79
81
|
let i = t ? Object.keys(t.vars).length : 0;
|
|
80
82
|
if (i > 0) {
|
|
81
83
|
let r = Object.keys(n.publicValues).length;
|
|
@@ -87,20 +89,20 @@ __installPublicEnv(publicEnvValues)
|
|
|
87
89
|
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 });
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
|
-
return e.generateTypes && t && (e.appType === "api" ? await
|
|
92
|
+
return e.generateTypes && t && (e.appType === "api" ? await ct(e.root, t) : await lt(e.root, t)), {
|
|
91
93
|
resolved: n,
|
|
92
94
|
contract: t
|
|
93
95
|
};
|
|
94
|
-
},
|
|
95
|
-
let t =
|
|
96
|
+
}, ft = (e) => {
|
|
97
|
+
let t = Ee(e.contract), n = (e.plugins ?? []).flatMap((e) => je(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : Te, i = /* @__PURE__ */ new Set(), a = [];
|
|
96
98
|
for (let e of [
|
|
97
99
|
...t,
|
|
98
100
|
...n,
|
|
99
101
|
...r
|
|
100
102
|
]) i.has(e.key) || (i.add(e.key), a.push(e));
|
|
101
103
|
return a;
|
|
102
|
-
},
|
|
103
|
-
let r =
|
|
104
|
+
}, pt = (e, t, n = (e) => process.env[e]) => {
|
|
105
|
+
let r = ft(t).map((e) => {
|
|
104
106
|
let t = n(e.key) !== void 0;
|
|
105
107
|
return {
|
|
106
108
|
...e,
|
|
@@ -117,59 +119,20 @@ __installPublicEnv(publicEnvValues)
|
|
|
117
119
|
missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
|
|
118
120
|
}
|
|
119
121
|
};
|
|
120
|
-
},
|
|
121
|
-
let n =
|
|
122
|
+
}, mt = (e, t) => {
|
|
123
|
+
let n = ft({
|
|
122
124
|
...e,
|
|
123
125
|
includeFramework: !1
|
|
124
126
|
});
|
|
125
|
-
return
|
|
127
|
+
return Me(n, {
|
|
126
128
|
includeFramework: e.includeFramework !== !1,
|
|
127
129
|
...t ? { header: t } : {}
|
|
128
130
|
});
|
|
129
|
-
},
|
|
130
|
-
let n = e;
|
|
131
|
-
for (;;) {
|
|
132
|
-
let e = I(n, "node_modules", t);
|
|
133
|
-
try {
|
|
134
|
-
if ((await V.stat(e)).isDirectory()) {
|
|
135
|
-
let t = await V.realpath(e);
|
|
136
|
-
return t.includes("/node_modules/") ? null : t;
|
|
137
|
-
}
|
|
138
|
-
} catch {}
|
|
139
|
-
let r = F(n);
|
|
140
|
-
if (r === n) return null;
|
|
141
|
-
n = r;
|
|
142
|
-
}
|
|
143
|
-
}, ct = async (e) => {
|
|
144
|
-
let t;
|
|
145
|
-
try {
|
|
146
|
-
let n = await V.readFile(I(e, "package.json"), "utf8"), r = JSON.parse(n);
|
|
147
|
-
t = Object.keys({
|
|
148
|
-
...r.dependencies,
|
|
149
|
-
...r.devDependencies
|
|
150
|
-
});
|
|
151
|
-
} catch {
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
return (await Promise.all(t.map(async (t) => {
|
|
155
|
-
let n = await st(e, t);
|
|
156
|
-
if (n === null) return null;
|
|
157
|
-
let r = I(n, "src");
|
|
158
|
-
try {
|
|
159
|
-
if (!(await V.stat(r)).isDirectory()) return null;
|
|
160
|
-
} catch {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return {
|
|
164
|
-
pkg: t,
|
|
165
|
-
dir: r
|
|
166
|
-
};
|
|
167
|
-
}))).filter((e) => e !== null);
|
|
168
|
-
}, lt = 500, ut = (e, t, n = {}) => {
|
|
131
|
+
}, ht = 500, gt = (e, t, n = {}) => {
|
|
169
132
|
if (e.length === 0) return () => {};
|
|
170
|
-
let r = (e) => n.root ?
|
|
133
|
+
let r = (e) => n.root ? P(n.root, e) : e, i = !1, a = (e) => {
|
|
171
134
|
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(() => {
|
|
172
|
-
let e =
|
|
135
|
+
let e = ze(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
173
136
|
stdio: "inherit",
|
|
174
137
|
env: process.env,
|
|
175
138
|
cwd: n.cwd ?? process.cwd()
|
|
@@ -183,22 +146,22 @@ __installPublicEnv(publicEnvValues)
|
|
|
183
146
|
});
|
|
184
147
|
}));
|
|
185
148
|
};
|
|
186
|
-
for (let t of e)
|
|
149
|
+
for (let t of e) me(t, { interval: ht }, (e, n) => {
|
|
187
150
|
e.mtimeMs !== n.mtimeMs && a(t);
|
|
188
151
|
});
|
|
189
152
|
return t.info("watching .env files for changes", {
|
|
190
153
|
files: e.map(r),
|
|
191
|
-
intervalMs:
|
|
154
|
+
intervalMs: ht
|
|
192
155
|
}), () => {
|
|
193
|
-
for (let t of e)
|
|
156
|
+
for (let t of e) V(t);
|
|
194
157
|
};
|
|
195
|
-
},
|
|
158
|
+
}, _t = [{
|
|
196
159
|
host: "127.0.0.1",
|
|
197
160
|
family: "IPv4"
|
|
198
161
|
}, {
|
|
199
162
|
host: "::1",
|
|
200
163
|
family: "IPv6"
|
|
201
|
-
}],
|
|
164
|
+
}], vt = (e, t, n) => new Promise((r) => {
|
|
202
165
|
let i = !1, a = (e) => {
|
|
203
166
|
if (!i) {
|
|
204
167
|
i = !0;
|
|
@@ -207,15 +170,15 @@ __installPublicEnv(publicEnvValues)
|
|
|
207
170
|
} catch {}
|
|
208
171
|
r(e);
|
|
209
172
|
}
|
|
210
|
-
}, o =
|
|
173
|
+
}, o = Y({
|
|
211
174
|
host: e,
|
|
212
175
|
port: t
|
|
213
176
|
});
|
|
214
177
|
o.once("connect", () => a(!0)), o.once("error", () => a(!1)), o.setTimeout(n, () => a(!1));
|
|
215
|
-
}),
|
|
178
|
+
}), yt = async (e, t = 400) => ({ families: (await Promise.all(_t.map(async (n) => ({
|
|
216
179
|
family: n.family,
|
|
217
|
-
taken: await
|
|
218
|
-
})))).filter((e) => e.taken).map((e) => e.family) }),
|
|
180
|
+
taken: await vt(n.host, e, t)
|
|
181
|
+
})))).filter((e) => e.taken).map((e) => e.family) }), bt = (e, t, n) => [
|
|
219
182
|
`${t}: port ${e} is already being served (${n.join(" + ")}).`,
|
|
220
183
|
"",
|
|
221
184
|
" Refusing to start. This is NOT a spurious check — a second listener can",
|
|
@@ -230,26 +193,26 @@ __installPublicEnv(publicEnvValues)
|
|
|
230
193
|
"",
|
|
231
194
|
" Then re-run. To use a different port instead, change `port` in",
|
|
232
195
|
" app.config.ts."
|
|
233
|
-
].join("\n"),
|
|
234
|
-
let { families: r } = await
|
|
235
|
-
if (r.length !== 0) throw n(
|
|
236
|
-
},
|
|
196
|
+
].join("\n"), xt = async (e, t) => {
|
|
197
|
+
let { families: r } = await yt(e);
|
|
198
|
+
if (r.length !== 0) throw n(bt(e, t, r));
|
|
199
|
+
}, St = (e) => e === "effect" || e.startsWith("@effect/") || e.startsWith("@voltro/") || e === "react" || e === "react-dom", Ct = /(^|\/)(\.bin|\.cache|\.pnpm-store|dist|build)(\/|$)/, wt = (e) => {
|
|
237
200
|
let t = [], n = e;
|
|
238
201
|
for (let e = 0; e < 12; e++) {
|
|
239
|
-
let e =
|
|
240
|
-
|
|
241
|
-
let r =
|
|
202
|
+
let e = N(n, "node_modules");
|
|
203
|
+
L(e) && t.push(e);
|
|
204
|
+
let r = M(n);
|
|
242
205
|
if (r === n) break;
|
|
243
206
|
n = r;
|
|
244
207
|
}
|
|
245
208
|
return t;
|
|
246
|
-
},
|
|
209
|
+
}, Tt = (e) => {
|
|
247
210
|
let t = /* @__PURE__ */ new Set([e]), n = e;
|
|
248
211
|
for (let e = 0; e < 12; e++) {
|
|
249
212
|
for (let e of ["pnpm-workspace.yaml", "pnpm-workspace.yml"]) {
|
|
250
213
|
let r;
|
|
251
214
|
try {
|
|
252
|
-
r =
|
|
215
|
+
r = B(N(n, e), "utf8");
|
|
253
216
|
} catch {
|
|
254
217
|
continue;
|
|
255
218
|
}
|
|
@@ -260,38 +223,38 @@ __installPublicEnv(publicEnvValues)
|
|
|
260
223
|
if (i === "" || i.includes("*")) continue;
|
|
261
224
|
let a;
|
|
262
225
|
try {
|
|
263
|
-
a =
|
|
226
|
+
a = fe(N(n, i), { withFileTypes: !0 });
|
|
264
227
|
} catch {
|
|
265
228
|
continue;
|
|
266
229
|
}
|
|
267
|
-
for (let e of a) e.isDirectory() && t.add(
|
|
230
|
+
for (let e of a) e.isDirectory() && t.add(N(n, i, e.name));
|
|
268
231
|
}
|
|
269
232
|
}
|
|
270
233
|
for (let e of ["packages", "apps"]) {
|
|
271
234
|
let r;
|
|
272
235
|
try {
|
|
273
|
-
r =
|
|
236
|
+
r = fe(N(n, e), { withFileTypes: !0 });
|
|
274
237
|
} catch {
|
|
275
238
|
continue;
|
|
276
239
|
}
|
|
277
|
-
for (let i of r) i.isDirectory() && t.add(
|
|
240
|
+
for (let i of r) i.isDirectory() && t.add(N(n, e, i.name));
|
|
278
241
|
}
|
|
279
|
-
let e =
|
|
242
|
+
let e = M(n);
|
|
280
243
|
if (e === n) break;
|
|
281
244
|
n = e;
|
|
282
245
|
}
|
|
283
246
|
return [...t];
|
|
284
|
-
},
|
|
247
|
+
}, Et = (e) => {
|
|
285
248
|
let t = [];
|
|
286
|
-
for (let n of
|
|
287
|
-
let e =
|
|
249
|
+
for (let n of Tt(e)) {
|
|
250
|
+
let e = N(n, "node_modules", "@voltro"), r;
|
|
288
251
|
try {
|
|
289
|
-
r =
|
|
252
|
+
r = fe(e);
|
|
290
253
|
} catch {
|
|
291
254
|
continue;
|
|
292
255
|
}
|
|
293
256
|
for (let n of r) {
|
|
294
|
-
let r =
|
|
257
|
+
let r = N(e, n), i = Dt(r);
|
|
295
258
|
i !== void 0 && t.push({
|
|
296
259
|
pkg: `@voltro/${n}`,
|
|
297
260
|
version: i,
|
|
@@ -300,38 +263,38 @@ __installPublicEnv(publicEnvValues)
|
|
|
300
263
|
}
|
|
301
264
|
}
|
|
302
265
|
return t;
|
|
303
|
-
},
|
|
266
|
+
}, Dt = (e) => {
|
|
304
267
|
try {
|
|
305
|
-
let t = JSON.parse(
|
|
268
|
+
let t = JSON.parse(B(N(e, "package.json"), "utf8"));
|
|
306
269
|
return typeof t.version == "string" ? t.version : void 0;
|
|
307
270
|
} catch {
|
|
308
271
|
return;
|
|
309
272
|
}
|
|
310
|
-
},
|
|
273
|
+
}, Ot = (e) => {
|
|
311
274
|
let t = [], n;
|
|
312
275
|
try {
|
|
313
|
-
n =
|
|
276
|
+
n = fe(e);
|
|
314
277
|
} catch {
|
|
315
278
|
return t;
|
|
316
279
|
}
|
|
317
280
|
for (let r of n) {
|
|
318
|
-
if (r.startsWith(".") ||
|
|
319
|
-
let n =
|
|
281
|
+
if (r.startsWith(".") || Ct.test(r)) continue;
|
|
282
|
+
let n = N(e, r);
|
|
320
283
|
if (r.startsWith("@")) {
|
|
321
284
|
let e;
|
|
322
285
|
try {
|
|
323
|
-
e =
|
|
286
|
+
e = fe(n);
|
|
324
287
|
} catch {
|
|
325
288
|
continue;
|
|
326
289
|
}
|
|
327
290
|
for (let i of e) t.push({
|
|
328
291
|
pkg: `${r}/${i}`,
|
|
329
|
-
dir:
|
|
292
|
+
dir: N(n, i)
|
|
330
293
|
});
|
|
331
294
|
continue;
|
|
332
295
|
}
|
|
333
296
|
try {
|
|
334
|
-
if (!
|
|
297
|
+
if (!pe(n).isDirectory()) continue;
|
|
335
298
|
} catch {
|
|
336
299
|
continue;
|
|
337
300
|
}
|
|
@@ -341,25 +304,25 @@ __installPublicEnv(publicEnvValues)
|
|
|
341
304
|
});
|
|
342
305
|
}
|
|
343
306
|
return t;
|
|
344
|
-
},
|
|
307
|
+
}, kt = (e) => {
|
|
345
308
|
let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
|
|
346
|
-
if (!
|
|
309
|
+
if (!St(e)) return;
|
|
347
310
|
let i = t.get(e) ?? /* @__PURE__ */ new Map();
|
|
348
311
|
i.has(n) || i.set(n, r), t.set(e, i);
|
|
349
312
|
};
|
|
350
|
-
for (let t of
|
|
351
|
-
let t =
|
|
313
|
+
for (let t of wt(e)) for (let { pkg: e, dir: r } of Ot(t)) {
|
|
314
|
+
let t = Dt(r);
|
|
352
315
|
t !== void 0 && n(e, t, r);
|
|
353
316
|
}
|
|
354
|
-
for (let { pkg: t, version: r, dir: i } of
|
|
317
|
+
for (let { pkg: t, version: r, dir: i } of Et(e)) n(t, r, i);
|
|
355
318
|
let r = [];
|
|
356
319
|
for (let [n, i] of t) i.size < 2 || r.push({
|
|
357
320
|
pkg: n,
|
|
358
321
|
versions: [...i.keys()].sort(),
|
|
359
|
-
paths: [...i.values()].map((t) =>
|
|
322
|
+
paths: [...i.values()].map((t) => P(e, t)).sort()
|
|
360
323
|
});
|
|
361
324
|
return r.sort((e, t) => e.pkg.localeCompare(t.pkg));
|
|
362
|
-
},
|
|
325
|
+
}, At = (e) => {
|
|
363
326
|
if (e.length !== 0) return [
|
|
364
327
|
`• ${e.length} package(s) resolved at more than one version:`,
|
|
365
328
|
...e.flatMap((e) => [` ${e.pkg} — ${e.versions.join(", ")}`, ...e.paths.map((e) => ` ${e}`)]),
|
|
@@ -377,11 +340,11 @@ __installPublicEnv(publicEnvValues)
|
|
|
377
340
|
" instrument), then reinstall. Do not silence the generated file — it is where",
|
|
378
341
|
" a genuine mistake in your own descriptors surfaces."
|
|
379
342
|
].join("\n");
|
|
380
|
-
},
|
|
343
|
+
}, jt = (e) => {
|
|
381
344
|
let t = /* @__PURE__ */ new Map();
|
|
382
|
-
for (let n of
|
|
345
|
+
for (let n of wt(e)) for (let { pkg: e, dir: r } of Ot(n)) {
|
|
383
346
|
if (!e.startsWith("@voltro/")) continue;
|
|
384
|
-
let n =
|
|
347
|
+
let n = Dt(r);
|
|
385
348
|
n !== void 0 && !t.has(e) && t.set(e, n);
|
|
386
349
|
}
|
|
387
350
|
if (t.size < 2) return;
|
|
@@ -396,7 +359,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
396
359
|
version: t
|
|
397
360
|
})).sort((e, t) => e.pkg.localeCompare(t.pkg))
|
|
398
361
|
};
|
|
399
|
-
},
|
|
362
|
+
}, Mt = (e) => {
|
|
400
363
|
if (e !== void 0) return [
|
|
401
364
|
`• ${e.behind.length} @voltro/* package(s) are not on ${e.majority}:`,
|
|
402
365
|
...e.behind.map((e) => ` ${e.pkg} ${e.version}`),
|
|
@@ -414,59 +377,59 @@ __installPublicEnv(publicEnvValues)
|
|
|
414
377
|
" its pattern: the one that produced this report was `@voltro/[a-z-]+`,",
|
|
415
378
|
" which silently skips `@voltro/i18n` because the name contains digits."
|
|
416
379
|
].join("\n");
|
|
417
|
-
},
|
|
418
|
-
let n =
|
|
380
|
+
}, Nt = (e, t) => {
|
|
381
|
+
let n = jt(e);
|
|
419
382
|
n !== void 0 && t.warn?.(`@voltro/* version skew: ${n.behind.length} package(s) are not on ${n.majority}`, {
|
|
420
383
|
majority: n.majority,
|
|
421
384
|
behind: n.behind.map((e) => `${e.pkg}@${e.version}`),
|
|
422
385
|
fix: "the framework ships in lockstep; bump the listed packages and reinstall"
|
|
423
386
|
});
|
|
424
|
-
},
|
|
387
|
+
}, Pt = W({ scope: "vite" }), Ft = /\x1b\[[0-9;]*m/g, It = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, Lt = (e) => e.replace(Ft, "").replace(It, "").trim(), Rt = /proxy error/i, zt = [
|
|
425
388
|
"ECONNREFUSED",
|
|
426
389
|
"ECONNRESET",
|
|
427
390
|
"ECONNABORTED",
|
|
428
391
|
"EPIPE",
|
|
429
392
|
"ETIMEDOUT"
|
|
430
|
-
],
|
|
393
|
+
], Bt = (e, t = 0) => {
|
|
431
394
|
if (e == null || t > 5) return !1;
|
|
432
395
|
let n = e;
|
|
433
|
-
return typeof n.code == "string" &&
|
|
434
|
-
},
|
|
396
|
+
return typeof n.code == "string" && zt.includes(n.code) || typeof n.message == "string" && zt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Bt(e, t + 1)) ? !0 : Bt(n.cause, t + 1);
|
|
397
|
+
}, Vt = 4e3, Ht = () => {
|
|
435
398
|
let e = /* @__PURE__ */ new Set(), t = 0, n = {
|
|
436
399
|
hasWarned: !1,
|
|
437
400
|
info: (e) => {
|
|
438
|
-
let t =
|
|
439
|
-
t.length !== 0 &&
|
|
401
|
+
let t = Lt(e);
|
|
402
|
+
t.length !== 0 && Pt.info(t);
|
|
440
403
|
},
|
|
441
404
|
warn: (e) => {
|
|
442
405
|
n.hasWarned = !0;
|
|
443
|
-
let t =
|
|
444
|
-
t.length !== 0 &&
|
|
406
|
+
let t = Lt(e);
|
|
407
|
+
t.length !== 0 && Pt.warn(t);
|
|
445
408
|
},
|
|
446
409
|
warnOnce: (t) => {
|
|
447
|
-
let r =
|
|
448
|
-
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 &&
|
|
410
|
+
let r = Lt(t);
|
|
411
|
+
e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && Pt.warn(r));
|
|
449
412
|
},
|
|
450
413
|
error: (e, n) => {
|
|
451
|
-
let r =
|
|
414
|
+
let r = Lt(e), i = n?.error;
|
|
452
415
|
if (r.length !== 0) {
|
|
453
|
-
if (
|
|
416
|
+
if (Rt.test(r) && Bt(i)) {
|
|
454
417
|
let e = Date.now();
|
|
455
|
-
e - t >
|
|
418
|
+
e - t > Vt && (t = e, Pt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
|
|
456
419
|
return;
|
|
457
420
|
}
|
|
458
|
-
|
|
421
|
+
Pt.error(r, {}, i);
|
|
459
422
|
}
|
|
460
423
|
},
|
|
461
424
|
clearScreen: () => {},
|
|
462
425
|
hasErrorLogged: (e) => !1
|
|
463
426
|
};
|
|
464
427
|
return n;
|
|
465
|
-
},
|
|
428
|
+
}, Ut = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Wt = (e) => {
|
|
466
429
|
try {
|
|
467
|
-
let t =
|
|
468
|
-
if (!
|
|
469
|
-
let n = JSON.parse(
|
|
430
|
+
let t = N(e, "tsconfig.json");
|
|
431
|
+
if (!L(t)) return [];
|
|
432
|
+
let n = JSON.parse(Ut(B(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = n.baseUrl ?? ".", a = F(e, i), o = [];
|
|
470
433
|
for (let [e, t] of Object.entries(r)) {
|
|
471
434
|
let n = t[0];
|
|
472
435
|
if (!n) continue;
|
|
@@ -476,11 +439,11 @@ __installPublicEnv(publicEnvValues)
|
|
|
476
439
|
let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
477
440
|
o.push({
|
|
478
441
|
find: RegExp(`^${t}/(.*)$`),
|
|
479
|
-
replacement: `${
|
|
442
|
+
replacement: `${N(a, n.slice(0, -2))}/$1`
|
|
480
443
|
});
|
|
481
444
|
} else o.push({
|
|
482
445
|
find: e,
|
|
483
|
-
replacement:
|
|
446
|
+
replacement: N(a, n)
|
|
484
447
|
});
|
|
485
448
|
}
|
|
486
449
|
}
|
|
@@ -488,12 +451,12 @@ __installPublicEnv(publicEnvValues)
|
|
|
488
451
|
} catch {
|
|
489
452
|
return [];
|
|
490
453
|
}
|
|
491
|
-
},
|
|
454
|
+
}, Gt = (e = process.env) => {
|
|
492
455
|
let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
|
|
493
456
|
if (t === void 0 || t.trim() === "") return 4;
|
|
494
457
|
let n = Number(t);
|
|
495
458
|
return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
|
|
496
|
-
},
|
|
459
|
+
}, Kt = (e) => {
|
|
497
460
|
let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
|
|
498
461
|
let e = r.shift();
|
|
499
462
|
e ? e() : n--;
|
|
@@ -511,8 +474,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
511
474
|
return n;
|
|
512
475
|
}
|
|
513
476
|
};
|
|
514
|
-
},
|
|
515
|
-
let t =
|
|
477
|
+
}, qt = (e) => {
|
|
478
|
+
let t = Kt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
|
|
516
479
|
return {
|
|
517
480
|
load: (i, a) => {
|
|
518
481
|
if (r.has(i)) return a();
|
|
@@ -542,19 +505,23 @@ __installPublicEnv(publicEnvValues)
|
|
|
542
505
|
return r.size;
|
|
543
506
|
}
|
|
544
507
|
};
|
|
545
|
-
},
|
|
546
|
-
let n = `<script type="application/json" id="${
|
|
508
|
+
}, Jt = 1048576, Yt = (e) => e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """), Xt = (e) => JSON.stringify(e).replace(/</g, "\\u003c"), Zt = (e, t) => {
|
|
509
|
+
let n = `<script type="application/json" id="${Be}">${Xt(t)}<\/script>`;
|
|
547
510
|
return e.includes("</body>") ? e.replace("</body>", `${n}</body>`) : e + n;
|
|
548
|
-
},
|
|
549
|
-
let t = Object.entries(e.errors).map(([e, t]) => `<li><strong>${
|
|
550
|
-
return `<!doctype html><html><head><meta charset="utf-8"><title>Form submission failed</title></head><body><h1>Submission failed</h1>${e.formError === void 0 ? "" : `<p>${
|
|
511
|
+
}, Qt = (e) => {
|
|
512
|
+
let t = Object.entries(e.errors).map(([e, t]) => `<li><strong>${Yt(e)}</strong>: ${Yt(t)}</li>`).join("");
|
|
513
|
+
return `<!doctype html><html><head><meta charset="utf-8"><title>Form submission failed</title></head><body><h1>Submission failed</h1>${e.formError === void 0 ? "" : `<p>${Yt(e.formError)}</p>`}<ul>${t}</ul><p><a href="javascript:history.back()">Go back</a> to correct the form.</p></body></html>`;
|
|
551
514
|
}, X = (e, t, n, r = "text/plain; charset=utf-8") => {
|
|
552
515
|
e.statusCode = t, e.setHeader("content-type", r), e.end(n);
|
|
553
|
-
},
|
|
516
|
+
}, $t = (e, t, n) => {
|
|
554
517
|
e.setHeader("cache-control", "no-store"), X(e, t, n, "text/html; charset=utf-8");
|
|
555
|
-
},
|
|
518
|
+
}, en = (e) => {
|
|
556
519
|
if (e !== void 0 && e !== "" && !(!e.startsWith("/") || e.startsWith("//") || e.includes("\\"))) return e;
|
|
557
|
-
},
|
|
520
|
+
}, tn = (e, t) => {
|
|
521
|
+
if (e === void 0 || t === void 0 || t.length === 0) return;
|
|
522
|
+
let n = e.replace(/^\/+/, "").split(/[/?#]/)[0];
|
|
523
|
+
if (n !== void 0 && n !== "") return t.includes(n) ? n : void 0;
|
|
524
|
+
}, nn = (e) => {
|
|
558
525
|
let t = e.referer;
|
|
559
526
|
if (t !== void 0) try {
|
|
560
527
|
let e = new URL(t);
|
|
@@ -562,10 +529,10 @@ __installPublicEnv(publicEnvValues)
|
|
|
562
529
|
} catch {
|
|
563
530
|
return;
|
|
564
531
|
}
|
|
565
|
-
},
|
|
532
|
+
}, rn = (e) => new Promise((t) => {
|
|
566
533
|
let n = [], r = 0;
|
|
567
534
|
e.on("data", (i) => {
|
|
568
|
-
if (r += i.length, r >
|
|
535
|
+
if (r += i.length, r > Jt) {
|
|
569
536
|
e.removeAllListeners("data"), e.removeAllListeners("end"), t({ ok: !1 });
|
|
570
537
|
return;
|
|
571
538
|
}
|
|
@@ -574,32 +541,32 @@ __installPublicEnv(publicEnvValues)
|
|
|
574
541
|
ok: !0,
|
|
575
542
|
body: Buffer.concat(n).toString("utf8")
|
|
576
543
|
})), e.on("error", () => t({ ok: !1 }));
|
|
577
|
-
}),
|
|
544
|
+
}), an = (e) => {
|
|
578
545
|
let t = {};
|
|
579
546
|
for (let [n, r] of Object.entries(e.headers)) typeof r == "string" ? t[n.toLowerCase()] = r : Array.isArray(r) && (t[n.toLowerCase()] = r.join(", "));
|
|
580
547
|
return t;
|
|
581
|
-
},
|
|
582
|
-
let t = e.originGuard ??
|
|
548
|
+
}, on = (e) => {
|
|
549
|
+
let t = e.originGuard ?? Se(void 0, process.env);
|
|
583
550
|
return async (n, r, i) => {
|
|
584
551
|
let a = (n.url ?? "/").split("?")[0];
|
|
585
|
-
if (!a.startsWith(
|
|
552
|
+
if (!a.startsWith(He)) return !1;
|
|
586
553
|
if (n.method !== "POST") return r.setHeader("allow", "POST"), X(r, 405, "method not allowed — a /form/* endpoint accepts native form POSTs only"), !0;
|
|
587
|
-
let o =
|
|
588
|
-
if (!
|
|
554
|
+
let o = an(n);
|
|
555
|
+
if (!be({
|
|
589
556
|
headers: o,
|
|
590
557
|
config: t
|
|
591
558
|
}).allowed) return X(r, 403, "origin not allowed"), !0;
|
|
592
559
|
if ((o["content-type"] ?? "").includes("multipart/form-data")) return X(r, 415, "file uploads need JavaScript — the no-JS form path accepts application/x-www-form-urlencoded only"), !0;
|
|
593
|
-
let s = await
|
|
594
|
-
if (!s.ok) return X(r, 413, `form body exceeds ${
|
|
595
|
-
let c = new URLSearchParams(s.body), l = decodeURIComponent(a.slice(
|
|
560
|
+
let s = await rn(n);
|
|
561
|
+
if (!s.ok) return X(r, 413, `form body exceeds ${Jt} bytes`), !0;
|
|
562
|
+
let c = new URLSearchParams(s.body), l = decodeURIComponent(a.slice(He.length)), u = (await e.loadDescriptors())?.[l];
|
|
596
563
|
if (u === void 0 || u.kind !== "mutation") return X(r, 404, `no mutation '${l}' — /form/* serves declared mutations only`), !0;
|
|
597
|
-
let d = c.get(
|
|
598
|
-
for (let [e, t] of c) e !==
|
|
564
|
+
let d = c.get(Ve) ?? l, f = en(c.get(We) ?? void 0), p = [];
|
|
565
|
+
for (let [e, t] of c) e !== Ve && e !== We && p.push([e, t]);
|
|
599
566
|
let m = u.input;
|
|
600
567
|
if (m === void 0) return X(r, 404, `mutation '${l}' carries no input schema — the no-JS path cannot map its POST`), !0;
|
|
601
|
-
let h =
|
|
602
|
-
let n =
|
|
568
|
+
let h = Ge(m, p), g = Ke(m, h, { locale: await e.resolveLocale(o, nn(o)) }), _ = async (t) => {
|
|
569
|
+
let n = nn(o);
|
|
603
570
|
if (n !== void 0) {
|
|
604
571
|
if (i !== void 0) {
|
|
605
572
|
i(n, t);
|
|
@@ -611,11 +578,11 @@ __installPublicEnv(publicEnvValues)
|
|
|
611
578
|
flash: t
|
|
612
579
|
});
|
|
613
580
|
if (a !== void 0) {
|
|
614
|
-
|
|
581
|
+
$t(r, 422, Zt(a, t));
|
|
615
582
|
return;
|
|
616
583
|
}
|
|
617
584
|
}
|
|
618
|
-
|
|
585
|
+
$t(r, 422, Qt(t));
|
|
619
586
|
};
|
|
620
587
|
if (!g.valid) return await _({
|
|
621
588
|
formKey: d,
|
|
@@ -635,10 +602,10 @@ __installPublicEnv(publicEnvValues)
|
|
|
635
602
|
formError: t?.message ?? t?._tag ?? "The server rejected this submission. Please try again."
|
|
636
603
|
}), !0;
|
|
637
604
|
}
|
|
638
|
-
let
|
|
639
|
-
return r.statusCode = 303, r.setHeader("location",
|
|
605
|
+
let ee = f ?? nn(o) ?? "/";
|
|
606
|
+
return r.statusCode = 303, r.setHeader("location", ee), r.end(), !0;
|
|
640
607
|
};
|
|
641
|
-
},
|
|
608
|
+
}, sn = /^\s*(?:import|export)\s[^;'"]*?['"]([^'"]+)['"]/gm, cn = [
|
|
642
609
|
"",
|
|
643
610
|
".tsx",
|
|
644
611
|
".ts",
|
|
@@ -646,87 +613,87 @@ __installPublicEnv(publicEnvValues)
|
|
|
646
613
|
".js",
|
|
647
614
|
"/index.tsx",
|
|
648
615
|
"/index.ts"
|
|
649
|
-
],
|
|
616
|
+
], ln = (e) => /\.island\.(tsx|ts|jsx|js)$/.test(e), un = ["@voltro/web", "@voltro/i18n"], dn = ["@voltro/client", "@voltro/ui"], fn = (e, t) => e === t || e.startsWith(`${t}/`), pn = (e) => e !== "@voltro/web/islands" && un.some((t) => fn(e, t)), mn = (e) => {
|
|
650
617
|
let t = [];
|
|
651
|
-
for (let n of e.matchAll(
|
|
618
|
+
for (let n of e.matchAll(sn)) t.push(n[1]);
|
|
652
619
|
return t;
|
|
653
|
-
},
|
|
654
|
-
let n =
|
|
655
|
-
for (let e of
|
|
620
|
+
}, hn = async (e, t) => {
|
|
621
|
+
let n = F(M(e), t);
|
|
622
|
+
for (let e of cn) {
|
|
656
623
|
let t = n + e;
|
|
657
624
|
try {
|
|
658
|
-
if ((await
|
|
625
|
+
if ((await z.stat(t)).isFile()) return t;
|
|
659
626
|
} catch {}
|
|
660
627
|
}
|
|
661
|
-
},
|
|
662
|
-
let n =
|
|
628
|
+
}, gn = async (e, t) => {
|
|
629
|
+
let n = N(e, "src", "pages", t), r = /* @__PURE__ */ new Set(), i = [], a = !1, o = [], s = async (t, n) => {
|
|
663
630
|
let c = `${t}\u0000${n ? "i" : "p"}`;
|
|
664
631
|
if (r.has(c)) return;
|
|
665
632
|
r.add(c);
|
|
666
633
|
let l;
|
|
667
634
|
try {
|
|
668
|
-
l = await
|
|
635
|
+
l = await z.readFile(t, "utf8");
|
|
669
636
|
} catch {
|
|
670
637
|
return;
|
|
671
638
|
}
|
|
672
|
-
for (let r of
|
|
639
|
+
for (let r of mn(l)) {
|
|
673
640
|
if (n) {
|
|
674
|
-
if (
|
|
675
|
-
o.push([
|
|
641
|
+
if (pn(r)) {
|
|
642
|
+
o.push([P(e, t).split(I).join("/"), r]);
|
|
676
643
|
continue;
|
|
677
644
|
}
|
|
678
|
-
if (
|
|
645
|
+
if (dn.some((e) => fn(r, e))) {
|
|
679
646
|
a = !0;
|
|
680
647
|
continue;
|
|
681
648
|
}
|
|
682
649
|
}
|
|
683
650
|
if (!r.startsWith(".")) continue;
|
|
684
|
-
let c = await
|
|
651
|
+
let c = await hn(t, r);
|
|
685
652
|
if (c === void 0) continue;
|
|
686
|
-
let l = n ||
|
|
687
|
-
if (!n &&
|
|
688
|
-
let t =
|
|
653
|
+
let l = n || ln(c);
|
|
654
|
+
if (!n && ln(c)) {
|
|
655
|
+
let t = P(e, c).split(I).join("/");
|
|
689
656
|
i.includes(t) || i.push(t);
|
|
690
657
|
}
|
|
691
658
|
await s(c, l);
|
|
692
659
|
}
|
|
693
660
|
};
|
|
694
|
-
return await s(n,
|
|
661
|
+
return await s(n, ln(n)), ln(n) && i.unshift(P(e, n).split(I).join("/")), {
|
|
695
662
|
islandFiles: i,
|
|
696
663
|
usesClient: a,
|
|
697
664
|
violations: o
|
|
698
665
|
};
|
|
699
|
-
},
|
|
666
|
+
}, _n = (e) => {
|
|
700
667
|
let t = /^export const interactive\s*=\s*['"](full|islands|none)['"]/m.exec(e);
|
|
701
668
|
return t === null ? void 0 : t[1];
|
|
702
|
-
},
|
|
669
|
+
}, vn = (e) => {
|
|
703
670
|
let t = e.indexOf("</head>"), n = t === -1 ? e : e.slice(0, t), r = [];
|
|
704
671
|
for (let e of n.matchAll(/<script\b([^>]*)>([\s\S]*?)<\/script>/gi)) {
|
|
705
672
|
let t = e[1] ?? "";
|
|
706
673
|
/\bsrc\s*=/.test(t) || /type\s*=\s*["']module["']/.test(t) || r.push(e[0]);
|
|
707
674
|
}
|
|
708
675
|
return r.map((e) => ` ${e}`).join("\n");
|
|
709
|
-
},
|
|
710
|
-
let n =
|
|
676
|
+
}, yn = (e) => [...e.matchAll(/<link\b[^>]*\brel\s*=\s*["']stylesheet["'][^>]*>/gi)].map((e) => e[0]), bn = (e, t) => {
|
|
677
|
+
let n = yn(t).filter((t) => !e.includes(t));
|
|
711
678
|
if (n.length === 0) return e;
|
|
712
679
|
let r = n.map((e) => ` ${e}`).join("\n");
|
|
713
680
|
return e.includes("</head>") ? e.replace("</head>", `${r}\n </head>`) : e + r;
|
|
714
|
-
},
|
|
681
|
+
}, xn = (e) => {
|
|
715
682
|
let t = e.replace(/[^a-zA-Z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
716
683
|
return t === "" ? "root" : t;
|
|
717
|
-
},
|
|
684
|
+
}, Sn = class extends Error {
|
|
718
685
|
constructor(e, t) {
|
|
719
686
|
let n = t.map(([e, t]) => ` ${e} imports '${t}'`).join("\n");
|
|
720
687
|
super(`interactive: 'islands' page '${e}' has island code importing the framework barrel:\n${n}\n\nAn island hydrates in its own provider-less root — router hooks, <Link> and useT() throw there, and the '@voltro/web' barrel additionally pulls the Effect runtime into the slim islands entry (the bytes this mode exists to shed).\n\nFix: import island()/hydration APIs from '@voltro/web/islands' (the react-only subpath), move router/i18n-dependent UI out of the island, and keep island files to react + relative browser-safe imports. '@voltro/client' IS allowed — a useSubscription island gets the client boot automatically.`), this.name = "IslandsEntryViolation";
|
|
721
688
|
}
|
|
722
|
-
},
|
|
723
|
-
let t =
|
|
689
|
+
}, Cn = async (e) => {
|
|
690
|
+
let t = N(e.webRoot, ".framework", "island-shells"), n = [];
|
|
724
691
|
if (e.pages.length === 0) return n;
|
|
725
|
-
await
|
|
692
|
+
await z.mkdir(t, { recursive: !0 });
|
|
726
693
|
for (let r of e.pages) {
|
|
727
|
-
let i = await
|
|
728
|
-
if (i.violations.length > 0) throw new
|
|
729
|
-
let a =
|
|
694
|
+
let i = await gn(e.webRoot, r.file);
|
|
695
|
+
if (i.violations.length > 0) throw new Sn(r.pattern, i.violations);
|
|
696
|
+
let a = xn(r.pattern), o = `island-shells/${a}.tsx`, s = `island-shells/${a}.html`, c = i.islandFiles.map((e) => `import '../../${e}'`).join("\n"), l = i.usesClient ? [
|
|
730
697
|
`// GENERATED by voltro — the islands entry for '${r.pattern}' (client boot:`,
|
|
731
698
|
"// an island here imports @voltro/client, so the roots get a live runtime).",
|
|
732
699
|
...e.apiImports ?? [],
|
|
@@ -762,7 +729,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
762
729
|
"</html>",
|
|
763
730
|
""
|
|
764
731
|
].join("\n");
|
|
765
|
-
await
|
|
732
|
+
await z.writeFile(N(t, `${a}.tsx`), l), await z.writeFile(N(t, `${a}.html`), u), n.push({
|
|
766
733
|
pattern: r.pattern,
|
|
767
734
|
name: a,
|
|
768
735
|
htmlFile: s,
|
|
@@ -771,13 +738,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
771
738
|
});
|
|
772
739
|
}
|
|
773
740
|
return n;
|
|
774
|
-
},
|
|
741
|
+
}, wn = W({ scope: "voltro:images" }), Tn = /[?&]image(?:&|$)/, En = /\.(png|jpe?g|webp|avif)(\?|$)/i, Dn = {
|
|
775
742
|
avif: "image/avif",
|
|
776
743
|
webp: "image/webp",
|
|
777
744
|
jpeg: "image/jpeg",
|
|
778
745
|
png: "image/png"
|
|
779
|
-
},
|
|
780
|
-
let t = e.config ??
|
|
746
|
+
}, On = (e) => J("sha256").update(e).digest("hex").slice(0, 12), kn = (e) => `export default ${JSON.stringify(e)}\n`, An = (e) => {
|
|
747
|
+
let t = e.config ?? k, n = x(e.root), r = /* @__PURE__ */ new Map(), i = "/", a = !1;
|
|
781
748
|
return {
|
|
782
749
|
name: "voltro:image-assets",
|
|
783
750
|
enforce: "pre",
|
|
@@ -785,20 +752,20 @@ __installPublicEnv(publicEnvValues)
|
|
|
785
752
|
i = e.base, a = e.command === "build";
|
|
786
753
|
},
|
|
787
754
|
async load(o) {
|
|
788
|
-
if (!
|
|
755
|
+
if (!Tn.test(o) || !En.test(o)) return null;
|
|
789
756
|
let s = o.split("?")[0], c = s, l = await E(c);
|
|
790
|
-
if (l === null && s.startsWith("/") && (c =
|
|
791
|
-
w(
|
|
757
|
+
if (l === null && s.startsWith("/") && (c = N(e.root, s.slice(1)), l = await E(c)), l === null && this.error(`?image import points at a file that does not exist or is unreadable: ${s}`), await S() === null) {
|
|
758
|
+
w(wn);
|
|
792
759
|
let t;
|
|
793
760
|
if (a || e.urlMode === "build-urls") {
|
|
794
|
-
let e = `assets/${
|
|
761
|
+
let e = `assets/${On(c)}${c.slice(c.lastIndexOf("."))}`;
|
|
795
762
|
a && this.emitFile({
|
|
796
763
|
type: "asset",
|
|
797
764
|
fileName: e,
|
|
798
765
|
source: Buffer.from(l)
|
|
799
766
|
}), t = `${i}${e}`;
|
|
800
767
|
} else t = `/@fs${c}`;
|
|
801
|
-
return
|
|
768
|
+
return kn({
|
|
802
769
|
src: t,
|
|
803
770
|
width: 0,
|
|
804
771
|
height: 0,
|
|
@@ -824,31 +791,31 @@ __installPublicEnv(publicEnvValues)
|
|
|
824
791
|
}), r.set(`${t.format}:${t.width}`, `${i}${n}`);
|
|
825
792
|
}
|
|
826
793
|
let o = (t) => e.widths.map((e) => `${r.get(`${t}:${e}`)} ${e}w`).join(", ");
|
|
827
|
-
return
|
|
794
|
+
return kn({
|
|
828
795
|
src: r.get(`${e.fallbackFormat}:${e.widths[e.widths.length - 1]}`),
|
|
829
796
|
width: e.width,
|
|
830
797
|
height: e.height,
|
|
831
798
|
blurDataURL: e.blurDataURL,
|
|
832
799
|
srcSet: o(e.fallbackFormat),
|
|
833
800
|
sources: t.formats.map((e) => ({
|
|
834
|
-
type:
|
|
801
|
+
type: Dn[e],
|
|
835
802
|
srcSet: o(e)
|
|
836
803
|
}))
|
|
837
804
|
});
|
|
838
805
|
}
|
|
839
|
-
let u = await
|
|
806
|
+
let u = await re(l);
|
|
840
807
|
u === null && this.error(`?image import is not a raster image sharp can read: ${c}`);
|
|
841
|
-
let d =
|
|
808
|
+
let d = J("sha256").update(l).digest("hex").slice(0, 16), f = await O(l, d, n), p = On(c);
|
|
842
809
|
r.set(p, c);
|
|
843
|
-
let m =
|
|
844
|
-
return
|
|
810
|
+
let m = D(u.width), h = u.format === "png" ? "png" : "jpeg", g = (e, t) => `/_voltro/image/${p}?w=${e}&f=${t}`, _ = (e) => m.map((t) => `${g(t, e)} ${t}w`).join(", ");
|
|
811
|
+
return kn({
|
|
845
812
|
src: g(m[m.length - 1], h),
|
|
846
813
|
width: u.width,
|
|
847
814
|
height: u.height,
|
|
848
815
|
blurDataURL: f ?? "",
|
|
849
816
|
srcSet: _(h),
|
|
850
817
|
sources: t.formats.map((e) => ({
|
|
851
|
-
type:
|
|
818
|
+
type: Dn[e],
|
|
852
819
|
srcSet: _(e)
|
|
853
820
|
}))
|
|
854
821
|
});
|
|
@@ -862,7 +829,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
862
829
|
return;
|
|
863
830
|
}
|
|
864
831
|
let c = Number(a.searchParams.get("w")), l = a.searchParams.get("f") ?? "";
|
|
865
|
-
if (!Number.isInteger(c) || c <= 0 || c > 8192 ||
|
|
832
|
+
if (!Number.isInteger(c) || c <= 0 || c > 8192 || Dn[l] === void 0) {
|
|
866
833
|
i.statusCode = 400, i.end("bad transform params");
|
|
867
834
|
return;
|
|
868
835
|
}
|
|
@@ -871,7 +838,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
871
838
|
i.statusCode = 404, i.end("source asset gone");
|
|
872
839
|
return;
|
|
873
840
|
}
|
|
874
|
-
let d =
|
|
841
|
+
let d = J("sha256").update(u).digest("hex").slice(0, 16), f = await C({
|
|
875
842
|
sourceBytes: u,
|
|
876
843
|
sourceHash: d,
|
|
877
844
|
width: c,
|
|
@@ -880,99 +847,139 @@ __installPublicEnv(publicEnvValues)
|
|
|
880
847
|
cacheDir: n
|
|
881
848
|
});
|
|
882
849
|
if (f === null) {
|
|
883
|
-
w(
|
|
850
|
+
w(wn), i.statusCode = 200, i.setHeader("content-type", Dn[l] ?? "application/octet-stream"), i.end(Buffer.from(u));
|
|
884
851
|
return;
|
|
885
852
|
}
|
|
886
|
-
i.statusCode = 200, i.setHeader("content-type",
|
|
853
|
+
i.statusCode = 200, i.setHeader("content-type", Dn[l]), i.setHeader("cache-control", "max-age=31536000, immutable"), i.end(Buffer.from(f));
|
|
887
854
|
})().catch((e) => {
|
|
888
|
-
|
|
855
|
+
wn.warn("image transform failed", {}, e), a();
|
|
889
856
|
});
|
|
890
857
|
});
|
|
891
858
|
}
|
|
892
859
|
};
|
|
893
|
-
},
|
|
860
|
+
}, jn = W({ scope: "voltro:fonts" }), Mn = /* @__PURE__ */ new Map(), Nn = async (e, t) => {
|
|
894
861
|
if (t === void 0 || t.length === 0) return null;
|
|
895
|
-
let n =
|
|
896
|
-
return n === void 0 && (n =
|
|
897
|
-
for (let t of e.warnings)
|
|
862
|
+
let n = Mn.get(e);
|
|
863
|
+
return n === void 0 && (n = j(t, async (t) => new Uint8Array(await Fe(N(e, t)))).then((e) => {
|
|
864
|
+
for (let t of e.warnings) A(t, jn);
|
|
898
865
|
return e;
|
|
899
|
-
}),
|
|
900
|
-
},
|
|
866
|
+
}), Mn.set(e, n)), n;
|
|
867
|
+
}, Pn = {
|
|
901
868
|
woff2: "font/woff2",
|
|
902
869
|
woff: "font/woff",
|
|
903
870
|
otf: "font/otf",
|
|
904
871
|
ttf: "font/ttf"
|
|
905
|
-
},
|
|
872
|
+
}, Fn = (e, t) => ({
|
|
906
873
|
name: "voltro:font-assets",
|
|
907
874
|
configureServer(n) {
|
|
908
875
|
n.middlewares.use("/assets/fonts", (n, r, i) => {
|
|
909
876
|
(async () => {
|
|
910
|
-
let a = await
|
|
877
|
+
let a = await Nn(e, t), o = (n.url ?? "/").replace(/^\//, "").split("?")[0], s = a?.files.find((e) => e.fileName === `assets/fonts/${o}`);
|
|
911
878
|
if (s === void 0) {
|
|
912
879
|
i();
|
|
913
880
|
return;
|
|
914
881
|
}
|
|
915
882
|
let c = o.slice(o.lastIndexOf(".") + 1);
|
|
916
|
-
r.statusCode = 200, r.setHeader("content-type",
|
|
883
|
+
r.statusCode = 200, r.setHeader("content-type", Pn[c] ?? "application/octet-stream"), r.setHeader("cache-control", "max-age=31536000, immutable"), r.end(Buffer.from(s.bytes));
|
|
917
884
|
})().catch(() => i());
|
|
918
885
|
});
|
|
919
886
|
}
|
|
920
|
-
}),
|
|
921
|
-
|
|
922
|
-
},
|
|
923
|
-
let
|
|
924
|
-
return
|
|
887
|
+
}), In = W({ scope: "voltro:content" }), Ln = (e) => {
|
|
888
|
+
et(e);
|
|
889
|
+
}, Rn = (e, t) => `/assets/content-media/${e}${t}`, zn = "assets/content-media", Bn = (e) => {
|
|
890
|
+
let t = /* @__PURE__ */ new Map(), n = [];
|
|
891
|
+
return $e(({ src: r, entryFile: i }) => {
|
|
892
|
+
let [a = "", o = ""] = Wn(r), s = F(M(i), decodeURIComponent(a)), c = t.get(s);
|
|
893
|
+
if (c !== void 0) return c + o;
|
|
894
|
+
if (!L(s)) {
|
|
895
|
+
let e = P(process.cwd(), s);
|
|
896
|
+
return n.includes(e) || n.push(e), r;
|
|
897
|
+
}
|
|
898
|
+
let l = B(s), u = J("sha256").update(l).digest("hex").slice(0, 16), d = de(s).toLowerCase(), f = Rn(u, d), p = N(e, zn, `${u}${d}`);
|
|
899
|
+
return R(M(p), { recursive: !0 }), he(p, l), t.set(s, f), f + o;
|
|
900
|
+
}), { missing: n };
|
|
901
|
+
}, Vn = () => {
|
|
902
|
+
$e(({ src: e, entryFile: t }) => {
|
|
903
|
+
let [n = "", r = ""] = Wn(e), i = F(M(t), decodeURIComponent(n));
|
|
904
|
+
if (!L(i)) return e;
|
|
905
|
+
let a = B(i), o = J("sha256").update(a).digest("hex").slice(0, 16);
|
|
906
|
+
return Hn.set(o, i), Rn(o, de(i).toLowerCase()) + r;
|
|
907
|
+
});
|
|
908
|
+
}, Hn = /* @__PURE__ */ new Map(), Un = (e) => {
|
|
909
|
+
let t = /^\/assets\/content-media\/([0-9a-f]{16})(\.[a-z0-9]+)$/i.exec(e);
|
|
910
|
+
if (t === null) return null;
|
|
911
|
+
let n = Hn.get(t[1].toLowerCase());
|
|
912
|
+
return n === void 0 || !L(n) ? null : {
|
|
913
|
+
bytes: B(n),
|
|
914
|
+
contentType: Kn(t[2])
|
|
915
|
+
};
|
|
916
|
+
}, Wn = (e) => {
|
|
917
|
+
let t = e.search(/[?#]/);
|
|
918
|
+
return t === -1 ? [e, ""] : [e.slice(0, t), e.slice(t)];
|
|
919
|
+
}, Gn = {
|
|
920
|
+
".png": "image/png",
|
|
921
|
+
".jpg": "image/jpeg",
|
|
922
|
+
".jpeg": "image/jpeg",
|
|
923
|
+
".gif": "image/gif",
|
|
924
|
+
".svg": "image/svg+xml",
|
|
925
|
+
".webp": "image/webp",
|
|
926
|
+
".avif": "image/avif",
|
|
927
|
+
".ico": "image/x-icon"
|
|
928
|
+
}, Kn = (e) => Gn[e.toLowerCase()] ?? "application/octet-stream", qn = async (e, t) => {
|
|
929
|
+
let n = await Ye(e.collection, e.locale === void 0 ? {} : { locale: e.locale });
|
|
930
|
+
return qe(n, {
|
|
925
931
|
title: e.title,
|
|
926
932
|
siteUrl: t,
|
|
927
933
|
...e.description === void 0 ? {} : { description: e.description },
|
|
928
934
|
feedPath: e.path,
|
|
929
935
|
item: e.item
|
|
930
936
|
});
|
|
931
|
-
},
|
|
937
|
+
}, Jn = async (e, t, n) => {
|
|
932
938
|
if (t.length !== 0) {
|
|
933
939
|
if (n === void 0 || n === "") throw Error("config.feeds needs seo.siteUrl — RSS links must be absolute. Set seo: { siteUrl } in app.config.ts.");
|
|
934
940
|
for (let r of t) {
|
|
935
|
-
let t = await
|
|
936
|
-
await
|
|
941
|
+
let t = await qn(r, n), i = N(e, r.path.replace(/^\/+/, ""));
|
|
942
|
+
await K(M(i), { recursive: !0 }), await q(i, t), In.info(`feed: ${r.path} (${r.collection})`);
|
|
937
943
|
}
|
|
938
944
|
}
|
|
939
|
-
},
|
|
940
|
-
let n = await
|
|
945
|
+
}, Yn = async (e, t) => {
|
|
946
|
+
let n = await Ye(e, t === void 0 ? {} : { locale: t });
|
|
941
947
|
return JSON.stringify(n.map(({ html: e, body: t, headings: n, ...r }) => r));
|
|
942
|
-
},
|
|
943
|
-
let r = await
|
|
948
|
+
}, Xn = async (e, t, n) => {
|
|
949
|
+
let r = await Xe(e, t, n === void 0 ? {} : { locale: n });
|
|
944
950
|
if (r === null) return null;
|
|
945
951
|
let { body: i, ...a } = r;
|
|
946
952
|
return JSON.stringify(a);
|
|
947
|
-
},
|
|
948
|
-
await
|
|
949
|
-
let t = 0;
|
|
950
|
-
for (let
|
|
951
|
-
let r =
|
|
953
|
+
}, Zn = async (e) => {
|
|
954
|
+
await tt();
|
|
955
|
+
let t = Bn(e), n = 0;
|
|
956
|
+
for (let t of Qe()) {
|
|
957
|
+
let r = t.i18n?.locales ?? [void 0];
|
|
952
958
|
for (let i of r) {
|
|
953
|
-
let r = await
|
|
954
|
-
await
|
|
959
|
+
let r = await Yn(t.name, i), a = N(e, Je(t.name, i));
|
|
960
|
+
await K(M(a), { recursive: !0 }), await q(a, r), n += 1;
|
|
955
961
|
let o = JSON.parse(r);
|
|
956
962
|
for (let { slug: r } of o) {
|
|
957
|
-
let a = await
|
|
963
|
+
let a = await Xn(t.name, r, i);
|
|
958
964
|
if (a === null) continue;
|
|
959
|
-
let o =
|
|
960
|
-
await
|
|
965
|
+
let o = N(e, Je(t.name, i, r));
|
|
966
|
+
await K(M(o), { recursive: !0 }), await q(o, a), n += 1;
|
|
961
967
|
}
|
|
962
968
|
}
|
|
963
969
|
}
|
|
964
|
-
|
|
965
|
-
|
|
970
|
+
if (t.missing.length > 0) throw Error(`content: ${t.missing.length} image reference(s) in markdown point at files that do not exist:\n` + t.missing.map((e) => ` - ${e}`).join("\n") + "\n\nA relative image is resolved against the markdown file that references it. Fix the path, or use an absolute `/…` src for an asset you serve yourself.");
|
|
971
|
+
return n > 0 && In.info(`content: ${n} artifact(s) into dist/assets/content`), n;
|
|
972
|
+
}, Qn = async (e) => {
|
|
966
973
|
let t = /^\/assets\/content\/([A-Za-z0-9_-]+)(?:\.([A-Za-z0-9-]+))?\/(.+)$/.exec(e);
|
|
967
974
|
if (t === null) return null;
|
|
968
975
|
let [, n, r, i] = t;
|
|
969
|
-
if (
|
|
976
|
+
if (Qe().every((e) => e.name !== n)) return null;
|
|
970
977
|
try {
|
|
971
978
|
if (i === "index.json") return {
|
|
972
979
|
status: 200,
|
|
973
|
-
body: await
|
|
980
|
+
body: await Yn(n, r)
|
|
974
981
|
};
|
|
975
|
-
let e = await
|
|
982
|
+
let e = await Xn(n, i.replace(/\.json$/, ""), r);
|
|
976
983
|
return e === null ? {
|
|
977
984
|
status: 404,
|
|
978
985
|
body: "\"not found\""
|
|
@@ -981,12 +988,12 @@ __installPublicEnv(publicEnvValues)
|
|
|
981
988
|
body: e
|
|
982
989
|
};
|
|
983
990
|
} catch (t) {
|
|
984
|
-
return
|
|
991
|
+
return In.warn("content request failed", { pathname: e }, t), {
|
|
985
992
|
status: 500,
|
|
986
993
|
body: "\"content error\""
|
|
987
994
|
};
|
|
988
995
|
}
|
|
989
|
-
},
|
|
996
|
+
}, $n = async (e) => {
|
|
990
997
|
let { readdir: t } = await import("node:fs/promises"), n = [], r;
|
|
991
998
|
try {
|
|
992
999
|
r = await t(e, { withFileTypes: !0 });
|
|
@@ -995,36 +1002,44 @@ __installPublicEnv(publicEnvValues)
|
|
|
995
1002
|
}
|
|
996
1003
|
for (let t of r) {
|
|
997
1004
|
if (t.name.startsWith(".") || t.name === "node_modules") continue;
|
|
998
|
-
let r =
|
|
999
|
-
t.isDirectory() ? n.push(...await
|
|
1005
|
+
let r = N(e, t.name);
|
|
1006
|
+
t.isDirectory() ? n.push(...await $n(r)) : /\.collection\.tsx?$/.test(t.name) && n.push(r);
|
|
1000
1007
|
}
|
|
1001
1008
|
return n;
|
|
1002
|
-
},
|
|
1009
|
+
}, er = (e, t = [], n) => ({
|
|
1003
1010
|
name: "voltro:content",
|
|
1004
1011
|
configureServer(r) {
|
|
1012
|
+
Vn(), r.middlewares.use("/assets/content-media", (e, t, n) => {
|
|
1013
|
+
let r = Un(`/assets/content-media${(e.url ?? "/").split("?")[0]}`);
|
|
1014
|
+
if (r === null) {
|
|
1015
|
+
n();
|
|
1016
|
+
return;
|
|
1017
|
+
}
|
|
1018
|
+
t.setHeader("content-type", r.contentType), t.end(r.bytes);
|
|
1019
|
+
});
|
|
1005
1020
|
let i = null, a = () => (i ??= (async () => {
|
|
1006
|
-
for (let t of await
|
|
1021
|
+
for (let t of await $n(N(e, "src"))) try {
|
|
1007
1022
|
await r.ssrLoadModule(t);
|
|
1008
1023
|
} catch (e) {
|
|
1009
|
-
|
|
1024
|
+
In.warn("failed to load collection module", { file: t }, e);
|
|
1010
1025
|
}
|
|
1011
1026
|
})(), i);
|
|
1012
|
-
r.watcher.add(
|
|
1013
|
-
typeof n == "string" && n.startsWith(
|
|
1027
|
+
r.watcher.add(N(e, "content")), r.watcher.on("all", (t, n) => {
|
|
1028
|
+
typeof n == "string" && n.startsWith(N(e, "content")) && (Ze(), r.ws.send({ type: "full-reload" }));
|
|
1014
1029
|
});
|
|
1015
1030
|
for (let e of t) r.middlewares.use(e.path, (t, r) => {
|
|
1016
1031
|
(async () => {
|
|
1017
1032
|
await a();
|
|
1018
|
-
let t = await
|
|
1033
|
+
let t = await qn(e, n ?? "http://localhost");
|
|
1019
1034
|
r.setHeader("content-type", "application/rss+xml"), r.end(t);
|
|
1020
1035
|
})().catch((t) => {
|
|
1021
|
-
|
|
1036
|
+
In.warn("feed render failed", { path: e.path }, t), r.statusCode = 500, r.end("feed error");
|
|
1022
1037
|
});
|
|
1023
1038
|
});
|
|
1024
1039
|
r.middlewares.use("/assets/content", (e, t, n) => {
|
|
1025
1040
|
(async () => {
|
|
1026
1041
|
await a();
|
|
1027
|
-
let r = await
|
|
1042
|
+
let r = await Qn(`/assets/content${(e.url ?? "/").split("?")[0]}`);
|
|
1028
1043
|
if (r === null) {
|
|
1029
1044
|
n();
|
|
1030
1045
|
return;
|
|
@@ -1033,28 +1048,28 @@ __installPublicEnv(publicEnvValues)
|
|
|
1033
1048
|
})().catch(() => n());
|
|
1034
1049
|
});
|
|
1035
1050
|
}
|
|
1036
|
-
}),
|
|
1037
|
-
if (
|
|
1051
|
+
}), tr, nr = async () => {
|
|
1052
|
+
if (tr !== void 0) return tr;
|
|
1038
1053
|
try {
|
|
1039
1054
|
let e = await import("satori");
|
|
1040
|
-
|
|
1055
|
+
tr = e.default ?? e;
|
|
1041
1056
|
} catch {
|
|
1042
|
-
|
|
1057
|
+
tr = null;
|
|
1043
1058
|
}
|
|
1044
|
-
return
|
|
1045
|
-
},
|
|
1046
|
-
if (
|
|
1059
|
+
return tr;
|
|
1060
|
+
}, rr, ir = async () => {
|
|
1061
|
+
if (rr !== void 0) return rr;
|
|
1047
1062
|
try {
|
|
1048
|
-
|
|
1063
|
+
rr = await import("@resvg/resvg-js");
|
|
1049
1064
|
} catch {
|
|
1050
|
-
|
|
1065
|
+
rr = null;
|
|
1051
1066
|
}
|
|
1052
|
-
return
|
|
1053
|
-
},
|
|
1067
|
+
return rr;
|
|
1068
|
+
}, ar = async (e, t) => {
|
|
1054
1069
|
if (t === void 0 || t.length === 0) throw Error("ogImage needs a declared font: satori cannot render text without a font buffer, and there is no bundled default (that would ship a license artifact most projects replace). Declare one in app.config.ts — fonts: [{ family: 'Inter', src: [{ path: 'src/fonts/Inter.woff2' }] }] — see the Fonts docs.");
|
|
1055
1070
|
let n = [];
|
|
1056
1071
|
for (let r of t) for (let t of r.src) {
|
|
1057
|
-
let i = await
|
|
1072
|
+
let i = await Fe(N(e, t.path)), a = typeof t.weight == "number" ? t.weight : void 0;
|
|
1058
1073
|
n.push({
|
|
1059
1074
|
name: r.family,
|
|
1060
1075
|
data: i.buffer.slice(i.byteOffset, i.byteOffset + i.byteLength),
|
|
@@ -1063,8 +1078,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
1063
1078
|
});
|
|
1064
1079
|
}
|
|
1065
1080
|
return n;
|
|
1066
|
-
},
|
|
1067
|
-
let t = await
|
|
1081
|
+
}, or = async (e) => {
|
|
1082
|
+
let t = await nr(), n = await ir();
|
|
1068
1083
|
if (t === null || n === null) {
|
|
1069
1084
|
let e = [t === null ? "satori" : null, n === null ? "@resvg/resvg-js" : null].filter((e) => e !== null).join(" + ");
|
|
1070
1085
|
throw Error(`ogImage cannot render: ${e} is not loadable. Both ship as optional dependencies of @voltro/cli — if your installer omitted optional dependencies, run \`pnpm add -D satori @resvg/resvg-js\` in this app.`);
|
|
@@ -1081,21 +1096,21 @@ __installPublicEnv(publicEnvValues)
|
|
|
1081
1096
|
svg: r,
|
|
1082
1097
|
png: new Uint8Array(new n.Resvg(r).render().asPng())
|
|
1083
1098
|
};
|
|
1084
|
-
},
|
|
1099
|
+
}, sr = (e, t, n, r) => `${e}\u0000${t}\u0000${n}\u0000${r}`, cr = (e, t) => Ie("sha256", e).update(t).digest("hex"), lr = () => {
|
|
1085
1100
|
let e = process.env.VOLTRO_OG_SECRET;
|
|
1086
1101
|
return e !== void 0 && e !== "" ? {
|
|
1087
1102
|
secret: e,
|
|
1088
1103
|
fromEnv: !0
|
|
1089
1104
|
} : {
|
|
1090
|
-
secret:
|
|
1105
|
+
secret: Le(32).toString("hex"),
|
|
1091
1106
|
fromEnv: !1
|
|
1092
1107
|
};
|
|
1093
|
-
},
|
|
1094
|
-
let t = e.ttlMs ?? 36e5, n, r = () => (n ??=
|
|
1108
|
+
}, ur = "/_voltro/og", dr = (e) => {
|
|
1109
|
+
let t = e.ttlMs ?? 36e5, n, r = () => (n ??= ar(e.root, e.fonts), n);
|
|
1095
1110
|
return {
|
|
1096
1111
|
signOgUrl: ({ pattern: t, params: n, tenant: r, locale: i }) => {
|
|
1097
|
-
let a = JSON.stringify(n), o = r ?? "", s = i ?? "", c =
|
|
1098
|
-
return `${
|
|
1112
|
+
let a = JSON.stringify(n), o = r ?? "", s = i ?? "", c = cr(e.secret, sr(t, a, o, s));
|
|
1113
|
+
return `${ur}?${new URLSearchParams({
|
|
1099
1114
|
route: t,
|
|
1100
1115
|
p: a,
|
|
1101
1116
|
...o === "" ? {} : { t: o },
|
|
@@ -1105,8 +1120,8 @@ __installPublicEnv(publicEnvValues)
|
|
|
1105
1120
|
},
|
|
1106
1121
|
handle: async (n) => {
|
|
1107
1122
|
if (n.pathname !== "/_voltro/og") return null;
|
|
1108
|
-
let i = n.searchParams.get("route") ?? "", a = n.searchParams.get("p") ?? "{}", o = n.searchParams.get("t") ?? "", s = n.searchParams.get("l") ?? "", c = n.searchParams.get("sig") ?? "", l =
|
|
1109
|
-
if (u.length !== d.length || !
|
|
1123
|
+
let i = n.searchParams.get("route") ?? "", a = n.searchParams.get("p") ?? "{}", o = n.searchParams.get("t") ?? "", s = n.searchParams.get("l") ?? "", c = n.searchParams.get("sig") ?? "", l = cr(e.secret, sr(i, a, o, s)), u = Buffer.from(c, "utf8"), d = Buffer.from(l, "utf8");
|
|
1124
|
+
if (u.length !== d.length || !Re(u, d)) return {
|
|
1110
1125
|
status: 403,
|
|
1111
1126
|
headers: { "content-type": "text/plain" },
|
|
1112
1127
|
body: new TextEncoder().encode("bad signature")
|
|
@@ -1131,7 +1146,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1131
1146
|
headers: { "content-type": "text/plain" },
|
|
1132
1147
|
body: new TextEncoder().encode("page has no ogImage")
|
|
1133
1148
|
};
|
|
1134
|
-
let { png: g } = await
|
|
1149
|
+
let { png: g } = await or({
|
|
1135
1150
|
element: await h({
|
|
1136
1151
|
params: JSON.parse(a),
|
|
1137
1152
|
loaderData: void 0,
|
|
@@ -1157,112 +1172,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1157
1172
|
};
|
|
1158
1173
|
}
|
|
1159
1174
|
};
|
|
1160
|
-
},
|
|
1161
|
-
_voltroDeferral = !0;
|
|
1162
|
-
constructor(e) {
|
|
1163
|
-
super(e), this.name = "DeferralNotSupportedError";
|
|
1164
|
-
}
|
|
1165
|
-
}, Zn = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Qn = (e) => {
|
|
1166
|
-
if (!(e instanceof Error)) return;
|
|
1167
|
-
let t = e._voltroControl;
|
|
1168
|
-
if (t === "redirect") {
|
|
1169
|
-
let { location: t, status: n } = e;
|
|
1170
|
-
return typeof t == "string" ? {
|
|
1171
|
-
status: n === 307 || n === 308 ? n : 303,
|
|
1172
|
-
headers: {
|
|
1173
|
-
location: t,
|
|
1174
|
-
"x-voltro-rendered-by": "loader-redirect"
|
|
1175
|
-
},
|
|
1176
|
-
body: ""
|
|
1177
|
-
} : void 0;
|
|
1178
|
-
}
|
|
1179
|
-
if (t === "not-found") return {
|
|
1180
|
-
status: 404,
|
|
1181
|
-
headers: {
|
|
1182
|
-
"content-type": "text/plain; charset=utf-8",
|
|
1183
|
-
"x-voltro-rendered-by": "loader-not-found"
|
|
1184
|
-
},
|
|
1185
|
-
body: "not found"
|
|
1186
|
-
};
|
|
1187
|
-
}, $n = (e) => {
|
|
1188
|
-
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
1189
|
-
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
1190
|
-
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
1191
|
-
r[e] = s.renderData, i[e] = s.stateData, s.deferredIds && (a[e] = s.deferredIds);
|
|
1192
|
-
}
|
|
1193
|
-
let o = n.deferredIds !== void 0 || Object.keys(a).length > 0;
|
|
1194
|
-
if (o) try {
|
|
1195
|
-
t.assertDeferralSupported({
|
|
1196
|
-
page: e.page,
|
|
1197
|
-
renderMode: e.renderMode,
|
|
1198
|
-
interactive: e.interactive,
|
|
1199
|
-
...e.layoutShell ? { layoutShell: e.layoutShell } : {},
|
|
1200
|
-
...e.ppr === !0 ? { ppr: !0 } : {}
|
|
1201
|
-
});
|
|
1202
|
-
} catch (e) {
|
|
1203
|
-
throw new Xn(e instanceof Error ? e.message : String(e));
|
|
1204
|
-
}
|
|
1205
|
-
return {
|
|
1206
|
-
loaderData: n.renderData,
|
|
1207
|
-
segmentLoaderData: r,
|
|
1208
|
-
hasDeferred: o,
|
|
1209
|
-
stateInput: {
|
|
1210
|
-
path: e.pathname,
|
|
1211
|
-
loaderData: n.stateData,
|
|
1212
|
-
segmentLoaderData: i,
|
|
1213
|
-
pageLoaderRan: e.pageLoaderRan,
|
|
1214
|
-
...e.layoutShell ? { pageClientOnly: !0 } : {},
|
|
1215
|
-
...n.deferredIds ? { deferredPageIds: n.deferredIds } : {},
|
|
1216
|
-
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
1217
|
-
}
|
|
1218
|
-
};
|
|
1219
|
-
}, er = (e) => {
|
|
1220
|
-
let { helpers: t, renderInput: n } = e, r = $n({
|
|
1221
|
-
helpers: t,
|
|
1222
|
-
page: e.page,
|
|
1223
|
-
pathname: n.pathname,
|
|
1224
|
-
renderMode: "spa",
|
|
1225
|
-
interactive: e.interactive,
|
|
1226
|
-
loaderData: null,
|
|
1227
|
-
segmentLoaderData: n.segmentLoaderData ?? {},
|
|
1228
|
-
pageLoaderRan: !1,
|
|
1229
|
-
layoutShell: e.delivery
|
|
1230
|
-
});
|
|
1231
|
-
return {
|
|
1232
|
-
renderInput: {
|
|
1233
|
-
...n,
|
|
1234
|
-
pageSlot: !0,
|
|
1235
|
-
loaderData: null,
|
|
1236
|
-
segmentLoaderData: r.segmentLoaderData
|
|
1237
|
-
},
|
|
1238
|
-
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
1239
|
-
hasDeferred: r.hasDeferred
|
|
1240
|
-
};
|
|
1241
|
-
}, tr = (e) => {
|
|
1242
|
-
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
1243
|
-
return {
|
|
1244
|
-
body: t,
|
|
1245
|
-
meta: n
|
|
1246
|
-
};
|
|
1247
|
-
}, nr = (e) => [
|
|
1248
|
-
...e.extra ?? [],
|
|
1249
|
-
e.helpers.renderMetaToHtml(e.meta),
|
|
1250
|
-
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
1251
|
-
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
1252
|
-
e.prepared.stateScript
|
|
1253
|
-
].filter((e) => e.length > 0).join("\n "), rr = (e, t) => {
|
|
1254
|
-
let n = t.replace(/[^A-Za-z0-9+/=_-]/g, "");
|
|
1255
|
-
return e.replace(/<script(?![^>]*\bnonce=)/gi, `<script nonce="${n}"`);
|
|
1256
|
-
}, ir = (e) => {
|
|
1257
|
-
let t = e.indexOf("?");
|
|
1258
|
-
return t === -1 ? {
|
|
1259
|
-
pathname: e || "/",
|
|
1260
|
-
search: ""
|
|
1261
|
-
} : {
|
|
1262
|
-
pathname: e.slice(0, t) || "/",
|
|
1263
|
-
search: e.slice(t)
|
|
1264
|
-
};
|
|
1265
|
-
}, ar = (e) => {
|
|
1175
|
+
}, fr = (e) => {
|
|
1266
1176
|
let t = [];
|
|
1267
1177
|
for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
|
|
1268
1178
|
name: n.slice(5, -2),
|
|
@@ -1278,12 +1188,12 @@ __installPublicEnv(publicEnvValues)
|
|
|
1278
1188
|
optional: !1
|
|
1279
1189
|
});
|
|
1280
1190
|
return t;
|
|
1281
|
-
},
|
|
1282
|
-
let t =
|
|
1191
|
+
}, pr = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), mr = async (e) => {
|
|
1192
|
+
let t = F(e);
|
|
1283
1193
|
for (let e = 0; e < 4; e++) {
|
|
1284
|
-
let e =
|
|
1285
|
-
if (
|
|
1286
|
-
let n = await
|
|
1194
|
+
let e = N(t, "project.json");
|
|
1195
|
+
if (L(e)) try {
|
|
1196
|
+
let n = await z.readFile(e, "utf8");
|
|
1287
1197
|
return {
|
|
1288
1198
|
projectDir: t,
|
|
1289
1199
|
manifest: JSON.parse(n)
|
|
@@ -1291,38 +1201,38 @@ __installPublicEnv(publicEnvValues)
|
|
|
1291
1201
|
} catch {
|
|
1292
1202
|
return null;
|
|
1293
1203
|
}
|
|
1294
|
-
let n =
|
|
1204
|
+
let n = M(t);
|
|
1295
1205
|
if (n === t) break;
|
|
1296
1206
|
t = n;
|
|
1297
1207
|
}
|
|
1298
1208
|
return null;
|
|
1299
|
-
},
|
|
1300
|
-
let t = await
|
|
1209
|
+
}, hr = async (e) => {
|
|
1210
|
+
let t = await mr(e);
|
|
1301
1211
|
if (!t) return [];
|
|
1302
|
-
let { projectDir: n, manifest: r } = t, i =
|
|
1212
|
+
let { projectDir: n, manifest: r } = t, i = ue(e), a = r.apps ?? {}, o = [];
|
|
1303
1213
|
for (let [e, t] of Object.entries(a)) {
|
|
1304
1214
|
if (e === i || t.kind !== "web" || typeof t.port != "number") continue;
|
|
1305
|
-
let r =
|
|
1306
|
-
if (!
|
|
1215
|
+
let r = N(n, t.path ?? e), a = N(r, "src", "pages");
|
|
1216
|
+
if (!L(a)) continue;
|
|
1307
1217
|
let s;
|
|
1308
1218
|
try {
|
|
1309
|
-
let { pages: e } = await
|
|
1219
|
+
let { pages: e } = await Mo(a);
|
|
1310
1220
|
s = e.map((e) => ({
|
|
1311
1221
|
pattern: e.pattern,
|
|
1312
|
-
params:
|
|
1222
|
+
params: fr(e.pattern)
|
|
1313
1223
|
}));
|
|
1314
1224
|
} catch {
|
|
1315
1225
|
continue;
|
|
1316
1226
|
}
|
|
1317
1227
|
o.push({
|
|
1318
|
-
key:
|
|
1228
|
+
key: pr(e),
|
|
1319
1229
|
origin: `http://localhost:${t.port}`,
|
|
1320
1230
|
...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
|
|
1321
1231
|
routes: s
|
|
1322
1232
|
});
|
|
1323
1233
|
}
|
|
1324
1234
|
return o;
|
|
1325
|
-
},
|
|
1235
|
+
}, gr = (e) => {
|
|
1326
1236
|
if (e.params.length === 0) return `'${e.pattern}'`;
|
|
1327
1237
|
let t = e.pattern;
|
|
1328
1238
|
for (let n of e.params) {
|
|
@@ -1330,21 +1240,21 @@ __installPublicEnv(publicEnvValues)
|
|
|
1330
1240
|
t = t.replace(e, r);
|
|
1331
1241
|
}
|
|
1332
1242
|
return "`" + t + "`";
|
|
1333
|
-
},
|
|
1243
|
+
}, _r = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
|
|
1334
1244
|
let t = "string";
|
|
1335
1245
|
return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
|
|
1336
|
-
}).join("; ")} }`,
|
|
1337
|
-
let r =
|
|
1246
|
+
}).join("; ")} }`, vr = (e, t, n) => {
|
|
1247
|
+
let r = _r(e), i = gr(e), a = t ? "VoltroExternalUrl" : e.search === void 0 ? "VoltroRouteUrl" : `VoltroRouteUrl<Schema.Schema.Type<typeof ${e.search.alias}>>`, o = t && n ? `${n} + ` : "";
|
|
1338
1248
|
return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
|
|
1339
|
-
},
|
|
1249
|
+
}, yr = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${vr(e, !1)},`).join("\n")}\n}`, br = (e, t) => {
|
|
1340
1250
|
if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
|
|
1341
|
-
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)}: ${
|
|
1251
|
+
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)}: ${vr(e, !0, i)},`);
|
|
1342
1252
|
return ` ${e.key}: {\n${a.join("\n")}\n },`;
|
|
1343
|
-
},
|
|
1253
|
+
}, xr = async (e) => {
|
|
1344
1254
|
let t = await Promise.all(e.pages.map(async (t) => {
|
|
1345
1255
|
let n;
|
|
1346
1256
|
try {
|
|
1347
|
-
let r = await
|
|
1257
|
+
let r = await z.readFile(N(e.appRoot, "src", "pages", t.file), "utf8");
|
|
1348
1258
|
/^export const searchParams\b/m.test(r) && (n = {
|
|
1349
1259
|
alias: `SP_${t.ident}`,
|
|
1350
1260
|
specifier: `../src/pages/${t.file.replace(/\.tsx?$/, "")}`
|
|
@@ -1352,10 +1262,10 @@ __installPublicEnv(publicEnvValues)
|
|
|
1352
1262
|
} catch {}
|
|
1353
1263
|
return {
|
|
1354
1264
|
pattern: t.pattern,
|
|
1355
|
-
params:
|
|
1265
|
+
params: fr(t.pattern),
|
|
1356
1266
|
...n === void 0 ? {} : { search: n }
|
|
1357
1267
|
};
|
|
1358
|
-
})), n = await
|
|
1268
|
+
})), n = await hr(e.appRoot), r = t.filter((e) => e.search !== void 0).sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => `import type { searchParams as ${e.search.alias} } from '${e.search.specifier}'`), i = [
|
|
1359
1269
|
"// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
|
|
1360
1270
|
"// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
|
|
1361
1271
|
"// Type-safe route builders consumed by <Link to={...}>.",
|
|
@@ -1371,50 +1281,50 @@ __installPublicEnv(publicEnvValues)
|
|
|
1371
1281
|
"",
|
|
1372
1282
|
"type EmptyParams = Record<string, never>",
|
|
1373
1283
|
""
|
|
1374
|
-
].join("\n"), a = e.mode ?? "dev", o = `${i}\n${`export const routes = ${
|
|
1375
|
-
await
|
|
1284
|
+
].join("\n"), a = e.mode ?? "dev", o = `${i}\n${`export const routes = ${yr(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => br(e, a)).join("\n")}\n} as const\n`}`, s = N(e.appRoot, ".framework", "routes.generated.ts");
|
|
1285
|
+
await z.mkdir(M(s), { recursive: !0 });
|
|
1376
1286
|
let c = null;
|
|
1377
1287
|
try {
|
|
1378
|
-
c = await
|
|
1288
|
+
c = await z.readFile(s, "utf8");
|
|
1379
1289
|
} catch {}
|
|
1380
1290
|
return c === o ? {
|
|
1381
1291
|
path: s,
|
|
1382
1292
|
wrote: !1
|
|
1383
|
-
} : (await
|
|
1293
|
+
} : (await z.writeFile(s, o, "utf8"), {
|
|
1384
1294
|
path: s,
|
|
1385
1295
|
wrote: !0
|
|
1386
1296
|
});
|
|
1387
|
-
},
|
|
1297
|
+
}, Sr = (e) => {
|
|
1388
1298
|
if (e === "" || e === "/") return "/";
|
|
1389
1299
|
let t = e.startsWith("/") ? e : `/${e}`;
|
|
1390
1300
|
return t.endsWith("/") ? t.slice(0, -1) : t;
|
|
1391
|
-
},
|
|
1392
|
-
let n = e.endsWith("/") ? e.slice(0, -1) : e, r =
|
|
1301
|
+
}, Cr = (e, t) => {
|
|
1302
|
+
let n = e.endsWith("/") ? e.slice(0, -1) : e, r = Sr(t);
|
|
1393
1303
|
return r === "/" ? `${n}/` : `${n}${r}`;
|
|
1394
|
-
},
|
|
1395
|
-
let r =
|
|
1304
|
+
}, wr = (e, t, n) => {
|
|
1305
|
+
let r = Sr(e);
|
|
1396
1306
|
return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
|
|
1397
|
-
},
|
|
1307
|
+
}, Tr = (e) => e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"), Er = (e) => {
|
|
1398
1308
|
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) => {
|
|
1399
1309
|
if (!r) return "";
|
|
1400
|
-
let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${
|
|
1401
|
-
return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${
|
|
1310
|
+
let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${Tr(n)}" href="${Tr(Cr(t, wr(e, n, i)))}" />`);
|
|
1311
|
+
return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${Tr(Cr(t, wr(e, i, i)))}" />`), `\n${n.join("\n")}`;
|
|
1402
1312
|
};
|
|
1403
1313
|
for (let e of n) {
|
|
1404
1314
|
let n = r ?? [i];
|
|
1405
1315
|
for (let r of n) {
|
|
1406
|
-
let n =
|
|
1407
|
-
o.set(n, ` <url>\n <loc>${
|
|
1316
|
+
let n = Cr(t, wr(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${Tr(e.lastmod)}</lastmod>` : "";
|
|
1317
|
+
o.set(n, ` <url>\n <loc>${Tr(n)}</loc>${a}${s(e.path)}\n </url>`);
|
|
1408
1318
|
}
|
|
1409
1319
|
}
|
|
1410
1320
|
let c = [...o.keys()].sort().map((e) => o.get(e)).join("\n");
|
|
1411
1321
|
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`;
|
|
1412
|
-
},
|
|
1322
|
+
}, Dr = (e) => {
|
|
1413
1323
|
if (!e.indexable) return "User-agent: *\nDisallow: /\n";
|
|
1414
1324
|
let t = ["User-agent: *", "Allow: /"];
|
|
1415
|
-
for (let n of e.disallow ?? []) t.push(`Disallow: ${
|
|
1325
|
+
for (let n of e.disallow ?? []) t.push(`Disallow: ${Sr(n)}`);
|
|
1416
1326
|
return e.sitemapUrl && t.push("", `Sitemap: ${e.sitemapUrl}`), `${t.join("\n")}\n`;
|
|
1417
|
-
},
|
|
1327
|
+
}, Or = 256, kr = (e = Or) => {
|
|
1418
1328
|
let t = [], n = /* @__PURE__ */ new Set();
|
|
1419
1329
|
return {
|
|
1420
1330
|
emit(r, i) {
|
|
@@ -1437,18 +1347,18 @@ __installPublicEnv(publicEnvValues)
|
|
|
1437
1347
|
return t.slice();
|
|
1438
1348
|
}
|
|
1439
1349
|
};
|
|
1440
|
-
},
|
|
1441
|
-
let n =
|
|
1350
|
+
}, Ar = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, jr = () => `: keep-alive ${Date.now()}\n\n`, Mr = 8e3, Nr = (e, t = Mr) => {
|
|
1351
|
+
let n = Fr(e);
|
|
1442
1352
|
return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
|
|
1443
|
-
},
|
|
1353
|
+
}, Pr = 4, Fr = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
|
|
1444
1354
|
if (e instanceof Error) {
|
|
1445
1355
|
let r = e.stack ?? `${e.name}: ${e.message}`;
|
|
1446
1356
|
if (n.has(e)) return `${r}\n [cycle]`;
|
|
1447
1357
|
n.add(e);
|
|
1448
1358
|
let i = [];
|
|
1449
|
-
if (t <
|
|
1450
|
-
if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${
|
|
1451
|
-
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${
|
|
1359
|
+
if (t < Pr) {
|
|
1360
|
+
if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${Ir(Fr(a, t + 1, n))}`);
|
|
1361
|
+
else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${Ir(Fr(e.cause, t + 1, n))}`);
|
|
1452
1362
|
}
|
|
1453
1363
|
return r + i.join("");
|
|
1454
1364
|
}
|
|
@@ -1457,30 +1367,30 @@ __installPublicEnv(publicEnvValues)
|
|
|
1457
1367
|
} catch {
|
|
1458
1368
|
return "[unstringifiable thrown value]";
|
|
1459
1369
|
}
|
|
1460
|
-
},
|
|
1370
|
+
}, Ir = (e) => {
|
|
1461
1371
|
let t = e.split("\n");
|
|
1462
1372
|
return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
|
|
1463
|
-
},
|
|
1373
|
+
}, Lr = {
|
|
1464
1374
|
trace: 0,
|
|
1465
1375
|
debug: 1,
|
|
1466
1376
|
info: 2,
|
|
1467
1377
|
warn: 3,
|
|
1468
1378
|
error: 4,
|
|
1469
1379
|
fatal: 5
|
|
1470
|
-
},
|
|
1380
|
+
}, Rr = 2e3, zr = 200, Br = class {
|
|
1471
1381
|
capacity;
|
|
1472
1382
|
buffer = [];
|
|
1473
|
-
constructor(e =
|
|
1383
|
+
constructor(e = Rr) {
|
|
1474
1384
|
this.capacity = e;
|
|
1475
1385
|
}
|
|
1476
1386
|
append(e) {
|
|
1477
1387
|
this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
|
|
1478
1388
|
}
|
|
1479
1389
|
query(e = {}) {
|
|
1480
|
-
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ??
|
|
1390
|
+
let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? zr, this.capacity), i = e.minLevel === void 0 ? Lr.trace : Lr[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
|
|
1481
1391
|
for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
|
|
1482
1392
|
let r = this.buffer[e];
|
|
1483
|
-
r.ts < t || r.ts > n ||
|
|
1393
|
+
r.ts < t || r.ts > n || Lr[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));
|
|
1484
1394
|
}
|
|
1485
1395
|
return l.reverse();
|
|
1486
1396
|
}
|
|
@@ -1493,7 +1403,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1493
1403
|
clear() {
|
|
1494
1404
|
this.buffer = [];
|
|
1495
1405
|
}
|
|
1496
|
-
},
|
|
1406
|
+
}, Vr = null, Hr = () => (Vr === null && (Vr = new Br()), Vr), Ur = (e) => {
|
|
1497
1407
|
if (typeof e == "string") return e;
|
|
1498
1408
|
if (e instanceof Error) return e.message;
|
|
1499
1409
|
try {
|
|
@@ -1501,28 +1411,28 @@ __installPublicEnv(publicEnvValues)
|
|
|
1501
1411
|
} catch {
|
|
1502
1412
|
return String(e);
|
|
1503
1413
|
}
|
|
1504
|
-
},
|
|
1414
|
+
}, Wr = 8e3, Gr = (e) => typeof e == "string" ? e.length <= Wr ? e : `${e.slice(0, Wr)}… [voltro: truncated]` : typeof e != "object" || !e ? e : Nr(e, Wr), Kr = (e, t) => {
|
|
1505
1415
|
try {
|
|
1506
1416
|
e(...t);
|
|
1507
1417
|
} catch (n) {
|
|
1508
1418
|
try {
|
|
1509
|
-
e(...t.map(
|
|
1419
|
+
e(...t.map(Gr)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${Wr} chars per argument.`);
|
|
1510
1420
|
} catch {
|
|
1511
1421
|
e(`[voltro] a console.error argument could not be formatted at all (${t.length} arg(s)).`);
|
|
1512
1422
|
}
|
|
1513
1423
|
}
|
|
1514
|
-
},
|
|
1424
|
+
}, qr = (e) => {
|
|
1515
1425
|
let t = {
|
|
1516
1426
|
log: console.log.bind(console),
|
|
1517
1427
|
info: console.info.bind(console),
|
|
1518
1428
|
warn: console.warn.bind(console),
|
|
1519
1429
|
error: console.error.bind(console),
|
|
1520
1430
|
debug: console.debug.bind(console)
|
|
1521
|
-
}, n =
|
|
1522
|
-
if (
|
|
1431
|
+
}, n = Hr(), r = !1, i = (i) => (...a) => {
|
|
1432
|
+
if (Kr(t[i], a), !r) {
|
|
1523
1433
|
r = !0;
|
|
1524
1434
|
try {
|
|
1525
|
-
let t = a.length > 0 ?
|
|
1435
|
+
let t = a.length > 0 ? Ur(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = xe();
|
|
1526
1436
|
e.emit("log", {
|
|
1527
1437
|
level: i,
|
|
1528
1438
|
message: r,
|
|
@@ -1549,7 +1459,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1549
1459
|
}
|
|
1550
1460
|
};
|
|
1551
1461
|
console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
|
|
1552
|
-
let a =
|
|
1462
|
+
let a = ge((t) => {
|
|
1553
1463
|
if (!r) {
|
|
1554
1464
|
r = !0;
|
|
1555
1465
|
try {
|
|
@@ -1560,7 +1470,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1560
1470
|
argsCount: 1,
|
|
1561
1471
|
...t.scope === void 0 ? {} : { scope: t.scope }
|
|
1562
1472
|
});
|
|
1563
|
-
let a =
|
|
1473
|
+
let a = xe(), o = a !== void 0 && t.fields.traceId === void 0 ? {
|
|
1564
1474
|
...t.fields,
|
|
1565
1475
|
traceId: a.traceId
|
|
1566
1476
|
} : t.fields;
|
|
@@ -1580,24 +1490,24 @@ __installPublicEnv(publicEnvValues)
|
|
|
1580
1490
|
return () => {
|
|
1581
1491
|
console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
|
|
1582
1492
|
};
|
|
1583
|
-
},
|
|
1493
|
+
}, Jr = 2e3, Yr = 8, Xr = 1e3, Zr = 200, Qr = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, $r = (e) => {
|
|
1584
1494
|
switch (e) {
|
|
1585
1495
|
case "error": return "error";
|
|
1586
1496
|
case "warn": return "warn";
|
|
1587
1497
|
case "debug": return "debug";
|
|
1588
1498
|
default: return "info";
|
|
1589
1499
|
}
|
|
1590
|
-
},
|
|
1500
|
+
}, ei = W({ scope: "client" }), ti = (e, t) => {
|
|
1591
1501
|
let n;
|
|
1592
1502
|
try {
|
|
1593
1503
|
n = JSON.parse(e);
|
|
1594
1504
|
} catch {
|
|
1595
|
-
return
|
|
1505
|
+
return ni(400, { error: "invalid JSON body" });
|
|
1596
1506
|
}
|
|
1597
|
-
if (typeof n != "object" || !n) return
|
|
1507
|
+
if (typeof n != "object" || !n) return ni(400, { error: "body must be a JSON object" });
|
|
1598
1508
|
let r = n;
|
|
1599
|
-
if (!Array.isArray(r.entries)) return
|
|
1600
|
-
let i = typeof r.app == "string" ?
|
|
1509
|
+
if (!Array.isArray(r.entries)) return ni(400, { error: "entries must be an array" });
|
|
1510
|
+
let i = typeof r.app == "string" ? Qr(r.app, 120) : void 0, a = typeof r.page == "string" ? Qr(r.page, 200) : void 0, o = typeof r.ua == "string" ? Qr(r.ua, 200) : void 0, s = r.entries.slice(0, Zr), c = 0;
|
|
1601
1511
|
for (let e of s) {
|
|
1602
1512
|
if (typeof e != "object" || !e) continue;
|
|
1603
1513
|
let n = e;
|
|
@@ -1608,7 +1518,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1608
1518
|
"warn",
|
|
1609
1519
|
"error",
|
|
1610
1520
|
"debug"
|
|
1611
|
-
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l =
|
|
1521
|
+
].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Qr(n.message, Jr), u = Array.isArray(n.args) ? n.args.slice(0, Yr).filter((e) => typeof e == "string").map((e) => Qr(e, Xr)) : void 0, d = typeof n.stack == "string" ? Qr(n.stack, Jr) : void 0;
|
|
1612
1522
|
t.emit("clientLog", {
|
|
1613
1523
|
ts: s,
|
|
1614
1524
|
level: r,
|
|
@@ -1623,35 +1533,35 @@ __installPublicEnv(publicEnvValues)
|
|
|
1623
1533
|
...i === void 0 ? {} : { app: i },
|
|
1624
1534
|
...a === void 0 ? {} : { page: a },
|
|
1625
1535
|
...u !== void 0 && u.length > 0 ? { args: u } : {}
|
|
1626
|
-
}, p =
|
|
1627
|
-
(p === "error" || p === "warn") && d !== void 0 ?
|
|
1536
|
+
}, p = $r(r);
|
|
1537
|
+
(p === "error" || p === "warn") && d !== void 0 ? ei[p](l, f, { stack: d }) : ei[p](l, {
|
|
1628
1538
|
...f,
|
|
1629
1539
|
...d === void 0 ? {} : { stack: d }
|
|
1630
1540
|
}), c++;
|
|
1631
1541
|
}
|
|
1632
|
-
return
|
|
1542
|
+
return ni(202, {
|
|
1633
1543
|
accepted: c,
|
|
1634
1544
|
dropped: r.entries.length - c
|
|
1635
1545
|
});
|
|
1636
|
-
},
|
|
1546
|
+
}, ni = (e, t) => ({
|
|
1637
1547
|
status: e,
|
|
1638
1548
|
contentType: "application/json; charset=utf-8",
|
|
1639
1549
|
body: JSON.stringify(t)
|
|
1640
|
-
}),
|
|
1550
|
+
}), ri = "/_voltro/inspect/clientLog", ii = [
|
|
1641
1551
|
"trace",
|
|
1642
1552
|
"debug",
|
|
1643
1553
|
"info",
|
|
1644
1554
|
"warn",
|
|
1645
1555
|
"error",
|
|
1646
1556
|
"fatal"
|
|
1647
|
-
],
|
|
1557
|
+
], ai = {
|
|
1648
1558
|
trace: "TRACE",
|
|
1649
1559
|
debug: "DEBUG",
|
|
1650
1560
|
info: "INFO ",
|
|
1651
1561
|
warn: "WARN ",
|
|
1652
1562
|
error: "ERROR",
|
|
1653
1563
|
fatal: "FATAL"
|
|
1654
|
-
},
|
|
1564
|
+
}, oi = (e) => ii.includes(e), si = (e, t, n = {}) => {
|
|
1655
1565
|
if (u()) return {
|
|
1656
1566
|
status: 503,
|
|
1657
1567
|
contentType: "application/json",
|
|
@@ -1682,7 +1592,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1682
1592
|
Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
|
|
1683
1593
|
}
|
|
1684
1594
|
let d = a.get("level");
|
|
1685
|
-
d !== null &&
|
|
1595
|
+
d !== null && oi(d) && (o.minLevel = d);
|
|
1686
1596
|
let p = a.get("source");
|
|
1687
1597
|
(p === "server" || p === "client") && (o.source = p);
|
|
1688
1598
|
let m = a.get("scope");
|
|
@@ -1695,7 +1605,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1695
1605
|
if ((a.get("format") ?? "json") === "text") return {
|
|
1696
1606
|
status: 200,
|
|
1697
1607
|
contentType: "text/plain; charset=utf-8",
|
|
1698
|
-
body: _.map(
|
|
1608
|
+
body: _.map(ci).join("\n") + (_.length > 0 ? "\n" : "")
|
|
1699
1609
|
};
|
|
1700
1610
|
let v = {
|
|
1701
1611
|
capturedAt: Date.now(),
|
|
@@ -1709,40 +1619,40 @@ __installPublicEnv(publicEnvValues)
|
|
|
1709
1619
|
contentType: "application/json; charset=utf-8",
|
|
1710
1620
|
body: JSON.stringify(v)
|
|
1711
1621
|
};
|
|
1712
|
-
},
|
|
1713
|
-
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 =
|
|
1714
|
-
return `${n}:${r}:${i}.${a} ${
|
|
1715
|
-
},
|
|
1622
|
+
}, ci = (e) => {
|
|
1623
|
+
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 = ui(e.fields);
|
|
1624
|
+
return `${n}:${r}:${i}.${a} ${ai[e.level]} ${o} ${e.message}${s}`;
|
|
1625
|
+
}, li = 80, ui = (e) => {
|
|
1716
1626
|
let t = Object.entries(e);
|
|
1717
1627
|
if (t.length === 0) return "";
|
|
1718
1628
|
let n = [];
|
|
1719
1629
|
for (let [e, r] of t) {
|
|
1720
1630
|
if (r === void 0) continue;
|
|
1721
|
-
let t =
|
|
1631
|
+
let t = di(r);
|
|
1722
1632
|
n.push(`${e}=${t}`);
|
|
1723
1633
|
}
|
|
1724
1634
|
return n.length > 0 ? " " + n.join(" ") : "";
|
|
1725
|
-
},
|
|
1635
|
+
}, di = (e) => {
|
|
1726
1636
|
if (typeof e == "string") {
|
|
1727
|
-
let t = e.length >
|
|
1637
|
+
let t = e.length > li ? e.slice(0, li) + "…" : e;
|
|
1728
1638
|
return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
|
|
1729
1639
|
}
|
|
1730
1640
|
if (e === null) return "null";
|
|
1731
1641
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
1732
1642
|
try {
|
|
1733
1643
|
let t = JSON.stringify(e);
|
|
1734
|
-
return t.length >
|
|
1644
|
+
return t.length > li ? t.slice(0, li) + "…" : t;
|
|
1735
1645
|
} catch {
|
|
1736
1646
|
return "[unserialisable]";
|
|
1737
1647
|
}
|
|
1738
|
-
},
|
|
1648
|
+
}, fi = "/_voltro/inspect/logs", pi = (e, t, n) => {
|
|
1739
1649
|
if (t.headers.authorization !== void 0) return !1;
|
|
1740
1650
|
let { token: r } = n;
|
|
1741
1651
|
if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
|
|
1742
1652
|
e.setHeader("authorization", `Bearer ${r}`);
|
|
1743
1653
|
let i = n.writeToken;
|
|
1744
1654
|
return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
|
|
1745
|
-
},
|
|
1655
|
+
}, mi = [{
|
|
1746
1656
|
match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
|
|
1747
1657
|
handle: (e, t) => {
|
|
1748
1658
|
let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
|
|
@@ -1754,13 +1664,13 @@ __installPublicEnv(publicEnvValues)
|
|
|
1754
1664
|
});
|
|
1755
1665
|
} else t.info(n);
|
|
1756
1666
|
}
|
|
1757
|
-
}],
|
|
1667
|
+
}], hi = () => {
|
|
1758
1668
|
let e = {
|
|
1759
1669
|
warn: console.warn.bind(console),
|
|
1760
1670
|
error: console.error.bind(console)
|
|
1761
|
-
}, t =
|
|
1671
|
+
}, t = W({ scope: "babel" }), n = !1, r = (r) => (...i) => {
|
|
1762
1672
|
if (!n) {
|
|
1763
|
-
for (let e of
|
|
1673
|
+
for (let e of mi) if (e.match(i[0])) {
|
|
1764
1674
|
n = !0;
|
|
1765
1675
|
try {
|
|
1766
1676
|
e.handle(i, t);
|
|
@@ -1775,7 +1685,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1775
1685
|
return console.warn = r("warn"), console.error = r("error"), () => {
|
|
1776
1686
|
console.warn = e.warn, console.error = e.error;
|
|
1777
1687
|
};
|
|
1778
|
-
},
|
|
1688
|
+
}, gi = {
|
|
1779
1689
|
loader: "it runs on the server, and the router caches its result per route + params",
|
|
1780
1690
|
renderMode: "it picks the server render strategy",
|
|
1781
1691
|
dynamic: "it picks the server render strategy",
|
|
@@ -1788,7 +1698,7 @@ __installPublicEnv(publicEnvValues)
|
|
|
1788
1698
|
tenantAware: "it is part of the server-side cache key",
|
|
1789
1699
|
ogImage: "the server renders it into the og:image PNG",
|
|
1790
1700
|
ppr: "it switches the isr path to partial prerendering (cached shell + per-request holes)"
|
|
1791
|
-
},
|
|
1701
|
+
}, _i = Object.keys(gi), vi = "virtual:voltro-route-refresh", yi = `\0${vi}`, bi = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, xi = () => `
|
|
1792
1702
|
// GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
|
|
1793
1703
|
|
|
1794
1704
|
/** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
|
|
@@ -1817,11 +1727,11 @@ const stableForm = (value) => {
|
|
|
1817
1727
|
* readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
|
|
1818
1728
|
* one of THESE cannot be hot-applied: the server already ran with the old
|
|
1819
1729
|
* value. Everything else a page exports is plain client-side data. */
|
|
1820
|
-
const serverRelevantExports = ${JSON.stringify(
|
|
1730
|
+
const serverRelevantExports = ${JSON.stringify(_i)}
|
|
1821
1731
|
|
|
1822
1732
|
/** Name → the server step that already consumed it, so the reload message can
|
|
1823
1733
|
* say WHY rather than just WHAT. Injected from the same single source. */
|
|
1824
|
-
const serverExportEffect = ${JSON.stringify(
|
|
1734
|
+
const serverExportEffect = ${JSON.stringify(gi)}
|
|
1825
1735
|
|
|
1826
1736
|
/** The reason \`name\` forces a reload, for the console line. */
|
|
1827
1737
|
export const serverEffectOf = (name) =>
|
|
@@ -1864,7 +1774,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
|
|
|
1864
1774
|
const previousHook = globalThis.__getReactRefreshIgnoredExports
|
|
1865
1775
|
globalThis.__getReactRefreshIgnoredExports = (args) =>
|
|
1866
1776
|
ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
|
|
1867
|
-
`,
|
|
1777
|
+
`, Si = (e) => `
|
|
1868
1778
|
if (import.meta.hot) {
|
|
1869
1779
|
// Self-import to read our OWN exports, the same technique the react plugin
|
|
1870
1780
|
// uses; the namespace is only complete after evaluation, hence the promise.
|
|
@@ -1891,97 +1801,97 @@ import {
|
|
|
1891
1801
|
registerRouteModule as __voltro_registerRouteModule,
|
|
1892
1802
|
routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
|
|
1893
1803
|
serverEffectOf as __voltro_serverEffect,
|
|
1894
|
-
} from '${
|
|
1895
|
-
`,
|
|
1896
|
-
let [n = "", r] =
|
|
1897
|
-
if (!n.endsWith(".tsx") || r !== void 0 &&
|
|
1898
|
-
let i =
|
|
1899
|
-
return n.startsWith(`${i}/`) ?
|
|
1900
|
-
},
|
|
1804
|
+
} from '${vi}'
|
|
1805
|
+
`, Ci = (e) => e.replace(/\\/g, "/"), wi = (e, t) => {
|
|
1806
|
+
let [n = "", r] = Ci(e).split("?");
|
|
1807
|
+
if (!n.endsWith(".tsx") || r !== void 0 && bi.test(r)) return !1;
|
|
1808
|
+
let i = Ci(t).replace(/\/$/, "");
|
|
1809
|
+
return n.startsWith(`${i}/`) ? s.test(n) || a.has(n.slice(n.lastIndexOf("/") + 1)) : !1;
|
|
1810
|
+
}, Ti = (e, t, n) => wi(t, n) ? `${e}${Si(Ci(t).split("?")[0] ?? t)}` : null, Ei = (e) => ({
|
|
1901
1811
|
name: "voltro:route-fast-refresh",
|
|
1902
1812
|
enforce: "pre",
|
|
1903
|
-
resolveId: (e) => e === "virtual:voltro-route-refresh" ?
|
|
1904
|
-
load: (e) => e ===
|
|
1813
|
+
resolveId: (e) => e === "virtual:voltro-route-refresh" ? yi : void 0,
|
|
1814
|
+
load: (e) => e === yi ? xi() : void 0,
|
|
1905
1815
|
transform: (t, n, r) => {
|
|
1906
1816
|
if (r?.ssr === !0) return null;
|
|
1907
|
-
let i =
|
|
1817
|
+
let i = Ti(t, n, e);
|
|
1908
1818
|
return i === null ? null : {
|
|
1909
1819
|
code: i,
|
|
1910
1820
|
map: null
|
|
1911
1821
|
};
|
|
1912
1822
|
}
|
|
1913
|
-
}),
|
|
1823
|
+
}), Di = W({ scope: "voltro:dashboard" }), Oi = ye(import.meta.url), ki = 5179, Ai = (e) => {
|
|
1914
1824
|
let t = process.env.VOLTRO_DASHBOARD_PATH;
|
|
1915
|
-
if (t &&
|
|
1825
|
+
if (t && L(N(F(t), "app.config.ts"))) return F(t);
|
|
1916
1826
|
try {
|
|
1917
|
-
let e =
|
|
1918
|
-
if (
|
|
1827
|
+
let e = M(Oi.resolve("@voltro/dashboard/package.json"));
|
|
1828
|
+
if (L(N(e, "app.config.ts"))) return e;
|
|
1919
1829
|
} catch {}
|
|
1920
|
-
let n =
|
|
1830
|
+
let n = N("voltro-devtools", "apps", "dashboard"), r = F(e);
|
|
1921
1831
|
for (let e = 0; e < 10; e++) {
|
|
1922
|
-
let e =
|
|
1923
|
-
if (
|
|
1924
|
-
let t =
|
|
1832
|
+
let e = N(r, n);
|
|
1833
|
+
if (L(N(e, "app.config.ts"))) return e;
|
|
1834
|
+
let t = M(r);
|
|
1925
1835
|
if (t === r) break;
|
|
1926
1836
|
r = t;
|
|
1927
1837
|
}
|
|
1928
1838
|
return null;
|
|
1929
|
-
},
|
|
1930
|
-
let i =
|
|
1839
|
+
}, ji = "VOLTRO_IS_DASHBOARD", Mi = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
|
|
1840
|
+
let i = Y({
|
|
1931
1841
|
port: e,
|
|
1932
1842
|
host: t
|
|
1933
1843
|
}), a = !1, o = (e) => {
|
|
1934
1844
|
a || (a = !0, i.destroy(), r(e));
|
|
1935
1845
|
};
|
|
1936
1846
|
i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
|
|
1937
|
-
}),
|
|
1847
|
+
}), Ni = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Pi = () => process.env[ji] === "1", Fi = () => process.stdout.isTTY === !0, Ii = N(we(), ".voltro", "dashboard-launch.lock"), Li = 1e4, Ri = async () => {
|
|
1938
1848
|
try {
|
|
1939
|
-
await
|
|
1940
|
-
let e = await
|
|
1849
|
+
await z.mkdir(M(Ii), { recursive: !0 });
|
|
1850
|
+
let e = await z.open(Ii, "wx");
|
|
1941
1851
|
return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
|
|
1942
1852
|
} catch {
|
|
1943
1853
|
try {
|
|
1944
|
-
let e = await
|
|
1945
|
-
if (Date.now() - e.mtimeMs >
|
|
1854
|
+
let e = await z.stat(Ii);
|
|
1855
|
+
if (Date.now() - e.mtimeMs > Li) return await z.unlink(Ii).catch(() => void 0), Ri();
|
|
1946
1856
|
} catch {}
|
|
1947
1857
|
return !1;
|
|
1948
1858
|
}
|
|
1949
|
-
},
|
|
1859
|
+
}, zi = async () => {
|
|
1950
1860
|
try {
|
|
1951
|
-
await
|
|
1861
|
+
await z.unlink(Ii);
|
|
1952
1862
|
} catch {}
|
|
1953
|
-
},
|
|
1863
|
+
}, Bi = async (e) => {
|
|
1954
1864
|
let t = e.port ?? 5179;
|
|
1955
|
-
if (
|
|
1865
|
+
if (Ni()) return {
|
|
1956
1866
|
status: "skipped",
|
|
1957
1867
|
reason: "disabled by flag/env",
|
|
1958
1868
|
port: t
|
|
1959
1869
|
};
|
|
1960
|
-
if (
|
|
1870
|
+
if (Pi()) return {
|
|
1961
1871
|
status: "skipped",
|
|
1962
1872
|
reason: "this process IS the dashboard",
|
|
1963
1873
|
port: t
|
|
1964
1874
|
};
|
|
1965
|
-
if (!
|
|
1875
|
+
if (!Fi()) return {
|
|
1966
1876
|
status: "skipped",
|
|
1967
1877
|
reason: "stdout is not a TTY (CI/smoke)",
|
|
1968
1878
|
port: t
|
|
1969
1879
|
};
|
|
1970
|
-
if (!await
|
|
1880
|
+
if (!await Ri()) return {
|
|
1971
1881
|
status: "skipped",
|
|
1972
1882
|
reason: "another voltro process is currently launching the dashboard",
|
|
1973
1883
|
port: t
|
|
1974
1884
|
};
|
|
1975
|
-
if (await
|
|
1885
|
+
if (await Mi(t)) return await zi(), {
|
|
1976
1886
|
status: "already-running",
|
|
1977
1887
|
port: t
|
|
1978
1888
|
};
|
|
1979
1889
|
let n = e.voltroBin;
|
|
1980
1890
|
if (!n) {
|
|
1981
1891
|
let e = process.argv[1];
|
|
1982
|
-
n = e && e.endsWith("/src/bin.ts") ?
|
|
1892
|
+
n = e && e.endsWith("/src/bin.ts") ? N(M(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
|
|
1983
1893
|
}
|
|
1984
|
-
let r =
|
|
1894
|
+
let r = N(e.dashboardAppPath, ".framework", "dist", "index.html"), i = L(r), a = i ? "start" : "dev", o = ze(process.execPath, [
|
|
1985
1895
|
n,
|
|
1986
1896
|
a,
|
|
1987
1897
|
e.dashboardAppPath
|
|
@@ -1989,7 +1899,7 @@ import {
|
|
|
1989
1899
|
stdio: "ignore",
|
|
1990
1900
|
env: {
|
|
1991
1901
|
...process.env,
|
|
1992
|
-
[
|
|
1902
|
+
[ji]: "1",
|
|
1993
1903
|
VOLTRO_DASHBOARD_PORT: String(t)
|
|
1994
1904
|
}
|
|
1995
1905
|
});
|
|
@@ -1997,19 +1907,121 @@ import {
|
|
|
1997
1907
|
if (o.exitCode === null && o.signalCode === null) try {
|
|
1998
1908
|
o.kill("SIGTERM");
|
|
1999
1909
|
} catch {}
|
|
2000
|
-
}),
|
|
1910
|
+
}), Di.info(`auto-launching dashboard at http://localhost:${t}`, {
|
|
2001
1911
|
port: t,
|
|
2002
1912
|
mode: a,
|
|
2003
1913
|
prebuilt: i
|
|
2004
|
-
}), i ||
|
|
2005
|
-
|
|
1914
|
+
}), i || Di.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), Di.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
|
|
1915
|
+
zi();
|
|
2006
1916
|
}, 4e3).unref(), {
|
|
2007
1917
|
status: "launched",
|
|
2008
1918
|
port: t
|
|
2009
1919
|
};
|
|
2010
|
-
},
|
|
1920
|
+
}, Vi = class extends Error {
|
|
1921
|
+
_voltroDeferral = !0;
|
|
1922
|
+
constructor(e) {
|
|
1923
|
+
super(e), this.name = "DeferralNotSupportedError";
|
|
1924
|
+
}
|
|
1925
|
+
}, Hi = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Ui = (e) => {
|
|
1926
|
+
if (!(e instanceof Error)) return;
|
|
1927
|
+
let t = e._voltroControl;
|
|
1928
|
+
if (t === "redirect") {
|
|
1929
|
+
let { location: t, status: n } = e;
|
|
1930
|
+
return typeof t == "string" ? {
|
|
1931
|
+
status: n === 307 || n === 308 ? n : 303,
|
|
1932
|
+
headers: {
|
|
1933
|
+
location: t,
|
|
1934
|
+
"x-voltro-rendered-by": "loader-redirect"
|
|
1935
|
+
},
|
|
1936
|
+
body: ""
|
|
1937
|
+
} : void 0;
|
|
1938
|
+
}
|
|
1939
|
+
if (t === "not-found") return {
|
|
1940
|
+
status: 404,
|
|
1941
|
+
headers: {
|
|
1942
|
+
"content-type": "text/plain; charset=utf-8",
|
|
1943
|
+
"x-voltro-rendered-by": "loader-not-found"
|
|
1944
|
+
},
|
|
1945
|
+
body: "not found"
|
|
1946
|
+
};
|
|
1947
|
+
}, Wi = (e) => {
|
|
1948
|
+
let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
|
|
1949
|
+
for (let [n, o] of Object.entries(e.segmentLoaderData)) {
|
|
1950
|
+
let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
|
|
1951
|
+
r[e] = s.renderData, i[e] = s.stateData, s.deferredIds && (a[e] = s.deferredIds);
|
|
1952
|
+
}
|
|
1953
|
+
let o = n.deferredIds !== void 0 || Object.keys(a).length > 0;
|
|
1954
|
+
if (o) try {
|
|
1955
|
+
t.assertDeferralSupported({
|
|
1956
|
+
page: e.page,
|
|
1957
|
+
renderMode: e.renderMode,
|
|
1958
|
+
interactive: e.interactive,
|
|
1959
|
+
...e.layoutShell ? { layoutShell: e.layoutShell } : {},
|
|
1960
|
+
...e.ppr === !0 ? { ppr: !0 } : {}
|
|
1961
|
+
});
|
|
1962
|
+
} catch (e) {
|
|
1963
|
+
throw new Vi(e instanceof Error ? e.message : String(e));
|
|
1964
|
+
}
|
|
1965
|
+
return {
|
|
1966
|
+
loaderData: n.renderData,
|
|
1967
|
+
segmentLoaderData: r,
|
|
1968
|
+
hasDeferred: o,
|
|
1969
|
+
stateInput: {
|
|
1970
|
+
path: e.pathname,
|
|
1971
|
+
loaderData: n.stateData,
|
|
1972
|
+
segmentLoaderData: i,
|
|
1973
|
+
pageLoaderRan: e.pageLoaderRan,
|
|
1974
|
+
...e.layoutShell ? { pageClientOnly: !0 } : {},
|
|
1975
|
+
...n.deferredIds ? { deferredPageIds: n.deferredIds } : {},
|
|
1976
|
+
...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
|
|
1977
|
+
}
|
|
1978
|
+
};
|
|
1979
|
+
}, Gi = (e) => {
|
|
1980
|
+
let { helpers: t, renderInput: n } = e, r = Wi({
|
|
1981
|
+
helpers: t,
|
|
1982
|
+
page: e.page,
|
|
1983
|
+
pathname: n.pathname,
|
|
1984
|
+
renderMode: "spa",
|
|
1985
|
+
interactive: e.interactive,
|
|
1986
|
+
loaderData: null,
|
|
1987
|
+
segmentLoaderData: n.segmentLoaderData ?? {},
|
|
1988
|
+
pageLoaderRan: !1,
|
|
1989
|
+
layoutShell: e.delivery
|
|
1990
|
+
});
|
|
1991
|
+
return {
|
|
1992
|
+
renderInput: {
|
|
1993
|
+
...n,
|
|
1994
|
+
pageSlot: !0,
|
|
1995
|
+
loaderData: null,
|
|
1996
|
+
segmentLoaderData: r.segmentLoaderData
|
|
1997
|
+
},
|
|
1998
|
+
stateScript: t.renderRouterStateScript(r.stateInput),
|
|
1999
|
+
hasDeferred: r.hasDeferred
|
|
2000
|
+
};
|
|
2001
|
+
}, Ki = (e) => {
|
|
2002
|
+
let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
|
|
2003
|
+
return {
|
|
2004
|
+
body: t,
|
|
2005
|
+
meta: n
|
|
2006
|
+
};
|
|
2007
|
+
}, qi = (e) => [
|
|
2008
|
+
...e.extra ?? [],
|
|
2009
|
+
e.helpers.renderMetaToHtml(e.meta),
|
|
2010
|
+
`<meta name="voltro-interactive" content="${e.interactive}" />`,
|
|
2011
|
+
...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
|
|
2012
|
+
e.prepared.stateScript
|
|
2013
|
+
].filter((e) => e.length > 0).join("\n "), Ji = (e) => {
|
|
2014
|
+
let t = e.indexOf("?");
|
|
2015
|
+
return t === -1 ? {
|
|
2016
|
+
pathname: e || "/",
|
|
2017
|
+
search: ""
|
|
2018
|
+
} : {
|
|
2019
|
+
pathname: e.slice(0, t) || "/",
|
|
2020
|
+
search: e.slice(t)
|
|
2021
|
+
};
|
|
2022
|
+
}, Yi = /Could not find required `intl` object/, Xi = "__voltro_i18n_instances__", Zi = (e = globalThis) => {
|
|
2011
2023
|
try {
|
|
2012
|
-
let t = e[
|
|
2024
|
+
let t = e[Xi]?.records;
|
|
2013
2025
|
return t === void 0 || t.length === 0 ? void 0 : {
|
|
2014
2026
|
instances: t.length,
|
|
2015
2027
|
reactIntlCopies: new Set(t.map((e) => e.intlProvider)).size,
|
|
@@ -2018,7 +2030,7 @@ import {
|
|
|
2018
2030
|
} catch {
|
|
2019
2031
|
return;
|
|
2020
2032
|
}
|
|
2021
|
-
},
|
|
2033
|
+
}, Qi = (e, t) => [
|
|
2022
2034
|
"",
|
|
2023
2035
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
2024
2036
|
`${e} DID wrap this render in <I18nProvider>, and this process`,
|
|
@@ -2036,7 +2048,7 @@ import {
|
|
|
2036
2048
|
" versions on disk; this counts instances in the running process, and one",
|
|
2037
2049
|
" file loaded down two paths is two instances.",
|
|
2038
2050
|
"───────────────────────────────────────────────────────────────────────"
|
|
2039
|
-
].join("\n"),
|
|
2051
|
+
].join("\n"), $i = (e, t) => [
|
|
2040
2052
|
"",
|
|
2041
2053
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
2042
2054
|
`${e} DID wrap this render in <I18nProvider>, and this process`,
|
|
@@ -2052,7 +2064,7 @@ import {
|
|
|
2052
2064
|
" direct import can land on a second copy that this count does not see —",
|
|
2053
2065
|
" it counts what @voltro/i18n is bound to.",
|
|
2054
2066
|
"───────────────────────────────────────────────────────────────────────"
|
|
2055
|
-
].join("\n"),
|
|
2067
|
+
].join("\n"), ea = (e) => [
|
|
2056
2068
|
"",
|
|
2057
2069
|
"── voltro diagnosis ───────────────────────────────────────────────────",
|
|
2058
2070
|
`${e} DID wrap this render in <I18nProvider> — the framework`,
|
|
@@ -2068,40 +2080,45 @@ import {
|
|
|
2068
2080
|
" Do NOT use `pnpm ls` to rule that out: it lists versions on disk, and",
|
|
2069
2081
|
" the duplication here is of module instances in one process.",
|
|
2070
2082
|
"───────────────────────────────────────────────────────────────────────"
|
|
2071
|
-
].join("\n"),
|
|
2083
|
+
].join("\n"), ta = (e, t, n, r = Zi()) => {
|
|
2072
2084
|
if (!t) return;
|
|
2073
2085
|
let i = String(e?.message ?? e);
|
|
2074
|
-
if (
|
|
2075
|
-
},
|
|
2076
|
-
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(
|
|
2077
|
-
let r =
|
|
2086
|
+
if (Yi.test(i)) return r === void 0 ? ea(n) : r.reactIntlCopies > 1 || r.instances > 1 ? Qi(n, r) : $i(n, r);
|
|
2087
|
+
}, na = "<div id=\"root\"></div>", ra = "<div id=\"root\">", ia = "</div>", aa = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, oa = /\bsrc=["']([^"']+)["']/i, sa = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, ca = (e) => {
|
|
2088
|
+
let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(aa, (e) => {
|
|
2089
|
+
let r = oa.exec(e)?.[1];
|
|
2078
2090
|
return r === void 0 || t(r) ? e : (n.push(r), "");
|
|
2079
2091
|
});
|
|
2080
|
-
e.inlineModuleScriptsAsync && (r = r.replace(
|
|
2081
|
-
let i = r.indexOf(
|
|
2082
|
-
if (i === -1) throw Error(`[voltro] the generated shell has no \`${
|
|
2092
|
+
e.inlineModuleScriptsAsync && (r = r.replace(sa, "<script async$1>"));
|
|
2093
|
+
let i = r.indexOf(na);
|
|
2094
|
+
if (i === -1) throw Error(`[voltro] the generated shell has no \`${na}\` 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.`);
|
|
2083
2095
|
return {
|
|
2084
|
-
head: `${r.slice(0, i)}${
|
|
2085
|
-
tail: `${
|
|
2096
|
+
head: `${r.slice(0, i)}${ra}`,
|
|
2097
|
+
tail: `${ia}${r.slice(i + 21)}`,
|
|
2086
2098
|
bootstrapModules: n
|
|
2087
2099
|
};
|
|
2088
|
-
},
|
|
2089
|
-
let n =
|
|
2090
|
-
return e.replace(/<
|
|
2091
|
-
},
|
|
2100
|
+
}, la = (e, t) => (/<title>/i.test(t) ? e.replace(/[^\S\n]*<title>[\s\S]*?<\/title>\n?/i, "") : e).replace("</head>", ` ${t}\n </head>`), ua = (e, t) => {
|
|
2101
|
+
let n = t.replace(/[^A-Za-z0-9+/=_-]/g, "");
|
|
2102
|
+
return e.replace(/<script(?![^>]*\snonce\s*=)/gi, `<script nonce="${n}"`);
|
|
2103
|
+
}, da = (e) => e.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">"), fa = (e, t) => {
|
|
2104
|
+
let n = [t.timeZone === void 0 ? "" : ` data-voltro-tz="${da(t.timeZone)}"`, t.renderedAt === void 0 ? "" : ` data-voltro-now="${t.renderedAt}"`].join("");
|
|
2105
|
+
return e.replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${da(t.lang)}"${n}`);
|
|
2106
|
+
}, pa = (e) => fa(la(e.head, e.headInjection), e.documentAttrs), ma = (e) => {
|
|
2092
2107
|
let { res: t, shell: n, documentAttrs: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
|
|
2093
2108
|
if (s || !o || a === null) return;
|
|
2094
2109
|
s = !0, t.statusCode = e.statusCode ?? 200;
|
|
2095
2110
|
for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
|
|
2096
|
-
t.flushHeaders?.()
|
|
2111
|
+
t.flushHeaders?.();
|
|
2112
|
+
let c = pa({
|
|
2097
2113
|
head: n.head,
|
|
2098
2114
|
headInjection: i(a.meta),
|
|
2099
2115
|
documentAttrs: r
|
|
2100
|
-
})
|
|
2101
|
-
|
|
2102
|
-
|
|
2116
|
+
});
|
|
2117
|
+
t.write(e.nonce === void 0 ? c : ua(c, e.nonce));
|
|
2118
|
+
let l = new nt();
|
|
2119
|
+
l.pipe(t, { end: !1 }), l.on("end", () => {
|
|
2103
2120
|
t.end(n.tail);
|
|
2104
|
-
}), a.stream.pipe(
|
|
2121
|
+
}), a.stream.pipe(l);
|
|
2105
2122
|
}, l = () => {
|
|
2106
2123
|
a?.stream.abort();
|
|
2107
2124
|
};
|
|
@@ -2123,16 +2140,16 @@ import {
|
|
|
2123
2140
|
return;
|
|
2124
2141
|
}
|
|
2125
2142
|
c();
|
|
2126
|
-
},
|
|
2143
|
+
}, ha = (e) => Array.isArray(e.preload) && e.preload.length > 0, ga = (e, t) => typeof e == "string" ? {
|
|
2127
2144
|
tag: e,
|
|
2128
2145
|
input: {}
|
|
2129
2146
|
} : {
|
|
2130
2147
|
tag: e.tag,
|
|
2131
2148
|
input: e.input?.(t) ?? {}
|
|
2132
|
-
},
|
|
2149
|
+
}, _a = async (e) => {
|
|
2133
2150
|
let { pageMod: t, params: n, query: r, apiName: i, seed: a, seedFailure: o, onError: s } = e;
|
|
2134
|
-
if (
|
|
2135
|
-
let { tag: t, input: c } =
|
|
2151
|
+
if (ha(t) && r !== void 0 && i !== void 0) for (let e of t.preload) {
|
|
2152
|
+
let { tag: t, input: c } = ga(e, n);
|
|
2136
2153
|
try {
|
|
2137
2154
|
a(i, t, c, await r(t, c));
|
|
2138
2155
|
} catch (e) {
|
|
@@ -2142,62 +2159,62 @@ import {
|
|
|
2142
2159
|
}, e);
|
|
2143
2160
|
}
|
|
2144
2161
|
}
|
|
2145
|
-
},
|
|
2162
|
+
}, va = (e) => l.test(e) || e.endsWith(".workflow.server.tsx") ? !1 : c.test(e) || o.test(e) || i.test(e), ya = /* @__PURE__ */ new Set([
|
|
2146
2163
|
"node_modules",
|
|
2147
2164
|
"dist",
|
|
2148
2165
|
".framework",
|
|
2149
2166
|
".git"
|
|
2150
|
-
]),
|
|
2167
|
+
]), ba = async (e) => {
|
|
2151
2168
|
let t = [], n = async (e) => {
|
|
2152
2169
|
let r;
|
|
2153
2170
|
try {
|
|
2154
|
-
r = await
|
|
2171
|
+
r = await z.readdir(e, { withFileTypes: !0 });
|
|
2155
2172
|
} catch {
|
|
2156
2173
|
return;
|
|
2157
2174
|
}
|
|
2158
2175
|
for (let i of r) if (!(i.name.startsWith(".") && i.isDirectory())) {
|
|
2159
2176
|
if (i.isDirectory()) {
|
|
2160
|
-
if (
|
|
2161
|
-
await n(
|
|
2162
|
-
} else
|
|
2177
|
+
if (ya.has(i.name)) continue;
|
|
2178
|
+
await n(N(e, i.name));
|
|
2179
|
+
} else va(i.name) && t.push(N(e, i.name));
|
|
2163
2180
|
}
|
|
2164
2181
|
};
|
|
2165
2182
|
return await n(e), t.sort();
|
|
2166
|
-
},
|
|
2167
|
-
let t =
|
|
2168
|
-
for (let n of await
|
|
2183
|
+
}, xa = async (e) => {
|
|
2184
|
+
let t = J("sha1");
|
|
2185
|
+
for (let n of await ba(e)) {
|
|
2169
2186
|
t.update(n.slice(e.length)), t.update("\0");
|
|
2170
2187
|
try {
|
|
2171
|
-
t.update(await
|
|
2188
|
+
t.update(await z.readFile(n));
|
|
2172
2189
|
} catch {}
|
|
2173
2190
|
t.update("\0");
|
|
2174
2191
|
}
|
|
2175
2192
|
try {
|
|
2176
|
-
t.update(await
|
|
2193
|
+
t.update(await z.readFile(N(e, "rpcGroup.generated.ts")));
|
|
2177
2194
|
} catch {}
|
|
2178
2195
|
return t.digest("hex");
|
|
2179
|
-
},
|
|
2196
|
+
}, Sa = async (e) => {
|
|
2180
2197
|
if (e.length === 0) return;
|
|
2181
2198
|
let t = [];
|
|
2182
|
-
for (let n of [...e].sort()) t.push(await
|
|
2183
|
-
return
|
|
2184
|
-
},
|
|
2199
|
+
for (let n of [...e].sort()) t.push(await xa(n));
|
|
2200
|
+
return J("sha1").update(t.join("\0")).digest("hex");
|
|
2201
|
+
}, Ca = (e) => typeof e == "object" && !!e && e._tag === "VoltroMiddleware" && typeof e.run == "function", wa = ["middleware.ts", "middleware.tsx"], Ta = (e) => {
|
|
2185
2202
|
let t = e.replace(/\/+$/, "");
|
|
2186
2203
|
return t === "" ? "/" : t;
|
|
2187
2204
|
}, Z = (e, t) => {
|
|
2188
|
-
let n =
|
|
2205
|
+
let n = Ta(e);
|
|
2189
2206
|
if (n === "/") return !0;
|
|
2190
|
-
let r =
|
|
2207
|
+
let r = Ta(t);
|
|
2191
2208
|
return r === n || r.startsWith(`${n}/`);
|
|
2192
|
-
},
|
|
2209
|
+
}, Ea = (e) => e === void 0 ? [] : typeof e == "string" ? [e] : e, Da = (e, t) => {
|
|
2193
2210
|
if (e === void 0) return !0;
|
|
2194
|
-
let n =
|
|
2211
|
+
let n = Ea(e.under), r = e.routes ?? [];
|
|
2195
2212
|
return n.length === 0 && r.length === 0 || r.includes(t) || n.some((e) => Z(e, t)) ? !(e.except ?? []).some((e) => e === t || Z(e, t)) : !1;
|
|
2196
|
-
},
|
|
2213
|
+
}, Oa = (e) => {
|
|
2197
2214
|
if (e?.assets !== !0) return [];
|
|
2198
|
-
let t =
|
|
2215
|
+
let t = Ea(e.under);
|
|
2199
2216
|
return t.length > 0 ? t : (e.routes ?? []).length > 0 ? [] : ["/"];
|
|
2200
|
-
},
|
|
2217
|
+
}, ka = (e, t) => Oa(e).some((e) => Z(e, t)) ? !(e?.except ?? []).some((e) => Z(e, t)) : !1, Aa = (e, t) => e.find(({ middleware: e }) => t.route === void 0 ? ka(e.match, t.pathname) : Da(e.match, t.route))?.middleware, ja = (e, t) => {
|
|
2201
2218
|
let n = [];
|
|
2202
2219
|
for (let { exportName: r, middleware: i } of e) {
|
|
2203
2220
|
let e = i.match;
|
|
@@ -2205,13 +2222,13 @@ import {
|
|
|
2205
2222
|
kind: "dead-matcher",
|
|
2206
2223
|
message: `\`${r}\` matches routes: ['${i}'], which is not a route in this app. Route patterns are spelled as the router spells them, e.g. \`/notes/[id]\`.`
|
|
2207
2224
|
});
|
|
2208
|
-
if (e?.assets !== !0) for (let [i, a] of [["under",
|
|
2225
|
+
if (e?.assets !== !0) for (let [i, a] of [["under", Ea(e?.under)], ["except", e?.except ?? []]]) for (let e of a) t.some((t) => Z(e, t)) || n.push({
|
|
2209
2226
|
kind: "dead-matcher",
|
|
2210
2227
|
message: `\`${r}\` matches ${i}: ['${e}'], which covers no route in this app. ` + (i === "except" ? "An `except` that excludes nothing is a rule that reads as active and is not." : "Add `assets: true` if you meant a path the router does not serve.")
|
|
2211
2228
|
});
|
|
2212
2229
|
}
|
|
2213
2230
|
for (let r = 0; r < e.length; r += 1) for (let i = r + 1; i < e.length; i += 1) {
|
|
2214
|
-
let a = e[r], o = e[i], s = t.find((e) =>
|
|
2231
|
+
let a = e[r], o = e[i], s = t.find((e) => Da(a.middleware.match, e) && Da(o.middleware.match, e));
|
|
2215
2232
|
if (s !== void 0) {
|
|
2216
2233
|
n.push({
|
|
2217
2234
|
kind: "overlap",
|
|
@@ -2220,7 +2237,7 @@ import {
|
|
|
2220
2237
|
continue;
|
|
2221
2238
|
}
|
|
2222
2239
|
{
|
|
2223
|
-
let e =
|
|
2240
|
+
let e = Oa(a.middleware.match), t = Oa(o.middleware.match), r = e.some((e) => t.some((t) => Z(e, t) || Z(t, e))), i = (a.middleware.match?.except ?? []).some((e) => t.length > 0 && t.every((t) => Z(e, t))) || (o.middleware.match?.except ?? []).some((t) => e.length > 0 && e.every((e) => Z(t, e)));
|
|
2224
2241
|
r && !i && n.push({
|
|
2225
2242
|
kind: "overlap",
|
|
2226
2243
|
message: `\`${a.exportName}\` and \`${o.exportName}\` both declare \`assets: true\` over overlapping paths. A non-page request would match both, and there is no route to tell them apart.`
|
|
@@ -2228,10 +2245,10 @@ import {
|
|
|
2228
2245
|
}
|
|
2229
2246
|
}
|
|
2230
2247
|
return n;
|
|
2231
|
-
},
|
|
2232
|
-
let r =
|
|
2248
|
+
}, Ma = (e, t) => {
|
|
2249
|
+
let r = ja(e, t);
|
|
2233
2250
|
if (r.length !== 0) throw n(`middleware.ts: ${r.length} problem(s)\n\n` + r.map((e) => ` • ${e.message}`).join("\n\n"));
|
|
2234
|
-
},
|
|
2251
|
+
}, Na = (e) => {
|
|
2235
2252
|
let t = {};
|
|
2236
2253
|
if (!e) return t;
|
|
2237
2254
|
for (let n of e.split(";")) {
|
|
@@ -2245,20 +2262,20 @@ import {
|
|
|
2245
2262
|
}
|
|
2246
2263
|
}
|
|
2247
2264
|
return t;
|
|
2248
|
-
},
|
|
2265
|
+
}, Pa = (e) => Object.entries(e).map(([e, t]) => `${e}=${encodeURIComponent(t)}`).join("; "), Fa = /(^|[-_.])(auth[-_.]?token|session|access[-_.]?token)([-_.]|$)|^sb-.*-auth-token$/i, Ia = (e) => e.httpOnly === void 0 && Fa.test(e.name), La = (e) => {
|
|
2249
2266
|
let t = [`${e.name}=${encodeURIComponent(e.value)}`];
|
|
2250
2267
|
return t.push(`Path=${e.path ?? "/"}`), e.maxAge !== void 0 && t.push(`Max-Age=${Math.trunc(e.maxAge)}`), e.httpOnly !== !1 && t.push("HttpOnly"), e.secure === !0 && t.push("Secure"), t.push(`SameSite=${e.sameSite ?? "lax"}`), t.join("; ");
|
|
2251
|
-
},
|
|
2252
|
-
for (let r of
|
|
2268
|
+
}, Ra = (e) => e.length === 0 ? {} : { "set-cookie": e.map(La) }, za = async (e, t = (e) => import(U(e).href)) => {
|
|
2269
|
+
for (let r of wa) {
|
|
2253
2270
|
let i;
|
|
2254
2271
|
try {
|
|
2255
|
-
i = await t(
|
|
2272
|
+
i = await t(N(e, r));
|
|
2256
2273
|
} catch (e) {
|
|
2257
2274
|
let t = e?.code;
|
|
2258
2275
|
if (t === "ERR_MODULE_NOT_FOUND" || t === "MODULE_NOT_FOUND") continue;
|
|
2259
2276
|
throw e;
|
|
2260
2277
|
}
|
|
2261
|
-
let a = Object.entries(i ?? {}), o = a.filter((e) =>
|
|
2278
|
+
let a = Object.entries(i ?? {}), o = a.filter((e) => Ca(e[1])).map(([e, t]) => ({
|
|
2262
2279
|
exportName: e,
|
|
2263
2280
|
middleware: t
|
|
2264
2281
|
}));
|
|
@@ -2276,7 +2293,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2276
2293
|
return o;
|
|
2277
2294
|
}
|
|
2278
2295
|
return [];
|
|
2279
|
-
},
|
|
2296
|
+
}, Ba = async (e, t, n) => {
|
|
2280
2297
|
let r = {
|
|
2281
2298
|
headers: t.headers,
|
|
2282
2299
|
cookies: t.cookies,
|
|
@@ -2287,7 +2304,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2287
2304
|
let i = await e.run(t);
|
|
2288
2305
|
if (!i) return r;
|
|
2289
2306
|
let a = i.setCookies ?? [];
|
|
2290
|
-
if (n !== void 0) for (let e of a)
|
|
2307
|
+
if (n !== void 0) for (let e of a) Ia(e) && n(e);
|
|
2291
2308
|
let o = i.headers ? {
|
|
2292
2309
|
...t.headers,
|
|
2293
2310
|
...i.headers
|
|
@@ -2301,25 +2318,25 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2301
2318
|
};
|
|
2302
2319
|
let l = { ...t.cookies };
|
|
2303
2320
|
for (let e of a) e.maxAge !== void 0 && e.maxAge <= 0 ? delete l[e.name] : l[e.name] = e.value;
|
|
2304
|
-
return i.headers?.cookie === void 0 && (o.cookie =
|
|
2321
|
+
return i.headers?.cookie === void 0 && (o.cookie = Pa(l)), {
|
|
2305
2322
|
headers: o,
|
|
2306
2323
|
cookies: l,
|
|
2307
2324
|
setCookies: a,
|
|
2308
2325
|
responseHeaders: s,
|
|
2309
2326
|
...c
|
|
2310
2327
|
};
|
|
2311
|
-
},
|
|
2328
|
+
}, Va = /* @__PURE__ */ new Set(["voltro:locale"]), Ha = /* @__PURE__ */ new Set(["authorization", "cookie"]), Ua = (e) => {
|
|
2312
2329
|
let t = e.split(";").map((e) => e.trim()).filter((e) => {
|
|
2313
2330
|
let t = e.indexOf("="), n = (t === -1 ? e : e.slice(0, t)).trim();
|
|
2314
|
-
return
|
|
2331
|
+
return Va.has(n);
|
|
2315
2332
|
});
|
|
2316
2333
|
return t.length > 0 ? t.join("; ") : void 0;
|
|
2317
|
-
},
|
|
2334
|
+
}, Wa = (e) => {
|
|
2318
2335
|
let t = {};
|
|
2319
2336
|
for (let [n, r] of Object.entries(e)) if (!n.startsWith("x-voltro-")) {
|
|
2320
|
-
if (
|
|
2337
|
+
if (Ha.has(n)) {
|
|
2321
2338
|
if (n === "cookie") {
|
|
2322
|
-
let e =
|
|
2339
|
+
let e = Ua(r);
|
|
2323
2340
|
e !== void 0 && (t.cookie = e);
|
|
2324
2341
|
}
|
|
2325
2342
|
continue;
|
|
@@ -2327,61 +2344,74 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2327
2344
|
t[n] = r;
|
|
2328
2345
|
}
|
|
2329
2346
|
return t;
|
|
2330
|
-
},
|
|
2347
|
+
}, Ga = (e) => {
|
|
2331
2348
|
let t = {};
|
|
2332
|
-
for (let [n, r] of Object.entries(e))
|
|
2349
|
+
for (let [n, r] of Object.entries(e)) Va.has(n) && (t[n] = r);
|
|
2333
2350
|
return t;
|
|
2334
|
-
},
|
|
2351
|
+
}, Ka = ve.exponential({
|
|
2352
|
+
start: .001,
|
|
2353
|
+
factor: 2,
|
|
2354
|
+
count: 16
|
|
2355
|
+
}), qa = G.counter("voltro_ppr_shell_serves_total", { description: "ppr responses whose cached shell was written, by page." }), Ja = G.counter("voltro_ppr_hole_passes_total", { description: "ppr per-request hole passes started, by page." }), Ya = G.counter("voltro_ppr_hole_settles_total", { description: "Deferred ppr holes settled and appended to a response, by page." }), Xa = G.counter("voltro_ppr_hole_errors_total", { description: "ppr hole passes that failed as a whole (every hole stays on its fallback), by page." }), Za = G.histogram("voltro_ppr_hole_pass_seconds", Ka, "ppr hole-pass duration in seconds (loader re-run to last hole settled), by page."), Qa = [], $a = /* @__PURE__ */ new Map(), eo = (e) => {
|
|
2356
|
+
let t = $a.get(e);
|
|
2357
|
+
if (t !== void 0) return t;
|
|
2358
|
+
let n = (t) => G.tagged(t, "page", e), r = {
|
|
2359
|
+
shellServes: n(qa),
|
|
2360
|
+
holePasses: n(Ja),
|
|
2361
|
+
holeSettles: n(Ya),
|
|
2362
|
+
holeErrors: n(Xa),
|
|
2363
|
+
holePassSeconds: n(Za)
|
|
2364
|
+
};
|
|
2365
|
+
return $a.set(e, r), r;
|
|
2366
|
+
}, to = (e) => {
|
|
2367
|
+
eo(e).shellServes.unsafeUpdate(1, Qa);
|
|
2368
|
+
}, no = (e) => {
|
|
2369
|
+
eo(e).holePasses.unsafeUpdate(1, Qa);
|
|
2370
|
+
}, ro = (e) => {
|
|
2371
|
+
eo(e).holeSettles.unsafeUpdate(1, Qa);
|
|
2372
|
+
}, io = (e) => {
|
|
2373
|
+
eo(e).holeErrors.unsafeUpdate(1, Qa);
|
|
2374
|
+
}, ao = (e, t) => {
|
|
2375
|
+
eo(e).holePassSeconds.unsafeUpdate(t / 1e3, Qa);
|
|
2376
|
+
}, oo = ["cookie", "authorization"], so = (e) => oo.includes(e) || e.startsWith("x-voltro-"), co = ["voltro:locale"], lo = class extends Error {
|
|
2335
2377
|
constructor(e, t, n) {
|
|
2336
2378
|
super(`[voltro] ppr page '${n}': the SHELL render read the ${e} '${t}'. A ppr shell is CACHED and served to every visitor, so it must be computed without credentials — there is no way to prove request-independence by inspection, so the read itself is the error. Move this read into a deferred hole (the second argument of defer(), which runs per request with the full context), or drop ppr and use renderMode 'ssr'.`), this.name = "PprShellCredentialAccessError";
|
|
2337
2379
|
}
|
|
2338
|
-
},
|
|
2339
|
-
if (typeof n == "string" &&
|
|
2380
|
+
}, uo = (e, t) => new Proxy({ ...e }, { get(e, n, r) {
|
|
2381
|
+
if (typeof n == "string" && so(n)) throw new lo("header", n, t);
|
|
2340
2382
|
return Reflect.get(e, n, r);
|
|
2341
|
-
} }),
|
|
2342
|
-
if (typeof n == "string" && !
|
|
2383
|
+
} }), fo = (e, t) => new Proxy({ ...e }, { get(e, n, r) {
|
|
2384
|
+
if (typeof n == "string" && !co.includes(n) && !(n in Object.prototype)) throw new lo("cookie", n, t);
|
|
2343
2385
|
return Reflect.get(e, n, r);
|
|
2344
|
-
} }),
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
shellServes: 0,
|
|
2348
|
-
holePasses: 0,
|
|
2349
|
-
holeSettles: 0,
|
|
2350
|
-
holeErrors: 0,
|
|
2351
|
-
holeLatencyMsLast: 0,
|
|
2352
|
-
holeLatencyMsMax: 0
|
|
2353
|
-
};
|
|
2354
|
-
}, Ra = async (e) => {
|
|
2355
|
-
let t = La();
|
|
2356
|
-
t.holePasses += 1;
|
|
2357
|
-
let n = Date.now(), r = () => e.res.destroyed === !0 || e.res.writableEnded === !0;
|
|
2386
|
+
} }), po = async (e) => {
|
|
2387
|
+
no(e.page);
|
|
2388
|
+
let t = Date.now(), n = () => e.res.destroyed === !0 || e.res.writableEnded === !0;
|
|
2358
2389
|
try {
|
|
2359
|
-
let
|
|
2360
|
-
if (
|
|
2361
|
-
|
|
2390
|
+
let t = await e.loader(e.ctx), r = e.helpers.prepareDeferredLoaderData(t, "page"), i = r.deferredIds;
|
|
2391
|
+
if (i === void 0) {
|
|
2392
|
+
n() || e.res.end();
|
|
2362
2393
|
return;
|
|
2363
2394
|
}
|
|
2364
|
-
let
|
|
2365
|
-
await Promise.all(Object.entries(
|
|
2366
|
-
let
|
|
2367
|
-
|
|
2395
|
+
let a = r.renderData;
|
|
2396
|
+
await Promise.all(Object.entries(i).map(async ([t, r]) => {
|
|
2397
|
+
let i = await a[t];
|
|
2398
|
+
ro(e.page), !n() && e.res.write(`<script>${e.helpers.deferredSettleScript(r, i)}<\/script>`);
|
|
2368
2399
|
}));
|
|
2369
|
-
} catch (
|
|
2370
|
-
|
|
2400
|
+
} catch (t) {
|
|
2401
|
+
io(e.page), e.log.warn("ppr hole pass failed — holes stay on their fallbacks", { page: e.page }, t);
|
|
2371
2402
|
} finally {
|
|
2372
|
-
|
|
2373
|
-
t.holeLatencyMsLast = i, i > t.holeLatencyMsMax && (t.holeLatencyMsMax = i), r() || e.res.end();
|
|
2403
|
+
ao(e.page, Date.now() - t), n() || e.res.end();
|
|
2374
2404
|
}
|
|
2375
|
-
},
|
|
2405
|
+
}, mo = (e, t) => {
|
|
2376
2406
|
if (e.deferredSegmentIds !== void 0) throw Error(`[voltro] ppr page '${t}': a LAYOUT loader in its chain uses defer(). ppr appends holes for the PAGE loader only — move the deferred field into the page loader, or return the value directly from the layout.`);
|
|
2377
|
-
}, Q =
|
|
2407
|
+
}, Q = W({ scope: "voltro:dev:web" }), ho = W({ scope: "vite" }), go = await (async () => {
|
|
2378
2408
|
try {
|
|
2379
|
-
let e =
|
|
2409
|
+
let e = N(M(H(import.meta.url)), "..", "package.json"), t = await z.readFile(e, "utf8");
|
|
2380
2410
|
return JSON.parse(t).version ?? "0.0.0";
|
|
2381
2411
|
} catch {
|
|
2382
2412
|
return "0.0.0";
|
|
2383
2413
|
}
|
|
2384
|
-
})(),
|
|
2414
|
+
})(), _o = (e, t) => {
|
|
2385
2415
|
let n;
|
|
2386
2416
|
for (let r of e) {
|
|
2387
2417
|
if (!r.hasNotFound) continue;
|
|
@@ -2389,16 +2419,16 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2389
2419
|
i !== "/" && !(t === i || t.startsWith(i + "/")) || (n === void 0 || r.dir.length > n.dir.length) && (n = r);
|
|
2390
2420
|
}
|
|
2391
2421
|
return n;
|
|
2392
|
-
},
|
|
2422
|
+
}, vo = async () => {
|
|
2393
2423
|
try {
|
|
2394
|
-
let e =
|
|
2395
|
-
if (
|
|
2396
|
-
let n =
|
|
2397
|
-
return
|
|
2424
|
+
let e = M(H(import.meta.url)), t = F(e, "..", "..", "devtools");
|
|
2425
|
+
if (L(N(t, "package.json"))) return t;
|
|
2426
|
+
let n = F(e, "..", "..", "..", "devtools");
|
|
2427
|
+
return L(N(n, "package.json")) ? n : null;
|
|
2398
2428
|
} catch {
|
|
2399
2429
|
return null;
|
|
2400
2430
|
}
|
|
2401
|
-
},
|
|
2431
|
+
}, yo = (e, t) => e.disableDevtools || !t ? [] : [
|
|
2402
2432
|
"",
|
|
2403
2433
|
"// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
|
|
2404
2434
|
"// compile-time constant, so prod builds strip this whole `if` block — the",
|
|
@@ -2408,44 +2438,44 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2408
2438
|
" await import('@voltro/devtools/styles.css')",
|
|
2409
2439
|
" Devtools = (await import('@voltro/devtools')).VoltroDevtools",
|
|
2410
2440
|
"}"
|
|
2411
|
-
],
|
|
2441
|
+
], bo = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], xo = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], So = (e) => e.sentry ? [
|
|
2412
2442
|
"",
|
|
2413
2443
|
"// Browser-side Sentry (frontend half of the deep integration). Errors +",
|
|
2414
2444
|
"// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
|
|
2415
2445
|
`await initSentryBrowser(${JSON.stringify(e.sentry)})`
|
|
2416
|
-
] : [],
|
|
2417
|
-
let t = [], n =
|
|
2446
|
+
] : [], Co = (e) => e.env ? ["import './env.public'"] : [], wo = (e) => {
|
|
2447
|
+
let t = [], n = F(e);
|
|
2418
2448
|
for (;;) {
|
|
2419
|
-
|
|
2420
|
-
let e =
|
|
2449
|
+
L(N(n, "pnpm-workspace.yaml")) && t.push(n);
|
|
2450
|
+
let e = M(n);
|
|
2421
2451
|
if (e === n) break;
|
|
2422
2452
|
n = e;
|
|
2423
2453
|
}
|
|
2424
2454
|
return t;
|
|
2425
|
-
},
|
|
2455
|
+
}, To = ie, Eo = (e) => {
|
|
2426
2456
|
if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
|
|
2427
|
-
},
|
|
2428
|
-
let t = e.replace(
|
|
2457
|
+
}, Do = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Oo = (e) => e.startsWith("(") && e.endsWith(")"), ko = (e) => e.filter((e) => !Oo(e)), Ao = (e) => {
|
|
2458
|
+
let t = e.replace(s, "").split("/").filter(Boolean).filter((e) => !Oo(e));
|
|
2429
2459
|
return t.length === 0 ? "/" : "/" + t.join("/");
|
|
2430
|
-
},
|
|
2460
|
+
}, jo = (e) => `${e.replace(s, "").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`, $ = (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}`, Mo = async (e) => {
|
|
2431
2461
|
let t = [], n = [], r = async (e, i) => {
|
|
2432
|
-
let
|
|
2462
|
+
let o = [];
|
|
2433
2463
|
try {
|
|
2434
|
-
|
|
2464
|
+
o = await z.readdir(e, { withFileTypes: !0 });
|
|
2435
2465
|
} catch {
|
|
2436
2466
|
return;
|
|
2437
2467
|
}
|
|
2438
|
-
let c =
|
|
2468
|
+
let c = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !To(e.name)).map((e) => e.name).sort(), u = new Set(l), d = i.join("/");
|
|
2439
2469
|
if (l.some((e) => a.has(e))) {
|
|
2440
2470
|
let t = u.has("layout.tsx"), r = !1;
|
|
2441
2471
|
if (t) try {
|
|
2442
|
-
let t = await
|
|
2443
|
-
r =
|
|
2472
|
+
let t = await z.readFile(N(e, "layout.tsx"), "utf8");
|
|
2473
|
+
r = Do.test(t);
|
|
2444
2474
|
} catch {}
|
|
2445
2475
|
n.push({
|
|
2446
2476
|
dir: d,
|
|
2447
2477
|
chain: i,
|
|
2448
|
-
contributesToUrl: i.length === 0 ||
|
|
2478
|
+
contributesToUrl: i.length === 0 || !Oo(i[i.length - 1]),
|
|
2449
2479
|
hasLayout: t,
|
|
2450
2480
|
hasLayoutLoader: r,
|
|
2451
2481
|
hasError: u.has("error.tsx"),
|
|
@@ -2455,38 +2485,38 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2455
2485
|
});
|
|
2456
2486
|
}
|
|
2457
2487
|
for (let e of l) {
|
|
2458
|
-
if (!
|
|
2488
|
+
if (!s.test(e)) continue;
|
|
2459
2489
|
let n = d ? `${d}/${e}` : e;
|
|
2460
2490
|
t.push({
|
|
2461
2491
|
file: n,
|
|
2462
|
-
pattern:
|
|
2463
|
-
ident:
|
|
2492
|
+
pattern: Ao(n),
|
|
2493
|
+
ident: jo(n),
|
|
2464
2494
|
dirChain: i
|
|
2465
2495
|
});
|
|
2466
2496
|
}
|
|
2467
|
-
for (let t of c) await r(
|
|
2497
|
+
for (let t of c) await r(N(e, t), [...i, t]);
|
|
2468
2498
|
};
|
|
2469
2499
|
await r(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
|
|
2470
2500
|
let i = /* @__PURE__ */ new Set();
|
|
2471
2501
|
for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) i.add(e.dirChain.slice(0, t).join("/"));
|
|
2472
|
-
let
|
|
2473
|
-
for (let { specialFiles: e, ...t } of n) i.has(t.dir) ?
|
|
2502
|
+
let o = [], c = [];
|
|
2503
|
+
for (let { specialFiles: e, ...t } of n) i.has(t.dir) ? o.push(t) : c.push({
|
|
2474
2504
|
dir: t.dir,
|
|
2475
2505
|
files: e
|
|
2476
2506
|
});
|
|
2477
2507
|
return {
|
|
2478
2508
|
pages: t,
|
|
2479
|
-
dirs:
|
|
2509
|
+
dirs: o,
|
|
2480
2510
|
orphanedSpecials: c
|
|
2481
2511
|
};
|
|
2482
|
-
},
|
|
2512
|
+
}, No = (e, t) => {
|
|
2483
2513
|
let n = [];
|
|
2484
2514
|
for (let r = 0; r <= t.length; r++) {
|
|
2485
2515
|
let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
|
|
2486
2516
|
a && n.push(a);
|
|
2487
2517
|
}
|
|
2488
2518
|
return n;
|
|
2489
|
-
},
|
|
2519
|
+
}, Po = async (e) => {
|
|
2490
2520
|
let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
|
|
2491
2521
|
return {
|
|
2492
2522
|
chain: await Promise.all(t.map(async (e, t) => {
|
|
@@ -2510,10 +2540,10 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2510
2540
|
})),
|
|
2511
2541
|
segmentLoaderData: o
|
|
2512
2542
|
};
|
|
2513
|
-
},
|
|
2514
|
-
let t =
|
|
2543
|
+
}, Fo = (e) => {
|
|
2544
|
+
let t = ko(e);
|
|
2515
2545
|
return t.length === 0 ? "" : "/" + t.join("/");
|
|
2516
|
-
},
|
|
2546
|
+
}, Io = [
|
|
2517
2547
|
"// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
|
|
2518
2548
|
"// in sync with Vite's CSS HMR. Without this, edits to .css files",
|
|
2519
2549
|
"// only update the JS-injected <style> overlay; the underlying <link>",
|
|
@@ -2606,7 +2636,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2606
2636
|
" _vdtErrorStart('Build error')",
|
|
2607
2637
|
" })",
|
|
2608
2638
|
"}"
|
|
2609
|
-
].join("\n"),
|
|
2639
|
+
].join("\n"), Lo = (e) => {
|
|
2610
2640
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
2611
2641
|
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, "\\$&"));
|
|
2612
2642
|
let a = i.join("/");
|
|
@@ -2615,8 +2645,8 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2615
2645
|
paramNames: t,
|
|
2616
2646
|
priority: n
|
|
2617
2647
|
};
|
|
2618
|
-
},
|
|
2619
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
2648
|
+
}, Ro = (e) => e.map((e) => {
|
|
2649
|
+
let { regex: t, paramNames: n, priority: r } = Lo(e.pattern);
|
|
2620
2650
|
return {
|
|
2621
2651
|
pattern: e.pattern,
|
|
2622
2652
|
file: e.file,
|
|
@@ -2625,7 +2655,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2625
2655
|
paramNames: n,
|
|
2626
2656
|
priority: r
|
|
2627
2657
|
};
|
|
2628
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
2658
|
+
}).slice().sort((e, t) => e.priority - t.priority), zo = (e, t) => {
|
|
2629
2659
|
for (let n of t) {
|
|
2630
2660
|
let t = n.regex.exec(e);
|
|
2631
2661
|
if (!t) continue;
|
|
@@ -2637,9 +2667,9 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2637
2667
|
};
|
|
2638
2668
|
}
|
|
2639
2669
|
return null;
|
|
2640
|
-
},
|
|
2670
|
+
}, Bo = _, Vo = async (e) => {
|
|
2641
2671
|
try {
|
|
2642
|
-
let t = await import(
|
|
2672
|
+
let t = await import(U(N(e, "app.config.ts")).href), n = t.default?.port, i = r({
|
|
2643
2673
|
kind: "api",
|
|
2644
2674
|
configPort: typeof n == "number" ? n : void 0,
|
|
2645
2675
|
env: {}
|
|
@@ -2653,7 +2683,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2653
2683
|
kind: "api",
|
|
2654
2684
|
env: {}
|
|
2655
2685
|
}).port };
|
|
2656
|
-
},
|
|
2686
|
+
}, Ho = (e, t) => ({
|
|
2657
2687
|
name: e,
|
|
2658
2688
|
pkg: t.package,
|
|
2659
2689
|
browserWsUrl: t.url,
|
|
@@ -2661,7 +2691,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2661
2691
|
...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
|
|
2662
2692
|
...t.headers ? { headers: t.headers } : {},
|
|
2663
2693
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
2664
|
-
}),
|
|
2694
|
+
}), Uo = (e, t, n) => {
|
|
2665
2695
|
let r = t.transport?.wsPath ?? n.wsPath;
|
|
2666
2696
|
return {
|
|
2667
2697
|
name: e,
|
|
@@ -2673,7 +2703,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2673
2703
|
...t.headers ? { headers: t.headers } : {},
|
|
2674
2704
|
...t.authHeaders ? { hasAuthHeaders: !0 } : {}
|
|
2675
2705
|
};
|
|
2676
|
-
},
|
|
2706
|
+
}, Wo = (e) => {
|
|
2677
2707
|
let t = /* @__PURE__ */ new Map();
|
|
2678
2708
|
for (let n of e) {
|
|
2679
2709
|
if (n.proxyTarget === void 0) continue;
|
|
@@ -2681,43 +2711,43 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2681
2711
|
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>.`);
|
|
2682
2712
|
t.set(n.browserWsUrl, n.name);
|
|
2683
2713
|
}
|
|
2684
|
-
},
|
|
2714
|
+
}, Go = async (e, t) => {
|
|
2685
2715
|
let n = Object.entries(t.apis ?? {}), r = [];
|
|
2686
2716
|
for (let [t, i] of n) {
|
|
2687
2717
|
if (i.url) {
|
|
2688
|
-
r.push(
|
|
2718
|
+
r.push(Ho(t, i));
|
|
2689
2719
|
continue;
|
|
2690
2720
|
}
|
|
2691
|
-
let n = await
|
|
2721
|
+
let n = await Bo(e, i.package);
|
|
2692
2722
|
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.`);
|
|
2693
|
-
r.push(
|
|
2723
|
+
r.push(Uo(t, i, await Vo(n)));
|
|
2694
2724
|
}
|
|
2695
|
-
return
|
|
2696
|
-
},
|
|
2725
|
+
return Wo(r), r;
|
|
2726
|
+
}, Ko = (e) => {
|
|
2697
2727
|
if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
|
|
2698
2728
|
let t = new URL(e);
|
|
2699
2729
|
return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
|
|
2700
2730
|
} catch {
|
|
2701
2731
|
return;
|
|
2702
2732
|
}
|
|
2703
|
-
},
|
|
2733
|
+
}, qo = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Jo = (e) => process.env[qo(e)] ?? process.env.VOLTRO_API_ORIGIN, Yo = (e, t) => {
|
|
2704
2734
|
if (!e) return;
|
|
2705
|
-
let n =
|
|
2735
|
+
let n = Jo(e.name) ?? e.serverOrigin;
|
|
2706
2736
|
if (n) {
|
|
2707
|
-
let e =
|
|
2737
|
+
let e = Ko(n);
|
|
2708
2738
|
if (e) return e;
|
|
2709
2739
|
}
|
|
2710
2740
|
if (t?.allowDevProxy && e.proxyTarget) {
|
|
2711
|
-
let t =
|
|
2741
|
+
let t = Ko(e.proxyTarget);
|
|
2712
2742
|
if (t) return t;
|
|
2713
2743
|
}
|
|
2714
|
-
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return
|
|
2715
|
-
},
|
|
2744
|
+
if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Ko(e.browserWsUrl);
|
|
2745
|
+
}, Xo = (e, t, n) => {
|
|
2716
2746
|
if (!e) {
|
|
2717
2747
|
if (n?.apiName === void 0) return;
|
|
2718
2748
|
let e = n.apiName;
|
|
2719
2749
|
return async () => {
|
|
2720
|
-
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 ${
|
|
2750
|
+
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 ${qo(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.`);
|
|
2721
2751
|
};
|
|
2722
2752
|
}
|
|
2723
2753
|
return async (r, i) => {
|
|
@@ -2740,7 +2770,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2740
2770
|
});
|
|
2741
2771
|
} catch (t) {
|
|
2742
2772
|
let i = t?.cause?.code ?? String(t?.message ?? t);
|
|
2743
|
-
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${
|
|
2773
|
+
throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${qo(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 });
|
|
2744
2774
|
}
|
|
2745
2775
|
if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
|
|
2746
2776
|
let s = await o.json();
|
|
@@ -2770,7 +2800,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2770
2800
|
}
|
|
2771
2801
|
if (u) return l;
|
|
2772
2802
|
};
|
|
2773
|
-
},
|
|
2803
|
+
}, Zo = (e, t) => {
|
|
2774
2804
|
let n = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, r = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, i = e.map((e) => `import { appGroup as ${n(e.name)}, appDescriptors as ${r(e.name)} } from '${e.pkg}/rpcGroup'`);
|
|
2775
2805
|
e.some((e) => e.hasAuthHeaders) && (i.push(`import __voltroAppConfig from '${t}'`), i.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
|
|
2776
2806
|
let a = (e) => {
|
|
@@ -2782,10 +2812,10 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2782
2812
|
entryLines: e.map((e) => ` ${JSON.stringify(e.name)}: { ${a(e).join(", ")} },`),
|
|
2783
2813
|
providerEntryLines: e.map((e) => ` { name: ${JSON.stringify(e.name)}, ${a(e).join(", ")} },`)
|
|
2784
2814
|
};
|
|
2785
|
-
},
|
|
2815
|
+
}, Qo = async (e, t, n, r = {}) => {
|
|
2786
2816
|
let i = t.title ?? t.name ?? "app";
|
|
2787
|
-
|
|
2788
|
-
let a = await
|
|
2817
|
+
Ln(e);
|
|
2818
|
+
let a = await Nn(e, t.fonts), o = a === null ? [] : [...a.preloads.map((e) => ` <link rel="preload" as="font" type="font/${e.endsWith(".woff2") ? "woff2" : e.endsWith(".woff") ? "woff" : e.endsWith(".otf") ? "otf" : "ttf"}" href="${e}" crossorigin />`), ` <style data-voltro-fonts>${a.css}</style>`], s = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", c = L(N(e, "node_modules", "@voltro", "devtools", "package.json")) || await vo() !== null, l = t.theme === "system" ? [
|
|
2789
2819
|
" <script>",
|
|
2790
2820
|
" (function () {",
|
|
2791
2821
|
" var root = document.documentElement",
|
|
@@ -2837,10 +2867,10 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2837
2867
|
" </body>",
|
|
2838
2868
|
"</html>",
|
|
2839
2869
|
""
|
|
2840
|
-
].join("\n"), f =
|
|
2870
|
+
].join("\n"), f = N(e, "src", "pages"), { pages: p, dirs: m, orphanedSpecials: h } = await Mo(f);
|
|
2841
2871
|
await b(f, p);
|
|
2842
2872
|
for (let e of h) Q.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.`);
|
|
2843
|
-
let { imports: g, entryLines: _ } =
|
|
2873
|
+
let { imports: g, entryLines: _ } = Zo(n, "../app.config"), v, ee, te;
|
|
2844
2874
|
if (p.length > 0) {
|
|
2845
2875
|
let n = p.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), r = [];
|
|
2846
2876
|
for (let e of m) {
|
|
@@ -2848,13 +2878,13 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2848
2878
|
e.hasLayout && e.hasLayoutLoader ? r.push(`import * as ${$(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && r.push(`import ${$(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && r.push(`import ${$(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && r.push(`import ${$(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && r.push(`import ${$(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
|
|
2849
2879
|
}
|
|
2850
2880
|
let i = p.map((e) => {
|
|
2851
|
-
let t =
|
|
2881
|
+
let t = No(m, e.dirChain).map((e) => {
|
|
2852
2882
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2853
2883
|
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(", ")} }`;
|
|
2854
2884
|
}).join(",\n");
|
|
2855
2885
|
return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
|
|
2856
2886
|
}), a = m.filter((e) => e.hasNotFound).map((e) => {
|
|
2857
|
-
let t =
|
|
2887
|
+
let t = Fo(e.chain), n = No(m, e.chain).map((e) => {
|
|
2858
2888
|
let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
|
|
2859
2889
|
return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
|
|
2860
2890
|
}).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
|
|
@@ -2889,18 +2919,18 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
2889
2919
|
kind: "page",
|
|
2890
2920
|
slotKey: e.pattern
|
|
2891
2921
|
});
|
|
2892
|
-
let h = o.map((e) => ` ${JSON.stringify(e.relPath)},`),
|
|
2922
|
+
let h = o.map((e) => ` ${JSON.stringify(e.relPath)},`), y = o.map((e, t) => {
|
|
2893
2923
|
let n = JSON.stringify(e.slotKey);
|
|
2894
2924
|
return e.kind === "page" ? ` if (newMods[${t}] && refs.pages[${n}] !== undefined) { refs.pages[${n}] = newMods[${t}]; changed = true }` : ` if (newMods[${t}]?.default) { refs.${e.kind === "layout" ? "layouts" : e.kind === "error" ? "errors" : e.kind === "pending" ? "pendings" : "notFounds"}[${n}] = newMods[${t}].default;${e.kind === "layout" ? ` refs.layoutLoaders[${n}] = newMods[${t}].loader;` : ""} changed = true }`;
|
|
2895
|
-
}),
|
|
2896
|
-
if (
|
|
2897
|
-
let
|
|
2925
|
+
}), b = t.locales ?? [], x = b.length > 0 && b.every((t) => L(N(e, "src", "locales", `${t}.ts`)) || L(N(e, "src", "locales", `${t}.tsx`))), S = x, C = t.defaultLocale ?? b[0] ?? "en", w = t.router?.viewTransitions === !0 ? " viewTransitions" : "";
|
|
2926
|
+
if (b.length > 0 && !x && Q.info(`i18n: locales [${b.join(", ")}] declared with no src/locales/<code>.ts — using them for <html lang> and the resolved locale only. Add the catalogs to get <I18nProvider> wired, or keep your own i18n stack.`), b.length > 0 && !b.includes(C)) throw Error(`[voltro dev] app.config.ts: defaultLocale '${C}' must be one of locales [${b.join(", ")}]`);
|
|
2927
|
+
let T = S ? [
|
|
2898
2928
|
"import { I18nProvider } from '@voltro/i18n'",
|
|
2899
2929
|
"import { resolveLocale } from '@voltro/i18n/server'",
|
|
2900
2930
|
"import { useServerRequest } from '@voltro/web'",
|
|
2901
|
-
...
|
|
2931
|
+
...b.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
|
|
2902
2932
|
] : [];
|
|
2903
|
-
|
|
2933
|
+
ee = [
|
|
2904
2934
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
2905
2935
|
"// Routes + per-page chain + not-found scopes assembled from src/pages/.",
|
|
2906
2936
|
"//",
|
|
@@ -3015,7 +3045,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3015
3045
|
" ],",
|
|
3016
3046
|
" (newMods: Array<Record<string, unknown> | undefined>) => {",
|
|
3017
3047
|
" let changed = false",
|
|
3018
|
-
...
|
|
3048
|
+
...y,
|
|
3019
3049
|
" if (changed) bump()",
|
|
3020
3050
|
" },",
|
|
3021
3051
|
" )",
|
|
@@ -3032,16 +3062,16 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3032
3062
|
"",
|
|
3033
3063
|
"import { useMemo, useSyncExternalStore } from 'react'",
|
|
3034
3064
|
"import { Router } from '@voltro/web'",
|
|
3035
|
-
...
|
|
3065
|
+
...T,
|
|
3036
3066
|
"import { subscribe, getVersion, buildRoutes, buildNotFounds } from './routeTable'",
|
|
3037
3067
|
"",
|
|
3038
|
-
...
|
|
3039
|
-
`// i18n auto-wiring (config.locales = [${
|
|
3068
|
+
...S ? [
|
|
3069
|
+
`// i18n auto-wiring (config.locales = [${b.map((e) => JSON.stringify(e)).join(", ")}]).`,
|
|
3040
3070
|
"const I18N_CATALOGS: Record<string, import('@voltro/i18n').MessageCatalog> = {",
|
|
3041
|
-
...
|
|
3071
|
+
...b.map((e) => ` ${JSON.stringify(e)}: i18nCatalog_${e},`),
|
|
3042
3072
|
"}",
|
|
3043
|
-
`const I18N_SUPPORTED: ReadonlyArray<string> = [${
|
|
3044
|
-
`const I18N_DEFAULT = ${JSON.stringify(
|
|
3073
|
+
`const I18N_SUPPORTED: ReadonlyArray<string> = [${b.map((e) => JSON.stringify(e)).join(", ")}]`,
|
|
3074
|
+
`const I18N_DEFAULT = ${JSON.stringify(C)}`,
|
|
3045
3075
|
"",
|
|
3046
3076
|
"// The zone + clock the SERVER decided for this document, read back off",
|
|
3047
3077
|
"// <html>. Same contract as <html lang> below and for the same reason:",
|
|
@@ -3115,7 +3145,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3115
3145
|
" const v = useSyncExternalStore(subscribe, getVersion, getVersion)",
|
|
3116
3146
|
" const routes = useMemo(() => buildRoutes(), [v])",
|
|
3117
3147
|
" const notFounds = useMemo(() => buildNotFounds(), [v])",
|
|
3118
|
-
...
|
|
3148
|
+
...S ? [
|
|
3119
3149
|
" const ssr = useServerRequest()",
|
|
3120
3150
|
" const locale = pickI18nLocale(ssr)",
|
|
3121
3151
|
" const messages = I18N_CATALOGS[locale] ?? I18N_CATALOGS[I18N_DEFAULT]!",
|
|
@@ -3130,26 +3160,26 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3130
3160
|
" defaultLocale={I18N_DEFAULT}",
|
|
3131
3161
|
" {...published}",
|
|
3132
3162
|
" >",
|
|
3133
|
-
` <Router routes={routes} notFounds={notFounds}${
|
|
3163
|
+
` <Router routes={routes} notFounds={notFounds}${w} />`,
|
|
3134
3164
|
" </I18nProvider>",
|
|
3135
3165
|
" )"
|
|
3136
|
-
] : [` return <Router routes={routes} notFounds={notFounds}${
|
|
3166
|
+
] : [` return <Router routes={routes} notFounds={notFounds}${w} />`],
|
|
3137
3167
|
"}",
|
|
3138
3168
|
""
|
|
3139
|
-
].join("\n"),
|
|
3169
|
+
].join("\n"), te = [
|
|
3140
3170
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
3141
3171
|
"// Entry: imports the generated App component and calls mount() with the",
|
|
3142
3172
|
"// resolved apis map. Side-effect only — no local component definitions —",
|
|
3143
3173
|
"// so downstream invalidations (user page edits) terminate at app.tsx.",
|
|
3144
3174
|
"",
|
|
3145
|
-
...
|
|
3175
|
+
...Co(t),
|
|
3146
3176
|
"import { mount } from '@voltro/web'",
|
|
3147
3177
|
...g,
|
|
3148
3178
|
"import { App } from './app'",
|
|
3149
3179
|
"import { preloadCurrentRoute } from './routeTable'",
|
|
3150
|
-
...
|
|
3151
|
-
...
|
|
3152
|
-
...
|
|
3180
|
+
...xo(t),
|
|
3181
|
+
...yo(t, c),
|
|
3182
|
+
...So(t),
|
|
3153
3183
|
"",
|
|
3154
3184
|
"// Preload the current route's page chunk BEFORE hydration so the first",
|
|
3155
3185
|
"// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
|
|
@@ -3166,54 +3196,54 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3166
3196
|
" apis: {",
|
|
3167
3197
|
..._,
|
|
3168
3198
|
" },",
|
|
3169
|
-
...
|
|
3199
|
+
...bo(t, c),
|
|
3170
3200
|
"})",
|
|
3171
3201
|
"",
|
|
3172
|
-
|
|
3202
|
+
Io
|
|
3173
3203
|
].join("\n");
|
|
3174
|
-
} else v = "",
|
|
3204
|
+
} else v = "", ee = "", te = [
|
|
3175
3205
|
"// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
|
|
3176
3206
|
"// The user's root component lives at ../src/App.tsx; this file imports it",
|
|
3177
3207
|
"// and calls mount(). Side-effect only, no component definitions, so the",
|
|
3178
3208
|
"// user's component file remains the Fast Refresh boundary.",
|
|
3179
3209
|
"",
|
|
3180
|
-
...
|
|
3210
|
+
...Co(t),
|
|
3181
3211
|
"import { mount } from '@voltro/web'",
|
|
3182
3212
|
...g,
|
|
3183
3213
|
"import App from '../src/App'",
|
|
3184
|
-
...
|
|
3185
|
-
...
|
|
3186
|
-
...
|
|
3214
|
+
...xo(t),
|
|
3215
|
+
...yo(t, c),
|
|
3216
|
+
...So(t),
|
|
3187
3217
|
"",
|
|
3188
3218
|
"mount(App, {",
|
|
3189
3219
|
" apis: {",
|
|
3190
3220
|
..._,
|
|
3191
3221
|
" },",
|
|
3192
|
-
...
|
|
3222
|
+
...bo(t, c),
|
|
3193
3223
|
"})",
|
|
3194
3224
|
"",
|
|
3195
|
-
|
|
3225
|
+
Io
|
|
3196
3226
|
].join("\n");
|
|
3197
|
-
let
|
|
3198
|
-
await
|
|
3199
|
-
let
|
|
3227
|
+
let y = N(e, ".framework");
|
|
3228
|
+
await z.mkdir(y, { recursive: !0 }), t.env ? await ut(y, r) : await z.rm(N(y, "env.public.ts"), { force: !0 }), await z.writeFile(N(y, "index.html"), d, "utf8"), await z.writeFile(N(y, "main.tsx"), te, "utf8"), v ? (await z.writeFile(N(y, "app.tsx"), v, "utf8"), await z.writeFile(N(y, "routeTable.ts"), ee, "utf8")) : (await z.rm(N(y, "app.tsx"), { force: !0 }), await z.rm(N(y, "routeTable.ts"), { force: !0 }));
|
|
3229
|
+
let x = N(e, ".gitignore"), S = "";
|
|
3200
3230
|
try {
|
|
3201
|
-
|
|
3231
|
+
S = await z.readFile(x, "utf8");
|
|
3202
3232
|
} catch {}
|
|
3203
|
-
let
|
|
3204
|
-
if (
|
|
3205
|
-
let e =
|
|
3233
|
+
let C = ["/.framework/"], w = new Set(S.split("\n").map((e) => e.trim())), T = C.filter((e) => !w.has(e));
|
|
3234
|
+
if (T.length > 0) {
|
|
3235
|
+
let e = S === "" || S.endsWith("\n") ? "" : "\n";
|
|
3206
3236
|
try {
|
|
3207
|
-
await
|
|
3237
|
+
await z.appendFile(x, `${e}${T.join("\n")}\n`, "utf8");
|
|
3208
3238
|
} catch (e) {
|
|
3209
|
-
Q.warn(`could not add ${
|
|
3239
|
+
Q.warn(`could not add ${T.join(", ")} to ${x} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
|
|
3210
3240
|
}
|
|
3211
3241
|
}
|
|
3212
|
-
},
|
|
3242
|
+
}, $o = async (e, t) => {
|
|
3213
3243
|
try {
|
|
3214
|
-
let n =
|
|
3215
|
-
if (!
|
|
3216
|
-
let i = await
|
|
3244
|
+
let n = M(e), r = N(n, "project.json");
|
|
3245
|
+
if (!L(r)) return;
|
|
3246
|
+
let i = await z.readFile(r, "utf8"), a = JSON.parse(i).apps ?? {}, o = e.split("/").filter(Boolean).pop() ?? "", s = [];
|
|
3217
3247
|
for (let [e, n] of Object.entries(a)) e !== o && n.port === t && s.push(e);
|
|
3218
3248
|
if (s.length === 0) return;
|
|
3219
3249
|
Q.warn("sibling app(s) claim the same port — only one boots", {
|
|
@@ -3222,53 +3252,53 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3222
3252
|
projectJson: r
|
|
3223
3253
|
});
|
|
3224
3254
|
} catch {}
|
|
3225
|
-
},
|
|
3226
|
-
let n =
|
|
3255
|
+
}, es = (e) => N(e, ".framework", "dist", "server", "appConfig.js"), ts = async (e, t = {}) => {
|
|
3256
|
+
let n = es(e), r = t.preferSource !== !0 && L(n) ? n : N(e, "app.config.ts");
|
|
3227
3257
|
try {
|
|
3228
|
-
let e = (await import(
|
|
3258
|
+
let e = (await import(U(r).href)).default;
|
|
3229
3259
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
|
|
3230
3260
|
} catch {
|
|
3231
3261
|
return null;
|
|
3232
3262
|
}
|
|
3233
|
-
},
|
|
3263
|
+
}, ns = (e) => {
|
|
3234
3264
|
let t = e.restRoutes;
|
|
3235
3265
|
if (t !== void 0 && t.length !== 0) return `app.config.ts declares ${t.length} restRoute(s) on a type:'web' app — REST routes mount on the API process and were silently ignored here, so a health probe hitting one gets the SPA shell (200) and a POST gets 404.\n Move them to the API app's app.config.ts (they mount under the api origin), and call them there;\n for same-origin paths in front of the web app, terminate them at your ingress/proxy instead.`;
|
|
3236
|
-
},
|
|
3237
|
-
let n = await
|
|
3266
|
+
}, rs = async (e) => {
|
|
3267
|
+
let n = await ts(e, { preferSource: !0 });
|
|
3238
3268
|
if (!n) return {
|
|
3239
3269
|
ran: !1,
|
|
3240
3270
|
exitCode: 0
|
|
3241
3271
|
};
|
|
3242
3272
|
{
|
|
3243
|
-
let e =
|
|
3273
|
+
let e = ns(n);
|
|
3244
3274
|
if (e !== void 0) return Q.error(`voltro dev (web): refusing to boot — ${e}`), {
|
|
3245
3275
|
ran: !0,
|
|
3246
3276
|
exitCode: 1
|
|
3247
3277
|
};
|
|
3248
3278
|
}
|
|
3249
|
-
|
|
3250
|
-
let i =
|
|
3251
|
-
|
|
3252
|
-
let a = await
|
|
3279
|
+
hi();
|
|
3280
|
+
let i = kr();
|
|
3281
|
+
qr(i), Q.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" }), Nt(e, Q);
|
|
3282
|
+
let a = await Go(e, n);
|
|
3253
3283
|
for (let e of a) Q.info("api wired", {
|
|
3254
3284
|
name: e.name,
|
|
3255
3285
|
pkg: e.pkg,
|
|
3256
3286
|
...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
|
|
3257
3287
|
});
|
|
3258
|
-
|
|
3288
|
+
v(e).then((e) => {
|
|
3259
3289
|
for (let t of e.files) if (t.action === "created") {
|
|
3260
3290
|
let e = t.path.split("/").pop() ?? t.path;
|
|
3261
3291
|
Q.info(`${e} seeded`, { path: t.path });
|
|
3262
3292
|
}
|
|
3263
3293
|
}).catch(() => {});
|
|
3264
|
-
let { resolved: o } = await
|
|
3294
|
+
let { resolved: o } = await dt({
|
|
3265
3295
|
rawEnv: n.env,
|
|
3266
3296
|
appType: "web",
|
|
3267
3297
|
root: e,
|
|
3268
3298
|
log: Q,
|
|
3269
3299
|
generateTypes: !0
|
|
3270
3300
|
}), s = o.publicValues;
|
|
3271
|
-
await
|
|
3301
|
+
await Qo(e, n, a, s), Q.debug("generated framework entry files", { files: [
|
|
3272
3302
|
"index.html",
|
|
3273
3303
|
".framework/main.tsx",
|
|
3274
3304
|
...n.env ? [".framework/env.public.ts"] : []
|
|
@@ -3277,46 +3307,46 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3277
3307
|
kind: "web",
|
|
3278
3308
|
configPort: n.port,
|
|
3279
3309
|
env: process.env,
|
|
3280
|
-
dashboardPin: process.env[
|
|
3310
|
+
dashboardPin: process.env[ji] === "1"
|
|
3281
3311
|
});
|
|
3282
3312
|
for (let e of c.warnings) Q.warn(e);
|
|
3283
|
-
let l = c.port,
|
|
3284
|
-
await
|
|
3285
|
-
id:
|
|
3286
|
-
name:
|
|
3313
|
+
let l = c.port, _ = n.name ?? "unnamed", b = ce("web", _, l), x = le(_);
|
|
3314
|
+
await ae({
|
|
3315
|
+
id: b,
|
|
3316
|
+
name: _,
|
|
3287
3317
|
kind: "web",
|
|
3288
3318
|
url: `http://localhost:${l}`,
|
|
3289
3319
|
pid: process.pid,
|
|
3290
3320
|
status: "booting",
|
|
3291
|
-
logFile:
|
|
3292
|
-
}).catch(() => {}), await
|
|
3293
|
-
let { pages:
|
|
3321
|
+
logFile: x.path
|
|
3322
|
+
}).catch(() => {}), await $o(e, l);
|
|
3323
|
+
let { pages: S, dirs: C } = await Mo(N(e, "src", "pages")), w = null, T = n.fonts !== void 0 && n.fonts.length > 0 ? dr({
|
|
3294
3324
|
root: e,
|
|
3295
3325
|
fonts: n.fonts,
|
|
3296
|
-
cache:
|
|
3297
|
-
secret:
|
|
3298
|
-
isOgSsrRoute: (e) =>
|
|
3326
|
+
cache: te(),
|
|
3327
|
+
secret: lr().secret,
|
|
3328
|
+
isOgSsrRoute: (e) => E.ssrRoutes.some((t) => t.pattern === e),
|
|
3299
3329
|
getPageModule: async (e) => {
|
|
3300
|
-
let t =
|
|
3301
|
-
if (t === void 0 ||
|
|
3302
|
-
let n = await
|
|
3330
|
+
let t = E.ssrRoutes.find((t) => t.pattern === e);
|
|
3331
|
+
if (t === void 0 || w === null) return null;
|
|
3332
|
+
let n = await w(t.file), r = ee(n, t.file);
|
|
3303
3333
|
return r === "ssr" || r === "isr" ? n : null;
|
|
3304
3334
|
}
|
|
3305
|
-
}) : null,
|
|
3306
|
-
dirs:
|
|
3307
|
-
ssrRoutes:
|
|
3308
|
-
},
|
|
3335
|
+
}) : null, E = {
|
|
3336
|
+
dirs: C,
|
|
3337
|
+
ssrRoutes: Ro(S)
|
|
3338
|
+
}, D = C.map((e) => ({
|
|
3309
3339
|
dir: e.dir,
|
|
3310
3340
|
hasLayout: e.hasLayout,
|
|
3311
3341
|
hasError: e.hasError,
|
|
3312
3342
|
hasPending: e.hasPending,
|
|
3313
3343
|
hasNotFound: e.hasNotFound
|
|
3314
|
-
})),
|
|
3344
|
+
})), O = await xr({
|
|
3315
3345
|
appRoot: e,
|
|
3316
|
-
pages:
|
|
3346
|
+
pages: S
|
|
3317
3347
|
});
|
|
3318
|
-
|
|
3319
|
-
let
|
|
3348
|
+
O.wrote && Q.debug("routes codegen wrote", { path: P(e, O.path) });
|
|
3349
|
+
let re = await it("vite", () => import("vite")), k = (await import("@vitejs/plugin-react")).default, A = (await import("@tailwindcss/vite")).default, j = N(e, ".framework"), ie = N(e, "src"), M = /* @__PURE__ */ new Set([
|
|
3320
3350
|
".framework",
|
|
3321
3351
|
"node_modules",
|
|
3322
3352
|
"dist",
|
|
@@ -3324,64 +3354,64 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3324
3354
|
".vite",
|
|
3325
3355
|
".turbo",
|
|
3326
3356
|
".cache"
|
|
3327
|
-
]),
|
|
3357
|
+
]), de = {
|
|
3328
3358
|
name: "framework:watch-app-sources",
|
|
3329
3359
|
async configureServer(t) {
|
|
3330
3360
|
try {
|
|
3331
|
-
let n = (await
|
|
3332
|
-
for (let r of n) t.watcher.add(
|
|
3333
|
-
n.length === 0 && t.watcher.add(
|
|
3361
|
+
let n = (await z.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
|
|
3362
|
+
for (let r of n) t.watcher.add(N(e, r.name));
|
|
3363
|
+
n.length === 0 && t.watcher.add(ie);
|
|
3334
3364
|
} catch {
|
|
3335
|
-
t.watcher.add(
|
|
3365
|
+
t.watcher.add(ie);
|
|
3336
3366
|
}
|
|
3337
|
-
for (let n of await
|
|
3367
|
+
for (let n of await g(e)) t.watcher.add(n.dir);
|
|
3338
3368
|
}
|
|
3339
|
-
},
|
|
3369
|
+
}, I = N(e, "src", "pages"), R = (e) => e.endsWith(".tsx") && (e === I || e.startsWith(I + "/")), B = (e) => e === I || e.startsWith(I + "/"), fe = async (t) => {
|
|
3340
3370
|
try {
|
|
3341
3371
|
let r = Date.now();
|
|
3342
|
-
await
|
|
3343
|
-
let { pages: i, dirs: o } = await
|
|
3344
|
-
await
|
|
3372
|
+
await Qo(e, n, a, s);
|
|
3373
|
+
let { pages: i, dirs: o } = await Mo(I);
|
|
3374
|
+
await xr({
|
|
3345
3375
|
appRoot: e,
|
|
3346
3376
|
pages: i
|
|
3347
|
-
}),
|
|
3377
|
+
}), E.dirs = o, E.ssrRoutes = Ro(i), Q.info("page tree regenerated", {
|
|
3348
3378
|
reason: t,
|
|
3349
3379
|
ms: Date.now() - r,
|
|
3350
|
-
routes:
|
|
3380
|
+
routes: E.ssrRoutes.length
|
|
3351
3381
|
});
|
|
3352
|
-
for (let e of
|
|
3382
|
+
for (let e of ja(Y, E.ssrRoutes.map((e) => e.pattern))) Q.error(`middleware.ts: ${e.message}`);
|
|
3353
3383
|
} catch (e) {
|
|
3354
3384
|
Q.error("page tree regen failed", { reason: t }, e);
|
|
3355
3385
|
}
|
|
3356
|
-
},
|
|
3386
|
+
}, pe = {
|
|
3357
3387
|
name: "framework:regenerate-on-page-tree-change",
|
|
3358
3388
|
configureServer(t) {
|
|
3359
3389
|
let n = null, r = [], i = (e) => {
|
|
3360
3390
|
r.push(e), n && clearTimeout(n), n = setTimeout(() => {
|
|
3361
3391
|
n = null;
|
|
3362
3392
|
let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
|
|
3363
|
-
r.length = 0,
|
|
3393
|
+
r.length = 0, fe(e);
|
|
3364
3394
|
}, 50);
|
|
3365
3395
|
};
|
|
3366
3396
|
t.watcher.on("add", (t) => {
|
|
3367
|
-
|
|
3397
|
+
R(t) && i(`add ${P(e, t)}`);
|
|
3368
3398
|
}), t.watcher.on("unlink", (t) => {
|
|
3369
|
-
|
|
3399
|
+
R(t) && i(`unlink ${P(e, t)}`);
|
|
3370
3400
|
}), t.watcher.on("addDir", (t) => {
|
|
3371
|
-
|
|
3401
|
+
B(t) && i(`addDir ${P(e, t)}`);
|
|
3372
3402
|
}), t.watcher.on("unlinkDir", (t) => {
|
|
3373
|
-
|
|
3403
|
+
B(t) && i(`unlinkDir ${P(e, t)}`);
|
|
3374
3404
|
});
|
|
3375
3405
|
}
|
|
3376
|
-
},
|
|
3377
|
-
if (!
|
|
3406
|
+
}, V = N(e, "app.config.ts"), me = (e) => {
|
|
3407
|
+
if (!Ae(e.env)) return "";
|
|
3378
3408
|
let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
|
|
3379
3409
|
return `${String(e.env.publicPrefix)}|${t.join(",")}`;
|
|
3380
|
-
},
|
|
3410
|
+
}, he = (e, t) => {
|
|
3381
3411
|
let n = [];
|
|
3382
|
-
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"),
|
|
3383
|
-
},
|
|
3384
|
-
let e =
|
|
3412
|
+
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"), me(e) !== me(t) && n.push("env"), n;
|
|
3413
|
+
}, H = n, U = F(V), ge = () => {
|
|
3414
|
+
let e = ze(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
|
|
3385
3415
|
stdio: "inherit",
|
|
3386
3416
|
env: process.env,
|
|
3387
3417
|
cwd: process.cwd()
|
|
@@ -3393,24 +3423,24 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3393
3423
|
}), e.on("error", (e) => {
|
|
3394
3424
|
Q.error("restart spawn failed", {}, e), process.exit(1);
|
|
3395
3425
|
});
|
|
3396
|
-
},
|
|
3426
|
+
}, W = {
|
|
3397
3427
|
name: "framework:watch-app-config",
|
|
3398
3428
|
async configureServer(n) {
|
|
3399
|
-
n.watcher.add(
|
|
3400
|
-
let r =
|
|
3429
|
+
n.watcher.add(V), Q.info("watching app.config.ts for changes", { path: P(e, V) });
|
|
3430
|
+
let r = wa.map((t) => N(e, t)), i = new Set(r.map((e) => F(e)));
|
|
3401
3431
|
for (let e of r) n.watcher.add(e);
|
|
3402
3432
|
n.watcher.on("all", (t, r) => {
|
|
3403
|
-
i.has(
|
|
3404
|
-
|
|
3433
|
+
i.has(F(r)) && (Q.warn("middleware.ts changed — restarting (it is loaded once per boot)", { path: P(e, r) }), n.close().catch(() => void 0).then(() => {
|
|
3434
|
+
ge();
|
|
3405
3435
|
}));
|
|
3406
3436
|
});
|
|
3407
3437
|
let a = async () => {
|
|
3408
3438
|
try {
|
|
3409
3439
|
try {
|
|
3410
|
-
let e = n.moduleGraph.getModuleById(
|
|
3440
|
+
let e = n.moduleGraph.getModuleById(V);
|
|
3411
3441
|
e && n.moduleGraph.invalidateModule(e);
|
|
3412
3442
|
} catch {}
|
|
3413
|
-
let e = (await n.ssrLoadModule(
|
|
3443
|
+
let e = (await n.ssrLoadModule(V, { fixStacktrace: !0 })).default;
|
|
3414
3444
|
return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Q.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
|
|
3415
3445
|
} catch (e) {
|
|
3416
3446
|
return Q.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
|
|
@@ -3429,22 +3459,22 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3429
3459
|
theme: t.theme,
|
|
3430
3460
|
port: t.port,
|
|
3431
3461
|
name: t.name
|
|
3432
|
-
}), JSON.stringify(t) === JSON.stringify(
|
|
3462
|
+
}), JSON.stringify(t) === JSON.stringify(H)) {
|
|
3433
3463
|
Q.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
|
|
3434
3464
|
return;
|
|
3435
3465
|
}
|
|
3436
|
-
let r =
|
|
3466
|
+
let r = he(H, t);
|
|
3437
3467
|
if (r.length > 0) {
|
|
3438
3468
|
Q.warn("app.config.ts changed — hard restart required", { fields: r });
|
|
3439
3469
|
try {
|
|
3440
3470
|
await n.close();
|
|
3441
3471
|
} catch {}
|
|
3442
|
-
|
|
3472
|
+
ge();
|
|
3443
3473
|
return;
|
|
3444
3474
|
}
|
|
3445
3475
|
try {
|
|
3446
3476
|
let r = Date.now();
|
|
3447
|
-
await
|
|
3477
|
+
await Qo(e, t, await Go(e, t)), H = t, n.ws && n.ws.send({
|
|
3448
3478
|
type: "full-reload",
|
|
3449
3479
|
path: "*"
|
|
3450
3480
|
}), Q.info("app.config.ts soft-regen", {
|
|
@@ -3454,7 +3484,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3454
3484
|
} catch (e) {
|
|
3455
3485
|
Q.error("app.config.ts soft-regen failed", {}, e);
|
|
3456
3486
|
}
|
|
3457
|
-
}, l = (e) =>
|
|
3487
|
+
}, l = (e) => ue(e) === "app.config.ts" ? e === V || F(e) === U : !1;
|
|
3458
3488
|
n.watcher.on("change", (e) => {
|
|
3459
3489
|
l(e) && (Q.info("app.config.ts change event (chokidar)", { file: e }), s());
|
|
3460
3490
|
}), n.watcher.on("add", (e) => {
|
|
@@ -3462,46 +3492,46 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3462
3492
|
});
|
|
3463
3493
|
try {
|
|
3464
3494
|
let { watchFile: e } = await import("node:fs");
|
|
3465
|
-
e(
|
|
3495
|
+
e(V, { interval: 500 }, (e, t) => {
|
|
3466
3496
|
e.mtimeMs !== t.mtimeMs && (Q.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), s());
|
|
3467
3497
|
}), Q.info("app.config.ts polling watcher attached", { intervalMs: 500 });
|
|
3468
3498
|
} catch (e) {
|
|
3469
3499
|
Q.warn("app.config.ts polling watcher could not attach", {}, e);
|
|
3470
3500
|
}
|
|
3471
|
-
|
|
3501
|
+
gt(t, Q, {
|
|
3472
3502
|
root: e,
|
|
3473
3503
|
onBeforeRestart: () => n.close()
|
|
3474
3504
|
});
|
|
3475
3505
|
}
|
|
3476
|
-
},
|
|
3506
|
+
}, G = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ve = 0, ye = {
|
|
3477
3507
|
name: "framework:suppress-api-hmr",
|
|
3478
3508
|
handleHotUpdate(e) {
|
|
3479
|
-
if (
|
|
3509
|
+
if (ve += 1, G.test(e.file)) return [];
|
|
3480
3510
|
}
|
|
3481
|
-
},
|
|
3511
|
+
}, be = {
|
|
3482
3512
|
name: "framework:reoptimize-on-rpcgroup-change",
|
|
3483
3513
|
async configureServer(t) {
|
|
3484
3514
|
let n = [];
|
|
3485
3515
|
for (let r of a) {
|
|
3486
|
-
let i = await
|
|
3516
|
+
let i = await Bo(e, r.pkg);
|
|
3487
3517
|
if (i) {
|
|
3488
3518
|
n.push(i);
|
|
3489
3519
|
try {
|
|
3490
|
-
t.watcher.add(
|
|
3520
|
+
t.watcher.add(N(i, "rpcGroup.generated.ts"));
|
|
3491
3521
|
} catch {}
|
|
3492
|
-
for (let e of await
|
|
3522
|
+
for (let e of await ba(i)) try {
|
|
3493
3523
|
t.watcher.add(e);
|
|
3494
3524
|
} catch {}
|
|
3495
3525
|
}
|
|
3496
3526
|
}
|
|
3497
3527
|
if (n.length === 0) return;
|
|
3498
|
-
let r = await
|
|
3528
|
+
let r = await Sa(n), i = null, o = !1, s = async () => {
|
|
3499
3529
|
if (o) return;
|
|
3500
|
-
let e = await
|
|
3530
|
+
let e = await Sa(n);
|
|
3501
3531
|
if (e !== void 0 && e !== r) {
|
|
3502
3532
|
r = e, o = !0, Q.info("the api surface changed — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)");
|
|
3503
3533
|
try {
|
|
3504
|
-
await
|
|
3534
|
+
await z.rm(N(j, ".vite", "deps"), {
|
|
3505
3535
|
recursive: !0,
|
|
3506
3536
|
force: !0
|
|
3507
3537
|
}), await t.restart(!0);
|
|
@@ -3510,16 +3540,16 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3510
3540
|
}
|
|
3511
3541
|
}
|
|
3512
3542
|
}, c = (e) => {
|
|
3513
|
-
let t =
|
|
3514
|
-
!
|
|
3543
|
+
let t = F(e);
|
|
3544
|
+
!va(t) && !t.endsWith("rpcGroup.generated.ts") || (i && clearTimeout(i), i = setTimeout(() => {
|
|
3515
3545
|
s();
|
|
3516
3546
|
}, 120));
|
|
3517
3547
|
};
|
|
3518
3548
|
t.watcher.on("change", c), t.watcher.on("add", c);
|
|
3519
3549
|
}
|
|
3520
|
-
},
|
|
3550
|
+
}, xe = {}, Se = (e) => (t) => {
|
|
3521
3551
|
t.on("proxyReq", (t, n) => {
|
|
3522
|
-
|
|
3552
|
+
pi(t, n, {
|
|
3523
3553
|
target: e,
|
|
3524
3554
|
token: process.env.VOLTRO_INSPECT_TOKEN,
|
|
3525
3555
|
writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
|
|
@@ -3529,26 +3559,26 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3529
3559
|
};
|
|
3530
3560
|
for (let e of a) {
|
|
3531
3561
|
if (!e.proxyTarget) continue;
|
|
3532
|
-
|
|
3562
|
+
xe[e.browserWsUrl] = {
|
|
3533
3563
|
target: e.proxyTarget,
|
|
3534
3564
|
ws: !0,
|
|
3535
3565
|
changeOrigin: !0,
|
|
3536
3566
|
...e.wsPath ? {} : { rewrite: () => "/ws" }
|
|
3537
3567
|
};
|
|
3538
3568
|
let t = e.proxyTarget.replace(/^ws/, "http");
|
|
3539
|
-
|
|
3569
|
+
xe[`/_voltro/api/${e.name}`] = {
|
|
3540
3570
|
target: t,
|
|
3541
3571
|
changeOrigin: !0,
|
|
3542
3572
|
rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
|
|
3543
|
-
configure:
|
|
3573
|
+
configure: Se(t)
|
|
3544
3574
|
};
|
|
3545
3575
|
}
|
|
3546
3576
|
for (let [e, t] of Object.entries(n.proxies ?? {})) {
|
|
3547
|
-
if (
|
|
3577
|
+
if (xe[e]) {
|
|
3548
3578
|
Q.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
|
|
3549
3579
|
continue;
|
|
3550
3580
|
}
|
|
3551
|
-
|
|
3581
|
+
xe[e] = {
|
|
3552
3582
|
target: t.target,
|
|
3553
3583
|
changeOrigin: t.changeOrigin ?? !0,
|
|
3554
3584
|
...t.rewrite === void 0 ? {} : { rewrite: (n) => n.replace(RegExp(`^${e}`), t.rewrite) }
|
|
@@ -3558,19 +3588,19 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3558
3588
|
...t.rewrite === void 0 ? {} : { rewrite: t.rewrite }
|
|
3559
3589
|
});
|
|
3560
3590
|
}
|
|
3561
|
-
let
|
|
3591
|
+
let Ce = {
|
|
3562
3592
|
name: "framework:inspect",
|
|
3563
3593
|
configureServer(t) {
|
|
3564
3594
|
let r = null, a = async () => {
|
|
3565
3595
|
if (r !== null) return r;
|
|
3566
3596
|
let n = [];
|
|
3567
|
-
for (let r of
|
|
3568
|
-
let i = await t.ssrLoadModule(
|
|
3597
|
+
for (let r of S) try {
|
|
3598
|
+
let i = await t.ssrLoadModule(N(e, "src", "pages", r.file));
|
|
3569
3599
|
n.push({
|
|
3570
3600
|
pattern: r.pattern,
|
|
3571
3601
|
file: r.file,
|
|
3572
3602
|
dirChain: r.dirChain,
|
|
3573
|
-
renderMode:
|
|
3603
|
+
renderMode: ee(i, N("src", "pages", r.file)),
|
|
3574
3604
|
interactive: i.interactive ?? "full",
|
|
3575
3605
|
tenantAware: i.tenantAware === !0,
|
|
3576
3606
|
revalidateMs: y(i.revalidate),
|
|
@@ -3601,9 +3631,9 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3601
3631
|
}), n();
|
|
3602
3632
|
}), t.middlewares.use((t, n, r) => {
|
|
3603
3633
|
if (t.method !== "GET" && t.method !== "HEAD") return r();
|
|
3604
|
-
let { pathname: i } =
|
|
3605
|
-
if (i !== "/robots.txt" ||
|
|
3606
|
-
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(
|
|
3634
|
+
let { pathname: i } = Ji(t.url ?? "/");
|
|
3635
|
+
if (i !== "/robots.txt" || L(N(e, "public", "robots.txt"))) return r();
|
|
3636
|
+
n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(Dr({ indexable: !1 }));
|
|
3607
3637
|
}), n.name === "voltroDashboard" && t.middlewares.use(async (e, t, n) => {
|
|
3608
3638
|
let r = e.url ?? "", i = r.split("?")[0];
|
|
3609
3639
|
if (i === "/api/dashboard/proxy") {
|
|
@@ -3694,7 +3724,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3694
3724
|
for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (s[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
|
|
3695
3725
|
let c = o.split("?")[0];
|
|
3696
3726
|
if (e.method === "GET" && (c === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
|
|
3697
|
-
let e = d(s.origin), n =
|
|
3727
|
+
let e = d(s.origin), n = si(o, Hr(), s);
|
|
3698
3728
|
t.statusCode = n.status, t.setHeader("content-type", n.contentType);
|
|
3699
3729
|
for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
|
|
3700
3730
|
t.end(n.body);
|
|
@@ -3712,7 +3742,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3712
3742
|
e.setEncoding("utf-8"), e.on("data", (e) => {
|
|
3713
3743
|
r += e;
|
|
3714
3744
|
}), e.on("end", () => {
|
|
3715
|
-
let e =
|
|
3745
|
+
let e = ti(r, i);
|
|
3716
3746
|
t.statusCode = e.status, t.setHeader("content-type", e.contentType);
|
|
3717
3747
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3718
3748
|
t.end(e.body);
|
|
@@ -3743,14 +3773,14 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3743
3773
|
for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
|
|
3744
3774
|
t.flushHeaders?.(), t.write("retry: 5000\n\n");
|
|
3745
3775
|
let a = o.indexOf("?");
|
|
3746
|
-
if (a === -1 || new URLSearchParams(o.slice(a + 1)).get("live") !== "1") for (let e of i.buffered()) t.write(
|
|
3776
|
+
if (a === -1 || new URLSearchParams(o.slice(a + 1)).get("live") !== "1") for (let e of i.buffered()) t.write(Ar(e));
|
|
3747
3777
|
let c = i.subscribe((e) => {
|
|
3748
3778
|
try {
|
|
3749
|
-
t.write(
|
|
3779
|
+
t.write(Ar(e));
|
|
3750
3780
|
} catch {}
|
|
3751
3781
|
}), l = setInterval(() => {
|
|
3752
3782
|
try {
|
|
3753
|
-
t.write(
|
|
3783
|
+
t.write(jr());
|
|
3754
3784
|
} catch {}
|
|
3755
3785
|
}, 15e3), p = () => {
|
|
3756
3786
|
clearInterval(l), c();
|
|
@@ -3763,7 +3793,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3763
3793
|
kind: "web",
|
|
3764
3794
|
meta: {
|
|
3765
3795
|
name: n.name ?? "(unnamed)",
|
|
3766
|
-
voltroVersion:
|
|
3796
|
+
voltroVersion: go,
|
|
3767
3797
|
port: l,
|
|
3768
3798
|
mode: "dev",
|
|
3769
3799
|
apis: Object.entries(n.apis ?? {}).map(([e, t]) => {
|
|
@@ -3775,13 +3805,13 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3775
3805
|
})
|
|
3776
3806
|
},
|
|
3777
3807
|
routes: await a(),
|
|
3778
|
-
dirs:
|
|
3808
|
+
dirs: D,
|
|
3779
3809
|
cache: () => ({
|
|
3780
3810
|
backend: "memory",
|
|
3781
3811
|
size: 0,
|
|
3782
3812
|
entries: []
|
|
3783
3813
|
}),
|
|
3784
|
-
env: () =>
|
|
3814
|
+
env: () => pt(n.name ?? "app", { contract: Ae(n.env) ? n.env : void 0 })
|
|
3785
3815
|
}, c = p(o, i, s, { method: e.method ?? "GET" });
|
|
3786
3816
|
if (c === null) return r();
|
|
3787
3817
|
t.statusCode = c.status, t.setHeader("content-type", c.contentType);
|
|
@@ -3792,25 +3822,25 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3792
3822
|
}
|
|
3793
3823
|
});
|
|
3794
3824
|
}
|
|
3795
|
-
},
|
|
3825
|
+
}, we = n.name === "voltroDashboard" ? {
|
|
3796
3826
|
name: "framework:dashboard-registry",
|
|
3797
3827
|
configureServer(e) {
|
|
3798
3828
|
e.middlewares.use(async (e, t, n) => {
|
|
3799
3829
|
if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
|
|
3800
3830
|
try {
|
|
3801
|
-
let e = await
|
|
3831
|
+
let e = await oe();
|
|
3802
3832
|
t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
|
|
3803
3833
|
} catch (e) {
|
|
3804
3834
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
|
|
3805
3835
|
}
|
|
3806
3836
|
});
|
|
3807
3837
|
}
|
|
3808
|
-
} : null,
|
|
3809
|
-
let o =
|
|
3838
|
+
} : null, Te = /* @__PURE__ */ new Set(), Ee = (e, t, n, r, i, a = !1) => {
|
|
3839
|
+
let o = ta(i, a, t) ?? "";
|
|
3810
3840
|
if (Q.error(`${t} render failed`, {
|
|
3811
3841
|
pathname: n,
|
|
3812
3842
|
pattern: r,
|
|
3813
|
-
cause:
|
|
3843
|
+
cause: Nr(i) + o
|
|
3814
3844
|
}), e.headersSent) {
|
|
3815
3845
|
e.end();
|
|
3816
3846
|
return;
|
|
@@ -3818,12 +3848,12 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3818
3848
|
e.writeHead(500, {
|
|
3819
3849
|
"content-type": "text/plain; charset=utf-8",
|
|
3820
3850
|
"x-voltro-rendered-by": `${t}-failed`,
|
|
3821
|
-
"x-voltro-ssr-generation": String(
|
|
3851
|
+
"x-voltro-ssr-generation": String(ve)
|
|
3822
3852
|
});
|
|
3823
|
-
let s =
|
|
3824
|
-
e.end(`${t} render failed for ${n}\n\n${
|
|
3825
|
-
},
|
|
3826
|
-
limit:
|
|
3853
|
+
let s = ve === 0 ? "" : `\n[voltro] this process has absorbed ${ve} hot update(s) since boot, so its SSR\nmodule graph may not match the files on disk. Before reporting this — to us or to\nyourself — restart \`voltro dev\` and measure once from a fresh boot.\n`;
|
|
3854
|
+
e.end(`${t} render failed for ${n}\n\n${Nr(i)}\n${o}\n${s}`);
|
|
3855
|
+
}, De = Gt(), Oe = qt({
|
|
3856
|
+
limit: De,
|
|
3827
3857
|
onColdStart: (e) => Q.debug("ssr cold-compile start", { id: e }),
|
|
3828
3858
|
onColdEnd: (e, { durationMs: t, failed: n }) => Q.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
3829
3859
|
id: e,
|
|
@@ -3831,17 +3861,17 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3831
3861
|
...n ? { failed: !0 } : {}
|
|
3832
3862
|
})
|
|
3833
3863
|
});
|
|
3834
|
-
Q.debug(`ssr cold-compile concurrency ${
|
|
3835
|
-
let
|
|
3864
|
+
Q.debug(`ssr cold-compile concurrency ${De}`, { concurrency: De });
|
|
3865
|
+
let ke = null, je = async () => (ke === null && (ke = await z.readFile(N(e, ".framework", "index.html"), "utf8")), ke), Me = {
|
|
3836
3866
|
name: "framework:ssr",
|
|
3837
3867
|
configureServer(t) {
|
|
3838
|
-
let r = (e) =>
|
|
3868
|
+
let r = (e) => Oe.load(e, async () => await t.ssrLoadModule(e)), i, o = !1, s = () => {
|
|
3839
3869
|
if (i !== void 0) return i;
|
|
3840
3870
|
let t = n.locales ?? [], a = n.defaultLocale ?? t[0] ?? "en";
|
|
3841
3871
|
return t.length === 0 ? (i = Promise.resolve(() => void 0), i) : (i = (async () => {
|
|
3842
3872
|
let [{ makeSsgWrap: i }, { makeSsrI18nResolver: s }] = await Promise.all([r("@voltro/i18n"), r("@voltro/i18n/server")]), c = {};
|
|
3843
|
-
for (let n of t) if (
|
|
3844
|
-
let t = (await r(
|
|
3873
|
+
for (let n of t) if (L(N(e, "src", "locales", `${n}.ts`))) try {
|
|
3874
|
+
let t = (await r(N(e, "src", "locales", `${n}.ts`))).default;
|
|
3845
3875
|
t !== void 0 && (c[n] = i(n, t, a));
|
|
3846
3876
|
} catch (e) {
|
|
3847
3877
|
Q.warn("locale catalog failed to load for SSR", { locale: n }, e);
|
|
@@ -3871,31 +3901,43 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3871
3901
|
defaultTimeZone: n.defaultTimeZone ?? null
|
|
3872
3902
|
});
|
|
3873
3903
|
})(), i);
|
|
3874
|
-
}, c =
|
|
3904
|
+
}, c, l = () => (c ??= (async () => {
|
|
3905
|
+
try {
|
|
3906
|
+
let e = a[0];
|
|
3907
|
+
if (e === void 0) return;
|
|
3908
|
+
let t = (await r(`${e.pkg}/rpcGroup`)).appDescriptors;
|
|
3909
|
+
if (t === void 0) return;
|
|
3910
|
+
(await r("@voltro/web/ssr")).registerSsrApiDescriptors?.(e.name, t);
|
|
3911
|
+
} catch {}
|
|
3912
|
+
})(), c), u = on({
|
|
3875
3913
|
apiName: a[0]?.name,
|
|
3876
|
-
apiOrigin:
|
|
3914
|
+
apiOrigin: Yo(a[0], { allowDevProxy: !0 }),
|
|
3877
3915
|
loadDescriptors: async () => {
|
|
3878
3916
|
let e = a[0];
|
|
3879
3917
|
if (e !== void 0) return (await r(`${e.pkg}/rpcGroup`)).appDescriptors;
|
|
3880
3918
|
},
|
|
3881
|
-
rpcQuery: (e, t) =>
|
|
3919
|
+
rpcQuery: (e, t) => Xo(Yo(a[0], { allowDevProxy: !0 }), e, {
|
|
3882
3920
|
apiName: a[0]?.name,
|
|
3883
3921
|
headers: t
|
|
3884
3922
|
}),
|
|
3923
|
+
resolveLocale: async (e, t) => {
|
|
3924
|
+
let r = tn(t, n.locales);
|
|
3925
|
+
return r === void 0 ? (await s())(e.cookie, e["accept-language"])?.locale ?? "en" : r;
|
|
3926
|
+
},
|
|
3885
3927
|
renderErrorPage: async () => void 0
|
|
3886
3928
|
});
|
|
3887
3929
|
t.middlewares.use((e, t, n) => {
|
|
3888
|
-
if (!(e.url ?? "/").split("?")[0].startsWith(
|
|
3889
|
-
|
|
3930
|
+
if (!(e.url ?? "/").split("?")[0].startsWith(Ue)) return n();
|
|
3931
|
+
u(e, t, (t, r) => {
|
|
3890
3932
|
e.url = t, e.method = "GET", e.__voltroFormFlash = r, n();
|
|
3891
3933
|
}).then((e) => {
|
|
3892
3934
|
e || n();
|
|
3893
3935
|
});
|
|
3894
|
-
}),
|
|
3936
|
+
}), w = async (n) => await t.ssrLoadModule(N(e, "src", "pages", n)), t.middlewares.use(async (e, t, n) => {
|
|
3895
3937
|
let r = e.url ?? "/";
|
|
3896
|
-
if (!r.startsWith("/_voltro/og") ||
|
|
3938
|
+
if (!r.startsWith("/_voltro/og") || T === null) return n();
|
|
3897
3939
|
try {
|
|
3898
|
-
let e = await
|
|
3940
|
+
let e = await T.handle(new URL(r, "http://localhost"));
|
|
3899
3941
|
if (e === null) return n();
|
|
3900
3942
|
t.statusCode = e.status;
|
|
3901
3943
|
for (let [n, r] of Object.entries(e.headers)) t.setHeader(n, r);
|
|
@@ -3903,36 +3945,36 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3903
3945
|
} catch (e) {
|
|
3904
3946
|
t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`og render error: ${e.message}`);
|
|
3905
3947
|
}
|
|
3906
|
-
}), t.middlewares.use(async (i, c,
|
|
3907
|
-
if (i.method !== "GET" && i.method !== "HEAD") return
|
|
3908
|
-
let
|
|
3909
|
-
|
|
3910
|
-
let { pathname:
|
|
3911
|
-
if (
|
|
3912
|
-
let
|
|
3948
|
+
}), t.middlewares.use(async (i, c, u) => {
|
|
3949
|
+
if (i.method !== "GET" && i.method !== "HEAD") return u();
|
|
3950
|
+
let d = i.url ?? "/";
|
|
3951
|
+
d.indexOf("?");
|
|
3952
|
+
let { pathname: f, search: p } = Ji(d), m = i.__voltroFormFlash;
|
|
3953
|
+
if (f.startsWith("/@") || f.startsWith("/node_modules/") || f.startsWith("/.framework/") || f.startsWith("/_voltro/") || f === "/main.tsx" || f === "/index.html" || f === "/sw.js" || f === "/favicon.ico" || f === "/robots.txt") return u();
|
|
3954
|
+
let h = async () => {
|
|
3913
3955
|
if (Y.length === 0) return;
|
|
3914
|
-
let e =
|
|
3956
|
+
let e = Aa(Y, {
|
|
3915
3957
|
route: void 0,
|
|
3916
|
-
pathname:
|
|
3958
|
+
pathname: f
|
|
3917
3959
|
});
|
|
3918
3960
|
if (e === void 0) return;
|
|
3919
3961
|
let t = {};
|
|
3920
3962
|
for (let [e, n] of Object.entries(i.headers ?? {})) typeof n == "string" ? t[e] = n : Array.isArray(n) && (t[e] = n.join(", "));
|
|
3921
|
-
let n = await
|
|
3922
|
-
pathname:
|
|
3923
|
-
search:
|
|
3963
|
+
let n = await Ba(e, {
|
|
3964
|
+
pathname: f,
|
|
3965
|
+
search: p,
|
|
3924
3966
|
headers: t,
|
|
3925
|
-
cookies:
|
|
3967
|
+
cookies: Na(t.cookie),
|
|
3926
3968
|
route: void 0
|
|
3927
3969
|
});
|
|
3928
|
-
for (let e of n.setCookies) c.appendHeader("set-cookie",
|
|
3970
|
+
for (let e of n.setCookies) c.appendHeader("set-cookie", La(e));
|
|
3929
3971
|
};
|
|
3930
|
-
if (/\.[a-z0-9]+$/i.test(
|
|
3931
|
-
let
|
|
3932
|
-
if (!
|
|
3933
|
-
let e =
|
|
3934
|
-
if (e === void 0) return await
|
|
3935
|
-
|
|
3972
|
+
if (/\.[a-z0-9]+$/i.test(f)) return await h(), u();
|
|
3973
|
+
let g = zo(f, E.ssrRoutes), _ = !1;
|
|
3974
|
+
if (!g) {
|
|
3975
|
+
let e = _o(E.dirs, f);
|
|
3976
|
+
if (e === void 0) return await h(), u();
|
|
3977
|
+
_ = !0, g = {
|
|
3936
3978
|
route: {
|
|
3937
3979
|
pattern: "<not-found>",
|
|
3938
3980
|
file: e.dir === "" ? "not-found.tsx" : `${e.dir}/not-found.tsx`,
|
|
@@ -3944,15 +3986,15 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3944
3986
|
params: {}
|
|
3945
3987
|
};
|
|
3946
3988
|
}
|
|
3947
|
-
let v = !
|
|
3948
|
-
v && Q.info(`ssr compiling ${
|
|
3949
|
-
pattern:
|
|
3950
|
-
pathname:
|
|
3989
|
+
let v = !Te.has(g.route.pattern), te = Date.now();
|
|
3990
|
+
v && Q.info(`ssr compiling ${g.route.pattern}`, {
|
|
3991
|
+
pattern: g.route.pattern,
|
|
3992
|
+
pathname: f
|
|
3951
3993
|
});
|
|
3952
|
-
let
|
|
3994
|
+
let y = {}, b = async (e, t) => {
|
|
3953
3995
|
let n = Date.now(), r = await t();
|
|
3954
|
-
return
|
|
3955
|
-
},
|
|
3996
|
+
return y[e] = (y[e] ?? 0) + (Date.now() - n), r;
|
|
3997
|
+
}, x = async (e, n, r) => {
|
|
3956
3998
|
let i = await t.moduleGraph.getModuleById(e);
|
|
3957
3999
|
if (!(!i || n.has(e))) {
|
|
3958
4000
|
if (n.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
|
|
@@ -3960,326 +4002,329 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
3960
4002
|
r.includes(e) || r.push(e);
|
|
3961
4003
|
return;
|
|
3962
4004
|
}
|
|
3963
|
-
for (let e of i.importedModules ?? []) e.id && await
|
|
4005
|
+
for (let e of i.importedModules ?? []) e.id && await x(e.id, n, r);
|
|
3964
4006
|
}
|
|
3965
|
-
},
|
|
4007
|
+
}, S = !1;
|
|
3966
4008
|
try {
|
|
3967
|
-
let
|
|
3968
|
-
if (
|
|
3969
|
-
let
|
|
3970
|
-
for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ?
|
|
3971
|
-
let
|
|
3972
|
-
route:
|
|
3973
|
-
pathname:
|
|
4009
|
+
let C = await b("loadPage", async () => await r(N(e, "src", "pages", g.route.file))), w = _ ? "ssr" : ee(C, N("src", "pages", g.route.file)), ne = No(E.dirs, g.route.dirChain), D = w === "spa" && ne.some((e) => e.hasLayout), O = C.interactive ?? "full";
|
|
4010
|
+
if (w !== "ssr" && w !== "isr" && !D && O !== "islands") return await h(), u();
|
|
4011
|
+
let re = {};
|
|
4012
|
+
for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ? re[e] = t : Array.isArray(t) && (re[e] = t.join(", "));
|
|
4013
|
+
let k = await Ba(Aa(Y, {
|
|
4014
|
+
route: g.route.pattern,
|
|
4015
|
+
pathname: f
|
|
3974
4016
|
}), {
|
|
3975
|
-
pathname:
|
|
3976
|
-
search:
|
|
3977
|
-
headers:
|
|
3978
|
-
cookies:
|
|
3979
|
-
route:
|
|
3980
|
-
},
|
|
3981
|
-
for (let e of
|
|
3982
|
-
for (let [e, t] of Object.entries(
|
|
3983
|
-
if (
|
|
3984
|
-
let
|
|
4017
|
+
pathname: f,
|
|
4018
|
+
search: p,
|
|
4019
|
+
headers: re,
|
|
4020
|
+
cookies: Na(re.cookie),
|
|
4021
|
+
route: g.route.pattern
|
|
4022
|
+
}, Re);
|
|
4023
|
+
for (let e of k.setCookies) c.appendHeader("set-cookie", La(e));
|
|
4024
|
+
for (let [e, t] of Object.entries(k.responseHeaders)) c.setHeader(e, t);
|
|
4025
|
+
if (w === "isr" && k.cspNonce !== void 0) throw Error(`page '${g.route.pattern}' is renderMode 'isr' while middleware.ts mints a cspNonce — an isr render is CACHED and a cached nonce is a lie the browser enforces. Use renderMode 'ssr' for nonce'd pages, or a hash-based CSP for isr.`);
|
|
4026
|
+
let A = w === "isr" ? Wa(k.headers) : k.headers, j = w === "isr" && C.ppr === !0, ie = j ? uo(A, g.route.pattern) : A, ae = Xo(Yo(a[0], { allowDevProxy: !0 }), A.cookie, {
|
|
3985
4027
|
apiName: a[0]?.name,
|
|
3986
|
-
headers:
|
|
3987
|
-
}),
|
|
3988
|
-
c.once("close",
|
|
3989
|
-
let
|
|
4028
|
+
headers: A
|
|
4029
|
+
}), oe = new AbortController(), se = () => oe.abort();
|
|
4030
|
+
c.once("close", se);
|
|
4031
|
+
let ce = null, le = [], ue = {};
|
|
3990
4032
|
try {
|
|
3991
|
-
(await r("@voltro/web/ssr")).beginStoreSeeds(), {chain:
|
|
3992
|
-
entries:
|
|
3993
|
-
loadLayout: (t) => r(
|
|
3994
|
-
loadError: (t) => r(
|
|
3995
|
-
loadPending: (t) => r(
|
|
4033
|
+
(await r("@voltro/web/ssr")).beginStoreSeeds(), await l(), {chain: le, segmentLoaderData: ue} = await b("loadChain", () => Po({
|
|
4034
|
+
entries: ne,
|
|
4035
|
+
loadLayout: (t) => r(N(e, "src", "pages", t.dir, "layout.tsx")),
|
|
4036
|
+
loadError: (t) => r(N(e, "src", "pages", t.dir, "error.tsx")),
|
|
4037
|
+
loadPending: (t) => r(N(e, "src", "pages", t.dir, "loading.tsx")),
|
|
3996
4038
|
ctx: {
|
|
3997
|
-
params:
|
|
3998
|
-
pathname:
|
|
3999
|
-
search:
|
|
4000
|
-
signal:
|
|
4001
|
-
headers:
|
|
4002
|
-
query:
|
|
4039
|
+
params: g.params,
|
|
4040
|
+
pathname: f,
|
|
4041
|
+
search: p,
|
|
4042
|
+
signal: oe.signal,
|
|
4043
|
+
headers: ie,
|
|
4044
|
+
query: ae,
|
|
4003
4045
|
isServer: !0
|
|
4004
4046
|
}
|
|
4005
4047
|
}));
|
|
4006
|
-
let t =
|
|
4007
|
-
typeof t == "function" && !
|
|
4008
|
-
params:
|
|
4009
|
-
pathname:
|
|
4010
|
-
search:
|
|
4011
|
-
signal:
|
|
4012
|
-
headers:
|
|
4013
|
-
query:
|
|
4048
|
+
let t = C.loader;
|
|
4049
|
+
typeof t == "function" && !D && (ce = await b("loader", () => t({
|
|
4050
|
+
params: g.params,
|
|
4051
|
+
pathname: f,
|
|
4052
|
+
search: p,
|
|
4053
|
+
signal: oe.signal,
|
|
4054
|
+
headers: ie,
|
|
4055
|
+
query: ae,
|
|
4014
4056
|
isServer: !0
|
|
4015
4057
|
})));
|
|
4016
4058
|
} finally {
|
|
4017
|
-
c.off("close",
|
|
4059
|
+
c.off("close", se);
|
|
4018
4060
|
}
|
|
4019
|
-
let
|
|
4020
|
-
|
|
4021
|
-
pageMod:
|
|
4022
|
-
params:
|
|
4023
|
-
query:
|
|
4061
|
+
let M = await b("loadSsrHelpers", async () => await r("@voltro/web/ssr"));
|
|
4062
|
+
D || await _a({
|
|
4063
|
+
pageMod: C,
|
|
4064
|
+
params: g.params,
|
|
4065
|
+
query: ae,
|
|
4024
4066
|
apiName: a[0]?.name,
|
|
4025
|
-
seed:
|
|
4026
|
-
seedFailure:
|
|
4067
|
+
seed: M.seedPreloadedSubscription,
|
|
4068
|
+
seedFailure: M.seedPreloadedSubscriptionFailure,
|
|
4027
4069
|
onError: ({ tag: e, apiName: t }, n) => Q.warn("preload seed failed", {
|
|
4028
4070
|
tag: e,
|
|
4029
4071
|
apiName: t,
|
|
4030
|
-
pathname:
|
|
4072
|
+
pathname: f
|
|
4031
4073
|
}, n)
|
|
4032
4074
|
});
|
|
4033
|
-
let
|
|
4034
|
-
pattern:
|
|
4035
|
-
Component:
|
|
4036
|
-
meta:
|
|
4037
|
-
loader:
|
|
4038
|
-
ErrorBoundary:
|
|
4039
|
-
Pending:
|
|
4040
|
-
renderMode:
|
|
4041
|
-
chain:
|
|
4042
|
-
},
|
|
4043
|
-
cookies:
|
|
4044
|
-
headers:
|
|
4045
|
-
url:
|
|
4046
|
-
...
|
|
4047
|
-
},
|
|
4048
|
-
|
|
4049
|
-
let
|
|
4050
|
-
outerWrap:
|
|
4051
|
-
locale:
|
|
4052
|
-
} : {},
|
|
4053
|
-
helpers:
|
|
4054
|
-
page: `src/pages/${
|
|
4055
|
-
interactive:
|
|
4075
|
+
let de = {
|
|
4076
|
+
pattern: g.route.pattern,
|
|
4077
|
+
Component: C.default,
|
|
4078
|
+
meta: C.meta,
|
|
4079
|
+
loader: C.loader,
|
|
4080
|
+
ErrorBoundary: C.ErrorBoundary,
|
|
4081
|
+
Pending: C.Pending,
|
|
4082
|
+
renderMode: w,
|
|
4083
|
+
chain: le
|
|
4084
|
+
}, P = {
|
|
4085
|
+
cookies: j ? fo(Ga(k.cookies), g.route.pattern) : w === "isr" ? Ga(k.cookies) : k.cookies,
|
|
4086
|
+
headers: ie,
|
|
4087
|
+
url: d,
|
|
4088
|
+
...m === void 0 ? {} : { formFlash: m }
|
|
4089
|
+
}, F = (await s())(A.cookie, A["accept-language"]);
|
|
4090
|
+
S = F !== void 0 && o;
|
|
4091
|
+
let I = F ? {
|
|
4092
|
+
outerWrap: F.outerWrap,
|
|
4093
|
+
locale: F.locale
|
|
4094
|
+
} : {}, L = D ? Gi({
|
|
4095
|
+
helpers: M,
|
|
4096
|
+
page: `src/pages/${g.route.file}`,
|
|
4097
|
+
interactive: O,
|
|
4056
4098
|
delivery: "stream",
|
|
4057
4099
|
renderInput: {
|
|
4058
|
-
descriptor:
|
|
4059
|
-
params:
|
|
4060
|
-
pathname:
|
|
4061
|
-
search:
|
|
4062
|
-
segmentLoaderData:
|
|
4063
|
-
requestContext:
|
|
4064
|
-
...
|
|
4100
|
+
descriptor: de,
|
|
4101
|
+
params: g.params,
|
|
4102
|
+
pathname: f,
|
|
4103
|
+
search: p,
|
|
4104
|
+
segmentLoaderData: ue,
|
|
4105
|
+
requestContext: P,
|
|
4106
|
+
...I
|
|
4065
4107
|
}
|
|
4066
|
-
}) : null,
|
|
4067
|
-
helpers:
|
|
4068
|
-
page: `src/pages/${
|
|
4069
|
-
pathname:
|
|
4070
|
-
renderMode:
|
|
4071
|
-
interactive:
|
|
4072
|
-
loaderData:
|
|
4073
|
-
segmentLoaderData:
|
|
4074
|
-
pageLoaderRan: typeof
|
|
4075
|
-
...
|
|
4108
|
+
}) : null, R = D ? null : Wi({
|
|
4109
|
+
helpers: M,
|
|
4110
|
+
page: `src/pages/${g.route.file}`,
|
|
4111
|
+
pathname: f,
|
|
4112
|
+
renderMode: w,
|
|
4113
|
+
interactive: O,
|
|
4114
|
+
loaderData: ce,
|
|
4115
|
+
segmentLoaderData: ue,
|
|
4116
|
+
pageLoaderRan: typeof C.loader == "function",
|
|
4117
|
+
...j ? { ppr: !0 } : {}
|
|
4076
4118
|
});
|
|
4077
|
-
|
|
4078
|
-
let
|
|
4079
|
-
await
|
|
4119
|
+
j && R !== null && mo(R.stateInput, g.route.pattern);
|
|
4120
|
+
let B = [];
|
|
4121
|
+
await b("collectCss", async () => {
|
|
4080
4122
|
let t = /* @__PURE__ */ new Set(), n = [
|
|
4081
|
-
|
|
4082
|
-
...
|
|
4083
|
-
...t.hasLayout ? [
|
|
4084
|
-
...t.hasError ? [
|
|
4085
|
-
...t.hasPending ? [
|
|
4123
|
+
N(e, "src", "pages", g.route.file),
|
|
4124
|
+
...ne.flatMap((t) => [
|
|
4125
|
+
...t.hasLayout ? [N(e, "src", "pages", t.dir, "layout.tsx")] : [],
|
|
4126
|
+
...t.hasError ? [N(e, "src", "pages", t.dir, "error.tsx")] : [],
|
|
4127
|
+
...t.hasPending ? [N(e, "src", "pages", t.dir, "loading.tsx")] : []
|
|
4086
4128
|
]),
|
|
4087
|
-
|
|
4129
|
+
N(e, ".framework", "main.tsx")
|
|
4088
4130
|
];
|
|
4089
|
-
for (let e of n) await
|
|
4131
|
+
for (let e of n) await x(e, t, B);
|
|
4090
4132
|
});
|
|
4091
|
-
let
|
|
4092
|
-
let t =
|
|
4133
|
+
let fe = (O === "islands" ? await b("islandsEntry", async () => {
|
|
4134
|
+
let t = Zo(a, "../../app.config"), n = (await Cn({
|
|
4093
4135
|
webRoot: e,
|
|
4094
4136
|
pages: [{
|
|
4095
|
-
pattern:
|
|
4096
|
-
file:
|
|
4137
|
+
pattern: g.route.pattern,
|
|
4138
|
+
file: g.route.file
|
|
4097
4139
|
}],
|
|
4098
|
-
headSnippets:
|
|
4140
|
+
headSnippets: vn(await je()),
|
|
4099
4141
|
apiImports: t.imports,
|
|
4100
4142
|
apiEntriesLiteral: `[\n${t.providerEntryLines.join("\n")}\n ]`
|
|
4101
4143
|
}))[0];
|
|
4102
|
-
return n === void 0 ? void 0 : await
|
|
4103
|
-
}) : void 0) ?? await
|
|
4104
|
-
lang:
|
|
4105
|
-
...
|
|
4106
|
-
renderedAt:
|
|
4144
|
+
return n === void 0 ? void 0 : await z.readFile(N(e, ".framework", n.htmlFile), "utf8");
|
|
4145
|
+
}) : void 0) ?? await b("readShell", je), pe = await b("transformShell", () => t.transformIndexHtml(d, fe)), V = B.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), me = F?.locale ?? P.cookies["voltro:locale"] ?? n.defaultLocale ?? (n.locales ?? [])[0] ?? "en", he = Date.now(), H = {
|
|
4146
|
+
lang: me,
|
|
4147
|
+
...F?.timeZone === void 0 ? {} : { timeZone: F.timeZone },
|
|
4148
|
+
renderedAt: he
|
|
4107
4149
|
};
|
|
4108
|
-
if (
|
|
4109
|
-
let e = (e) =>
|
|
4110
|
-
helpers:
|
|
4111
|
-
prepared:
|
|
4150
|
+
if (L) {
|
|
4151
|
+
let e = (e) => qi({
|
|
4152
|
+
helpers: M,
|
|
4153
|
+
prepared: L,
|
|
4112
4154
|
meta: e,
|
|
4113
|
-
interactive:
|
|
4114
|
-
extra: [
|
|
4155
|
+
interactive: O,
|
|
4156
|
+
extra: [V]
|
|
4115
4157
|
});
|
|
4116
|
-
if (
|
|
4158
|
+
if (L.hasDeferred) ma({
|
|
4117
4159
|
res: c,
|
|
4118
|
-
shell:
|
|
4119
|
-
shell:
|
|
4160
|
+
shell: ca({
|
|
4161
|
+
shell: pe,
|
|
4120
4162
|
inlineModuleScriptsAsync: !0
|
|
4121
4163
|
}),
|
|
4122
|
-
documentAttrs:
|
|
4164
|
+
documentAttrs: H,
|
|
4123
4165
|
headers: {
|
|
4124
4166
|
"content-type": "text/html; charset=utf-8",
|
|
4125
4167
|
"x-voltro-rendered-by": "spa-shell-dev"
|
|
4126
4168
|
},
|
|
4127
4169
|
headInjection: e,
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
...
|
|
4170
|
+
...k.cspNonce === void 0 ? {} : { nonce: k.cspNonce },
|
|
4171
|
+
render: (e) => M.renderPageToStream({
|
|
4172
|
+
...L.renderInput,
|
|
4173
|
+
...e,
|
|
4174
|
+
...k.cspNonce === void 0 ? {} : { nonce: k.cspNonce }
|
|
4131
4175
|
}),
|
|
4132
4176
|
onShellError: (e) => {
|
|
4133
|
-
|
|
4177
|
+
Ee(c, "spa-shell-dev", f, g.route.pattern, e, S);
|
|
4134
4178
|
}
|
|
4135
4179
|
});
|
|
4136
4180
|
else {
|
|
4137
|
-
let t =
|
|
4138
|
-
helpers:
|
|
4139
|
-
prepared:
|
|
4140
|
-
}), n =
|
|
4141
|
-
c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "spa-shell-dev"), c.end(n);
|
|
4181
|
+
let t = Ki({
|
|
4182
|
+
helpers: M,
|
|
4183
|
+
prepared: L
|
|
4184
|
+
}), n = fa(pe.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`).replace("</head>", ` ${e(t.meta)}\n </head>`), H);
|
|
4185
|
+
c.statusCode = 200, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", "spa-shell-dev"), c.end(k.cspNonce === void 0 ? n : ua(n, k.cspNonce));
|
|
4142
4186
|
}
|
|
4143
|
-
} else if (
|
|
4187
|
+
} else if (R) {
|
|
4144
4188
|
let e = (e) => {
|
|
4145
|
-
if (
|
|
4146
|
-
let t = i.headers["x-tenant"], n =
|
|
4147
|
-
pattern:
|
|
4148
|
-
params:
|
|
4189
|
+
if (T === null || w !== "ssr" && w !== "isr" || typeof C.ogImage != "function" || e.includes("og:image")) return "";
|
|
4190
|
+
let t = i.headers["x-tenant"], n = T.signOgUrl({
|
|
4191
|
+
pattern: g.route.pattern,
|
|
4192
|
+
params: g.params,
|
|
4149
4193
|
...typeof t == "string" ? { tenant: t } : {}
|
|
4150
4194
|
});
|
|
4151
4195
|
return `<meta property="og:image" content="${n}" /><meta name="twitter:image" content="${n}" /><meta name="twitter:card" content="summary_large_image" />`;
|
|
4152
4196
|
}, t = (t) => [
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
`<meta name="voltro-interactive" content="${
|
|
4156
|
-
...
|
|
4157
|
-
|
|
4197
|
+
V,
|
|
4198
|
+
M.renderMetaToHtml(t) + e(M.renderMetaToHtml(t)),
|
|
4199
|
+
`<meta name="voltro-interactive" content="${O}" />`,
|
|
4200
|
+
...R.hasDeferred ? [M.renderDeferredRegistryScript()] : [],
|
|
4201
|
+
M.renderRouterStateScript(R.stateInput)
|
|
4158
4202
|
].filter((e) => e.length > 0).join("\n "), n = {
|
|
4159
|
-
descriptor:
|
|
4160
|
-
params:
|
|
4161
|
-
pathname:
|
|
4162
|
-
search:
|
|
4163
|
-
loaderData:
|
|
4164
|
-
segmentLoaderData:
|
|
4165
|
-
requestContext:
|
|
4166
|
-
...
|
|
4203
|
+
descriptor: de,
|
|
4204
|
+
params: g.params,
|
|
4205
|
+
pathname: f,
|
|
4206
|
+
search: p,
|
|
4207
|
+
loaderData: R.loaderData,
|
|
4208
|
+
segmentLoaderData: R.segmentLoaderData,
|
|
4209
|
+
requestContext: P,
|
|
4210
|
+
...I
|
|
4167
4211
|
};
|
|
4168
|
-
if (
|
|
4212
|
+
if (w === "ssr" && O === "full" && m === void 0) ma({
|
|
4169
4213
|
res: c,
|
|
4170
|
-
shell:
|
|
4171
|
-
shell:
|
|
4214
|
+
shell: ca({
|
|
4215
|
+
shell: pe,
|
|
4172
4216
|
inlineModuleScriptsAsync: !0
|
|
4173
4217
|
}),
|
|
4174
|
-
documentAttrs:
|
|
4218
|
+
documentAttrs: H,
|
|
4175
4219
|
headers: {
|
|
4176
4220
|
"content-type": "text/html; charset=utf-8",
|
|
4177
4221
|
"x-voltro-rendered-by": "ssr-dev"
|
|
4178
4222
|
},
|
|
4179
4223
|
headInjection: t,
|
|
4180
|
-
|
|
4224
|
+
...k.cspNonce === void 0 ? {} : { nonce: k.cspNonce },
|
|
4225
|
+
render: (e) => M.renderPageToStream({
|
|
4181
4226
|
...n,
|
|
4182
4227
|
...e,
|
|
4183
|
-
...
|
|
4228
|
+
...k.cspNonce === void 0 ? {} : { nonce: k.cspNonce }
|
|
4184
4229
|
}),
|
|
4185
4230
|
onShellError: (e) => {
|
|
4186
|
-
|
|
4231
|
+
Ee(c, "ssr-dev", f, g.route.pattern, e, S);
|
|
4187
4232
|
}
|
|
4188
4233
|
});
|
|
4189
4234
|
else {
|
|
4190
|
-
let { html: e, meta: r } =
|
|
4191
|
-
c.statusCode =
|
|
4192
|
-
let o =
|
|
4193
|
-
if (
|
|
4194
|
-
c.setHeader("x-voltro-ppr", "shell+holes"), c.write(o);
|
|
4195
|
-
let e =
|
|
4235
|
+
let { html: e, meta: r } = M.renderPageToHtml(n), i = fa(pe.replace("<div id=\"root\"></div>", `<div id="root">${e}</div>`).replace("</head>", ` ${t(r)}\n </head>`), H);
|
|
4236
|
+
c.statusCode = m === void 0 ? _ ? 404 : 200 : 422, c.setHeader("content-type", "text/html; charset=utf-8"), c.setHeader("x-voltro-rendered-by", _ ? "ssr-not-found" : "ssr-dev"), m !== void 0 && c.setHeader("cache-control", "no-store");
|
|
4237
|
+
let o = m === void 0 ? i : Zt(i, m);
|
|
4238
|
+
if (j && m === void 0 && typeof C.loader == "function") {
|
|
4239
|
+
c.setHeader("x-voltro-ppr", "shell+holes"), to(g.route.pattern), c.write(o);
|
|
4240
|
+
let e = Xo(Yo(a[0], { allowDevProxy: !0 }), k.headers.cookie, {
|
|
4196
4241
|
apiName: a[0]?.name,
|
|
4197
|
-
headers:
|
|
4242
|
+
headers: k.headers
|
|
4198
4243
|
}), t = new AbortController();
|
|
4199
|
-
await
|
|
4200
|
-
loader:
|
|
4244
|
+
await po({
|
|
4245
|
+
loader: C.loader,
|
|
4201
4246
|
ctx: {
|
|
4202
|
-
params:
|
|
4203
|
-
pathname:
|
|
4204
|
-
search:
|
|
4247
|
+
params: g.params,
|
|
4248
|
+
pathname: f,
|
|
4249
|
+
search: p,
|
|
4205
4250
|
signal: t.signal,
|
|
4206
|
-
headers:
|
|
4251
|
+
headers: k.headers,
|
|
4207
4252
|
query: e,
|
|
4208
4253
|
isServer: !0
|
|
4209
4254
|
},
|
|
4210
4255
|
res: c,
|
|
4211
|
-
helpers:
|
|
4212
|
-
page:
|
|
4256
|
+
helpers: M,
|
|
4257
|
+
page: g.route.pattern,
|
|
4213
4258
|
log: Q
|
|
4214
4259
|
});
|
|
4215
|
-
} else c.end(
|
|
4260
|
+
} else c.end(k.cspNonce === void 0 ? o : ua(o, k.cspNonce));
|
|
4216
4261
|
}
|
|
4217
4262
|
}
|
|
4218
|
-
|
|
4219
|
-
let
|
|
4220
|
-
v ? (
|
|
4221
|
-
pattern:
|
|
4222
|
-
pathname:
|
|
4223
|
-
elapsedMs:
|
|
4263
|
+
y.render = Date.now() - he;
|
|
4264
|
+
let U = Date.now() - te;
|
|
4265
|
+
v ? (Te.add(g.route.pattern), Q.info(`ssr compiled ${g.route.pattern} in ${U}ms`, {
|
|
4266
|
+
pattern: g.route.pattern,
|
|
4267
|
+
pathname: f,
|
|
4268
|
+
elapsedMs: U,
|
|
4224
4269
|
cold: !0,
|
|
4225
|
-
phases:
|
|
4226
|
-
})) :
|
|
4227
|
-
pattern:
|
|
4228
|
-
pathname:
|
|
4229
|
-
elapsedMs:
|
|
4270
|
+
phases: y
|
|
4271
|
+
})) : U > 200 && Q.info(`ssr rendered ${f} in ${U}ms`, {
|
|
4272
|
+
pattern: g.route.pattern,
|
|
4273
|
+
pathname: f,
|
|
4274
|
+
elapsedMs: U,
|
|
4230
4275
|
cold: !1,
|
|
4231
|
-
phases:
|
|
4276
|
+
phases: y
|
|
4232
4277
|
});
|
|
4233
4278
|
} catch (e) {
|
|
4234
|
-
if (
|
|
4279
|
+
if (Hi(e)) {
|
|
4235
4280
|
Q.error("ssr-dev render refused", {
|
|
4236
|
-
pathname:
|
|
4237
|
-
pattern:
|
|
4281
|
+
pathname: f,
|
|
4282
|
+
pattern: g.route.pattern
|
|
4238
4283
|
}, e), c.statusCode = 500, c.setHeader("content-type", "text/plain; charset=utf-8"), c.end(e.message);
|
|
4239
4284
|
return;
|
|
4240
4285
|
}
|
|
4241
|
-
let t =
|
|
4286
|
+
let t = Ui(e);
|
|
4242
4287
|
if (t) {
|
|
4243
4288
|
c.statusCode = t.status;
|
|
4244
4289
|
for (let [e, n] of Object.entries(t.headers)) c.setHeader(e, String(n));
|
|
4245
4290
|
c.end(t.body);
|
|
4246
4291
|
return;
|
|
4247
4292
|
}
|
|
4248
|
-
|
|
4293
|
+
Ee(c, "ssr-dev", f, g.route.pattern, e, S);
|
|
4249
4294
|
}
|
|
4250
4295
|
});
|
|
4251
4296
|
}
|
|
4252
|
-
},
|
|
4297
|
+
}, Ne = Date.now(), Pe = re.version ?? "?", K = await vo(), Fe = N(e, "node_modules", "@voltro", "ui-shadcn"), q = L(N(Fe, "package.json")) ? Fe : null, J = [], Ie = await (async () => {
|
|
4253
4298
|
let t = [];
|
|
4254
4299
|
for (let n of a) {
|
|
4255
|
-
let r = await
|
|
4300
|
+
let r = await Bo(e, n.pkg);
|
|
4256
4301
|
r && t.push(r);
|
|
4257
4302
|
}
|
|
4258
|
-
let n = await
|
|
4303
|
+
let n = await Sa(t);
|
|
4259
4304
|
if (n === void 0) return !1;
|
|
4260
|
-
let r =
|
|
4305
|
+
let r = N(j, ".voltro-rpcgroup-optimize"), i = "";
|
|
4261
4306
|
try {
|
|
4262
|
-
i = (await
|
|
4307
|
+
i = (await z.readFile(r, "utf8")).trim();
|
|
4263
4308
|
} catch {}
|
|
4264
4309
|
if (i === n) return !1;
|
|
4265
4310
|
try {
|
|
4266
|
-
await
|
|
4311
|
+
await z.writeFile(r, n);
|
|
4267
4312
|
} catch {}
|
|
4268
4313
|
return !0;
|
|
4269
|
-
})(),
|
|
4270
|
-
|
|
4314
|
+
})(), Le = /* @__PURE__ */ new Set(), Re = (e) => {
|
|
4315
|
+
Le.has(e.name) || (Le.add(e.name), Q.warn(`middleware.ts wrote the cookie "${e.name}" with the HttpOnly default — a browser SDK cannot read it`, {
|
|
4271
4316
|
cookie: e.name,
|
|
4272
4317
|
hint: "If your IdP client reads this from `document.cookie` (Supabase's `createBrowserClient` does), pass `httpOnly: false`. Otherwise the SSR render succeeds and the user is signed out at the first client-side call. Set `httpOnly: true` explicitly to silence this."
|
|
4273
4318
|
}));
|
|
4274
|
-
}, Y = await
|
|
4275
|
-
Y.length > 0 && Q.info(`middleware.ts loaded — ${Y.length} middleware(s): ` + Y.map((e) => e.exportName).join(", ")),
|
|
4319
|
+
}, Y = await za(e);
|
|
4320
|
+
Y.length > 0 && Q.info(`middleware.ts loaded — ${Y.length} middleware(s): ` + Y.map((e) => e.exportName).join(", ")), Ma(Y, E.ssrRoutes.map((e) => e.pattern)), Ie && Q.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client");
|
|
4276
4321
|
try {
|
|
4277
|
-
await
|
|
4322
|
+
await xt(l, "voltro dev (web)");
|
|
4278
4323
|
} catch (e) {
|
|
4279
4324
|
Q.error(String(e.message ?? e)), process.exit(1);
|
|
4280
4325
|
}
|
|
4281
|
-
await (await
|
|
4282
|
-
root:
|
|
4326
|
+
await (await re.createServer({
|
|
4327
|
+
root: j,
|
|
4283
4328
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
4284
4329
|
ssr: { noExternal: ["react-intl", "@voltro/i18n"] },
|
|
4285
4330
|
resolve: {
|
|
@@ -4290,72 +4335,72 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4290
4335
|
"@voltro/i18n"
|
|
4291
4336
|
],
|
|
4292
4337
|
alias: [
|
|
4293
|
-
...
|
|
4338
|
+
...K ? [{
|
|
4294
4339
|
find: "@voltro/devtools/styles.css",
|
|
4295
|
-
replacement:
|
|
4340
|
+
replacement: N(K, "src/styles.css")
|
|
4296
4341
|
}, {
|
|
4297
4342
|
find: "@voltro/devtools",
|
|
4298
|
-
replacement:
|
|
4343
|
+
replacement: N(K, "src/index.ts")
|
|
4299
4344
|
}] : [],
|
|
4300
|
-
...
|
|
4345
|
+
...q ? [
|
|
4301
4346
|
{
|
|
4302
4347
|
find: "@voltro/ui-shadcn/tokens.css",
|
|
4303
|
-
replacement:
|
|
4348
|
+
replacement: N(q, "src/tokens.css")
|
|
4304
4349
|
},
|
|
4305
4350
|
{
|
|
4306
4351
|
find: "@voltro/ui-shadcn/cn",
|
|
4307
|
-
replacement:
|
|
4352
|
+
replacement: N(q, "src/cn.ts")
|
|
4308
4353
|
},
|
|
4309
4354
|
{
|
|
4310
4355
|
find: "@voltro/ui-shadcn/brand",
|
|
4311
|
-
replacement:
|
|
4356
|
+
replacement: N(q, "src/brand/voltroLogo.tsx")
|
|
4312
4357
|
},
|
|
4313
4358
|
{
|
|
4314
4359
|
find: "@voltro/ui-shadcn",
|
|
4315
|
-
replacement:
|
|
4360
|
+
replacement: N(q, "src/index.ts")
|
|
4316
4361
|
}
|
|
4317
4362
|
] : [],
|
|
4318
|
-
...
|
|
4363
|
+
...Wt(e)
|
|
4319
4364
|
]
|
|
4320
4365
|
},
|
|
4321
4366
|
optimizeDeps: {
|
|
4322
|
-
include: [...a.map((e) => `${e.pkg}/rpcGroup`), ...
|
|
4367
|
+
include: [...a.map((e) => `${e.pkg}/rpcGroup`), ...J],
|
|
4323
4368
|
force: Ie
|
|
4324
4369
|
},
|
|
4325
|
-
customLogger:
|
|
4370
|
+
customLogger: Ht(),
|
|
4326
4371
|
plugins: [
|
|
4327
|
-
|
|
4328
|
-
|
|
4372
|
+
Ei(N(e, "src", "pages")),
|
|
4373
|
+
An({
|
|
4329
4374
|
root: e,
|
|
4330
|
-
config:
|
|
4375
|
+
config: ne(n.images)
|
|
4331
4376
|
}),
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
W,
|
|
4377
|
+
Fn(e, n.fonts),
|
|
4378
|
+
er(e, n.feeds ?? [], n.seo?.siteUrl),
|
|
4379
|
+
k(),
|
|
4380
|
+
A(),
|
|
4381
|
+
de,
|
|
4338
4382
|
pe,
|
|
4339
|
-
|
|
4340
|
-
|
|
4383
|
+
W,
|
|
4384
|
+
ye,
|
|
4341
4385
|
be,
|
|
4342
|
-
|
|
4343
|
-
|
|
4386
|
+
Ce,
|
|
4387
|
+
Me,
|
|
4388
|
+
...we ? [we] : []
|
|
4344
4389
|
],
|
|
4345
4390
|
server: {
|
|
4346
4391
|
port: l,
|
|
4347
4392
|
strictPort: !0,
|
|
4348
4393
|
host: !0,
|
|
4349
4394
|
allowedHosts: n.allowedHosts === !0 || [...n.allowedHosts ?? []],
|
|
4350
|
-
proxy:
|
|
4351
|
-
fs: { allow: [e, ...
|
|
4395
|
+
proxy: xe,
|
|
4396
|
+
fs: { allow: [e, ...wo(e)] }
|
|
4352
4397
|
},
|
|
4353
4398
|
appType: "spa",
|
|
4354
|
-
cacheDir:
|
|
4355
|
-
publicDir:
|
|
4356
|
-
})).listen(),
|
|
4357
|
-
version:
|
|
4358
|
-
bootMs: Date.now() -
|
|
4399
|
+
cacheDir: N(j, ".vite"),
|
|
4400
|
+
publicDir: N(e, "public")
|
|
4401
|
+
})).listen(), ho.info(`v${Pe} ready in ${Date.now() - Ne}ms`, {
|
|
4402
|
+
version: Pe,
|
|
4403
|
+
bootMs: Date.now() - Ne
|
|
4359
4404
|
}), Q.info(`listening on http://localhost:${l}`, {
|
|
4360
4405
|
port: l,
|
|
4361
4406
|
app: n.name ?? "(unnamed)"
|
|
@@ -4365,62 +4410,62 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4365
4410
|
target: e.proxyTarget
|
|
4366
4411
|
}), Q.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
|
|
4367
4412
|
try {
|
|
4368
|
-
await
|
|
4369
|
-
id:
|
|
4370
|
-
name:
|
|
4413
|
+
await ae({
|
|
4414
|
+
id: b,
|
|
4415
|
+
name: _,
|
|
4371
4416
|
kind: "web",
|
|
4372
4417
|
url: `http://localhost:${l}`,
|
|
4373
4418
|
pid: process.pid,
|
|
4374
4419
|
status: "live",
|
|
4375
|
-
logFile:
|
|
4420
|
+
logFile: x.path
|
|
4376
4421
|
});
|
|
4377
|
-
let t =
|
|
4422
|
+
let t = Ai(e);
|
|
4378
4423
|
if (t) {
|
|
4379
|
-
let e = await
|
|
4424
|
+
let e = await Bi({ dashboardAppPath: t });
|
|
4380
4425
|
e.status === "launched" ? Q.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && Q.debug(`dashboard already running on :${e.port}`, { port: e.port });
|
|
4381
4426
|
}
|
|
4382
4427
|
setInterval(() => {
|
|
4383
|
-
|
|
4384
|
-
id:
|
|
4385
|
-
name:
|
|
4428
|
+
ae({
|
|
4429
|
+
id: b,
|
|
4430
|
+
name: _,
|
|
4386
4431
|
kind: "web",
|
|
4387
4432
|
url: `http://localhost:${l}`,
|
|
4388
4433
|
pid: process.pid,
|
|
4389
4434
|
status: "live",
|
|
4390
|
-
logFile:
|
|
4435
|
+
logFile: x.path
|
|
4391
4436
|
}).catch(() => {});
|
|
4392
4437
|
}, 1e4).unref();
|
|
4393
4438
|
let n = () => {
|
|
4394
|
-
|
|
4439
|
+
se(b), x.dispose();
|
|
4395
4440
|
};
|
|
4396
4441
|
process.on("SIGINT", n), process.on("SIGTERM", n);
|
|
4397
4442
|
} catch (e) {
|
|
4398
4443
|
Q.warn("runtime-registry write failed", {}, e);
|
|
4399
4444
|
}
|
|
4400
|
-
return
|
|
4445
|
+
return _e({
|
|
4401
4446
|
app: n.name ?? "unnamed",
|
|
4402
4447
|
kind: "web",
|
|
4403
4448
|
url: `http://localhost:${l}`,
|
|
4404
|
-
bootMs: Date.now() -
|
|
4449
|
+
bootMs: Date.now() - Ne
|
|
4405
4450
|
}), new Promise(() => {});
|
|
4406
|
-
},
|
|
4451
|
+
}, is = async (t) => {
|
|
4407
4452
|
e("serve");
|
|
4408
|
-
let n = await
|
|
4453
|
+
let n = await ts(t);
|
|
4409
4454
|
if (!n) return {
|
|
4410
4455
|
ran: !1,
|
|
4411
4456
|
exitCode: 0
|
|
4412
4457
|
};
|
|
4413
4458
|
let i = Date.now(), a = Q.child("serve");
|
|
4414
4459
|
a.info("booting voltro serve (preview)", { app: n.name ?? "(unnamed)" });
|
|
4415
|
-
let o = await
|
|
4460
|
+
let o = await Go(t, n);
|
|
4416
4461
|
for (let e of o) a.info("api wired", {
|
|
4417
4462
|
name: e.name,
|
|
4418
4463
|
pkg: e.pkg
|
|
4419
4464
|
});
|
|
4420
|
-
await
|
|
4465
|
+
await Qo(t, n, o);
|
|
4421
4466
|
{
|
|
4422
|
-
let { pages: e } = await
|
|
4423
|
-
await
|
|
4467
|
+
let { pages: e } = await Mo(N(t, "src", "pages"));
|
|
4468
|
+
await xr({
|
|
4424
4469
|
appRoot: t,
|
|
4425
4470
|
pages: e
|
|
4426
4471
|
});
|
|
@@ -4429,12 +4474,12 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4429
4474
|
kind: "web",
|
|
4430
4475
|
configPort: n.port,
|
|
4431
4476
|
env: process.env
|
|
4432
|
-
}).port, c = await
|
|
4477
|
+
}).port, c = await it("vite", () => import("vite")), l = (await import("@vitejs/plugin-react")).default, u = N(t, ".framework");
|
|
4433
4478
|
Q.info("running production build"), await c.build({
|
|
4434
4479
|
root: u,
|
|
4435
4480
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
4436
4481
|
plugins: [l()],
|
|
4437
|
-
customLogger:
|
|
4482
|
+
customLogger: Ht(),
|
|
4438
4483
|
resolve: { dedupe: [
|
|
4439
4484
|
"react",
|
|
4440
4485
|
"react-dom",
|
|
@@ -4443,9 +4488,9 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4443
4488
|
] },
|
|
4444
4489
|
build: {
|
|
4445
4490
|
outDir: "dist",
|
|
4446
|
-
rollupOptions: { output: { manualChunks:
|
|
4491
|
+
rollupOptions: { output: { manualChunks: Eo } }
|
|
4447
4492
|
},
|
|
4448
|
-
publicDir:
|
|
4493
|
+
publicDir: N(t, "public")
|
|
4449
4494
|
});
|
|
4450
4495
|
let d = (await c.preview({
|
|
4451
4496
|
root: u,
|
|
@@ -4456,7 +4501,7 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4456
4501
|
label: "Local",
|
|
4457
4502
|
url: e
|
|
4458
4503
|
})) ?? [];
|
|
4459
|
-
return
|
|
4504
|
+
return _e({
|
|
4460
4505
|
app: n.name ?? "unnamed",
|
|
4461
4506
|
kind: "preview",
|
|
4462
4507
|
url: f,
|
|
@@ -4465,4 +4510,4 @@ The wrapper is what carries \`match\`, and what lets \`voltro doctor\` report wh
|
|
|
4465
4510
|
}), new Promise(() => {});
|
|
4466
4511
|
};
|
|
4467
4512
|
//#endregion
|
|
4468
|
-
export {
|
|
4513
|
+
export { Bi as $, Wa as A, on as At, fa as B, gt as Bt, Qo as C, Cn as Ct, uo as D, bn as Dt, fo as E, _n as Et, Na as F, jt as Ft, Hi as G, ct as Gt, ca as H, mt as Ht, Ba as I, At as It, Ki as J, Wi as K, it as Kt, Aa as L, Mt as Lt, Ra as M, Gt as Mt, za as N, Wt as Nt, to as O, Ue as Ot, ja as P, kt as Pt, ki as Q, La as R, Nt as Rt, ns as S, An as St, mo as T, xn as Tt, ua as U, dt as Ut, la as V, pt as Vt, ma as W, lt as Wt, Ji as X, qi as Y, ji as Z, qo as _, or as _t, Zo as a, qr as at, Eo as b, Ln as bt, es as c, kr as ct, $ as d, Er as dt, Ai as et, jo as f, xr as ft, Uo as g, ar as gt, Ho as h, lr as ht, _o as i, ti as it, Ma as j, qt as jt, Ga as k, tn as kt, No as l, jr as lt, Go as m, dr as mt, Yo as n, si as nt, Xo as o, Hr as ot, ts as p, ur as pt, Gi as q, Wo as r, ri as rt, Po as s, Ar as st, Do as t, fi as tt, Ao as u, Dr as ut, rs as v, Zn as vt, po as w, vn as wt, Mo as x, Nn as xt, is as y, Jn as yt, _a as z, xt as zt };
|