text: /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  */
  "use strict";
  
  const ConcatSource = require("webpack-sources").ConcatSource;
  const Template = require("./Template");
  
  class FunctionModuleTemplatePlugin {
  	apply(moduleTemplate) {
  		moduleTemplate.hooks.render.tap("FunctionModuleTemplatePlugin", (moduleSource, module) => {
  			const source = new ConcatSource();
  			const args = [module.moduleArgument];
  			// TODO remove HACK checking type for javascript
  			if(module.type && module.type.startsWith("javascript")) {
  				args.push(module.exportsArgument);
  				if(module.hasDependencies(d => d.requireWebpackRequire !== false)) {
  					args.push("__webpack_require__");
  				}
  			} else if(module.type && module.type.startsWith("json")) {
  				// no additional arguments needed
  			} else {
  				args.push(module.exportsArgument, "__webpack_require__");
  			}
  			source.add("/***/ (function(" + args.join(", ") + ") {\n\n");
  			if(module.buildInfo.strict) source.add("\"use strict\";\n");
  			source.add(moduleSource);
  			source.add("\n\n/***/ })");
  			return source;
  		});
  
  		moduleTemplate.hooks.package.tap("FunctionModuleTemplatePlugin", (moduleSource, module) => {
  			if(moduleTemplate.runtimeTemplate.outputOptions.pathinfo) {
  				const source = new ConcatSource();
  				const req = module.readableIdentifier(moduleTemplate.runtimeTemplate.requestShortener);
  				source.add("/*!****" + req.replace(/./g, "*") + "****!*\\\n");
  				source.add("  !*** " + req.replace(/\*\//g, "*_/") + " ***!\n");
  				source.add("  \\****" + req.replace(/./g, "*") + "****/\n");
  				if(Array.isArray(module.buildMeta.providedExports) && module.buildMeta.providedExports.length === 0)
  					source.add(Template.toComment("no exports provided") + "\n");
  				else if(Array.isArray(module.buildMeta.providedExports))
  					source.add(Template.toComment("exports provided: " + module.buildMeta.providedExports.join(", ")) + "\n");
  				else if(module.buildMeta.providedExports)
  					source.add(Template.toComment("no static exports found") + "\n");
  				if(Array.isArray(module.usedExports) && module.usedExports.length === 0)
  					source.add(Template.toComment("no exports used") + "\n");
  				else if(Array.isArray(module.usedExports))
  					source.add(Template.toComment("exports used: " + module.usedExports.join(", ")) + "\n");
  				else if(module.usedExports)
  					source.add(Template.toComment("all exports used") + "\n");
  				if(module.optimizationBailout) {
  					for(const text of module.optimizationBailout) {
  						let code;
  						if(typeof text === "function") {
  							code = text(moduleTemplate.runtimeTemplate.requestShortener);
  						} else {
  							code = text;
  						}
  						source.add(Template.toComment(`${code}`) + "\n");
  					}
  				}
  				source.add(moduleSource);
  				return source;
  			}
  			return moduleSource;
  		});
  
  		moduleTemplate.hooks.hash.tap("FunctionModuleTemplatePlugin", hash => {
  			hash.update("FunctionModuleTemplatePlugin");
  			hash.update("2");
  		});
  	}
  }
  module.exports = FunctionModuleTemplatePlugin;
  