39 lines
1.5 KiB
JavaScript
39 lines
1.5 KiB
JavaScript
import http from "node:http";
|
|
import { readFile } from "node:fs/promises";
|
|
import composition from "./compose.cjs";
|
|
|
|
// Development-only routes. Never expose the workspace or forward API requests.
|
|
const routes = new Map([
|
|
["/", ["../tests/fixtures/extension.html", "text/html"]],
|
|
["/extension.js", ["../tests/fixtures/extension.js", "text/javascript"]],
|
|
["/consumption-trend.html", ["../tests/fixtures/consumption-trend.html", "text/html"]]
|
|
]);
|
|
const server = http.createServer(async (request, response) => {
|
|
const pathname = new URL(request.url, "http://127.0.0.1").pathname;
|
|
response.setHeader("Cache-Control", "no-store");
|
|
response.setHeader("X-Content-Type-Options", "nosniff");
|
|
if (request.method !== "GET") {
|
|
response.writeHead(405).end();
|
|
return;
|
|
}
|
|
try {
|
|
if (pathname === "/fixture-runtime.js") {
|
|
response.setHeader("Content-Type", "text/javascript");
|
|
response.end(`window.createFixtureApplication = ${composition.composeScript("content", { bootstrap: false })}`);
|
|
return;
|
|
}
|
|
const route = routes.get(pathname);
|
|
if (!route) {
|
|
response.writeHead(404).end();
|
|
return;
|
|
}
|
|
response.setHeader("Content-Type", `${route[1]}; charset=utf-8`);
|
|
response.end(await readFile(new URL(route[0], import.meta.url)));
|
|
} catch {
|
|
response.writeHead(500).end("Fixture could not be loaded.");
|
|
}
|
|
});
|
|
server.listen(Number(process.env.PORT) || 0, "127.0.0.1", () => {
|
|
console.log(`Synthetic extension preview: http://127.0.0.1:${server.address().port}/`);
|
|
});
|