@notjustcoders/ioc-arise 1.0.3 → 1.0.5
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/dist/analyser/ast-parser.d.ts +1 -0
- package/dist/analyser/ast-parser.d.ts.map +1 -1
- package/dist/analyser/ast-parser.js +40 -0
- package/dist/analyser/ast-parser.js.map +1 -1
- package/dist/analyser/class-analyzer.d.ts +4 -1
- package/dist/analyser/class-analyzer.d.ts.map +1 -1
- package/dist/analyser/class-analyzer.js +96 -11
- package/dist/analyser/class-analyzer.js.map +1 -1
- package/dist/analyser/project-analyzer.d.ts +0 -1
- package/dist/analyser/project-analyzer.d.ts.map +1 -1
- package/dist/analyser/project-analyzer.js +4 -27
- package/dist/analyser/project-analyzer.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +1 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +4 -2
- package/dist/commands/generate.js.map +1 -1
- package/dist/generator/{container-file-generator.d.ts → Container-file-generator.d.ts} +1 -1
- package/dist/generator/{container-file-generator.d.ts.map → Container-file-generator.d.ts.map} +1 -1
- package/dist/generator/{container-file-generator.js → Container-file-generator.js} +1 -1
- package/dist/generator/{container-file-generator.js.map → Container-file-generator.js.map} +1 -1
- package/dist/generator/base-container-generator.d.ts +28 -0
- package/dist/generator/base-container-generator.d.ts.map +1 -0
- package/dist/generator/base-container-generator.js +28 -0
- package/dist/generator/base-container-generator.js.map +1 -0
- package/dist/generator/container-generator-factory.d.ts +40 -0
- package/dist/generator/container-generator-factory.d.ts.map +1 -0
- package/dist/generator/container-generator-factory.js +81 -0
- package/dist/generator/container-generator-factory.js.map +1 -0
- package/dist/generator/flat-container-generator.d.ts +24 -0
- package/dist/generator/flat-container-generator.d.ts.map +1 -0
- package/dist/generator/flat-container-generator.js +44 -0
- package/dist/generator/flat-container-generator.js.map +1 -0
- package/dist/generator/index.d.ts +16 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +25 -13
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/modular-container-generator.d.ts +20 -0
- package/dist/generator/modular-container-generator.d.ts.map +1 -0
- package/dist/generator/modular-container-generator.js +215 -0
- package/dist/generator/modular-container-generator.js.map +1 -0
- package/package.json +5 -2
- package/dist/generator/module-container-generator.d.ts +0 -10
- package/dist/generator/module-container-generator.d.ts.map +0 -1
- package/dist/generator/module-container-generator.js +0 -51
- package/dist/generator/module-container-generator.js.map +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BaseContainerGenerator } from './base-container-generator';
|
|
2
|
+
import { ClassInfo } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory class for creating the appropriate container generator
|
|
5
|
+
* based on the input type (flat classes or module-grouped classes).
|
|
6
|
+
* Handles dependency injection at the factory level instead of constructor level.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ContainerGeneratorFactory {
|
|
9
|
+
/**
|
|
10
|
+
* Creates the appropriate container generator based on the input type.
|
|
11
|
+
* Injects all necessary dependencies in the constructor.
|
|
12
|
+
*
|
|
13
|
+
* @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes
|
|
14
|
+
* @param outputPath - The output path for the generated container file
|
|
15
|
+
* @returns The appropriate container generator instance with dependencies injected
|
|
16
|
+
*/
|
|
17
|
+
static create(classesOrModules: ClassInfo[] | Map<string, ClassInfo[]>, outputPath: string): BaseContainerGenerator;
|
|
18
|
+
/**
|
|
19
|
+
* Determines if the input represents a modular structure.
|
|
20
|
+
*
|
|
21
|
+
* @param classesOrModules - The input to check
|
|
22
|
+
* @returns true if the input is a Map (modular), false if it's an array (flat)
|
|
23
|
+
*/
|
|
24
|
+
static isModular(classesOrModules: ClassInfo[] | Map<string, ClassInfo[]>): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the total number of classes from either flat or modular input.
|
|
27
|
+
*
|
|
28
|
+
* @param classesOrModules - The input to count classes from
|
|
29
|
+
* @returns The total number of classes
|
|
30
|
+
*/
|
|
31
|
+
static getClassCount(classesOrModules: ClassInfo[] | Map<string, ClassInfo[]>): number;
|
|
32
|
+
/**
|
|
33
|
+
* Gets the number of modules from modular input.
|
|
34
|
+
*
|
|
35
|
+
* @param classesOrModules - The input to count modules from
|
|
36
|
+
* @returns The number of modules, or 1 for flat structure
|
|
37
|
+
*/
|
|
38
|
+
static getModuleCount(classesOrModules: ClassInfo[] | Map<string, ClassInfo[]>): number;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=container-generator-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-generator-factory.d.ts","sourceRoot":"","sources":["../../src/generator/container-generator-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAQpE,OAAO,EAAoB,SAAS,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CACX,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EACxD,UAAU,EAAE,MAAM,GACjB,sBAAsB;IA+BzB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO;IAInF;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM;IAQtF;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM;CAOxF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContainerGeneratorFactory = void 0;
|
|
4
|
+
const flat_container_generator_1 = require("./flat-container-generator");
|
|
5
|
+
const modular_container_generator_1 = require("./modular-container-generator");
|
|
6
|
+
const dependency_resolver_1 = require("../analyser/dependency-resolver");
|
|
7
|
+
const module_dependency_resolver_1 = require("../analyser/module-dependency-resolver");
|
|
8
|
+
const import_generator_1 = require("./import-generator");
|
|
9
|
+
const instantiation_generator_1 = require("./instantiation-generator");
|
|
10
|
+
const container_generator_1 = require("./container-generator");
|
|
11
|
+
/**
|
|
12
|
+
* Factory class for creating the appropriate container generator
|
|
13
|
+
* based on the input type (flat classes or module-grouped classes).
|
|
14
|
+
* Handles dependency injection at the factory level instead of constructor level.
|
|
15
|
+
*/
|
|
16
|
+
class ContainerGeneratorFactory {
|
|
17
|
+
/**
|
|
18
|
+
* Creates the appropriate container generator based on the input type.
|
|
19
|
+
* Injects all necessary dependencies in the constructor.
|
|
20
|
+
*
|
|
21
|
+
* @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes
|
|
22
|
+
* @param outputPath - The output path for the generated container file
|
|
23
|
+
* @returns The appropriate container generator instance with dependencies injected
|
|
24
|
+
*/
|
|
25
|
+
static create(classesOrModules, outputPath) {
|
|
26
|
+
if (classesOrModules instanceof Map) {
|
|
27
|
+
// Module-based generation - create dependencies and inject in constructor
|
|
28
|
+
const moduleDependencyResolver = new module_dependency_resolver_1.ModuleDependencyResolver(classesOrModules);
|
|
29
|
+
const allClasses = Array.from(classesOrModules.values()).flat();
|
|
30
|
+
const importGenerator = new import_generator_1.ImportGenerator(allClasses);
|
|
31
|
+
return new modular_container_generator_1.ModularContainerGenerator(outputPath, classesOrModules, moduleDependencyResolver, importGenerator);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Backward compatibility: flat classes array - create dependencies and inject in constructor
|
|
35
|
+
const dependencyResolver = new dependency_resolver_1.DependencyResolver(classesOrModules);
|
|
36
|
+
const importGenerator = new import_generator_1.ImportGenerator(classesOrModules);
|
|
37
|
+
const instantiationGenerator = new instantiation_generator_1.InstantiationGenerator(classesOrModules);
|
|
38
|
+
const containerCodeGenerator = new container_generator_1.ContainerGenerator(classesOrModules);
|
|
39
|
+
return new flat_container_generator_1.FlatContainerGenerator(outputPath, classesOrModules, dependencyResolver, importGenerator, instantiationGenerator, containerCodeGenerator);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Determines if the input represents a modular structure.
|
|
44
|
+
*
|
|
45
|
+
* @param classesOrModules - The input to check
|
|
46
|
+
* @returns true if the input is a Map (modular), false if it's an array (flat)
|
|
47
|
+
*/
|
|
48
|
+
static isModular(classesOrModules) {
|
|
49
|
+
return classesOrModules instanceof Map;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gets the total number of classes from either flat or modular input.
|
|
53
|
+
*
|
|
54
|
+
* @param classesOrModules - The input to count classes from
|
|
55
|
+
* @returns The total number of classes
|
|
56
|
+
*/
|
|
57
|
+
static getClassCount(classesOrModules) {
|
|
58
|
+
if (classesOrModules instanceof Map) {
|
|
59
|
+
return Array.from(classesOrModules.values()).flat().length;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return classesOrModules.length;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gets the number of modules from modular input.
|
|
67
|
+
*
|
|
68
|
+
* @param classesOrModules - The input to count modules from
|
|
69
|
+
* @returns The number of modules, or 1 for flat structure
|
|
70
|
+
*/
|
|
71
|
+
static getModuleCount(classesOrModules) {
|
|
72
|
+
if (classesOrModules instanceof Map) {
|
|
73
|
+
return classesOrModules.size;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return 1; // Flat structure is considered as one implicit module
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.ContainerGeneratorFactory = ContainerGeneratorFactory;
|
|
81
|
+
//# sourceMappingURL=container-generator-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-generator-factory.js","sourceRoot":"","sources":["../../src/generator/container-generator-factory.ts"],"names":[],"mappings":";;;AACA,yEAAoE;AACpE,+EAA0E;AAC1E,yEAAqE;AACrE,uFAAkF;AAClF,yDAAqD;AACrD,uEAAmE;AACnE,+DAAqF;AAGrF;;;;GAIG;AACH,MAAa,yBAAyB;IACpC;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CACX,gBAAwD,EACxD,UAAkB;QAElB,IAAI,gBAAgB,YAAY,GAAG,EAAE,CAAC;YACpC,0EAA0E;YAC1E,MAAM,wBAAwB,GAAG,IAAI,qDAAwB,CAAC,gBAAgB,CAAC,CAAC;YAChF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,MAAM,eAAe,GAAG,IAAI,kCAAe,CAAC,UAAU,CAAC,CAAC;YAExD,OAAO,IAAI,uDAAyB,CAClC,UAAU,EACV,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,CAChB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,6FAA6F;YAC7F,MAAM,kBAAkB,GAAG,IAAI,wCAAkB,CAAC,gBAAgB,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,IAAI,kCAAe,CAAC,gBAAgB,CAAC,CAAC;YAC9D,MAAM,sBAAsB,GAAG,IAAI,gDAAsB,CAAC,gBAAgB,CAAC,CAAC;YAC5E,MAAM,sBAAsB,GAAG,IAAI,wCAAsB,CAAC,gBAAgB,CAAC,CAAC;YAE5E,OAAO,IAAI,iDAAsB,CAC/B,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,gBAAwD;QACvE,OAAO,gBAAgB,YAAY,GAAG,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,gBAAwD;QAC3E,IAAI,gBAAgB,YAAY,GAAG,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,OAAO,gBAAgB,CAAC,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,gBAAwD;QAC5E,IAAI,gBAAgB,YAAY,GAAG,EAAE,CAAC;YACpC,OAAO,gBAAgB,CAAC,IAAI,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,CAAC,sDAAsD;QAClE,CAAC;IACH,CAAC;CACF;AAhFD,8DAgFC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ClassInfo } from '../types';
|
|
2
|
+
import { DependencyResolver } from '../analyser/dependency-resolver';
|
|
3
|
+
import { ContainerGenerator as ContainerCodeGenerator } from './container-generator';
|
|
4
|
+
import { InstantiationGenerator } from './instantiation-generator';
|
|
5
|
+
import { BaseContainerGenerator } from './base-container-generator';
|
|
6
|
+
import { ImportGenerator } from './import-generator';
|
|
7
|
+
/**
|
|
8
|
+
* Generator for flat (non-modular) container structure.
|
|
9
|
+
* Handles the traditional single-container approach.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FlatContainerGenerator extends BaseContainerGenerator {
|
|
12
|
+
private dependencyResolver;
|
|
13
|
+
private instantiationGenerator;
|
|
14
|
+
private containerCodeGenerator;
|
|
15
|
+
private classes;
|
|
16
|
+
constructor(outputPath: string, classes: ClassInfo[], dependencyResolver: DependencyResolver, importGenerator: ImportGenerator, instantiationGenerator: InstantiationGenerator, containerCodeGenerator: ContainerCodeGenerator);
|
|
17
|
+
generate(): void;
|
|
18
|
+
protected generateContainerCode(sortedClasses?: string[]): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the classes managed by this generator.
|
|
21
|
+
*/
|
|
22
|
+
getClasses(): ClassInfo[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=flat-container-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat-container-generator.d.ts","sourceRoot":"","sources":["../../src/generator/flat-container-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,sBAAsB;IAChE,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,sBAAsB,CAAyB;IACvD,OAAO,CAAC,OAAO,CAAc;gBAG3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,EAAE,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe,EAChC,sBAAsB,EAAE,sBAAsB,EAC9C,sBAAsB,EAAE,sBAAsB;IAShD,QAAQ,IAAI,IAAI;IAWhB,SAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAcjE;;OAEG;IACH,UAAU,IAAI,SAAS,EAAE;CAG1B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlatContainerGenerator = void 0;
|
|
4
|
+
const base_container_generator_1 = require("./base-container-generator");
|
|
5
|
+
/**
|
|
6
|
+
* Generator for flat (non-modular) container structure.
|
|
7
|
+
* Handles the traditional single-container approach.
|
|
8
|
+
*/
|
|
9
|
+
class FlatContainerGenerator extends base_container_generator_1.BaseContainerGenerator {
|
|
10
|
+
constructor(outputPath, classes, dependencyResolver, importGenerator, instantiationGenerator, containerCodeGenerator) {
|
|
11
|
+
super(outputPath, importGenerator);
|
|
12
|
+
this.classes = classes;
|
|
13
|
+
this.dependencyResolver = dependencyResolver;
|
|
14
|
+
this.instantiationGenerator = instantiationGenerator;
|
|
15
|
+
this.containerCodeGenerator = containerCodeGenerator;
|
|
16
|
+
}
|
|
17
|
+
generate() {
|
|
18
|
+
const sortResult = this.dependencyResolver.resolve();
|
|
19
|
+
if (sortResult.cycles.length > 0) {
|
|
20
|
+
throw new Error(`Circular dependencies detected: ${JSON.stringify(sortResult.cycles)}`);
|
|
21
|
+
}
|
|
22
|
+
const containerCode = this.generateContainerCode(sortResult.sorted);
|
|
23
|
+
this.writeContainer(containerCode);
|
|
24
|
+
}
|
|
25
|
+
generateContainerCode(sortedClasses) {
|
|
26
|
+
if (!sortedClasses) {
|
|
27
|
+
const sortResult = this.dependencyResolver.resolve();
|
|
28
|
+
sortedClasses = sortResult.sorted;
|
|
29
|
+
}
|
|
30
|
+
const imports = this.importGenerator.generateImports();
|
|
31
|
+
const instantiations = this.instantiationGenerator.generateInstantiations(sortedClasses);
|
|
32
|
+
const containerObject = this.containerCodeGenerator.generateContainerObject();
|
|
33
|
+
const typeExport = this.containerCodeGenerator.generateTypeExport();
|
|
34
|
+
return `${imports}\n\n${instantiations}\n\n${containerObject}\n\n${typeExport}\n`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the classes managed by this generator.
|
|
38
|
+
*/
|
|
39
|
+
getClasses() {
|
|
40
|
+
return this.classes;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.FlatContainerGenerator = FlatContainerGenerator;
|
|
44
|
+
//# sourceMappingURL=flat-container-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat-container-generator.js","sourceRoot":"","sources":["../../src/generator/flat-container-generator.ts"],"names":[],"mappings":";;;AAIA,yEAAoE;AAGpE;;;GAGG;AACH,MAAa,sBAAuB,SAAQ,iDAAsB;IAMhE,YACE,UAAkB,EAClB,OAAoB,EACpB,kBAAsC,EACtC,eAAgC,EAChC,sBAA8C,EAC9C,sBAA8C;QAE9C,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;QACrD,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACvD,CAAC;IAED,QAAQ;QACN,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAErD,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAES,qBAAqB,CAAC,aAAwB;QACtD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YACrD,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QACvD,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;QACzF,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,CAAC;QAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;QAEpE,OAAO,GAAG,OAAO,OAAO,cAAc,OAAO,eAAe,OAAO,UAAU,IAAI,CAAC;IACpF,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AApDD,wDAoDC"}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { ClassInfo } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a container file from either flat classes or module-grouped classes.
|
|
4
|
+
*
|
|
5
|
+
* @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes
|
|
6
|
+
* @param outputPath - The output path for the generated container file
|
|
7
|
+
*/
|
|
2
8
|
export declare function generateContainerFile(classesOrModules: ClassInfo[] | Map<string, ClassInfo[]>, outputPath: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Detects circular dependencies in a flat array of classes.
|
|
11
|
+
*
|
|
12
|
+
* @param classes - The classes to check for circular dependencies
|
|
13
|
+
* @returns An array of circular dependency chains
|
|
14
|
+
*/
|
|
3
15
|
export declare function detectCircularDependencies(classes: ClassInfo[]): string[][];
|
|
16
|
+
export { ContainerGeneratorFactory } from './container-generator-factory';
|
|
17
|
+
export { BaseContainerGenerator } from './base-container-generator';
|
|
18
|
+
export { FlatContainerGenerator } from './flat-container-generator';
|
|
19
|
+
export { ModularContainerGenerator } from './modular-container-generator';
|
|
4
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAGxH;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,EAAE,CAG3E;AAGD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/generator/index.js
CHANGED
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModularContainerGenerator = exports.FlatContainerGenerator = exports.BaseContainerGenerator = exports.ContainerGeneratorFactory = void 0;
|
|
3
4
|
exports.generateContainerFile = generateContainerFile;
|
|
4
5
|
exports.detectCircularDependencies = detectCircularDependencies;
|
|
5
6
|
const dependency_resolver_1 = require("../analyser/dependency-resolver");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const container_generator_factory_1 = require("./container-generator-factory");
|
|
8
|
+
/**
|
|
9
|
+
* Generates a container file from either flat classes or module-grouped classes.
|
|
10
|
+
*
|
|
11
|
+
* @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes
|
|
12
|
+
* @param outputPath - The output path for the generated container file
|
|
13
|
+
*/
|
|
9
14
|
function generateContainerFile(classesOrModules, outputPath) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const generator = new ContainerFileGenerator({ moduleGroupedClasses: classesOrModules, outputPath });
|
|
13
|
-
generator.generateModularContainer();
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
// Backward compatibility: flat classes array
|
|
17
|
-
const generator = new ContainerFileGenerator({ classes: classesOrModules, outputPath });
|
|
18
|
-
generator.generateContainer();
|
|
19
|
-
}
|
|
15
|
+
const generator = container_generator_factory_1.ContainerGeneratorFactory.create(classesOrModules, outputPath);
|
|
16
|
+
generator.generate();
|
|
20
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Detects circular dependencies in a flat array of classes.
|
|
20
|
+
*
|
|
21
|
+
* @param classes - The classes to check for circular dependencies
|
|
22
|
+
* @returns An array of circular dependency chains
|
|
23
|
+
*/
|
|
21
24
|
function detectCircularDependencies(classes) {
|
|
22
25
|
const resolver = new dependency_resolver_1.DependencyResolver(classes);
|
|
23
26
|
return resolver.detectCircularDependencies();
|
|
24
27
|
}
|
|
28
|
+
// Re-export the factory for advanced usage
|
|
29
|
+
var container_generator_factory_2 = require("./container-generator-factory");
|
|
30
|
+
Object.defineProperty(exports, "ContainerGeneratorFactory", { enumerable: true, get: function () { return container_generator_factory_2.ContainerGeneratorFactory; } });
|
|
31
|
+
var base_container_generator_1 = require("./base-container-generator");
|
|
32
|
+
Object.defineProperty(exports, "BaseContainerGenerator", { enumerable: true, get: function () { return base_container_generator_1.BaseContainerGenerator; } });
|
|
33
|
+
var flat_container_generator_1 = require("./flat-container-generator");
|
|
34
|
+
Object.defineProperty(exports, "FlatContainerGenerator", { enumerable: true, get: function () { return flat_container_generator_1.FlatContainerGenerator; } });
|
|
35
|
+
var modular_container_generator_1 = require("./modular-container-generator");
|
|
36
|
+
Object.defineProperty(exports, "ModularContainerGenerator", { enumerable: true, get: function () { return modular_container_generator_1.ModularContainerGenerator; } });
|
|
25
37
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":";;;AAUA,sDAGC;AAQD,gEAGC;AAvBD,yEAAqE;AACrE,+EAA0E;AAE1E;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,gBAAwD,EAAE,UAAkB;IAChH,MAAM,SAAS,GAAG,uDAAyB,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACjF,SAAS,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CAAC,OAAoB;IAC7D,MAAM,QAAQ,GAAG,IAAI,wCAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,QAAQ,CAAC,0BAA0B,EAAE,CAAC;AAC/C,CAAC;AAED,2CAA2C;AAC3C,6EAA0E;AAAjE,wIAAA,yBAAyB,OAAA;AAClC,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,6EAA0E;AAAjE,wIAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ModuleDependencyResolver } from '../analyser/module-dependency-resolver';
|
|
2
|
+
import { ClassInfo } from '../types';
|
|
3
|
+
import { ImportGenerator } from './import-generator';
|
|
4
|
+
import { BaseContainerGenerator } from './base-container-generator';
|
|
5
|
+
/**
|
|
6
|
+
* Generator for modular container structure.
|
|
7
|
+
* Handles module-based dependency injection with inter-module dependencies.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ModularContainerGenerator extends BaseContainerGenerator {
|
|
10
|
+
private moduleGroupedClasses;
|
|
11
|
+
private moduleDependencyResolver;
|
|
12
|
+
constructor(outputPath: string, moduleGroupedClasses: Map<string, ClassInfo[]>, moduleDependencyResolver: ModuleDependencyResolver, importGenerator: ImportGenerator);
|
|
13
|
+
generate(): void;
|
|
14
|
+
protected generateContainerCode(sortedModules?: string[], moduleDependencies?: Map<string, Set<string>>): string;
|
|
15
|
+
private generateModuleContainers;
|
|
16
|
+
private generateAggregatedContainer;
|
|
17
|
+
private generateModularTypeExport;
|
|
18
|
+
private sortClassesByDependencies;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=modular-container-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modular-container-generator.d.ts","sourceRoot":"","sources":["../../src/generator/modular-container-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IACnE,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,wBAAwB,CAA2B;gBAGzD,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAC9C,wBAAwB,EAAE,wBAAwB,EAClD,eAAe,EAAE,eAAe;IAOlC,QAAQ,IAAI,IAAI;IAqBhB,SAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM;IAehH,OAAO,CAAC,wBAAwB;IAuJhC,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,yBAAyB;CAmClC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModularContainerGenerator = void 0;
|
|
4
|
+
const dependency_resolver_1 = require("../analyser/dependency-resolver");
|
|
5
|
+
const base_container_generator_1 = require("./base-container-generator");
|
|
6
|
+
/**
|
|
7
|
+
* Generator for modular container structure.
|
|
8
|
+
* Handles module-based dependency injection with inter-module dependencies.
|
|
9
|
+
*/
|
|
10
|
+
class ModularContainerGenerator extends base_container_generator_1.BaseContainerGenerator {
|
|
11
|
+
constructor(outputPath, moduleGroupedClasses, moduleDependencyResolver, importGenerator) {
|
|
12
|
+
super(outputPath, importGenerator);
|
|
13
|
+
this.moduleGroupedClasses = moduleGroupedClasses;
|
|
14
|
+
this.moduleDependencyResolver = moduleDependencyResolver;
|
|
15
|
+
}
|
|
16
|
+
generate() {
|
|
17
|
+
// First, check for module-level cycles
|
|
18
|
+
const moduleResult = this.moduleDependencyResolver.resolve();
|
|
19
|
+
if (moduleResult.cycles.length > 0) {
|
|
20
|
+
throw new Error(`Circular dependencies detected between modules: ${JSON.stringify(moduleResult.cycles)}`);
|
|
21
|
+
}
|
|
22
|
+
// Then resolve class-level dependencies within each module
|
|
23
|
+
const allClasses = Array.from(this.moduleGroupedClasses.values()).flat();
|
|
24
|
+
const dependencyResolver = new dependency_resolver_1.DependencyResolver(allClasses);
|
|
25
|
+
const sortResult = dependencyResolver.resolve();
|
|
26
|
+
if (sortResult.cycles.length > 0) {
|
|
27
|
+
throw new Error(`Circular dependencies detected within classes: ${JSON.stringify(sortResult.cycles)}`);
|
|
28
|
+
}
|
|
29
|
+
const containerCode = this.generateContainerCode(moduleResult.sortedModules, moduleResult.moduleDependencies);
|
|
30
|
+
this.writeContainer(containerCode);
|
|
31
|
+
}
|
|
32
|
+
generateContainerCode(sortedModules, moduleDependencies) {
|
|
33
|
+
if (!sortedModules || !moduleDependencies) {
|
|
34
|
+
const moduleResult = this.moduleDependencyResolver.resolve();
|
|
35
|
+
sortedModules = moduleResult.sortedModules;
|
|
36
|
+
moduleDependencies = moduleResult.moduleDependencies;
|
|
37
|
+
}
|
|
38
|
+
const imports = this.importGenerator.generateImports();
|
|
39
|
+
const moduleContainers = this.generateModuleContainers(sortedModules, moduleDependencies);
|
|
40
|
+
const aggregatedContainer = this.generateAggregatedContainer(sortedModules);
|
|
41
|
+
const typeExport = this.generateModularTypeExport();
|
|
42
|
+
return `${imports}\n\n${moduleContainers}\n\n${aggregatedContainer}\n\n${typeExport}\n`;
|
|
43
|
+
}
|
|
44
|
+
generateModuleContainers(sortedModules, moduleDependencies) {
|
|
45
|
+
const moduleContainerCodes = [];
|
|
46
|
+
const moduleContainerFunctions = [];
|
|
47
|
+
// Generate module container functions in dependency order
|
|
48
|
+
for (const moduleName of sortedModules) {
|
|
49
|
+
const moduleClasses = this.moduleGroupedClasses.get(moduleName);
|
|
50
|
+
if (!moduleClasses)
|
|
51
|
+
continue;
|
|
52
|
+
const moduleFunctionName = `create${moduleName}Container`;
|
|
53
|
+
const moduleExports = [];
|
|
54
|
+
const moduleDeps = moduleDependencies.get(moduleName) || new Set();
|
|
55
|
+
// Generate function parameters for dependent modules
|
|
56
|
+
const functionParams = [];
|
|
57
|
+
for (const depModule of moduleDeps) {
|
|
58
|
+
const depVarName = this.camelCase(depModule) + 'Container';
|
|
59
|
+
functionParams.push(`${depVarName}: ReturnType<typeof create${depModule}Container>`);
|
|
60
|
+
}
|
|
61
|
+
// Generate lazy initialization variables and factory functions
|
|
62
|
+
const lazyInitializations = [];
|
|
63
|
+
const factoryFunctions = [];
|
|
64
|
+
// First, create factory functions for transient dependencies
|
|
65
|
+
for (const classInfo of moduleClasses) {
|
|
66
|
+
if (classInfo.scope === 'transient') {
|
|
67
|
+
const instanceName = this.camelCase(classInfo.name);
|
|
68
|
+
const factoryName = `${instanceName}Factory`;
|
|
69
|
+
factoryFunctions.push(` const ${factoryName} = (): ${classInfo.name} => new ${classInfo.name}();`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Sort singleton classes by their dependencies within the module
|
|
73
|
+
const singletonClasses = moduleClasses.filter(c => c.scope !== 'transient');
|
|
74
|
+
const sortedSingletons = this.sortClassesByDependencies(singletonClasses, moduleClasses);
|
|
75
|
+
// Generate lazy initialization variables for singletons
|
|
76
|
+
for (const classInfo of sortedSingletons) {
|
|
77
|
+
const instanceName = this.camelCase(classInfo.name);
|
|
78
|
+
lazyInitializations.push(` let ${instanceName}: ${classInfo.name} | undefined;`);
|
|
79
|
+
}
|
|
80
|
+
// Generate lazy getter functions for singletons
|
|
81
|
+
const lazyGetters = [];
|
|
82
|
+
for (const classInfo of sortedSingletons) {
|
|
83
|
+
const instanceName = this.camelCase(classInfo.name);
|
|
84
|
+
const getterName = `get${classInfo.name}`;
|
|
85
|
+
const constructorArgs = [];
|
|
86
|
+
// Build constructor arguments
|
|
87
|
+
for (const dep of classInfo.dependencies) {
|
|
88
|
+
// Check if dependency is from another module
|
|
89
|
+
let foundInOtherModule = false;
|
|
90
|
+
for (const depModule of moduleDeps) {
|
|
91
|
+
const depModuleClasses = this.moduleGroupedClasses.get(depModule);
|
|
92
|
+
if (depModuleClasses) {
|
|
93
|
+
const depClass = depModuleClasses.find(c => c.interfaceName === dep);
|
|
94
|
+
if (depClass) {
|
|
95
|
+
const depModuleVarName = this.camelCase(depModule) + 'Container';
|
|
96
|
+
constructorArgs.push(`${depModuleVarName}.${dep}`);
|
|
97
|
+
foundInOtherModule = true;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// If not found in other modules, it's from the same module
|
|
103
|
+
if (!foundInOtherModule) {
|
|
104
|
+
const depClass = moduleClasses.find(c => c.interfaceName === dep);
|
|
105
|
+
if (depClass) {
|
|
106
|
+
if (depClass.scope === 'transient') {
|
|
107
|
+
const depInstanceName = this.camelCase(depClass.name);
|
|
108
|
+
constructorArgs.push(`${depInstanceName}Factory()`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const depGetterName = `get${depClass.name}`;
|
|
112
|
+
constructorArgs.push(`${depGetterName}()`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const instantiation = constructorArgs.length > 0 ?
|
|
118
|
+
`new ${classInfo.name}(${constructorArgs.join(', ')})` :
|
|
119
|
+
`new ${classInfo.name}()`;
|
|
120
|
+
const lazyGetter = ` const ${getterName} = (): ${classInfo.name} => {\n if (!${instanceName}) {\n ${instanceName} = ${instantiation};\n }\n return ${instanceName};\n };`;
|
|
121
|
+
lazyGetters.push(lazyGetter);
|
|
122
|
+
}
|
|
123
|
+
// Generate module exports
|
|
124
|
+
for (const classInfo of moduleClasses) {
|
|
125
|
+
if (classInfo.interfaceName) {
|
|
126
|
+
const instanceName = this.camelCase(classInfo.name);
|
|
127
|
+
const isTransient = classInfo.scope === 'transient';
|
|
128
|
+
if (isTransient) {
|
|
129
|
+
moduleExports.push(` get ${classInfo.interfaceName}(): ${classInfo.name} {\n return ${instanceName}Factory();\n }`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const getterName = `get${classInfo.name}`;
|
|
133
|
+
moduleExports.push(` get ${classInfo.interfaceName}(): ${classInfo.name} {\n return ${getterName}();\n }`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const functionSignature = functionParams.length > 0 ?
|
|
138
|
+
`function ${moduleFunctionName}(${functionParams.join(', ')})` :
|
|
139
|
+
`function ${moduleFunctionName}()`;
|
|
140
|
+
const returnObject = moduleExports.length > 0 ?
|
|
141
|
+
` return {\n${moduleExports.join(',\n')}\n };` :
|
|
142
|
+
' return {};';
|
|
143
|
+
const functionBody = [
|
|
144
|
+
...factoryFunctions,
|
|
145
|
+
'',
|
|
146
|
+
...lazyInitializations,
|
|
147
|
+
'',
|
|
148
|
+
...lazyGetters,
|
|
149
|
+
'',
|
|
150
|
+
returnObject
|
|
151
|
+
].filter(line => line !== '' || factoryFunctions.length > 0 || lazyInitializations.length > 0 || lazyGetters.length > 0).join('\n');
|
|
152
|
+
const moduleContainerFunction = `${functionSignature} {\n${functionBody}\n}`;
|
|
153
|
+
moduleContainerFunctions.push(moduleContainerFunction);
|
|
154
|
+
}
|
|
155
|
+
// Sort modules by dependencies and generate instantiations
|
|
156
|
+
for (const moduleName of sortedModules) {
|
|
157
|
+
const moduleVarName = this.camelCase(moduleName) + 'Container';
|
|
158
|
+
const moduleFunctionName = `create${moduleName}Container`;
|
|
159
|
+
const moduleDeps = moduleDependencies.get(moduleName) || new Set();
|
|
160
|
+
const functionArgs = [];
|
|
161
|
+
for (const depModule of moduleDeps) {
|
|
162
|
+
const depVarName = this.camelCase(depModule) + 'Container';
|
|
163
|
+
functionArgs.push(depVarName);
|
|
164
|
+
}
|
|
165
|
+
const moduleInstantiation = functionArgs.length > 0 ?
|
|
166
|
+
`const ${moduleVarName} = ${moduleFunctionName}(${functionArgs.join(', ')});` :
|
|
167
|
+
`const ${moduleVarName} = ${moduleFunctionName}();`;
|
|
168
|
+
moduleContainerCodes.push(moduleInstantiation);
|
|
169
|
+
}
|
|
170
|
+
return moduleContainerFunctions.join('\n\n') + '\n\n' + moduleContainerCodes.join('\n');
|
|
171
|
+
}
|
|
172
|
+
generateAggregatedContainer(sortedModules) {
|
|
173
|
+
const moduleExports = [];
|
|
174
|
+
for (const moduleName of sortedModules) {
|
|
175
|
+
const moduleVarName = this.camelCase(moduleName) + 'Container';
|
|
176
|
+
const moduleKey = this.camelCase(moduleName);
|
|
177
|
+
moduleExports.push(` ${moduleKey}: ${moduleVarName}`);
|
|
178
|
+
}
|
|
179
|
+
return `export const container = {\n${moduleExports.join(',\n')}\n};`;
|
|
180
|
+
}
|
|
181
|
+
generateModularTypeExport() {
|
|
182
|
+
return 'export type Container = typeof container;';
|
|
183
|
+
}
|
|
184
|
+
sortClassesByDependencies(classes, allModuleClasses) {
|
|
185
|
+
const sorted = [];
|
|
186
|
+
const visited = new Set();
|
|
187
|
+
const visiting = new Set();
|
|
188
|
+
const visit = (classInfo) => {
|
|
189
|
+
if (visiting.has(classInfo.name)) {
|
|
190
|
+
// Circular dependency detected, just add it
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (visited.has(classInfo.name)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
visiting.add(classInfo.name);
|
|
197
|
+
// Visit dependencies first (only within the same module)
|
|
198
|
+
for (const dep of classInfo.dependencies) {
|
|
199
|
+
const depClass = allModuleClasses.find(c => c.interfaceName === dep && c.scope !== 'transient');
|
|
200
|
+
if (depClass && classes.includes(depClass)) {
|
|
201
|
+
visit(depClass);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
visiting.delete(classInfo.name);
|
|
205
|
+
visited.add(classInfo.name);
|
|
206
|
+
sorted.push(classInfo);
|
|
207
|
+
};
|
|
208
|
+
for (const classInfo of classes) {
|
|
209
|
+
visit(classInfo);
|
|
210
|
+
}
|
|
211
|
+
return sorted;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
exports.ModularContainerGenerator = ModularContainerGenerator;
|
|
215
|
+
//# sourceMappingURL=modular-container-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modular-container-generator.js","sourceRoot":"","sources":["../../src/generator/modular-container-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@notjustcoders/ioc-arise",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "A CLI tool to generate type-safe IoC containers for TypeScript projects with automatic dependency injection",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -67,6 +67,9 @@
|
|
|
67
67
|
"test2:generate": "npm run build && node dist/index.js generate --source examples/circular-deps-modules",
|
|
68
68
|
"test3:generate": "npm run build && node dist/index.js generate --source examples/circular-deps-classes",
|
|
69
69
|
"test4:generate": "npm run build && node dist/index.js generate --source examples/minimal-todo",
|
|
70
|
-
"test5:generate": "npm run build && node dist/index.js generate --source examples/simple-modules"
|
|
70
|
+
"test5:generate": "npm run build && node dist/index.js generate --source examples/simple-modules",
|
|
71
|
+
"test6:generate": "npm run build && node dist/index.js generate --source examples/use-cases-example",
|
|
72
|
+
"test7:generate": "npm run build && node dist/index.js generate --source examples/duplicate-interfaces-example",
|
|
73
|
+
"test8:generate": "npm run build && node dist/index.js generate --source examples/name-collision-example"
|
|
71
74
|
}
|
|
72
75
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|