fragment-ts 1.0.24 ā 1.0.26
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/cli/commands/init.command.js +1 -1
- package/dist/core/container/di-container.d.ts +6 -1
- package/dist/core/container/di-container.d.ts.map +1 -1
- package/dist/core/container/di-container.js +127 -62
- package/dist/core/container/di-container.js.map +1 -1
- package/dist/web/application.d.ts.map +1 -1
- package/dist/web/application.js +16 -7
- package/dist/web/application.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/init.command.ts +1 -1
- package/src/core/container/di-container.ts +160 -81
- package/src/web/application.ts +22 -12
|
@@ -4,12 +4,17 @@ export declare class DIContainer {
|
|
|
4
4
|
private transients;
|
|
5
5
|
private factories;
|
|
6
6
|
private constructing;
|
|
7
|
+
private registered;
|
|
7
8
|
static getInstance(): DIContainer;
|
|
8
9
|
register(token: any, instance?: any, factory?: () => any): void;
|
|
9
10
|
resolve<T>(token: any): T;
|
|
10
11
|
private createInstance;
|
|
11
12
|
private injectProperties;
|
|
12
|
-
private
|
|
13
|
+
private tryInjectAutowired;
|
|
14
|
+
private tryInjectByToken;
|
|
15
|
+
private tryInjectValue;
|
|
16
|
+
private tryInjectRepository;
|
|
17
|
+
private tryInjectLazy;
|
|
13
18
|
private resolveValue;
|
|
14
19
|
private resolveRepository;
|
|
15
20
|
has(token: any): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"di-container.d.ts","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,YAAY,CAAuB;
|
|
1
|
+
{"version":3,"file":"di-container.d.ts","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,UAAU,CAAuB;IAEzC,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,IAAI;IAU/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAoDzB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,iBAAiB;IAiBzB,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAIxB,eAAe,IAAI,GAAG,EAAE;IAIxB,KAAK,IAAI,IAAI;IAQb,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -7,7 +7,8 @@ class DIContainer {
|
|
|
7
7
|
this.singletons = new Map();
|
|
8
8
|
this.transients = new Map();
|
|
9
9
|
this.factories = new Map();
|
|
10
|
-
this.constructing = new Set();
|
|
10
|
+
this.constructing = new Set();
|
|
11
|
+
this.registered = new Set();
|
|
11
12
|
}
|
|
12
13
|
static getInstance() {
|
|
13
14
|
if (!DIContainer.instance) {
|
|
@@ -16,6 +17,7 @@ class DIContainer {
|
|
|
16
17
|
return DIContainer.instance;
|
|
17
18
|
}
|
|
18
19
|
register(token, instance, factory) {
|
|
20
|
+
this.registered.add(token);
|
|
19
21
|
if (instance) {
|
|
20
22
|
this.singletons.set(token, instance);
|
|
21
23
|
}
|
|
@@ -24,15 +26,16 @@ class DIContainer {
|
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
resolve(token) {
|
|
27
|
-
|
|
29
|
+
if (typeof token === "function" && !this.registered.has(token)) {
|
|
30
|
+
throw new Error(`Cannot resolve ${token.name}: Not registered as injectable. ` +
|
|
31
|
+
`Did you forget to add @Injectable(), @Service(), @Controller(), or @Repository()?`);
|
|
32
|
+
}
|
|
28
33
|
if (this.constructing.has(token)) {
|
|
29
34
|
throw new Error(`Circular dependency detected for ${token.name || token}`);
|
|
30
35
|
}
|
|
31
|
-
// Return existing singleton
|
|
32
36
|
if (this.singletons.has(token)) {
|
|
33
37
|
return this.singletons.get(token);
|
|
34
38
|
}
|
|
35
|
-
// Use factory if available
|
|
36
39
|
if (this.factories.has(token)) {
|
|
37
40
|
const factory = this.factories.get(token);
|
|
38
41
|
const instance = factory();
|
|
@@ -42,7 +45,6 @@ class DIContainer {
|
|
|
42
45
|
}
|
|
43
46
|
return instance;
|
|
44
47
|
}
|
|
45
|
-
// Create new instance
|
|
46
48
|
if (typeof token === "function") {
|
|
47
49
|
this.constructing.add(token);
|
|
48
50
|
try {
|
|
@@ -62,76 +64,142 @@ class DIContainer {
|
|
|
62
64
|
throw new Error(`Cannot resolve dependency: ${token}`);
|
|
63
65
|
}
|
|
64
66
|
createInstance(target) {
|
|
65
|
-
|
|
67
|
+
console.log(` šØ Creating instance of ${target.name}`);
|
|
66
68
|
const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
|
|
67
|
-
|
|
68
|
-
const params = paramTypes.map((type) => {
|
|
69
|
+
const params = paramTypes.map((type, index) => {
|
|
69
70
|
if (!type || type === Object) {
|
|
71
|
+
console.warn(` ā ļø Constructor param ${index} of ${target.name} has no type`);
|
|
70
72
|
return undefined;
|
|
71
73
|
}
|
|
74
|
+
console.log(` š¦ Resolving constructor dependency: ${type.name}`);
|
|
72
75
|
return this.resolve(type);
|
|
73
76
|
});
|
|
74
|
-
// Create instance
|
|
75
77
|
const instance = new target(...params);
|
|
76
|
-
// Inject properties
|
|
78
|
+
// CRITICAL: Inject properties
|
|
77
79
|
this.injectProperties(instance);
|
|
78
|
-
// Call
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
// Call @PostConstruct
|
|
81
|
+
const postConstructMethod = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.POST_CONSTRUCT, target);
|
|
82
|
+
if (postConstructMethod && typeof instance[postConstructMethod] === "function") {
|
|
83
|
+
console.log(` šÆ Calling @PostConstruct: ${target.name}.${postConstructMethod}()`);
|
|
84
|
+
instance[postConstructMethod]();
|
|
81
85
|
}
|
|
82
86
|
return instance;
|
|
83
87
|
}
|
|
84
88
|
injectProperties(instance) {
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
instance
|
|
99
|
-
|
|
89
|
+
const constructor = instance.constructor;
|
|
90
|
+
console.log(` š Checking properties for injection on ${constructor.name}`);
|
|
91
|
+
// Start from the instance's direct prototype
|
|
92
|
+
let currentProto = constructor.prototype;
|
|
93
|
+
// Walk up the prototype chain
|
|
94
|
+
while (currentProto && currentProto !== Object.prototype) {
|
|
95
|
+
// Get own property names (not inherited)
|
|
96
|
+
const ownProps = Object.getOwnPropertyNames(currentProto);
|
|
97
|
+
console.log(` š Prototype ${currentProto.constructor?.name || 'Unknown'} has properties: ${ownProps.filter(p => p !== 'constructor').join(', ') || 'none'}`);
|
|
98
|
+
for (const prop of ownProps) {
|
|
99
|
+
if (prop === "constructor")
|
|
100
|
+
continue;
|
|
101
|
+
// Check each injection type
|
|
102
|
+
this.tryInjectAutowired(instance, currentProto, prop, constructor.name);
|
|
103
|
+
this.tryInjectByToken(instance, currentProto, prop, constructor.name);
|
|
104
|
+
this.tryInjectValue(instance, currentProto, prop, constructor.name);
|
|
105
|
+
this.tryInjectRepository(instance, currentProto, prop, constructor.name);
|
|
106
|
+
this.tryInjectLazy(instance, currentProto, prop, constructor.name);
|
|
100
107
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
108
|
+
currentProto = Object.getPrototypeOf(currentProto);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
tryInjectAutowired(instance, proto, prop, className) {
|
|
112
|
+
const type = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.AUTOWIRED, proto, prop);
|
|
113
|
+
if (!type)
|
|
114
|
+
return;
|
|
115
|
+
console.log(` š @Autowired found: ${className}.${prop} -> ${type.name}`);
|
|
116
|
+
const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, proto, prop);
|
|
117
|
+
try {
|
|
118
|
+
instance[prop] = this.resolve(type);
|
|
119
|
+
console.log(` ā
Injected ${type.name} into ${className}.${prop}`);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (!isOptional) {
|
|
123
|
+
throw new Error(`Failed to autowire ${type.name} into ${className}.${prop}: ${error}`);
|
|
106
124
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
125
|
+
console.warn(` ā ļø Optional dependency ${type.name} not available for ${className}.${prop}`);
|
|
126
|
+
instance[prop] = undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
tryInjectByToken(instance, proto, prop, className) {
|
|
130
|
+
const token = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT, proto, prop);
|
|
131
|
+
if (!token)
|
|
132
|
+
return;
|
|
133
|
+
const tokenName = typeof token === 'string' ? token : token.name;
|
|
134
|
+
console.log(` š @Inject found: ${className}.${prop} -> ${tokenName}`);
|
|
135
|
+
const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, proto, prop);
|
|
136
|
+
try {
|
|
137
|
+
instance[prop] = this.resolve(token);
|
|
138
|
+
console.log(` ā
Injected ${tokenName} into ${className}.${prop}`);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (!isOptional) {
|
|
142
|
+
throw new Error(`Failed to inject ${tokenName} into ${className}.${prop}: ${error}`);
|
|
112
143
|
}
|
|
113
|
-
|
|
144
|
+
console.warn(` ā ļø Optional dependency ${tokenName} not available for ${className}.${prop}`);
|
|
145
|
+
instance[prop] = undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
tryInjectValue(instance, proto, prop, className) {
|
|
149
|
+
const expression = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.VALUE, proto, prop);
|
|
150
|
+
if (expression === undefined)
|
|
151
|
+
return;
|
|
152
|
+
console.log(` š§ @Value found: ${className}.${prop} = ${expression}`);
|
|
153
|
+
instance[prop] = this.resolveValue(expression);
|
|
154
|
+
console.log(` ā
Set value for ${className}.${prop}`);
|
|
114
155
|
}
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
156
|
+
tryInjectRepository(instance, proto, prop, className) {
|
|
157
|
+
const entity = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT_REPOSITORY, proto, prop);
|
|
158
|
+
if (!entity)
|
|
159
|
+
return;
|
|
160
|
+
console.log(` š¾ @InjectRepository found: ${className}.${prop} -> Repository<${entity.name}>`);
|
|
161
|
+
try {
|
|
162
|
+
instance[prop] = this.resolveRepository(entity);
|
|
163
|
+
console.log(` ā
Injected Repository<${entity.name}> into ${className}.${prop}`);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw new Error(`Failed to inject repository for ${entity.name} into ${className}.${prop}: ${error}`);
|
|
121
167
|
}
|
|
122
|
-
|
|
168
|
+
}
|
|
169
|
+
tryInjectLazy(instance, proto, prop, className) {
|
|
170
|
+
const isLazy = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.LAZY, proto, prop);
|
|
171
|
+
if (!isLazy)
|
|
172
|
+
return;
|
|
173
|
+
const type = Reflect.getMetadata("design:type", proto, prop);
|
|
174
|
+
console.log(` ā³ @Lazy found: ${className}.${prop} (${type?.name || 'unknown'})`);
|
|
175
|
+
let cached = null;
|
|
176
|
+
let resolved = false;
|
|
177
|
+
Object.defineProperty(instance, prop, {
|
|
178
|
+
get: () => {
|
|
179
|
+
if (!resolved) {
|
|
180
|
+
console.log(` š Lazy-loading ${type.name} for ${className}.${prop}`);
|
|
181
|
+
cached = this.resolve(type);
|
|
182
|
+
resolved = true;
|
|
183
|
+
}
|
|
184
|
+
return cached;
|
|
185
|
+
},
|
|
186
|
+
enumerable: true,
|
|
187
|
+
configurable: true,
|
|
188
|
+
});
|
|
123
189
|
}
|
|
124
190
|
resolveValue(expression) {
|
|
125
|
-
|
|
126
|
-
const match = expression.match(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/i);
|
|
191
|
+
const match = expression.match(/\$\{([^:}]+)(?::([^}]*))?\}|\$([A-Z_][A-Z0-9_]*)/i);
|
|
127
192
|
if (match) {
|
|
128
|
-
const key = match[1] || match[
|
|
193
|
+
const key = match[1] || match[3];
|
|
194
|
+
const defaultValue = match[2];
|
|
129
195
|
const value = process.env[key];
|
|
130
196
|
if (value === undefined) {
|
|
131
|
-
|
|
197
|
+
if (defaultValue !== undefined) {
|
|
198
|
+
return defaultValue;
|
|
199
|
+
}
|
|
200
|
+
console.warn(` ā ļø Environment variable "${key}" not defined`);
|
|
132
201
|
return "";
|
|
133
202
|
}
|
|
134
|
-
// Try to parse as JSON for complex types
|
|
135
203
|
if (value.startsWith("{") || value.startsWith("[")) {
|
|
136
204
|
try {
|
|
137
205
|
return JSON.parse(value);
|
|
@@ -140,11 +208,9 @@ class DIContainer {
|
|
|
140
208
|
return value;
|
|
141
209
|
}
|
|
142
210
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return parseInt(value, 10);
|
|
211
|
+
if (/^\d+(\.\d+)?$/.test(value)) {
|
|
212
|
+
return parseFloat(value);
|
|
146
213
|
}
|
|
147
|
-
// Parse booleans
|
|
148
214
|
if (value.toLowerCase() === "true")
|
|
149
215
|
return true;
|
|
150
216
|
if (value.toLowerCase() === "false")
|
|
@@ -155,20 +221,19 @@ class DIContainer {
|
|
|
155
221
|
}
|
|
156
222
|
resolveRepository(entity) {
|
|
157
223
|
try {
|
|
158
|
-
// Import TypeORM module dynamically to avoid circular dependencies
|
|
159
224
|
const { TypeORMModule } = require("../../typeorm/typeorm-module");
|
|
160
225
|
const dataSource = TypeORMModule.getDataSource();
|
|
226
|
+
if (!dataSource || !dataSource.isInitialized) {
|
|
227
|
+
throw new Error("TypeORM DataSource not initialized");
|
|
228
|
+
}
|
|
161
229
|
return dataSource.getRepository(entity);
|
|
162
230
|
}
|
|
163
231
|
catch (error) {
|
|
164
|
-
throw new Error(`Failed to resolve repository for
|
|
165
|
-
`Make sure TypeORM is initialized before using @InjectRepository.`);
|
|
232
|
+
throw new Error(`Failed to resolve repository for ${entity.name}: ${error?.message}`);
|
|
166
233
|
}
|
|
167
234
|
}
|
|
168
235
|
has(token) {
|
|
169
|
-
return
|
|
170
|
-
this.factories.has(token) ||
|
|
171
|
-
typeof token === "function");
|
|
236
|
+
return this.registered.has(token);
|
|
172
237
|
}
|
|
173
238
|
getAllInstances() {
|
|
174
239
|
return Array.from(this.singletons.values());
|
|
@@ -178,8 +243,8 @@ class DIContainer {
|
|
|
178
243
|
this.transients.clear();
|
|
179
244
|
this.factories.clear();
|
|
180
245
|
this.constructing.clear();
|
|
246
|
+
this.registered.clear();
|
|
181
247
|
}
|
|
182
|
-
// For testing purposes
|
|
183
248
|
reset() {
|
|
184
249
|
this.clear();
|
|
185
250
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"di-container.js","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":";;;AAAA,6DAA0D;AAG1D,MAAa,WAAW;IAAxB;QAEU,eAAU,GAAkB,IAAI,GAAG,EAAE,CAAC;QACtC,eAAU,GAAkB,IAAI,GAAG,EAAE,CAAC;QACtC,cAAS,GAAwB,IAAI,GAAG,EAAE,CAAC;QAC3C,iBAAY,GAAa,IAAI,GAAG,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"di-container.js","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/web/application.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAY5E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,eAAe,CAAkB;;IAUzC,OAAO,CAAC,eAAe;IAQjB,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7C;;OAEG;YACW,cAAc;IAqB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,6BAA6B;
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/web/application.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAY5E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,eAAe,CAAkB;;IAUzC,OAAO,CAAC,eAAe;IAQjB,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7C;;OAEG;YACW,cAAc;IAqB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,6BAA6B;IAgDrC,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;IA+DtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAapB,aAAa,IAAI,OAAO;CAGzB"}
|
package/dist/web/application.js
CHANGED
|
@@ -134,30 +134,39 @@ class FragmentWebApplication {
|
|
|
134
134
|
}
|
|
135
135
|
discoverAndRegisterComponents() {
|
|
136
136
|
const classes = this.metadataStorage.getAllClasses();
|
|
137
|
-
|
|
137
|
+
console.log(`\nš¦ Discovered ${classes.length} component(s)`);
|
|
138
|
+
// Group by type for display
|
|
138
139
|
const grouped = classes.reduce((acc, cls) => {
|
|
139
140
|
if (!acc[cls.type])
|
|
140
141
|
acc[cls.type] = [];
|
|
141
142
|
acc[cls.type].push(cls);
|
|
142
143
|
return acc;
|
|
143
144
|
}, {});
|
|
144
|
-
const total = classes.length;
|
|
145
|
-
const registered = classes.filter((m) => this.shouldRegister(m.target)).length;
|
|
146
|
-
console.log(`\nš¦ Discovered ${total} component(s)`);
|
|
147
145
|
Object.entries(grouped).forEach(([type, items]) => {
|
|
148
146
|
const icon = this.getTypeIcon(type);
|
|
149
147
|
console.log(` ${icon} ${items.length} ${type}(s)`);
|
|
150
148
|
});
|
|
151
|
-
let
|
|
149
|
+
let registered = 0;
|
|
150
|
+
let skipped = 0;
|
|
152
151
|
classes.forEach((metadata) => {
|
|
153
152
|
if (this.shouldRegister(metadata.target)) {
|
|
153
|
+
// CRITICAL: Register with container
|
|
154
154
|
if (!this.container.has(metadata.target)) {
|
|
155
155
|
this.container.register(metadata.target);
|
|
156
|
-
|
|
156
|
+
registered++;
|
|
157
|
+
console.log(` ā Registered: ${metadata.target.name}`);
|
|
157
158
|
}
|
|
158
159
|
}
|
|
160
|
+
else {
|
|
161
|
+
skipped++;
|
|
162
|
+
console.log(` ā Skipped: ${metadata.target.name} (conditional check failed)`);
|
|
163
|
+
}
|
|
159
164
|
});
|
|
160
|
-
console.log(
|
|
165
|
+
console.log(`\n ā Registered ${registered}/${classes.length} component(s)`);
|
|
166
|
+
if (skipped > 0) {
|
|
167
|
+
console.log(` ā Skipped ${skipped} (conditions not met)`);
|
|
168
|
+
}
|
|
169
|
+
console.log("");
|
|
161
170
|
}
|
|
162
171
|
getTypeIcon(type) {
|
|
163
172
|
const icons = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/web/application.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA4E;AAC5E,oDAA4B;AAC5B,gDAAwB;AACxB,8DAAsC;AACtC,uCAAyB;AACzB,2CAA6B;AAC7B,iEAA6D;AAC7D,wEAAoE;AACpE,kEAA+D;AAC/D,yEAAqE;AACrE,8DAA0D;AAE1D,MAAa,sBAAsB;IAKjC;QACE,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,0BAAW,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,kCAAe,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/web/application.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA4E;AAC5E,oDAA4B;AAC5B,gDAAwB;AACxB,8DAAsC;AACtC,uCAAyB;AACzB,2CAA6B;AAC7B,iEAA6D;AAC7D,wEAAoE;AACpE,kEAA+D;AAC/D,yEAAqE;AACrE,8DAA0D;AAE1D,MAAa,sBAAsB;IAKjC;QACE,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,0BAAW,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,kCAAe,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC;IACP,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,GAAE,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAA,qBAAW,GAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAa;QAC3B,MAAM,8BAAa,CAAC,UAAU,EAAE,CAAC;QAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CACrC,6BAAa,CAAC,WAAW,EACzB,QAAQ,CACT,CAAC;QAEF,oDAAoD;QACpD,oCAAoC;QACpC,IAAI,WAAW,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,6BAA6B,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,MAAM,IAAI,GAAG,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC;QACvC,MAAM,IAAI,GAAG,WAAW,EAAE,IAAI,IAAI,SAAS,CAAC;QAE5C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAEvD,6EAA6E;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE7C,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,iDAAiD;YACjD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,MAAM,oCAAgB,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,MAAM,oCAAgB,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,4CAA4C;QAC5C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEzC,IACE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxB,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC9B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC1B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yCAAyC;QACzC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,6BAA6B;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;QAE9D,4BAA4B;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACvC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA2B,CAC5B,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3B,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,oCAAoC;gBACpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACzC,UAAU,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,iBAAiB,QAAQ,CAAC,MAAM,CAAC,IAAI,6BAA6B,CACnE,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,qBAAqB,UAAU,IAAI,OAAO,CAAC,MAAM,eAAe,CACjE,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,uBAAuB,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,MAAM,KAAK,GAA2B;YACpC,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,oBAAoB,EAAE,IAAI;SAC3B,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC7B,CAAC;IAEO,cAAc,CAAC,MAAW;QAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAC1C,6BAAa,CAAC,oBAAoB,EAClC,MAAM,CACP,CAAC;QACF,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAChD,6BAAa,CAAC,2BAA2B,EACzC,MAAM,CACP,CAAC;QACF,IAAI,sBAAsB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAC7C,6BAAa,CAAC,uBAAuB,EACrC,MAAM,CACP,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACnD,IACE,mBAAmB,CAAC,aAAa,KAAK,SAAS;gBAC/C,KAAK,KAAK,mBAAmB,CAAC,aAAa,EAC3C,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CAAC,QAAa;QACpC,IAAI,CAAC;YACH,OAAO,OAAO,QAAQ,KAAK,UAAU,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe;aACrC,aAAa,EAAE;aACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAE1C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAE5C,WAAW,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,EAAE;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe;iBACjC,aAAa,EAAE;iBACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAEzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;gBAEvC,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;oBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;oBACpE,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBACpD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;oBAElD,OAAO,CAAC,GAAG,CACT,SAAS,UAAU,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,QAAQ,EAAE,CAC7F,CAAC;oBACF,WAAW,EAAE,CAAC;oBAEb,IAAI,CAAC,GAAW,CAAC,UAAU,CAAC,CAC3B,QAAQ,EACR,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;wBACxD,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CACvC,cAAc,EACd,GAAG,EACH,GAAG,CACJ,CAAC;4BACF,MAAM,MAAM,GAAG,MAAO,UAAkB,CACtC,cAAc,CAAC,WAAW,CAC3B,CAAC,GAAG,IAAI,CAAC,CAAC;4BACX,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gCACrB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BACnB,CAAC;wBACH,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,IAAI,CAAC,KAAK,CAAC,CAAC;wBACd,CAAC;oBACH,CAAC,CACF,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,aAAa,CAAC,CAAC;IAC3D,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,MAAM,MAAM,GAA2B;YACrC,GAAG,EAAE,UAAU,EAAE,QAAQ;YACzB,IAAI,EAAE,UAAU,EAAE,SAAS;YAC3B,GAAG,EAAE,UAAU,EAAE,OAAO;YACxB,MAAM,EAAE,UAAU,EAAE,MAAM;YAC1B,KAAK,EAAE,UAAU,EAAE,UAAU;SAC9B,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,gBAAgB;IACvD,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,KAAK,GAA2B;YACpC,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,GAAG;YACT,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAC9B,CAAC;IAEO,uBAAuB,CAC7B,cAAmB,EACnB,GAAY,EACZ,GAAa;QAEb,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAC9C,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CACtC,CAAC;QAEF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;YAC/B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,MAAM;oBACT,OAAO,GAAG,CAAC,IAAI,CAAC;gBAClB,KAAK,OAAO;oBACV,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;gBACpE,KAAK,OAAO;oBACV,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;gBAClE,KAAK,QAAQ;oBACX,OAAO,KAAK,CAAC,SAAS;wBACpB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;wBAC5C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;gBAClB,KAAK,KAAK;oBACR,OAAO,GAAG,CAAC;gBACb,KAAK,KAAK;oBACR,OAAO,GAAG,CAAC;gBACb;oBACE,OAAO,SAAS,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAEO,YAAY,CAClB,GAAU,EACV,GAAY,EACZ,GAAa,EACb,IAAkB;QAElB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AA7VD,wDA6VC"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,8 @@ export class DIContainer {
|
|
|
6
6
|
private singletons: Map<any, any> = new Map();
|
|
7
7
|
private transients: Map<any, any> = new Map();
|
|
8
8
|
private factories: Map<any, () => any> = new Map();
|
|
9
|
-
private constructing: Set<any> = new Set();
|
|
9
|
+
private constructing: Set<any> = new Set();
|
|
10
|
+
private registered: Set<any> = new Set();
|
|
10
11
|
|
|
11
12
|
static getInstance(): DIContainer {
|
|
12
13
|
if (!DIContainer.instance) {
|
|
@@ -16,6 +17,8 @@ export class DIContainer {
|
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
register(token: any, instance?: any, factory?: () => any): void {
|
|
20
|
+
this.registered.add(token);
|
|
21
|
+
|
|
19
22
|
if (instance) {
|
|
20
23
|
this.singletons.set(token, instance);
|
|
21
24
|
} else if (factory) {
|
|
@@ -24,24 +27,27 @@ export class DIContainer {
|
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
resolve<T>(token: any): T {
|
|
27
|
-
|
|
30
|
+
if (typeof token === "function" && !this.registered.has(token)) {
|
|
31
|
+
throw new Error(
|
|
32
|
+
`Cannot resolve ${token.name}: Not registered as injectable. ` +
|
|
33
|
+
`Did you forget to add @Injectable(), @Service(), @Controller(), or @Repository()?`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
28
37
|
if (this.constructing.has(token)) {
|
|
29
38
|
throw new Error(
|
|
30
|
-
`Circular dependency detected for ${token.name || token}
|
|
39
|
+
`Circular dependency detected for ${token.name || token}`
|
|
31
40
|
);
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
// Return existing singleton
|
|
35
43
|
if (this.singletons.has(token)) {
|
|
36
44
|
return this.singletons.get(token);
|
|
37
45
|
}
|
|
38
46
|
|
|
39
|
-
// Use factory if available
|
|
40
47
|
if (this.factories.has(token)) {
|
|
41
48
|
const factory = this.factories.get(token)!;
|
|
42
49
|
const instance = factory();
|
|
43
|
-
const scope =
|
|
44
|
-
Reflect.getMetadata(METADATA_KEYS.SCOPE, token) || "singleton";
|
|
50
|
+
const scope = Reflect.getMetadata(METADATA_KEYS.SCOPE, token) || "singleton";
|
|
45
51
|
|
|
46
52
|
if (scope === "singleton") {
|
|
47
53
|
this.singletons.set(token, instance);
|
|
@@ -50,14 +56,12 @@ export class DIContainer {
|
|
|
50
56
|
return instance;
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
// Create new instance
|
|
54
59
|
if (typeof token === "function") {
|
|
55
60
|
this.constructing.add(token);
|
|
56
61
|
|
|
57
62
|
try {
|
|
58
63
|
const instance = this.createInstance(token);
|
|
59
|
-
const scope =
|
|
60
|
-
Reflect.getMetadata(METADATA_KEYS.SCOPE, token) || "singleton";
|
|
64
|
+
const scope = Reflect.getMetadata(METADATA_KEYS.SCOPE, token) || "singleton";
|
|
61
65
|
|
|
62
66
|
if (scope === "singleton") {
|
|
63
67
|
this.singletons.set(token, instance);
|
|
@@ -75,103 +79,181 @@ export class DIContainer {
|
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
private createInstance(target: any): any {
|
|
78
|
-
|
|
82
|
+
console.log(` šØ Creating instance of ${target.name}`);
|
|
83
|
+
|
|
79
84
|
const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
|
|
80
85
|
|
|
81
|
-
|
|
82
|
-
const params = paramTypes.map((type: any) => {
|
|
86
|
+
const params = paramTypes.map((type: any, index: number) => {
|
|
83
87
|
if (!type || type === Object) {
|
|
88
|
+
console.warn(` ā ļø Constructor param ${index} of ${target.name} has no type`);
|
|
84
89
|
return undefined;
|
|
85
90
|
}
|
|
91
|
+
console.log(` š¦ Resolving constructor dependency: ${type.name}`);
|
|
86
92
|
return this.resolve(type);
|
|
87
93
|
});
|
|
88
94
|
|
|
89
|
-
// Create instance
|
|
90
95
|
const instance = new target(...params);
|
|
91
96
|
|
|
92
|
-
// Inject properties
|
|
97
|
+
// CRITICAL: Inject properties
|
|
93
98
|
this.injectProperties(instance);
|
|
94
99
|
|
|
95
|
-
// Call
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
// Call @PostConstruct
|
|
101
|
+
const postConstructMethod = Reflect.getMetadata(
|
|
102
|
+
METADATA_KEYS.POST_CONSTRUCT,
|
|
103
|
+
target
|
|
104
|
+
);
|
|
105
|
+
if (postConstructMethod && typeof instance[postConstructMethod] === "function") {
|
|
106
|
+
console.log(` šÆ Calling @PostConstruct: ${target.name}.${postConstructMethod}()`);
|
|
107
|
+
instance[postConstructMethod]();
|
|
98
108
|
}
|
|
99
109
|
|
|
100
110
|
return instance;
|
|
101
111
|
}
|
|
102
112
|
|
|
103
113
|
private injectProperties(instance: any): void {
|
|
104
|
-
const
|
|
114
|
+
const constructor = instance.constructor;
|
|
115
|
+
|
|
116
|
+
console.log(` š Checking properties for injection on ${constructor.name}`);
|
|
117
|
+
|
|
118
|
+
// Start from the instance's direct prototype
|
|
119
|
+
let currentProto = constructor.prototype;
|
|
120
|
+
|
|
121
|
+
// Walk up the prototype chain
|
|
122
|
+
while (currentProto && currentProto !== Object.prototype) {
|
|
123
|
+
// Get own property names (not inherited)
|
|
124
|
+
const ownProps = Object.getOwnPropertyNames(currentProto);
|
|
125
|
+
|
|
126
|
+
console.log(` š Prototype ${currentProto.constructor?.name || 'Unknown'} has properties: ${ownProps.filter(p => p !== 'constructor').join(', ') || 'none'}`);
|
|
127
|
+
|
|
128
|
+
for (const prop of ownProps) {
|
|
129
|
+
if (prop === "constructor") continue;
|
|
130
|
+
|
|
131
|
+
// Check each injection type
|
|
132
|
+
this.tryInjectAutowired(instance, currentProto, prop, constructor.name);
|
|
133
|
+
this.tryInjectByToken(instance, currentProto, prop, constructor.name);
|
|
134
|
+
this.tryInjectValue(instance, currentProto, prop, constructor.name);
|
|
135
|
+
this.tryInjectRepository(instance, currentProto, prop, constructor.name);
|
|
136
|
+
this.tryInjectLazy(instance, currentProto, prop, constructor.name);
|
|
137
|
+
}
|
|
105
138
|
|
|
106
|
-
|
|
107
|
-
|
|
139
|
+
currentProto = Object.getPrototypeOf(currentProto);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
108
142
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
prototype,
|
|
114
|
-
prop,
|
|
115
|
-
);
|
|
116
|
-
if (autowired) {
|
|
117
|
-
instance[prop] = this.resolve(autowired);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
143
|
+
private tryInjectAutowired(instance: any, proto: any, prop: string, className: string): void {
|
|
144
|
+
const type = Reflect.getMetadata(METADATA_KEYS.AUTOWIRED, proto, prop);
|
|
145
|
+
|
|
146
|
+
if (!type) return;
|
|
120
147
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
instance[prop] = this.resolve(inject);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
148
|
+
console.log(` š @Autowired found: ${className}.${prop} -> ${type.name}`);
|
|
149
|
+
|
|
150
|
+
const isOptional = Reflect.getMetadata(METADATA_KEYS.OPTIONAL, proto, prop);
|
|
127
151
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
152
|
+
try {
|
|
153
|
+
instance[prop] = this.resolve(type);
|
|
154
|
+
console.log(` ā
Injected ${type.name} into ${className}.${prop}`);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
if (!isOptional) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`Failed to autowire ${type.name} into ${className}.${prop}: ${error}`
|
|
159
|
+
);
|
|
133
160
|
}
|
|
161
|
+
console.warn(` ā ļø Optional dependency ${type.name} not available for ${className}.${prop}`);
|
|
162
|
+
instance[prop] = undefined;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
134
165
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
166
|
+
private tryInjectByToken(instance: any, proto: any, prop: string, className: string): void {
|
|
167
|
+
const token = Reflect.getMetadata(METADATA_KEYS.INJECT, proto, prop);
|
|
168
|
+
|
|
169
|
+
if (!token) return;
|
|
170
|
+
|
|
171
|
+
const tokenName = typeof token === 'string' ? token : token.name;
|
|
172
|
+
console.log(` š @Inject found: ${className}.${prop} -> ${tokenName}`);
|
|
173
|
+
|
|
174
|
+
const isOptional = Reflect.getMetadata(METADATA_KEYS.OPTIONAL, proto, prop);
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
instance[prop] = this.resolve(token);
|
|
178
|
+
console.log(` ā
Injected ${tokenName} into ${className}.${prop}`);
|
|
179
|
+
} catch (error) {
|
|
180
|
+
if (!isOptional) {
|
|
181
|
+
throw new Error(
|
|
182
|
+
`Failed to inject ${tokenName} into ${className}.${prop}: ${error}`
|
|
183
|
+
);
|
|
144
184
|
}
|
|
145
|
-
|
|
185
|
+
console.warn(` ā ļø Optional dependency ${tokenName} not available for ${className}.${prop}`);
|
|
186
|
+
instance[prop] = undefined;
|
|
187
|
+
}
|
|
146
188
|
}
|
|
147
189
|
|
|
148
|
-
private
|
|
149
|
-
const
|
|
150
|
-
|
|
190
|
+
private tryInjectValue(instance: any, proto: any, prop: string, className: string): void {
|
|
191
|
+
const expression = Reflect.getMetadata(METADATA_KEYS.VALUE, proto, prop);
|
|
192
|
+
|
|
193
|
+
if (expression === undefined) return;
|
|
151
194
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
195
|
+
console.log(` š§ @Value found: ${className}.${prop} = ${expression}`);
|
|
196
|
+
instance[prop] = this.resolveValue(expression);
|
|
197
|
+
console.log(` ā
Set value for ${className}.${prop}`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private tryInjectRepository(instance: any, proto: any, prop: string, className: string): void {
|
|
201
|
+
const entity = Reflect.getMetadata(METADATA_KEYS.INJECT_REPOSITORY, proto, prop);
|
|
202
|
+
|
|
203
|
+
if (!entity) return;
|
|
204
|
+
|
|
205
|
+
console.log(` š¾ @InjectRepository found: ${className}.${prop} -> Repository<${entity.name}>`);
|
|
206
|
+
|
|
207
|
+
try {
|
|
208
|
+
instance[prop] = this.resolveRepository(entity);
|
|
209
|
+
console.log(` ā
Injected Repository<${entity.name}> into ${className}.${prop}`);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
`Failed to inject repository for ${entity.name} into ${className}.${prop}: ${error}`
|
|
213
|
+
);
|
|
155
214
|
}
|
|
215
|
+
}
|
|
156
216
|
|
|
157
|
-
|
|
217
|
+
private tryInjectLazy(instance: any, proto: any, prop: string, className: string): void {
|
|
218
|
+
const isLazy = Reflect.getMetadata(METADATA_KEYS.LAZY, proto, prop);
|
|
219
|
+
|
|
220
|
+
if (!isLazy) return;
|
|
221
|
+
|
|
222
|
+
const type = Reflect.getMetadata("design:type", proto, prop);
|
|
223
|
+
console.log(` ā³ @Lazy found: ${className}.${prop} (${type?.name || 'unknown'})`);
|
|
224
|
+
|
|
225
|
+
let cached: any = null;
|
|
226
|
+
let resolved = false;
|
|
227
|
+
|
|
228
|
+
Object.defineProperty(instance, prop, {
|
|
229
|
+
get: () => {
|
|
230
|
+
if (!resolved) {
|
|
231
|
+
console.log(` š Lazy-loading ${type.name} for ${className}.${prop}`);
|
|
232
|
+
cached = this.resolve(type);
|
|
233
|
+
resolved = true;
|
|
234
|
+
}
|
|
235
|
+
return cached;
|
|
236
|
+
},
|
|
237
|
+
enumerable: true,
|
|
238
|
+
configurable: true,
|
|
239
|
+
});
|
|
158
240
|
}
|
|
159
241
|
|
|
160
242
|
private resolveValue(expression: string): any {
|
|
161
|
-
|
|
162
|
-
const match = expression.match(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/i);
|
|
243
|
+
const match = expression.match(/\$\{([^:}]+)(?::([^}]*))?\}|\$([A-Z_][A-Z0-9_]*)/i);
|
|
163
244
|
if (match) {
|
|
164
|
-
const key = match[1] || match[
|
|
245
|
+
const key = match[1] || match[3];
|
|
246
|
+
const defaultValue = match[2];
|
|
165
247
|
const value = process.env[key];
|
|
166
248
|
|
|
167
249
|
if (value === undefined) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
250
|
+
if (defaultValue !== undefined) {
|
|
251
|
+
return defaultValue;
|
|
252
|
+
}
|
|
253
|
+
console.warn(` ā ļø Environment variable "${key}" not defined`);
|
|
171
254
|
return "";
|
|
172
255
|
}
|
|
173
256
|
|
|
174
|
-
// Try to parse as JSON for complex types
|
|
175
257
|
if (value.startsWith("{") || value.startsWith("[")) {
|
|
176
258
|
try {
|
|
177
259
|
return JSON.parse(value);
|
|
@@ -180,12 +262,10 @@ export class DIContainer {
|
|
|
180
262
|
}
|
|
181
263
|
}
|
|
182
264
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return parseInt(value, 10);
|
|
265
|
+
if (/^\d+(\.\d+)?$/.test(value)) {
|
|
266
|
+
return parseFloat(value);
|
|
186
267
|
}
|
|
187
268
|
|
|
188
|
-
// Parse booleans
|
|
189
269
|
if (value.toLowerCase() === "true") return true;
|
|
190
270
|
if (value.toLowerCase() === "false") return false;
|
|
191
271
|
|
|
@@ -197,24 +277,23 @@ export class DIContainer {
|
|
|
197
277
|
|
|
198
278
|
private resolveRepository(entity: any): any {
|
|
199
279
|
try {
|
|
200
|
-
// Import TypeORM module dynamically to avoid circular dependencies
|
|
201
280
|
const { TypeORMModule } = require("../../typeorm/typeorm-module");
|
|
202
281
|
const dataSource = TypeORMModule.getDataSource();
|
|
282
|
+
|
|
283
|
+
if (!dataSource || !dataSource.isInitialized) {
|
|
284
|
+
throw new Error("TypeORM DataSource not initialized");
|
|
285
|
+
}
|
|
286
|
+
|
|
203
287
|
return dataSource.getRepository(entity);
|
|
204
288
|
} catch (error) {
|
|
205
289
|
throw new Error(
|
|
206
|
-
`Failed to resolve repository for
|
|
207
|
-
`Make sure TypeORM is initialized before using @InjectRepository.`,
|
|
290
|
+
`Failed to resolve repository for ${entity.name}: ${(error as Error)?.message}`
|
|
208
291
|
);
|
|
209
292
|
}
|
|
210
293
|
}
|
|
211
294
|
|
|
212
295
|
has(token: any): boolean {
|
|
213
|
-
return (
|
|
214
|
-
this.singletons.has(token) ||
|
|
215
|
-
this.factories.has(token) ||
|
|
216
|
-
typeof token === "function"
|
|
217
|
-
);
|
|
296
|
+
return this.registered.has(token);
|
|
218
297
|
}
|
|
219
298
|
|
|
220
299
|
getAllInstances(): any[] {
|
|
@@ -226,10 +305,10 @@ export class DIContainer {
|
|
|
226
305
|
this.transients.clear();
|
|
227
306
|
this.factories.clear();
|
|
228
307
|
this.constructing.clear();
|
|
308
|
+
this.registered.clear();
|
|
229
309
|
}
|
|
230
310
|
|
|
231
|
-
// For testing purposes
|
|
232
311
|
reset(): void {
|
|
233
312
|
this.clear();
|
|
234
313
|
}
|
|
235
|
-
}
|
|
314
|
+
}
|
package/src/web/application.ts
CHANGED
|
@@ -20,7 +20,7 @@ export class FragmentWebApplication {
|
|
|
20
20
|
this.container = DIContainer.getInstance();
|
|
21
21
|
this.metadataStorage = MetadataStorage.getInstance();
|
|
22
22
|
this.setupMiddleware();
|
|
23
|
-
this
|
|
23
|
+
this;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
private setupMiddleware(): void {
|
|
@@ -122,7 +122,9 @@ export class FragmentWebApplication {
|
|
|
122
122
|
private discoverAndRegisterComponents(): void {
|
|
123
123
|
const classes = this.metadataStorage.getAllClasses();
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
console.log(`\nš¦ Discovered ${classes.length} component(s)`);
|
|
126
|
+
|
|
127
|
+
// Group by type for display
|
|
126
128
|
const grouped = classes.reduce(
|
|
127
129
|
(acc, cls) => {
|
|
128
130
|
if (!acc[cls.type]) acc[cls.type] = [];
|
|
@@ -132,29 +134,37 @@ export class FragmentWebApplication {
|
|
|
132
134
|
{} as Record<string, any[]>,
|
|
133
135
|
);
|
|
134
136
|
|
|
135
|
-
const total = classes.length;
|
|
136
|
-
const registered = classes.filter((m) =>
|
|
137
|
-
this.shouldRegister(m.target),
|
|
138
|
-
).length;
|
|
139
|
-
|
|
140
|
-
console.log(`\nš¦ Discovered ${total} component(s)`);
|
|
141
|
-
|
|
142
137
|
Object.entries(grouped).forEach(([type, items]) => {
|
|
143
138
|
const icon = this.getTypeIcon(type);
|
|
144
139
|
console.log(` ${icon} ${items.length} ${type}(s)`);
|
|
145
140
|
});
|
|
146
141
|
|
|
147
|
-
let
|
|
142
|
+
let registered = 0;
|
|
143
|
+
let skipped = 0;
|
|
144
|
+
|
|
148
145
|
classes.forEach((metadata) => {
|
|
149
146
|
if (this.shouldRegister(metadata.target)) {
|
|
147
|
+
// CRITICAL: Register with container
|
|
150
148
|
if (!this.container.has(metadata.target)) {
|
|
151
149
|
this.container.register(metadata.target);
|
|
152
|
-
|
|
150
|
+
registered++;
|
|
151
|
+
console.log(` ā Registered: ${metadata.target.name}`);
|
|
153
152
|
}
|
|
153
|
+
} else {
|
|
154
|
+
skipped++;
|
|
155
|
+
console.log(
|
|
156
|
+
` ā Skipped: ${metadata.target.name} (conditional check failed)`,
|
|
157
|
+
);
|
|
154
158
|
}
|
|
155
159
|
});
|
|
156
160
|
|
|
157
|
-
console.log(
|
|
161
|
+
console.log(
|
|
162
|
+
`\n ā Registered ${registered}/${classes.length} component(s)`,
|
|
163
|
+
);
|
|
164
|
+
if (skipped > 0) {
|
|
165
|
+
console.log(` ā Skipped ${skipped} (conditions not met)`);
|
|
166
|
+
}
|
|
167
|
+
console.log("");
|
|
158
168
|
}
|
|
159
169
|
|
|
160
170
|
private getTypeIcon(type: string): string {
|