| 
									
										
										
										
											2015-01-13 00:45:30 +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-01-03 05:30:08 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-06 18:51:14 +08:00
										 |  |  | const HotModuleReplacementPlugin = require("../HotModuleReplacementPlugin"); | 
					
						
							| 
									
										
										
										
											2024-10-31 22:43:31 +08:00
										 |  |  | const { getImportAttributes } = require("../javascript/JavascriptParser"); | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | const InnerGraph = require("../optimize/InnerGraph"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const ConstDependency = require("./ConstDependency"); | 
					
						
							|  |  |  | const HarmonyAcceptDependency = require("./HarmonyAcceptDependency"); | 
					
						
							|  |  |  | const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency"); | 
					
						
							| 
									
										
										
										
											2022-03-04 16:38:39 +08:00
										 |  |  | const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2019-12-06 17:19:41 +08:00
										 |  |  | const HarmonyExports = require("./HarmonyExports"); | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | const { ExportPresenceModes } = require("./HarmonyImportDependency"); | 
					
						
							| 
									
										
										
										
											2017-08-08 15:32:43 +08:00
										 |  |  | const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency"); | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | /** @typedef {import("estree").Identifier} Identifier */ | 
					
						
							| 
									
										
										
										
											2024-03-15 22:24:33 +08:00
										 |  |  | /** @typedef {import("estree").Literal} Literal */ | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | /** @typedef {import("estree").MemberExpression} MemberExpression */ | 
					
						
							| 
									
										
										
										
											2024-03-15 22:24:33 +08:00
										 |  |  | /** @typedef {import("estree").ObjectExpression} ObjectExpression */ | 
					
						
							|  |  |  | /** @typedef {import("estree").Property} Property */ | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */ | 
					
						
							|  |  |  | /** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */ | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */ | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:28 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */ | 
					
						
							| 
									
										
										
										
											2024-11-01 00:31:45 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").ExportAllDeclaration} ExportAllDeclaration */ | 
					
						
							|  |  |  | /** @typedef {import("../javascript/JavascriptParser").ExportNamedDeclaration} ExportNamedDeclaration */ | 
					
						
							| 
									
										
										
										
											2024-06-11 00:21:03 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */ | 
					
						
							| 
									
										
										
										
											2024-11-01 00:31:45 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").ImportDeclaration} ImportDeclaration */ | 
					
						
							|  |  |  | /** @typedef {import("../javascript/JavascriptParser").ImportExpression} ImportExpression */ | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").Range} Range */ | 
					
						
							| 
									
										
										
										
											2020-01-21 22:25:40 +08:00
										 |  |  | /** @typedef {import("../optimize/InnerGraph").InnerGraph} InnerGraph */ | 
					
						
							|  |  |  | /** @typedef {import("../optimize/InnerGraph").TopLevelSymbol} TopLevelSymbol */ | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | /** @typedef {import("./HarmonyImportDependency")} HarmonyImportDependency */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | const harmonySpecifierTag = Symbol("harmony import"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} HarmonySettings | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  |  * @property {string[]} ids | 
					
						
							|  |  |  |  * @property {string} source | 
					
						
							|  |  |  |  * @property {number} sourceOrder | 
					
						
							|  |  |  |  * @property {string} name | 
					
						
							|  |  |  |  * @property {boolean} await | 
					
						
							| 
									
										
										
										
											2021-07-17 04:16:06 +08:00
										 |  |  |  * @property {Record<string, any> | undefined} assertions | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | module.exports = class HarmonyImportDependencyParserPlugin { | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {JavascriptParserOptions} options options | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-06-05 19:25:15 +08:00
										 |  |  | 	constructor(options) { | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | 		this.exportPresenceMode = | 
					
						
							| 
									
										
										
										
											2021-11-06 08:01:21 +08:00
										 |  |  | 			options.importExportsPresence !== undefined | 
					
						
							|  |  |  | 				? ExportPresenceModes.fromUserOption(options.importExportsPresence) | 
					
						
							|  |  |  | 				: options.exportsPresence !== undefined | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 					? ExportPresenceModes.fromUserOption(options.exportsPresence) | 
					
						
							|  |  |  | 					: options.strictExportPresence | 
					
						
							|  |  |  | 						? ExportPresenceModes.ERROR | 
					
						
							|  |  |  | 						: ExportPresenceModes.AUTO; | 
					
						
							| 
									
										
										
										
											2021-01-20 22:08:58 +08:00
										 |  |  | 		this.strictThisContextOnImports = options.strictThisContextOnImports; | 
					
						
							| 
									
										
										
										
											2017-02-23 05:31:46 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {JavascriptParser} parser the parser | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 	apply(parser) { | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | 		const { exportPresenceMode } = this; | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {string[]} members members | 
					
						
							|  |  |  | 		 * @param {boolean[]} membersOptionals members Optionals | 
					
						
							|  |  |  | 		 * @returns {string[]} a non optional part | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2022-03-01 03:50:37 +08:00
										 |  |  | 		function getNonOptionalPart(members, membersOptionals) { | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 			let i = 0; | 
					
						
							| 
									
										
										
										
											2022-03-01 03:50:37 +08:00
										 |  |  | 			while (i < members.length && membersOptionals[i] === false) i++; | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 			return i !== members.length ? members.slice(0, i) : members; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {TODO} node member expression | 
					
						
							|  |  |  | 		 * @param {number} count count | 
					
						
							|  |  |  | 		 * @returns {TODO} member expression | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 		function getNonOptionalMemberChain(node, count) { | 
					
						
							|  |  |  | 			while (count--) node = node.object; | 
					
						
							|  |  |  | 			return node; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | 		parser.hooks.isPure | 
					
						
							|  |  |  | 			.for("Identifier") | 
					
						
							|  |  |  | 			.tap("HarmonyImportDependencyParserPlugin", expression => { | 
					
						
							|  |  |  | 				const expr = /** @type {Identifier} */ (expression); | 
					
						
							|  |  |  | 				if ( | 
					
						
							|  |  |  | 					parser.isVariableDefined(expr.name) || | 
					
						
							|  |  |  | 					parser.getTagData(expr.name, harmonySpecifierTag) | 
					
						
							|  |  |  | 				) { | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		parser.hooks.import.tap( | 
					
						
							|  |  |  | 			"HarmonyImportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, source) => { | 
					
						
							|  |  |  | 				parser.state.lastHarmonyImportOrder = | 
					
						
							|  |  |  | 					(parser.state.lastHarmonyImportOrder || 0) + 1; | 
					
						
							| 
									
										
										
										
											2020-11-02 21:15:12 +08:00
										 |  |  | 				const clearDep = new ConstDependency( | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					parser.isAsiPosition(/** @type {Range} */ (statement.range)[0]) | 
					
						
							|  |  |  | 						? ";" | 
					
						
							|  |  |  | 						: "", | 
					
						
							|  |  |  | 					/** @type {Range} */ (statement.range) | 
					
						
							| 
									
										
										
										
											2020-11-02 21:15:12 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 				clearDep.loc = /** @type {DependencyLocation} */ (statement.loc); | 
					
						
							| 
									
										
										
										
											2019-10-30 13:40:40 +08:00
										 |  |  | 				parser.state.module.addPresentationalDependency(clearDep); | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 				parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]); | 
					
						
							| 
									
										
										
										
											2024-10-31 22:43:31 +08:00
										 |  |  | 				const attributes = getImportAttributes(statement); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const sideEffectDep = new HarmonyImportSideEffectDependency( | 
					
						
							| 
									
										
										
										
											2024-03-15 23:11:02 +08:00
										 |  |  | 					/** @type {string} */ (source), | 
					
						
							| 
									
										
										
										
											2021-07-17 04:16:06 +08:00
										 |  |  | 					parser.state.lastHarmonyImportOrder, | 
					
						
							| 
									
										
										
										
											2024-03-15 23:11:02 +08:00
										 |  |  | 					attributes | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 				sideEffectDep.loc = /** @type {DependencyLocation} */ (statement.loc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				parser.state.module.addDependency(sideEffectDep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		parser.hooks.importSpecifier.tap( | 
					
						
							|  |  |  | 			"HarmonyImportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, source, id, name) => { | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				const ids = id === null ? [] : [id]; | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 				parser.tagVariable(name, harmonySpecifierTag, { | 
					
						
							|  |  |  | 					name, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					source, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					ids, | 
					
						
							| 
									
										
										
										
											2021-07-17 04:16:06 +08:00
										 |  |  | 					sourceOrder: parser.state.lastHarmonyImportOrder, | 
					
						
							| 
									
										
										
										
											2024-10-31 22:43:31 +08:00
										 |  |  | 					assertions: getImportAttributes(statement) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 		parser.hooks.binaryExpression.tap( | 
					
						
							|  |  |  | 			"HarmonyImportDependencyParserPlugin", | 
					
						
							|  |  |  | 			expression => { | 
					
						
							|  |  |  | 				if (expression.operator !== "in") return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-08 17:07:04 +08:00
										 |  |  | 				const leftPartEvaluated = parser.evaluateExpression(expression.left); | 
					
						
							|  |  |  | 				if (leftPartEvaluated.couldHaveSideEffects()) return; | 
					
						
							|  |  |  | 				const leftPart = leftPartEvaluated.asString(); | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 				if (!leftPart) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				const rightPart = parser.evaluateExpression(expression.right); | 
					
						
							|  |  |  | 				if (!rightPart.isIdentifier()) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				const rootInfo = rightPart.rootInfo; | 
					
						
							|  |  |  | 				if ( | 
					
						
							| 
									
										
										
										
											2023-04-29 03:21:02 +08:00
										 |  |  | 					typeof rootInfo === "string" || | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 					!rootInfo || | 
					
						
							|  |  |  | 					!rootInfo.tagInfo || | 
					
						
							|  |  |  | 					rootInfo.tagInfo.tag !== harmonySpecifierTag | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				const settings = rootInfo.tagInfo.data; | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 				const members = | 
					
						
							|  |  |  | 					/** @type {(() => string[])} */ | 
					
						
							|  |  |  | 					(rightPart.getMembers)(); | 
					
						
							| 
									
										
										
										
											2022-03-04 16:38:39 +08:00
										 |  |  | 				const dep = new HarmonyEvaluatedImportSpecifierDependency( | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 					settings.source, | 
					
						
							|  |  |  | 					settings.sourceOrder, | 
					
						
							|  |  |  | 					settings.ids.concat(members).concat([leftPart]), | 
					
						
							|  |  |  | 					settings.name, | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					/** @type {Range} */ (expression.range), | 
					
						
							| 
									
										
										
										
											2022-03-04 16:38:39 +08:00
										 |  |  | 					settings.assertions, | 
					
						
							| 
									
										
										
										
											2022-03-08 15:01:52 +08:00
										 |  |  | 					"in" | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2022-03-04 16:38:39 +08:00
										 |  |  | 				dep.directImport = members.length === 0; | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 				dep.asiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 					/** @type {Range} */ (expression.range)[0] | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				dep.loc = /** @type {DependencyLocation} */ (expression.loc); | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 				parser.state.module.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2022-03-04 16:38:39 +08:00
										 |  |  | 				InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e)); | 
					
						
							| 
									
										
										
										
											2022-03-02 16:01:02 +08:00
										 |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		parser.hooks.expression | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 			.for(harmonySpecifierTag) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			.tap("HarmonyImportDependencyParserPlugin", expr => { | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 				const settings = /** @type {HarmonySettings} */ (parser.currentTagData); | 
					
						
							| 
									
										
										
										
											2024-06-01 16:20:58 +08:00
										 |  |  | 				const dep = new HarmonyImportSpecifierDependency( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					settings.source, | 
					
						
							|  |  |  | 					settings.sourceOrder, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					settings.ids, | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 					settings.name, | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					/** @type {Range} */ (expr.range), | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | 					exportPresenceMode, | 
					
						
							| 
									
										
										
										
											2023-05-31 14:06:15 +08:00
										 |  |  | 					settings.assertions, | 
					
						
							|  |  |  | 					[] | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2024-06-01 16:20:58 +08:00
										 |  |  | 				dep.referencedPropertiesInDestructuring = | 
					
						
							|  |  |  | 					parser.destructuringAssignmentPropertiesFor(expr); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				dep.shorthand = parser.scope.inShorthand; | 
					
						
							|  |  |  | 				dep.directImport = true; | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 				dep.asiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 					/** @type {Range} */ (expr.range)[0] | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2023-06-18 03:54:17 +08:00
										 |  |  | 				dep.call = parser.scope.inTaggedTemplateTag; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				parser.state.module.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2020-02-05 18:06:27 +08:00
										 |  |  | 				InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2017-08-08 15:32:43 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		parser.hooks.expressionMemberChain | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 			.for(harmonySpecifierTag) | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 			.tap( | 
					
						
							|  |  |  | 				"HarmonyImportDependencyParserPlugin", | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 				(expression, members, membersOptionals, memberRanges) => { | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					const settings = /** @type {HarmonySettings} */ ( | 
					
						
							|  |  |  | 						parser.currentTagData | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					const nonOptionalMembers = getNonOptionalPart( | 
					
						
							|  |  |  | 						members, | 
					
						
							| 
									
										
										
										
											2022-03-01 03:50:37 +08:00
										 |  |  | 						membersOptionals | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 					/** @type {Range[]} */ | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 					const ranges = memberRanges.slice( | 
					
						
							| 
									
										
										
										
											2023-05-24 11:01:44 +08:00
										 |  |  | 						0, | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 						memberRanges.length - (members.length - nonOptionalMembers.length) | 
					
						
							| 
									
										
										
										
											2023-05-24 11:01:44 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					const expr = | 
					
						
							|  |  |  | 						nonOptionalMembers !== members | 
					
						
							|  |  |  | 							? getNonOptionalMemberChain( | 
					
						
							|  |  |  | 									expression, | 
					
						
							|  |  |  | 									members.length - nonOptionalMembers.length | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 								) | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 							: expression; | 
					
						
							|  |  |  | 					const ids = settings.ids.concat(nonOptionalMembers); | 
					
						
							| 
									
										
										
										
											2024-06-01 16:20:58 +08:00
										 |  |  | 					const dep = new HarmonyImportSpecifierDependency( | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 						settings.source, | 
					
						
							|  |  |  | 						settings.sourceOrder, | 
					
						
							|  |  |  | 						ids, | 
					
						
							|  |  |  | 						settings.name, | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 						/** @type {Range} */ (expr.range), | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 						exportPresenceMode, | 
					
						
							| 
									
										
										
										
											2023-05-31 14:06:15 +08:00
										 |  |  | 						settings.assertions, | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 						ranges | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-06-01 16:20:58 +08:00
										 |  |  | 					dep.referencedPropertiesInDestructuring = | 
					
						
							|  |  |  | 						parser.destructuringAssignmentPropertiesFor(expr); | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					dep.asiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 						/** @type {Range} */ (expr.range)[0] | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							|  |  |  | 					InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e)); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-05-30 03:59:09 +08:00
										 |  |  | 		parser.hooks.callMemberChain | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 			.for(harmonySpecifierTag) | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 			.tap( | 
					
						
							|  |  |  | 				"HarmonyImportDependencyParserPlugin", | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 				(expression, members, membersOptionals, memberRanges) => { | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					const { arguments: args, callee } = expression; | 
					
						
							|  |  |  | 					const settings = /** @type {HarmonySettings} */ ( | 
					
						
							|  |  |  | 						parser.currentTagData | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					const nonOptionalMembers = getNonOptionalPart( | 
					
						
							|  |  |  | 						members, | 
					
						
							| 
									
										
										
										
											2022-03-01 03:50:37 +08:00
										 |  |  | 						membersOptionals | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 					/** @type {Range[]} */ | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 					const ranges = memberRanges.slice( | 
					
						
							| 
									
										
										
										
											2023-05-24 11:01:44 +08:00
										 |  |  | 						0, | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 						memberRanges.length - (members.length - nonOptionalMembers.length) | 
					
						
							| 
									
										
										
										
											2023-05-24 11:01:44 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					const expr = | 
					
						
							|  |  |  | 						nonOptionalMembers !== members | 
					
						
							|  |  |  | 							? getNonOptionalMemberChain( | 
					
						
							|  |  |  | 									callee, | 
					
						
							|  |  |  | 									members.length - nonOptionalMembers.length | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 								) | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 							: callee; | 
					
						
							|  |  |  | 					const ids = settings.ids.concat(nonOptionalMembers); | 
					
						
							|  |  |  | 					const dep = new HarmonyImportSpecifierDependency( | 
					
						
							|  |  |  | 						settings.source, | 
					
						
							|  |  |  | 						settings.sourceOrder, | 
					
						
							|  |  |  | 						ids, | 
					
						
							|  |  |  | 						settings.name, | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 						/** @type {Range} */ (expr.range), | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 						exportPresenceMode, | 
					
						
							| 
									
										
										
										
											2023-05-31 14:06:15 +08:00
										 |  |  | 						settings.assertions, | 
					
						
							| 
									
										
										
										
											2023-06-03 06:16:53 +08:00
										 |  |  | 						ranges | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					); | 
					
						
							|  |  |  | 					dep.directImport = members.length === 0; | 
					
						
							|  |  |  | 					dep.call = true; | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					dep.asiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 						/** @type {Range} */ (expr.range)[0] | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					// only in case when we strictly follow the spec we need a special case here
 | 
					
						
							|  |  |  | 					dep.namespaceObjectAsContext = | 
					
						
							| 
									
										
										
										
											2024-08-15 02:38:08 +08:00
										 |  |  | 						members.length > 0 && | 
					
						
							|  |  |  | 						/** @type {boolean} */ (this.strictThisContextOnImports); | 
					
						
							| 
									
										
										
										
											2023-06-17 04:24:34 +08:00
										 |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2022-02-07 20:51:56 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							|  |  |  | 					if (args) parser.walkExpressions(args); | 
					
						
							|  |  |  | 					InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e)); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 		const { hotAcceptCallback, hotAcceptWithoutCallback } = | 
					
						
							|  |  |  | 			HotModuleReplacementPlugin.getParserHooks(parser); | 
					
						
							| 
									
										
										
										
											2018-07-06 18:51:14 +08:00
										 |  |  | 		hotAcceptCallback.tap( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			"HarmonyImportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(expr, requests) => { | 
					
						
							| 
									
										
										
										
											2019-12-07 08:04:38 +08:00
										 |  |  | 				if (!HarmonyExports.isEnabled(parser.state)) { | 
					
						
							| 
									
										
										
										
											2018-06-26 00:40:29 +08:00
										 |  |  | 					// This is not a harmony module, skip it
 | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const dependencies = requests.map(request => { | 
					
						
							| 
									
										
										
										
											2018-09-27 19:40:58 +08:00
										 |  |  | 					const dep = new HarmonyAcceptImportDependency(request); | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2017-08-08 15:32:43 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 					return dep; | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (dependencies.length > 0) { | 
					
						
							|  |  |  | 					const dep = new HarmonyAcceptDependency( | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 						/** @type {Range} */ | 
					
						
							|  |  |  | 						(expr.range), | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						dependencies, | 
					
						
							|  |  |  | 						true | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-07-06 18:51:14 +08:00
										 |  |  | 		hotAcceptWithoutCallback.tap( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			"HarmonyImportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(expr, requests) => { | 
					
						
							| 
									
										
										
										
											2019-12-07 08:04:38 +08:00
										 |  |  | 				if (!HarmonyExports.isEnabled(parser.state)) { | 
					
						
							| 
									
										
										
										
											2018-07-31 03:10:40 +08:00
										 |  |  | 					// This is not a harmony module, skip it
 | 
					
						
							|  |  |  | 					return; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const dependencies = requests.map(request => { | 
					
						
							| 
									
										
										
										
											2018-09-27 19:40:58 +08:00
										 |  |  | 					const dep = new HarmonyAcceptImportDependency(request); | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2017-08-08 15:32:43 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 					return dep; | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				if (dependencies.length > 0) { | 
					
						
							|  |  |  | 					const dep = new HarmonyAcceptDependency( | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 						/** @type {Range} */ | 
					
						
							|  |  |  | 						(expr.range), | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						dependencies, | 
					
						
							|  |  |  | 						false | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 					dep.loc = /** @type {DependencyLocation} */ (expr.loc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					parser.state.module.addDependency(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports.harmonySpecifierTag = harmonySpecifierTag; |