diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.ts b/packages/babel-plugin-transform-modules-commonjs/src/index.ts index c142c2d2308f..e9a2c78ca52e 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.ts +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.ts @@ -235,6 +235,12 @@ export default declare((api, options) => { ensureStatementsHoisted(headers); path.unshiftContainer("body", headers); + path.get("body").forEach(path => { + if (headers.indexOf(path.node) === -1) return; + if (path.isVariableDeclaration()) { + path.scope.registerDeclaration(path); + } + }); }, }, }, diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/input.mjs new file mode 100644 index 000000000000..ace44542056c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/input.mjs @@ -0,0 +1,5 @@ +import {x} from './foo.js'; +var y = true; +function f() { +return [x, y, console]; +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/options.json new file mode 100644 index 000000000000..7b947d646e40 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "./plugin"] +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/output.js new file mode 100644 index 000000000000..d24d3affe0ca --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/output.js @@ -0,0 +1,15 @@ +"use strict"; + +var _foo = require("./foo.js"); + +var y = true; + +function f() { + return [ + /* _foo hasBinding, getBinding */ + _foo.x, + /* y hasBinding, getBinding */ + y, + /* console no hasBinding, no getBinding */ + console]; +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/plugin.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/plugin.js new file mode 100644 index 000000000000..ba7004c59aba --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/binding-for-new-vars/plugin.js @@ -0,0 +1,29 @@ +module.exports = function () { + return { + visitor: { + Program: { + exit(programPath) { + // Sub-traversal to ensure runs after ESM->CJS transform + programPath.traverse({ + ReferencedIdentifier(path) { + if (!path.findParent(p => p.isFunction())) return; + const varName = path.node.name; + path.addComment( + "leading", + ` ${varName} ${ + path.scope.hasBinding(varName) + ? "hasBinding" + : "no hasBinding" + }, ${ + path.scope.getBinding(varName) + ? "getBinding" + : "no getBinding" + } ` + ); + }, + }); + }, + }, + }, + }; +};