My personal site
cherry.computer
htmx
tailwind
axum
askama
1// @ts-check
2import browserslist from "browserslist";
3import esbuild from "esbuild";
4import { esbuildPluginBrowserslist } from "esbuild-plugin-browserslist";
5import minimist from "minimist";
6
7import child_process from "node:child_process";
8import http from "node:http";
9
10const argv = minimist(process.argv.slice(2));
11
12/** @type {esbuild.BuildOptions} */
13const baseOptions = {
14 entryPoints: ["src/ts/main.ts"],
15 bundle: true,
16 format: "esm",
17 logLevel: "info",
18 plugins: [
19 esbuildPluginBrowserslist(browserslist(), { printUnknownTargets: false }),
20 ],
21};
22
23const tailwindBin = "../node_modules/.bin/tailwindcss";
24const tailwindArgs = [
25 "-i",
26 "src/css/tailwind.css",
27 "-o",
28 "src/css/tailwind-out.css",
29];
30
31const devOptions = {
32 ...baseOptions,
33 sourcemap: true,
34 outfile: "build/app.js",
35};
36if (argv.serve) {
37 child_process.fork(tailwindBin, [...tailwindArgs, "-w"]);
38
39 const context = await esbuild.context(devOptions);
40 const { hosts, port } = await context.serve({ servedir: "." });
41
42 const proxyPort = 3000;
43 console.log(`serving at http://localhost:${proxyPort}`);
44 http
45 .createServer((req, res) => {
46 const options = {
47 path: req.url,
48 method: req.method,
49 headers: req.headers,
50 };
51 const url = new URL(`http://localhost${req.url}`);
52 const route =
53 url.pathname === "/" ||
54 url.pathname === "/dev/am-auth-flow" ||
55 url.pathname.startsWith("/media/")
56 ? { hostname: "127.0.0.1", port: 53465 }
57 : { hostname: hosts[0], port };
58 const routedOptions = { ...options, ...route };
59
60 const proxyReq = http.request(routedOptions, (proxyRes) => {
61 if (proxyRes.statusCode) {
62 res.writeHead(proxyRes.statusCode, proxyRes.headers);
63 }
64 proxyRes.pipe(res, { end: true });
65 });
66 proxyReq.on("error", (e) => {
67 console.error(`problem with request: ${e.message}`);
68 });
69 req.pipe(proxyReq, { end: true });
70 })
71 .listen(proxyPort);
72} else {
73 const tailwindChild = child_process.fork(tailwindBin, tailwindArgs);
74 await new Promise((resolve) => tailwindChild.on("exit", resolve));
75
76 if (argv.prod) {
77 await esbuild.build({
78 ...baseOptions,
79 minify: true,
80 outfile: "build/app.min.js",
81 });
82 } else {
83 await esbuild.build(devOptions);
84 }
85}