@notjustcoders/ioc-arise 1.0.6 → 1.0.9
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/class-analyzer.d.ts.map +1 -1
- package/dist/analyser/class-analyzer.js +3 -6
- package/dist/analyser/class-analyzer.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +2 -8
- package/dist/commands/generate.js.map +1 -1
- package/dist/generator/base-container-code-generator.d.ts +15 -0
- package/dist/generator/base-container-code-generator.d.ts.map +1 -0
- package/dist/generator/base-container-code-generator.js +23 -0
- package/dist/generator/base-container-code-generator.js.map +1 -0
- package/dist/generator/base-dependency-resolver.d.ts +26 -0
- package/dist/generator/base-dependency-resolver.d.ts.map +1 -0
- package/dist/generator/base-dependency-resolver.js +72 -0
- package/dist/generator/base-dependency-resolver.js.map +1 -0
- package/dist/generator/base-instantiation-generator.d.ts +55 -0
- package/dist/generator/base-instantiation-generator.d.ts.map +1 -0
- package/dist/generator/base-instantiation-generator.js +117 -0
- package/dist/generator/base-instantiation-generator.js.map +1 -0
- package/dist/generator/container-generator-factory.d.ts +2 -2
- package/dist/generator/container-generator-factory.d.ts.map +1 -1
- package/dist/generator/container-generator-factory.js +18 -25
- package/dist/generator/container-generator-factory.js.map +1 -1
- package/dist/generator/duplicate-import-resolver.d.ts +44 -0
- package/dist/generator/duplicate-import-resolver.d.ts.map +1 -0
- package/dist/generator/duplicate-import-resolver.js +162 -0
- package/dist/generator/duplicate-import-resolver.js.map +1 -0
- package/dist/generator/flat/container-generator.d.ts.map +1 -1
- package/dist/generator/flat/container-generator.js +3 -21
- package/dist/generator/flat/container-generator.js.map +1 -1
- package/dist/generator/flat/dependency-resolver.d.ts +0 -3
- package/dist/generator/flat/dependency-resolver.d.ts.map +1 -1
- package/dist/generator/flat/dependency-resolver.js +6 -46
- package/dist/generator/flat/dependency-resolver.js.map +1 -1
- package/dist/generator/flat/instantiation-generator.d.ts +5 -2
- package/dist/generator/flat/instantiation-generator.d.ts.map +1 -1
- package/dist/generator/flat/instantiation-generator.js +42 -33
- package/dist/generator/flat/instantiation-generator.js.map +1 -1
- package/dist/generator/import-generator.d.ts +21 -0
- package/dist/generator/import-generator.d.ts.map +1 -1
- package/dist/generator/import-generator.js +77 -2
- package/dist/generator/import-generator.js.map +1 -1
- package/dist/generator/index.d.ts +1 -2
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +1 -3
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/modular/container-aggregator.d.ts +0 -7
- package/dist/generator/modular/container-aggregator.d.ts.map +1 -1
- package/dist/generator/modular/container-aggregator.js +3 -14
- package/dist/generator/modular/container-aggregator.js.map +1 -1
- package/dist/generator/modular/modular-container-generator.d.ts +4 -1
- package/dist/generator/modular/modular-container-generator.d.ts.map +1 -1
- package/dist/generator/modular/modular-container-generator.js +4 -7
- package/dist/generator/modular/modular-container-generator.js.map +1 -1
- package/dist/generator/modular/module-container-function-generator.d.ts +10 -63
- package/dist/generator/modular/module-container-function-generator.d.ts.map +1 -1
- package/dist/generator/modular/module-container-function-generator.js +10 -213
- package/dist/generator/modular/module-container-function-generator.js.map +1 -1
- package/dist/generator/modular/module-dependency-resolver.d.ts +10 -24
- package/dist/generator/modular/module-dependency-resolver.d.ts.map +1 -1
- package/dist/generator/modular/module-dependency-resolver.js +35 -46
- package/dist/generator/modular/module-dependency-resolver.js.map +1 -1
- package/dist/generator/modular/module-function-body-generator.d.ts +15 -0
- package/dist/generator/modular/module-function-body-generator.d.ts.map +1 -0
- package/dist/generator/modular/module-function-body-generator.js +25 -0
- package/dist/generator/modular/module-function-body-generator.js.map +1 -0
- package/dist/generator/modular/module-function-signature-generator.d.ts +15 -0
- package/dist/generator/modular/module-function-signature-generator.d.ts.map +1 -0
- package/dist/generator/modular/module-function-signature-generator.js +24 -0
- package/dist/generator/modular/module-function-signature-generator.js.map +1 -0
- package/dist/generator/modular/module-instantiation-generator.d.ts +1 -15
- package/dist/generator/modular/module-instantiation-generator.d.ts.map +1 -1
- package/dist/generator/modular/module-instantiation-generator.js +4 -32
- package/dist/generator/modular/module-instantiation-generator.js.map +1 -1
- package/dist/generator/shared/dependency-resolver-utils.d.ts +28 -0
- package/dist/generator/shared/dependency-resolver-utils.d.ts.map +1 -0
- package/dist/generator/shared/dependency-resolver-utils.js +67 -0
- package/dist/generator/shared/dependency-resolver-utils.js.map +1 -0
- package/dist/generator/shared/index.d.ts +2 -0
- package/dist/generator/shared/index.d.ts.map +1 -0
- package/dist/generator/shared/index.js +18 -0
- package/dist/generator/shared/index.js.map +1 -0
- package/dist/generator/shared/instantiation-utils.d.ts +240 -0
- package/dist/generator/shared/instantiation-utils.d.ts.map +1 -0
- package/dist/generator/shared/instantiation-utils.js +560 -0
- package/dist/generator/shared/instantiation-utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,14 +3,89 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ImportGenerator = void 0;
|
|
4
4
|
class ImportGenerator {
|
|
5
5
|
constructor(classes) {
|
|
6
|
+
this.aliasMap = new Map();
|
|
6
7
|
this.classes = classes;
|
|
8
|
+
this.generateAliases();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Detects name collisions and generates unique aliases for colliding class names.
|
|
12
|
+
*/
|
|
13
|
+
generateAliases() {
|
|
14
|
+
const nameToClasses = new Map();
|
|
15
|
+
// Group classes by name to detect collisions
|
|
16
|
+
for (const classInfo of this.classes) {
|
|
17
|
+
if (!nameToClasses.has(classInfo.name)) {
|
|
18
|
+
nameToClasses.set(classInfo.name, []);
|
|
19
|
+
}
|
|
20
|
+
nameToClasses.get(classInfo.name).push(classInfo);
|
|
21
|
+
}
|
|
22
|
+
// Generate aliases for colliding names
|
|
23
|
+
for (const [className, classList] of nameToClasses) {
|
|
24
|
+
if (classList.length > 1) {
|
|
25
|
+
// Name collision detected - generate unique aliases
|
|
26
|
+
for (let i = 1; i < classList.length; i++) {
|
|
27
|
+
const classInfo = classList[i];
|
|
28
|
+
if (classInfo) {
|
|
29
|
+
const alias = this.generateUniqueAlias(className, classInfo.importPath, i);
|
|
30
|
+
this.aliasMap.set(classInfo.importPath, alias);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generates a unique alias based on the class name and its module path.
|
|
38
|
+
*/
|
|
39
|
+
generateUniqueAlias(className, importPath, index) {
|
|
40
|
+
// Extract module name from import path (e.g., './user/CreateItemUseCase' -> 'User')
|
|
41
|
+
const pathParts = importPath.split('/');
|
|
42
|
+
let moduleName = '';
|
|
43
|
+
// Find the module directory name (the part before the class file)
|
|
44
|
+
for (let i = pathParts.length - 2; i >= 0; i--) {
|
|
45
|
+
const part = pathParts[i];
|
|
46
|
+
if (part && part !== '.' && part !== '..') {
|
|
47
|
+
moduleName = part.charAt(0).toUpperCase() + part.slice(1);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// If we couldn't extract a meaningful module name, use index
|
|
52
|
+
if (!moduleName) {
|
|
53
|
+
moduleName = `Module${index + 1}`;
|
|
54
|
+
}
|
|
55
|
+
return `${moduleName}${className}`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Gets the alias for a class, or returns the original name if no alias exists.
|
|
59
|
+
*/
|
|
60
|
+
getClassAlias(classInfo) {
|
|
61
|
+
return this.aliasMap.get(classInfo.importPath) || classInfo.name;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Gets the alias for a class by its import path.
|
|
65
|
+
*/
|
|
66
|
+
getClassAliasByPath(importPath) {
|
|
67
|
+
return this.aliasMap.get(importPath) || '';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks if a class has an alias (i.e., was involved in a name collision).
|
|
71
|
+
*/
|
|
72
|
+
hasAlias(classInfo) {
|
|
73
|
+
return this.aliasMap.has(classInfo.importPath);
|
|
7
74
|
}
|
|
8
75
|
generateImports() {
|
|
9
76
|
const importSet = new Set();
|
|
10
77
|
const classMap = new Map(this.classes.map(c => [c.name, c]));
|
|
11
|
-
// Add imports for all managed classes
|
|
78
|
+
// Add imports for all managed classes with aliases if needed
|
|
12
79
|
for (const classInfo of this.classes) {
|
|
13
|
-
|
|
80
|
+
const alias = this.getClassAlias(classInfo);
|
|
81
|
+
if (alias !== classInfo.name) {
|
|
82
|
+
// Use alias for colliding imports
|
|
83
|
+
importSet.add(`import { ${classInfo.name} as ${alias} } from '${classInfo.importPath}';`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// No collision, use original name
|
|
87
|
+
importSet.add(`import { ${classInfo.name} } from '${classInfo.importPath}';`);
|
|
88
|
+
}
|
|
14
89
|
}
|
|
15
90
|
// Add imports for unmanaged dependencies
|
|
16
91
|
for (const classInfo of this.classes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-generator.js","sourceRoot":"","sources":["../../src/generator/import-generator.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"import-generator.js","sourceRoot":"","sources":["../../src/generator/import-generator.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAI1B,YAAY,OAAoB;QAFxB,aAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;QAGhD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;QAErD,6CAA6C;QAC7C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,uCAAuC;QACvC,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,aAAa,EAAE,CAAC;YACnD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,oDAAoD;gBACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;wBAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAa;QAC9E,oFAAoF;QACpF,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,kEAAkE;QAClE,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC1C,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1D,MAAM;YACR,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAoB;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,UAAkB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAoB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,eAAe;QACb,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,6DAA6D;QAC7D,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC7B,kCAAkC;gBAClC,SAAS,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,IAAI,OAAO,KAAK,YAAY,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,kCAAkC;gBAClC,SAAS,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,IAAI,YAAY,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;gBACzC,6DAA6D;gBAC7D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,wBAAwB;oBACxB,sEAAsE;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AAjHD,0CAiHC"}
|
|
@@ -5,7 +5,7 @@ import { ClassInfo } from '../types';
|
|
|
5
5
|
* @param classesOrModules - Either a flat array of classes or a Map of module-grouped classes
|
|
6
6
|
* @param outputPath - The output path for the generated container file
|
|
7
7
|
*/
|
|
8
|
-
export declare function generateContainerFile(classesOrModules:
|
|
8
|
+
export declare function generateContainerFile(classesOrModules: Map<string, ClassInfo[]>, outputPath: string): void;
|
|
9
9
|
/**
|
|
10
10
|
* Detects circular dependencies in a flat array of classes.
|
|
11
11
|
*
|
|
@@ -15,6 +15,5 @@ export declare function generateContainerFile(classesOrModules: ClassInfo[] | Ma
|
|
|
15
15
|
export declare function detectCircularDependencies(classes: ClassInfo[]): string[][];
|
|
16
16
|
export { ContainerGeneratorFactory } from './container-generator-factory';
|
|
17
17
|
export { BaseContainerGenerator } from './base-container-generator';
|
|
18
|
-
export { FlatContainerGenerator } from './flat/flat-container-generator';
|
|
19
18
|
export { ModularContainerGenerator } from './modular/modular-container-generator';
|
|
20
19
|
//# 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;AAIrC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,
|
|
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,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1G;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,yBAAyB,EAAE,MAAM,uCAAuC,CAAC"}
|
package/dist/generator/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ModularContainerGenerator = exports.
|
|
3
|
+
exports.ModularContainerGenerator = exports.BaseContainerGenerator = exports.ContainerGeneratorFactory = void 0;
|
|
4
4
|
exports.generateContainerFile = generateContainerFile;
|
|
5
5
|
exports.detectCircularDependencies = detectCircularDependencies;
|
|
6
6
|
const dependency_resolver_1 = require("../analyser/dependency-resolver");
|
|
@@ -30,8 +30,6 @@ var container_generator_factory_2 = require("./container-generator-factory");
|
|
|
30
30
|
Object.defineProperty(exports, "ContainerGeneratorFactory", { enumerable: true, get: function () { return container_generator_factory_2.ContainerGeneratorFactory; } });
|
|
31
31
|
var base_container_generator_1 = require("./base-container-generator");
|
|
32
32
|
Object.defineProperty(exports, "BaseContainerGenerator", { enumerable: true, get: function () { return base_container_generator_1.BaseContainerGenerator; } });
|
|
33
|
-
var flat_container_generator_1 = require("./flat/flat-container-generator");
|
|
34
|
-
Object.defineProperty(exports, "FlatContainerGenerator", { enumerable: true, get: function () { return flat_container_generator_1.FlatContainerGenerator; } });
|
|
35
33
|
var modular_container_generator_1 = require("./modular/modular-container-generator");
|
|
36
34
|
Object.defineProperty(exports, "ModularContainerGenerator", { enumerable: true, get: function () { return modular_container_generator_1.ModularContainerGenerator; } });
|
|
37
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,gBAA0C,EAAE,UAAkB;IAClG,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,qFAAkF;AAAzE,wIAAA,yBAAyB,OAAA"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Responsible for aggregating module containers into a single container.
|
|
3
|
-
*/
|
|
4
1
|
export declare class ContainerAggregator {
|
|
5
2
|
/**
|
|
6
3
|
* Generates the aggregated container code.
|
|
@@ -10,9 +7,5 @@ export declare class ContainerAggregator {
|
|
|
10
7
|
* Generates the type export for the container.
|
|
11
8
|
*/
|
|
12
9
|
generateModularTypeExport(): string;
|
|
13
|
-
/**
|
|
14
|
-
* Utility method to convert strings to camelCase.
|
|
15
|
-
*/
|
|
16
|
-
private camelCase;
|
|
17
10
|
}
|
|
18
11
|
//# sourceMappingURL=container-aggregator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-aggregator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/container-aggregator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"container-aggregator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/container-aggregator.ts"],"names":[],"mappings":"AAKA,qBAAa,mBAAmB;IAC9B;;OAEG;IACH,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM;IAI5D;;OAEG;IACH,yBAAyB,IAAI,MAAM;CAGpC"}
|
|
@@ -4,30 +4,19 @@ exports.ContainerAggregator = void 0;
|
|
|
4
4
|
/**
|
|
5
5
|
* Responsible for aggregating module containers into a single container.
|
|
6
6
|
*/
|
|
7
|
+
const shared_1 = require("../shared");
|
|
7
8
|
class ContainerAggregator {
|
|
8
9
|
/**
|
|
9
10
|
* Generates the aggregated container code.
|
|
10
11
|
*/
|
|
11
12
|
generateAggregatedContainer(sortedModules) {
|
|
12
|
-
|
|
13
|
-
for (const moduleName of sortedModules) {
|
|
14
|
-
const moduleVarName = this.camelCase(moduleName) + 'Container';
|
|
15
|
-
const moduleKey = this.camelCase(moduleName);
|
|
16
|
-
moduleExports.push(` ${moduleKey}: ${moduleVarName}`);
|
|
17
|
-
}
|
|
18
|
-
return `export const container = {\n${moduleExports.join(',\n')}\n};`;
|
|
13
|
+
return shared_1.InstantiationUtils.generateAggregatedContainer(sortedModules);
|
|
19
14
|
}
|
|
20
15
|
/**
|
|
21
16
|
* Generates the type export for the container.
|
|
22
17
|
*/
|
|
23
18
|
generateModularTypeExport() {
|
|
24
|
-
return
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Utility method to convert strings to camelCase.
|
|
28
|
-
*/
|
|
29
|
-
camelCase(str) {
|
|
30
|
-
return str.charAt(0).toLowerCase() + str.slice(1).replace(/[^a-zA-Z0-9]/g, '');
|
|
19
|
+
return shared_1.InstantiationUtils.generateModularContainerTypeExport();
|
|
31
20
|
}
|
|
32
21
|
}
|
|
33
22
|
exports.ContainerAggregator = ContainerAggregator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-aggregator.js","sourceRoot":"","sources":["../../../src/generator/modular/container-aggregator.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,mBAAmB;IAC9B;;OAEG;IACH,2BAA2B,CAAC,aAAuB;QACjD,
|
|
1
|
+
{"version":3,"file":"container-aggregator.js","sourceRoot":"","sources":["../../../src/generator/modular/container-aggregator.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,sCAA+C;AAE/C,MAAa,mBAAmB;IAC9B;;OAEG;IACH,2BAA2B,CAAC,aAAuB;QACjD,OAAO,2BAAkB,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,yBAAyB;QACvB,OAAO,2BAAkB,CAAC,kCAAkC,EAAE,CAAC;IACjE,CAAC;CACF;AAdD,kDAcC"}
|
|
@@ -3,6 +3,9 @@ import { ClassInfo } from '../../types';
|
|
|
3
3
|
import { ImportGenerator } from '../import-generator';
|
|
4
4
|
import { BaseContainerGenerator } from '../base-container-generator';
|
|
5
5
|
import { FileWriter } from '../file-writer';
|
|
6
|
+
import { ModuleContainerFunctionGenerator } from './module-container-function-generator';
|
|
7
|
+
import { ModuleInstantiationGenerator } from './module-instantiation-generator';
|
|
8
|
+
import { ContainerAggregator } from './container-aggregator';
|
|
6
9
|
/**
|
|
7
10
|
* Generator for modular container structure.
|
|
8
11
|
* Handles module-based dependency injection with inter-module dependencies.
|
|
@@ -13,7 +16,7 @@ export declare class ModularContainerGenerator extends BaseContainerGenerator {
|
|
|
13
16
|
private moduleContainerFunctionGenerator;
|
|
14
17
|
private moduleInstantiationGenerator;
|
|
15
18
|
private containerAggregator;
|
|
16
|
-
constructor(fileWriter: FileWriter, moduleGroupedClasses: Map<string, ClassInfo[]>, moduleDependencyResolver: ModuleDependencyResolver, importGenerator: ImportGenerator);
|
|
19
|
+
constructor(fileWriter: FileWriter, moduleGroupedClasses: Map<string, ClassInfo[]>, moduleDependencyResolver: ModuleDependencyResolver, importGenerator: ImportGenerator, moduleContainerFunctionGenerator: ModuleContainerFunctionGenerator, moduleInstantiationGenerator: ModuleInstantiationGenerator, containerAggregator: ContainerAggregator);
|
|
17
20
|
generate(): void;
|
|
18
21
|
protected generateContainerCode(sortedModules?: string[], moduleDependencies?: Map<string, Set<string>>): string;
|
|
19
22
|
private generateModuleContainers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modular-container-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/modular-container-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"modular-container-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/modular-container-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IACnE,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,wBAAwB,CAA2B;IAC3D,OAAO,CAAC,gCAAgC,CAAmC;IAC3E,OAAO,CAAC,4BAA4B,CAA+B;IACnE,OAAO,CAAC,mBAAmB,CAAsB;gBAG/C,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAC9C,wBAAwB,EAAE,wBAAwB,EAClD,eAAe,EAAE,eAAe,EAChC,gCAAgC,EAAE,gCAAgC,EAClE,4BAA4B,EAAE,4BAA4B,EAC1D,mBAAmB,EAAE,mBAAmB;IAU1C,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;CAUjC"}
|
|
@@ -3,21 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ModularContainerGenerator = void 0;
|
|
4
4
|
const dependency_resolver_1 = require("../../analyser/dependency-resolver");
|
|
5
5
|
const base_container_generator_1 = require("../base-container-generator");
|
|
6
|
-
const module_container_function_generator_1 = require("./module-container-function-generator");
|
|
7
|
-
const module_instantiation_generator_1 = require("./module-instantiation-generator");
|
|
8
|
-
const container_aggregator_1 = require("./container-aggregator");
|
|
9
6
|
/**
|
|
10
7
|
* Generator for modular container structure.
|
|
11
8
|
* Handles module-based dependency injection with inter-module dependencies.
|
|
12
9
|
*/
|
|
13
10
|
class ModularContainerGenerator extends base_container_generator_1.BaseContainerGenerator {
|
|
14
|
-
constructor(fileWriter, moduleGroupedClasses, moduleDependencyResolver, importGenerator) {
|
|
11
|
+
constructor(fileWriter, moduleGroupedClasses, moduleDependencyResolver, importGenerator, moduleContainerFunctionGenerator, moduleInstantiationGenerator, containerAggregator) {
|
|
15
12
|
super(fileWriter, importGenerator);
|
|
16
13
|
this.moduleGroupedClasses = moduleGroupedClasses;
|
|
17
14
|
this.moduleDependencyResolver = moduleDependencyResolver;
|
|
18
|
-
this.moduleContainerFunctionGenerator =
|
|
19
|
-
this.moduleInstantiationGenerator =
|
|
20
|
-
this.containerAggregator =
|
|
15
|
+
this.moduleContainerFunctionGenerator = moduleContainerFunctionGenerator;
|
|
16
|
+
this.moduleInstantiationGenerator = moduleInstantiationGenerator;
|
|
17
|
+
this.containerAggregator = containerAggregator;
|
|
21
18
|
}
|
|
22
19
|
generate() {
|
|
23
20
|
// First, check for module-level cycles
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modular-container-generator.js","sourceRoot":"","sources":["../../../src/generator/modular/modular-container-generator.ts"],"names":[],"mappings":";;;AAAA,4EAAwE;AAIxE,0EAAqE;
|
|
1
|
+
{"version":3,"file":"modular-container-generator.js","sourceRoot":"","sources":["../../../src/generator/modular/modular-container-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import { ClassInfo } from '../../types';
|
|
2
|
+
import { ModuleFunctionSignatureGenerator } from './module-function-signature-generator';
|
|
3
|
+
import { ModuleDependencyResolver } from './module-dependency-resolver';
|
|
4
|
+
import { ModuleFunctionBodyGenerator } from './module-function-body-generator';
|
|
2
5
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
6
|
+
* Coordinates the generation of module container functions.
|
|
7
|
+
* Delegates specific responsibilities to specialized generators.
|
|
5
8
|
*/
|
|
6
9
|
export declare class ModuleContainerFunctionGenerator {
|
|
7
10
|
private moduleGroupedClasses;
|
|
8
|
-
|
|
11
|
+
private signatureGenerator;
|
|
12
|
+
private dependencyResolver;
|
|
13
|
+
private bodyGenerator;
|
|
14
|
+
private importGenerator;
|
|
15
|
+
constructor(moduleGroupedClasses: Map<string, ClassInfo[]>, signatureGenerator: ModuleFunctionSignatureGenerator, dependencyResolver: ModuleDependencyResolver, bodyGenerator: ModuleFunctionBodyGenerator, importGenerator: any);
|
|
9
16
|
/**
|
|
10
17
|
* Generates container functions for all modules.
|
|
11
18
|
*/
|
|
@@ -14,65 +21,5 @@ export declare class ModuleContainerFunctionGenerator {
|
|
|
14
21
|
* Creates a container function for a specific module.
|
|
15
22
|
*/
|
|
16
23
|
private createModuleContainerFunction;
|
|
17
|
-
/**
|
|
18
|
-
* Generates function parameters for module dependencies.
|
|
19
|
-
*/
|
|
20
|
-
private generateFunctionParameters;
|
|
21
|
-
/**
|
|
22
|
-
* Creates a function signature with parameters.
|
|
23
|
-
*/
|
|
24
|
-
private createFunctionSignature;
|
|
25
|
-
/**
|
|
26
|
-
* Generates the function body for a module container.
|
|
27
|
-
*/
|
|
28
|
-
private generateModuleFunctionBody;
|
|
29
|
-
/**
|
|
30
|
-
* Generates factory functions for transient classes.
|
|
31
|
-
*/
|
|
32
|
-
private generateTransientFactories;
|
|
33
|
-
/**
|
|
34
|
-
* Generates singleton variable declarations.
|
|
35
|
-
*/
|
|
36
|
-
private generateSingletonVariables;
|
|
37
|
-
/**
|
|
38
|
-
* Generates getter functions for singleton classes.
|
|
39
|
-
*/
|
|
40
|
-
private generateSingletonGetters;
|
|
41
|
-
/**
|
|
42
|
-
* Creates a getter function for a singleton class.
|
|
43
|
-
*/
|
|
44
|
-
private createSingletonGetter;
|
|
45
|
-
/**
|
|
46
|
-
* Builds constructor arguments for a class.
|
|
47
|
-
*/
|
|
48
|
-
private buildConstructorArguments;
|
|
49
|
-
/**
|
|
50
|
-
* Resolves a dependency argument.
|
|
51
|
-
*/
|
|
52
|
-
private resolveDependencyArgument;
|
|
53
|
-
/**
|
|
54
|
-
* Finds a dependency from an external module.
|
|
55
|
-
*/
|
|
56
|
-
private findExternalModuleDependency;
|
|
57
|
-
/**
|
|
58
|
-
* Finds a dependency from the same module.
|
|
59
|
-
*/
|
|
60
|
-
private findInternalModuleDependency;
|
|
61
|
-
/**
|
|
62
|
-
* Generates module exports.
|
|
63
|
-
*/
|
|
64
|
-
private generateModuleExports;
|
|
65
|
-
/**
|
|
66
|
-
* Creates a module export getter.
|
|
67
|
-
*/
|
|
68
|
-
private createModuleExportGetter;
|
|
69
|
-
/**
|
|
70
|
-
* Sorts classes by their dependencies.
|
|
71
|
-
*/
|
|
72
|
-
private sortClassesByDependencies;
|
|
73
|
-
/**
|
|
74
|
-
* Utility method to convert strings to camelCase.
|
|
75
|
-
*/
|
|
76
|
-
private camelCase;
|
|
77
24
|
}
|
|
78
25
|
//# sourceMappingURL=module-container-function-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-container-function-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/module-container-function-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"module-container-function-generator.d.ts","sourceRoot":"","sources":["../../../src/generator/modular/module-container-function-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E;;;GAGG;AACH,qBAAa,gCAAgC;IAC3C,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAAM;gBAG3B,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAC9C,kBAAkB,EAAE,gCAAgC,EACpD,kBAAkB,EAAE,wBAAwB,EAC5C,aAAa,EAAE,2BAA2B,EAC1C,eAAe,EAAE,GAAG;IAStB;;OAEG;IACH,gCAAgC,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE;IAcjH;;OAEG;IACH,OAAO,CAAC,6BAA6B;CAYtC"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ModuleContainerFunctionGenerator = void 0;
|
|
4
|
-
const topological_sorter_1 = require("../../utils/topological-sorter");
|
|
5
4
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Coordinates the generation of module container functions.
|
|
6
|
+
* Delegates specific responsibilities to specialized generators.
|
|
8
7
|
*/
|
|
9
8
|
class ModuleContainerFunctionGenerator {
|
|
10
|
-
constructor(moduleGroupedClasses) {
|
|
9
|
+
constructor(moduleGroupedClasses, signatureGenerator, dependencyResolver, bodyGenerator, importGenerator) {
|
|
11
10
|
this.moduleGroupedClasses = moduleGroupedClasses;
|
|
11
|
+
this.signatureGenerator = signatureGenerator;
|
|
12
|
+
this.dependencyResolver = dependencyResolver;
|
|
13
|
+
this.bodyGenerator = bodyGenerator;
|
|
14
|
+
this.importGenerator = importGenerator;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
17
|
* Generates container functions for all modules.
|
|
@@ -30,217 +33,11 @@ class ModuleContainerFunctionGenerator {
|
|
|
30
33
|
createModuleContainerFunction(moduleName, moduleClasses, moduleDependencies) {
|
|
31
34
|
const moduleFunctionName = `create${moduleName}Container`;
|
|
32
35
|
const moduleDeps = moduleDependencies.get(moduleName) || new Set();
|
|
33
|
-
const functionParams = this.generateFunctionParameters(moduleDeps);
|
|
34
|
-
const functionSignature = this.createFunctionSignature(moduleFunctionName, functionParams);
|
|
35
|
-
const functionBody = this.generateModuleFunctionBody(moduleClasses, moduleDeps);
|
|
36
|
+
const functionParams = this.signatureGenerator.generateFunctionParameters(moduleDeps);
|
|
37
|
+
const functionSignature = this.signatureGenerator.createFunctionSignature(moduleFunctionName, functionParams);
|
|
38
|
+
const functionBody = this.bodyGenerator.generateModuleFunctionBody(moduleClasses, moduleDeps, this.importGenerator);
|
|
36
39
|
return `${functionSignature} {\n${functionBody}\n}`;
|
|
37
40
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Generates function parameters for module dependencies.
|
|
40
|
-
*/
|
|
41
|
-
generateFunctionParameters(moduleDeps) {
|
|
42
|
-
const functionParams = [];
|
|
43
|
-
for (const depModule of moduleDeps) {
|
|
44
|
-
const depVarName = this.camelCase(depModule) + 'Container';
|
|
45
|
-
functionParams.push(`${depVarName}: ReturnType<typeof create${depModule}Container>`);
|
|
46
|
-
}
|
|
47
|
-
return functionParams;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Creates a function signature with parameters.
|
|
51
|
-
*/
|
|
52
|
-
createFunctionSignature(functionName, params) {
|
|
53
|
-
return params.length > 0 ?
|
|
54
|
-
`function ${functionName}(${params.join(', ')})` :
|
|
55
|
-
`function ${functionName}()`;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Generates the function body for a module container.
|
|
59
|
-
*/
|
|
60
|
-
generateModuleFunctionBody(moduleClasses, moduleDeps) {
|
|
61
|
-
const factoryFunctions = this.generateTransientFactories(moduleClasses);
|
|
62
|
-
const lazyInitializations = this.generateSingletonVariables(moduleClasses);
|
|
63
|
-
const lazyGetters = this.generateSingletonGetters(moduleClasses, moduleDeps);
|
|
64
|
-
const moduleExports = this.generateModuleExports(moduleClasses);
|
|
65
|
-
const returnObject = moduleExports.length > 0 ?
|
|
66
|
-
` return {\n${moduleExports.join(',\n')}\n };` :
|
|
67
|
-
' return {};';
|
|
68
|
-
return [
|
|
69
|
-
...factoryFunctions,
|
|
70
|
-
'',
|
|
71
|
-
...lazyInitializations,
|
|
72
|
-
'',
|
|
73
|
-
...lazyGetters,
|
|
74
|
-
'',
|
|
75
|
-
returnObject
|
|
76
|
-
].filter(line => line !== '' || factoryFunctions.length > 0 || lazyInitializations.length > 0 || lazyGetters.length > 0).join('\n');
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Generates factory functions for transient classes.
|
|
80
|
-
*/
|
|
81
|
-
generateTransientFactories(moduleClasses) {
|
|
82
|
-
const factoryFunctions = [];
|
|
83
|
-
for (const classInfo of moduleClasses) {
|
|
84
|
-
if (classInfo.scope === 'transient') {
|
|
85
|
-
const instanceName = this.camelCase(classInfo.name);
|
|
86
|
-
const factoryName = `${instanceName}Factory`;
|
|
87
|
-
factoryFunctions.push(` const ${factoryName} = (): ${classInfo.name} => new ${classInfo.name}();`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return factoryFunctions;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Generates singleton variable declarations.
|
|
94
|
-
*/
|
|
95
|
-
generateSingletonVariables(moduleClasses) {
|
|
96
|
-
const singletonClasses = moduleClasses.filter(c => c.scope !== 'transient');
|
|
97
|
-
const sortedSingletons = this.sortClassesByDependencies(singletonClasses, moduleClasses);
|
|
98
|
-
const lazyInitializations = [];
|
|
99
|
-
for (const classInfo of sortedSingletons) {
|
|
100
|
-
const instanceName = this.camelCase(classInfo.name);
|
|
101
|
-
lazyInitializations.push(` let ${instanceName}: ${classInfo.name} | undefined;`);
|
|
102
|
-
}
|
|
103
|
-
return lazyInitializations;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Generates getter functions for singleton classes.
|
|
107
|
-
*/
|
|
108
|
-
generateSingletonGetters(moduleClasses, moduleDeps) {
|
|
109
|
-
const singletonClasses = moduleClasses.filter(c => c.scope !== 'transient');
|
|
110
|
-
const sortedSingletons = this.sortClassesByDependencies(singletonClasses, moduleClasses);
|
|
111
|
-
const lazyGetters = [];
|
|
112
|
-
for (const classInfo of sortedSingletons) {
|
|
113
|
-
const lazyGetter = this.createSingletonGetter(classInfo, moduleClasses, moduleDeps);
|
|
114
|
-
lazyGetters.push(lazyGetter);
|
|
115
|
-
}
|
|
116
|
-
return lazyGetters;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Creates a getter function for a singleton class.
|
|
120
|
-
*/
|
|
121
|
-
createSingletonGetter(classInfo, moduleClasses, moduleDeps) {
|
|
122
|
-
const instanceName = this.camelCase(classInfo.name);
|
|
123
|
-
const getterName = `get${classInfo.name}`;
|
|
124
|
-
const constructorArgs = this.buildConstructorArguments(classInfo, moduleClasses, moduleDeps);
|
|
125
|
-
const instantiation = constructorArgs.length > 0 ?
|
|
126
|
-
`new ${classInfo.name}(${constructorArgs.join(', ')})` :
|
|
127
|
-
`new ${classInfo.name}()`;
|
|
128
|
-
return ` const ${getterName} = (): ${classInfo.name} => {\n if (!${instanceName}) {\n ${instanceName} = ${instantiation};\n }\n return ${instanceName};\n };`;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Builds constructor arguments for a class.
|
|
132
|
-
*/
|
|
133
|
-
buildConstructorArguments(classInfo, moduleClasses, moduleDeps) {
|
|
134
|
-
const constructorArgs = [];
|
|
135
|
-
for (const dep of classInfo.dependencies) {
|
|
136
|
-
const arg = this.resolveDependencyArgument(dep, moduleClasses, moduleDeps);
|
|
137
|
-
if (arg) {
|
|
138
|
-
constructorArgs.push(arg);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return constructorArgs;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Resolves a dependency argument.
|
|
145
|
-
*/
|
|
146
|
-
resolveDependencyArgument(dependency, moduleClasses, moduleDeps) {
|
|
147
|
-
// Check if dependency is from another module
|
|
148
|
-
const externalModuleArg = this.findExternalModuleDependency(dependency, moduleDeps);
|
|
149
|
-
if (externalModuleArg) {
|
|
150
|
-
return externalModuleArg;
|
|
151
|
-
}
|
|
152
|
-
// Check if dependency is from the same module
|
|
153
|
-
return this.findInternalModuleDependency(dependency, moduleClasses);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Finds a dependency from an external module.
|
|
157
|
-
*/
|
|
158
|
-
findExternalModuleDependency(dependency, moduleDeps) {
|
|
159
|
-
for (const depModule of moduleDeps) {
|
|
160
|
-
const depModuleClasses = this.moduleGroupedClasses.get(depModule);
|
|
161
|
-
if (depModuleClasses) {
|
|
162
|
-
const depClass = depModuleClasses.find(c => c.interfaceName === dependency);
|
|
163
|
-
if (depClass) {
|
|
164
|
-
const depModuleVarName = this.camelCase(depModule) + 'Container';
|
|
165
|
-
return `${depModuleVarName}.${dependency}`;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Finds a dependency from the same module.
|
|
173
|
-
*/
|
|
174
|
-
findInternalModuleDependency(dependency, moduleClasses) {
|
|
175
|
-
const depClass = moduleClasses.find(c => c.interfaceName === dependency);
|
|
176
|
-
if (depClass) {
|
|
177
|
-
if (depClass.scope === 'transient') {
|
|
178
|
-
const depInstanceName = this.camelCase(depClass.name);
|
|
179
|
-
return `${depInstanceName}Factory()`;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
const depGetterName = `get${depClass.name}`;
|
|
183
|
-
return `${depGetterName}()`;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return null;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Generates module exports.
|
|
190
|
-
*/
|
|
191
|
-
generateModuleExports(moduleClasses) {
|
|
192
|
-
const moduleExports = [];
|
|
193
|
-
for (const classInfo of moduleClasses) {
|
|
194
|
-
if (classInfo.interfaceName) {
|
|
195
|
-
const exportGetter = this.createModuleExportGetter(classInfo);
|
|
196
|
-
moduleExports.push(exportGetter);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return moduleExports;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Creates a module export getter.
|
|
203
|
-
*/
|
|
204
|
-
createModuleExportGetter(classInfo) {
|
|
205
|
-
const instanceName = this.camelCase(classInfo.name);
|
|
206
|
-
const isTransient = classInfo.scope === 'transient';
|
|
207
|
-
if (isTransient) {
|
|
208
|
-
return ` get ${classInfo.interfaceName}(): ${classInfo.name} {\n return ${instanceName}Factory();\n }`;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
const getterName = `get${classInfo.name}`;
|
|
212
|
-
return ` get ${classInfo.interfaceName}(): ${classInfo.name} {\n return ${getterName}();\n }`;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Sorts classes by their dependencies.
|
|
217
|
-
*/
|
|
218
|
-
sortClassesByDependencies(classes, allModuleClasses) {
|
|
219
|
-
// Build dependency graph for classes within the module
|
|
220
|
-
const dependencyGraph = new Map();
|
|
221
|
-
for (const classInfo of classes) {
|
|
222
|
-
const dependencies = [];
|
|
223
|
-
// Only include dependencies that are within the same module and are singletons
|
|
224
|
-
for (const dep of classInfo.dependencies) {
|
|
225
|
-
const depClass = allModuleClasses.find(c => c.interfaceName === dep && c.scope !== 'transient');
|
|
226
|
-
if (depClass && classes.includes(depClass)) {
|
|
227
|
-
dependencies.push(depClass.name);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
dependencyGraph.set(classInfo.name, dependencies);
|
|
231
|
-
}
|
|
232
|
-
// Use TopologicalSorter to sort the classes
|
|
233
|
-
const sortResult = topological_sorter_1.TopologicalSorter.sort(dependencyGraph);
|
|
234
|
-
// Map sorted class names back to ClassInfo objects
|
|
235
|
-
const classMap = new Map(classes.map(c => [c.name, c]));
|
|
236
|
-
return sortResult.sorted.map(className => classMap.get(className)).filter(Boolean);
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Utility method to convert strings to camelCase.
|
|
240
|
-
*/
|
|
241
|
-
camelCase(str) {
|
|
242
|
-
return str.charAt(0).toLowerCase() + str.slice(1).replace(/[^a-zA-Z0-9]/g, '');
|
|
243
|
-
}
|
|
244
41
|
}
|
|
245
42
|
exports.ModuleContainerFunctionGenerator = ModuleContainerFunctionGenerator;
|
|
246
43
|
//# sourceMappingURL=module-container-function-generator.js.map
|