| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-24 07:47:01 +08:00
										 |  |  | const eslintScope = require("eslint-scope"); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	CachedSource, | 
					
						
							|  |  |  | 	ConcatSource, | 
					
						
							|  |  |  | 	ReplaceSource | 
					
						
							|  |  |  | } = require("webpack-sources"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const DependencyTemplate = require("../DependencyTemplate"); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | const { UsageState } = require("../ExportsInfo"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const Module = require("../Module"); | 
					
						
							| 
									
										
										
										
											2018-11-05 21:36:15 +08:00
										 |  |  | const RuntimeGlobals = require("../RuntimeGlobals"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const Template = require("../Template"); | 
					
						
							|  |  |  | const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency"); | 
					
						
							|  |  |  | const HarmonyExportExpressionDependency = require("../dependencies/HarmonyExportExpressionDependency"); | 
					
						
							|  |  |  | const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency"); | 
					
						
							|  |  |  | const HarmonyExportSpecifierDependency = require("../dependencies/HarmonyExportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency"); | 
					
						
							| 
									
										
										
										
											2017-08-08 15:32:43 +08:00
										 |  |  | const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency"); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2019-10-11 21:46:57 +08:00
										 |  |  | const JavascriptParser = require("../javascript/JavascriptParser"); | 
					
						
							| 
									
										
										
										
											2020-08-12 00:06:27 +08:00
										 |  |  | const { equals } = require("../util/ArrayHelpers"); | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | const LazySet = require("../util/LazySet"); | 
					
						
							| 
									
										
										
										
											2019-10-30 05:02:22 +08:00
										 |  |  | const { concatComparators, keepOriginalOrder } = require("../util/comparators"); | 
					
						
							| 
									
										
										
										
											2017-11-23 17:59:29 +08:00
										 |  |  | const createHash = require("../util/createHash"); | 
					
						
							| 
									
										
										
										
											2018-12-07 22:36:49 +08:00
										 |  |  | const contextify = require("../util/identifier").contextify; | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | const makeSerializable = require("../util/makeSerializable"); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | const propertyAccess = require("../util/propertyAccess"); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-03 02:09:36 +08:00
										 |  |  | /** @typedef {import("eslint-scope").Scope} Scope */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | /** @typedef {import("webpack-sources").Source} Source */ | 
					
						
							| 
									
										
										
										
											2020-06-04 08:06:57 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */ | 
					
						
							| 
									
										
										
										
											2018-08-23 23:07:23 +08:00
										 |  |  | /** @typedef {import("../ChunkGraph")} ChunkGraph */ | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | /** @typedef {import("../Compilation")} Compilation */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | /** @typedef {import("../Dependency")} Dependency */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */ | 
					
						
							| 
									
										
										
										
											2018-07-18 01:38:42 +08:00
										 |  |  | /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ | 
					
						
							| 
									
										
										
										
											2018-07-11 19:05:13 +08:00
										 |  |  | /** @typedef {import("../DependencyTemplates")} DependencyTemplates */ | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | /** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */ | 
					
						
							|  |  |  | /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */ | 
					
						
							| 
									
										
										
										
											2018-07-20 22:24:35 +08:00
										 |  |  | /** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */ | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | /** @typedef {import("../ModuleGraph")} ModuleGraph */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | /** @typedef {import("../RequestShortener")} RequestShortener */ | 
					
						
							| 
									
										
										
										
											2019-11-11 22:25:03 +08:00
										 |  |  | /** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */ | 
					
						
							| 
									
										
										
										
											2018-07-11 19:05:13 +08:00
										 |  |  | /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ | 
					
						
							| 
									
										
										
										
											2018-09-12 00:47:55 +08:00
										 |  |  | /** @typedef {import("../WebpackError")} WebpackError */ | 
					
						
							| 
									
										
										
										
											2019-07-17 22:02:33 +08:00
										 |  |  | /** @typedef {import("../util/Hash")} Hash */ | 
					
						
							| 
									
										
										
										
											2019-11-11 22:25:03 +08:00
										 |  |  | /** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} ReexportInfo | 
					
						
							|  |  |  |  * @property {Module} module | 
					
						
							|  |  |  |  * @property {string[]} exportName | 
					
						
							|  |  |  |  * @property {Dependency} dependency | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} Binding | 
					
						
							|  |  |  |  * @property {ModuleInfo} info | 
					
						
							|  |  |  |  * @property {string[]} ids | 
					
						
							|  |  |  |  * @property {string[]} exportName | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | /** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo } ModuleInfo */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} ConcatenatedModuleInfo | 
					
						
							|  |  |  |  * @property {"concatenated"} type | 
					
						
							|  |  |  |  * @property {Module} module | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @property {number} index | 
					
						
							|  |  |  |  * @property {Object} ast | 
					
						
							|  |  |  |  * @property {Source} internalSource | 
					
						
							|  |  |  |  * @property {ReplaceSource} source | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  |  * @property {Iterable<string>} runtimeRequirements | 
					
						
							| 
									
										
										
										
											2020-08-03 02:09:36 +08:00
										 |  |  |  * @property {Scope} globalScope | 
					
						
							|  |  |  |  * @property {Scope} moduleScope | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  |  * @property {Map<string, string>} internalNames | 
					
						
							|  |  |  |  * @property {Map<string, string>} exportMap | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @property {Map<string, ReexportInfo>} reexportMap | 
					
						
							|  |  |  |  * @property {boolean} hasNamespaceObject | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  |  * @property {string} namespaceObjectName | 
					
						
							|  |  |  |  * @property {string} namespaceObjectSource | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} ExternalModuleInfo | 
					
						
							|  |  |  |  * @property {"external"} type | 
					
						
							|  |  |  |  * @property {Module} module | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @property {number} index | 
					
						
							|  |  |  |  * @property {string} name | 
					
						
							|  |  |  |  * @property {boolean} interopNamespaceObjectUsed | 
					
						
							|  |  |  |  * @property {string} interopNamespaceObjectName | 
					
						
							|  |  |  |  * @property {boolean} interopDefaultAccessUsed | 
					
						
							|  |  |  |  * @property {string} interopDefaultAccessName | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 22:02:17 +08:00
										 |  |  | const RESERVED_NAMES = [ | 
					
						
							|  |  |  | 	// internal name
 | 
					
						
							|  |  |  | 	"__WEBPACK_MODULE_DEFAULT_EXPORT__", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// keywords
 | 
					
						
							|  |  |  | 	"abstract,arguments,async,await,boolean,break,byte,case,catch,char,class,const,continue", | 
					
						
							|  |  |  | 	"debugger,default,delete,do,double,else,enum,eval,export,extends,false,final,finally,float", | 
					
						
							|  |  |  | 	"for,function,goto,if,implements,import,in,instanceof,int,interface,let,long,native,new,null", | 
					
						
							|  |  |  | 	"package,private,protected,public,return,short,static,super,switch,synchronized,this,throw", | 
					
						
							|  |  |  | 	"throws,transient,true,try,typeof,var,void,volatile,while,with,yield", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// commonjs
 | 
					
						
							|  |  |  | 	"module,__dirname,__filename,exports", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// js globals
 | 
					
						
							|  |  |  | 	"Array,Date,eval,function,hasOwnProperty,Infinity,isFinite,isNaN,isPrototypeOf,length,Math", | 
					
						
							|  |  |  | 	"NaN,name,Number,Object,prototype,String,toString,undefined,valueOf", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// browser globals
 | 
					
						
							|  |  |  | 	"alert,all,anchor,anchors,area,assign,blur,button,checkbox,clearInterval,clearTimeout", | 
					
						
							|  |  |  | 	"clientInformation,close,closed,confirm,constructor,crypto,decodeURI,decodeURIComponent", | 
					
						
							|  |  |  | 	"defaultStatus,document,element,elements,embed,embeds,encodeURI,encodeURIComponent,escape", | 
					
						
							|  |  |  | 	"event,fileUpload,focus,form,forms,frame,innerHeight,innerWidth,layer,layers,link,location", | 
					
						
							|  |  |  | 	"mimeTypes,navigate,navigator,frames,frameRate,hidden,history,image,images,offscreenBuffering", | 
					
						
							|  |  |  | 	"open,opener,option,outerHeight,outerWidth,packages,pageXOffset,pageYOffset,parent,parseFloat", | 
					
						
							|  |  |  | 	"parseInt,password,pkcs11,plugin,prompt,propertyIsEnum,radio,reset,screenX,screenY,scroll", | 
					
						
							|  |  |  | 	"secure,select,self,setInterval,setTimeout,status,submit,taint,text,textarea,top,unescape", | 
					
						
							|  |  |  | 	"untaint,window", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// window events
 | 
					
						
							|  |  |  | 	"onblur,onclick,onerror,onfocus,onkeydown,onkeypress,onkeyup,onmouseover,onload,onmouseup,onmousedown,onsubmit" | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 	.join(",") | 
					
						
							|  |  |  | 	.split(","); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-30 05:02:22 +08:00
										 |  |  | const bySourceOrder = (a, b) => { | 
					
						
							|  |  |  | 	const aOrder = a.sourceOrder; | 
					
						
							|  |  |  | 	const bOrder = b.sourceOrder; | 
					
						
							|  |  |  | 	if (isNaN(aOrder)) { | 
					
						
							|  |  |  | 		if (!isNaN(bOrder)) { | 
					
						
							|  |  |  | 			return 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		if (isNaN(bOrder)) { | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (aOrder !== bOrder) { | 
					
						
							|  |  |  | 			return aOrder < bOrder ? -1 : 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | const joinIterableWithComma = iterable => { | 
					
						
							|  |  |  | 	// This is more performant than Array.from().join(", ")
 | 
					
						
							|  |  |  | 	// as it doesn't create an array
 | 
					
						
							|  |  |  | 	let str = ""; | 
					
						
							|  |  |  | 	let first = true; | 
					
						
							|  |  |  | 	for (const item of iterable) { | 
					
						
							|  |  |  | 		if (first) { | 
					
						
							|  |  |  | 			first = false; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			str += ", "; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		str += item; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return str; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} ConcatenationEntry | 
					
						
							|  |  |  |  * @property {"concatenated" | "external"} type | 
					
						
							|  |  |  |  * @property {Module} module | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-06-08 19:20:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @param {ConcatenatedModuleInfo} info module info | 
					
						
							|  |  |  |  * @param {Map<Module, ModuleInfo>} moduleToInfoMap moduleToInfoMap | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  |  * @param {RuntimeSpec} runtime for which runtime | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {RequestShortener} requestShortener requestShortener | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  |  * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {boolean} strictHarmonyModule strictHarmonyModule | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  |  * @returns {string} the name of the ns obj variable | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | const ensureNsObjSource = ( | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	moduleGraph, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	info, | 
					
						
							|  |  |  | 	moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	runtime, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	requestShortener, | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	strictHarmonyModule | 
					
						
							|  |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 	const name = info.namespaceObjectName; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (!info.hasNamespaceObject) { | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 		info.hasNamespaceObject = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 20:07:01 +08:00
										 |  |  | 		const nsObj = []; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		const exportsInfo = moduleGraph.getExportsInfo(info.module); | 
					
						
							|  |  |  | 		for (const exportInfo of exportsInfo.orderedExports) { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			const usedName = exportInfo.getUsedName(undefined, runtime); | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 			if (usedName) { | 
					
						
							|  |  |  | 				const finalName = getFinalName( | 
					
						
							|  |  |  | 					moduleGraph, | 
					
						
							|  |  |  | 					info, | 
					
						
							|  |  |  | 					[exportInfo.name], | 
					
						
							|  |  |  | 					moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					runtime, | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 					requestShortener, | 
					
						
							|  |  |  | 					runtimeTemplate, | 
					
						
							|  |  |  | 					false, | 
					
						
							|  |  |  | 					undefined, | 
					
						
							|  |  |  | 					strictHarmonyModule, | 
					
						
							|  |  |  | 					true | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				nsObj.push( | 
					
						
							|  |  |  | 					`\n  ${JSON.stringify(usedName)}: ${runtimeTemplate.returningFunction( | 
					
						
							|  |  |  | 						finalName | 
					
						
							|  |  |  | 					)}`
 | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-08-23 20:07:01 +08:00
										 |  |  | 		info.namespaceObjectSource = `var ${name} = {};\n${ | 
					
						
							|  |  |  | 			RuntimeGlobals.makeNamespaceObject | 
					
						
							|  |  |  | 		}(${name});\n${RuntimeGlobals.definePropertyGetters}(${name}, {${nsObj.join( | 
					
						
							|  |  |  | 			"," | 
					
						
							|  |  |  | 		)}\n});\n`;
 | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 	return name; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @param {Module} importedModule module | 
					
						
							|  |  |  |  * @param {ExternalModuleInfo} info module info | 
					
						
							|  |  |  |  * @param {string[]} exportName exportName | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  |  * @param {RuntimeSpec} runtime for which runtime | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {boolean} asCall asCall | 
					
						
							| 
									
										
										
										
											2019-07-31 22:01:35 +08:00
										 |  |  |  * @param {boolean} callContext callContext | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {boolean} strictHarmonyModule strictHarmonyModule | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  |  * @param {boolean} asiSafe asiSafe | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @returns {string} expression to get value of external module | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | const getExternalImport = ( | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	moduleGraph, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	importedModule, | 
					
						
							|  |  |  | 	info, | 
					
						
							|  |  |  | 	exportName, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	runtime, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	asCall, | 
					
						
							| 
									
										
										
										
											2019-07-31 22:01:35 +08:00
										 |  |  | 	callContext, | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 	strictHarmonyModule, | 
					
						
							|  |  |  | 	asiSafe | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 	let exprStart = info.name; | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 	const exportsType = importedModule.getExportsType( | 
					
						
							|  |  |  | 		moduleGraph, | 
					
						
							|  |  |  | 		strictHarmonyModule | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 	if (exportName.length === 0) { | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		switch (exportsType) { | 
					
						
							|  |  |  | 			case "default-only": | 
					
						
							|  |  |  | 			case "default-with-named": | 
					
						
							| 
									
										
										
										
											2018-01-06 05:35:54 +08:00
										 |  |  | 				info.interopNamespaceObjectUsed = true; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				exprStart = info.interopNamespaceObjectName; | 
					
						
							| 
									
										
										
										
											2018-01-06 04:35:36 +08:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			case "namespace": | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 			case "dynamic": | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			default: | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				throw new Error(`Unexpected exportsType ${exportsType}`); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		switch (exportsType) { | 
					
						
							| 
									
										
										
										
											2019-08-21 21:08:07 +08:00
										 |  |  | 			case "namespace": | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 			case "default-with-named": | 
					
						
							|  |  |  | 				if (exportName[0] === "default") { | 
					
						
							|  |  |  | 					exprStart = info.name; | 
					
						
							|  |  |  | 					exportName = exportName.slice(1); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 			case "default-only": | 
					
						
							|  |  |  | 				if (exportName[0] === "default") { | 
					
						
							|  |  |  | 					exprStart = info.name; | 
					
						
							| 
									
										
										
										
											2018-01-06 04:35:36 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 					exprStart = | 
					
						
							|  |  |  | 						"/* non-default import from default-exporting module */undefined"; | 
					
						
							| 
									
										
										
										
											2018-01-06 04:35:36 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 				exportName = exportName.slice(1); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 			case "dynamic": | 
					
						
							|  |  |  | 				if (exportName[0] === "default") { | 
					
						
							|  |  |  | 					info.interopDefaultAccessUsed = true; | 
					
						
							|  |  |  | 					exprStart = asCall | 
					
						
							|  |  |  | 						? `${info.interopDefaultAccessName}()` | 
					
						
							|  |  |  | 						: asiSafe | 
					
						
							|  |  |  | 						? `(${info.interopDefaultAccessName}())` | 
					
						
							|  |  |  | 						: `${info.interopDefaultAccessName}.a`; | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 					exportName = exportName.slice(1); | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				throw new Error(`Unexpected exportsType ${exportsType}`); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 	const used = | 
					
						
							|  |  |  | 		exportName.length === 0 || | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		moduleGraph.getExportsInfo(importedModule).getUsedName(exportName, runtime); | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 	if (!used) return "/* unused export */undefined"; | 
					
						
							| 
									
										
										
										
											2020-08-12 00:06:27 +08:00
										 |  |  | 	const comment = equals(used, exportName) | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 		? "" | 
					
						
							|  |  |  | 		: Template.toNormalComment(`${exportName.join(".")}`); | 
					
						
							|  |  |  | 	const reference = `${exprStart}${comment}${propertyAccess(used)}`; | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 	if (asCall && callContext === false) { | 
					
						
							|  |  |  | 		return asiSafe ? `(0,${reference})` : `Object(${reference})`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return reference; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Set<ReexportInfo>} alreadyVisited alreadyVisited | 
					
						
							|  |  |  |  * @param {RequestShortener} requestShortener the request shortener | 
					
						
							|  |  |  |  * @param {ReexportInfo} reexport the current reexport | 
					
						
							|  |  |  |  * @returns {void | never} throws error when circular | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const checkCircularReexport = (alreadyVisited, requestShortener, reexport) => { | 
					
						
							|  |  |  | 	if (alreadyVisited.has(reexport)) { | 
					
						
							|  |  |  | 		throw new Error( | 
					
						
							|  |  |  | 			`Circular reexports ${Array.from( | 
					
						
							|  |  |  | 				alreadyVisited, | 
					
						
							|  |  |  | 				e => | 
					
						
							|  |  |  | 					`"${e.module.readableIdentifier( | 
					
						
							|  |  |  | 						requestShortener | 
					
						
							|  |  |  | 					)}".${e.exportName.join(".")}`
 | 
					
						
							|  |  |  | 			).join(" --> ")} -(circular)-> "${reexport.module.readableIdentifier( | 
					
						
							|  |  |  | 				requestShortener | 
					
						
							|  |  |  | 			)}".${reexport.exportName.join(".")}`
 | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	alreadyVisited.add(reexport); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleInfo} info module info | 
					
						
							|  |  |  |  * @param {string[]} exportName exportName | 
					
						
							|  |  |  |  * @param {Map<Module, ModuleInfo>} moduleToInfoMap moduleToInfoMap | 
					
						
							|  |  |  |  * @param {RequestShortener} requestShortener the request shortener | 
					
						
							|  |  |  |  * @param {Set<ReexportInfo>} alreadyVisited alreadyVisited | 
					
						
							|  |  |  |  * @returns {Binding} the final variable | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const getFinalBinding = ( | 
					
						
							|  |  |  | 	info, | 
					
						
							|  |  |  | 	exportName, | 
					
						
							|  |  |  | 	moduleToInfoMap, | 
					
						
							|  |  |  | 	requestShortener, | 
					
						
							|  |  |  | 	alreadyVisited = new Set() | 
					
						
							|  |  |  | ) => { | 
					
						
							|  |  |  | 	switch (info.type) { | 
					
						
							|  |  |  | 		case "concatenated": { | 
					
						
							|  |  |  | 			if (exportName.length === 0) { | 
					
						
							|  |  |  | 				return { info, ids: exportName, exportName }; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			const exportId = exportName[0]; | 
					
						
							|  |  |  | 			const directExport = info.exportMap.get(exportId); | 
					
						
							|  |  |  | 			if (directExport) { | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					info, | 
					
						
							|  |  |  | 					ids: [directExport, ...exportName.slice(1)], | 
					
						
							|  |  |  | 					exportName | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			const reexport = info.reexportMap.get(exportId); | 
					
						
							|  |  |  | 			if (reexport) { | 
					
						
							|  |  |  | 				checkCircularReexport(alreadyVisited, requestShortener, reexport); | 
					
						
							|  |  |  | 				const refInfo = moduleToInfoMap.get(reexport.module); | 
					
						
							|  |  |  | 				if (refInfo) { | 
					
						
							|  |  |  | 					// module is in the concatenation
 | 
					
						
							|  |  |  | 					return getFinalBinding( | 
					
						
							|  |  |  | 						refInfo, | 
					
						
							|  |  |  | 						[...reexport.exportName, ...exportName.slice(1)], | 
					
						
							|  |  |  | 						moduleToInfoMap, | 
					
						
							|  |  |  | 						requestShortener, | 
					
						
							|  |  |  | 						alreadyVisited | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return { info, ids: null, exportName }; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		case "external": { | 
					
						
							|  |  |  | 			return { info, ids: exportName, exportName }; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  |  * @param {ModuleInfo} info module info | 
					
						
							|  |  |  |  * @param {string[]} exportName exportName | 
					
						
							|  |  |  |  * @param {Map<Module, ModuleInfo>} moduleToInfoMap moduleToInfoMap | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  |  * @param {RuntimeSpec} runtime for which runtime | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {RequestShortener} requestShortener the request shortener | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  |  * @param {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {boolean} asCall asCall | 
					
						
							| 
									
										
										
										
											2019-07-31 22:01:35 +08:00
										 |  |  |  * @param {boolean} callContext callContext | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @param {boolean} strictHarmonyModule strictHarmonyModule | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  |  * @param {boolean} asiSafe asiSafe | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  |  * @returns {string} the final name | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | const getFinalName = ( | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	moduleGraph, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	info, | 
					
						
							|  |  |  | 	exportName, | 
					
						
							|  |  |  | 	moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	runtime, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	requestShortener, | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	asCall, | 
					
						
							| 
									
										
										
										
											2019-07-31 22:01:35 +08:00
										 |  |  | 	callContext, | 
					
						
							| 
									
										
										
										
											2018-06-20 05:19:28 +08:00
										 |  |  | 	strictHarmonyModule, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 	asiSafe | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 	const binding = getFinalBinding( | 
					
						
							|  |  |  | 		info, | 
					
						
							|  |  |  | 		exportName, | 
					
						
							|  |  |  | 		moduleToInfoMap, | 
					
						
							|  |  |  | 		requestShortener | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 	switch (binding.info.type) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		case "concatenated": { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			const { info, ids, exportName } = binding; | 
					
						
							|  |  |  | 			if (!ids) { | 
					
						
							|  |  |  | 				const problem = | 
					
						
							|  |  |  | 					`Cannot get final name for export "${exportName}" in "${info.module.readableIdentifier( | 
					
						
							|  |  |  | 						requestShortener | 
					
						
							|  |  |  | 					)}"` +
 | 
					
						
							|  |  |  | 					` (known exports: ${Array.from(info.exportMap.keys()).join(" ")}, ` + | 
					
						
							|  |  |  | 					`known reexports: ${Array.from(info.reexportMap.keys()).join(" ")})`; | 
					
						
							|  |  |  | 				return `${Template.toNormalComment(problem)} undefined${propertyAccess( | 
					
						
							|  |  |  | 					exportName, | 
					
						
							|  |  |  | 					1 | 
					
						
							|  |  |  | 				)}`;
 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (ids.length === 0) { | 
					
						
							|  |  |  | 				return ensureNsObjSource( | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					moduleGraph, | 
					
						
							|  |  |  | 					info, | 
					
						
							|  |  |  | 					moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					runtime, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					requestShortener, | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 					runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					strictHarmonyModule | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			const exportId = ids[0]; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			const exportsInfo = moduleGraph.getExportsInfo(info.module); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			if (exportsInfo.getUsed(exportName, runtime) === UsageState.Unused) { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 				return `/* unused export */ undefined${propertyAccess(exportName, 1)}`; | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			const name = info.internalNames.get(exportId); | 
					
						
							|  |  |  | 			if (!name) { | 
					
						
							|  |  |  | 				throw new Error( | 
					
						
							|  |  |  | 					`The export "${exportId}" in "${info.module.readableIdentifier( | 
					
						
							|  |  |  | 						requestShortener | 
					
						
							|  |  |  | 					)}" has no internal name`
 | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			return `${name}${propertyAccess(exportName, 1)}`; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		case "external": { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			const { info, ids } = binding; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			const importedModule = info.module; | 
					
						
							|  |  |  | 			return getExternalImport( | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 				moduleGraph, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				importedModule, | 
					
						
							|  |  |  | 				info, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 				ids, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				runtime, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				asCall, | 
					
						
							| 
									
										
										
										
											2019-07-31 22:01:35 +08:00
										 |  |  | 				callContext, | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 				strictHarmonyModule, | 
					
						
							|  |  |  | 				asiSafe | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | const addScopeSymbols = (s, nameSet, scopeSet1, scopeSet2) => { | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 	let scope = s; | 
					
						
							|  |  |  | 	while (scope) { | 
					
						
							|  |  |  | 		if (scopeSet1.has(scope)) break; | 
					
						
							|  |  |  | 		if (scopeSet2.has(scope)) break; | 
					
						
							|  |  |  | 		scopeSet1.add(scope); | 
					
						
							|  |  |  | 		for (const variable of scope.variables) { | 
					
						
							|  |  |  | 			nameSet.add(variable.name); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-31 22:46:25 +08:00
										 |  |  | 		scope = scope.upper; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-05-31 22:46:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const getAllReferences = variable => { | 
					
						
							| 
									
										
										
										
											2017-06-06 17:18:34 +08:00
										 |  |  | 	let set = variable.references; | 
					
						
							|  |  |  | 	// Look for inner scope variables too (like in class Foo { t() { Foo } })
 | 
					
						
							|  |  |  | 	const identifiers = new Set(variable.identifiers); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	for (const scope of variable.scope.childScopes) { | 
					
						
							|  |  |  | 		for (const innerVar of scope.variables) { | 
					
						
							|  |  |  | 			if (innerVar.identifiers.some(id => identifiers.has(id))) { | 
					
						
							| 
									
										
										
										
											2017-06-06 17:18:34 +08:00
										 |  |  | 				set = set.concat(innerVar.references); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return set; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-06-06 17:18:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const getPathInAst = (ast, node) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (ast === node) { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 		return []; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 	const nr = node.range; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	const enterNode = n => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!n) return undefined; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		const r = n.range; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (r) { | 
					
						
							|  |  |  | 			if (r[0] <= nr[0] && r[1] >= nr[1]) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 				const path = getPathInAst(n, node); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (path) { | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 					path.push(n); | 
					
						
							|  |  |  | 					return path; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return undefined; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (Array.isArray(ast)) { | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 		for (let i = 0; i < ast.length; i++) { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 			const enterResult = enterNode(ast[i]); | 
					
						
							| 
									
										
										
										
											2018-08-21 08:26:50 +08:00
										 |  |  | 			if (enterResult !== undefined) return enterResult; | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	} else if (ast && typeof ast === "object") { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 		const keys = Object.keys(ast); | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 		for (let i = 0; i < keys.length; i++) { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 			const value = ast[keys[i]]; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (Array.isArray(value)) { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 				const pathResult = getPathInAst(value, node); | 
					
						
							| 
									
										
										
										
											2018-08-21 08:26:50 +08:00
										 |  |  | 				if (pathResult !== undefined) return pathResult; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			} else if (value && typeof value === "object") { | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 				const enterResult = enterNode(value); | 
					
						
							| 
									
										
										
										
											2018-08-21 08:26:50 +08:00
										 |  |  | 				if (enterResult !== undefined) return enterResult; | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-06-13 19:38:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleInfo[]} modulesWithInfo modules | 
					
						
							|  |  |  |  * @returns {Map<Module, ModuleInfo>} mapping | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | const modulesWithInfoToMap = modulesWithInfo => { | 
					
						
							|  |  |  | 	const moduleToInfoMap = new Map(); | 
					
						
							|  |  |  | 	for (const m of modulesWithInfo) { | 
					
						
							|  |  |  | 		moduleToInfoMap.set(m.module, m); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return moduleToInfoMap; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | const createModuleReference = ({ | 
					
						
							|  |  |  | 	info, | 
					
						
							|  |  |  | 	ids = undefined, | 
					
						
							|  |  |  | 	call = false, | 
					
						
							|  |  |  | 	directImport = false, | 
					
						
							|  |  |  | 	strict = false, | 
					
						
							|  |  |  | 	asiSafe = false | 
					
						
							|  |  |  | }) => { | 
					
						
							|  |  |  | 	const callFlag = call ? "_call" : ""; | 
					
						
							|  |  |  | 	const directImportFlag = directImport ? "_directImport" : ""; | 
					
						
							|  |  |  | 	const strictFlag = strict ? "_strict" : ""; | 
					
						
							|  |  |  | 	const asiSafeFlag = asiSafe ? "_asiSafe" : ""; | 
					
						
							|  |  |  | 	const exportData = ids | 
					
						
							|  |  |  | 		? Buffer.from(JSON.stringify(ids), "utf-8").toString("hex") | 
					
						
							|  |  |  | 		: "ns"; | 
					
						
							|  |  |  | 	return `__WEBPACK_MODULE_REFERENCE__${info.index}_${exportData}${callFlag}${directImportFlag}${strictFlag}${asiSafeFlag}__`; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const MODULE_REFERENCE_REGEXP = /^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_directImport)?(_strict)?(_asiSafe)?__$/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const isModuleReference = name => { | 
					
						
							|  |  |  | 	return MODULE_REFERENCE_REGEXP.test(name); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const matchModuleReference = (name, modulesWithInfo) => { | 
					
						
							|  |  |  | 	const match = MODULE_REFERENCE_REGEXP.exec(name); | 
					
						
							|  |  |  | 	if (!match) return null; | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 	const index = +match[1]; | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 	return { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 		index, | 
					
						
							|  |  |  | 		info: modulesWithInfo[index], | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 		ids: | 
					
						
							|  |  |  | 			match[2] === "ns" | 
					
						
							|  |  |  | 				? [] | 
					
						
							|  |  |  | 				: JSON.parse(Buffer.from(match[2], "hex").toString("utf-8")), | 
					
						
							|  |  |  | 		call: !!match[3], | 
					
						
							|  |  |  | 		directImport: !!match[4], | 
					
						
							|  |  |  | 		strict: !!match[5], | 
					
						
							|  |  |  | 		asiSafe: !!match[6] | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 21:51:40 +08:00
										 |  |  | const TYPES = new Set(["javascript"]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param {HarmonyExportImportedSpecifierDependency} dep dependency | 
					
						
							|  |  |  |  * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  |  * @param {RuntimeSpec} runtime the runtime | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  |  * @returns {{name: string, ids: string[]}[]} list of exports | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | const getHarmonyExportImportedSpecifierDependencyExports = ( | 
					
						
							|  |  |  | 	dep, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	moduleGraph, | 
					
						
							|  |  |  | 	runtime | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | ) => { | 
					
						
							|  |  |  | 	const importModule = moduleGraph.getModule(dep); | 
					
						
							|  |  |  | 	if (!importModule) return []; | 
					
						
							|  |  |  | 	const ids = dep.getIds(moduleGraph); | 
					
						
							|  |  |  | 	if (ids.length > 0) { | 
					
						
							|  |  |  | 		// export { named } from "module"
 | 
					
						
							|  |  |  | 		return [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				name: dep.name, | 
					
						
							|  |  |  | 				ids | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (dep.name) { | 
					
						
							|  |  |  | 		// export * as abc from "module"
 | 
					
						
							|  |  |  | 		return [ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				name: dep.name, | 
					
						
							|  |  |  | 				ids: [] | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// export * from "module"
 | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | 	const { exports: providedExports } = dep.getStarReexports( | 
					
						
							|  |  |  | 		moduleGraph, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		runtime, | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | 		undefined, | 
					
						
							|  |  |  | 		importModule | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 	if (providedExports) { | 
					
						
							|  |  |  | 		return Array.from(providedExports, exp => { | 
					
						
							|  |  |  | 			return { | 
					
						
							|  |  |  | 				name: exp, | 
					
						
							|  |  |  | 				ids: [exp] | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// unknown, should not happen
 | 
					
						
							|  |  |  | 	throw new Error("ConcatenatedModule: unknown exports"); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | class ConcatenatedModule extends Module { | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Module} rootModule the root module of the concatenation | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 	 * @param {Set<Module>} modules all modules in the concatenation (including the root module) | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	 * @param {Object=} associatedObjectForCache object for caching | 
					
						
							|  |  |  | 	 * @returns {ConcatenatedModule} the module | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	static create(rootModule, modules, associatedObjectForCache) { | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		const identifier = ConcatenatedModule._createIdentifier( | 
					
						
							|  |  |  | 			rootModule, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			modules, | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 			associatedObjectForCache | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		return new ConcatenatedModule({ | 
					
						
							|  |  |  | 			identifier, | 
					
						
							|  |  |  | 			rootModule, | 
					
						
							|  |  |  | 			modules | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Object} options options | 
					
						
							|  |  |  | 	 * @param {string} options.identifier the identifier of the module | 
					
						
							|  |  |  | 	 * @param {Module=} options.rootModule the root module of the concatenation | 
					
						
							|  |  |  | 	 * @param {Set<Module>=} options.modules all concatenated modules | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	constructor({ identifier, rootModule, modules }) { | 
					
						
							| 
									
										
										
										
											2018-01-31 04:40:44 +08:00
										 |  |  | 		super("javascript/esm", null); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Info from Factory
 | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		/** @type {string} */ | 
					
						
							|  |  |  | 		this._identifier = identifier; | 
					
						
							|  |  |  | 		/** @type {Module} */ | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		this.rootModule = rootModule; | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		/** @type {Set<Module>} */ | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 		this._modules = modules; | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		this.factoryMeta = rootModule && rootModule.factoryMeta; | 
					
						
							| 
									
										
										
										
											2017-11-06 20:02:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Caching
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		// TODO
 | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-18 20:46:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Assuming this module is in the cache. Update the (cached) module with | 
					
						
							|  |  |  | 	 * the fresh module from the factory. Usually updates internal references | 
					
						
							|  |  |  | 	 * and properties. | 
					
						
							|  |  |  | 	 * @param {Module} module fresh module | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	updateCacheModule(module) { | 
					
						
							|  |  |  | 		super.updateCacheModule(module); | 
					
						
							|  |  |  | 		const m = /** @type {ConcatenatedModule} */ (module); | 
					
						
							|  |  |  | 		this._identifier = m._identifier; | 
					
						
							|  |  |  | 		this.rootModule = m.rootModule; | 
					
						
							|  |  |  | 		this._modules = m._modules; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-03-10 09:59:46 +08:00
										 |  |  | 	 * @returns {Set<string>} types available (do not mutate) | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	getSourceTypes() { | 
					
						
							|  |  |  | 		return TYPES; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-06 19:09:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	get modules() { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		return Array.from(this._modules); | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	 * @returns {string} a unique identifier of the module | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	identifier() { | 
					
						
							|  |  |  | 		return this._identifier; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {RequestShortener} requestShortener the request shortener | 
					
						
							|  |  |  | 	 * @returns {string} a user readable identifier of the module | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	readableIdentifier(requestShortener) { | 
					
						
							|  |  |  | 		return ( | 
					
						
							|  |  |  | 			this.rootModule.readableIdentifier(requestShortener) + | 
					
						
							|  |  |  | 			` + ${this._modules.size - 1} modules` | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {LibIdentOptions} options options | 
					
						
							|  |  |  | 	 * @returns {string | null} an identifier for library inclusion | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	libIdent(options) { | 
					
						
							|  |  |  | 		return this.rootModule.libIdent(options); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {string | null} absolute path which should be used for condition matching (usually the resource path) | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	nameForCondition() { | 
					
						
							|  |  |  | 		return this.rootModule.nameForCondition(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {WebpackOptions} options webpack options | 
					
						
							|  |  |  | 	 * @param {Compilation} compilation the compilation | 
					
						
							|  |  |  | 	 * @param {ResolverWithOptions} resolver the resolver | 
					
						
							|  |  |  | 	 * @param {InputFileSystem} fs the file system | 
					
						
							|  |  |  | 	 * @param {function(WebpackError=): void} callback callback function | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	build(options, compilation, resolver, fs, callback) { | 
					
						
							|  |  |  | 		const { rootModule } = this; | 
					
						
							|  |  |  | 		this.buildInfo = { | 
					
						
							|  |  |  | 			strict: true, | 
					
						
							|  |  |  | 			cacheable: true, | 
					
						
							|  |  |  | 			moduleArgument: rootModule.buildInfo.moduleArgument, | 
					
						
							|  |  |  | 			exportsArgument: rootModule.buildInfo.exportsArgument, | 
					
						
							|  |  |  | 			fileDependencies: new LazySet(), | 
					
						
							|  |  |  | 			contextDependencies: new LazySet(), | 
					
						
							|  |  |  | 			missingDependencies: new LazySet(), | 
					
						
							|  |  |  | 			assets: undefined | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		this.buildMeta = rootModule.buildMeta; | 
					
						
							|  |  |  | 		this.clearDependenciesAndBlocks(); | 
					
						
							|  |  |  | 		this.clearWarningsAndErrors(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		for (const m of this._modules) { | 
					
						
							|  |  |  | 			// populate cacheable
 | 
					
						
							|  |  |  | 			if (!m.buildInfo.cacheable) { | 
					
						
							|  |  |  | 				this.buildInfo.cacheable = false; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			// populate dependencies
 | 
					
						
							|  |  |  | 			for (const d of m.dependencies.filter( | 
					
						
							|  |  |  | 				dep => | 
					
						
							|  |  |  | 					!(dep instanceof HarmonyImportDependency) || | 
					
						
							|  |  |  | 					!this._modules.has(compilation.moduleGraph.getModule(dep)) | 
					
						
							|  |  |  | 			)) { | 
					
						
							|  |  |  | 				this.dependencies.push(d); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// populate blocks
 | 
					
						
							|  |  |  | 			for (const d of m.blocks) { | 
					
						
							|  |  |  | 				this.blocks.push(d); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			// populate warnings
 | 
					
						
							|  |  |  | 			const warnings = m.getWarnings(); | 
					
						
							|  |  |  | 			if (warnings !== undefined) { | 
					
						
							|  |  |  | 				for (const warning of warnings) { | 
					
						
							|  |  |  | 					this.addWarning(warning); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			// populate errors
 | 
					
						
							|  |  |  | 			const errors = m.getErrors(); | 
					
						
							|  |  |  | 			if (errors !== undefined) { | 
					
						
							|  |  |  | 				for (const error of errors) { | 
					
						
							|  |  |  | 					this.addError(error); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			// populate assets
 | 
					
						
							|  |  |  | 			if (m.buildInfo.assets) { | 
					
						
							|  |  |  | 				if (this.buildInfo.assets === undefined) { | 
					
						
							|  |  |  | 					this.buildInfo.assets = Object.create(null); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				Object.assign(this.buildInfo.assets, m.buildInfo.assets); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (m.buildInfo.assetsInfo) { | 
					
						
							|  |  |  | 				if (this.buildInfo.assetsInfo === undefined) { | 
					
						
							|  |  |  | 					this.buildInfo.assetsInfo = new Map(); | 
					
						
							| 
									
										
										
										
											2017-11-06 23:41:26 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				for (const [key, value] of m.buildInfo.assetsInfo) { | 
					
						
							|  |  |  | 					this.buildInfo.assetsInfo.set(key, value); | 
					
						
							| 
									
										
										
										
											2019-09-11 17:13:46 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-06-18 20:46:06 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		callback(); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 18:12:17 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2018-12-04 18:23:40 +08:00
										 |  |  | 	 * @param {string=} type the source type for which the size should be estimated | 
					
						
							| 
									
										
										
										
											2019-05-13 18:29:29 +08:00
										 |  |  | 	 * @returns {number} the estimated size of the module (must be non-zero) | 
					
						
							| 
									
										
										
										
											2018-07-25 18:12:17 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-12-04 18:23:40 +08:00
										 |  |  | 	size(type) { | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		// Guess size from embedded modules
 | 
					
						
							| 
									
										
										
										
											2020-01-19 01:54:56 +08:00
										 |  |  | 		let size = 0; | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		for (const module of this._modules) { | 
					
						
							|  |  |  | 			size += module.size(type); | 
					
						
							| 
									
										
										
										
											2020-01-19 01:54:56 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return size; | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 	 * @private | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 	 * @param {Module} rootModule the root of the concatenation | 
					
						
							|  |  |  | 	 * @param {Set<Module>} modulesSet a set of modules which should be concatenated | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	 * @param {RuntimeSpec} runtime for this runtime | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 	 * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 	 * @returns {ConcatenationEntry[]} concatenation list | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	_createConcatenationList(rootModule, modulesSet, runtime, moduleGraph) { | 
					
						
							|  |  |  | 		/** @type {ConcatenationEntry[]} */ | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 		const list = []; | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		/** @type {Set<Module>} */ | 
					
						
							|  |  |  | 		const existingEntries = new Set(); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 19:20:57 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {Module} module a module | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		 * @returns {ModuleGraphConnection[]} imported modules in order | 
					
						
							| 
									
										
										
										
											2018-06-08 19:20:57 +08:00
										 |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		const getConcatenatedImports = module => { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			let connections = Array.from(moduleGraph.getOutgoingConnections(module)); | 
					
						
							|  |  |  | 			if (module === rootModule) { | 
					
						
							|  |  |  | 				for (const c of moduleGraph.getOutgoingConnections(this)) | 
					
						
							|  |  |  | 					connections.push(c); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			const references = connections | 
					
						
							| 
									
										
										
										
											2019-10-30 05:02:22 +08:00
										 |  |  | 				.filter(connection => { | 
					
						
							|  |  |  | 					if (!(connection.dependency instanceof HarmonyImportDependency)) | 
					
						
							|  |  |  | 						return false; | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					return ( | 
					
						
							|  |  |  | 						connection && connection.module && connection.isActive(runtime) | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2019-10-30 04:37:59 +08:00
										 |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2019-10-30 05:02:22 +08:00
										 |  |  | 				.map(connection => ({ | 
					
						
							|  |  |  | 					connection, | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 					sourceOrder: /** @type {HarmonyImportDependency} */ (connection.dependency) | 
					
						
							|  |  |  | 						.sourceOrder | 
					
						
							| 
									
										
										
										
											2019-10-30 05:02:22 +08:00
										 |  |  | 				})); | 
					
						
							|  |  |  | 			references.sort( | 
					
						
							|  |  |  | 				concatComparators(bySourceOrder, keepOriginalOrder(references)) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			return references.map(({ connection }) => connection); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {ModuleGraphConnection} connection graph connection | 
					
						
							|  |  |  | 		 * @returns {void} | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		const enterModule = connection => { | 
					
						
							|  |  |  | 			const module = connection.module; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (!module) return; | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			if (existingEntries.has(module)) { | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (modulesSet.has(module)) { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				existingEntries.add(module); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				const imports = getConcatenatedImports(module); | 
					
						
							|  |  |  | 				imports.forEach(enterModule); | 
					
						
							|  |  |  | 				list.push({ | 
					
						
							|  |  |  | 					type: "concatenated", | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					module: connection.module | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				existingEntries.add(connection.module); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				list.push({ | 
					
						
							|  |  |  | 					type: "external", | 
					
						
							| 
									
										
										
										
											2017-08-07 19:56:50 +08:00
										 |  |  | 					get module() { | 
					
						
							|  |  |  | 						// We need to use a getter here, because the module in the dependency
 | 
					
						
							|  |  |  | 						// could be replaced by some other process (i. e. also replaced with a
 | 
					
						
							|  |  |  | 						// concatenated module)
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 						return connection.module; | 
					
						
							| 
									
										
										
										
											2017-08-07 19:56:50 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		existingEntries.add(rootModule); | 
					
						
							|  |  |  | 		const imports = getConcatenatedImports(rootModule); | 
					
						
							|  |  |  | 		imports.forEach(enterModule); | 
					
						
							|  |  |  | 		list.push({ | 
					
						
							|  |  |  | 			type: "concatenated", | 
					
						
							|  |  |  | 			module: rootModule | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return list; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	static _createIdentifier(rootModule, modules, associatedObjectForCache) { | 
					
						
							| 
									
										
										
										
											2020-01-15 06:14:47 +08:00
										 |  |  | 		const cachedContextify = contextify.bindContextCache( | 
					
						
							|  |  |  | 			rootModule.context, | 
					
						
							|  |  |  | 			associatedObjectForCache | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		let identifiers = []; | 
					
						
							|  |  |  | 		for (const module of modules) { | 
					
						
							|  |  |  | 			identifiers.push(cachedContextify(module.identifier())); | 
					
						
							| 
									
										
										
										
											2017-11-23 23:57:07 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		identifiers.sort(); | 
					
						
							| 
									
										
										
										
											2018-02-22 18:27:11 +08:00
										 |  |  | 		const hash = createHash("md4"); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		hash.update(identifiers.join(" ")); | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		return rootModule.identifier() + "|" + hash.digest("hex"); | 
					
						
							| 
									
										
										
										
											2017-11-23 00:14:39 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-23 03:54:34 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {LazySet<string>} fileDependencies set where file dependencies are added to | 
					
						
							|  |  |  | 	 * @param {LazySet<string>} contextDependencies set where context dependencies are added to | 
					
						
							|  |  |  | 	 * @param {LazySet<string>} missingDependencies set where missing dependencies are added to | 
					
						
							|  |  |  | 	 * @param {LazySet<string>} buildDependencies set where build dependencies are added to | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	addCacheDependencies( | 
					
						
							|  |  |  | 		fileDependencies, | 
					
						
							|  |  |  | 		contextDependencies, | 
					
						
							|  |  |  | 		missingDependencies, | 
					
						
							|  |  |  | 		buildDependencies | 
					
						
							|  |  |  | 	) { | 
					
						
							|  |  |  | 		for (const module of this._modules) { | 
					
						
							|  |  |  | 			module.addCacheDependencies( | 
					
						
							|  |  |  | 				fileDependencies, | 
					
						
							|  |  |  | 				contextDependencies, | 
					
						
							|  |  |  | 				missingDependencies, | 
					
						
							|  |  |  | 				buildDependencies | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-11 19:05:13 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	 * @param {CodeGenerationContext} context context for code generation | 
					
						
							|  |  |  | 	 * @returns {CodeGenerationResult} result | 
					
						
							| 
									
										
										
										
											2018-07-11 19:05:13 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	codeGeneration({ | 
					
						
							|  |  |  | 		dependencyTemplates, | 
					
						
							|  |  |  | 		runtimeTemplate, | 
					
						
							|  |  |  | 		moduleGraph, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		runtime | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	}) { | 
					
						
							|  |  |  | 		/** @type {Set<string>} */ | 
					
						
							| 
									
										
										
										
											2019-10-09 17:49:48 +08:00
										 |  |  | 		const runtimeRequirements = new Set(); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-07 17:31:00 +08:00
										 |  |  | 		const requestShortener = runtimeTemplate.requestShortener; | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 		// Meta info for each module
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		const modulesWithInfo = this._getModulesWithInfo(moduleGraph, runtime); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Create mapping from module to info
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		const moduleToInfoMap = modulesWithInfoToMap(modulesWithInfo); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Configure template decorators for dependencies
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		const innerDependencyTemplates = this._getInnerDependencyTemplates( | 
					
						
							|  |  |  | 			dependencyTemplates, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 			moduleToInfoMap | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-04-29 04:32:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		// Generate source code and analyse scopes
 | 
					
						
							|  |  |  | 		// Prepare a ReplaceSource for the final source
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			this._analyseModule( | 
					
						
							|  |  |  | 				info, | 
					
						
							|  |  |  | 				innerDependencyTemplates, | 
					
						
							|  |  |  | 				runtimeTemplate, | 
					
						
							|  |  |  | 				moduleGraph, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				chunkGraph, | 
					
						
							|  |  |  | 				runtime | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// List of all used names to avoid conflicts
 | 
					
						
							| 
									
										
										
										
											2018-11-16 22:02:17 +08:00
										 |  |  | 		const allUsedNames = new Set(RESERVED_NAMES); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 		// List of additional names in scope for module references
 | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 		/** @type {Map<string, { usedNames: Set<string>, alreadyCheckedScopes: Set<TODO> }>} */ | 
					
						
							|  |  |  | 		const usedNamesInScopeInfo = new Map(); | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {string} module module identifier | 
					
						
							|  |  |  | 		 * @param {string} id export id | 
					
						
							|  |  |  | 		 * @returns {{ usedNames: Set<string>, alreadyCheckedScopes: Set<TODO> }} info | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		const getUsedNamesInScopeInfo = (module, id) => { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			const key = `${module}-${id}`; | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 			let info = usedNamesInScopeInfo.get(key); | 
					
						
							|  |  |  | 			if (info === undefined) { | 
					
						
							|  |  |  | 				info = { | 
					
						
							|  |  |  | 					usedNames: new Set(), | 
					
						
							|  |  |  | 					alreadyCheckedScopes: new Set() | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 				usedNamesInScopeInfo.set(key, info); | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 			return info; | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 		// Set of already checked scopes
 | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 		const ignoredScopes = new Set(); | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		// get all global names
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			if (info.type === "concatenated") { | 
					
						
							|  |  |  | 				const superClassExpressions = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// ignore symbols from moduleScope
 | 
					
						
							|  |  |  | 				if (info.moduleScope) { | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 					ignoredScopes.add(info.moduleScope); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// The super class expression in class scopes behaves weird
 | 
					
						
							|  |  |  | 					// We store ranges of all super class expressions to make
 | 
					
						
							|  |  |  | 					// renaming to work correctly
 | 
					
						
							|  |  |  | 					for (const childScope of info.moduleScope.childScopes) { | 
					
						
							|  |  |  | 						if (childScope.type !== "class") continue; | 
					
						
							| 
									
										
										
										
											2020-08-03 02:09:36 +08:00
										 |  |  | 						const block = childScope.block; | 
					
						
							|  |  |  | 						if ( | 
					
						
							|  |  |  | 							(block.type === "ClassDeclaration" || | 
					
						
							|  |  |  | 								block.type === "ClassExpression") && | 
					
						
							|  |  |  | 							block.superClass | 
					
						
							|  |  |  | 						) { | 
					
						
							|  |  |  | 							superClassExpressions.push({ | 
					
						
							|  |  |  | 								range: block.superClass.range, | 
					
						
							|  |  |  | 								variables: childScope.variables | 
					
						
							|  |  |  | 							}); | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 				// add global symbols
 | 
					
						
							|  |  |  | 				if (info.globalScope) { | 
					
						
							|  |  |  | 					for (const reference of info.globalScope.through) { | 
					
						
							|  |  |  | 						const name = reference.identifier.name; | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 						if (isModuleReference(name)) { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 							const match = matchModuleReference(name, modulesWithInfo); | 
					
						
							|  |  |  | 							if (!match || match.ids.length < 1) continue; | 
					
						
							|  |  |  | 							const binding = getFinalBinding( | 
					
						
							|  |  |  | 								match.info, | 
					
						
							|  |  |  | 								match.ids, | 
					
						
							|  |  |  | 								moduleToInfoMap, | 
					
						
							|  |  |  | 								requestShortener | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 							if (!binding.ids) continue; | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 							const { | 
					
						
							|  |  |  | 								usedNames, | 
					
						
							|  |  |  | 								alreadyCheckedScopes | 
					
						
							|  |  |  | 							} = getUsedNamesInScopeInfo( | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 								binding.info.module.identifier(), | 
					
						
							|  |  |  | 								binding.info.type === "external" | 
					
						
							|  |  |  | 									? "external" | 
					
						
							|  |  |  | 									: binding.ids.length > 0 | 
					
						
							|  |  |  | 									? binding.ids[0] | 
					
						
							|  |  |  | 									: "" | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 							for (const expr of superClassExpressions) { | 
					
						
							|  |  |  | 								if ( | 
					
						
							|  |  |  | 									expr.range[0] <= reference.identifier.range[0] && | 
					
						
							|  |  |  | 									expr.range[1] >= reference.identifier.range[1] | 
					
						
							|  |  |  | 								) { | 
					
						
							|  |  |  | 									for (const variable of expr.variables) { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 										usedNames.add(variable.name); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 									} | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 							addScopeSymbols( | 
					
						
							|  |  |  | 								reference.from, | 
					
						
							|  |  |  | 								usedNames, | 
					
						
							|  |  |  | 								alreadyCheckedScopes, | 
					
						
							|  |  |  | 								ignoredScopes | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						} else { | 
					
						
							|  |  |  | 							allUsedNames.add(name); | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2017-05-31 22:46:25 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-08-20 16:34:58 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 		// generate names for symbols
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							|  |  |  | 			switch (info.type) { | 
					
						
							|  |  |  | 				case "concatenated": { | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 					const { | 
					
						
							|  |  |  | 						usedNames: namespaceObjectUsedNames | 
					
						
							|  |  |  | 					} = getUsedNamesInScopeInfo(info.module.identifier(), ""); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const namespaceObjectName = this.findNewName( | 
					
						
							|  |  |  | 						"namespaceObject", | 
					
						
							|  |  |  | 						allUsedNames, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 						namespaceObjectUsedNames, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						info.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					allUsedNames.add(namespaceObjectName); | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 					info.namespaceObjectName = namespaceObjectName; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					for (const variable of info.moduleScope.variables) { | 
					
						
							|  |  |  | 						const name = variable.name; | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 						const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo( | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 							info.module.identifier(), | 
					
						
							|  |  |  | 							name | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 						if (allUsedNames.has(name) || usedNames.has(name)) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							const references = getAllReferences(variable); | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 							for (const ref of references) { | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 								addScopeSymbols( | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 									ref.from, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 									usedNames, | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 									alreadyCheckedScopes, | 
					
						
							|  |  |  | 									ignoredScopes | 
					
						
							| 
									
										
										
										
											2018-03-29 20:43:01 +08:00
										 |  |  | 								); | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							const newName = this.findNewName( | 
					
						
							|  |  |  | 								name, | 
					
						
							|  |  |  | 								allUsedNames, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 								usedNames, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								info.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 							allUsedNames.add(newName); | 
					
						
							|  |  |  | 							info.internalNames.set(name, newName); | 
					
						
							|  |  |  | 							const source = info.source; | 
					
						
							|  |  |  | 							const allIdentifiers = new Set( | 
					
						
							|  |  |  | 								references.map(r => r.identifier).concat(variable.identifiers) | 
					
						
							|  |  |  | 							); | 
					
						
							|  |  |  | 							for (const identifier of allIdentifiers) { | 
					
						
							|  |  |  | 								const r = identifier.range; | 
					
						
							|  |  |  | 								const path = getPathInAst(info.ast, identifier); | 
					
						
							|  |  |  | 								if ( | 
					
						
							|  |  |  | 									path && | 
					
						
							|  |  |  | 									path.length > 1 && | 
					
						
							|  |  |  | 									path[1].type === "Property" && | 
					
						
							|  |  |  | 									path[1].shorthand | 
					
						
							|  |  |  | 								) { | 
					
						
							|  |  |  | 									source.insert(r[1], `: ${newName}`); | 
					
						
							|  |  |  | 								} else { | 
					
						
							|  |  |  | 									source.replace(r[0], r[1] - 1, newName); | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						} else { | 
					
						
							|  |  |  | 							allUsedNames.add(name); | 
					
						
							|  |  |  | 							info.internalNames.set(name, name); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				case "external": { | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 					const { usedNames } = getUsedNamesInScopeInfo( | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 						info.module.identifier(), | 
					
						
							|  |  |  | 						"external" | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const externalName = this.findNewName( | 
					
						
							|  |  |  | 						"", | 
					
						
							|  |  |  | 						allUsedNames, | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 						usedNames, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						info.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					allUsedNames.add(externalName); | 
					
						
							|  |  |  | 					info.name = externalName; | 
					
						
							|  |  |  | 					if ( | 
					
						
							| 
									
										
										
										
											2019-11-20 17:06:16 +08:00
										 |  |  | 						info.module.buildMeta.exportsType === "default" || | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 						info.module.buildMeta.exportsType === "flagged" || | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 						info.module.buildMeta.exportsType === "dynamic" || | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						!info.module.buildMeta.exportsType | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						const externalNameInterop = this.findNewName( | 
					
						
							|  |  |  | 							"namespaceObject", | 
					
						
							|  |  |  | 							allUsedNames, | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 							usedNames, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							info.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 						allUsedNames.add(externalNameInterop); | 
					
						
							|  |  |  | 						info.interopNamespaceObjectName = externalNameInterop; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 					if ( | 
					
						
							|  |  |  | 						info.module.buildMeta.exportsType === "dynamic" || | 
					
						
							|  |  |  | 						!info.module.buildMeta.exportsType | 
					
						
							|  |  |  | 					) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						const externalNameInterop = this.findNewName( | 
					
						
							|  |  |  | 							"default", | 
					
						
							|  |  |  | 							allUsedNames, | 
					
						
							| 
									
										
										
										
											2020-01-30 03:57:44 +08:00
										 |  |  | 							usedNames, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							info.module.readableIdentifier(requestShortener) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 						allUsedNames.add(externalNameInterop); | 
					
						
							|  |  |  | 						info.interopDefaultAccessName = externalNameInterop; | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 		// Find and replace referenced to modules
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							|  |  |  | 			if (info.type === "concatenated") { | 
					
						
							|  |  |  | 				for (const reference of info.globalScope.through) { | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					const name = reference.identifier.name; | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 					const match = matchModuleReference(name, modulesWithInfo); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (match) { | 
					
						
							|  |  |  | 						const finalName = getFinalName( | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 							moduleGraph, | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 							match.info, | 
					
						
							|  |  |  | 							match.ids, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 							runtime, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							requestShortener, | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 							runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 							match.call, | 
					
						
							|  |  |  | 							!match.directImport, | 
					
						
							|  |  |  | 							match.strict, | 
					
						
							|  |  |  | 							match.asiSafe | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						); | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 						const r = reference.identifier.range; | 
					
						
							|  |  |  | 						const source = info.source; | 
					
						
							|  |  |  | 						source.replace(r[0], r[1] - 1, finalName); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 		// Map with all root exposed used exports
 | 
					
						
							|  |  |  | 		/** @type {Map<string, function(RequestShortener): string>} */ | 
					
						
							|  |  |  | 		const exportsMap = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Set with all root exposed unused exports
 | 
					
						
							|  |  |  | 		/** @type {Set<string>} */ | 
					
						
							|  |  |  | 		const unusedExports = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		const rootInfo = /** @type {ConcatenatedModuleInfo} */ (moduleToInfoMap.get( | 
					
						
							|  |  |  | 			this.rootModule | 
					
						
							|  |  |  | 		)); | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 		for (const dep of this.rootModule.dependencies) { | 
					
						
							|  |  |  | 			if (dep instanceof HarmonyExportSpecifierDependency) { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				const used = /** @type {string | false } */ (moduleGraph | 
					
						
							|  |  |  | 					.getExportsInfo(this.rootModule) | 
					
						
							|  |  |  | 					.getUsedName(dep.name, runtime)); | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 				if (used) { | 
					
						
							|  |  |  | 					if (!exportsMap.has(used)) { | 
					
						
							|  |  |  | 						exportsMap.set( | 
					
						
							|  |  |  | 							used, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 							() => `/* binding */ ${rootInfo.internalNames.get(dep.id)}` | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					unusedExports.add(dep.name || "namespace"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else if (dep instanceof HarmonyExportExpressionDependency) { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				const used = /** @type {string | false } */ (moduleGraph | 
					
						
							|  |  |  | 					.getExportsInfo(this.rootModule) | 
					
						
							|  |  |  | 					.getUsedName("default", runtime)); | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 				if (used) { | 
					
						
							|  |  |  | 					if (!exportsMap.has(used)) { | 
					
						
							|  |  |  | 						exportsMap.set( | 
					
						
							|  |  |  | 							used, | 
					
						
							|  |  |  | 							() => | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 								`/* default */ ${rootInfo.internalNames.get( | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 									typeof dep.declarationId === "string" | 
					
						
							|  |  |  | 										? dep.declarationId | 
					
						
							|  |  |  | 										: "__WEBPACK_MODULE_DEFAULT_EXPORT__" | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 								)}`
 | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					unusedExports.add("default"); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else if (dep instanceof HarmonyExportImportedSpecifierDependency) { | 
					
						
							|  |  |  | 				const exportDefs = getHarmonyExportImportedSpecifierDependencyExports( | 
					
						
							|  |  |  | 					dep, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					moduleGraph, | 
					
						
							|  |  |  | 					runtime | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 				); | 
					
						
							|  |  |  | 				for (const def of exportDefs) { | 
					
						
							|  |  |  | 					const importedModule = moduleGraph.getModule(dep); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					const used = /** @type {string | false} */ (moduleGraph | 
					
						
							|  |  |  | 						.getExportsInfo(this.rootModule) | 
					
						
							|  |  |  | 						.getUsedName(def.name, runtime)); | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 					if (used) { | 
					
						
							|  |  |  | 						if (!exportsMap.has(used)) { | 
					
						
							| 
									
										
										
										
											2020-07-28 06:56:40 +08:00
										 |  |  | 							const info = moduleToInfoMap.get(importedModule); | 
					
						
							|  |  |  | 							if (!info) { | 
					
						
							|  |  |  | 								throw new Error( | 
					
						
							|  |  |  | 									`Imported module ${importedModule.identifier()} is not in moduleToInfoMap: ${Array.from( | 
					
						
							|  |  |  | 										moduleToInfoMap.keys(), | 
					
						
							|  |  |  | 										m => m.identifier() | 
					
						
							|  |  |  | 									).join(", ")}`
 | 
					
						
							|  |  |  | 								); | 
					
						
							|  |  |  | 							} | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 							exportsMap.set(used, requestShortener => { | 
					
						
							|  |  |  | 								const finalName = getFinalName( | 
					
						
							|  |  |  | 									moduleGraph, | 
					
						
							|  |  |  | 									info, | 
					
						
							|  |  |  | 									def.ids, | 
					
						
							|  |  |  | 									moduleToInfoMap, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 									runtime, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 									requestShortener, | 
					
						
							|  |  |  | 									runtimeTemplate, | 
					
						
							|  |  |  | 									false, | 
					
						
							|  |  |  | 									false, | 
					
						
							|  |  |  | 									this.rootModule.buildMeta.strictHarmonyModule, | 
					
						
							|  |  |  | 									true | 
					
						
							|  |  |  | 								); | 
					
						
							|  |  |  | 								return `/* reexport */ ${finalName}`; | 
					
						
							|  |  |  | 							}); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						unusedExports.add(def.name); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		const result = new ConcatSource(); | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// add harmony compatibility flag (must be first because of possible circular dependencies)
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		if ( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			moduleGraph.getExportsInfo(this).otherExportsInfo.getUsed(runtime) !== | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			UsageState.Unused | 
					
						
							|  |  |  | 		) { | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 			result.add(`// ESM COMPAT FLAG\n`); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			result.add( | 
					
						
							|  |  |  | 				runtimeTemplate.defineEsModuleFlagStatement({ | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 					exportsArgument: this.exportsArgument, | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 					runtimeRequirements | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				}) | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 		// define exports
 | 
					
						
							|  |  |  | 		if (exportsMap.size > 0) { | 
					
						
							|  |  |  | 			runtimeRequirements.add(RuntimeGlobals.exports); | 
					
						
							|  |  |  | 			runtimeRequirements.add(RuntimeGlobals.definePropertyGetters); | 
					
						
							|  |  |  | 			const definitions = []; | 
					
						
							|  |  |  | 			for (const [key, value] of exportsMap) { | 
					
						
							|  |  |  | 				definitions.push( | 
					
						
							|  |  |  | 					`\n  ${JSON.stringify(key)}: ${runtimeTemplate.returningFunction( | 
					
						
							|  |  |  | 						value(requestShortener) | 
					
						
							|  |  |  | 					)}`
 | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			result.add(`\n// EXPORTS\n`); | 
					
						
							|  |  |  | 			result.add( | 
					
						
							|  |  |  | 				`${RuntimeGlobals.definePropertyGetters}(${ | 
					
						
							|  |  |  | 					this.exportsArgument | 
					
						
							|  |  |  | 				}, {${definitions.join(",")}\n});\n`
 | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// list unused exports
 | 
					
						
							|  |  |  | 		if (unusedExports.size > 0) { | 
					
						
							|  |  |  | 			result.add( | 
					
						
							|  |  |  | 				`\n// UNUSED EXPORTS: ${joinIterableWithComma(unusedExports)}\n` | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 		// define required namespace objects (must be before evaluation modules)
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			if (info.type === "concatenated" && info.namespaceObjectSource) { | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 				result.add( | 
					
						
							|  |  |  | 					`\n// NAMESPACE OBJECT: ${info.module.readableIdentifier( | 
					
						
							|  |  |  | 						requestShortener | 
					
						
							|  |  |  | 					)}\n`
 | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 				result.add(info.namespaceObjectSource); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 				runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject); | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.definePropertyGetters); | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-07 20:12:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// evaluate modules in order
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const info of modulesWithInfo) { | 
					
						
							|  |  |  | 			switch (info.type) { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 				case "concatenated": { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					result.add( | 
					
						
							|  |  |  | 						`\n// CONCATENATED MODULE: ${info.module.readableIdentifier( | 
					
						
							|  |  |  | 							requestShortener | 
					
						
							|  |  |  | 						)}\n`
 | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					result.add(info.source); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 					if (info.runtimeRequirements) { | 
					
						
							|  |  |  | 						for (const r of info.runtimeRequirements) { | 
					
						
							|  |  |  | 							runtimeRequirements.add(r); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				case "external": | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					result.add( | 
					
						
							|  |  |  | 						`\n// EXTERNAL MODULE: ${info.module.readableIdentifier( | 
					
						
							|  |  |  | 							requestShortener | 
					
						
							|  |  |  | 						)}\n`
 | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 					runtimeRequirements.add(RuntimeGlobals.require); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					result.add( | 
					
						
							|  |  |  | 						`var ${info.name} = __webpack_require__(${JSON.stringify( | 
					
						
							| 
									
										
										
										
											2018-08-28 17:56:48 +08:00
										 |  |  | 							chunkGraph.getModuleId(info.module) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						)});\n`
 | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					if (info.interopNamespaceObjectUsed) { | 
					
						
							| 
									
										
										
										
											2019-11-20 17:06:16 +08:00
										 |  |  | 						if (info.module.buildMeta.exportsType === "default") { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 							runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							result.add( | 
					
						
							| 
									
										
										
										
											2019-06-13 16:51:12 +08:00
										 |  |  | 								`var ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${info.name}, 2);\n` | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 						} else if ( | 
					
						
							|  |  |  | 							info.module.buildMeta.exportsType === "flagged" || | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 							info.module.buildMeta.exportsType === "dynamic" || | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 							!info.module.buildMeta.exportsType | 
					
						
							|  |  |  | 						) { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 							runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							result.add( | 
					
						
							| 
									
										
										
										
											2019-06-13 16:51:12 +08:00
										 |  |  | 								`var ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${info.name});\n` | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-01-06 04:35:36 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (info.interopDefaultAccessUsed) { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 						runtimeRequirements.add(RuntimeGlobals.compatGetDefaultExport); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						result.add( | 
					
						
							| 
									
										
										
										
											2019-06-13 16:51:12 +08:00
										 |  |  | 							`var ${info.interopDefaultAccessName} = /*#__PURE__*/${RuntimeGlobals.compatGetDefaultExport}(${info.name});\n` | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						); | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				default: | 
					
						
							| 
									
										
										
										
											2020-03-30 23:56:37 +08:00
										 |  |  | 					// @ts-expect-error never is expected here
 | 
					
						
							| 
									
										
										
										
											2017-08-07 19:19:24 +08:00
										 |  |  | 					throw new Error(`Unsupported concatenation entry type ${info.type}`); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 		/** @type {CodeGenerationResult} */ | 
					
						
							|  |  |  | 		const resultEntry = { | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 			sources: new Map([["javascript", new CachedSource(result)]]), | 
					
						
							|  |  |  | 			runtimeRequirements | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return resultEntry; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ModuleInfo} info info | 
					
						
							|  |  |  | 	 * @param {DependencyTemplates} innerDependencyTemplates innerDependencyTemplates | 
					
						
							|  |  |  | 	 * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate | 
					
						
							|  |  |  | 	 * @param {ModuleGraph} moduleGraph moduleGraph | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} chunkGraph chunkGraph | 
					
						
							|  |  |  | 	 * @param {RuntimeSpec} runtime runtime | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	_analyseModule( | 
					
						
							|  |  |  | 		info, | 
					
						
							|  |  |  | 		innerDependencyTemplates, | 
					
						
							|  |  |  | 		runtimeTemplate, | 
					
						
							|  |  |  | 		moduleGraph, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		runtime | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	) { | 
					
						
							|  |  |  | 		if (info.type === "concatenated") { | 
					
						
							|  |  |  | 			const m = info.module; | 
					
						
							|  |  |  | 			try { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				// TODO cache codeGeneration results
 | 
					
						
							|  |  |  | 				const codeGenResult = m.codeGeneration({ | 
					
						
							|  |  |  | 					dependencyTemplates: innerDependencyTemplates, | 
					
						
							|  |  |  | 					runtimeTemplate, | 
					
						
							|  |  |  | 					moduleGraph, | 
					
						
							|  |  |  | 					chunkGraph, | 
					
						
							|  |  |  | 					runtime | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				const source = codeGenResult.sources.get("javascript"); | 
					
						
							|  |  |  | 				const code = source.source().toString(); | 
					
						
							|  |  |  | 				let ast; | 
					
						
							|  |  |  | 				try { | 
					
						
							|  |  |  | 					ast = JavascriptParser.parse(code, { | 
					
						
							|  |  |  | 						sourceType: "module" | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} catch (err) { | 
					
						
							|  |  |  | 					if ( | 
					
						
							|  |  |  | 						err.loc && | 
					
						
							|  |  |  | 						typeof err.loc === "object" && | 
					
						
							|  |  |  | 						typeof err.loc.line === "number" | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						const lineNumber = err.loc.line; | 
					
						
							|  |  |  | 						const lines = code.split("\n"); | 
					
						
							|  |  |  | 						err.message += | 
					
						
							|  |  |  | 							"\n| " + | 
					
						
							|  |  |  | 							lines | 
					
						
							|  |  |  | 								.slice(Math.max(0, lineNumber - 3), lineNumber + 2) | 
					
						
							|  |  |  | 								.join("\n| "); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					throw err; | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				const scopeManager = eslintScope.analyze(ast, { | 
					
						
							|  |  |  | 					ecmaVersion: 6, | 
					
						
							|  |  |  | 					sourceType: "module", | 
					
						
							|  |  |  | 					optimistic: true, | 
					
						
							|  |  |  | 					ignoreEval: true, | 
					
						
							|  |  |  | 					impliedStrict: true | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				const globalScope = scopeManager.acquire(ast); | 
					
						
							|  |  |  | 				const moduleScope = globalScope.childScopes[0]; | 
					
						
							|  |  |  | 				const resultSource = new ReplaceSource(source); | 
					
						
							|  |  |  | 				info.runtimeRequirements = codeGenResult.runtimeRequirements; | 
					
						
							|  |  |  | 				info.ast = ast; | 
					
						
							|  |  |  | 				info.internalSource = source; | 
					
						
							|  |  |  | 				info.source = resultSource; | 
					
						
							|  |  |  | 				info.globalScope = globalScope; | 
					
						
							|  |  |  | 				info.moduleScope = moduleScope; | 
					
						
							|  |  |  | 			} catch (err) { | 
					
						
							|  |  |  | 				err.message += `\nwhile analysing module ${m.identifier()} for concatenation`; | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 				throw err; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} chunkGraph the chunk graph | 
					
						
							|  |  |  | 	 * @param {DependencyTemplates} dependencyTemplates dependency templates | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	 * @param {RuntimeSpec} runtime the runtime | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	 * @returns {string} hash | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	_getHashDigest(chunkGraph, dependencyTemplates, runtime) { | 
					
						
							|  |  |  | 		const hash = chunkGraph.getModuleHash(this, runtime); | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 		const dtHash = dependencyTemplates.getHash(); | 
					
						
							|  |  |  | 		return `${hash}-${dtHash}`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	 * @param {RuntimeSpec} runtime the runtime | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	 * @returns {ModuleInfo[]} module info items | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	_getModulesWithInfo(moduleGraph, runtime) { | 
					
						
							|  |  |  | 		/** @type {ModuleInfo[]} */ | 
					
						
							|  |  |  | 		const results = []; | 
					
						
							|  |  |  | 		let idx = 0; | 
					
						
							|  |  |  | 		const orderedConcatenationList = this._createConcatenationList( | 
					
						
							|  |  |  | 			this.rootModule, | 
					
						
							|  |  |  | 			this._modules, | 
					
						
							|  |  |  | 			undefined, | 
					
						
							|  |  |  | 			moduleGraph | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		for (const info of orderedConcatenationList) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			switch (info.type) { | 
					
						
							|  |  |  | 				case "concatenated": { | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 					/** @type {Map<string, string>} */ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 					const exportMap = new Map(); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					/** @type {Map<string, ReexportInfo>} */ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 					const reexportMap = new Map(); | 
					
						
							|  |  |  | 					for (const dep of info.module.dependencies) { | 
					
						
							|  |  |  | 						if (dep instanceof HarmonyExportSpecifierDependency) { | 
					
						
							|  |  |  | 							if (!exportMap.has(dep.name)) { | 
					
						
							|  |  |  | 								exportMap.set(dep.name, dep.id); | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} else if (dep instanceof HarmonyExportExpressionDependency) { | 
					
						
							|  |  |  | 							if (!exportMap.has("default")) { | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 								exportMap.set( | 
					
						
							|  |  |  | 									"default", | 
					
						
							|  |  |  | 									typeof dep.declarationId === "string" | 
					
						
							|  |  |  | 										? dep.declarationId | 
					
						
							|  |  |  | 										: "__WEBPACK_MODULE_DEFAULT_EXPORT__" | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 						} else if ( | 
					
						
							|  |  |  | 							dep instanceof HarmonyExportImportedSpecifierDependency | 
					
						
							|  |  |  | 						) { | 
					
						
							|  |  |  | 							const exportName = dep.name; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 							const importNames = dep.getIds(moduleGraph); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 							const importedModule = moduleGraph.getModule(dep); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 							if (exportName) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 								if (!reexportMap.has(exportName)) { | 
					
						
							|  |  |  | 									reexportMap.set(exportName, { | 
					
						
							|  |  |  | 										module: importedModule, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 										exportName: importNames, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 										dependency: dep | 
					
						
							|  |  |  | 									}); | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2018-12-30 16:03:42 +08:00
										 |  |  | 							} else if (importedModule) { | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | 								const { exports: providedExports } = dep.getStarReexports( | 
					
						
							|  |  |  | 									moduleGraph, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 									runtime, | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | 									undefined, | 
					
						
							| 
									
										
										
										
											2018-12-30 16:03:42 +08:00
										 |  |  | 									importedModule | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2020-05-19 20:25:07 +08:00
										 |  |  | 								if (providedExports) { | 
					
						
							| 
									
										
										
										
											2018-12-30 16:03:42 +08:00
										 |  |  | 									for (const name of providedExports) { | 
					
						
							|  |  |  | 										if (!reexportMap.has(name)) { | 
					
						
							|  |  |  | 											reexportMap.set(name, { | 
					
						
							|  |  |  | 												module: importedModule, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 												exportName: [name], | 
					
						
							| 
									
										
										
										
											2018-12-30 16:03:42 +08:00
										 |  |  | 												dependency: dep | 
					
						
							|  |  |  | 											}); | 
					
						
							|  |  |  | 										} | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 									} | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					results.push({ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						type: "concatenated", | 
					
						
							|  |  |  | 						module: info.module, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 						index: idx++, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						ast: undefined, | 
					
						
							|  |  |  | 						internalSource: undefined, | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 						runtimeRequirements: undefined, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						source: undefined, | 
					
						
							|  |  |  | 						globalScope: undefined, | 
					
						
							|  |  |  | 						moduleScope: undefined, | 
					
						
							|  |  |  | 						internalNames: new Map(), | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 						exportMap, | 
					
						
							|  |  |  | 						reexportMap, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						hasNamespaceObject: false, | 
					
						
							| 
									
										
										
										
											2019-12-24 04:54:57 +08:00
										 |  |  | 						namespaceObjectName: undefined, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						namespaceObjectSource: null | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				case "external": | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					results.push({ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						type: "external", | 
					
						
							|  |  |  | 						module: info.module, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 						index: idx++, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 						name: undefined, | 
					
						
							|  |  |  | 						interopNamespaceObjectUsed: false, | 
					
						
							|  |  |  | 						interopNamespaceObjectName: undefined, | 
					
						
							|  |  |  | 						interopDefaultAccessUsed: false, | 
					
						
							|  |  |  | 						interopDefaultAccessName: undefined | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				default: | 
					
						
							|  |  |  | 					throw new Error(`Unsupported concatenation entry type ${info.type}`); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return results; | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {DependencyTemplates} dependencyTemplates outer dependency templates | 
					
						
							|  |  |  | 	 * @param {Map<Module, ModuleInfo>} moduleToInfoMap map for module info | 
					
						
							|  |  |  | 	 * @returns {DependencyTemplates} inner dependency templates | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 	_getInnerDependencyTemplates(dependencyTemplates, moduleToInfoMap) { | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		const innerDependencyTemplates = dependencyTemplates.clone(); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyImportSpecifierDependency, | 
					
						
							|  |  |  | 			new HarmonyImportSpecifierDependencyConcatenatedTemplate( | 
					
						
							|  |  |  | 				dependencyTemplates.get(HarmonyImportSpecifierDependency), | 
					
						
							|  |  |  | 				moduleToInfoMap | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyImportSideEffectDependency, | 
					
						
							|  |  |  | 			new HarmonyImportSideEffectDependencyConcatenatedTemplate( | 
					
						
							|  |  |  | 				dependencyTemplates.get(HarmonyImportSideEffectDependency), | 
					
						
							|  |  |  | 				moduleToInfoMap | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyExportSpecifierDependency, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 			new NullTemplate() | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyExportExpressionDependency, | 
					
						
							|  |  |  | 			new HarmonyExportExpressionDependencyConcatenatedTemplate( | 
					
						
							|  |  |  | 				dependencyTemplates.get(HarmonyExportExpressionDependency), | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 				this.rootModule, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 				moduleToInfoMap | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyExportImportedSpecifierDependency, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 			new NullTemplate() | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		innerDependencyTemplates.set( | 
					
						
							|  |  |  | 			HarmonyCompatibilityDependency, | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | 			new NullTemplate() | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		// Must use full identifier in our cache here to ensure that the source
 | 
					
						
							|  |  |  | 		// is updated should our dependencies list change.
 | 
					
						
							|  |  |  | 		// TODO webpack 5 refactor
 | 
					
						
							|  |  |  | 		innerDependencyTemplates.updateHash(this.identifier()); | 
					
						
							|  |  |  | 		return innerDependencyTemplates; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-31 22:46:25 +08:00
										 |  |  | 	findNewName(oldName, usedNamed1, usedNamed2, extraInfo) { | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		let name = oldName; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (name === "__WEBPACK_MODULE_DEFAULT_EXPORT__") name = ""; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-07 18:57:15 +08:00
										 |  |  | 		// Remove uncool stuff
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		extraInfo = extraInfo.replace( | 
					
						
							|  |  |  | 			/\.+\/|(\/index)?\.([a-zA-Z0-9]{1,4})($|\s|\?)|\s*\+\s*\d+\s*modules/g, | 
					
						
							|  |  |  | 			"" | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-06-07 18:57:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		const splittedInfo = extraInfo.split("/"); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		while (splittedInfo.length) { | 
					
						
							| 
									
										
										
										
											2017-08-07 20:38:54 +08:00
										 |  |  | 			name = splittedInfo.pop() + (name ? "_" + name : ""); | 
					
						
							| 
									
										
										
										
											2017-05-31 22:46:25 +08:00
										 |  |  | 			const nameIdent = Template.toIdentifier(name); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if ( | 
					
						
							|  |  |  | 				!usedNamed1.has(nameIdent) && | 
					
						
							|  |  |  | 				(!usedNamed2 || !usedNamed2.has(nameIdent)) | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 				return nameIdent; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 22:15:49 +08:00
										 |  |  | 		let i = 0; | 
					
						
							|  |  |  | 		let nameWithNumber = Template.toIdentifier(`${name}_${i}`); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		while ( | 
					
						
							|  |  |  | 			usedNamed1.has(nameWithNumber) || | 
					
						
							|  |  |  | 			(usedNamed2 && usedNamed2.has(nameWithNumber)) | 
					
						
							|  |  |  | 		) { | 
					
						
							| 
									
										
										
										
											2017-08-07 21:43:17 +08:00
										 |  |  | 			i++; | 
					
						
							|  |  |  | 			nameWithNumber = Template.toIdentifier(`${name}_${i}`); | 
					
						
							| 
									
										
										
										
											2017-08-07 22:15:49 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-08-07 21:43:17 +08:00
										 |  |  | 		return nameWithNumber; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Hash} hash the hash used to track dependencies | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	 * @param {UpdateHashContext} context context | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	updateHash(hash, context) { | 
					
						
							|  |  |  | 		const { chunkGraph, runtime } = context; | 
					
						
							|  |  |  | 		for (const info of this._createConcatenationList( | 
					
						
							|  |  |  | 			this.rootModule, | 
					
						
							|  |  |  | 			this._modules, | 
					
						
							|  |  |  | 			runtime, | 
					
						
							|  |  |  | 			chunkGraph.moduleGraph | 
					
						
							|  |  |  | 		)) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			switch (info.type) { | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 				case "concatenated": | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 					info.module.updateHash(hash, context); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				case "external": | 
					
						
							| 
									
										
										
										
											2018-08-28 17:56:48 +08:00
										 |  |  | 					hash.update(`${chunkGraph.getModuleId(info.module)}`); | 
					
						
							| 
									
										
										
										
											2017-08-07 17:53:07 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-07-07 17:48:52 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		super.updateHash(hash, context); | 
					
						
							| 
									
										
										
										
											2017-07-07 17:48:52 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	static deserialize(context) { | 
					
						
							| 
									
										
										
										
											2019-12-17 01:44:33 +08:00
										 |  |  | 		const obj = new ConcatenatedModule({ | 
					
						
							|  |  |  | 			identifier: undefined, | 
					
						
							|  |  |  | 			rootModule: undefined, | 
					
						
							|  |  |  | 			modules: undefined | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | 		obj.deserialize(context); | 
					
						
							|  |  |  | 		return obj; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-11 05:58:26 +08:00
										 |  |  | makeSerializable(ConcatenatedModule, "webpack/lib/optimize/ConcatenatedModule"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | class HarmonyImportSpecifierDependencyConcatenatedTemplate extends DependencyTemplate { | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	constructor(originalTemplate, modulesMap) { | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 		super(); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		this.originalTemplate = originalTemplate; | 
					
						
							|  |  |  | 		this.modulesMap = modulesMap; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Dependency} dependency the dependency for which the template should be applied | 
					
						
							|  |  |  | 	 * @param {ReplaceSource} source the current replace source which can be modified | 
					
						
							| 
									
										
										
										
											2018-07-18 01:38:42 +08:00
										 |  |  | 	 * @param {DependencyTemplateContext} templateContext the context object | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 	apply(dependency, source, templateContext) { | 
					
						
							| 
									
										
										
										
											2018-08-07 20:20:53 +08:00
										 |  |  | 		const { moduleGraph, module: parentModule } = templateContext; | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 		const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency); | 
					
						
							| 
									
										
										
										
											2018-07-24 21:30:37 +08:00
										 |  |  | 		const module = moduleGraph.getModule(dep); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		const info = this.modulesMap.get(module); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!info) { | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 			this.originalTemplate.apply(dependency, source, templateContext); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		let content; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		const ids = dep.getIds(moduleGraph); | 
					
						
							|  |  |  | 		if (ids.length === 0) { | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 			content = createModuleReference({ | 
					
						
							|  |  |  | 				info, | 
					
						
							|  |  |  | 				strict: parentModule.buildMeta.strictHarmonyModule, | 
					
						
							|  |  |  | 				asiSafe: dep.asiSafe | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		} else if (dep.namespaceObjectAsContext && ids.length === 1) { | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 			content = | 
					
						
							|  |  |  | 				createModuleReference({ | 
					
						
							|  |  |  | 					info, | 
					
						
							|  |  |  | 					strict: parentModule.buildMeta.strictHarmonyModule, | 
					
						
							|  |  |  | 					asiSafe: dep.asiSafe | 
					
						
							|  |  |  | 				}) + propertyAccess(ids); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2019-08-23 14:46:42 +08:00
										 |  |  | 			content = createModuleReference({ | 
					
						
							|  |  |  | 				info, | 
					
						
							|  |  |  | 				ids, | 
					
						
							|  |  |  | 				call: dep.call, | 
					
						
							|  |  |  | 				directImport: dep.directImport, | 
					
						
							|  |  |  | 				strict: parentModule.buildMeta.strictHarmonyModule, | 
					
						
							|  |  |  | 				asiSafe: dep.asiSafe | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (dep.shorthand) { | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 			source.insert(dep.range[1], ": " + content); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			source.replace(dep.range[0], dep.range[1] - 1, content); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | class HarmonyImportSideEffectDependencyConcatenatedTemplate extends DependencyTemplate { | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	constructor(originalTemplate, modulesMap) { | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 		super(); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		this.originalTemplate = originalTemplate; | 
					
						
							|  |  |  | 		this.modulesMap = modulesMap; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Dependency} dependency the dependency for which the template should be applied | 
					
						
							|  |  |  | 	 * @param {ReplaceSource} source the current replace source which can be modified | 
					
						
							| 
									
										
										
										
											2018-07-18 01:38:42 +08:00
										 |  |  | 	 * @param {DependencyTemplateContext} templateContext the context object | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 	apply(dependency, source, templateContext) { | 
					
						
							|  |  |  | 		const { moduleGraph } = templateContext; | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 		const dep = /** @type {HarmonyImportSideEffectDependency} */ (dependency); | 
					
						
							| 
									
										
										
										
											2018-07-24 21:30:37 +08:00
										 |  |  | 		const module = moduleGraph.getModule(dep); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		const info = this.modulesMap.get(module); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!info) { | 
					
						
							| 
									
										
										
										
											2018-07-24 23:35:36 +08:00
										 |  |  | 			this.originalTemplate.apply(dependency, source, templateContext); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | class HarmonyExportExpressionDependencyConcatenatedTemplate extends DependencyTemplate { | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 	constructor( | 
					
						
							|  |  |  | 		originalTemplate, | 
					
						
							|  |  |  | 		rootModule, | 
					
						
							|  |  |  | 		modulesMap, | 
					
						
							|  |  |  | 		exportsMap, | 
					
						
							|  |  |  | 		unusedExports | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2018-07-25 19:16:08 +08:00
										 |  |  | 		super(); | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 		this.originalTemplate = originalTemplate; | 
					
						
							|  |  |  | 		this.rootModule = rootModule; | 
					
						
							| 
									
										
										
										
											2020-02-21 19:08:15 +08:00
										 |  |  | 		this.modulesMap = modulesMap; | 
					
						
							|  |  |  | 		this.exportsMap = exportsMap; | 
					
						
							|  |  |  | 		this.unusedExports = unusedExports; | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 17:46:44 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Dependency} dependency the dependency for which the template should be applied | 
					
						
							| 
									
										
										
										
											2018-11-16 23:40:03 +08:00
										 |  |  | 	 * @param {ReplaceSource} source the current replace source which can be modified | 
					
						
							|  |  |  | 	 * @param {DependencyTemplateContext} templateContext the context object | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-08-09 17:46:44 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	apply( | 
					
						
							|  |  |  | 		dependency, | 
					
						
							|  |  |  | 		source, | 
					
						
							|  |  |  | 		{ module, moduleGraph, runtimeTemplate, initFragments } | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2018-11-16 23:40:03 +08:00
										 |  |  | 		const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency); | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 		const { declarationId } = dep; | 
					
						
							| 
									
										
										
										
											2018-11-16 23:40:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 		if (declarationId) { | 
					
						
							|  |  |  | 			let name; | 
					
						
							|  |  |  | 			if (typeof declarationId === "string") { | 
					
						
							|  |  |  | 				name = declarationId; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				name = "__WEBPACK_MODULE_DEFAULT_EXPORT__"; | 
					
						
							|  |  |  | 				source.replace( | 
					
						
							|  |  |  | 					declarationId.range[0], | 
					
						
							|  |  |  | 					declarationId.range[1] - 1, | 
					
						
							|  |  |  | 					`${declarationId.prefix}${name}${declarationId.suffix}` | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 03:52:03 +08:00
										 |  |  | 			source.replace( | 
					
						
							|  |  |  | 				dep.rangeStatement[0], | 
					
						
							|  |  |  | 				dep.range[0] - 1, | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 				`/* harmony default export */ ${dep.prefix}` | 
					
						
							| 
									
										
										
										
											2018-09-26 03:52:03 +08:00
										 |  |  | 			); | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			const content = `/* harmony default export */ ${ | 
					
						
							|  |  |  | 				runtimeTemplate.supportsConst() ? "const" : "var" | 
					
						
							|  |  |  | 			} __WEBPACK_MODULE_DEFAULT_EXPORT__ = `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (dep.range) { | 
					
						
							|  |  |  | 				source.replace( | 
					
						
							|  |  |  | 					dep.rangeStatement[0], | 
					
						
							|  |  |  | 					dep.range[0] - 1, | 
					
						
							|  |  |  | 					content + "(" + dep.prefix | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");"); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-07-22 05:32:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 			source.replace( | 
					
						
							|  |  |  | 				dep.rangeStatement[0], | 
					
						
							|  |  |  | 				dep.rangeStatement[1] - 1, | 
					
						
							|  |  |  | 				content + dep.prefix | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-22 03:57:48 +08:00
										 |  |  | class NullTemplate { | 
					
						
							|  |  |  | 	apply() {} | 
					
						
							| 
									
										
										
										
											2017-05-10 19:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ConcatenatedModule; |