index : btroops | |
Virtual board game-aid for BattleTroops, an infantry combat simulator wargame published by FASA in 1989. |
aboutsummaryrefslogtreecommitdiff |
path: root/esbuild-server.mjs
diff options
Diffstat (limited to 'esbuild-server.mjs')
-rw-r--r-- | esbuild-server.mjs | 80 |
1 files changed, 61 insertions, 19 deletions
diff --git a/esbuild-server.mjs b/esbuild-server.mjs index 73fabab..72ab68b 100644 --- a/esbuild-server.mjs +++ b/esbuild-server.mjs @@ -1,6 +1,7 @@ import * as esbuild from 'esbuild'; import * as fs from 'node:fs'; import http from 'node:http'; +import path from 'node:path'; const colors = { reset: '\x1b[0m', @@ -18,29 +19,32 @@ const svgUseCacheBust = { name: 'svgUseCacheBust', setup(build) { build.onStart(() => { - const version = Date.now(); - console.log(`Adding cache buster ${version}`); - const file = fs.readFileSync('./src/scenario-side_show.svg', { encoding: 'utf-8' }); - const newFile = file.replaceAll('%%VERSION%%', version); - fs.writeFileSync('./public/assets/images/scenario-side_show.svg', newFile); - const files = fs.readdirSync('./public/assets/images').filter(fn => regex.test(fn)); - files.forEach(fn => fs.unlinkSync(`./public/assets/images/${fn}`)); - fs.copyFileSync('./public/assets/images/mapsheets.svg', `./public/assets/images/mapsheets.${version}.svg`); + console.log("BUILD START"); + + // const version = Date.now(); + // const file = fs.readFileSync('./src/scenario-side_show.svg', { encoding: 'utf-8' }); + // const newFile = file.replaceAll('%%VERSION%%', version); + // fs.writeFileSync('./public/assets/images/scenario-side_show.svg', newFile); + // const files = fs.readdirSync('./public/assets/images').filter(fn => regex.test(fn)); + // files.forEach(fn => fs.unlinkSync(`./public/assets/images/${fn}`)); + // fs.copyFileSync('./public/assets/images/mapsheets.svg', `./public/assets/images/mapsheets.${version}.svg`); }) } -} +}; + +const paths = ['/esbuild', '/index.js', '/map.js', '/soldier_record_block.js']; const ctx = await esbuild.context({ entryPoints: ['src/*.js'], bundle: true, - outdir: 'public', + outdir: 'build', plugins: [svgUseCacheBust], }); await ctx.watch(); const { host, port } = await ctx.serve({ - servedir: 'public', + servedir: 'build', port: 3000, onRequest: function({ remoteAddress, method, path, status, timeInMS }) { let statusColor = colors.red; @@ -64,15 +68,53 @@ http.createServer((req, res) => { headers: req.headers, } - const proxyReq = http.request(options, proxyRes => { - for (const k in proxyRes.headers) { - res.setHeader(k, proxyRes.headers[k]); - } + if (paths.includes(req.url)) { + const proxyReq = http.request(options, proxyRes => { + for (const k in proxyRes.headers) { + res.setHeader(k, proxyRes.headers[k]); + } + + res.writeHead(proxyRes.statusCode, { 'Cache-Control': 'no-cache, no-store, must-revalidate' }); + + proxyRes.pipe(res, { end: true }); + }) + + return req.pipe(proxyReq, { end: true }); + } + + console.log(host, port, req.method, req.url, res.statusCode); + + const serverUrl = `http://localhost:${port}`; + const url = new URL(`${serverUrl}${req.url}`); + const dir = 'public'; + + const filePath = path.normalize( + path.join(dir, url.pathname === '/' ? 'index.html' : url.pathname) + ); - res.writeHead(proxyRes.statusCode, { 'Cache-Control': 'no-cache, no-store, must-revalidate' }); + for (const k in res.headers) { + res.setHeader(k, res.headers[k]); + } + + let contentType; + + if (req.url.endsWith('.svg')) { + contentType = 'image/svg+xml'; + } else if (req.url.endsWith('.png')) { + contentType = 'image/png'; + } else if (req.url.endsWith('.jpg')) { + contentType = 'image/jpeg'; + } else if (req.url.endsWith('.css')) { + contentType = 'text/css'; + } else { + contentType = 'text/html'; + } - proxyRes.pipe(res, { end: true }); - }) + res.writeHead(res.statusCode, { + 'Cache-Control': 'no-cache, no-store, must-revalidate', + 'Content-Type': contentType + }); - req.pipe(proxyReq, { end: true }); + const readStream = fs.createReadStream(filePath, { autoClose: true }); + readStream.pipe(res, { end: true }); }).listen(8080); |