| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-09 03:56:32 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	harmonySpecifierTag | 
					
						
							|  |  |  | } = require("../dependencies/HarmonyImportDependencyParserPlugin"); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | const PureExpressionDependency = require("../dependencies/PureExpressionDependency"); | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | const InnerGraph = require("./InnerGraph"); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							| 
									
										
										
										
											2019-09-04 15:27:19 +08:00
										 |  |  | /** @typedef {import("../Dependency")} Dependency */ | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | /** @typedef {import("../dependencies/HarmonyImportSpecifierDependency")} HarmonyImportSpecifierDependency */ | 
					
						
							| 
									
										
										
										
											2019-10-11 21:46:57 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */ | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | /** @typedef {import("./InnerGraph").InnerGraph} InnerGraph */ | 
					
						
							|  |  |  | /** @typedef {import("./InnerGraph").TopLevelSymbol} TopLevelSymbol */ | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | const { topLevelSymbolTag } = InnerGraph; | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-09 03:56:32 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {any} expr an expression | 
					
						
							|  |  |  |  * @param {JavascriptParser} parser the parser | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  |  * @param {number} commentsStartPos source position from which annotation comments are checked | 
					
						
							| 
									
										
										
										
											2019-09-09 03:56:32 +08:00
										 |  |  |  * @returns {boolean} true, when the expression is pure | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | const isPure = (expr, parser, commentsStartPos) => { | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 	switch (expr.type) { | 
					
						
							|  |  |  | 		case "Identifier": | 
					
						
							| 
									
										
										
										
											2019-09-09 03:56:32 +08:00
										 |  |  | 			return ( | 
					
						
							|  |  |  | 				parser.isVariableDefined(expr.name) || | 
					
						
							|  |  |  | 				parser.getTagData(expr.name, harmonySpecifierTag) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case "ClassExpression": | 
					
						
							|  |  |  | 			if (expr.body.type !== "ClassBody") return false; | 
					
						
							|  |  |  | 			if (expr.superClass && !isPure(expr.superClass, parser, expr.range[0])) { | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return expr.body.body.every(item => { | 
					
						
							|  |  |  | 				switch (item.type) { | 
					
						
							|  |  |  | 					case "ClassProperty": | 
					
						
							|  |  |  | 						// TODO add test case once acorn supports it
 | 
					
						
							|  |  |  | 						// Currently this is not parsable
 | 
					
						
							|  |  |  | 						if (item.static) return isPure(item.value, parser, item.range[0]); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case "FunctionExpression": | 
					
						
							|  |  |  | 		case "ArrowFunctionExpression": | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 		case "Literal": | 
					
						
							|  |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 		case "ConditionalExpression": | 
					
						
							|  |  |  | 			return ( | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | 				isPure(expr.test, parser, commentsStartPos) && | 
					
						
							|  |  |  | 				isPure(expr.consequent, parser, expr.test.range[1]) && | 
					
						
							|  |  |  | 				isPure(expr.alternate, parser, expr.consequent.range[1]) | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case "SequenceExpression": | 
					
						
							|  |  |  | 			return expr.expressions.every(expr => { | 
					
						
							|  |  |  | 				const pureFlag = isPure(expr, parser, commentsStartPos); | 
					
						
							|  |  |  | 				commentsStartPos = expr.range[1]; | 
					
						
							|  |  |  | 				return pureFlag; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case "CallExpression": { | 
					
						
							|  |  |  | 			const pureFlag = | 
					
						
							|  |  |  | 				expr.range[0] - commentsStartPos > 12 && | 
					
						
							|  |  |  | 				parser | 
					
						
							|  |  |  | 					.getComments([commentsStartPos, expr.range[0]]) | 
					
						
							|  |  |  | 					.some( | 
					
						
							|  |  |  | 						comment => | 
					
						
							|  |  |  | 							comment.type === "Block" && | 
					
						
							|  |  |  | 							/^\s*(#|@)__PURE__\s*$/.test(comment.value) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 			if (!pureFlag) return false; | 
					
						
							|  |  |  | 			commentsStartPos = expr.callee.range[1]; | 
					
						
							|  |  |  | 			return expr.arguments.every(arg => { | 
					
						
							|  |  |  | 				if (arg.type === "SpreadElement") return false; | 
					
						
							|  |  |  | 				const pureFlag = isPure(arg, parser, commentsStartPos); | 
					
						
							|  |  |  | 				commentsStartPos = arg.range[1]; | 
					
						
							|  |  |  | 				return pureFlag; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | class InnerGraphPlugin { | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler webpack compiler | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							|  |  |  | 			"InnerGraphPlugin", | 
					
						
							|  |  |  | 			(compilation, { normalModuleFactory }) => { | 
					
						
							| 
									
										
										
										
											2020-01-30 18:34:33 +08:00
										 |  |  | 				const logger = compilation.getLogger("webpack.InnerGraphPlugin"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 				compilation.dependencyTemplates.set( | 
					
						
							|  |  |  | 					PureExpressionDependency, | 
					
						
							|  |  |  | 					new PureExpressionDependency.Template() | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				/** | 
					
						
							|  |  |  | 				 * @param {JavascriptParser} parser the parser | 
					
						
							|  |  |  | 				 * @param {Object} parserOptions options | 
					
						
							|  |  |  | 				 * @returns {void} | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				const handler = (parser, parserOptions) => { | 
					
						
							|  |  |  | 					parser.hooks.program.tap("InnerGraphPlugin", () => { | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | 						InnerGraph.enable(parser.state); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 					parser.hooks.finish.tap("InnerGraphPlugin", () => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-30 18:34:33 +08:00
										 |  |  | 						logger.time("infer dependency usage"); | 
					
						
							| 
									
										
										
										
											2020-01-30 09:34:30 +08:00
										 |  |  | 						InnerGraph.inferDependencyUsage(parser.state); | 
					
						
							| 
									
										
										
										
											2020-01-30 18:34:33 +08:00
										 |  |  | 						logger.timeAggregate("infer dependency usage"); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-09-04 15:27:19 +08:00
										 |  |  | 					/** @type {WeakMap<{}, TopLevelSymbol>} */ | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					const statementWithTopLevelSymbol = new WeakMap(); | 
					
						
							|  |  |  | 					parser.hooks.preStatement.tap("InnerGraphPlugin", statement => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 						if (parser.scope.topLevelScope === true) { | 
					
						
							|  |  |  | 							if (statement.type === "FunctionDeclaration") { | 
					
						
							|  |  |  | 								const name = statement.id ? statement.id.name : "*default*"; | 
					
						
							| 
									
										
										
										
											2020-01-27 23:46:23 +08:00
										 |  |  | 								const fn = InnerGraph.tagTopLevelSymbol(parser, name); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 								statementWithTopLevelSymbol.set(statement, fn); | 
					
						
							|  |  |  | 								return true; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					parser.hooks.blockPreStatement.tap("InnerGraphPlugin", statement => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 						if (parser.scope.topLevelScope === true) { | 
					
						
							|  |  |  | 							if (statement.type === "ClassDeclaration") { | 
					
						
							|  |  |  | 								const name = statement.id ? statement.id.name : "*default*"; | 
					
						
							| 
									
										
										
										
											2020-01-27 23:46:23 +08:00
										 |  |  | 								const fn = InnerGraph.tagTopLevelSymbol(parser, name); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 								statementWithTopLevelSymbol.set(statement, fn); | 
					
						
							|  |  |  | 								return true; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							if (statement.type === "ExportDefaultDeclaration") { | 
					
						
							|  |  |  | 								const decl = statement.declaration; | 
					
						
							|  |  |  | 								if ( | 
					
						
							|  |  |  | 									decl.type === "FunctionExpression" || | 
					
						
							|  |  |  | 									decl.type === "ArrowFunctionExpression" || | 
					
						
							|  |  |  | 									decl.type === "ClassExpression" || | 
					
						
							|  |  |  | 									decl.type === "Identifier" | 
					
						
							|  |  |  | 								) { | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 									const name = "*default*"; | 
					
						
							| 
									
										
										
										
											2020-01-27 23:46:23 +08:00
										 |  |  | 									const fn = InnerGraph.tagTopLevelSymbol(parser, name); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 									statementWithTopLevelSymbol.set(statement, fn); | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2019-09-04 15:27:19 +08:00
										 |  |  | 					/** @type {WeakMap<{}, TopLevelSymbol>} */ | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					const declWithTopLevelSymbol = new WeakMap(); | 
					
						
							| 
									
										
										
										
											2019-09-08 21:21:00 +08:00
										 |  |  | 					const pureDeclarators = new WeakSet(); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					parser.hooks.preDeclarator.tap( | 
					
						
							|  |  |  | 						"InnerGraphPlugin", | 
					
						
							|  |  |  | 						(decl, statement) => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 							if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							if ( | 
					
						
							|  |  |  | 								parser.scope.topLevelScope === true && | 
					
						
							|  |  |  | 								decl.init && | 
					
						
							|  |  |  | 								decl.id.type === "Identifier" | 
					
						
							|  |  |  | 							) { | 
					
						
							|  |  |  | 								if ( | 
					
						
							|  |  |  | 									decl.init.type === "FunctionExpression" || | 
					
						
							|  |  |  | 									decl.init.type === "ArrowFunctionExpression" || | 
					
						
							|  |  |  | 									decl.init.type === "ClassExpression" | 
					
						
							|  |  |  | 								) { | 
					
						
							| 
									
										
										
										
											2019-09-05 17:47:18 +08:00
										 |  |  | 									const name = decl.id.name; | 
					
						
							| 
									
										
										
										
											2020-01-27 23:46:23 +08:00
										 |  |  | 									const fn = InnerGraph.tagTopLevelSymbol(parser, name); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 									declWithTopLevelSymbol.set(decl, fn); | 
					
						
							|  |  |  | 									return true; | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2020-01-16 02:24:52 +08:00
										 |  |  | 								if (isPure(decl.init, parser, decl.id.range[1])) { | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 									const name = decl.id.name; | 
					
						
							| 
									
										
										
										
											2020-01-27 23:46:23 +08:00
										 |  |  | 									const fn = InnerGraph.tagTopLevelSymbol(parser, name); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 									declWithTopLevelSymbol.set(decl, fn); | 
					
						
							| 
									
										
										
										
											2019-09-08 21:21:00 +08:00
										 |  |  | 									pureDeclarators.add(decl); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 									return true; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					parser.hooks.statement.tap("InnerGraphPlugin", statement => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 						if (parser.scope.topLevelScope === true) { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 							InnerGraph.setTopLevelSymbol(parser.state, undefined); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							const fn = statementWithTopLevelSymbol.get(statement); | 
					
						
							|  |  |  | 							if (fn) { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 								InnerGraph.setTopLevelSymbol(parser.state, fn); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					parser.hooks.declarator.tap("InnerGraphPlugin", (decl, statement) => { | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 						const fn = declWithTopLevelSymbol.get(decl); | 
					
						
							|  |  |  | 						if (fn) { | 
					
						
							| 
									
										
										
										
											2020-02-05 18:06:27 +08:00
										 |  |  | 							InnerGraph.setTopLevelSymbol(parser.state, fn); | 
					
						
							| 
									
										
										
										
											2019-09-08 21:21:00 +08:00
										 |  |  | 							if (pureDeclarators.has(decl)) { | 
					
						
							| 
									
										
										
										
											2020-02-05 18:06:27 +08:00
										 |  |  | 								InnerGraph.onUsage(parser.state, usedByExports => { | 
					
						
							|  |  |  | 									switch (usedByExports) { | 
					
						
							|  |  |  | 										case undefined: | 
					
						
							|  |  |  | 										case true: | 
					
						
							|  |  |  | 											return; | 
					
						
							|  |  |  | 										default: { | 
					
						
							|  |  |  | 											const dep = new PureExpressionDependency(decl.init.range); | 
					
						
							|  |  |  | 											dep.loc = decl.loc; | 
					
						
							|  |  |  | 											dep.usedByExports = usedByExports; | 
					
						
							|  |  |  | 											parser.state.module.addDependency(dep); | 
					
						
							|  |  |  | 											break; | 
					
						
							|  |  |  | 										} | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 								}); | 
					
						
							| 
									
										
										
										
											2019-09-08 21:21:00 +08:00
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							parser.walkExpression(decl.init); | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 							InnerGraph.setTopLevelSymbol(parser.state, undefined); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							return true; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 					parser.hooks.expression | 
					
						
							|  |  |  | 						.for(topLevelSymbolTag) | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 						.tap("InnerGraphPlugin", () => { | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 							const topLevelSymbol = /** @type {TopLevelSymbol} */ (parser.currentTagData); | 
					
						
							| 
									
										
										
										
											2020-01-23 20:59:27 +08:00
										 |  |  | 							const currentTopLevelSymbol = InnerGraph.getTopLevelSymbol( | 
					
						
							|  |  |  | 								parser.state | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2020-01-29 21:24:55 +08:00
										 |  |  | 							InnerGraph.addUsage( | 
					
						
							|  |  |  | 								parser.state, | 
					
						
							|  |  |  | 								topLevelSymbol, | 
					
						
							|  |  |  | 								currentTopLevelSymbol || true | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 					parser.hooks.assign | 
					
						
							|  |  |  | 						.for(topLevelSymbolTag) | 
					
						
							|  |  |  | 						.tap("InnerGraphPlugin", expr => { | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | 							if (!InnerGraph.isEnabled(parser.state)) return; | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 							if (expr.operator === "=") return true; | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							|  |  |  | 					.for("javascript/auto") | 
					
						
							| 
									
										
										
										
											2019-10-30 04:37:59 +08:00
										 |  |  | 					.tap("InnerGraphPlugin", handler); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							|  |  |  | 					.for("javascript/esm") | 
					
						
							| 
									
										
										
										
											2019-10-30 04:37:59 +08:00
										 |  |  | 					.tap("InnerGraphPlugin", handler); | 
					
						
							| 
									
										
										
										
											2020-01-30 18:34:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				compilation.hooks.finishModules.tap("InnerGraphPlugin", () => { | 
					
						
							|  |  |  | 					logger.timeAggregateEnd("infer dependency usage"); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = InnerGraphPlugin; |