ts2famix 2.0.0 → 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 (212) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +29 -60
  3. package/dist/analyze.js +1 -1
  4. package/dist/analyze_functions/process_functions.js +49 -43
  5. package/dist/famix_functions/EntityDictionary.js +309 -182
  6. package/dist/famix_functions/helpers_creation.js +36 -5
  7. package/dist/fqn.js +76 -114
  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 -1
  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/{src/model → model}/famix/index.js +6 -10
  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 +2 -2
  55. package/dist/refactorer/refactor-getter-setter.js +142 -0
  56. package/dist/ts2famix-cli-wrapper.js +29 -3
  57. package/dist/ts2famix-cli.js +1 -1
  58. package/doc-uml/famix-typescript-model.puml +390 -341
  59. package/doc-uml/famix-typescript-model.svg +1 -1
  60. package/package.json +8 -7
  61. package/src/analyze.ts +2 -2
  62. package/src/analyze_functions/process_functions.ts +49 -44
  63. package/src/famix_functions/EntityDictionary.ts +345 -216
  64. package/src/famix_functions/helpers_creation.ts +36 -4
  65. package/src/fqn.ts +76 -125
  66. package/src/lib/famix/famix_JSON_exporter.ts +56 -0
  67. package/src/lib/famix/famix_base_element.ts +22 -0
  68. package/src/lib/famix/famix_repository.ts +243 -0
  69. package/src/lib/famix/model/famix/access.ts +50 -0
  70. package/src/lib/famix/model/famix/alias.ts +39 -0
  71. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -0
  72. package/src/lib/famix/model/famix/class.ts +85 -0
  73. package/src/lib/famix/model/famix/comment.ts +47 -0
  74. package/src/lib/famix/model/famix/concretisation.ts +40 -0
  75. package/src/lib/famix/model/famix/container_entity.ts +160 -0
  76. package/src/lib/famix/model/famix/decorator.ts +37 -0
  77. package/src/lib/famix/model/famix/enum.ts +30 -0
  78. package/src/lib/famix/model/famix/enum_value.ts +28 -0
  79. package/src/lib/famix/model/famix/import_clause.ts +51 -0
  80. package/src/lib/famix/{src/model → model}/famix/index.ts +2 -4
  81. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -0
  82. package/src/lib/famix/model/famix/inheritance.ts +40 -0
  83. package/src/lib/famix/model/famix/interface.ts +75 -0
  84. package/src/lib/famix/model/famix/invocation.ts +65 -0
  85. package/src/lib/famix/model/famix/method.ts +89 -0
  86. package/src/lib/famix/model/famix/module.ts +71 -0
  87. package/src/lib/famix/model/famix/named_entity.ts +95 -0
  88. package/src/lib/famix/{src/model → model}/famix/parameter.ts +11 -12
  89. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -0
  90. package/src/lib/famix/model/famix/parameter_type.ts +58 -0
  91. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -0
  92. package/src/lib/famix/model/famix/parametric_class.ts +49 -0
  93. package/src/lib/famix/model/famix/parametric_function.ts +32 -0
  94. package/src/lib/famix/model/famix/parametric_interface.ts +49 -0
  95. package/src/lib/famix/model/famix/parametric_method.ts +32 -0
  96. package/src/lib/famix/model/famix/primitive_type.ts +15 -0
  97. package/src/lib/famix/model/famix/property.ts +94 -0
  98. package/src/lib/famix/model/famix/reference.ts +40 -0
  99. package/src/lib/famix/model/famix/scoping_entity.ts +35 -0
  100. package/src/lib/famix/model/famix/script_entity.ts +34 -0
  101. package/src/lib/famix/model/famix/source_anchor.ts +30 -0
  102. package/src/lib/famix/model/famix/source_language.ts +35 -0
  103. package/src/lib/famix/model/famix/sourced_entity.ts +70 -0
  104. package/src/lib/famix/model/famix/structural_entity.ts +43 -0
  105. package/src/lib/famix/model/famix/type.ts +87 -0
  106. package/src/lib/famix/model/famix/variable.ts +27 -0
  107. package/src/lib/famix/package.json +1 -1
  108. package/src/lib/ts-complex/cyclomatic-service.ts +10 -10
  109. package/src/refactorer/refactor-getter-setter.ts +140 -0
  110. package/src/ts2famix-cli-wrapper.ts +6 -2
  111. package/src/ts2famix-cli.ts +1 -1
  112. package/tsconfig.check-tests.json +14 -0
  113. package/tsconfig.json +70 -68
  114. package/dist/famix2puml.js +0 -126
  115. package/dist/lib/famix/src/famix_JSON_exporter.js +0 -55
  116. package/dist/lib/famix/src/famix_base_element.js +0 -18
  117. package/dist/lib/famix/src/famix_repository.js +0 -223
  118. package/dist/lib/famix/src/model/famix/access.js +0 -40
  119. package/dist/lib/famix/src/model/famix/accessor.js +0 -17
  120. package/dist/lib/famix/src/model/famix/alias.js +0 -33
  121. package/dist/lib/famix/src/model/famix/arrowFunction.js +0 -17
  122. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -79
  123. package/dist/lib/famix/src/model/famix/class.js +0 -71
  124. package/dist/lib/famix/src/model/famix/comment.js +0 -39
  125. package/dist/lib/famix/src/model/famix/concretisation.js +0 -31
  126. package/dist/lib/famix/src/model/famix/container_entity.js +0 -126
  127. package/dist/lib/famix/src/model/famix/decorator.js +0 -32
  128. package/dist/lib/famix/src/model/famix/entity.js +0 -17
  129. package/dist/lib/famix/src/model/famix/enum.js +0 -31
  130. package/dist/lib/famix/src/model/famix/enum_value.js +0 -25
  131. package/dist/lib/famix/src/model/famix/function.js +0 -17
  132. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -17
  133. package/dist/lib/famix/src/model/famix/import_clause.js +0 -41
  134. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -52
  135. package/dist/lib/famix/src/model/famix/inheritance.js +0 -33
  136. package/dist/lib/famix/src/model/famix/interface.js +0 -64
  137. package/dist/lib/famix/src/model/famix/invocation.js +0 -54
  138. package/dist/lib/famix/src/model/famix/method.js +0 -67
  139. package/dist/lib/famix/src/model/famix/module.js +0 -84
  140. package/dist/lib/famix/src/model/famix/named_entity.js +0 -78
  141. package/dist/lib/famix/src/model/famix/parameter.js +0 -25
  142. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +0 -44
  143. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -45
  144. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +0 -31
  145. package/dist/lib/famix/src/model/famix/parametric_class.js +0 -44
  146. package/dist/lib/famix/src/model/famix/parametric_function.js +0 -31
  147. package/dist/lib/famix/src/model/famix/parametric_interface.js +0 -44
  148. package/dist/lib/famix/src/model/famix/parametric_method.js +0 -31
  149. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -17
  150. package/dist/lib/famix/src/model/famix/property.js +0 -126
  151. package/dist/lib/famix/src/model/famix/reference.js +0 -33
  152. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -37
  153. package/dist/lib/famix/src/model/famix/script_entity.js +0 -29
  154. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -27
  155. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  156. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -60
  157. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -39
  158. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -38
  159. package/dist/lib/famix/src/model/famix/type.js +0 -73
  160. package/dist/lib/famix/src/model/famix/variable.js +0 -24
  161. package/jest.config-old.ts +0 -199
  162. package/src/famix2puml.ts +0 -119
  163. package/src/lib/famix/package-lock.json +0 -301
  164. package/src/lib/famix/readme.md +0 -5
  165. package/src/lib/famix/src/famix_JSON_exporter.ts +0 -56
  166. package/src/lib/famix/src/famix_base_element.ts +0 -22
  167. package/src/lib/famix/src/famix_repository.ts +0 -243
  168. package/src/lib/famix/src/model/famix/access.ts +0 -53
  169. package/src/lib/famix/src/model/famix/alias.ts +0 -41
  170. package/src/lib/famix/src/model/famix/behavioral_entity.ts +0 -100
  171. package/src/lib/famix/src/model/famix/class.ts +0 -86
  172. package/src/lib/famix/src/model/famix/comment.ts +0 -50
  173. package/src/lib/famix/src/model/famix/concretisation.ts +0 -42
  174. package/src/lib/famix/src/model/famix/container_entity.ts +0 -165
  175. package/src/lib/famix/src/model/famix/decorator.ts +0 -39
  176. package/src/lib/famix/src/model/famix/enum.ts +0 -31
  177. package/src/lib/famix/src/model/famix/enum_value.ts +0 -29
  178. package/src/lib/famix/src/model/famix/implicit_variable.ts +0 -15
  179. package/src/lib/famix/src/model/famix/import_clause.ts +0 -54
  180. package/src/lib/famix/src/model/famix/indexed_file_anchor.ts +0 -71
  181. package/src/lib/famix/src/model/famix/inheritance.ts +0 -41
  182. package/src/lib/famix/src/model/famix/interface.ts +0 -75
  183. package/src/lib/famix/src/model/famix/invocation.ts +0 -68
  184. package/src/lib/famix/src/model/famix/method.ts +0 -96
  185. package/src/lib/famix/src/model/famix/module.ts +0 -97
  186. package/src/lib/famix/src/model/famix/named_entity.ts +0 -98
  187. package/src/lib/famix/src/model/famix/parameterConcretisation.ts +0 -54
  188. package/src/lib/famix/src/model/famix/parameter_type.ts +0 -60
  189. package/src/lib/famix/src/model/famix/parametric_arrow_function.ts +0 -32
  190. package/src/lib/famix/src/model/famix/parametric_class.ts +0 -49
  191. package/src/lib/famix/src/model/famix/parametric_function.ts +0 -32
  192. package/src/lib/famix/src/model/famix/parametric_interface.ts +0 -49
  193. package/src/lib/famix/src/model/famix/parametric_method.ts +0 -32
  194. package/src/lib/famix/src/model/famix/primitive_type.ts +0 -15
  195. package/src/lib/famix/src/model/famix/property.ts +0 -152
  196. package/src/lib/famix/src/model/famix/reference.ts +0 -42
  197. package/src/lib/famix/src/model/famix/scoping_entity.ts +0 -36
  198. package/src/lib/famix/src/model/famix/script_entity.ts +0 -36
  199. package/src/lib/famix/src/model/famix/source_anchor.ts +0 -31
  200. package/src/lib/famix/src/model/famix/source_language.ts +0 -36
  201. package/src/lib/famix/src/model/famix/sourced_entity.ts +0 -73
  202. package/src/lib/famix/src/model/famix/structural_entity.ts +0 -44
  203. package/src/lib/famix/src/model/famix/text_anchor.ts +0 -49
  204. package/src/lib/famix/src/model/famix/type.ts +0 -89
  205. package/src/lib/famix/src/model/famix/variable.ts +0 -28
  206. package/src/lib/famix/tsconfig.json +0 -27
  207. package/src/lib/famix/tslint.json +0 -15
  208. /package/src/lib/famix/{src/index.ts → index.ts} +0 -0
  209. /package/src/lib/famix/{src/model → model}/famix/accessor.ts +0 -0
  210. /package/src/lib/famix/{src/model/famix/arrowFunction.ts → model/famix/arrow_function.ts} +0 -0
  211. /package/src/lib/famix/{src/model → model}/famix/entity.ts +0 -0
  212. /package/src/lib/famix/{src/model → model}/famix/function.ts +0 -0
@@ -25,4 +25,4 @@
25
25
  "tslint": "^5.20.0",
26
26
  "typescript": "^3.6.3"
27
27
  }
28
- }
28
+ }
@@ -12,21 +12,21 @@ The above copyright notice and this permission notice shall be included in all c
12
12
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
13
  */
14
14
 
15
- import { forEachChild, isIdentifier, SyntaxKind, createSourceFile, ScriptTarget } from 'typescript';
15
+ import { forEachChild, isIdentifier, SyntaxKind, createSourceFile, ScriptTarget, Node, CaseClause, BinaryExpression, FunctionLikeDeclaration } from 'typescript';
16
16
  import { isFunctionWithBody } from 'tsutils';
17
- import { existsSync, readFileSync } from 'fs';
17
+ import { existsSync, PathLike, readFileSync } from 'fs';
18
18
 
19
- const getNodeName = (node) => {
19
+ const getNodeName = (node: FunctionLikeDeclaration) => {
20
20
  const { name, pos, end } = node;
21
21
  const key = name !== undefined && isIdentifier(name) ? name.text : JSON.stringify({ pos, end });
22
22
  return key;
23
23
  };
24
24
 
25
- const increasesComplexity = (node) => {
25
+ const increasesComplexity = (node: Node) => {
26
26
  /* eslint-disable indent */
27
27
  switch (node.kind) {
28
28
  case SyntaxKind.CaseClause:
29
- return node.statements.length > 0;
29
+ return (node as CaseClause).statements.length > 0;
30
30
  case SyntaxKind.CatchClause:
31
31
  case SyntaxKind.ConditionalExpression:
32
32
  case SyntaxKind.DoStatement:
@@ -38,7 +38,7 @@ const increasesComplexity = (node) => {
38
38
  return true;
39
39
 
40
40
  case SyntaxKind.BinaryExpression:
41
- switch (node.operatorToken.kind) {
41
+ switch ((node as BinaryExpression).operatorToken.kind) {
42
42
  case SyntaxKind.BarBarToken:
43
43
  case SyntaxKind.AmpersandAmpersandToken:
44
44
  return true;
@@ -52,9 +52,9 @@ const increasesComplexity = (node) => {
52
52
  /* eslint-enable indent */
53
53
  };
54
54
 
55
- const calculateFromSource = (ctx) => {
55
+ const calculateFromSource = (ctx: Node) => {
56
56
  let complexity = 0;
57
- const output = {};
57
+ const output: { [key: string]: number } = {};
58
58
  forEachChild(ctx, function cb(node) {
59
59
  if (isFunctionWithBody(node)) {
60
60
  const old = complexity;
@@ -73,11 +73,11 @@ const calculateFromSource = (ctx) => {
73
73
  return output;
74
74
  };
75
75
 
76
- export const calculate = (filePath) => {
76
+ export const calculate = (filePath: PathLike) => {
77
77
  if (!existsSync(filePath)) {
78
78
  throw new Error(`File "${filePath}" does not exists`);
79
79
  }
80
80
  const sourceText = readFileSync(filePath).toString();
81
- const source = createSourceFile(filePath, sourceText, ScriptTarget.ES2015);
81
+ const source = createSourceFile(filePath.toString(), sourceText, ScriptTarget.ES2015);
82
82
  return calculateFromSource(source);
83
83
  };
@@ -0,0 +1,140 @@
1
+ import { ClassDeclaration, Project, SourceFile, SyntaxKind } from "ts-morph";
2
+ import * as path from "path";
3
+
4
+ const project = new Project();
5
+ project.addSourceFilesAtPaths("src/lib/famix/model/famix/famix_base_element.ts");
6
+ project.getSourceFiles().forEach(sourceFile => { console.log(sourceFile.getFilePath()); });
7
+
8
+ project.getSourceFiles().forEach(sourceFile => {
9
+ const typeMap = createTypeMap(sourceFile);
10
+
11
+ const classes = sourceFile.getClasses();
12
+ classes.forEach(cls => {
13
+ const properties = cls.getProperties();
14
+ cls.getMethods().forEach(method => {
15
+ const methodName = method.getName();
16
+ let propName: string;
17
+
18
+ if (isEligibleGetter(methodName)) {
19
+ propName = methodName.charAt(3).toLowerCase() + methodName.slice(4);
20
+ renamePropertyIfExists(cls, propName, properties);
21
+ refactorToGetter(cls, method, propName, typeMap);
22
+ replaceMethodCalls(cls, `get${capitalize(propName)}`, propName);
23
+ } else if (isEligibleSetter(methodName)) {
24
+ propName = methodName.charAt(3).toLowerCase() + methodName.slice(4);
25
+ renamePropertyIfExists(cls, propName, properties);
26
+ refactorToSetter(cls, method, propName, typeMap);
27
+ replaceMethodCalls(cls, `set${capitalize(propName)}`, propName);
28
+ }
29
+ });
30
+ });
31
+ });
32
+
33
+ project.save().then(() => {
34
+ console.log("Refactoring complete!");
35
+ });
36
+
37
+ function isEligibleGetter(methodName: string): boolean {
38
+ return methodName.startsWith("get") && /^[A-Z][a-zA-Z0-9]*$/.test(methodName.slice(3)) && !methodName.includes("JSON");
39
+ }
40
+
41
+ function isEligibleSetter(methodName: string): boolean {
42
+ return methodName.startsWith("set") && /^[A-Z][a-zA-Z0-9]*$/.test(methodName.slice(3));
43
+ }
44
+
45
+ function renamePropertyIfExists(cls: any, propName: string, properties: any[]) {
46
+ const existingProperty = properties.find(prop => prop.getName() === propName);
47
+ if (existingProperty) {
48
+ existingProperty.rename(`_${propName}`);
49
+ }
50
+ }
51
+
52
+ function createTypeMap(sourceFile: SourceFile): Map<string, string> {
53
+ const typeMap = new Map<string, string>();
54
+ const importDeclarations = sourceFile.getImportDeclarations();
55
+
56
+ importDeclarations.forEach(importDecl => {
57
+ const moduleSpecifier = importDecl.getModuleSpecifier().getText().replace(/['"]/g, '');
58
+ const absolutePath = path.resolve(sourceFile.getDirectory().getPath(), moduleSpecifier);
59
+ const normalizedPath = normalizePath(absolutePath);
60
+ const namedImports = importDecl.getNamedImports();
61
+ const defaultImport = importDecl.getDefaultImport();
62
+
63
+ namedImports.forEach(namedImport => {
64
+ console.log(`Named import: ${namedImport.getName()}, path: ${normalizedPath}`);
65
+ typeMap.set(namedImport.getName(), normalizedPath);
66
+ });
67
+
68
+ if (defaultImport) {
69
+ typeMap.set(defaultImport.getText(), normalizedPath);
70
+ }
71
+ });
72
+
73
+ return typeMap;
74
+ }
75
+
76
+ function refactorToGetter(cls: any, method: any, propName: string, typeMap: Map<string, string>) {
77
+ const getterName = propName;
78
+ const renamedProp = `_${propName}`;
79
+ const returnType = method.getReturnType().getText();
80
+ const simplifiedType = replaceLongTypePaths(returnType, typeMap);
81
+
82
+ const getterBody = method.getBodyText().replace(new RegExp(`this\\.${propName}`, 'g'), `this.${renamedProp}`);
83
+
84
+ cls.addGetAccessor({
85
+ name: getterName,
86
+ statements: getterBody,
87
+ // returnType: simplifiedType, // don't need a return type for getter
88
+ });
89
+
90
+ method.remove();
91
+ }
92
+
93
+ function refactorToSetter(cls: any, method: any, propName: string, typeMap: Map<string, string>) {
94
+ const setterName = propName;
95
+ const renamedProp = `_${propName}`;
96
+
97
+ const parameter = method.getParameters()[0];
98
+ const paramName = parameter.getName();
99
+ const paramType = replaceLongTypePaths(parameter.getType().getText(), typeMap);
100
+
101
+ const setterBody = method.getBodyText().replace(new RegExp(`this\\.${propName}`, 'g'), `this.${renamedProp}`);
102
+
103
+ cls.addSetAccessor({
104
+ name: setterName,
105
+ statements: setterBody,
106
+ parameters: [{ name: paramName, type: paramType }],
107
+ });
108
+
109
+ method.remove();
110
+ }
111
+
112
+ function replaceLongTypePaths(type: string, typeMap: Map<string, string>): string {
113
+ for (const [importName, importPath] of typeMap.entries()) {
114
+ const longPath = `import("${importPath}")${importName}`;
115
+ const regex = new RegExp(`import\\(["']${normalizePath(importPath)}["']\\)\\.${importName}`, 'g');
116
+ if (regex.test(type)) {
117
+ return importName;
118
+ }
119
+ }
120
+ return type;
121
+ }
122
+
123
+ function normalizePath(filePath: string): string {
124
+ return filePath.replace(/\\/g, '/');
125
+ }
126
+
127
+ function replaceMethodCalls(cls: ClassDeclaration, methodName: string, propName: string) {
128
+ cls.getDescendantsOfKind(SyntaxKind.CallExpression).forEach(callExpr => {
129
+ const expr = callExpr.getExpression();
130
+ if (expr.getText() === `this.${methodName}`) {
131
+ callExpr.replaceWithText(`this.${propName}`);
132
+ } else if (expr.getText() === `this.${methodName}` && callExpr.getArguments().length > 0) {
133
+ callExpr.replaceWithText(`this.${propName} = ${callExpr.getArguments()[0].getText()}`);
134
+ }
135
+ });
136
+ }
137
+
138
+ function capitalize(str: string): string {
139
+ return str.charAt(0).toUpperCase() + str.slice(1);
140
+ }
@@ -1,12 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { spawn } from 'child_process';
4
+ import * as path from 'path';
4
5
 
5
- // allow tslog to display the proper typescript files and line numbers
6
+ // Resolve the path to ts2famix-cli.js relative to the wrapper script
7
+ const cliPath = path.resolve(__dirname, 'ts2famix-cli.js');
8
+
9
+ // Allow tslog to display the proper TypeScript files and line numbers
6
10
  const args = [
7
11
  '--enable-source-maps',
8
12
  '--experimental-specifier-resolution=node',
9
- 'dist/ts2famix-cli.js',
13
+ cliPath,
10
14
  ...process.argv.slice(2)
11
15
  ];
12
16
 
@@ -2,7 +2,7 @@
2
2
  import * as fs from "fs";
3
3
  import yargs from "yargs";
4
4
  import { Importer } from './analyze';
5
- import { FamixRepository } from "./lib/famix/src/famix_repository";
5
+ import { FamixRepository } from "./lib/famix/famix_repository";
6
6
  import { Project } from "ts-morph";
7
7
  import { config } from "./analyze";
8
8
 
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "strict": false,
6
+ "esModuleInterop": true,
7
+ "skipLibCheck": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "noEmit": true
10
+ },
11
+ "include": [
12
+ "test/**/*.ts"
13
+ ]
14
+ }
package/tsconfig.json CHANGED
@@ -1,70 +1,72 @@
1
1
  {
2
- "compilerOptions": {
3
- /* Basic Options */
4
- "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
5
- "module": "CommonJS", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
6
- // "lib": [], /* Specify library files to be included in the compilation. */
7
- // "allowJs": true, /* Allow javascript files to be compiled. */
8
- // "checkJs": true, /* Report errors in .js files. */
9
- // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
10
- // "declaration": true, /* Generates corresponding '.d.ts' file. */
11
- // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
12
- // "sourceMap": true, /* Generates corresponding '.map' file. */
13
- // "outFile": "./", /* Concatenate and emit output to single file. */
14
- "outDir": "./dist", /* Redirect output structure to the directory. */
15
- "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
16
- // "composite": true, /* Enable project compilation */
17
- // "incremental": true, /* Enable incremental compilation */
18
- // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
19
- // "removeComments": true, /* Do not emit comments to output. */
20
- // "noEmit": true, /* Do not emit outputs. */
21
- // "importHelpers": true, /* Import emit helpers from 'tslib'. */
22
- // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
23
- // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
24
-
25
- /* Strict Type-Checking Options */
26
- "strict": false, /* Enable all strict type-checking options. */
27
- // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
28
- // "strictNullChecks": true, /* Enable strict null checks. */
29
- // "strictFunctionTypes": true, /* Enable strict checking of function types. */
30
- // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
31
- // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
32
- // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
33
- // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
34
-
35
- /* Additional Checks */
36
- // "noUnusedLocals": true, /* Report errors on unused locals. */
37
- // "noUnusedParameters": true, /* Report errors on unused parameters. */
38
- // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
39
- // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
40
-
41
- /* Module Resolution Options */
42
- // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
43
- "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
44
- // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
45
- // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
46
- // "typeRoots": [], /* List of folders to include type definitions from. */
47
- // "types": [], /* Type declaration files to be included in compilation. */
48
- "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
49
- "esModuleInterop": true , /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
50
- // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
51
-
52
- /* Source Map Options */
53
- // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
54
- // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
55
- "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
56
- "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
57
-
58
- /* Experimental Options */
59
- // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
60
- // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
61
- },
62
- "include": ["src"],
63
- "exclude": ["node_modules", "**/*.spec.ts"],
64
- "typedocOptions": {
65
- "entryPoints": ["src/*"],
66
- "entryPointStrategy": "expand",
67
- "out": "docs",
68
- "githubPages": false
69
- }
2
+ "compilerOptions": {
3
+ /* Basic Options */
4
+ "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
5
+ "module": "CommonJS", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
6
+ // "lib": [], /* Specify library files to be included in the compilation. */
7
+ // "allowJs": true, /* Allow javascript files to be compiled. */
8
+ // "checkJs": true, /* Report errors in .js files. */
9
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
10
+ // "declaration": true, /* Generates corresponding '.d.ts' file. */
11
+ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
12
+ // "sourceMap": true, /* Generates corresponding '.map' file. */
13
+ // "outFile": "./", /* Concatenate and emit output to single file. */
14
+ "outDir": "./dist", /* Redirect output structure to the directory. */
15
+ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
16
+ // "composite": true, /* Enable project compilation */
17
+ // "incremental": true, /* Enable incremental compilation */
18
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
19
+ // "removeComments": true, /* Do not emit comments to output. */
20
+ // "noEmit": true, /* Do not emit outputs. */
21
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
22
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
23
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
24
+ /* Strict Type-Checking Options */
25
+ "strict": true, /* Enable all strict type-checking options. */
26
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
27
+ // "strictNullChecks": true, /* Enable strict null checks. */
28
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
29
+ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
30
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
31
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
32
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
33
+ /* Additional Checks */
34
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
35
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
36
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
37
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
38
+ /* Module Resolution Options */
39
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
40
+ "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
41
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
42
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
43
+ // "typeRoots": [], /* List of folders to include type definitions from. */
44
+ // "types": [], /* Type declaration files to be included in compilation. */
45
+ "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
46
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
47
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
48
+ /* Source Map Options */
49
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
50
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
51
+ "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
52
+ "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
53
+ /* Experimental Options */
54
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
55
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
56
+ },
57
+ "include": [
58
+ "src/**/*.ts",
59
+ ],
60
+ "exclude": [
61
+ "node_modules",
62
+ "**/*.spec.ts",
63
+ ],
64
+ "typedocOptions": {
65
+ "entryPoints": [
66
+ "src/*"
67
+ ],
68
+ "entryPointStrategy": "expand",
69
+ "out": "docs",
70
+ "githubPages": false
71
+ }
70
72
  }
@@ -1,126 +0,0 @@
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
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const fs = __importStar(require("fs"));
30
- const yargs_1 = __importDefault(require("yargs"));
31
- const argv = yargs_1.default
32
- .example('ts-node src/famix2puml.ts -i JSONModels/projectName.json -o PUMLModels/projectName.puml', 'creates a PlantUML class diagram from a JSON-format model of a typescript project')
33
- .alias('i', 'input')
34
- .nargs('i', 1)
35
- .alias('o', 'output')
36
- .nargs('o', 1)
37
- .demandOption('input').demandOption('output').parseSync();
38
- const INHERITANCE_LINK_COLOR = 'blue';
39
- const jsonFileName = argv.input;
40
- const pumlFileName = argv.output.substring(argv.output.indexOf("/") + 1, argv.output.lastIndexOf('.'));
41
- const parsedModel = JSON.parse(fs.readFileSync(jsonFileName, 'utf-8'));
42
- const classNameMap = new Map();
43
- const associations = new Array();
44
- // maps all class names to their id
45
- parsedModel.forEach(element => {
46
- // map has id as key and unique (plantuml) class name
47
- classNameMap.set(element.id, uniqueElementName(element));
48
- const nameWithoutPrefix = element.FM3.split('.')[1];
49
- // special case association
50
- if (nameWithoutPrefix.endsWith('Inheritance')) {
51
- const subclass = element['subclass'].ref;
52
- const superclass = element['superclass'].ref;
53
- associations.push({ from: subclass, to: superclass, name: nameWithoutPrefix });
54
- }
55
- });
56
- // generates plantuml
57
- let plantUMLOutString = `@startuml ${pumlFileName}
58
- skinparam style strictuml
59
- title Object diagram for ${jsonFileName}
60
- `;
61
- parsedModel.forEach(element => {
62
- plantUMLOutString += `${toPlantUML(element)}\n`;
63
- });
64
- // creates associations
65
- associations.forEach(association => {
66
- // inheritance is a special case, show it in UML even though it doesn't make 100% sense in object diagrams
67
- const isInheritance = association.name.startsWith('Inheritance');
68
- if (isInheritance) {
69
- plantUMLOutString += `${classNameMap.get(association.from)} --|> ${classNameMap.get(association.to)} #line:${INHERITANCE_LINK_COLOR}\n`;
70
- }
71
- else {
72
- plantUMLOutString += `${classNameMap.get(association.from)} ..> "${association.name}" ${classNameMap.get(association.to)}\n`;
73
- }
74
- });
75
- plantUMLOutString += '@enduml';
76
- // writes to output file
77
- fs.writeFile(argv.output, plantUMLOutString, (err) => {
78
- if (err) {
79
- throw err;
80
- }
81
- });
82
- function uniqueElementName(element) {
83
- return `${element.FM3}${element.id}`;
84
- }
85
- function toPlantUML(element) {
86
- let plantUMLString = '';
87
- const optionalName = element.name || '';
88
- const nameWithoutPrefix = element.FM3.split('.')[1];
89
- plantUMLString += `object "${optionalName}:${nameWithoutPrefix}" as ${uniqueElementName(element)} {\n`;
90
- plantUMLString += `id = ${element.id}\n`;
91
- plantUMLString += propertiesToPlantUML(element);
92
- plantUMLString += '}\n';
93
- return plantUMLString;
94
- }
95
- function propertiesToPlantUML(element) {
96
- let plantUMLString = '';
97
- for (const property in element) {
98
- const attribute = element[property];
99
- const isOneToManyReference = typeof attribute !== 'string' && attribute.length; // array but not a string
100
- switch (property) {
101
- // ignores these properties
102
- case 'subclass':
103
- case 'superclass':
104
- case 'FM3':
105
- case 'id':
106
- case 'name':
107
- break;
108
- default:
109
- if (isOneToManyReference) {
110
- attribute.forEach((composite, index) => {
111
- associations.push({ from: element.id, to: composite.ref, name: `${property}[${index}]` });
112
- });
113
- }
114
- else if (typeof attribute === 'object') {
115
- associations.push({ from: element.id, to: attribute.ref, name: property });
116
- }
117
- else { // typeof string, boolean, number, etc
118
- // treats it as a simple attribute
119
- plantUMLString += `${property} = ${element[property]}\n`;
120
- }
121
- break;
122
- }
123
- }
124
- return plantUMLString;
125
- }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaXgycHVtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYW1peDJwdW1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsa0RBQTBCO0FBRTFCLE1BQU0sSUFBSSxHQUFHLGVBQUs7S0FDYixPQUFPLENBQUMseUZBQXlGLEVBQUUsbUZBQW1GLENBQUM7S0FDdkwsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDbkIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDYixLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUNwQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUNiLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFOUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUM7QUFldEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQWUsQ0FBQztBQUMxQyxNQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsTUFBaUIsQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFDLE1BQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBaUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6SSxNQUFNLFdBQVcsR0FBa0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxFQUFlLENBQUM7QUFFOUMsbUNBQW1DO0FBQ25DLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVB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LGtDQUFrQztvQkFDbEMsY0FBYyxJQUFJLEdBQUcsUUFBUSxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUM3RCxDQUFDO2dCQUVELE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5jb25zdCBhcmd2ID0geWFyZ3NcbiAgICAuZXhhbXBsZSgndHMtbm9kZSBzcmMvZmFtaXgycHVtbC50cyAtaSBKU09OTW9kZWxzL3Byb2plY3ROYW1lLmpzb24gLW8gUFVNTE1vZGVscy9wcm9qZWN0TmFtZS5wdW1sJywgJ2NyZWF0ZXMgYSBQbGFudFVNTCBjbGFzcyBkaWFncmFtIGZyb20gYSBKU09OLWZvcm1hdCBtb2RlbCBvZiBhIHR5cGVzY3JpcHQgcHJvamVjdCcpXG4gICAgLmFsaWFzKCdpJywgJ2lucHV0JylcbiAgICAubmFyZ3MoJ2knLCAxKVxuICAgIC5hbGlhcygnbycsICdvdXRwdXQnKVxuICAgIC5uYXJncygnbycsIDEpXG4gICAgLmRlbWFuZE9wdGlvbignaW5wdXQnKS5kZW1hbmRPcHRpb24oJ291dHB1dCcpLnBhcnNlU3luYygpO1xuXG5jb25zdCBJTkhFUklUQU5DRV9MSU5LX0NPTE9SID0gJ2JsdWUnO1xuXG4vLyBhcHByb3hpbWF0aW9uIGZvciBjb2RlIGNvbXBsZXRpb25cbmludGVyZmFjZSBGYW1peFR5cGVTY3JpcHRFbGVtZW50IHtcbiAgICBGTTM6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGlkPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBBc3NvY2lhdGlvbiB7XG4gICAgZnJvbTogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBqc29uRmlsZU5hbWUgPSBhcmd2LmlucHV0IGFzIHN0cmluZztcbmNvbnN0IHB1bWxGaWxlTmFtZSA9IChhcmd2Lm91dHB1dCBhcyBzdHJpbmcpLnN1YnN0cmluZygoYXJndi5vdXRwdXQgYXMgc3RyaW5nKS5pbmRleE9mKFwiL1wiKSsxLCAoYXJndi5vdXRwdXQgYXMgc3RyaW5nKS5sYXN0SW5kZXhPZignLicpKTtcbmNvbnN0IHBhcnNlZE1vZGVsOiBBcnJheTxGYW1peFR5cGVTY3JpcHRFbGVtZW50PiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlTmFtZSwgJ3V0Zi04JykpO1xuY29uc3QgY2xhc3NOYW1lTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IGFzc29jaWF0aW9ucyA9IG5ldyBBcnJheTxBc3NvY2lhdGlvbj4oKTtcblxuLy8gbWFwcyBhbGwgY2xhc3MgbmFtZXMgdG8gdGhlaXIgaWRcbnBhcnNlZE1vZGVsLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgLy8gbWFwIGhhcyBpZCBhcyBrZXkgYW5kIHVuaXF1ZSAocGxhbnR1bWwpIGNsYXNzIG5hbWVcbiAgICBjbGFzc05hbWVNYXAuc2V0KGVsZW1lbnQuaWQsIHVuaXF1ZUVsZW1lbnROYW1lKGVsZW1lbnQpKTtcbiAgICBjb25zdCBuYW1lV2l0aG91dFByZWZpeCA9IGVsZW1lbnQuRk0zLnNwbGl0KCcuJylbMV07XG4gICAgLy8gc3BlY2lhbCBjYXNlIGFzc29jaWF0aW9uXG4gICAgaWYgKG5hbWVXaXRob3V0UHJlZml4LmVuZHNXaXRoKCdJbmhlcml0YW5jZScpKSB7XG4gICAgICAgIGNvbnN0IHN1YmNsYXNzID0gZWxlbWVudFsnc3ViY2xhc3MnXS5yZWY7XG4gICAgICAgIGNvbnN0IHN1cGVyY2xhc3MgPSBlbGVtZW50WydzdXBlcmNsYXNzJ10ucmVmO1xuICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGZyb206IHN1YmNsYXNzLCB0bzogc3VwZXJjbGFzcywgbmFtZTogbmFtZVdpdGhvdXRQcmVmaXggfSk7XG4gICAgfVxufSk7XG5cbi8vIGdlbmVyYXRlcyBwbGFudHVtbFxubGV0IHBsYW50VU1MT3V0U3RyaW5nID0gYEBzdGFydHVtbCAke3B1bWxGaWxlTmFtZX1cbnNraW5wYXJhbSBzdHlsZSBzdHJpY3R1bWxcbnRpdGxlIE9iamVjdCBkaWFncmFtIGZvciAke2pzb25GaWxlTmFtZX1cbmA7XG5wYXJzZWRNb2RlbC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIHBsYW50VU1MT3V0U3RyaW5nICs9IGAke3RvUGxhbnRVTUwoZWxlbWVudCl9XFxuYDtcbn0pO1xuXG4vLyBjcmVhdGVzIGFzc29jaWF0aW9uc1xuYXNzb2NpYXRpb25zLmZvckVhY2goYXNzb2NpYXRpb24gPT4ge1xuICAgIC8vIGluaGVyaXRhbmNlIGlzIGEgc3BlY2lhbCBjYXNlLCBzaG93IGl0IGluIFVNTCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1ha2UgMTAwJSBzZW5zZSBpbiBvYmplY3QgZGlhZ3JhbXNcbiAgICBjb25zdCBpc0luaGVyaXRhbmNlID0gYXNzb2NpYXRpb24ubmFtZS5zdGFydHNXaXRoKCdJbmhlcml0YW5jZScpO1xuICAgIGlmIChpc0luaGVyaXRhbmNlKSB7XG4gICAgICAgIHBsYW50VU1MT3V0U3RyaW5nICs9IGAke2NsYXNzTmFtZU1hcC5nZXQoYXNzb2NpYXRpb24uZnJvbSl9IC0tfD4gJHtjbGFzc05hbWVNYXAuZ2V0KGFzc29jaWF0aW9uLnRvKX0gI2xpbmU6JHtJTkhFUklUQU5DRV9MSU5LX0NPTE9SfVxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGxhbnRVTUxPdXRTdHJpbmcgKz0gYCR7Y2xhc3NOYW1lTWFwLmdldChhc3NvY2lhdGlvbi5mcm9tKX0gLi4+IFwiJHthc3NvY2lhdGlvbi5uYW1lfVwiICR7Y2xhc3NOYW1lTWFwLmdldChhc3NvY2lhdGlvbi50byl9XFxuYDtcbiAgICB9XG59KTtcblxucGxhbnRVTUxPdXRTdHJpbmcgKz0gJ0BlbmR1bWwnO1xuXG4vLyB3cml0ZXMgdG8gb3V0cHV0IGZpbGVcbmZzLndyaXRlRmlsZShhcmd2Lm91dHB1dCBhcyBzdHJpbmcsIHBsYW50VU1MT3V0U3RyaW5nLCAoZXJyKSA9PiB7XG4gICAgaWYgKGVycikgeyB0aHJvdyBlcnI7IH1cbn0pO1xuXG5mdW5jdGlvbiB1bmlxdWVFbGVtZW50TmFtZShlbGVtZW50OiBGYW1peFR5cGVTY3JpcHRFbGVtZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZWxlbWVudC5GTTN9JHtlbGVtZW50LmlkfWA7XG59XG5cbmZ1bmN0aW9uIHRvUGxhbnRVTUwoZWxlbWVudDogRmFtaXhUeXBlU2NyaXB0RWxlbWVudCkge1xuICAgIGxldCBwbGFudFVNTFN0cmluZyA9ICcnO1xuICAgIGNvbnN0IG9wdGlvbmFsTmFtZSA9IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICBjb25zdCBuYW1lV2l0aG91dFByZWZpeCA9IGVsZW1lbnQuRk0zLnNwbGl0KCcuJylbMV07XG4gICAgcGxhbnRVTUxTdHJpbmcgKz0gYG9iamVjdCBcIiR7b3B0aW9uYWxOYW1lfToke25hbWVXaXRob3V0UHJlZml4fVwiIGFzICR7dW5pcXVlRWxlbWVudE5hbWUoZWxlbWVudCl9IHtcXG5gO1xuICAgIHBsYW50VU1MU3RyaW5nICs9IGBpZCA9ICR7ZWxlbWVudC5pZH1cXG5gO1xuICAgIHBsYW50VU1MU3RyaW5nICs9IHByb3BlcnRpZXNUb1BsYW50VU1MKGVsZW1lbnQpO1xuICAgIHBsYW50VU1MU3RyaW5nICs9ICd9XFxuJztcbiAgICByZXR1cm4gcGxhbnRVTUxTdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnRpZXNUb1BsYW50VU1MKGVsZW1lbnQ6IEZhbWl4VHlwZVNjcmlwdEVsZW1lbnQpIHtcbiAgICBsZXQgcGxhbnRVTUxTdHJpbmcgPSAnJztcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWxlbWVudFtwcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IGlzT25lVG9NYW55UmVmZXJlbmNlID0gdHlwZW9mIGF0dHJpYnV0ZSAhPT0gJ3N0cmluZycgJiYgYXR0cmlidXRlLmxlbmd0aDsgLy8gYXJyYXkgYnV0IG5vdCBhIHN0cmluZ1xuXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZXMgdGhlc2UgcHJvcGVydGllc1xuICAgICAgICAgICAgY2FzZSAnc3ViY2xhc3MnOlxuICAgICAgICAgICAgY2FzZSAnc3VwZXJjbGFzcyc6XG4gICAgICAgICAgICBjYXNlICdGTTMnOlxuICAgICAgICAgICAgY2FzZSAnaWQnOlxuICAgICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGlzT25lVG9NYW55UmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5mb3JFYWNoKChjb21wb3NpdGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGZyb206IGVsZW1lbnQuaWQsIHRvOiBjb21wb3NpdGUucmVmLCBuYW1lOiBgJHtwcm9wZXJ0eX1bJHtpbmRleH1dYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXR0cmlidXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGZyb206IGVsZW1lbnQuaWQsIHRvOiBhdHRyaWJ1dGUucmVmLCBuYW1lOiBwcm9wZXJ0eSB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gdHlwZW9mIHN0cmluZywgYm9vbGVhbiwgbnVtYmVyLCBldGNcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXRzIGl0IGFzIGEgc2ltcGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBwbGFudFVNTFN0cmluZyArPSBgJHtwcm9wZXJ0eX0gPSAke2VsZW1lbnRbcHJvcGVydHldfVxcbmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBsYW50VU1MU3RyaW5nO1xufVxuIl19
@@ -1,55 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaXhfSlNPTl9leHBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZmFtaXgvc3JjL2ZhbWl4X0pTT05fZXhwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQXdEO0FBRXhEOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFNNUI7Ozs7T0FJRztJQUNILFlBQVksWUFBb0IsRUFBRSxPQUF5QjtRQVJuRCxnQkFBVyxHQUFRLEVBQUUsQ0FBQyxDQUFDLHdEQUF3RDtRQUMvRSxnQkFBVyxHQUFHLGlCQUFpQixDQUFDLENBQUMsOEJBQThCO1FBUXJFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsSUFBWSxFQUFFLElBQWE7UUFDNUMsSUFBSSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxVQUFVLEdBQW1CLEVBQUUsQ0FBQztZQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxLQUFLLFlBQVkscUNBQWdCLEVBQUUsQ0FBQztvQkFDdEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztxQkFDSSxDQUFDO29CQUNKLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDdEMsQ0FBQzthQUNJLElBQUksSUFBSSxZQUFZLHFDQUFnQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUMsQ0FBQzthQUNJLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFsREQsOENBa0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFtaXhCYXNlRWxlbWVudCB9IGZyb20gXCIuL2ZhbWl4X2Jhc2VfZWxlbWVudFwiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBleHBvcnQgRmFtaXggZWxlbWVudHMgdG8gSlNPTlxuICovXG5leHBvcnQgY2xhc3MgRmFtaXhKU09ORXhwb3J0ZXIge1xuXG4gIHByaXZhdGUgZWxlbWVudDogRmFtaXhCYXNlRWxlbWVudDsgLy8gQSBGYW1peCBlbGVtZW50IHRvIGV4cG9ydFxuICBwcml2YXRlIGJ1ZmZlckFycmF5OiBhbnkgPSB7fTsgLy8gQSBidWZmZXIgdG8gc3RvcmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIEZhbWl4IGVsZW1lbnRcbiAgcHJpdmF0ZSBGYW1peFByZWZpeCA9IFwiRmFtaXhUeXBlU2NyaXB0XCI7IC8vIFByZWZpeCBvZiB0aGUgRmFtaXggZWxlbWVudFxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBvZiB0aGUgRmFtaXhKU09ORXhwb3J0ZXIgY2xhc3NcbiAgICogQHBhcmFtIHBhY2thZ2VDbGFzcyBOYW1lIG9mIGEgRmFtaXggY2xhc3NcbiAgICogQHBhcmFtIGVsZW1lbnQgQSBGYW1peCBlbGVtZW50IHRvIGV4cG9ydCwgdGhpcyBlbGVtZW50IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBuYW1lZCBcInBhY2thZ2VDbGFzc1wiXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYWNrYWdlQ2xhc3M6IHN0cmluZywgZWxlbWVudDogRmFtaXhCYXNlRWxlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5idWZmZXJBcnJheVtcIkZNM1wiXSA9IHRoaXMuRmFtaXhQcmVmaXggKyBcIi5cIiArIHBhY2thZ2VDbGFzcztcbiAgICB0aGlzLmJ1ZmZlckFycmF5W1wiaWRcIl0gPSB0aGlzLmVsZW1lbnQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3BlcnR5IHRvIHRoZSBGYW1peCBlbGVtZW50XG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5XG4gICAqIEBwYXJhbSBwcm9wIEEgcHJvcGVydHlcbiAgICovXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHByb3A6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAocHJvcCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgY29uc3QgdmFsdWVBcnJheTogQXJyYXk8dW5rbm93bj4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgQXJyYXkuZnJvbShwcm9wLnZhbHVlcygpKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGYW1peEJhc2VFbGVtZW50KSB7XG4gICAgICAgICAgdmFsdWVBcnJheS5wdXNoKHsgXCJyZWZcIjogdmFsdWUuaWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFsdWVBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXJBcnJheVtuYW1lXSA9IHZhbHVlQXJyYXk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGYW1peEJhc2VFbGVtZW50KSB7XG4gICAgICB0aGlzLmJ1ZmZlckFycmF5W25hbWVdID0geyBcInJlZlwiOiBwcm9wLmlkIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3AgIT09IHVuZGVmaW5lZCAmJiAhKHByb3AgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICB0aGlzLmJ1ZmZlckFycmF5W25hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIEZhbWl4IGVsZW1lbnRcbiAgICogQHJldHVybnMgQSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBGYW1peCBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0SlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmJ1ZmZlckFycmF5KTtcbiAgfVxufVxuIl19