2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Ivan Kopeykin @vankop
8 const makeSerializable = require("../util/makeSerializable");
9 const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
11 /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
12 /** @typedef {import("../ChunkGraph")} ChunkGraph */
13 /** @typedef {import("../Dependency")} Dependency */
14 /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
17 * Dependency for static evaluating import specifier. e.g.
21 * a.x !== undefined; // if x value statically analyzable
23 class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDependency {
24 constructor(request, sourceOrder, ids, name, range, assertions, operator) {
25 super(request, sourceOrder, ids, name, range, false, assertions);
26 this.operator = operator;
30 return `evaluated X ${this.operator} harmony import specifier`;
34 super.serialize(context);
35 const { write } = context;
39 deserialize(context) {
40 super.deserialize(context);
41 const { read } = context;
42 this.operator = read();
47 HarmonyEvaluatedImportSpecifierDependency,
48 "webpack/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency"
51 HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImportSpecifierDependencyTemplate extends (
52 HarmonyImportSpecifierDependency.Template
55 * @param {Dependency} dependency the dependency for which the template should be applied
56 * @param {ReplaceSource} source the current replace source which can be modified
57 * @param {DependencyTemplateContext} templateContext the context object
60 apply(dependency, source, templateContext) {
61 const dep = /** @type {HarmonyEvaluatedImportSpecifierDependency} */ (
64 const { module, moduleGraph, runtime } = templateContext;
65 const connection = moduleGraph.getConnection(dep);
66 // Skip rendering depending when dependency is conditional
67 if (connection && !connection.isTargetActive(runtime)) return;
69 const exportsInfo = moduleGraph.getExportsInfo(connection.module);
70 const ids = dep.getIds(moduleGraph);
74 const exportsType = connection.module.getExportsType(
76 module.buildMeta.strictHarmonyModule
78 switch (exportsType) {
79 case "default-with-named": {
80 if (ids[0] === "default") {
82 ids.length === 1 || exportsInfo.isExportProvided(ids.slice(1));
84 value = exportsInfo.isExportProvided(ids);
89 if (ids[0] === "__esModule") {
90 value = ids.length === 1 || undefined;
92 value = exportsInfo.isExportProvided(ids);
97 if (ids[0] !== "default") {
98 value = exportsInfo.isExportProvided(ids);
102 // default-only could lead to runtime error, when default value is primitive
105 if (typeof value === "boolean") {
106 source.replace(dep.range[0], dep.range[1] - 1, ` ${value}`);
108 const usedName = exportsInfo.getUsedName(ids, runtime);
110 const code = this._getCodeForIds(
120 usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'
127 module.exports = HarmonyEvaluatedImportSpecifierDependency;