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;
|
|
|
|
|
2017-12-14 08:21:44 +08:00
|
|
|
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, {
|
2017-11-12 01:48:29 +08:00
|
|
|
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");
|
2017-12-14 08:21:44 +08:00
|
|
|
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
|
2017-12-14 08:21:44 +08:00
|
|
|
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 => {
|
2017-12-14 08:21:44 +08:00
|
|
|
hash.update("WasmModuleTemplatePlugin");
|
2017-10-30 20:56:57 +08:00
|
|
|
hash.update("1");
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2017-12-14 08:21:44 +08:00
|
|
|
module.exports = WasmModuleTemplatePlugin;
|