| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Ivan Kopeykin @vankop*/"use strict";const makeSerializable = require("../util/makeSerializable");const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource *//** @typedef {import("../ChunkGraph")} ChunkGraph *//** @typedef {import("../Dependency")} Dependency *//** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext *//** * Dependency for static evaluating import specifier. e.g. * @example * import a from "a"; * "x" in a; * a.x !== undefined; // if x value statically analyzable */class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDependency {	constructor(request, sourceOrder, ids, name, range, assertions, operator) {		super(request, sourceOrder, ids, name, range, false, assertions);		this.operator = operator;	}	get type() {		return `evaluated X ${this.operator} harmony import specifier`;	}	serialize(context) {		super.serialize(context);		const { write } = context;		write(this.operator);	}	deserialize(context) {		super.deserialize(context);		const { read } = context;		this.operator = read();	}}makeSerializable(	HarmonyEvaluatedImportSpecifierDependency,	"webpack/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency");HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImportSpecifierDependencyTemplate extends (	HarmonyImportSpecifierDependency.Template) {	/**	 * @param {Dependency} dependency the dependency for which the template should be applied	 * @param {ReplaceSource} source the current replace source which can be modified	 * @param {DependencyTemplateContext} templateContext the context object	 * @returns {void}	 */	apply(dependency, source, templateContext) {		const dep = /** @type {HarmonyEvaluatedImportSpecifierDependency} */ (			dependency		);		const { module, moduleGraph, runtime } = templateContext;		const connection = moduleGraph.getConnection(dep);		// Skip rendering depending when dependency is conditional		if (connection && !connection.isTargetActive(runtime)) return;		const exportsInfo = moduleGraph.getExportsInfo(connection.module);		const ids = dep.getIds(moduleGraph);		let value;		const exportsType = connection.module.getExportsType(			moduleGraph,			module.buildMeta.strictHarmonyModule		);		switch (exportsType) {			case "default-with-named": {				if (ids[0] === "default") {					value =						ids.length === 1 || exportsInfo.isExportProvided(ids.slice(1));				} else {					value = exportsInfo.isExportProvided(ids);				}				break;			}			case "namespace": {				if (ids[0] === "__esModule") {					value = ids.length === 1 || undefined;				} else {					value = exportsInfo.isExportProvided(ids);				}				break;			}			case "dynamic": {				if (ids[0] !== "default") {					value = exportsInfo.isExportProvided(ids);				}				break;			}			// default-only could lead to runtime error, when default value is primitive		}		if (typeof value === "boolean") {			source.replace(dep.range[0], dep.range[1] - 1, ` ${value}`);		} else {			const usedName = exportsInfo.getUsedName(ids, runtime);			const code = this._getCodeForIds(				dep,				source,				templateContext,				ids.slice(0, -1)			);			source.replace(				dep.range[0],				dep.range[1] - 1,				`${					usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'				} in ${code}`			);		}	}};module.exports = HarmonyEvaluatedImportSpecifierDependency;
 |