Skip to content

Commit acd8123

Browse files
vveerrggclaude
andcommitted
fix(deps): replace webpack with esbuild for browser bundling
Eliminates serialize-javascript RCE vulnerability (transitive via webpack → terser-webpack-plugin). IIFE format with globalName is functionally equivalent to UMD for script-tag usage. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 75d6ce7 commit acd8123

4 files changed

Lines changed: 65 additions & 1462 deletions

File tree

esbuild.browser.mjs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { build } from 'esbuild';
2+
import path from 'path';
3+
4+
// Plugin to replace Node builtins with empty modules (same as webpack fallback: false)
5+
// Exclude 'buffer' — nostr-crypto-utils uses the npm `buffer` polyfill package
6+
const emptyNodeBuiltins = {
7+
name: 'empty-node-builtins',
8+
setup(build) {
9+
const builtins = [
10+
'crypto', 'stream', 'os', 'fs', 'path', 'http', 'https',
11+
'util', 'zlib', 'vm', 'assert', 'constants',
12+
'net', 'tls', 'child_process',
13+
];
14+
const filter = new RegExp(`^(${builtins.join('|')})$`);
15+
16+
build.onResolve({ filter }, (args) => ({
17+
path: args.path,
18+
namespace: 'empty-node-builtin',
19+
}));
20+
21+
build.onLoad({ filter: /.*/, namespace: 'empty-node-builtin' }, () => ({
22+
contents: 'export default {};',
23+
loader: 'js',
24+
}));
25+
},
26+
};
27+
28+
const result = await build({
29+
entryPoints: ['src/browser.ts'],
30+
bundle: true,
31+
minify: true,
32+
sourcemap: true,
33+
format: 'iife',
34+
globalName: 'NostrAuthMiddleware',
35+
outfile: 'dist/browser/nostr-auth-middleware.min.js',
36+
target: ['es2020'],
37+
platform: 'browser',
38+
external: ['express', 'winston'],
39+
alias: {
40+
'@': path.resolve('src'),
41+
},
42+
plugins: [emptyNodeBuiltins],
43+
metafile: true,
44+
});
45+
46+
const output = Object.entries(result.metafile.outputs)
47+
.filter(([k]) => k.endsWith('.js'))
48+
.map(([k, v]) => `${k}: ${(v.bytes / 1024).toFixed(1)}KB`);
49+
console.log('Browser bundle built:', output.join(', '));

0 commit comments

Comments
 (0)