From 41b3cca76763d2f3b203cddd5b69d5e9ca469df7 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Mon, 20 Apr 2020 20:31:44 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=94=84=20createUnionTypeAnnotation=20?= =?UTF-8?q?=3D>=20createFlowUnionType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/builders/flow/createFlowUnionType.js | 17 +++++++++++++++++ .../builders/flow/createUnionTypeAnnotation.js | 14 +++++--------- packages/babel-types/src/index.js | 1 + 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 packages/babel-types/src/builders/flow/createFlowUnionType.js diff --git a/packages/babel-types/src/builders/flow/createFlowUnionType.js b/packages/babel-types/src/builders/flow/createFlowUnionType.js new file mode 100644 index 000000000000..30a6f08771d7 --- /dev/null +++ b/packages/babel-types/src/builders/flow/createFlowUnionType.js @@ -0,0 +1,17 @@ +// @flow +import { unionTypeAnnotation } from "../generated"; +import removeTypeDuplicates from "../../modifications/flow/removeTypeDuplicates"; + +/** + * Takes an array of `types` and flattens them, removing duplicates and + * returns a `UnionTypeAnnotation` node containg them. + */ +export default function createFlowUnionType(types: Array): Object { + const flattened = removeTypeDuplicates(types); + + if (flattened.length === 1) { + return flattened[0]; + } else { + return unionTypeAnnotation(flattened); + } +} diff --git a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js b/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js index 4b181dab0c2b..0399baa70ef5 100644 --- a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js +++ b/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js @@ -1,19 +1,15 @@ // @flow -import { unionTypeAnnotation } from "../generated"; -import removeTypeDuplicates from "../../modifications/flow/removeTypeDuplicates"; +import createFlowUnionType from "./createFlowUnionType"; /** * Takes an array of `types` and flattens them, removing duplicates and * returns a `UnionTypeAnnotation` node containg them. + * + * @deprecated use `createFlowUnionType` + * @see {createFlowUnionType} */ export default function createUnionTypeAnnotation( types: Array, ): Object { - const flattened = removeTypeDuplicates(types); - - if (flattened.length === 1) { - return flattened[0]; - } else { - return unionTypeAnnotation(flattened); - } + return createFlowUnionType(types); } diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index a2126a1fe81c..9d8e551f139c 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -10,6 +10,7 @@ export * from "./asserts/generated"; // builders export { default as createTypeAnnotationBasedOnTypeof } from "./builders/flow/createTypeAnnotationBasedOnTypeof"; export { default as createUnionTypeAnnotation } from "./builders/flow/createUnionTypeAnnotation"; +export { default as createFlowUnionType } from "./builders/flow/createFlowUnionType"; export { default as createTSUnionType } from "./builders/typescript/createTSUnionType"; export * from "./builders/generated"; From 0cb95a3b79b5971757e745e5ba8a4aae881940dc Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Mon, 20 Apr 2020 20:31:55 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9E=95=20add=20createFlowUnionType=20if?= =?UTF-8?q?=20it=20exists=20(in=20new=20versions=20only=20=E2=9A=A0?= =?UTF-8?q?=EF=B8=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/path/inference/inferer-reference.js | 11 +++++++++++ .../babel-traverse/src/path/inference/inferers.js | 8 ++++++++ packages/babel-types/scripts/generators/flow.js | 2 ++ packages/babel-types/scripts/generators/typescript.js | 2 ++ 4 files changed, 23 insertions(+) diff --git a/packages/babel-traverse/src/path/inference/inferer-reference.js b/packages/babel-traverse/src/path/inference/inferer-reference.js index 94505566e684..54e6a8b98108 100644 --- a/packages/babel-traverse/src/path/inference/inferer-reference.js +++ b/packages/babel-traverse/src/path/inference/inferer-reference.js @@ -99,6 +99,10 @@ function getTypeAnnotationBindingConstantViolations(binding, path, name) { return t.createTSUnionType(types); } + if (t.createFlowUnionType) { + return t.createFlowUnionType(types); + } + return t.createUnionTypeAnnotation(types); } @@ -214,6 +218,13 @@ function getConditionalAnnotation(binding, path, name) { }; } + if (t.createFlowUnionType) { + return { + typeAnnotation: t.createFlowUnionType(types), + ifStatement, + }; + } + return { typeAnnotation: t.createUnionTypeAnnotation(types), ifStatement, diff --git a/packages/babel-traverse/src/path/inference/inferers.js b/packages/babel-traverse/src/path/inference/inferers.js index 876516725557..fd9e97bafcf8 100644 --- a/packages/babel-traverse/src/path/inference/inferers.js +++ b/packages/babel-traverse/src/path/inference/inferers.js @@ -92,6 +92,10 @@ export function LogicalExpression() { return t.createTSUnionType(argumentTypes); } + if (t.createFlowUnionType) { + return t.createFlowUnionType(argumentTypes); + } + return t.createUnionTypeAnnotation(argumentTypes); } @@ -105,6 +109,10 @@ export function ConditionalExpression() { return t.createTSUnionType(argumentTypes); } + if (t.createFlowUnionType) { + return t.createFlowUnionType(argumentTypes); + } + return t.createUnionTypeAnnotation(argumentTypes); } diff --git a/packages/babel-types/scripts/generators/flow.js b/packages/babel-types/scripts/generators/flow.js index ec664e7fe4df..58c1a1614aa1 100644 --- a/packages/babel-types/scripts/generators/flow.js +++ b/packages/babel-types/scripts/generators/flow.js @@ -128,6 +128,8 @@ lines.push( `declare function createTypeAnnotationBasedOnTypeof(type: 'string' | 'number' | 'undefined' | 'boolean' | 'function' | 'object' | 'symbol'): ${NODE_PREFIX}TypeAnnotation`, // eslint-disable-next-line max-len `declare function createUnionTypeAnnotation(types: Array<${NODE_PREFIX}FlowType>): ${NODE_PREFIX}UnionTypeAnnotation`, + // eslint-disable-next-line max-len + `declare function createFlowUnionType(types: Array<${NODE_PREFIX}FlowType>): ${NODE_PREFIX}UnionTypeAnnotation`, // this smells like "internal API" // eslint-disable-next-line max-len `declare function buildChildren(node: { children: Array<${NODE_PREFIX}JSXText | ${NODE_PREFIX}JSXExpressionContainer | ${NODE_PREFIX}JSXSpreadChild | ${NODE_PREFIX}JSXElement | ${NODE_PREFIX}JSXFragment | ${NODE_PREFIX}JSXEmptyExpression> }): Array<${NODE_PREFIX}JSXText | ${NODE_PREFIX}JSXExpressionContainer | ${NODE_PREFIX}JSXSpreadChild | ${NODE_PREFIX}JSXElement | ${NODE_PREFIX}JSXFragment>`, diff --git a/packages/babel-types/scripts/generators/typescript.js b/packages/babel-types/scripts/generators/typescript.js index 298e22e9eea0..ef460a73456e 100644 --- a/packages/babel-types/scripts/generators/typescript.js +++ b/packages/babel-types/scripts/generators/typescript.js @@ -144,9 +144,11 @@ lines.push( // eslint-disable-next-line max-len `export function createTypeAnnotationBasedOnTypeof(type: 'string' | 'number' | 'undefined' | 'boolean' | 'function' | 'object' | 'symbol'): StringTypeAnnotation | VoidTypeAnnotation | NumberTypeAnnotation | BooleanTypeAnnotation | GenericTypeAnnotation`, `export function createUnionTypeAnnotation(types: [T]): T`, + `export function createFlowUnionType(types: [T]): T`, // this probably misbehaves if there are 0 elements, and it's not a UnionTypeAnnotation if there's only 1 // it is possible to require "2 or more" for this overload ([T, T, ...T[]]) but it requires typescript 3.0 `export function createUnionTypeAnnotation(types: ReadonlyArray): UnionTypeAnnotation`, + `export function createFlowUnionType(types: ReadonlyArray): UnionTypeAnnotation`, // this smells like "internal API" // eslint-disable-next-line max-len `export function buildChildren(node: { children: ReadonlyArray }): JSXElement['children']`, From da528d103bf6c00ca64a1139510beebb628d3d5b Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Tue, 21 Apr 2020 01:30:56 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=94=84=20use=20createFlowUnionType=20?= =?UTF-8?q?for=20createUnionTypeAnnotation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builders/flow/createUnionTypeAnnotation.js | 15 --------------- packages/babel-types/src/index.js | 2 +- 2 files changed, 1 insertion(+), 16 deletions(-) delete mode 100644 packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js diff --git a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js b/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js deleted file mode 100644 index 0399baa70ef5..000000000000 --- a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js +++ /dev/null @@ -1,15 +0,0 @@ -// @flow -import createFlowUnionType from "./createFlowUnionType"; - -/** - * Takes an array of `types` and flattens them, removing duplicates and - * returns a `UnionTypeAnnotation` node containg them. - * - * @deprecated use `createFlowUnionType` - * @see {createFlowUnionType} - */ -export default function createUnionTypeAnnotation( - types: Array, -): Object { - return createFlowUnionType(types); -} diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index 9d8e551f139c..7239401fd68f 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -9,7 +9,7 @@ export * from "./asserts/generated"; // builders export { default as createTypeAnnotationBasedOnTypeof } from "./builders/flow/createTypeAnnotationBasedOnTypeof"; -export { default as createUnionTypeAnnotation } from "./builders/flow/createUnionTypeAnnotation"; +export { default as createUnionTypeAnnotation } from "./builders/flow/createFlowUnionType"; export { default as createFlowUnionType } from "./builders/flow/createFlowUnionType"; export { default as createTSUnionType } from "./builders/typescript/createTSUnionType"; export * from "./builders/generated";