Release Helper Tools 0.1.0
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
import { createServer } from "node:http";
|
||||
import { readFile, stat } from "node:fs/promises";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const root = path.resolve(
|
||||
path.dirname(fileURLToPath(import.meta.url)),
|
||||
"..",
|
||||
"dist",
|
||||
);
|
||||
const nestedPrefix = "/deep/nested/helpers/";
|
||||
const mediaTypes = new Map([
|
||||
[".css", "text/css; charset=utf-8"],
|
||||
[".html", "text/html; charset=utf-8"],
|
||||
[".js", "application/javascript; charset=utf-8"],
|
||||
[".json", "application/json; charset=utf-8"],
|
||||
[".md", "text/markdown; charset=utf-8"],
|
||||
[".svg", "image/svg+xml"],
|
||||
[".txt", "text/plain; charset=utf-8"],
|
||||
[".webmanifest", "application/manifest+json"],
|
||||
]);
|
||||
const headers = {
|
||||
"Content-Security-Policy":
|
||||
"default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data: blob:; object-src 'none'; base-uri 'self'; form-action 'none'; frame-ancestors 'none'",
|
||||
"Cross-Origin-Opener-Policy": "same-origin",
|
||||
"Cross-Origin-Resource-Policy": "same-origin",
|
||||
"Permissions-Policy": "camera=(), microphone=(), geolocation=()",
|
||||
"Referrer-Policy": "no-referrer",
|
||||
"X-Content-Type-Options": "nosniff",
|
||||
};
|
||||
|
||||
createServer(async (request, response) => {
|
||||
try {
|
||||
const url = new URL(request.url ?? "/", "http://127.0.0.1");
|
||||
if (!url.pathname.startsWith(nestedPrefix)) {
|
||||
response.writeHead(404, headers).end("Not found");
|
||||
return;
|
||||
}
|
||||
let relative = decodeURIComponent(url.pathname.slice(nestedPrefix.length));
|
||||
if (!relative || relative.endsWith("/")) relative += "index.html";
|
||||
if (relative.includes("\\") || relative.split("/").includes("..")) {
|
||||
response.writeHead(400, headers).end("Bad path");
|
||||
return;
|
||||
}
|
||||
const absolute = path.resolve(root, relative);
|
||||
if (
|
||||
!absolute.startsWith(`${root}${path.sep}`) ||
|
||||
!(await stat(absolute)).isFile()
|
||||
) {
|
||||
response.writeHead(404, headers).end("Not found");
|
||||
return;
|
||||
}
|
||||
const body = await readFile(absolute);
|
||||
response.writeHead(200, {
|
||||
...headers,
|
||||
"Content-Type":
|
||||
mediaTypes.get(path.extname(absolute)) ?? "application/octet-stream",
|
||||
"Cache-Control": relative.startsWith("assets/")
|
||||
? "public, max-age=31536000, immutable"
|
||||
: "no-cache",
|
||||
});
|
||||
response.end(body);
|
||||
} catch {
|
||||
response.writeHead(404, headers).end("Not found");
|
||||
}
|
||||
}).listen(4173, "127.0.0.1", () => {
|
||||
console.log(`Serving Helper Tools at http://127.0.0.1:4173${nestedPrefix}`);
|
||||
});
|
||||
Reference in New Issue
Block a user