@voltro/cli 0.39.1 → 0.41.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 +232 -0
- package/dist/agentsMd-Bu_XQgVf.js +2 -0
- package/dist/{agentsMd-7zI2h5l9.js → agentsMd-D6yD7IQv.js} +31 -14
- package/dist/{apiBuild-D9FB13_2.js → apiBuild-B_iH24qf.js} +2 -2
- package/dist/apiBuild-RM5W5YXk.js +2 -0
- package/dist/bin.js +1 -1
- package/dist/{build-DORV5mLM.js → build-DUdi6F_Q.js} +100 -97
- package/dist/{checkCommand-D9qK_gtA.js → checkCommand-B2RWrpWi.js} +1 -1
- package/dist/{checkCommand-Bf6oMao4.js → checkCommand-DWL2_PPR.js} +2 -2
- package/dist/{cloudCmd-C42gaO8s.js → cloudCmd-F4YJeqM3.js} +1 -1
- package/dist/{codegenCommand-CxOyKmc1.js → codegenCommand-DkjoJ30Q.js} +2 -2
- package/dist/{codemodRunner-D-jTyvWo.js → codemodRunner-sFuWDETH.js} +520 -357
- package/dist/{commands-D6aW_6AR.js → commands-D0VR1yBB.js} +32 -32
- package/dist/{dashboardCommand-CwTZh-XZ.js → dashboardCommand-Bro7Jwts.js} +3 -3
- package/dist/{dataCommand-Cc9RiLQZ.js → dataCommand-OKC5FscP.js} +183 -172
- package/dist/{dbCommand-DSwGv9wS.js → dbCommand-BHRamDsy.js} +441 -414
- package/dist/dbCommand-C9iE1pd9.js +2 -0
- package/dist/{dev-3mgc8c-H.js → dev-D4l_YOzI.js} +1570 -1570
- package/dist/{dev-CjJAasDs.js → dev-DuqBJC7g.js} +1 -1
- package/dist/doctorCommand-Bw3V4L1j.js +2 -0
- package/dist/{doctorCommand-oLuzc-aC.js → doctorCommand-TmZTAepc.js} +386 -280
- package/dist/{dormancyCommand-Bxe4WtHU.js → dormancyCommand-CUKhRmGG.js} +1 -1
- package/dist/{embeddingsCommand-CyNQkFIc.js → embeddingsCommand-Db-iQM3l.js} +1 -1
- package/dist/{envCommand-CAkSgBbh.js → envCommand-DQ_URZq9.js} +14 -14
- package/dist/{evolveCommand-CWhBoe_P.js → evolveCommand-CghRPrGO.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/{infoCommand-CTo8Jnhq.js → infoCommand-BCs_ZFnl.js} +1 -1
- package/dist/{metaCommands-DUYR--Ts.js → metaCommands-CfRLra0s.js} +1 -1
- package/dist/{migrate-BnPw2zC8.js → migrate-DLtPv2_D.js} +1 -1
- package/dist/{projectScaffold-BEhhHjPr.js → projectScaffold-BIl97_E6.js} +1 -1
- package/dist/{projectScaffold-BvhLOrLq.js → projectScaffold-mIX_DpSe.js} +1 -1
- package/dist/{runtimeTrace-gNXeLf6H.js → runtimeTrace-jFKvOPBz.js} +1 -1
- package/dist/{sdkgen-C8zz10-X.js → sdkgen-COQqHB9V.js} +1 -1
- package/dist/{serveCommand-BpK8-m1N.js → serveCommand-Cba_M2Su.js} +656 -656
- package/dist/serveCommand-DRbYK646.js +2 -0
- package/dist/serveEntry.js +1 -1
- package/dist/{start-ft_KzFTd.js → start-BjcuFME_.js} +421 -361
- package/dist/{start-BNuTWdRd.js → start-fifc0xpW.js} +1 -1
- package/dist/startEntry.js +1 -1
- package/dist/updateCommand-B2alql9k.js +2 -0
- package/dist/{updateCommand-CHBmCB17.js → updateCommand-HZQVBU3T.js} +1 -1
- package/dist/webDev-D6QeXw3P.js +2 -0
- package/dist/{webDev-CTpSY-e_.js → webDev-Dk8lFUzf.js} +672 -501
- package/dist/{webhooksCommand-EccPZQZ4.js → webhooksCommand-D7ZpH7w0.js} +1 -1
- package/package.json +35 -17
- package/templates/AGENTS.md +1 -1
- package/templates/agent-docs/_index.md +1 -1
- package/templates/agent-docs/_manifest.json +1 -1
- package/templates/agent-docs/cli.md +6 -0
- package/templates/agent-docs/data.md +43 -0
- package/templates/agent-docs/plugins/governance.md +8 -0
- package/templates/agent-docs/routing.md +153 -0
- package/templates/agent-docs/security.md +24 -0
- package/templates/agent-docs/whats-new.md +49 -27
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-sqlite/package.json +8 -8
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/package.json +10 -10
- package/templates/apps/api-collab/package.json +8 -8
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-durable/tests/orders.place.test.ts +17 -4
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-saas-starter/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-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/changelog/src/pages/[slug]/page.test.tsx +8 -1
- 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/package.json +10 -10
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-portal/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 +6 -6
- package/templates/apps/frontend-status/package.json +8 -8
- package/templates/apps/mobile-app/package.json +4 -4
- package/dist/agentsMd-BFCXh2gl.js +0 -2
- package/dist/apiBuild-BmR_bIxN.js +0 -2
- package/dist/dbCommand-DcqEyxju.js +0 -2
- package/dist/doctorCommand-Cghssndo.js +0 -2
- package/dist/serveCommand-CW-goXvh.js +0 -2
- package/dist/updateCommand-6FMU2klq.js +0 -2
- package/dist/webDev-id3I5PvG.js +0 -2
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { i as e, t } from "./nodeEnvironment-cGFAj1J8.js";
|
|
2
2
|
import { r as n } from "./appPort-B_HpJ_ck.js";
|
|
3
|
-
import { A as r,
|
|
4
|
-
import { o as
|
|
5
|
-
import { A as
|
|
6
|
-
import { a as
|
|
7
|
-
import { i as
|
|
8
|
-
import { n as
|
|
9
|
-
import { t as
|
|
10
|
-
import { t as
|
|
11
|
-
import { dirname as
|
|
12
|
-
import { promises as
|
|
13
|
-
import { fileURLToPath as
|
|
14
|
-
import { createLogger as
|
|
15
|
-
import { snapshotMetricsSync as
|
|
16
|
-
import { createServer as
|
|
3
|
+
import { A as r, C as i, D as a, E as o, F as s, H as c, I as l, J as ee, L as u, M as d, N as f, O as te, P as p, R as m, S as h, T as ne, V as g, W as re, X as _, Y as v, Z as y, a as b, b as x, d as S, f as C, ht as w, i as ie, j as T, k as E, n as D, nt as O, q as k, s as ae, tt as A, vt as j, x as oe, y as M, z as se } from "./webDev-Dk8lFUzf.js";
|
|
4
|
+
import { o as N, t as P } from "./connectionConfig-Bk9IC7D0.js";
|
|
5
|
+
import { A as F, D as I, a as ce, h as le, j as ue, k as de } from "./inspect-B7U7Cl_Z.js";
|
|
6
|
+
import { a as fe, c as L, d as pe, f as R, l as me, p as he, u as ge } from "./renderModeScan-D7J1B7Kw.js";
|
|
7
|
+
import { i as _e, n as ve, r as ye, t as be } from "./runtimeRegistry-DMeKfTHP.js";
|
|
8
|
+
import { n as xe } from "./logFileSink-B4uP8pvf.js";
|
|
9
|
+
import { t as Se } from "./inspectMetrics-CfdKLh6t.js";
|
|
10
|
+
import { t as Ce } from "./bootTiming-BdyP9nYw.js";
|
|
11
|
+
import { dirname as we, extname as Te, join as z, resolve as Ee } from "node:path";
|
|
12
|
+
import { promises as B } from "node:fs";
|
|
13
|
+
import { fileURLToPath as V, pathToFileURL as H } from "node:url";
|
|
14
|
+
import { createLogger as U, printReadyBlock as De } from "@voltro/logger";
|
|
15
|
+
import { snapshotMetricsSync as Oe } from "@voltro/runtime";
|
|
16
|
+
import { createServer as ke } from "node:http";
|
|
17
17
|
//#region src/isrCdcInvalidator.ts
|
|
18
|
-
var
|
|
18
|
+
var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
|
|
19
19
|
let n = 0;
|
|
20
20
|
for (let [r, i] of e.tableSubscriptionsByPattern) {
|
|
21
21
|
if (!i.includes(t)) continue;
|
|
@@ -26,17 +26,17 @@ var V = B({ scope: "voltro:start:cdc" }), H = (e) => (t) => {
|
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
return n;
|
|
29
|
-
},
|
|
30
|
-
let t = e.channel ?? "framework_changes", n =
|
|
29
|
+
}, G = () => P() ? N() : null, je = (e) => {
|
|
30
|
+
let t = e.channel ?? "framework_changes", n = Ae(e), r = null, i = null;
|
|
31
31
|
return {
|
|
32
32
|
start: async () => {
|
|
33
33
|
if (e.tableSubscriptionsByPattern.size === 0) {
|
|
34
|
-
|
|
34
|
+
W.debug("skipped — no pages declare cacheInvalidatesOn");
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
let a =
|
|
37
|
+
let a = G();
|
|
38
38
|
if (!a) {
|
|
39
|
-
|
|
39
|
+
W.warn(`${e.tableSubscriptionsByPattern.size} route(s) declare \`cacheInvalidatesOn\` and will NOT be invalidated live — no database is configured for this web process. Set DB_URL (or DB_HOST / PG_HOST) so the CDC listener can connect; until then those routes go stale until their \`revalidate\` window expires.`, { routes: [...e.tableSubscriptionsByPattern.keys()] });
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
r = new (await (import("pg"))).default.Client(a), await r.connect(), i = (e) => {
|
|
@@ -45,16 +45,16 @@ var V = B({ scope: "voltro:start:cdc" }), H = (e) => (t) => {
|
|
|
45
45
|
try {
|
|
46
46
|
r = JSON.parse(e.payload);
|
|
47
47
|
} catch (e) {
|
|
48
|
-
|
|
48
|
+
W.warn("bad CDC payload", {}, e);
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
let i = n(r.table);
|
|
52
|
-
i > 0 &&
|
|
52
|
+
i > 0 && W.info(`${r.op} on '${r.table}' → dropped ${i} cache entries`, {
|
|
53
53
|
op: r.op,
|
|
54
54
|
table: r.table,
|
|
55
55
|
dropped: i
|
|
56
56
|
});
|
|
57
|
-
}, r.on("notification", i), await r.query(`LISTEN ${t}`),
|
|
57
|
+
}, r.on("notification", i), await r.query(`LISTEN ${t}`), W.info(`LISTEN ${t}`, {
|
|
58
58
|
channel: t,
|
|
59
59
|
..."connectionString" in a ? { target: a.connectionString.replace(/\/\/[^@/]*@/, "//") } : {
|
|
60
60
|
host: a.host,
|
|
@@ -72,7 +72,7 @@ var V = B({ scope: "voltro:start:cdc" }), H = (e) => (t) => {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
|
-
},
|
|
75
|
+
}, K = U({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", J = (e) => `
|
|
76
76
|
CREATE TABLE IF NOT EXISTS ${e} (
|
|
77
77
|
cache_key TEXT PRIMARY KEY,
|
|
78
78
|
html TEXT NOT NULL,
|
|
@@ -83,9 +83,9 @@ CREATE TABLE IF NOT EXISTS ${e} (
|
|
|
83
83
|
stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
|
|
84
84
|
);
|
|
85
85
|
CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
86
|
-
`,
|
|
87
|
-
let t = e.tableName ??
|
|
88
|
-
i || (i = !0, await n.query(
|
|
86
|
+
`, Me = (e) => {
|
|
87
|
+
let t = e.tableName ?? q, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
|
|
88
|
+
i || (i = !0, await n.query(J(t)));
|
|
89
89
|
})().then(async () => {
|
|
90
90
|
let e = await n.query(`SELECT * FROM ${t}`);
|
|
91
91
|
for (let t of e.rows) r.set(t.cache_key, {
|
|
@@ -97,10 +97,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
97
97
|
staleWhileRevalidateMs: Number(t.stale_while_revalidate_ms)
|
|
98
98
|
});
|
|
99
99
|
}).catch((e) => {
|
|
100
|
-
|
|
100
|
+
K.warn("postgres bootstrap failed", {}, e);
|
|
101
101
|
}), o = (e, t) => {
|
|
102
102
|
a.then(() => n.query(e, t)).catch((e) => {
|
|
103
|
-
|
|
103
|
+
K.warn("postgres write failed", {}, e);
|
|
104
104
|
});
|
|
105
105
|
};
|
|
106
106
|
return {
|
|
@@ -145,14 +145,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
145
145
|
return Array.from(r.entries());
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
|
-
},
|
|
148
|
+
}, Y = U({ scope: "voltro:start" }), Ne = await (async () => {
|
|
149
149
|
try {
|
|
150
|
-
let e =
|
|
150
|
+
let e = z(we(V(import.meta.url)), "..", "package.json"), t = await B.readFile(e, "utf8");
|
|
151
151
|
return JSON.parse(t).version ?? "0.0.0";
|
|
152
152
|
} catch {
|
|
153
153
|
return "0.0.0";
|
|
154
154
|
}
|
|
155
|
-
})(),
|
|
155
|
+
})(), Pe = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", X = (e) => e instanceof Error && e._voltroControl === "not-found", Fe = {
|
|
156
156
|
".html": "text/html; charset=utf-8",
|
|
157
157
|
".js": "application/javascript",
|
|
158
158
|
".mjs": "application/javascript",
|
|
@@ -170,13 +170,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
170
170
|
".woff": "font/woff",
|
|
171
171
|
".woff2": "font/woff2",
|
|
172
172
|
".txt": "text/plain; charset=utf-8"
|
|
173
|
-
},
|
|
173
|
+
}, Ie = (e) => Fe[Te(e).toLowerCase()] ?? "application/octet-stream", Z = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Q = async (e) => {
|
|
174
174
|
try {
|
|
175
|
-
return await
|
|
175
|
+
return await B.stat(e), !0;
|
|
176
176
|
} catch {
|
|
177
177
|
return !1;
|
|
178
178
|
}
|
|
179
|
-
},
|
|
179
|
+
}, Le = (e) => {
|
|
180
180
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
181
181
|
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, "\\$&"));
|
|
182
182
|
let a = i.join("/");
|
|
@@ -185,8 +185,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
185
185
|
paramNames: t,
|
|
186
186
|
priority: n
|
|
187
187
|
};
|
|
188
|
-
},
|
|
189
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
188
|
+
}, Re = (e) => e.map((e) => {
|
|
189
|
+
let { regex: t, paramNames: n, priority: r } = Le(e.pattern);
|
|
190
190
|
return {
|
|
191
191
|
pattern: e.pattern,
|
|
192
192
|
file: e.file,
|
|
@@ -195,7 +195,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
195
195
|
paramNames: n,
|
|
196
196
|
priority: r
|
|
197
197
|
};
|
|
198
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
198
|
+
}).slice().sort((e, t) => e.priority - t.priority), ze = (e, t) => {
|
|
199
199
|
for (let n of t) {
|
|
200
200
|
let t = n.regex.exec(e);
|
|
201
201
|
if (!t) continue;
|
|
@@ -207,188 +207,210 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
209
|
return null;
|
|
210
|
-
},
|
|
211
|
-
let { provider: t, route: n, params: i, pathname: c, dirs:
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
}, Be = async (e) => {
|
|
211
|
+
let { provider: t, route: n, params: i, pathname: c, dirs: ee, shellTemplate: f, requestHeaders: te, requestUrl: g = "", apiOrigin: re, apiName: _ } = e, { search: v } = m(g), y = await o(a(e.middlewares ?? [], {
|
|
212
|
+
route: n.pattern,
|
|
213
|
+
pathname: c
|
|
214
|
+
}), {
|
|
215
|
+
pathname: c,
|
|
216
|
+
search: v,
|
|
217
|
+
headers: te,
|
|
218
|
+
cookies: ne(te.cookie),
|
|
219
|
+
route: n.pattern
|
|
220
|
+
}, e.onCookieWarning), x = y.headers, S = ie(re, x.cookie, {
|
|
221
|
+
apiName: _,
|
|
222
|
+
headers: x
|
|
223
|
+
}), C = await t.getPage(n.pattern, n.file), w = L(C, n.file), D = w === "spa" && ae(ee, n.dirChain).some((e) => e.hasLayout);
|
|
224
|
+
if (w !== "ssr" && w !== "isr" && !D) return null;
|
|
225
|
+
let O = ae(ee, n.dirChain), k = {}, A = null, j, oe = new AbortController();
|
|
214
226
|
try {
|
|
215
|
-
(await t.getHelpers()).beginStoreSeeds(), {chain:
|
|
216
|
-
entries:
|
|
227
|
+
(await t.getHelpers()).beginStoreSeeds(), {chain: j, segmentLoaderData: k} = await b({
|
|
228
|
+
entries: O,
|
|
217
229
|
loadLayout: (e) => t.getLayout(e.dir),
|
|
218
230
|
loadError: (e) => t.getError(e.dir),
|
|
219
231
|
loadPending: (e) => t.getPending(e.dir),
|
|
220
232
|
ctx: {
|
|
221
233
|
params: i,
|
|
222
234
|
pathname: c,
|
|
223
|
-
search:
|
|
235
|
+
search: v,
|
|
224
236
|
signal: oe.signal,
|
|
225
|
-
headers:
|
|
226
|
-
query:
|
|
237
|
+
headers: x,
|
|
238
|
+
query: S,
|
|
227
239
|
isServer: !0
|
|
228
240
|
}
|
|
229
|
-
}), typeof
|
|
241
|
+
}), typeof C.loader == "function" && !D && (A = await C.loader({
|
|
230
242
|
params: i,
|
|
231
243
|
pathname: c,
|
|
232
|
-
search:
|
|
244
|
+
search: v,
|
|
233
245
|
signal: oe.signal,
|
|
234
|
-
headers:
|
|
235
|
-
query:
|
|
246
|
+
headers: x,
|
|
247
|
+
query: S,
|
|
236
248
|
isServer: !0
|
|
237
249
|
}));
|
|
238
250
|
} catch (e) {
|
|
239
|
-
if (
|
|
251
|
+
if (Pe(e)) return {
|
|
240
252
|
control: "redirect",
|
|
241
253
|
status: e.status,
|
|
242
|
-
location: e.location
|
|
254
|
+
location: e.location,
|
|
255
|
+
setCookies: y.setCookies
|
|
256
|
+
};
|
|
257
|
+
if (X(e)) return {
|
|
258
|
+
control: "not-found",
|
|
259
|
+
setCookies: y.setCookies
|
|
243
260
|
};
|
|
244
|
-
if (q(e)) return { control: "not-found" };
|
|
245
261
|
throw e;
|
|
246
262
|
}
|
|
247
|
-
let
|
|
248
|
-
|
|
249
|
-
pageMod:
|
|
263
|
+
let M = await t.getHelpers();
|
|
264
|
+
D || await E({
|
|
265
|
+
pageMod: C,
|
|
250
266
|
params: i,
|
|
251
|
-
query:
|
|
252
|
-
apiName:
|
|
253
|
-
seed:
|
|
254
|
-
seedFailure:
|
|
255
|
-
onError: ({ tag: e, apiName: t }, n) =>
|
|
267
|
+
query: S,
|
|
268
|
+
apiName: _,
|
|
269
|
+
seed: M.seedPreloadedSubscription,
|
|
270
|
+
seedFailure: M.seedPreloadedSubscriptionFailure,
|
|
271
|
+
onError: ({ tag: e, apiName: t }, n) => Y.warn("preload seed failed", {
|
|
256
272
|
tag: e,
|
|
257
273
|
apiName: t,
|
|
258
274
|
pathname: c
|
|
259
275
|
}, n)
|
|
260
276
|
});
|
|
261
|
-
let
|
|
277
|
+
let se = {
|
|
262
278
|
pattern: n.pattern,
|
|
263
|
-
Component:
|
|
264
|
-
meta:
|
|
265
|
-
loader:
|
|
266
|
-
ErrorBoundary:
|
|
267
|
-
Pending:
|
|
268
|
-
renderMode:
|
|
269
|
-
chain:
|
|
270
|
-
},
|
|
271
|
-
cookies:
|
|
272
|
-
headers:
|
|
273
|
-
url:
|
|
274
|
-
},
|
|
275
|
-
if (
|
|
276
|
-
let e =
|
|
277
|
-
helpers:
|
|
279
|
+
Component: C.default,
|
|
280
|
+
meta: C.meta,
|
|
281
|
+
loader: C.loader,
|
|
282
|
+
ErrorBoundary: C.ErrorBoundary,
|
|
283
|
+
Pending: C.Pending,
|
|
284
|
+
renderMode: w,
|
|
285
|
+
chain: j
|
|
286
|
+
}, N = {
|
|
287
|
+
cookies: y.cookies,
|
|
288
|
+
headers: x,
|
|
289
|
+
url: g
|
|
290
|
+
}, P = M.i18n?.resolve(x.cookie, x["accept-language"]), F = C.interactive ?? "full";
|
|
291
|
+
if (D) {
|
|
292
|
+
let e = s({
|
|
293
|
+
helpers: M,
|
|
278
294
|
page: n.pattern,
|
|
279
|
-
interactive:
|
|
295
|
+
interactive: F,
|
|
280
296
|
delivery: "stream",
|
|
281
297
|
renderInput: {
|
|
282
|
-
descriptor:
|
|
298
|
+
descriptor: se,
|
|
283
299
|
params: i,
|
|
284
300
|
pathname: c,
|
|
285
|
-
search:
|
|
286
|
-
segmentLoaderData:
|
|
287
|
-
requestContext:
|
|
288
|
-
...
|
|
289
|
-
outerWrap:
|
|
290
|
-
locale:
|
|
301
|
+
search: v,
|
|
302
|
+
segmentLoaderData: k,
|
|
303
|
+
requestContext: N,
|
|
304
|
+
...P ? {
|
|
305
|
+
outerWrap: P.outerWrap,
|
|
306
|
+
locale: P.locale
|
|
291
307
|
} : {}
|
|
292
308
|
}
|
|
293
|
-
}), t =
|
|
294
|
-
helpers:
|
|
309
|
+
}), t = P?.locale ?? N.cookies["voltro:locale"] ?? "en", a = (t) => u({
|
|
310
|
+
helpers: M,
|
|
295
311
|
prepared: e,
|
|
296
312
|
meta: t,
|
|
297
|
-
interactive:
|
|
313
|
+
interactive: F
|
|
298
314
|
});
|
|
299
315
|
if (e.hasDeferred) {
|
|
300
|
-
let n =
|
|
316
|
+
let n = T({ shell: f });
|
|
301
317
|
return {
|
|
302
318
|
renderMode: "spa",
|
|
303
|
-
|
|
304
|
-
|
|
319
|
+
setCookies: y.setCookies,
|
|
320
|
+
stream: (r) => d({
|
|
321
|
+
res: r,
|
|
305
322
|
shell: n,
|
|
306
323
|
htmlLang: t,
|
|
307
324
|
headers: {
|
|
308
325
|
"content-type": "text/html; charset=utf-8",
|
|
309
|
-
"x-voltro-rendered-by": "spa"
|
|
326
|
+
"x-voltro-rendered-by": "spa",
|
|
327
|
+
...h(y.setCookies)
|
|
310
328
|
},
|
|
311
|
-
headInjection:
|
|
312
|
-
render: (t) =>
|
|
329
|
+
headInjection: a,
|
|
330
|
+
render: (t) => M.renderPageToStream({
|
|
313
331
|
...e.renderInput,
|
|
314
332
|
...t
|
|
315
333
|
}),
|
|
316
334
|
onShellError: (e) => {
|
|
317
|
-
|
|
335
|
+
Y.error("spa layout shell render failed", { pathname: c }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
|
|
318
336
|
}
|
|
319
337
|
})
|
|
320
338
|
};
|
|
321
339
|
}
|
|
322
|
-
let
|
|
323
|
-
helpers:
|
|
340
|
+
let o = l({
|
|
341
|
+
helpers: M,
|
|
324
342
|
prepared: e
|
|
325
343
|
});
|
|
326
344
|
return {
|
|
327
|
-
html:
|
|
345
|
+
html: r(f.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), a(o.meta)).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
|
|
328
346
|
renderMode: "spa",
|
|
329
|
-
revalidateMs: null
|
|
347
|
+
revalidateMs: null,
|
|
348
|
+
setCookies: y.setCookies
|
|
330
349
|
};
|
|
331
350
|
}
|
|
332
|
-
let
|
|
333
|
-
helpers:
|
|
351
|
+
let I = p({
|
|
352
|
+
helpers: M,
|
|
334
353
|
page: n.pattern,
|
|
335
354
|
pathname: c,
|
|
336
|
-
renderMode:
|
|
337
|
-
interactive:
|
|
338
|
-
loaderData:
|
|
339
|
-
segmentLoaderData:
|
|
340
|
-
pageLoaderRan: typeof
|
|
341
|
-
}),
|
|
342
|
-
descriptor:
|
|
355
|
+
renderMode: w,
|
|
356
|
+
interactive: F,
|
|
357
|
+
loaderData: A,
|
|
358
|
+
segmentLoaderData: k,
|
|
359
|
+
pageLoaderRan: typeof C.loader == "function"
|
|
360
|
+
}), ce = {
|
|
361
|
+
descriptor: se,
|
|
343
362
|
params: i,
|
|
344
363
|
pathname: c,
|
|
345
|
-
search:
|
|
346
|
-
loaderData:
|
|
347
|
-
segmentLoaderData:
|
|
348
|
-
requestContext:
|
|
349
|
-
...
|
|
350
|
-
outerWrap:
|
|
351
|
-
locale:
|
|
364
|
+
search: v,
|
|
365
|
+
loaderData: I.loaderData,
|
|
366
|
+
segmentLoaderData: I.segmentLoaderData,
|
|
367
|
+
requestContext: N,
|
|
368
|
+
...P ? {
|
|
369
|
+
outerWrap: P.outerWrap,
|
|
370
|
+
locale: P.locale
|
|
352
371
|
} : {}
|
|
353
|
-
},
|
|
354
|
-
|
|
355
|
-
`<meta name="voltro-interactive" content="${
|
|
356
|
-
...
|
|
357
|
-
|
|
372
|
+
}, le = (e) => [
|
|
373
|
+
M.renderMetaToHtml(e),
|
|
374
|
+
`<meta name="voltro-interactive" content="${F}" />`,
|
|
375
|
+
...I.hasDeferred ? [M.renderDeferredRegistryScript()] : [],
|
|
376
|
+
M.renderRouterStateScript(I.stateInput)
|
|
358
377
|
].filter((e) => e.length > 0).join("\n ");
|
|
359
|
-
if (
|
|
360
|
-
let e =
|
|
378
|
+
if (w === "ssr" && F === "full" && e.buffered !== !0) {
|
|
379
|
+
let e = P?.locale ?? N.cookies["voltro:locale"] ?? "en", t = T({ shell: f });
|
|
361
380
|
return {
|
|
362
381
|
renderMode: "ssr",
|
|
363
|
-
|
|
382
|
+
setCookies: y.setCookies,
|
|
383
|
+
stream: (n) => d({
|
|
364
384
|
res: n,
|
|
365
385
|
shell: t,
|
|
366
386
|
htmlLang: e,
|
|
367
387
|
headers: {
|
|
368
388
|
"content-type": "text/html; charset=utf-8",
|
|
369
|
-
"x-voltro-rendered-by": "ssr"
|
|
389
|
+
"x-voltro-rendered-by": "ssr",
|
|
390
|
+
...h(y.setCookies)
|
|
370
391
|
},
|
|
371
|
-
headInjection:
|
|
372
|
-
render: (e) =>
|
|
373
|
-
...
|
|
392
|
+
headInjection: le,
|
|
393
|
+
render: (e) => M.renderPageToStream({
|
|
394
|
+
...ce,
|
|
374
395
|
...e
|
|
375
396
|
}),
|
|
376
397
|
onShellError: (e) => {
|
|
377
|
-
|
|
398
|
+
Y.error("ssr shell render failed", { pathname: c }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
|
|
378
399
|
}
|
|
379
400
|
})
|
|
380
401
|
};
|
|
381
402
|
}
|
|
382
|
-
let { html:
|
|
383
|
-
|
|
384
|
-
let
|
|
403
|
+
let { html: ue, meta: de } = M.renderPageToHtml(ce), fe = le(de), pe = P?.locale ?? N.cookies["voltro:locale"] ?? "en", R = r(f.replace("<div id=\"root\"></div>", `<div id="root">${ue}</div>`), fe).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${pe}"`);
|
|
404
|
+
F === "none" && (R = Z(R));
|
|
405
|
+
let me = w === "isr" ? he(C.revalidate) : null;
|
|
385
406
|
return {
|
|
386
|
-
html:
|
|
387
|
-
renderMode:
|
|
388
|
-
revalidateMs:
|
|
407
|
+
html: R,
|
|
408
|
+
renderMode: w,
|
|
409
|
+
revalidateMs: me,
|
|
410
|
+
setCookies: y.setCookies
|
|
389
411
|
};
|
|
390
|
-
},
|
|
391
|
-
let t = await import(
|
|
412
|
+
}, $ = (e) => e === "" ? "/" : e, Ve = async (e) => {
|
|
413
|
+
let t = await import(H(e).href);
|
|
392
414
|
return {
|
|
393
415
|
kind: "bundle",
|
|
394
416
|
getPageMeta: () => t.pageMeta,
|
|
@@ -398,18 +420,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
398
420
|
return typeof r == "function" ? await r() : r;
|
|
399
421
|
},
|
|
400
422
|
async getLayout(e) {
|
|
401
|
-
let n = t.layouts[
|
|
402
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${
|
|
423
|
+
let n = t.layouts[$(e)];
|
|
424
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${$(e)}`);
|
|
403
425
|
return typeof n == "function" ? await n() : n;
|
|
404
426
|
},
|
|
405
427
|
async getError(e) {
|
|
406
|
-
let n = t.errors[
|
|
407
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${
|
|
428
|
+
let n = t.errors[$(e)];
|
|
429
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${$(e)}`);
|
|
408
430
|
return typeof n == "function" ? await n() : n;
|
|
409
431
|
},
|
|
410
432
|
async getPending(e) {
|
|
411
|
-
let n = t.pendings[
|
|
412
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${
|
|
433
|
+
let n = t.pendings[$(e)];
|
|
434
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${$(e)}`);
|
|
413
435
|
return typeof n == "function" ? await n() : n;
|
|
414
436
|
},
|
|
415
437
|
async getHelpers() {
|
|
@@ -417,8 +439,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
417
439
|
},
|
|
418
440
|
async close() {}
|
|
419
441
|
};
|
|
420
|
-
},
|
|
421
|
-
let n = await
|
|
442
|
+
}, He = async (e, t) => {
|
|
443
|
+
let n = await j("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
|
|
422
444
|
root: t,
|
|
423
445
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
424
446
|
plugins: [r(), i()],
|
|
@@ -435,10 +457,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
435
457
|
},
|
|
436
458
|
appType: "custom",
|
|
437
459
|
logLevel: "warn"
|
|
438
|
-
}), o =
|
|
439
|
-
limit:
|
|
440
|
-
onColdStart: (e) =>
|
|
441
|
-
onColdEnd: (e, { durationMs: t, failed: n }) =>
|
|
460
|
+
}), o = z(e, "src", "pages"), s = (e) => e === "" ? o : z(o, e), c = A({
|
|
461
|
+
limit: O(),
|
|
462
|
+
onColdStart: (e) => Y.debug("ssr cold-compile start", { id: e }),
|
|
463
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => Y.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
442
464
|
id: e,
|
|
443
465
|
ms: t,
|
|
444
466
|
...n ? { failed: !0 } : {}
|
|
@@ -447,16 +469,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
447
469
|
return {
|
|
448
470
|
kind: "middleware",
|
|
449
471
|
async getPage(e, t) {
|
|
450
|
-
return l(
|
|
472
|
+
return l(z(o, t));
|
|
451
473
|
},
|
|
452
474
|
async getLayout(e) {
|
|
453
|
-
return l(
|
|
475
|
+
return l(z(s(e), "layout.tsx"));
|
|
454
476
|
},
|
|
455
477
|
async getError(e) {
|
|
456
|
-
return l(
|
|
478
|
+
return l(z(s(e), "error.tsx"));
|
|
457
479
|
},
|
|
458
480
|
async getPending(e) {
|
|
459
|
-
return l(
|
|
481
|
+
return l(z(s(e), "loading.tsx"));
|
|
460
482
|
},
|
|
461
483
|
async getHelpers() {
|
|
462
484
|
return await l("@voltro/web/ssr");
|
|
@@ -465,99 +487,106 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
465
487
|
await a.close();
|
|
466
488
|
}
|
|
467
489
|
};
|
|
468
|
-
},
|
|
469
|
-
let r =
|
|
470
|
-
if (!
|
|
490
|
+
}, Ue = async (t) => {
|
|
491
|
+
let r = Ce(), s = await S(t);
|
|
492
|
+
if (!s) return {
|
|
471
493
|
ran: !1,
|
|
472
494
|
exitCode: 0
|
|
473
495
|
};
|
|
474
|
-
if (
|
|
496
|
+
if (s.type !== "web") return Y.error("only web apps are supported by `voltro start`"), {
|
|
475
497
|
ran: !0,
|
|
476
498
|
exitCode: 1
|
|
477
499
|
};
|
|
478
|
-
let { resolved:
|
|
479
|
-
rawEnv:
|
|
500
|
+
let { resolved: l } = await w({
|
|
501
|
+
rawEnv: s.env,
|
|
480
502
|
appType: "web",
|
|
481
503
|
root: t,
|
|
482
|
-
log:
|
|
504
|
+
log: Y,
|
|
483
505
|
generateTypes: !1
|
|
484
|
-
}),
|
|
506
|
+
}), u = l.publicValues;
|
|
485
507
|
r.mark("config");
|
|
486
|
-
let
|
|
487
|
-
|
|
488
|
-
let
|
|
508
|
+
let d = _();
|
|
509
|
+
k(d), Y.info("booting voltro start", { app: s.name ?? "(unnamed)" });
|
|
510
|
+
let p = n({
|
|
489
511
|
kind: "web",
|
|
490
|
-
configPort:
|
|
512
|
+
configPort: s.port,
|
|
491
513
|
env: process.env,
|
|
492
|
-
dashboardPin: process.env[
|
|
514
|
+
dashboardPin: process.env[se] === "1"
|
|
493
515
|
});
|
|
494
|
-
for (let e of
|
|
495
|
-
let m =
|
|
496
|
-
if (!await
|
|
516
|
+
for (let e of p.warnings) Y.warn(e);
|
|
517
|
+
let m = p.port, h = z(t, ".framework"), b = z(h, "dist"), ie = z(b, "index.html");
|
|
518
|
+
if (!await Q(ie)) return Y.error("no built dist found — run `voltro build` first", { distDir: b }), {
|
|
497
519
|
ran: !0,
|
|
498
520
|
exitCode: 1
|
|
499
521
|
};
|
|
500
|
-
let
|
|
501
|
-
await
|
|
502
|
-
id:
|
|
503
|
-
name:
|
|
522
|
+
let T = s.name ?? "unnamed", E = be("web", T, m), O = xe(T);
|
|
523
|
+
await _e({
|
|
524
|
+
id: E,
|
|
525
|
+
name: T,
|
|
504
526
|
kind: "web",
|
|
505
527
|
url: `http://localhost:${m}`,
|
|
506
528
|
pid: process.pid,
|
|
507
529
|
status: "booting",
|
|
508
|
-
logFile:
|
|
530
|
+
logFile: O.path
|
|
509
531
|
}).catch(() => {});
|
|
510
|
-
let
|
|
511
|
-
|
|
512
|
-
|
|
532
|
+
let A = z(b, "_voltro", "shell.html"), j = await Q(A) ? await B.readFile(A, "utf8") : await B.readFile(ie, "utf8"), L = await C(t, s), he = D(L[0]), we = L[0]?.name, Te = /* @__PURE__ */ new Set(), Ee = (e) => {
|
|
533
|
+
Te.has(e.name) || (Te.add(e.name), Y.warn(`middleware.ts wrote the cookie "${e.name}" with the HttpOnly default — a browser SDK cannot read it`, {
|
|
534
|
+
cookie: e.name,
|
|
535
|
+
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."
|
|
536
|
+
}));
|
|
537
|
+
}, V = await i(t);
|
|
538
|
+
V.length > 0 && Y.info(`middleware.ts loaded — ${V.length} middleware(s): ` + V.map((e) => e.exportName).join(", "));
|
|
539
|
+
let H, U = null, W = process.env.SSR_CACHE === "postgres";
|
|
540
|
+
if (W && P()) U = new (await (import("pg"))).default.Client(N()), await U.connect(), H = Me({ client: U }), Y.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
|
|
541
|
+
else if (W) {
|
|
513
542
|
let t = "SSR_CACHE=postgres, but nothing in the environment names a database (looked for DB_URL, DB_PRIMARY_URL, DB_DIRECT_URL, DB_MIGRATE_URL, DB_HOST, PG_HOST).";
|
|
514
|
-
if (e()) throw
|
|
515
|
-
|
|
516
|
-
} else
|
|
517
|
-
await
|
|
518
|
-
let
|
|
519
|
-
r.mark("scan");
|
|
520
|
-
let
|
|
521
|
-
if (!
|
|
522
|
-
let
|
|
523
|
-
|
|
524
|
-
kind:
|
|
525
|
-
...
|
|
543
|
+
if (e()) throw Y.fatal(`${t} Refusing to fall back to the per-process memory cache: it is not shared between instances and does not survive a restart, so the pages this process serves would differ from its replicas' with nothing to indicate it.`), Error("[voltro start] SSR_CACHE=postgres with no database configured");
|
|
544
|
+
H = R(), Y.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
|
|
545
|
+
} else H = R(), Y.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
|
|
546
|
+
await x(t, s, L, u);
|
|
547
|
+
let Ae = z(t, "src", "pages"), { pages: G, dirs: K } = await M(Ae), q = Re(G);
|
|
548
|
+
oe(V, q.map((e) => e.pattern)), r.mark("scan");
|
|
549
|
+
let J = z(b, "server", "ssrEntry.js"), Pe = await Q(J);
|
|
550
|
+
if (!Pe && process.env.NODE_ENV === "production") throw Y.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${J} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${J}`);
|
|
551
|
+
let X = Pe ? await Ve(J) : await He(t, h);
|
|
552
|
+
Y.info(`ssr loader: ${X.kind}`, {
|
|
553
|
+
kind: X.kind,
|
|
554
|
+
...X.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
|
|
526
555
|
}), r.mark("provider");
|
|
527
|
-
let
|
|
528
|
-
for (let e of
|
|
529
|
-
let t =
|
|
556
|
+
let Fe = X.getPageMeta?.(), Z = /* @__PURE__ */ new Map(), Le = 0;
|
|
557
|
+
for (let e of G) {
|
|
558
|
+
let t = Fe?.[e.pattern];
|
|
530
559
|
if (t) {
|
|
531
|
-
|
|
560
|
+
Z.set(e.pattern, t);
|
|
532
561
|
continue;
|
|
533
562
|
}
|
|
534
563
|
try {
|
|
535
|
-
let t = await
|
|
536
|
-
|
|
564
|
+
let t = await X.getPage(e.pattern, e.file);
|
|
565
|
+
Z.set(e.pattern, fe(t, e.file)), Le++;
|
|
537
566
|
} catch (t) {
|
|
538
|
-
|
|
567
|
+
Y.warn("failed to load page metadata", { pattern: e.pattern }, t);
|
|
539
568
|
}
|
|
540
569
|
}
|
|
541
|
-
|
|
542
|
-
count:
|
|
543
|
-
fromManifest:
|
|
544
|
-
fromModules:
|
|
570
|
+
Y.info(`registered ${Z.size} route(s)`, {
|
|
571
|
+
count: Z.size,
|
|
572
|
+
fromManifest: Z.size - Le,
|
|
573
|
+
fromModules: Le
|
|
545
574
|
}), r.mark("routes");
|
|
546
|
-
let
|
|
547
|
-
for (let e of
|
|
548
|
-
|
|
549
|
-
let
|
|
550
|
-
for (let [e, t] of
|
|
551
|
-
let
|
|
552
|
-
for (let e of
|
|
553
|
-
let
|
|
554
|
-
cache:
|
|
555
|
-
tableSubscriptionsByPattern:
|
|
556
|
-
regexByPattern:
|
|
575
|
+
let $ = /* @__PURE__ */ new Set();
|
|
576
|
+
for (let e of q) Z.get(e.pattern)?.renderMode === "spa" && ae(K, e.dirChain).some((e) => e.hasLayout) && $.add(e.pattern);
|
|
577
|
+
$.size > 0 && Y.info(`${$.size} spa route(s) render an SSR layout shell`, { patterns: [...$] });
|
|
578
|
+
let Ue = /* @__PURE__ */ new Map();
|
|
579
|
+
for (let [e, t] of Z) t.cacheInvalidatesOn.length > 0 && Ue.set(e, t.cacheInvalidatesOn);
|
|
580
|
+
let We = /* @__PURE__ */ new Map();
|
|
581
|
+
for (let e of q) We.set(e.pattern, e.regex);
|
|
582
|
+
let Ge = je({
|
|
583
|
+
cache: H,
|
|
584
|
+
tableSubscriptionsByPattern: Ue,
|
|
585
|
+
regexByPattern: We
|
|
557
586
|
});
|
|
558
|
-
await
|
|
559
|
-
let
|
|
560
|
-
let t =
|
|
587
|
+
await Ge.start(), r.mark("cdc");
|
|
588
|
+
let Ke = Se(), qe = G.map((e) => {
|
|
589
|
+
let t = Z.get(e.pattern);
|
|
561
590
|
return {
|
|
562
591
|
pattern: e.pattern,
|
|
563
592
|
file: e.file,
|
|
@@ -572,20 +601,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
572
601
|
hasMeta: t?.hasMeta ?? !1,
|
|
573
602
|
hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
|
|
574
603
|
};
|
|
575
|
-
}),
|
|
604
|
+
}), Je = K.map((e) => ({
|
|
576
605
|
dir: e.dir,
|
|
577
606
|
hasLayout: e.hasLayout,
|
|
578
607
|
hasError: e.hasError,
|
|
579
608
|
hasPending: e.hasPending,
|
|
580
609
|
hasNotFound: e.hasNotFound
|
|
581
|
-
})),
|
|
610
|
+
})), Ye = U ? "postgres" : "memory", Xe = {
|
|
582
611
|
kind: "web",
|
|
583
612
|
meta: {
|
|
584
|
-
name:
|
|
585
|
-
voltroVersion:
|
|
613
|
+
name: s.name ?? "(unnamed)",
|
|
614
|
+
voltroVersion: Ne,
|
|
586
615
|
port: m,
|
|
587
616
|
mode: "start",
|
|
588
|
-
apis: Object.entries(
|
|
617
|
+
apis: Object.entries(s.apis ?? {}).map(([e, t]) => {
|
|
589
618
|
let n = {
|
|
590
619
|
name: e,
|
|
591
620
|
package: t.package
|
|
@@ -593,10 +622,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
593
622
|
return t.url !== void 0 && (n.url = t.url), n;
|
|
594
623
|
})
|
|
595
624
|
},
|
|
596
|
-
routes:
|
|
597
|
-
dirs:
|
|
625
|
+
routes: qe,
|
|
626
|
+
dirs: Je,
|
|
598
627
|
cache: () => {
|
|
599
|
-
let e = Date.now(), t =
|
|
628
|
+
let e = Date.now(), t = H.snapshot().map(([t, n]) => ({
|
|
600
629
|
key: t,
|
|
601
630
|
renderedAt: n.renderedAt,
|
|
602
631
|
expiresAt: n.expiresAt,
|
|
@@ -607,16 +636,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
607
636
|
staleWhileRevalidateMs: n.staleWhileRevalidateMs
|
|
608
637
|
}));
|
|
609
638
|
return {
|
|
610
|
-
backend:
|
|
611
|
-
size:
|
|
639
|
+
backend: Ye,
|
|
640
|
+
size: H.size(),
|
|
612
641
|
entries: t
|
|
613
642
|
};
|
|
614
643
|
},
|
|
615
|
-
metrics: () =>
|
|
616
|
-
},
|
|
644
|
+
metrics: () => Oe()
|
|
645
|
+
}, Ze = async (e, n) => {
|
|
617
646
|
let r = e.split("?")[0] ?? "/";
|
|
618
|
-
if (
|
|
619
|
-
let e = await
|
|
647
|
+
if (s.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
|
|
648
|
+
let e = await ve();
|
|
620
649
|
return {
|
|
621
650
|
status: 200,
|
|
622
651
|
headers: { "content-type": "application/json; charset=utf-8" },
|
|
@@ -629,7 +658,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
629
658
|
body: `registry read error: ${e.message}`
|
|
630
659
|
};
|
|
631
660
|
}
|
|
632
|
-
if (
|
|
661
|
+
if (s.name === "voltroDashboard" && r === "/api/dashboard/config") {
|
|
633
662
|
let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
|
|
634
663
|
if (e && e.trim().length > 0) {
|
|
635
664
|
let n;
|
|
@@ -659,18 +688,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
659
688
|
};
|
|
660
689
|
}
|
|
661
690
|
if (r === "/_voltro/inspect/logs") {
|
|
662
|
-
let t =
|
|
691
|
+
let t = re(e, ee(), n);
|
|
663
692
|
return {
|
|
664
693
|
status: t.status,
|
|
665
694
|
headers: {
|
|
666
695
|
"content-type": t.contentType,
|
|
667
|
-
...
|
|
696
|
+
...I(n.origin)
|
|
668
697
|
},
|
|
669
698
|
body: t.body
|
|
670
699
|
};
|
|
671
700
|
}
|
|
672
701
|
if (r !== "/_voltro/inspect/stream") {
|
|
673
|
-
let t =
|
|
702
|
+
let t = le(e, Xe, n);
|
|
674
703
|
if (t !== null) return {
|
|
675
704
|
status: t.status,
|
|
676
705
|
headers: {
|
|
@@ -680,71 +709,96 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
680
709
|
body: t.body
|
|
681
710
|
};
|
|
682
711
|
}
|
|
683
|
-
let
|
|
684
|
-
if (!
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
712
|
+
let i = ze(r, q), c = i ? Z.get(i.route.pattern)?.renderMode : void 0, l = c === "ssr" || c === "isr" || (i ? $.has(i.route.pattern) : !1), u = [];
|
|
713
|
+
if (!l && V.length > 0) {
|
|
714
|
+
let t = a(V, {
|
|
715
|
+
route: void 0,
|
|
716
|
+
pathname: r
|
|
717
|
+
});
|
|
718
|
+
if (t !== void 0) {
|
|
719
|
+
let i = await o(t, {
|
|
720
|
+
pathname: r,
|
|
721
|
+
search: e.slice(r.length),
|
|
722
|
+
headers: n,
|
|
723
|
+
cookies: ne(n.cookie),
|
|
724
|
+
route: void 0
|
|
725
|
+
});
|
|
726
|
+
u.push(...i.setCookies);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
let p = (e) => u.length === 0 ? e : {
|
|
730
|
+
...e,
|
|
731
|
+
"set-cookie": u.map(te)
|
|
732
|
+
}, m = r === "/" ? z(b, "index.html") : z(b, r.replace(/^\//, ""), "index.html");
|
|
733
|
+
if (!l && await Q(m)) {
|
|
734
|
+
let e = await B.readFile(m);
|
|
735
|
+
return {
|
|
736
|
+
status: 200,
|
|
737
|
+
headers: p({ "content-type": "text/html; charset=utf-8" }),
|
|
738
|
+
body: e
|
|
739
|
+
};
|
|
740
|
+
}
|
|
689
741
|
if (/\.[a-z0-9]+$/i.test(r)) {
|
|
690
|
-
let e =
|
|
691
|
-
if (await
|
|
692
|
-
let t = await
|
|
742
|
+
let e = z(b, r.replace(/^\//, ""));
|
|
743
|
+
if (await Q(e)) {
|
|
744
|
+
let t = await B.readFile(e);
|
|
693
745
|
return {
|
|
694
746
|
status: 200,
|
|
695
|
-
headers: { "content-type":
|
|
747
|
+
headers: p({ "content-type": Ie(e) }),
|
|
696
748
|
body: t
|
|
697
749
|
};
|
|
698
750
|
}
|
|
699
751
|
}
|
|
700
|
-
let
|
|
701
|
-
if (!
|
|
752
|
+
let h = ze(r, q);
|
|
753
|
+
if (!h) return {
|
|
702
754
|
status: 404,
|
|
703
|
-
headers: { "content-type": "text/plain" },
|
|
755
|
+
headers: p({ "content-type": "text/plain" }),
|
|
704
756
|
body: "not found"
|
|
705
757
|
};
|
|
706
|
-
let
|
|
707
|
-
...
|
|
708
|
-
...
|
|
709
|
-
}),
|
|
710
|
-
if (
|
|
758
|
+
let g = Z.get(h.route.pattern), _ = n["x-tenant"] ?? "anonymous", v = (await X.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, y = me(r, {
|
|
759
|
+
...g?.tenantAware ? { tenant: _ } : {},
|
|
760
|
+
...v ? { locale: v } : {}
|
|
761
|
+
}), x = H.get(y), S = Date.now();
|
|
762
|
+
if (x && ge(x, S)) return d.emit("cache", {
|
|
711
763
|
kind: "HIT",
|
|
712
|
-
key:
|
|
713
|
-
ageMs:
|
|
764
|
+
key: y,
|
|
765
|
+
ageMs: S - x.renderedAt
|
|
714
766
|
}), {
|
|
715
767
|
status: 200,
|
|
716
768
|
headers: {
|
|
717
769
|
"content-type": "text/html; charset=utf-8",
|
|
718
770
|
"x-voltro-rendered-by": "isr",
|
|
719
771
|
"x-voltro-cache": "HIT",
|
|
720
|
-
"x-voltro-cache-key":
|
|
721
|
-
"x-voltro-cache-age-ms": String(
|
|
772
|
+
"x-voltro-cache-key": y,
|
|
773
|
+
"x-voltro-cache-age-ms": String(S - x.renderedAt)
|
|
722
774
|
},
|
|
723
|
-
body:
|
|
775
|
+
body: x.html
|
|
724
776
|
};
|
|
725
|
-
if (
|
|
777
|
+
if (x && pe(x, S)) return d.emit("cache", {
|
|
726
778
|
kind: "STALE",
|
|
727
|
-
key:
|
|
728
|
-
ageMs:
|
|
779
|
+
key: y,
|
|
780
|
+
ageMs: S - x.renderedAt
|
|
729
781
|
}), (async () => {
|
|
730
782
|
try {
|
|
731
|
-
let i = await
|
|
732
|
-
provider:
|
|
783
|
+
let i = await Be({
|
|
784
|
+
provider: X,
|
|
733
785
|
root: t,
|
|
734
|
-
route:
|
|
735
|
-
params:
|
|
786
|
+
route: h.route,
|
|
787
|
+
params: h.params,
|
|
736
788
|
pathname: r,
|
|
737
|
-
dirs:
|
|
738
|
-
shellTemplate:
|
|
789
|
+
dirs: K,
|
|
790
|
+
shellTemplate: j,
|
|
739
791
|
requestHeaders: n,
|
|
740
|
-
apiOrigin:
|
|
741
|
-
apiName:
|
|
792
|
+
apiOrigin: he,
|
|
793
|
+
apiName: we,
|
|
794
|
+
middlewares: V,
|
|
795
|
+
onCookieWarning: Ee,
|
|
742
796
|
requestUrl: e,
|
|
743
797
|
buffered: !0
|
|
744
798
|
});
|
|
745
799
|
if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
746
|
-
let e =
|
|
747
|
-
|
|
800
|
+
let e = Z.get(h.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
|
|
801
|
+
H.set(y, {
|
|
748
802
|
html: i.html,
|
|
749
803
|
renderedAt: t,
|
|
750
804
|
expiresAt: t + i.revalidateMs,
|
|
@@ -754,7 +808,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
754
808
|
});
|
|
755
809
|
}
|
|
756
810
|
} catch (e) {
|
|
757
|
-
|
|
811
|
+
Y.warn("background SWR refresh failed", { url: r }, e);
|
|
758
812
|
}
|
|
759
813
|
})(), {
|
|
760
814
|
status: 200,
|
|
@@ -762,23 +816,25 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
762
816
|
"content-type": "text/html; charset=utf-8",
|
|
763
817
|
"x-voltro-rendered-by": "isr",
|
|
764
818
|
"x-voltro-cache": "STALE",
|
|
765
|
-
"x-voltro-cache-key":
|
|
766
|
-
"x-voltro-cache-age-ms": String(
|
|
819
|
+
"x-voltro-cache-key": y,
|
|
820
|
+
"x-voltro-cache-age-ms": String(S - x.renderedAt)
|
|
767
821
|
},
|
|
768
|
-
body:
|
|
822
|
+
body: x.html
|
|
769
823
|
};
|
|
770
824
|
try {
|
|
771
|
-
let i = await
|
|
772
|
-
provider:
|
|
825
|
+
let i = await Be({
|
|
826
|
+
provider: X,
|
|
773
827
|
root: t,
|
|
774
|
-
route:
|
|
775
|
-
params:
|
|
828
|
+
route: h.route,
|
|
829
|
+
params: h.params,
|
|
776
830
|
pathname: r,
|
|
777
|
-
dirs:
|
|
778
|
-
shellTemplate:
|
|
831
|
+
dirs: K,
|
|
832
|
+
shellTemplate: j,
|
|
779
833
|
requestHeaders: n,
|
|
780
|
-
apiOrigin:
|
|
781
|
-
apiName:
|
|
834
|
+
apiOrigin: he,
|
|
835
|
+
apiName: we,
|
|
836
|
+
middlewares: V,
|
|
837
|
+
onCookieWarning: Ee,
|
|
782
838
|
requestUrl: e
|
|
783
839
|
});
|
|
784
840
|
if (!i) return {
|
|
@@ -787,7 +843,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
787
843
|
"content-type": "text/html; charset=utf-8",
|
|
788
844
|
"x-voltro-rendered-by": "spa-fallback"
|
|
789
845
|
},
|
|
790
|
-
body:
|
|
846
|
+
body: j
|
|
847
|
+
};
|
|
848
|
+
let a = i.setCookies ?? [], o = (e) => a.length === 0 ? e : {
|
|
849
|
+
...e,
|
|
850
|
+
"set-cookie": a.map(te)
|
|
791
851
|
};
|
|
792
852
|
if ("stream" in i) return {
|
|
793
853
|
status: 200,
|
|
@@ -797,49 +857,49 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
797
857
|
};
|
|
798
858
|
if ("control" in i) return i.control === "redirect" ? {
|
|
799
859
|
status: i.status,
|
|
800
|
-
headers: {
|
|
860
|
+
headers: o({
|
|
801
861
|
location: i.location,
|
|
802
862
|
"x-voltro-rendered-by": "loader-redirect"
|
|
803
|
-
},
|
|
863
|
+
}),
|
|
804
864
|
body: ""
|
|
805
865
|
} : {
|
|
806
866
|
status: 404,
|
|
807
|
-
headers: {
|
|
867
|
+
headers: o({
|
|
808
868
|
"content-type": "text/plain; charset=utf-8",
|
|
809
869
|
"x-voltro-rendered-by": "loader-not-found"
|
|
810
|
-
},
|
|
870
|
+
}),
|
|
811
871
|
body: "not found"
|
|
812
872
|
};
|
|
813
|
-
let
|
|
873
|
+
let s = o({
|
|
814
874
|
"content-type": "text/html; charset=utf-8",
|
|
815
875
|
"x-voltro-rendered-by": i.renderMode
|
|
816
|
-
};
|
|
876
|
+
});
|
|
817
877
|
if (i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
818
|
-
let e = Date.now(), t =
|
|
819
|
-
|
|
878
|
+
let e = Date.now(), t = Z.get(h.route.pattern)?.staleWhileRevalidateMs ?? 0;
|
|
879
|
+
H.set(y, {
|
|
820
880
|
html: i.html,
|
|
821
881
|
renderedAt: e,
|
|
822
882
|
expiresAt: e + i.revalidateMs,
|
|
823
883
|
servableUntil: e + i.revalidateMs + t,
|
|
824
884
|
revalidateMs: i.revalidateMs,
|
|
825
885
|
staleWhileRevalidateMs: t
|
|
826
|
-
}),
|
|
886
|
+
}), s["x-voltro-cache"] = "MISS", s["x-voltro-cache-key"] = y, s["x-voltro-cache-revalidate-ms"] = String(i.revalidateMs), t > 0 && (s["x-voltro-cache-swr-ms"] = String(t)), d.emit("cache", {
|
|
827
887
|
kind: "MISS",
|
|
828
|
-
key:
|
|
888
|
+
key: y,
|
|
829
889
|
revalidateMs: i.revalidateMs,
|
|
830
890
|
swrMs: t
|
|
831
891
|
});
|
|
832
|
-
} else i.renderMode === "isr" && (
|
|
892
|
+
} else i.renderMode === "isr" && (s["x-voltro-cache"] = "BYPASS", d.emit("cache", {
|
|
833
893
|
kind: "BYPASS",
|
|
834
|
-
key:
|
|
894
|
+
key: y
|
|
835
895
|
}));
|
|
836
896
|
return {
|
|
837
897
|
status: 200,
|
|
838
|
-
headers:
|
|
898
|
+
headers: s,
|
|
839
899
|
body: i.html
|
|
840
900
|
};
|
|
841
901
|
} catch (e) {
|
|
842
|
-
return
|
|
902
|
+
return Y.error("render error", { url: r }, e), f(e) ? {
|
|
843
903
|
status: 500,
|
|
844
904
|
headers: {
|
|
845
905
|
"content-type": "text/plain; charset=utf-8",
|
|
@@ -852,56 +912,56 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
852
912
|
body: "server error"
|
|
853
913
|
};
|
|
854
914
|
}
|
|
855
|
-
},
|
|
915
|
+
}, Qe = !1, $e = ke(async (e, t) => {
|
|
856
916
|
let n = e.url ?? "/", r = Date.now(), i = {};
|
|
857
917
|
for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
|
|
858
|
-
let
|
|
859
|
-
if (
|
|
918
|
+
let a = n.split("?")[0] ?? "/", o = (e.method ?? "GET").toUpperCase();
|
|
919
|
+
if (a === "/internal/liveness") {
|
|
860
920
|
t.writeHead(200, {
|
|
861
921
|
"content-type": "text/plain",
|
|
862
922
|
"cache-control": "no-store"
|
|
863
923
|
}), t.end("ok");
|
|
864
924
|
return;
|
|
865
925
|
}
|
|
866
|
-
if (
|
|
867
|
-
let e =
|
|
926
|
+
if (a === "/internal/readiness") {
|
|
927
|
+
let e = Qe ? 200 : 503;
|
|
868
928
|
t.writeHead(e, {
|
|
869
929
|
"content-type": "text/plain",
|
|
870
930
|
"cache-control": "no-store"
|
|
871
|
-
}), t.end(
|
|
931
|
+
}), t.end(Qe ? "ready" : "not-ready");
|
|
872
932
|
return;
|
|
873
933
|
}
|
|
874
|
-
if (
|
|
875
|
-
let e =
|
|
934
|
+
if (o === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
|
|
935
|
+
let e = I(i.origin);
|
|
876
936
|
t.writeHead(204, e), t.end();
|
|
877
937
|
return;
|
|
878
938
|
}
|
|
879
|
-
if (
|
|
939
|
+
if (s.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
|
|
880
940
|
let r = new URL(n, "http://x").searchParams.get("target");
|
|
881
941
|
if (!r) {
|
|
882
942
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
883
943
|
return;
|
|
884
944
|
}
|
|
885
|
-
if (!
|
|
945
|
+
if (!de(r)) {
|
|
886
946
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
887
947
|
return;
|
|
888
948
|
}
|
|
889
949
|
try {
|
|
890
950
|
let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
|
|
891
|
-
a ? n.authorization = Array.isArray(a) ? a[0] : a :
|
|
892
|
-
let
|
|
893
|
-
if (
|
|
951
|
+
a ? n.authorization = Array.isArray(a) ? a[0] : a : ue(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
952
|
+
let s;
|
|
953
|
+
if (o && o !== "GET" && o !== "HEAD") {
|
|
894
954
|
let t = [];
|
|
895
955
|
for await (let n of e) t.push(n);
|
|
896
|
-
|
|
956
|
+
s = Buffer.concat(t);
|
|
897
957
|
let r = i["content-type"];
|
|
898
958
|
r && (n["content-type"] = Array.isArray(r) ? r[0] : r);
|
|
899
959
|
}
|
|
900
960
|
let c = await fetch(r, {
|
|
901
961
|
redirect: "manual",
|
|
902
|
-
method:
|
|
962
|
+
method: o,
|
|
903
963
|
headers: n,
|
|
904
|
-
...
|
|
964
|
+
...s ? { body: new Uint8Array(s.buffer, s.byteOffset, s.byteLength) } : {}
|
|
905
965
|
}), l = Buffer.from(await c.arrayBuffer());
|
|
906
966
|
t.writeHead(c.status, {
|
|
907
967
|
"content-type": c.headers.get("content-type") ?? "application/octet-stream",
|
|
@@ -912,20 +972,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
912
972
|
}
|
|
913
973
|
return;
|
|
914
974
|
}
|
|
915
|
-
if (
|
|
975
|
+
if (s.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
|
|
916
976
|
let r = new URL(n, "http://x").searchParams.get("target");
|
|
917
977
|
if (!r) {
|
|
918
978
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
919
979
|
return;
|
|
920
980
|
}
|
|
921
|
-
if (!
|
|
981
|
+
if (!de(r)) {
|
|
922
982
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
923
983
|
return;
|
|
924
984
|
}
|
|
925
985
|
let a = new AbortController();
|
|
926
986
|
e.on("close", () => a.abort()), t.on("close", () => a.abort());
|
|
927
987
|
try {
|
|
928
|
-
let e = i.authorization ?? (
|
|
988
|
+
let e = i.authorization ?? (ue(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
|
|
929
989
|
redirect: "manual",
|
|
930
990
|
method: "GET",
|
|
931
991
|
headers: {
|
|
@@ -959,16 +1019,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
959
1019
|
}
|
|
960
1020
|
return;
|
|
961
1021
|
}
|
|
962
|
-
if (
|
|
963
|
-
let n =
|
|
964
|
-
if (
|
|
1022
|
+
if (a === "/_voltro/inspect/stream") {
|
|
1023
|
+
let n = I(i.origin);
|
|
1024
|
+
if (F()) {
|
|
965
1025
|
t.writeHead(503, {
|
|
966
1026
|
"content-type": "application/json",
|
|
967
1027
|
...n
|
|
968
1028
|
}), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
969
1029
|
return;
|
|
970
1030
|
}
|
|
971
|
-
let r =
|
|
1031
|
+
let r = ce(i, "GET");
|
|
972
1032
|
if (!r.ok) {
|
|
973
1033
|
t.writeHead(401, {
|
|
974
1034
|
"content-type": "application/json",
|
|
@@ -986,11 +1046,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
986
1046
|
"x-accel-buffering": "no",
|
|
987
1047
|
...n
|
|
988
1048
|
}), t.flushHeaders(), t.write("retry: 5000\n\n");
|
|
989
|
-
for (let e of
|
|
990
|
-
let a =
|
|
991
|
-
t.write(
|
|
1049
|
+
for (let e of d.buffered()) t.write(v(e));
|
|
1050
|
+
let a = d.subscribe((e) => {
|
|
1051
|
+
t.write(v(e));
|
|
992
1052
|
}), o = setInterval(() => {
|
|
993
|
-
t.write(
|
|
1053
|
+
t.write(y());
|
|
994
1054
|
}, 15e3), s = () => {
|
|
995
1055
|
clearInterval(o), a();
|
|
996
1056
|
};
|
|
@@ -998,18 +1058,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
998
1058
|
return;
|
|
999
1059
|
}
|
|
1000
1060
|
try {
|
|
1001
|
-
let e = await
|
|
1002
|
-
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !
|
|
1061
|
+
let e = await Ze(n, i);
|
|
1062
|
+
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
|
|
1003
1063
|
let t = Date.now() - r;
|
|
1004
|
-
|
|
1005
|
-
url:
|
|
1064
|
+
d.emit("request", {
|
|
1065
|
+
url: a,
|
|
1006
1066
|
status: e.status,
|
|
1007
1067
|
durationMs: t,
|
|
1008
1068
|
renderedBy: e.headers["x-voltro-rendered-by"],
|
|
1009
1069
|
cache: e.headers["x-voltro-cache"]
|
|
1010
1070
|
});
|
|
1011
|
-
let n =
|
|
1012
|
-
|
|
1071
|
+
let n = ze(a, q)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
|
|
1072
|
+
Ke.record({
|
|
1013
1073
|
kind: "request",
|
|
1014
1074
|
tag: n,
|
|
1015
1075
|
durationMs: t,
|
|
@@ -1020,71 +1080,71 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1020
1080
|
t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
|
|
1021
1081
|
}
|
|
1022
1082
|
});
|
|
1023
|
-
await new Promise((e) =>
|
|
1083
|
+
await new Promise((e) => $e.listen(m, "::", e)), Qe = !0, r.mark("ready"), Y.info(`listening on http://localhost:${m}`, {
|
|
1024
1084
|
port: m,
|
|
1025
|
-
distDir:
|
|
1026
|
-
}),
|
|
1085
|
+
distDir: b
|
|
1086
|
+
}), Y.debug("dynamic + ssr/isr routes resolve via SSR loader");
|
|
1027
1087
|
try {
|
|
1028
|
-
await
|
|
1029
|
-
id:
|
|
1030
|
-
name:
|
|
1088
|
+
await _e({
|
|
1089
|
+
id: E,
|
|
1090
|
+
name: T,
|
|
1031
1091
|
kind: "web",
|
|
1032
1092
|
url: `http://localhost:${m}`,
|
|
1033
1093
|
pid: process.pid,
|
|
1034
1094
|
status: "live",
|
|
1035
|
-
logFile:
|
|
1095
|
+
logFile: O.path
|
|
1036
1096
|
});
|
|
1037
|
-
let e =
|
|
1097
|
+
let e = c(t);
|
|
1038
1098
|
if (e) {
|
|
1039
|
-
let t = await
|
|
1040
|
-
t.status === "launched" ?
|
|
1099
|
+
let t = await g({ dashboardAppPath: e });
|
|
1100
|
+
t.status === "launched" ? Y.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Y.debug(`dashboard already running on :${t.port}`, { port: t.port });
|
|
1041
1101
|
}
|
|
1042
1102
|
setInterval(() => {
|
|
1043
|
-
|
|
1044
|
-
id:
|
|
1045
|
-
name:
|
|
1103
|
+
_e({
|
|
1104
|
+
id: E,
|
|
1105
|
+
name: T,
|
|
1046
1106
|
kind: "web",
|
|
1047
1107
|
url: `http://localhost:${m}`,
|
|
1048
1108
|
pid: process.pid,
|
|
1049
1109
|
status: "live",
|
|
1050
|
-
logFile:
|
|
1110
|
+
logFile: O.path
|
|
1051
1111
|
}).catch(() => {});
|
|
1052
1112
|
}, 1e4).unref();
|
|
1053
1113
|
} catch (e) {
|
|
1054
|
-
|
|
1114
|
+
Y.warn("runtime-registry write failed", {}, e);
|
|
1055
1115
|
}
|
|
1056
|
-
|
|
1057
|
-
app:
|
|
1116
|
+
De({
|
|
1117
|
+
app: s.name ?? "unnamed",
|
|
1058
1118
|
kind: "web",
|
|
1059
1119
|
url: `http://localhost:${m}`,
|
|
1060
1120
|
bootMs: r.total()
|
|
1061
1121
|
});
|
|
1062
|
-
let
|
|
1063
|
-
|
|
1122
|
+
let et = r.phaseBreakdown();
|
|
1123
|
+
Y.info(`start: ready in ${r.total()}ms`, {
|
|
1064
1124
|
bootMs: r.total(),
|
|
1065
|
-
...
|
|
1125
|
+
...et ? { phases: et } : {}
|
|
1066
1126
|
});
|
|
1067
|
-
let
|
|
1068
|
-
if (!
|
|
1069
|
-
if (
|
|
1070
|
-
await
|
|
1127
|
+
let tt = !1, nt = (e) => async () => {
|
|
1128
|
+
if (!tt) {
|
|
1129
|
+
if (tt = !0, Y.info(`received ${e}, shutting down`, { signal: e }), $e.close(), await Ge.stop(), U) try {
|
|
1130
|
+
await U.end();
|
|
1071
1131
|
} catch {}
|
|
1072
|
-
await
|
|
1132
|
+
await X.close(), await ye(E), await O.dispose(), process.exit(0);
|
|
1073
1133
|
}
|
|
1074
1134
|
};
|
|
1075
|
-
process.on("SIGINT",
|
|
1076
|
-
let
|
|
1077
|
-
if (
|
|
1135
|
+
process.on("SIGINT", nt("SIGINT")), process.on("SIGTERM", nt("SIGTERM"));
|
|
1136
|
+
let rt = process.ppid;
|
|
1137
|
+
if (rt > 1) {
|
|
1078
1138
|
let e = setInterval(() => {
|
|
1079
|
-
(process.ppid !==
|
|
1139
|
+
(process.ppid !== rt || process.ppid === 1) && (clearInterval(e), nt("SIGTERM")());
|
|
1080
1140
|
}, 2e3);
|
|
1081
1141
|
e.unref();
|
|
1082
1142
|
}
|
|
1083
1143
|
return new Promise(() => {});
|
|
1084
|
-
},
|
|
1144
|
+
}, We = async (e) => {
|
|
1085
1145
|
t("start");
|
|
1086
|
-
let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await
|
|
1087
|
-
return r.ran ? r.exitCode : (
|
|
1146
|
+
let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await Ue(Ee(n));
|
|
1147
|
+
return r.ran ? r.exitCode : (Y.error("no web app found at this path"), 1);
|
|
1088
1148
|
};
|
|
1089
1149
|
//#endregion
|
|
1090
|
-
export {
|
|
1150
|
+
export { Ue as n, We as t };
|