-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
87 lines (73 loc) · 2.25 KB
/
index.js
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
86
87
/* eslint-env node */
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',
};
}
);
const name = extraConfig.workerName ? { name: extraConfig.workerName } : {}
const inlineWorkerFunctionCode = `
export default function inlineWorker(scriptText) {
let blob = new Blob([scriptText], {type: 'text/javascript'});
let url = URL.createObjectURL(blob);
let worker = new Worker(url, ${JSON.stringify(name)});
URL.revokeObjectURL(url);
return worker;
}
`;
build.onResolve({filter: /^__inline-worker$/}, ({path}) => {
return {path, namespace: 'inline-worker'};
});
build.onLoad({filter: /.*/, namespace: 'inline-worker'}, () => {
return {contents: inlineWorkerFunctionCode, loader: 'js'};
});
},
};
}
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;
delete extraConfig.workerName;
}
await esbuild.build({
entryPoints: [workerPath],
bundle: true,
minify: true,
outfile: bundlePath,
target: 'es2017',
format: 'esm',
...extraConfig,
});
return fs.promises.readFile(bundlePath, {encoding: 'utf-8'});
}