simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

WebpackIsIncludedPlugin.js (2420B)


      1 /*
      2 	MIT License http://www.opensource.org/licenses/mit-license.php
      3 	Author Ivan Kopeykin @vankop
      4 */
      5 
      6 "use strict";
      7 
      8 const IgnoreErrorModuleFactory = require("./IgnoreErrorModuleFactory");
      9 const WebpackIsIncludedDependency = require("./dependencies/WebpackIsIncludedDependency");
     10 const {
     11 	toConstantDependency
     12 } = require("./javascript/JavascriptParserHelpers");
     13 
     14 /** @typedef {import("enhanced-resolve/lib/Resolver")} Resolver */
     15 /** @typedef {import("./Compiler")} Compiler */
     16 /** @typedef {import("./Module")} Module */
     17 /** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
     18 
     19 class WebpackIsIncludedPlugin {
     20 	/**
     21 	 * @param {Compiler} compiler the compiler instance
     22 	 * @returns {void}
     23 	 */
     24 	apply(compiler) {
     25 		compiler.hooks.compilation.tap(
     26 			"WebpackIsIncludedPlugin",
     27 			(compilation, { normalModuleFactory }) => {
     28 				compilation.dependencyFactories.set(
     29 					WebpackIsIncludedDependency,
     30 					new IgnoreErrorModuleFactory(normalModuleFactory)
     31 				);
     32 				compilation.dependencyTemplates.set(
     33 					WebpackIsIncludedDependency,
     34 					new WebpackIsIncludedDependency.Template()
     35 				);
     36 
     37 				/**
     38 				 * @param {JavascriptParser} parser the parser
     39 				 * @returns {void}
     40 				 */
     41 				const handler = parser => {
     42 					parser.hooks.call
     43 						.for("__webpack_is_included__")
     44 						.tap("WebpackIsIncludedPlugin", expr => {
     45 							if (
     46 								expr.type !== "CallExpression" ||
     47 								expr.arguments.length !== 1 ||
     48 								expr.arguments[0].type === "SpreadElement"
     49 							)
     50 								return;
     51 
     52 							const request = parser.evaluateExpression(expr.arguments[0]);
     53 
     54 							if (!request.isString()) return;
     55 
     56 							const dep = new WebpackIsIncludedDependency(
     57 								request.string,
     58 								expr.range
     59 							);
     60 							dep.loc = expr.loc;
     61 							parser.state.module.addDependency(dep);
     62 							return true;
     63 						});
     64 					parser.hooks.typeof
     65 						.for("__webpack_is_included__")
     66 						.tap(
     67 							"WebpackIsIncludedPlugin",
     68 							toConstantDependency(parser, JSON.stringify("function"))
     69 						);
     70 				};
     71 				normalModuleFactory.hooks.parser
     72 					.for("javascript/auto")
     73 					.tap("WebpackIsIncludedPlugin", handler);
     74 				normalModuleFactory.hooks.parser
     75 					.for("javascript/dynamic")
     76 					.tap("WebpackIsIncludedPlugin", handler);
     77 				normalModuleFactory.hooks.parser
     78 					.for("javascript/esm")
     79 					.tap("WebpackIsIncludedPlugin", handler);
     80 			}
     81 		);
     82 	}
     83 }
     84 
     85 module.exports = WebpackIsIncludedPlugin;