fragment-ts 1.0.25 → 1.0.27

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.
@@ -180,7 +180,7 @@ class InitCommand {
180
180
  "migrate:revert": "fragment migrate:revert",
181
181
  },
182
182
  dependencies: {
183
- "fragment-ts": "^1.0.25",
183
+ "fragment-ts": "^1.0.27",
184
184
  "reflect-metadata": "^0.1.13",
185
185
  },
186
186
  devDependencies: {
@@ -10,6 +10,12 @@ export declare class DIContainer {
10
10
  resolve<T>(token: any): T;
11
11
  private createInstance;
12
12
  private injectProperties;
13
+ private checkForDecoratedProperties;
14
+ private tryInjectAutowired;
15
+ private tryInjectByToken;
16
+ private tryInjectValue;
17
+ private tryInjectRepository;
18
+ private tryInjectLazy;
13
19
  private resolveValue;
14
20
  private resolveRepository;
15
21
  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;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;IAY/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAuDzB,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,gBAAgB;IAqJxB,OAAO,CAAC,YAAY;IAyCpB,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"}
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;IAsDzB,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,2BAA2B;IAkDnC,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,YAAY;IAsCpB,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"}
@@ -8,7 +8,7 @@ class DIContainer {
8
8
  this.transients = new Map();
9
9
  this.factories = new Map();
10
10
  this.constructing = new Set();
11
- this.registered = new Set(); // Track what's actually injectable
11
+ this.registered = new Set();
12
12
  }
13
13
  static getInstance() {
14
14
  if (!DIContainer.instance) {
@@ -17,7 +17,6 @@ class DIContainer {
17
17
  return DIContainer.instance;
18
18
  }
19
19
  register(token, instance, factory) {
20
- // Mark this token as registered
21
20
  this.registered.add(token);
22
21
  if (instance) {
23
22
  this.singletons.set(token, instance);
@@ -25,10 +24,8 @@ class DIContainer {
25
24
  else if (factory) {
26
25
  this.factories.set(token, factory);
27
26
  }
28
- // If neither instance nor factory, it will be created on-demand
29
27
  }
30
28
  resolve(token) {
31
- // Check if this is actually an injectable class
32
29
  if (typeof token === "function" && !this.registered.has(token)) {
33
30
  throw new Error(`Cannot resolve ${token.name}: Not registered as injectable. ` +
34
31
  `Did you forget to add @Injectable(), @Service(), @Controller(), or @Repository()?`);
@@ -71,16 +68,16 @@ class DIContainer {
71
68
  const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
72
69
  const params = paramTypes.map((type, index) => {
73
70
  if (!type || type === Object) {
74
- console.warn(` ⚠️ Constructor param ${index} of ${target.name} has no type metadata`);
71
+ console.warn(` ⚠️ Constructor param ${index} of ${target.name} has no type`);
75
72
  return undefined;
76
73
  }
77
74
  console.log(` 📦 Resolving constructor dependency: ${type.name}`);
78
75
  return this.resolve(type);
79
76
  });
80
77
  const instance = new target(...params);
81
- // Inject properties
78
+ // CRITICAL: Inject properties
82
79
  this.injectProperties(instance);
83
- // Call post-construct
80
+ // Call @PostConstruct
84
81
  const postConstructMethod = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.POST_CONSTRUCT, target);
85
82
  if (postConstructMethod &&
86
83
  typeof instance[postConstructMethod] === "function") {
@@ -90,90 +87,133 @@ class DIContainer {
90
87
  return instance;
91
88
  }
92
89
  injectProperties(instance) {
93
- const target = instance.constructor;
94
- let currentProto = target.prototype;
95
- // Walk the prototype chain
90
+ const constructor = instance.constructor;
91
+ console.log(` 🔍 Checking properties for injection on ${constructor.name}`);
92
+ // Walk through the entire prototype chain
93
+ let currentProto = constructor.prototype;
96
94
  while (currentProto && currentProto !== Object.prototype) {
97
- // Get all property names including inherited ones
98
- const propertyNames = Object.getOwnPropertyNames(currentProto);
99
- for (const prop of propertyNames) {
100
- // Skip constructor
101
- if (prop === "constructor")
95
+ // Get ALL property descriptors (including getters/setters)
96
+ const descriptors = Object.getOwnPropertyDescriptors(currentProto);
97
+ for (const [propName, descriptor] of Object.entries(descriptors)) {
98
+ if (propName === "constructor")
102
99
  continue;
103
- // Check @Autowired - stores the TYPE to inject
104
- const autowiredType = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.AUTOWIRED, currentProto, prop);
105
- if (autowiredType) {
106
- console.log(` 💉 @Autowired: ${target.name}.${prop} = ${autowiredType.name}`);
107
- const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, currentProto, prop);
108
- try {
109
- instance[prop] = this.resolve(autowiredType);
110
- }
111
- catch (error) {
112
- if (!isOptional) {
113
- throw new Error(`Failed to autowire ${autowiredType.name} into ${target.name}.${prop}: ${error}`);
114
- }
115
- console.warn(` ⚠️ Optional autowired dependency ${autowiredType.name} not available`);
116
- instance[prop] = undefined;
117
- }
118
- continue;
119
- }
120
- // Check @Inject - stores the TOKEN to inject
121
- const injectToken = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT, currentProto, prop);
122
- if (injectToken) {
123
- const tokenName = typeof injectToken === "string" ? injectToken : injectToken.name;
124
- console.log(` 💉 @Inject: ${target.name}.${prop} = ${tokenName}`);
125
- const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, currentProto, prop);
126
- try {
127
- instance[prop] = this.resolve(injectToken);
128
- }
129
- catch (error) {
130
- if (!isOptional) {
131
- throw new Error(`Failed to inject ${tokenName} into ${target.name}.${prop}: ${error}`);
100
+ // Try each injection type
101
+ this.tryInjectAutowired(instance, currentProto, propName, constructor.name);
102
+ this.tryInjectByToken(instance, currentProto, propName, constructor.name);
103
+ this.tryInjectValue(instance, currentProto, propName, constructor.name);
104
+ this.tryInjectRepository(instance, currentProto, propName, constructor.name);
105
+ this.tryInjectLazy(instance, currentProto, propName, constructor.name);
106
+ }
107
+ currentProto = Object.getPrototypeOf(currentProto);
108
+ }
109
+ // Also check for properties that might be defined directly on the instance
110
+ // but decorated with @Autowired on the class definition
111
+ this.checkForDecoratedProperties(instance, constructor);
112
+ }
113
+ checkForDecoratedProperties(instance, constructor) {
114
+ // Check all metadata keys that might be attached to properties
115
+ const propertyKeys = [
116
+ ...(Reflect.getMetadataKeys(constructor.prototype) || []),
117
+ ...(Reflect.getMetadataKeys(instance) || []),
118
+ ];
119
+ // Filter for property-related metadata
120
+ for (const key of propertyKeys) {
121
+ if (key.includes("fragment:")) {
122
+ // This is a Fragment metadata key, need to check if it's attached to a property
123
+ const metadataValue = Reflect.getMetadata(key, constructor.prototype);
124
+ if (metadataValue && typeof metadataValue === "object") {
125
+ // Could be a property metadata
126
+ for (const prop of Object.keys(metadataValue)) {
127
+ if (prop !== "constructor") {
128
+ this.tryInjectAutowired(instance, constructor.prototype, prop, constructor.name);
129
+ this.tryInjectByToken(instance, constructor.prototype, prop, constructor.name);
130
+ this.tryInjectValue(instance, constructor.prototype, prop, constructor.name);
131
+ this.tryInjectRepository(instance, constructor.prototype, prop, constructor.name);
132
132
  }
133
- console.warn(` ⚠️ Optional inject dependency ${tokenName} not available`);
134
- instance[prop] = undefined;
135
133
  }
136
- continue;
137
- }
138
- // Check @Value
139
- const valueExpression = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.VALUE, currentProto, prop);
140
- if (valueExpression !== undefined) {
141
- console.log(` 🔧 @Value: ${target.name}.${prop} = ${valueExpression}`);
142
- instance[prop] = this.resolveValue(valueExpression);
143
- continue;
144
- }
145
- // Check @InjectRepository
146
- const repositoryEntity = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT_REPOSITORY, currentProto, prop);
147
- if (repositoryEntity) {
148
- console.log(` 💾 @InjectRepository: ${target.name}.${prop} = Repository<${repositoryEntity.name}>`);
149
- instance[prop] = this.resolveRepository(repositoryEntity);
150
- continue;
151
- }
152
- // Check @Lazy
153
- const isLazy = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.LAZY, currentProto, prop);
154
- if (isLazy) {
155
- const type = Reflect.getMetadata("design:type", currentProto, prop);
156
- console.log(` ⏳ @Lazy: ${target.name}.${prop} (will resolve on access)`);
157
- let cached = null;
158
- let resolved = false;
159
- Object.defineProperty(instance, prop, {
160
- get: () => {
161
- if (!resolved) {
162
- console.log(` 🔓 Lazy-loading ${type.name} for ${target.name}.${prop}`);
163
- cached = this.resolve(type);
164
- resolved = true;
165
- }
166
- return cached;
167
- },
168
- enumerable: true,
169
- configurable: true,
170
- });
171
- continue;
172
134
  }
173
135
  }
174
- currentProto = Object.getPrototypeOf(currentProto);
175
136
  }
176
137
  }
138
+ tryInjectAutowired(instance, proto, prop, className) {
139
+ const type = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.AUTOWIRED, proto, prop);
140
+ if (!type)
141
+ return;
142
+ console.log(` 💉 @Autowired found: ${className}.${prop} -> ${type.name}`);
143
+ const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, proto, prop);
144
+ try {
145
+ instance[prop] = this.resolve(type);
146
+ console.log(` ✅ Injected ${type.name} into ${className}.${prop}`);
147
+ }
148
+ catch (error) {
149
+ if (!isOptional) {
150
+ throw new Error(`Failed to autowire ${type.name} into ${className}.${prop}: ${error}`);
151
+ }
152
+ console.warn(` ⚠️ Optional dependency ${type.name} not available for ${className}.${prop}`);
153
+ instance[prop] = undefined;
154
+ }
155
+ }
156
+ tryInjectByToken(instance, proto, prop, className) {
157
+ const token = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT, proto, prop);
158
+ if (!token)
159
+ return;
160
+ const tokenName = typeof token === "string" ? token : token.name;
161
+ console.log(` 💉 @Inject found: ${className}.${prop} -> ${tokenName}`);
162
+ const isOptional = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.OPTIONAL, proto, prop);
163
+ try {
164
+ instance[prop] = this.resolve(token);
165
+ console.log(` ✅ Injected ${tokenName} into ${className}.${prop}`);
166
+ }
167
+ catch (error) {
168
+ if (!isOptional) {
169
+ throw new Error(`Failed to inject ${tokenName} into ${className}.${prop}: ${error}`);
170
+ }
171
+ console.warn(` ⚠️ Optional dependency ${tokenName} not available for ${className}.${prop}`);
172
+ instance[prop] = undefined;
173
+ }
174
+ }
175
+ tryInjectValue(instance, proto, prop, className) {
176
+ const expression = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.VALUE, proto, prop);
177
+ if (expression === undefined)
178
+ return;
179
+ console.log(` 🔧 @Value found: ${className}.${prop} = ${expression}`);
180
+ instance[prop] = this.resolveValue(expression);
181
+ console.log(` ✅ Set value for ${className}.${prop}`);
182
+ }
183
+ tryInjectRepository(instance, proto, prop, className) {
184
+ const entity = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT_REPOSITORY, proto, prop);
185
+ if (!entity)
186
+ return;
187
+ console.log(` 💾 @InjectRepository found: ${className}.${prop} -> Repository<${entity.name}>`);
188
+ try {
189
+ instance[prop] = this.resolveRepository(entity);
190
+ console.log(` ✅ Injected Repository<${entity.name}> into ${className}.${prop}`);
191
+ }
192
+ catch (error) {
193
+ throw new Error(`Failed to inject repository for ${entity.name} into ${className}.${prop}: ${error}`);
194
+ }
195
+ }
196
+ tryInjectLazy(instance, proto, prop, className) {
197
+ const isLazy = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.LAZY, proto, prop);
198
+ if (!isLazy)
199
+ return;
200
+ const type = Reflect.getMetadata("design:type", proto, prop);
201
+ console.log(` ⏳ @Lazy found: ${className}.${prop} (${type?.name || "unknown"})`);
202
+ let cached = null;
203
+ let resolved = false;
204
+ Object.defineProperty(instance, prop, {
205
+ get: () => {
206
+ if (!resolved) {
207
+ console.log(` 🔓 Lazy-loading ${type.name} for ${className}.${prop}`);
208
+ cached = this.resolve(type);
209
+ resolved = true;
210
+ }
211
+ return cached;
212
+ },
213
+ enumerable: true,
214
+ configurable: true,
215
+ });
216
+ }
177
217
  resolveValue(expression) {
178
218
  const match = expression.match(/\$\{([^:}]+)(?::([^}]*))?\}|\$([A-Z_][A-Z0-9_]*)/i);
179
219
  if (match) {
@@ -184,10 +224,9 @@ class DIContainer {
184
224
  if (defaultValue !== undefined) {
185
225
  return defaultValue;
186
226
  }
187
- console.warn(`⚠️ Environment variable "${key}" not defined`);
227
+ console.warn(` ⚠️ Environment variable "${key}" not defined`);
188
228
  return "";
189
229
  }
190
- // Parse JSON
191
230
  if (value.startsWith("{") || value.startsWith("[")) {
192
231
  try {
193
232
  return JSON.parse(value);
@@ -196,11 +235,9 @@ class DIContainer {
196
235
  return value;
197
236
  }
198
237
  }
199
- // Parse numbers
200
238
  if (/^\d+(\.\d+)?$/.test(value)) {
201
239
  return parseFloat(value);
202
240
  }
203
- // Parse booleans
204
241
  if (value.toLowerCase() === "true")
205
242
  return true;
206
243
  if (value.toLowerCase() === "false")
@@ -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;QACnC,eAAU,GAAa,IAAI,GAAG,EAAE,CAAC,CAAC,mCAAmC;IAqV/E,CAAC;IAnVC,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED,QAAQ,CAAC,KAAU,EAAE,QAAc,EAAE,OAAmB;QACtD,gCAAgC;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,gEAAgE;IAClE,CAAC;IAED,OAAO,CAAI,KAAU;QACnB,gDAAgD;QAChD,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,CAAC,IAAI,kCAAkC;gBAC5D,mFAAmF,CACtF,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,CAC1D,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;YAC3B,MAAM,KAAK,GACT,OAAO,CAAC,WAAW,CAAC,6BAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC;YAEjE,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM,KAAK,GACT,OAAO,CAAC,WAAW,CAAC,6BAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC;gBAEjE,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACvC,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,cAAc,CAAC,MAAW;QAChC,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAE1E,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE;YACzD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CACV,4BAA4B,KAAK,OAAO,MAAM,CAAC,IAAI,uBAAuB,CAC3E,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QAEvC,oBAAoB;QACpB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEhC,sBAAsB;QACtB,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAC7C,6BAAa,CAAC,cAAc,EAC5B,MAAM,CACP,CAAC;QACF,IACE,mBAAmB;YACnB,OAAO,QAAQ,CAAC,mBAAmB,CAAC,KAAK,UAAU,EACnD,CAAC;YACD,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,CAAC,IAAI,IAAI,mBAAmB,IAAI,CACxE,CAAC;YACF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,gBAAgB,CAAC,QAAa;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;QACpC,IAAI,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;QAEpC,2BAA2B;QAC3B,OAAO,YAAY,IAAI,YAAY,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACzD,kDAAkD;YAClD,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAE/D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,mBAAmB;gBACnB,IAAI,IAAI,KAAK,aAAa;oBAAE,SAAS;gBAErC,+CAA+C;gBAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CACvC,6BAAa,CAAC,SAAS,EACvB,YAAY,EACZ,IAAI,CACL,CAAC;gBAEF,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CACT,qBAAqB,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,CACnE,CAAC;oBAEF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CACpC,6BAAa,CAAC,QAAQ,EACtB,YAAY,EACZ,IAAI,CACL,CAAC;oBAEF,IAAI,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC/C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,MAAM,IAAI,KAAK,CACb,sBAAsB,aAAa,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CACjF,CAAC;wBACJ,CAAC;wBACD,OAAO,CAAC,IAAI,CACV,wCAAwC,aAAa,CAAC,IAAI,gBAAgB,CAC3E,CAAC;wBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;oBAC7B,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CACrC,6BAAa,CAAC,MAAM,EACpB,YAAY,EACZ,IAAI,CACL,CAAC;gBAEF,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,SAAS,GACb,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;oBACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM,SAAS,EAAE,CAAC,CAAC;oBAEpE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CACpC,6BAAa,CAAC,QAAQ,EACtB,YAAY,EACZ,IAAI,CACL,CAAC;oBAEF,IAAI,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBAC7C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,MAAM,IAAI,KAAK,CACb,oBAAoB,SAAS,SAAS,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CACtE,CAAC;wBACJ,CAAC;wBACD,OAAO,CAAC,IAAI,CACV,qCAAqC,SAAS,gBAAgB,CAC/D,CAAC;wBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;oBAC7B,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,eAAe;gBACf,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CACzC,6BAAa,CAAC,KAAK,EACnB,YAAY,EACZ,IAAI,CACL,CAAC;gBAEF,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBAClC,OAAO,CAAC,GAAG,CACT,iBAAiB,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM,eAAe,EAAE,CAC5D,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;oBACpD,SAAS;gBACX,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAC1C,6BAAa,CAAC,iBAAiB,EAC/B,YAAY,EACZ,IAAI,CACL,CAAC;gBAEF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CACT,4BAA4B,MAAM,CAAC,IAAI,IAAI,IAAI,iBAAiB,gBAAgB,CAAC,IAAI,GAAG,CACzF,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,cAAc;gBACd,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAChC,6BAAa,CAAC,IAAI,EAClB,YAAY,EACZ,IAAI,CACL,CAAC;gBAEF,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;oBACpE,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,IAAI,IAAI,IAAI,2BAA2B,CAC9D,CAAC;oBAEF,IAAI,MAAM,GAAQ,IAAI,CAAC;oBACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;oBAErB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;wBACpC,GAAG,EAAE,GAAG,EAAE;4BACR,IAAI,CAAC,QAAQ,EAAE,CAAC;gCACd,OAAO,CAAC,GAAG,CACT,sBAAsB,IAAI,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAC7D,CAAC;gCACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gCAC5B,QAAQ,GAAG,IAAI,CAAC;4BAClB,CAAC;4BACD,OAAO,MAAM,CAAC;wBAChB,CAAC;wBACD,UAAU,EAAE,IAAI;wBAChB,YAAY,EAAE,IAAI;qBACnB,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;YACH,CAAC;YAED,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,UAAkB;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAC5B,mDAAmD,CACpD,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,YAAY,CAAC;gBACtB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,6BAA6B,GAAG,eAAe,CAAC,CAAC;gBAC9D,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,aAAa;YACb,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YAED,iBAAiB;YACjB,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;YAElD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,iBAAiB,CAAC,MAAW;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;YAEjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,CAAC,IAAI,KAAM,KAAe,EAAE,OAAO,EAAE,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AA3VD,kCA2VC"}
1
+ {"version":3,"file":"di-container.js","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fragment-ts",
3
- "version": "1.0.25",
3
+ "version": "1.0.27",
4
4
  "description": "Spring Boot-style framework for TypeScript with Express and TypeORM",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -173,7 +173,7 @@ export class InitCommand {
173
173
  "migrate:revert": "fragment migrate:revert",
174
174
  },
175
175
  dependencies: {
176
- "fragment-ts": "^1.0.25",
176
+ "fragment-ts": "^1.0.27",
177
177
  "reflect-metadata": "^0.1.13",
178
178
  },
179
179
  devDependencies: {
@@ -7,7 +7,7 @@ export class DIContainer {
7
7
  private transients: Map<any, any> = new Map();
8
8
  private factories: Map<any, () => any> = new Map();
9
9
  private constructing: Set<any> = new Set();
10
- private registered: Set<any> = new Set(); // Track what's actually injectable
10
+ private registered: Set<any> = new Set();
11
11
 
12
12
  static getInstance(): DIContainer {
13
13
  if (!DIContainer.instance) {
@@ -17,7 +17,6 @@ export class DIContainer {
17
17
  }
18
18
 
19
19
  register(token: any, instance?: any, factory?: () => any): void {
20
- // Mark this token as registered
21
20
  this.registered.add(token);
22
21
 
23
22
  if (instance) {
@@ -25,11 +24,9 @@ export class DIContainer {
25
24
  } else if (factory) {
26
25
  this.factories.set(token, factory);
27
26
  }
28
- // If neither instance nor factory, it will be created on-demand
29
27
  }
30
28
 
31
29
  resolve<T>(token: any): T {
32
- // Check if this is actually an injectable class
33
30
  if (typeof token === "function" && !this.registered.has(token)) {
34
31
  throw new Error(
35
32
  `Cannot resolve ${token.name}: Not registered as injectable. ` +
@@ -91,7 +88,7 @@ export class DIContainer {
91
88
  const params = paramTypes.map((type: any, index: number) => {
92
89
  if (!type || type === Object) {
93
90
  console.warn(
94
- ` ⚠️ Constructor param ${index} of ${target.name} has no type metadata`,
91
+ ` ⚠️ Constructor param ${index} of ${target.name} has no type`,
95
92
  );
96
93
  return undefined;
97
94
  }
@@ -101,10 +98,10 @@ export class DIContainer {
101
98
 
102
99
  const instance = new target(...params);
103
100
 
104
- // Inject properties
101
+ // CRITICAL: Inject properties
105
102
  this.injectProperties(instance);
106
103
 
107
- // Call post-construct
104
+ // Call @PostConstruct
108
105
  const postConstructMethod = Reflect.getMetadata(
109
106
  METADATA_KEYS.POST_CONSTRUCT,
110
107
  target,
@@ -123,154 +120,243 @@ export class DIContainer {
123
120
  }
124
121
 
125
122
  private injectProperties(instance: any): void {
126
- const target = instance.constructor;
127
- let currentProto = target.prototype;
123
+ const constructor = instance.constructor;
124
+
125
+ console.log(
126
+ ` 🔍 Checking properties for injection on ${constructor.name}`,
127
+ );
128
+
129
+ // Walk through the entire prototype chain
130
+ let currentProto = constructor.prototype;
128
131
 
129
- // Walk the prototype chain
130
132
  while (currentProto && currentProto !== Object.prototype) {
131
- // Get all property names including inherited ones
132
- const propertyNames = Object.getOwnPropertyNames(currentProto);
133
+ // Get ALL property descriptors (including getters/setters)
134
+ const descriptors = Object.getOwnPropertyDescriptors(currentProto);
133
135
 
134
- for (const prop of propertyNames) {
135
- // Skip constructor
136
- if (prop === "constructor") continue;
136
+ for (const [propName, descriptor] of Object.entries(descriptors)) {
137
+ if (propName === "constructor") continue;
137
138
 
138
- // Check @Autowired - stores the TYPE to inject
139
- const autowiredType = Reflect.getMetadata(
140
- METADATA_KEYS.AUTOWIRED,
139
+ // Try each injection type
140
+ this.tryInjectAutowired(
141
+ instance,
142
+ currentProto,
143
+ propName,
144
+ constructor.name,
145
+ );
146
+ this.tryInjectByToken(
147
+ instance,
141
148
  currentProto,
142
- prop,
149
+ propName,
150
+ constructor.name,
143
151
  );
152
+ this.tryInjectValue(instance, currentProto, propName, constructor.name);
153
+ this.tryInjectRepository(
154
+ instance,
155
+ currentProto,
156
+ propName,
157
+ constructor.name,
158
+ );
159
+ this.tryInjectLazy(instance, currentProto, propName, constructor.name);
160
+ }
144
161
 
145
- if (autowiredType) {
146
- console.log(
147
- ` 💉 @Autowired: ${target.name}.${prop} = ${autowiredType.name}`,
148
- );
162
+ currentProto = Object.getPrototypeOf(currentProto);
163
+ }
149
164
 
150
- const isOptional = Reflect.getMetadata(
151
- METADATA_KEYS.OPTIONAL,
152
- currentProto,
153
- prop,
154
- );
165
+ // Also check for properties that might be defined directly on the instance
166
+ // but decorated with @Autowired on the class definition
167
+ this.checkForDecoratedProperties(instance, constructor);
168
+ }
155
169
 
156
- try {
157
- instance[prop] = this.resolve(autowiredType);
158
- } catch (error) {
159
- if (!isOptional) {
160
- throw new Error(
161
- `Failed to autowire ${autowiredType.name} into ${target.name}.${prop}: ${error}`,
170
+ private checkForDecoratedProperties(
171
+ instance: any,
172
+ constructor: Function,
173
+ ): void {
174
+ // Check all metadata keys that might be attached to properties
175
+ const propertyKeys = [
176
+ ...(Reflect.getMetadataKeys(constructor.prototype) || []),
177
+ ...(Reflect.getMetadataKeys(instance) || []),
178
+ ];
179
+
180
+ // Filter for property-related metadata
181
+ for (const key of propertyKeys) {
182
+ if (key.includes("fragment:")) {
183
+ // This is a Fragment metadata key, need to check if it's attached to a property
184
+ const metadataValue = Reflect.getMetadata(key, constructor.prototype);
185
+ if (metadataValue && typeof metadataValue === "object") {
186
+ // Could be a property metadata
187
+ for (const prop of Object.keys(metadataValue)) {
188
+ if (prop !== "constructor") {
189
+ this.tryInjectAutowired(
190
+ instance,
191
+ constructor.prototype,
192
+ prop,
193
+ constructor.name,
194
+ );
195
+ this.tryInjectByToken(
196
+ instance,
197
+ constructor.prototype,
198
+ prop,
199
+ constructor.name,
200
+ );
201
+ this.tryInjectValue(
202
+ instance,
203
+ constructor.prototype,
204
+ prop,
205
+ constructor.name,
206
+ );
207
+ this.tryInjectRepository(
208
+ instance,
209
+ constructor.prototype,
210
+ prop,
211
+ constructor.name,
162
212
  );
163
213
  }
164
- console.warn(
165
- ` ⚠️ Optional autowired dependency ${autowiredType.name} not available`,
166
- );
167
- instance[prop] = undefined;
168
214
  }
169
- continue;
170
215
  }
216
+ }
217
+ }
218
+ }
171
219
 
172
- // Check @Inject - stores the TOKEN to inject
173
- const injectToken = Reflect.getMetadata(
174
- METADATA_KEYS.INJECT,
175
- currentProto,
176
- prop,
177
- );
220
+ private tryInjectAutowired(
221
+ instance: any,
222
+ proto: any,
223
+ prop: string,
224
+ className: string,
225
+ ): void {
226
+ const type = Reflect.getMetadata(METADATA_KEYS.AUTOWIRED, proto, prop);
178
227
 
179
- if (injectToken) {
180
- const tokenName =
181
- typeof injectToken === "string" ? injectToken : injectToken.name;
182
- console.log(` 💉 @Inject: ${target.name}.${prop} = ${tokenName}`);
228
+ if (!type) return;
183
229
 
184
- const isOptional = Reflect.getMetadata(
185
- METADATA_KEYS.OPTIONAL,
186
- currentProto,
187
- prop,
188
- );
230
+ console.log(` 💉 @Autowired found: ${className}.${prop} -> ${type.name}`);
189
231
 
190
- try {
191
- instance[prop] = this.resolve(injectToken);
192
- } catch (error) {
193
- if (!isOptional) {
194
- throw new Error(
195
- `Failed to inject ${tokenName} into ${target.name}.${prop}: ${error}`,
196
- );
197
- }
198
- console.warn(
199
- ` ⚠️ Optional inject dependency ${tokenName} not available`,
200
- );
201
- instance[prop] = undefined;
202
- }
203
- continue;
204
- }
232
+ const isOptional = Reflect.getMetadata(METADATA_KEYS.OPTIONAL, proto, prop);
205
233
 
206
- // Check @Value
207
- const valueExpression = Reflect.getMetadata(
208
- METADATA_KEYS.VALUE,
209
- currentProto,
210
- prop,
234
+ try {
235
+ instance[prop] = this.resolve(type);
236
+ console.log(` ✅ Injected ${type.name} into ${className}.${prop}`);
237
+ } catch (error) {
238
+ if (!isOptional) {
239
+ throw new Error(
240
+ `Failed to autowire ${type.name} into ${className}.${prop}: ${error}`,
211
241
  );
242
+ }
243
+ console.warn(
244
+ ` ⚠️ Optional dependency ${type.name} not available for ${className}.${prop}`,
245
+ );
246
+ instance[prop] = undefined;
247
+ }
248
+ }
212
249
 
213
- if (valueExpression !== undefined) {
214
- console.log(
215
- ` 🔧 @Value: ${target.name}.${prop} = ${valueExpression}`,
216
- );
217
- instance[prop] = this.resolveValue(valueExpression);
218
- continue;
219
- }
250
+ private tryInjectByToken(
251
+ instance: any,
252
+ proto: any,
253
+ prop: string,
254
+ className: string,
255
+ ): void {
256
+ const token = Reflect.getMetadata(METADATA_KEYS.INJECT, proto, prop);
220
257
 
221
- // Check @InjectRepository
222
- const repositoryEntity = Reflect.getMetadata(
223
- METADATA_KEYS.INJECT_REPOSITORY,
224
- currentProto,
225
- prop,
226
- );
258
+ if (!token) return;
227
259
 
228
- if (repositoryEntity) {
229
- console.log(
230
- ` 💾 @InjectRepository: ${target.name}.${prop} = Repository<${repositoryEntity.name}>`,
231
- );
232
- instance[prop] = this.resolveRepository(repositoryEntity);
233
- continue;
234
- }
260
+ const tokenName = typeof token === "string" ? token : token.name;
261
+ console.log(` 💉 @Inject found: ${className}.${prop} -> ${tokenName}`);
235
262
 
236
- // Check @Lazy
237
- const isLazy = Reflect.getMetadata(
238
- METADATA_KEYS.LAZY,
239
- currentProto,
240
- prop,
263
+ const isOptional = Reflect.getMetadata(METADATA_KEYS.OPTIONAL, proto, prop);
264
+
265
+ try {
266
+ instance[prop] = this.resolve(token);
267
+ console.log(` ✅ Injected ${tokenName} into ${className}.${prop}`);
268
+ } catch (error) {
269
+ if (!isOptional) {
270
+ throw new Error(
271
+ `Failed to inject ${tokenName} into ${className}.${prop}: ${error}`,
241
272
  );
273
+ }
274
+ console.warn(
275
+ ` ⚠️ Optional dependency ${tokenName} not available for ${className}.${prop}`,
276
+ );
277
+ instance[prop] = undefined;
278
+ }
279
+ }
242
280
 
243
- if (isLazy) {
244
- const type = Reflect.getMetadata("design:type", currentProto, prop);
245
- console.log(
246
- ` ⏳ @Lazy: ${target.name}.${prop} (will resolve on access)`,
247
- );
281
+ private tryInjectValue(
282
+ instance: any,
283
+ proto: any,
284
+ prop: string,
285
+ className: string,
286
+ ): void {
287
+ const expression = Reflect.getMetadata(METADATA_KEYS.VALUE, proto, prop);
248
288
 
249
- let cached: any = null;
250
- let resolved = false;
251
-
252
- Object.defineProperty(instance, prop, {
253
- get: () => {
254
- if (!resolved) {
255
- console.log(
256
- ` 🔓 Lazy-loading ${type.name} for ${target.name}.${prop}`,
257
- );
258
- cached = this.resolve(type);
259
- resolved = true;
260
- }
261
- return cached;
262
- },
263
- enumerable: true,
264
- configurable: true,
265
- });
266
- continue;
267
- }
268
- }
289
+ if (expression === undefined) return;
269
290
 
270
- currentProto = Object.getPrototypeOf(currentProto);
291
+ console.log(` 🔧 @Value found: ${className}.${prop} = ${expression}`);
292
+ instance[prop] = this.resolveValue(expression);
293
+ console.log(` ✅ Set value for ${className}.${prop}`);
294
+ }
295
+
296
+ private tryInjectRepository(
297
+ instance: any,
298
+ proto: any,
299
+ prop: string,
300
+ className: string,
301
+ ): void {
302
+ const entity = Reflect.getMetadata(
303
+ METADATA_KEYS.INJECT_REPOSITORY,
304
+ proto,
305
+ prop,
306
+ );
307
+
308
+ if (!entity) return;
309
+
310
+ console.log(
311
+ ` 💾 @InjectRepository found: ${className}.${prop} -> Repository<${entity.name}>`,
312
+ );
313
+
314
+ try {
315
+ instance[prop] = this.resolveRepository(entity);
316
+ console.log(
317
+ ` ✅ Injected Repository<${entity.name}> into ${className}.${prop}`,
318
+ );
319
+ } catch (error) {
320
+ throw new Error(
321
+ `Failed to inject repository for ${entity.name} into ${className}.${prop}: ${error}`,
322
+ );
271
323
  }
272
324
  }
273
325
 
326
+ private tryInjectLazy(
327
+ instance: any,
328
+ proto: any,
329
+ prop: string,
330
+ className: string,
331
+ ): void {
332
+ const isLazy = Reflect.getMetadata(METADATA_KEYS.LAZY, proto, prop);
333
+
334
+ if (!isLazy) return;
335
+
336
+ const type = Reflect.getMetadata("design:type", proto, prop);
337
+ console.log(
338
+ ` ⏳ @Lazy found: ${className}.${prop} (${type?.name || "unknown"})`,
339
+ );
340
+
341
+ let cached: any = null;
342
+ let resolved = false;
343
+
344
+ Object.defineProperty(instance, prop, {
345
+ get: () => {
346
+ if (!resolved) {
347
+ console.log(
348
+ ` 🔓 Lazy-loading ${type.name} for ${className}.${prop}`,
349
+ );
350
+ cached = this.resolve(type);
351
+ resolved = true;
352
+ }
353
+ return cached;
354
+ },
355
+ enumerable: true,
356
+ configurable: true,
357
+ });
358
+ }
359
+
274
360
  private resolveValue(expression: string): any {
275
361
  const match = expression.match(
276
362
  /\$\{([^:}]+)(?::([^}]*))?\}|\$([A-Z_][A-Z0-9_]*)/i,
@@ -284,11 +370,10 @@ export class DIContainer {
284
370
  if (defaultValue !== undefined) {
285
371
  return defaultValue;
286
372
  }
287
- console.warn(`⚠️ Environment variable "${key}" not defined`);
373
+ console.warn(` ⚠️ Environment variable "${key}" not defined`);
288
374
  return "";
289
375
  }
290
376
 
291
- // Parse JSON
292
377
  if (value.startsWith("{") || value.startsWith("[")) {
293
378
  try {
294
379
  return JSON.parse(value);
@@ -297,12 +382,10 @@ export class DIContainer {
297
382
  }
298
383
  }
299
384
 
300
- // Parse numbers
301
385
  if (/^\d+(\.\d+)?$/.test(value)) {
302
386
  return parseFloat(value);
303
387
  }
304
388
 
305
- // Parse booleans
306
389
  if (value.toLowerCase() === "true") return true;
307
390
  if (value.toLowerCase() === "false") return false;
308
391