From d72f3aa7585cfb41c05a7aeb4714b86913a2d749 Mon Sep 17 00:00:00 2001 From: Evan Henley Date: Thu, 28 Feb 2019 15:03:12 -0600 Subject: [PATCH] [plugin-transform-typescript] Strip type imports used in Enums and object types (#9605) * fix: strip type imports used in Enums and object types * chore: update failing snapshot * docs: correct TSPropertySignature comment * fix: enum value should be considered a reference * chore: add tests for TSPropertySignature and TSEnumMember --- .../parameters/iife-this-9385/output.js | 6 +-- .../test/fixtures/imports/enum-id/input.mjs | 2 + .../test/fixtures/imports/enum-id/output.mjs | 7 +++ .../fixtures/imports/enum-value/input.mjs | 2 + .../fixtures/imports/enum-value/output.mjs | 8 ++++ .../imports/property-signature/input.mjs | 2 + .../imports/property-signature/output.mjs | 3 ++ .../src/validators/isReferenced.js | 14 ++++++ packages/babel-types/test/validators.js | 46 ++++++++++++++++++- 9 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/input.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/output.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/input.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/output.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/input.mjs create mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/output.mjs diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/iife-this-9385/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/iife-this-9385/output.js index 0268eef274..5e502c2384 100644 --- a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/iife-this-9385/output.js +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/iife-this-9385/output.js @@ -22,10 +22,8 @@ function () { key: "invite", value: function invite() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return function () { - var privacy = options.privacy || "Private"; - console.log(this); - }.apply(this); + var privacy = options.privacy || "Private"; + console.log(this); } }]); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/input.mjs new file mode 100644 index 0000000000..f46a82c360 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/input.mjs @@ -0,0 +1,2 @@ +import { A } from 'lib' +enum Enum { A }; \ No newline at end of file diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/output.mjs new file mode 100644 index 0000000000..628c6ba0ff --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-id/output.mjs @@ -0,0 +1,7 @@ +var Enum; + +(function (Enum) { + Enum[Enum["A"] = 0] = "A"; +})(Enum || (Enum = {})); + +; diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/input.mjs new file mode 100644 index 0000000000..727760d0ed --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/input.mjs @@ -0,0 +1,2 @@ +import { A } from 'lib' +enum Enum { id = A }; \ No newline at end of file diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/output.mjs new file mode 100644 index 0000000000..88a2cffb83 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/enum-value/output.mjs @@ -0,0 +1,8 @@ +import { A } from 'lib'; +var Enum; + +(function (Enum) { + Enum[Enum["id"] = A] = "id"; +})(Enum || (Enum = {})); + +; diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/input.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/input.mjs new file mode 100644 index 0000000000..7e24284647 --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/input.mjs @@ -0,0 +1,2 @@ +import { A } from 'lib' +const obj: { A: A } = { A: 'foo' }; \ No newline at end of file diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/output.mjs b/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/output.mjs new file mode 100644 index 0000000000..cba06b741a --- /dev/null +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/property-signature/output.mjs @@ -0,0 +1,3 @@ +const obj = { + A: 'foo' +}; diff --git a/packages/babel-types/src/validators/isReferenced.js b/packages/babel-types/src/validators/isReferenced.js index 6a5a3ebc8e..f83c7956c4 100644 --- a/packages/babel-types/src/validators/isReferenced.js +++ b/packages/babel-types/src/validators/isReferenced.js @@ -134,6 +134,20 @@ export default function isReferenced( // no: type X = { NODE: OtherType } case "ObjectTypeProperty": return parent.key !== node; + + // yes: enum X { Foo = NODE } + // no: enum X { NODE } + case "TSEnumMember": + return parent.id !== node; + + // yes: { [NODE]: value } + // no: { NODE: value } + case "TSPropertySignature": + if (parent.key === node) { + return !!parent.computed; + } + + return true; } return true; diff --git a/packages/babel-types/test/validators.js b/packages/babel-types/test/validators.js index 8e1f18e115..3b4ec0d933 100644 --- a/packages/babel-types/test/validators.js +++ b/packages/babel-types/test/validators.js @@ -122,7 +122,7 @@ describe("validators", function() { expect(t.isReferenced(node, parent)).toBe(true); }); - it("returns true if node id a value of ObjectProperty of an expression", function() { + it("returns true if node is a value of ObjectProperty of an expression", function() { const node = t.identifier("a"); const parent = t.objectProperty(t.identifier("key"), node); const grandparent = t.objectExpression([parent]); @@ -130,13 +130,55 @@ describe("validators", function() { expect(t.isReferenced(node, parent, grandparent)).toBe(true); }); - it("returns false if node id a value of ObjectProperty of a pattern", function() { + it("returns false if node is a value of ObjectProperty of a pattern", function() { const node = t.identifier("a"); const parent = t.objectProperty(t.identifier("key"), node); const grandparent = t.objectPattern([parent]); expect(t.isReferenced(node, parent, grandparent)).toBe(false); }); + + describe("TSPropertySignature", function() { + it("returns false if node is a key", function() { + // { A: string } + const node = t.identifier("A"); + const parent = t.tsPropertySignature( + node, + t.tsTypeAnnotation(t.tsStringKeyword()), + ); + + expect(t.isReferenced(node, parent)).toBe(false); + }); + + it("returns true if node is a value", function() { + // { someKey: A } + const node = t.identifier("A"); + const parent = t.tsPropertySignature( + t.identifier("someKey"), + t.tsTypeAnnotation(t.tsTypeReference(node)), + ); + + expect(t.isReferenced(node, parent)).toBe(true); + }); + }); + + describe("TSEnumMember", function() { + it("returns false if node is an id", function() { + // enum X = { A }; + const node = t.identifier("A"); + const parent = t.tsEnumMember(node); + + expect(t.isReferenced(node, parent)).toBe(false); + }); + + it("returns true if node is a value", function() { + // enum X = { Foo = A } + const node = t.identifier("A"); + const parent = t.tsEnumMember(t.identifier("Foo"), node); + + expect(t.isReferenced(node, parent)).toBe(true); + }); + }); }); describe("isBinding", function() {