包含前端源码、预构建产物(dist/)、零依赖 Node.js 服务器(server.mjs)、 Cloudflare Worker 版本(worker/)、部署文档(DEPLOY.md)和交接文档。 技术总监可直接 clone 后运行 node server.mjs 启动,无需安装 React 或 build。 DEEPSEEK_API_KEY 通过环境变量注入,未纳入仓库。
69 lines
2.2 KiB
JavaScript
69 lines
2.2 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { access } from "node:fs/promises";
|
|
import test from "node:test";
|
|
import worker from "../worker/index.js";
|
|
|
|
test("serves existing static assets without a fallback", async () => {
|
|
const calls = [];
|
|
const response = await worker.fetch(new Request("https://example.test/assets/app.js"), {
|
|
ASSETS: {
|
|
fetch: async (request) => {
|
|
calls.push(new URL(request.url).pathname);
|
|
return new Response("asset", { status: 200 });
|
|
},
|
|
},
|
|
});
|
|
|
|
assert.equal(response.status, 200);
|
|
assert.deepEqual(calls, ["/assets/app.js"]);
|
|
});
|
|
|
|
test("falls back to index.html for an unknown app route", async () => {
|
|
const calls = [];
|
|
const response = await worker.fetch(
|
|
new Request("https://example.test/flow/step-two?source=share", {
|
|
headers: { accept: "text/html" },
|
|
}),
|
|
{
|
|
ASSETS: {
|
|
fetch: async (request) => {
|
|
const url = new URL(request.url);
|
|
calls.push(url.pathname + url.search);
|
|
return new Response(url.pathname === "/index.html" ? "app" : "missing", {
|
|
status: url.pathname === "/index.html" ? 200 : 404,
|
|
});
|
|
},
|
|
},
|
|
},
|
|
);
|
|
|
|
assert.equal(response.status, 200);
|
|
assert.deepEqual(calls, ["/flow/step-two?source=share", "/index.html"]);
|
|
});
|
|
|
|
test("does not turn missing API or write requests into the app shell", async () => {
|
|
for (const request of [
|
|
new Request("https://example.test/api/missing", { headers: { accept: "application/json" } }),
|
|
new Request("https://example.test/flow", { method: "POST", headers: { accept: "text/html" } }),
|
|
]) {
|
|
let calls = 0;
|
|
const response = await worker.fetch(request, {
|
|
ASSETS: {
|
|
fetch: async () => {
|
|
calls += 1;
|
|
return new Response("missing", { status: 404 });
|
|
},
|
|
},
|
|
});
|
|
|
|
assert.equal(response.status, 404);
|
|
assert.equal(calls, 1);
|
|
}
|
|
});
|
|
|
|
test("emits the files required by Sites packaging", async () => {
|
|
await access(new URL("../dist/client/index.html", import.meta.url));
|
|
await access(new URL("../dist/server/index.js", import.meta.url));
|
|
await access(new URL("../dist/.openai/hosting.json", import.meta.url));
|
|
});
|