ts2famix 1.0.12 → 1.0.14

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 (135) hide show
  1. package/.eslintrc.json +24 -24
  2. package/LICENSE +23 -23
  3. package/README.md +109 -109
  4. package/dist/analyze.js +107 -0
  5. package/dist/analyze_functions/processAccesses.js +55 -0
  6. package/dist/analyze_functions/processFiles.js +554 -0
  7. package/dist/analyze_functions/processImportClauses.js +70 -0
  8. package/dist/analyze_functions/processInheritances.js +73 -0
  9. package/dist/analyze_functions/processInvocations.js +49 -0
  10. package/dist/famix2puml.js +125 -0
  11. package/dist/famix_functions/famix_functions.js +520 -0
  12. package/dist/famix_functions/famix_functions_associations.js +213 -0
  13. package/dist/famix_functions/famix_functions_index.js +62 -0
  14. package/dist/famix_functions/famix_functions_types.js +114 -0
  15. package/dist/fqn.js +126 -0
  16. package/dist/lib/famix/src/famix_JSON_exporter.js +54 -0
  17. package/dist/lib/famix/src/famix_base_element.js +13 -0
  18. package/dist/lib/famix/src/famix_repository.js +187 -0
  19. package/dist/lib/famix/src/index.js +30 -0
  20. package/dist/lib/famix/src/model/famix/access.js +39 -0
  21. package/dist/lib/famix/src/model/famix/accessor.js +16 -0
  22. package/dist/lib/famix/src/model/famix/alias.js +32 -0
  23. package/dist/lib/famix/src/model/famix/association.js +36 -0
  24. package/dist/lib/famix/src/model/famix/behavioral_entity.js +81 -0
  25. package/dist/lib/famix/src/model/famix/c_source_language.js +16 -0
  26. package/dist/lib/famix/src/model/famix/class.js +70 -0
  27. package/dist/lib/famix/src/model/famix/comment.js +38 -0
  28. package/dist/lib/famix/src/model/famix/container_entity.js +125 -0
  29. package/dist/lib/famix/src/model/famix/custom_source_language.js +23 -0
  30. package/dist/lib/famix/src/model/famix/decorator.js +31 -0
  31. package/dist/lib/famix/src/model/famix/entity.js +16 -0
  32. package/dist/lib/famix/src/model/famix/enum.js +30 -0
  33. package/dist/lib/famix/src/model/famix/enum_value.js +24 -0
  34. package/dist/lib/famix/src/model/famix/function.js +16 -0
  35. package/dist/lib/famix/src/model/famix/implicit_variable.js +16 -0
  36. package/dist/lib/famix/src/model/famix/import_clause.js +39 -0
  37. package/dist/lib/famix/src/model/famix/index.js +87 -0
  38. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +37 -0
  39. package/dist/lib/famix/src/model/famix/inheritance.js +32 -0
  40. package/dist/lib/famix/src/model/famix/interface.js +63 -0
  41. package/dist/lib/famix/src/model/famix/invocation.js +53 -0
  42. package/dist/lib/famix/src/model/famix/method.js +66 -0
  43. package/dist/lib/famix/src/model/famix/module.js +30 -0
  44. package/dist/lib/famix/src/model/famix/named_entity.js +77 -0
  45. package/dist/lib/famix/src/model/famix/namespace.js +24 -0
  46. package/dist/lib/famix/src/model/famix/parameter.js +24 -0
  47. package/dist/lib/famix/src/model/famix/parameterizable_class.js +30 -0
  48. package/dist/lib/famix/src/model/famix/parameterizable_interface.js +30 -0
  49. package/dist/lib/famix/src/model/famix/parameterized_type.js +36 -0
  50. package/dist/lib/famix/src/model/famix/primitive_type.js +16 -0
  51. package/dist/lib/famix/src/model/famix/property.js +44 -0
  52. package/dist/lib/famix/src/model/famix/reference.js +32 -0
  53. package/dist/lib/famix/src/model/famix/scoping_entity.js +30 -0
  54. package/dist/lib/famix/src/model/famix/script_entity.js +30 -0
  55. package/dist/lib/famix/src/model/famix/source_anchor.js +26 -0
  56. package/dist/lib/famix/src/model/famix/source_language.js +30 -0
  57. package/dist/lib/famix/src/model/famix/sourced_entity.js +55 -0
  58. package/dist/lib/famix/src/model/famix/structural_entity.js +38 -0
  59. package/dist/lib/famix/src/model/famix/text_anchor.js +37 -0
  60. package/dist/lib/famix/src/model/famix/type.js +71 -0
  61. package/dist/lib/famix/src/model/famix/type_parameter.js +24 -0
  62. package/dist/lib/famix/src/model/famix/variable.js +23 -0
  63. package/dist/lib/ts-complex/cyclomatic-service.js +83 -0
  64. package/dist/ts2famix-cli.js +63 -0
  65. package/dist/ts2famix-tsconfig.js +53 -0
  66. package/jest.config-old.ts +199 -199
  67. package/package.json +47 -47
  68. package/src/analyze.ts +94 -94
  69. package/src/analyze_functions/processAccesses.ts +57 -57
  70. package/src/analyze_functions/processFiles.ts +669 -669
  71. package/src/analyze_functions/processImportClauses.ts +77 -77
  72. package/src/analyze_functions/processInheritances.ts +84 -84
  73. package/src/analyze_functions/processInvocations.ts +51 -51
  74. package/src/famix2puml.ts +119 -119
  75. package/src/famix_functions/famix_functions.ts +559 -559
  76. package/src/famix_functions/famix_functions_associations.ts +215 -215
  77. package/src/famix_functions/famix_functions_index.ts +44 -44
  78. package/src/famix_functions/famix_functions_types.ts +105 -105
  79. package/src/generate_uml.sh +16 -16
  80. package/src/lib/famix/License.md +22 -22
  81. package/src/lib/famix/package-lock.json +301 -301
  82. package/src/lib/famix/package.json +27 -27
  83. package/src/lib/famix/readme.md +4 -4
  84. package/src/lib/famix/src/famix_JSON_exporter.ts +56 -56
  85. package/src/lib/famix/src/famix_base_element.ts +18 -18
  86. package/src/lib/famix/src/famix_repository.ts +199 -199
  87. package/src/lib/famix/src/index.ts +8 -8
  88. package/src/lib/famix/src/model/famix/access.ts +53 -53
  89. package/src/lib/famix/src/model/famix/accessor.ts +15 -15
  90. package/src/lib/famix/src/model/famix/alias.ts +41 -41
  91. package/src/lib/famix/src/model/famix/association.ts +44 -44
  92. package/src/lib/famix/src/model/famix/behavioral_entity.ts +107 -107
  93. package/src/lib/famix/src/model/famix/c_source_language.ts +15 -15
  94. package/src/lib/famix/src/model/famix/class.ts +86 -86
  95. package/src/lib/famix/src/model/famix/comment.ts +50 -50
  96. package/src/lib/famix/src/model/famix/container_entity.ts +165 -165
  97. package/src/lib/famix/src/model/famix/custom_source_language.ts +27 -27
  98. package/src/lib/famix/src/model/famix/decorator.ts +39 -39
  99. package/src/lib/famix/src/model/famix/entity.ts +15 -15
  100. package/src/lib/famix/src/model/famix/enum.ts +31 -31
  101. package/src/lib/famix/src/model/famix/enum_value.ts +29 -29
  102. package/src/lib/famix/src/model/famix/function.ts +15 -15
  103. package/src/lib/famix/src/model/famix/implicit_variable.ts +15 -15
  104. package/src/lib/famix/src/model/famix/import_clause.ts +53 -53
  105. package/src/lib/famix/src/model/famix/index.ts +42 -42
  106. package/src/lib/famix/src/model/famix/indexed_file_anchor.ts +49 -49
  107. package/src/lib/famix/src/model/famix/inheritance.ts +42 -42
  108. package/src/lib/famix/src/model/famix/interface.ts +75 -75
  109. package/src/lib/famix/src/model/famix/invocation.ts +68 -68
  110. package/src/lib/famix/src/model/famix/method.ts +96 -96
  111. package/src/lib/famix/src/model/famix/module.ts +31 -31
  112. package/src/lib/famix/src/model/famix/named_entity.ts +98 -98
  113. package/src/lib/famix/src/model/famix/namespace.ts +28 -28
  114. package/src/lib/famix/src/model/famix/parameter.ts +29 -29
  115. package/src/lib/famix/src/model/famix/parameterizable_class.ts +31 -31
  116. package/src/lib/famix/src/model/famix/parameterizable_interface.ts +31 -31
  117. package/src/lib/famix/src/model/famix/parameterized_type.ts +40 -40
  118. package/src/lib/famix/src/model/famix/primitive_type.ts +15 -15
  119. package/src/lib/famix/src/model/famix/property.ts +54 -54
  120. package/src/lib/famix/src/model/famix/reference.ts +42 -42
  121. package/src/lib/famix/src/model/famix/scoping_entity.ts +31 -31
  122. package/src/lib/famix/src/model/famix/script_entity.ts +38 -38
  123. package/src/lib/famix/src/model/famix/source_anchor.ts +31 -31
  124. package/src/lib/famix/src/model/famix/source_language.ts +31 -31
  125. package/src/lib/famix/src/model/famix/sourced_entity.ts +70 -70
  126. package/src/lib/famix/src/model/famix/structural_entity.ts +44 -44
  127. package/src/lib/famix/src/model/famix/text_anchor.ts +49 -49
  128. package/src/lib/famix/src/model/famix/type.ts +88 -88
  129. package/src/lib/famix/src/model/famix/type_parameter.ts +33 -33
  130. package/src/lib/famix/src/model/famix/variable.ts +28 -28
  131. package/src/lib/famix/tsconfig.json +26 -26
  132. package/src/lib/famix/tslint.json +14 -14
  133. package/src/lib/ts-complex/cyclomatic-service.ts +85 -85
  134. package/src/ts2famix-cli.ts +39 -39
  135. package/tsconfig.json +69 -69
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProcessInheritances = void 0;
4
+ const ts_morph_1 = require("ts-morph");
5
+ /**
6
+ * This class is used to build a Famix model for the inheritances
7
+ */
8
+ class ProcessInheritances {
9
+ /**
10
+ * Initializes the ProcessInheritances object
11
+ * @param famixFunctions FamixFunctions object, it contains all the functions needed to create Famix entities
12
+ */
13
+ constructor(famixFunctions) {
14
+ this.famixFunctions = famixFunctions;
15
+ }
16
+ /**
17
+ * Builds a Famix model for the inheritances of the classes and interfaces of the source files
18
+ * @param classes An array of classes
19
+ * @param interfaces An array of interfaces
20
+ */
21
+ processInheritances(classes, interfaces) {
22
+ console.info(`processInheritances: Creating inheritances:`);
23
+ classes.forEach(cls => {
24
+ console.info(`processInheritances: Checking class inheritance for ${cls.getName()}`);
25
+ const extClass = cls.getBaseClass();
26
+ if (extClass !== undefined) {
27
+ this.famixFunctions.createFamixInheritance(cls, extClass);
28
+ console.info(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), extClass: ${extClass.getName()}, (${extClass.getType().getText()})`);
29
+ }
30
+ console.info(`processInheritances: Checking interface inheritance for ${cls.getName()}`);
31
+ const implementedInterfaces = this.getImplementedOrExtendedInterfaces(interfaces, cls);
32
+ implementedInterfaces.forEach(impInter => {
33
+ this.famixFunctions.createFamixInheritance(cls, impInter);
34
+ console.info(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), impInter: ${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getName() : impInter.getExpression().getText()}, (${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getType().getText() : impInter.getExpression().getText()})`);
35
+ });
36
+ });
37
+ interfaces.forEach(inter => {
38
+ console.info(`processInheritances: Checking interface inheritance for ${inter.getName()}`);
39
+ const extendedInterfaces = this.getImplementedOrExtendedInterfaces(interfaces, inter);
40
+ extendedInterfaces.forEach(extInter => {
41
+ this.famixFunctions.createFamixInheritance(inter, extInter);
42
+ console.info(`processInheritances: inter: ${inter.getName()}, (${inter.getType().getText()}), extInter: ${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getName() : extInter.getExpression().getText()}, (${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getType().getText() : extInter.getExpression().getText()})`);
43
+ });
44
+ });
45
+ }
46
+ /**
47
+ * Gets the interfaces implemented or extended by a class or an interface
48
+ * @param interfaces An array of interfaces
49
+ * @param subClass A class or an interface
50
+ * @returns An array of InterfaceDeclaration and ExpressionWithTypeArguments containing the interfaces implemented or extended by the subClass
51
+ */
52
+ getImplementedOrExtendedInterfaces(interfaces, subClass) {
53
+ let impOrExtInterfaces;
54
+ if (subClass instanceof ts_morph_1.ClassDeclaration) {
55
+ impOrExtInterfaces = subClass.getImplements();
56
+ }
57
+ else {
58
+ impOrExtInterfaces = subClass.getExtends();
59
+ }
60
+ const interfacesNames = interfaces.map(i => i.getName());
61
+ const implementedOrExtendedInterfaces = new Array();
62
+ impOrExtInterfaces.forEach(i => {
63
+ if (interfacesNames.includes(i.getExpression().getText())) {
64
+ implementedOrExtendedInterfaces.push(interfaces[interfacesNames.indexOf(i.getExpression().getText())]);
65
+ }
66
+ else {
67
+ implementedOrExtendedInterfaces.push(i);
68
+ }
69
+ });
70
+ return implementedOrExtendedInterfaces;
71
+ }
72
+ }
73
+ exports.ProcessInheritances = ProcessInheritances;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProcessInvocations = void 0;
4
+ const ts_morph_1 = require("ts-morph");
5
+ /**
6
+ * This class is used to build a Famix model for the invocations
7
+ */
8
+ class ProcessInvocations {
9
+ /**
10
+ * Initializes the ProcessInvocations object
11
+ * @param famixFunctions FamixFunctions object, it contains all the functions needed to create Famix entities
12
+ */
13
+ constructor(famixFunctions) {
14
+ this.famixFunctions = famixFunctions;
15
+ }
16
+ /**
17
+ * Builds a Famix model for the invocations of the methods and functions of the source files
18
+ * @param methodsAndFunctionsWithId A map of methods and functions with their id
19
+ */
20
+ processInvocations(methodsAndFunctionsWithId) {
21
+ console.info(`Creating invocations:`);
22
+ methodsAndFunctionsWithId.forEach((m, id) => {
23
+ console.info(`Invocations to ${(m instanceof ts_morph_1.MethodDeclaration || m instanceof ts_morph_1.GetAccessorDeclaration || m instanceof ts_morph_1.SetAccessorDeclaration || m instanceof ts_morph_1.FunctionDeclaration) ? m.getName() : ((m instanceof ts_morph_1.ConstructorDeclaration) ? 'constructor' : (m.getName() ? m.getName() : 'anonymous'))}`);
24
+ try {
25
+ const temp_nodes = m.findReferencesAsNodes();
26
+ temp_nodes.forEach(node => this.processNodeForInvocations(node, m, id));
27
+ }
28
+ catch (error) {
29
+ console.error(`> WARNING: got exception ${error}. Continuing...`);
30
+ }
31
+ });
32
+ }
33
+ /**
34
+ * Builds a Famix model for an invocation of a method or a function
35
+ * @param n A node
36
+ * @param m A method or a function
37
+ * @param id The id of the method or the function
38
+ */
39
+ processNodeForInvocations(n, m, id) {
40
+ try {
41
+ this.famixFunctions.createFamixInvocation(n, m, id);
42
+ console.info(`node: node, (${n.getType().getText()})`);
43
+ }
44
+ catch (error) {
45
+ console.error(`> WARNING: got exception ${error}. ScopeDeclaration invalid for ${n.getSymbol().getFullyQualifiedName()}. Continuing...`);
46
+ }
47
+ }
48
+ }
49
+ exports.ProcessInvocations = ProcessInvocations;
@@ -0,0 +1,125 @@
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
+ }