Keyborg/server/autoBundler.ts
2025-01-22 20:05:24 +03:00

131 lines
3.8 KiB
TypeScript

import * as esbuild from "npm:esbuild";
import { denoPlugins } from "jsr:@luca/esbuild-deno-loader";
import init, { minify } from "npm:@minify-html/wasm";
import { relative } from "jsr:@std/path@^1.0.8/relative";
await esbuild.build({
plugins: [
...denoPlugins(),
],
entryPoints: ["../shared/utils/index.ts"],
outfile: "./public/js/shared.bundle.js",
bundle: true,
minify: true,
format: "esm",
});
esbuild.stop();
const JS_FROM_DIR = "./src/js/";
const JS_TO_DIR = "./public/js/";
const JS_EXCLUDE = ".bundle.ts";
const watcherJS = Deno.watchFs(JS_FROM_DIR);
const cwd = Deno.cwd();
function getPublic(paths: string[]): string[] {
return paths.map((path) =>
path.replace(JS_FROM_DIR, JS_TO_DIR).replace(".ts", ".js")
);
}
(async () => {
for await (const event of watcherJS) {
const paths = event.paths.filter((path) =>
!path.endsWith(JS_EXCLUDE) &&
(path.endsWith(".ts") || path.endsWith(".js"))
);
if (event.kind === "modify" || event.kind === "create") {
await esbuild.build({
plugins: [
...denoPlugins(),
],
entryPoints: paths,
outbase: JS_FROM_DIR,
outdir: JS_TO_DIR,
bundle: false,
minify: true,
format: "esm",
});
esbuild.stop();
for (
const path of getPublic(paths)
) {
try {
const content = await Deno.readTextFile(path);
const staticImportRegex =
/(import\s*[^'"]+from\s*['"])([^'"]+?)(\.ts)(['"])/g;
const dynamicImportRegex =
/(import\(\s*['"])([^'"]+?)(\.ts)(['"]\s*\))/g;
let updatedContent = content.replace(
staticImportRegex,
(_, p1, p2, p3, p4) => {
return `${p1}${p2}.js${p4}`;
},
);
updatedContent = updatedContent.replace(
dynamicImportRegex,
(_, p1, p2, p3, p4) => {
return `${p1}${p2}.js${p4}`;
},
);
await Deno.writeTextFile(path, updatedContent);
} catch (e) {}
}
} else if (event.kind === "remove") {
try {
for (const path of getPublic(paths)) {
await Deno.remove(path);
}
} catch (e) {}
}
}
})();
const HTML_FROM_DIR = "./src/views/";
const HTML_TO_DIR = "./views/";
const watcherHTML = Deno.watchFs(HTML_FROM_DIR);
function minifyHTML(html: Uint8Array) {
const data = minify(html, {
keep_spaces_between_attributes: true,
keep_comments: true,
preserve_brace_template_syntax: true,
});
return data;
}
function getHTMLToPath(path: string) {
return path.replace(HTML_FROM_DIR, HTML_TO_DIR);
}
(async () => {
for await (const event of watcherHTML) {
const paths = event.paths.filter((path) => path.endsWith(".html"));
if (event.kind === "modify" || event.kind === "create") {
try {
for (const path of paths) {
const html = await Deno.readFile(path);
const data = minifyHTML(html);
await Deno.writeFile(getHTMLToPath(path), data);
}
} catch (_) {}
} else if (event.kind === "remove") {
try {
for (const path of paths) {
await Deno.remove(getHTMLToPath(path));
}
} catch (_) {}
}
}
})();