| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");const HarmonyInitDependency = require("./HarmonyInitDependency");module.exports = class HarmonyDetectionParserPlugin {	apply(parser) {		parser.hooks.program.tap("HarmonyDetectionParserPlugin", ast => {			const isStrictHarmony = parser.state.module.type === "javascript/esm";			const isHarmony =				isStrictHarmony ||				ast.body.some(					statement =>						statement.type === "ImportDeclaration" ||						statement.type === "ExportDefaultDeclaration" ||						statement.type === "ExportNamedDeclaration" ||						statement.type === "ExportAllDeclaration"				);			if (isHarmony) {				const module = parser.state.module;				const compatDep = new HarmonyCompatibilityDependency(module);				compatDep.loc = {					start: {						line: -1,						column: 0					},					end: {						line: -1,						column: 0					},					index: -3				};				module.addDependency(compatDep);				const initDep = new HarmonyInitDependency(module);				initDep.loc = {					start: {						line: -1,						column: 0					},					end: {						line: -1,						column: 0					},					index: -2				};				module.addDependency(initDep);				parser.state.harmonyParserScope = parser.state.harmonyParserScope || {};				parser.scope.isStrict = true;				module.buildMeta.exportsType = "namespace";				module.buildInfo.strict = true;				module.buildInfo.exportsArgument = "__webpack_exports__";				if (isStrictHarmony) {					module.buildMeta.strictHarmonyModule = true;					module.buildInfo.moduleArgument = "__webpack_module__";				}			}		});		const skipInHarmony = () => {			const module = parser.state.module;			if (module && module.buildMeta && module.buildMeta.exportsType) {				return true;			}		};		const nullInHarmony = () => {			const module = parser.state.module;			if (module && module.buildMeta && module.buildMeta.exportsType) {				return null;			}		};		const nonHarmonyIdentifiers = ["define", "exports"];		for (const identifer of nonHarmonyIdentifiers) {			parser.hooks.evaluateTypeof				.for(identifer)				.tap("HarmonyDetectionParserPlugin", nullInHarmony);			parser.hooks.typeof				.for(identifer)				.tap("HarmonyDetectionParserPlugin", skipInHarmony);			parser.hooks.evaluate				.for(identifer)				.tap("HarmonyDetectionParserPlugin", nullInHarmony);			parser.hooks.expression				.for(identifer)				.tap("HarmonyDetectionParserPlugin", skipInHarmony);			parser.hooks.call				.for(identifer)				.tap("HarmonyDetectionParserPlugin", skipInHarmony);		}	}};
 |