From a66acdc81e2d9124549fd6132ea3ad484c663293 Mon Sep 17 00:00:00 2001 From: Alexander Akait <4567934+alexander-akait@users.noreply.github.com> Date: Wed, 14 May 2025 17:28:01 +0300 Subject: [PATCH] fix: destructuring namespace import with default (#19526) --- lib/javascript/JavascriptParser.js | 11 ++++- .../destructuring-namespace-import/index.js | 41 +++++++++++++++++++ .../destructuring-namespace-import/module.js | 1 + .../webpack.config.js | 6 +++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 test/configCases/parsing/destructuring-namespace-import/index.js create mode 100644 test/configCases/parsing/destructuring-namespace-import/module.js create mode 100644 test/configCases/parsing/destructuring-namespace-import/webpack.config.js diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index 060244fed..2d41cd984 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -2852,8 +2852,15 @@ class JavascriptParser extends Parser { for (let i = 0; i < properties.length; i++) { const property = properties[i]; if (property.type !== "Property") return; - if (property.shorthand && property.value.type === "Identifier") { - this.scope.inShorthand = property.value.name; + if (property.shorthand) { + if (property.value.type === "Identifier") { + this.scope.inShorthand = property.value.name; + } else if ( + property.value.type === "AssignmentPattern" && + property.value.left.type === "Identifier" + ) { + this.scope.inShorthand = property.value.left.name; + } } const key = property.key; if (key.type === "Identifier") { diff --git a/test/configCases/parsing/destructuring-namespace-import/index.js b/test/configCases/parsing/destructuring-namespace-import/index.js new file mode 100644 index 000000000..159132b85 --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/index.js @@ -0,0 +1,41 @@ +import * as namespace from "./module.js"; + +it("should work with destructuring", function() { + { + const { foo } = namespace; + expect(foo).toBe("bar"); + } + + { + let foo; + ({ foo } = namespace); + expect(foo).toBe("bar"); + } + + { + let foo; + ({ foo = 'foo' } = namespace); + expect(foo).toBe("bar"); + } + + { + const { foo = 'foo' } = namespace; + expect(foo).toBe("bar"); + } + + { + const strings = []; + ({ foo : strings[0] } = namespace); + expect(strings[0]).toBe("bar"); + } + + { + const { foo: otherFoo = 'foo' } = namespace; + expect(otherFoo).toBe("bar"); + } + + { + const { bar = 'foo' } = namespace; + expect(bar).toBe("foo"); + } +}); diff --git a/test/configCases/parsing/destructuring-namespace-import/module.js b/test/configCases/parsing/destructuring-namespace-import/module.js new file mode 100644 index 000000000..c155820bf --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/module.js @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/test/configCases/parsing/destructuring-namespace-import/webpack.config.js b/test/configCases/parsing/destructuring-namespace-import/webpack.config.js new file mode 100644 index 000000000..c939ba33f --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +};