fragment-ts 1.0.17 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/SETUP.md +570 -0
  2. package/changes/1.md +469 -0
  3. package/dist/cli/commands/init.command.js +4 -4
  4. package/dist/cli/commands/init.command.js.map +1 -1
  5. package/dist/cli/commands/test.command.d.ts +6 -0
  6. package/dist/cli/commands/test.command.d.ts.map +1 -0
  7. package/dist/cli/commands/test.command.js +311 -0
  8. package/dist/cli/commands/test.command.js.map +1 -0
  9. package/dist/cli/index.js +6 -3
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/core/container/di-container.d.ts +5 -0
  12. package/dist/core/container/di-container.d.ts.map +1 -1
  13. package/dist/core/container/di-container.js +121 -21
  14. package/dist/core/container/di-container.js.map +1 -1
  15. package/dist/core/decorators/controller.decorator.js +5 -5
  16. package/dist/core/decorators/injection.decorators.d.ts +44 -1
  17. package/dist/core/decorators/injection.decorators.d.ts.map +1 -1
  18. package/dist/core/decorators/injection.decorators.js +92 -1
  19. package/dist/core/decorators/injection.decorators.js.map +1 -1
  20. package/dist/core/metadata/metadata-keys.d.ts +29 -17
  21. package/dist/core/metadata/metadata-keys.d.ts.map +1 -1
  22. package/dist/core/metadata/metadata-keys.js +35 -17
  23. package/dist/core/metadata/metadata-keys.js.map +1 -1
  24. package/dist/testing/runner.d.ts +10 -0
  25. package/dist/testing/runner.d.ts.map +1 -1
  26. package/dist/testing/runner.js +109 -16
  27. package/dist/testing/runner.js.map +1 -1
  28. package/package.json +1 -1
  29. package/src/cli/commands/init.command.ts +4 -4
  30. package/src/cli/commands/test.command.ts +289 -0
  31. package/src/cli/index.ts +16 -11
  32. package/src/core/container/di-container.ts +166 -31
  33. package/src/core/decorators/DECORATOR_USAGE.md +326 -0
  34. package/src/core/decorators/controller.decorator.ts +9 -9
  35. package/src/core/decorators/injection.decorators.ts +129 -5
  36. package/src/core/metadata/metadata-keys.ts +44 -18
  37. package/src/testing/TEST.md +321 -0
  38. package/src/testing/runner.ts +137 -24
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.TestCommand = void 0;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const path = __importStar(require("path"));
42
+ const child_process_1 = require("child_process");
43
+ const fs = __importStar(require("fs"));
44
+ class TestCommand {
45
+ static register(program) {
46
+ program
47
+ .command("test")
48
+ .description("Run tests")
49
+ .option("--watch", "Run tests in watch mode")
50
+ .option("--env <environment>", "Environment mode: dev (use src/) or prod (use dist/)", "auto")
51
+ .option("--pattern <pattern>", "Test file pattern", "**/*.spec.ts")
52
+ .option("--coverage", "Generate coverage report")
53
+ .action(async (options) => {
54
+ await this.runTests(options);
55
+ });
56
+ }
57
+ static async runTests(options) {
58
+ console.log(chalk_1.default.blue("\n🧪 Running Fragment Tests...\n"));
59
+ const cwd = process.cwd();
60
+ const hasSource = fs.existsSync(path.join(cwd, "src"));
61
+ const hasDist = fs.existsSync(path.join(cwd, "dist"));
62
+ let useTypeScript;
63
+ let mode;
64
+ let basePath;
65
+ let pattern;
66
+ if (options.env === "dev") {
67
+ if (!hasSource) {
68
+ console.log(chalk_1.default.red("Development mode requested but src/ directory not found"));
69
+ return;
70
+ }
71
+ useTypeScript = true;
72
+ mode = "development (src/)";
73
+ basePath = "src";
74
+ pattern = options.pattern || "**/*.spec.ts";
75
+ }
76
+ else if (options.env === "prod") {
77
+ if (!hasDist) {
78
+ console.log(chalk_1.default.red("Production mode requested but dist/ directory not found. Run: fragment build"));
79
+ return;
80
+ }
81
+ useTypeScript = false;
82
+ mode = "production (dist/)";
83
+ basePath = "dist";
84
+ pattern = options.pattern.replace(".ts", ".js") || "**/*.spec.js";
85
+ }
86
+ else {
87
+ // Auto-detect
88
+ if (hasSource) {
89
+ useTypeScript = true;
90
+ mode = "auto-detected development (src/)";
91
+ basePath = "src";
92
+ pattern = options.pattern || "**/*.spec.ts";
93
+ }
94
+ else if (hasDist) {
95
+ useTypeScript = false;
96
+ mode = "auto-detected production (dist/)";
97
+ basePath = "dist";
98
+ pattern = options.pattern.replace(".ts", ".js") || "**/*.spec.js";
99
+ }
100
+ else {
101
+ console.log(chalk_1.default.red("No src/ or dist/ directory found. Run: fragment init"));
102
+ return;
103
+ }
104
+ }
105
+ console.log(chalk_1.default.gray(` Mode: ${mode}\n`));
106
+ const scriptContent = `
107
+ ${useTypeScript ? "require('ts-node/register/transpile-only');" : ""}
108
+ require('reflect-metadata');
109
+
110
+ const { glob } = require('glob');
111
+ const path = require('path');
112
+
113
+ // Global test state
114
+ const testState = {
115
+ suites: [],
116
+ currentSuite: null,
117
+ passed: 0,
118
+ failed: 0,
119
+ errors: []
120
+ };
121
+
122
+ // Global test functions
123
+ global.describe = function(name, fn) {
124
+ const suite = { name, tests: [] };
125
+ testState.suites.push(suite);
126
+ testState.currentSuite = suite;
127
+ fn();
128
+ testState.currentSuite = null;
129
+ };
130
+
131
+ global.it = function(name, fn) {
132
+ if (!testState.currentSuite) {
133
+ throw new Error('it() must be called inside describe()');
134
+ }
135
+ testState.currentSuite.tests.push({ name, fn });
136
+ };
137
+
138
+ global.expect = function(actual) {
139
+ return {
140
+ toBe(expected) {
141
+ if (actual !== expected) {
142
+ throw new Error(\`Expected \${actual} to be \${expected}\`);
143
+ }
144
+ },
145
+ toEqual(expected) {
146
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
147
+ throw new Error(\`Expected \${JSON.stringify(actual)} to equal \${JSON.stringify(expected)}\`);
148
+ }
149
+ },
150
+ toBeTruthy() {
151
+ if (!actual) {
152
+ throw new Error(\`Expected \${actual} to be truthy\`);
153
+ }
154
+ },
155
+ toBeFalsy() {
156
+ if (actual) {
157
+ throw new Error(\`Expected \${actual} to be falsy\`);
158
+ }
159
+ },
160
+ toThrow(expectedError) {
161
+ let threw = false;
162
+ let error = null;
163
+ try {
164
+ actual();
165
+ } catch (e) {
166
+ threw = true;
167
+ error = e;
168
+ }
169
+ if (!threw) {
170
+ throw new Error('Expected function to throw');
171
+ }
172
+ if (expectedError && error.message !== expectedError) {
173
+ throw new Error(\`Expected error message "\${expectedError}" but got "\${error.message}"\`);
174
+ }
175
+ },
176
+ toBeInstanceOf(expected) {
177
+ if (!(actual instanceof expected)) {
178
+ throw new Error(\`Expected \${actual} to be instance of \${expected.name}\`);
179
+ }
180
+ },
181
+ toContain(expected) {
182
+ if (!actual.includes(expected)) {
183
+ throw new Error(\`Expected \${actual} to contain \${expected}\`);
184
+ }
185
+ },
186
+ toHaveProperty(property, value) {
187
+ if (!(property in actual)) {
188
+ throw new Error(\`Expected object to have property \${property}\`);
189
+ }
190
+ if (value !== undefined && actual[property] !== value) {
191
+ throw new Error(\`Expected property \${property} to be \${value} but got \${actual[property]}\`);
192
+ }
193
+ },
194
+ toBeNull() {
195
+ if (actual !== null) {
196
+ throw new Error(\`Expected \${actual} to be null\`);
197
+ }
198
+ },
199
+ toBeUndefined() {
200
+ if (actual !== undefined) {
201
+ throw new Error(\`Expected \${actual} to be undefined\`);
202
+ }
203
+ },
204
+ toHaveLength(expected) {
205
+ if (actual.length !== expected) {
206
+ throw new Error(\`Expected length \${expected} but got \${actual.length}\`);
207
+ }
208
+ }
209
+ };
210
+ };
211
+
212
+ async function runTests() {
213
+ try {
214
+ // Find and load test files
215
+ const files = await glob('${basePath}/${pattern}', { cwd: process.cwd() });
216
+
217
+ if (files.length === 0) {
218
+ console.log('No test files found matching pattern: ${basePath}/${pattern}');
219
+ process.exit(0);
220
+ }
221
+
222
+ console.log(\`Found \${files.length} test file(s)\\n\`);
223
+
224
+ // Load all test files
225
+ for (const file of files) {
226
+ require(path.resolve(file));
227
+ }
228
+
229
+ // Run all tests
230
+ for (const suite of testState.suites) {
231
+ console.log(\`\\n📦 \${suite.name}\`);
232
+
233
+ for (const test of suite.tests) {
234
+ try {
235
+ await test.fn();
236
+ console.log(\` ✓ \${test.name}\`);
237
+ testState.passed++;
238
+ } catch (error) {
239
+ console.log(\` ✗ \${test.name}\`);
240
+ console.error(\` \${error.message}\`);
241
+ testState.failed++;
242
+ testState.errors.push({
243
+ suite: suite.name,
244
+ test: test.name,
245
+ error: error.message,
246
+ stack: error.stack
247
+ });
248
+ }
249
+ }
250
+ }
251
+
252
+ // Print summary
253
+ console.log(\`\\n\\n📊 Results: \${testState.passed} passed, \${testState.failed} failed\\n\`);
254
+
255
+ if (testState.failed > 0) {
256
+ console.log('\\n❌ Failed Tests:\\n');
257
+ testState.errors.forEach(err => {
258
+ console.log(\` \${err.suite} > \${err.test}\`);
259
+ console.log(\` \${err.error}\\n\`);
260
+ });
261
+ process.exit(1);
262
+ } else {
263
+ console.log('✅ All tests passed!\\n');
264
+ process.exit(0);
265
+ }
266
+ } catch (error) {
267
+ console.error('Error running tests:', error);
268
+ process.exit(1);
269
+ }
270
+ }
271
+
272
+ runTests();
273
+ `;
274
+ const scriptPath = path.join(cwd, ".fragment-test-runner.js");
275
+ try {
276
+ fs.writeFileSync(scriptPath, scriptContent);
277
+ const nodeArgs = [scriptPath];
278
+ const env = {
279
+ ...process.env,
280
+ TS_NODE_TRANSPILE_ONLY: "true",
281
+ NODE_ENV: "test",
282
+ };
283
+ const proc = (0, child_process_1.spawn)("node", nodeArgs, {
284
+ cwd,
285
+ stdio: "inherit",
286
+ env,
287
+ });
288
+ proc.on("close", (code) => {
289
+ try {
290
+ fs.unlinkSync(scriptPath);
291
+ }
292
+ catch { }
293
+ process.exit(code || 0);
294
+ });
295
+ proc.on("error", (error) => {
296
+ console.error(chalk_1.default.red("Failed to run tests:"), error);
297
+ try {
298
+ fs.unlinkSync(scriptPath);
299
+ }
300
+ catch { }
301
+ process.exit(1);
302
+ });
303
+ }
304
+ catch (error) {
305
+ console.error(chalk_1.default.red("Failed to create test runner:"), error.message);
306
+ process.exit(1);
307
+ }
308
+ }
309
+ }
310
+ exports.TestCommand = TestCommand;
311
+ //# sourceMappingURL=test.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.command.js","sourceRoot":"","sources":["../../../src/cli/commands/test.command.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -7,15 +7,18 @@ const serve_command_1 = require("./commands/serve.command");
7
7
  const build_command_1 = require("./commands/build.command");
8
8
  const migrate_command_1 = require("./commands/migrate.command");
9
9
  const diagnostics_command_1 = require("./commands/diagnostics.command");
10
+ const test_command_1 = require("./commands/test.command");
10
11
  const program = new commander_1.Command();
11
12
  program
12
- .name('fragment')
13
- .description('Fragment Framework CLI')
14
- .version('1.0.0');
13
+ .name("fragment")
14
+ .description("Fragment Framework CLI - A TypeScript framework inspired by Spring Boot")
15
+ .version("1.0.0");
16
+ // Register all commands
15
17
  init_command_1.InitCommand.register(program);
16
18
  generate_command_1.GenerateCommand.register(program);
17
19
  serve_command_1.ServeCommand.register(program);
18
20
  build_command_1.BuildCommand.register(program);
21
+ test_command_1.TestCommand.register(program);
19
22
  migrate_command_1.MigrateCommand.register(program);
20
23
  diagnostics_command_1.DiagnosticsCommand.register(program);
21
24
  program.parse();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,0DAAsD;AACtD,kEAA8D;AAC9D,4DAAwD;AACxD,4DAAwD;AACxD,gEAA4D;AAC5D,wEAAoE;AAEpE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wBAAwB,CAAC;KACrC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,0BAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC9B,kCAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClC,4BAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,4BAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,gCAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjC,wCAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAErC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,0DAAsD;AACtD,kEAA8D;AAC9D,4DAAwD;AACxD,4DAAwD;AACxD,gEAA4D;AAC5D,wEAAoE;AACpE,0DAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CACV,yEAAyE,CAC1E;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wBAAwB;AACxB,0BAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC9B,kCAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClC,4BAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,4BAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,0BAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC9B,gCAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjC,wCAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAErC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -3,13 +3,18 @@ export declare class DIContainer {
3
3
  private singletons;
4
4
  private transients;
5
5
  private factories;
6
+ private constructing;
6
7
  static getInstance(): DIContainer;
7
8
  register(token: any, instance?: any, factory?: () => any): void;
8
9
  resolve<T>(token: any): T;
9
10
  private createInstance;
10
11
  private injectProperties;
12
+ private getAllPropertyKeys;
11
13
  private resolveValue;
14
+ private resolveRepository;
12
15
  has(token: any): boolean;
13
16
  getAllInstances(): any[];
17
+ clear(): void;
18
+ reset(): void;
14
19
  }
15
20
  //# sourceMappingURL=di-container.d.ts.map
@@ -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;IAEnD,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,IAAI;IAQ/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IA+BzB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,YAAY;IASpB,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAIxB,eAAe,IAAI,GAAG,EAAE;CAGzB"}
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;IAE3C,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,IAAI;IAQ/D,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAmDzB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,YAAY;IAsCpB,OAAO,CAAC,iBAAiB;IAczB,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAQxB,eAAe,IAAI,GAAG,EAAE;IAIxB,KAAK,IAAI,IAAI;IAQb,KAAK,IAAI,IAAI;CAGd"}
@@ -7,6 +7,7 @@ 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(); // Prevent circular dependencies
10
11
  }
11
12
  static getInstance() {
12
13
  if (!DIContainer.instance) {
@@ -23,66 +24,165 @@ class DIContainer {
23
24
  }
24
25
  }
25
26
  resolve(token) {
27
+ // Check for circular dependency
28
+ if (this.constructing.has(token)) {
29
+ throw new Error(`Circular dependency detected for ${token.name || token}`);
30
+ }
31
+ // Return existing singleton
26
32
  if (this.singletons.has(token)) {
27
33
  return this.singletons.get(token);
28
34
  }
35
+ // Use factory if available
29
36
  if (this.factories.has(token)) {
30
37
  const factory = this.factories.get(token);
31
38
  const instance = factory();
32
- const scope = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.SCOPE, token) || 'singleton';
33
- if (scope === 'singleton') {
39
+ const scope = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.SCOPE, token) || "singleton";
40
+ if (scope === "singleton") {
34
41
  this.singletons.set(token, instance);
35
42
  }
36
43
  return instance;
37
44
  }
38
- if (typeof token === 'function') {
39
- const instance = this.createInstance(token);
40
- const scope = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.SCOPE, token) || 'singleton';
41
- if (scope === 'singleton') {
42
- this.singletons.set(token, instance);
45
+ // Create new instance
46
+ if (typeof token === "function") {
47
+ this.constructing.add(token);
48
+ try {
49
+ const instance = this.createInstance(token);
50
+ const scope = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.SCOPE, token) || "singleton";
51
+ if (scope === "singleton") {
52
+ this.singletons.set(token, instance);
53
+ }
54
+ this.constructing.delete(token);
55
+ return instance;
56
+ }
57
+ catch (error) {
58
+ this.constructing.delete(token);
59
+ throw error;
43
60
  }
44
- return instance;
45
61
  }
46
62
  throw new Error(`Cannot resolve dependency: ${token}`);
47
63
  }
48
64
  createInstance(target) {
49
- const paramTypes = Reflect.getMetadata('design:paramtypes', target) || [];
50
- const params = paramTypes.map((type) => this.resolve(type));
65
+ // Get constructor parameter types
66
+ const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
67
+ // Resolve constructor dependencies
68
+ const params = paramTypes.map((type) => {
69
+ if (!type || type === Object) {
70
+ return undefined;
71
+ }
72
+ return this.resolve(type);
73
+ });
74
+ // Create instance
51
75
  const instance = new target(...params);
76
+ // Inject properties AFTER construction
52
77
  this.injectProperties(instance);
78
+ // Call post-construct hook if it exists
79
+ if (typeof instance.onInit === "function") {
80
+ instance.onInit();
81
+ }
53
82
  return instance;
54
83
  }
55
84
  injectProperties(instance) {
56
- const properties = Object.getOwnPropertyNames(instance.constructor.prototype);
57
- properties.forEach(prop => {
58
- const autowired = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.AUTOWIRED, instance, prop);
59
- const inject = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT, instance, prop);
60
- const value = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.VALUE, instance, prop);
85
+ const prototype = Object.getPrototypeOf(instance);
86
+ // Get all property keys from the prototype chain
87
+ const properties = this.getAllPropertyKeys(instance);
88
+ properties.forEach((prop) => {
89
+ // Check for @Autowired
90
+ const autowired = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.AUTOWIRED, prototype, prop);
61
91
  if (autowired) {
62
92
  instance[prop] = this.resolve(autowired);
93
+ return;
63
94
  }
64
- else if (inject) {
95
+ // Check for @Inject
96
+ const inject = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT, prototype, prop);
97
+ if (inject) {
65
98
  instance[prop] = this.resolve(inject);
99
+ return;
66
100
  }
67
- else if (value) {
101
+ // Check for @Value
102
+ const value = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.VALUE, prototype, prop);
103
+ if (value !== undefined) {
68
104
  instance[prop] = this.resolveValue(value);
105
+ return;
106
+ }
107
+ // Check for @InjectRepository - special TypeORM handling
108
+ const repositoryEntity = Reflect.getMetadata(metadata_keys_1.METADATA_KEYS.INJECT_REPOSITORY, prototype, prop);
109
+ if (repositoryEntity) {
110
+ instance[prop] = this.resolveRepository(repositoryEntity);
111
+ return;
69
112
  }
70
113
  });
71
114
  }
115
+ getAllPropertyKeys(obj) {
116
+ const keys = new Set();
117
+ let current = obj;
118
+ while (current && current !== Object.prototype) {
119
+ Object.getOwnPropertyNames(current).forEach((key) => keys.add(key));
120
+ current = Object.getPrototypeOf(current);
121
+ }
122
+ return Array.from(keys);
123
+ }
72
124
  resolveValue(expression) {
73
- const match = expression.match(/\$\{(.+?)\}/);
125
+ // Handle environment variable syntax: ${VAR_NAME} or $VAR_NAME
126
+ const match = expression.match(/\$\{([^}]+)\}|\$([A-Z_][A-Z0-9_]*)/i);
74
127
  if (match) {
75
- const key = match[1];
76
- return process.env[key] || '';
128
+ const key = match[1] || match[2];
129
+ const value = process.env[key];
130
+ if (value === undefined) {
131
+ console.warn(`⚠️ Warning: Environment variable "${key}" is not defined`);
132
+ return "";
133
+ }
134
+ // Try to parse as JSON for complex types
135
+ if (value.startsWith("{") || value.startsWith("[")) {
136
+ try {
137
+ return JSON.parse(value);
138
+ }
139
+ catch {
140
+ return value;
141
+ }
142
+ }
143
+ // Parse numbers
144
+ if (/^\d+$/.test(value)) {
145
+ return parseInt(value, 10);
146
+ }
147
+ // Parse booleans
148
+ if (value.toLowerCase() === "true")
149
+ return true;
150
+ if (value.toLowerCase() === "false")
151
+ return false;
152
+ return value;
77
153
  }
78
154
  return expression;
79
155
  }
156
+ resolveRepository(entity) {
157
+ try {
158
+ // Import TypeORM module dynamically to avoid circular dependencies
159
+ const { TypeORMModule } = require("../../typeorm/typeorm-module");
160
+ const dataSource = TypeORMModule.getDataSource();
161
+ return dataSource.getRepository(entity);
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Failed to resolve repository for entity ${entity.name}: ${error?.message}. ` +
165
+ `Make sure TypeORM is initialized before using @InjectRepository.`);
166
+ }
167
+ }
80
168
  has(token) {
81
- return this.singletons.has(token) || this.factories.has(token);
169
+ return (this.singletons.has(token) ||
170
+ this.factories.has(token) ||
171
+ typeof token === "function");
82
172
  }
83
173
  getAllInstances() {
84
174
  return Array.from(this.singletons.values());
85
175
  }
176
+ clear() {
177
+ this.singletons.clear();
178
+ this.transients.clear();
179
+ this.factories.clear();
180
+ this.constructing.clear();
181
+ }
182
+ // For testing purposes
183
+ reset() {
184
+ this.clear();
185
+ }
86
186
  }
87
187
  exports.DIContainer = DIContainer;
88
188
  //# sourceMappingURL=di-container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"di-container.js","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"di-container.js","sourceRoot":"","sources":["../../../src/core/container/di-container.ts"],"names":[],"mappings":"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"}
@@ -4,16 +4,16 @@ exports.Controller = Controller;
4
4
  const injectable_decorator_1 = require("./injectable.decorator");
5
5
  const metadata_keys_1 = require("../metadata/metadata-keys");
6
6
  const metadata_storage_1 = require("../metadata/metadata-storage");
7
- function Controller(path = '') {
7
+ function Controller(path = "") {
8
8
  return (target) => {
9
- (0, injectable_decorator_1.Injectable)('singleton')(target);
9
+ (0, injectable_decorator_1.Injectable)("singleton")(target);
10
10
  Reflect.defineMetadata(metadata_keys_1.METADATA_KEYS.CONTROLLER, path, target);
11
11
  const storage = metadata_storage_1.MetadataStorage.getInstance();
12
12
  storage.addClass({
13
13
  target,
14
- type: 'controller',
15
- scope: 'singleton',
16
- path
14
+ type: "controller",
15
+ scope: "singleton",
16
+ path,
17
17
  });
18
18
  };
19
19
  }
@@ -1,5 +1,48 @@
1
+ /**
2
+ * @Autowired - Automatically inject dependencies by type
3
+ * Usage: @Autowired() private myService: MyService;
4
+ */
1
5
  export declare function Autowired(): PropertyDecorator;
2
- export declare function Inject(token: string): PropertyDecorator;
6
+ /**
7
+ * @Inject - Inject dependency by token (string or class)
8
+ * Usage: @Inject('MyService') private service: MyService;
9
+ * or: @Inject(MyService) private service: MyService;
10
+ */
11
+ export declare function Inject(token: string | Function): PropertyDecorator;
12
+ /**
13
+ * @InjectRepository - Inject TypeORM repository for an entity
14
+ * Usage: @InjectRepository(User) private userRepo: Repository<User>;
15
+ */
16
+ export declare function InjectRepository(entity: Function): PropertyDecorator;
17
+ /**
18
+ * @Qualifier - Specify which bean to inject when multiple exist
19
+ * Usage: @Qualifier('primary') @Autowired() private service: MyService;
20
+ */
3
21
  export declare function Qualifier(name: string): PropertyDecorator;
22
+ /**
23
+ * @Value - Inject configuration value from environment or config
24
+ * Usage: @Value('${PORT}') private port: number;
25
+ * or: @Value('${DB_HOST:localhost}') private host: string;
26
+ */
4
27
  export declare function Value(expression: string): PropertyDecorator;
28
+ /**
29
+ * @Optional - Mark dependency as optional (won't throw if not found)
30
+ * Usage: @Optional() @Autowired() private service?: MyService;
31
+ */
32
+ export declare function Optional(): PropertyDecorator;
33
+ /**
34
+ * @Lazy - Lazy load dependency (create on first access)
35
+ * Usage: @Lazy() @Autowired() private service: MyService;
36
+ */
37
+ export declare function Lazy(): PropertyDecorator;
38
+ /**
39
+ * @PostConstruct - Method called after dependency injection is complete
40
+ * Usage: @PostConstruct() init() { ... }
41
+ */
42
+ export declare function PostConstruct(): MethodDecorator;
43
+ /**
44
+ * @PreDestroy - Method called before bean is destroyed
45
+ * Usage: @PreDestroy() cleanup() { ... }
46
+ */
47
+ export declare function PreDestroy(): MethodDecorator;
5
48
  //# sourceMappingURL=injection.decorators.d.ts.map