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']`, diff --git a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js b/packages/babel-types/src/builders/flow/createFlowUnionType.js similarity index 85% rename from packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js rename to packages/babel-types/src/builders/flow/createFlowUnionType.js index 4b181dab0c2b..30a6f08771d7 100644 --- a/packages/babel-types/src/builders/flow/createUnionTypeAnnotation.js +++ b/packages/babel-types/src/builders/flow/createFlowUnionType.js @@ -6,9 +6,7 @@ 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 createUnionTypeAnnotation( - types: Array, -): Object { +export default function createFlowUnionType(types: Array): Object { const flattened = removeTypeDuplicates(types); if (flattened.length === 1) { diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index a2126a1fe81c..7239401fd68f 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -9,7 +9,8 @@ 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";