56 lines
1.5 KiB
TypeScript
Executable file
56 lines
1.5 KiB
TypeScript
Executable file
#!/usr/bin/env -S deno run --allow-run --allow-net
|
|
// Automated bundle server
|
|
|
|
import { bool } from "https://code.thunderk.net/typescript/functional/raw/1.0.0/all.ts";
|
|
import {
|
|
Response,
|
|
serve,
|
|
ServerRequest,
|
|
} from "https://deno.land/std@0.79.0/http/server.ts";
|
|
|
|
export async function processRequest(
|
|
req: ServerRequest,
|
|
runner = Deno.run,
|
|
): Promise<Response> {
|
|
const params = req.url.split("/").filter(bool);
|
|
const lib = params[0] || "all";
|
|
const version = params[1] || "master";
|
|
const file = params.length > 2 ? params.slice(2).join("/") : "all";
|
|
const path =
|
|
`https://code.thunderk.net/typescript/${lib}/raw/${version}/${file}.ts`;
|
|
if (!path.match(/^[a-z0-9\/\.\-:_]+$/)) {
|
|
return {
|
|
status: 400,
|
|
body: `console.error("bundler error - Invalid path ${path}");`,
|
|
};
|
|
}
|
|
|
|
const process = runner({
|
|
cmd: ["deno", "bundle", path],
|
|
stdout: "piped",
|
|
});
|
|
const output = await process.output();
|
|
const status = await process.status();
|
|
if (status.success) {
|
|
return { body: output };
|
|
} else {
|
|
return {
|
|
status: 500,
|
|
body: `console.error("bundler error - Failed to bundle ${path}");`,
|
|
};
|
|
}
|
|
}
|
|
|
|
export async function serveBundles() {
|
|
const listen = { hostname: "0.0.0.0", port: 8000 };
|
|
const server = serve(listen);
|
|
console.log(`Serving bundles on ${listen.hostname}:${listen.port} ...`);
|
|
for await (const req of server) {
|
|
const response = await processRequest(req);
|
|
await req.respond(response);
|
|
}
|
|
}
|
|
|
|
if (import.meta.main) {
|
|
await serveBundles();
|
|
}
|