@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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `text build --adapter bun`: a self-contained `dist/server.js` for
|
|
3
|
+
* `bun dist/server.js` (static files, middleware, route handlers, SPA document).
|
|
4
|
+
*/
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { bundleServerEntry, frameworkFile } from "./bundle.js";
|
|
7
|
+
import { serverEntry } from "./shared.js";
|
|
8
|
+
export const BUN_SERVER_FILE = "server.js";
|
|
9
|
+
const BODY = `
|
|
10
|
+
import { existsSync, statSync } from "node:fs";
|
|
11
|
+
import { join, normalize, sep } from "node:path";
|
|
12
|
+
import { loadLiveProduction } from ${JSON.stringify(frameworkFile("server/live-prod.ts"))};
|
|
13
|
+
import { runNodeStyle } from ${JSON.stringify(frameworkFile("server/live-web.ts"))};
|
|
14
|
+
|
|
15
|
+
const dir = import.meta.dir;
|
|
16
|
+
const self = join(dir, ${JSON.stringify(BUN_SERVER_FILE)});
|
|
17
|
+
|
|
18
|
+
// Server-rendered routes (\`runtime = "server"\`) and prerendered shells: Bun is a long-lived server, so live sessions run here.
|
|
19
|
+
const live = existsSync(join(dir, ".text", "live-manifest.json"))
|
|
20
|
+
? await loadLiveProduction(dir, {
|
|
21
|
+
middleware: options.middleware,
|
|
22
|
+
trustProxy: process.env.TRUST_PROXY === "1",
|
|
23
|
+
origin: process.env.TEXTJS_ORIGIN,
|
|
24
|
+
onError: (error) => console.error(error),
|
|
25
|
+
})
|
|
26
|
+
: null;
|
|
27
|
+
|
|
28
|
+
function fileResponse(path, immutable) {
|
|
29
|
+
const file = Bun.file(path);
|
|
30
|
+
return new Response(file, {
|
|
31
|
+
headers: {
|
|
32
|
+
"content-type": file.type,
|
|
33
|
+
"cache-control": immutable ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const handler = createRequestHandler({
|
|
39
|
+
...options,
|
|
40
|
+
live: live ? (request, url, context) => runNodeStyle(request, url, (req, res) => live.handle(req, res, url), context.clientAddress) : undefined,
|
|
41
|
+
assets(pathname) {
|
|
42
|
+
let path = normalize(join(dir, pathname));
|
|
43
|
+
if ((path !== dir && !path.startsWith(dir + sep)) || path === self) return null;
|
|
44
|
+
try {
|
|
45
|
+
// Directories serve their index.html (prerendered console shells).
|
|
46
|
+
if (statSync(path).isDirectory()) path = join(path, "index.html");
|
|
47
|
+
if (!statSync(path).isFile()) return null;
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const res = fileResponse(path, pathname.startsWith("/assets/"));
|
|
52
|
+
if (path.endsWith(".html")) res.headers.set("content-type", "text/html; charset=utf-8");
|
|
53
|
+
return res;
|
|
54
|
+
},
|
|
55
|
+
document() {
|
|
56
|
+
const res = fileResponse(join(dir, "index.html"), false);
|
|
57
|
+
res.headers.set("content-type", "text/html; charset=utf-8");
|
|
58
|
+
return res;
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (import.meta.main) {
|
|
63
|
+
const server = Bun.serve({
|
|
64
|
+
// Live sessions stream server-sent events (15s heartbeats): don't idle them out.
|
|
65
|
+
idleTimeout: 60,
|
|
66
|
+
port: Number(process.env.PORT ?? 3000),
|
|
67
|
+
hostname: process.env.HOSTNAME ?? "0.0.0.0",
|
|
68
|
+
fetch(request, server) {
|
|
69
|
+
return handler(request, { clientAddress: server.requestIP(request)?.address }).catch((error) => {
|
|
70
|
+
console.error(error);
|
|
71
|
+
return new Response("500 | Internal Server Error", { status: 500 });
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const stop = () => {
|
|
76
|
+
live?.close();
|
|
77
|
+
server.stop();
|
|
78
|
+
process.exit(0);
|
|
79
|
+
};
|
|
80
|
+
process.once("SIGINT", stop);
|
|
81
|
+
process.once("SIGTERM", stop);
|
|
82
|
+
console.log("▼ Text.js ready on http://" + (server.hostname === "0.0.0.0" ? "localhost" : server.hostname) + ":" + server.port + options.basePath);
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
export async function adaptBun(ctx) {
|
|
86
|
+
await bundleServerEntry({ root: ctx.root, config: ctx.config, code: serverEntry(ctx, { body: BODY }), outFile: join(ctx.outDir, BUN_SERVER_FILE), target: "bun" });
|
|
87
|
+
return { adapter: "bun", output: ctx.outDir, notes: [`Run with: bun ${join(ctx.config.outDir ?? "dist", BUN_SERVER_FILE)}`] };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=bun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../../../src/server/adapters/bun.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,WAAW,EAA2C,MAAM,UAAU,CAAC;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C,MAAM,IAAI,GAAG;;;qCAGwB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;+BAC1D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;;;yBAGzD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoEvD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAmB;IAChD,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACnK,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC;AAChI,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle generated server entries (adapter servers, edge middleware,
|
|
3
|
+
* `text start` runtime) into single self-contained ES modules with Vite.
|
|
4
|
+
*/
|
|
5
|
+
import type { TextConfig } from "../../config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Absolute path of a framework source file (`server/adapters/runtime.ts`),
|
|
8
|
+
* also when this module runs from `dist/` (the sources ship in `src/`).
|
|
9
|
+
*/
|
|
10
|
+
export declare function frameworkFile(rel: string): string;
|
|
11
|
+
export type BundleTarget = "node" | "bun" | "webworker" | "edge";
|
|
12
|
+
export interface BundleOptions {
|
|
13
|
+
root: string;
|
|
14
|
+
config: TextConfig;
|
|
15
|
+
/** Generated entry module source. */
|
|
16
|
+
code: string;
|
|
17
|
+
outFile: string;
|
|
18
|
+
target: BundleTarget;
|
|
19
|
+
}
|
|
20
|
+
export declare function bundleServerEntry(opts: BundleOptions): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/bundle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK/C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB;AAID,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1E"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle generated server entries (adapter servers, edge middleware,
|
|
3
|
+
* `text start` runtime) into single self-contained ES modules with Vite.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
6
|
+
import { builtinModules } from "node:module";
|
|
7
|
+
import { basename, dirname, join } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { build, mergeConfig } from "vite";
|
|
10
|
+
import { toPosix } from "../scan.js";
|
|
11
|
+
const here = dirname(realpathSync(fileURLToPath(import.meta.url)));
|
|
12
|
+
/**
|
|
13
|
+
* Absolute path of a framework source file (`server/adapters/runtime.ts`),
|
|
14
|
+
* also when this module runs from `dist/` (the sources ship in `src/`).
|
|
15
|
+
*/
|
|
16
|
+
export function frameworkFile(rel) {
|
|
17
|
+
const fromHere = join(here, "..", "..", rel);
|
|
18
|
+
if (existsSync(fromHere))
|
|
19
|
+
return toPosix(fromHere);
|
|
20
|
+
for (let dir = here; dirname(dir) !== dir; dir = dirname(dir)) {
|
|
21
|
+
const pkgFile = join(dir, "package.json");
|
|
22
|
+
if (!existsSync(pkgFile))
|
|
23
|
+
continue;
|
|
24
|
+
const pkg = JSON.parse(readFileSync(pkgFile, "utf8"));
|
|
25
|
+
if (pkg.name === "@textjs/app" && existsSync(join(dir, "src", rel)))
|
|
26
|
+
return toPosix(join(dir, "src", rel));
|
|
27
|
+
}
|
|
28
|
+
throw new Error(`▼ Text.js: could not locate the framework source file src/${rel}.`);
|
|
29
|
+
}
|
|
30
|
+
const ENTRY = "virtual:textjs/server-entry";
|
|
31
|
+
export async function bundleServerEntry(opts) {
|
|
32
|
+
const worker = opts.target === "webworker" || opts.target === "edge";
|
|
33
|
+
const entryPlugin = {
|
|
34
|
+
name: "textjs:server-entry",
|
|
35
|
+
enforce: "pre",
|
|
36
|
+
resolveId(id) {
|
|
37
|
+
return id.endsWith(ENTRY) ? `\0${ENTRY}` : null;
|
|
38
|
+
},
|
|
39
|
+
load(id) {
|
|
40
|
+
return id === `\0${ENTRY}` ? opts.code : null;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
// Workers resolve Node built-ins only by their `node:` names (nodejs_compat); dependencies often import `fs` / `async_hooks`.
|
|
44
|
+
const builtins = {
|
|
45
|
+
name: "textjs:node-builtins",
|
|
46
|
+
enforce: "pre",
|
|
47
|
+
resolveId(id) {
|
|
48
|
+
if (!worker)
|
|
49
|
+
return null;
|
|
50
|
+
if (id.startsWith("node:"))
|
|
51
|
+
return { id, external: true };
|
|
52
|
+
return builtinModules.includes(id) && !id.startsWith("_") ? { id: `node:${id}`, external: true } : null;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const inline = {
|
|
56
|
+
configFile: false,
|
|
57
|
+
root: opts.root,
|
|
58
|
+
mode: "production",
|
|
59
|
+
logLevel: "warn",
|
|
60
|
+
clearScreen: false,
|
|
61
|
+
publicDir: false,
|
|
62
|
+
define: worker ? { "process.env.NODE_ENV": JSON.stringify("production") } : undefined,
|
|
63
|
+
resolve: worker ? { conditions: ["workerd", "worker", "edge-light", "browser", "import", "module", "default"] } : undefined,
|
|
64
|
+
ssr: {
|
|
65
|
+
target: worker ? "webworker" : "node",
|
|
66
|
+
noExternal: true,
|
|
67
|
+
...(worker ? { resolve: { conditions: ["workerd", "worker", "edge-light", "import", "module", "default"], externalConditions: ["workerd", "worker"] } } : {}),
|
|
68
|
+
},
|
|
69
|
+
build: {
|
|
70
|
+
ssr: ENTRY,
|
|
71
|
+
outDir: dirname(opts.outFile),
|
|
72
|
+
emptyOutDir: false,
|
|
73
|
+
copyPublicDir: false,
|
|
74
|
+
target: worker ? "es2022" : "node18",
|
|
75
|
+
minify: false,
|
|
76
|
+
reportCompressedSize: false,
|
|
77
|
+
rollupOptions: {
|
|
78
|
+
external: worker ? [/^node:/] : undefined,
|
|
79
|
+
output: { entryFileNames: basename(opts.outFile), format: "es", inlineDynamicImports: true },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
plugins: [entryPlugin, builtins],
|
|
83
|
+
};
|
|
84
|
+
await build(opts.config.vite ? mergeConfig(inline, opts.config.vite) : inline);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../../src/server/adapters/bundle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAkC,MAAM,MAAM,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,KAAK,IAAI,GAAG,GAAG,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAsB,CAAC;QAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,GAAG,GAAG,CAAC,CAAC;AACvF,CAAC;AAaD,MAAM,KAAK,GAAG,6BAA6B,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAmB;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;IACrE,MAAM,WAAW,GAAW;QAC1B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,KAAK;QACd,SAAS,CAAC,EAAE;YACV,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,EAAE;YACL,OAAO,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;KACF,CAAC;IACF,8HAA8H;IAC9H,MAAM,QAAQ,GAAW;QACvB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,KAAK;QACd,SAAS,CAAC,EAAE;YACV,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC1D,OAAO,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1G,CAAC;KACF,CAAC;IACF,MAAM,MAAM,GAAiB;QAC3B,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QACrF,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC3H,GAAG,EAAE;YACH,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;YACrC,UAAU,EAAE,IAAI;YAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9J;QACD,KAAK,EAAE;YACL,GAAG,EAAE,KAAK;YACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,KAAK;YACpB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACpC,MAAM,EAAE,KAAK;YACb,oBAAoB,EAAE,KAAK;YAC3B,aAAa,EAAE;gBACb,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzC,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE;aAC7F;SACF;QACD,OAAO,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;KACjC,CAAC;IACF,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `text build --adapter cloudflare`: Cloudflare Pages advanced mode.
|
|
3
|
+
* `dist/_worker.js` runs middleware and route handlers; `_routes.json` keeps
|
|
4
|
+
* hashed assets on Pages' static CDN; `env.ASSETS` serves everything else.
|
|
5
|
+
*
|
|
6
|
+
* Requires the `nodejs_compat` compatibility flag (the data cache uses
|
|
7
|
+
* `AsyncLocalStorage`).
|
|
8
|
+
*/
|
|
9
|
+
import type { MiddlewareModule } from "../middleware.js";
|
|
10
|
+
import { type AdapterContext, type AdapterResult } from "./shared.js";
|
|
11
|
+
export declare const CLOUDFLARE_COMPAT: {
|
|
12
|
+
readonly date: "2025-01-01";
|
|
13
|
+
readonly flags: readonly ["nodejs_compat"];
|
|
14
|
+
};
|
|
15
|
+
export interface CloudflareRoutes {
|
|
16
|
+
version: 1;
|
|
17
|
+
include: string[];
|
|
18
|
+
exclude: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `_routes.json`: invoke the worker for everything except hashed assets.
|
|
22
|
+
* Pages serves excluded paths straight from `dist/`, so the exclusion only
|
|
23
|
+
* applies without a basePath (files live at `dist/assets`, not
|
|
24
|
+
* `dist/<base>/assets`), and only when no middleware matcher could cover an
|
|
25
|
+
* asset (`has` / `missing` are request-time and ignored here).
|
|
26
|
+
*/
|
|
27
|
+
export declare function cloudflareRoutes(ctx: AdapterContext, middleware: MiddlewareModule | null): CloudflareRoutes;
|
|
28
|
+
export declare function adaptCloudflare(ctx: AdapterContext, middleware: MiddlewareModule | null): Promise<AdapterResult>;
|
|
29
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAyD,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE1H,eAAO,MAAM,iBAAiB;;;CAA4D,CAAC;AAoC3F,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,gBAAgB,CAM3G;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAsBtH"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `text build --adapter cloudflare`: Cloudflare Pages advanced mode.
|
|
3
|
+
* `dist/_worker.js` runs middleware and route handlers; `_routes.json` keeps
|
|
4
|
+
* hashed assets on Pages' static CDN; `env.ASSETS` serves everything else.
|
|
5
|
+
*
|
|
6
|
+
* Requires the `nodejs_compat` compatibility flag (the data cache uses
|
|
7
|
+
* `AsyncLocalStorage`).
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { matcherCouldMatch, middlewareMatchers } from "../middleware-runtime.js";
|
|
12
|
+
import { bundleServerEntry } from "./bundle.js";
|
|
13
|
+
import { assertNoServerRoutes, removeServerBundle, serverEntry } from "./shared.js";
|
|
14
|
+
export const CLOUDFLARE_COMPAT = { date: "2025-01-01", flags: ["nodejs_compat"] };
|
|
15
|
+
const BODY = `
|
|
16
|
+
async function asset(env, url, request) {
|
|
17
|
+
const res = await env.ASSETS.fetch(new Request(url, { method: request.method, headers: request.headers }));
|
|
18
|
+
if (res.status === 404) return null;
|
|
19
|
+
if (!new URL(url).pathname.startsWith("/assets/") || !res.ok) return res;
|
|
20
|
+
// basePath apps serve hashed assets through the worker (they live at dist/assets, not dist/<base>/assets).
|
|
21
|
+
const out = new Response(res.body, res);
|
|
22
|
+
out.headers.set("cache-control", "public, max-age=31536000, immutable");
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const handler = createRequestHandler({
|
|
27
|
+
...options,
|
|
28
|
+
assets(pathname, request, context) {
|
|
29
|
+
return asset(context.env, new URL(pathname, request.url), request);
|
|
30
|
+
},
|
|
31
|
+
document(request, context) {
|
|
32
|
+
// Pages redirects /index.html to /, so ask for the directory index.
|
|
33
|
+
return asset(context.env, new URL("/", request.url), request);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export default {
|
|
38
|
+
async fetch(request, env, ctx) {
|
|
39
|
+
try {
|
|
40
|
+
return await handler(request, { env, waitUntil: (p) => ctx.waitUntil(p) });
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(error);
|
|
43
|
+
return new Response("500 | Internal Server Error", { status: 500 });
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
`;
|
|
48
|
+
function listAssets(outDir) {
|
|
49
|
+
const dir = join(outDir, "assets");
|
|
50
|
+
if (!existsSync(dir))
|
|
51
|
+
return [];
|
|
52
|
+
const out = [];
|
|
53
|
+
const walk = (d, rel) => {
|
|
54
|
+
for (const name of readdirSync(d)) {
|
|
55
|
+
const p = join(d, name);
|
|
56
|
+
if (statSync(p).isDirectory())
|
|
57
|
+
walk(p, `${rel}/${name}`);
|
|
58
|
+
else
|
|
59
|
+
out.push(`${rel}/${name}`);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
walk(dir, "/assets");
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* `_routes.json`: invoke the worker for everything except hashed assets.
|
|
67
|
+
* Pages serves excluded paths straight from `dist/`, so the exclusion only
|
|
68
|
+
* applies without a basePath (files live at `dist/assets`, not
|
|
69
|
+
* `dist/<base>/assets`), and only when no middleware matcher could cover an
|
|
70
|
+
* asset (`has` / `missing` are request-time and ignored here).
|
|
71
|
+
*/
|
|
72
|
+
export function cloudflareRoutes(ctx, middleware) {
|
|
73
|
+
const base = ctx.basePath;
|
|
74
|
+
const matchers = middleware ? middlewareMatchers(middleware) : null;
|
|
75
|
+
const assets = listAssets(ctx.outDir);
|
|
76
|
+
const assetsRun = middleware ? [...assets, "/assets/__probe.js"].some((p) => matcherCouldMatch(matchers, p)) : false;
|
|
77
|
+
return { version: 1, include: [`${base}/*`], exclude: assetsRun || base ? [] : ["/assets/*"] };
|
|
78
|
+
}
|
|
79
|
+
export async function adaptCloudflare(ctx, middleware) {
|
|
80
|
+
assertNoServerRoutes(ctx, "cloudflare");
|
|
81
|
+
await bundleServerEntry({ root: ctx.root, config: ctx.config, code: serverEntry(ctx, { body: BODY }), outFile: join(ctx.outDir, "_worker.js"), target: "webworker" });
|
|
82
|
+
writeFileSync(join(ctx.outDir, "_routes.json"), `${JSON.stringify(cloudflareRoutes(ctx, middleware), null, 2)}\n`);
|
|
83
|
+
const headersFile = join(ctx.outDir, "_headers");
|
|
84
|
+
const rule = "/assets/*\n Cache-Control: public, max-age=31536000, immutable\n";
|
|
85
|
+
if (!existsSync(headersFile))
|
|
86
|
+
writeFileSync(headersFile, rule);
|
|
87
|
+
else if (!/^\/assets\/\*\s*$/m.test(readFileSync(headersFile, "utf8")))
|
|
88
|
+
writeFileSync(headersFile, `${readFileSync(headersFile, "utf8").trimEnd()}\n\n${rule}`);
|
|
89
|
+
// Without a top-level 404.html, Pages answers unknown files with index.html (200), and missing assets would render the app.
|
|
90
|
+
const notFoundFile = join(ctx.outDir, "404.html");
|
|
91
|
+
if (!existsSync(notFoundFile))
|
|
92
|
+
writeFileSync(notFoundFile, "404 | This page could not be found.\n");
|
|
93
|
+
// Pages would publish dist/.text (server bundles, manifests) as static files.
|
|
94
|
+
removeServerBundle(ctx.outDir);
|
|
95
|
+
return {
|
|
96
|
+
adapter: "cloudflare",
|
|
97
|
+
output: ctx.outDir,
|
|
98
|
+
notes: [
|
|
99
|
+
`Requires the ${CLOUDFLARE_COMPAT.flags.join(", ")} compatibility flag (Pages → Settings → Runtime, or wrangler.toml).`,
|
|
100
|
+
`Preview: bunx wrangler pages dev ${ctx.config.outDir ?? "dist"} --compatibility-flags=nodejs_compat`,
|
|
101
|
+
`Deploy: bunx wrangler pages deploy ${ctx.config.outDir ?? "dist"}`,
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../../src/server/adapters/cloudflare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `text build --adapter <name>` dispatch.
|
|
3
|
+
*/
|
|
4
|
+
import type { MiddlewareModule } from "../middleware.js";
|
|
5
|
+
import type { AdapterContext, AdapterName, AdapterResult } from "./shared.js";
|
|
6
|
+
export { ADAPTERS, detectAdapter, isAdapterName, type AdapterContext, type AdapterName, type AdapterResult } from "./shared.js";
|
|
7
|
+
/** `.text/server/` bundle paths written by `text build`. */
|
|
8
|
+
export declare const SERVER_DIR: string;
|
|
9
|
+
export declare function runAdapter(name: AdapterName, ctx: AdapterContext, middleware: MiddlewareModule | null): Promise<AdapterResult>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKtD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE7H,4DAA4D;AAC5D,eAAO,MAAM,UAAU,QAA0B,CAAC;AAElD,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAWpI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `text build --adapter <name>` dispatch.
|
|
3
|
+
*/
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { adaptBun } from "./bun.js";
|
|
6
|
+
import { adaptCloudflare } from "./cloudflare.js";
|
|
7
|
+
import { adaptStatic } from "./static.js";
|
|
8
|
+
import { adaptVercel } from "./vercel.js";
|
|
9
|
+
export { ADAPTERS, detectAdapter, isAdapterName } from "./shared.js";
|
|
10
|
+
/** `.text/server/` bundle paths written by `text build`. */
|
|
11
|
+
export const SERVER_DIR = join(".text", "server");
|
|
12
|
+
export async function runAdapter(name, ctx, middleware) {
|
|
13
|
+
switch (name) {
|
|
14
|
+
case "static":
|
|
15
|
+
return adaptStatic(ctx, middleware, join(ctx.outDir, SERVER_DIR, "api.mjs"));
|
|
16
|
+
case "bun":
|
|
17
|
+
return adaptBun(ctx);
|
|
18
|
+
case "vercel":
|
|
19
|
+
return adaptVercel(ctx, middleware);
|
|
20
|
+
case "cloudflare":
|
|
21
|
+
return adaptCloudflare(ctx, middleware);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAA6D,MAAM,UAAU,CAAC;AAE7H,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB,EAAE,GAAmB,EAAE,UAAmC;IAC1G,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/E,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACtC,KAAK,YAAY;YACf,OAAO,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.text/server/runtime.mjs`: `middleware.ts` and the `cacheHandler` store,
|
|
3
|
+
* bundled by `text build` for `text start`.
|
|
4
|
+
*/
|
|
5
|
+
import { type CacheStore } from "../cache.js";
|
|
6
|
+
import type { MiddlewareModule } from "../middleware.js";
|
|
7
|
+
export declare const RUNTIME_BUNDLE = "runtime.mjs";
|
|
8
|
+
export interface ServerRuntime {
|
|
9
|
+
middleware?: MiddlewareModule;
|
|
10
|
+
cacheStore?: CacheStore;
|
|
11
|
+
}
|
|
12
|
+
/** Entry source for `runtime.mjs`. */
|
|
13
|
+
export declare function serverRuntimeEntry(middlewareFile: string | null, cacheHandlerFile: string | null): string;
|
|
14
|
+
/** Load `runtime.mjs` from a build (installing its cache store). */
|
|
15
|
+
export declare function loadServerRuntime(outDir: string, fresh?: boolean): Promise<ServerRuntime | null>;
|
|
16
|
+
//# sourceMappingURL=runtime-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-node.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/runtime-node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKzG;AAED,oEAAoE;AACpE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAMpG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.text/server/runtime.mjs`: `middleware.ts` and the `cacheHandler` store,
|
|
3
|
+
* bundled by `text build` for `text start`.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
import { setCacheStore } from "../cache.js";
|
|
9
|
+
export const RUNTIME_BUNDLE = "runtime.mjs";
|
|
10
|
+
/** Entry source for `runtime.mjs`. */
|
|
11
|
+
export function serverRuntimeEntry(middlewareFile, cacheHandlerFile) {
|
|
12
|
+
const lines = [];
|
|
13
|
+
if (middlewareFile)
|
|
14
|
+
lines.push(`import * as middleware from ${JSON.stringify(middlewareFile)};`, "export { middleware };");
|
|
15
|
+
if (cacheHandlerFile)
|
|
16
|
+
lines.push(`import cacheStore from ${JSON.stringify(cacheHandlerFile)};`, "export { cacheStore };");
|
|
17
|
+
return lines.join("\n");
|
|
18
|
+
}
|
|
19
|
+
/** Load `runtime.mjs` from a build (installing its cache store). */
|
|
20
|
+
export async function loadServerRuntime(outDir, fresh = false) {
|
|
21
|
+
const file = join(outDir, ".text", "server", RUNTIME_BUNDLE);
|
|
22
|
+
if (!existsSync(file))
|
|
23
|
+
return null;
|
|
24
|
+
const mod = (await import(pathToFileURL(file).href + (fresh ? `?t=${Date.now()}` : "")));
|
|
25
|
+
if (mod.cacheStore)
|
|
26
|
+
setCacheStore(mod.cacheStore);
|
|
27
|
+
return mod;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=runtime-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-node.js","sourceRoot":"","sources":["../../../src/server/adapters/runtime-node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAmB,MAAM,UAAU,CAAC;AAG1D,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAO5C,sCAAsC;AACtC,MAAM,UAAU,kBAAkB,CAAC,cAA6B,EAAE,gBAA+B;IAC/F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAC3H,IAAI,gBAAgB;QAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAC1H,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAK,GAAG,KAAK;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAkB,CAAC;IAC1G,IAAI,GAAG,CAAC,UAAU;QAAE,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Web-standard Text.js server (`(Request) => Response`) bundled into every
|
|
3
|
+
* deploy adapter: middleware → rewrites → route handlers (with the route
|
|
4
|
+
* cache) → static assets → the SPA document.
|
|
5
|
+
*
|
|
6
|
+
* No Node imports: this file runs on Bun, Node, Vercel and Cloudflare Workers.
|
|
7
|
+
*/
|
|
8
|
+
import type { Rewrite } from "../../config.js";
|
|
9
|
+
import { type RouteManifest } from "../../routing.js";
|
|
10
|
+
import { type CacheStore } from "../cache.js";
|
|
11
|
+
import { type RouteHandlerModule } from "../http.js";
|
|
12
|
+
import type { MiddlewareModule } from "../middleware.js";
|
|
13
|
+
export interface RequestContext {
|
|
14
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
15
|
+
/** Platform bindings (Cloudflare `env`). */
|
|
16
|
+
env?: unknown;
|
|
17
|
+
/** The client's address, when the platform knows it. */
|
|
18
|
+
clientAddress?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface RequestHandlerOptions {
|
|
21
|
+
/** API route manifest: leaf `files.page` values are keys into `handlers`. */
|
|
22
|
+
manifest: RouteManifest;
|
|
23
|
+
handlers: Record<string, RouteHandlerModule>;
|
|
24
|
+
middleware?: MiddlewareModule;
|
|
25
|
+
/** Skip middleware (it already ran at the edge, e.g. on Vercel). */
|
|
26
|
+
skipMiddleware?: boolean;
|
|
27
|
+
basePath?: string;
|
|
28
|
+
rewrites?: Rewrite[];
|
|
29
|
+
cacheStore?: CacheStore;
|
|
30
|
+
/** Serve a static file for `pathname` (without basePath), or `null`. */
|
|
31
|
+
assets?: (pathname: string, request: Request, context: RequestContext) => Promise<Response | null> | Response | null;
|
|
32
|
+
/** The SPA document (`index.html`) for page routes. */
|
|
33
|
+
document?: (request: Request, context: RequestContext) => Promise<Response | null> | Response | null;
|
|
34
|
+
/**
|
|
35
|
+
* Server-rendered routes (`runtime = "server"`) and prerendered shells, after
|
|
36
|
+
* middleware and rewrites. `url` is the path and query without basePath.
|
|
37
|
+
*/
|
|
38
|
+
live?: (request: Request, url: string, context: RequestContext) => Promise<Response | null> | Response | null;
|
|
39
|
+
}
|
|
40
|
+
export type TextRequestHandler = (request: Request, context?: RequestContext) => Promise<Response>;
|
|
41
|
+
export declare function createRequestHandler(options: RequestHandlerOptions): TextRequestHandler;
|
|
42
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAkB,KAAK,aAAa,EAAyB,MAAM,eAAe,CAAC;AAE1F,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAoF,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAChD,4CAA4C;IAC5C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,oEAAoE;IACpE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wEAAwE;IACxE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;IACrH,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;IACrG;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC/G;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AA4BnG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,kBAAkB,CAuEvF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Web-standard Text.js server (`(Request) => Response`) bundled into every
|
|
3
|
+
* deploy adapter: middleware → rewrites → route handlers (with the route
|
|
4
|
+
* cache) → static assets → the SPA document.
|
|
5
|
+
*
|
|
6
|
+
* No Node imports: this file runs on Bun, Node, Vercel and Cloudflare Workers.
|
|
7
|
+
*/
|
|
8
|
+
import { matchAppRoutes } from "../../routing.js";
|
|
9
|
+
import { runRouteHandlerWithCache } from "../cache-route.js";
|
|
10
|
+
import { setCacheStore } from "../cache.js";
|
|
11
|
+
import { applyRewrites, compileRewrite, isLoopbackUrl, normalizeRequestTarget, proxyFetch } from "../http.js";
|
|
12
|
+
import { rebuild, runMiddleware, withMiddlewareHeaders } from "../middleware-runtime.js";
|
|
13
|
+
function notFound() {
|
|
14
|
+
return new Response("404 | This page could not be found.", { status: 404, headers: { "content-type": "text/plain; charset=utf-8" } });
|
|
15
|
+
}
|
|
16
|
+
function stripBase(pathname, basePath) {
|
|
17
|
+
if (!basePath)
|
|
18
|
+
return pathname;
|
|
19
|
+
if (pathname === basePath)
|
|
20
|
+
return "/";
|
|
21
|
+
return pathname.startsWith(`${basePath}/`) ? pathname.slice(basePath.length) : null;
|
|
22
|
+
}
|
|
23
|
+
function matchApi(manifest, pathname) {
|
|
24
|
+
const m = matchAppRoutes(manifest, pathname);
|
|
25
|
+
if (!m)
|
|
26
|
+
return null;
|
|
27
|
+
const leaf = m.chain[m.chain.length - 1];
|
|
28
|
+
const id = leaf.files?.page;
|
|
29
|
+
return id ? { id, pattern: m.pattern, params: m.params } : null;
|
|
30
|
+
}
|
|
31
|
+
function safeDecode(pathname) {
|
|
32
|
+
try {
|
|
33
|
+
return decodeURIComponent(pathname);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function createRequestHandler(options) {
|
|
40
|
+
const basePath = options.basePath ?? "";
|
|
41
|
+
const rewrites = (options.rewrites ?? []).map(compileRewrite);
|
|
42
|
+
if (options.cacheStore)
|
|
43
|
+
setCacheStore(options.cacheStore);
|
|
44
|
+
return async (raw, context = {}) => {
|
|
45
|
+
// `//evil.com/x` (and `/\evil.com/x`) must never resolve to another origin downstream.
|
|
46
|
+
const rawUrl = new URL(raw.url);
|
|
47
|
+
const normalized = normalizeRequestTarget(`${rawUrl.pathname}${rawUrl.search}`);
|
|
48
|
+
const incoming = normalized === `${rawUrl.pathname}${rawUrl.search}` ? raw : rebuild(raw, new Headers(raw.headers), new URL(normalized, rawUrl.origin));
|
|
49
|
+
const url = new URL(incoming.url);
|
|
50
|
+
const stripped = stripBase(url.pathname, basePath);
|
|
51
|
+
if (stripped === null)
|
|
52
|
+
return notFound();
|
|
53
|
+
let pathname = stripped;
|
|
54
|
+
let search = url.search;
|
|
55
|
+
let request = incoming;
|
|
56
|
+
let extra = null;
|
|
57
|
+
let merge = {};
|
|
58
|
+
const finish = (response) => (extra ? withMiddlewareHeaders(response, extra, merge) : response);
|
|
59
|
+
if (options.middleware && !options.skipMiddleware) {
|
|
60
|
+
const outcome = await runMiddleware(options.middleware, request, { basePath, waitUntil: context.waitUntil });
|
|
61
|
+
if (outcome.type === "response")
|
|
62
|
+
return outcome.response;
|
|
63
|
+
request = outcome.request;
|
|
64
|
+
extra = outcome.headers;
|
|
65
|
+
merge = { status: outcome.status, private: outcome.private };
|
|
66
|
+
if (outcome.rewrite) {
|
|
67
|
+
if (outcome.rewrite.origin !== url.origin)
|
|
68
|
+
return finish(await proxyFetch(request, outcome.rewrite, { stripCredentials: !isLoopbackUrl(outcome.rewrite.href) }));
|
|
69
|
+
const p = stripBase(outcome.rewrite.pathname, basePath);
|
|
70
|
+
pathname = p ?? outcome.rewrite.pathname;
|
|
71
|
+
search = outcome.rewrite.search;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (rewrites.length > 0) {
|
|
75
|
+
const target = applyRewrites(rewrites, pathname + search);
|
|
76
|
+
if (target) {
|
|
77
|
+
if (/^[a-z]+:\/\//i.test(target))
|
|
78
|
+
return finish(await proxyFetch(request, target, { stripCredentials: !isLoopbackUrl(target) }));
|
|
79
|
+
const u = new URL(target, url.origin);
|
|
80
|
+
pathname = u.pathname;
|
|
81
|
+
search = u.search;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (options.live) {
|
|
85
|
+
const live = await options.live(request, pathname + search, context);
|
|
86
|
+
if (live)
|
|
87
|
+
return finish(live);
|
|
88
|
+
}
|
|
89
|
+
const decoded = safeDecode(pathname);
|
|
90
|
+
if (decoded === null)
|
|
91
|
+
return finish(new Response("400 | Bad Request", { status: 400 }));
|
|
92
|
+
const api = matchApi(options.manifest, decoded);
|
|
93
|
+
const mod = api ? options.handlers[api.id] : undefined;
|
|
94
|
+
if (api && mod) {
|
|
95
|
+
const target = new URL(pathname + search, url.origin);
|
|
96
|
+
const req = target.href === request.url ? request : rebuild(request, new Headers(request.headers), target);
|
|
97
|
+
return finish(await runRouteHandlerWithCache(mod, req, { params: api.params, pattern: api.pattern, pathname: decoded, waitUntil: context.waitUntil }));
|
|
98
|
+
}
|
|
99
|
+
const method = request.method.toUpperCase();
|
|
100
|
+
if (method !== "GET" && method !== "HEAD")
|
|
101
|
+
return finish(new Response(null, { status: 405, headers: { allow: "GET, HEAD" } }));
|
|
102
|
+
const hidden = decoded.split(/[/\\]/).some((p) => p.startsWith(".") && p.length > 1);
|
|
103
|
+
if (!hidden && options.assets) {
|
|
104
|
+
const asset = await options.assets(decoded, request, context);
|
|
105
|
+
if (asset)
|
|
106
|
+
return finish(asset);
|
|
107
|
+
}
|
|
108
|
+
const last = decoded.split("/").pop() ?? "";
|
|
109
|
+
if (last.includes(".") || hidden || !options.document)
|
|
110
|
+
return finish(notFound());
|
|
111
|
+
const doc = await options.document(request, context);
|
|
112
|
+
return finish(doc ?? notFound());
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=runtime.js.map
|