@voltro/cli 0.37.0 → 0.39.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 +316 -0
- package/THIRD-PARTY-NOTICES.md +80 -45
- package/dist/{addCommand-BNeoeSxe.js → addCommand-C05L9tZh.js} +2 -2
- package/dist/addCommand-C3MdJG-a.js +2 -0
- package/dist/{agentsMd-mhQMF1bx.js → agentsMd-7zI2h5l9.js} +3 -3
- package/dist/agentsMd-BFCXh2gl.js +2 -0
- package/dist/apiBuild-2GvK8CUB.js +2 -0
- package/dist/{apiBuild-DGsShRuF.js → apiBuild-DGalUk9v.js} +3 -3
- package/dist/baselineCommand-CXv680Dc.js +2 -0
- package/dist/{baselineCommand-C6NMt-oa.js → baselineCommand-Ck2Xm8M7.js} +18 -18
- package/dist/bin.js +1 -1
- package/dist/bootRefusal-pgvDxlrU.js +7 -0
- package/dist/{build-CiFA-E19.js → build-CfF6t0UM.js} +88 -81
- package/dist/{capabilitiesCommand-nq_pz5xd.js → capabilitiesCommand-D5gucwYa.js} +8 -8
- package/dist/{checkCommand-CIPYyNyc.js → checkCommand-BV56Pcc1.js} +1 -1
- package/dist/{checkCommand-CLPTzYqM.js → checkCommand-CBtynBKW.js} +34 -34
- package/dist/{cloudCmd-NQSwe_Qk.js → cloudCmd-C42gaO8s.js} +16 -16
- package/dist/{clusterCmd-D5wsCmA_.js → clusterCmd-DrVFCzSj.js} +8 -4
- package/dist/{codegen-GYYcdpCg.js → codegen-CbpGCWLG.js} +1 -1
- package/dist/codegen-i8QGcHsi.js +2 -0
- package/dist/codegenCommand-W7SDdiAQ.js +129 -0
- package/dist/{codemodRunner-cyqu5oxr.js → codemodRunner-D-jTyvWo.js} +679 -495
- package/dist/{commands-BwG9A9Vv.js → commands-BD9eBRY3.js} +48 -48
- package/dist/{connectionConfig-UFlIEiys.js → connectionConfig-Bk9IC7D0.js} +1 -1
- package/dist/{dashboardCommand-C7U146xQ.js → dashboardCommand-7qGylm0F.js} +3 -3
- package/dist/{dataCommand-BOwd8_aJ.js → dataCommand-C_F2DYxe.js} +14 -11
- package/dist/{dbCommand-C4UW8cVN.js → dbCommand-DSwGv9wS.js} +50 -49
- package/dist/dbCommand-DcqEyxju.js +2 -0
- package/dist/dev-alhkKoEX.js +3 -0
- package/dist/{dev-bwDgSObH.js → dev-gqpnzVhI.js} +2357 -2280
- package/dist/{dialectDriver-CgXnDfec.js → dialectDriver-czCHYpeH.js} +2 -1
- package/dist/{doctorCommand-BXyrtN2l.js → doctorCommand-Bvs-BQrM.js} +242 -238
- package/dist/doctorCommand-CVXfRrng.js +2 -0
- package/dist/{dormancyCommand-BDdRRLsa.js → dormancyCommand-B-PPHc9Q.js} +1 -1
- package/dist/{e2eCmd-BRabZww-.js → e2eCmd-uFHig1hV.js} +8 -2
- package/dist/{embeddingsCommand-CjWGcAE6.js → embeddingsCommand-OKY6XjUf.js} +6 -6
- package/dist/{envCommand-B_TeG297.js → envCommand-B1-Zm85H.js} +2 -2
- package/dist/{evolveCommand-D6N-WfA4.js → evolveCommand-C4-NlFbd.js} +6 -8
- package/dist/{generateCommand-DbgcUpGw.js → generateCommand-CcyvH2ve.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/{infoCommand-BHKTprrx.js → infoCommand-CTo8Jnhq.js} +7 -7
- package/dist/inspect-B7U7Cl_Z.js +1192 -0
- package/dist/inspect-DUze25t0.js +2 -0
- package/dist/{inspectCmd-EHFZ9yYu.js → inspectCmd-niF97fAq.js} +5 -5
- package/dist/inspectGateHint-BjnFubmH.js +7 -0
- package/dist/{logFileSink-C_D2wRN1.js → logFileSink-B4uP8pvf.js} +1 -1
- package/dist/{logsCmd-D36xK7Zu.js → logsCmd-B6oNsfaZ.js} +10 -7
- package/dist/{manifestBuild-hpPLaGxV.js → manifestBuild-BK42hu0k.js} +1 -1
- package/dist/manifestBuild-j0n109tt.js +2 -0
- package/dist/{metaCommands-CIoQNlaQ.js → metaCommands-DUYR--Ts.js} +1 -1
- package/dist/{migrate-RwgUWXfc.js → migrate-BnPw2zC8.js} +7 -4
- package/dist/{packageCommand-Cug_3Ogl.js → packageCommand-9SVyvsSo.js} +3 -2
- package/dist/{probeCommand-BPEpwT32.js → probeCommand-C9gazU0H.js} +35 -24
- package/dist/{projectScaffold-CxgtJvlb.js → projectScaffold-BEhhHjPr.js} +1 -1
- package/dist/{projectScaffold-DDgWbNLe.js → projectScaffold-BvhLOrLq.js} +17 -15
- package/dist/{runtimeTrace-WYV7qYvz.js → runtimeTrace-DzZOCd94.js} +1 -1
- package/dist/{scheduleManifestCmd-D2x0CTTY.js → scheduleManifestCmd-kmWzrO_w.js} +6 -9
- package/dist/{sdkgen-TM5sSdf7.js → sdkgen-C4roLErM.js} +4 -4
- package/dist/{seedRunner-ZmLSqNe2.js → seedRunner-IdHEprqf.js} +1 -4
- package/dist/serveCommand-B6TATyCj.js +1770 -0
- package/dist/serveCommand-CNR0gI9V.js +2 -0
- package/dist/serveEntry.js +2 -2
- package/dist/{serverlessCommand-CfJZy6dS.js → serverlessCommand-DbJ7Plg9.js} +3 -3
- package/dist/{start-BgN62boB.js → start-BNuTWdRd.js} +1 -1
- package/dist/{start-T4VesWiM.js → start-ft_KzFTd.js} +240 -237
- package/dist/startEntry.js +1 -1
- package/dist/startup.d.ts +40 -1
- package/dist/startup.js +2 -2
- package/dist/startupRunner-CEqQq7ax.js +108 -0
- package/dist/{test-DIQ0jlkQ.js → test-CLYXrZ2F.js} +1 -1
- package/dist/{tracesCmd-DStmCJPi.js → tracesCmd-DgtgOUdi.js} +7 -4
- package/dist/{typecheckCommand-BlsWiCNq.js → typecheckCommand-BuCtT92o.js} +7 -7
- package/dist/updateCommand-6FMU2klq.js +2 -0
- package/dist/{updateCommand-9GHHsmDf.js → updateCommand-CHBmCB17.js} +5 -3
- package/dist/{webDev-Dybxew86.js → webDev-CTpSY-e_.js} +892 -856
- package/dist/webDev-id3I5PvG.js +2 -0
- package/dist/{webhookDiscovery-D7VaeMlz.js → webhookDiscovery-CphsQe59.js} +4 -6
- package/dist/{webhookDiscovery-CrGAfhIG.js → webhookDiscovery-il9ti-HE.js} +1 -1
- package/dist/{webhooksCommand-CHWSPk5z.js → webhooksCommand-BVvOtZ1B.js} +1 -1
- package/package.json +39 -21
- package/templates/AGENTS.md +2 -2
- package/templates/agent-docs/_index.md +2 -2
- package/templates/agent-docs/_manifest.json +2 -2
- package/templates/agent-docs/authentication.md +30 -0
- package/templates/agent-docs/cli.md +17 -13
- package/templates/agent-docs/data.md +44 -1
- package/templates/agent-docs/database/migrations.md +2 -2
- package/templates/agent-docs/database/seedsdialects.md +2 -2
- package/templates/agent-docs/deployment.md +21 -7
- package/templates/agent-docs/internationalization.md +10 -3
- package/templates/agent-docs/local-first-mobile.md +141 -20
- package/templates/agent-docs/plugins/audit.md +4 -0
- package/templates/agent-docs/plugins/auth.md +4 -6
- package/templates/agent-docs/plugins/mail.md +1 -1
- package/templates/agent-docs/plugins/ratelimit.md +1 -1
- package/templates/agent-docs/plugins.md +3 -1
- package/templates/agent-docs/reference.md +3 -2
- package/templates/agent-docs/releases.md +130 -1
- package/templates/agent-docs/routing.md +34 -2
- package/templates/agent-docs/templates/apibackends.md +1 -1
- package/templates/agent-docs/templates/mobile.md +1 -1
- package/templates/agent-docs/whats-new.md +178 -44
- 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-cms/tests/content.write.test.ts +16 -2
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +11 -5
- package/templates/apps/api-collab/package.json +8 -8
- package/templates/apps/api-collab/tests/documents.setBody.test.ts +8 -2
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/authz.ts +16 -1
- 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/mutations/documents.update.mutation.server.ts +7 -5
- 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/README.md +41 -17
- package/templates/apps/mobile-app/app.config.ts +1 -1
- package/templates/apps/mobile-app/package.json +15 -11
- package/templates/apps/mobile-app/src/app/_layout.tsx +44 -13
- package/templates/apps/mobile-app/src/app/index.tsx +1 -1
- package/templates/apps/mobile-app/src/app/settings.tsx +4 -1
- package/templates/apps/mobile-app/src/client.ts +74 -57
- package/templates/apps/mobile-app/src/lib/api.ts +4 -4
- package/templates/apps/mobile-app/src/lib/deeplinks.ts +6 -6
- package/templates/apps/mobile-app/src/persistence.ts +24 -3
- package/templates/apps/mobile-app/tsconfig.json +17 -3
- package/templates/patches/@effect__cluster@0.60.0.patch +51 -3
- package/dist/addCommand-aXSQveak.js +0 -2
- package/dist/agentsMd-BTchIZku.js +0 -2
- package/dist/apiBuild-D0f6hYbH.js +0 -2
- package/dist/baselineCommand-Cfw2Afwm.js +0 -2
- package/dist/codegen-uYrrDzQv.js +0 -2
- package/dist/codegenCommand-BxS3sCeJ.js +0 -30
- package/dist/dbCommand-CC-qNzpz.js +0 -2
- package/dist/dev-BV6XNYKf.js +0 -3
- package/dist/doctorCommand-C4L61G_L.js +0 -2
- package/dist/inspect-CjTYzAs_.js +0 -1190
- package/dist/inspect-P4pxoMaV.js +0 -2
- package/dist/inspectGateHint-BF6608UT.js +0 -4
- package/dist/manifestBuild-COkJoyAr.js +0 -2
- package/dist/serveCommand-CyZsXL1l.js +0 -1766
- package/dist/serveCommand-qumm7jdF.js +0 -2
- package/dist/startupRunner-DPGFchOa.js +0 -71
- package/dist/updateCommand-BN0tkl9-.js +0 -2
- package/dist/webDev-BcykISYQ2.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, B as i, C as a, D as o, E as s, H as c, I as l, J as u, N as d, O as f, P as p, S as m, T as ee, U as h, V as g, a as _, b as v, d as y, f as b, i as x, j as S, k as te, n as ne, q as C, s as re, st as ie, ut as w, w as T, x as
|
|
4
|
-
import { o as
|
|
5
|
-
import { A, D 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, B as i, C as a, D as o, E as s, H as c, I as l, J as u, N as d, O as f, P as p, S as m, T as ee, U as h, V as g, a as _, b as v, d as y, f as b, i as x, j as S, k as te, n as ne, q as C, s as re, st as ie, ut as w, w as T, x as ae, y as oe, z as E } from "./webDev-CTpSY-e_.js";
|
|
4
|
+
import { o as D, t as O } from "./connectionConfig-Bk9IC7D0.js";
|
|
5
|
+
import { A as k, D as A, a as j, h as se, j as M, k as ce } from "./inspect-B7U7Cl_Z.js";
|
|
6
|
+
import { a as le, c as N, d as ue, f as de, l as P, p as F, u as fe } from "./renderModeScan-D7J1B7Kw.js";
|
|
7
|
+
import { i as pe, n as me, r as he, t as ge } from "./runtimeRegistry-DMeKfTHP.js";
|
|
8
|
+
import { n as _e } from "./logFileSink-B4uP8pvf.js";
|
|
9
|
+
import { t as ve } from "./inspectMetrics-CfdKLh6t.js";
|
|
10
|
+
import { t as ye } from "./bootTiming-BdyP9nYw.js";
|
|
11
|
+
import { dirname as be, extname as xe, join as I, resolve as L } from "node:path";
|
|
12
|
+
import { promises as R } from "node:fs";
|
|
13
|
+
import { fileURLToPath as z, pathToFileURL as Se } from "node:url";
|
|
14
|
+
import { createLogger as B, printReadyBlock as Ce } from "@voltro/logger";
|
|
15
|
+
import { snapshotMetricsSync as we } from "@voltro/runtime";
|
|
16
|
+
import { createServer as Te } from "node:http";
|
|
17
17
|
//#region src/isrCdcInvalidator.ts
|
|
18
|
-
var
|
|
18
|
+
var V = B({ scope: "voltro:start:cdc" }), H = (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 H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
|
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
return n;
|
|
29
|
-
},
|
|
30
|
-
let t = e.channel ?? "framework_changes", n =
|
|
29
|
+
}, U = () => O() ? D() : null, Ee = (e) => {
|
|
30
|
+
let t = e.channel ?? "framework_changes", n = H(e), r = null, i = null;
|
|
31
31
|
return {
|
|
32
32
|
start: async () => {
|
|
33
33
|
if (e.tableSubscriptionsByPattern.size === 0) {
|
|
34
|
-
|
|
34
|
+
V.debug("skipped — no pages declare cacheInvalidatesOn");
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
let a =
|
|
37
|
+
let a = U();
|
|
38
38
|
if (!a) {
|
|
39
|
-
|
|
39
|
+
V.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 H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
|
|
|
45
45
|
try {
|
|
46
46
|
r = JSON.parse(e.payload);
|
|
47
47
|
} catch (e) {
|
|
48
|
-
|
|
48
|
+
V.warn("bad CDC payload", {}, e);
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
let i = n(r.table);
|
|
52
|
-
i > 0 &&
|
|
52
|
+
i > 0 && V.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}`), V.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 H = V({ scope: "voltro:start:cdc" }), U = (e) => (t) => {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
|
-
},
|
|
75
|
+
}, W = B({ scope: "voltro:start:isr-cache" }), De = "voltro_isr_cache", G = (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
|
+
`, Oe = (e) => {
|
|
87
|
+
let t = e.tableName ?? De, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
|
|
88
|
+
i || (i = !0, await n.query(G(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
|
+
W.warn("postgres bootstrap failed", {}, e);
|
|
101
101
|
}), o = (e, t) => {
|
|
102
102
|
a.then(() => n.query(e, t)).catch((e) => {
|
|
103
|
-
|
|
103
|
+
W.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
|
+
}, K = B({ scope: "voltro:start" }), ke = await (async () => {
|
|
149
149
|
try {
|
|
150
|
-
let e =
|
|
150
|
+
let e = I(be(z(import.meta.url)), "..", "package.json"), t = await R.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
|
+
})(), Ae = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", q = (e) => e instanceof Error && e._voltroControl === "not-found", J = {
|
|
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
|
+
}, je = (e) => J[xe(e).toLowerCase()] ?? "application/octet-stream", Y = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), X = async (e) => {
|
|
174
174
|
try {
|
|
175
|
-
return await
|
|
175
|
+
return await R.stat(e), !0;
|
|
176
176
|
} catch {
|
|
177
177
|
return !1;
|
|
178
178
|
}
|
|
179
|
-
},
|
|
179
|
+
}, Me = (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
|
+
}, Ne = (e) => e.map((e) => {
|
|
189
|
+
let { regex: t, paramNames: n, priority: r } = Me(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), Z = (e, t) => {
|
|
199
199
|
for (let n of t) {
|
|
200
200
|
let t = n.regex.exec(e);
|
|
201
201
|
if (!t) continue;
|
|
@@ -207,10 +207,10 @@ 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: l, shellTemplate: u, requestHeaders: d, requestUrl: p = "", apiOrigin: ee, apiName: h } = e, { search: g } = r(p), v = x(ee, d.cookie, { apiName: h }), y = await t.getPage(n.pattern, n.file), b =
|
|
210
|
+
}, Pe = async (e) => {
|
|
211
|
+
let { provider: t, route: n, params: i, pathname: c, dirs: l, shellTemplate: u, requestHeaders: d, requestUrl: p = "", apiOrigin: ee, apiName: h } = e, { search: g } = r(p), v = x(ee, d.cookie, { apiName: h }), y = await t.getPage(n.pattern, n.file), b = N(y, n.file), S = b === "spa" && re(l, n.dirChain).some((e) => e.hasLayout);
|
|
212
212
|
if (b !== "ssr" && b !== "isr" && !S) return null;
|
|
213
|
-
let ne = re(l, n.dirChain), C = {}, ie = null, w,
|
|
213
|
+
let ne = re(l, n.dirChain), C = {}, ie = null, w, oe = new AbortController();
|
|
214
214
|
try {
|
|
215
215
|
(await t.getHelpers()).beginStoreSeeds(), {chain: w, segmentLoaderData: C} = await _({
|
|
216
216
|
entries: ne,
|
|
@@ -221,41 +221,44 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
221
221
|
params: i,
|
|
222
222
|
pathname: c,
|
|
223
223
|
search: g,
|
|
224
|
-
signal:
|
|
224
|
+
signal: oe.signal,
|
|
225
225
|
headers: d,
|
|
226
|
-
query: v
|
|
226
|
+
query: v,
|
|
227
|
+
isServer: !0
|
|
227
228
|
}
|
|
228
229
|
}), typeof y.loader == "function" && !S && (ie = await y.loader({
|
|
229
230
|
params: i,
|
|
230
231
|
pathname: c,
|
|
231
232
|
search: g,
|
|
232
|
-
signal:
|
|
233
|
+
signal: oe.signal,
|
|
233
234
|
headers: d,
|
|
234
|
-
query: v
|
|
235
|
+
query: v,
|
|
236
|
+
isServer: !0
|
|
235
237
|
}));
|
|
236
238
|
} catch (e) {
|
|
237
|
-
if (
|
|
239
|
+
if (Ae(e)) return {
|
|
238
240
|
control: "redirect",
|
|
239
241
|
status: e.status,
|
|
240
242
|
location: e.location
|
|
241
243
|
};
|
|
242
|
-
if (
|
|
244
|
+
if (q(e)) return { control: "not-found" };
|
|
243
245
|
throw e;
|
|
244
246
|
}
|
|
245
|
-
let
|
|
246
|
-
S || await
|
|
247
|
+
let E = await t.getHelpers();
|
|
248
|
+
S || await ae({
|
|
247
249
|
pageMod: y,
|
|
248
250
|
params: i,
|
|
249
251
|
query: v,
|
|
250
252
|
apiName: h,
|
|
251
|
-
seed:
|
|
252
|
-
|
|
253
|
+
seed: E.seedPreloadedSubscription,
|
|
254
|
+
seedFailure: E.seedPreloadedSubscriptionFailure,
|
|
255
|
+
onError: ({ tag: e, apiName: t }, n) => K.warn("preload seed failed", {
|
|
253
256
|
tag: e,
|
|
254
257
|
apiName: t,
|
|
255
258
|
pathname: c
|
|
256
259
|
}, n)
|
|
257
260
|
});
|
|
258
|
-
let
|
|
261
|
+
let D = {
|
|
259
262
|
pattern: n.pattern,
|
|
260
263
|
Component: y.default,
|
|
261
264
|
meta: y.meta,
|
|
@@ -264,34 +267,34 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
264
267
|
Pending: y.Pending,
|
|
265
268
|
renderMode: b,
|
|
266
269
|
chain: w
|
|
267
|
-
},
|
|
268
|
-
cookies:
|
|
270
|
+
}, O = {
|
|
271
|
+
cookies: E.parseCookieHeader(d.cookie),
|
|
269
272
|
headers: d,
|
|
270
273
|
url: p
|
|
271
|
-
},
|
|
274
|
+
}, k = E.i18n?.resolve(d.cookie, d["accept-language"]), A = y.interactive ?? "full";
|
|
272
275
|
if (S) {
|
|
273
276
|
let e = o({
|
|
274
|
-
helpers:
|
|
277
|
+
helpers: E,
|
|
275
278
|
page: n.pattern,
|
|
276
|
-
interactive:
|
|
279
|
+
interactive: A,
|
|
277
280
|
delivery: "stream",
|
|
278
281
|
renderInput: {
|
|
279
|
-
descriptor:
|
|
282
|
+
descriptor: D,
|
|
280
283
|
params: i,
|
|
281
284
|
pathname: c,
|
|
282
285
|
search: g,
|
|
283
286
|
segmentLoaderData: C,
|
|
284
|
-
requestContext:
|
|
285
|
-
...
|
|
286
|
-
outerWrap:
|
|
287
|
-
locale:
|
|
287
|
+
requestContext: O,
|
|
288
|
+
...k ? {
|
|
289
|
+
outerWrap: k.outerWrap,
|
|
290
|
+
locale: k.locale
|
|
288
291
|
} : {}
|
|
289
292
|
}
|
|
290
|
-
}), t =
|
|
291
|
-
helpers:
|
|
293
|
+
}), t = k?.locale ?? O.cookies["voltro:locale"] ?? "en", r = (t) => te({
|
|
294
|
+
helpers: E,
|
|
292
295
|
prepared: e,
|
|
293
296
|
meta: t,
|
|
294
|
-
interactive:
|
|
297
|
+
interactive: A
|
|
295
298
|
});
|
|
296
299
|
if (e.hasDeferred) {
|
|
297
300
|
let n = a({ shell: u });
|
|
@@ -306,18 +309,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
306
309
|
"x-voltro-rendered-by": "spa"
|
|
307
310
|
},
|
|
308
311
|
headInjection: r,
|
|
309
|
-
render: (t) =>
|
|
312
|
+
render: (t) => E.renderPageToStream({
|
|
310
313
|
...e.renderInput,
|
|
311
314
|
...t
|
|
312
315
|
}),
|
|
313
316
|
onShellError: (e) => {
|
|
314
|
-
|
|
317
|
+
K.error("spa layout shell render failed", { pathname: c }, e), i.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), i.end("server error");
|
|
315
318
|
}
|
|
316
319
|
})
|
|
317
320
|
};
|
|
318
321
|
}
|
|
319
322
|
let s = f({
|
|
320
|
-
helpers:
|
|
323
|
+
helpers: E,
|
|
321
324
|
prepared: e
|
|
322
325
|
});
|
|
323
326
|
return {
|
|
@@ -326,35 +329,35 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
326
329
|
revalidateMs: null
|
|
327
330
|
};
|
|
328
331
|
}
|
|
329
|
-
let
|
|
330
|
-
helpers:
|
|
332
|
+
let j = s({
|
|
333
|
+
helpers: E,
|
|
331
334
|
page: n.pattern,
|
|
332
335
|
pathname: c,
|
|
333
336
|
renderMode: b,
|
|
334
|
-
interactive:
|
|
337
|
+
interactive: A,
|
|
335
338
|
loaderData: ie,
|
|
336
339
|
segmentLoaderData: C,
|
|
337
340
|
pageLoaderRan: typeof y.loader == "function"
|
|
338
|
-
}),
|
|
339
|
-
descriptor:
|
|
341
|
+
}), se = {
|
|
342
|
+
descriptor: D,
|
|
340
343
|
params: i,
|
|
341
344
|
pathname: c,
|
|
342
345
|
search: g,
|
|
343
|
-
loaderData:
|
|
344
|
-
segmentLoaderData:
|
|
345
|
-
requestContext:
|
|
346
|
-
...
|
|
347
|
-
outerWrap:
|
|
348
|
-
locale:
|
|
346
|
+
loaderData: j.loaderData,
|
|
347
|
+
segmentLoaderData: j.segmentLoaderData,
|
|
348
|
+
requestContext: O,
|
|
349
|
+
...k ? {
|
|
350
|
+
outerWrap: k.outerWrap,
|
|
351
|
+
locale: k.locale
|
|
349
352
|
} : {}
|
|
350
|
-
},
|
|
351
|
-
|
|
352
|
-
`<meta name="voltro-interactive" content="${
|
|
353
|
-
...
|
|
354
|
-
|
|
353
|
+
}, M = (e) => [
|
|
354
|
+
E.renderMetaToHtml(e),
|
|
355
|
+
`<meta name="voltro-interactive" content="${A}" />`,
|
|
356
|
+
...j.hasDeferred ? [E.renderDeferredRegistryScript()] : [],
|
|
357
|
+
E.renderRouterStateScript(j.stateInput)
|
|
355
358
|
].filter((e) => e.length > 0).join("\n ");
|
|
356
|
-
if (b === "ssr" &&
|
|
357
|
-
let e =
|
|
359
|
+
if (b === "ssr" && A === "full" && e.buffered !== !0) {
|
|
360
|
+
let e = k?.locale ?? O.cookies["voltro:locale"] ?? "en", t = a({ shell: u });
|
|
358
361
|
return {
|
|
359
362
|
renderMode: "ssr",
|
|
360
363
|
stream: (n) => T({
|
|
@@ -365,27 +368,27 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
365
368
|
"content-type": "text/html; charset=utf-8",
|
|
366
369
|
"x-voltro-rendered-by": "ssr"
|
|
367
370
|
},
|
|
368
|
-
headInjection:
|
|
369
|
-
render: (e) =>
|
|
370
|
-
...
|
|
371
|
+
headInjection: M,
|
|
372
|
+
render: (e) => E.renderPageToStream({
|
|
373
|
+
...se,
|
|
371
374
|
...e
|
|
372
375
|
}),
|
|
373
376
|
onShellError: (e) => {
|
|
374
|
-
|
|
377
|
+
K.error("ssr shell render failed", { pathname: c }, e), n.writeHead(500, { "content-type": "text/plain; charset=utf-8" }), n.end("server error");
|
|
375
378
|
}
|
|
376
379
|
})
|
|
377
380
|
};
|
|
378
381
|
}
|
|
379
|
-
let { html:
|
|
380
|
-
|
|
381
|
-
let
|
|
382
|
+
let { html: ce, meta: le } = E.renderPageToHtml(se), ue = M(le), de = k?.locale ?? O.cookies["voltro:locale"] ?? "en", P = m(u.replace("<div id=\"root\"></div>", `<div id="root">${ce}</div>`), ue).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${de}"`);
|
|
383
|
+
A === "none" && (P = Y(P));
|
|
384
|
+
let fe = b === "isr" ? F(y.revalidate) : null;
|
|
382
385
|
return {
|
|
383
|
-
html:
|
|
386
|
+
html: P,
|
|
384
387
|
renderMode: b,
|
|
385
|
-
revalidateMs:
|
|
388
|
+
revalidateMs: fe
|
|
386
389
|
};
|
|
387
|
-
},
|
|
388
|
-
let t = await import(
|
|
390
|
+
}, Q = (e) => e === "" ? "/" : e, Fe = async (e) => {
|
|
391
|
+
let t = await import(Se(e).href);
|
|
389
392
|
return {
|
|
390
393
|
kind: "bundle",
|
|
391
394
|
getPageMeta: () => t.pageMeta,
|
|
@@ -395,18 +398,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
395
398
|
return typeof r == "function" ? await r() : r;
|
|
396
399
|
},
|
|
397
400
|
async getLayout(e) {
|
|
398
|
-
let n = t.layouts[
|
|
399
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${
|
|
401
|
+
let n = t.layouts[Q(e)];
|
|
402
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing layout for dir ${Q(e)}`);
|
|
400
403
|
return typeof n == "function" ? await n() : n;
|
|
401
404
|
},
|
|
402
405
|
async getError(e) {
|
|
403
|
-
let n = t.errors[
|
|
404
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${
|
|
406
|
+
let n = t.errors[Q(e)];
|
|
407
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing error for dir ${Q(e)}`);
|
|
405
408
|
return typeof n == "function" ? await n() : n;
|
|
406
409
|
},
|
|
407
410
|
async getPending(e) {
|
|
408
|
-
let n = t.pendings[
|
|
409
|
-
if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${
|
|
411
|
+
let n = t.pendings[Q(e)];
|
|
412
|
+
if (!n) throw Error(`[voltro start] ssr bundle missing pending for dir ${Q(e)}`);
|
|
410
413
|
return typeof n == "function" ? await n() : n;
|
|
411
414
|
},
|
|
412
415
|
async getHelpers() {
|
|
@@ -414,7 +417,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
414
417
|
},
|
|
415
418
|
async close() {}
|
|
416
419
|
};
|
|
417
|
-
},
|
|
420
|
+
}, Ie = async (e, t) => {
|
|
418
421
|
let n = await w("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
|
|
419
422
|
root: t,
|
|
420
423
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
@@ -432,10 +435,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
432
435
|
},
|
|
433
436
|
appType: "custom",
|
|
434
437
|
logLevel: "warn"
|
|
435
|
-
}), o =
|
|
438
|
+
}), o = I(e, "src", "pages"), s = (e) => e === "" ? o : I(o, e), c = C({
|
|
436
439
|
limit: u(),
|
|
437
|
-
onColdStart: (e) =>
|
|
438
|
-
onColdEnd: (e, { durationMs: t, failed: n }) =>
|
|
440
|
+
onColdStart: (e) => K.debug("ssr cold-compile start", { id: e }),
|
|
441
|
+
onColdEnd: (e, { durationMs: t, failed: n }) => K.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
439
442
|
id: e,
|
|
440
443
|
ms: t,
|
|
441
444
|
...n ? { failed: !0 } : {}
|
|
@@ -444,16 +447,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
444
447
|
return {
|
|
445
448
|
kind: "middleware",
|
|
446
449
|
async getPage(e, t) {
|
|
447
|
-
return l(
|
|
450
|
+
return l(I(o, t));
|
|
448
451
|
},
|
|
449
452
|
async getLayout(e) {
|
|
450
|
-
return l(
|
|
453
|
+
return l(I(s(e), "layout.tsx"));
|
|
451
454
|
},
|
|
452
455
|
async getError(e) {
|
|
453
|
-
return l(
|
|
456
|
+
return l(I(s(e), "error.tsx"));
|
|
454
457
|
},
|
|
455
458
|
async getPending(e) {
|
|
456
|
-
return l(
|
|
459
|
+
return l(I(s(e), "loading.tsx"));
|
|
457
460
|
},
|
|
458
461
|
async getHelpers() {
|
|
459
462
|
return await l("@voltro/web/ssr");
|
|
@@ -462,13 +465,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
462
465
|
await a.close();
|
|
463
466
|
}
|
|
464
467
|
};
|
|
465
|
-
},
|
|
466
|
-
let r =
|
|
468
|
+
}, $ = async (t) => {
|
|
469
|
+
let r = ye(), a = await y(t);
|
|
467
470
|
if (!a) return {
|
|
468
471
|
ran: !1,
|
|
469
472
|
exitCode: 0
|
|
470
473
|
};
|
|
471
|
-
if (a.type !== "web") return
|
|
474
|
+
if (a.type !== "web") return K.error("only web apps are supported by `voltro start`"), {
|
|
472
475
|
ran: !0,
|
|
473
476
|
exitCode: 1
|
|
474
477
|
};
|
|
@@ -476,26 +479,26 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
476
479
|
rawEnv: a.env,
|
|
477
480
|
appType: "web",
|
|
478
481
|
root: t,
|
|
479
|
-
log:
|
|
482
|
+
log: K,
|
|
480
483
|
generateTypes: !1
|
|
481
484
|
}), s = o.publicValues;
|
|
482
485
|
r.mark("config");
|
|
483
486
|
let u = c();
|
|
484
|
-
|
|
487
|
+
E(u), K.info("booting voltro start", { app: a.name ?? "(unnamed)" });
|
|
485
488
|
let f = n({
|
|
486
489
|
kind: "web",
|
|
487
490
|
configPort: a.port,
|
|
488
491
|
env: process.env,
|
|
489
492
|
dashboardPin: process.env[S] === "1"
|
|
490
493
|
});
|
|
491
|
-
for (let e of f.warnings)
|
|
492
|
-
let m = f.port, _ =
|
|
493
|
-
if (!await
|
|
494
|
+
for (let e of f.warnings) K.warn(e);
|
|
495
|
+
let m = f.port, _ = I(t, ".framework"), x = I(_, "dist"), te = I(x, "index.html");
|
|
496
|
+
if (!await X(te)) return K.error("no built dist found — run `voltro build` first", { distDir: x }), {
|
|
494
497
|
ran: !0,
|
|
495
498
|
exitCode: 1
|
|
496
499
|
};
|
|
497
|
-
let C = a.name ?? "unnamed", w =
|
|
498
|
-
await
|
|
500
|
+
let C = a.name ?? "unnamed", w = ge("web", C, m), T = _e(C);
|
|
501
|
+
await pe({
|
|
499
502
|
id: w,
|
|
500
503
|
name: C,
|
|
501
504
|
kind: "web",
|
|
@@ -504,57 +507,57 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
504
507
|
status: "booting",
|
|
505
508
|
logFile: T.path
|
|
506
509
|
}).catch(() => {});
|
|
507
|
-
let
|
|
508
|
-
if (
|
|
509
|
-
else if (
|
|
510
|
+
let ae = I(x, "_voltro", "shell.html"), N = await X(ae) ? await R.readFile(ae, "utf8") : await R.readFile(te, "utf8"), F = await b(t, a), be = ne(F[0]), xe = F[0]?.name, L, z = null, Se = process.env.SSR_CACHE === "postgres";
|
|
511
|
+
if (Se && O()) z = new (await (import("pg"))).default.Client(D()), await z.connect(), L = Oe({ client: z }), K.info("isr cache backend: postgres", { table: "voltro_isr_cache" });
|
|
512
|
+
else if (Se) {
|
|
510
513
|
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).";
|
|
511
|
-
if (e()) throw
|
|
512
|
-
|
|
513
|
-
} else
|
|
514
|
-
await v(t, a,
|
|
515
|
-
let { pages: V, dirs: H } = await
|
|
514
|
+
if (e()) throw K.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");
|
|
515
|
+
L = de(), K.warn(`${t} Falling back to the per-process memory cache — this would be a hard failure in production.`);
|
|
516
|
+
} else L = de(), K.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" });
|
|
517
|
+
await v(t, a, F, s);
|
|
518
|
+
let B = I(t, "src", "pages"), { pages: V, dirs: H } = await oe(B), U = Ne(V);
|
|
516
519
|
r.mark("scan");
|
|
517
|
-
let W =
|
|
518
|
-
if (!
|
|
519
|
-
let
|
|
520
|
-
|
|
521
|
-
kind:
|
|
522
|
-
...
|
|
520
|
+
let W = I(x, "server", "ssrEntry.js"), De = await X(W);
|
|
521
|
+
if (!De && process.env.NODE_ENV === "production") throw K.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${W} 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 ${W}`);
|
|
522
|
+
let G = De ? await Fe(W) : await Ie(t, _);
|
|
523
|
+
K.info(`ssr loader: ${G.kind}`, {
|
|
524
|
+
kind: G.kind,
|
|
525
|
+
...G.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
|
|
523
526
|
}), r.mark("provider");
|
|
524
|
-
let
|
|
527
|
+
let Ae = G.getPageMeta?.(), q = /* @__PURE__ */ new Map(), J = 0;
|
|
525
528
|
for (let e of V) {
|
|
526
|
-
let t =
|
|
529
|
+
let t = Ae?.[e.pattern];
|
|
527
530
|
if (t) {
|
|
528
|
-
|
|
531
|
+
q.set(e.pattern, t);
|
|
529
532
|
continue;
|
|
530
533
|
}
|
|
531
534
|
try {
|
|
532
|
-
let t = await
|
|
533
|
-
|
|
535
|
+
let t = await G.getPage(e.pattern, e.file);
|
|
536
|
+
q.set(e.pattern, le(t, e.file)), J++;
|
|
534
537
|
} catch (t) {
|
|
535
|
-
|
|
538
|
+
K.warn("failed to load page metadata", { pattern: e.pattern }, t);
|
|
536
539
|
}
|
|
537
540
|
}
|
|
538
|
-
|
|
539
|
-
count:
|
|
540
|
-
fromManifest:
|
|
541
|
-
fromModules:
|
|
541
|
+
K.info(`registered ${q.size} route(s)`, {
|
|
542
|
+
count: q.size,
|
|
543
|
+
fromManifest: q.size - J,
|
|
544
|
+
fromModules: J
|
|
542
545
|
}), r.mark("routes");
|
|
543
|
-
let
|
|
544
|
-
for (let e of U)
|
|
545
|
-
|
|
546
|
-
let
|
|
547
|
-
for (let [e, t] of
|
|
548
|
-
let
|
|
549
|
-
for (let e of U)
|
|
550
|
-
let $ =
|
|
551
|
-
cache:
|
|
552
|
-
tableSubscriptionsByPattern:
|
|
553
|
-
regexByPattern:
|
|
546
|
+
let Y = /* @__PURE__ */ new Set();
|
|
547
|
+
for (let e of U) q.get(e.pattern)?.renderMode === "spa" && re(H, e.dirChain).some((e) => e.hasLayout) && Y.add(e.pattern);
|
|
548
|
+
Y.size > 0 && K.info(`${Y.size} spa route(s) render an SSR layout shell`, { patterns: [...Y] });
|
|
549
|
+
let Me = /* @__PURE__ */ new Map();
|
|
550
|
+
for (let [e, t] of q) t.cacheInvalidatesOn.length > 0 && Me.set(e, t.cacheInvalidatesOn);
|
|
551
|
+
let Q = /* @__PURE__ */ new Map();
|
|
552
|
+
for (let e of U) Q.set(e.pattern, e.regex);
|
|
553
|
+
let $ = Ee({
|
|
554
|
+
cache: L,
|
|
555
|
+
tableSubscriptionsByPattern: Me,
|
|
556
|
+
regexByPattern: Q
|
|
554
557
|
});
|
|
555
558
|
await $.start(), r.mark("cdc");
|
|
556
|
-
let
|
|
557
|
-
let t =
|
|
559
|
+
let Le = ve(), Re = V.map((e) => {
|
|
560
|
+
let t = q.get(e.pattern);
|
|
558
561
|
return {
|
|
559
562
|
pattern: e.pattern,
|
|
560
563
|
file: e.file,
|
|
@@ -569,17 +572,17 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
569
572
|
hasMeta: t?.hasMeta ?? !1,
|
|
570
573
|
hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
|
|
571
574
|
};
|
|
572
|
-
}),
|
|
575
|
+
}), ze = H.map((e) => ({
|
|
573
576
|
dir: e.dir,
|
|
574
577
|
hasLayout: e.hasLayout,
|
|
575
578
|
hasError: e.hasError,
|
|
576
579
|
hasPending: e.hasPending,
|
|
577
580
|
hasNotFound: e.hasNotFound
|
|
578
|
-
})),
|
|
581
|
+
})), Be = z ? "postgres" : "memory", Ve = {
|
|
579
582
|
kind: "web",
|
|
580
583
|
meta: {
|
|
581
584
|
name: a.name ?? "(unnamed)",
|
|
582
|
-
voltroVersion:
|
|
585
|
+
voltroVersion: ke,
|
|
583
586
|
port: m,
|
|
584
587
|
mode: "start",
|
|
585
588
|
apis: Object.entries(a.apis ?? {}).map(([e, t]) => {
|
|
@@ -590,10 +593,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
590
593
|
return t.url !== void 0 && (n.url = t.url), n;
|
|
591
594
|
})
|
|
592
595
|
},
|
|
593
|
-
routes:
|
|
594
|
-
dirs:
|
|
596
|
+
routes: Re,
|
|
597
|
+
dirs: ze,
|
|
595
598
|
cache: () => {
|
|
596
|
-
let e = Date.now(), t =
|
|
599
|
+
let e = Date.now(), t = L.snapshot().map(([t, n]) => ({
|
|
597
600
|
key: t,
|
|
598
601
|
renderedAt: n.renderedAt,
|
|
599
602
|
expiresAt: n.expiresAt,
|
|
@@ -604,16 +607,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
604
607
|
staleWhileRevalidateMs: n.staleWhileRevalidateMs
|
|
605
608
|
}));
|
|
606
609
|
return {
|
|
607
|
-
backend:
|
|
608
|
-
size:
|
|
610
|
+
backend: Be,
|
|
611
|
+
size: L.size(),
|
|
609
612
|
entries: t
|
|
610
613
|
};
|
|
611
614
|
},
|
|
612
|
-
metrics: () =>
|
|
613
|
-
},
|
|
615
|
+
metrics: () => we()
|
|
616
|
+
}, He = async (e, n) => {
|
|
614
617
|
let r = e.split("?")[0] ?? "/";
|
|
615
618
|
if (a.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
|
|
616
|
-
let e = await
|
|
619
|
+
let e = await me();
|
|
617
620
|
return {
|
|
618
621
|
status: 200,
|
|
619
622
|
headers: { "content-type": "application/json; charset=utf-8" },
|
|
@@ -642,7 +645,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
642
645
|
for (let e of Array.isArray(n) ? n : []) {
|
|
643
646
|
if (typeof e != "object" || !e) continue;
|
|
644
647
|
let n = e;
|
|
645
|
-
typeof n.url
|
|
648
|
+
typeof n.url == "string" && n.url.length !== 0 && t.push({
|
|
646
649
|
url: n.url,
|
|
647
650
|
...typeof n.name == "string" ? { name: n.name } : {},
|
|
648
651
|
...typeof n.token == "string" ? { token: n.token } : {}
|
|
@@ -661,13 +664,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
661
664
|
status: t.status,
|
|
662
665
|
headers: {
|
|
663
666
|
"content-type": t.contentType,
|
|
664
|
-
...
|
|
667
|
+
...A(n.origin)
|
|
665
668
|
},
|
|
666
669
|
body: t.body
|
|
667
670
|
};
|
|
668
671
|
}
|
|
669
672
|
if (r !== "/_voltro/inspect/stream") {
|
|
670
|
-
let t =
|
|
673
|
+
let t = se(e, Ve, n);
|
|
671
674
|
if (t !== null) return {
|
|
672
675
|
status: t.status,
|
|
673
676
|
headers: {
|
|
@@ -677,34 +680,34 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
677
680
|
body: t.body
|
|
678
681
|
};
|
|
679
682
|
}
|
|
680
|
-
let o =
|
|
681
|
-
if (!c && await
|
|
683
|
+
let o = Z(r, U), s = o ? q.get(o.route.pattern)?.renderMode : void 0, c = s === "ssr" || s === "isr" || (o ? Y.has(o.route.pattern) : !1), d = r === "/" ? I(x, "index.html") : I(x, r.replace(/^\//, ""), "index.html");
|
|
684
|
+
if (!c && await X(d)) return {
|
|
682
685
|
status: 200,
|
|
683
686
|
headers: { "content-type": "text/html; charset=utf-8" },
|
|
684
|
-
body: await
|
|
687
|
+
body: await R.readFile(d)
|
|
685
688
|
};
|
|
686
689
|
if (/\.[a-z0-9]+$/i.test(r)) {
|
|
687
|
-
let e =
|
|
688
|
-
if (await
|
|
689
|
-
let t = await
|
|
690
|
+
let e = I(x, r.replace(/^\//, ""));
|
|
691
|
+
if (await X(e)) {
|
|
692
|
+
let t = await R.readFile(e);
|
|
690
693
|
return {
|
|
691
694
|
status: 200,
|
|
692
|
-
headers: { "content-type":
|
|
695
|
+
headers: { "content-type": je(e) },
|
|
693
696
|
body: t
|
|
694
697
|
};
|
|
695
698
|
}
|
|
696
699
|
}
|
|
697
|
-
let f =
|
|
700
|
+
let f = Z(r, U);
|
|
698
701
|
if (!f) return {
|
|
699
702
|
status: 404,
|
|
700
703
|
headers: { "content-type": "text/plain" },
|
|
701
704
|
body: "not found"
|
|
702
705
|
};
|
|
703
|
-
let p =
|
|
706
|
+
let p = q.get(f.route.pattern), m = n["x-tenant"] ?? "anonymous", h = (await G.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, g = P(r, {
|
|
704
707
|
...p?.tenantAware ? { tenant: m } : {},
|
|
705
708
|
...h ? { locale: h } : {}
|
|
706
|
-
}), _ =
|
|
707
|
-
if (_ &&
|
|
709
|
+
}), _ = L.get(g), v = Date.now();
|
|
710
|
+
if (_ && fe(_, v)) return u.emit("cache", {
|
|
708
711
|
kind: "HIT",
|
|
709
712
|
key: g,
|
|
710
713
|
ageMs: v - _.renderedAt
|
|
@@ -719,29 +722,29 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
719
722
|
},
|
|
720
723
|
body: _.html
|
|
721
724
|
};
|
|
722
|
-
if (_ &&
|
|
725
|
+
if (_ && ue(_, v)) return u.emit("cache", {
|
|
723
726
|
kind: "STALE",
|
|
724
727
|
key: g,
|
|
725
728
|
ageMs: v - _.renderedAt
|
|
726
729
|
}), (async () => {
|
|
727
730
|
try {
|
|
728
|
-
let i = await
|
|
729
|
-
provider:
|
|
731
|
+
let i = await Pe({
|
|
732
|
+
provider: G,
|
|
730
733
|
root: t,
|
|
731
734
|
route: f.route,
|
|
732
735
|
params: f.params,
|
|
733
736
|
pathname: r,
|
|
734
737
|
dirs: H,
|
|
735
|
-
shellTemplate:
|
|
738
|
+
shellTemplate: N,
|
|
736
739
|
requestHeaders: n,
|
|
737
|
-
apiOrigin:
|
|
738
|
-
apiName:
|
|
740
|
+
apiOrigin: be,
|
|
741
|
+
apiName: xe,
|
|
739
742
|
requestUrl: e,
|
|
740
743
|
buffered: !0
|
|
741
744
|
});
|
|
742
745
|
if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
743
|
-
let e =
|
|
744
|
-
|
|
746
|
+
let e = q.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
|
|
747
|
+
L.set(g, {
|
|
745
748
|
html: i.html,
|
|
746
749
|
renderedAt: t,
|
|
747
750
|
expiresAt: t + i.revalidateMs,
|
|
@@ -751,7 +754,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
751
754
|
});
|
|
752
755
|
}
|
|
753
756
|
} catch (e) {
|
|
754
|
-
|
|
757
|
+
K.warn("background SWR refresh failed", { url: r }, e);
|
|
755
758
|
}
|
|
756
759
|
})(), {
|
|
757
760
|
status: 200,
|
|
@@ -765,17 +768,17 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
765
768
|
body: _.html
|
|
766
769
|
};
|
|
767
770
|
try {
|
|
768
|
-
let i = await
|
|
769
|
-
provider:
|
|
771
|
+
let i = await Pe({
|
|
772
|
+
provider: G,
|
|
770
773
|
root: t,
|
|
771
774
|
route: f.route,
|
|
772
775
|
params: f.params,
|
|
773
776
|
pathname: r,
|
|
774
777
|
dirs: H,
|
|
775
|
-
shellTemplate:
|
|
778
|
+
shellTemplate: N,
|
|
776
779
|
requestHeaders: n,
|
|
777
|
-
apiOrigin:
|
|
778
|
-
apiName:
|
|
780
|
+
apiOrigin: be,
|
|
781
|
+
apiName: xe,
|
|
779
782
|
requestUrl: e
|
|
780
783
|
});
|
|
781
784
|
if (!i) return {
|
|
@@ -784,7 +787,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
784
787
|
"content-type": "text/html; charset=utf-8",
|
|
785
788
|
"x-voltro-rendered-by": "spa-fallback"
|
|
786
789
|
},
|
|
787
|
-
body:
|
|
790
|
+
body: N
|
|
788
791
|
};
|
|
789
792
|
if ("stream" in i) return {
|
|
790
793
|
status: 200,
|
|
@@ -812,8 +815,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
812
815
|
"x-voltro-rendered-by": i.renderMode
|
|
813
816
|
};
|
|
814
817
|
if (i.renderMode === "isr" && i.revalidateMs !== null) {
|
|
815
|
-
let e = Date.now(), t =
|
|
816
|
-
|
|
818
|
+
let e = Date.now(), t = q.get(f.route.pattern)?.staleWhileRevalidateMs ?? 0;
|
|
819
|
+
L.set(g, {
|
|
817
820
|
html: i.html,
|
|
818
821
|
renderedAt: e,
|
|
819
822
|
expiresAt: e + i.revalidateMs,
|
|
@@ -836,7 +839,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
836
839
|
body: i.html
|
|
837
840
|
};
|
|
838
841
|
} catch (e) {
|
|
839
|
-
return
|
|
842
|
+
return K.error("render error", { url: r }, e), ee(e) ? {
|
|
840
843
|
status: 500,
|
|
841
844
|
headers: {
|
|
842
845
|
"content-type": "text/plain; charset=utf-8",
|
|
@@ -849,7 +852,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
849
852
|
body: "server error"
|
|
850
853
|
};
|
|
851
854
|
}
|
|
852
|
-
},
|
|
855
|
+
}, Ue = !1, We = Te(async (e, t) => {
|
|
853
856
|
let n = e.url ?? "/", r = Date.now(), i = {};
|
|
854
857
|
for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
|
|
855
858
|
let o = n.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
|
|
@@ -861,15 +864,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
861
864
|
return;
|
|
862
865
|
}
|
|
863
866
|
if (o === "/internal/readiness") {
|
|
864
|
-
let e =
|
|
867
|
+
let e = Ue ? 200 : 503;
|
|
865
868
|
t.writeHead(e, {
|
|
866
869
|
"content-type": "text/plain",
|
|
867
870
|
"cache-control": "no-store"
|
|
868
|
-
}), t.end(
|
|
871
|
+
}), t.end(Ue ? "ready" : "not-ready");
|
|
869
872
|
return;
|
|
870
873
|
}
|
|
871
874
|
if (s === "OPTIONS" && o.startsWith("/_voltro/inspect")) {
|
|
872
|
-
let e =
|
|
875
|
+
let e = A(i.origin);
|
|
873
876
|
t.writeHead(204, e), t.end();
|
|
874
877
|
return;
|
|
875
878
|
}
|
|
@@ -879,13 +882,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
879
882
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
880
883
|
return;
|
|
881
884
|
}
|
|
882
|
-
if (!
|
|
885
|
+
if (!ce(r)) {
|
|
883
886
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
884
887
|
return;
|
|
885
888
|
}
|
|
886
889
|
try {
|
|
887
890
|
let n = { accept: i.accept ?? "application/json" }, a = i.authorization;
|
|
888
|
-
a ? n.authorization = Array.isArray(a) ? a[0] : a :
|
|
891
|
+
a ? n.authorization = Array.isArray(a) ? a[0] : a : M(r) && process.env.VOLTRO_INSPECT_TOKEN && (n.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
889
892
|
let o;
|
|
890
893
|
if (s && s !== "GET" && s !== "HEAD") {
|
|
891
894
|
let t = [];
|
|
@@ -915,14 +918,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
915
918
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
916
919
|
return;
|
|
917
920
|
}
|
|
918
|
-
if (!
|
|
921
|
+
if (!ce(r)) {
|
|
919
922
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
920
923
|
return;
|
|
921
924
|
}
|
|
922
925
|
let a = new AbortController();
|
|
923
926
|
e.on("close", () => a.abort()), t.on("close", () => a.abort());
|
|
924
927
|
try {
|
|
925
|
-
let e = i.authorization ?? (
|
|
928
|
+
let e = i.authorization ?? (M(r) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), n = await fetch(r, {
|
|
926
929
|
redirect: "manual",
|
|
927
930
|
method: "GET",
|
|
928
931
|
headers: {
|
|
@@ -957,15 +960,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
957
960
|
return;
|
|
958
961
|
}
|
|
959
962
|
if (o === "/_voltro/inspect/stream") {
|
|
960
|
-
let n =
|
|
961
|
-
if (
|
|
963
|
+
let n = A(i.origin);
|
|
964
|
+
if (k()) {
|
|
962
965
|
t.writeHead(503, {
|
|
963
966
|
"content-type": "application/json",
|
|
964
967
|
...n
|
|
965
968
|
}), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
966
969
|
return;
|
|
967
970
|
}
|
|
968
|
-
let r =
|
|
971
|
+
let r = j(i, "GET");
|
|
969
972
|
if (!r.ok) {
|
|
970
973
|
t.writeHead(401, {
|
|
971
974
|
"content-type": "application/json",
|
|
@@ -995,7 +998,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
995
998
|
return;
|
|
996
999
|
}
|
|
997
1000
|
try {
|
|
998
|
-
let e = await
|
|
1001
|
+
let e = await He(n, i);
|
|
999
1002
|
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !o.startsWith("/_voltro/inspect")) {
|
|
1000
1003
|
let t = Date.now() - r;
|
|
1001
1004
|
u.emit("request", {
|
|
@@ -1005,8 +1008,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1005
1008
|
renderedBy: e.headers["x-voltro-rendered-by"],
|
|
1006
1009
|
cache: e.headers["x-voltro-cache"]
|
|
1007
1010
|
});
|
|
1008
|
-
let n =
|
|
1009
|
-
|
|
1011
|
+
let n = Z(o, U)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
|
|
1012
|
+
Le.record({
|
|
1010
1013
|
kind: "request",
|
|
1011
1014
|
tag: n,
|
|
1012
1015
|
durationMs: t,
|
|
@@ -1017,12 +1020,12 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1017
1020
|
t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
|
|
1018
1021
|
}
|
|
1019
1022
|
});
|
|
1020
|
-
await new Promise((e) =>
|
|
1023
|
+
await new Promise((e) => We.listen(m, "::", e)), Ue = !0, r.mark("ready"), K.info(`listening on http://localhost:${m}`, {
|
|
1021
1024
|
port: m,
|
|
1022
1025
|
distDir: x
|
|
1023
|
-
}),
|
|
1026
|
+
}), K.debug("dynamic + ssr/isr routes resolve via SSR loader");
|
|
1024
1027
|
try {
|
|
1025
|
-
await
|
|
1028
|
+
await pe({
|
|
1026
1029
|
id: w,
|
|
1027
1030
|
name: C,
|
|
1028
1031
|
kind: "web",
|
|
@@ -1034,10 +1037,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1034
1037
|
let e = p(t);
|
|
1035
1038
|
if (e) {
|
|
1036
1039
|
let t = await d({ dashboardAppPath: e });
|
|
1037
|
-
t.status === "launched" ?
|
|
1040
|
+
t.status === "launched" ? K.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && K.debug(`dashboard already running on :${t.port}`, { port: t.port });
|
|
1038
1041
|
}
|
|
1039
1042
|
setInterval(() => {
|
|
1040
|
-
|
|
1043
|
+
pe({
|
|
1041
1044
|
id: w,
|
|
1042
1045
|
name: C,
|
|
1043
1046
|
kind: "web",
|
|
@@ -1048,40 +1051,40 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1048
1051
|
}).catch(() => {});
|
|
1049
1052
|
}, 1e4).unref();
|
|
1050
1053
|
} catch (e) {
|
|
1051
|
-
|
|
1054
|
+
K.warn("runtime-registry write failed", {}, e);
|
|
1052
1055
|
}
|
|
1053
|
-
|
|
1056
|
+
Ce({
|
|
1054
1057
|
app: a.name ?? "unnamed",
|
|
1055
1058
|
kind: "web",
|
|
1056
1059
|
url: `http://localhost:${m}`,
|
|
1057
1060
|
bootMs: r.total()
|
|
1058
1061
|
});
|
|
1059
|
-
let
|
|
1060
|
-
|
|
1062
|
+
let Ge = r.phaseBreakdown();
|
|
1063
|
+
K.info(`start: ready in ${r.total()}ms`, {
|
|
1061
1064
|
bootMs: r.total(),
|
|
1062
|
-
...
|
|
1065
|
+
...Ge ? { phases: Ge } : {}
|
|
1063
1066
|
});
|
|
1064
|
-
let
|
|
1065
|
-
if (!
|
|
1066
|
-
if (
|
|
1067
|
-
await
|
|
1067
|
+
let Ke = !1, qe = (e) => async () => {
|
|
1068
|
+
if (!Ke) {
|
|
1069
|
+
if (Ke = !0, K.info(`received ${e}, shutting down`, { signal: e }), We.close(), await $.stop(), z) try {
|
|
1070
|
+
await z.end();
|
|
1068
1071
|
} catch {}
|
|
1069
|
-
await
|
|
1072
|
+
await G.close(), await he(w), await T.dispose(), process.exit(0);
|
|
1070
1073
|
}
|
|
1071
1074
|
};
|
|
1072
|
-
process.on("SIGINT",
|
|
1073
|
-
let
|
|
1074
|
-
if (
|
|
1075
|
+
process.on("SIGINT", qe("SIGINT")), process.on("SIGTERM", qe("SIGTERM"));
|
|
1076
|
+
let Je = process.ppid;
|
|
1077
|
+
if (Je > 1) {
|
|
1075
1078
|
let e = setInterval(() => {
|
|
1076
|
-
(process.ppid !==
|
|
1079
|
+
(process.ppid !== Je || process.ppid === 1) && (clearInterval(e), qe("SIGTERM")());
|
|
1077
1080
|
}, 2e3);
|
|
1078
1081
|
e.unref();
|
|
1079
1082
|
}
|
|
1080
1083
|
return new Promise(() => {});
|
|
1081
1084
|
}, Le = async (e) => {
|
|
1082
1085
|
t("start");
|
|
1083
|
-
let n =
|
|
1084
|
-
return
|
|
1086
|
+
let n = e.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await $(L(n));
|
|
1087
|
+
return r.ran ? r.exitCode : (K.error("no web app found at this path"), 1);
|
|
1085
1088
|
};
|
|
1086
1089
|
//#endregion
|
|
1087
|
-
export {
|
|
1090
|
+
export { $ as n, Le as t };
|