webpack/lib/wasm/WasmModuleTemplatePlugin.js

56 lines
1.7 KiB
JavaScript
Raw Normal View History

2017-10-30 20:56:57 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const RawSource = require("webpack-sources").RawSource;
class WasmModuleTemplatePlugin {
2017-10-30 20:56:57 +08:00
apply(moduleTemplate) {
2017-12-14 04:35:39 +08:00
moduleTemplate.hooks.content.tap("WasmModuleTemplatePlugin", (moduleSource, module, {
chunk
}) => {
2017-10-30 20:56:57 +08:00
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;`;
}
};
2017-10-30 20:56:57 +08:00
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()
2017-10-30 20:56:57 +08:00
].join("\n"));
return source;
} else {
return moduleSource;
}
});
2017-12-14 04:35:39 +08:00
moduleTemplate.hooks.hash.tap("WasmModuleTemplatePlugin", hash => {
hash.update("WasmModuleTemplatePlugin");
2017-10-30 20:56:57 +08:00
hash.update("1");
});
}
}
module.exports = WasmModuleTemplatePlugin;