@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.
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/__tests__/analyser/ast-parser.test.d.ts +2 -0
- package/dist/__tests__/analyser/ast-parser.test.d.ts.map +1 -0
- package/dist/__tests__/analyser/ast-parser.test.js +268 -0
- package/dist/__tests__/analyser/ast-parser.test.js.map +1 -0
- package/dist/__tests__/analyser/class-analyzer.test.d.ts +2 -0
- package/dist/__tests__/analyser/class-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/analyser/class-analyzer.test.js +259 -0
- package/dist/__tests__/analyser/class-analyzer.test.js.map +1 -0
- package/dist/__tests__/analyser/dependency-resolver.test.d.ts +2 -0
- package/dist/__tests__/analyser/dependency-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/analyser/dependency-resolver.test.js +128 -0
- package/dist/__tests__/analyser/dependency-resolver.test.js.map +1 -0
- package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts +26 -0
- package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts.map +1 -0
- package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js +178 -0
- package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js.map +1 -0
- package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts +54 -0
- package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts.map +1 -0
- package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js +285 -0
- package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js.map +1 -0
- package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts +13 -0
- package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts.map +1 -0
- package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js +266 -0
- package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js.map +1 -0
- package/dist/__tests__/generator/container-generator.test.d.ts +2 -0
- package/dist/__tests__/generator/container-generator.test.d.ts.map +1 -0
- package/dist/__tests__/generator/container-generator.test.js +185 -0
- package/dist/__tests__/generator/container-generator.test.js.map +1 -0
- package/dist/__tests__/generator/dependency-resolver.test.d.ts +2 -0
- package/dist/__tests__/generator/dependency-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/generator/dependency-resolver.test.js +330 -0
- package/dist/__tests__/generator/dependency-resolver.test.js.map +1 -0
- package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts +23 -0
- package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts.map +1 -0
- package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js +254 -0
- package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js.map +1 -0
- package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts +10 -0
- package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts.map +1 -0
- package/dist/__tests__/generator/fixtures/import-generator.fixtures.js +194 -0
- package/dist/__tests__/generator/fixtures/import-generator.fixtures.js.map +1 -0
- package/dist/__tests__/generator/import-generator.test.d.ts +2 -0
- package/dist/__tests__/generator/import-generator.test.d.ts.map +1 -0
- package/dist/__tests__/generator/import-generator.test.js +121 -0
- package/dist/__tests__/generator/import-generator.test.js.map +1 -0
- package/dist/__tests__/generator/instantiation-generator.test.d.ts +2 -0
- package/dist/__tests__/generator/instantiation-generator.test.d.ts.map +1 -0
- package/dist/__tests__/generator/instantiation-generator.test.js +251 -0
- package/dist/__tests__/generator/instantiation-generator.test.js.map +1 -0
- package/dist/analyser/ast-parser.d.ts +12 -0
- package/dist/analyser/ast-parser.d.ts.map +1 -0
- package/dist/analyser/ast-parser.js +192 -0
- package/dist/analyser/ast-parser.js.map +1 -0
- package/dist/analyser/class-analyzer.d.ts +11 -0
- package/dist/analyser/class-analyzer.d.ts.map +1 -0
- package/dist/analyser/class-analyzer.js +78 -0
- package/dist/analyser/class-analyzer.js.map +1 -0
- package/dist/analyser/dependency-resolver.d.ts +10 -0
- package/dist/analyser/dependency-resolver.d.ts.map +1 -0
- package/dist/analyser/dependency-resolver.js +46 -0
- package/dist/analyser/dependency-resolver.js.map +1 -0
- package/dist/analyser/file-discovery.d.ts +7 -0
- package/dist/analyser/file-discovery.d.ts.map +1 -0
- package/dist/analyser/file-discovery.js +30 -0
- package/dist/analyser/file-discovery.js.map +1 -0
- package/dist/analyser/index.d.ts +3 -0
- package/dist/analyser/index.d.ts.map +1 -0
- package/dist/analyser/index.js +14 -0
- package/dist/analyser/index.js.map +1 -0
- package/dist/analyser/module-dependency-resolver.d.ts +17 -0
- package/dist/analyser/module-dependency-resolver.d.ts.map +1 -0
- package/dist/analyser/module-dependency-resolver.js +66 -0
- package/dist/analyser/module-dependency-resolver.js.map +1 -0
- package/dist/analyser/project-analyzer.d.ts +8 -0
- package/dist/analyser/project-analyzer.d.ts.map +1 -0
- package/dist/analyser/project-analyzer.js +20 -0
- package/dist/analyser/project-analyzer.js.map +1 -0
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +66 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +150 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/container.d.ts +5 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +8 -0
- package/dist/container.js.map +1 -0
- package/dist/generator/container-file-generator.d.ts +20 -0
- package/dist/generator/container-file-generator.d.ts.map +1 -0
- package/dist/generator/container-file-generator.js +255 -0
- package/dist/generator/container-file-generator.js.map +1 -0
- package/dist/generator/container-generator.d.ts +8 -0
- package/dist/generator/container-generator.d.ts.map +1 -0
- package/dist/generator/container-generator.js +35 -0
- package/dist/generator/container-generator.js.map +1 -0
- package/dist/generator/dependency-resolver.d.ts +11 -0
- package/dist/generator/dependency-resolver.d.ts.map +1 -0
- package/dist/generator/dependency-resolver.js +83 -0
- package/dist/generator/dependency-resolver.js.map +1 -0
- package/dist/generator/file-writer.d.ts +6 -0
- package/dist/generator/file-writer.d.ts.map +1 -0
- package/dist/generator/file-writer.js +19 -0
- package/dist/generator/file-writer.js.map +1 -0
- package/dist/generator/import-generator.d.ts +7 -0
- package/dist/generator/import-generator.d.ts.map +1 -0
- package/dist/generator/import-generator.js +31 -0
- package/dist/generator/import-generator.js.map +1 -0
- package/dist/generator/index.d.ts +4 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +25 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/instantiation-generator.d.ts +8 -0
- package/dist/generator/instantiation-generator.d.ts.map +1 -0
- package/dist/generator/instantiation-generator.js +153 -0
- package/dist/generator/instantiation-generator.js.map +1 -0
- package/dist/generator/module-container-generator.d.ts +10 -0
- package/dist/generator/module-container-generator.d.ts.map +1 -0
- package/dist/generator/module-container-generator.js +51 -0
- package/dist/generator/module-container-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/configManager.d.ts +21 -0
- package/dist/utils/configManager.d.ts.map +1 -0
- package/dist/utils/configManager.js +50 -0
- package/dist/utils/configManager.js.map +1 -0
- package/dist/utils/moduleResolver.d.ts +38 -0
- package/dist/utils/moduleResolver.d.ts.map +1 -0
- package/dist/utils/moduleResolver.js +108 -0
- package/dist/utils/moduleResolver.js.map +1 -0
- package/dist/utils/naming.d.ts +7 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +12 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/topological-sorter.d.ts +17 -0
- package/dist/utils/topological-sorter.d.ts.map +1 -0
- package/dist/utils/topological-sorter.js +69 -0
- package/dist/utils/topological-sorter.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,259 @@
|
|
|
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
|
+
extractClassName: vitest_1.vi.fn(),
|
|
16
|
+
extractInterfaceName: vitest_1.vi.fn(),
|
|
17
|
+
extractConstructorParameters: vitest_1.vi.fn(),
|
|
18
|
+
extractScopeFromJSDoc: vitest_1.vi.fn()
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
// Mock console methods to avoid noise in tests
|
|
23
|
+
const consoleSpy = {
|
|
24
|
+
log: vitest_1.vi.spyOn(console, 'log').mockImplementation(() => { }),
|
|
25
|
+
warn: vitest_1.vi.spyOn(console, 'warn').mockImplementation(() => { })
|
|
26
|
+
};
|
|
27
|
+
(0, vitest_1.describe)('ClassAnalyzer', () => {
|
|
28
|
+
let classAnalyzer;
|
|
29
|
+
let mockAstParser;
|
|
30
|
+
(0, vitest_1.beforeEach)(() => {
|
|
31
|
+
mockAstParser = container_1.container.astParser;
|
|
32
|
+
// Reset all mocks
|
|
33
|
+
Object.values(mockAstParser).forEach(mock => mock.mockReset());
|
|
34
|
+
// Reset console spies
|
|
35
|
+
consoleSpy.log.mockClear();
|
|
36
|
+
consoleSpy.warn.mockClear();
|
|
37
|
+
classAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', 'I.*Service');
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.describe)('constructor', () => {
|
|
40
|
+
(0, vitest_1.it)('should initialize with source directory and interface pattern', () => {
|
|
41
|
+
const analyzer = new class_analyzer_1.ClassAnalyzer('/test/src', 'I.*Repository');
|
|
42
|
+
(0, vitest_1.expect)(analyzer).toBeInstanceOf(class_analyzer_1.ClassAnalyzer);
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('should initialize without interface pattern', () => {
|
|
45
|
+
const analyzer = new class_analyzer_1.ClassAnalyzer('/test/src');
|
|
46
|
+
(0, vitest_1.expect)(analyzer).toBeInstanceOf(class_analyzer_1.ClassAnalyzer);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.describe)('analyzeFile', () => {
|
|
50
|
+
const mockFilePath = '/src/services/user.service.ts';
|
|
51
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
52
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
53
|
+
(0, vitest_1.beforeEach)(() => {
|
|
54
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
55
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
56
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
57
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
58
|
+
mockAstParser.extractClassName.mockReturnValue('UserService');
|
|
59
|
+
mockAstParser.extractInterfaceName.mockReturnValue('IUserService');
|
|
60
|
+
mockAstParser.extractConstructorParameters.mockReturnValue(class_analyzer_fixtures_1.mockConstructorParams);
|
|
61
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)('should analyze a basic class file successfully', async () => {
|
|
64
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
65
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
66
|
+
(0, vitest_1.expect)(result[0]).toMatchObject({
|
|
67
|
+
name: 'UserService',
|
|
68
|
+
filePath: mockFilePath,
|
|
69
|
+
interfaceName: 'IUserService',
|
|
70
|
+
dependencies: ['IUserRepository', 'ILogger'],
|
|
71
|
+
importPath: './services/user.service',
|
|
72
|
+
scope: 'transient'
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('should handle multiple classes in one file', async () => {
|
|
76
|
+
const mockClassNodes = [
|
|
77
|
+
{ kind: 'ClassDeclaration', name: 'UserService' },
|
|
78
|
+
{ kind: 'ClassDeclaration', name: 'AdminService' }
|
|
79
|
+
];
|
|
80
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue(mockClassNodes);
|
|
81
|
+
mockAstParser.extractClassName
|
|
82
|
+
.mockReturnValueOnce('UserService')
|
|
83
|
+
.mockReturnValueOnce('AdminService');
|
|
84
|
+
mockAstParser.extractInterfaceName
|
|
85
|
+
.mockReturnValueOnce('IUserService')
|
|
86
|
+
.mockReturnValueOnce('IAdminService');
|
|
87
|
+
mockAstParser.extractConstructorParameters
|
|
88
|
+
.mockReturnValueOnce([class_analyzer_fixtures_1.mockConstructorParams[0]])
|
|
89
|
+
.mockReturnValueOnce([class_analyzer_fixtures_1.mockConstructorParams[1]]);
|
|
90
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
91
|
+
(0, vitest_1.expect)(result).toHaveLength(2);
|
|
92
|
+
(0, vitest_1.expect)(result[0]?.name).toBe('UserService');
|
|
93
|
+
(0, vitest_1.expect)(result[1]?.name).toBe('AdminService');
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('should filter classes by interface pattern', async () => {
|
|
96
|
+
mockAstParser.extractInterfaceName.mockReturnValue('IUserRepository'); // Doesn't match 'I.*Service' pattern
|
|
97
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
98
|
+
(0, vitest_1.expect)(result).toHaveLength(0);
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)('should include classes when no interface pattern is specified', async () => {
|
|
101
|
+
const analyzerWithoutPattern = new class_analyzer_1.ClassAnalyzer('/src');
|
|
102
|
+
mockAstParser.extractInterfaceName.mockReturnValue('IInternalService');
|
|
103
|
+
const result = await analyzerWithoutPattern.analyzeFile(mockFilePath);
|
|
104
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.it)('should skip classes without class name', async () => {
|
|
107
|
+
mockAstParser.extractClassName.mockReturnValue(null);
|
|
108
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
109
|
+
(0, vitest_1.expect)(result).toHaveLength(0);
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)('should skip classes without interface name', async () => {
|
|
112
|
+
mockAstParser.extractInterfaceName.mockReturnValue(null);
|
|
113
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
114
|
+
(0, vitest_1.expect)(result).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)('should handle type aliases correctly', async () => {
|
|
117
|
+
const typeAliases = new Map([
|
|
118
|
+
['NotificationSvc', 'INotificationService'],
|
|
119
|
+
['Log', 'ILogger']
|
|
120
|
+
]);
|
|
121
|
+
const paramsWithAliases = [
|
|
122
|
+
{ name: 'notification', type: 'NotificationSvc', isOptional: false },
|
|
123
|
+
{ name: 'logger', type: 'Log', isOptional: false },
|
|
124
|
+
{ name: 'config', type: 'string', isOptional: false }
|
|
125
|
+
];
|
|
126
|
+
mockAstParser.extractTypeAliases.mockReturnValue(typeAliases);
|
|
127
|
+
mockAstParser.extractConstructorParameters.mockReturnValue(paramsWithAliases);
|
|
128
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
129
|
+
(0, vitest_1.expect)(result[0]?.dependencies).toEqual(['INotificationService', 'ILogger']);
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)('should extract JSDoc scope correctly', async () => {
|
|
132
|
+
const jsDocScopes = new Map([['UserService', 'singleton']]);
|
|
133
|
+
mockAstParser.extractJSDocComments.mockReturnValue(jsDocScopes);
|
|
134
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('singleton');
|
|
135
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
136
|
+
(0, vitest_1.expect)(result[0]?.scope).toBe('singleton');
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('should handle parsing errors gracefully', async () => {
|
|
139
|
+
mockAstParser.parseFile.mockImplementation(() => {
|
|
140
|
+
throw new Error('Syntax error');
|
|
141
|
+
});
|
|
142
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
143
|
+
(0, vitest_1.expect)(result).toHaveLength(0);
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)('should generate correct import paths', async () => {
|
|
146
|
+
for (const testCase of class_analyzer_fixtures_1.importPathTestCases) {
|
|
147
|
+
const result = await classAnalyzer.analyzeFile(testCase.filePath);
|
|
148
|
+
(0, vitest_1.expect)(result[0]?.importPath).toBe(testCase.expected);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
(0, vitest_1.describe)('resolveDependencies (private method testing via public interface)', () => {
|
|
153
|
+
(0, vitest_1.it)('should resolve dependencies correctly', async () => {
|
|
154
|
+
const mockFilePath = '/src/services/test.service.ts';
|
|
155
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
156
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
157
|
+
const constructorParams = class_analyzer_fixtures_1.dependencyResolutionTestParams;
|
|
158
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
159
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
160
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
161
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
162
|
+
mockAstParser.extractClassName.mockReturnValue('TestService');
|
|
163
|
+
mockAstParser.extractInterfaceName.mockReturnValue('ITestService');
|
|
164
|
+
mockAstParser.extractConstructorParameters.mockReturnValue(constructorParams);
|
|
165
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
166
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
167
|
+
(0, vitest_1.expect)(result[0]?.dependencies).toEqual(['IUserRepository', 'ILogger']);
|
|
168
|
+
});
|
|
169
|
+
(0, vitest_1.it)('should resolve type aliases in dependencies', async () => {
|
|
170
|
+
const mockFilePath = '/src/services/test.service.ts';
|
|
171
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
172
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
173
|
+
const typeAliases = class_analyzer_fixtures_1.typeAliasesForDependencyTest;
|
|
174
|
+
const constructorParams = class_analyzer_fixtures_1.constructorParamsWithAliases;
|
|
175
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
176
|
+
mockAstParser.extractTypeAliases.mockReturnValue(typeAliases);
|
|
177
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
178
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
179
|
+
mockAstParser.extractClassName.mockReturnValue('TestService');
|
|
180
|
+
mockAstParser.extractInterfaceName.mockReturnValue('ITestService');
|
|
181
|
+
mockAstParser.extractConstructorParameters.mockReturnValue(constructorParams);
|
|
182
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
183
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
184
|
+
(0, vitest_1.expect)(result[0]?.dependencies).toEqual(['IUserRepository', 'ILogger']);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
(0, vitest_1.describe)('generateImportPath (private method testing via public interface)', () => {
|
|
188
|
+
(0, vitest_1.it)('should generate correct relative import paths', async () => {
|
|
189
|
+
for (const testCase of class_analyzer_fixtures_1.generateImportPathTestCases) {
|
|
190
|
+
const analyzer = new class_analyzer_1.ClassAnalyzer(testCase.sourceDir);
|
|
191
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
192
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
193
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
194
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
195
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
196
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
197
|
+
mockAstParser.extractClassName.mockReturnValue('TestClass');
|
|
198
|
+
mockAstParser.extractInterfaceName.mockReturnValue('ITestClass');
|
|
199
|
+
mockAstParser.extractConstructorParameters.mockReturnValue([]);
|
|
200
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
201
|
+
const result = await analyzer.analyzeFile(testCase.filePath);
|
|
202
|
+
(0, vitest_1.expect)(result[0]?.importPath).toBe(testCase.expected);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
(0, vitest_1.describe)('integration scenarios', () => {
|
|
207
|
+
(0, vitest_1.it)('should handle empty constructor parameters', async () => {
|
|
208
|
+
const mockFilePath = '/src/services/simple.service.ts';
|
|
209
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
210
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
211
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
212
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
213
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
214
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
215
|
+
mockAstParser.extractClassName.mockReturnValue('SimpleService');
|
|
216
|
+
mockAstParser.extractInterfaceName.mockReturnValue('ISimpleService');
|
|
217
|
+
mockAstParser.extractConstructorParameters.mockReturnValue([]);
|
|
218
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
219
|
+
const result = await classAnalyzer.analyzeFile(mockFilePath);
|
|
220
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
221
|
+
(0, vitest_1.expect)(result[0]?.dependencies).toEqual([]);
|
|
222
|
+
(0, vitest_1.expect)(result[0]?.constructorParams).toEqual([]);
|
|
223
|
+
});
|
|
224
|
+
(0, vitest_1.it)('should handle complex interface patterns', async () => {
|
|
225
|
+
const complexPatternAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', '^I[A-Z].*Service$');
|
|
226
|
+
const mockFilePath = '/src/services/user.service.ts';
|
|
227
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
228
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
229
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
230
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
231
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
232
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
233
|
+
mockAstParser.extractClassName.mockReturnValue('UserService');
|
|
234
|
+
mockAstParser.extractInterfaceName.mockReturnValue('IUserService');
|
|
235
|
+
mockAstParser.extractConstructorParameters.mockReturnValue([]);
|
|
236
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
237
|
+
const result = await complexPatternAnalyzer.analyzeFile(mockFilePath);
|
|
238
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
239
|
+
(0, vitest_1.expect)(result[0]?.interfaceName).toBe('IUserService');
|
|
240
|
+
});
|
|
241
|
+
(0, vitest_1.it)('should reject interfaces that do not match complex patterns', async () => {
|
|
242
|
+
const complexPatternAnalyzer = new class_analyzer_1.ClassAnalyzer('/src', '^I[A-Z].*Service$');
|
|
243
|
+
const mockFilePath = '/src/repositories/user.repository.ts';
|
|
244
|
+
const mockRoot = { kind: 'SourceFile' };
|
|
245
|
+
const mockClassNode = { kind: 'ClassDeclaration' };
|
|
246
|
+
mockAstParser.parseFile.mockReturnValue(mockRoot);
|
|
247
|
+
mockAstParser.extractTypeAliases.mockReturnValue(new Map());
|
|
248
|
+
mockAstParser.extractJSDocComments.mockReturnValue(new Map());
|
|
249
|
+
mockAstParser.findClassesImplementingInterfaces.mockReturnValue([mockClassNode]);
|
|
250
|
+
mockAstParser.extractClassName.mockReturnValue('UserRepository');
|
|
251
|
+
mockAstParser.extractInterfaceName.mockReturnValue('IUserRepository'); // Doesn't end with 'Service'
|
|
252
|
+
mockAstParser.extractConstructorParameters.mockReturnValue([]);
|
|
253
|
+
mockAstParser.extractScopeFromJSDoc.mockReturnValue('transient');
|
|
254
|
+
const result = await complexPatternAnalyzer.analyzeFile(mockFilePath);
|
|
255
|
+
(0, vitest_1.expect)(result).toHaveLength(0);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
//# sourceMappingURL=class-analyzer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-analyzer.test.js","sourceRoot":"","sources":["../../../src/__tests__/analyser/class-analyzer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analyser/dependency-resolver.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.test.js","sourceRoot":"","sources":["../../../src/__tests__/analyser/dependency-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const testFileContents: {
|
|
2
|
+
basicClass: string;
|
|
3
|
+
emptyFile: string;
|
|
4
|
+
classWithInterface: string;
|
|
5
|
+
regularClassOnly: string;
|
|
6
|
+
multipleInterfaceClasses: string;
|
|
7
|
+
simpleClassName: string;
|
|
8
|
+
complexClassName: string;
|
|
9
|
+
interfaceOnly: string;
|
|
10
|
+
singleInterface: string;
|
|
11
|
+
multipleInterfaces: string;
|
|
12
|
+
constructorWithParams: string;
|
|
13
|
+
optionalParameters: string;
|
|
14
|
+
noConstructor: string;
|
|
15
|
+
emptyConstructor: string;
|
|
16
|
+
protectedParameter: string;
|
|
17
|
+
jsDocWithScope: string;
|
|
18
|
+
noJSDoc: string;
|
|
19
|
+
regularComments: string;
|
|
20
|
+
malformedJSDoc: string;
|
|
21
|
+
typeAliases: string;
|
|
22
|
+
noAliases: string;
|
|
23
|
+
noImports: string;
|
|
24
|
+
complexImports: string;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=ast-parser-fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;CAkM5B,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Test fixtures for AST parser tests
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.testFileContents = void 0;
|
|
5
|
+
exports.testFileContents = {
|
|
6
|
+
// parseFile test fixtures
|
|
7
|
+
basicClass: `
|
|
8
|
+
class TestClass {
|
|
9
|
+
constructor() {}
|
|
10
|
+
}
|
|
11
|
+
`,
|
|
12
|
+
emptyFile: '',
|
|
13
|
+
// findClassesImplementingInterfaces test fixtures
|
|
14
|
+
classWithInterface: `
|
|
15
|
+
interface IUserService {
|
|
16
|
+
getUser(): string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
class UserService implements IUserService {
|
|
20
|
+
getUser(): string {
|
|
21
|
+
return 'user';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class RegularClass {
|
|
26
|
+
doSomething() {}
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
regularClassOnly: `
|
|
30
|
+
class RegularClass {
|
|
31
|
+
doSomething() {}
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
multipleInterfaceClasses: `
|
|
35
|
+
interface IUserService {
|
|
36
|
+
getUser(): string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface IEmailService {
|
|
40
|
+
sendEmail(): void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
class UserService implements IUserService {
|
|
44
|
+
getUser(): string {
|
|
45
|
+
return 'user';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
class EmailService implements IEmailService {
|
|
50
|
+
sendEmail(): void {}
|
|
51
|
+
}
|
|
52
|
+
`,
|
|
53
|
+
// extractClassName test fixtures
|
|
54
|
+
simpleClassName: `
|
|
55
|
+
class UserService implements IUserService {
|
|
56
|
+
constructor() {}
|
|
57
|
+
}
|
|
58
|
+
`,
|
|
59
|
+
complexClassName: `
|
|
60
|
+
class User_Service_123 implements IUserService {
|
|
61
|
+
constructor() {}
|
|
62
|
+
}
|
|
63
|
+
`,
|
|
64
|
+
interfaceOnly: `
|
|
65
|
+
interface IUserService {
|
|
66
|
+
getUser(): string;
|
|
67
|
+
}
|
|
68
|
+
`,
|
|
69
|
+
// extractInterfaceName test fixtures
|
|
70
|
+
singleInterface: `
|
|
71
|
+
class UserService implements IUserService {
|
|
72
|
+
constructor() {}
|
|
73
|
+
}
|
|
74
|
+
`,
|
|
75
|
+
multipleInterfaces: `
|
|
76
|
+
class UserService implements IUserService, ILoggable {
|
|
77
|
+
constructor() {}
|
|
78
|
+
}
|
|
79
|
+
`,
|
|
80
|
+
// extractConstructorParameters test fixtures
|
|
81
|
+
constructorWithParams: `
|
|
82
|
+
class UserService implements IUserService {
|
|
83
|
+
constructor(private userRepo: UserRepository, public logger: Logger) {}
|
|
84
|
+
}
|
|
85
|
+
`,
|
|
86
|
+
optionalParameters: `
|
|
87
|
+
class UserService implements IUserService {
|
|
88
|
+
constructor(private userRepo: UserRepository, logger?: Logger) {}
|
|
89
|
+
}
|
|
90
|
+
`,
|
|
91
|
+
noConstructor: `
|
|
92
|
+
class UserService implements IUserService {
|
|
93
|
+
getUser(): string {
|
|
94
|
+
return 'user';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
`,
|
|
98
|
+
emptyConstructor: `
|
|
99
|
+
class UserService implements IUserService {
|
|
100
|
+
constructor() {}
|
|
101
|
+
}
|
|
102
|
+
`,
|
|
103
|
+
protectedParameter: `
|
|
104
|
+
class UserService implements IUserService {
|
|
105
|
+
constructor(protected userRepo: UserRepository) {}
|
|
106
|
+
}
|
|
107
|
+
`,
|
|
108
|
+
// extractJSDocComments test fixtures
|
|
109
|
+
jsDocWithScope: `
|
|
110
|
+
/**
|
|
111
|
+
* @scope singleton
|
|
112
|
+
*/
|
|
113
|
+
class UserService implements IUserService {
|
|
114
|
+
constructor() {}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @scope transient
|
|
119
|
+
*/
|
|
120
|
+
class EmailService implements IEmailService {
|
|
121
|
+
constructor() {}
|
|
122
|
+
}
|
|
123
|
+
`,
|
|
124
|
+
noJSDoc: `
|
|
125
|
+
class UserService implements IUserService {
|
|
126
|
+
constructor() {}
|
|
127
|
+
}
|
|
128
|
+
`,
|
|
129
|
+
regularComments: `
|
|
130
|
+
/**
|
|
131
|
+
* This is a regular comment
|
|
132
|
+
* @param something
|
|
133
|
+
*/
|
|
134
|
+
class UserService implements IUserService {
|
|
135
|
+
constructor() {}
|
|
136
|
+
}
|
|
137
|
+
`,
|
|
138
|
+
malformedJSDoc: `
|
|
139
|
+
/**
|
|
140
|
+
* @scope invalid_scope
|
|
141
|
+
*/
|
|
142
|
+
class UserService implements IUserService {
|
|
143
|
+
constructor() {}
|
|
144
|
+
}
|
|
145
|
+
`,
|
|
146
|
+
// extractTypeAliases test fixtures
|
|
147
|
+
typeAliases: `
|
|
148
|
+
import { UserRepository as UserRepo } from './user-repository';
|
|
149
|
+
import { Logger as AppLogger } from './logger';
|
|
150
|
+
import { SomeClass } from './some-class';
|
|
151
|
+
|
|
152
|
+
class UserService implements IUserService {
|
|
153
|
+
constructor(private userRepo: UserRepo, private logger: AppLogger) {}
|
|
154
|
+
}
|
|
155
|
+
`,
|
|
156
|
+
noAliases: `
|
|
157
|
+
import { UserRepository } from './user-repository';
|
|
158
|
+
import { Logger } from './logger';
|
|
159
|
+
|
|
160
|
+
class UserService implements IUserService {
|
|
161
|
+
constructor(private userRepo: UserRepository) {}
|
|
162
|
+
}
|
|
163
|
+
`,
|
|
164
|
+
noImports: `
|
|
165
|
+
class UserService implements IUserService {
|
|
166
|
+
constructor() {}
|
|
167
|
+
}
|
|
168
|
+
`,
|
|
169
|
+
complexImports: `
|
|
170
|
+
import { UserRepository as UserRepo } from './user-repository';
|
|
171
|
+
import {Logger as AppLogger} from './logger';
|
|
172
|
+
|
|
173
|
+
class UserService implements IUserService {
|
|
174
|
+
constructor() {}
|
|
175
|
+
}
|
|
176
|
+
`
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=ast-parser-fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser-fixtures.js","sourceRoot":"","sources":["../../../../src/__tests__/analyser/fixtures/ast-parser-fixtures.ts"],"names":[],"mappings":";AAAA,qCAAqC;;;AAExB,QAAA,gBAAgB,GAAG;IAC9B,0BAA0B;IAC1B,UAAU,EAAE;;;;CAIb;IAEC,SAAS,EAAE,EAAE;IAEb,kDAAkD;IAClD,kBAAkB,EAAE;;;;;;;;;;;;;;CAcrB;IAEC,gBAAgB,EAAE;;;;CAInB;IAEC,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;CAkB3B;IAEC,iCAAiC;IACjC,eAAe,EAAE;;;;CAIlB;IAEC,gBAAgB,EAAE;;;;CAInB;IAEC,aAAa,EAAE;;;;CAIhB;IAEC,qCAAqC;IACrC,eAAe,EAAE;;;;CAIlB;IAEC,kBAAkB,EAAE;;;;CAIrB;IAEC,6CAA6C;IAC7C,qBAAqB,EAAE;;;;CAIxB;IAEC,kBAAkB,EAAE;;;;CAIrB;IAEC,aAAa,EAAE;;;;;;CAMhB;IAEC,gBAAgB,EAAE;;;;CAInB;IAEC,kBAAkB,EAAE;;;;CAIrB;IAEC,qCAAqC;IACrC,cAAc,EAAE;;;;;;;;;;;;;;CAcjB;IAEC,OAAO,EAAE;;;;CAIV;IAEC,eAAe,EAAE;;;;;;;;CAQlB;IAEC,cAAc,EAAE;;;;;;;CAOjB;IAEC,mCAAmC;IACnC,WAAW,EAAE;;;;;;;;CAQd;IAEC,SAAS,EAAE;;;;;;;CAOZ;IAEC,SAAS,EAAE;;;;CAIZ;IAEC,cAAc,EAAE;;;;;;;CAOjB;CACA,CAAC"}
|