My personal site cherry.computer
htmx tailwind axum askama
at main 85 lines 2.3 kB view raw
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}