df6be35483bd9ab81c0f341be36fc7af09528a326f03f9b595dc0f0a85b5df8a1ae29cb3f97f3dd64e8cbef3486f3797be52b91063cbb945416659cecfbdc8 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = removeTypeDuplicates;
  6. var _index = require("../../validators/generated/index.js");
  7. function getQualifiedName(node) {
  8. return (0, _index.isIdentifier)(node) ? node.name : (0, _index.isThisExpression)(node) ? "this" : `${node.right.name}.${getQualifiedName(node.left)}`;
  9. }
  10. function removeTypeDuplicates(nodesIn) {
  11. const nodes = Array.from(nodesIn);
  12. const generics = new Map();
  13. const bases = new Map();
  14. const typeGroups = new Set();
  15. const types = [];
  16. for (let i = 0; i < nodes.length; i++) {
  17. const node = nodes[i];
  18. if (!node) continue;
  19. if (types.includes(node)) {
  20. continue;
  21. }
  22. if ((0, _index.isTSAnyKeyword)(node)) {
  23. return [node];
  24. }
  25. if ((0, _index.isTSBaseType)(node)) {
  26. bases.set(node.type, node);
  27. continue;
  28. }
  29. if ((0, _index.isTSUnionType)(node)) {
  30. if (!typeGroups.has(node.types)) {
  31. nodes.push(...node.types);
  32. typeGroups.add(node.types);
  33. }
  34. continue;
  35. }
  36. const typeArgumentsKey = "typeParameters";
  37. if ((0, _index.isTSTypeReference)(node) && node[typeArgumentsKey]) {
  38. const typeArguments = node[typeArgumentsKey];
  39. const name = getQualifiedName(node.typeName);
  40. if (generics.has(name)) {
  41. let existing = generics.get(name);
  42. const existingTypeArguments = existing[typeArgumentsKey];
  43. if (existingTypeArguments) {
  44. existingTypeArguments.params.push(...typeArguments.params);
  45. existingTypeArguments.params = removeTypeDuplicates(existingTypeArguments.params);
  46. } else {
  47. existing = typeArguments;
  48. }
  49. } else {
  50. generics.set(name, node);
  51. }
  52. continue;
  53. }
  54. types.push(node);
  55. }
  56. for (const [, baseType] of bases) {
  57. types.push(baseType);
  58. }
  59. for (const [, genericName] of generics) {
  60. types.push(genericName);
  61. }
  62. return types;
  63. }
  64. //# sourceMappingURL=removeTypeDuplicates.js.map