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 11c956aa8748..ca7b3e36e531 100644 --- a/packages/babel-helper-module-transforms/src/rewrite-live-references.ts +++ b/packages/babel-helper-module-transforms/src/rewrite-live-references.ts @@ -44,6 +44,25 @@ interface RewriteBindingInitVisitorState { scope: Scope; } +function isInType(path) { + do { + switch (path.parent.type) { + case "TSTypeAnnotation": + case "TSTypeAliasDeclaration": + case "TSTypeReference": + case "TypeAnnotation": + case "TypeAlias": + return true; + case "ExportSpecifier": + return path.parentPath.parent.exportKind === "type"; + default: + if (path.parentPath.isStatement() || path.parentPath.isExpression()) { + return false; + } + } + } while ((path = path.parentPath)); +} + export default function rewriteLiveReferences( programPath: NodePath, metadata: ModuleMetadata, @@ -224,6 +243,13 @@ const rewriteReferencesVisitor: Visitor = { const importData = imported.get(localName); if (importData) { + if (isInType(path)) { + throw path.buildCodeFrameError( + `Cannot transform the imported binding "${localName}" since it's also used in a type annotation. ` + + `Please strip type annotations using @babel/preset-typescript or @babel/preset-flow.`, + ); + } + const localBinding = path.scope.getBinding(localName); const rootBinding = scope.getBinding(localName); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/input.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/input.js new file mode 100644 index 000000000000..a2fc7f67c62b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/input.js @@ -0,0 +1,5 @@ +import A from "x"; + +export function fn(x: A.b[2]) { + return A.method(x); +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/options.json new file mode 100644 index 000000000000..f67526e40e72 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-deep/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-flow"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/input.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/input.js new file mode 100644 index 000000000000..8bc03f2248ae --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/input.js @@ -0,0 +1,3 @@ +import { A } from "x"; + +var x = ({} : A.b[0]); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/options.json new file mode 100644 index 000000000000..f67526e40e72 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin-type-cast/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-flow"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/input.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/input.js new file mode 100644 index 000000000000..2d646ec1b207 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/input.js @@ -0,0 +1,5 @@ +import A from "x"; + +export function fn(x: A) { + return A.method(x); +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/options.json new file mode 100644 index 000000000000..f67526e40e72 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-flow-plugin/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-flow"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/input.ts b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/input.ts new file mode 100644 index 000000000000..a2fc7f67c62b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/input.ts @@ -0,0 +1,5 @@ +import A from "x"; + +export function fn(x: A.b[2]) { + return A.method(x); +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/options.json new file mode 100644 index 000000000000..343fffdf6f9c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-deep/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-typescript"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/input.ts b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/input.ts new file mode 100644 index 000000000000..6bf00bc3a8b0 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/input.ts @@ -0,0 +1,3 @@ +import { A } from "x"; + +var x = {} as A.b[0]; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/options.json new file mode 100644 index 000000000000..343fffdf6f9c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion-legacy/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-typescript"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/input.ts b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/input.ts new file mode 100644 index 000000000000..f046a912385b --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/input.ts @@ -0,0 +1,3 @@ +import { A } from "x"; + +var x = {}; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/options.json new file mode 100644 index 000000000000..343fffdf6f9c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin-type-assertion/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-typescript"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/input.ts b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/input.ts new file mode 100644 index 000000000000..2d646ec1b207 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/input.ts @@ -0,0 +1,5 @@ +import A from "x"; + +export function fn(x: A) { + return A.method(x); +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/options.json new file mode 100644 index 000000000000..343fffdf6f9c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/integration/missing-ts-plugin/options.json @@ -0,0 +1,6 @@ +{ + "externalHelpers": true, + "sourceType": "module", + "plugins": ["transform-modules-commonjs", "syntax-typescript"], + "throws": "Cannot transform the imported binding \"A\" since it's also used in a type annotation. Please strip type annotations using @babel/preset-typescript or @babel/preset-flow." +}