From eace095ea97e3d9e2dbeb46adac8a21f66e47ca5 Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 3 Jul 2021 02:09:04 +0800 Subject: [PATCH 1/3] fix(babel-types): add validator for TSLiteralType to accept UnaryExpression seems that the generated files is missing typings fix #13327 --- .../src/ast-types/generated/index.ts | 2 +- .../src/builders/generated/index.ts | 8 +-- .../babel-types/src/definitions/typescript.ts | 34 +++++++++--- .../__snapshots__/tsLiteralType.js.snap | 31 +++++++++++ .../test/builders/typescript/tsLiteralType.js | 52 +++++++++++++++++++ 5 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 packages/babel-types/test/builders/typescript/__snapshots__/tsLiteralType.js.snap create mode 100644 packages/babel-types/test/builders/typescript/tsLiteralType.js diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index 3c4cdb3c6dcf..aee180f10257 100755 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -1905,7 +1905,7 @@ export interface TSMappedType extends BaseNode { export interface TSLiteralType extends BaseNode { type: "TSLiteralType"; - literal: NumericLiteral | StringLiteral | BooleanLiteral | BigIntLiteral; + literal: any; } export interface TSExpressionWithTypeArguments extends BaseNode { diff --git a/packages/babel-types/src/builders/generated/index.ts b/packages/babel-types/src/builders/generated/index.ts index 34d63d3ff278..17312f3fbd15 100755 --- a/packages/babel-types/src/builders/generated/index.ts +++ b/packages/babel-types/src/builders/generated/index.ts @@ -1323,13 +1323,7 @@ export function tsMappedType( return builder("TSMappedType", ...arguments); } export { tsMappedType as tSMappedType }; -export function tsLiteralType( - literal: - | t.NumericLiteral - | t.StringLiteral - | t.BooleanLiteral - | t.BigIntLiteral, -): t.TSLiteralType { +export function tsLiteralType(literal: any): t.TSLiteralType { return builder("TSLiteralType", ...arguments); } export { tsLiteralType as tSLiteralType }; diff --git a/packages/babel-types/src/definitions/typescript.ts b/packages/babel-types/src/definitions/typescript.ts index 2cb997a440dd..7098d5d166ae 100644 --- a/packages/babel-types/src/definitions/typescript.ts +++ b/packages/babel-types/src/definitions/typescript.ts @@ -15,6 +15,7 @@ import { functionDeclarationCommon, classMethodOrDeclareMethodCommon, } from "./core"; +import is from "../validators/is"; const bool = assertValueType("boolean"); @@ -335,12 +336,33 @@ defineType("TSLiteralType", { aliases: ["TSType", "TSBaseType"], visitor: ["literal"], fields: { - literal: validateType([ - "NumericLiteral", - "StringLiteral", - "BooleanLiteral", - "BigIntLiteral", - ]), + literal: { + validate: (function () { + const unaryExpression = assertNodeType( + "NumericLiteral", + "BigIntLiteral", + ); + const unaryOperator = assertOneOf("-"); + + const literal = assertNodeType( + "NumericLiteral", + "StringLiteral", + "BooleanLiteral", + "BigIntLiteral", + ); + return function validator(parent, key: string, node) { + // type A = -1 | 1; + if (is("UnaryExpression", node)) { + // check operator first + unaryOperator(node, "operator", node.operator); + unaryExpression(node, "argument", node.argument); + } else { + // type A = 'foo' | 'bar' | false | 1; + literal(parent, key, node); + } + }; + })(), + }, }, }); diff --git a/packages/babel-types/test/builders/typescript/__snapshots__/tsLiteralType.js.snap b/packages/babel-types/test/builders/typescript/__snapshots__/tsLiteralType.js.snap new file mode 100644 index 000000000000..ed9a92b86e4c --- /dev/null +++ b/packages/babel-types/test/builders/typescript/__snapshots__/tsLiteralType.js.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`builders typescript tsLiteralType accept unary expression 1`] = ` +Object { + "literal": Object { + "argument": Object { + "type": "NumericLiteral", + "value": 1, + }, + "operator": "-", + "prefix": true, + "type": "UnaryExpression", + }, + "type": "TSLiteralType", +} +`; + +exports[`builders typescript tsLiteralType accept unary expression 2`] = ` +Object { + "literal": Object { + "argument": Object { + "type": "BigIntLiteral", + "value": "123456789", + }, + "operator": "-", + "prefix": true, + "type": "UnaryExpression", + }, + "type": "TSLiteralType", +} +`; diff --git a/packages/babel-types/test/builders/typescript/tsLiteralType.js b/packages/babel-types/test/builders/typescript/tsLiteralType.js new file mode 100644 index 000000000000..298b58563f06 --- /dev/null +++ b/packages/babel-types/test/builders/typescript/tsLiteralType.js @@ -0,0 +1,52 @@ +import * as t from "../../.."; + +describe("builders", function () { + describe("typescript", function () { + describe("tsLiteralType", function () { + it("accept unary expression", function () { + expect( + t.tsLiteralType(t.unaryExpression("-", t.numericLiteral(1))), + ).toMatchSnapshot(); + expect( + t.tsLiteralType(t.unaryExpression("-", t.bigIntLiteral("123456789"))), + ).toMatchSnapshot(); + }); + it("throws with non-numeric argument", function () { + expect(() => { + t.tsLiteralType(t.unaryExpression("-", t.stringLiteral(1))); + }).toThrow("Property value expected type of string but got number"); + expect(() => { + t.tsLiteralType(t.unaryExpression("-", t.objectExpression([]))); + }).toThrow( + 'Property argument of UnaryExpression expected node to be of a type ["NumericLiteral","BigIntLiteral"] but instead got "ObjectExpression"', + ); + }); + }); + it("throws with bad operator", function () { + expect(() => { + t.tsLiteralType(t.unaryExpression("+", t.numericLiteral(1))); + }).toThrow( + 'Property operator expected value to be one of ["-"] but got "+"', + ); + + // should check operator first since it appears first + expect(() => { + t.tsLiteralType(t.unaryExpression("+", t.objectExpression([]))); + }).toThrow( + 'Property operator expected value to be one of ["-"] but got "+"', + ); + + expect(() => { + t.tsLiteralType(t.unaryExpression("~", t.numericLiteral(1))); + }).toThrow( + 'Property operator expected value to be one of ["-"] but got "~"', + ); + + expect(() => { + t.tsLiteralType(t.unaryExpression("void", t.numericLiteral(1))); + }).toThrow( + 'Property operator expected value to be one of ["-"] but got "void"', + ); + }); + }); +}); From 61865de8a6787c93b7642b1f9662d30087c66aba Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 3 Jul 2021 02:50:11 +0800 Subject: [PATCH 2/3] fix(babel-types): add allowlist for TSLiteralType now generated types seems correct --- .../babel-types/src/ast-types/generated/index.ts | 7 ++++++- .../babel-types/src/builders/generated/index.ts | 9 ++++++++- packages/babel-types/src/definitions/typescript.ts | 14 ++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index aee180f10257..740cb3f09e8e 100755 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -1905,7 +1905,12 @@ export interface TSMappedType extends BaseNode { export interface TSLiteralType extends BaseNode { type: "TSLiteralType"; - literal: any; + literal: + | "NumericLiteral" + | "StringLiteral" + | "BooleanLiteral" + | "BigIntLiteral" + | "UnaryExpression"; } export interface TSExpressionWithTypeArguments extends BaseNode { diff --git a/packages/babel-types/src/builders/generated/index.ts b/packages/babel-types/src/builders/generated/index.ts index 17312f3fbd15..b4c5d3f181f8 100755 --- a/packages/babel-types/src/builders/generated/index.ts +++ b/packages/babel-types/src/builders/generated/index.ts @@ -1323,7 +1323,14 @@ export function tsMappedType( return builder("TSMappedType", ...arguments); } export { tsMappedType as tSMappedType }; -export function tsLiteralType(literal: any): t.TSLiteralType { +export function tsLiteralType( + literal: + | "NumericLiteral" + | "StringLiteral" + | "BooleanLiteral" + | "BigIntLiteral" + | "UnaryExpression", +): t.TSLiteralType { return builder("TSLiteralType", ...arguments); } export { tsLiteralType as tSLiteralType }; diff --git a/packages/babel-types/src/definitions/typescript.ts b/packages/babel-types/src/definitions/typescript.ts index 7098d5d166ae..3467e64442b8 100644 --- a/packages/babel-types/src/definitions/typescript.ts +++ b/packages/babel-types/src/definitions/typescript.ts @@ -350,7 +350,7 @@ defineType("TSLiteralType", { "BooleanLiteral", "BigIntLiteral", ); - return function validator(parent, key: string, node) { + function validator(parent, key: string, node) { // type A = -1 | 1; if (is("UnaryExpression", node)) { // check operator first @@ -360,7 +360,17 @@ defineType("TSLiteralType", { // type A = 'foo' | 'bar' | false | 1; literal(parent, key, node); } - }; + } + + validator.oneOf = [ + "NumericLiteral", + "StringLiteral", + "BooleanLiteral", + "BigIntLiteral", + "UnaryExpression", + ]; + + return validator; })(), }, }, From 9c5a67766dfbffdc51194a2543680efd12dfa679 Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 3 Jul 2021 03:51:30 +0800 Subject: [PATCH 3/3] fix(babel-types): use oneOfNodeTypes instead of oneOf --- packages/babel-types/src/ast-types/generated/index.ts | 10 +++++----- packages/babel-types/src/builders/generated/index.ts | 10 +++++----- packages/babel-types/src/definitions/typescript.ts | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index 740cb3f09e8e..531a113769ee 100755 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -1906,11 +1906,11 @@ export interface TSMappedType extends BaseNode { export interface TSLiteralType extends BaseNode { type: "TSLiteralType"; literal: - | "NumericLiteral" - | "StringLiteral" - | "BooleanLiteral" - | "BigIntLiteral" - | "UnaryExpression"; + | NumericLiteral + | StringLiteral + | BooleanLiteral + | BigIntLiteral + | UnaryExpression; } export interface TSExpressionWithTypeArguments extends BaseNode { diff --git a/packages/babel-types/src/builders/generated/index.ts b/packages/babel-types/src/builders/generated/index.ts index b4c5d3f181f8..658a503298ba 100755 --- a/packages/babel-types/src/builders/generated/index.ts +++ b/packages/babel-types/src/builders/generated/index.ts @@ -1325,11 +1325,11 @@ export function tsMappedType( export { tsMappedType as tSMappedType }; export function tsLiteralType( literal: - | "NumericLiteral" - | "StringLiteral" - | "BooleanLiteral" - | "BigIntLiteral" - | "UnaryExpression", + | t.NumericLiteral + | t.StringLiteral + | t.BooleanLiteral + | t.BigIntLiteral + | t.UnaryExpression, ): t.TSLiteralType { return builder("TSLiteralType", ...arguments); } diff --git a/packages/babel-types/src/definitions/typescript.ts b/packages/babel-types/src/definitions/typescript.ts index 3467e64442b8..7b4c34f44b60 100644 --- a/packages/babel-types/src/definitions/typescript.ts +++ b/packages/babel-types/src/definitions/typescript.ts @@ -362,7 +362,7 @@ defineType("TSLiteralType", { } } - validator.oneOf = [ + validator.oneOfNodeTypes = [ "NumericLiteral", "StringLiteral", "BooleanLiteral",