text: /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  */
  "use strict";
  
  const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
  const RequireEnsureDependency = require("./RequireEnsureDependency");
  
  const NullFactory = require("../NullFactory");
  
  const RequireEnsureDependenciesBlockParserPlugin = require("./RequireEnsureDependenciesBlockParserPlugin");
  
  const ParserHelpers = require("../ParserHelpers");
  
  class RequireEnsurePlugin {
  	apply(compiler) {
  		compiler.hooks.compilation.tap(
  			"RequireEnsurePlugin",
  			(compilation, { normalModuleFactory }) => {
  				compilation.dependencyFactories.set(
  					RequireEnsureItemDependency,
  					normalModuleFactory
  				);
  				compilation.dependencyTemplates.set(
  					RequireEnsureItemDependency,
  					new RequireEnsureItemDependency.Template()
  				);
  
  				compilation.dependencyFactories.set(
  					RequireEnsureDependency,
  					new NullFactory()
  				);
  				compilation.dependencyTemplates.set(
  					RequireEnsureDependency,
  					new RequireEnsureDependency.Template()
  				);
  
  				const handler = (parser, parserOptions) => {
  					if (
  						typeof parserOptions.requireEnsure !== "undefined" &&
  						!parserOptions.requireEnsure
  					)
  						return;
  
  					new RequireEnsureDependenciesBlockParserPlugin().apply(parser);
  					parser.hooks.evaluateTypeof
  						.for("require.ensure")
  						.tap(
  							"RequireEnsurePlugin",
  							ParserHelpers.evaluateToString("function")
  						);
  					parser.hooks.typeof
  						.for("require.ensure")
  						.tap(
  							"RequireEnsurePlugin",
  							ParserHelpers.toConstantDependency(
  								parser,
  								JSON.stringify("function")
  							)
  						);
  				};
  
  				normalModuleFactory.hooks.parser
  					.for("javascript/auto")
  					.tap("RequireEnsurePlugin", handler);
  				normalModuleFactory.hooks.parser
  					.for("javascript/dynamic")
  					.tap("RequireEnsurePlugin", handler);
  			}
  		);
  	}
  }
  module.exports = RequireEnsurePlugin;
  