brosh 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,19 +12,22 @@
12
12
  "main": "dist/main/index.js",
13
13
  "type": "module",
14
14
  "scripts": {
15
- "dev": "ELECTRON_DEV=true npm run build:main && concurrently \"npm run watch:main\" \"npm run watch:renderer\" \"ELECTRON_DEV=true npm run electron\"",
15
+ "dev": "ELECTRON_DEV=true npm run build:main:dev && concurrently \"npm run watch:main\" \"npm run watch:renderer\" \"ELECTRON_DEV=true npm run electron\"",
16
16
  "build": "npm run build:main && npm run build:renderer",
17
- "build:main": "tsc -p tsconfig.main.json && cp src/main/preload.cjs dist/main/",
17
+ "build:main": "tsc -p tsconfig.main.json --noEmit && node scripts/bundle-main.mjs",
18
+ "build:main:bytecode": "tsc -p tsconfig.main.json --noEmit && node scripts/bundle-main.mjs --bytecode",
19
+ "build:bytecode": "npm run build:main:bytecode && npm run build:renderer",
20
+ "build:main:dev": "tsc -p tsconfig.main.json && cp src/main/preload.cjs dist/main/",
18
21
  "build:renderer": "vite build",
19
22
  "watch:main": "tsc -p tsconfig.main.json --watch",
20
23
  "watch:renderer": "vite build --watch",
21
24
  "electron": "electron .",
22
25
  "start": "npm run build && electron .",
23
26
  "prepackage": "node scripts/prepare-sandbox-bins.js && rm -rf node_modules/brosh && mkdir -p node_modules/brosh && cp -r ../../dist ../../package.json node_modules/brosh/",
24
- "package": "npm run prepackage && npm run build && electron-builder",
25
- "package:mac": "npm run prepackage && npm run build && electron-builder --mac",
26
- "package:win": "npm run prepackage && npm run build && electron-builder --win",
27
- "package:linux": "npm run prepackage && npm run build && electron-builder --linux",
27
+ "package": "npm run prepackage && npm run build:bytecode && electron-builder",
28
+ "package:mac": "npm run prepackage && npm run build:bytecode && electron-builder --mac -c.extraMetadata.localBuild=true",
29
+ "package:win": "npm run prepackage && npm run build:bytecode && electron-builder --win -c.extraMetadata.localBuild=true",
30
+ "package:linux": "npm run prepackage && npm run build:bytecode && electron-builder --linux -c.extraMetadata.localBuild=true",
28
31
  "postpackage": "rm -rf node_modules/brosh && npm install",
29
32
  "download-models": "node scripts/download-models.js",
30
33
  "prepare-sandbox-bins": "node scripts/prepare-sandbox-bins.js",
@@ -57,6 +60,7 @@
57
60
  "@xterm/addon-webgl": "^0.18.0",
58
61
  "@xterm/xterm": "^5.5.0",
59
62
  "brosh": "file:../..",
63
+ "bytenode": "^1.5.7",
60
64
  "chokidar": "^5.0.0",
61
65
  "cli-highlight": "^2.1.11",
62
66
  "electron-store": "^10.0.0",
@@ -79,6 +83,7 @@
79
83
  "concurrently": "^8.2.0",
80
84
  "electron": "^33.4.11",
81
85
  "electron-builder": "^25.0.0",
86
+ "esbuild": "^0.25.12",
82
87
  "react": "^18.2.0",
83
88
  "react-dom": "^18.2.0",
84
89
  "typescript": "^5.0.0",
@@ -88,6 +93,7 @@
88
93
  "build": {
89
94
  "appId": "com.ellery.brosh",
90
95
  "productName": "brosh",
96
+ "asar": false,
91
97
  "afterPack": "./build/afterPack.cjs",
92
98
  "directories": {
93
99
  "output": "release"
@@ -0,0 +1,97 @@
1
+ import { build } from "esbuild";
2
+ import { cpSync, existsSync, writeFileSync, unlinkSync } from "fs";
3
+ import { execFileSync } from "child_process";
4
+ import { createRequire } from "module";
5
+
6
+ const bytecode = process.argv.includes("--bytecode");
7
+
8
+ if (bytecode) {
9
+ // Bytecode path: bundle as CJS → compile with Electron's V8 → ESM loader stub
10
+ await build({
11
+ entryPoints: ["src/main/index.ts"],
12
+ bundle: true,
13
+ outfile: "dist/main/bundle.cjs",
14
+ platform: "node",
15
+ format: "cjs",
16
+ target: "node20",
17
+ sourcemap: false,
18
+ // Bytecode externals differ from ESM: CJS can't require() ESM-only packages,
19
+ // so we inline them (electron-store, chokidar, brosh) and let esbuild convert
20
+ // to CJS. node-pty stays external (native addon).
21
+ external: [
22
+ "electron",
23
+ "electron-updater",
24
+ "node-pty",
25
+ "ws",
26
+ "posthog-node",
27
+ "@huggingface/transformers",
28
+ "cli-highlight",
29
+ "bytenode",
30
+ ],
31
+ // Convert import() → require() so no dynamic imports in bytecode (vm.Script
32
+ // doesn't support import() without --experimental-vm-modules).
33
+ supported: { "dynamic-import": false },
34
+ });
35
+
36
+ // Compile CJS bundle to V8 bytecode using Electron's V8
37
+ const require = createRequire(import.meta.url);
38
+ const electronPath = require("electron");
39
+ execFileSync(electronPath, ["scripts/bytecode-compiler.cjs", "dist/main/bundle.cjs"], {
40
+ env: { ...process.env, ELECTRON_RUN_AS_NODE: "1" },
41
+ stdio: "inherit",
42
+ });
43
+
44
+ // Write ESM loader stub
45
+ writeFileSync(
46
+ "dist/main/index.js",
47
+ [
48
+ `import { createRequire } from 'module';`,
49
+ `import v8 from 'v8';`,
50
+ `v8.setFlagsFromString('--no-lazy');`,
51
+ `v8.setFlagsFromString('--no-flush-bytecode');`,
52
+ `const require = createRequire(import.meta.url);`,
53
+ `require('bytenode');`,
54
+ `require('./bundle.jsc');`,
55
+ ``,
56
+ ].join("\n"),
57
+ );
58
+
59
+ // Clean up intermediate CJS bundle and stale sourcemap from previous ESM builds
60
+ unlinkSync("dist/main/bundle.cjs");
61
+ if (existsSync("dist/main/index.js.map")) {
62
+ unlinkSync("dist/main/index.js.map");
63
+ }
64
+ } else {
65
+ // Standard ESM bundle path
66
+ await build({
67
+ entryPoints: ["src/main/index.ts"],
68
+ bundle: true,
69
+ outfile: "dist/main/index.js",
70
+ platform: "node",
71
+ format: "esm",
72
+ target: "node20",
73
+ sourcemap: true,
74
+ external: [
75
+ "electron",
76
+ "electron-store",
77
+ "electron-updater",
78
+ "brosh",
79
+ "ws",
80
+ "posthog-node",
81
+ "@huggingface/transformers",
82
+ "chokidar",
83
+ "cli-highlight",
84
+ ],
85
+ banner: {
86
+ js: [
87
+ `import { fileURLToPath as _bundled_fileURLToPath } from 'url';`,
88
+ `import { dirname as _bundled_dirname } from 'path';`,
89
+ `const __filename = _bundled_fileURLToPath(import.meta.url);`,
90
+ `const __dirname = _bundled_dirname(__filename);`,
91
+ ].join("\n"),
92
+ },
93
+ });
94
+ }
95
+
96
+ // Preload script is CJS, loaded separately by Electron — just copy it
97
+ cpSync("src/main/preload.cjs", "dist/main/preload.cjs");
@@ -0,0 +1,3 @@
1
+ require("bytenode");
2
+ const bytenode = require("bytenode");
3
+ bytenode.compileFile(process.argv[2]);
@@ -1,16 +1,16 @@
1
1
  -----BEGIN PGP SIGNATURE-----
2
2
 
3
- iQIzBAABCgAdFiEEX8WeGtXPO7P8xoFftW8bjWv2UfkFAmmYfkUACgkQtW8bjWv2
4
- Ufnt6Q//bThoYQ4xKlFvjdQArIdtYlL737WNJlmm4CT/yw4OJ3WMKo9sDzBIfowT
5
- WdHbblCzpDZ7E4quj2HARKcE5YtakoJGRdEKM2YAW1faIHJfSg8Ki/Ix0g5/f+d/
6
- F5FxKnPDUOWI3bJZqqq+cfqA8iMr/qo1RVyq+ueWnLAn2gWwLEss6FdLJfxHFNF9
7
- TJ/iKNDZYjxSMytO039hR6ixfIfzlnN9yyaLEWwCmST8nxcRX64Jg7aSdApeJhZq
8
- +bE7F7WCGewd49Y6DvLSgYLoEPBU3OlhHtzZLnyb9CJIduVpeoNJjqtHS6wnPEGu
9
- pT7/16bZ/BfmA/sr8Fq644lFJbtMCBYvN07DVL6dm9Q0GZHzhSR5clNZzGzyNGXw
10
- Fo/OVQYziGB6R0V5pHlpPIosGnQgWlWXK0EStOhK4ZDedlDyWyvHBcXWQUg+Q8hN
11
- /tLRgkOfgUUNf38O5KNC+IeShW3399kEGjn0ZC2rHDOZFji2i41+keVyORYOA6tt
12
- dVrYSIL2glQ2e+31/IZ9Qvkmj2RHbo/Ck6GMTMTG8+scsBGBd7DMby7T5JXBy0Wr
13
- Rxpv77VOIsH110+mU7SwcD5daQRdEqtPPD+g1MxyBZtofzHX1JqQjqgoxbJ1VXyI
14
- QKtbeRCggfVlkbfLD/gTmqh3sj2QUJOGIAR/5HT9QlBRuW80/D4=
15
- =Zl2Y
3
+ iQIzBAABCgAdFiEEX8WeGtXPO7P8xoFftW8bjWv2UfkFAmmaIE0ACgkQtW8bjWv2
4
+ Ufk3LBAA613qi4AgnMOlAwzKhZNiqFw0cLCRh4IZgoxdaoXiZNf6N5BkM8iRPKXV
5
+ 30qpEqp3gKAG6V319aMOE5q6jmWV0ElcJ6jpJVwfmaM2sUnFBt1fPdd/3Qfdn2oQ
6
+ ow7NAQVs8z5dVnuNTvfC8swwRmqIGlbP2MApyC0QAf41bdQhZ7T/PaiFVYM0iHmZ
7
+ w97WCYyGCilB2rt3rgdwz3h/lvWNb1Ss9FQfo1rzv1EtksLPvvfdYC3GAQc7K147
8
+ Z9mimB06o3kSuTYY3jeCPPolEhdoXytf1hhT03VODYKM68Wcb5aRckJE5WdBUsEC
9
+ MrWEerCOGlNNAkmjP67Lkd2bJdN3a6kDGHr7yNyi91GwgQSL/KBSs7rgawfmPrX5
10
+ gg4N4bQ9neHT1mcU+pg6IO5LeX/wsLAZGzObqIUJtbIRgYZFDDYdQ2H/CFJe6Omf
11
+ Sxb1TYNHNi562I91aOtgQ7cU+mbUv8PyoyTY5ShdUyNkzQNeqn/oii0yuVK0Jjk9
12
+ a8MWuT9JcbBlCUCf6qbgV440dtcQkWGFagtiTAP5wMnPLnWBU+q5bspZdAMstsY7
13
+ dKjPIb5/B3Z0bjX5Tr/OYQPO9Bxytqi5maUmdHA6lTc3qSDinrLAO56gYygZrtUt
14
+ XqSjBYxS+dc/ePCo+rIHWKZa3+gYuMjBcWLXJWP9Eax3em8qOcM=
15
+ =R2Pr
16
16
  -----END PGP SIGNATURE-----