@voltro/cli 0.50.0 → 0.51.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 +160 -0
- package/dist/{apiBuild-CFYXo06U.js → apiBuild-CPDHXF72.js} +2 -2
- package/dist/apiBuild-GDKuGOMV.js +2 -0
- package/dist/appGraph-CFmFKHb2.js +2 -0
- package/dist/appGraph-yRuKjOba.js +111 -0
- package/dist/bin.js +1 -1
- package/dist/{build-CnSH-zru.js → build-DETLZAFt.js} +271 -240
- package/dist/{checkCommand-OL41BMIb.js → checkCommand-CWcnDArJ.js} +1 -1
- package/dist/{checkCommand-Do3SQbLx.js → checkCommand-DNuPiWMc.js} +56 -46
- package/dist/{codegenCommand-BJzaRz6q.js → codegenCommand-BNBHcNNj.js} +2 -2
- package/dist/{codemodRunner-De3k0pRd.js → codemodRunner-BDVixlSw.js} +278 -136
- package/dist/{commands-By23Ljny.js → commands-B1OiS9bX.js} +24 -23
- package/dist/{dashboardCommand-DN1rAABE.js → dashboardCommand-C-vvPY1B.js} +5 -5
- package/dist/{dataCommand-B93TUBIx.js → dataCommand-C1GxXW5q.js} +458 -384
- package/dist/dbCommand-C27HIsGE.js +2 -0
- package/dist/{dbCommand-Bf7Cy0mn.js → dbCommand-If4Y1xQ-.js} +1 -1
- package/dist/{dev-BWwE0QjK.js → dev-CK522MV5.js} +1 -1
- package/dist/{dev-1yu42ubu.js → dev-kdAg9Q7l.js} +1246 -1246
- package/dist/doctorCommand-BK4l18eG.js +2 -0
- package/dist/{doctorCommand-y-EbP8st.js → doctorCommand-nKmeW78u.js} +42 -26
- package/dist/{doctorSourceRelations-Dd48LPvO.js → doctorSourceRelations-c5mlN5HI.js} +66 -34
- package/dist/{dormancyCommand-Dc7KRNCG.js → dormancyCommand-CY3wa_SW.js} +1 -1
- package/dist/{embeddingsCommand-kPs132bB.js → embeddingsCommand-BDLIgje_.js} +1 -1
- package/dist/{envCommand-E12zSt51.js → envCommand-C6V_xVlT.js} +13 -13
- package/dist/{evolveCommand-B3nagPVc.js → evolveCommand-D3c4DSfN.js} +2 -2
- package/dist/{generateCommand-CcyvH2ve.js → generateCommand-DTNPGjxo.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/{infoCommand-Cq0Yz98u.js → infoCommand-BnRFEF1o.js} +1 -1
- package/dist/{inspect-B7U7Cl_Z.js → inspect-CtL_xTbu.js} +1 -0
- package/dist/inspect-CuGDYES0.js +2 -0
- package/dist/manifestBuild-CPjhvM62.js +2 -0
- package/dist/{manifestBuild-BK42hu0k.js → manifestBuild-CuU1VrSm.js} +2 -2
- package/dist/{migrate-D3MK9BpK.js → migrate-DehuBakM.js} +1 -1
- package/dist/{runtimeTrace-BpLUcrfy.js → runtimeTrace-ZsBU7Tkx.js} +1 -1
- package/dist/{sdkgen-dl4-WKF6.js → sdkgen-O4XqWOjM.js} +1 -1
- package/dist/serveCommand-BRnPCxVd.js +2 -0
- package/dist/{serveCommand-8CTzQCY0.js → serveCommand-DdiYNBBu.js} +4 -4
- package/dist/serveEntry.js +1 -1
- package/dist/{start-7HcSIKEp.js → start-BLNmWkLa.js} +331 -327
- package/dist/{start-DvlYDyAr.js → start-Dzicuyw8.js} +1 -1
- package/dist/startEntry.js +1 -1
- package/dist/{updateCommand-i8JbrLAA.js → updateCommand-Bs322Q78.js} +1 -1
- package/dist/updateCommand-eXB35SEv.js +2 -0
- package/dist/{webDev-B4IEMB0n.js → webDev-B-ubQEMX.js} +283 -224
- package/dist/webDev-DposiF3j.js +2 -0
- package/dist/{webhooksCommand-B0bdyuQ4.js → webhooksCommand-FLYY9IXh.js} +1 -1
- package/package.json +41 -17
- package/templates/AGENTS.core.md +15 -5
- package/templates/AGENTS.md +16 -6
- package/templates/agent-docs/_index.md +1 -1
- package/templates/agent-docs/cli.md +92 -3
- package/templates/agent-docs/data.md +36 -0
- package/templates/agent-docs/internationalization.md +131 -13
- package/templates/agent-docs/whats-new.md +73 -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-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/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/apiBuild-BWo8KI6n.js +0 -2
- package/dist/appGraph-KGDPTuTy.js +0 -110
- package/dist/appGraph-zuMGKVYX.js +0 -2
- package/dist/dbCommand-Bnl7MSGC.js +0 -2
- package/dist/doctorCommand-BmovAwb7.js +0 -2
- package/dist/inspect-DUze25t0.js +0 -2
- package/dist/manifestBuild-j0n109tt.js +0 -2
- package/dist/serveCommand-C_WI4TTG.js +0 -2
- package/dist/updateCommand-D91-TZ7E.js +0 -2
- package/dist/webDev-B79ji8M5.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
|
|
3
|
+
import { A as r, B as i, C as a, D as o, E as s, F as c, G as l, H as u, I as d, J as f, L as ee, M as p, N as m, O as te, P as ne, Q as re, R as h, S as g, T as ie, U as _, X as v, Y as y, Z as b, a as x, b as S, d as C, f as w, gt as ae, i as oe, j as T, k as E, n as D, nt as O, rt as k, s as se, x as ce, y as A, yt as j, z as le } from "./webDev-B-ubQEMX.js";
|
|
4
|
+
import { o as M, t as N } from "./connectionConfig-Bk9IC7D0.js";
|
|
5
|
+
import { A as P, D as F, a as I, h as ue, j as de, k as fe } from "./inspect-CtL_xTbu.js";
|
|
6
|
+
import { a as pe, c as me, d as he, f as L, l as ge, p as _e, u as ve } from "./renderModeScan-D7J1B7Kw.js";
|
|
7
|
+
import { i as ye, n as be, r as xe, t as Se } from "./runtimeRegistry-DMeKfTHP.js";
|
|
8
|
+
import { n as Ce } from "./logFileSink-B4uP8pvf.js";
|
|
9
|
+
import { t as we } from "./inspectMetrics-CfdKLh6t.js";
|
|
10
|
+
import { t as Te } from "./bootTiming-BdyP9nYw.js";
|
|
11
|
+
import { dirname as Ee, extname as De, join as R, resolve as z } from "node:path";
|
|
12
12
|
import { promises as B } from "node:fs";
|
|
13
13
|
import { fileURLToPath as V, pathToFileURL as H } from "node:url";
|
|
14
|
-
import { createLogger as U, printReadyBlock as
|
|
15
|
-
import { snapshotMetricsSync as
|
|
16
|
-
import { createServer as
|
|
14
|
+
import { createLogger as U, printReadyBlock as Oe } from "@voltro/logger";
|
|
15
|
+
import { snapshotMetricsSync as ke } from "@voltro/runtime";
|
|
16
|
+
import { createServer as Ae } from "node:http";
|
|
17
17
|
//#region src/isrCdcInvalidator.ts
|
|
18
|
-
var W = U({ scope: "voltro:start:cdc" }),
|
|
18
|
+
var W = U({ scope: "voltro:start:cdc" }), je = (e) => (t) => {
|
|
19
19
|
let n = 0;
|
|
20
20
|
for (let [r, i] of e.tableSubscriptionsByPattern) {
|
|
21
21
|
if (!i.includes(t)) continue;
|
|
@@ -26,8 +26,8 @@ var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
|
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
return n;
|
|
29
|
-
}, G = () =>
|
|
30
|
-
let t = e.channel ?? "framework_changes", n =
|
|
29
|
+
}, G = () => N() ? M() : null, Me = (e) => {
|
|
30
|
+
let t = e.channel ?? "framework_changes", n = je(e), r = null, i = null;
|
|
31
31
|
return {
|
|
32
32
|
start: async () => {
|
|
33
33
|
if (e.tableSubscriptionsByPattern.size === 0) {
|
|
@@ -72,7 +72,7 @@ var W = U({ scope: "voltro:start:cdc" }), Ae = (e) => (t) => {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
|
-
}, K = U({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache",
|
|
75
|
+
}, K = U({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", Ne = (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
|
-
`,
|
|
86
|
+
`, Pe = (e) => {
|
|
87
87
|
let t = e.tableName ?? q, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
|
|
88
|
-
i || (i = !0, await n.query(
|
|
88
|
+
i || (i = !0, await n.query(Ne(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, {
|
|
@@ -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
|
+
}, J = U({ scope: "voltro:start" }), Fe = await (async () => {
|
|
149
149
|
try {
|
|
150
|
-
let e =
|
|
150
|
+
let e = R(Ee(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
|
+
})(), Y = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", Ie = (e) => e instanceof Error && e._voltroControl === "not-found", X = {
|
|
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
|
+
}, Le = (e) => X[De(e).toLowerCase()] ?? "application/octet-stream", Re = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Z = async (e) => {
|
|
174
174
|
try {
|
|
175
175
|
return await B.stat(e), !0;
|
|
176
176
|
} catch {
|
|
177
177
|
return !1;
|
|
178
178
|
}
|
|
179
|
-
},
|
|
179
|
+
}, Q = (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
|
+
}, ze = (e) => e.map((e) => {
|
|
189
|
+
let { regex: t, paramNames: n, priority: r } = Q(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), Be = (e, t) => {
|
|
199
199
|
for (let n of t) {
|
|
200
200
|
let t = n.regex.exec(e);
|
|
201
201
|
if (!t) continue;
|
|
@@ -207,209 +207,213 @@ 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:
|
|
210
|
+
}, Ve = async (e) => {
|
|
211
|
+
let { provider: t, route: n, params: i, pathname: a, dirs: l, shellTemplate: u, requestHeaders: f, requestUrl: te = "", apiOrigin: ne, apiName: re } = e, { search: _ } = le(te), v = await s(o(e.middlewares ?? [], {
|
|
212
212
|
route: n.pattern,
|
|
213
|
-
pathname:
|
|
213
|
+
pathname: a
|
|
214
214
|
}), {
|
|
215
|
-
pathname:
|
|
216
|
-
search:
|
|
217
|
-
headers:
|
|
218
|
-
cookies:
|
|
215
|
+
pathname: a,
|
|
216
|
+
search: _,
|
|
217
|
+
headers: f,
|
|
218
|
+
cookies: ie(f.cookie),
|
|
219
219
|
route: n.pattern
|
|
220
|
-
}, e.onCookieWarning),
|
|
221
|
-
apiName:
|
|
222
|
-
headers:
|
|
223
|
-
}),
|
|
224
|
-
if (
|
|
225
|
-
let
|
|
220
|
+
}, e.onCookieWarning), y = v.headers, b = oe(ne, y.cookie, {
|
|
221
|
+
apiName: re,
|
|
222
|
+
headers: y
|
|
223
|
+
}), S = await t.getPage(n.pattern, n.file), C = me(S, n.file), w = C === "spa" && se(l, n.dirChain).some((e) => e.hasLayout);
|
|
224
|
+
if (C !== "ssr" && C !== "isr" && !w) return null;
|
|
225
|
+
let ae = se(l, n.dirChain), D = {}, O = null, k, ce = new AbortController();
|
|
226
226
|
try {
|
|
227
|
-
(await t.getHelpers()).beginStoreSeeds(), {chain:
|
|
228
|
-
entries:
|
|
227
|
+
(await t.getHelpers()).beginStoreSeeds(), {chain: k, segmentLoaderData: D} = await x({
|
|
228
|
+
entries: ae,
|
|
229
229
|
loadLayout: (e) => t.getLayout(e.dir),
|
|
230
230
|
loadError: (e) => t.getError(e.dir),
|
|
231
231
|
loadPending: (e) => t.getPending(e.dir),
|
|
232
232
|
ctx: {
|
|
233
233
|
params: i,
|
|
234
|
-
pathname:
|
|
235
|
-
search:
|
|
236
|
-
signal:
|
|
237
|
-
headers:
|
|
238
|
-
query:
|
|
234
|
+
pathname: a,
|
|
235
|
+
search: _,
|
|
236
|
+
signal: ce.signal,
|
|
237
|
+
headers: y,
|
|
238
|
+
query: b,
|
|
239
239
|
isServer: !0
|
|
240
240
|
}
|
|
241
|
-
}), typeof
|
|
241
|
+
}), typeof S.loader == "function" && !w && (O = await S.loader({
|
|
242
242
|
params: i,
|
|
243
|
-
pathname:
|
|
244
|
-
search:
|
|
245
|
-
signal:
|
|
246
|
-
headers:
|
|
247
|
-
query:
|
|
243
|
+
pathname: a,
|
|
244
|
+
search: _,
|
|
245
|
+
signal: ce.signal,
|
|
246
|
+
headers: y,
|
|
247
|
+
query: b,
|
|
248
248
|
isServer: !0
|
|
249
249
|
}));
|
|
250
250
|
} catch (e) {
|
|
251
|
-
if (
|
|
251
|
+
if (Y(e)) return {
|
|
252
252
|
control: "redirect",
|
|
253
253
|
status: e.status,
|
|
254
254
|
location: e.location,
|
|
255
|
-
setCookies:
|
|
255
|
+
setCookies: v.setCookies
|
|
256
256
|
};
|
|
257
|
-
if (
|
|
257
|
+
if (Ie(e)) return {
|
|
258
258
|
control: "not-found",
|
|
259
|
-
setCookies:
|
|
259
|
+
setCookies: v.setCookies
|
|
260
260
|
};
|
|
261
261
|
throw e;
|
|
262
262
|
}
|
|
263
|
-
let
|
|
264
|
-
|
|
265
|
-
pageMod:
|
|
263
|
+
let A = await t.getHelpers();
|
|
264
|
+
w || await E({
|
|
265
|
+
pageMod: S,
|
|
266
266
|
params: i,
|
|
267
|
-
query:
|
|
268
|
-
apiName:
|
|
269
|
-
seed:
|
|
270
|
-
seedFailure:
|
|
271
|
-
onError: ({ tag: e, apiName: t }, n) =>
|
|
267
|
+
query: b,
|
|
268
|
+
apiName: re,
|
|
269
|
+
seed: A.seedPreloadedSubscription,
|
|
270
|
+
seedFailure: A.seedPreloadedSubscriptionFailure,
|
|
271
|
+
onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
|
|
272
272
|
tag: e,
|
|
273
273
|
apiName: t,
|
|
274
|
-
pathname:
|
|
274
|
+
pathname: a
|
|
275
275
|
}, n)
|
|
276
276
|
});
|
|
277
|
-
let
|
|
277
|
+
let j = {
|
|
278
278
|
pattern: n.pattern,
|
|
279
|
-
Component:
|
|
280
|
-
meta:
|
|
281
|
-
loader:
|
|
282
|
-
ErrorBoundary:
|
|
283
|
-
Pending:
|
|
284
|
-
renderMode:
|
|
285
|
-
chain:
|
|
286
|
-
},
|
|
287
|
-
cookies:
|
|
288
|
-
headers:
|
|
289
|
-
url:
|
|
290
|
-
},
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
279
|
+
Component: S.default,
|
|
280
|
+
meta: S.meta,
|
|
281
|
+
loader: S.loader,
|
|
282
|
+
ErrorBoundary: S.ErrorBoundary,
|
|
283
|
+
Pending: S.Pending,
|
|
284
|
+
renderMode: C,
|
|
285
|
+
chain: k
|
|
286
|
+
}, M = {
|
|
287
|
+
cookies: v.cookies,
|
|
288
|
+
headers: y,
|
|
289
|
+
url: te
|
|
290
|
+
}, N = A.i18n?.resolve(y.cookie, y["accept-language"]), P = {
|
|
291
|
+
lang: N?.locale ?? M.cookies["voltro:locale"] ?? "en",
|
|
292
|
+
...N?.timeZone === void 0 ? {} : { timeZone: N.timeZone },
|
|
293
|
+
renderedAt: Date.now()
|
|
294
|
+
}, F = S.interactive ?? "full";
|
|
295
|
+
if (w) {
|
|
296
|
+
let e = d({
|
|
297
|
+
helpers: A,
|
|
294
298
|
page: n.pattern,
|
|
295
299
|
interactive: F,
|
|
296
300
|
delivery: "stream",
|
|
297
301
|
renderInput: {
|
|
298
|
-
descriptor:
|
|
302
|
+
descriptor: j,
|
|
299
303
|
params: i,
|
|
300
|
-
pathname:
|
|
301
|
-
search:
|
|
302
|
-
segmentLoaderData:
|
|
303
|
-
requestContext:
|
|
304
|
-
...
|
|
305
|
-
outerWrap:
|
|
306
|
-
locale:
|
|
304
|
+
pathname: a,
|
|
305
|
+
search: _,
|
|
306
|
+
segmentLoaderData: D,
|
|
307
|
+
requestContext: M,
|
|
308
|
+
...N ? {
|
|
309
|
+
outerWrap: N.outerWrap,
|
|
310
|
+
locale: N.locale
|
|
307
311
|
} : {}
|
|
308
312
|
}
|
|
309
|
-
}), t =
|
|
310
|
-
helpers:
|
|
313
|
+
}), t = (t) => h({
|
|
314
|
+
helpers: A,
|
|
311
315
|
prepared: e,
|
|
312
316
|
meta: t,
|
|
313
317
|
interactive: F
|
|
314
318
|
});
|
|
315
319
|
if (e.hasDeferred) {
|
|
316
|
-
let n =
|
|
320
|
+
let n = p({ shell: u });
|
|
317
321
|
return {
|
|
318
322
|
renderMode: "spa",
|
|
319
|
-
setCookies:
|
|
320
|
-
stream: (r) =>
|
|
323
|
+
setCookies: v.setCookies,
|
|
324
|
+
stream: (r) => m({
|
|
321
325
|
res: r,
|
|
322
326
|
shell: n,
|
|
323
|
-
|
|
327
|
+
documentAttrs: P,
|
|
324
328
|
headers: {
|
|
325
329
|
"content-type": "text/html; charset=utf-8",
|
|
326
330
|
"x-voltro-rendered-by": "spa",
|
|
327
|
-
...
|
|
331
|
+
...g(v.setCookies)
|
|
328
332
|
},
|
|
329
|
-
headInjection:
|
|
330
|
-
render: (t) =>
|
|
333
|
+
headInjection: t,
|
|
334
|
+
render: (t) => A.renderPageToStream({
|
|
331
335
|
...e.renderInput,
|
|
332
336
|
...t
|
|
333
337
|
}),
|
|
334
338
|
onShellError: (e) => {
|
|
335
|
-
|
|
339
|
+
J.error("spa layout shell render failed", { pathname: a }, e), r.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), r.end("server error");
|
|
336
340
|
}
|
|
337
341
|
})
|
|
338
342
|
};
|
|
339
343
|
}
|
|
340
|
-
let o =
|
|
341
|
-
helpers:
|
|
344
|
+
let o = ee({
|
|
345
|
+
helpers: A,
|
|
342
346
|
prepared: e
|
|
343
347
|
});
|
|
344
348
|
return {
|
|
345
|
-
html: r(
|
|
349
|
+
html: r(T(u.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), t(o.meta)), P),
|
|
346
350
|
renderMode: "spa",
|
|
347
351
|
revalidateMs: null,
|
|
348
|
-
setCookies:
|
|
352
|
+
setCookies: v.setCookies
|
|
349
353
|
};
|
|
350
354
|
}
|
|
351
|
-
let I =
|
|
352
|
-
helpers:
|
|
355
|
+
let I = c({
|
|
356
|
+
helpers: A,
|
|
353
357
|
page: n.pattern,
|
|
354
|
-
pathname:
|
|
355
|
-
renderMode:
|
|
358
|
+
pathname: a,
|
|
359
|
+
renderMode: C,
|
|
356
360
|
interactive: F,
|
|
357
|
-
loaderData:
|
|
358
|
-
segmentLoaderData:
|
|
359
|
-
pageLoaderRan: typeof
|
|
360
|
-
}),
|
|
361
|
-
descriptor:
|
|
361
|
+
loaderData: O,
|
|
362
|
+
segmentLoaderData: D,
|
|
363
|
+
pageLoaderRan: typeof S.loader == "function"
|
|
364
|
+
}), ue = {
|
|
365
|
+
descriptor: j,
|
|
362
366
|
params: i,
|
|
363
|
-
pathname:
|
|
364
|
-
search:
|
|
367
|
+
pathname: a,
|
|
368
|
+
search: _,
|
|
365
369
|
loaderData: I.loaderData,
|
|
366
370
|
segmentLoaderData: I.segmentLoaderData,
|
|
367
|
-
requestContext:
|
|
368
|
-
...
|
|
369
|
-
outerWrap:
|
|
370
|
-
locale:
|
|
371
|
+
requestContext: M,
|
|
372
|
+
...N ? {
|
|
373
|
+
outerWrap: N.outerWrap,
|
|
374
|
+
locale: N.locale
|
|
371
375
|
} : {}
|
|
372
|
-
},
|
|
373
|
-
|
|
376
|
+
}, de = (e) => [
|
|
377
|
+
A.renderMetaToHtml(e),
|
|
374
378
|
`<meta name="voltro-interactive" content="${F}" />`,
|
|
375
|
-
...I.hasDeferred ? [
|
|
376
|
-
|
|
379
|
+
...I.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
|
|
380
|
+
A.renderRouterStateScript(I.stateInput)
|
|
377
381
|
].filter((e) => e.length > 0).join("\n ");
|
|
378
|
-
if (
|
|
379
|
-
let e =
|
|
382
|
+
if (C === "ssr" && F === "full" && e.buffered !== !0) {
|
|
383
|
+
let e = p({ shell: u });
|
|
380
384
|
return {
|
|
381
385
|
renderMode: "ssr",
|
|
382
|
-
setCookies:
|
|
383
|
-
stream: (
|
|
384
|
-
res:
|
|
385
|
-
shell:
|
|
386
|
-
|
|
386
|
+
setCookies: v.setCookies,
|
|
387
|
+
stream: (t) => m({
|
|
388
|
+
res: t,
|
|
389
|
+
shell: e,
|
|
390
|
+
documentAttrs: P,
|
|
387
391
|
headers: {
|
|
388
392
|
"content-type": "text/html; charset=utf-8",
|
|
389
393
|
"x-voltro-rendered-by": "ssr",
|
|
390
|
-
...
|
|
394
|
+
...g(v.setCookies)
|
|
391
395
|
},
|
|
392
|
-
headInjection:
|
|
393
|
-
render: (e) =>
|
|
394
|
-
...
|
|
396
|
+
headInjection: de,
|
|
397
|
+
render: (e) => A.renderPageToStream({
|
|
398
|
+
...ue,
|
|
395
399
|
...e
|
|
396
400
|
}),
|
|
397
401
|
onShellError: (e) => {
|
|
398
|
-
|
|
402
|
+
J.error("ssr shell render failed", { pathname: a }, e), t.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), t.end("server error");
|
|
399
403
|
}
|
|
400
404
|
})
|
|
401
405
|
};
|
|
402
406
|
}
|
|
403
|
-
let { html:
|
|
404
|
-
F === "none" && (
|
|
405
|
-
let
|
|
407
|
+
let { html: fe, meta: pe } = A.renderPageToHtml(ue), he = de(pe), L = r(T(u.replace("<div id=\"root\"></div>", `<div id="root">${fe}</div>`), he), P);
|
|
408
|
+
F === "none" && (L = Re(L));
|
|
409
|
+
let ge = C === "isr" ? _e(S.revalidate) : null;
|
|
406
410
|
return {
|
|
407
|
-
html:
|
|
408
|
-
renderMode:
|
|
409
|
-
revalidateMs:
|
|
410
|
-
setCookies:
|
|
411
|
+
html: L,
|
|
412
|
+
renderMode: C,
|
|
413
|
+
revalidateMs: ge,
|
|
414
|
+
setCookies: v.setCookies
|
|
411
415
|
};
|
|
412
|
-
}, $ = (e) => e === "" ? "/" : e,
|
|
416
|
+
}, $ = (e) => e === "" ? "/" : e, He = async (e) => {
|
|
413
417
|
let t = await import(H(e).href);
|
|
414
418
|
return {
|
|
415
419
|
kind: "bundle",
|
|
@@ -439,7 +443,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
439
443
|
},
|
|
440
444
|
async close() {}
|
|
441
445
|
};
|
|
442
|
-
},
|
|
446
|
+
}, Ue = async (e, t) => {
|
|
443
447
|
let n = await j("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
|
|
444
448
|
root: t,
|
|
445
449
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
@@ -457,10 +461,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
457
461
|
},
|
|
458
462
|
appType: "custom",
|
|
459
463
|
logLevel: "warn"
|
|
460
|
-
}), o =
|
|
461
|
-
limit:
|
|
462
|
-
onColdStart: (e) =>
|
|
463
|
-
onColdEnd: (e, { durationMs: t, failed: n }) =>
|
|
464
|
+
}), o = R(e, "src", "pages"), s = (e) => e === "" ? o : R(o, e), c = O({
|
|
465
|
+
limit: k(),
|
|
466
|
+
onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
|
|
467
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
464
468
|
id: e,
|
|
465
469
|
ms: t,
|
|
466
470
|
...n ? { failed: !0 } : {}
|
|
@@ -469,16 +473,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
469
473
|
return {
|
|
470
474
|
kind: "middleware",
|
|
471
475
|
async getPage(e, t) {
|
|
472
|
-
return l(
|
|
476
|
+
return l(R(o, t));
|
|
473
477
|
},
|
|
474
478
|
async getLayout(e) {
|
|
475
|
-
return l(
|
|
479
|
+
return l(R(s(e), "layout.tsx"));
|
|
476
480
|
},
|
|
477
481
|
async getError(e) {
|
|
478
|
-
return l(
|
|
482
|
+
return l(R(s(e), "error.tsx"));
|
|
479
483
|
},
|
|
480
484
|
async getPending(e) {
|
|
481
|
-
return l(
|
|
485
|
+
return l(R(s(e), "loading.tsx"));
|
|
482
486
|
},
|
|
483
487
|
async getHelpers() {
|
|
484
488
|
return await l("@voltro/web/ssr");
|
|
@@ -487,106 +491,106 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
487
491
|
await a.close();
|
|
488
492
|
}
|
|
489
493
|
};
|
|
490
|
-
},
|
|
491
|
-
let r =
|
|
492
|
-
if (!
|
|
494
|
+
}, We = async (t) => {
|
|
495
|
+
let r = Te(), c = await C(t);
|
|
496
|
+
if (!c) return {
|
|
493
497
|
ran: !1,
|
|
494
498
|
exitCode: 0
|
|
495
499
|
};
|
|
496
|
-
if (
|
|
500
|
+
if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
|
|
497
501
|
ran: !0,
|
|
498
502
|
exitCode: 1
|
|
499
503
|
};
|
|
500
|
-
let { resolved:
|
|
501
|
-
rawEnv:
|
|
504
|
+
let { resolved: d } = await ae({
|
|
505
|
+
rawEnv: c.env,
|
|
502
506
|
appType: "web",
|
|
503
507
|
root: t,
|
|
504
|
-
log:
|
|
508
|
+
log: J,
|
|
505
509
|
generateTypes: !1
|
|
506
|
-
}),
|
|
510
|
+
}), ee = d.publicValues;
|
|
507
511
|
r.mark("config");
|
|
508
|
-
let
|
|
509
|
-
|
|
510
|
-
let
|
|
512
|
+
let p = b();
|
|
513
|
+
f(p), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
|
|
514
|
+
let m = n({
|
|
511
515
|
kind: "web",
|
|
512
|
-
configPort:
|
|
516
|
+
configPort: c.port,
|
|
513
517
|
env: process.env,
|
|
514
|
-
dashboardPin: process.env[
|
|
518
|
+
dashboardPin: process.env[i] === "1"
|
|
515
519
|
});
|
|
516
|
-
for (let e of
|
|
517
|
-
let
|
|
518
|
-
if (!await
|
|
520
|
+
for (let e of m.warnings) J.warn(e);
|
|
521
|
+
let h = m.port, g = R(t, ".framework"), x = R(g, "dist"), oe = R(x, "index.html");
|
|
522
|
+
if (!await Z(oe)) return J.error("no built dist found — run `voltro build` first", { distDir: x }), {
|
|
519
523
|
ran: !0,
|
|
520
524
|
exitCode: 1
|
|
521
525
|
};
|
|
522
|
-
let T =
|
|
523
|
-
await
|
|
526
|
+
let T = c.name ?? "unnamed", E = Se("web", T, h), O = Ce(T);
|
|
527
|
+
await ye({
|
|
524
528
|
id: E,
|
|
525
529
|
name: T,
|
|
526
530
|
kind: "web",
|
|
527
|
-
url: `http://localhost:${
|
|
531
|
+
url: `http://localhost:${h}`,
|
|
528
532
|
pid: process.pid,
|
|
529
533
|
status: "booting",
|
|
530
534
|
logFile: O.path
|
|
531
535
|
}).catch(() => {});
|
|
532
|
-
let
|
|
533
|
-
|
|
536
|
+
let k = R(x, "_voltro", "shell.html"), j = await Z(k) ? await B.readFile(k, "utf8") : await B.readFile(oe, "utf8"), le = await w(t, c), me = D(le[0]), _e = le[0]?.name, Ee = /* @__PURE__ */ new Set(), De = (e) => {
|
|
537
|
+
Ee.has(e.name) || (Ee.add(e.name), J.warn(`middleware.ts wrote the cookie "${e.name}" with the HttpOnly default — a browser SDK cannot read it`, {
|
|
534
538
|
cookie: e.name,
|
|
535
539
|
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
540
|
}));
|
|
537
|
-
},
|
|
538
|
-
|
|
539
|
-
let
|
|
540
|
-
if (
|
|
541
|
-
else if (
|
|
541
|
+
}, z = await a(t);
|
|
542
|
+
z.length > 0 && J.info(`middleware.ts loaded — ${z.length} middleware(s): ` + z.map((e) => e.exportName).join(", "));
|
|
543
|
+
let V, H = null, U = process.env.SSR_CACHE === "postgres";
|
|
544
|
+
if (U && N()) H = new (await (import("pg"))).default.Client(M()), await H.connect(), V = Pe({ client: H }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
|
|
545
|
+
else if (U) {
|
|
542
546
|
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).";
|
|
543
|
-
if (e()) throw
|
|
544
|
-
|
|
545
|
-
} else
|
|
546
|
-
await
|
|
547
|
-
let
|
|
548
|
-
|
|
549
|
-
let
|
|
550
|
-
if (!
|
|
551
|
-
let
|
|
552
|
-
|
|
553
|
-
kind:
|
|
554
|
-
...
|
|
547
|
+
if (e()) throw J.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");
|
|
548
|
+
V = L(), J.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
|
|
549
|
+
} else V = L(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
|
|
550
|
+
await S(t, c, le, ee);
|
|
551
|
+
let W = R(t, "src", "pages"), { pages: je, dirs: G } = await A(W), K = ze(je);
|
|
552
|
+
ce(z, K.map((e) => e.pattern)), r.mark("scan");
|
|
553
|
+
let q = R(x, "server", "ssrEntry.js"), Ne = await Z(q);
|
|
554
|
+
if (!Ne && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${q} 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 ${q}`);
|
|
555
|
+
let Y = Ne ? await He(q) : await Ue(t, g);
|
|
556
|
+
J.info(`ssr loader: ${Y.kind}`, {
|
|
557
|
+
kind: Y.kind,
|
|
558
|
+
...Y.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
|
|
555
559
|
}), r.mark("provider");
|
|
556
|
-
let
|
|
557
|
-
for (let e of
|
|
558
|
-
let t =
|
|
560
|
+
let Ie = Y.getPageMeta?.(), X = /* @__PURE__ */ new Map(), Re = 0;
|
|
561
|
+
for (let e of je) {
|
|
562
|
+
let t = Ie?.[e.pattern];
|
|
559
563
|
if (t) {
|
|
560
|
-
|
|
564
|
+
X.set(e.pattern, t);
|
|
561
565
|
continue;
|
|
562
566
|
}
|
|
563
567
|
try {
|
|
564
|
-
let t = await
|
|
565
|
-
|
|
568
|
+
let t = await Y.getPage(e.pattern, e.file);
|
|
569
|
+
X.set(e.pattern, pe(t, e.file)), Re++;
|
|
566
570
|
} catch (t) {
|
|
567
|
-
|
|
571
|
+
J.warn("failed to load page metadata", { pattern: e.pattern }, t);
|
|
568
572
|
}
|
|
569
573
|
}
|
|
570
|
-
|
|
571
|
-
count:
|
|
572
|
-
fromManifest:
|
|
573
|
-
fromModules:
|
|
574
|
+
J.info(`registered ${X.size} route(s)`, {
|
|
575
|
+
count: X.size,
|
|
576
|
+
fromManifest: X.size - Re,
|
|
577
|
+
fromModules: Re
|
|
574
578
|
}), r.mark("routes");
|
|
575
|
-
let
|
|
576
|
-
for (let e of
|
|
577
|
-
|
|
578
|
-
let
|
|
579
|
-
for (let [e, t] of
|
|
579
|
+
let Q = /* @__PURE__ */ new Set();
|
|
580
|
+
for (let e of K) X.get(e.pattern)?.renderMode === "spa" && se(G, e.dirChain).some((e) => e.hasLayout) && Q.add(e.pattern);
|
|
581
|
+
Q.size > 0 && J.info(`${Q.size} spa route(s) render an SSR layout shell`, { patterns: [...Q] });
|
|
582
|
+
let $ = /* @__PURE__ */ new Map();
|
|
583
|
+
for (let [e, t] of X) t.cacheInvalidatesOn.length > 0 && $.set(e, t.cacheInvalidatesOn);
|
|
580
584
|
let We = /* @__PURE__ */ new Map();
|
|
581
|
-
for (let e of
|
|
582
|
-
let Ge =
|
|
583
|
-
cache:
|
|
584
|
-
tableSubscriptionsByPattern:
|
|
585
|
+
for (let e of K) We.set(e.pattern, e.regex);
|
|
586
|
+
let Ge = Me({
|
|
587
|
+
cache: V,
|
|
588
|
+
tableSubscriptionsByPattern: $,
|
|
585
589
|
regexByPattern: We
|
|
586
590
|
});
|
|
587
591
|
await Ge.start(), r.mark("cdc");
|
|
588
|
-
let Ke =
|
|
589
|
-
let t =
|
|
592
|
+
let Ke = we(), qe = je.map((e) => {
|
|
593
|
+
let t = X.get(e.pattern);
|
|
590
594
|
return {
|
|
591
595
|
pattern: e.pattern,
|
|
592
596
|
file: e.file,
|
|
@@ -601,20 +605,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
601
605
|
hasMeta: t?.hasMeta ?? !1,
|
|
602
606
|
hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
|
|
603
607
|
};
|
|
604
|
-
}), Je =
|
|
608
|
+
}), Je = G.map((e) => ({
|
|
605
609
|
dir: e.dir,
|
|
606
610
|
hasLayout: e.hasLayout,
|
|
607
611
|
hasError: e.hasError,
|
|
608
612
|
hasPending: e.hasPending,
|
|
609
613
|
hasNotFound: e.hasNotFound
|
|
610
|
-
})), Ye =
|
|
614
|
+
})), Ye = H ? "postgres" : "memory", Xe = {
|
|
611
615
|
kind: "web",
|
|
612
616
|
meta: {
|
|
613
|
-
name:
|
|
614
|
-
voltroVersion:
|
|
615
|
-
port:
|
|
617
|
+
name: c.name ?? "(unnamed)",
|
|
618
|
+
voltroVersion: Fe,
|
|
619
|
+
port: h,
|
|
616
620
|
mode: "start",
|
|
617
|
-
apis: Object.entries(
|
|
621
|
+
apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
|
|
618
622
|
let n = {
|
|
619
623
|
name: e,
|
|
620
624
|
package: t.package
|
|
@@ -625,7 +629,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
625
629
|
routes: qe,
|
|
626
630
|
dirs: Je,
|
|
627
631
|
cache: () => {
|
|
628
|
-
let e = Date.now(), t =
|
|
632
|
+
let e = Date.now(), t = V.snapshot().map(([t, n]) => ({
|
|
629
633
|
key: t,
|
|
630
634
|
renderedAt: n.renderedAt,
|
|
631
635
|
expiresAt: n.expiresAt,
|
|
@@ -637,15 +641,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
637
641
|
}));
|
|
638
642
|
return {
|
|
639
643
|
backend: Ye,
|
|
640
|
-
size:
|
|
644
|
+
size: V.size(),
|
|
641
645
|
entries: t
|
|
642
646
|
};
|
|
643
647
|
},
|
|
644
|
-
metrics: () =>
|
|
648
|
+
metrics: () => ke()
|
|
645
649
|
}, Ze = async (e, n) => {
|
|
646
650
|
let r = e.split("?")[0] ?? "/";
|
|
647
|
-
if (
|
|
648
|
-
let e = await
|
|
651
|
+
if (c.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
|
|
652
|
+
let e = await be();
|
|
649
653
|
return {
|
|
650
654
|
status: 200,
|
|
651
655
|
headers: { "content-type": "application/json; charset=utf-8" },
|
|
@@ -658,7 +662,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
658
662
|
body: `registry read error: ${e.message}`
|
|
659
663
|
};
|
|
660
664
|
}
|
|
661
|
-
if (
|
|
665
|
+
if (c.name === "voltroDashboard" && r === "/api/dashboard/config") {
|
|
662
666
|
let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
|
|
663
667
|
if (e && e.trim().length > 0) {
|
|
664
668
|
let n;
|
|
@@ -688,18 +692,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
688
692
|
};
|
|
689
693
|
}
|
|
690
694
|
if (r === "/_voltro/inspect/logs") {
|
|
691
|
-
let t =
|
|
695
|
+
let t = l(e, y(), n);
|
|
692
696
|
return {
|
|
693
697
|
status: t.status,
|
|
694
698
|
headers: {
|
|
695
699
|
"content-type": t.contentType,
|
|
696
|
-
...
|
|
700
|
+
...F(n.origin)
|
|
697
701
|
},
|
|
698
702
|
body: t.body
|
|
699
703
|
};
|
|
700
704
|
}
|
|
701
705
|
if (r !== "/_voltro/inspect/stream") {
|
|
702
|
-
let t =
|
|
706
|
+
let t = ue(e, Xe, n);
|
|
703
707
|
if (t !== null) return {
|
|
704
708
|
status: t.status,
|
|
705
709
|
headers: {
|
|
@@ -709,96 +713,96 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
709
713
|
body: t.body
|
|
710
714
|
};
|
|
711
715
|
}
|
|
712
|
-
let i =
|
|
713
|
-
if (!
|
|
714
|
-
let t =
|
|
716
|
+
let i = Be(r, K), a = i ? X.get(i.route.pattern)?.renderMode : void 0, u = a === "ssr" || a === "isr" || (i ? Q.has(i.route.pattern) : !1), d = [];
|
|
717
|
+
if (!u && z.length > 0) {
|
|
718
|
+
let t = o(z, {
|
|
715
719
|
route: void 0,
|
|
716
720
|
pathname: r
|
|
717
721
|
});
|
|
718
722
|
if (t !== void 0) {
|
|
719
|
-
let i = await
|
|
723
|
+
let i = await s(t, {
|
|
720
724
|
pathname: r,
|
|
721
725
|
search: e.slice(r.length),
|
|
722
726
|
headers: n,
|
|
723
|
-
cookies:
|
|
727
|
+
cookies: ie(n.cookie),
|
|
724
728
|
route: void 0
|
|
725
729
|
});
|
|
726
|
-
|
|
730
|
+
d.push(...i.setCookies);
|
|
727
731
|
}
|
|
728
732
|
}
|
|
729
|
-
let
|
|
733
|
+
let f = (e) => d.length === 0 ? e : {
|
|
730
734
|
...e,
|
|
731
|
-
"set-cookie":
|
|
732
|
-
},
|
|
733
|
-
if (!
|
|
734
|
-
let e = await B.readFile(
|
|
735
|
+
"set-cookie": d.map(te)
|
|
736
|
+
}, ee = r === "/" ? R(x, "index.html") : R(x, r.replace(/^\//, ""), "index.html");
|
|
737
|
+
if (!u && await Z(ee)) {
|
|
738
|
+
let e = await B.readFile(ee);
|
|
735
739
|
return {
|
|
736
740
|
status: 200,
|
|
737
|
-
headers:
|
|
741
|
+
headers: f({ "content-type": "text/html; charset=utf-8" }),
|
|
738
742
|
body: e
|
|
739
743
|
};
|
|
740
744
|
}
|
|
741
745
|
if (/\.[a-z0-9]+$/i.test(r)) {
|
|
742
|
-
let e =
|
|
743
|
-
if (await
|
|
746
|
+
let e = R(x, r.replace(/^\//, ""));
|
|
747
|
+
if (await Z(e)) {
|
|
744
748
|
let t = await B.readFile(e);
|
|
745
749
|
return {
|
|
746
750
|
status: 200,
|
|
747
|
-
headers:
|
|
751
|
+
headers: f({ "content-type": Le(e) }),
|
|
748
752
|
body: t
|
|
749
753
|
};
|
|
750
754
|
}
|
|
751
755
|
}
|
|
752
|
-
let
|
|
753
|
-
if (!
|
|
756
|
+
let m = Be(r, K);
|
|
757
|
+
if (!m) return {
|
|
754
758
|
status: 404,
|
|
755
|
-
headers:
|
|
759
|
+
headers: f({ "content-type": "text/plain" }),
|
|
756
760
|
body: "not found"
|
|
757
761
|
};
|
|
758
|
-
let
|
|
759
|
-
...
|
|
760
|
-
...
|
|
761
|
-
}),
|
|
762
|
-
if (
|
|
762
|
+
let re = X.get(m.route.pattern), h = n["x-tenant"] ?? "anonymous", g = (await Y.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, _ = ge(r, {
|
|
763
|
+
...re?.tenantAware ? { tenant: h } : {},
|
|
764
|
+
...g ? { locale: g } : {}
|
|
765
|
+
}), v = V.get(_), b = Date.now();
|
|
766
|
+
if (v && ve(v, b)) return p.emit("cache", {
|
|
763
767
|
kind: "HIT",
|
|
764
|
-
key:
|
|
765
|
-
ageMs:
|
|
768
|
+
key: _,
|
|
769
|
+
ageMs: b - v.renderedAt
|
|
766
770
|
}), {
|
|
767
771
|
status: 200,
|
|
768
772
|
headers: {
|
|
769
773
|
"content-type": "text/html; charset=utf-8",
|
|
770
774
|
"x-voltro-rendered-by": "isr",
|
|
771
775
|
"x-voltro-cache": "HIT",
|
|
772
|
-
"x-voltro-cache-key":
|
|
773
|
-
"x-voltro-cache-age-ms": String(
|
|
776
|
+
"x-voltro-cache-key": _,
|
|
777
|
+
"x-voltro-cache-age-ms": String(b - v.renderedAt)
|
|
774
778
|
},
|
|
775
|
-
body:
|
|
779
|
+
body: v.html
|
|
776
780
|
};
|
|
777
|
-
if (
|
|
781
|
+
if (v && he(v, b)) return p.emit("cache", {
|
|
778
782
|
kind: "STALE",
|
|
779
|
-
key:
|
|
780
|
-
ageMs:
|
|
783
|
+
key: _,
|
|
784
|
+
ageMs: b - v.renderedAt
|
|
781
785
|
}), (async () => {
|
|
782
786
|
try {
|
|
783
|
-
let i = await
|
|
784
|
-
provider:
|
|
787
|
+
let i = await Ve({
|
|
788
|
+
provider: Y,
|
|
785
789
|
root: t,
|
|
786
|
-
route:
|
|
787
|
-
params:
|
|
790
|
+
route: m.route,
|
|
791
|
+
params: m.params,
|
|
788
792
|
pathname: r,
|
|
789
|
-
dirs:
|
|
793
|
+
dirs: G,
|
|
790
794
|
shellTemplate: j,
|
|
791
795
|
requestHeaders: n,
|
|
792
|
-
apiOrigin:
|
|
793
|
-
apiName:
|
|
794
|
-
middlewares:
|
|
795
|
-
onCookieWarning:
|
|
796
|
+
apiOrigin: me,
|
|
797
|
+
apiName: _e,
|
|
798
|
+
middlewares: z,
|
|
799
|
+
onCookieWarning: De,
|
|
796
800
|
requestUrl: e,
|
|
797
801
|
buffered: !0
|
|
798
802
|
});
|
|
799
803
|
if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
800
|
-
let e =
|
|
801
|
-
|
|
804
|
+
let e = X.get(m.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
|
|
805
|
+
V.set(_, {
|
|
802
806
|
html: i.html,
|
|
803
807
|
renderedAt: t,
|
|
804
808
|
expiresAt: t + i.revalidateMs,
|
|
@@ -808,7 +812,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
808
812
|
});
|
|
809
813
|
}
|
|
810
814
|
} catch (e) {
|
|
811
|
-
|
|
815
|
+
J.warn("background SWR refresh failed", { url: r }, e);
|
|
812
816
|
}
|
|
813
817
|
})(), {
|
|
814
818
|
status: 200,
|
|
@@ -816,25 +820,25 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
816
820
|
"content-type": "text/html; charset=utf-8",
|
|
817
821
|
"x-voltro-rendered-by": "isr",
|
|
818
822
|
"x-voltro-cache": "STALE",
|
|
819
|
-
"x-voltro-cache-key":
|
|
820
|
-
"x-voltro-cache-age-ms": String(
|
|
823
|
+
"x-voltro-cache-key": _,
|
|
824
|
+
"x-voltro-cache-age-ms": String(b - v.renderedAt)
|
|
821
825
|
},
|
|
822
|
-
body:
|
|
826
|
+
body: v.html
|
|
823
827
|
};
|
|
824
828
|
try {
|
|
825
|
-
let i = await
|
|
826
|
-
provider:
|
|
829
|
+
let i = await Ve({
|
|
830
|
+
provider: Y,
|
|
827
831
|
root: t,
|
|
828
|
-
route:
|
|
829
|
-
params:
|
|
832
|
+
route: m.route,
|
|
833
|
+
params: m.params,
|
|
830
834
|
pathname: r,
|
|
831
|
-
dirs:
|
|
835
|
+
dirs: G,
|
|
832
836
|
shellTemplate: j,
|
|
833
837
|
requestHeaders: n,
|
|
834
|
-
apiOrigin:
|
|
835
|
-
apiName:
|
|
836
|
-
middlewares:
|
|
837
|
-
onCookieWarning:
|
|
838
|
+
apiOrigin: me,
|
|
839
|
+
apiName: _e,
|
|
840
|
+
middlewares: z,
|
|
841
|
+
onCookieWarning: De,
|
|
838
842
|
requestUrl: e
|
|
839
843
|
});
|
|
840
844
|
if (!i) return {
|
|
@@ -875,23 +879,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
875
879
|
"x-voltro-rendered-by": i.renderMode
|
|
876
880
|
});
|
|
877
881
|
if (i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
878
|
-
let e = Date.now(), t =
|
|
879
|
-
|
|
882
|
+
let e = Date.now(), t = X.get(m.route.pattern)?.staleWhileRevalidateMs ?? 0;
|
|
883
|
+
V.set(_, {
|
|
880
884
|
html: i.html,
|
|
881
885
|
renderedAt: e,
|
|
882
886
|
expiresAt: e + i.revalidateMs,
|
|
883
887
|
servableUntil: e + i.revalidateMs + t,
|
|
884
888
|
revalidateMs: i.revalidateMs,
|
|
885
889
|
staleWhileRevalidateMs: t
|
|
886
|
-
}), s["x-voltro-cache"] = "MISS", s["x-voltro-cache-key"] =
|
|
890
|
+
}), s["x-voltro-cache"] = "MISS", s["x-voltro-cache-key"] = _, s["x-voltro-cache-revalidate-ms"] = String(i.revalidateMs), t > 0 && (s["x-voltro-cache-swr-ms"] = String(t)), p.emit("cache", {
|
|
887
891
|
kind: "MISS",
|
|
888
|
-
key:
|
|
892
|
+
key: _,
|
|
889
893
|
revalidateMs: i.revalidateMs,
|
|
890
894
|
swrMs: t
|
|
891
895
|
});
|
|
892
|
-
} else i.renderMode === "isr" && (s["x-voltro-cache"] = "BYPASS",
|
|
896
|
+
} else i.renderMode === "isr" && (s["x-voltro-cache"] = "BYPASS", p.emit("cache", {
|
|
893
897
|
kind: "BYPASS",
|
|
894
|
-
key:
|
|
898
|
+
key: _
|
|
895
899
|
}));
|
|
896
900
|
return {
|
|
897
901
|
status: 200,
|
|
@@ -899,7 +903,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
899
903
|
body: i.html
|
|
900
904
|
};
|
|
901
905
|
} catch (e) {
|
|
902
|
-
return
|
|
906
|
+
return J.error("render error", { url: r }, e), ne(e) ? {
|
|
903
907
|
status: 500,
|
|
904
908
|
headers: {
|
|
905
909
|
"content-type": "text/plain; charset=utf-8",
|
|
@@ -912,7 +916,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
912
916
|
body: "server error"
|
|
913
917
|
};
|
|
914
918
|
}
|
|
915
|
-
}, Qe = !1, $e =
|
|
919
|
+
}, Qe = !1, $e = Ae(async (e, t) => {
|
|
916
920
|
let n = e.url ?? "/", r = Date.now(), i = {};
|
|
917
921
|
for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
|
|
918
922
|
let a = n.split("?")[0] ?? "/", o = (e.method ?? "GET").toUpperCase();
|
|
@@ -932,23 +936,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
932
936
|
return;
|
|
933
937
|
}
|
|
934
938
|
if (o === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
|
|
935
|
-
let e =
|
|
939
|
+
let e = F(i.origin);
|
|
936
940
|
t.writeHead(204, e), t.end();
|
|
937
941
|
return;
|
|
938
942
|
}
|
|
939
|
-
if (
|
|
943
|
+
if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
|
|
940
944
|
let r = new URL(n, "http://x").searchParams.get("target");
|
|
941
945
|
if (!r) {
|
|
942
946
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
943
947
|
return;
|
|
944
948
|
}
|
|
945
|
-
if (!
|
|
949
|
+
if (!fe(r)) {
|
|
946
950
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
947
951
|
return;
|
|
948
952
|
}
|
|
949
953
|
try {
|
|
950
954
|
let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
|
|
951
|
-
a ? n.authorization = Array.isArray(a) ? a[0] : a :
|
|
955
|
+
a ? n.authorization = Array.isArray(a) ? a[0] : a : de(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
952
956
|
let s;
|
|
953
957
|
if (o && o !== "GET" && o !== "HEAD") {
|
|
954
958
|
let t = [];
|
|
@@ -972,20 +976,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
972
976
|
}
|
|
973
977
|
return;
|
|
974
978
|
}
|
|
975
|
-
if (
|
|
979
|
+
if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
|
|
976
980
|
let r = new URL(n, "http://x").searchParams.get("target");
|
|
977
981
|
if (!r) {
|
|
978
982
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
979
983
|
return;
|
|
980
984
|
}
|
|
981
|
-
if (!
|
|
985
|
+
if (!fe(r)) {
|
|
982
986
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
983
987
|
return;
|
|
984
988
|
}
|
|
985
989
|
let a = new AbortController();
|
|
986
990
|
e.on("close", () => a.abort()), t.on("close", () => a.abort());
|
|
987
991
|
try {
|
|
988
|
-
let e = i.authorization ?? (
|
|
992
|
+
let e = i.authorization ?? (de(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
|
|
989
993
|
redirect: "manual",
|
|
990
994
|
method: "GET",
|
|
991
995
|
headers: {
|
|
@@ -1020,15 +1024,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1020
1024
|
return;
|
|
1021
1025
|
}
|
|
1022
1026
|
if (a === "/_voltro/inspect/stream") {
|
|
1023
|
-
let n =
|
|
1024
|
-
if (
|
|
1027
|
+
let n = F(i.origin);
|
|
1028
|
+
if (P()) {
|
|
1025
1029
|
t.writeHead(503, {
|
|
1026
1030
|
"content-type": "application/json",
|
|
1027
1031
|
...n
|
|
1028
1032
|
}), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
1029
1033
|
return;
|
|
1030
1034
|
}
|
|
1031
|
-
let r =
|
|
1035
|
+
let r = I(i, "GET");
|
|
1032
1036
|
if (!r.ok) {
|
|
1033
1037
|
t.writeHead(401, {
|
|
1034
1038
|
"content-type": "application/json",
|
|
@@ -1046,11 +1050,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1046
1050
|
"x-accel-buffering": "no",
|
|
1047
1051
|
...n
|
|
1048
1052
|
}), t.flushHeaders(), t.write("retry: 5000\n\n");
|
|
1049
|
-
for (let e of
|
|
1050
|
-
let a =
|
|
1053
|
+
for (let e of p.buffered()) t.write(v(e));
|
|
1054
|
+
let a = p.subscribe((e) => {
|
|
1051
1055
|
t.write(v(e));
|
|
1052
1056
|
}), o = setInterval(() => {
|
|
1053
|
-
t.write(
|
|
1057
|
+
t.write(re());
|
|
1054
1058
|
}, 15e3), s = () => {
|
|
1055
1059
|
clearInterval(o), a();
|
|
1056
1060
|
};
|
|
@@ -1061,14 +1065,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1061
1065
|
let e = await Ze(n, i);
|
|
1062
1066
|
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
|
|
1063
1067
|
let t = Date.now() - r;
|
|
1064
|
-
|
|
1068
|
+
p.emit("request", {
|
|
1065
1069
|
url: a,
|
|
1066
1070
|
status: e.status,
|
|
1067
1071
|
durationMs: t,
|
|
1068
1072
|
renderedBy: e.headers["x-voltro-rendered-by"],
|
|
1069
1073
|
cache: e.headers["x-voltro-cache"]
|
|
1070
1074
|
});
|
|
1071
|
-
let n =
|
|
1075
|
+
let n = Be(a, K)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
|
|
1072
1076
|
Ke.record({
|
|
1073
1077
|
kind: "request",
|
|
1074
1078
|
tag: n,
|
|
@@ -1080,56 +1084,56 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1080
1084
|
t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
|
|
1081
1085
|
}
|
|
1082
1086
|
});
|
|
1083
|
-
await new Promise((e) => $e.listen(
|
|
1084
|
-
port:
|
|
1085
|
-
distDir:
|
|
1086
|
-
}),
|
|
1087
|
+
await new Promise((e) => $e.listen(h, "::", e)), Qe = !0, r.mark("ready"), J.info(`listening on http://localhost:${h}`, {
|
|
1088
|
+
port: h,
|
|
1089
|
+
distDir: x
|
|
1090
|
+
}), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
|
|
1087
1091
|
try {
|
|
1088
|
-
await
|
|
1092
|
+
await ye({
|
|
1089
1093
|
id: E,
|
|
1090
1094
|
name: T,
|
|
1091
1095
|
kind: "web",
|
|
1092
|
-
url: `http://localhost:${
|
|
1096
|
+
url: `http://localhost:${h}`,
|
|
1093
1097
|
pid: process.pid,
|
|
1094
1098
|
status: "live",
|
|
1095
1099
|
logFile: O.path
|
|
1096
1100
|
});
|
|
1097
|
-
let e =
|
|
1101
|
+
let e = _(t);
|
|
1098
1102
|
if (e) {
|
|
1099
|
-
let t = await
|
|
1100
|
-
t.status === "launched" ?
|
|
1103
|
+
let t = await u({ dashboardAppPath: e });
|
|
1104
|
+
t.status === "launched" ? J.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && J.debug(`dashboard already running on :${t.port}`, { port: t.port });
|
|
1101
1105
|
}
|
|
1102
1106
|
setInterval(() => {
|
|
1103
|
-
|
|
1107
|
+
ye({
|
|
1104
1108
|
id: E,
|
|
1105
1109
|
name: T,
|
|
1106
1110
|
kind: "web",
|
|
1107
|
-
url: `http://localhost:${
|
|
1111
|
+
url: `http://localhost:${h}`,
|
|
1108
1112
|
pid: process.pid,
|
|
1109
1113
|
status: "live",
|
|
1110
1114
|
logFile: O.path
|
|
1111
1115
|
}).catch(() => {});
|
|
1112
1116
|
}, 1e4).unref();
|
|
1113
1117
|
} catch (e) {
|
|
1114
|
-
|
|
1118
|
+
J.warn("runtime-registry write failed", {}, e);
|
|
1115
1119
|
}
|
|
1116
|
-
|
|
1117
|
-
app:
|
|
1120
|
+
Oe({
|
|
1121
|
+
app: c.name ?? "unnamed",
|
|
1118
1122
|
kind: "web",
|
|
1119
|
-
url: `http://localhost:${
|
|
1123
|
+
url: `http://localhost:${h}`,
|
|
1120
1124
|
bootMs: r.total()
|
|
1121
1125
|
});
|
|
1122
1126
|
let et = r.phaseBreakdown();
|
|
1123
|
-
|
|
1127
|
+
J.info(`start: ready in ${r.total()}ms`, {
|
|
1124
1128
|
bootMs: r.total(),
|
|
1125
1129
|
...et ? { phases: et } : {}
|
|
1126
1130
|
});
|
|
1127
1131
|
let tt = !1, nt = (e) => async () => {
|
|
1128
1132
|
if (!tt) {
|
|
1129
|
-
if (tt = !0,
|
|
1130
|
-
await
|
|
1133
|
+
if (tt = !0, J.info(`received ${e}, shutting down`, { signal: e }), $e.close(), await Ge.stop(), H) try {
|
|
1134
|
+
await H.end();
|
|
1131
1135
|
} catch {}
|
|
1132
|
-
await
|
|
1136
|
+
await Y.close(), await xe(E), await O.dispose(), process.exit(0);
|
|
1133
1137
|
}
|
|
1134
1138
|
};
|
|
1135
1139
|
process.on("SIGINT", nt("SIGINT")), process.on("SIGTERM", nt("SIGTERM"));
|
|
@@ -1141,10 +1145,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1141
1145
|
e.unref();
|
|
1142
1146
|
}
|
|
1143
1147
|
return new Promise(() => {});
|
|
1144
|
-
},
|
|
1148
|
+
}, Ge = async (e) => {
|
|
1145
1149
|
t("start");
|
|
1146
|
-
let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await
|
|
1147
|
-
return r.ran ? r.exitCode : (
|
|
1150
|
+
let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await We(z(n));
|
|
1151
|
+
return r.ran ? r.exitCode : (J.error("no web app found at this path"), 1);
|
|
1148
1152
|
};
|
|
1149
1153
|
//#endregion
|
|
1150
|
-
export {
|
|
1154
|
+
export { We as n, Ge as t };
|