@notjustcoders/ioc-arise 1.0.9 → 1.0.11

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 (170) hide show
  1. package/dist/analyser/ast-parser.d.ts +1 -0
  2. package/dist/analyser/ast-parser.d.ts.map +1 -1
  3. package/dist/analyser/ast-parser.js +53 -0
  4. package/dist/analyser/ast-parser.js.map +1 -1
  5. package/dist/analyser/class-analyzer.d.ts.map +1 -1
  6. package/dist/analyser/class-analyzer.js +23 -8
  7. package/dist/analyser/class-analyzer.js.map +1 -1
  8. package/dist/analyser/dependency-resolver.js +4 -4
  9. package/dist/analyser/dependency-resolver.js.map +1 -1
  10. package/dist/analyser/module-dependency-resolver.js +1 -1
  11. package/dist/analyser/module-dependency-resolver.js.map +1 -1
  12. package/dist/commands/analyze.js +1 -1
  13. package/dist/commands/analyze.js.map +1 -1
  14. package/dist/commands/generate.d.ts.map +1 -1
  15. package/dist/commands/generate.js +2 -2
  16. package/dist/commands/generate.js.map +1 -1
  17. package/dist/container.gen.d.ts +20 -12
  18. package/dist/container.gen.d.ts.map +1 -1
  19. package/dist/container.gen.js +114 -80
  20. package/dist/container.gen.js.map +1 -1
  21. package/dist/generator/import-generator.d.ts.map +1 -1
  22. package/dist/generator/import-generator.js +11 -5
  23. package/dist/generator/import-generator.js.map +1 -1
  24. package/dist/generator/modular/module-dependency-resolver.js +1 -1
  25. package/dist/generator/modular/module-dependency-resolver.js.map +1 -1
  26. package/dist/generator/shared/instantiation-utils.d.ts +2 -1
  27. package/dist/generator/shared/instantiation-utils.d.ts.map +1 -1
  28. package/dist/generator/shared/instantiation-utils.js +17 -5
  29. package/dist/generator/shared/instantiation-utils.js.map +1 -1
  30. package/dist/renderer/console-analysis-renderer.js +1 -1
  31. package/dist/renderer/console-analysis-renderer.js.map +1 -1
  32. package/dist/types.d.ts +5 -1
  33. package/dist/types.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/__tests__/analyser/ast-parser.test.d.ts +0 -2
  36. package/dist/__tests__/analyser/ast-parser.test.d.ts.map +0 -1
  37. package/dist/__tests__/analyser/ast-parser.test.js +0 -309
  38. package/dist/__tests__/analyser/ast-parser.test.js.map +0 -1
  39. package/dist/__tests__/analyser/class-analyzer.test.d.ts +0 -2
  40. package/dist/__tests__/analyser/class-analyzer.test.d.ts.map +0 -1
  41. package/dist/__tests__/analyser/class-analyzer.test.js +0 -323
  42. package/dist/__tests__/analyser/class-analyzer.test.js.map +0 -1
  43. package/dist/__tests__/analyser/dependency-resolver.test.d.ts +0 -2
  44. package/dist/__tests__/analyser/dependency-resolver.test.d.ts.map +0 -1
  45. package/dist/__tests__/analyser/dependency-resolver.test.js +0 -128
  46. package/dist/__tests__/analyser/dependency-resolver.test.js.map +0 -1
  47. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts +0 -28
  48. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts.map +0 -1
  49. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js +0 -222
  50. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js.map +0 -1
  51. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts +0 -54
  52. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts.map +0 -1
  53. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js +0 -285
  54. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js.map +0 -1
  55. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts +0 -13
  56. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts.map +0 -1
  57. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js +0 -266
  58. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js.map +0 -1
  59. package/dist/__tests__/analyser/project-analyzer.test.d.ts +0 -2
  60. package/dist/__tests__/analyser/project-analyzer.test.d.ts.map +0 -1
  61. package/dist/__tests__/analyser/project-analyzer.test.js +0 -191
  62. package/dist/__tests__/analyser/project-analyzer.test.js.map +0 -1
  63. package/dist/__tests__/generator/container-generator.test.d.ts +0 -2
  64. package/dist/__tests__/generator/container-generator.test.d.ts.map +0 -1
  65. package/dist/__tests__/generator/container-generator.test.js +0 -185
  66. package/dist/__tests__/generator/container-generator.test.js.map +0 -1
  67. package/dist/__tests__/generator/dependency-resolver.test.d.ts +0 -2
  68. package/dist/__tests__/generator/dependency-resolver.test.d.ts.map +0 -1
  69. package/dist/__tests__/generator/dependency-resolver.test.js +0 -330
  70. package/dist/__tests__/generator/dependency-resolver.test.js.map +0 -1
  71. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts +0 -23
  72. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts.map +0 -1
  73. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js +0 -254
  74. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js.map +0 -1
  75. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts +0 -10
  76. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts.map +0 -1
  77. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js +0 -194
  78. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js.map +0 -1
  79. package/dist/__tests__/generator/import-generator.test.d.ts +0 -2
  80. package/dist/__tests__/generator/import-generator.test.d.ts.map +0 -1
  81. package/dist/__tests__/generator/import-generator.test.js +0 -121
  82. package/dist/__tests__/generator/import-generator.test.js.map +0 -1
  83. package/dist/__tests__/generator/instantiation-generator.test.d.ts +0 -2
  84. package/dist/__tests__/generator/instantiation-generator.test.d.ts.map +0 -1
  85. package/dist/__tests__/generator/instantiation-generator.test.js +0 -251
  86. package/dist/__tests__/generator/instantiation-generator.test.js.map +0 -1
  87. package/dist/generator/Container-file-generator.d.ts +0 -20
  88. package/dist/generator/Container-file-generator.d.ts.map +0 -1
  89. package/dist/generator/Container-file-generator.js +0 -255
  90. package/dist/generator/Container-file-generator.js.map +0 -1
  91. package/dist/generator/base-container-code-generator.d.ts +0 -15
  92. package/dist/generator/base-container-code-generator.d.ts.map +0 -1
  93. package/dist/generator/base-container-code-generator.js +0 -23
  94. package/dist/generator/base-container-code-generator.js.map +0 -1
  95. package/dist/generator/base-dependency-resolver.d.ts +0 -26
  96. package/dist/generator/base-dependency-resolver.d.ts.map +0 -1
  97. package/dist/generator/base-dependency-resolver.js +0 -72
  98. package/dist/generator/base-dependency-resolver.js.map +0 -1
  99. package/dist/generator/base-instantiation-generator.d.ts +0 -55
  100. package/dist/generator/base-instantiation-generator.d.ts.map +0 -1
  101. package/dist/generator/base-instantiation-generator.js +0 -117
  102. package/dist/generator/base-instantiation-generator.js.map +0 -1
  103. package/dist/generator/container-generator.d.ts +0 -8
  104. package/dist/generator/container-generator.d.ts.map +0 -1
  105. package/dist/generator/container-generator.js +0 -35
  106. package/dist/generator/container-generator.js.map +0 -1
  107. package/dist/generator/dependency-resolver.d.ts +0 -11
  108. package/dist/generator/dependency-resolver.d.ts.map +0 -1
  109. package/dist/generator/dependency-resolver.js +0 -83
  110. package/dist/generator/dependency-resolver.js.map +0 -1
  111. package/dist/generator/duplicate-import-resolver.d.ts +0 -44
  112. package/dist/generator/duplicate-import-resolver.d.ts.map +0 -1
  113. package/dist/generator/duplicate-import-resolver.js +0 -162
  114. package/dist/generator/duplicate-import-resolver.js.map +0 -1
  115. package/dist/generator/flat/container-generator.d.ts +0 -8
  116. package/dist/generator/flat/container-generator.d.ts.map +0 -1
  117. package/dist/generator/flat/container-generator.js +0 -17
  118. package/dist/generator/flat/container-generator.js.map +0 -1
  119. package/dist/generator/flat/dependency-resolver.d.ts +0 -8
  120. package/dist/generator/flat/dependency-resolver.d.ts.map +0 -1
  121. package/dist/generator/flat/dependency-resolver.js +0 -43
  122. package/dist/generator/flat/dependency-resolver.js.map +0 -1
  123. package/dist/generator/flat/flat-container-generator.d.ts +0 -25
  124. package/dist/generator/flat/flat-container-generator.d.ts.map +0 -1
  125. package/dist/generator/flat/flat-container-generator.js +0 -44
  126. package/dist/generator/flat/flat-container-generator.js.map +0 -1
  127. package/dist/generator/flat/instantiation-generator.d.ts +0 -24
  128. package/dist/generator/flat/instantiation-generator.d.ts.map +0 -1
  129. package/dist/generator/flat/instantiation-generator.js +0 -125
  130. package/dist/generator/flat/instantiation-generator.js.map +0 -1
  131. package/dist/generator/flat-container-generator.d.ts +0 -25
  132. package/dist/generator/flat-container-generator.d.ts.map +0 -1
  133. package/dist/generator/flat-container-generator.js +0 -44
  134. package/dist/generator/flat-container-generator.js.map +0 -1
  135. package/dist/generator/instantiation-generator.d.ts +0 -21
  136. package/dist/generator/instantiation-generator.d.ts.map +0 -1
  137. package/dist/generator/instantiation-generator.js +0 -116
  138. package/dist/generator/instantiation-generator.js.map +0 -1
  139. package/dist/generator/modular/class-sorter.d.ts +0 -17
  140. package/dist/generator/modular/class-sorter.d.ts.map +0 -1
  141. package/dist/generator/modular/class-sorter.js +0 -40
  142. package/dist/generator/modular/class-sorter.js.map +0 -1
  143. package/dist/generator/modular/modular-container-code-generator.d.ts +0 -65
  144. package/dist/generator/modular/modular-container-code-generator.d.ts.map +0 -1
  145. package/dist/generator/modular/modular-container-code-generator.js +0 -157
  146. package/dist/generator/modular/modular-container-code-generator.js.map +0 -1
  147. package/dist/generator/modular/module-export-generator.d.ts +0 -42
  148. package/dist/generator/modular/module-export-generator.d.ts.map +0 -1
  149. package/dist/generator/modular/module-export-generator.js +0 -82
  150. package/dist/generator/modular/module-export-generator.js.map +0 -1
  151. package/dist/generator/modular/module-scope-generator.d.ts +0 -47
  152. package/dist/generator/modular/module-scope-generator.d.ts.map +0 -1
  153. package/dist/generator/modular/module-scope-generator.js +0 -111
  154. package/dist/generator/modular/module-scope-generator.js.map +0 -1
  155. package/dist/generator/modular/refactored-modular-container-generator.d.ts +0 -38
  156. package/dist/generator/modular/refactored-modular-container-generator.d.ts.map +0 -1
  157. package/dist/generator/modular/refactored-modular-container-generator.js +0 -73
  158. package/dist/generator/modular/refactored-modular-container-generator.js.map +0 -1
  159. package/dist/generator/modular-container-generator.d.ts +0 -21
  160. package/dist/generator/modular-container-generator.d.ts.map +0 -1
  161. package/dist/generator/modular-container-generator.js +0 -57
  162. package/dist/generator/modular-container-generator.js.map +0 -1
  163. package/dist/generator/module-container-function-generator.d.ts +0 -30
  164. package/dist/generator/module-container-function-generator.d.ts.map +0 -1
  165. package/dist/generator/module-container-function-generator.js +0 -199
  166. package/dist/generator/module-container-function-generator.js.map +0 -1
  167. package/dist/generator/shared/dependency-resolver-utils.d.ts +0 -28
  168. package/dist/generator/shared/dependency-resolver-utils.d.ts.map +0 -1
  169. package/dist/generator/shared/dependency-resolver-utils.js +0 -67
  170. package/dist/generator/shared/dependency-resolver-utils.js.map +0 -1
@@ -1,323 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const class_analyzer_1 = require("../../analyser/class-analyzer");
5
- const container_1 = require("../../container");
6
- const class_analyzer_fixtures_1 = require("./fixtures/class-analyzer-fixtures");
7
- // Mock the container
8
- vitest_1.vi.mock('../../container', () => ({
9
- container: {
10
- astParser: {
11
- parseFile: vitest_1.vi.fn(),
12
- extractTypeAliases: vitest_1.vi.fn(),
13
- extractJSDocComments: vitest_1.vi.fn(),
14
- findClassesImplementingInterfaces: vitest_1.vi.fn(),
15
- findAllClasses: vitest_1.vi.fn(),
16
- extractClassName: vitest_1.vi.fn(),
17
- extractInterfaceName: vitest_1.vi.fn(),
18
- extractConstructorParameters: vitest_1.vi.fn(),
19
- extractScopeFromJSDoc: vitest_1.vi.fn()
20
- }
21
- }
22
- }));
23
- // Mock console methods to avoid noise in tests
24
- const consoleSpy = {
25
- log: vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { }),
26
- warn: vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { })
27
- };
28
- (0, vitest_1.describe)('ClassAnalyzer', () => {
29
- let classAnalyzer;
30
- let mockAstParser;
31
- (0, vitest_1.beforeEach)(() => {
32
- mockAstParser = container_1.container.astParser;
33
- // Reset all mocks
34
- Object.values(mockAstParser).forEach(mock => mock.mockReset());
35
- // Reset console spies
36
- consoleSpy.log.mockClear();
37
- consoleSpy.warn.mockClear();
38
- classAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', 'I.*Service');
39
- });
40
- (0, vitest_1.describe)('constructor', () => {
41
- (0, vitest_1.it)('should initialize with source directory and interface pattern', () => {
42
- const analyzer = new class_analyzer_1.ClassAnalyzer('/test/src', 'I.*Repository');
43
- (0, vitest_1.expect)(analyzer).toBeInstanceOf(class_analyzer_1.ClassAnalyzer);
44
- });
45
- (0, vitest_1.it)('should initialize without interface pattern', () => {
46
- const analyzer = new class_analyzer_1.ClassAnalyzer('/test/src');
47
- (0, vitest_1.expect)(analyzer).toBeInstanceOf(class_analyzer_1.ClassAnalyzer);
48
- });
49
- });
50
- (0, vitest_1.describe)('analyzeFile', () => {
51
- const mockFilePath = '/src/services/user.service.ts';
52
- const mockRoot = { kind: 'SourceFile' };
53
- const mockClassNode = { kind: 'ClassDeclaration' };
54
- (0, vitest_1.beforeEach)(() => {
55
- mockAstParser.parseFile.mockReturnValue(mockRoot);
56
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
57
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
58
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
59
- mockAstParser.findAllClasses.mockReturnValue([]);
60
- mockAstParser.extractClassName.mockReturnValue('UserService');
61
- mockAstParser.extractInterfaceName.mockReturnValue('IUserService');
62
- mockAstParser.extractConstructorParameters.mockReturnValue(class_analyzer_fixtures_1.mockConstructorParams);
63
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
64
- });
65
- (0, vitest_1.it)('should analyze a basic class file successfully', async () => {
66
- const result = await classAnalyzer.analyzeFile(mockFilePath);
67
- (0, vitest_1.expect)(result).toHaveLength(1);
68
- (0, vitest_1.expect)(result[0]).toMatchObject({
69
- name: 'UserService',
70
- filePath: mockFilePath,
71
- interfaceName: 'IUserService',
72
- dependencies: ['IUserRepository', 'ILogger'],
73
- importPath: './services/user.service',
74
- scope: 'transient'
75
- });
76
- });
77
- (0, vitest_1.it)('should handle multiple classes in one file', async () => {
78
- const mockClassNodes = [
79
- { kind: 'ClassDeclaration', name: 'UserService' },
80
- { kind: 'ClassDeclaration', name: 'AdminService' }
81
- ];
82
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue(mockClassNodes);
83
- mockAstParser.extractClassName
84
- .mockReturnValueOnce('UserService')
85
- .mockReturnValueOnce('AdminService');
86
- mockAstParser.extractInterfaceName
87
- .mockReturnValueOnce('IUserService')
88
- .mockReturnValueOnce('IAdminService');
89
- mockAstParser.extractConstructorParameters
90
- .mockReturnValueOnce([class_analyzer_fixtures_1.mockConstructorParams[0]])
91
- .mockReturnValueOnce([class_analyzer_fixtures_1.mockConstructorParams[1]]);
92
- const result = await classAnalyzer.analyzeFile(mockFilePath);
93
- (0, vitest_1.expect)(result).toHaveLength(2);
94
- (0, vitest_1.expect)(result[0]?.name).toBe('UserService');
95
- (0, vitest_1.expect)(result[1]?.name).toBe('AdminService');
96
- });
97
- (0, vitest_1.it)('should filter classes by interface pattern', async () => {
98
- mockAstParser.extractInterfaceName.mockReturnValue('IUserRepository'); // Doesn't match 'I.*Service' pattern
99
- const result = await classAnalyzer.analyzeFile(mockFilePath);
100
- (0, vitest_1.expect)(result).toHaveLength(0);
101
- });
102
- (0, vitest_1.it)('should include classes when no interface pattern is specified', async () => {
103
- const analyzerWithoutPattern = new class_analyzer_1.ClassAnalyzer('/src');
104
- mockAstParser.extractInterfaceName.mockReturnValue('IInternalService');
105
- const result = await analyzerWithoutPattern.analyzeFile(mockFilePath);
106
- (0, vitest_1.expect)(result).toHaveLength(1);
107
- });
108
- (0, vitest_1.it)('should skip classes without class name', async () => {
109
- mockAstParser.extractClassName.mockReturnValue(null);
110
- const result = await classAnalyzer.analyzeFile(mockFilePath);
111
- (0, vitest_1.expect)(result).toHaveLength(0);
112
- });
113
- (0, vitest_1.it)('should skip classes without interface name', async () => {
114
- mockAstParser.extractInterfaceName.mockReturnValue(null);
115
- const result = await classAnalyzer.analyzeFile(mockFilePath);
116
- (0, vitest_1.expect)(result).toHaveLength(0);
117
- });
118
- (0, vitest_1.it)('should handle type aliases correctly', async () => {
119
- const typeAliases = new Map([
120
- ['NotificationSvc', 'INotificationService'],
121
- ['Log', 'ILogger']
122
- ]);
123
- const paramsWithAliases = [
124
- { name: 'notification', type: 'NotificationSvc', isOptional: false },
125
- { name: 'logger', type: 'Log', isOptional: false },
126
- { name: 'config', type: 'string', isOptional: false }
127
- ];
128
- mockAstParser.extractTypeAliases.mockReturnValue(typeAliases);
129
- mockAstParser.extractConstructorParameters.mockReturnValue(paramsWithAliases);
130
- const result = await classAnalyzer.analyzeFile(mockFilePath);
131
- (0, vitest_1.expect)(result[0]?.dependencies).toEqual(['INotificationService', 'ILogger']);
132
- });
133
- (0, vitest_1.it)('should extract JSDoc scope correctly', async () => {
134
- const jsDocScopes = new Map([['UserService', 'singleton']]);
135
- mockAstParser.extractJSDocComments.mockReturnValue(jsDocScopes);
136
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('singleton');
137
- const result = await classAnalyzer.analyzeFile(mockFilePath);
138
- (0, vitest_1.expect)(result[0]?.scope).toBe('singleton');
139
- });
140
- (0, vitest_1.it)('should handle parsing errors gracefully', async () => {
141
- mockAstParser.parseFile.mockImplementation(() => {
142
- throw new Error('Syntax error');
143
- });
144
- const result = await classAnalyzer.analyzeFile(mockFilePath);
145
- (0, vitest_1.expect)(result).toHaveLength(0);
146
- });
147
- (0, vitest_1.it)('should generate correct import paths', async () => {
148
- for (const testCase of class_analyzer_fixtures_1.importPathTestCases) {
149
- const result = await classAnalyzer.analyzeFile(testCase.filePath);
150
- (0, vitest_1.expect)(result[0]?.importPath).toBe(testCase.expected);
151
- }
152
- });
153
- (0, vitest_1.it)('should analyze classes without interfaces', async () => {
154
- const mockClassNodeWithoutInterface = { kind: 'ClassDeclaration' };
155
- // Setup: no classes with interfaces, but one class without interface
156
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([]);
157
- mockAstParser.findAllClasses.mockReturnValue([mockClassNodeWithoutInterface]);
158
- mockAstParser.extractClassName.mockReturnValue('UserRepository');
159
- mockAstParser.extractInterfaceName.mockReturnValue(null);
160
- mockAstParser.extractConstructorParameters.mockReturnValue([]);
161
- const result = await classAnalyzer.analyzeFile(mockFilePath);
162
- (0, vitest_1.expect)(result).toHaveLength(1);
163
- (0, vitest_1.expect)(result[0]).toMatchObject({
164
- name: 'UserRepository',
165
- filePath: mockFilePath,
166
- interfaceName: undefined,
167
- dependencies: [],
168
- scope: 'transient'
169
- });
170
- });
171
- (0, vitest_1.it)('should analyze mixed classes (with and without interfaces)', async () => {
172
- const mockClassWithInterface = { kind: 'ClassDeclaration', text: () => 'class UserService implements IUserService' };
173
- const mockClassWithoutInterface = { kind: 'ClassDeclaration', text: () => 'class UserRepository' };
174
- // Setup: one class with interface, one without
175
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassWithInterface]);
176
- mockAstParser.findAllClasses.mockReturnValue([mockClassWithInterface, mockClassWithoutInterface]);
177
- mockAstParser.extractClassName
178
- .mockReturnValueOnce('UserService')
179
- .mockReturnValueOnce('UserRepository');
180
- mockAstParser.extractInterfaceName
181
- .mockReturnValueOnce('IUserService')
182
- .mockReturnValueOnce(null);
183
- mockAstParser.extractConstructorParameters
184
- .mockReturnValueOnce(class_analyzer_fixtures_1.mockConstructorParams)
185
- .mockReturnValueOnce([]);
186
- const result = await classAnalyzer.analyzeFile(mockFilePath);
187
- (0, vitest_1.expect)(result).toHaveLength(2);
188
- (0, vitest_1.expect)(result[0]?.name).toBe('UserService');
189
- (0, vitest_1.expect)(result[0]?.interfaceName).toBe('IUserService');
190
- (0, vitest_1.expect)(result[1]?.name).toBe('UserRepository');
191
- (0, vitest_1.expect)(result[1]?.interfaceName).toBeUndefined();
192
- });
193
- (0, vitest_1.it)('should skip classes without interfaces that implement interfaces (duplicate prevention)', async () => {
194
- const mockClassWithInterface = { kind: 'ClassDeclaration', text: () => 'class UserService implements IUserService' };
195
- // Setup: same class appears in both lists
196
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassWithInterface]);
197
- mockAstParser.findAllClasses.mockReturnValue([mockClassWithInterface]);
198
- mockAstParser.extractClassName.mockReturnValue('UserService');
199
- mockAstParser.extractInterfaceName.mockReturnValue('IUserService');
200
- mockAstParser.extractConstructorParameters.mockReturnValue(class_analyzer_fixtures_1.mockConstructorParams);
201
- const result = await classAnalyzer.analyzeFile(mockFilePath);
202
- (0, vitest_1.expect)(result).toHaveLength(1); // Should not duplicate
203
- (0, vitest_1.expect)(result[0]?.name).toBe('UserService');
204
- (0, vitest_1.expect)(result[0]?.interfaceName).toBe('IUserService');
205
- });
206
- (0, vitest_1.it)('should skip classes that contain implements keyword but are not in interface classes list', async () => {
207
- const mockClassWithImplements = { kind: 'ClassDeclaration', text: () => 'class UserService implements IUserService' };
208
- // Setup: class has implements but not found by findClassesImplementingInterfaces
209
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([]);
210
- mockAstParser.findAllClasses.mockReturnValue([mockClassWithImplements]);
211
- mockAstParser.extractClassName.mockReturnValue('UserService');
212
- const result = await classAnalyzer.analyzeFile(mockFilePath);
213
- (0, vitest_1.expect)(result).toHaveLength(0); // Should skip classes with 'implements' keyword
214
- });
215
- });
216
- (0, vitest_1.describe)('resolveDependencies (private method testing via public interface)', () => {
217
- (0, vitest_1.it)('should resolve dependencies correctly', async () => {
218
- const mockFilePath = '/src/services/test.service.ts';
219
- const mockRoot = { kind: 'SourceFile' };
220
- const mockClassNode = { kind: 'ClassDeclaration' };
221
- const constructorParams = class_analyzer_fixtures_1.dependencyResolutionTestParams;
222
- mockAstParser.parseFile.mockReturnValue(mockRoot);
223
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
224
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
225
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
226
- mockAstParser.extractClassName.mockReturnValue('TestService');
227
- mockAstParser.extractInterfaceName.mockReturnValue('ITestService');
228
- mockAstParser.extractConstructorParameters.mockReturnValue(constructorParams);
229
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
230
- const result = await classAnalyzer.analyzeFile(mockFilePath);
231
- (0, vitest_1.expect)(result[0]?.dependencies).toEqual(['IUserRepository', 'ILogger']);
232
- });
233
- (0, vitest_1.it)('should resolve type aliases in dependencies', async () => {
234
- const mockFilePath = '/src/services/test.service.ts';
235
- const mockRoot = { kind: 'SourceFile' };
236
- const mockClassNode = { kind: 'ClassDeclaration' };
237
- const typeAliases = class_analyzer_fixtures_1.typeAliasesForDependencyTest;
238
- const constructorParams = class_analyzer_fixtures_1.constructorParamsWithAliases;
239
- mockAstParser.parseFile.mockReturnValue(mockRoot);
240
- mockAstParser.extractTypeAliases.mockReturnValue(typeAliases);
241
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
242
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
243
- mockAstParser.extractClassName.mockReturnValue('TestService');
244
- mockAstParser.extractInterfaceName.mockReturnValue('ITestService');
245
- mockAstParser.extractConstructorParameters.mockReturnValue(constructorParams);
246
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
247
- const result = await classAnalyzer.analyzeFile(mockFilePath);
248
- (0, vitest_1.expect)(result[0]?.dependencies).toEqual(['IUserRepository', 'ILogger']);
249
- });
250
- });
251
- (0, vitest_1.describe)('generateImportPath (private method testing via public interface)', () => {
252
- (0, vitest_1.it)('should generate correct relative import paths', async () => {
253
- for (const testCase of class_analyzer_fixtures_1.generateImportPathTestCases) {
254
- const analyzer = new class_analyzer_1.ClassAnalyzer(testCase.sourceDir);
255
- const mockRoot = { kind: 'SourceFile' };
256
- const mockClassNode = { kind: 'ClassDeclaration' };
257
- mockAstParser.parseFile.mockReturnValue(mockRoot);
258
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
259
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
260
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
261
- mockAstParser.extractClassName.mockReturnValue('TestClass');
262
- mockAstParser.extractInterfaceName.mockReturnValue('ITestClass');
263
- mockAstParser.extractConstructorParameters.mockReturnValue([]);
264
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
265
- const result = await analyzer.analyzeFile(testCase.filePath);
266
- (0, vitest_1.expect)(result[0]?.importPath).toBe(testCase.expected);
267
- }
268
- });
269
- });
270
- (0, vitest_1.describe)('integration scenarios', () => {
271
- (0, vitest_1.it)('should handle empty constructor parameters', async () => {
272
- const mockFilePath = '/src/services/simple.service.ts';
273
- const mockRoot = { kind: 'SourceFile' };
274
- const mockClassNode = { kind: 'ClassDeclaration' };
275
- mockAstParser.parseFile.mockReturnValue(mockRoot);
276
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
277
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
278
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
279
- mockAstParser.extractClassName.mockReturnValue('SimpleService');
280
- mockAstParser.extractInterfaceName.mockReturnValue('ISimpleService');
281
- mockAstParser.extractConstructorParameters.mockReturnValue([]);
282
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
283
- const result = await classAnalyzer.analyzeFile(mockFilePath);
284
- (0, vitest_1.expect)(result).toHaveLength(1);
285
- (0, vitest_1.expect)(result[0]?.dependencies).toEqual([]);
286
- (0, vitest_1.expect)(result[0]?.constructorParams).toEqual([]);
287
- });
288
- (0, vitest_1.it)('should handle complex interface patterns', async () => {
289
- const complexPatternAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', '^I[A-Z].*Service$');
290
- const mockFilePath = '/src/services/user.service.ts';
291
- const mockRoot = { kind: 'SourceFile' };
292
- const mockClassNode = { kind: 'ClassDeclaration' };
293
- mockAstParser.parseFile.mockReturnValue(mockRoot);
294
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
295
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
296
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
297
- mockAstParser.extractClassName.mockReturnValue('UserService');
298
- mockAstParser.extractInterfaceName.mockReturnValue('IUserService');
299
- mockAstParser.extractConstructorParameters.mockReturnValue([]);
300
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
301
- const result = await complexPatternAnalyzer.analyzeFile(mockFilePath);
302
- (0, vitest_1.expect)(result).toHaveLength(1);
303
- (0, vitest_1.expect)(result[0]?.interfaceName).toBe('IUserService');
304
- });
305
- (0, vitest_1.it)('should reject interfaces that do not match complex patterns', async () => {
306
- const complexPatternAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', '^I[A-Z].*Service$');
307
- const mockFilePath = '/src/repositories/user.repository.ts';
308
- const mockRoot = { kind: 'SourceFile' };
309
- const mockClassNode = { kind: 'ClassDeclaration' };
310
- mockAstParser.parseFile.mockReturnValue(mockRoot);
311
- mockAstParser.extractTypeAliases.mockReturnValue(new Map());
312
- mockAstParser.extractJSDocComments.mockReturnValue(new Map());
313
- mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
314
- mockAstParser.extractClassName.mockReturnValue('UserRepository');
315
- mockAstParser.extractInterfaceName.mockReturnValue('IUserRepository'); // Doesn't end with 'Service'
316
- mockAstParser.extractConstructorParameters.mockReturnValue([]);
317
- mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
318
- const result = await complexPatternAnalyzer.analyzeFile(mockFilePath);
319
- (0, vitest_1.expect)(result).toHaveLength(0);
320
- });
321
- });
322
- });
323
- //# sourceMappingURL=class-analyzer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"class-analyzer.test.js","sourceRoot":"","sources":["../../../src/__tests__/analyser/class-analyzer.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dependency-resolver.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-resolver.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analyser/dependency-resolver.test.ts"],"names":[],"mappings":""}
@@ -1,128 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const dependency_resolver_1 = require("../../analyser/dependency-resolver");
5
- const dependency_resolver_fixtures_1 = require("./fixtures/dependency-resolver-fixtures");
6
- (0, vitest_1.describe)('DependencyResolver', () => {
7
- let resolver;
8
- let mockClasses;
9
- (0, vitest_1.beforeEach)(() => {
10
- mockClasses = dependency_resolver_fixtures_1.basicMockClasses;
11
- resolver = new dependency_resolver_1.DependencyResolver(mockClasses);
12
- });
13
- (0, vitest_1.describe)('resolve', () => {
14
- (0, vitest_1.it)('should return topologically sorted classes', () => {
15
- const result = resolver.resolve();
16
- (0, vitest_1.expect)(result.sorted).toHaveLength(4);
17
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
18
- // Dependencies should come before dependents
19
- const userServiceIndex = result.sorted.indexOf('UserService');
20
- const userRepoIndex = result.sorted.indexOf('UserRepository');
21
- const dbIndex = result.sorted.indexOf('DatabaseConnection');
22
- const loggerIndex = result.sorted.indexOf('Logger');
23
- (0, vitest_1.expect)(dbIndex).toBeLessThan(userRepoIndex);
24
- (0, vitest_1.expect)(userRepoIndex).toBeLessThan(userServiceIndex);
25
- (0, vitest_1.expect)(loggerIndex).toBeLessThan(userServiceIndex);
26
- });
27
- (0, vitest_1.it)('should handle classes with no dependencies', () => {
28
- const simpleResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.simpleClasses);
29
- const result = simpleResolver.resolve();
30
- (0, vitest_1.expect)(result.sorted).toEqual(['SimpleClass']);
31
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
32
- });
33
- (0, vitest_1.it)('should handle empty class list', () => {
34
- const emptyResolver = new dependency_resolver_1.DependencyResolver([]);
35
- const result = emptyResolver.resolve();
36
- (0, vitest_1.expect)(result.sorted).toHaveLength(0);
37
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
38
- });
39
- (0, vitest_1.it)('should detect circular dependencies', () => {
40
- const circularResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.circularClasses);
41
- const result = circularResolver.resolve();
42
- (0, vitest_1.expect)(result.cycles.length).toBeGreaterThan(0);
43
- (0, vitest_1.expect)(result.cycles[0]).toContain('ClassA');
44
- (0, vitest_1.expect)(result.cycles[0]).toContain('ClassB');
45
- (0, vitest_1.expect)(result.cycles[0]).toContain('ClassC');
46
- });
47
- (0, vitest_1.it)('should handle self-referencing circular dependency', () => {
48
- const selfRefResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.selfRefClasses);
49
- const result = selfRefResolver.resolve();
50
- (0, vitest_1.expect)(result.cycles.length).toBeGreaterThan(0);
51
- (0, vitest_1.expect)(result.cycles[0]).toContain('SelfRef');
52
- });
53
- (0, vitest_1.it)('should ignore external dependencies not in managed classes', () => {
54
- const externalResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.classesWithExternal);
55
- const result = externalResolver.resolve();
56
- (0, vitest_1.expect)(result.sorted).toHaveLength(2);
57
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
58
- const serviceIndex = result.sorted.indexOf('ServiceWithExternal');
59
- const managedIndex = result.sorted.indexOf('ManagedDep');
60
- (0, vitest_1.expect)(managedIndex).toBeLessThan(serviceIndex);
61
- });
62
- });
63
- (0, vitest_1.describe)('detectCircularDependencies', () => {
64
- (0, vitest_1.it)('should return empty array when no circular dependencies exist', () => {
65
- const cycles = resolver.detectCircularDependencies();
66
- (0, vitest_1.expect)(cycles).toHaveLength(0);
67
- });
68
- (0, vitest_1.it)('should detect and return circular dependencies', () => {
69
- const circularResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.simpleBinaryCircular);
70
- const cycles = circularResolver.detectCircularDependencies();
71
- (0, vitest_1.expect)(cycles.length).toBeGreaterThan(0);
72
- (0, vitest_1.expect)(cycles[0]).toContain('A');
73
- (0, vitest_1.expect)(cycles[0]).toContain('B');
74
- });
75
- (0, vitest_1.it)('should detect multiple separate circular dependencies', () => {
76
- const multiResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.multiCircularClasses);
77
- const cycles = multiResolver.detectCircularDependencies();
78
- (0, vitest_1.expect)(cycles.length).toBeGreaterThanOrEqual(2);
79
- });
80
- });
81
- (0, vitest_1.describe)('buildDependencyGraph', () => {
82
- (0, vitest_1.it)('should build correct dependency graph', () => {
83
- // Access private method through type assertion for testing
84
- const graph = resolver.buildDependencyGraph();
85
- (0, vitest_1.expect)(graph['UserService']).toEqual(['UserRepository', 'Logger']);
86
- (0, vitest_1.expect)(graph['UserRepository']).toEqual(['DatabaseConnection']);
87
- (0, vitest_1.expect)(graph['DatabaseConnection']).toEqual([]);
88
- (0, vitest_1.expect)(graph['Logger']).toEqual([]);
89
- });
90
- (0, vitest_1.it)('should filter out external dependencies', () => {
91
- const externalResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.externalDependencyClasses);
92
- const graph = externalResolver.buildDependencyGraph();
93
- (0, vitest_1.expect)(graph['TestClass']).toEqual(['ManagedClass']);
94
- (0, vitest_1.expect)(graph['ManagedClass']).toEqual([]);
95
- });
96
- (0, vitest_1.it)('should handle classes with no dependencies', () => {
97
- const noDepsResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.standaloneClasses);
98
- const graph = noDepsResolver.buildDependencyGraph();
99
- (0, vitest_1.expect)(graph['Standalone']).toEqual([]);
100
- });
101
- });
102
- (0, vitest_1.describe)('complex dependency scenarios', () => {
103
- (0, vitest_1.it)('should handle diamond dependency pattern', () => {
104
- const diamondResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.diamondClasses);
105
- const result = diamondResolver.resolve();
106
- (0, vitest_1.expect)(result.sorted).toHaveLength(4);
107
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
108
- const topIndex = result.sorted.indexOf('Top');
109
- const leftIndex = result.sorted.indexOf('Left');
110
- const rightIndex = result.sorted.indexOf('Right');
111
- const bottomIndex = result.sorted.indexOf('Bottom');
112
- (0, vitest_1.expect)(bottomIndex).toBeLessThan(leftIndex);
113
- (0, vitest_1.expect)(bottomIndex).toBeLessThan(rightIndex);
114
- (0, vitest_1.expect)(leftIndex).toBeLessThan(topIndex);
115
- (0, vitest_1.expect)(rightIndex).toBeLessThan(topIndex);
116
- });
117
- (0, vitest_1.it)('should handle optional dependencies correctly', () => {
118
- const optionalResolver = new dependency_resolver_1.DependencyResolver(dependency_resolver_fixtures_1.optionalDepClasses);
119
- const result = optionalResolver.resolve();
120
- (0, vitest_1.expect)(result.sorted).toHaveLength(2);
121
- (0, vitest_1.expect)(result.cycles).toHaveLength(0);
122
- const serviceIndex = result.sorted.indexOf('ServiceWithOptional');
123
- const requiredIndex = result.sorted.indexOf('RequiredDep');
124
- (0, vitest_1.expect)(requiredIndex).toBeLessThan(serviceIndex);
125
- });
126
- });
127
- });
128
- //# sourceMappingURL=dependency-resolver.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency-resolver.test.js","sourceRoot":"","sources":["../../../src/__tests__/analyser/dependency-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- export declare const testFileContents: {
2
- basicClass: string;
3
- emptyFile: string;
4
- classWithInterface: string;
5
- regularClassOnly: string;
6
- multipleInterfaceClasses: string;
7
- mixedClasses: string;
8
- onlyRegularClasses: string;
9
- simpleClassName: string;
10
- complexClassName: string;
11
- interfaceOnly: string;
12
- singleInterface: string;
13
- multipleInterfaces: string;
14
- constructorWithParams: string;
15
- optionalParameters: string;
16
- noConstructor: string;
17
- emptyConstructor: string;
18
- protectedParameter: string;
19
- jsDocWithScope: string;
20
- noJSDoc: string;
21
- regularComments: string;
22
- malformedJSDoc: string;
23
- typeAliases: string;
24
- noAliases: string;
25
- noImports: string;
26
- complexImports: string;
27
- };
28
- //# sourceMappingURL=ast-parser-fixtures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-parser-fixtures.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/analyser/fixtures/ast-parser-fixtures.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;CAgP5B,CAAC"}