/* */ "format cjs"; "use strict"; exports.__esModule = true; exports.createUnionTypeAnnotation = createUnionTypeAnnotation; exports.removeTypeDuplicates = removeTypeDuplicates; exports.createTypeAnnotationBasedOnTypeof = createTypeAnnotationBasedOnTypeof; // istanbul ignore next function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } } var _index = require("./index"); var t = _interopRequireWildcard(_index); /** * Takes an array of `types` and flattens them, removing duplicates and * returns a `UnionTypeAnnotation` node containg them. */ function createUnionTypeAnnotation(types) { var flattened = removeTypeDuplicates(types); if (flattened.length === 1) { return flattened[0]; } else { return t.unionTypeAnnotation(flattened); } } /** * Dedupe type annotations. */ function removeTypeDuplicates(nodes) { var generics = {}; var bases = {}; // store union type groups to circular references var typeGroups = []; var types = []; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; if (!node) continue; // detect duplicates if (types.indexOf(node) >= 0) { continue; } // this type matches anything if (t.isAnyTypeAnnotation(node)) { return [node]; } // if (t.isFlowBaseAnnotation(node)) { bases[node.type] = node; continue; } // if (t.isUnionTypeAnnotation(node)) { if (typeGroups.indexOf(node.types) < 0) { nodes = nodes.concat(node.types); typeGroups.push(node.types); } continue; } // find a matching generic type and merge and deduplicate the type parameters if (t.isGenericTypeAnnotation(node)) { var _name = node.id.name; if (generics[_name]) { var existing = generics[_name]; if (existing.typeParameters) { if (node.typeParameters) { existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params.concat(node.typeParameters.params)); } } else { existing = node.typeParameters; } } else { generics[_name] = node; } continue; } types.push(node); } // add back in bases for (var type in bases) { types.push(bases[type]); } // add back in generics for (var _name2 in generics) { types.push(generics[_name2]); } return types; } /** * Create a type anotation based on typeof expression. */ function createTypeAnnotationBasedOnTypeof(type) { if (type === "string") { return t.stringTypeAnnotation(); } else if (type === "number") { return t.numberTypeAnnotation(); } else if (type === "undefined") { return t.voidTypeAnnotation(); } else if (type === "boolean") { return t.booleanTypeAnnotation(); } else if (type === "function") { return t.genericTypeAnnotation(t.identifier("Function")); } else if (type === "object") { return t.genericTypeAnnotation(t.identifier("Object")); } else if (type === "symbol") { return t.genericTypeAnnotation(t.identifier("Symbol")); } else { throw new Error("Invalid typeof value"); } }