From 7cdc9ef29c61dc1ccf57d3c1b52e157147fb725b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 29 Jun 2022 11:10:12 +0200 Subject: [PATCH 1/2] Add failing test --- .../input.mjs | 0 .../options.json | 0 .../output.js | 0 .../local-exports-decl-with-esm-exports/input.mjs | 8 ++++++++ .../options.json | 3 +++ .../local-exports-decl-with-esm-exports/output.js | 14 ++++++++++++++ 6 files changed, 25 insertions(+) rename packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/{local-exports-decl => local-exports-decl-top-level}/input.mjs (100%) rename packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/{local-exports-decl => local-exports-decl-top-level}/options.json (100%) rename packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/{local-exports-decl => local-exports-decl-top-level}/output.js (100%) create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/options.json create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/input.mjs similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/input.mjs diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/options.json similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/options.json rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/options.json diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/output.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl/output.js rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-top-level/output.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/input.mjs new file mode 100644 index 000000000000..7fda6399e034 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/input.mjs @@ -0,0 +1,8 @@ +var exports = 1; + +export let x = 2; + +function fn() { + x = 3; + var exports = 4; +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/options.json new file mode 100644 index 000000000000..81e5ce12436d --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-modules-commonjs"] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js new file mode 100644 index 000000000000..189089d52251 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js @@ -0,0 +1,14 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.x = void 0; +var _exports = 1; +let x = 2; +exports.x = x; + +function fn() { + exports.x = x = 3; + var exports = 4; +} From 5f96779abccd76049d058638730116d7a334923d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 29 Jun 2022 11:23:02 +0200 Subject: [PATCH 2/2] Unshadow `cjs` exports when transforming mutations --- .../src/rewrite-live-references.ts | 19 ++++++++++++++++++- .../output.js | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/babel-helper-module-transforms/src/rewrite-live-references.ts b/packages/babel-helper-module-transforms/src/rewrite-live-references.ts index 33c7eb3af37b..c4ee70934efb 100644 --- a/packages/babel-helper-module-transforms/src/rewrite-live-references.ts +++ b/packages/babel-helper-module-transforms/src/rewrite-live-references.ts @@ -183,6 +183,7 @@ const rewriteBindingInitVisitor: Visitor = { metadata, exportNames, identifier(localName), + path.scope, ), ); // @ts-expect-error todo(flow->ts): avoid mutations @@ -203,6 +204,7 @@ const rewriteBindingInitVisitor: Visitor = { metadata, exportNames, identifier(localName), + path.scope, ), ); // @ts-expect-error todo(flow->ts): avoid mutations @@ -218,7 +220,18 @@ const buildBindingExportAssignmentExpression = ( metadata: ModuleMetadata, exportNames: string[], localExpr: t.Expression, + scope: Scope, ) => { + const exportsObjectName = metadata.exportName; + for ( + let currentScope = scope; + currentScope != null; + currentScope = currentScope.parent + ) { + if (currentScope.hasOwnBinding(exportsObjectName)) { + currentScope.rename(exportsObjectName); + } + } return (exportNames || []).reduce((expr, exportName) => { // class Foo {} export { Foo, Foo as Bar }; // as @@ -228,7 +241,7 @@ const buildBindingExportAssignmentExpression = ( return assignmentExpression( "=", memberExpression( - identifier(metadata.exportName), + identifier(exportsObjectName), computed ? stringLiteral(exportName) : identifier(exportName), /* computed */ computed, ), @@ -352,6 +365,7 @@ const rewriteReferencesVisitor: Visitor = { this.metadata, exportedNames, cloneNode(update), + path.scope, ), ); } else { @@ -366,6 +380,7 @@ const rewriteReferencesVisitor: Visitor = { this.metadata, exportedNames, identifier(localName), + path.scope, ), cloneNode(ref), ]), @@ -428,6 +443,7 @@ const rewriteReferencesVisitor: Visitor = { this.metadata, exportedNames, assignment, + path.scope, ), ); requeueInParent(path); @@ -458,6 +474,7 @@ const rewriteReferencesVisitor: Visitor = { this.metadata, exportedNames, identifier(localName), + path.scope, ), ); } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js index 189089d52251..c7d305fd0cf5 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/local-exports-decl-with-esm-exports/output.js @@ -10,5 +10,5 @@ exports.x = x; function fn() { exports.x = x = 3; - var exports = 4; + var _exports2 = 4; }