fragment-ts 1.0.16 → 1.0.18
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/SETUP.md +570 -0
- package/changes/1.md +420 -0
- package/dist/cli/commands/init.command.js +4 -4
- package/dist/cli/commands/init.command.js.map +1 -1
- package/dist/cli/commands/test.command.d.ts +6 -0
- package/dist/cli/commands/test.command.d.ts.map +1 -0
- package/dist/cli/commands/test.command.js +311 -0
- package/dist/cli/commands/test.command.js.map +1 -0
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/container/di-container.d.ts +5 -0
- package/dist/core/container/di-container.d.ts.map +1 -1
- package/dist/core/container/di-container.js +121 -21
- package/dist/core/container/di-container.js.map +1 -1
- package/dist/core/decorators/controller.decorator.js +5 -5
- package/dist/core/decorators/injection.decorators.d.ts +44 -1
- package/dist/core/decorators/injection.decorators.d.ts.map +1 -1
- package/dist/core/decorators/injection.decorators.js +92 -1
- package/dist/core/decorators/injection.decorators.js.map +1 -1
- package/dist/core/metadata/metadata-keys.d.ts +29 -17
- package/dist/core/metadata/metadata-keys.d.ts.map +1 -1
- package/dist/core/metadata/metadata-keys.js +35 -17
- package/dist/core/metadata/metadata-keys.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/init.command.ts +4 -4
- package/src/cli/commands/test.command.ts +289 -0
- package/src/cli/index.ts +16 -11
- package/src/core/container/di-container.ts +166 -31
- package/src/core/decorators/DECORATOR_USAGE.md +326 -0
- package/src/core/decorators/controller.decorator.ts +9 -9
- package/src/core/decorators/injection.decorators.ts +129 -5
- package/src/core/metadata/metadata-keys.ts +44 -18
- package/src/index.ts +1 -0
- package/src/testing/TEST.md +321 -0
|
@@ -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(
|
|
13
|
-
.description(
|
|
14
|
-
.version(
|
|
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();
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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) ||
|
|
33
|
-
if (scope ===
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
this.
|
|
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
|
-
|
|
50
|
-
const
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) ||
|
|
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":";;;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;
|
|
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)(
|
|
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:
|
|
15
|
-
scope:
|
|
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
|
-
|
|
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
|