You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.4 KiB
93 lines
2.4 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const RuntimeGlobals = require("../RuntimeGlobals"); |
|
const Template = require("../Template"); |
|
const WasmChunkLoadingRuntimeModule = require("../wasm-sync/WasmChunkLoadingRuntimeModule"); |
|
|
|
/** @typedef {import("../Compiler")} Compiler */ |
|
|
|
// TODO webpack 6 remove |
|
|
|
class ReadFileCompileWasmPlugin { |
|
constructor(options) { |
|
this.options = options || {}; |
|
} |
|
|
|
/** |
|
* Apply the plugin |
|
* @param {Compiler} compiler the compiler instance |
|
* @returns {void} |
|
*/ |
|
apply(compiler) { |
|
compiler.hooks.thisCompilation.tap( |
|
"ReadFileCompileWasmPlugin", |
|
compilation => { |
|
const globalWasmLoading = compilation.outputOptions.wasmLoading; |
|
const isEnabledForChunk = chunk => { |
|
const options = chunk.getEntryOptions(); |
|
const wasmLoading = |
|
options && options.wasmLoading !== undefined |
|
? options.wasmLoading |
|
: globalWasmLoading; |
|
return wasmLoading === "async-node"; |
|
}; |
|
const generateLoadBinaryCode = path => |
|
Template.asString([ |
|
"new Promise(function (resolve, reject) {", |
|
Template.indent([ |
|
"var { readFile } = require('fs');", |
|
"var { join } = require('path');", |
|
"", |
|
"try {", |
|
Template.indent([ |
|
`readFile(join(__dirname, ${path}), function(err, buffer){`, |
|
Template.indent([ |
|
"if (err) return reject(err);", |
|
"", |
|
"// Fake fetch response", |
|
"resolve({", |
|
Template.indent(["arrayBuffer() { return buffer; }"]), |
|
"});" |
|
]), |
|
"});" |
|
]), |
|
"} catch (err) { reject(err); }" |
|
]), |
|
"})" |
|
]); |
|
|
|
compilation.hooks.runtimeRequirementInTree |
|
.for(RuntimeGlobals.ensureChunkHandlers) |
|
.tap("ReadFileCompileWasmPlugin", (chunk, set) => { |
|
if (!isEnabledForChunk(chunk)) return; |
|
const chunkGraph = compilation.chunkGraph; |
|
if ( |
|
!chunkGraph.hasModuleInGraph( |
|
chunk, |
|
m => m.type === "webassembly/sync" |
|
) |
|
) { |
|
return; |
|
} |
|
set.add(RuntimeGlobals.moduleCache); |
|
compilation.addRuntimeModule( |
|
chunk, |
|
new WasmChunkLoadingRuntimeModule({ |
|
generateLoadBinaryCode, |
|
supportsStreaming: false, |
|
mangleImports: this.options.mangleImports, |
|
runtimeRequirements: set |
|
}) |
|
); |
|
}); |
|
} |
|
); |
|
} |
|
} |
|
|
|
module.exports = ReadFileCompileWasmPlugin;
|
|
|