| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");const ConstDependency = require("./ConstDependency");module.exports = class HarmonyExportDependencyParserPlugin {	constructor(moduleOptions) {		this.strictExportPresence = moduleOptions.strictExportPresence;	}	apply(parser) {		parser.hooks.export.tap(			"HarmonyExportDependencyParserPlugin",			statement => {				const dep = new HarmonyExportHeaderDependency(					statement.declaration && statement.declaration.range,					statement.range				);				dep.loc = Object.create(statement.loc);				dep.loc.index = -1;				parser.state.current.addDependency(dep);				return true;			}		);		parser.hooks.exportImport.tap(			"HarmonyExportDependencyParserPlugin",			(statement, source) => {				parser.state.lastHarmonyImportOrder =					(parser.state.lastHarmonyImportOrder || 0) + 1;				const clearDep = new ConstDependency("", statement.range);				clearDep.loc = Object.create(statement.loc);				clearDep.loc.index = -1;				parser.state.current.addDependency(clearDep);				const sideEffectDep = new HarmonyImportSideEffectDependency(					source,					parser.state.module,					parser.state.lastHarmonyImportOrder,					parser.state.harmonyParserScope				);				sideEffectDep.loc = Object.create(statement.loc);				sideEffectDep.loc.index = -1;				parser.state.current.addDependency(sideEffectDep);				return true;			}		);		parser.hooks.exportExpression.tap(			"HarmonyExportDependencyParserPlugin",			(statement, expr) => {				const comments = parser.getComments([					statement.range[0],					expr.range[0]				]);				const dep = new HarmonyExportExpressionDependency(					parser.state.module,					expr.range,					statement.range,					comments						.map(c => {							switch (c.type) {								case "Block":									return `/*${c.value}*/`;								case "Line":									return `//${c.value}\n`;							}							return "";						})						.join("")				);				dep.loc = Object.create(statement.loc);				dep.loc.index = -1;				parser.state.current.addDependency(dep);				return true;			}		);		parser.hooks.exportDeclaration.tap(			"HarmonyExportDependencyParserPlugin",			statement => {}		);		parser.hooks.exportSpecifier.tap(			"HarmonyExportDependencyParserPlugin",			(statement, id, name, idx) => {				const rename = parser.scope.renames.get(id);				let dep;				const harmonyNamedExports = (parser.state.harmonyNamedExports =					parser.state.harmonyNamedExports || new Set());				harmonyNamedExports.add(name);				if (rename === "imported var") {					const settings = parser.state.harmonySpecifier.get(id);					dep = new HarmonyExportImportedSpecifierDependency(						settings.source,						parser.state.module,						settings.sourceOrder,						parser.state.harmonyParserScope,						settings.id,						name,						harmonyNamedExports,						null,						this.strictExportPresence					);				} else {					dep = new HarmonyExportSpecifierDependency(						parser.state.module,						id,						name					);				}				dep.loc = Object.create(statement.loc);				dep.loc.index = idx;				parser.state.current.addDependency(dep);				return true;			}		);		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 =						parser.state.harmonyStarExports || [];				}				const dep = new HarmonyExportImportedSpecifierDependency(					source,					parser.state.module,					parser.state.lastHarmonyImportOrder,					parser.state.harmonyParserScope,					id,					name,					harmonyNamedExports,					harmonyStarExports && harmonyStarExports.slice(),					this.strictExportPresence				);				if (harmonyStarExports) {					harmonyStarExports.push(dep);				}				dep.loc = Object.create(statement.loc);				dep.loc.index = idx;				parser.state.current.addDependency(dep);				return true;			}		);	}};
 |