mirror of https://github.com/webpack/webpack.git
remove arguments, replace whole expression
This commit is contained in:
parent
4fe01b2954
commit
b095e8d138
|
@ -21,21 +21,9 @@ const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDepend
|
|||
* a.x !== undefined; // if x value statically analyzable
|
||||
*/
|
||||
class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDependency {
|
||||
constructor(
|
||||
request,
|
||||
sourceOrder,
|
||||
ids,
|
||||
name,
|
||||
range,
|
||||
assertions,
|
||||
operator,
|
||||
value,
|
||||
importSpecifierRange
|
||||
) {
|
||||
constructor(request, sourceOrder, ids, name, range, assertions, operator) {
|
||||
super(request, sourceOrder, ids, name, range, false, assertions);
|
||||
this.operator = operator;
|
||||
this.value = value;
|
||||
this.importSpecifierRange = importSpecifierRange;
|
||||
}
|
||||
|
||||
get type() {
|
||||
|
@ -46,16 +34,12 @@ class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDe
|
|||
super.serialize(context);
|
||||
const { write } = context;
|
||||
write(this.operator);
|
||||
write(this.value);
|
||||
write(this.importSpecifierRange);
|
||||
}
|
||||
|
||||
deserialize(context) {
|
||||
super.deserialize(context);
|
||||
const { read } = context;
|
||||
this.operator = read();
|
||||
this.value = read();
|
||||
this.importSpecifierRange = read();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,12 +73,20 @@ HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImpor
|
|||
if (typeof value === "boolean") {
|
||||
source.replace(dep.range[0], dep.range[1] - 1, `${value}`);
|
||||
} else {
|
||||
this._applyForIds(
|
||||
dependency,
|
||||
const usedName = exportsInfo.getUsedName(ids, runtime);
|
||||
|
||||
const code = this._getCodeForIds(
|
||||
dep,
|
||||
source,
|
||||
templateContext,
|
||||
ids.slice(0, -1),
|
||||
dep.importSpecifierRange
|
||||
ids.slice(0, -1)
|
||||
);
|
||||
source.replace(
|
||||
dep.range[0],
|
||||
dep.range[1] - 1,
|
||||
`${
|
||||
usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'
|
||||
} in ${code}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -159,9 +159,7 @@ module.exports = class HarmonyImportDependencyParserPlugin {
|
|||
settings.name,
|
||||
expression.range,
|
||||
settings.assertions,
|
||||
"in",
|
||||
leftPart,
|
||||
rightPart.range
|
||||
"in"
|
||||
);
|
||||
dep.directImport = members.length === 0;
|
||||
dep.asiSafe = !parser.isAsiPosition(expression.range[0]);
|
||||
|
|
|
@ -267,11 +267,23 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
|
|||
if (connection && !connection.isTargetActive(runtime)) return;
|
||||
|
||||
const ids = dep.getIds(moduleGraph);
|
||||
this._applyForIds(dependency, source, templateContext, ids, dep.range);
|
||||
const exportExpr = this._getCodeForIds(dep, source, templateContext, ids);
|
||||
const range = dep.range;
|
||||
if (dep.shorthand) {
|
||||
source.insert(range[1], `: ${exportExpr}`);
|
||||
} else {
|
||||
source.replace(range[0], range[1] - 1, exportExpr);
|
||||
}
|
||||
}
|
||||
|
||||
_applyForIds(dependency, source, templateContext, ids, range) {
|
||||
const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency);
|
||||
/**
|
||||
* @param {HarmonyImportSpecifierDependency} dep dependency
|
||||
* @param {ReplaceSource} source source
|
||||
* @param {DependencyTemplateContext} templateContext context
|
||||
* @param {string[]} ids ids
|
||||
* @returns {string} generated code
|
||||
*/
|
||||
_getCodeForIds(dep, source, templateContext, ids) {
|
||||
const { moduleGraph, module, runtime, concatenationScope } =
|
||||
templateContext;
|
||||
const connection = moduleGraph.getConnection(dep);
|
||||
|
@ -305,7 +317,7 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
|
|||
);
|
||||
}
|
||||
} else {
|
||||
super.apply(dependency, source, templateContext);
|
||||
super.apply(dep, source, templateContext);
|
||||
|
||||
const { runtimeTemplate, initFragments, runtimeRequirements } =
|
||||
templateContext;
|
||||
|
@ -326,11 +338,7 @@ HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependen
|
|||
runtimeRequirements
|
||||
});
|
||||
}
|
||||
if (dep.shorthand) {
|
||||
source.insert(range[1], `: ${exportExpr}`);
|
||||
} else {
|
||||
source.replace(range[0], range[1] - 1, exportExpr);
|
||||
}
|
||||
return exportExpr;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -8,6 +8,9 @@ import { h } from "./h.js";
|
|||
import * as m from "./m";
|
||||
import * as o from "./o";
|
||||
import * as p from "./p";
|
||||
import * as q from "./q";
|
||||
import * as so from "./side-effect-free/o";
|
||||
import * as sm from "./side-effect-free/m";
|
||||
|
||||
it("namespace export as from commonjs should override named export", function () {
|
||||
expect(x).toBe(1);
|
||||
|
@ -40,15 +43,20 @@ it("complex case should work correctly", () => {
|
|||
});
|
||||
|
||||
it("should handle 'm in n' case", () => {
|
||||
const obj = { a: "a" in m };
|
||||
expect(obj.a).toBe(true);
|
||||
expect("a" in o).toBe(true);
|
||||
expect("a" in p).toBe(false);
|
||||
expect("c" in m).toBe(false);
|
||||
expect("c" in (false ? ({}) : m.d)).toBe(true);
|
||||
expect("d" in m.d).toBe(false);
|
||||
const obj = { aaa: "aaa" in m };
|
||||
expect(obj.aaa).toBe(true);
|
||||
expect("aaa" in o).toBe(true);
|
||||
expect("aaa" in p).toBe(false);
|
||||
expect("ccc" in m).toBe(false);
|
||||
expect("aaa" in q).toBe(true);
|
||||
expect("aaa" in so).toBe(true);
|
||||
expect("ccc" in sm).toBe(false);
|
||||
expect("ccc" in (false ? {} : m.ddd)).toBe(true);
|
||||
expect("ccc" in (false ? {} : sm.ddd)).toBe(true);
|
||||
expect("ddd" in m.ddd).toBe(false);
|
||||
expect("ddd" in sm.ddd).toBe(false);
|
||||
if (process.env.NODE_ENV === "production") {
|
||||
expect(m.d.usedA).toBe(false);
|
||||
expect(m.ddd.usedA).toBe(false);
|
||||
expect(m.usedB).toBe(false);
|
||||
expect(m.usedA).toBe(true);
|
||||
expect(m.canMangleA).toBe(true);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
export const a = 1;
|
||||
export const b = 2;
|
||||
export * as d from "./n";
|
||||
export const usedA = __webpack_exports_info__.a.used;
|
||||
export const canMangleA = __webpack_exports_info__.c.canMangle;
|
||||
export const usedB = __webpack_exports_info__.b.used;
|
||||
export const aaa = 1;
|
||||
export const bbb = 2;
|
||||
export * as ddd from "./n";
|
||||
export const usedA = __webpack_exports_info__.aaa.used;
|
||||
export const canMangleA = __webpack_exports_info__.ccc.canMangle;
|
||||
export const usedB = __webpack_exports_info__.bbb.used;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
export const c = 3;
|
||||
export const m = () => ({});
|
||||
export const a = 1;
|
||||
export const ccc = 3;
|
||||
export const mmm = () => ({});
|
||||
export const aaa = 1;
|
||||
export const usedA = __webpack_exports_info__.a.used;
|
||||
export const canMangleC = __webpack_exports_info__.c.canMangle;
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
const exports_ = { a: 1, b: 2 };
|
||||
const exports_ = { aaa: 1, bbb: 2 };
|
||||
module.exports = exports_;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
export * from "./o";
|
|
@ -0,0 +1 @@
|
|||
export * from "../m";
|
|
@ -0,0 +1 @@
|
|||
export * from "../o";
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"sideEffects": false
|
||||
}
|
Loading…
Reference in New Issue