#!/usr/bin/env node /* eslint-env node */ const esbuild = require("esbuild"); const path = require("path"); const fs = require("fs"); const { createServer } = require("http"); const { wasmTextPlugin } = require("./scripts/esbuild/wasm-text"); const { forthPlugin } = require("./scripts/esbuild/forth"); function withWatcher(config, handleBuildFinished = () => {}, port = 8880) { const watchClients = []; createServer((req, res) => { return watchClients.push( res.writeHead(200, { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Access-Control-Allow-Origin": "*", Connection: "keep-alive", }) ); }).listen(port); return { ...config, banner: { js: `(function () { new EventSource("http://localhost:${port}").onmessage = function() { location.reload();};})();`, }, watch: { async onRebuild(error, result) { if (error) { console.error(error); } else { await handleBuildFinished(result); watchClients.forEach((res) => res.write("data: update\n\n")); watchClients.length = 0; } }, }, }; } let dev = false; let watch = false; for (const arg of process.argv.slice(2)) { switch (arg) { case "--development": dev = true; break; case "--watch": watch = true; break; } } let buildConfig = { bundle: true, logLevel: "info", entryPoints: [ path.join(__dirname, "src", "web", "shell", "shell"), path.join(__dirname, "src", "web", "tests", "tests"), path.join(__dirname, "src", "web", "benchmarks", "benchmarks"), path.join(__dirname, "src", "web", "examples", "prompt", "prompt"), path.join(__dirname, "src", "web", "thurtle", "thurtle"), ], entryNames: dev ? "[name]" : "[name]-c$[hash]", assetNames: "[name]-c$[hash]", // target: "es6", outdir: path.join(__dirname, "public/waforth/dist"), publicPath: "/waforth/dist", external: ["fs", "stream", "util", "events"], minify: !dev, loader: { ".wasm": "binary", ".js": "jsx", ".fs": "text", ".svg": "file", }, define: { WAFORTH_VERSION: watch ? `"dev"` : // : `"${new Date().toISOString().replace(/T.|)}>#g, "")}"`, JSON.stringify(JSON.parse(fs.readFileSync("package.json")).version), }, sourcemap: true, metafile: true, plugins: [ wasmTextPlugin({ debug: true }), forthPlugin(), // Resolve 'waforth' to the main entrypoint (for examples) { name: "waforth", setup: (build) => { build.onResolve({ filter: /^waforth$/ }, () => { return { path: path.join(__dirname, "src", "web", "waforth.ts") }; }); }, }, ], }; const INDEX_TEMPLATE = `