diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/input.ts new file mode 100644 index 000000000000..7b98a49c249e --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/input.ts @@ -0,0 +1,4 @@ +import type {Foo} from 'foo'; +import {type Foo2} from 'foo'; +function Foo(){} +function Foo2(){} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/output.mjs new file mode 100644 index 000000000000..03d5d824f21d --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import-type-func-with-duplicate-name/output.mjs @@ -0,0 +1,3 @@ +function Foo() {} +function Foo2() {} +export {}; diff --git a/packages/babel-traverse/src/scope/index.ts b/packages/babel-traverse/src/scope/index.ts index 3e96bccd3801..ac957a3f1cdb 100644 --- a/packages/babel-traverse/src/scope/index.ts +++ b/packages/babel-traverse/src/scope/index.ts @@ -733,9 +733,17 @@ export default class Scope { if (path.node.declare) return; this.registerBinding("let", path); } else if (path.isImportDeclaration()) { + const isTypeDeclaration = + path.node.importKind === "type" || path.node.importKind === "typeof"; const specifiers = path.get("specifiers"); for (const specifier of specifiers) { - this.registerBinding("module", specifier); + const isTypeSpecifier = + isTypeDeclaration || + (specifier.isImportSpecifier() && + (specifier.node.importKind === "type" || + specifier.node.importKind === "typeof")); + + this.registerBinding(isTypeSpecifier ? "unknown" : "module", specifier); } } else if (path.isExportDeclaration()) { // todo: improve babel-types diff --git a/packages/babel-traverse/test/scope.js b/packages/babel-traverse/test/scope.js index 0404d05cc6c8..db12f7924da1 100644 --- a/packages/babel-traverse/test/scope.js +++ b/packages/babel-traverse/test/scope.js @@ -386,6 +386,23 @@ describe("scope", () => { ).toBe("ImportSpecifier"); }); + it("import type and func with duplicate name", function () { + expect(() => { + getPath( + ` + import type {Foo} from 'foo'; + import {type Foo2} from 'foo'; + function Foo(){} + function Foo2(){} + `, + { + plugins: ["typescript"], + sourceType: "module", + }, + ); + }).not.toThrow(); + }); + it("variable constantness", function () { expect(getPath("var a = 1;").scope.getBinding("a").constant).toBe(true); expect(getPath("var a = 1; a = 2;").scope.getBinding("a").constant).toBe(