-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathesbuild-plugin-inline-worker.mjs
More file actions
85 lines (72 loc) · 2.2 KB
/
esbuild-plugin-inline-worker.mjs
File metadata and controls
85 lines (72 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* eslint-env node */
// copy of https://github.com/mitschabaude/esbuild-plugin-inline-worker
// modified to work with node (using base64 instead of blob)
import esbuild from 'esbuild';
import findCacheDir from 'find-cache-dir';
import fs from 'fs';
import path from 'path';
export {inlineWorkerPlugin as default};
function inlineWorkerPlugin(extraConfig) {
return {
name: 'esbuild-plugin-inline-worker',
setup(build) {
build.onLoad(
{filter: /\.worker.(js|jsx|ts|tsx)$/},
async ({path: workerPath}) => {
// let workerCode = await fs.promises.readFile(workerPath, {
// encoding: 'utf-8',
// });
let workerCode = await buildWorker(workerPath, extraConfig);
return {
contents: `import inlineWorker from '__inline-worker'
export default function Worker() {
return inlineWorker(${JSON.stringify(workerCode)});
}
`,
loader: 'js',
};
}
);
build.onResolve({filter: /^__inline-worker$/}, ({path}) => {
return {path, namespace: 'inline-worker'};
});
build.onLoad({filter: /.*/, namespace: 'inline-worker'}, () => {
return {contents: inlineWorkerFunctionCode, loader: 'js'};
});
},
};
}
const inlineWorkerFunctionCode = `
export default function inlineWorker(scriptText) {
let base64 = btoa(scriptText);
let url = new URL(\`data:application/javascript;base64,\${base64}\`);
let worker = new Worker(url);
return worker;
}
`;
let cacheDir = findCacheDir({
name: 'esbuild-plugin-inline-worker',
create: true,
});
async function buildWorker(workerPath, extraConfig) {
let scriptNameParts = path.basename(workerPath).split('.');
scriptNameParts.pop();
scriptNameParts.push('js');
let scriptName = scriptNameParts.join('.');
let bundlePath = path.resolve(cacheDir, scriptName);
if (extraConfig) {
delete extraConfig.entryPoints;
delete extraConfig.outfile;
delete extraConfig.outdir;
}
await esbuild.build({
entryPoints: [workerPath],
bundle: true,
minify: true,
outfile: bundlePath,
target: 'es2017',
format: 'esm',
...extraConfig,
});
return fs.promises.readFile(bundlePath, {encoding: 'utf-8'});
}