From f3bf1602d51d3203927a04ce7bc5585138726e01 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Mon, 26 Jul 2021 21:18:07 -0500 Subject: [PATCH] started bundling worker with esbuild --- Makefile | 6 +-- package-lock.json | 17 ++++++++ package.json | 3 ++ src/ide/ui.ts | 10 +++-- src/worker/assembler.ts | 2 +- src/worker/loader.ts | 6 --- src/worker/nodemain.js | 86 ------------------------------------- src/worker/workermain.ts | 43 +++++++------------ test/cli/workertestutils.js | 3 +- 9 files changed, 48 insertions(+), 128 deletions(-) delete mode 100644 src/worker/loader.ts delete mode 100644 src/worker/nodemain.js diff --git a/Makefile b/Makefile index 31afcf03..dddc8a71 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ TMP=./tmp/dist buildtsc: $(TSC) tsconfig.json + npm run esbuild prepare: buildtsc patch -i meta/electron.diff -o electron.html @@ -41,13 +42,10 @@ desktop: distro meta/electron.diff: index.html electron.html -diff -u index.html electron.html > $@ -web: - (ip addr || ifconfig) | grep inet - python3 scripts/serveit.py 2>> /dev/null #http.out - tsweb: (ip addr || ifconfig) | grep inet $(TSC) -w & + npm run eswatch & python3 scripts/serveit.py 2>> /dev/null #http.out astrolibre.b64.txt: astrolibre.rom diff --git a/package-lock.json b/package-lock.json index 048eb65b..dc0c0f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "electron": "^9.4.0", "electron-builder": "^22.11.7", "electron-packager": "^15.2.0", + "esbuild": "^0.12.16", "file-saver": "^2.0.5", "heapdump": "^0.3.15", "jsdom": "^12.2.0", @@ -3479,6 +3480,16 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "devOptional": true }, + "node_modules/esbuild": { + "version": "0.12.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.16.tgz", + "integrity": "sha512-XqI9cXP2bmQ6MREIqrYBb13KfYFSERsV1+e5jSVWps8dNlLZK+hln7d0mznzDIpfISsg/AgQW0DW3kSInXWhrg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + } + }, "node_modules/escalade": { "version": "3.1.1", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", @@ -11823,6 +11834,12 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "devOptional": true }, + "esbuild": { + "version": "0.12.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.16.tgz", + "integrity": "sha512-XqI9cXP2bmQ6MREIqrYBb13KfYFSERsV1+e5jSVWps8dNlLZK+hln7d0mznzDIpfISsg/AgQW0DW3kSInXWhrg==", + "dev": true + }, "escalade": { "version": "3.1.1", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", diff --git a/package.json b/package.json index d726d178..e37054a5 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "electron": "^9.4.0", "electron-builder": "^22.11.7", "electron-packager": "^15.2.0", + "esbuild": "^0.12.16", "file-saver": "^2.0.5", "heapdump": "^0.3.15", "jsdom": "^12.2.0", @@ -58,6 +59,8 @@ "scripts": { "build": "tsc --build tsconfig.json", "test": "npm run test-node", + "esbuild": "esbuild src/worker/workermain.ts --bundle --minify --sourcemap --target=es2020,chrome58,firefox57,safari11 --outfile=./gen/worker/bundle.js --external:binaryen", + "eswatch": "npm run esbuild -- --watch", "test-one": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000", "test-node": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 test/cli", "test-profile": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 --prof test/cli", diff --git a/src/ide/ui.ts b/src/ide/ui.ts index c420e0c1..683bf6b0 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -7,7 +7,7 @@ import * as localforage from "localforage"; import { CodeProject, LocalForageFilesystem, OverlayFilesystem, ProjectFilesystem, WebPresetsFileSystem } from "./project"; import { WorkerResult, WorkerOutput, VerilogOutput, SourceFile, WorkerError, FileData } from "../common/workertypes"; import { ProjectWindows } from "./windows"; -import { Platform, Preset, DebugSymbols, DebugEvalCondition, isDebuggable, EmuState } from "../common/baseplatform"; +import { Platform, Preset, DebugSymbols, DebugEvalCondition, isDebuggable, EmuState, BasePlatform } from "../common/baseplatform"; import { PLATFORMS, EmuHalt, Toolbar } from "../common/emu"; import * as Views from "./views"; import { getFilenameForPath, getFilenamePrefix, highlightDifferences, invertMap, byteArrayToString, compressLZG, stringToByteArray, @@ -132,7 +132,7 @@ export function loadScript(scriptfn:string) : Promise { } function newWorker() : Worker { - return new Worker("./gen/worker/loader.js"); + return new Worker("./gen/worker/bundle.js"); } const hasLocalStorage : boolean = function() { @@ -946,7 +946,11 @@ function _downloadCassetteFile(e) { alertError("Please fix errors before exporting."); return true; } - var fn = window['_downloadCassetteFile_' + getBasePlatform(platform_id)]; + var fn; + switch (getBasePlatform(platform_id)) { + case 'vcs': fn = _downloadCassetteFile_vcs; break; + case 'apple2': fn = _downloadCassetteFile_apple2; break; + } if (fn === undefined) { alertError("Cassette export is not supported on this platform."); return true; diff --git a/src/worker/assembler.ts b/src/worker/assembler.ts index d4d730ff..1759dcb7 100644 --- a/src/worker/assembler.ts +++ b/src/worker/assembler.ts @@ -112,7 +112,7 @@ export class Assembler { codelen = 0; aborted = false; - constructor(spec : AssemblerSpec) { + constructor(spec? : AssemblerSpec) { this.spec = spec; if (spec) { this.preprocessRules(); diff --git a/src/worker/loader.ts b/src/worker/loader.ts deleted file mode 100644 index 9cf3d9d7..00000000 --- a/src/worker/loader.ts +++ /dev/null @@ -1,6 +0,0 @@ - -var exports : any = {}; - -declare function importScripts(path:string); - -importScripts("./workermain.js"); diff --git a/src/worker/nodemain.js b/src/worker/nodemain.js deleted file mode 100644 index a9b83c01..00000000 --- a/src/worker/nodemain.js +++ /dev/null @@ -1,86 +0,0 @@ - -// TODO: merge with workertestutils - -var assert = require('assert'); -var fs = require('fs'); -var vm = require('vm'); - -var worker = {}; - -global.includeInThisContext = function(path) { - var code = fs.readFileSync(path); - vm.runInThisContext(code, path); -}; - -global.importScripts = function(path) { - includeInThisContext('./'+path); -} - -function Blob(blob) { - this.size = blob.length; - this.length = blob.length; - this.slice = function(a,b) { - var data = blob.slice(a,b); - var b = new Blob(data); - return b; - } - this.asArrayBuffer = function() { - var buf = new ArrayBuffer(blob.length); - var arr = new Uint8Array(buf); - for (var i=0; i { var jsontext = getWorkFileAsString(filename); if (!jsontext) throw Error("could not load " + filename); return JSON.parse(jsontext); }; - asm.loadInclude = function(filename) { + asm.loadInclude = (filename) => { if (!filename.startsWith('"') || !filename.endsWith('"')) return 'Expected filename in "double quotes"'; filename = filename.substr(1, filename.length-2); includes.push(filename); }; var loaded_module = false; - asm.loadModule = function(top_module) { + asm.loadModule = (top_module : string) => { // compile last file in list loaded_module = true; var key = top_module + '/' + includes; @@ -1705,6 +1690,7 @@ function compileJSASM(asmcode:string, platform, options, is_inline) { var voutput = compileVerilator({platform:platform, files:includes, path:main_filename, tool:'verilator'}); if (voutput) jsasm_module_output = voutput; + return null; // no error } var result = asm.assembleFile(asmcode); if (loaded_module && jsasm_module_output) { @@ -1715,13 +1701,16 @@ function compileJSASM(asmcode:string, platform, options, is_inline) { var asmout = result.output; // TODO: unify result.output = jsasm_module_output.output; - result.output.program_rom = asmout; + // TODO: typecheck this garbage + (result as any).output.program_rom = asmout; // TODO: not cpu_platform__DOT__program_rom anymore, make const - result.output.program_rom_variable = jsasm_module_top + "$program_rom"; - result.listings = {}; - result.listings[options.path] = {lines:result.lines}; + (result as any).output.program_rom_variable = jsasm_module_top + "$program_rom"; + (result as any).listings = {}; + (result as any).listings[options.path] = {lines:result.lines}; + return result; + } else { + return result; } - return result; } function compileJSASMStep(step:BuildStep) { diff --git a/test/cli/workertestutils.js b/test/cli/workertestutils.js index 77501dc7..26f73c02 100644 --- a/test/cli/workertestutils.js +++ b/test/cli/workertestutils.js @@ -72,7 +72,8 @@ global.FileReaderSync = function() { global.onmessage = null; global.postMessage = null; -includeInThisContext("gen/worker/workermain.js"); +//includeInThisContext("gen/worker/workermain.js"); +require('gen/worker/bundle.js') global.ab2str = function(buf) { return String.fromCharCode.apply(null, new Uint16Array(buf));