131 lines
3.8 KiB
TypeScript
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 (_) {}
|
|
}
|
|
}
|
|
})();
|