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/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..c7d305fd0cf5 --- /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 _exports2 = 4; +}