text: /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  	*/
  "use strict";
  
  const UnsupportedWebAssemblyFeatureError = require("./UnsupportedWebAssemblyFeatureError");
  
  class WasmFinalizeExportsPlugin {
  	apply(compiler) {
  		compiler.hooks.compilation.tap("WasmFinalizeExportsPlugin", compilation => {
  			compilation.hooks.finishModules.tap(
  				"WasmFinalizeExportsPlugin",
  				modules => {
  					for (const module of modules) {
  						// 1. if a WebAssembly module
  						if (module.type.startsWith("webassembly") === true) {
  							const jsIncompatibleExports =
  								module.buildMeta.jsIncompatibleExports;
  
  							if (jsIncompatibleExports === undefined) {
  								continue;
  							}
  
  							for (const reason of module.reasons) {
  								// 2. is referenced by a non-WebAssembly module
  								if (reason.module.type.startsWith("webassembly") === false) {
  									const ref = compilation.getDependencyReference(
  										reason.module,
  										reason.dependency
  									);
  
  									if (!ref) continue;
  
  									const importedNames = ref.importedNames;
  
  									if (Array.isArray(importedNames)) {
  										importedNames.forEach(name => {
  											// 3. and uses a func with an incompatible JS signature
  											if (
  												Object.prototype.hasOwnProperty.call(
  													jsIncompatibleExports,
  													name
  												)
  											) {
  												// 4. error
  												/** @type {any} */
  												const error = new UnsupportedWebAssemblyFeatureError(
  													`Export "${name}" with ${jsIncompatibleExports[name]} can only be used for direct wasm to wasm dependencies`
  												);
  												error.module = module;
  												error.origin = reason.module;
  												error.originLoc = reason.dependency.loc;
  												error.dependencies = [reason.dependency];
  												compilation.errors.push(error);
  											}
  										});
  									}
  								}
  							}
  						}
  					}
  				}
  			);
  		});
  	}
  }
  
  module.exports = WasmFinalizeExportsPlugin;
  