UNPKG

2.91 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Ivan Kopeykin @vankop
4*/
5
6"use strict";
7
8const makeSerializable = require("../util/makeSerializable");
9const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
10
11/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
12/** @typedef {import("../ChunkGraph")} ChunkGraph */
13/** @typedef {import("../Dependency")} Dependency */
14/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
15
16/**
17 * Dependency for static evaluating import specifier. e.g.
18 * @example
19 * import a from "a";
20 * "x" in a;
21 * a.x !== undefined; // if x value statically analyzable
22 */
23class 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;
27 }
28
29 get type() {
30 return `evaluated X ${this.operator} harmony import specifier`;
31 }
32
33 serialize(context) {
34 super.serialize(context);
35 const { write } = context;
36 write(this.operator);
37 }
38
39 deserialize(context) {
40 super.deserialize(context);
41 const { read } = context;
42 this.operator = read();
43 }
44}
45
46makeSerializable(
47 HarmonyEvaluatedImportSpecifierDependency,
48 "webpack/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency"
49);
50
51HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImportSpecifierDependencyTemplate extends (
52 HarmonyImportSpecifierDependency.Template
53) {
54 /**
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
58 * @returns {void}
59 */
60 apply(dependency, source, templateContext) {
61 const dep = /** @type {HarmonyEvaluatedImportSpecifierDependency} */ (
62 dependency
63 );
64 const { moduleGraph, runtime } = templateContext;
65 const connection = moduleGraph.getConnection(dep);
66 // Skip rendering depending when dependency is conditional
67 if (connection && !connection.isTargetActive(runtime)) return;
68
69 const exportsInfo = moduleGraph.getExportsInfo(connection.module);
70 const ids = dep.getIds(moduleGraph);
71 const value = exportsInfo.isExportProvided(ids);
72
73 if (typeof value === "boolean") {
74 source.replace(dep.range[0], dep.range[1] - 1, `${value}`);
75 } else {
76 const usedName = exportsInfo.getUsedName(ids, runtime);
77
78 const code = this._getCodeForIds(
79 dep,
80 source,
81 templateContext,
82 ids.slice(0, -1)
83 );
84 source.replace(
85 dep.range[0],
86 dep.range[1] - 1,
87 `${
88 usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'
89 } in ${code}`
90 );
91 }
92 }
93};
94
95module.exports = HarmonyEvaluatedImportSpecifierDependency;