diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index c56a556a558..cf62790267a 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -3956,6 +3956,7 @@ class JavascriptParser extends Parser { .call(expr, commentsStartPos); if (typeof result === "boolean") return result; switch (expr.type) { + // TODO handle more cases case "ClassDeclaration": case "ClassExpression": { if (expr.body.type !== "ClassBody") return false; @@ -3996,7 +3997,10 @@ class JavascriptParser extends Parser { case "FunctionDeclaration": case "FunctionExpression": case "ArrowFunctionExpression": + case "ThisExpression": case "Literal": + case "TemplateLiteral": + case "Identifier": case "PrivateIdentifier": return true; @@ -4012,6 +4016,12 @@ class JavascriptParser extends Parser { this.isPure(expr.alternate, expr.consequent.range[1]) ); + case "LogicalExpression": + return ( + this.isPure(expr.left, commentsStartPos) && + this.isPure(expr.right, expr.left.range[1]) + ); + case "SequenceExpression": return expr.expressions.every(expr => { const pureFlag = this.isPure(expr, commentsStartPos); diff --git a/package.json b/package.json index 064640461e9..56cc655079a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "5.84.0", + "version": "5.84.1", "author": "Tobias Koppers @sokra", "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", "license": "MIT", diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js index 454aadd3d48..bcce7df94ae 100644 --- a/test/cases/inner-graph/extend-class2/dep-decl.js +++ b/test/cases/inner-graph/extend-class2/dep-decl.js @@ -1,5 +1,5 @@ -import { A, B, getC, getD, getE, getF, Foo } from "./dep2?decl"; -import { A3, B3, C3, D3, E3, F3 } from "./dep3?decl"; +import { A, B, getC, getD, getE, getF, Foo, Pure, DateFormatter, ConditionalExpression, LogicalExpression } from "./dep2?decl"; +import { A3, B3, C3, D3, E3, F3, Pure3, ConditionalExpression3, LogicalExpression3 } from "./dep3?decl"; export class A1 extends A { render() { @@ -133,6 +133,31 @@ export default class DefaultBar extends Foo { } } +export class ExtendsPure extends Pure { + render() { + return new Pure3(); + } +} + +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + export class A2 extends A3 {} export class B2 extends B3 {} export class C2 extends C3 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js index afa476b438c..957b59d98ce 100644 --- a/test/cases/inner-graph/extend-class2/dep-expr.js +++ b/test/cases/inner-graph/extend-class2/dep-expr.js @@ -1,5 +1,5 @@ -import { A, B, getC, getD, getE, getF } from "./dep2?expr"; -import { A3, B3, C3, D3, E3, F3 } from "./dep3?expr"; +import {A, B, DateFormatter, getC, getD, getE, getF, Pure, ConditionalExpression, LogicalExpression} from "./dep2?expr"; +import { A3, B3, C3, D3, E3, F3, Pure3} from "./dep3?expr"; export const A1 = class extends A { render() { @@ -39,6 +39,31 @@ export const F1 = class extends getF() { } }; +export const ExtendsPure = class extends Pure { + render() { + return new Pure3(); + } +}; + +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + export const A2 = class extends A3 {}; export const B2 = class extends B3 {}; export const C2 = class extends C3 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js index 48e3af7edf5..5581cdd2199 100644 --- a/test/cases/inner-graph/extend-class2/dep2.js +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -5,6 +5,15 @@ export const getD = () => class D {}; export const getE = () => class E {}; export const getF = () => class F {}; export class Foo { static Bar = Foo; } +export class Pure {} +export class DateFormatter extends Date { + constructor() { + super(); + this.date = this.getDate(); + } +} +export class ConditionalExpression extends (true ? A : B) {} +export class LogicalExpression extends (A || B) {} export const exportsInfoForA = __webpack_exports_info__.A.used; export const exportsInfoForB = __webpack_exports_info__.B.used; @@ -13,3 +22,7 @@ export const exportsInfoForD = __webpack_exports_info__.getD.used; export const exportsInfoForE = __webpack_exports_info__.getE.used; export const exportsInfoForF = __webpack_exports_info__.getF.used; export const exportsInfoForFoo = __webpack_exports_info__.Foo.used; +export const exportsInfoForPure = __webpack_exports_info__.Pure.used; +export const exportsInfoForDateFormatter = __webpack_exports_info__.DateFormatter.used; +export const exportsInfoForConditionalExpression = __webpack_exports_info__.ConditionalExpression.used; +export const exportsInfoForLogicalExpression = __webpack_exports_info__.LogicalExpression.used; diff --git a/test/cases/inner-graph/extend-class2/dep3.js b/test/cases/inner-graph/extend-class2/dep3.js index 974ee9572d0..74377293433 100644 --- a/test/cases/inner-graph/extend-class2/dep3.js +++ b/test/cases/inner-graph/extend-class2/dep3.js @@ -4,3 +4,6 @@ export class C3 {} export class D3 {} export class E3 {} export class F3 {} +export class Pure3 {} +export class ConditionalExpression3 extends (true ? A3 : B3) {} +export class LogicalExpression3 extends (A3 || B3) {} diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index ffc0fc23beb..87322d5f5b3 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -5,7 +5,11 @@ import { exportsInfoForD as declD, exportsInfoForE as declE, exportsInfoForF as declF, - exportsInfoForFoo as declFoo + exportsInfoForFoo as declFoo, + exportsInfoForPure as declPure, + exportsInfoForDateFormatter as declDateFormatter, + exportsInfoForConditionalExpression as declConditionalExpression, + exportsInfoForLogicalExpression as declLogicalExpression } from "./dep2?decl"; import { exportsInfoForA as exprA, @@ -14,6 +18,10 @@ import { exportsInfoForD as exprD, exportsInfoForE as exprE, exportsInfoForF as exprF, + exportsInfoForPure as exprPure, + exportsInfoForDateFormatter as exprDateFormatter, + exportsInfoForConditionalExpression as exprConditionalExpression, + exportsInfoForLogicalExpression as exprLogicalExpression } from "./dep2?expr"; it("should load module correctly", () => { @@ -51,8 +59,19 @@ it("E should be used", () => { }); it("F should be used", () => { + if (process.env.NODE_ENV === "production") { + expect(declPure).toBe(false); + expect(exprPure).toBe(false); + expect(declConditionalExpression).toBe(false); + expect(exprConditionalExpression).toBe(false); + expect(declLogicalExpression).toBe(false); + expect(exprLogicalExpression).toBe(false); + } + // Note: it has side-effects and is not affected by usage of the class expect(declF).toBe(true); expect(declFoo).toBe(true); expect(exprF).toBe(true); + expect(declDateFormatter).toBe(true); + expect(exprDateFormatter).toBe(true); }); diff --git a/test/cases/inner-graph/extend-class2/module-decl.js b/test/cases/inner-graph/extend-class2/module-decl.js index 7d164adb26a..9ca859760f3 100644 --- a/test/cases/inner-graph/extend-class2/module-decl.js +++ b/test/cases/inner-graph/extend-class2/module-decl.js @@ -1,3 +1,3 @@ -import { A1, C1, E1 } from "./dep-decl"; +import { A1, C1, E1, DateBar } from "./dep-decl"; -export default [new A1().render(), new C1().render(), new E1().render()]; +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; diff --git a/test/cases/inner-graph/extend-class2/module-expr.js b/test/cases/inner-graph/extend-class2/module-expr.js index 4395782a890..b04d26a339a 100644 --- a/test/cases/inner-graph/extend-class2/module-expr.js +++ b/test/cases/inner-graph/extend-class2/module-expr.js @@ -1,3 +1,3 @@ -import { A1, C1, E1 } from "./dep-expr"; +import { A1, C1, E1, DateBar } from "./dep-expr"; -export default [new A1().render(), new C1().render(), new E1().render()]; +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; diff --git a/yarn.lock b/yarn.lock index 0577fa03872..309b8fc4322 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1138,9 +1138,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.0.tgz#337b90bbcfe42158f39c2fb5619ad044bbb518ac" - integrity sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg== + version "29.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" + integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -5624,9 +5624,9 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-git@^3.17.0: - version "3.18.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.18.0.tgz#2e25adbbc1e3df5ee97c0f1b468ddadf3f0f9adf" - integrity sha512-Yt0GJ5aYrpPci3JyrYcsPz8Xc05Hi4JPSOb+Sgn/BmPX35fn/6Fp9Mef8eMBCrL2siY5w4j49TA5Q+bxPpri1Q== + version "3.19.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.19.0.tgz#fe8d0cd86a0e68372b75c0c44a0cb887201c3f7d" + integrity sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1"