@notjustcoders/ioc-arise 1.0.0

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/dist/__tests__/analyser/ast-parser.test.d.ts +2 -0
  4. package/dist/__tests__/analyser/ast-parser.test.d.ts.map +1 -0
  5. package/dist/__tests__/analyser/ast-parser.test.js +268 -0
  6. package/dist/__tests__/analyser/ast-parser.test.js.map +1 -0
  7. package/dist/__tests__/analyser/class-analyzer.test.d.ts +2 -0
  8. package/dist/__tests__/analyser/class-analyzer.test.d.ts.map +1 -0
  9. package/dist/__tests__/analyser/class-analyzer.test.js +259 -0
  10. package/dist/__tests__/analyser/class-analyzer.test.js.map +1 -0
  11. package/dist/__tests__/analyser/dependency-resolver.test.d.ts +2 -0
  12. package/dist/__tests__/analyser/dependency-resolver.test.d.ts.map +1 -0
  13. package/dist/__tests__/analyser/dependency-resolver.test.js +128 -0
  14. package/dist/__tests__/analyser/dependency-resolver.test.js.map +1 -0
  15. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts +26 -0
  16. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts.map +1 -0
  17. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js +178 -0
  18. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js.map +1 -0
  19. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts +54 -0
  20. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts.map +1 -0
  21. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js +285 -0
  22. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js.map +1 -0
  23. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts +13 -0
  24. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts.map +1 -0
  25. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js +266 -0
  26. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js.map +1 -0
  27. package/dist/__tests__/generator/container-generator.test.d.ts +2 -0
  28. package/dist/__tests__/generator/container-generator.test.d.ts.map +1 -0
  29. package/dist/__tests__/generator/container-generator.test.js +185 -0
  30. package/dist/__tests__/generator/container-generator.test.js.map +1 -0
  31. package/dist/__tests__/generator/dependency-resolver.test.d.ts +2 -0
  32. package/dist/__tests__/generator/dependency-resolver.test.d.ts.map +1 -0
  33. package/dist/__tests__/generator/dependency-resolver.test.js +330 -0
  34. package/dist/__tests__/generator/dependency-resolver.test.js.map +1 -0
  35. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts +23 -0
  36. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts.map +1 -0
  37. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js +254 -0
  38. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js.map +1 -0
  39. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts +10 -0
  40. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts.map +1 -0
  41. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js +194 -0
  42. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js.map +1 -0
  43. package/dist/__tests__/generator/import-generator.test.d.ts +2 -0
  44. package/dist/__tests__/generator/import-generator.test.d.ts.map +1 -0
  45. package/dist/__tests__/generator/import-generator.test.js +121 -0
  46. package/dist/__tests__/generator/import-generator.test.js.map +1 -0
  47. package/dist/__tests__/generator/instantiation-generator.test.d.ts +2 -0
  48. package/dist/__tests__/generator/instantiation-generator.test.d.ts.map +1 -0
  49. package/dist/__tests__/generator/instantiation-generator.test.js +251 -0
  50. package/dist/__tests__/generator/instantiation-generator.test.js.map +1 -0
  51. package/dist/analyser/ast-parser.d.ts +12 -0
  52. package/dist/analyser/ast-parser.d.ts.map +1 -0
  53. package/dist/analyser/ast-parser.js +192 -0
  54. package/dist/analyser/ast-parser.js.map +1 -0
  55. package/dist/analyser/class-analyzer.d.ts +11 -0
  56. package/dist/analyser/class-analyzer.d.ts.map +1 -0
  57. package/dist/analyser/class-analyzer.js +78 -0
  58. package/dist/analyser/class-analyzer.js.map +1 -0
  59. package/dist/analyser/dependency-resolver.d.ts +10 -0
  60. package/dist/analyser/dependency-resolver.d.ts.map +1 -0
  61. package/dist/analyser/dependency-resolver.js +46 -0
  62. package/dist/analyser/dependency-resolver.js.map +1 -0
  63. package/dist/analyser/file-discovery.d.ts +7 -0
  64. package/dist/analyser/file-discovery.d.ts.map +1 -0
  65. package/dist/analyser/file-discovery.js +30 -0
  66. package/dist/analyser/file-discovery.js.map +1 -0
  67. package/dist/analyser/index.d.ts +3 -0
  68. package/dist/analyser/index.d.ts.map +1 -0
  69. package/dist/analyser/index.js +14 -0
  70. package/dist/analyser/index.js.map +1 -0
  71. package/dist/analyser/module-dependency-resolver.d.ts +17 -0
  72. package/dist/analyser/module-dependency-resolver.d.ts.map +1 -0
  73. package/dist/analyser/module-dependency-resolver.js +66 -0
  74. package/dist/analyser/module-dependency-resolver.js.map +1 -0
  75. package/dist/analyser/project-analyzer.d.ts +8 -0
  76. package/dist/analyser/project-analyzer.d.ts.map +1 -0
  77. package/dist/analyser/project-analyzer.js +20 -0
  78. package/dist/analyser/project-analyzer.js.map +1 -0
  79. package/dist/commands/analyze.d.ts +3 -0
  80. package/dist/commands/analyze.d.ts.map +1 -0
  81. package/dist/commands/analyze.js +66 -0
  82. package/dist/commands/analyze.js.map +1 -0
  83. package/dist/commands/generate.d.ts +3 -0
  84. package/dist/commands/generate.d.ts.map +1 -0
  85. package/dist/commands/generate.js +150 -0
  86. package/dist/commands/generate.js.map +1 -0
  87. package/dist/container.d.ts +5 -0
  88. package/dist/container.d.ts.map +1 -0
  89. package/dist/container.js +8 -0
  90. package/dist/container.js.map +1 -0
  91. package/dist/generator/container-file-generator.d.ts +20 -0
  92. package/dist/generator/container-file-generator.d.ts.map +1 -0
  93. package/dist/generator/container-file-generator.js +255 -0
  94. package/dist/generator/container-file-generator.js.map +1 -0
  95. package/dist/generator/container-generator.d.ts +8 -0
  96. package/dist/generator/container-generator.d.ts.map +1 -0
  97. package/dist/generator/container-generator.js +35 -0
  98. package/dist/generator/container-generator.js.map +1 -0
  99. package/dist/generator/dependency-resolver.d.ts +11 -0
  100. package/dist/generator/dependency-resolver.d.ts.map +1 -0
  101. package/dist/generator/dependency-resolver.js +83 -0
  102. package/dist/generator/dependency-resolver.js.map +1 -0
  103. package/dist/generator/file-writer.d.ts +6 -0
  104. package/dist/generator/file-writer.d.ts.map +1 -0
  105. package/dist/generator/file-writer.js +19 -0
  106. package/dist/generator/file-writer.js.map +1 -0
  107. package/dist/generator/import-generator.d.ts +7 -0
  108. package/dist/generator/import-generator.d.ts.map +1 -0
  109. package/dist/generator/import-generator.js +31 -0
  110. package/dist/generator/import-generator.js.map +1 -0
  111. package/dist/generator/index.d.ts +4 -0
  112. package/dist/generator/index.d.ts.map +1 -0
  113. package/dist/generator/index.js +25 -0
  114. package/dist/generator/index.js.map +1 -0
  115. package/dist/generator/instantiation-generator.d.ts +8 -0
  116. package/dist/generator/instantiation-generator.d.ts.map +1 -0
  117. package/dist/generator/instantiation-generator.js +153 -0
  118. package/dist/generator/instantiation-generator.js.map +1 -0
  119. package/dist/generator/module-container-generator.d.ts +10 -0
  120. package/dist/generator/module-container-generator.d.ts.map +1 -0
  121. package/dist/generator/module-container-generator.js +51 -0
  122. package/dist/generator/module-container-generator.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +20 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/types.d.ts +30 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +3 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils/configManager.d.ts +21 -0
  132. package/dist/utils/configManager.d.ts.map +1 -0
  133. package/dist/utils/configManager.js +50 -0
  134. package/dist/utils/configManager.js.map +1 -0
  135. package/dist/utils/moduleResolver.d.ts +38 -0
  136. package/dist/utils/moduleResolver.d.ts.map +1 -0
  137. package/dist/utils/moduleResolver.js +108 -0
  138. package/dist/utils/moduleResolver.js.map +1 -0
  139. package/dist/utils/naming.d.ts +7 -0
  140. package/dist/utils/naming.d.ts.map +1 -0
  141. package/dist/utils/naming.js +12 -0
  142. package/dist/utils/naming.js.map +1 -0
  143. package/dist/utils/topological-sorter.d.ts +17 -0
  144. package/dist/utils/topological-sorter.d.ts.map +1 -0
  145. package/dist/utils/topological-sorter.js +69 -0
  146. package/dist/utils/topological-sorter.js.map +1 -0
  147. package/package.json +72 -0
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expectedResults = exports.testClassForResolution = exports.circularDependencyClasses = exports.classesWithoutInterfaces = exports.unmanagedClassesWithParams = exports.mixedDependencyClasses = exports.transientClasses = exports.basicManagedClasses = void 0;
4
+ // Basic managed classes for testing
5
+ exports.basicManagedClasses = [
6
+ {
7
+ name: 'UserService',
8
+ filePath: '/src/services/user.service.ts',
9
+ dependencies: ['IUserRepository'],
10
+ constructorParams: [
11
+ {
12
+ name: 'userRepository',
13
+ type: 'IUserRepository',
14
+ isOptional: false,
15
+ accessModifier: 'private'
16
+ }
17
+ ],
18
+ interfaceName: 'IUserService',
19
+ importPath: './services/user.service',
20
+ scope: 'singleton'
21
+ },
22
+ {
23
+ name: 'UserRepository',
24
+ filePath: '/src/repositories/user.repository.ts',
25
+ dependencies: [],
26
+ constructorParams: [],
27
+ interfaceName: 'IUserRepository',
28
+ importPath: './repositories/user.repository',
29
+ scope: 'singleton'
30
+ }
31
+ ];
32
+ // Classes with transient scope
33
+ exports.transientClasses = [
34
+ {
35
+ name: 'EmailService',
36
+ filePath: '/src/services/email.service.ts',
37
+ dependencies: ['IEmailProvider'],
38
+ constructorParams: [
39
+ {
40
+ name: 'emailProvider',
41
+ type: 'IEmailProvider',
42
+ isOptional: false,
43
+ accessModifier: 'private'
44
+ }
45
+ ],
46
+ interfaceName: 'IEmailService',
47
+ importPath: './services/email.service',
48
+ scope: 'transient'
49
+ },
50
+ {
51
+ name: 'EmailProvider',
52
+ filePath: '/src/providers/email.provider.ts',
53
+ dependencies: [],
54
+ constructorParams: [],
55
+ interfaceName: 'IEmailProvider',
56
+ importPath: './providers/email.provider',
57
+ scope: 'transient'
58
+ }
59
+ ];
60
+ // Classes with mixed dependencies (managed and unmanaged)
61
+ exports.mixedDependencyClasses = [
62
+ {
63
+ name: 'OrderService',
64
+ filePath: '/src/services/order.service.ts',
65
+ dependencies: ['IUserService', 'PaymentGateway', 'Logger'],
66
+ constructorParams: [
67
+ {
68
+ name: 'userService',
69
+ type: 'IUserService',
70
+ isOptional: false,
71
+ accessModifier: 'private'
72
+ },
73
+ {
74
+ name: 'paymentGateway',
75
+ type: 'PaymentGateway',
76
+ isOptional: false,
77
+ accessModifier: 'private'
78
+ },
79
+ {
80
+ name: 'logger',
81
+ type: 'Logger',
82
+ isOptional: false,
83
+ accessModifier: 'private'
84
+ }
85
+ ],
86
+ interfaceName: 'IOrderService',
87
+ importPath: './services/order.service',
88
+ scope: 'singleton'
89
+ },
90
+ ...exports.basicManagedClasses
91
+ ];
92
+ // Unmanaged classes with constructor parameters
93
+ exports.unmanagedClassesWithParams = [
94
+ {
95
+ name: 'DatabaseConnection',
96
+ filePath: '/src/database/connection.ts',
97
+ dependencies: [],
98
+ constructorParams: [
99
+ {
100
+ name: 'host',
101
+ type: 'string',
102
+ isOptional: false,
103
+ accessModifier: 'private'
104
+ },
105
+ {
106
+ name: 'port',
107
+ type: 'number',
108
+ isOptional: false,
109
+ accessModifier: 'private'
110
+ },
111
+ {
112
+ name: 'ssl',
113
+ type: 'boolean',
114
+ isOptional: true,
115
+ accessModifier: 'private'
116
+ }
117
+ ],
118
+ importPath: './database/connection',
119
+ scope: 'singleton'
120
+ },
121
+ {
122
+ name: 'ConfigService',
123
+ filePath: '/src/config/config.service.ts',
124
+ dependencies: [],
125
+ constructorParams: [
126
+ {
127
+ name: 'config',
128
+ type: 'Config',
129
+ isOptional: false,
130
+ accessModifier: 'private'
131
+ },
132
+ {
133
+ name: 'env',
134
+ type: 'Environment',
135
+ isOptional: true,
136
+ accessModifier: 'private'
137
+ }
138
+ ],
139
+ importPath: './config/config.service',
140
+ scope: 'singleton'
141
+ }
142
+ ];
143
+ // Classes without interface names
144
+ exports.classesWithoutInterfaces = [
145
+ {
146
+ name: 'UtilityService',
147
+ filePath: '/src/utils/utility.service.ts',
148
+ dependencies: [],
149
+ constructorParams: [],
150
+ importPath: './utils/utility.service',
151
+ scope: 'singleton'
152
+ },
153
+ {
154
+ name: 'HelperService',
155
+ filePath: '/src/helpers/helper.service.ts',
156
+ dependencies: ['UtilityService'],
157
+ constructorParams: [
158
+ {
159
+ name: 'utilityService',
160
+ type: 'UtilityService',
161
+ isOptional: false,
162
+ accessModifier: 'private'
163
+ }
164
+ ],
165
+ importPath: './helpers/helper.service',
166
+ scope: 'singleton'
167
+ }
168
+ ];
169
+ // Complex scenario with circular dependencies
170
+ exports.circularDependencyClasses = [
171
+ {
172
+ name: 'ServiceA',
173
+ filePath: '/src/services/service-a.ts',
174
+ dependencies: ['IServiceB'],
175
+ constructorParams: [
176
+ {
177
+ name: 'serviceB',
178
+ type: 'IServiceB',
179
+ isOptional: false,
180
+ accessModifier: 'private'
181
+ }
182
+ ],
183
+ interfaceName: 'IServiceA',
184
+ importPath: './services/service-a',
185
+ scope: 'singleton'
186
+ },
187
+ {
188
+ name: 'ServiceB',
189
+ filePath: '/src/services/service-b.ts',
190
+ dependencies: ['IServiceA'],
191
+ constructorParams: [
192
+ {
193
+ name: 'serviceA',
194
+ type: 'IServiceA',
195
+ isOptional: false,
196
+ accessModifier: 'private'
197
+ }
198
+ ],
199
+ interfaceName: 'IServiceB',
200
+ importPath: './services/service-b',
201
+ scope: 'singleton'
202
+ }
203
+ ];
204
+ // Test class for dependency resolution
205
+ exports.testClassForResolution = {
206
+ name: 'TestService',
207
+ filePath: '/src/services/test.service.ts',
208
+ dependencies: ['IUserService', 'IEmailService', 'UnmanagedClass'],
209
+ constructorParams: [
210
+ {
211
+ name: 'userService',
212
+ type: 'IUserService',
213
+ isOptional: false,
214
+ accessModifier: 'private'
215
+ },
216
+ {
217
+ name: 'emailService',
218
+ type: 'IEmailService',
219
+ isOptional: false,
220
+ accessModifier: 'private'
221
+ },
222
+ {
223
+ name: 'unmanagedClass',
224
+ type: 'UnmanagedClass',
225
+ isOptional: false,
226
+ accessModifier: 'private'
227
+ }
228
+ ],
229
+ interfaceName: 'ITestService',
230
+ importPath: './services/test.service',
231
+ scope: 'singleton'
232
+ };
233
+ // Expected results for various test scenarios
234
+ exports.expectedResults = {
235
+ basicInterfaceToClassMap: new Map([
236
+ ['IUserService', 'UserService'],
237
+ ['IUserRepository', 'UserRepository']
238
+ ]),
239
+ transientInterfaceToClassMap: new Map([
240
+ ['IEmailService', 'EmailService'],
241
+ ['IEmailProvider', 'EmailProvider']
242
+ ]),
243
+ mixedDependenciesResolution: 'userService, new PaymentGateway(), new Logger()',
244
+ transientDependenciesResolution: 'emailProviderFactory()',
245
+ singletonDependenciesResolution: 'userRepository',
246
+ unmanagedWithParamsResolution: 'new DatabaseConnection("default", 0, undefined)',
247
+ primitiveTypesDefaults: {
248
+ string: '"default"',
249
+ number: '0',
250
+ boolean: 'false',
251
+ date: 'new Date()'
252
+ }
253
+ };
254
+ //# sourceMappingURL=dependency-resolver.fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.fixtures.js","sourceRoot":"","sources":["../../../../src/__tests__/generator/fixtures/dependency-resolver.fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ClassInfo } from '../../../types';
2
+ export declare const mockClassInfos: ClassInfo[];
3
+ export declare const mockClassInfoWithNoDependencies: ClassInfo;
4
+ export declare const mockClassInfoWithUnmanagedDependencies: ClassInfo;
5
+ export declare const expectedImportsForMockClasses: string;
6
+ export declare const expectedImportsWithUnmanagedDependencies: string;
7
+ export declare const duplicateClassesFixture: ClassInfo[];
8
+ export declare const circularClassesFixture: ClassInfo[];
9
+ export declare const mixedClassesFixture: ClassInfo[];
10
+ //# sourceMappingURL=import-generator.fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-generator.fixtures.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/generator/fixtures/import-generator.fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,gBAAgB,CAAC;AAE3D,eAAO,MAAM,cAAc,EAAE,SAAS,EA6DrC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,SAQ7C,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,SAqBpD,CAAC;AAEF,eAAO,MAAM,6BAA6B,QAI9B,CAAC;AAEb,eAAO,MAAM,wCAAwC,QAMzC,CAAC;AAEb,eAAO,MAAM,uBAAuB,EAAE,SAAS,EA2B9C,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,SAAS,EA2B7C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,EA4B1C,CAAC"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mixedClassesFixture = exports.circularClassesFixture = exports.duplicateClassesFixture = exports.expectedImportsWithUnmanagedDependencies = exports.expectedImportsForMockClasses = exports.mockClassInfoWithUnmanagedDependencies = exports.mockClassInfoWithNoDependencies = exports.mockClassInfos = void 0;
4
+ exports.mockClassInfos = [
5
+ {
6
+ name: 'UserService',
7
+ filePath: '/src/services/user.service.ts',
8
+ dependencies: ['IUserRepository', 'EmailService'],
9
+ constructorParams: [
10
+ {
11
+ name: 'userRepository',
12
+ type: 'IUserRepository',
13
+ isOptional: false,
14
+ accessModifier: 'private'
15
+ },
16
+ {
17
+ name: 'emailService',
18
+ type: 'EmailService',
19
+ isOptional: false,
20
+ accessModifier: 'private'
21
+ }
22
+ ],
23
+ interfaceName: 'IUserService',
24
+ importPath: './services/user.service',
25
+ scope: 'singleton'
26
+ },
27
+ {
28
+ name: 'EmailService',
29
+ filePath: '/src/services/email.service.ts',
30
+ dependencies: ['IEmailProvider'],
31
+ constructorParams: [
32
+ {
33
+ name: 'emailProvider',
34
+ type: 'IEmailProvider',
35
+ isOptional: false,
36
+ accessModifier: 'private'
37
+ }
38
+ ],
39
+ interfaceName: 'IEmailService',
40
+ importPath: './services/email.service',
41
+ scope: 'transient'
42
+ },
43
+ {
44
+ name: 'ProductService',
45
+ filePath: '/src/services/product.service.ts',
46
+ dependencies: ['IProductRepository', 'UserService'],
47
+ constructorParams: [
48
+ {
49
+ name: 'productRepository',
50
+ type: 'IProductRepository',
51
+ isOptional: false,
52
+ accessModifier: 'private'
53
+ },
54
+ {
55
+ name: 'userService',
56
+ type: 'UserService',
57
+ isOptional: false,
58
+ accessModifier: 'private'
59
+ }
60
+ ],
61
+ interfaceName: 'IProductService',
62
+ importPath: './services/product.service',
63
+ scope: 'singleton'
64
+ }
65
+ ];
66
+ exports.mockClassInfoWithNoDependencies = {
67
+ name: 'LoggerService',
68
+ filePath: '/src/services/logger.service.ts',
69
+ dependencies: [],
70
+ constructorParams: [],
71
+ interfaceName: 'ILoggerService',
72
+ importPath: './services/logger.service',
73
+ scope: 'singleton'
74
+ };
75
+ exports.mockClassInfoWithUnmanagedDependencies = {
76
+ name: 'DatabaseService',
77
+ filePath: '/src/services/database.service.ts',
78
+ dependencies: ['Connection', 'IConfig'],
79
+ constructorParams: [
80
+ {
81
+ name: 'connection',
82
+ type: 'Connection',
83
+ isOptional: false,
84
+ accessModifier: 'private'
85
+ },
86
+ {
87
+ name: 'config',
88
+ type: 'IConfig',
89
+ isOptional: false,
90
+ accessModifier: 'private'
91
+ }
92
+ ],
93
+ interfaceName: 'IDatabaseService',
94
+ importPath: './services/database.service',
95
+ scope: 'singleton'
96
+ };
97
+ exports.expectedImportsForMockClasses = [
98
+ "import { UserService } from './services/user.service';",
99
+ "import { EmailService } from './services/email.service';",
100
+ "import { ProductService } from './services/product.service';"
101
+ ].join('\n');
102
+ exports.expectedImportsWithUnmanagedDependencies = [
103
+ "import { UserService } from './services/user.service';",
104
+ "import { EmailService } from './services/email.service';",
105
+ "import { ProductService } from './services/product.service';",
106
+ "import { DatabaseService } from './services/database.service';",
107
+ "import { Connection } from './services/database.service';"
108
+ ].join('\n');
109
+ exports.duplicateClassesFixture = [
110
+ {
111
+ name: 'ServiceA',
112
+ filePath: '/src/services/shared.service.ts',
113
+ dependencies: ['SharedDependency'],
114
+ constructorParams: [{
115
+ name: 'sharedDep',
116
+ type: 'SharedDependency',
117
+ isOptional: false,
118
+ accessModifier: 'private'
119
+ }],
120
+ importPath: './services/shared.service',
121
+ scope: 'singleton'
122
+ },
123
+ {
124
+ name: 'ServiceB',
125
+ filePath: '/src/services/shared.service.ts',
126
+ dependencies: ['SharedDependency'],
127
+ constructorParams: [{
128
+ name: 'sharedDep',
129
+ type: 'SharedDependency',
130
+ isOptional: false,
131
+ accessModifier: 'private'
132
+ }],
133
+ importPath: './services/shared.service',
134
+ scope: 'singleton'
135
+ }
136
+ ];
137
+ exports.circularClassesFixture = [
138
+ {
139
+ name: 'ServiceA',
140
+ filePath: '/src/services/service-a.ts',
141
+ dependencies: ['ServiceB'],
142
+ constructorParams: [{
143
+ name: 'serviceB',
144
+ type: 'ServiceB',
145
+ isOptional: false,
146
+ accessModifier: 'private'
147
+ }],
148
+ importPath: './services/service-a',
149
+ scope: 'singleton'
150
+ },
151
+ {
152
+ name: 'ServiceB',
153
+ filePath: '/src/services/service-b.ts',
154
+ dependencies: ['ServiceA'],
155
+ constructorParams: [{
156
+ name: 'serviceA',
157
+ type: 'ServiceA',
158
+ isOptional: false,
159
+ accessModifier: 'private'
160
+ }],
161
+ importPath: './services/service-b',
162
+ scope: 'singleton'
163
+ }
164
+ ];
165
+ exports.mixedClassesFixture = [
166
+ {
167
+ name: 'MixedService',
168
+ filePath: '/src/services/mixed.service.ts',
169
+ dependencies: ['UserService', 'ExternalLibrary', 'IConfig'],
170
+ constructorParams: [
171
+ {
172
+ name: 'userService',
173
+ type: 'UserService',
174
+ isOptional: false,
175
+ accessModifier: 'private'
176
+ },
177
+ {
178
+ name: 'externalLibrary',
179
+ type: 'ExternalLibrary',
180
+ isOptional: false,
181
+ accessModifier: 'private'
182
+ },
183
+ {
184
+ name: 'config',
185
+ type: 'IConfig',
186
+ isOptional: false,
187
+ accessModifier: 'private'
188
+ }
189
+ ],
190
+ importPath: './services/mixed.service',
191
+ scope: 'singleton'
192
+ }
193
+ ];
194
+ //# sourceMappingURL=import-generator.fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-generator.fixtures.js","sourceRoot":"","sources":["../../../../src/__tests__/generator/fixtures/import-generator.fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=import-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-generator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/generator/import-generator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const import_generator_1 = require("../../generator/import-generator");
5
+ const import_generator_fixtures_1 = require("./fixtures/import-generator.fixtures");
6
+ (0, vitest_1.describe)('ImportGenerator', () => {
7
+ let importGenerator;
8
+ (0, vitest_1.describe)('constructor', () => {
9
+ (0, vitest_1.it)('should create an instance with provided classes', () => {
10
+ importGenerator = new import_generator_1.ImportGenerator(import_generator_fixtures_1.mockClassInfos);
11
+ (0, vitest_1.expect)(importGenerator).toBeInstanceOf(import_generator_1.ImportGenerator);
12
+ });
13
+ (0, vitest_1.it)('should handle empty classes array', () => {
14
+ importGenerator = new import_generator_1.ImportGenerator([]);
15
+ (0, vitest_1.expect)(importGenerator).toBeInstanceOf(import_generator_1.ImportGenerator);
16
+ });
17
+ });
18
+ (0, vitest_1.describe)('generateImports', () => {
19
+ (0, vitest_1.describe)('with managed classes only', () => {
20
+ (0, vitest_1.beforeEach)(() => {
21
+ importGenerator = new import_generator_1.ImportGenerator(import_generator_fixtures_1.mockClassInfos);
22
+ });
23
+ (0, vitest_1.it)('should generate imports for all managed classes', () => {
24
+ const result = importGenerator.generateImports();
25
+ (0, vitest_1.expect)(result).toContain("import { UserService } from './services/user.service';");
26
+ (0, vitest_1.expect)(result).toContain("import { EmailService } from './services/email.service';");
27
+ (0, vitest_1.expect)(result).toContain("import { ProductService } from './services/product.service';");
28
+ });
29
+ (0, vitest_1.it)('should not duplicate imports for the same class', () => {
30
+ const result = importGenerator.generateImports();
31
+ const userServiceImports = result.split('\n').filter(line => line.includes('UserService'));
32
+ (0, vitest_1.expect)(userServiceImports).toHaveLength(1);
33
+ });
34
+ (0, vitest_1.it)('should not generate imports for interfaces (starting with I)', () => {
35
+ const result = importGenerator.generateImports();
36
+ (0, vitest_1.expect)(result).not.toContain('IUserRepository');
37
+ (0, vitest_1.expect)(result).not.toContain('IEmailProvider');
38
+ (0, vitest_1.expect)(result).not.toContain('IProductRepository');
39
+ });
40
+ (0, vitest_1.it)('should generate imports for managed dependencies', () => {
41
+ const result = importGenerator.generateImports();
42
+ // UserService depends on EmailService, and EmailService is a managed class
43
+ // So EmailService should be imported
44
+ (0, vitest_1.expect)(result).toContain("import { EmailService } from './services/email.service';");
45
+ });
46
+ });
47
+ (0, vitest_1.describe)('with no dependencies', () => {
48
+ (0, vitest_1.beforeEach)(() => {
49
+ importGenerator = new import_generator_1.ImportGenerator([import_generator_fixtures_1.mockClassInfoWithNoDependencies]);
50
+ });
51
+ (0, vitest_1.it)('should generate import only for the class itself', () => {
52
+ const result = importGenerator.generateImports();
53
+ (0, vitest_1.expect)(result).toBe("import { LoggerService } from './services/logger.service';");
54
+ });
55
+ });
56
+ (0, vitest_1.describe)('with unmanaged dependencies', () => {
57
+ (0, vitest_1.beforeEach)(() => {
58
+ const classesWithUnmanaged = [...import_generator_fixtures_1.mockClassInfos, import_generator_fixtures_1.mockClassInfoWithUnmanagedDependencies];
59
+ importGenerator = new import_generator_1.ImportGenerator(classesWithUnmanaged);
60
+ });
61
+ (0, vitest_1.it)('should generate imports for unmanaged dependencies that are not interfaces', () => {
62
+ const result = importGenerator.generateImports();
63
+ // Connection is an unmanaged dependency and doesn't start with 'I'
64
+ (0, vitest_1.expect)(result).toContain("import { Connection } from './services/database.service';");
65
+ // IConfig is an interface (starts with 'I') so should not be imported
66
+ (0, vitest_1.expect)(result).not.toContain('IConfig');
67
+ });
68
+ (0, vitest_1.it)('should include imports for all managed classes', () => {
69
+ const result = importGenerator.generateImports();
70
+ (0, vitest_1.expect)(result).toContain("import { UserService } from './services/user.service';");
71
+ (0, vitest_1.expect)(result).toContain("import { EmailService } from './services/email.service';");
72
+ (0, vitest_1.expect)(result).toContain("import { ProductService } from './services/product.service';");
73
+ (0, vitest_1.expect)(result).toContain("import { DatabaseService } from './services/database.service';");
74
+ });
75
+ });
76
+ (0, vitest_1.describe)('with empty classes array', () => {
77
+ (0, vitest_1.beforeEach)(() => {
78
+ importGenerator = new import_generator_1.ImportGenerator([]);
79
+ });
80
+ (0, vitest_1.it)('should return empty string', () => {
81
+ const result = importGenerator.generateImports();
82
+ (0, vitest_1.expect)(result).toBe('');
83
+ });
84
+ });
85
+ (0, vitest_1.describe)('with complex dependency scenarios', () => {
86
+ (0, vitest_1.it)('should handle circular dependencies correctly', () => {
87
+ importGenerator = new import_generator_1.ImportGenerator(import_generator_fixtures_1.circularClassesFixture);
88
+ const result = importGenerator.generateImports();
89
+ (0, vitest_1.expect)(result).toContain("import { ServiceA } from './services/service-a';");
90
+ (0, vitest_1.expect)(result).toContain("import { ServiceB } from './services/service-b';");
91
+ });
92
+ (0, vitest_1.it)('should handle mixed managed and unmanaged dependencies', () => {
93
+ const mixedClasses = [...import_generator_fixtures_1.mixedClassesFixture, import_generator_fixtures_1.mockClassInfos[0]]; // UserService - non-null assertion since we know the array has items
94
+ importGenerator = new import_generator_1.ImportGenerator(mixedClasses);
95
+ const result = importGenerator.generateImports();
96
+ // Should import the managed class
97
+ (0, vitest_1.expect)(result).toContain("import { UserService } from './services/user.service';");
98
+ // Should import the unmanaged non-interface dependency
99
+ (0, vitest_1.expect)(result).toContain("import { ExternalLibrary } from './services/mixed.service';");
100
+ // Should NOT import the interface
101
+ (0, vitest_1.expect)(result).not.toContain('IConfig');
102
+ // Should import the MixedService itself
103
+ (0, vitest_1.expect)(result).toContain("import { MixedService } from './services/mixed.service';");
104
+ });
105
+ });
106
+ (0, vitest_1.describe)('import deduplication', () => {
107
+ (0, vitest_1.it)('should deduplicate imports from the same path', () => {
108
+ importGenerator = new import_generator_1.ImportGenerator(import_generator_fixtures_1.duplicateClassesFixture);
109
+ const result = importGenerator.generateImports();
110
+ const lines = result.split('\n');
111
+ // Should have imports for both services
112
+ (0, vitest_1.expect)(result).toContain("import { ServiceA } from './services/shared.service';");
113
+ (0, vitest_1.expect)(result).toContain("import { ServiceB } from './services/shared.service';");
114
+ // Should only have one import for SharedDependency
115
+ const sharedDepImports = lines.filter(line => line.includes('SharedDependency'));
116
+ (0, vitest_1.expect)(sharedDepImports).toHaveLength(1);
117
+ });
118
+ });
119
+ });
120
+ });
121
+ //# sourceMappingURL=import-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-generator.test.js","sourceRoot":"","sources":["../../../src/__tests__/generator/import-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=instantiation-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instantiation-generator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/generator/instantiation-generator.test.ts"],"names":[],"mappings":""}