forked from webpack/webpack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWasmModuleTemplatePlugin.js
More file actions
55 lines (52 loc) · 1.75 KB
/
WasmModuleTemplatePlugin.js
File metadata and controls
55 lines (52 loc) · 1.75 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
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const RawSource = require("webpack-sources").RawSource;
class WasmModuleTemplatePlugin {
apply(moduleTemplate) {
moduleTemplate.hooks.content.tap("WasmModuleTemplatePlugin", (moduleSource, module, {
chunk
}) => {
if(module.type && module.type.startsWith("webassembly")) {
if(chunk.isInitial())
throw new Error("Sync WebAsssmbly compilation is not yet implemented");
const generateExports = () => {
if(Array.isArray(module.buildMeta.providedExports) && Array.isArray(module.usedExports)) {
// generate mangled exports
return module.buildMeta.providedExports.map(exp => {
const usedName = module.isUsed(exp);
if(usedName) {
return `${module.exportsArgument}[${JSON.stringify(usedName)}] = instance.exports[${JSON.stringify(exp)}];`;
} else {
return `// unused ${JSON.stringify(exp)} export`;
}
}).join("\n");
} else {
// generate simple export
return `${module.moduleArgument}.exports = instance.exports;`;
}
};
const source = new RawSource([
"\"use strict\";",
"",
"// Instanciate WebAssembly module",
"var instance = new WebAssembly.Instance(__webpack_require__.w[module.i], {});",
"",
"// export exports from WebAssmbly module",
// TODO rewrite this to getters depending on exports to support circular dependencies
generateExports()
].join("\n"));
return source;
} else {
return moduleSource;
}
});
moduleTemplate.hooks.hash.tap("WasmModuleTemplatePlugin", hash => {
hash.update("WasmModuleTemplatePlugin");
hash.update("1");
});
}
}
module.exports = WasmModuleTemplatePlugin;