| 
									
										
										
										
											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"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-31 22:43:31 +08:00
										 |  |  | const { getImportAttributes } = require("../javascript/JavascriptParser"); | 
					
						
							| 
									
										
										
										
											2020-01-29 21:24:55 +08:00
										 |  |  | const InnerGraph = require("../optimize/InnerGraph"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const ConstDependency = require("./ConstDependency"); | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency"); | 
					
						
							|  |  |  | const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency"); | 
					
						
							|  |  |  | const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency"); | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | const { ExportPresenceModes } = require("./HarmonyImportDependency"); | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | const { | 
					
						
							| 
									
										
										
										
											2024-10-31 22:43:31 +08:00
										 |  |  | 	harmonySpecifierTag | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | } = require("./HarmonyImportDependencyParserPlugin"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency"); | 
					
						
							| 
									
										
										
										
											2015-01-13 00:45:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */ | 
					
						
							| 
									
										
										
										
											2023-06-17 03:44:20 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */ | 
					
						
							| 
									
										
										
										
											2024-03-14 23:15:13 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").FunctionDeclaration} FunctionDeclaration */ | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").Range} Range */ | 
					
						
							| 
									
										
										
										
											2023-06-17 03:44:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-13 23:33:05 +08:00
										 |  |  | const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | module.exports = class HarmonyExportDependencyParserPlugin { | 
					
						
							| 
									
										
										
										
											2023-05-22 08:03:05 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {import("../../declarations/WebpackOptions").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.reexportExportsPresence !== undefined | 
					
						
							|  |  |  | 				? ExportPresenceModes.fromUserOption(options.reexportExportsPresence) | 
					
						
							|  |  |  | 				: options.exportsPresence !== undefined | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 					? ExportPresenceModes.fromUserOption(options.exportsPresence) | 
					
						
							|  |  |  | 					: options.strictExportPresence | 
					
						
							|  |  |  | 						? ExportPresenceModes.ERROR | 
					
						
							|  |  |  | 						: ExportPresenceModes.AUTO; | 
					
						
							| 
									
										
										
										
											2017-11-23 21:10:52 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 23:15:13 +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; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		parser.hooks.export.tap( | 
					
						
							|  |  |  | 			"HarmonyExportDependencyParserPlugin", | 
					
						
							|  |  |  | 			statement => { | 
					
						
							|  |  |  | 				const dep = new HarmonyExportHeaderDependency( | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 					/** @type {Range | false} */ ( | 
					
						
							|  |  |  | 						statement.declaration && statement.declaration.range | 
					
						
							|  |  |  | 					), | 
					
						
							|  |  |  | 					/** @type {Range} */ (statement.range) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				dep.loc = Object.create( | 
					
						
							|  |  |  | 					/** @type {DependencyLocation} */ (statement.loc) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							|  |  |  | 				dep.loc.index = -1; | 
					
						
							| 
									
										
										
										
											2019-10-30 13:40:40 +08:00
										 |  |  | 				parser.state.module.addPresentationalDependency(dep); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2017-01-03 05:30:08 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		parser.hooks.exportImport.tap( | 
					
						
							|  |  |  | 			"HarmonyExportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, source) => { | 
					
						
							|  |  |  | 				parser.state.lastHarmonyImportOrder = | 
					
						
							|  |  |  | 					(parser.state.lastHarmonyImportOrder || 0) + 1; | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				const clearDep = new ConstDependency( | 
					
						
							|  |  |  | 					"", | 
					
						
							|  |  |  | 					/** @type {Range} */ (statement.range) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				clearDep.loc = /** @type {DependencyLocation} */ (statement.loc); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				clearDep.loc.index = -1; | 
					
						
							| 
									
										
										
										
											2019-10-30 13:40:40 +08:00
										 |  |  | 				parser.state.module.addPresentationalDependency(clearDep); | 
					
						
							| 
									
										
										
										
											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-10-31 22:43:31 +08:00
										 |  |  | 					getImportAttributes(statement) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				sideEffectDep.loc = Object.create( | 
					
						
							|  |  |  | 					/** @type {DependencyLocation} */ (statement.loc) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				sideEffectDep.loc.index = -1; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(sideEffectDep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		parser.hooks.exportExpression.tap( | 
					
						
							|  |  |  | 			"HarmonyExportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, expr) => { | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 				const isFunctionDeclaration = expr.type === "FunctionDeclaration"; | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				const exprRange = /** @type {Range} */ (expr.range); | 
					
						
							|  |  |  | 				const statementRange = /** @type {Range} */ (statement.range); | 
					
						
							|  |  |  | 				const comments = parser.getComments([statementRange[0], exprRange[0]]); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const dep = new HarmonyExportExpressionDependency( | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 					exprRange, | 
					
						
							|  |  |  | 					statementRange, | 
					
						
							| 
									
										
										
										
											2018-09-17 20:58:55 +08:00
										 |  |  | 					comments | 
					
						
							|  |  |  | 						.map(c => { | 
					
						
							|  |  |  | 							switch (c.type) { | 
					
						
							|  |  |  | 								case "Block": | 
					
						
							|  |  |  | 									return `/*${c.value}*/`; | 
					
						
							|  |  |  | 								case "Line": | 
					
						
							|  |  |  | 									return `//${c.value}\n`; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							return ""; | 
					
						
							|  |  |  | 						}) | 
					
						
							| 
									
										
										
										
											2020-05-13 01:09:56 +08:00
										 |  |  | 						.join(""), | 
					
						
							|  |  |  | 					expr.type.endsWith("Declaration") && expr.id | 
					
						
							|  |  |  | 						? expr.id.name | 
					
						
							|  |  |  | 						: isFunctionDeclaration | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 							? { | 
					
						
							|  |  |  | 									range: [ | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 										exprRange[0], | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 										expr.params.length > 0 | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 											? /** @type {Range} */ (expr.params[0].range)[0] | 
					
						
							|  |  |  | 											: /** @type {Range} */ (expr.body.range)[0] | 
					
						
							| 
									
										
										
										
											2024-01-14 09:41:34 +08:00
										 |  |  | 									], | 
					
						
							|  |  |  | 									prefix: `${expr.async ? "async " : ""}function${ | 
					
						
							|  |  |  | 										expr.generator ? "*" : "" | 
					
						
							|  |  |  | 									} `,
 | 
					
						
							|  |  |  | 									suffix: `(${expr.params.length > 0 ? "" : ") "}` | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							: undefined | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				dep.loc = Object.create( | 
					
						
							|  |  |  | 					/** @type {DependencyLocation} */ (statement.loc) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				dep.loc.index = -1; | 
					
						
							|  |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							| 
									
										
										
										
											2020-01-29 21:24:55 +08:00
										 |  |  | 				InnerGraph.addVariableUsage( | 
					
						
							|  |  |  | 					parser, | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 					expr.type.endsWith("Declaration") && expr.id | 
					
						
							|  |  |  | 						? expr.id.name | 
					
						
							|  |  |  | 						: "*default*", | 
					
						
							| 
									
										
										
										
											2020-01-29 21:24:55 +08:00
										 |  |  | 					"default" | 
					
						
							| 
									
										
										
										
											2019-09-03 20:11:50 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				return true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		parser.hooks.exportSpecifier.tap( | 
					
						
							|  |  |  | 			"HarmonyExportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, id, name, idx) => { | 
					
						
							| 
									
										
										
										
											2019-08-29 21:28:19 +08:00
										 |  |  | 				const settings = parser.getTagData(id, harmonySpecifierTag); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const harmonyNamedExports = (parser.state.harmonyNamedExports = | 
					
						
							|  |  |  | 					parser.state.harmonyNamedExports || new Set()); | 
					
						
							| 
									
										
										
										
											2017-10-09 21:28:59 +08:00
										 |  |  | 				harmonyNamedExports.add(name); | 
					
						
							| 
									
										
										
										
											2020-01-29 21:24:55 +08:00
										 |  |  | 				InnerGraph.addVariableUsage(parser, id, name); | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 				const dep = settings | 
					
						
							|  |  |  | 					? new HarmonyExportImportedSpecifierDependency( | 
					
						
							|  |  |  | 							settings.source, | 
					
						
							|  |  |  | 							settings.sourceOrder, | 
					
						
							|  |  |  | 							settings.ids, | 
					
						
							|  |  |  | 							name, | 
					
						
							|  |  |  | 							harmonyNamedExports, | 
					
						
							|  |  |  | 							null, | 
					
						
							|  |  |  | 							exportPresenceMode, | 
					
						
							|  |  |  | 							null, | 
					
						
							|  |  |  | 							settings.assertions | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					: new HarmonyExportSpecifierDependency(id, name); | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				dep.loc = Object.create( | 
					
						
							|  |  |  | 					/** @type {DependencyLocation} */ (statement.loc) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				dep.loc.index = idx; | 
					
						
							| 
									
										
										
										
											2024-08-15 20:32:58 +08:00
										 |  |  | 				const isAsiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 					/** @type {Range} */ | 
					
						
							|  |  |  | 					(statement.range)[0] | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				if (!isAsiSafe) { | 
					
						
							|  |  |  | 					parser.setAsiPosition(/** @type {Range} */ (statement.range)[1]); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2017-10-09 21:28:59 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		parser.hooks.exportImportSpecifier.tap( | 
					
						
							|  |  |  | 			"HarmonyExportDependencyParserPlugin", | 
					
						
							|  |  |  | 			(statement, source, id, name, idx) => { | 
					
						
							|  |  |  | 				const harmonyNamedExports = (parser.state.harmonyNamedExports = | 
					
						
							|  |  |  | 					parser.state.harmonyNamedExports || new Set()); | 
					
						
							|  |  |  | 				let harmonyStarExports = null; | 
					
						
							|  |  |  | 				if (name) { | 
					
						
							|  |  |  | 					harmonyNamedExports.add(name); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					harmonyStarExports = parser.state.harmonyStarExports = | 
					
						
							| 
									
										
										
										
											2021-04-13 23:33:05 +08:00
										 |  |  | 						parser.state.harmonyStarExports || new HarmonyStarExportsList(); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				const dep = new HarmonyExportImportedSpecifierDependency( | 
					
						
							| 
									
										
										
										
											2024-03-14 23:15:13 +08:00
										 |  |  | 					/** @type {string} */ (source), | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					parser.state.lastHarmonyImportOrder, | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 					id ? [id] : [], | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					name, | 
					
						
							|  |  |  | 					harmonyNamedExports, | 
					
						
							|  |  |  | 					harmonyStarExports && harmonyStarExports.slice(), | 
					
						
							| 
									
										
										
										
											2021-11-03 01:16:59 +08:00
										 |  |  | 					exportPresenceMode, | 
					
						
							| 
									
										
										
										
											2021-04-13 23:33:05 +08:00
										 |  |  | 					harmonyStarExports | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							|  |  |  | 				if (harmonyStarExports) { | 
					
						
							|  |  |  | 					harmonyStarExports.push(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 				dep.loc = Object.create( | 
					
						
							|  |  |  | 					/** @type {DependencyLocation} */ (statement.loc) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				dep.loc.index = idx; | 
					
						
							| 
									
										
										
										
											2024-08-14 19:47:21 +08:00
										 |  |  | 				const isAsiSafe = !parser.isAsiPosition( | 
					
						
							|  |  |  | 					/** @type {Range} */ | 
					
						
							|  |  |  | 					(statement.range)[0] | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				if (!isAsiSafe) { | 
					
						
							|  |  |  | 					parser.setAsiPosition(/** @type {Range} */ (statement.range)[1]); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				parser.state.current.addDependency(dep); | 
					
						
							|  |  |  | 				return true; | 
					
						
							| 
									
										
										
										
											2017-10-09 21:28:59 +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
										 |  |  | }; |