@voltro/cli 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +513 -0
- package/THIRD-PARTY-NOTICES.md +88 -2
- package/dist/{apiBuild-D22_EpoR.js → apiBuild-BESZbTjA.js} +4 -4
- package/dist/apiBuild-C8d74T6g.js +2 -0
- package/dist/bin.js +3 -3
- package/dist/checkCommand-BPAtyWs8.js +2420 -0
- package/dist/checkCommand-DBvZvCh1.js +2 -0
- package/dist/cliRuntime-Oh517vCV.js +96 -0
- package/dist/{commands-jBX8no1I.js → commands-82BDEktg.js} +6476 -7672
- package/dist/dbCommand-CaIVTp-a.js +2 -0
- package/dist/{dbCommand-uuNCrFAb.js → dbCommand-bCBbk6tz.js} +3 -3
- package/dist/{dev-DcbIJrWg.js → dev-Cg4BKLmi.js} +3034 -2619
- package/dist/dev-DeEJj5T4.js +3 -0
- package/dist/fileConventions-Cof68_BL.js +33 -0
- package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-4Db40V23.js} +2 -2
- package/dist/frameworkTableAssembly-BTNirAAk.js +2 -0
- package/dist/index.js +1 -1
- package/dist/{inspect-CUCCzw2I.js → inspect-BMvQpwqy.js} +211 -190
- package/dist/inspect-DHeaMZak.js +2 -0
- package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-DHYygE4s.js} +999 -961
- package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-C4R1EdHn.js} +1 -1
- package/dist/manifestBuild-Ck_90gZy.js +2 -0
- package/dist/sdkgen-CW5NbYF0.js +582 -0
- package/dist/{seedRunner-D6eu-u5U.js → seedRunner-Bqxgp7HZ.js} +60 -59
- package/dist/serveCommand-BXl8mhZD.js +1489 -0
- package/dist/serveEntry.js +3 -3
- package/dist/{start-BGXIf6zT.js → start-CsCIaW4-.js} +282 -269
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.md +2 -1
- package/templates/agent-docs/_index.md +2 -1
- package/templates/agent-docs/_manifest.json +10 -1
- package/templates/agent-docs/ai.md +135 -0
- package/templates/agent-docs/cli.md +124 -6
- package/templates/agent-docs/configuration.md +32 -0
- package/templates/agent-docs/data.md +282 -0
- package/templates/agent-docs/database/migrations.md +47 -0
- package/templates/agent-docs/database/misc.md +57 -0
- package/templates/agent-docs/database/schema.md +3 -1
- package/templates/agent-docs/deployment.md +56 -0
- package/templates/agent-docs/internationalization.md +161 -1
- package/templates/agent-docs/local-first-mobile.md +414 -0
- package/templates/agent-docs/routing.md +93 -2
- package/templates/agent-docs/schema-driven-ui.md +12 -0
- package/templates/agent-docs/templates/apibackends.md +1 -1
- package/templates/agent-docs/testing.md +42 -0
- package/templates/agent-docs/whats-new.md +165 -131
- package/templates/agent-docs/workflows.md +11 -0
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-sqlite/.env.example +19 -0
- package/templates/apps/api-backend-sqlite/README.md +38 -0
- package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
- package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
- package/templates/apps/api-backend-sqlite/package.json +30 -0
- package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
- package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
- package/templates/apps/api-backend-sqlite/template.json +6 -0
- package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
- package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/README.md +104 -0
- package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
- package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
- package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
- package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
- package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
- package/templates/apps/api-cms/actions/me.action.ts +16 -0
- package/templates/apps/api-cms/app.config.ts +61 -0
- package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
- package/templates/apps/api-cms/content/index.ts +18 -0
- package/templates/apps/api-cms/content/page.contentType.ts +24 -0
- package/templates/apps/api-cms/database/schema.ts +64 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
- package/templates/apps/api-cms/package.json +32 -0
- package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
- package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
- package/templates/apps/api-cms/template.json +6 -0
- package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
- package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
- package/templates/apps/api-cms/tsconfig.json +5 -0
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-saas-starter/README.md +103 -0
- package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
- package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
- package/templates/apps/api-saas-starter/app.config.ts +87 -0
- package/templates/apps/api-saas-starter/database/schema.ts +57 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
- package/templates/apps/api-saas-starter/package.json +32 -0
- package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
- package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
- package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
- package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
- package/templates/apps/api-saas-starter/template.json +6 -0
- package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
- package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
- package/templates/apps/api-saas-starter/tsconfig.json +5 -0
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-status/README.md +88 -0
- package/templates/apps/api-status/app.config.ts +36 -0
- package/templates/apps/api-status/authz.ts +33 -0
- package/templates/apps/api-status/database/schema.ts +70 -0
- package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
- package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
- package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
- package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
- package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
- package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
- package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
- package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
- package/templates/apps/api-status/package.json +30 -0
- package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
- package/templates/apps/api-status/queries/components.list.query.ts +13 -0
- package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
- package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
- package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
- package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
- package/templates/apps/api-status/template.json +6 -0
- package/templates/apps/api-status/tests/status.test.ts +70 -0
- package/templates/apps/api-status/tsconfig.json +5 -0
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-auth/README.md +78 -0
- package/templates/apps/frontend-auth/app.config.ts +34 -0
- package/templates/apps/frontend-auth/package.json +32 -0
- package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
- package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
- package/templates/apps/frontend-auth/src/config.ts +11 -0
- package/templates/apps/frontend-auth/src/globals.css +105 -0
- package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
- package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
- package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
- package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
- package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
- package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
- package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
- package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
- package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
- package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
- package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
- package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
- package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
- package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
- package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
- package/templates/apps/frontend-auth/template.json +6 -0
- package/templates/apps/frontend-auth/tsconfig.json +5 -0
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-cms/README.md +47 -0
- package/templates/apps/frontend-cms/app.config.ts +37 -0
- package/templates/apps/frontend-cms/package.json +33 -0
- package/templates/apps/frontend-cms/src/config.ts +8 -0
- package/templates/apps/frontend-cms/src/globals.css +105 -0
- package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
- package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
- package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
- package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
- package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
- package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
- package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
- package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
- package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
- package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
- package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
- package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
- package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
- package/templates/apps/frontend-cms/template.json +6 -0
- package/templates/apps/frontend-cms/tsconfig.json +5 -0
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-portal/README.md +71 -0
- package/templates/apps/frontend-portal/app.config.ts +37 -0
- package/templates/apps/frontend-portal/package.json +32 -0
- package/templates/apps/frontend-portal/src/config.ts +8 -0
- package/templates/apps/frontend-portal/src/globals.css +93 -0
- package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
- package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
- package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
- package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
- package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
- package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
- package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
- package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
- package/templates/apps/frontend-portal/template.json +6 -0
- package/templates/apps/frontend-portal/tsconfig.json +5 -0
- package/templates/apps/frontend-saas/README.md +73 -0
- package/templates/apps/frontend-saas/app.config.ts +46 -0
- package/templates/apps/frontend-saas/package.json +32 -0
- package/templates/apps/frontend-saas/src/config.ts +8 -0
- package/templates/apps/frontend-saas/src/globals.css +85 -0
- package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
- package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
- package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
- package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
- package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
- package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
- package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
- package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
- package/templates/apps/frontend-saas/template.json +6 -0
- package/templates/apps/frontend-saas/tsconfig.json +5 -0
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/templates/apps/frontend-status/README.md +51 -0
- package/templates/apps/frontend-status/app.config.ts +39 -0
- package/templates/apps/frontend-status/package.json +32 -0
- package/templates/apps/frontend-status/src/config.ts +7 -0
- package/templates/apps/frontend-status/src/globals.css +70 -0
- package/templates/apps/frontend-status/src/globals.d.ts +6 -0
- package/templates/apps/frontend-status/src/lib/status.ts +81 -0
- package/templates/apps/frontend-status/src/locales/de.ts +41 -0
- package/templates/apps/frontend-status/src/locales/en.ts +45 -0
- package/templates/apps/frontend-status/src/locales/index.ts +13 -0
- package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
- package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
- package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
- package/templates/apps/frontend-status/template.json +6 -0
- package/templates/apps/frontend-status/tsconfig.json +11 -0
- package/templates/baselines/compose/docker-compose.prod.yml +15 -0
- package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
- package/dist/apiBuild-BrjrVJJh.js +0 -2
- package/dist/dbCommand-DrzXimKf.js +0 -2
- package/dist/dev-DNkso403.js +0 -3
- package/dist/fileConventions-3bffWssN.js +0 -30
- package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
- package/dist/inspect-gt8bq-Tz.js +0 -2
- package/dist/manifestBuild-ifczArzr.js +0 -2
- package/dist/serveCommand-DfkisVWP.js +0 -1310
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { D as
|
|
1
|
+
import { B as e, E as t, G as n, I as r, K as i, N as a, O as o, Q as s, S as c, T as l, U as u, W as ee, Z as d, _ as te, _t as f, a as p, at as m, b as h, c as g, f as _, ft as v, g as y, gt as b, h as x, ht as ne, i as re, it as ie, lt as ae, m as S, mt as C, nt as oe, o as se, ot as w, p as T, q as E, r as D, rt as O, s as k, t as A, v as j, x as ce, y as M } from "./inspectMetrics-DHYygE4s.js";
|
|
2
|
+
import { D as le, E as ue, O as N, a as de, p as P, w as F } from "./inspect-BMvQpwqy.js";
|
|
3
3
|
import { t as fe } from "./bootTiming-BdyP9nYw.js";
|
|
4
|
-
import { dirname as
|
|
4
|
+
import { dirname as I, extname as pe, join as L, resolve as R } from "node:path";
|
|
5
5
|
import { fileURLToPath as z, pathToFileURL as B } from "node:url";
|
|
6
|
-
import { createLogger as V, printReadyBlock as
|
|
6
|
+
import { createLogger as V, printReadyBlock as me } from "@voltro/logger";
|
|
7
7
|
import { promises as H } from "node:fs";
|
|
8
|
-
import { snapshotMetricsSync as
|
|
9
|
-
import { createServer as
|
|
8
|
+
import { snapshotMetricsSync as he } from "@voltro/runtime";
|
|
9
|
+
import { createServer as ge } from "node:http";
|
|
10
10
|
//#region src/isrCdcInvalidator.ts
|
|
11
11
|
var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
|
|
12
12
|
let n = 0;
|
|
@@ -25,7 +25,7 @@ var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
|
|
|
25
25
|
user: process.env.PG_USER ?? "app",
|
|
26
26
|
password: process.env.PG_PASSWORD ?? "app",
|
|
27
27
|
database: process.env.PG_DATABASE ?? "app"
|
|
28
|
-
},
|
|
28
|
+
}, _e = (e) => {
|
|
29
29
|
let t = e.channel ?? "framework_changes", n = W(e), r = null, i = null;
|
|
30
30
|
return {
|
|
31
31
|
start: async () => {
|
|
@@ -69,7 +69,7 @@ var U = V({ scope: "voltro:start:cdc" }), W = (e) => (t) => {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
|
-
}, K = V({ scope: "voltro:start:isr-cache" }),
|
|
72
|
+
}, K = V({ scope: "voltro:start:isr-cache" }), q = "voltro_isr_cache", ve = (e) => `
|
|
73
73
|
CREATE TABLE IF NOT EXISTS ${e} (
|
|
74
74
|
cache_key TEXT PRIMARY KEY,
|
|
75
75
|
html TEXT NOT NULL,
|
|
@@ -80,9 +80,9 @@ CREATE TABLE IF NOT EXISTS ${e} (
|
|
|
80
80
|
stale_while_revalidate_ms BIGINT NOT NULL DEFAULT 0
|
|
81
81
|
);
|
|
82
82
|
CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
83
|
-
`,
|
|
84
|
-
let t = e.tableName ??
|
|
85
|
-
i || (i = !0, await n.query(
|
|
83
|
+
`, ye = (e) => {
|
|
84
|
+
let t = e.tableName ?? q, { client: n } = e, r = /* @__PURE__ */ new Map(), i = !1, a = (async () => {
|
|
85
|
+
i || (i = !0, await n.query(ve(t)));
|
|
86
86
|
})().then(async () => {
|
|
87
87
|
let e = await n.query(`SELECT * FROM ${t}`);
|
|
88
88
|
for (let t of e.rows) r.set(t.cache_key, {
|
|
@@ -142,14 +142,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
142
142
|
return Array.from(r.entries());
|
|
143
143
|
}
|
|
144
144
|
};
|
|
145
|
-
}, J = V({ scope: "voltro:start" }),
|
|
145
|
+
}, J = V({ scope: "voltro:start" }), be = await (async () => {
|
|
146
146
|
try {
|
|
147
|
-
let e = L(
|
|
147
|
+
let e = L(I(z(import.meta.url)), "..", "package.json"), t = await H.readFile(e, "utf8");
|
|
148
148
|
return JSON.parse(t).version ?? "0.0.0";
|
|
149
149
|
} catch {
|
|
150
150
|
return "0.0.0";
|
|
151
151
|
}
|
|
152
|
-
})(),
|
|
152
|
+
})(), Y = (e) => e instanceof Error && e._voltroControl === "redirect" && typeof e.location == "string", X = (e) => e instanceof Error && e._voltroControl === "not-found", Z = {
|
|
153
153
|
".html": "text/html; charset=utf-8",
|
|
154
154
|
".js": "application/javascript",
|
|
155
155
|
".mjs": "application/javascript",
|
|
@@ -167,13 +167,13 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
167
167
|
".woff": "font/woff",
|
|
168
168
|
".woff2": "font/woff2",
|
|
169
169
|
".txt": "text/plain; charset=utf-8"
|
|
170
|
-
}, xe = (e) =>
|
|
170
|
+
}, xe = (e) => Z[pe(e).toLowerCase()] ?? "application/octet-stream", Se = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), Q = async (e) => {
|
|
171
171
|
try {
|
|
172
172
|
return await H.stat(e), !0;
|
|
173
173
|
} catch {
|
|
174
174
|
return !1;
|
|
175
175
|
}
|
|
176
|
-
},
|
|
176
|
+
}, Ce = (e) => {
|
|
177
177
|
let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
|
|
178
178
|
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, "\\$&"));
|
|
179
179
|
let a = i.join("/");
|
|
@@ -182,8 +182,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
182
182
|
paramNames: t,
|
|
183
183
|
priority: n
|
|
184
184
|
};
|
|
185
|
-
},
|
|
186
|
-
let { regex: t, paramNames: n, priority: r } =
|
|
185
|
+
}, we = (e) => e.map((e) => {
|
|
186
|
+
let { regex: t, paramNames: n, priority: r } = Ce(e.pattern);
|
|
187
187
|
return {
|
|
188
188
|
pattern: e.pattern,
|
|
189
189
|
file: e.file,
|
|
@@ -192,7 +192,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
192
192
|
paramNames: n,
|
|
193
193
|
priority: r
|
|
194
194
|
};
|
|
195
|
-
}).slice().sort((e, t) => e.priority - t.priority),
|
|
195
|
+
}).slice().sort((e, t) => e.priority - t.priority), Te = (e, t) => {
|
|
196
196
|
for (let n of t) {
|
|
197
197
|
let t = n.regex.exec(e);
|
|
198
198
|
if (!t) continue;
|
|
@@ -204,92 +204,105 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
return null;
|
|
207
|
-
},
|
|
208
|
-
let { provider: t, route:
|
|
207
|
+
}, Ee = async (e) => {
|
|
208
|
+
let { provider: t, route: n, params: i, pathname: a, dirs: o, shellTemplate: s, requestHeaders: l, requestUrl: u = "", apiOrigin: ee, apiName: d } = e, { search: te } = c(u), f = re(ee, l.cookie, { apiName: d }), m = await t.getPage(n.pattern, n.file), g = r(m, n.file), _ = g === "spa" && se(o, n.dirChain).some((e) => e.hasLayout);
|
|
209
209
|
if (g !== "ssr" && g !== "isr" && !_) return null;
|
|
210
|
-
let
|
|
210
|
+
let v = se(o, n.dirChain), b = {}, ne = null, ie, ae = new AbortController();
|
|
211
211
|
try {
|
|
212
|
-
(await t.getHelpers()).beginStoreSeeds(), {chain: ie, segmentLoaderData:
|
|
213
|
-
entries:
|
|
212
|
+
(await t.getHelpers()).beginStoreSeeds(), {chain: ie, segmentLoaderData: b} = await p({
|
|
213
|
+
entries: v,
|
|
214
214
|
loadLayout: (e) => t.getLayout(e.dir),
|
|
215
215
|
loadError: (e) => t.getError(e.dir),
|
|
216
216
|
loadPending: (e) => t.getPending(e.dir),
|
|
217
217
|
ctx: {
|
|
218
218
|
params: i,
|
|
219
219
|
pathname: a,
|
|
220
|
-
search:
|
|
221
|
-
signal:
|
|
222
|
-
headers:
|
|
223
|
-
query:
|
|
220
|
+
search: te,
|
|
221
|
+
signal: ae.signal,
|
|
222
|
+
headers: l,
|
|
223
|
+
query: f
|
|
224
224
|
}
|
|
225
|
-
}), typeof
|
|
225
|
+
}), typeof m.loader == "function" && !_ && (ne = await m.loader({
|
|
226
226
|
params: i,
|
|
227
227
|
pathname: a,
|
|
228
|
-
search:
|
|
229
|
-
signal:
|
|
230
|
-
headers:
|
|
231
|
-
query:
|
|
228
|
+
search: te,
|
|
229
|
+
signal: ae.signal,
|
|
230
|
+
headers: l,
|
|
231
|
+
query: f
|
|
232
232
|
}));
|
|
233
233
|
} catch (e) {
|
|
234
|
-
if (
|
|
234
|
+
if (Y(e)) return {
|
|
235
235
|
control: "redirect",
|
|
236
236
|
status: e.status,
|
|
237
237
|
location: e.location
|
|
238
238
|
};
|
|
239
|
-
if (
|
|
239
|
+
if (X(e)) return { control: "not-found" };
|
|
240
240
|
throw e;
|
|
241
241
|
}
|
|
242
|
-
let
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
242
|
+
let C = await t.getHelpers();
|
|
243
|
+
_ || await S({
|
|
244
|
+
pageMod: m,
|
|
245
|
+
params: i,
|
|
246
|
+
query: f,
|
|
247
|
+
apiName: d,
|
|
248
|
+
seed: C.seedPreloadedSubscription,
|
|
249
|
+
onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
|
|
250
|
+
tag: e,
|
|
251
|
+
apiName: t,
|
|
252
|
+
pathname: a
|
|
253
|
+
}, n)
|
|
254
|
+
});
|
|
255
|
+
let oe = {
|
|
256
|
+
pattern: n.pattern,
|
|
257
|
+
Component: m.default,
|
|
258
|
+
meta: m.meta,
|
|
259
|
+
loader: m.loader,
|
|
260
|
+
ErrorBoundary: m.ErrorBoundary,
|
|
261
|
+
Pending: m.Pending,
|
|
249
262
|
renderMode: g,
|
|
250
263
|
chain: ie
|
|
251
264
|
}, T = {
|
|
252
|
-
cookies:
|
|
253
|
-
headers:
|
|
254
|
-
url:
|
|
255
|
-
},
|
|
265
|
+
cookies: C.parseCookieHeader(l.cookie),
|
|
266
|
+
headers: l,
|
|
267
|
+
url: u
|
|
268
|
+
}, E = C.i18n?.resolve(l.cookie, l["accept-language"]), D = m.interactive ?? "full";
|
|
256
269
|
if (_) {
|
|
257
|
-
let e =
|
|
258
|
-
helpers:
|
|
259
|
-
page:
|
|
260
|
-
interactive:
|
|
270
|
+
let e = M({
|
|
271
|
+
helpers: C,
|
|
272
|
+
page: n.pattern,
|
|
273
|
+
interactive: D,
|
|
261
274
|
delivery: "stream",
|
|
262
275
|
renderInput: {
|
|
263
|
-
descriptor:
|
|
276
|
+
descriptor: oe,
|
|
264
277
|
params: i,
|
|
265
278
|
pathname: a,
|
|
266
|
-
segmentLoaderData:
|
|
279
|
+
segmentLoaderData: b,
|
|
267
280
|
requestContext: T,
|
|
268
|
-
...
|
|
269
|
-
outerWrap:
|
|
270
|
-
locale:
|
|
281
|
+
...E ? {
|
|
282
|
+
outerWrap: E.outerWrap,
|
|
283
|
+
locale: E.locale
|
|
271
284
|
} : {}
|
|
272
285
|
}
|
|
273
|
-
}), t =
|
|
274
|
-
helpers:
|
|
286
|
+
}), t = E?.locale ?? T.cookies["voltro:lang"] ?? "en", r = (t) => ce({
|
|
287
|
+
helpers: C,
|
|
275
288
|
prepared: e,
|
|
276
289
|
meta: t,
|
|
277
|
-
interactive:
|
|
290
|
+
interactive: D
|
|
278
291
|
});
|
|
279
292
|
if (e.hasDeferred) {
|
|
280
|
-
let
|
|
293
|
+
let n = x({ shell: s });
|
|
281
294
|
return {
|
|
282
295
|
renderMode: "spa",
|
|
283
|
-
stream: (i) =>
|
|
296
|
+
stream: (i) => y({
|
|
284
297
|
res: i,
|
|
285
|
-
shell:
|
|
298
|
+
shell: n,
|
|
286
299
|
htmlLang: t,
|
|
287
300
|
headers: {
|
|
288
301
|
"content-type": "text/html; charset=utf-8",
|
|
289
302
|
"x-voltro-rendered-by": "spa"
|
|
290
303
|
},
|
|
291
|
-
headInjection:
|
|
292
|
-
render: (t) =>
|
|
304
|
+
headInjection: r,
|
|
305
|
+
render: (t) => C.renderPageToStream({
|
|
293
306
|
...e.renderInput,
|
|
294
307
|
...t
|
|
295
308
|
}),
|
|
@@ -299,47 +312,47 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
299
312
|
})
|
|
300
313
|
};
|
|
301
314
|
}
|
|
302
|
-
let o =
|
|
303
|
-
helpers:
|
|
315
|
+
let o = h({
|
|
316
|
+
helpers: C,
|
|
304
317
|
prepared: e
|
|
305
318
|
});
|
|
306
319
|
return {
|
|
307
|
-
html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${
|
|
320
|
+
html: s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`).replace("</head>", ` ${r(o.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
|
|
308
321
|
renderMode: "spa",
|
|
309
322
|
revalidateMs: null
|
|
310
323
|
};
|
|
311
324
|
}
|
|
312
|
-
let
|
|
313
|
-
helpers:
|
|
314
|
-
page:
|
|
325
|
+
let O = j({
|
|
326
|
+
helpers: C,
|
|
327
|
+
page: n.pattern,
|
|
315
328
|
pathname: a,
|
|
316
329
|
renderMode: g,
|
|
317
|
-
interactive:
|
|
318
|
-
loaderData:
|
|
319
|
-
segmentLoaderData:
|
|
320
|
-
pageLoaderRan: typeof
|
|
321
|
-
}),
|
|
322
|
-
descriptor:
|
|
330
|
+
interactive: D,
|
|
331
|
+
loaderData: ne,
|
|
332
|
+
segmentLoaderData: b,
|
|
333
|
+
pageLoaderRan: typeof m.loader == "function"
|
|
334
|
+
}), k = {
|
|
335
|
+
descriptor: oe,
|
|
323
336
|
params: i,
|
|
324
337
|
pathname: a,
|
|
325
|
-
loaderData:
|
|
326
|
-
segmentLoaderData:
|
|
338
|
+
loaderData: O.loaderData,
|
|
339
|
+
segmentLoaderData: O.segmentLoaderData,
|
|
327
340
|
requestContext: T,
|
|
328
|
-
...
|
|
329
|
-
outerWrap:
|
|
330
|
-
locale:
|
|
341
|
+
...E ? {
|
|
342
|
+
outerWrap: E.outerWrap,
|
|
343
|
+
locale: E.locale
|
|
331
344
|
} : {}
|
|
332
|
-
},
|
|
333
|
-
|
|
334
|
-
`<meta name="voltro-interactive" content="${
|
|
335
|
-
...
|
|
336
|
-
|
|
345
|
+
}, A = (e) => [
|
|
346
|
+
C.renderMetaToHtml(e),
|
|
347
|
+
`<meta name="voltro-interactive" content="${D}" />`,
|
|
348
|
+
...O.hasDeferred ? [C.renderDeferredRegistryScript()] : [],
|
|
349
|
+
C.renderRouterStateScript(O.stateInput)
|
|
337
350
|
].filter((e) => e.length > 0).join("\n ");
|
|
338
|
-
if (g === "ssr" &&
|
|
339
|
-
let e =
|
|
351
|
+
if (g === "ssr" && D === "full" && e.buffered !== !0) {
|
|
352
|
+
let e = E?.locale ?? T.cookies["voltro:lang"] ?? "en", t = x({ shell: s });
|
|
340
353
|
return {
|
|
341
354
|
renderMode: "ssr",
|
|
342
|
-
stream: (n) =>
|
|
355
|
+
stream: (n) => y({
|
|
343
356
|
res: n,
|
|
344
357
|
shell: t,
|
|
345
358
|
htmlLang: e,
|
|
@@ -347,9 +360,9 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
347
360
|
"content-type": "text/html; charset=utf-8",
|
|
348
361
|
"x-voltro-rendered-by": "ssr"
|
|
349
362
|
},
|
|
350
|
-
headInjection:
|
|
351
|
-
render: (e) =>
|
|
352
|
-
...
|
|
363
|
+
headInjection: A,
|
|
364
|
+
render: (e) => C.renderPageToStream({
|
|
365
|
+
...k,
|
|
353
366
|
...e
|
|
354
367
|
}),
|
|
355
368
|
onShellError: (e) => {
|
|
@@ -358,15 +371,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
358
371
|
})
|
|
359
372
|
};
|
|
360
373
|
}
|
|
361
|
-
let { html:
|
|
362
|
-
|
|
363
|
-
let
|
|
374
|
+
let { html: le, meta: ue } = C.renderPageToHtml(k), N = A(ue), de = E?.locale ?? T.cookies["voltro:lang"] ?? "en", P = s.replace("<div id=\"root\"></div>", `<div id="root">${le}</div>`).replace("</head>", ` ${N}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${de}"`);
|
|
375
|
+
D === "none" && (P = Se(P));
|
|
376
|
+
let F = g === "isr" ? w(m.revalidate) : null;
|
|
364
377
|
return {
|
|
365
|
-
html:
|
|
378
|
+
html: P,
|
|
366
379
|
renderMode: g,
|
|
367
|
-
revalidateMs:
|
|
380
|
+
revalidateMs: F
|
|
368
381
|
};
|
|
369
|
-
}, $ = (e) => e === "" ? "/" : e,
|
|
382
|
+
}, $ = (e) => e === "" ? "/" : e, De = async (e) => {
|
|
370
383
|
let t = await import(B(e).href);
|
|
371
384
|
return {
|
|
372
385
|
kind: "bundle",
|
|
@@ -396,8 +409,8 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
396
409
|
},
|
|
397
410
|
async close() {}
|
|
398
411
|
};
|
|
399
|
-
},
|
|
400
|
-
let n = await
|
|
412
|
+
}, Oe = async (e, t) => {
|
|
413
|
+
let n = await v("vite", () => import("vite")), r = (await import("@vitejs/plugin-react")).default, i = (await import("@tailwindcss/vite")).default, a = await n.createServer({
|
|
401
414
|
root: t,
|
|
402
415
|
envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
|
|
403
416
|
plugins: [r(), i()],
|
|
@@ -409,19 +422,19 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
409
422
|
},
|
|
410
423
|
appType: "custom",
|
|
411
424
|
logLevel: "warn"
|
|
412
|
-
}),
|
|
413
|
-
limit:
|
|
425
|
+
}), o = L(e, "src", "pages"), c = (e) => e === "" ? o : L(o, e), l = d({
|
|
426
|
+
limit: s(),
|
|
414
427
|
onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
|
|
415
428
|
onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
|
|
416
429
|
id: e,
|
|
417
430
|
ms: t,
|
|
418
431
|
...n ? { failed: !0 } : {}
|
|
419
432
|
})
|
|
420
|
-
}), u = (e) => l.load(e, async () => await
|
|
433
|
+
}), u = (e) => l.load(e, async () => await a.ssrLoadModule(e));
|
|
421
434
|
return {
|
|
422
435
|
kind: "middleware",
|
|
423
436
|
async getPage(e, t) {
|
|
424
|
-
return u(L(
|
|
437
|
+
return u(L(o, t));
|
|
425
438
|
},
|
|
426
439
|
async getLayout(e) {
|
|
427
440
|
return u(L(c(e), "layout.tsx"));
|
|
@@ -436,78 +449,78 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
436
449
|
return await u("@voltro/web/ssr");
|
|
437
450
|
},
|
|
438
451
|
async close() {
|
|
439
|
-
await
|
|
452
|
+
await a.close();
|
|
440
453
|
}
|
|
441
454
|
};
|
|
442
|
-
},
|
|
443
|
-
let
|
|
444
|
-
if (!
|
|
455
|
+
}, ke = async (r) => {
|
|
456
|
+
let s = fe(), c = await k(r);
|
|
457
|
+
if (!c) return {
|
|
445
458
|
ran: !1,
|
|
446
459
|
exitCode: 0
|
|
447
460
|
};
|
|
448
|
-
if (
|
|
461
|
+
if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
|
|
449
462
|
ran: !0,
|
|
450
463
|
exitCode: 1
|
|
451
464
|
};
|
|
452
|
-
let { resolved:
|
|
453
|
-
rawEnv:
|
|
465
|
+
let { resolved: d } = await ae({
|
|
466
|
+
rawEnv: c.env,
|
|
454
467
|
appType: "web",
|
|
455
|
-
root:
|
|
468
|
+
root: r,
|
|
456
469
|
log: J,
|
|
457
470
|
generateTypes: !1
|
|
458
|
-
}),
|
|
459
|
-
|
|
460
|
-
let
|
|
461
|
-
|
|
471
|
+
}), p = d.publicValues;
|
|
472
|
+
s.mark("config");
|
|
473
|
+
let h = i();
|
|
474
|
+
u(h), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
|
|
462
475
|
let v = (() => {
|
|
463
476
|
if (process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT) return Number(process.env.VOLTRO_DASHBOARD_PORT);
|
|
464
477
|
if (process.env.PORT) {
|
|
465
478
|
let e = Number(process.env.PORT);
|
|
466
479
|
if (Number.isFinite(e) && e > 0) return e;
|
|
467
480
|
}
|
|
468
|
-
return
|
|
469
|
-
})(),
|
|
470
|
-
if (!await Q(
|
|
481
|
+
return c.port ?? 5173;
|
|
482
|
+
})(), y = L(r, ".framework"), x = L(y, "dist"), re = L(x, "index.html");
|
|
483
|
+
if (!await Q(re)) return J.error("no built dist found — run `voltro build` first", { distDir: x }), {
|
|
471
484
|
ran: !0,
|
|
472
485
|
exitCode: 1
|
|
473
486
|
};
|
|
474
|
-
let
|
|
475
|
-
await
|
|
476
|
-
id:
|
|
477
|
-
name:
|
|
487
|
+
let S = c.name ?? "unnamed", w = C("web", S, v), j = o(S);
|
|
488
|
+
await f({
|
|
489
|
+
id: w,
|
|
490
|
+
name: S,
|
|
478
491
|
kind: "web",
|
|
479
492
|
url: `http://localhost:${v}`,
|
|
480
493
|
pid: process.pid,
|
|
481
494
|
status: "booting",
|
|
482
|
-
logFile:
|
|
495
|
+
logFile: j.path
|
|
483
496
|
}).catch(() => {});
|
|
484
|
-
let
|
|
485
|
-
process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (
|
|
497
|
+
let ce = L(x, "_voltro", "shell.html"), M = await Q(ce) ? await H.readFile(ce, "utf8") : await H.readFile(re, "utf8"), I = await g(r, c), pe = D(I[0]), R = I[0]?.name, z, B = null;
|
|
498
|
+
process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (B = new (await (import("pg"))).default.Client({
|
|
486
499
|
host: process.env.PG_HOST,
|
|
487
500
|
port: Number(process.env.PG_PORT ?? 5432),
|
|
488
501
|
user: process.env.PG_USER ?? "app",
|
|
489
502
|
password: process.env.PG_PASSWORD ?? "app",
|
|
490
503
|
database: process.env.PG_DATABASE ?? "app"
|
|
491
|
-
}), await
|
|
492
|
-
let { pages:
|
|
493
|
-
|
|
494
|
-
let
|
|
495
|
-
if (!
|
|
496
|
-
let q =
|
|
504
|
+
}), await B.connect(), z = ye({ client: B }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = m(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await T(r, c, I, p);
|
|
505
|
+
let { pages: V, dirs: U } = await _(L(r, "src", "pages")), W = we(V);
|
|
506
|
+
s.mark("scan");
|
|
507
|
+
let G = L(x, "server", "ssrEntry.js"), K = await Q(G);
|
|
508
|
+
if (!K && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${G} 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 ${G}`);
|
|
509
|
+
let q = K ? await De(G) : await Oe(r, y);
|
|
497
510
|
J.info(`ssr loader: ${q.kind}`, {
|
|
498
511
|
kind: q.kind,
|
|
499
512
|
...q.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
|
|
500
|
-
}),
|
|
501
|
-
let
|
|
502
|
-
for (let e of
|
|
503
|
-
let t =
|
|
513
|
+
}), s.mark("provider");
|
|
514
|
+
let ve = q.getPageMeta?.(), Y = /* @__PURE__ */ new Map(), X = 0;
|
|
515
|
+
for (let e of V) {
|
|
516
|
+
let t = ve?.[e.pattern];
|
|
504
517
|
if (t) {
|
|
505
518
|
Y.set(e.pattern, t);
|
|
506
519
|
continue;
|
|
507
520
|
}
|
|
508
521
|
try {
|
|
509
522
|
let t = await q.getPage(e.pattern, e.file);
|
|
510
|
-
Y.set(e.pattern,
|
|
523
|
+
Y.set(e.pattern, a(t, e.file)), X++;
|
|
511
524
|
} catch (t) {
|
|
512
525
|
J.warn("failed to load page metadata", { pattern: e.pattern }, t);
|
|
513
526
|
}
|
|
@@ -516,21 +529,21 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
516
529
|
count: Y.size,
|
|
517
530
|
fromManifest: Y.size - X,
|
|
518
531
|
fromModules: X
|
|
519
|
-
}),
|
|
532
|
+
}), s.mark("routes");
|
|
520
533
|
let Z = /* @__PURE__ */ new Set();
|
|
521
|
-
for (let e of
|
|
534
|
+
for (let e of W) Y.get(e.pattern)?.renderMode === "spa" && se(U, e.dirChain).some((e) => e.hasLayout) && Z.add(e.pattern);
|
|
522
535
|
Z.size > 0 && J.info(`${Z.size} spa route(s) render an SSR layout shell`, { patterns: [...Z] });
|
|
523
536
|
let Se = /* @__PURE__ */ new Map();
|
|
524
537
|
for (let [e, t] of Y) t.cacheInvalidatesOn.length > 0 && Se.set(e, t.cacheInvalidatesOn);
|
|
525
|
-
let
|
|
526
|
-
for (let e of
|
|
527
|
-
let
|
|
528
|
-
cache:
|
|
538
|
+
let Ce = /* @__PURE__ */ new Map();
|
|
539
|
+
for (let e of W) Ce.set(e.pattern, e.regex);
|
|
540
|
+
let $ = _e({
|
|
541
|
+
cache: z,
|
|
529
542
|
tableSubscriptionsByPattern: Se,
|
|
530
|
-
regexByPattern:
|
|
543
|
+
regexByPattern: Ce
|
|
531
544
|
});
|
|
532
|
-
await
|
|
533
|
-
let ke =
|
|
545
|
+
await $.start(), s.mark("cdc");
|
|
546
|
+
let ke = A(), Ae = V.map((e) => {
|
|
534
547
|
let t = Y.get(e.pattern);
|
|
535
548
|
return {
|
|
536
549
|
pattern: e.pattern,
|
|
@@ -546,20 +559,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
546
559
|
hasMeta: t?.hasMeta ?? !1,
|
|
547
560
|
hasGetStaticPaths: t?.hasGetStaticPaths ?? !1
|
|
548
561
|
};
|
|
549
|
-
}), je =
|
|
562
|
+
}), je = U.map((e) => ({
|
|
550
563
|
dir: e.dir,
|
|
551
564
|
hasLayout: e.hasLayout,
|
|
552
565
|
hasError: e.hasError,
|
|
553
566
|
hasPending: e.hasPending,
|
|
554
567
|
hasNotFound: e.hasNotFound
|
|
555
|
-
})), Me =
|
|
568
|
+
})), Me = B ? "postgres" : "memory", Ne = {
|
|
556
569
|
kind: "web",
|
|
557
570
|
meta: {
|
|
558
|
-
name:
|
|
559
|
-
voltroVersion:
|
|
571
|
+
name: c.name ?? "(unnamed)",
|
|
572
|
+
voltroVersion: be,
|
|
560
573
|
port: v,
|
|
561
574
|
mode: "start",
|
|
562
|
-
apis: Object.entries(
|
|
575
|
+
apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
|
|
563
576
|
let n = {
|
|
564
577
|
name: e,
|
|
565
578
|
package: t.package
|
|
@@ -570,7 +583,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
570
583
|
routes: Ae,
|
|
571
584
|
dirs: je,
|
|
572
585
|
cache: () => {
|
|
573
|
-
let e = Date.now(), t =
|
|
586
|
+
let e = Date.now(), t = z.snapshot().map(([t, n]) => ({
|
|
574
587
|
key: t,
|
|
575
588
|
renderedAt: n.renderedAt,
|
|
576
589
|
expiresAt: n.expiresAt,
|
|
@@ -582,15 +595,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
582
595
|
}));
|
|
583
596
|
return {
|
|
584
597
|
backend: Me,
|
|
585
|
-
size:
|
|
598
|
+
size: z.size(),
|
|
586
599
|
entries: t
|
|
587
600
|
};
|
|
588
601
|
},
|
|
589
|
-
metrics: () =>
|
|
590
|
-
}, Pe = async (t,
|
|
602
|
+
metrics: () => he()
|
|
603
|
+
}, Pe = async (t, n) => {
|
|
591
604
|
let i = t.split("?")[0] ?? "/";
|
|
592
|
-
if (
|
|
593
|
-
let e = await
|
|
605
|
+
if (c.name === "voltroDashboard" && i === "/api/dashboard/registry") try {
|
|
606
|
+
let e = await ne();
|
|
594
607
|
return {
|
|
595
608
|
status: 200,
|
|
596
609
|
headers: { "content-type": "application/json; charset=utf-8" },
|
|
@@ -603,7 +616,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
603
616
|
body: `registry read error: ${e.message}`
|
|
604
617
|
};
|
|
605
618
|
}
|
|
606
|
-
if (
|
|
619
|
+
if (c.name === "voltroDashboard" && i === "/api/dashboard/config") {
|
|
607
620
|
let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
|
|
608
621
|
if (e && e.trim().length > 0) {
|
|
609
622
|
let n;
|
|
@@ -633,18 +646,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
633
646
|
};
|
|
634
647
|
}
|
|
635
648
|
if (i === "/_voltro/inspect/logs") {
|
|
636
|
-
let
|
|
649
|
+
let r = e(t, ee(), n);
|
|
637
650
|
return {
|
|
638
|
-
status:
|
|
651
|
+
status: r.status,
|
|
639
652
|
headers: {
|
|
640
|
-
"content-type":
|
|
641
|
-
...
|
|
653
|
+
"content-type": r.contentType,
|
|
654
|
+
...F(n.origin)
|
|
642
655
|
},
|
|
643
|
-
body:
|
|
656
|
+
body: r.body
|
|
644
657
|
};
|
|
645
658
|
}
|
|
646
659
|
if (i !== "/_voltro/inspect/stream") {
|
|
647
|
-
let e =
|
|
660
|
+
let e = P(t, Ne, n);
|
|
648
661
|
if (e !== null) return {
|
|
649
662
|
status: e.status,
|
|
650
663
|
headers: {
|
|
@@ -654,14 +667,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
654
667
|
body: e.body
|
|
655
668
|
};
|
|
656
669
|
}
|
|
657
|
-
let a =
|
|
658
|
-
if (!s && await Q(
|
|
670
|
+
let a = Te(i, W), o = a ? Y.get(a.route.pattern)?.renderMode : void 0, s = o === "ssr" || o === "isr" || (a ? Z.has(a.route.pattern) : !1), l = i === "/" ? L(x, "index.html") : L(x, i.replace(/^\//, ""), "index.html");
|
|
671
|
+
if (!s && await Q(l)) return {
|
|
659
672
|
status: 200,
|
|
660
673
|
headers: { "content-type": "text/html; charset=utf-8" },
|
|
661
|
-
body: await H.readFile(
|
|
674
|
+
body: await H.readFile(l)
|
|
662
675
|
};
|
|
663
676
|
if (/\.[a-z0-9]+$/i.test(i)) {
|
|
664
|
-
let e = L(
|
|
677
|
+
let e = L(x, i.replace(/^\//, ""));
|
|
665
678
|
if (await Q(e)) {
|
|
666
679
|
let t = await H.readFile(e);
|
|
667
680
|
return {
|
|
@@ -671,20 +684,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
671
684
|
};
|
|
672
685
|
}
|
|
673
686
|
}
|
|
674
|
-
let u =
|
|
687
|
+
let u = Te(i, W);
|
|
675
688
|
if (!u) return {
|
|
676
689
|
status: 404,
|
|
677
690
|
headers: { "content-type": "text/plain" },
|
|
678
691
|
body: "not found"
|
|
679
692
|
};
|
|
680
|
-
let
|
|
681
|
-
...
|
|
693
|
+
let d = Y.get(u.route.pattern), f = n["x-tenant"] ?? "anonymous", p = (await q.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, m = oe(i, {
|
|
694
|
+
...d?.tenantAware ? { tenant: f } : {},
|
|
682
695
|
...p ? { locale: p } : {}
|
|
683
|
-
}), g =
|
|
684
|
-
if (g &&
|
|
696
|
+
}), g = z.get(m), _ = Date.now();
|
|
697
|
+
if (g && O(g, _)) return h.emit("cache", {
|
|
685
698
|
kind: "HIT",
|
|
686
699
|
key: m,
|
|
687
|
-
ageMs:
|
|
700
|
+
ageMs: _ - g.renderedAt
|
|
688
701
|
}), {
|
|
689
702
|
status: 200,
|
|
690
703
|
headers: {
|
|
@@ -692,33 +705,33 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
692
705
|
"x-voltro-rendered-by": "isr",
|
|
693
706
|
"x-voltro-cache": "HIT",
|
|
694
707
|
"x-voltro-cache-key": m,
|
|
695
|
-
"x-voltro-cache-age-ms": String(
|
|
708
|
+
"x-voltro-cache-age-ms": String(_ - g.renderedAt)
|
|
696
709
|
},
|
|
697
710
|
body: g.html
|
|
698
711
|
};
|
|
699
|
-
if (g &&
|
|
712
|
+
if (g && ie(g, _)) return h.emit("cache", {
|
|
700
713
|
kind: "STALE",
|
|
701
714
|
key: m,
|
|
702
|
-
ageMs:
|
|
715
|
+
ageMs: _ - g.renderedAt
|
|
703
716
|
}), (async () => {
|
|
704
717
|
try {
|
|
705
|
-
let e = await
|
|
718
|
+
let e = await Ee({
|
|
706
719
|
provider: q,
|
|
707
|
-
root:
|
|
720
|
+
root: r,
|
|
708
721
|
route: u.route,
|
|
709
722
|
params: u.params,
|
|
710
723
|
pathname: i,
|
|
711
|
-
dirs:
|
|
712
|
-
shellTemplate:
|
|
713
|
-
requestHeaders:
|
|
714
|
-
apiOrigin:
|
|
715
|
-
apiName:
|
|
724
|
+
dirs: U,
|
|
725
|
+
shellTemplate: M,
|
|
726
|
+
requestHeaders: n,
|
|
727
|
+
apiOrigin: pe,
|
|
728
|
+
apiName: R,
|
|
716
729
|
requestUrl: t,
|
|
717
730
|
buffered: !0
|
|
718
731
|
});
|
|
719
732
|
if (e && "html" in e && e.renderMode === "isr" && e.revalidateMs !== null) {
|
|
720
733
|
let t = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0, n = Date.now();
|
|
721
|
-
|
|
734
|
+
z.set(m, {
|
|
722
735
|
html: e.html,
|
|
723
736
|
renderedAt: n,
|
|
724
737
|
expiresAt: n + e.revalidateMs,
|
|
@@ -737,22 +750,22 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
737
750
|
"x-voltro-rendered-by": "isr",
|
|
738
751
|
"x-voltro-cache": "STALE",
|
|
739
752
|
"x-voltro-cache-key": m,
|
|
740
|
-
"x-voltro-cache-age-ms": String(
|
|
753
|
+
"x-voltro-cache-age-ms": String(_ - g.renderedAt)
|
|
741
754
|
},
|
|
742
755
|
body: g.html
|
|
743
756
|
};
|
|
744
757
|
try {
|
|
745
|
-
let e = await
|
|
758
|
+
let e = await Ee({
|
|
746
759
|
provider: q,
|
|
747
|
-
root:
|
|
760
|
+
root: r,
|
|
748
761
|
route: u.route,
|
|
749
762
|
params: u.params,
|
|
750
763
|
pathname: i,
|
|
751
|
-
dirs:
|
|
752
|
-
shellTemplate:
|
|
753
|
-
requestHeaders:
|
|
754
|
-
apiOrigin:
|
|
755
|
-
apiName:
|
|
764
|
+
dirs: U,
|
|
765
|
+
shellTemplate: M,
|
|
766
|
+
requestHeaders: n,
|
|
767
|
+
apiOrigin: pe,
|
|
768
|
+
apiName: R,
|
|
756
769
|
requestUrl: t
|
|
757
770
|
});
|
|
758
771
|
if (!e) return {
|
|
@@ -761,7 +774,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
761
774
|
"content-type": "text/html; charset=utf-8",
|
|
762
775
|
"x-voltro-rendered-by": "spa-fallback"
|
|
763
776
|
},
|
|
764
|
-
body:
|
|
777
|
+
body: M
|
|
765
778
|
};
|
|
766
779
|
if ("stream" in e) return {
|
|
767
780
|
status: 200,
|
|
@@ -790,20 +803,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
790
803
|
};
|
|
791
804
|
if (e.renderMode === "isr" && e.revalidateMs !== null) {
|
|
792
805
|
let t = Date.now(), n = Y.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0;
|
|
793
|
-
|
|
806
|
+
z.set(m, {
|
|
794
807
|
html: e.html,
|
|
795
808
|
renderedAt: t,
|
|
796
809
|
expiresAt: t + e.revalidateMs,
|
|
797
810
|
servableUntil: t + e.revalidateMs + n,
|
|
798
811
|
revalidateMs: e.revalidateMs,
|
|
799
812
|
staleWhileRevalidateMs: n
|
|
800
|
-
}), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = m, a["x-voltro-cache-revalidate-ms"] = String(e.revalidateMs), n > 0 && (a["x-voltro-cache-swr-ms"] = String(n)),
|
|
813
|
+
}), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = m, a["x-voltro-cache-revalidate-ms"] = String(e.revalidateMs), n > 0 && (a["x-voltro-cache-swr-ms"] = String(n)), h.emit("cache", {
|
|
801
814
|
kind: "MISS",
|
|
802
815
|
key: m,
|
|
803
816
|
revalidateMs: e.revalidateMs,
|
|
804
817
|
swrMs: n
|
|
805
818
|
});
|
|
806
|
-
} else e.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS",
|
|
819
|
+
} else e.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", h.emit("cache", {
|
|
807
820
|
kind: "BYPASS",
|
|
808
821
|
key: m
|
|
809
822
|
}));
|
|
@@ -813,7 +826,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
813
826
|
body: e.html
|
|
814
827
|
};
|
|
815
828
|
} catch (e) {
|
|
816
|
-
return J.error("render error", { url: i }, e),
|
|
829
|
+
return J.error("render error", { url: i }, e), te(e) ? {
|
|
817
830
|
status: 500,
|
|
818
831
|
headers: {
|
|
819
832
|
"content-type": "text/plain; charset=utf-8",
|
|
@@ -826,18 +839,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
826
839
|
body: "server error"
|
|
827
840
|
};
|
|
828
841
|
}
|
|
829
|
-
}, Fe = !1, Ie =
|
|
830
|
-
let
|
|
831
|
-
for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (
|
|
832
|
-
let
|
|
833
|
-
if (
|
|
842
|
+
}, Fe = !1, Ie = ge(async (e, t) => {
|
|
843
|
+
let r = e.url ?? "/", i = Date.now(), a = {};
|
|
844
|
+
for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (a[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
|
|
845
|
+
let o = r.split("?")[0] ?? "/", s = (e.method ?? "GET").toUpperCase();
|
|
846
|
+
if (o === "/internal/liveness") {
|
|
834
847
|
t.writeHead(200, {
|
|
835
848
|
"content-type": "text/plain",
|
|
836
849
|
"cache-control": "no-store"
|
|
837
850
|
}), t.end("ok");
|
|
838
851
|
return;
|
|
839
852
|
}
|
|
840
|
-
if (
|
|
853
|
+
if (o === "/internal/readiness") {
|
|
841
854
|
let e = Fe ? 200 : 503;
|
|
842
855
|
t.writeHead(e, {
|
|
843
856
|
"content-type": "text/plain",
|
|
@@ -845,36 +858,36 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
845
858
|
}), t.end(Fe ? "ready" : "not-ready");
|
|
846
859
|
return;
|
|
847
860
|
}
|
|
848
|
-
if (s === "OPTIONS" &&
|
|
849
|
-
let e =
|
|
861
|
+
if (s === "OPTIONS" && o.startsWith("/_voltro/inspect")) {
|
|
862
|
+
let e = F(a.origin);
|
|
850
863
|
t.writeHead(204, e), t.end();
|
|
851
864
|
return;
|
|
852
865
|
}
|
|
853
|
-
if (
|
|
854
|
-
let
|
|
855
|
-
if (!
|
|
866
|
+
if (c.name === "voltroDashboard" && o === "/api/dashboard/proxy") {
|
|
867
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
868
|
+
if (!n) {
|
|
856
869
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
857
870
|
return;
|
|
858
871
|
}
|
|
859
|
-
if (!ue(
|
|
872
|
+
if (!ue(n)) {
|
|
860
873
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
861
874
|
return;
|
|
862
875
|
}
|
|
863
876
|
try {
|
|
864
|
-
let
|
|
865
|
-
|
|
877
|
+
let r = { accept: a.accept ?? "application/json" }, i = a.authorization;
|
|
878
|
+
i ? r.authorization = Array.isArray(i) ? i[0] : i : N(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
|
|
866
879
|
let o;
|
|
867
880
|
if (s && s !== "GET" && s !== "HEAD") {
|
|
868
881
|
let t = [];
|
|
869
882
|
for await (let n of e) t.push(n);
|
|
870
883
|
o = Buffer.concat(t);
|
|
871
|
-
let
|
|
872
|
-
|
|
884
|
+
let n = a["content-type"];
|
|
885
|
+
n && (r["content-type"] = Array.isArray(n) ? n[0] : n);
|
|
873
886
|
}
|
|
874
|
-
let c = await fetch(
|
|
887
|
+
let c = await fetch(n, {
|
|
875
888
|
redirect: "manual",
|
|
876
889
|
method: s,
|
|
877
|
-
headers:
|
|
890
|
+
headers: r,
|
|
878
891
|
...o ? { body: new Uint8Array(o.buffer, o.byteOffset, o.byteLength) } : {}
|
|
879
892
|
}), l = Buffer.from(await c.arrayBuffer());
|
|
880
893
|
t.writeHead(c.status, {
|
|
@@ -886,30 +899,30 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
886
899
|
}
|
|
887
900
|
return;
|
|
888
901
|
}
|
|
889
|
-
if (
|
|
890
|
-
let
|
|
891
|
-
if (!
|
|
902
|
+
if (c.name === "voltroDashboard" && o === "/api/dashboard/proxy/stream") {
|
|
903
|
+
let n = new URL(r, "http://x").searchParams.get("target");
|
|
904
|
+
if (!n) {
|
|
892
905
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
|
|
893
906
|
return;
|
|
894
907
|
}
|
|
895
|
-
if (!ue(
|
|
908
|
+
if (!ue(n)) {
|
|
896
909
|
t.writeHead(400, { "content-type": "text/plain" }), t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
|
|
897
910
|
return;
|
|
898
911
|
}
|
|
899
|
-
let
|
|
900
|
-
e.on("close", () =>
|
|
912
|
+
let i = new AbortController();
|
|
913
|
+
e.on("close", () => i.abort()), t.on("close", () => i.abort());
|
|
901
914
|
try {
|
|
902
|
-
let e =
|
|
915
|
+
let e = a.authorization ?? (N(n) && process.env.VOLTRO_INSPECT_TOKEN ? `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` : void 0), r = await fetch(n, {
|
|
903
916
|
redirect: "manual",
|
|
904
917
|
method: "GET",
|
|
905
918
|
headers: {
|
|
906
919
|
accept: "text/event-stream",
|
|
907
920
|
...e ? { authorization: Array.isArray(e) ? e[0] : e } : {}
|
|
908
921
|
},
|
|
909
|
-
signal:
|
|
922
|
+
signal: i.signal
|
|
910
923
|
});
|
|
911
|
-
if (!
|
|
912
|
-
t.writeHead(
|
|
924
|
+
if (!r.ok || !r.body) {
|
|
925
|
+
t.writeHead(r.status, { "content-type": "text/plain" }), t.end(`upstream ${r.status}`);
|
|
913
926
|
return;
|
|
914
927
|
}
|
|
915
928
|
t.writeHead(200, {
|
|
@@ -918,7 +931,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
918
931
|
connection: "keep-alive",
|
|
919
932
|
"x-accel-buffering": "no"
|
|
920
933
|
}), t.flushHeaders();
|
|
921
|
-
let o =
|
|
934
|
+
let o = r.body.getReader();
|
|
922
935
|
try {
|
|
923
936
|
for (;;) {
|
|
924
937
|
let { done: e, value: n } = await o.read();
|
|
@@ -933,23 +946,23 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
933
946
|
}
|
|
934
947
|
return;
|
|
935
948
|
}
|
|
936
|
-
if (
|
|
937
|
-
let
|
|
949
|
+
if (o === "/_voltro/inspect/stream") {
|
|
950
|
+
let r = F(a.origin);
|
|
938
951
|
if (le()) {
|
|
939
952
|
t.writeHead(503, {
|
|
940
953
|
"content-type": "application/json",
|
|
941
|
-
...
|
|
954
|
+
...r
|
|
942
955
|
}), t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
|
|
943
956
|
return;
|
|
944
957
|
}
|
|
945
|
-
let
|
|
946
|
-
if (!
|
|
958
|
+
let i = de(a, "GET");
|
|
959
|
+
if (!i.ok) {
|
|
947
960
|
t.writeHead(401, {
|
|
948
961
|
"content-type": "application/json",
|
|
949
|
-
...
|
|
962
|
+
...r
|
|
950
963
|
}), t.end(JSON.stringify({
|
|
951
964
|
error: "unauthorized",
|
|
952
|
-
reason:
|
|
965
|
+
reason: i.reason
|
|
953
966
|
}));
|
|
954
967
|
return;
|
|
955
968
|
}
|
|
@@ -958,31 +971,31 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
958
971
|
"cache-control": "no-cache, no-transform",
|
|
959
972
|
connection: "keep-alive",
|
|
960
973
|
"x-accel-buffering": "no",
|
|
961
|
-
...
|
|
974
|
+
...r
|
|
962
975
|
}), t.flushHeaders(), t.write("retry: 5000\n\n");
|
|
963
|
-
for (let e of
|
|
964
|
-
let
|
|
965
|
-
t.write(
|
|
976
|
+
for (let e of h.buffered()) t.write(n(e));
|
|
977
|
+
let o = h.subscribe((e) => {
|
|
978
|
+
t.write(n(e));
|
|
966
979
|
}), s = setInterval(() => {
|
|
967
|
-
t.write(
|
|
980
|
+
t.write(E());
|
|
968
981
|
}, 15e3), c = () => {
|
|
969
|
-
clearInterval(s),
|
|
982
|
+
clearInterval(s), o();
|
|
970
983
|
};
|
|
971
984
|
e.on("close", c), t.on("close", c);
|
|
972
985
|
return;
|
|
973
986
|
}
|
|
974
987
|
try {
|
|
975
|
-
let e = await Pe(
|
|
976
|
-
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !
|
|
977
|
-
let t = Date.now() -
|
|
978
|
-
|
|
979
|
-
url:
|
|
988
|
+
let e = await Pe(r, a);
|
|
989
|
+
if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !o.startsWith("/_voltro/inspect")) {
|
|
990
|
+
let t = Date.now() - i;
|
|
991
|
+
h.emit("request", {
|
|
992
|
+
url: o,
|
|
980
993
|
status: e.status,
|
|
981
994
|
durationMs: t,
|
|
982
995
|
renderedBy: e.headers["x-voltro-rendered-by"],
|
|
983
996
|
cache: e.headers["x-voltro-cache"]
|
|
984
997
|
});
|
|
985
|
-
let n =
|
|
998
|
+
let n = Te(o, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
|
|
986
999
|
ke.record({
|
|
987
1000
|
kind: "request",
|
|
988
1001
|
tag: n,
|
|
@@ -994,56 +1007,56 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
994
1007
|
t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
|
|
995
1008
|
}
|
|
996
1009
|
});
|
|
997
|
-
await new Promise((e) => Ie.listen(v, "::", e)), Fe = !0,
|
|
1010
|
+
await new Promise((e) => Ie.listen(v, "::", e)), Fe = !0, s.mark("ready"), J.info(`listening on http://localhost:${v}`, {
|
|
998
1011
|
port: v,
|
|
999
|
-
distDir:
|
|
1012
|
+
distDir: x
|
|
1000
1013
|
}), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
|
|
1001
1014
|
try {
|
|
1002
|
-
await
|
|
1003
|
-
id:
|
|
1004
|
-
name:
|
|
1015
|
+
await f({
|
|
1016
|
+
id: w,
|
|
1017
|
+
name: S,
|
|
1005
1018
|
kind: "web",
|
|
1006
1019
|
url: `http://localhost:${v}`,
|
|
1007
1020
|
pid: process.pid,
|
|
1008
1021
|
status: "live",
|
|
1009
|
-
logFile:
|
|
1022
|
+
logFile: j.path
|
|
1010
1023
|
});
|
|
1011
|
-
let e =
|
|
1024
|
+
let e = t(r);
|
|
1012
1025
|
if (e) {
|
|
1013
|
-
let t = await
|
|
1026
|
+
let t = await l({ dashboardAppPath: e });
|
|
1014
1027
|
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 });
|
|
1015
1028
|
}
|
|
1016
1029
|
setInterval(() => {
|
|
1017
|
-
|
|
1018
|
-
id:
|
|
1019
|
-
name:
|
|
1030
|
+
f({
|
|
1031
|
+
id: w,
|
|
1032
|
+
name: S,
|
|
1020
1033
|
kind: "web",
|
|
1021
1034
|
url: `http://localhost:${v}`,
|
|
1022
1035
|
pid: process.pid,
|
|
1023
1036
|
status: "live",
|
|
1024
|
-
logFile:
|
|
1037
|
+
logFile: j.path
|
|
1025
1038
|
}).catch(() => {});
|
|
1026
1039
|
}, 1e4).unref();
|
|
1027
1040
|
} catch (e) {
|
|
1028
1041
|
J.warn("runtime-registry write failed", {}, e);
|
|
1029
1042
|
}
|
|
1030
|
-
|
|
1031
|
-
app:
|
|
1043
|
+
me({
|
|
1044
|
+
app: c.name ?? "unnamed",
|
|
1032
1045
|
kind: "web",
|
|
1033
1046
|
url: `http://localhost:${v}`,
|
|
1034
|
-
bootMs:
|
|
1047
|
+
bootMs: s.total()
|
|
1035
1048
|
});
|
|
1036
|
-
let Le =
|
|
1037
|
-
J.info(`start: ready in ${
|
|
1038
|
-
bootMs:
|
|
1049
|
+
let Le = s.phaseBreakdown();
|
|
1050
|
+
J.info(`start: ready in ${s.total()}ms`, {
|
|
1051
|
+
bootMs: s.total(),
|
|
1039
1052
|
...Le ? { phases: Le } : {}
|
|
1040
1053
|
});
|
|
1041
1054
|
let Re = !1, ze = (e) => async () => {
|
|
1042
1055
|
if (!Re) {
|
|
1043
|
-
if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await
|
|
1044
|
-
await
|
|
1056
|
+
if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await $.stop(), B) try {
|
|
1057
|
+
await B.end();
|
|
1045
1058
|
} catch {}
|
|
1046
|
-
await q.close(), await
|
|
1059
|
+
await q.close(), await b(w), await j.dispose(), process.exit(0);
|
|
1047
1060
|
}
|
|
1048
1061
|
};
|
|
1049
1062
|
process.on("SIGINT", ze("SIGINT")), process.on("SIGTERM", ze("SIGTERM"));
|
|
@@ -1055,10 +1068,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
|
|
|
1055
1068
|
e.unref();
|
|
1056
1069
|
}
|
|
1057
1070
|
return new Promise(() => {});
|
|
1058
|
-
},
|
|
1071
|
+
}, Ae = async (e) => {
|
|
1059
1072
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
1060
|
-
let t = await
|
|
1073
|
+
let t = await ke(R(e.find((e) => !e.startsWith("-")) ?? process.cwd()));
|
|
1061
1074
|
return t.ran ? t.exitCode : (J.error("no web app found at this path"), 1);
|
|
1062
1075
|
};
|
|
1063
1076
|
//#endregion
|
|
1064
|
-
export {
|
|
1077
|
+
export { Ae as t };
|