@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,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InstantiationGenerator = void 0;
|
|
4
|
+
const naming_1 = require("../utils/naming");
|
|
5
|
+
const dependency_resolver_1 = require("./dependency-resolver");
|
|
6
|
+
class InstantiationGenerator {
|
|
7
|
+
constructor(classes) {
|
|
8
|
+
this.classes = classes;
|
|
9
|
+
this.dependencyResolver = new dependency_resolver_1.DependencyResolver(classes);
|
|
10
|
+
}
|
|
11
|
+
generateInstantiations(sortedClasses) {
|
|
12
|
+
const classMap = new Map(this.classes.map(c => [c.name, c]));
|
|
13
|
+
const lazyInitializations = [];
|
|
14
|
+
const lazyGetters = [];
|
|
15
|
+
const transientFactories = [];
|
|
16
|
+
// Create interface to class mapping for dependency resolution
|
|
17
|
+
const interfaceToClassMap = this.dependencyResolver.createInterfaceToClassMap();
|
|
18
|
+
// Separate singletons and transients
|
|
19
|
+
const singletonClasses = this.classes.filter(c => c.scope === 'singleton');
|
|
20
|
+
const transientClasses = this.classes.filter(c => c.scope === 'transient');
|
|
21
|
+
// Generate lazy initialization variables for singletons
|
|
22
|
+
const singletonClassNames = sortedClasses.filter(name => {
|
|
23
|
+
return singletonClasses.some(c => c.name === name);
|
|
24
|
+
});
|
|
25
|
+
for (const className of singletonClassNames) {
|
|
26
|
+
const variableName = (0, naming_1.toVariableName)(className);
|
|
27
|
+
lazyInitializations.push(`let ${variableName}: ${className} | undefined;`);
|
|
28
|
+
}
|
|
29
|
+
// Generate lazy getter functions for singletons
|
|
30
|
+
for (const className of singletonClassNames.reverse()) {
|
|
31
|
+
const classInfo = classMap.get(className);
|
|
32
|
+
if (!classInfo)
|
|
33
|
+
continue;
|
|
34
|
+
const variableName = (0, naming_1.toVariableName)(className);
|
|
35
|
+
const getterName = `get${className}`;
|
|
36
|
+
// Generate constructor arguments for all parameters
|
|
37
|
+
let constructorArgs = '';
|
|
38
|
+
if (classInfo.constructorParams.length > 0) {
|
|
39
|
+
const args = classInfo.constructorParams.map((param, paramIndex) => {
|
|
40
|
+
// The dependencies array contains resolved interface names (after alias resolution)
|
|
41
|
+
// We need to map constructor parameters to dependencies by position
|
|
42
|
+
let targetDependency = param.type;
|
|
43
|
+
// If we have a dependency at this parameter index, use it (it's already resolved)
|
|
44
|
+
if (paramIndex < classInfo.dependencies.length) {
|
|
45
|
+
const resolvedDep = classInfo.dependencies[paramIndex];
|
|
46
|
+
if (resolvedDep) {
|
|
47
|
+
targetDependency = resolvedDep;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Fallback: check if parameter type directly matches any dependency
|
|
52
|
+
const directMatch = classInfo.dependencies.find(dep => dep === param.type);
|
|
53
|
+
if (directMatch) {
|
|
54
|
+
targetDependency = directMatch;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Check if this is a managed dependency
|
|
58
|
+
const implementingClass = interfaceToClassMap.get(targetDependency) || targetDependency;
|
|
59
|
+
const depClassInfo = classMap.get(implementingClass);
|
|
60
|
+
if (depClassInfo) {
|
|
61
|
+
// This is a managed dependency, resolve it
|
|
62
|
+
if (depClassInfo.scope === 'transient') {
|
|
63
|
+
return `${(0, naming_1.toVariableName)(implementingClass)}Factory()`;
|
|
64
|
+
}
|
|
65
|
+
return `get${implementingClass}()`;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Check if it's in our dependencies list (unmanaged but expected)
|
|
69
|
+
if (classInfo.dependencies.includes(targetDependency)) {
|
|
70
|
+
return `new ${targetDependency}()`;
|
|
71
|
+
}
|
|
72
|
+
// This is an unmanaged parameter, generate default value
|
|
73
|
+
return this.dependencyResolver.getDefaultValueForType(param.type, param.isOptional);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
constructorArgs = args.join(', ');
|
|
77
|
+
}
|
|
78
|
+
const instantiation = constructorArgs
|
|
79
|
+
? `new ${className}(${constructorArgs})`
|
|
80
|
+
: `new ${className}()`;
|
|
81
|
+
const lazyGetter = `const ${getterName} = (): ${className} => {\n if (!${variableName}) {\n ${variableName} = ${instantiation};\n }\n return ${variableName};\n};`;
|
|
82
|
+
lazyGetters.push(lazyGetter);
|
|
83
|
+
}
|
|
84
|
+
// Generate transient factory functions (lazy loading)
|
|
85
|
+
for (const classInfo of transientClasses) {
|
|
86
|
+
const className = classInfo.name;
|
|
87
|
+
const variableName = (0, naming_1.toVariableName)(className);
|
|
88
|
+
const dependencies = this.dependencyResolver.resolveDependencies(classInfo, interfaceToClassMap, classMap);
|
|
89
|
+
const factory = dependencies
|
|
90
|
+
? `const ${variableName}Factory = (): ${className} => new ${className}(${dependencies});`
|
|
91
|
+
: `const ${variableName}Factory = (): ${className} => new ${className}();`;
|
|
92
|
+
transientFactories.push(factory);
|
|
93
|
+
}
|
|
94
|
+
const result = [];
|
|
95
|
+
// First declare transient factories if needed
|
|
96
|
+
if (transientFactories.length > 0) {
|
|
97
|
+
result.push('// Lazy loading setup for transient dependencies');
|
|
98
|
+
// Create individual typed factory functions
|
|
99
|
+
for (const classInfo of transientClasses) {
|
|
100
|
+
const variableName = (0, naming_1.toVariableName)(classInfo.name);
|
|
101
|
+
const className = classInfo.name;
|
|
102
|
+
// Generate constructor arguments for all parameters
|
|
103
|
+
let constructorArgs = '';
|
|
104
|
+
if (classInfo.constructorParams.length > 0) {
|
|
105
|
+
const args = classInfo.constructorParams.map(param => {
|
|
106
|
+
// Check if this parameter is a dependency
|
|
107
|
+
const depIndex = classInfo.dependencies.indexOf(param.type);
|
|
108
|
+
if (depIndex !== -1) {
|
|
109
|
+
// Check if it's a managed dependency (exists in our class map)
|
|
110
|
+
const implementingClass = interfaceToClassMap.get(param.type) || param.type;
|
|
111
|
+
const depClassInfo = classMap.get(implementingClass);
|
|
112
|
+
if (depClassInfo) {
|
|
113
|
+
// This is a managed dependency, resolve it
|
|
114
|
+
if (depClassInfo.scope === 'transient') {
|
|
115
|
+
return `${(0, naming_1.toVariableName)(implementingClass)}Factory()`;
|
|
116
|
+
}
|
|
117
|
+
return `get${implementingClass}()`;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// This is an unmanaged dependency, create new instance
|
|
121
|
+
return `new ${param.type}()`;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// This is an unmanaged parameter, generate default value
|
|
126
|
+
return this.dependencyResolver.getDefaultValueForType(param.type, param.isOptional);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
constructorArgs = args.join(', ');
|
|
130
|
+
}
|
|
131
|
+
const factoryFunction = constructorArgs
|
|
132
|
+
? `const ${variableName}Factory = (): ${className} => new ${className}(${constructorArgs});`
|
|
133
|
+
: `const ${variableName}Factory = (): ${className} => new ${className}();`;
|
|
134
|
+
result.push(factoryFunction);
|
|
135
|
+
}
|
|
136
|
+
result.push('');
|
|
137
|
+
}
|
|
138
|
+
// Then add lazy initialization variables for singletons
|
|
139
|
+
if (lazyInitializations.length > 0) {
|
|
140
|
+
result.push('// Lazy initialization variables for singletons');
|
|
141
|
+
result.push(...lazyInitializations);
|
|
142
|
+
result.push('');
|
|
143
|
+
}
|
|
144
|
+
// Then add lazy getter functions for singletons
|
|
145
|
+
if (lazyGetters.length > 0) {
|
|
146
|
+
result.push('// Lazy getter functions for singletons');
|
|
147
|
+
result.push(...lazyGetters);
|
|
148
|
+
}
|
|
149
|
+
return result.join('\n');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.InstantiationGenerator = InstantiationGenerator;
|
|
153
|
+
//# sourceMappingURL=instantiation-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instantiation-generator.js","sourceRoot":"","sources":["../../src/generator/instantiation-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ClassInfo } from '../types';
|
|
2
|
+
export declare class ModuleContainerGenerator {
|
|
3
|
+
private moduleGroupedClasses;
|
|
4
|
+
constructor(moduleGroupedClasses: Map<string, ClassInfo[]>);
|
|
5
|
+
generateModuleContainers(): string;
|
|
6
|
+
generateAggregatedContainer(): string;
|
|
7
|
+
generateModularTypeExport(): string;
|
|
8
|
+
private camelCase;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=module-container-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-container-generator.d.ts","sourceRoot":"","sources":["../../src/generator/module-container-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,qBAAa,wBAAwB;IACnC,OAAO,CAAC,oBAAoB,CAA2B;gBAE3C,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAI1D,wBAAwB,IAAI,MAAM;IA+BlC,2BAA2B,IAAI,MAAM;IAYrC,yBAAyB,IAAI,MAAM;IAInC,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModuleContainerGenerator = void 0;
|
|
4
|
+
class ModuleContainerGenerator {
|
|
5
|
+
constructor(moduleGroupedClasses) {
|
|
6
|
+
this.moduleGroupedClasses = moduleGroupedClasses;
|
|
7
|
+
}
|
|
8
|
+
generateModuleContainers() {
|
|
9
|
+
const moduleContainerCodes = [];
|
|
10
|
+
for (const [moduleName, moduleClasses] of this.moduleGroupedClasses) {
|
|
11
|
+
const moduleVarName = this.camelCase(moduleName) + 'Container';
|
|
12
|
+
const moduleExports = [];
|
|
13
|
+
for (const classInfo of moduleClasses) {
|
|
14
|
+
if (classInfo.interfaceName) {
|
|
15
|
+
const instanceName = this.camelCase(classInfo.name);
|
|
16
|
+
// Check if this is a transient dependency (has factory)
|
|
17
|
+
const isTransient = classInfo.scope === 'transient';
|
|
18
|
+
const exportValue = isTransient ?
|
|
19
|
+
`get ${classInfo.interfaceName}(): ${classInfo.name} {\n return ${instanceName}Factory();\n }` :
|
|
20
|
+
`${classInfo.interfaceName}: ${instanceName}`;
|
|
21
|
+
if (isTransient) {
|
|
22
|
+
moduleExports.push(` ${exportValue}`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
moduleExports.push(` ${exportValue}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const moduleContainerCode = `const ${moduleVarName} = {\n${moduleExports.join(',\n')}\n};`;
|
|
30
|
+
moduleContainerCodes.push(moduleContainerCode);
|
|
31
|
+
}
|
|
32
|
+
return moduleContainerCodes.join('\n\n');
|
|
33
|
+
}
|
|
34
|
+
generateAggregatedContainer() {
|
|
35
|
+
const moduleExports = [];
|
|
36
|
+
for (const [moduleName] of this.moduleGroupedClasses) {
|
|
37
|
+
const moduleVarName = this.camelCase(moduleName) + 'Container';
|
|
38
|
+
const moduleKey = this.camelCase(moduleName);
|
|
39
|
+
moduleExports.push(` ${moduleKey}: ${moduleVarName}`);
|
|
40
|
+
}
|
|
41
|
+
return `export const container = {\n${moduleExports.join(',\n')}\n};`;
|
|
42
|
+
}
|
|
43
|
+
generateModularTypeExport() {
|
|
44
|
+
return 'export type Container = typeof container;';
|
|
45
|
+
}
|
|
46
|
+
camelCase(str) {
|
|
47
|
+
return str.charAt(0).toLowerCase() + str.slice(1).replace(/[^a-zA-Z0-9]/g, '');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ModuleContainerGenerator = ModuleContainerGenerator;
|
|
51
|
+
//# sourceMappingURL=module-container-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-container-generator.js","sourceRoot":"","sources":["../../src/generator/module-container-generator.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IAGnC,YAAY,oBAA8C;QACxD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAED,wBAAwB;QACtB,MAAM,oBAAoB,GAAa,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;YAC/D,MAAM,aAAa,GAAa,EAAE,CAAC;YAEnC,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;gBACtC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACpD,wDAAwD;oBACxD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,KAAK,WAAW,CAAC;oBACpD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC;wBAC/B,OAAO,SAAS,CAAC,aAAa,OAAO,SAAS,CAAC,IAAI,kBAAkB,YAAY,iBAAiB,CAAC,CAAC;wBACpG,GAAG,SAAS,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;oBAEhD,IAAI,WAAW,EAAE,CAAC;wBAChB,aAAa,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;oBACzC,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,mBAAmB,GAAG,SAAS,aAAa,SAAS,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC3F,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,2BAA2B;QACzB,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACrD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC7C,aAAa,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,aAAa,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,+BAA+B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACxE,CAAC;IAED,yBAAyB;QACvB,OAAO,2CAA2C,CAAC;IACrD,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;CACF;AAzDD,4DAyDC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const generate_1 = require("./commands/generate");
|
|
6
|
+
const analyze_1 = require("./commands/analyze");
|
|
7
|
+
const program = new commander_1.Command();
|
|
8
|
+
program
|
|
9
|
+
.name('ioc-arise')
|
|
10
|
+
.description('Generate type-safe IoC containers for TypeScript projects')
|
|
11
|
+
.version('1.0.0');
|
|
12
|
+
// Register commands
|
|
13
|
+
program.addCommand(generate_1.generateCommand);
|
|
14
|
+
program.addCommand(analyze_1.analyzeCommand);
|
|
15
|
+
program.parse();
|
|
16
|
+
// If no command is provided, show help
|
|
17
|
+
if (!process.argv.slice(2).length) {
|
|
18
|
+
program.outputHelp();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,kDAAsD;AACtD,gDAAoD;AAIpD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,0BAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AAEnC,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,uCAAuC;AACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type InjectionScope = 'singleton' | 'transient';
|
|
2
|
+
export interface ConstructorParameter {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
isOptional: boolean;
|
|
6
|
+
accessModifier?: 'private' | 'public' | 'protected';
|
|
7
|
+
}
|
|
8
|
+
export interface ClassInfo {
|
|
9
|
+
name: string;
|
|
10
|
+
filePath: string;
|
|
11
|
+
dependencies: string[];
|
|
12
|
+
constructorParams: ConstructorParameter[];
|
|
13
|
+
interfaceName?: string;
|
|
14
|
+
importPath: string;
|
|
15
|
+
scope: InjectionScope;
|
|
16
|
+
}
|
|
17
|
+
export interface AnalyzerOptions {
|
|
18
|
+
sourceDir: string;
|
|
19
|
+
interfacePattern?: string;
|
|
20
|
+
excludePatterns?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface GeneratorOptions {
|
|
23
|
+
outputPath: string;
|
|
24
|
+
classes?: ClassInfo[];
|
|
25
|
+
moduleGroupedClasses?: Map<string, ClassInfo[]>;
|
|
26
|
+
}
|
|
27
|
+
export interface DependencyGraph {
|
|
28
|
+
[className: string]: string[];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;CACrD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface IoCConfig {
|
|
2
|
+
source?: string;
|
|
3
|
+
output?: string;
|
|
4
|
+
interface?: string;
|
|
5
|
+
exclude?: string[];
|
|
6
|
+
checkCycles?: boolean;
|
|
7
|
+
verbose?: boolean;
|
|
8
|
+
modules?: Record<string, string[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare class ConfigManager {
|
|
11
|
+
private static readonly CONFIG_FILE_NAME;
|
|
12
|
+
private config;
|
|
13
|
+
private configPath;
|
|
14
|
+
constructor(sourceDir: string);
|
|
15
|
+
private loadConfig;
|
|
16
|
+
getConfig(): IoCConfig;
|
|
17
|
+
mergeWithCliOptions(cliOptions: any): IoCConfig;
|
|
18
|
+
hasConfigFile(): boolean;
|
|
19
|
+
getConfigPath(): string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=configManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configManager.d.ts","sourceRoot":"","sources":["../../src/utils/configManager.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IAC7D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,EAAE,MAAM;IAM7B,OAAO,CAAC,UAAU;IAaX,SAAS,IAAI,SAAS;IAItB,mBAAmB,CAAC,UAAU,EAAE,GAAG,GAAG,SAAS;IAa/C,aAAa,IAAI,OAAO;IAIxB,aAAa,IAAI,MAAM;CAG/B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigManager = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class ConfigManager {
|
|
7
|
+
constructor(sourceDir) {
|
|
8
|
+
this.config = {};
|
|
9
|
+
// Config file should be in the same directory as the source
|
|
10
|
+
this.configPath = (0, path_1.resolve)(sourceDir, ConfigManager.CONFIG_FILE_NAME);
|
|
11
|
+
this.loadConfig();
|
|
12
|
+
}
|
|
13
|
+
loadConfig() {
|
|
14
|
+
if ((0, fs_1.existsSync)(this.configPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const configContent = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
|
|
17
|
+
this.config = JSON.parse(configContent);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.warn(`⚠️ Warning: Failed to parse config file at ${this.configPath}`);
|
|
21
|
+
console.warn(` Using default configuration. Error: ${error instanceof Error ? error.message : error}`);
|
|
22
|
+
this.config = {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getConfig() {
|
|
27
|
+
return { ...this.config };
|
|
28
|
+
}
|
|
29
|
+
mergeWithCliOptions(cliOptions) {
|
|
30
|
+
// CLI options take precedence over config file
|
|
31
|
+
return {
|
|
32
|
+
source: cliOptions.source || this.config.source || 'src',
|
|
33
|
+
output: cliOptions.output || this.config.output || 'container.gen.ts',
|
|
34
|
+
interface: cliOptions.interface || this.config.interface,
|
|
35
|
+
exclude: cliOptions.exclude || this.config.exclude,
|
|
36
|
+
checkCycles: cliOptions.checkCycles || this.config.checkCycles || false,
|
|
37
|
+
verbose: cliOptions.verbose || this.config.verbose || false,
|
|
38
|
+
modules: cliOptions.modules || this.config.modules
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
hasConfigFile() {
|
|
42
|
+
return (0, fs_1.existsSync)(this.configPath);
|
|
43
|
+
}
|
|
44
|
+
getConfigPath() {
|
|
45
|
+
return this.configPath;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.ConfigManager = ConfigManager;
|
|
49
|
+
ConfigManager.CONFIG_FILE_NAME = 'ioc.config.json';
|
|
50
|
+
//# sourceMappingURL=configManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../src/utils/configManager.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAAwC;AAYxC,MAAa,aAAa;IAKxB,YAAY,SAAiB;QAHrB,WAAM,GAAc,EAAE,CAAC;QAI7B,4DAA4D;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC7D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,+CAA+C,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,0CAA0C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,SAAS;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAEM,mBAAmB,CAAC,UAAe;QACxC,+CAA+C;QAC/C,OAAO;YACL,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK;YACxD,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,kBAAkB;YACrE,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;YACxD,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAClD,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK;YACvE,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK;YAC3D,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;SACnD,CAAC;IACJ,CAAC;IAEM,aAAa;QAClB,OAAO,IAAA,eAAU,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;;AA/CH,sCAgDC;AA/CyB,8BAAgB,GAAG,iBAAiB,AAApB,CAAqB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ClassInfo } from '../types';
|
|
2
|
+
export declare class ModuleResolver {
|
|
3
|
+
private moduleConfig;
|
|
4
|
+
private sourceDirectory;
|
|
5
|
+
constructor(moduleConfig: Record<string, string[]>, sourceDirectory: string);
|
|
6
|
+
/**
|
|
7
|
+
* Determines which module a file belongs to based on its path
|
|
8
|
+
* @param filePath - Absolute path to the file
|
|
9
|
+
* @returns Module name or null if no match found
|
|
10
|
+
*/
|
|
11
|
+
getModuleForFile(filePath: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Groups classes by their assigned modules
|
|
14
|
+
* @param classes - Array of ClassInfo objects
|
|
15
|
+
* @returns Map of module names to their classes
|
|
16
|
+
*/
|
|
17
|
+
groupClassesByModule(classes: ClassInfo[]): Map<string, ClassInfo[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if a file path matches a given pattern
|
|
20
|
+
* @param filePath - Normalized relative file path
|
|
21
|
+
* @param pattern - Pattern to match against
|
|
22
|
+
* @returns True if the pattern matches
|
|
23
|
+
*/
|
|
24
|
+
private matchesPattern;
|
|
25
|
+
/**
|
|
26
|
+
* Converts absolute path to relative path from source directory
|
|
27
|
+
* @param filePath - Absolute file path
|
|
28
|
+
* @returns Normalized relative path
|
|
29
|
+
*/
|
|
30
|
+
private normalizeFilePath;
|
|
31
|
+
/**
|
|
32
|
+
* Validates module configuration
|
|
33
|
+
* @param moduleConfig - Module configuration to validate
|
|
34
|
+
* @returns Array of validation errors
|
|
35
|
+
*/
|
|
36
|
+
static validateModuleConfig(moduleConfig: Record<string, string[]>): string[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=moduleResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolver.d.ts","sourceRoot":"","sources":["../../src/utils/moduleResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,eAAe,CAAS;gBAEpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM;IAK3E;;;;OAIG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAcxD;;;;OAIG;IACI,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAgB3E;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;;;OAIG;WACW,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE;CAkCrF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModuleResolver = void 0;
|
|
4
|
+
const minimatch_1 = require("minimatch");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class ModuleResolver {
|
|
7
|
+
constructor(moduleConfig, sourceDirectory) {
|
|
8
|
+
this.moduleConfig = moduleConfig;
|
|
9
|
+
this.sourceDirectory = (0, path_1.normalize)(sourceDirectory);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Determines which module a file belongs to based on its path
|
|
13
|
+
* @param filePath - Absolute path to the file
|
|
14
|
+
* @returns Module name or null if no match found
|
|
15
|
+
*/
|
|
16
|
+
getModuleForFile(filePath) {
|
|
17
|
+
const relativePath = this.normalizeFilePath(filePath);
|
|
18
|
+
for (const [moduleName, patterns] of Object.entries(this.moduleConfig)) {
|
|
19
|
+
for (const pattern of patterns) {
|
|
20
|
+
if (this.matchesPattern(relativePath, pattern)) {
|
|
21
|
+
return moduleName;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null; // Will be assigned to CoreModule
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Groups classes by their assigned modules
|
|
29
|
+
* @param classes - Array of ClassInfo objects
|
|
30
|
+
* @returns Map of module names to their classes
|
|
31
|
+
*/
|
|
32
|
+
groupClassesByModule(classes) {
|
|
33
|
+
const moduleGroups = new Map();
|
|
34
|
+
for (const classInfo of classes) {
|
|
35
|
+
const moduleName = this.getModuleForFile(classInfo.filePath) || 'CoreModule';
|
|
36
|
+
if (!moduleGroups.has(moduleName)) {
|
|
37
|
+
moduleGroups.set(moduleName, []);
|
|
38
|
+
}
|
|
39
|
+
moduleGroups.get(moduleName).push(classInfo);
|
|
40
|
+
}
|
|
41
|
+
return moduleGroups;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if a file path matches a given pattern
|
|
45
|
+
* @param filePath - Normalized relative file path
|
|
46
|
+
* @param pattern - Pattern to match against
|
|
47
|
+
* @returns True if the pattern matches
|
|
48
|
+
*/
|
|
49
|
+
matchesPattern(filePath, pattern) {
|
|
50
|
+
// Handle exact file matches
|
|
51
|
+
if (pattern.endsWith('.ts') || pattern.endsWith('.js')) {
|
|
52
|
+
return filePath === pattern || filePath.endsWith('/' + pattern);
|
|
53
|
+
}
|
|
54
|
+
// Handle folder patterns
|
|
55
|
+
if (!pattern.includes('*') && !pattern.includes('?')) {
|
|
56
|
+
// Exact folder match
|
|
57
|
+
return filePath.startsWith(pattern + '/') || filePath === pattern;
|
|
58
|
+
}
|
|
59
|
+
// Handle glob patterns
|
|
60
|
+
return (0, minimatch_1.minimatch)(filePath, pattern, { matchBase: true });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Converts absolute path to relative path from source directory
|
|
64
|
+
* @param filePath - Absolute file path
|
|
65
|
+
* @returns Normalized relative path
|
|
66
|
+
*/
|
|
67
|
+
normalizeFilePath(filePath) {
|
|
68
|
+
const relativePath = (0, path_1.relative)(this.sourceDirectory, filePath);
|
|
69
|
+
return (0, path_1.normalize)(relativePath).replace(/\\/g, '/');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validates module configuration
|
|
73
|
+
* @param moduleConfig - Module configuration to validate
|
|
74
|
+
* @returns Array of validation errors
|
|
75
|
+
*/
|
|
76
|
+
static validateModuleConfig(moduleConfig) {
|
|
77
|
+
const errors = [];
|
|
78
|
+
const allPatterns = new Set();
|
|
79
|
+
for (const [moduleName, patterns] of Object.entries(moduleConfig)) {
|
|
80
|
+
// Validate module name
|
|
81
|
+
if (!moduleName || typeof moduleName !== 'string') {
|
|
82
|
+
errors.push(`Invalid module name: ${moduleName}`);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Validate patterns
|
|
86
|
+
if (!Array.isArray(patterns)) {
|
|
87
|
+
errors.push(`Module "${moduleName}" patterns must be an array`);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
for (const pattern of patterns) {
|
|
91
|
+
if (typeof pattern !== 'string') {
|
|
92
|
+
errors.push(`Module "${moduleName}" contains invalid pattern: ${pattern}`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Check for duplicate patterns
|
|
96
|
+
if (allPatterns.has(pattern)) {
|
|
97
|
+
errors.push(`Duplicate pattern "${pattern}" found in module "${moduleName}"`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
allPatterns.add(pattern);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return errors;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ModuleResolver = ModuleResolver;
|
|
108
|
+
//# sourceMappingURL=moduleResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolver.js","sourceRoot":"","sources":["../../src/utils/moduleResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts PascalCase class names to camelCase variable names
|
|
3
|
+
* @param className - The class name in PascalCase
|
|
4
|
+
* @returns The variable name in camelCase
|
|
5
|
+
*/
|
|
6
|
+
export declare function toVariableName(className: string): string;
|
|
7
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toVariableName = toVariableName;
|
|
4
|
+
/**
|
|
5
|
+
* Converts PascalCase class names to camelCase variable names
|
|
6
|
+
* @param className - The class name in PascalCase
|
|
7
|
+
* @returns The variable name in camelCase
|
|
8
|
+
*/
|
|
9
|
+
function toVariableName(className) {
|
|
10
|
+
return className.charAt(0).toLowerCase() + className.slice(1);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";;AAKA,wCAEC;AAPD;;;;GAIG;AACH,SAAgB,cAAc,CAAC,SAAiB;IAC9C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TopologicalSortResult {
|
|
2
|
+
sorted: string[];
|
|
3
|
+
cycles: string[][];
|
|
4
|
+
}
|
|
5
|
+
export declare class TopologicalSorter {
|
|
6
|
+
/**
|
|
7
|
+
* Performs topological sorting on a dependency graph with cycle detection
|
|
8
|
+
* @param graph - A map where keys are nodes and values are their dependencies
|
|
9
|
+
* @param order - Sort order: 'asc' for ascending (default) or 'desc' for descending
|
|
10
|
+
* @returns Object containing sorted nodes and any detected cycles
|
|
11
|
+
*/
|
|
12
|
+
static sort(graph: Map<string, string[]> | Record<string, string[]>, order?: 'asc' | 'desc'): TopologicalSortResult;
|
|
13
|
+
private static getDependencies;
|
|
14
|
+
private static hasNode;
|
|
15
|
+
private static getNodes;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=topological-sorter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topological-sorter.d.ts","sourceRoot":"","sources":["../../src/utils/topological-sorter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,GAAE,KAAK,GAAG,MAAc,GAAG,qBAAqB;IA8C1H,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B,OAAO,CAAC,MAAM,CAAC,OAAO;IAOtB,OAAO,CAAC,MAAM,CAAC,QAAQ;CAMxB"}
|