@notjustcoders/ioc-arise 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/dist/__tests__/analyser/ast-parser.test.d.ts +2 -0
  4. package/dist/__tests__/analyser/ast-parser.test.d.ts.map +1 -0
  5. package/dist/__tests__/analyser/ast-parser.test.js +268 -0
  6. package/dist/__tests__/analyser/ast-parser.test.js.map +1 -0
  7. package/dist/__tests__/analyser/class-analyzer.test.d.ts +2 -0
  8. package/dist/__tests__/analyser/class-analyzer.test.d.ts.map +1 -0
  9. package/dist/__tests__/analyser/class-analyzer.test.js +259 -0
  10. package/dist/__tests__/analyser/class-analyzer.test.js.map +1 -0
  11. package/dist/__tests__/analyser/dependency-resolver.test.d.ts +2 -0
  12. package/dist/__tests__/analyser/dependency-resolver.test.d.ts.map +1 -0
  13. package/dist/__tests__/analyser/dependency-resolver.test.js +128 -0
  14. package/dist/__tests__/analyser/dependency-resolver.test.js.map +1 -0
  15. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts +26 -0
  16. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.d.ts.map +1 -0
  17. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js +178 -0
  18. package/dist/__tests__/analyser/fixtures/ast-parser-fixtures.js.map +1 -0
  19. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts +54 -0
  20. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.d.ts.map +1 -0
  21. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js +285 -0
  22. package/dist/__tests__/analyser/fixtures/class-analyzer-fixtures.js.map +1 -0
  23. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts +13 -0
  24. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.d.ts.map +1 -0
  25. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js +266 -0
  26. package/dist/__tests__/analyser/fixtures/dependency-resolver-fixtures.js.map +1 -0
  27. package/dist/__tests__/generator/container-generator.test.d.ts +2 -0
  28. package/dist/__tests__/generator/container-generator.test.d.ts.map +1 -0
  29. package/dist/__tests__/generator/container-generator.test.js +185 -0
  30. package/dist/__tests__/generator/container-generator.test.js.map +1 -0
  31. package/dist/__tests__/generator/dependency-resolver.test.d.ts +2 -0
  32. package/dist/__tests__/generator/dependency-resolver.test.d.ts.map +1 -0
  33. package/dist/__tests__/generator/dependency-resolver.test.js +330 -0
  34. package/dist/__tests__/generator/dependency-resolver.test.js.map +1 -0
  35. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts +23 -0
  36. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.d.ts.map +1 -0
  37. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js +254 -0
  38. package/dist/__tests__/generator/fixtures/dependency-resolver.fixtures.js.map +1 -0
  39. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts +10 -0
  40. package/dist/__tests__/generator/fixtures/import-generator.fixtures.d.ts.map +1 -0
  41. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js +194 -0
  42. package/dist/__tests__/generator/fixtures/import-generator.fixtures.js.map +1 -0
  43. package/dist/__tests__/generator/import-generator.test.d.ts +2 -0
  44. package/dist/__tests__/generator/import-generator.test.d.ts.map +1 -0
  45. package/dist/__tests__/generator/import-generator.test.js +121 -0
  46. package/dist/__tests__/generator/import-generator.test.js.map +1 -0
  47. package/dist/__tests__/generator/instantiation-generator.test.d.ts +2 -0
  48. package/dist/__tests__/generator/instantiation-generator.test.d.ts.map +1 -0
  49. package/dist/__tests__/generator/instantiation-generator.test.js +251 -0
  50. package/dist/__tests__/generator/instantiation-generator.test.js.map +1 -0
  51. package/dist/analyser/ast-parser.d.ts +12 -0
  52. package/dist/analyser/ast-parser.d.ts.map +1 -0
  53. package/dist/analyser/ast-parser.js +192 -0
  54. package/dist/analyser/ast-parser.js.map +1 -0
  55. package/dist/analyser/class-analyzer.d.ts +11 -0
  56. package/dist/analyser/class-analyzer.d.ts.map +1 -0
  57. package/dist/analyser/class-analyzer.js +78 -0
  58. package/dist/analyser/class-analyzer.js.map +1 -0
  59. package/dist/analyser/dependency-resolver.d.ts +10 -0
  60. package/dist/analyser/dependency-resolver.d.ts.map +1 -0
  61. package/dist/analyser/dependency-resolver.js +46 -0
  62. package/dist/analyser/dependency-resolver.js.map +1 -0
  63. package/dist/analyser/file-discovery.d.ts +7 -0
  64. package/dist/analyser/file-discovery.d.ts.map +1 -0
  65. package/dist/analyser/file-discovery.js +30 -0
  66. package/dist/analyser/file-discovery.js.map +1 -0
  67. package/dist/analyser/index.d.ts +3 -0
  68. package/dist/analyser/index.d.ts.map +1 -0
  69. package/dist/analyser/index.js +14 -0
  70. package/dist/analyser/index.js.map +1 -0
  71. package/dist/analyser/module-dependency-resolver.d.ts +17 -0
  72. package/dist/analyser/module-dependency-resolver.d.ts.map +1 -0
  73. package/dist/analyser/module-dependency-resolver.js +66 -0
  74. package/dist/analyser/module-dependency-resolver.js.map +1 -0
  75. package/dist/analyser/project-analyzer.d.ts +8 -0
  76. package/dist/analyser/project-analyzer.d.ts.map +1 -0
  77. package/dist/analyser/project-analyzer.js +20 -0
  78. package/dist/analyser/project-analyzer.js.map +1 -0
  79. package/dist/commands/analyze.d.ts +3 -0
  80. package/dist/commands/analyze.d.ts.map +1 -0
  81. package/dist/commands/analyze.js +66 -0
  82. package/dist/commands/analyze.js.map +1 -0
  83. package/dist/commands/generate.d.ts +3 -0
  84. package/dist/commands/generate.d.ts.map +1 -0
  85. package/dist/commands/generate.js +150 -0
  86. package/dist/commands/generate.js.map +1 -0
  87. package/dist/container.d.ts +5 -0
  88. package/dist/container.d.ts.map +1 -0
  89. package/dist/container.js +8 -0
  90. package/dist/container.js.map +1 -0
  91. package/dist/generator/container-file-generator.d.ts +20 -0
  92. package/dist/generator/container-file-generator.d.ts.map +1 -0
  93. package/dist/generator/container-file-generator.js +255 -0
  94. package/dist/generator/container-file-generator.js.map +1 -0
  95. package/dist/generator/container-generator.d.ts +8 -0
  96. package/dist/generator/container-generator.d.ts.map +1 -0
  97. package/dist/generator/container-generator.js +35 -0
  98. package/dist/generator/container-generator.js.map +1 -0
  99. package/dist/generator/dependency-resolver.d.ts +11 -0
  100. package/dist/generator/dependency-resolver.d.ts.map +1 -0
  101. package/dist/generator/dependency-resolver.js +83 -0
  102. package/dist/generator/dependency-resolver.js.map +1 -0
  103. package/dist/generator/file-writer.d.ts +6 -0
  104. package/dist/generator/file-writer.d.ts.map +1 -0
  105. package/dist/generator/file-writer.js +19 -0
  106. package/dist/generator/file-writer.js.map +1 -0
  107. package/dist/generator/import-generator.d.ts +7 -0
  108. package/dist/generator/import-generator.d.ts.map +1 -0
  109. package/dist/generator/import-generator.js +31 -0
  110. package/dist/generator/import-generator.js.map +1 -0
  111. package/dist/generator/index.d.ts +4 -0
  112. package/dist/generator/index.d.ts.map +1 -0
  113. package/dist/generator/index.js +25 -0
  114. package/dist/generator/index.js.map +1 -0
  115. package/dist/generator/instantiation-generator.d.ts +8 -0
  116. package/dist/generator/instantiation-generator.d.ts.map +1 -0
  117. package/dist/generator/instantiation-generator.js +153 -0
  118. package/dist/generator/instantiation-generator.js.map +1 -0
  119. package/dist/generator/module-container-generator.d.ts +10 -0
  120. package/dist/generator/module-container-generator.d.ts.map +1 -0
  121. package/dist/generator/module-container-generator.js +51 -0
  122. package/dist/generator/module-container-generator.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +20 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/types.d.ts +30 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +3 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils/configManager.d.ts +21 -0
  132. package/dist/utils/configManager.d.ts.map +1 -0
  133. package/dist/utils/configManager.js +50 -0
  134. package/dist/utils/configManager.js.map +1 -0
  135. package/dist/utils/moduleResolver.d.ts +38 -0
  136. package/dist/utils/moduleResolver.d.ts.map +1 -0
  137. package/dist/utils/moduleResolver.js +108 -0
  138. package/dist/utils/moduleResolver.js.map +1 -0
  139. package/dist/utils/naming.d.ts +7 -0
  140. package/dist/utils/naming.d.ts.map +1 -0
  141. package/dist/utils/naming.js +12 -0
  142. package/dist/utils/naming.js.map +1 -0
  143. package/dist/utils/topological-sorter.d.ts +17 -0
  144. package/dist/utils/topological-sorter.d.ts.map +1 -0
  145. package/dist/utils/topological-sorter.js +69 -0
  146. package/dist/utils/topological-sorter.js.map +1 -0
  147. package/package.json +72 -0
@@ -0,0 +1,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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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"}