@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,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DependencyResolver = void 0;
|
|
4
|
+
const topological_sorter_1 = require("../utils/topological-sorter");
|
|
5
|
+
class DependencyResolver {
|
|
6
|
+
constructor(classes) {
|
|
7
|
+
this.classes = classes;
|
|
8
|
+
}
|
|
9
|
+
resolve() {
|
|
10
|
+
const graph = this.buildDependencyGraph();
|
|
11
|
+
return topological_sorter_1.TopologicalSorter.sort(graph);
|
|
12
|
+
}
|
|
13
|
+
buildDependencyGraph() {
|
|
14
|
+
const graph = {};
|
|
15
|
+
const classNames = new Set(this.classes.map(c => c.name));
|
|
16
|
+
// Create interface-to-class mapping
|
|
17
|
+
const interfaceToClassMap = new Map();
|
|
18
|
+
for (const classInfo of this.classes) {
|
|
19
|
+
if (classInfo.interfaceName) {
|
|
20
|
+
interfaceToClassMap.set(classInfo.interfaceName, classInfo.name);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const classInfo of this.classes) {
|
|
24
|
+
const managedDependencies = [];
|
|
25
|
+
for (const dep of classInfo.dependencies) {
|
|
26
|
+
// Check if dependency is a direct class name
|
|
27
|
+
if (classNames.has(dep)) {
|
|
28
|
+
managedDependencies.push(dep);
|
|
29
|
+
}
|
|
30
|
+
// Check if dependency is an interface that maps to a managed class
|
|
31
|
+
else if (interfaceToClassMap.has(dep)) {
|
|
32
|
+
const implementingClass = interfaceToClassMap.get(dep);
|
|
33
|
+
managedDependencies.push(implementingClass);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
graph[classInfo.name] = managedDependencies;
|
|
37
|
+
}
|
|
38
|
+
return graph;
|
|
39
|
+
}
|
|
40
|
+
detectCircularDependencies() {
|
|
41
|
+
const result = this.resolve();
|
|
42
|
+
return result.cycles;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.DependencyResolver = DependencyResolver;
|
|
46
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/analyser/dependency-resolver.ts"],"names":[],"mappings":";;;AACA,oEAAuF;AAEvF,MAAa,kBAAkB;IAG7B,YAAY,OAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1C,OAAO,sCAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,oBAAoB;QAC1B,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1D,oCAAoC;QACpC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,mBAAmB,GAAa,EAAE,CAAC;YAEzC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBACzC,6CAA6C;gBAC7C,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC;gBACD,mEAAmE;qBAC9D,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;oBACxD,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC;QAC9C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0BAA0B;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;CACF;AAjDD,gDAiDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.d.ts","sourceRoot":"","sources":["../../src/analyser/file-discovery.ts"],"names":[],"mappings":"AAGA,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAW;gBAEtB,SAAS,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAAO;IAKvD,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAiB/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileDiscovery = void 0;
|
|
4
|
+
const glob_1 = require("glob");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class FileDiscovery {
|
|
7
|
+
constructor(sourceDir, excludePatterns = []) {
|
|
8
|
+
this.sourceDir = sourceDir;
|
|
9
|
+
this.excludePatterns = excludePatterns;
|
|
10
|
+
}
|
|
11
|
+
async findTypeScriptFiles() {
|
|
12
|
+
const pattern = (0, path_1.join)(this.sourceDir, '**/*.ts');
|
|
13
|
+
console.log(`Searching for TypeScript files with pattern: ${pattern}`);
|
|
14
|
+
const files = await (0, glob_1.glob)(pattern, {
|
|
15
|
+
ignore: [
|
|
16
|
+
'**/node_modules/**',
|
|
17
|
+
'**/dist/**',
|
|
18
|
+
'**/*.d.ts',
|
|
19
|
+
'**/*.test.ts',
|
|
20
|
+
'**/*.spec.ts',
|
|
21
|
+
...this.excludePatterns
|
|
22
|
+
]
|
|
23
|
+
});
|
|
24
|
+
console.log(`Found ${files.length} TypeScript files:`);
|
|
25
|
+
files.forEach(file => console.log(` - ${file}`));
|
|
26
|
+
return files;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.FileDiscovery = FileDiscovery;
|
|
30
|
+
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../src/analyser/file-discovery.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,+BAA4B;AAE5B,MAAa,aAAa;IAIxB,YAAY,SAAiB,EAAE,kBAA4B,EAAE;QAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,OAAO,EAAE;YAChC,MAAM,EAAE;gBACN,oBAAoB;gBACpB,YAAY;gBACZ,WAAW;gBACX,cAAc;gBACd,cAAc;gBACd,GAAG,IAAI,CAAC,eAAe;aACxB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,oBAAoB,CAAC,CAAC;QACvD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA1BD,sCA0BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyser/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAItD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAOhH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeProject = analyzeProject;
|
|
4
|
+
const one_logger_client_sdk_1 = require("@notjustcoders/one-logger-client-sdk");
|
|
5
|
+
const project_analyzer_1 = require("./project-analyzer");
|
|
6
|
+
const ProjectAnalyzer = (0, one_logger_client_sdk_1.wrappedClass)("ProojectAnalyzer", project_analyzer_1.ProjectAnalyzer, (name, ...args) => ({ name, args }));
|
|
7
|
+
async function analyzeProject(sourceDir, options) {
|
|
8
|
+
const analyzer = new ProjectAnalyzer({
|
|
9
|
+
sourceDir,
|
|
10
|
+
...options
|
|
11
|
+
});
|
|
12
|
+
return analyzer.analyzeProject();
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyser/index.ts"],"names":[],"mappings":";;AAKA,wCAOC;AAZD,gFAAoE;AAEpE,yDAAgE;AAChE,MAAM,eAAe,GAAG,IAAA,oCAAY,EAAC,kBAAkB,EAAE,kCAAO,EAAC,CAAC,IAAI,EAAC,GAAG,IAAI,EAAC,EAAE,CAAA,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC,CAAA;AAExF,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAkC;IACxF,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;QACnC,SAAS;QACT,GAAG,OAAO;KACX,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,cAAc,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ClassInfo } from '../types';
|
|
2
|
+
export interface ModuleDependencyResult {
|
|
3
|
+
sortedModules: string[];
|
|
4
|
+
cycles: string[][];
|
|
5
|
+
moduleDependencies: Map<string, Set<string>>;
|
|
6
|
+
}
|
|
7
|
+
export declare class ModuleDependencyResolver {
|
|
8
|
+
private moduleGroupedClasses;
|
|
9
|
+
private interfaceToModuleMap;
|
|
10
|
+
constructor(moduleGroupedClasses: Map<string, ClassInfo[]>);
|
|
11
|
+
resolve(): ModuleDependencyResult;
|
|
12
|
+
private buildInterfaceToModuleMap;
|
|
13
|
+
private buildModuleDependencyGraph;
|
|
14
|
+
private topologicalSort;
|
|
15
|
+
getModuleDependencies(moduleName: string): string[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=module-dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/analyser/module-dependency-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC9C;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,oBAAoB,CAAsB;gBAEtC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAK1D,OAAO,IAAI,sBAAsB;IAWjC,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,0BAA0B;IA2BlC,OAAO,CAAC,eAAe;IAUvB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;CAKpD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModuleDependencyResolver = void 0;
|
|
4
|
+
const topological_sorter_1 = require("../utils/topological-sorter");
|
|
5
|
+
class ModuleDependencyResolver {
|
|
6
|
+
constructor(moduleGroupedClasses) {
|
|
7
|
+
this.moduleGroupedClasses = moduleGroupedClasses;
|
|
8
|
+
this.interfaceToModuleMap = this.buildInterfaceToModuleMap();
|
|
9
|
+
}
|
|
10
|
+
resolve() {
|
|
11
|
+
const moduleDependencies = this.buildModuleDependencyGraph();
|
|
12
|
+
const sortResult = this.topologicalSort(moduleDependencies);
|
|
13
|
+
return {
|
|
14
|
+
sortedModules: sortResult.sorted,
|
|
15
|
+
cycles: sortResult.cycles,
|
|
16
|
+
moduleDependencies
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
buildInterfaceToModuleMap() {
|
|
20
|
+
const interfaceToModuleMap = new Map();
|
|
21
|
+
for (const [moduleName, classes] of this.moduleGroupedClasses) {
|
|
22
|
+
for (const classInfo of classes) {
|
|
23
|
+
if (classInfo.interfaceName) {
|
|
24
|
+
interfaceToModuleMap.set(classInfo.interfaceName, moduleName);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return interfaceToModuleMap;
|
|
29
|
+
}
|
|
30
|
+
buildModuleDependencyGraph() {
|
|
31
|
+
const moduleDependencies = new Map();
|
|
32
|
+
// Initialize all modules with empty dependency sets
|
|
33
|
+
for (const moduleName of this.moduleGroupedClasses.keys()) {
|
|
34
|
+
moduleDependencies.set(moduleName, new Set());
|
|
35
|
+
}
|
|
36
|
+
// Analyze dependencies between modules
|
|
37
|
+
for (const [moduleName, classes] of this.moduleGroupedClasses) {
|
|
38
|
+
const moduleDeps = moduleDependencies.get(moduleName);
|
|
39
|
+
for (const classInfo of classes) {
|
|
40
|
+
for (const dependency of classInfo.dependencies) {
|
|
41
|
+
// Check if this dependency is an interface from another module
|
|
42
|
+
const dependencyModule = this.interfaceToModuleMap.get(dependency);
|
|
43
|
+
if (dependencyModule && dependencyModule !== moduleName) {
|
|
44
|
+
moduleDeps.add(dependencyModule);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return moduleDependencies;
|
|
50
|
+
}
|
|
51
|
+
topologicalSort(moduleDependencies) {
|
|
52
|
+
// Convert Map<string, Set<string>> to Map<string, string[]> for TopologicalSorter
|
|
53
|
+
const graphMap = new Map();
|
|
54
|
+
for (const [module, deps] of moduleDependencies) {
|
|
55
|
+
graphMap.set(module, Array.from(deps));
|
|
56
|
+
}
|
|
57
|
+
return topological_sorter_1.TopologicalSorter.sort(graphMap, "desc");
|
|
58
|
+
}
|
|
59
|
+
getModuleDependencies(moduleName) {
|
|
60
|
+
const result = this.resolve();
|
|
61
|
+
const deps = result.moduleDependencies.get(moduleName);
|
|
62
|
+
return deps ? Array.from(deps) : [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ModuleDependencyResolver = ModuleDependencyResolver;
|
|
66
|
+
//# sourceMappingURL=module-dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-dependency-resolver.js","sourceRoot":"","sources":["../../src/analyser/module-dependency-resolver.ts"],"names":[],"mappings":";;;AACA,oEAAgE;AAQhE,MAAa,wBAAwB;IAInC,YAAY,oBAA8C;QACxD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACjD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,MAAM,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAE5D,OAAO;YACL,aAAa,EAAE,UAAU,CAAC,MAAM;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAEO,yBAAyB;QAC/B,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEvD,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9D,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;gBAChC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC5B,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAEO,0BAA0B;QAChC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAE1D,oDAAoD;QACpD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1D,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;QACxD,CAAC;QAED,uCAAuC;QACvC,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAEvD,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;gBAChC,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;oBAChD,+DAA+D;oBAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAEnE,IAAI,gBAAgB,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;wBACxD,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAEO,eAAe,CAAC,kBAA4C;QAClE,kFAAkF;QAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC7C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC;YAChD,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,sCAAiB,CAAC,IAAI,CAAC,QAAQ,EAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,qBAAqB,CAAC,UAAkB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;CACF;AA5ED,4DA4EC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnalyzerOptions, ClassInfo } from '../types';
|
|
2
|
+
export declare class ProjectAnalyzer {
|
|
3
|
+
private fileDiscovery;
|
|
4
|
+
private classAnalyzer;
|
|
5
|
+
constructor(options: AnalyzerOptions);
|
|
6
|
+
analyzeProject(): Promise<ClassInfo[]>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=project-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyser/project-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKtD,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,OAAO,EAAE,eAAe;IAK9B,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAY7C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectAnalyzer = void 0;
|
|
4
|
+
const class_analyzer_1 = require("./class-analyzer");
|
|
5
|
+
const file_discovery_1 = require("./file-discovery");
|
|
6
|
+
class ProjectAnalyzer {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.fileDiscovery = new file_discovery_1.FileDiscovery(options.sourceDir, options.excludePatterns);
|
|
9
|
+
this.classAnalyzer = new class_analyzer_1.ClassAnalyzer(options.sourceDir, options.interfacePattern);
|
|
10
|
+
}
|
|
11
|
+
async analyzeProject() {
|
|
12
|
+
const tsFiles = await this.fileDiscovery.findTypeScriptFiles();
|
|
13
|
+
const fileAnalysisPromises = tsFiles.map(filePath => this.classAnalyzer.analyzeFile(filePath));
|
|
14
|
+
const fileClassesArrays = await Promise.all(fileAnalysisPromises);
|
|
15
|
+
const classes = fileClassesArrays.flat();
|
|
16
|
+
return classes;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.ProjectAnalyzer = ProjectAnalyzer;
|
|
20
|
+
//# sourceMappingURL=project-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-analyzer.js","sourceRoot":"","sources":["../../src/analyser/project-analyzer.ts"],"names":[],"mappings":";;;AACA,qDAAiD;AACjD,qDAAiD;AAGjD,MAAa,eAAe;IAI1B,YAAY,OAAwB;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,8BAAa,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,GAAG,IAAI,8BAAa,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAE/D,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAClD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CACzC,CAAC;QAEF,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAEzC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AArBD,0CAqBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,cAAc,SA4DvB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const analyser_1 = require("../analyser");
|
|
8
|
+
const generator_1 = require("../generator");
|
|
9
|
+
exports.analyzeCommand = new commander_1.Command('analyze')
|
|
10
|
+
.description('Analyze project and show detected classes without generating')
|
|
11
|
+
.option('-s, --source <dir>', 'Source directory to scan', 'src')
|
|
12
|
+
.option('-i, --interface <pattern>', 'Interface name pattern to match (regex)')
|
|
13
|
+
.option('-e, --exclude <patterns...>', 'Exclude patterns for files')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
try {
|
|
16
|
+
const sourceDir = (0, path_1.resolve)(options.source);
|
|
17
|
+
if (!(0, fs_1.existsSync)(sourceDir)) {
|
|
18
|
+
console.error(`ā Source directory does not exist: ${sourceDir}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
console.log(`š Analyzing directory: ${sourceDir}`);
|
|
22
|
+
const classes = await (0, analyser_1.analyzeProject)(sourceDir, {
|
|
23
|
+
sourceDir,
|
|
24
|
+
interfacePattern: options.interface,
|
|
25
|
+
excludePatterns: options.exclude
|
|
26
|
+
});
|
|
27
|
+
console.log("Analysis results------------\n");
|
|
28
|
+
console.log(classes);
|
|
29
|
+
console.log("Analysis results------------\n");
|
|
30
|
+
if (classes.length === 0) {
|
|
31
|
+
console.log('ā ļø No classes implementing interfaces found.');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log(`\nš Found ${classes.length} classes:\n`);
|
|
35
|
+
classes.forEach(cls => {
|
|
36
|
+
console.log(`š¦ ${cls.name}`);
|
|
37
|
+
console.log(` File: ${cls.filePath}`);
|
|
38
|
+
if (cls.interfaceName) {
|
|
39
|
+
console.log(` Implements: ${cls.interfaceName}`);
|
|
40
|
+
}
|
|
41
|
+
if (cls.dependencies.length > 0) {
|
|
42
|
+
console.log(` Dependencies: ${cls.dependencies.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.log(` Dependencies: none`);
|
|
46
|
+
}
|
|
47
|
+
console.log('');
|
|
48
|
+
});
|
|
49
|
+
// Check for circular dependencies
|
|
50
|
+
const cycles = (0, generator_1.detectCircularDependencies)(classes);
|
|
51
|
+
if (cycles.length > 0) {
|
|
52
|
+
console.log('ā ļø Circular dependencies detected:');
|
|
53
|
+
cycles.forEach((cycle, index) => {
|
|
54
|
+
console.log(` ${index + 1}. ${cycle.join(' ā ')}`);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log('ā
No circular dependencies found.');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('ā Error analyzing project:', error instanceof Error ? error.message : error);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,+BAA+B;AAC/B,2BAAgC;AAChC,0CAA6C;AAC7C,4CAA0D;AAE7C,QAAA,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,EAAE,KAAK,CAAC;KAC/D,MAAM,CAAC,2BAA2B,EAAE,yCAAyC,CAAC;KAC9E,MAAM,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAc,EAAC,SAAS,EAAE;YAC9C,SAAS;YACT,gBAAgB,EAAE,OAAO,CAAC,SAAS;YACnC,eAAe,EAAE,OAAO,CAAC,OAAO;SACjC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;QAEvD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,MAAM,GAAG,IAAA,sCAA0B,EAAC,OAAO,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,eAAe,SA4JxB,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCommand = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const analyser_1 = require("../analyser");
|
|
8
|
+
const generator_1 = require("../generator");
|
|
9
|
+
const configManager_1 = require("../utils/configManager");
|
|
10
|
+
const moduleResolver_1 = require("../utils/moduleResolver");
|
|
11
|
+
const one_logger_client_sdk_1 = require("@notjustcoders/one-logger-client-sdk");
|
|
12
|
+
exports.generateCommand = new commander_1.Command('generate')
|
|
13
|
+
.description('Generate IoC container from TypeScript classes')
|
|
14
|
+
.option('-s, --source <dir>', 'Source directory to scan', 'src')
|
|
15
|
+
.option('-o, --output <file>', 'Output file path', 'container.gen.ts')
|
|
16
|
+
.option('-i, --interface <pattern>', 'Interface name pattern to match (regex)')
|
|
17
|
+
.option('-e, --exclude <patterns...>', 'Exclude patterns for files')
|
|
18
|
+
.option('--check-cycles', 'Only check for circular dependencies without generating')
|
|
19
|
+
.option('--verbose', 'Enable verbose logging')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
try {
|
|
22
|
+
await (0, one_logger_client_sdk_1.initializeOneLogger)({
|
|
23
|
+
name: "ioc-maker",
|
|
24
|
+
description: "ioc-maker",
|
|
25
|
+
tracer: {
|
|
26
|
+
batchSize: 1,
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
// Initialize config manager with the source directory
|
|
30
|
+
const initialSourceDir = (0, path_1.resolve)(options.source);
|
|
31
|
+
const configManager = new configManager_1.ConfigManager(initialSourceDir);
|
|
32
|
+
// Merge CLI options with config file
|
|
33
|
+
const mergedOptions = configManager.mergeWithCliOptions(options);
|
|
34
|
+
const sourceDir = (0, path_1.resolve)(mergedOptions.source);
|
|
35
|
+
const outputPath = (0, path_1.resolve)(sourceDir, mergedOptions.output);
|
|
36
|
+
if (configManager.hasConfigFile() && mergedOptions.verbose) {
|
|
37
|
+
console.log(`š Using config file: ${configManager.getConfigPath()}`);
|
|
38
|
+
}
|
|
39
|
+
// Validate module configuration if present
|
|
40
|
+
let moduleResolver = null;
|
|
41
|
+
if (mergedOptions.modules && Object.keys(mergedOptions.modules).length > 0) {
|
|
42
|
+
const validationErrors = moduleResolver_1.ModuleResolver.validateModuleConfig(mergedOptions.modules);
|
|
43
|
+
if (validationErrors.length > 0) {
|
|
44
|
+
console.error('ā Module configuration errors:');
|
|
45
|
+
validationErrors.forEach(error => console.error(` ${error}`));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
moduleResolver = new moduleResolver_1.ModuleResolver(mergedOptions.modules, sourceDir);
|
|
49
|
+
if (mergedOptions.verbose) {
|
|
50
|
+
console.log(`šļø Module support enabled with ${Object.keys(mergedOptions.modules).length} modules`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!(0, fs_1.existsSync)(sourceDir)) {
|
|
54
|
+
console.error(`ā Source directory does not exist: ${sourceDir}`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (mergedOptions.verbose) {
|
|
58
|
+
console.log(`š Scanning directory: ${sourceDir}`);
|
|
59
|
+
console.log(`š Output file: ${outputPath}`);
|
|
60
|
+
if (mergedOptions.interface) {
|
|
61
|
+
console.log(`šÆ Interface pattern: ${mergedOptions.interface}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log("š Starting analysis...");
|
|
65
|
+
// Analyze the project
|
|
66
|
+
const classes = await (0, analyser_1.analyzeProject)(sourceDir, {
|
|
67
|
+
sourceDir,
|
|
68
|
+
interfacePattern: mergedOptions.interface,
|
|
69
|
+
excludePatterns: mergedOptions.exclude
|
|
70
|
+
});
|
|
71
|
+
one_logger_client_sdk_1.logger.info("Analysis results------------\n", { classes });
|
|
72
|
+
if (classes.length === 0) {
|
|
73
|
+
console.log('ā ļø No classes implementing interfaces found.');
|
|
74
|
+
if (mergedOptions.interface) {
|
|
75
|
+
console.log(` Make sure classes implement interfaces matching pattern: ${mergedOptions.interface}`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log(' Make sure classes implement interfaces using the "implements" keyword.');
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Group classes by modules if module resolver is available
|
|
83
|
+
let moduleGroupedClasses;
|
|
84
|
+
if (moduleResolver) {
|
|
85
|
+
moduleGroupedClasses = moduleResolver.groupClassesByModule(classes);
|
|
86
|
+
if (mergedOptions.verbose) {
|
|
87
|
+
console.log(`\nš Found ${classes.length} classes organized into ${moduleGroupedClasses.size} modules:`);
|
|
88
|
+
for (const [moduleName, moduleClasses] of moduleGroupedClasses) {
|
|
89
|
+
console.log(`\n š¦ ${moduleName} (${moduleClasses.length} classes):`);
|
|
90
|
+
moduleClasses.forEach(cls => {
|
|
91
|
+
console.log(` ⢠${cls.name} (${cls.dependencies.length} dependencies)`);
|
|
92
|
+
if (cls.dependencies.length > 0) {
|
|
93
|
+
console.log(` Dependencies: ${cls.dependencies.join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Backward compatibility: single default module
|
|
101
|
+
moduleGroupedClasses = new Map([['default', classes]]);
|
|
102
|
+
if (mergedOptions.verbose) {
|
|
103
|
+
console.log(`\nš Found ${classes.length} classes:`);
|
|
104
|
+
classes.forEach(cls => {
|
|
105
|
+
console.log(` ⢠${cls.name} (${cls.dependencies.length} dependencies)`);
|
|
106
|
+
if (cls.dependencies.length > 0) {
|
|
107
|
+
console.log(` Dependencies: ${cls.dependencies.join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Check for circular dependencies
|
|
113
|
+
const cycles = (0, generator_1.detectCircularDependencies)(classes);
|
|
114
|
+
if (cycles.length > 0) {
|
|
115
|
+
console.error('ā Circular dependencies detected:');
|
|
116
|
+
cycles.forEach((cycle, index) => {
|
|
117
|
+
console.error(` ${index + 1}. ${cycle.join(' ā ')}`);
|
|
118
|
+
});
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
if (mergedOptions.checkCycles) {
|
|
122
|
+
console.log('ā
No circular dependencies found.');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
console.log("Generating container: generateContainerFile------------------>");
|
|
126
|
+
// Generate container file
|
|
127
|
+
if (moduleResolver) {
|
|
128
|
+
(0, generator_1.generateContainerFile)(moduleGroupedClasses, outputPath);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Backward compatibility
|
|
132
|
+
(0, generator_1.generateContainerFile)(classes, outputPath);
|
|
133
|
+
}
|
|
134
|
+
console.log(`ā
Container generated successfully!`);
|
|
135
|
+
console.log(` File: ${outputPath}`);
|
|
136
|
+
console.log(` Classes: ${classes.length}`);
|
|
137
|
+
if (mergedOptions.verbose) {
|
|
138
|
+
console.log('\nš You can now import and use your container:');
|
|
139
|
+
console.log(' import { container } from "./container.gen";');
|
|
140
|
+
console.log(' const userService = container.userService;');
|
|
141
|
+
}
|
|
142
|
+
// Force process exit to prevent hanging due to one-logger SDK
|
|
143
|
+
process.exit(0);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('ā Error generating container:', error instanceof Error ? error.message : error);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,eAAO,MAAM,SAAS;;CAGrB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.container = void 0;
|
|
4
|
+
const ast_parser_1 = require("./analyser/ast-parser");
|
|
5
|
+
exports.container = {
|
|
6
|
+
astParser: new ast_parser_1.ASTParser()
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;AAAA,sDAAkD;AAErC,QAAA,SAAS,GAAG;IACrB,SAAS,EAAE,IAAI,sBAAS,EAAE;CAE7B,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GeneratorOptions } from '../types';
|
|
2
|
+
export declare class ContainerFileGenerator {
|
|
3
|
+
private dependencyResolver;
|
|
4
|
+
private importGenerator;
|
|
5
|
+
private instantiationGenerator;
|
|
6
|
+
private containerCodeGenerator;
|
|
7
|
+
private fileWriter;
|
|
8
|
+
private moduleGroupedClasses?;
|
|
9
|
+
constructor(options: GeneratorOptions);
|
|
10
|
+
generateContainer(): void;
|
|
11
|
+
generateModularContainer(): void;
|
|
12
|
+
private generateContainerCode;
|
|
13
|
+
private generateModularContainerCode;
|
|
14
|
+
private generateModuleContainers;
|
|
15
|
+
private generateAggregatedContainer;
|
|
16
|
+
private generateModularTypeExport;
|
|
17
|
+
private camelCase;
|
|
18
|
+
private sortClassesByDependencies;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=container-file-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-file-generator.d.ts","sourceRoot":"","sources":["../../src/generator/container-file-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAa,MAAM,UAAU,CAAC;AAOvD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,oBAAoB,CAAC,CAA2B;gBAE5C,OAAO,EAAE,gBAAgB;IAsBrC,iBAAiB,IAAI,IAAI;IAWzB,wBAAwB,IAAI,IAAI;IA0BhC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,4BAA4B;IAUpC,OAAO,CAAC,wBAAwB;IAyJhC,OAAO,CAAC,2BAA2B;IAcnC,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,yBAAyB;CAqClC"}
|