ts2famix 1.4.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +30 -61
  3. package/dist/analyze.js +4 -2
  4. package/dist/analyze_functions/process_functions.js +285 -131
  5. package/dist/famix_functions/EntityDictionary.js +864 -231
  6. package/dist/famix_functions/helpers_creation.js +61 -10
  7. package/dist/fqn.js +160 -111
  8. package/dist/lib/famix/famix_JSON_exporter.js +55 -0
  9. package/dist/lib/famix/famix_base_element.js +18 -0
  10. package/dist/lib/famix/famix_repository.js +224 -0
  11. package/dist/lib/famix/{src/index.js → index.js} +1 -0
  12. package/dist/lib/famix/model/famix/access.js +40 -0
  13. package/dist/lib/famix/model/famix/accessor.js +17 -0
  14. package/dist/lib/famix/model/famix/alias.js +33 -0
  15. package/dist/lib/famix/model/famix/arrow_function.js +17 -0
  16. package/dist/lib/famix/model/famix/behavioral_entity.js +79 -0
  17. package/dist/lib/famix/model/famix/class.js +71 -0
  18. package/dist/lib/famix/model/famix/comment.js +39 -0
  19. package/dist/lib/famix/model/famix/concretisation.js +31 -0
  20. package/dist/lib/famix/model/famix/container_entity.js +126 -0
  21. package/dist/lib/famix/model/famix/decorator.js +32 -0
  22. package/dist/lib/famix/model/famix/entity.js +17 -0
  23. package/dist/lib/famix/model/famix/enum.js +31 -0
  24. package/dist/lib/famix/model/famix/enum_value.js +25 -0
  25. package/dist/lib/famix/model/famix/function.js +17 -0
  26. package/dist/lib/famix/model/famix/import_clause.js +41 -0
  27. package/dist/lib/famix/model/famix/index.js +86 -0
  28. package/dist/lib/famix/model/famix/indexed_file_anchor.js +38 -0
  29. package/dist/lib/famix/model/famix/inheritance.js +33 -0
  30. package/dist/lib/famix/model/famix/interface.js +64 -0
  31. package/dist/lib/famix/model/famix/invocation.js +54 -0
  32. package/dist/lib/famix/model/famix/method.js +67 -0
  33. package/dist/lib/famix/model/famix/module.js +60 -0
  34. package/dist/lib/famix/model/famix/named_entity.js +78 -0
  35. package/dist/lib/famix/model/famix/parameter.js +25 -0
  36. package/dist/lib/famix/model/famix/parameter_concretisation.js +44 -0
  37. package/dist/lib/famix/model/famix/parameter_type.js +45 -0
  38. package/dist/lib/famix/model/famix/parametric_arrow_function.js +31 -0
  39. package/dist/lib/famix/model/famix/parametric_class.js +44 -0
  40. package/dist/lib/famix/model/famix/parametric_function.js +31 -0
  41. package/dist/lib/famix/model/famix/parametric_interface.js +44 -0
  42. package/dist/lib/famix/model/famix/parametric_method.js +31 -0
  43. package/dist/lib/famix/model/famix/primitive_type.js +17 -0
  44. package/dist/lib/famix/model/famix/property.js +73 -0
  45. package/dist/lib/famix/model/famix/reference.js +33 -0
  46. package/dist/lib/famix/model/famix/scoping_entity.js +36 -0
  47. package/dist/lib/famix/model/famix/script_entity.js +29 -0
  48. package/dist/lib/famix/model/famix/source_anchor.js +27 -0
  49. package/dist/lib/famix/model/famix/source_language.js +35 -0
  50. package/dist/lib/famix/model/famix/sourced_entity.js +60 -0
  51. package/dist/lib/famix/model/famix/structural_entity.js +39 -0
  52. package/dist/lib/famix/model/famix/type.js +73 -0
  53. package/dist/lib/famix/model/famix/variable.js +24 -0
  54. package/dist/lib/ts-complex/cyclomatic-service.js +3 -3
  55. package/dist/refactorer/refactor-getter-setter.js +142 -0
  56. package/dist/ts2famix-cli-wrapper.js +42 -0
  57. package/dist/ts2famix-cli.js +8 -1
  58. package/dist/ts2famix-tsconfig.js +1 -0
  59. package/doc-uml/famix-typescript-model.puml +608 -0
  60. package/doc-uml/famix-typescript-model.svg +1 -0
  61. package/jest.config.json +2 -1
  62. package/package.json +13 -12
  63. package/src/analyze.ts +24 -23
  64. package/src/analyze_functions/process_functions.ts +310 -129
  65. package/src/famix_functions/EntityDictionary.ts +949 -271
  66. package/src/famix_functions/helpers_creation.ts +64 -6
  67. package/src/fqn.ts +169 -96
  68. package/{dist/lib/famix/src/famix_JSON_exporter.js → src/lib/famix/famix_JSON_exporter.ts} +16 -14
  69. package/src/lib/famix/famix_base_element.ts +22 -0
  70. package/{dist/lib/famix/src/famix_repository.js → src/lib/famix/famix_repository.ts} +96 -75
  71. package/src/lib/famix/model/famix/access.ts +50 -0
  72. package/src/lib/famix/model/famix/alias.ts +39 -0
  73. package/src/lib/famix/{src/model/famix/implicit_variable.ts → model/famix/arrow_function.ts} +3 -3
  74. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -0
  75. package/src/lib/famix/model/famix/class.ts +85 -0
  76. package/src/lib/famix/model/famix/comment.ts +47 -0
  77. package/src/lib/famix/model/famix/concretisation.ts +40 -0
  78. package/src/lib/famix/model/famix/container_entity.ts +160 -0
  79. package/src/lib/famix/model/famix/decorator.ts +37 -0
  80. package/src/lib/famix/model/famix/enum.ts +30 -0
  81. package/src/lib/famix/model/famix/enum_value.ts +28 -0
  82. package/src/lib/famix/model/famix/import_clause.ts +51 -0
  83. package/src/lib/famix/{src/model → model}/famix/index.ts +8 -7
  84. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -0
  85. package/src/lib/famix/model/famix/inheritance.ts +40 -0
  86. package/src/lib/famix/model/famix/interface.ts +75 -0
  87. package/src/lib/famix/model/famix/invocation.ts +65 -0
  88. package/src/lib/famix/model/famix/method.ts +89 -0
  89. package/src/lib/famix/model/famix/module.ts +71 -0
  90. package/src/lib/famix/model/famix/named_entity.ts +95 -0
  91. package/src/lib/famix/{src/model → model}/famix/parameter.ts +11 -12
  92. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -0
  93. package/src/lib/famix/model/famix/parameter_type.ts +58 -0
  94. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -0
  95. package/src/lib/famix/model/famix/parametric_class.ts +49 -0
  96. package/src/lib/famix/model/famix/parametric_function.ts +32 -0
  97. package/src/lib/famix/model/famix/parametric_interface.ts +49 -0
  98. package/src/lib/famix/model/famix/parametric_method.ts +32 -0
  99. package/src/lib/famix/model/famix/primitive_type.ts +15 -0
  100. package/src/lib/famix/model/famix/property.ts +94 -0
  101. package/src/lib/famix/model/famix/reference.ts +40 -0
  102. package/src/lib/famix/model/famix/scoping_entity.ts +35 -0
  103. package/src/lib/famix/model/famix/script_entity.ts +34 -0
  104. package/src/lib/famix/model/famix/source_anchor.ts +30 -0
  105. package/src/lib/famix/model/famix/source_language.ts +35 -0
  106. package/src/lib/famix/model/famix/sourced_entity.ts +70 -0
  107. package/src/lib/famix/model/famix/structural_entity.ts +43 -0
  108. package/src/lib/famix/model/famix/type.ts +87 -0
  109. package/src/lib/famix/model/famix/variable.ts +27 -0
  110. package/src/lib/famix/package.json +1 -1
  111. package/src/lib/ts-complex/cyclomatic-service.ts +10 -10
  112. package/src/refactorer/refactor-getter-setter.ts +140 -0
  113. package/src/ts2famix-cli-wrapper.ts +21 -0
  114. package/src/ts2famix-cli.ts +8 -2
  115. package/tsconfig.check-tests.json +14 -0
  116. package/tsconfig.json +71 -69
  117. package/dist/famix2puml.js +0 -125
  118. package/dist/lib/famix/src/famix_base_element.js +0 -17
  119. package/dist/lib/famix/src/model/famix/access.js +0 -39
  120. package/dist/lib/famix/src/model/famix/accessor.js +0 -16
  121. package/dist/lib/famix/src/model/famix/alias.js +0 -32
  122. package/dist/lib/famix/src/model/famix/association.js +0 -36
  123. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -81
  124. package/dist/lib/famix/src/model/famix/class.js +0 -70
  125. package/dist/lib/famix/src/model/famix/comment.js +0 -38
  126. package/dist/lib/famix/src/model/famix/container_entity.js +0 -125
  127. package/dist/lib/famix/src/model/famix/decorator.js +0 -31
  128. package/dist/lib/famix/src/model/famix/entity.js +0 -16
  129. package/dist/lib/famix/src/model/famix/enum.js +0 -30
  130. package/dist/lib/famix/src/model/famix/enum_value.js +0 -24
  131. package/dist/lib/famix/src/model/famix/function.js +0 -16
  132. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -16
  133. package/dist/lib/famix/src/model/famix/import_clause.js +0 -39
  134. package/dist/lib/famix/src/model/famix/index.js +0 -83
  135. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -51
  136. package/dist/lib/famix/src/model/famix/inheritance.js +0 -32
  137. package/dist/lib/famix/src/model/famix/interface.js +0 -63
  138. package/dist/lib/famix/src/model/famix/invocation.js +0 -53
  139. package/dist/lib/famix/src/model/famix/method.js +0 -66
  140. package/dist/lib/famix/src/model/famix/module.js +0 -31
  141. package/dist/lib/famix/src/model/famix/named_entity.js +0 -77
  142. package/dist/lib/famix/src/model/famix/namespace.js +0 -24
  143. package/dist/lib/famix/src/model/famix/parameter.js +0 -24
  144. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -24
  145. package/dist/lib/famix/src/model/famix/parameterizable_class.js +0 -30
  146. package/dist/lib/famix/src/model/famix/parameterizable_interface.js +0 -30
  147. package/dist/lib/famix/src/model/famix/parameterized_type.js +0 -36
  148. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -16
  149. package/dist/lib/famix/src/model/famix/property.js +0 -44
  150. package/dist/lib/famix/src/model/famix/reference.js +0 -32
  151. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -35
  152. package/dist/lib/famix/src/model/famix/script_entity.js +0 -30
  153. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -26
  154. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  155. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -59
  156. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -38
  157. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -37
  158. package/dist/lib/famix/src/model/famix/type.js +0 -71
  159. package/dist/lib/famix/src/model/famix/variable.js +0 -23
  160. package/doc-uml/metamodel-full.svg +0 -1
  161. package/doc-uml/metamodel.svg +0 -1
  162. package/jest.config-old.ts +0 -199
  163. package/plantuml.jar +0 -0
  164. package/src/famix2puml.ts +0 -119
  165. package/src/lib/famix/package-lock.json +0 -301
  166. package/src/lib/famix/readme.md +0 -5
  167. package/src/lib/famix/src/famix_JSON_exporter.ts +0 -56
  168. package/src/lib/famix/src/famix_base_element.ts +0 -22
  169. package/src/lib/famix/src/famix_repository.ts +0 -243
  170. package/src/lib/famix/src/model/famix/access.ts +0 -53
  171. package/src/lib/famix/src/model/famix/alias.ts +0 -41
  172. package/src/lib/famix/src/model/famix/association.ts +0 -44
  173. package/src/lib/famix/src/model/famix/behavioral_entity.ts +0 -107
  174. package/src/lib/famix/src/model/famix/class.ts +0 -86
  175. package/src/lib/famix/src/model/famix/comment.ts +0 -50
  176. package/src/lib/famix/src/model/famix/container_entity.ts +0 -165
  177. package/src/lib/famix/src/model/famix/decorator.ts +0 -39
  178. package/src/lib/famix/src/model/famix/enum.ts +0 -31
  179. package/src/lib/famix/src/model/famix/enum_value.ts +0 -29
  180. package/src/lib/famix/src/model/famix/import_clause.ts +0 -53
  181. package/src/lib/famix/src/model/famix/indexed_file_anchor.ts +0 -71
  182. package/src/lib/famix/src/model/famix/inheritance.ts +0 -42
  183. package/src/lib/famix/src/model/famix/interface.ts +0 -75
  184. package/src/lib/famix/src/model/famix/invocation.ts +0 -68
  185. package/src/lib/famix/src/model/famix/method.ts +0 -96
  186. package/src/lib/famix/src/model/famix/module.ts +0 -31
  187. package/src/lib/famix/src/model/famix/named_entity.ts +0 -98
  188. package/src/lib/famix/src/model/famix/namespace.ts +0 -28
  189. package/src/lib/famix/src/model/famix/parameter_type.ts +0 -33
  190. package/src/lib/famix/src/model/famix/parameterizable_class.ts +0 -31
  191. package/src/lib/famix/src/model/famix/parameterizable_interface.ts +0 -31
  192. package/src/lib/famix/src/model/famix/parameterized_type.ts +0 -40
  193. package/src/lib/famix/src/model/famix/primitive_type.ts +0 -15
  194. package/src/lib/famix/src/model/famix/property.ts +0 -54
  195. package/src/lib/famix/src/model/famix/reference.ts +0 -42
  196. package/src/lib/famix/src/model/famix/scoping_entity.ts +0 -35
  197. package/src/lib/famix/src/model/famix/script_entity.ts +0 -38
  198. package/src/lib/famix/src/model/famix/source_anchor.ts +0 -31
  199. package/src/lib/famix/src/model/famix/source_language.ts +0 -37
  200. package/src/lib/famix/src/model/famix/sourced_entity.ts +0 -73
  201. package/src/lib/famix/src/model/famix/structural_entity.ts +0 -44
  202. package/src/lib/famix/src/model/famix/text_anchor.ts +0 -49
  203. package/src/lib/famix/src/model/famix/type.ts +0 -88
  204. package/src/lib/famix/src/model/famix/variable.ts +0 -28
  205. package/src/lib/famix/tsconfig.json +0 -27
  206. package/src/lib/famix/tslint.json +0 -15
  207. /package/src/lib/famix/{src/index.ts → index.ts} +0 -0
  208. /package/src/lib/famix/{src/model → model}/famix/accessor.ts +0 -0
  209. /package/src/lib/famix/{src/model → model}/famix/entity.ts +0 -0
  210. /package/src/lib/famix/{src/model → model}/famix/function.ts +0 -0
@@ -23,8 +23,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.findTypeAncestor = exports.findAncestor = exports.computeSignature = exports.getSubTypeName = exports.indexOfSplitArray = void 0;
27
- const Famix = __importStar(require("../lib/famix/src/model/famix"));
26
+ exports.indexOfSplitArray = indexOfSplitArray;
27
+ exports.getSubTypeName = getSubTypeName;
28
+ exports.computeSignature = computeSignature;
29
+ exports.findAncestor = findAncestor;
30
+ exports.findTypeAncestor = findTypeAncestor;
31
+ exports.arraysAreEqual = arraysAreEqual;
32
+ exports.replaceLastBetweenTags = replaceLastBetweenTags;
33
+ const Famix = __importStar(require("../lib/famix/model/famix"));
28
34
  const analyze_1 = require("../analyze");
29
35
  const ts_morph_1 = require("ts-morph");
30
36
  /**
@@ -47,7 +53,6 @@ function indexOfSplitArray(params) {
47
53
  }
48
54
  return -1; // Return -1 if the target array was not found in the search array
49
55
  }
50
- exports.indexOfSplitArray = indexOfSplitArray;
51
56
  function getSubTypeName(fmxNamedEntity) {
52
57
  const name = fmxNamedEntity instanceof Famix.Class ? 'Class' :
53
58
  fmxNamedEntity instanceof Famix.Interface ? 'Interface' :
@@ -63,10 +68,9 @@ function getSubTypeName(fmxNamedEntity) {
63
68
  fmxNamedEntity instanceof Famix.Parameter ? 'Parameter' :
64
69
  fmxNamedEntity instanceof Famix.Property ? 'Property' :
65
70
  'NamedEntity';
66
- analyze_1.logger.debug(`${fmxNamedEntity.getName()} is of type ${name}`);
71
+ analyze_1.logger.debug(`${fmxNamedEntity.name} is of type ${name}`);
67
72
  return name;
68
73
  }
69
- exports.getSubTypeName = getSubTypeName;
70
74
  /**
71
75
  * Gets the signature of a method or a function
72
76
  * @param text A method or a function source code
@@ -76,22 +80,69 @@ function computeSignature(text) {
76
80
  const endSignatureText = text.indexOf("{");
77
81
  return text.substring(0, endSignatureText).trim();
78
82
  }
79
- exports.computeSignature = computeSignature;
80
83
  /**
81
84
  * Finds the ancestor of a node
82
85
  * @param node A node
83
86
  * @returns The ancestor of the node
84
87
  */
85
88
  function findAncestor(node) {
86
- return node.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration || a.getKind() === ts_morph_1.SyntaxKind.Constructor || a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration || a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression || a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration || a.getKind() === ts_morph_1.SyntaxKind.SourceFile || a.getKindName() === "GetAccessor" || a.getKindName() === "SetAccessor" || a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration);
89
+ let ancestor;
90
+ ancestor = node.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration ||
91
+ a.getKind() === ts_morph_1.SyntaxKind.Constructor ||
92
+ a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration ||
93
+ a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression ||
94
+ a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration ||
95
+ a.getKind() === ts_morph_1.SyntaxKind.SourceFile ||
96
+ a.getKindName() === "GetAccessor" ||
97
+ a.getKindName() === "SetAccessor" ||
98
+ a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration);
99
+ if (!ancestor) {
100
+ throw new Error(`Ancestor not found for ${node.getText()}`);
101
+ }
102
+ return ancestor;
87
103
  }
88
- exports.findAncestor = findAncestor;
89
104
  /**
90
105
  * Finds the ancestor of a ts-morph element
91
106
  * @param element A ts-morph element
92
107
  * @returns The ancestor of the ts-morph element
93
108
  */
94
109
  function findTypeAncestor(element) {
95
- return element.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration || a.getKind() === ts_morph_1.SyntaxKind.Constructor || a.getKind() === ts_morph_1.SyntaxKind.MethodSignature || a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration || a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression || a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration || a.getKind() === ts_morph_1.SyntaxKind.SourceFile || a.getKindName() === "GetAccessor" || a.getKindName() === "SetAccessor" || a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration || a.getKind() === ts_morph_1.SyntaxKind.InterfaceDeclaration);
110
+ let ancestor;
111
+ ancestor = element.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration ||
112
+ a.getKind() === ts_morph_1.SyntaxKind.Constructor ||
113
+ a.getKind() === ts_morph_1.SyntaxKind.MethodSignature ||
114
+ a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration ||
115
+ a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression ||
116
+ a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration ||
117
+ a.getKind() === ts_morph_1.SyntaxKind.SourceFile ||
118
+ a.getKindName() === "GetAccessor" ||
119
+ a.getKindName() === "SetAccessor" ||
120
+ a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration ||
121
+ a.getKind() === ts_morph_1.SyntaxKind.InterfaceDeclaration);
122
+ if (!ancestor) {
123
+ throw new Error(`Type ancestor not found for ${element.getKindName()}`);
124
+ }
125
+ return ancestor;
96
126
  }
97
- exports.findTypeAncestor = findTypeAncestor;
127
+ function arraysAreEqual(array1, array2) {
128
+ if (array1 && array2) {
129
+ return array1.length === array2.length && array1.every((value, index) => value === array2[index]);
130
+ }
131
+ else {
132
+ return false;
133
+ }
134
+ }
135
+ function replaceLastBetweenTags(input, replacement) {
136
+ const lastTagIndex = input.lastIndexOf('<');
137
+ if (lastTagIndex === -1) {
138
+ return input; // Return the original string if no tags are found
139
+ }
140
+ const closingTagIndex = input.indexOf('>', lastTagIndex);
141
+ if (closingTagIndex === -1) {
142
+ return input; // Return the original string if no closing tag is found
143
+ }
144
+ const beforeTag = input.substring(0, lastTagIndex + 1); // Include '<'
145
+ const afterTag = input.substring(closingTagIndex); // Include '>'
146
+ return beforeTag + replacement + afterTag;
147
+ }
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyc19jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvaGVscGVyc19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsOENBZUM7QUFFRCx3Q0FpQkM7QUFPRCw0Q0FHQztBQU9ELG9DQWdCQztBQU9ELDRDQWtCQztBQUVELHdDQU1DO0FBRUQsd0RBaUJDO0FBdElELGdFQUFrRDtBQUNsRCx3Q0FBb0M7QUFDcEMsdUNBQWtVO0FBU2xVOzs7R0FHRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE1BQXdCO0lBQ3RELE1BQU0sRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDckQsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDZCxNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxDQUFDLENBQUMsQ0FBQyxvREFBb0Q7UUFDbEUsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsa0VBQWtFO0FBQ2pGLENBQUM7QUFFRCxTQUFnQixjQUFjLENB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QyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7U0FBTSxDQUFDO1FBQ0osT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsV0FBbUI7SUFDckUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1QyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLENBQUMsa0RBQWtEO0lBQ3BFLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RCxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLENBQUMsd0RBQXdEO0lBQzFFLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBRWpFLE9BQU8sU0FBUyxHQUFHLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEZhbWl4IGZyb20gXCIuLi9saWIvZmFtaXgvbW9kZWwvZmFtaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9hbmFseXplXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBJZGVudGlmaWVyLCBGdW5jdGlvbkRlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kU2lnbmF0dXJlLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgVmFyaWFibGVEZWNsYXJhdGlvbiwgUGFyYW1ldGVyRGVjbGFyYXRpb24sIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVBbGlhc0RlY2xhcmF0aW9uLCBOb2RlLCBTeW50YXhLaW5kLCBGdW5jdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcbmltcG9ydCB7IFR5cGVEZWNsYXJhdGlvbiB9IGZyb20gXCIuL0VudGl0eURpY3Rpb25hcnlcIjtcblxuaW50ZXJmYWNlIFNlYXJjaFBhcmFtZXRlcnMge1xuICAgIHNlYXJjaEFycmF5OiBzdHJpbmdbXTtcbiAgICB0YXJnZXRBcnJheTogc3RyaW5nW107XG4gICAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIGluZGV4T2YsIGJ1dCBpdCB3b3JrcyB3aXRoIGFycmF5cyBvZiBncmFwaGVtZSBjbHVzdGVycy5cbiAqIEBwYXJhbSB0YXJnZXRBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZlNwbGl0QXJyYXkocGFyYW1zOiBTZWFyY2hQYXJhbWV0ZXJzKTogbnVtYmVyIHtcbiAgICBjb25zdCB7c2VhcmNoQXJyYXksIHRhcmdldEFycmF5LCBzdGFydCA9IDB9ID0gcGFyYW1zO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBzZWFyY2hBcnJheS5sZW5ndGggLSB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZm91bmQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQXJyYXlbaSArIGpdICE9PSB0YXJnZXRBcnJheVtqXSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gaTsgLy8gUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgdGFyZ2V0IGFycmF5IHdhcyBmb3VuZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIHRoZSB0YXJnZXQgYXJyYXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VhcmNoIGFycmF5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJUeXBlTmFtZShmbXhOYW1lZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkpIHtcbiAgICBjb25zdCBuYW1lID0gZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5DbGFzcyA/ICdDbGFzcycgOlxuICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkludGVyZmFjZSA/ICdJbnRlcmZhY2UnIDpcbiAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRnVuY3Rpb24gPyAnRnVuY3Rpb24nIDpcbiAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW0gPyAnRW51bScgOlxuICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW1WYWx1ZSA/ICdFbnVtVmFsdWUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQWxpYXMgPyAnQWxpYXMnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlZhcmlhYmxlID8gJ1ZhcmlhYmxlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguVHlwZSA/ICdUeXBlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4Lk1ldGhvZCA/ICdNZXRob2QnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkRlY29yYXRvciA/ICdEZWNvcmF0b3InIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5BY2Nlc3NvciA/ICdBY2Nlc3NvcicgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0ZXIgPyAnUGFyYW1ldGVyJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5Qcm9wZXJ0eSA/ICdQcm9wZXJ0eScgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmFtZWRFbnRpdHknO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtmbXhOYW1lZEVudGl0eS5uYW1lfSBpcyBvZiB0eXBlICR7bmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzaWduYXR1cmUgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIHRleHQgQSBtZXRob2Qgb3IgYSBmdW5jdGlvbiBzb3VyY2UgY29kZVxuICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIG9yIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuZFNpZ25hdHVyZVRleHQgPSB0ZXh0LmluZGV4T2YoXCJ7XCIpO1xuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBlbmRTaWduYXR1cmVUZXh0KS50cmltKCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGFuY2VzdG9yIG9mIGEgbm9kZVxuICogQHBhcmFtIG5vZGUgQSBub2RlXG4gKiBAcmV0dXJucyBUaGUgYW5jZXN0b3Igb2YgdGhlIG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbmNlc3Rvcihub2RlOiBJZGVudGlmaWVyKTogTm9kZSB7XG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xuICAgIGFuY2VzdG9yID0gbm9kZS5nZXRBbmNlc3RvcnMoKS5maW5kKGEgPT4gXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Db25zdHJ1Y3RvciB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuU291cmNlRmlsZSB8fCBcbiAgICAgICAgYS5nZXRLaW5kTmFtZSgpID09PSBcIkdldEFjY2Vzc29yXCIgfHwgXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJTZXRBY2Nlc3NvclwiIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciAke25vZGUuZ2V0VGV4dCgpfWApO1xuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3Jcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYW5jZXN0b3Igb2YgYSB0cy1tb3JwaCBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcbiAqIEByZXR1cm5zIFRoZSBhbmNlc3RvciBvZiB0aGUgdHMtbW9ycGggZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFR5cGVBbmNlc3RvcihlbGVtZW50OiBUeXBlRGVjbGFyYXRpb24pOiBOb2RlIHtcbiAgICBsZXQgYW5jZXN0b3I6IE5vZGUgfCB1bmRlZmluZWQ7XG4gICAgYW5jZXN0b3IgPSBlbGVtZW50LmdldEFuY2VzdG9ycygpLmZpbmQoYSA9PiBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24gfHwgXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNvbnN0cnVjdG9yIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5NZXRob2RTaWduYXR1cmUgfHwgXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTW9kdWxlRGVjbGFyYXRpb24gfHwgXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLlNvdXJjZUZpbGUgfHwgXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJHZXRBY2Nlc3NvclwiIHx8IFxuICAgICAgICBhLmdldEtpbmROYW1lKCkgPT09IFwiU2V0QWNjZXNzb3JcIiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb24pO1xuICAgIGlmICghYW5jZXN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlIGFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgJHtlbGVtZW50LmdldEtpbmROYW1lKCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0FyZUVxdWFsKGFycmF5MTogc3RyaW5nW10sIGFycmF5Mjogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoYXJyYXkxICYmIGFycmF5MiApIHtcbiAgICAgICAgcmV0dXJuIGFycmF5MS5sZW5ndGggPT09IGFycmF5Mi5sZW5ndGggJiYgYXJyYXkxLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheTJbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUxhc3RCZXR3ZWVuVGFncyhpbnB1dDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0VGFnSW5kZXggPSBpbnB1dC5sYXN0SW5kZXhPZignPCcpO1xuICAgIFxuICAgIGlmIChsYXN0VGFnSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdGFncyBhcmUgZm91bmRcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zaW5nVGFnSW5kZXggPSBpbnB1dC5pbmRleE9mKCc+JywgbGFzdFRhZ0luZGV4KTtcbiAgICBcbiAgICBpZiAoY2xvc2luZ1RhZ0luZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIGNsb3NpbmcgdGFnIGlzIGZvdW5kXG4gICAgfVxuXG4gICAgY29uc3QgYmVmb3JlVGFnID0gaW5wdXQuc3Vic3RyaW5nKDAsIGxhc3RUYWdJbmRleCArIDEpOyAvLyBJbmNsdWRlICc8J1xuICAgIGNvbnN0IGFmdGVyVGFnID0gaW5wdXQuc3Vic3RyaW5nKGNsb3NpbmdUYWdJbmRleCk7IC8vIEluY2x1ZGUgJz4nXG5cbiAgICByZXR1cm4gYmVmb3JlVGFnICsgcmVwbGFjZW1lbnQgKyBhZnRlclRhZztcbn1cbiJdfQ==
package/dist/fqn.js CHANGED
@@ -1,137 +1,186 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getNameOfNode = exports.getFQN = void 0;
30
- const ts = __importStar(require("ts-morph"));
6
+ exports.getFQN = getFQN;
7
+ exports.getUniqueFQN = getUniqueFQN;
8
+ exports.getNameOfNode = getNameOfNode;
9
+ exports.getParameters = getParameters;
10
+ const ts_morph_1 = require("ts-morph");
31
11
  const analyze_1 = require("./analyze");
32
12
  const path_1 = __importDefault(require("path"));
33
- /**
34
- * Gets the fully qualified name of a node, if it has one
35
- * @param node A node
36
- * @returns The fully qualified name of the node, or undefined if it doesn't have one
37
- */
13
+ function isFQNNode(node) {
14
+ return ts_morph_1.Node.isVariableDeclaration(node) || ts_morph_1.Node.isArrowFunction(node) || ts_morph_1.Node.isIdentifier(node) || ts_morph_1.Node.isMethodDeclaration(node) || ts_morph_1.Node.isClassDeclaration(node) || ts_morph_1.Node.isClassExpression(node) || ts_morph_1.Node.isDecorator(node) || ts_morph_1.Node.isModuleDeclaration(node) || ts_morph_1.Node.isCallExpression(node);
15
+ }
38
16
  function getFQN(node) {
39
17
  const absolutePathProject = analyze_1.entityDictionary.famixRep.getAbsolutePath();
40
- if (node instanceof ts.SourceFile) {
41
- return analyze_1.entityDictionary.convertToRelativePath(path_1.default.normalize(node.getFilePath()), absolutePathProject).replace(/\\/sg, "/");
18
+ const sourceFile = node.getSourceFile();
19
+ let parts = [];
20
+ let currentNode = node;
21
+ while (currentNode && !ts_morph_1.Node.isSourceFile(currentNode)) {
22
+ const { line, column } = sourceFile.getLineAndColumnAtPos(currentNode.getStart());
23
+ const lc = `${line}:${column}`;
24
+ if (ts_morph_1.Node.isClassDeclaration(currentNode) ||
25
+ ts_morph_1.Node.isClassExpression(currentNode) ||
26
+ ts_morph_1.Node.isInterfaceDeclaration(currentNode) ||
27
+ ts_morph_1.Node.isFunctionDeclaration(currentNode) ||
28
+ ts_morph_1.Node.isMethodDeclaration(currentNode) ||
29
+ ts_morph_1.Node.isModuleDeclaration(currentNode) ||
30
+ ts_morph_1.Node.isVariableDeclaration(currentNode) ||
31
+ ts_morph_1.Node.isGetAccessorDeclaration(currentNode) ||
32
+ ts_morph_1.Node.isSetAccessorDeclaration(currentNode) ||
33
+ ts_morph_1.Node.isIdentifier(currentNode)) {
34
+ let name = ts_morph_1.Node.isIdentifier(currentNode) ? currentNode.getText()
35
+ : getNameOfNode(currentNode) /* currentNode.getName() */ || 'Unnamed_' + currentNode.getKindName() + `(${lc})`;
36
+ parts.unshift(name);
37
+ }
38
+ else if (ts_morph_1.Node.isArrowFunction(currentNode) ||
39
+ ts_morph_1.Node.isBlock(currentNode) ||
40
+ ts_morph_1.Node.isForInStatement(currentNode) ||
41
+ ts_morph_1.Node.isForOfStatement(currentNode) ||
42
+ ts_morph_1.Node.isForStatement(currentNode) ||
43
+ ts_morph_1.Node.isCatchClause(currentNode)) {
44
+ parts.unshift(`${currentNode.getKindName()}(${lc})`);
45
+ }
46
+ else if (ts_morph_1.Node.isConstructorDeclaration(currentNode)) {
47
+ parts.unshift(`constructor`);
48
+ }
49
+ else {
50
+ // For other kinds, you might want to handle them specifically or ignore
51
+ //console.log(`Ignoring node kind: ${currentNode.getKindName()}`);
52
+ }
53
+ currentNode = currentNode.getParent();
42
54
  }
43
- const symbol = node.getSymbol();
44
- if (!symbol) {
45
- return undefined;
46
- }
47
- const declarations = symbol.getDeclarations();
48
- if (!declarations) {
49
- return undefined;
50
- }
51
- const sourceFile = declarations[0].getSourceFile();
52
- if (!sourceFile) {
53
- return undefined;
54
- }
55
- const absolutePath = path_1.default.normalize(sourceFile.getFilePath());
56
- const positionNodeModules = absolutePath.indexOf('node_modules');
57
- let pathInProject = "";
58
- if (positionNodeModules !== -1) {
59
- const pathFromNodeModules = absolutePath.substring(positionNodeModules);
60
- pathInProject = pathFromNodeModules;
61
- }
62
- else {
63
- pathInProject = analyze_1.entityDictionary.convertToRelativePath(absolutePath, absolutePathProject).replace(/\\/g, "/");
64
- }
65
- const qualifiedNameParts = [];
66
- const nodeName = this.getNameOfNode(node);
67
- if (nodeName)
68
- qualifiedNameParts.push(nodeName);
69
- const ancestors = node.getAncestors();
70
- ancestors.forEach(a => {
71
- const partName = this.getNameOfNode(a);
72
- if (partName)
73
- qualifiedNameParts.push(partName);
74
- });
75
- qualifiedNameParts.pop();
76
- if (qualifiedNameParts.length > 0) {
77
- return `{${pathInProject}}.${qualifiedNameParts.reverse().join(".")}`;
55
+ // Prepend the relative path of the source file
56
+ const relativePath = analyze_1.entityDictionary.convertToRelativePath(path_1.default.normalize(sourceFile.getFilePath()), absolutePathProject).replace(/\\/sg, "/");
57
+ parts.unshift(`{${relativePath}}`);
58
+ const fqn = parts.join(".") + `[${node.getKindName()}]`; // disambiguate
59
+ analyze_1.logger.debug(fqn);
60
+ return fqn;
61
+ }
62
+ function getUniqueFQN(node) {
63
+ const absolutePathProject = analyze_1.entityDictionary.famixRep.getAbsolutePath();
64
+ let parts = [];
65
+ if (node instanceof ts_morph_1.SourceFile) {
66
+ return analyze_1.entityDictionary.convertToRelativePath(path_1.default.normalize(node.getFilePath()), absolutePathProject).replace(/\\/g, "/");
78
67
  }
79
- else {
80
- return undefined;
68
+ let currentNode = node;
69
+ while (currentNode) {
70
+ if (ts_morph_1.Node.isSourceFile(currentNode)) {
71
+ const relativePath = analyze_1.entityDictionary.convertToRelativePath(path_1.default.normalize(currentNode.getFilePath()), absolutePathProject).replace(/\\/g, "/");
72
+ parts.unshift(relativePath); // Add file path at the start
73
+ break;
74
+ }
75
+ else if (currentNode.getSymbol()) {
76
+ const name = currentNode.getSymbol().getName();
77
+ // For anonymous nodes, use kind and position as unique identifiers
78
+ const identifier = name !== "__computed" ? name : `${currentNode.getKindName()}_${currentNode.getStartLinePos()}`;
79
+ parts.unshift(identifier);
80
+ }
81
+ currentNode = currentNode.getParent();
81
82
  }
83
+ return parts.join("::");
82
84
  }
83
- exports.getFQN = getFQN;
84
85
  /**
85
86
  * Gets the name of a node, if it has one
86
87
  * @param a A node
87
88
  * @returns The name of the node, or an empty string if it doesn't have one
88
89
  */
89
90
  function getNameOfNode(a) {
90
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
91
91
  switch (a.getKind()) {
92
- case ts.SyntaxKind.SourceFile:
93
- return (_a = a.asKind(ts.SyntaxKind.SourceFile)) === null || _a === void 0 ? void 0 : _a.getBaseName();
94
- case ts.SyntaxKind.ModuleDeclaration:
95
- return (_b = a.asKind(ts.SyntaxKind.ModuleDeclaration)) === null || _b === void 0 ? void 0 : _b.getName();
96
- case ts.SyntaxKind.ClassDeclaration:
97
- return (_c = a.asKind(ts.SyntaxKind.ClassDeclaration)) === null || _c === void 0 ? void 0 : _c.getName();
98
- case ts.SyntaxKind.InterfaceDeclaration:
99
- return (_d = a.asKind(ts.SyntaxKind.InterfaceDeclaration)) === null || _d === void 0 ? void 0 : _d.getName();
100
- case ts.SyntaxKind.PropertyDeclaration:
101
- return (_e = a.asKind(ts.SyntaxKind.PropertyDeclaration)) === null || _e === void 0 ? void 0 : _e.getName();
102
- case ts.SyntaxKind.PropertySignature:
103
- return (_f = a.asKind(ts.SyntaxKind.PropertySignature)) === null || _f === void 0 ? void 0 : _f.getName();
104
- case ts.SyntaxKind.MethodDeclaration:
105
- return (_g = a.asKind(ts.SyntaxKind.MethodDeclaration)) === null || _g === void 0 ? void 0 : _g.getName();
106
- case ts.SyntaxKind.MethodSignature:
107
- return (_h = a.asKind(ts.SyntaxKind.MethodSignature)) === null || _h === void 0 ? void 0 : _h.getName();
108
- case ts.SyntaxKind.GetAccessor:
109
- return (_j = a.asKind(ts.SyntaxKind.GetAccessor)) === null || _j === void 0 ? void 0 : _j.getName();
110
- case ts.SyntaxKind.SetAccessor:
111
- return (_k = a.asKind(ts.SyntaxKind.SetAccessor)) === null || _k === void 0 ? void 0 : _k.getName();
112
- case ts.SyntaxKind.FunctionDeclaration:
113
- return (_l = a.asKind(ts.SyntaxKind.FunctionDeclaration)) === null || _l === void 0 ? void 0 : _l.getName();
114
- case ts.SyntaxKind.FunctionExpression:
115
- return ((_m = a.asKind(ts.SyntaxKind.FunctionExpression)) === null || _m === void 0 ? void 0 : _m.getName()) ? (_o = a.asKind(ts.SyntaxKind.FunctionExpression)) === null || _o === void 0 ? void 0 : _o.getName() : "anonymous";
116
- case ts.SyntaxKind.Parameter:
117
- return (_p = a.asKind(ts.SyntaxKind.Parameter)) === null || _p === void 0 ? void 0 : _p.getName();
118
- case ts.SyntaxKind.VariableDeclaration:
119
- return (_q = a.asKind(ts.SyntaxKind.VariableDeclaration)) === null || _q === void 0 ? void 0 : _q.getName();
120
- case ts.SyntaxKind.Decorator:
121
- return "@" + ((_r = a.asKind(ts.SyntaxKind.Decorator)) === null || _r === void 0 ? void 0 : _r.getName());
122
- case ts.SyntaxKind.TypeParameter:
123
- return (_s = a.asKind(ts.SyntaxKind.TypeParameter)) === null || _s === void 0 ? void 0 : _s.getName();
124
- case ts.SyntaxKind.EnumDeclaration:
125
- return (_t = a.asKind(ts.SyntaxKind.EnumDeclaration)) === null || _t === void 0 ? void 0 : _t.getName();
126
- case ts.SyntaxKind.EnumMember:
127
- return (_u = a.asKind(ts.SyntaxKind.EnumMember)) === null || _u === void 0 ? void 0 : _u.getName();
128
- case ts.SyntaxKind.TypeAliasDeclaration:
129
- return (_v = a.asKind(ts.SyntaxKind.TypeAliasDeclaration)) === null || _v === void 0 ? void 0 : _v.getName();
130
- case ts.SyntaxKind.Constructor:
92
+ case ts_morph_1.SyntaxKind.SourceFile:
93
+ return a.asKind(ts_morph_1.SyntaxKind.SourceFile).getBaseName();
94
+ case ts_morph_1.SyntaxKind.ModuleDeclaration:
95
+ return a.asKind(ts_morph_1.SyntaxKind.ModuleDeclaration).getName();
96
+ case ts_morph_1.SyntaxKind.ClassDeclaration:
97
+ const cKind = a.asKind(ts_morph_1.SyntaxKind.ClassDeclaration);
98
+ if (cKind && cKind.getTypeParameters().length > 0) {
99
+ return cKind.getName() + getParameters(a);
100
+ }
101
+ else {
102
+ return cKind?.getName() || "";
103
+ }
104
+ case ts_morph_1.SyntaxKind.InterfaceDeclaration:
105
+ const iKind = a.asKind(ts_morph_1.SyntaxKind.InterfaceDeclaration);
106
+ if (iKind && iKind.getTypeParameters().length > 0) {
107
+ return iKind.getName() + getParameters(a);
108
+ }
109
+ else {
110
+ return iKind?.getName() || "";
111
+ }
112
+ case ts_morph_1.SyntaxKind.PropertyDeclaration:
113
+ return a.asKind(ts_morph_1.SyntaxKind.PropertyDeclaration).getName();
114
+ case ts_morph_1.SyntaxKind.PropertySignature:
115
+ return a.asKind(ts_morph_1.SyntaxKind.PropertySignature).getName();
116
+ case ts_morph_1.SyntaxKind.MethodDeclaration:
117
+ const mKind = a.asKind(ts_morph_1.SyntaxKind.MethodDeclaration);
118
+ if (mKind && mKind.getTypeParameters().length > 0) {
119
+ return mKind.getName() + getParameters(a);
120
+ }
121
+ else {
122
+ return mKind?.getName() || "";
123
+ }
124
+ case ts_morph_1.SyntaxKind.MethodSignature:
125
+ return a.asKind(ts_morph_1.SyntaxKind.MethodSignature).getName();
126
+ case ts_morph_1.SyntaxKind.GetAccessor:
127
+ return a.asKind(ts_morph_1.SyntaxKind.GetAccessor).getName();
128
+ case ts_morph_1.SyntaxKind.SetAccessor:
129
+ return a.asKind(ts_morph_1.SyntaxKind.SetAccessor).getName();
130
+ case ts_morph_1.SyntaxKind.FunctionDeclaration:
131
+ const fKind = a.asKind(ts_morph_1.SyntaxKind.FunctionDeclaration);
132
+ if (fKind && fKind.getTypeParameters().length > 0) {
133
+ return fKind.getName() + getParameters(a);
134
+ }
135
+ else {
136
+ return fKind?.getName() || "";
137
+ }
138
+ case ts_morph_1.SyntaxKind.FunctionExpression:
139
+ return a.asKind(ts_morph_1.SyntaxKind.FunctionExpression)?.getName() || "anonymous";
140
+ case ts_morph_1.SyntaxKind.Parameter:
141
+ return a.asKind(ts_morph_1.SyntaxKind.Parameter).getName();
142
+ case ts_morph_1.SyntaxKind.VariableDeclaration:
143
+ return a.asKind(ts_morph_1.SyntaxKind.VariableDeclaration).getName();
144
+ case ts_morph_1.SyntaxKind.Decorator:
145
+ return "@" + a.asKind(ts_morph_1.SyntaxKind.Decorator).getName();
146
+ case ts_morph_1.SyntaxKind.TypeParameter:
147
+ return a.asKind(ts_morph_1.SyntaxKind.TypeParameter).getName();
148
+ case ts_morph_1.SyntaxKind.EnumDeclaration:
149
+ return a.asKind(ts_morph_1.SyntaxKind.EnumDeclaration).getName();
150
+ case ts_morph_1.SyntaxKind.EnumMember:
151
+ return a.asKind(ts_morph_1.SyntaxKind.EnumMember).getName();
152
+ case ts_morph_1.SyntaxKind.TypeAliasDeclaration:
153
+ return a.asKind(ts_morph_1.SyntaxKind.TypeAliasDeclaration).getName();
154
+ case ts_morph_1.SyntaxKind.Constructor:
131
155
  return "constructor";
132
156
  default:
133
157
  // ancestor hasn't got a useful name
134
158
  return "";
135
159
  }
136
160
  }
137
- exports.getNameOfNode = getNameOfNode;
161
+ /**
162
+ * Gets the name of a node, if it has one
163
+ * @param a A node
164
+ * @returns The name of the node, or an empty string if it doesn't have one
165
+ */
166
+ function getParameters(a) {
167
+ let paramString = "";
168
+ switch (a.getKind()) {
169
+ case ts_morph_1.SyntaxKind.ClassDeclaration:
170
+ paramString = "<" + a.asKind(ts_morph_1.SyntaxKind.ClassDeclaration)?.getTypeParameters().map(tp => tp.getName()).join(", ") + ">";
171
+ break;
172
+ case ts_morph_1.SyntaxKind.InterfaceDeclaration:
173
+ paramString = "<" + a.asKind(ts_morph_1.SyntaxKind.InterfaceDeclaration)?.getTypeParameters().map(tp => tp.getName()).join(", ") + ">";
174
+ break;
175
+ case ts_morph_1.SyntaxKind.MethodDeclaration:
176
+ paramString = "<" + a.asKind(ts_morph_1.SyntaxKind.MethodDeclaration)?.getTypeParameters().map(tp => tp.getName()).join(", ") + ">";
177
+ break;
178
+ case ts_morph_1.SyntaxKind.FunctionDeclaration:
179
+ paramString = "<" + a.asKind(ts_morph_1.SyntaxKind.FunctionDeclaration)?.getTypeParameters().map(tp => tp.getName()).join(", ") + ">";
180
+ break;
181
+ default:
182
+ throw new Error(`getParameters called on a node that doesn't have parameters: ${a.getKindName()}`);
183
+ }
184
+ return paramString;
185
+ }
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Zxbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVlBLHdCQWtEQztBQUdELG9DQXdCQztBQU9ELHNDQXNGQztBQU9ELHNDQW1CQztBQWhORCx1Q0FBZ2Q7QUFDaGQsdUNBQXFEO0FBQ3JELGdEQUF3QjtBQUt4QixTQUFTLFNBQVMsQ0FBQyxJQUFVO0lBQ3pCLE9BQU8sZUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLGVBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksZUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksZUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLGVBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFblMsQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBQyxJQUFvQjtJQUN2QyxNQUFNLG1CQUFtQixHQUFHLDBCQUFnQixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUV4RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDeEMsSUFBSSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLElBQUksV0FBVyxHQUFxQixJQUFJLENBQUM7SUFFekMsT0FBTyxXQUFXLElBQUksQ0FBQyxlQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEYsTUFBTSxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7UUFDL0IsSUFBSSxlQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1lBQ3BDLGVBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7WUFDbkMsZUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztZQUN4QyxlQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDO1lBQ3ZDLGVBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFDckMsZUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztZQUNyQyxlQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDO1lBQ3ZDLGVBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUM7WUFDMUMsZUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQztZQUMxQyxlQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLEdBQUcsZUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtnQkFDN0QsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQywyQkFBMkIsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLENBQUM7WUFDbkgsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDO2FBQU0sSUFBSSxlQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztZQUNqQyxlQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUN6QixlQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1lBQ2xDLGVBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDbEMsZUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEMsZUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3pDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sSUFBSSxlQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ0osd0VBQXdFO1lBQ3hFLGtFQUFrRTtRQUN0RSxDQUFDO1FBQ0QsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBSUQsK0NBQStDO0lBQy9DLE1BQU0sWUFBWSxHQUFHLDBCQUFnQixDQUFDLHFCQUFxQixDQUN2RCxjQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUN6QixtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUUsZUFBZTtJQUV6RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFHRCxTQUFnQixZQUFZLENBQUMsSUFBVTtJQUNuQyxNQUFNLG1CQUFtQixHQUFHLDBCQUFnQixDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN4RSxJQUFJLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFekIsSUFBSSxJQUFJLFlBQVkscUJBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sMEJBQWdCLENBQUMscUJBQXFCLENBQUMsY0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUVELElBQUksV0FBVyxHQUFxQixJQUFJLENBQUM7SUFDekMsT0FBTyxXQUFXLEVBQUUsQ0FBQztRQUNqQixJQUFJLGVBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFlBQVksR0FBRywwQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoSixLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1lBQzFELE1BQU07UUFDVixDQUFDO2FBQU0sSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEQsbUVBQW1FO1lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDbEgsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLENBQU87SUFDakMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNsQixLQUFLLHFCQUFVLENBQUMsVUFBVTtZQUN0QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxVQUFVLENBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUxRCxLQUFLLHFCQUFVLENBQUMsaUJBQWlCO1lBQzdCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLGlCQUFpQixDQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0QsS0FBSyxxQkFBVSxDQUFDLGdCQUFnQjtZQUM1QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2xDLENBQUM7UUFFTCxLQUFLLHFCQUFVLENBQUMsb0JBQW9CO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3hELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEMsQ0FBQztRQUVMLEtBQUsscUJBQVUsQ0FBQyxtQkFBbUI7WUFDL0IsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFVLENBQUMsbUJBQW1CLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvRCxLQUFLLHFCQUFVLENBQUMsaUJBQWlCO1lBQzdCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLGlCQUFpQixDQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0QsS0FBSyxxQkFBVSxDQUFDLGlCQUFpQjtZQUM3QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2xDLENBQUM7UUFFTCxLQUFLLHFCQUFVLENBQUMsZUFBZTtZQUMzQixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxlQUFlLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUzRCxLQUFLLHFCQUFVLENBQUMsV0FBVztZQUN2QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxXQUFXLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2RCxLQUFLLHFCQUFVLENBQUMsV0FBVztZQUN2QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxXQUFXLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2RCxLQUFLLHFCQUFVLENBQUMsbUJBQW1CO1lBQy9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbEMsQ0FBQztRQUVMLEtBQUsscUJBQVUsQ0FBQyxrQkFBa0I7WUFDOUIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFVLENBQUMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7UUFFN0UsS0FBSyxxQkFBVSxDQUFDLFNBQVM7WUFDckIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFVLENBQUMsU0FBUyxDQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFckQsS0FBSyxxQkFBVSxDQUFDLG1CQUFtQjtZQUMvQixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxtQkFBbUIsQ0FBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9ELEtBQUsscUJBQVUsQ0FBQyxTQUFTO1lBQ3JCLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxTQUFTLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUzRCxLQUFLLHFCQUFVLENBQUMsYUFBYTtZQUN6QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxhQUFhLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV6RCxLQUFLLHFCQUFVLENBQUMsZUFBZTtZQUMzQixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxlQUFlLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUzRCxLQUFLLHFCQUFVLENBQUMsVUFBVTtZQUN0QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxVQUFVLENBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0RCxLQUFLLHFCQUFVLENBQUMsb0JBQW9CO1lBQ2hDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLG9CQUFvQixDQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFaEUsS0FBSyxxQkFBVSxDQUFDLFdBQVc7WUFDdkIsT0FBTyxhQUFhLENBQUM7UUFFekI7WUFDSSxvQ0FBb0M7WUFDcEMsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ1QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQUMsQ0FBTztJQUNqQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDckIsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNsQixLQUFLLHFCQUFVLENBQUMsZ0JBQWdCO1lBQzVCLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3hILE1BQU07UUFDVixLQUFLLHFCQUFVLENBQUMsb0JBQW9CO1lBQ2hDLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzVILE1BQU07UUFDVixLQUFLLHFCQUFVLENBQUMsaUJBQWlCO1lBQzdCLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3pILE1BQU07UUFDVixLQUFLLHFCQUFVLENBQUMsbUJBQW1CO1lBQy9CLFdBQVcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBVSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzNILE1BQU07UUFDVjtZQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcnJvd0Z1bmN0aW9uLCBDYWxsRXhwcmVzc2lvbiwgQ2xhc3NEZWNsYXJhdGlvbiwgQ2xhc3NFeHByZXNzaW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBEZWNvcmF0b3IsIEVudW1EZWNsYXJhdGlvbiwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgRnVuY3Rpb25FeHByZXNzaW9uLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBJZGVudGlmaWVyLCBJbXBvcnREZWNsYXJhdGlvbiwgSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24sIEludGVyZmFjZURlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kU2lnbmF0dXJlLCBNb2R1bGVEZWNsYXJhdGlvbiwgTm9kZSwgUHJvcGVydHlEZWNsYXJhdGlvbiwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgU291cmNlRmlsZSwgU3ludGF4S2luZCwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSBcInRzLW1vcnBoXCI7XHJcbmltcG9ydCB7IGVudGl0eURpY3Rpb25hcnksIGxvZ2dlciB9IGZyb20gXCIuL2FuYWx5emVcIjtcclxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHsgVHlwZURlY2xhcmF0aW9uIH0gZnJvbSBcIi4vZmFtaXhfZnVuY3Rpb25zL0VudGl0eURpY3Rpb25hcnlcIjtcclxuXHJcbnR5cGUgRlFOTm9kZSA9IFNvdXJjZUZpbGUgfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgQXJyb3dGdW5jdGlvbiB8IElkZW50aWZpZXIgfCBNZXRob2REZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgVHlwZURlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgSW1wb3J0RGVjbGFyYXRpb24gfCBJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiB8IENhbGxFeHByZXNzaW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgRGVjb3JhdG9yIHwgTW9kdWxlRGVjbGFyYXRpb247XHJcblxyXG5mdW5jdGlvbiBpc0ZRTk5vZGUobm9kZTogTm9kZSk6IG5vZGUgaXMgRlFOTm9kZSB7XHJcbiAgICByZXR1cm4gTm9kZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgfHwgTm9kZS5pc0Fycm93RnVuY3Rpb24obm9kZSkgfHwgTm9kZS5pc0lkZW50aWZpZXIobm9kZSkgfHwgTm9kZS5pc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IE5vZGUuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpIHx8IE5vZGUuaXNDbGFzc0V4cHJlc3Npb24obm9kZSkgfHwgTm9kZS5pc0RlY29yYXRvcihub2RlKSB8fCBOb2RlLmlzTW9kdWxlRGVjbGFyYXRpb24obm9kZSkgfHwgTm9kZS5pc0NhbGxFeHByZXNzaW9uKG5vZGUpO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZRTihub2RlOiBGUU5Ob2RlIHwgTm9kZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcm9qZWN0ID0gZW50aXR5RGljdGlvbmFyeS5mYW1peFJlcC5nZXRBYnNvbHV0ZVBhdGgoKTtcclxuXHJcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XHJcbiAgICBsZXQgcGFydHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCB1bmRlZmluZWQgPSBub2RlO1xyXG5cclxuICAgIHdoaWxlIChjdXJyZW50Tm9kZSAmJiAhTm9kZS5pc1NvdXJjZUZpbGUoY3VycmVudE5vZGUpKSB7XHJcbiAgICAgICAgY29uc3QgeyBsaW5lLCBjb2x1bW4gfSA9IHNvdXJjZUZpbGUuZ2V0TGluZUFuZENvbHVtbkF0UG9zKGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpO1xyXG4gICAgICAgIGNvbnN0IGxjID0gYCR7bGluZX06JHtjb2x1bW59YDtcclxuICAgICAgICBpZiAoTm9kZS5pc0NsYXNzRGVjbGFyYXRpb24oY3VycmVudE5vZGUpIHx8IFxyXG4gICAgICAgICAgICBOb2RlLmlzQ2xhc3NFeHByZXNzaW9uKGN1cnJlbnROb2RlKSB8fCBcclxuICAgICAgICAgICAgTm9kZS5pc0ludGVyZmFjZURlY2xhcmF0aW9uKGN1cnJlbnROb2RlKSB8fFxyXG4gICAgICAgICAgICBOb2RlLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihjdXJyZW50Tm9kZSkgfHwgXHJcbiAgICAgICAgICAgIE5vZGUuaXNNZXRob2REZWNsYXJhdGlvbihjdXJyZW50Tm9kZSkgfHwgXHJcbiAgICAgICAgICAgIE5vZGUuaXNNb2R1bGVEZWNsYXJhdGlvbihjdXJyZW50Tm9kZSkgfHwgXHJcbiAgICAgICAgICAgIE5vZGUuaXNWYXJpYWJsZURlY2xhcmF0aW9uKGN1cnJlbnROb2RlKSB8fCBcclxuICAgICAgICAgICAgTm9kZS5pc0dldEFjY2Vzc29yRGVjbGFyYXRpb24oY3VycmVudE5vZGUpIHx8XHJcbiAgICAgICAgICAgIE5vZGUuaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKGN1cnJlbnROb2RlKSB8fFxyXG4gICAgICAgICAgICBOb2RlLmlzSWRlbnRpZmllcihjdXJyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgbGV0IG5hbWUgPSBOb2RlLmlzSWRlbnRpZmllcihjdXJyZW50Tm9kZSkgPyBjdXJyZW50Tm9kZS5nZXRUZXh0KCkgXHJcbiAgICAgICAgICAgICAgICA6IGdldE5hbWVPZk5vZGUoY3VycmVudE5vZGUpIC8qIGN1cnJlbnROb2RlLmdldE5hbWUoKSAqLyB8fCAnVW5uYW1lZF8nICsgY3VycmVudE5vZGUuZ2V0S2luZE5hbWUoKSArIGAoJHtsY30pYDtcclxuICAgICAgICAgICAgcGFydHMudW5zaGlmdChuYW1lKTtcclxuICAgICAgICB9IGVsc2UgaWYgKE5vZGUuaXNBcnJvd0Z1bmN0aW9uKGN1cnJlbnROb2RlKSB8fCBcclxuICAgICAgICAgICAgICAgICAgIE5vZGUuaXNCbG9jayhjdXJyZW50Tm9kZSkgfHwgXHJcbiAgICAgICAgICAgICAgICAgICBOb2RlLmlzRm9ySW5TdGF0ZW1lbnQoY3VycmVudE5vZGUpIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgTm9kZS5pc0Zvck9mU3RhdGVtZW50KGN1cnJlbnROb2RlKSB8fCBcclxuICAgICAgICAgICAgICAgICAgIE5vZGUuaXNGb3JTdGF0ZW1lbnQoY3VycmVudE5vZGUpIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgTm9kZS5pc0NhdGNoQ2xhdXNlKGN1cnJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICBwYXJ0cy51bnNoaWZ0KGAke2N1cnJlbnROb2RlLmdldEtpbmROYW1lKCl9KCR7bGN9KWApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoTm9kZS5pc0NvbnN0cnVjdG9yRGVjbGFyYXRpb24oY3VycmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQoYGNvbnN0cnVjdG9yYCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRm9yIG90aGVyIGtpbmRzLCB5b3UgbWlnaHQgd2FudCB0byBoYW5kbGUgdGhlbSBzcGVjaWZpY2FsbHkgb3IgaWdub3JlXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYElnbm9yaW5nIG5vZGUga2luZDogJHtjdXJyZW50Tm9kZS5nZXRLaW5kTmFtZSgpfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8gUHJlcGVuZCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgc291cmNlIGZpbGVcclxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGVudGl0eURpY3Rpb25hcnkuY29udmVydFRvUmVsYXRpdmVQYXRoKFxyXG4gICAgICAgIHBhdGgubm9ybWFsaXplKHNvdXJjZUZpbGUuZ2V0RmlsZVBhdGgoKSksIFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlUGF0aFByb2plY3QpLnJlcGxhY2UoL1xcXFwvc2csIFwiL1wiKTtcclxuICAgIHBhcnRzLnVuc2hpZnQoYHske3JlbGF0aXZlUGF0aH19YCk7XHJcbiAgICBjb25zdCBmcW4gPSBwYXJ0cy5qb2luKFwiLlwiKSArIGBbJHtub2RlLmdldEtpbmROYW1lKCl9XWA7ICAvLyBkaXNhbWJpZ3VhdGVcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoZnFuKTtcclxuICAgIHJldHVybiBmcW47XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlRlFOKG5vZGU6IE5vZGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoUHJvamVjdCA9IGVudGl0eURpY3Rpb25hcnkuZmFtaXhSZXAuZ2V0QWJzb2x1dGVQYXRoKCk7XHJcbiAgICBsZXQgcGFydHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VGaWxlKSB7XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eURpY3Rpb25hcnkuY29udmVydFRvUmVsYXRpdmVQYXRoKHBhdGgubm9ybWFsaXplKG5vZGUuZ2V0RmlsZVBhdGgoKSksIGFic29sdXRlUGF0aFByb2plY3QpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGU7XHJcbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICBpZiAoTm9kZS5pc1NvdXJjZUZpbGUoY3VycmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGVudGl0eURpY3Rpb25hcnkuY29udmVydFRvUmVsYXRpdmVQYXRoKHBhdGgubm9ybWFsaXplKGN1cnJlbnROb2RlLmdldEZpbGVQYXRoKCkpLCBhYnNvbHV0ZVBhdGhQcm9qZWN0KS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcclxuICAgICAgICAgICAgcGFydHMudW5zaGlmdChyZWxhdGl2ZVBhdGgpOyAvLyBBZGQgZmlsZSBwYXRoIGF0IHRoZSBzdGFydFxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnROb2RlLmdldFN5bWJvbCgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjdXJyZW50Tm9kZS5nZXRTeW1ib2woKSEuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICAvLyBGb3IgYW5vbnltb3VzIG5vZGVzLCB1c2Uga2luZCBhbmQgcG9zaXRpb24gYXMgdW5pcXVlIGlkZW50aWZpZXJzXHJcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBuYW1lICE9PSBcIl9fY29tcHV0ZWRcIiA/IG5hbWUgOiBgJHtjdXJyZW50Tm9kZS5nZXRLaW5kTmFtZSgpfV8ke2N1cnJlbnROb2RlLmdldFN0YXJ0TGluZVBvcygpfWA7XHJcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQoaWRlbnRpZmllcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCI6OlwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG5hbWUgb2YgYSBub2RlLCBpZiBpdCBoYXMgb25lXHJcbiAqIEBwYXJhbSBhIEEgbm9kZVxyXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgbm9kZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lT2ZOb2RlKGE6IE5vZGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChhLmdldEtpbmQoKSkge1xyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5Tb3VyY2VGaWxlOlxyXG4gICAgICAgICAgICByZXR1cm4gYS5hc0tpbmQoU3ludGF4S2luZC5Tb3VyY2VGaWxlKSEuZ2V0QmFzZU5hbWUoKTtcclxuXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uOlxyXG4gICAgICAgICAgICByZXR1cm4gYS5hc0tpbmQoU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikhLmdldE5hbWUoKTsgXHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uOlxyXG4gICAgICAgICAgICBjb25zdCBjS2luZCA9IGEuYXNLaW5kKFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChjS2luZCAmJiBjS2luZC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjS2luZC5nZXROYW1lKCkgKyBnZXRQYXJhbWV0ZXJzKGEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNLaW5kPy5nZXROYW1lKCkgfHwgXCJcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIGNvbnN0IGlLaW5kID0gYS5hc0tpbmQoU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChpS2luZCAmJiBpS2luZC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpS2luZC5nZXROYW1lKCkgKyBnZXRQYXJhbWV0ZXJzKGEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlLaW5kPy5nZXROYW1lKCkgfHwgXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb24pIS5nZXROYW1lKCk7ICAgIFxyXG5cclxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJvcGVydHlTaWduYXR1cmU6XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLlByb3BlcnR5U2lnbmF0dXJlKSEuZ2V0TmFtZSgpOyAgICBcclxuICAgIFxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5NZXRob2REZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgY29uc3QgbUtpbmQgPSBhLmFzS2luZChTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uKTtcclxuICAgICAgICAgICAgaWYgKG1LaW5kICYmIG1LaW5kLmdldFR5cGVQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1LaW5kLmdldE5hbWUoKSArIGdldFBhcmFtZXRlcnMoYSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbUtpbmQ/LmdldE5hbWUoKSB8fCBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5NZXRob2RTaWduYXR1cmU6XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLk1ldGhvZFNpZ25hdHVyZSkhLmdldE5hbWUoKTsgICBcclxuXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkdldEFjY2Vzc29yOlxyXG4gICAgICAgICAgICByZXR1cm4gYS5hc0tpbmQoU3ludGF4S2luZC5HZXRBY2Nlc3NvcikhLmdldE5hbWUoKTtcclxuXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlNldEFjY2Vzc29yOlxyXG4gICAgICAgICAgICByZXR1cm4gYS5hc0tpbmQoU3ludGF4S2luZC5TZXRBY2Nlc3NvcikhLmdldE5hbWUoKTtcclxuICAgIFxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5GdW5jdGlvbkRlY2xhcmF0aW9uOlxyXG4gICAgICAgICAgICBjb25zdCBmS2luZCA9IGEuYXNLaW5kKFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChmS2luZCAmJiBmS2luZC5nZXRUeXBlUGFyYW1ldGVycygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmS2luZC5nZXROYW1lKCkgKyBnZXRQYXJhbWV0ZXJzKGEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZLaW5kPy5nZXROYW1lKCkgfHwgXCJcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uOlxyXG4gICAgICAgICAgICByZXR1cm4gYS5hc0tpbmQoU3ludGF4S2luZC5GdW5jdGlvbkV4cHJlc3Npb24pPy5nZXROYW1lKCkgfHwgXCJhbm9ueW1vdXNcIjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlBhcmFtZXRlcjpcclxuICAgICAgICAgICAgcmV0dXJuIGEuYXNLaW5kKFN5bnRheEtpbmQuUGFyYW1ldGVyKSEuZ2V0TmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5EZWNvcmF0b3I6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkBcIiArIGEuYXNLaW5kKFN5bnRheEtpbmQuRGVjb3JhdG9yKSEuZ2V0TmFtZSgpOyAgICBcclxuXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlR5cGVQYXJhbWV0ZXI6XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLlR5cGVQYXJhbWV0ZXIpIS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5FbnVtRGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLkVudW1EZWNsYXJhdGlvbikhLmdldE5hbWUoKTtcclxuXHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkVudW1NZW1iZXI6XHJcbiAgICAgICAgICAgIHJldHVybiBhLmFzS2luZChTeW50YXhLaW5kLkVudW1NZW1iZXIpIS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5UeXBlQWxpYXNEZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgcmV0dXJuIGEuYXNLaW5kKFN5bnRheEtpbmQuVHlwZUFsaWFzRGVjbGFyYXRpb24pIS5nZXROYW1lKCk7XHJcblxyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5Db25zdHJ1Y3RvcjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY29uc3RydWN0b3JcIjsgICBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgLy8gYW5jZXN0b3IgaGFzbid0IGdvdCBhIHVzZWZ1bCBuYW1lXHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIG5hbWUgb2YgYSBub2RlLCBpZiBpdCBoYXMgb25lXHJcbiAqIEBwYXJhbSBhIEEgbm9kZVxyXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgbm9kZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbWV0ZXJzKGE6IE5vZGUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHBhcmFtU3RyaW5nID0gXCJcIjtcclxuICAgIHN3aXRjaCAoYS5nZXRLaW5kKCkpIHtcclxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgcGFyYW1TdHJpbmcgPSBcIjxcIiArIGEuYXNLaW5kKFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbik/LmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKHRwID0+IHRwLmdldE5hbWUoKSkuam9pbihcIiwgXCIpICsgXCI+XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbjpcclxuICAgICAgICAgICAgcGFyYW1TdHJpbmcgPSBcIjxcIiArIGEuYXNLaW5kKFN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb24pPy5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCh0cCA9PiB0cC5nZXROYW1lKCkpLmpvaW4oXCIsIFwiKSArIFwiPlwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIHBhcmFtU3RyaW5nID0gXCI8XCIgKyBhLmFzS2luZChTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uKT8uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAodHAgPT4gdHAuZ2V0TmFtZSgpKS5qb2luKFwiLCBcIikgKyBcIj5cIjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XHJcbiAgICAgICAgICAgIHBhcmFtU3RyaW5nID0gXCI8XCIgKyBhLmFzS2luZChTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24pPy5nZXRUeXBlUGFyYW1ldGVycygpLm1hcCh0cCA9PiB0cC5nZXROYW1lKCkpLmpvaW4oXCIsIFwiKSArIFwiPlwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFBhcmFtZXRlcnMgY2FsbGVkIG9uIGEgbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBwYXJhbWV0ZXJzOiAke2EuZ2V0S2luZE5hbWUoKX1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbVN0cmluZztcclxufVxyXG4iXX0=
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FamixJSONExporter = void 0;
4
+ const famix_base_element_1 = require("./famix_base_element");
5
+ /**
6
+ * This class is used to export Famix elements to JSON
7
+ */
8
+ class FamixJSONExporter {
9
+ /**
10
+ * Constructor of the FamixJSONExporter class
11
+ * @param packageClass Name of a Famix class
12
+ * @param element A Famix element to export, this element is an instance of the class named "packageClass"
13
+ */
14
+ constructor(packageClass, element) {
15
+ this.bufferArray = {}; // A buffer to store the properties of the Famix element
16
+ this.FamixPrefix = "FamixTypeScript"; // Prefix of the Famix element
17
+ this.element = element;
18
+ this.bufferArray["FM3"] = this.FamixPrefix + "." + packageClass;
19
+ this.bufferArray["id"] = this.element.id;
20
+ }
21
+ /**
22
+ * Adds a property to the Famix element
23
+ * @param name Name of the property
24
+ * @param prop A property
25
+ */
26
+ addProperty(name, prop) {
27
+ if (prop instanceof Set) {
28
+ const valueArray = [];
29
+ for (const value of Array.from(prop.values())) {
30
+ if (value instanceof famix_base_element_1.FamixBaseElement) {
31
+ valueArray.push({ "ref": value.id });
32
+ }
33
+ else {
34
+ valueArray.push(value);
35
+ }
36
+ }
37
+ this.bufferArray[name] = valueArray;
38
+ }
39
+ else if (prop instanceof famix_base_element_1.FamixBaseElement) {
40
+ this.bufferArray[name] = { "ref": prop.id };
41
+ }
42
+ else if (prop !== undefined && !(prop instanceof Set)) {
43
+ this.bufferArray[name] = prop;
44
+ }
45
+ }
46
+ /**
47
+ * Gets a JSON representation of the Famix element
48
+ * @returns A JSON representation of the Famix element
49
+ */
50
+ getJSON() {
51
+ return JSON.stringify(this.bufferArray);
52
+ }
53
+ }
54
+ exports.FamixJSONExporter = FamixJSONExporter;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaXhfSlNPTl9leHBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZmFtaXgvZmFtaXhfSlNPTl9leHBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBd0Q7QUFFeEQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQU0xQjs7OztPQUlHO0lBQ0gsWUFBWSxZQUFvQixFQUFFLE9BQXlCO1FBUm5ELGdCQUFXLEdBQVEsRUFBRSxDQUFDLENBQUMsd0RBQXdEO1FBQy9FLGdCQUFXLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyw4QkFBOEI7UUFRbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxJQUFZLEVBQUUsSUFBYTtRQUMxQyxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN0QixNQUFNLFVBQVUsR0FBbUIsRUFBRSxDQUFDO1lBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLEtBQUssWUFBWSxxQ0FBZ0IsRUFBRSxDQUFDO29CQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO3FCQUNJLENBQUM7b0JBQ0YsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUN4QyxDQUFDO2FBQ0ksSUFBSSxJQUFJLFlBQVkscUNBQWdCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRCxDQUFDO2FBQ0ksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQWxERCw4Q0FrREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYW1peEJhc2VFbGVtZW50IH0gZnJvbSBcIi4vZmFtaXhfYmFzZV9lbGVtZW50XCI7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGV4cG9ydCBGYW1peCBlbGVtZW50cyB0byBKU09OXG4gKi9cbmV4cG9ydCBjbGFzcyBGYW1peEpTT05FeHBvcnRlciB7XG5cbiAgICBwcml2YXRlIGVsZW1lbnQ6IEZhbWl4QmFzZUVsZW1lbnQ7IC8vIEEgRmFtaXggZWxlbWVudCB0byBleHBvcnRcbiAgICBwcml2YXRlIGJ1ZmZlckFycmF5OiBhbnkgPSB7fTsgLy8gQSBidWZmZXIgdG8gc3RvcmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEZhbWl4IGVsZW1lbnRcbiAgICBwcml2YXRlIEZhbWl4UHJlZml4ID0gXCJGYW1peFR5cGVTY3JpcHRcIjsgLy8gUHJlZml4IG9mIHRoZSBGYW1peCBlbGVtZW50XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBvZiB0aGUgRmFtaXhKU09ORXhwb3J0ZXIgY2xhc3NcbiAgICAgKiBAcGFyYW0gcGFja2FnZUNsYXNzIE5hbWUgb2YgYSBGYW1peCBjbGFzc1xuICAgICAqIEBwYXJhbSBlbGVtZW50IEEgRmFtaXggZWxlbWVudCB0byBleHBvcnQsIHRoaXMgZWxlbWVudCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbmFtZWQgXCJwYWNrYWdlQ2xhc3NcIlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhY2thZ2VDbGFzczogc3RyaW5nLCBlbGVtZW50OiBGYW1peEJhc2VFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYnVmZmVyQXJyYXlbXCJGTTNcIl0gPSB0aGlzLkZhbWl4UHJlZml4ICsgXCIuXCIgKyBwYWNrYWdlQ2xhc3M7XG4gICAgICAgIHRoaXMuYnVmZmVyQXJyYXlbXCJpZFwiXSA9IHRoaXMuZWxlbWVudC5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJvcGVydHkgdG8gdGhlIEZhbWl4IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSBwcm9wIEEgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUHJvcGVydHkobmFtZTogc3RyaW5nLCBwcm9wOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFycmF5OiBBcnJheTx1bmtub3duPiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBBcnJheS5mcm9tKHByb3AudmFsdWVzKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmFtaXhCYXNlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUFycmF5LnB1c2goeyBcInJlZlwiOiB2YWx1ZS5pZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJBcnJheVtuYW1lXSA9IHZhbHVlQXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZhbWl4QmFzZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyQXJyYXlbbmFtZV0gPSB7IFwicmVmXCI6IHByb3AuaWQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm9wICE9PSB1bmRlZmluZWQgJiYgIShwcm9wIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJBcnJheVtuYW1lXSA9IHByb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmFtaXggZWxlbWVudFxuICAgICAqIEByZXR1cm5zIEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmFtaXggZWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRKU09OKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmJ1ZmZlckFycmF5KTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FamixBaseElement = void 0;
4
+ const analyze_1 = require("../../analyze");
5
+ // import { FamixRepository } from "./famix_repository";
6
+ class FamixBaseElement {
7
+ // constructor(repo: FamixRepository) {
8
+ // repo.addElement(this);
9
+ // }
10
+ constructor() {
11
+ }
12
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+ addPropertiesToExporter(exporter) {
14
+ analyze_1.logger.debug("addPropertiesToExporter not implemented for " + this.constructor.name + `(${exporter})`);
15
+ }
16
+ }
17
+ exports.FamixBaseElement = FamixBaseElement;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaXhfYmFzZV9lbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9mYW1peC9mYW1peF9iYXNlX2VsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBRXZDLHdEQUF3RDtBQUV4RCxNQUFzQixnQkFBZ0I7SUFJbEMsdUNBQXVDO0lBQ3ZDLDJCQUEyQjtJQUMzQixJQUFJO0lBRUo7SUFDQSxDQUFDO0lBSUQsNkRBQTZEO0lBQ3RELHVCQUF1QixDQUFDLFFBQTJCO1FBQ3RELGdCQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUMzRyxDQUFDO0NBQ0o7QUFqQkQsNENBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uLy4uL2FuYWx5emVcIjtcbmltcG9ydCB7IEZhbWl4SlNPTkV4cG9ydGVyIH0gZnJvbSBcIi4vZmFtaXhfSlNPTl9leHBvcnRlclwiO1xuLy8gaW1wb3J0IHsgRmFtaXhSZXBvc2l0b3J5IH0gZnJvbSBcIi4vZmFtaXhfcmVwb3NpdG9yeVwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmFtaXhCYXNlRWxlbWVudCB7XG5cbiAgICBwdWJsaWMgaWQhOiBudW1iZXI7XG5cbiAgICAvLyBjb25zdHJ1Y3RvcihyZXBvOiBGYW1peFJlcG9zaXRvcnkpIHtcbiAgICAvLyAgIHJlcG8uYWRkRWxlbWVudCh0aGlzKTtcbiAgICAvLyB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0SlNPTigpOiBzdHJpbmc7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGFkZFByb3BlcnRpZXNUb0V4cG9ydGVyKGV4cG9ydGVyOiBGYW1peEpTT05FeHBvcnRlcik6IHZvaWQge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJhZGRQcm9wZXJ0aWVzVG9FeHBvcnRlciBub3QgaW1wbGVtZW50ZWQgZm9yIFwiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgYCgke2V4cG9ydGVyfSlgKTtcbiAgICB9XG59XG4iXX0=