@textjs/app 0.0.0-stage → 1.0.2
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/README.md +34 -2
- package/bin/text.js +29 -0
- package/bin/text.ts +13 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/cli/build.d.ts +39 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +157 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/config.d.ts +22 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +73 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dev.d.ts +12 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +49 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +31 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +111 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +14 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +183 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/ui.d.ts +35 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +73 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +93 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +143 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +44 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +26 -0
- package/dist/context.js.map +1 -0
- package/dist/dev-errors.d.ts +68 -0
- package/dist/dev-errors.d.ts.map +1 -0
- package/dist/dev-errors.js +121 -0
- package/dist/dev-errors.js.map +1 -0
- package/dist/devtools.d.ts +64 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +186 -0
- package/dist/devtools.js.map +1 -0
- package/dist/frame-mirror.d.ts +19 -0
- package/dist/frame-mirror.d.ts.map +1 -0
- package/dist/frame-mirror.js +141 -0
- package/dist/frame-mirror.js.map +1 -0
- package/dist/frame-protocol.d.ts +175 -0
- package/dist/frame-protocol.d.ts.map +1 -0
- package/dist/frame-protocol.js +369 -0
- package/dist/frame-protocol.js.map +1 -0
- package/dist/history.d.ts +54 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +152 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +32 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +54 -0
- package/dist/link.js.map +1 -0
- package/dist/live-player.d.ts +83 -0
- package/dist/live-player.d.ts.map +1 -0
- package/dist/live-player.js +413 -0
- package/dist/live-player.js.map +1 -0
- package/dist/live-protocol.d.ts +132 -0
- package/dist/live-protocol.d.ts.map +1 -0
- package/dist/live-protocol.js +278 -0
- package/dist/live-protocol.js.map +1 -0
- package/dist/live-stub.d.ts +10 -0
- package/dist/live-stub.d.ts.map +1 -0
- package/dist/live-stub.js +32 -0
- package/dist/live-stub.js.map +1 -0
- package/dist/mcp/cli.d.ts +22 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +177 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/frame.d.ts +58 -0
- package/dist/mcp/frame.d.ts.map +1 -0
- package/dist/mcp/frame.js +169 -0
- package/dist/mcp/frame.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inspect.d.ts +95 -0
- package/dist/mcp/inspect.d.ts.map +1 -0
- package/dist/mcp/inspect.js +386 -0
- package/dist/mcp/inspect.js.map +1 -0
- package/dist/mcp/keys.d.ts +20 -0
- package/dist/mcp/keys.d.ts.map +1 -0
- package/dist/mcp/keys.js +87 -0
- package/dist/mcp/keys.js.map +1 -0
- package/dist/mcp/logs.d.ts +63 -0
- package/dist/mcp/logs.d.ts.map +1 -0
- package/dist/mcp/logs.js +217 -0
- package/dist/mcp/logs.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +485 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +230 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +742 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/navigation-errors.d.ts +28 -0
- package/dist/navigation-errors.d.ts.map +1 -0
- package/dist/navigation-errors.js +43 -0
- package/dist/navigation-errors.js.map +1 -0
- package/dist/navigation.d.ts +21 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +33 -0
- package/dist/navigation.js.map +1 -0
- package/dist/router.d.ts +76 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +296 -0
- package/dist/router.js.map +1 -0
- package/dist/routing.d.ts +101 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +286 -0
- package/dist/routing.js.map +1 -0
- package/dist/server/adapters/build-step.d.ts +34 -0
- package/dist/server/adapters/build-step.d.ts.map +1 -0
- package/dist/server/adapters/build-step.js +112 -0
- package/dist/server/adapters/build-step.js.map +1 -0
- package/dist/server/adapters/bun.d.ts +8 -0
- package/dist/server/adapters/bun.d.ts.map +1 -0
- package/dist/server/adapters/bun.js +89 -0
- package/dist/server/adapters/bun.js.map +1 -0
- package/dist/server/adapters/bundle.d.ts +21 -0
- package/dist/server/adapters/bundle.d.ts.map +1 -0
- package/dist/server/adapters/bundle.js +86 -0
- package/dist/server/adapters/bundle.js.map +1 -0
- package/dist/server/adapters/cloudflare.d.ts +29 -0
- package/dist/server/adapters/cloudflare.d.ts.map +1 -0
- package/dist/server/adapters/cloudflare.js +105 -0
- package/dist/server/adapters/cloudflare.js.map +1 -0
- package/dist/server/adapters/index.d.ts +10 -0
- package/dist/server/adapters/index.d.ts.map +1 -0
- package/dist/server/adapters/index.js +24 -0
- package/dist/server/adapters/index.js.map +1 -0
- package/dist/server/adapters/runtime-node.d.ts +16 -0
- package/dist/server/adapters/runtime-node.d.ts.map +1 -0
- package/dist/server/adapters/runtime-node.js +29 -0
- package/dist/server/adapters/runtime-node.js.map +1 -0
- package/dist/server/adapters/runtime.d.ts +42 -0
- package/dist/server/adapters/runtime.d.ts.map +1 -0
- package/dist/server/adapters/runtime.js +115 -0
- package/dist/server/adapters/runtime.js.map +1 -0
- package/dist/server/adapters/shared.d.ts +66 -0
- package/dist/server/adapters/shared.d.ts.map +1 -0
- package/dist/server/adapters/shared.js +124 -0
- package/dist/server/adapters/shared.js.map +1 -0
- package/dist/server/adapters/static.d.ts +9 -0
- package/dist/server/adapters/static.d.ts.map +1 -0
- package/dist/server/adapters/static.js +70 -0
- package/dist/server/adapters/static.js.map +1 -0
- package/dist/server/adapters/vercel.d.ts +43 -0
- package/dist/server/adapters/vercel.d.ts.map +1 -0
- package/dist/server/adapters/vercel.js +119 -0
- package/dist/server/adapters/vercel.js.map +1 -0
- package/dist/server/bun-jsx.d.ts +18 -0
- package/dist/server/bun-jsx.d.ts.map +1 -0
- package/dist/server/bun-jsx.js +56 -0
- package/dist/server/bun-jsx.js.map +1 -0
- package/dist/server/cache-route.d.ts +38 -0
- package/dist/server/cache-route.d.ts.map +1 -0
- package/dist/server/cache-route.js +109 -0
- package/dist/server/cache-route.js.map +1 -0
- package/dist/server/cache.d.ts +131 -0
- package/dist/server/cache.d.ts.map +1 -0
- package/dist/server/cache.js +409 -0
- package/dist/server/cache.js.map +1 -0
- package/dist/server/frames.d.ts +45 -0
- package/dist/server/frames.d.ts.map +1 -0
- package/dist/server/frames.js +294 -0
- package/dist/server/frames.js.map +1 -0
- package/dist/server/http.d.ts +80 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +453 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/jsx-dev-runtime.d.ts +5 -0
- package/dist/server/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/server/jsx-dev-runtime.js +6 -0
- package/dist/server/jsx-dev-runtime.js.map +1 -0
- package/dist/server/jsx-runtime.d.ts +10 -0
- package/dist/server/jsx-runtime.d.ts.map +1 -0
- package/dist/server/jsx-runtime.js +11 -0
- package/dist/server/jsx-runtime.js.map +1 -0
- package/dist/server/live-app.d.ts +87 -0
- package/dist/server/live-app.d.ts.map +1 -0
- package/dist/server/live-app.js +307 -0
- package/dist/server/live-app.js.map +1 -0
- package/dist/server/live-build.d.ts +70 -0
- package/dist/server/live-build.d.ts.map +1 -0
- package/dist/server/live-build.js +222 -0
- package/dist/server/live-build.js.map +1 -0
- package/dist/server/live-dev.d.ts +62 -0
- package/dist/server/live-dev.d.ts.map +1 -0
- package/dist/server/live-dev.js +313 -0
- package/dist/server/live-dev.js.map +1 -0
- package/dist/server/live-manifest.d.ts +23 -0
- package/dist/server/live-manifest.d.ts.map +1 -0
- package/dist/server/live-manifest.js +7 -0
- package/dist/server/live-manifest.js.map +1 -0
- package/dist/server/live-prod.d.ts +30 -0
- package/dist/server/live-prod.d.ts.map +1 -0
- package/dist/server/live-prod.js +97 -0
- package/dist/server/live-prod.js.map +1 -0
- package/dist/server/live-routes.d.ts +72 -0
- package/dist/server/live-routes.d.ts.map +1 -0
- package/dist/server/live-routes.js +274 -0
- package/dist/server/live-routes.js.map +1 -0
- package/dist/server/live-web.d.ts +16 -0
- package/dist/server/live-web.d.ts.map +1 -0
- package/dist/server/live-web.js +159 -0
- package/dist/server/live-web.js.map +1 -0
- package/dist/server/live.d.ts +138 -0
- package/dist/server/live.d.ts.map +1 -0
- package/dist/server/live.js +542 -0
- package/dist/server/live.js.map +1 -0
- package/dist/server/middleware-node.d.ts +48 -0
- package/dist/server/middleware-node.d.ts.map +1 -0
- package/dist/server/middleware-node.js +167 -0
- package/dist/server/middleware-node.js.map +1 -0
- package/dist/server/middleware-runtime.d.ts +97 -0
- package/dist/server/middleware-runtime.d.ts.map +1 -0
- package/dist/server/middleware-runtime.js +447 -0
- package/dist/server/middleware-runtime.js.map +1 -0
- package/dist/server/middleware.d.ts +145 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +365 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/ppr.d.ts +22 -0
- package/dist/server/ppr.d.ts.map +1 -0
- package/dist/server/ppr.js +58 -0
- package/dist/server/ppr.js.map +1 -0
- package/dist/server/scan.d.ts +48 -0
- package/dist/server/scan.d.ts.map +1 -0
- package/dist/server/scan.js +161 -0
- package/dist/server/scan.js.map +1 -0
- package/dist/server/server-components.d.ts +65 -0
- package/dist/server/server-components.d.ts.map +1 -0
- package/dist/server/server-components.js +215 -0
- package/dist/server/server-components.js.map +1 -0
- package/dist/terminal.d.ts +5 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +5 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/vite-plugin.d.ts +51 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +403 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +130 -4
- package/src/cli/build.ts +182 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/dev.ts +54 -0
- package/src/cli/index.ts +185 -0
- package/src/cli/run.ts +124 -0
- package/src/cli/start.ts +194 -0
- package/src/cli/ui.ts +93 -0
- package/src/client.tsx +122 -0
- package/src/config.ts +155 -0
- package/src/context.ts +69 -0
- package/src/dev-errors.ts +167 -0
- package/src/devtools.tsx +419 -0
- package/src/frame-mirror.ts +145 -0
- package/src/frame-protocol.ts +435 -0
- package/src/history.ts +201 -0
- package/src/index.ts +9 -0
- package/src/link.tsx +108 -0
- package/src/live-player.ts +449 -0
- package/src/live-protocol.ts +317 -0
- package/src/live-stub.tsx +32 -0
- package/src/mcp/cli.ts +188 -0
- package/src/mcp/frame.ts +224 -0
- package/src/mcp/index.ts +15 -0
- package/src/mcp/inspect.ts +445 -0
- package/src/mcp/keys.ts +86 -0
- package/src/mcp/logs.ts +225 -0
- package/src/mcp/server.ts +595 -0
- package/src/mcp/session.ts +821 -0
- package/src/navigation-errors.ts +60 -0
- package/src/navigation.ts +44 -0
- package/src/router.tsx +497 -0
- package/src/routing.ts +344 -0
- package/src/server/adapters/build-step.ts +135 -0
- package/src/server/adapters/bun.ts +92 -0
- package/src/server/adapters/bundle.ts +97 -0
- package/src/server/adapters/cloudflare.ts +111 -0
- package/src/server/adapters/index.ts +29 -0
- package/src/server/adapters/runtime-node.ts +34 -0
- package/src/server/adapters/runtime.ts +145 -0
- package/src/server/adapters/shared.ts +159 -0
- package/src/server/adapters/static.ts +68 -0
- package/src/server/adapters/vercel.ts +149 -0
- package/src/server/bun-jsx.ts +65 -0
- package/src/server/cache-route.ts +139 -0
- package/src/server/cache.ts +498 -0
- package/src/server/frames.ts +326 -0
- package/src/server/http.ts +467 -0
- package/src/server/jsx-dev-runtime.ts +9 -0
- package/src/server/jsx-runtime.ts +13 -0
- package/src/server/live-app.tsx +374 -0
- package/src/server/live-build.ts +258 -0
- package/src/server/live-dev.ts +357 -0
- package/src/server/live-manifest.ts +25 -0
- package/src/server/live-prod.ts +120 -0
- package/src/server/live-routes.ts +298 -0
- package/src/server/live-web.ts +170 -0
- package/src/server/live.ts +551 -0
- package/src/server/middleware-node.ts +168 -0
- package/src/server/middleware-runtime.ts +478 -0
- package/src/server/middleware.ts +451 -0
- package/src/server/ppr.ts +62 -0
- package/src/server/scan.ts +190 -0
- package/src/server/server-components.ts +224 -0
- package/src/terminal.ts +5 -0
- package/src/testing.ts +5 -0
- package/src/vite-plugin.ts +413 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node HTTP helpers shared by `text dev` middleware and `text start`:
|
|
3
|
+
* Web `Request` / `Response` bridging, route handlers, rewrites and proxying.
|
|
4
|
+
*/
|
|
5
|
+
import { txError } from "@textjs/core";
|
|
6
|
+
export const HTTP_METHODS = ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"];
|
|
7
|
+
/** Set by `middleware.ts` handling (see `server/middleware-node.ts`). */
|
|
8
|
+
const WEB_REQUEST = Symbol.for("textjs.webRequest");
|
|
9
|
+
/**
|
|
10
|
+
* The request target as a path and query with exactly one leading slash.
|
|
11
|
+
* `//evil.com/x` and `/\evil.com/x` would otherwise resolve to another host
|
|
12
|
+
* against the origin (`request.url` → `http://evil.com/x`); absolute-form
|
|
13
|
+
* targets (`GET http://evil.com/x`) keep only their path and query.
|
|
14
|
+
*/
|
|
15
|
+
export function normalizeRequestTarget(raw) {
|
|
16
|
+
let target = raw ?? "/";
|
|
17
|
+
if (!target.startsWith("/")) {
|
|
18
|
+
try {
|
|
19
|
+
const u = new URL(target);
|
|
20
|
+
target = `${u.pathname}${u.search}`;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return "/";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return target.replace(/^[/\\]+/, "/");
|
|
27
|
+
}
|
|
28
|
+
/** Resolve a request target against `origin`, never leaving it. */
|
|
29
|
+
export function requestUrl(raw, origin) {
|
|
30
|
+
const base = new URL(origin);
|
|
31
|
+
const url = new URL(normalizeRequestTarget(raw), base);
|
|
32
|
+
return url.origin === base.origin ? url : new URL("/", base);
|
|
33
|
+
}
|
|
34
|
+
const HOST_HEADER = /^(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*\.?|\[[0-9A-Fa-f:.]+\])(?::\d{1,5})?$/;
|
|
35
|
+
const IPV4 = /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/;
|
|
36
|
+
/** A syntactically valid `Host` header (`name[:port]` or `[ipv6][:port]`). */
|
|
37
|
+
export function isValidHostHeader(host) {
|
|
38
|
+
return typeof host === "string" && host.length <= 255 && HOST_HEADER.test(host);
|
|
39
|
+
}
|
|
40
|
+
/** `localhost`, `*.localhost`, IP literals and `allowed` (a leading `.` allows subdomains). */
|
|
41
|
+
export function isAllowedHost(hostHeader, allowed = []) {
|
|
42
|
+
if (allowed === true)
|
|
43
|
+
return true;
|
|
44
|
+
if (!isValidHostHeader(hostHeader))
|
|
45
|
+
return false;
|
|
46
|
+
const host = hostHeader.trim().toLowerCase();
|
|
47
|
+
if (host.startsWith("["))
|
|
48
|
+
return true;
|
|
49
|
+
const hostname = host.replace(/:\d+$/, "").replace(/\.$/, "");
|
|
50
|
+
if (IPV4.test(hostname) || hostname === "localhost" || hostname.endsWith(".localhost"))
|
|
51
|
+
return true;
|
|
52
|
+
for (const a of allowed) {
|
|
53
|
+
const name = a.toLowerCase();
|
|
54
|
+
if (name === hostname)
|
|
55
|
+
return true;
|
|
56
|
+
if (name.startsWith(".") && (name.slice(1) === hostname || hostname.endsWith(name)))
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function firstHeader(value) {
|
|
62
|
+
const v = Array.isArray(value) ? value[0] : value;
|
|
63
|
+
return v?.split(",")[0]?.trim() || undefined;
|
|
64
|
+
}
|
|
65
|
+
/** The origin a Node request was addressed to (`http://localhost:3000`), from validated headers only. */
|
|
66
|
+
export function requestOrigin(req, options = {}) {
|
|
67
|
+
if (options.origin)
|
|
68
|
+
return new URL(options.origin).origin;
|
|
69
|
+
let host = firstHeader(req.headers.host);
|
|
70
|
+
let proto = options.protocol ?? "http";
|
|
71
|
+
if (options.trustProxy) {
|
|
72
|
+
const fwdHost = firstHeader(req.headers["x-forwarded-host"]);
|
|
73
|
+
if (isValidHostHeader(fwdHost))
|
|
74
|
+
host = fwdHost;
|
|
75
|
+
const fwdProto = firstHeader(req.headers["x-forwarded-proto"])?.toLowerCase();
|
|
76
|
+
if (fwdProto === "http" || fwdProto === "https")
|
|
77
|
+
proto = fwdProto;
|
|
78
|
+
}
|
|
79
|
+
return `${proto}://${isValidHostHeader(host) ? host : "localhost"}`;
|
|
80
|
+
}
|
|
81
|
+
/** A Web `ReadableStream` over a Node request body with backpressure; safe against late chunks after cancel. */
|
|
82
|
+
function nodeBodyStream(req) {
|
|
83
|
+
let finished = false;
|
|
84
|
+
let onData = () => undefined;
|
|
85
|
+
let onEnd = () => undefined;
|
|
86
|
+
let onError = () => undefined;
|
|
87
|
+
const detach = () => {
|
|
88
|
+
finished = true;
|
|
89
|
+
req.off("data", onData);
|
|
90
|
+
req.off("end", onEnd);
|
|
91
|
+
req.off("error", onError);
|
|
92
|
+
req.off("aborted", onAborted);
|
|
93
|
+
};
|
|
94
|
+
const onAborted = () => onError(new Error("The client aborted the request."));
|
|
95
|
+
return new ReadableStream({
|
|
96
|
+
start(controller) {
|
|
97
|
+
onData = (chunk) => {
|
|
98
|
+
if (finished)
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
controller.enqueue(typeof chunk === "string" ? new TextEncoder().encode(chunk) : new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
detach();
|
|
105
|
+
req.resume();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if ((controller.desiredSize ?? 1) <= 0)
|
|
109
|
+
req.pause();
|
|
110
|
+
};
|
|
111
|
+
onEnd = () => {
|
|
112
|
+
if (finished)
|
|
113
|
+
return;
|
|
114
|
+
detach();
|
|
115
|
+
try {
|
|
116
|
+
controller.close();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// already closed or errored
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
onError = (error) => {
|
|
123
|
+
if (finished)
|
|
124
|
+
return;
|
|
125
|
+
detach();
|
|
126
|
+
try {
|
|
127
|
+
controller.error(error);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// already closed or errored
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
req.on("data", onData);
|
|
134
|
+
req.on("end", onEnd);
|
|
135
|
+
req.on("error", onError);
|
|
136
|
+
req.on("aborted", onAborted);
|
|
137
|
+
},
|
|
138
|
+
pull() {
|
|
139
|
+
if (!finished && req.isPaused())
|
|
140
|
+
req.resume();
|
|
141
|
+
},
|
|
142
|
+
cancel() {
|
|
143
|
+
detach();
|
|
144
|
+
// Discard the rest of the upload so the response can still be written.
|
|
145
|
+
if (!req.destroyed)
|
|
146
|
+
req.resume();
|
|
147
|
+
},
|
|
148
|
+
}, { highWaterMark: 64 * 1024, size: (chunk) => chunk?.byteLength ?? 0 });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Read a request body as text, at most `max` bytes (`null` when larger).
|
|
152
|
+
* Prefers the body `middleware.ts` already took over from the Node stream.
|
|
153
|
+
*/
|
|
154
|
+
export async function readRequestBody(req, max) {
|
|
155
|
+
const stash = req;
|
|
156
|
+
const forwarded = stash[WEB_REQUEST];
|
|
157
|
+
if (forwarded)
|
|
158
|
+
delete stash[WEB_REQUEST];
|
|
159
|
+
const stream = forwarded ? forwarded.body : nodeBodyStream(req);
|
|
160
|
+
if (!stream)
|
|
161
|
+
return "";
|
|
162
|
+
const reader = stream.getReader();
|
|
163
|
+
const chunks = [];
|
|
164
|
+
let size = 0;
|
|
165
|
+
for (;;) {
|
|
166
|
+
const { done, value } = await reader.read();
|
|
167
|
+
if (done)
|
|
168
|
+
break;
|
|
169
|
+
size += value.byteLength;
|
|
170
|
+
if (size > max) {
|
|
171
|
+
await reader.cancel().catch(() => undefined);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
chunks.push(value);
|
|
175
|
+
}
|
|
176
|
+
const out = new Uint8Array(size);
|
|
177
|
+
let offset = 0;
|
|
178
|
+
for (const c of chunks) {
|
|
179
|
+
out.set(c, offset);
|
|
180
|
+
offset += c.byteLength;
|
|
181
|
+
}
|
|
182
|
+
return new TextDecoder().decode(out);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Bridge a Node request into a Web `Request`. Its `signal` aborts as soon as the
|
|
186
|
+
* client disconnects, so streaming handlers (SSE) can clean up immediately.
|
|
187
|
+
*/
|
|
188
|
+
export function toWebRequest(req, origin, res) {
|
|
189
|
+
const url = requestUrl(req.url, origin);
|
|
190
|
+
// `middleware.ts` already bridged (and possibly re-headered) this request; reuse its body stream.
|
|
191
|
+
const forwarded = req[WEB_REQUEST];
|
|
192
|
+
if (forwarded) {
|
|
193
|
+
delete req[WEB_REQUEST];
|
|
194
|
+
const init = { method: forwarded.method, headers: forwarded.headers, signal: forwarded.signal };
|
|
195
|
+
if (forwarded.body) {
|
|
196
|
+
init.body = forwarded.body;
|
|
197
|
+
init.duplex = "half";
|
|
198
|
+
}
|
|
199
|
+
return new Request(url, init);
|
|
200
|
+
}
|
|
201
|
+
const controller = new AbortController();
|
|
202
|
+
const abort = () => {
|
|
203
|
+
if (!controller.signal.aborted)
|
|
204
|
+
controller.abort();
|
|
205
|
+
};
|
|
206
|
+
req.on("aborted", abort);
|
|
207
|
+
// `close` before `end()` means the client disconnected (tab closed, EventSource dropped).
|
|
208
|
+
res?.on("close", () => {
|
|
209
|
+
if (!res.writableEnded)
|
|
210
|
+
abort();
|
|
211
|
+
});
|
|
212
|
+
const headers = new Headers();
|
|
213
|
+
for (const [k, v] of Object.entries(req.headers)) {
|
|
214
|
+
if (v === undefined)
|
|
215
|
+
continue;
|
|
216
|
+
if (Array.isArray(v))
|
|
217
|
+
for (const item of v)
|
|
218
|
+
headers.append(k, item);
|
|
219
|
+
else
|
|
220
|
+
headers.set(k, v);
|
|
221
|
+
}
|
|
222
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
223
|
+
const hasBody = method !== "GET" && method !== "HEAD";
|
|
224
|
+
const init = { method, headers, signal: controller.signal };
|
|
225
|
+
if (hasBody) {
|
|
226
|
+
init.body = nodeBodyStream(req);
|
|
227
|
+
init.duplex = "half";
|
|
228
|
+
}
|
|
229
|
+
return new Request(url, init);
|
|
230
|
+
}
|
|
231
|
+
/** `Cache-Control` for responses that must not be stored by shared caches. */
|
|
232
|
+
export const PRIVATE_CACHE_CONTROL = "private, no-cache, no-store, max-age=0, must-revalidate";
|
|
233
|
+
/** Responses whose `Cache-Control` the route cache generated (not set by the handler). */
|
|
234
|
+
const generatedCacheControl = new WeakSet();
|
|
235
|
+
export function markGeneratedCacheControl(response) {
|
|
236
|
+
generatedCacheControl.add(response);
|
|
237
|
+
return response;
|
|
238
|
+
}
|
|
239
|
+
export function hasGeneratedCacheControl(response) {
|
|
240
|
+
return generatedCacheControl.has(response);
|
|
241
|
+
}
|
|
242
|
+
const MIDDLEWARE_STATE = Symbol.for("textjs.middlewareState");
|
|
243
|
+
export function setMiddlewareState(res, state) {
|
|
244
|
+
res[MIDDLEWARE_STATE] = state;
|
|
245
|
+
}
|
|
246
|
+
function middlewareState(res) {
|
|
247
|
+
return res[MIDDLEWARE_STATE];
|
|
248
|
+
}
|
|
249
|
+
export async function sendWebResponse(res, response, method = "GET") {
|
|
250
|
+
const state = middlewareState(res);
|
|
251
|
+
res.statusCode = state?.status ?? response.status;
|
|
252
|
+
if (response.statusText && state?.status === undefined)
|
|
253
|
+
res.statusMessage = response.statusText;
|
|
254
|
+
const cookies = typeof response.headers.getSetCookie === "function" ? response.headers.getSetCookie() : [];
|
|
255
|
+
response.headers.forEach((value, key) => {
|
|
256
|
+
if (key === "set-cookie")
|
|
257
|
+
return;
|
|
258
|
+
res.setHeader(key, value);
|
|
259
|
+
});
|
|
260
|
+
if (state?.private && hasGeneratedCacheControl(response))
|
|
261
|
+
res.setHeader("cache-control", PRIVATE_CACHE_CONTROL);
|
|
262
|
+
if (cookies.length > 0) {
|
|
263
|
+
// Keep cookies `middleware.ts` already set on this response.
|
|
264
|
+
const prior = res.getHeader("set-cookie");
|
|
265
|
+
res.setHeader("set-cookie", [...(prior === undefined ? [] : Array.isArray(prior) ? prior : [String(prior)]), ...cookies]);
|
|
266
|
+
}
|
|
267
|
+
if (method === "HEAD" || !response.body) {
|
|
268
|
+
res.end();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const reader = response.body.getReader();
|
|
272
|
+
const cancel = () => {
|
|
273
|
+
reader.cancel().catch(() => undefined);
|
|
274
|
+
};
|
|
275
|
+
res.on("close", cancel);
|
|
276
|
+
try {
|
|
277
|
+
for (;;) {
|
|
278
|
+
if (res.writableEnded || res.destroyed) {
|
|
279
|
+
cancel();
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const { done, value } = await reader.read();
|
|
283
|
+
if (done)
|
|
284
|
+
break;
|
|
285
|
+
if (res.writableEnded || res.destroyed) {
|
|
286
|
+
cancel();
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
res.write(value);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// The client went away mid-stream (the reader was cancelled).
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
res.off("close", cancel);
|
|
298
|
+
}
|
|
299
|
+
res.end();
|
|
300
|
+
}
|
|
301
|
+
export function allowedMethods(mod) {
|
|
302
|
+
const out = HTTP_METHODS.filter((m) => typeof mod[m] === "function");
|
|
303
|
+
if (out.includes("GET") && !out.includes("HEAD"))
|
|
304
|
+
out.push("HEAD");
|
|
305
|
+
if (!out.includes("OPTIONS"))
|
|
306
|
+
out.push("OPTIONS");
|
|
307
|
+
return out;
|
|
308
|
+
}
|
|
309
|
+
/** Invoke an `app/**\/route.ts` handler with Next.js semantics (HEAD → GET, auto OPTIONS, 405). */
|
|
310
|
+
export async function runRouteHandler(mod, request, params) {
|
|
311
|
+
const method = request.method.toUpperCase();
|
|
312
|
+
let handler = mod[method];
|
|
313
|
+
if (!handler && method === "HEAD")
|
|
314
|
+
handler = mod.GET;
|
|
315
|
+
if (!handler) {
|
|
316
|
+
const allow = allowedMethods(mod).join(", ");
|
|
317
|
+
if (method === "OPTIONS")
|
|
318
|
+
return new Response(null, { status: 204, headers: { Allow: allow } });
|
|
319
|
+
return new Response(null, { status: 405, headers: { Allow: allow } });
|
|
320
|
+
}
|
|
321
|
+
const result = await handler(request, { params });
|
|
322
|
+
if (!(result instanceof Response)) {
|
|
323
|
+
throw txError("TX016", method, new URL(request.url).pathname);
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
function escapeRe(s) {
|
|
328
|
+
return s.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
329
|
+
}
|
|
330
|
+
/** Compile `/docs/:slug`, `/blog/:path*`, `/a/:rest+` source patterns. */
|
|
331
|
+
export function compileRewrite(rewrite) {
|
|
332
|
+
const names = [];
|
|
333
|
+
let re = "^";
|
|
334
|
+
for (const part of rewrite.source.split("/").filter(Boolean)) {
|
|
335
|
+
const m = /^:([A-Za-z_][\w]*)([*+?])?$/.exec(part);
|
|
336
|
+
if (!m) {
|
|
337
|
+
re += `/${escapeRe(part)}`;
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
names.push(m[1]);
|
|
341
|
+
const mod = m[2];
|
|
342
|
+
if (mod === "*")
|
|
343
|
+
re += "(?:/(.*))?";
|
|
344
|
+
else if (mod === "+")
|
|
345
|
+
re += "/(.+)";
|
|
346
|
+
else if (mod === "?")
|
|
347
|
+
re += "(?:/([^/]+))?";
|
|
348
|
+
else
|
|
349
|
+
re += "/([^/]+)";
|
|
350
|
+
}
|
|
351
|
+
re += "/?$";
|
|
352
|
+
const regex = new RegExp(re || "^/$");
|
|
353
|
+
return {
|
|
354
|
+
rewrite,
|
|
355
|
+
match(pathname) {
|
|
356
|
+
const m = regex.exec(pathname);
|
|
357
|
+
if (!m)
|
|
358
|
+
return null;
|
|
359
|
+
const out = {};
|
|
360
|
+
names.forEach((n, i) => {
|
|
361
|
+
out[n] = m[i + 1] ?? "";
|
|
362
|
+
});
|
|
363
|
+
return out;
|
|
364
|
+
},
|
|
365
|
+
destination(params, search) {
|
|
366
|
+
let dest = rewrite.destination.replace(/:([A-Za-z_][\w]*)[*+?]?/g, (_, n) => params[n] ?? "");
|
|
367
|
+
if (!/^[a-z]+:\/\//i.test(dest))
|
|
368
|
+
dest = dest.replace(/\/{2,}/g, "/");
|
|
369
|
+
if (search && !dest.includes("?"))
|
|
370
|
+
dest += search;
|
|
371
|
+
return dest;
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
export function applyRewrites(rewrites, url) {
|
|
376
|
+
const u = new URL(url, "http://text.local");
|
|
377
|
+
for (const r of rewrites) {
|
|
378
|
+
const params = r.match(u.pathname);
|
|
379
|
+
if (params)
|
|
380
|
+
return r.destination(params, u.search);
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
385
|
+
export function isLoopbackUrl(url) {
|
|
386
|
+
try {
|
|
387
|
+
return LOOPBACK_HOSTS.has(new URL(url).hostname);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const HOP_BY_HOP = ["connection", "keep-alive", "proxy-authenticate", "proxy-authorization", "proxy-connection", "te", "trailer", "transfer-encoding", "upgrade"];
|
|
394
|
+
/** Remove hop-by-hop headers (and any named by `Connection`) before forwarding a message. */
|
|
395
|
+
export function stripHopByHop(headers) {
|
|
396
|
+
for (const name of (headers.get("connection") ?? "").split(",")) {
|
|
397
|
+
const n = name.trim().toLowerCase();
|
|
398
|
+
if (n)
|
|
399
|
+
headers.delete(n);
|
|
400
|
+
}
|
|
401
|
+
for (const h of HOP_BY_HOP)
|
|
402
|
+
headers.delete(h);
|
|
403
|
+
return headers;
|
|
404
|
+
}
|
|
405
|
+
/** Forward `request` to an absolute URL (a middleware or config rewrite). Credentials are stripped for third-party origins. */
|
|
406
|
+
export async function proxyFetch(request, target, options = {}) {
|
|
407
|
+
const headers = stripHopByHop(new Headers(request.headers));
|
|
408
|
+
headers.delete("host");
|
|
409
|
+
headers.delete("content-length");
|
|
410
|
+
if (options.stripCredentials !== false) {
|
|
411
|
+
headers.delete("cookie");
|
|
412
|
+
headers.delete("authorization");
|
|
413
|
+
}
|
|
414
|
+
const init = { method: request.method, headers, redirect: "manual", signal: request.signal };
|
|
415
|
+
if (request.body && request.method !== "GET" && request.method !== "HEAD") {
|
|
416
|
+
init.body = request.body;
|
|
417
|
+
init.duplex = "half";
|
|
418
|
+
}
|
|
419
|
+
try {
|
|
420
|
+
const upstream = await fetch(target, init);
|
|
421
|
+
const out = stripHopByHop(new Headers(upstream.headers));
|
|
422
|
+
out.delete("content-encoding");
|
|
423
|
+
out.delete("content-length");
|
|
424
|
+
// An upstream must never steer this server's own routing.
|
|
425
|
+
for (const key of [...out.keys()])
|
|
426
|
+
if (key.startsWith("x-middleware-"))
|
|
427
|
+
out.delete(key);
|
|
428
|
+
return new Response(upstream.body, { status: upstream.status, statusText: upstream.statusText, headers: out });
|
|
429
|
+
}
|
|
430
|
+
catch (error) {
|
|
431
|
+
if (request.signal.aborted)
|
|
432
|
+
throw error;
|
|
433
|
+
return new Response(`▼ Text.js proxy error: ${String(target)}\n${error instanceof Error ? error.message : String(error)}`, {
|
|
434
|
+
status: 502,
|
|
435
|
+
headers: { "content-type": "text/plain; charset=utf-8" },
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/** Forward a request to an absolute URL and pipe the response back. */
|
|
440
|
+
export async function proxyRequest(req, res, target, origin) {
|
|
441
|
+
const incoming = toWebRequest(req, origin, res);
|
|
442
|
+
let response;
|
|
443
|
+
try {
|
|
444
|
+
// Never forward the visitor's credentials to a third-party origin.
|
|
445
|
+
response = await proxyFetch(incoming, target, { stripCredentials: !isLoopbackUrl(target) });
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
res.destroy();
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
await sendWebResponse(res, response, incoming.method);
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Development twin of `./jsx-runtime` (aliases `react/jsx-dev-runtime`). */
|
|
2
|
+
import { Fragment, jsxDEV as reactJsxDEV } from "react/jsx-dev-runtime";
|
|
3
|
+
export { Fragment };
|
|
4
|
+
export declare const jsxDEV: typeof reactJsxDEV;
|
|
5
|
+
//# sourceMappingURL=jsx-dev-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.d.ts","sourceRoot":"","sources":["../../src/server/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,eAAO,MAAM,MAAM,EAAE,OAAO,WAC8C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Development twin of `./jsx-runtime` (aliases `react/jsx-dev-runtime`). */
|
|
2
|
+
import { Fragment, jsxDEV as reactJsxDEV } from "react/jsx-dev-runtime";
|
|
3
|
+
import { resolveServerType } from "./server-components.js";
|
|
4
|
+
export { Fragment };
|
|
5
|
+
export const jsxDEV = (type, props, key, isStatic, source, self) => reactJsxDEV(resolveServerType(type), props, key, isStatic, source, self);
|
|
6
|
+
//# sourceMappingURL=jsx-dev-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.js","sourceRoot":"","sources":["../../src/server/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,MAAM,CAAC,MAAM,MAAM,GAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CACrF,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side `react/jsx-runtime` used for server-rendered console routes:
|
|
3
|
+
* identical to React's, except `async function` components are wrapped by
|
|
4
|
+
* {@link serverComponent} so they can suspend on the console reconciler.
|
|
5
|
+
*/
|
|
6
|
+
import { Fragment, jsx as reactJsx, jsxs as reactJsxs } from "react/jsx-runtime";
|
|
7
|
+
export { Fragment };
|
|
8
|
+
export declare const jsx: typeof reactJsx;
|
|
9
|
+
export declare const jsxs: typeof reactJsxs;
|
|
10
|
+
//# sourceMappingURL=jsx-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../../src/server/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,eAAO,MAAM,GAAG,EAAE,OAAO,QAA8E,CAAC;AACxG,eAAO,MAAM,IAAI,EAAE,OAAO,SAAgF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side `react/jsx-runtime` used for server-rendered console routes:
|
|
3
|
+
* identical to React's, except `async function` components are wrapped by
|
|
4
|
+
* {@link serverComponent} so they can suspend on the console reconciler.
|
|
5
|
+
*/
|
|
6
|
+
import { Fragment, jsx as reactJsx, jsxs as reactJsxs } from "react/jsx-runtime";
|
|
7
|
+
import { resolveServerType } from "./server-components.js";
|
|
8
|
+
export { Fragment };
|
|
9
|
+
export const jsx = (type, props, key) => reactJsx(resolveServerType(type), props, key);
|
|
10
|
+
export const jsxs = (type, props, key) => reactJsxs(resolveServerType(type), props, key);
|
|
11
|
+
//# sourceMappingURL=jsx-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../../src/server/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,MAAM,CAAC,MAAM,GAAG,GAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACxG,MAAM,CAAC,MAAM,IAAI,GAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The React half of server-rendered console routes: mounts the App Router in a
|
|
3
|
+
* headless console root on the server (Bun / Node), applies forwarded input
|
|
4
|
+
* and exposes the painted `CellBuffer` for the live transport and for Partial
|
|
5
|
+
* Prerendering. Loaded through Vite's SSR graph in `text dev` and bundled into
|
|
6
|
+
* `.text/server/live.mjs` by `text build`, so route modules, `@textjs/react`
|
|
7
|
+
* and this module share one React instance.
|
|
8
|
+
*/
|
|
9
|
+
import { type CellBuffer } from "@textjs/core";
|
|
10
|
+
import { type ConsoleRoot, type ThemeName } from "@textjs/react";
|
|
11
|
+
import { type HistoryAction, type MemoryHistory } from "../history.js";
|
|
12
|
+
import type { LiveInput } from "../live-protocol.js";
|
|
13
|
+
import { type RouteManifest } from "../routing.js";
|
|
14
|
+
/** `export const runtime = "server"` in `page.tsx`. */
|
|
15
|
+
export type RouteRuntime = "server" | "client";
|
|
16
|
+
export interface LiveAppOptions {
|
|
17
|
+
/** Eager route manifest (every page imported). */
|
|
18
|
+
routes: RouteManifest;
|
|
19
|
+
/** Initial href (`pathname + search`). */
|
|
20
|
+
path: string;
|
|
21
|
+
cols: number;
|
|
22
|
+
rows: number;
|
|
23
|
+
theme?: ThemeName;
|
|
24
|
+
/** `document.title` fallback when no route sets one. */
|
|
25
|
+
defaultTitle?: string;
|
|
26
|
+
focused?: boolean;
|
|
27
|
+
/** A frame with changed cells was painted into {@link LiveApp.buffer}. */
|
|
28
|
+
onFrame?: () => void;
|
|
29
|
+
/**
|
|
30
|
+
* The app navigated. `runtime` is the target route's runtime; `delta` is how
|
|
31
|
+
* far a `"pop"` moved through the history.
|
|
32
|
+
*/
|
|
33
|
+
onNavigate?: (href: string, action: HistoryAction, runtime: RouteRuntime, delta?: number) => void;
|
|
34
|
+
/**
|
|
35
|
+
* May the session render `href` (a server route)? Runs `middleware.ts` for
|
|
36
|
+
* the target before every server-side route transition. Denied transitions
|
|
37
|
+
* are handed to the browser as a document load, where middleware answers.
|
|
38
|
+
*/
|
|
39
|
+
authorize?: (href: string) => Promise<boolean>;
|
|
40
|
+
onTitle?: (title: string) => void;
|
|
41
|
+
onError?: (error: unknown) => void;
|
|
42
|
+
}
|
|
43
|
+
export interface LiveApp {
|
|
44
|
+
readonly root: ConsoleRoot;
|
|
45
|
+
readonly buffer: CellBuffer;
|
|
46
|
+
readonly history: MemoryHistory;
|
|
47
|
+
input(event: LiveInput): void;
|
|
48
|
+
/** Apply a batch of input events (one POST) and paint once. */
|
|
49
|
+
inputMany?(events: readonly LiveInput[]): void;
|
|
50
|
+
/** Pause rendering while no browser is attached; resume (and repaint) on attach. */
|
|
51
|
+
setActive?(active: boolean): void;
|
|
52
|
+
/** Swap the manifest (dev: a route module changed). Keeps the history. */
|
|
53
|
+
setRoutes(routes: RouteManifest): void;
|
|
54
|
+
/** Lay out and paint synchronously. */
|
|
55
|
+
flush(): void;
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
/** Wrap async `default` exports (pages, layouts, …) so they render on the console reconciler. */
|
|
59
|
+
export declare function prepareServerManifest(routes: RouteManifest): RouteManifest;
|
|
60
|
+
/** `true` only when `pathname` matches a page that opts into `runtime = "server"` (HTML routing, new sessions). */
|
|
61
|
+
export declare function isServerPage(routes: RouteManifest, pathname: string): boolean;
|
|
62
|
+
/** The runtime of the page `pathname` resolves to (in-app navigation: not-found pages render where they are requested). */
|
|
63
|
+
export declare function routeRuntime(routes: RouteManifest, pathname: string): RouteRuntime;
|
|
64
|
+
/** Mount a live session's App Router on the server. */
|
|
65
|
+
export declare function createLiveApp(options: LiveAppOptions): Promise<LiveApp>;
|
|
66
|
+
export interface ShellCall {
|
|
67
|
+
method: "clear" | "log";
|
|
68
|
+
args: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface PrerenderShellOptions {
|
|
71
|
+
routes: RouteManifest;
|
|
72
|
+
path: string;
|
|
73
|
+
cols: number;
|
|
74
|
+
rows: number;
|
|
75
|
+
theme?: ThemeName;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Render the static shell of a route: the first committed frame, with every
|
|
79
|
+
* `<Suspense>` boundary that is still waiting (async server components,
|
|
80
|
+
* `use()`, lazy modules) showing its fallback. `fetch` never resolves while
|
|
81
|
+
* rendering, so data loaded in effects stays in its loading state too.
|
|
82
|
+
*
|
|
83
|
+
* Returns the exact `console.clear()` / `console.log()` calls the client's
|
|
84
|
+
* driver would make for this frame (curtain included).
|
|
85
|
+
*/
|
|
86
|
+
export declare function prerenderShell(options: PrerenderShellOptions): Promise<ShellCall[]>;
|
|
87
|
+
//# sourceMappingURL=live-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-app.d.ts","sourceRoot":"","sources":["../../src/server/live-app.tsx"],"names":[],"mappings":"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"}
|