@autowired-framework/core 0.0.1

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 (48) hide show
  1. package/assets/banner.txt +6 -0
  2. package/dist/component-scanner.d.ts +60 -0
  3. package/dist/component-scanner.js +164 -0
  4. package/dist/decorators/autowired.d.ts +13 -0
  5. package/dist/decorators/autowired.js +24 -0
  6. package/dist/decorators/component.d.ts +9 -0
  7. package/dist/decorators/component.js +22 -0
  8. package/dist/decorators/decorator-factory.d.ts +38 -0
  9. package/dist/decorators/decorator-factory.js +76 -0
  10. package/dist/decorators/index.d.ts +5 -0
  11. package/dist/decorators/index.js +23 -0
  12. package/dist/decorators/inject.d.ts +10 -0
  13. package/dist/decorators/inject.js +21 -0
  14. package/dist/decorators/repository.d.ts +5 -0
  15. package/dist/decorators/repository.js +17 -0
  16. package/dist/decorators/service.d.ts +8 -0
  17. package/dist/decorators/service.js +22 -0
  18. package/dist/dependency-injection/injector.d.ts +67 -0
  19. package/dist/dependency-injection/injector.js +165 -0
  20. package/dist/hooks/decorators/hook.d.ts +11 -0
  21. package/dist/hooks/decorators/hook.js +23 -0
  22. package/dist/hooks/decorators/index.d.ts +2 -0
  23. package/dist/hooks/decorators/index.js +20 -0
  24. package/dist/hooks/decorators/lifecycle-hooks.d.ts +7 -0
  25. package/dist/hooks/decorators/lifecycle-hooks.js +27 -0
  26. package/dist/hooks/initialization.d.ts +0 -0
  27. package/dist/hooks/initialization.js +70 -0
  28. package/dist/hooks/registry/hook.registry.d.ts +23 -0
  29. package/dist/hooks/registry/hook.registry.js +50 -0
  30. package/dist/hooks/registry/registries.d.ts +5 -0
  31. package/dist/hooks/registry/registries.js +23 -0
  32. package/dist/index.d.ts +15 -0
  33. package/dist/index.js +55 -0
  34. package/dist/lifecycle/lifecycle.interface.d.ts +1 -0
  35. package/dist/lifecycle/lifecycle.interface.js +3 -0
  36. package/dist/symbols.d.ts +22 -0
  37. package/dist/symbols.js +27 -0
  38. package/dist/types.d.ts +3 -0
  39. package/dist/types.js +3 -0
  40. package/dist/utils/banner.utils.d.ts +1 -0
  41. package/dist/utils/banner.utils.js +20 -0
  42. package/dist/utils/metadata.utils.d.ts +36 -0
  43. package/dist/utils/metadata.utils.js +55 -0
  44. package/dist/utils/path.utils.d.ts +4 -0
  45. package/dist/utils/path.utils.js +23 -0
  46. package/dist/utils/time.utils.d.ts +11 -0
  47. package/dist/utils/time.utils.js +29 -0
  48. package/package.json +53 -0
@@ -0,0 +1,6 @@
1
+ ,-. ,--. ,--. ,--.,-.
2
+ / /,--,--.,--.,--.,-' '-. ,---. ,--. ,--.`--',--.--. ,---. ,-| |\ \
3
+ / /' ,-. || || |'-. .-'| .-. || |.'.| |,--.| .--'| .-. :' .-. | \ \
4
+ \ \\ '-' |' '' ' | | ' '-' '| .'. || || | \ --.\ `-' | / /
5
+ \ \`--`--' `----' `--' `---' '--' '--'`--'`--' `----' `---' / /
6
+ `-' by @augmented-dev `-'
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Checks if a class is a controller.
3
+ */
4
+ export declare const isController: (target: any) => boolean;
5
+ /**
6
+ * Checks if a class is a controller-specific advice.
7
+ */
8
+ export declare const isControllerAdvice: (target: any) => boolean;
9
+ /**
10
+ * Checks if a class is a global controller advice.
11
+ */
12
+ export declare const isGlobalControllerAdvice: (target: any) => boolean;
13
+ /**
14
+ * Checks if a class is a service.
15
+ */
16
+ export declare const isService: (target: any) => boolean;
17
+ /**
18
+ * Checks if a class is a repository.
19
+ */
20
+ export declare const isRepository: (target: any) => boolean;
21
+ /**
22
+ * Class to scan for components and store them in a cache.
23
+ */
24
+ export interface CategorizedComponents {
25
+ globalControllerAdvices: Set<Function>;
26
+ controllerAdvices: Set<Function>;
27
+ controllers: Set<Function>;
28
+ services: Set<Function>;
29
+ repositories: Set<Function>;
30
+ }
31
+ export declare class ComponentScanner {
32
+ private static globalControllerAdviceSet;
33
+ private static controllerAdviceSet;
34
+ private static controllerSet;
35
+ private static serviceSet;
36
+ private static repositorySet;
37
+ /**
38
+ * Scans a directory and categorizes components into controllers, advices, and global advices.
39
+ * @param logger - Logger with info and error methods.
40
+ * @param directory - The directory to scan.
41
+ */
42
+ static scan(logger: {
43
+ info?: (...args: any[]) => void;
44
+ error?: (...args: any[]) => void;
45
+ }, directory: string): Promise<void>;
46
+ /**
47
+ * Recursively retrieves all files from a directory.
48
+ * @param dir - The base directory to scan.
49
+ */
50
+ private static getFiles;
51
+ /**
52
+ * Retrieves pre-scanned and categorized components.
53
+ */
54
+ static getCategorizedComponents(): CategorizedComponents;
55
+ /**
56
+ * Clears all scanned component caches.
57
+ * Useful for testing to ensure clean state between tests.
58
+ */
59
+ static clear(): void;
60
+ }
@@ -0,0 +1,164 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ComponentScanner = exports.isRepository = exports.isService = exports.isGlobalControllerAdvice = exports.isControllerAdvice = exports.isController = void 0;
37
+ const symbols_1 = require("./symbols");
38
+ const component_1 = require("./decorators/component");
39
+ const fs_1 = require("fs");
40
+ const path_1 = require("path");
41
+ /**
42
+ * Checks if a class is a controller.
43
+ */
44
+ const isController = (target) => {
45
+ return Reflect.hasMetadata(symbols_1.CONTROLLER_METADATA, target);
46
+ };
47
+ exports.isController = isController;
48
+ /**
49
+ * Checks if a class is a controller-specific advice.
50
+ */
51
+ const isControllerAdvice = (target) => {
52
+ return Reflect.hasMetadata(symbols_1.CONTROLLER_ADVICE_METADATA, target);
53
+ };
54
+ exports.isControllerAdvice = isControllerAdvice;
55
+ /**
56
+ * Checks if a class is a global controller advice.
57
+ */
58
+ const isGlobalControllerAdvice = (target) => {
59
+ return Reflect.hasMetadata(symbols_1.GLOBAL_CONTROLLER_ADVICE_METADATA, target);
60
+ };
61
+ exports.isGlobalControllerAdvice = isGlobalControllerAdvice;
62
+ /**
63
+ * Checks if a class is a service.
64
+ */
65
+ const isService = (target) => {
66
+ return Reflect.hasMetadata(symbols_1.SERVICE_METADATA, target);
67
+ };
68
+ exports.isService = isService;
69
+ /**
70
+ * Checks if a class is a repository.
71
+ */
72
+ const isRepository = (target) => {
73
+ return Reflect.hasMetadata(symbols_1.REPOSITORY_METADATA, target);
74
+ };
75
+ exports.isRepository = isRepository;
76
+ class ComponentScanner {
77
+ /**
78
+ * Scans a directory and categorizes components into controllers, advices, and global advices.
79
+ * @param logger - Logger with info and error methods.
80
+ * @param directory - The directory to scan.
81
+ */
82
+ static async scan(logger, directory) {
83
+ // Clear before scanning to allow re-scanning
84
+ ComponentScanner.clear();
85
+ logger.info?.(`Scanning ${directory} for components to register`);
86
+ const files = ComponentScanner.getFiles(directory);
87
+ for (const file of files) {
88
+ // Skip node_modules and .d.ts files, and only import .js and .ts files
89
+ if (file.includes("node_modules") || file.endsWith(".d.ts") || ((0, path_1.extname)(file) !== ".js" && (0, path_1.extname)(file) !== ".ts"))
90
+ continue;
91
+ try {
92
+ const module = await Promise.resolve(`${file}`).then(s => __importStar(require(s)));
93
+ for (const key in module) {
94
+ const clazz = module[key];
95
+ if (clazz instanceof Function && (0, component_1.isComponent)(clazz)) {
96
+ // Categorize the component based on its type
97
+ // Order matters: more specific types must be checked before general ones.
98
+ if ((0, exports.isController)(clazz)) {
99
+ ComponentScanner.controllerSet.add(clazz);
100
+ }
101
+ else if ((0, exports.isControllerAdvice)(clazz)) {
102
+ ComponentScanner.controllerAdviceSet.add(clazz);
103
+ }
104
+ else if ((0, exports.isGlobalControllerAdvice)(clazz)) {
105
+ ComponentScanner.globalControllerAdviceSet.add(clazz);
106
+ }
107
+ else if ((0, exports.isRepository)(clazz)) {
108
+ ComponentScanner.repositorySet.add(clazz);
109
+ }
110
+ else if ((0, exports.isService)(clazz)) {
111
+ ComponentScanner.serviceSet.add(clazz);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ catch (err) {
117
+ logger.error?.(`Failed to import file: ${file}`, err);
118
+ }
119
+ }
120
+ logger.info?.("Components scanned and categorized.");
121
+ }
122
+ /**
123
+ * Recursively retrieves all files from a directory.
124
+ * @param dir - The base directory to scan.
125
+ */
126
+ static getFiles(dir) {
127
+ const entries = (0, fs_1.readdirSync)(dir);
128
+ const files = entries.map(entry => {
129
+ const fullPath = (0, path_1.join)(dir, entry);
130
+ return (0, fs_1.statSync)(fullPath).isDirectory() ? ComponentScanner.getFiles(fullPath) : fullPath;
131
+ });
132
+ return files.flat();
133
+ }
134
+ /**
135
+ * Retrieves pre-scanned and categorized components.
136
+ */
137
+ static getCategorizedComponents() {
138
+ return {
139
+ globalControllerAdvices: ComponentScanner.globalControllerAdviceSet,
140
+ controllerAdvices: ComponentScanner.controllerAdviceSet,
141
+ controllers: ComponentScanner.controllerSet,
142
+ services: ComponentScanner.serviceSet,
143
+ repositories: ComponentScanner.repositorySet
144
+ };
145
+ }
146
+ /**
147
+ * Clears all scanned component caches.
148
+ * Useful for testing to ensure clean state between tests.
149
+ */
150
+ static clear() {
151
+ ComponentScanner.globalControllerAdviceSet.clear();
152
+ ComponentScanner.controllerAdviceSet.clear();
153
+ ComponentScanner.controllerSet.clear();
154
+ ComponentScanner.serviceSet.clear();
155
+ ComponentScanner.repositorySet.clear();
156
+ }
157
+ }
158
+ exports.ComponentScanner = ComponentScanner;
159
+ ComponentScanner.globalControllerAdviceSet = new Set();
160
+ ComponentScanner.controllerAdviceSet = new Set();
161
+ ComponentScanner.controllerSet = new Set();
162
+ ComponentScanner.serviceSet = new Set();
163
+ ComponentScanner.repositorySet = new Set();
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29tcG9uZW50LXNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXNKO0FBQ3RKLHNEQUFxRDtBQUNyRCwyQkFBMkM7QUFDM0MsK0JBQXFDO0FBRXJDOztHQUVHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFXLEVBQVcsRUFBRTtJQUNuRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxZQUFZLGdCQUV2QjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQVcsRUFBVyxFQUFFO0lBQ3pELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxvQ0FBMEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUM7QUFGVyxRQUFBLGtCQUFrQixzQkFFN0I7QUFFRjs7R0FFRztBQUNJLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxNQUFXLEVBQVcsRUFBRTtJQUMvRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsMkNBQWlDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRlcsUUFBQSx3QkFBd0IsNEJBRW5DO0FBRUY7O0dBRUc7QUFDSSxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQVcsRUFBVyxFQUFFO0lBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQywwQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFGVyxRQUFBLFNBQVMsYUFFcEI7QUFFRjs7R0FFRztBQUNJLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBVyxFQUFXLEVBQUU7SUFDbkQsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLDZCQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQztBQUZXLFFBQUEsWUFBWSxnQkFFdkI7QUFhRixNQUFhLGdCQUFnQjtJQU8zQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ3RCLE1BQTZFLEVBQzdFLFNBQWlCO1FBRWpCLDZDQUE2QztRQUM3QyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxTQUFTLDZCQUE2QixDQUFDLENBQUM7UUFFbEUsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEIsdUVBQXVFO1lBQ3ZFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUEsY0FBTyxFQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBRWhJLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyx5QkFBYSxJQUFJLHVDQUFDLENBQUM7Z0JBQ2xDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxLQUFLLFlBQVksUUFBUSxJQUFJLElBQUEsdUJBQVcsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNwRCw2Q0FBNkM7d0JBQzdDLDBFQUEwRTt3QkFDMUUsSUFBSSxJQUFBLG9CQUFZLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEIsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDNUMsQ0FBQzs2QkFBTSxJQUFJLElBQUEsMEJBQWtCLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDckMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNsRCxDQUFDOzZCQUFNLElBQUksSUFBQSxnQ0FBd0IsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUMzQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hELENBQUM7NkJBQU0sSUFBSSxJQUFBLG9CQUFZLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDL0IsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDNUMsQ0FBQzs2QkFBTSxJQUFJLElBQUEsaUJBQVMsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUM1QixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6QyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQywwQkFBMEIsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFXO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0JBQVcsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsQyxPQUFPLElBQUEsYUFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0I7UUFDcEMsT0FBTztZQUNMLHVCQUF1QixFQUFFLGdCQUFnQixDQUFDLHlCQUF5QjtZQUNuRSxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUI7WUFDdkQsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGFBQWE7WUFDM0MsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFVBQVU7WUFDckMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLGFBQWE7U0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSztRQUNqQixnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRCxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDOztBQTFGSCw0Q0EyRkM7QUExRmdCLDBDQUF5QixHQUFHLElBQUksR0FBRyxFQUFPLENBQUM7QUFDM0Msb0NBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQU8sQ0FBQztBQUNyQyw4QkFBYSxHQUFHLElBQUksR0FBRyxFQUFPLENBQUM7QUFDL0IsMkJBQVUsR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO0FBQzVCLDhCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdMT0JBTF9DT05UUk9MTEVSX0FEVklDRV9NRVRBREFUQSwgQ09OVFJPTExFUl9BRFZJQ0VfTUVUQURBVEEsIENPTlRST0xMRVJfTUVUQURBVEEsIFNFUlZJQ0VfTUVUQURBVEEsIFJFUE9TSVRPUllfTUVUQURBVEEgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBpc0NvbXBvbmVudCB9IGZyb20gXCIuL2RlY29yYXRvcnMvY29tcG9uZW50XCI7XG5pbXBvcnQgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGV4dG5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNsYXNzIGlzIGEgY29udHJvbGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29udHJvbGxlciA9ICh0YXJnZXQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gUmVmbGVjdC5oYXNNZXRhZGF0YShDT05UUk9MTEVSX01FVEFEQVRBLCB0YXJnZXQpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjbGFzcyBpcyBhIGNvbnRyb2xsZXItc3BlY2lmaWMgYWR2aWNlLlxuICovXG5leHBvcnQgY29uc3QgaXNDb250cm9sbGVyQWR2aWNlID0gKHRhcmdldDogYW55KTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBSZWZsZWN0Lmhhc01ldGFkYXRhKENPTlRST0xMRVJfQURWSUNFX01FVEFEQVRBLCB0YXJnZXQpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjbGFzcyBpcyBhIGdsb2JhbCBjb250cm9sbGVyIGFkdmljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzR2xvYmFsQ29udHJvbGxlckFkdmljZSA9ICh0YXJnZXQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gUmVmbGVjdC5oYXNNZXRhZGF0YShHTE9CQUxfQ09OVFJPTExFUl9BRFZJQ0VfTUVUQURBVEEsIHRhcmdldCk7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNsYXNzIGlzIGEgc2VydmljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2VydmljZSA9ICh0YXJnZXQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gUmVmbGVjdC5oYXNNZXRhZGF0YShTRVJWSUNFX01FVEFEQVRBLCB0YXJnZXQpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjbGFzcyBpcyBhIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JlcG9zaXRvcnkgPSAodGFyZ2V0OiBhbnkpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIFJlZmxlY3QuaGFzTWV0YWRhdGEoUkVQT1NJVE9SWV9NRVRBREFUQSwgdGFyZ2V0KTtcbn07XG5cbi8qKlxuICogQ2xhc3MgdG8gc2NhbiBmb3IgY29tcG9uZW50cyBhbmQgc3RvcmUgdGhlbSBpbiBhIGNhY2hlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpemVkQ29tcG9uZW50cyB7XG4gIGdsb2JhbENvbnRyb2xsZXJBZHZpY2VzOiBTZXQ8RnVuY3Rpb24+O1xuICBjb250cm9sbGVyQWR2aWNlczogU2V0PEZ1bmN0aW9uPjtcbiAgY29udHJvbGxlcnM6IFNldDxGdW5jdGlvbj47XG4gIHNlcnZpY2VzOiBTZXQ8RnVuY3Rpb24+O1xuICByZXBvc2l0b3JpZXM6IFNldDxGdW5jdGlvbj47XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTY2FubmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsQ29udHJvbGxlckFkdmljZVNldCA9IG5ldyBTZXQ8YW55PigpO1xuICBwcml2YXRlIHN0YXRpYyBjb250cm9sbGVyQWR2aWNlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbnRyb2xsZXJTZXQgPSBuZXcgU2V0PGFueT4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VydmljZVNldCA9IG5ldyBTZXQ8YW55PigpO1xuICBwcml2YXRlIHN0YXRpYyByZXBvc2l0b3J5U2V0ID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIFNjYW5zIGEgZGlyZWN0b3J5IGFuZCBjYXRlZ29yaXplcyBjb21wb25lbnRzIGludG8gY29udHJvbGxlcnMsIGFkdmljZXMsIGFuZCBnbG9iYWwgYWR2aWNlcy5cbiAgICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB3aXRoIGluZm8gYW5kIGVycm9yIG1ldGhvZHMuXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIHNjYW4oXG4gICAgbG9nZ2VyOiB7IGluZm8/OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7IGVycm9yPzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIH0sXG4gICAgZGlyZWN0b3J5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2xlYXIgYmVmb3JlIHNjYW5uaW5nIHRvIGFsbG93IHJlLXNjYW5uaW5nXG4gICAgQ29tcG9uZW50U2Nhbm5lci5jbGVhcigpO1xuICAgIGxvZ2dlci5pbmZvPy4oYFNjYW5uaW5nICR7ZGlyZWN0b3J5fSBmb3IgY29tcG9uZW50cyB0byByZWdpc3RlcmApO1xuXG4gICAgY29uc3QgZmlsZXMgPSBDb21wb25lbnRTY2FubmVyLmdldEZpbGVzKGRpcmVjdG9yeSk7XG5cbiAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIC8vIFNraXAgbm9kZV9tb2R1bGVzIGFuZCAuZC50cyBmaWxlcywgYW5kIG9ubHkgaW1wb3J0IC5qcyBhbmQgLnRzIGZpbGVzXG4gICAgICAgIGlmIChmaWxlLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpIHx8IGZpbGUuZW5kc1dpdGgoXCIuZC50c1wiKSB8fCAoZXh0bmFtZShmaWxlKSAhPT0gXCIuanNcIiAmJiBleHRuYW1lKGZpbGUpICE9PSBcIi50c1wiKSkgY29udGludWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydChmaWxlKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kdWxlKSB7XG4gICAgICAgICAgY29uc3QgY2xhenogPSBtb2R1bGVba2V5XTtcbiAgICAgICAgICBpZiAoY2xhenogaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBpc0NvbXBvbmVudChjbGF6eikpIHtcbiAgICAgICAgICAgIC8vIENhdGVnb3JpemUgdGhlIGNvbXBvbmVudCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgICAgICAgICAgLy8gT3JkZXIgbWF0dGVyczogbW9yZSBzcGVjaWZpYyB0eXBlcyBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIGdlbmVyYWwgb25lcy5cbiAgICAgICAgICAgIGlmIChpc0NvbnRyb2xsZXIoY2xhenopKSB7XG4gICAgICAgICAgICAgIENvbXBvbmVudFNjYW5uZXIuY29udHJvbGxlclNldC5hZGQoY2xhenopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbnRyb2xsZXJBZHZpY2UoY2xhenopKSB7XG4gICAgICAgICAgICAgIENvbXBvbmVudFNjYW5uZXIuY29udHJvbGxlckFkdmljZVNldC5hZGQoY2xhenopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0dsb2JhbENvbnRyb2xsZXJBZHZpY2UoY2xhenopKSB7XG4gICAgICAgICAgICAgIENvbXBvbmVudFNjYW5uZXIuZ2xvYmFsQ29udHJvbGxlckFkdmljZVNldC5hZGQoY2xhenopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlcG9zaXRvcnkoY2xhenopKSB7XG4gICAgICAgICAgICAgIENvbXBvbmVudFNjYW5uZXIucmVwb3NpdG9yeVNldC5hZGQoY2xhenopO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NlcnZpY2UoY2xhenopKSB7XG4gICAgICAgICAgICAgIENvbXBvbmVudFNjYW5uZXIuc2VydmljZVNldC5hZGQoY2xhenopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcj8uKGBGYWlsZWQgdG8gaW1wb3J0IGZpbGU6ICR7ZmlsZX1gLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvPy4oXCJDb21wb25lbnRzIHNjYW5uZWQgYW5kIGNhdGVnb3JpemVkLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSByZXRyaWV2ZXMgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gc2Nhbi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhkaXIpO1xuICAgIGNvbnN0IGZpbGVzID0gZW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkpO1xuICAgICAgcmV0dXJuIHN0YXRTeW5jKGZ1bGxQYXRoKS5pc0RpcmVjdG9yeSgpID8gQ29tcG9uZW50U2Nhbm5lci5nZXRGaWxlcyhmdWxsUGF0aCkgOiBmdWxsUGF0aDtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsZXMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBwcmUtc2Nhbm5lZCBhbmQgY2F0ZWdvcml6ZWQgY29tcG9uZW50cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q2F0ZWdvcml6ZWRDb21wb25lbnRzKCk6IENhdGVnb3JpemVkQ29tcG9uZW50cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdsb2JhbENvbnRyb2xsZXJBZHZpY2VzOiBDb21wb25lbnRTY2FubmVyLmdsb2JhbENvbnRyb2xsZXJBZHZpY2VTZXQsXG4gICAgICBjb250cm9sbGVyQWR2aWNlczogQ29tcG9uZW50U2Nhbm5lci5jb250cm9sbGVyQWR2aWNlU2V0LFxuICAgICAgY29udHJvbGxlcnM6IENvbXBvbmVudFNjYW5uZXIuY29udHJvbGxlclNldCxcbiAgICAgIHNlcnZpY2VzOiBDb21wb25lbnRTY2FubmVyLnNlcnZpY2VTZXQsXG4gICAgICByZXBvc2l0b3JpZXM6IENvbXBvbmVudFNjYW5uZXIucmVwb3NpdG9yeVNldFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBzY2FubmVkIGNvbXBvbmVudCBjYWNoZXMuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyB0byBlbnN1cmUgY2xlYW4gc3RhdGUgYmV0d2VlbiB0ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXIoKTogdm9pZCB7XG4gICAgQ29tcG9uZW50U2Nhbm5lci5nbG9iYWxDb250cm9sbGVyQWR2aWNlU2V0LmNsZWFyKCk7XG4gICAgQ29tcG9uZW50U2Nhbm5lci5jb250cm9sbGVyQWR2aWNlU2V0LmNsZWFyKCk7XG4gICAgQ29tcG9uZW50U2Nhbm5lci5jb250cm9sbGVyU2V0LmNsZWFyKCk7XG4gICAgQ29tcG9uZW50U2Nhbm5lci5zZXJ2aWNlU2V0LmNsZWFyKCk7XG4gICAgQ29tcG9uZW50U2Nhbm5lci5yZXBvc2l0b3J5U2V0LmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Autowired decorator for property injection.
3
+ * This decorator marks a property for lazy injection after the class instance is created.
4
+ * The actual dependency resolution happens when the class is instantiated via Injector.getInstance().
5
+ *
6
+ * @param token - The token or class constructor to inject. If not provided, uses the property's design type.
7
+ * @returns {PropertyDecorator} - A property decorator.
8
+ *
9
+ * @implementationNote
10
+ * The Autowired decorator facilitates dependency injection by storing metadata,
11
+ * which the Injector later uses to inject dependencies after construction.
12
+ */
13
+ export declare const Autowired: (token?: Function | symbol) => PropertyDecorator;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ // src/core/decorators/inject.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Autowired = void 0;
5
+ const decorator_factory_1 = require("./decorator-factory");
6
+ /**
7
+ * Autowired decorator for property injection.
8
+ * This decorator marks a property for lazy injection after the class instance is created.
9
+ * The actual dependency resolution happens when the class is instantiated via Injector.getInstance().
10
+ *
11
+ * @param token - The token or class constructor to inject. If not provided, uses the property's design type.
12
+ * @returns {PropertyDecorator} - A property decorator.
13
+ *
14
+ * @implementationNote
15
+ * The Autowired decorator facilitates dependency injection by storing metadata,
16
+ * which the Injector later uses to inject dependencies after construction.
17
+ */
18
+ const Autowired = (token) => {
19
+ return (target, propertyKey) => {
20
+ decorator_factory_1.DecoratorFactory.recordAutowiredProperty(target, propertyKey, token);
21
+ };
22
+ };
23
+ exports.Autowired = Autowired;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3dpcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY29yYXRvcnMvYXV0b3dpcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxnQ0FBZ0M7OztBQUVoQywyREFBdUQ7QUFFdkQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQXlCLEVBQXFCLEVBQUU7SUFDeEUsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRTtRQUM3QixvQ0FBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsU0FBUyxhQUlwQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9jb3JlL2RlY29yYXRvcnMvaW5qZWN0LnRzXG5cbmltcG9ydCB7IERlY29yYXRvckZhY3RvcnkgfSBmcm9tIFwiLi9kZWNvcmF0b3ItZmFjdG9yeVwiO1xuXG4vKipcbiAqIEF1dG93aXJlZCBkZWNvcmF0b3IgZm9yIHByb3BlcnR5IGluamVjdGlvbi5cbiAqIFRoaXMgZGVjb3JhdG9yIG1hcmtzIGEgcHJvcGVydHkgZm9yIGxhenkgaW5qZWN0aW9uIGFmdGVyIHRoZSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkLlxuICogVGhlIGFjdHVhbCBkZXBlbmRlbmN5IHJlc29sdXRpb24gaGFwcGVucyB3aGVuIHRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgdmlhIEluamVjdG9yLmdldEluc3RhbmNlKCkuXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHRva2VuIG9yIGNsYXNzIGNvbnN0cnVjdG9yIHRvIGluamVjdC4gSWYgbm90IHByb3ZpZGVkLCB1c2VzIHRoZSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSAtIEEgcHJvcGVydHkgZGVjb3JhdG9yLlxuICpcbiAqIEBpbXBsZW1lbnRhdGlvbk5vdGVcbiAqIFRoZSBBdXRvd2lyZWQgZGVjb3JhdG9yIGZhY2lsaXRhdGVzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGJ5IHN0b3JpbmcgbWV0YWRhdGEsXG4gKiB3aGljaCB0aGUgSW5qZWN0b3IgbGF0ZXIgdXNlcyB0byBpbmplY3QgZGVwZW5kZW5jaWVzIGFmdGVyIGNvbnN0cnVjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEF1dG93aXJlZCA9ICh0b2tlbj86IEZ1bmN0aW9uIHwgc3ltYm9sKTogUHJvcGVydHlEZWNvcmF0b3IgPT4ge1xuICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICBEZWNvcmF0b3JGYWN0b3J5LnJlY29yZEF1dG93aXJlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHRva2VuKTtcbiAgfTtcbn07XG4iXX0=
@@ -0,0 +1,9 @@
1
+ import "reflect-metadata";
2
+ /**
3
+ * Marks a class as a component for auto-scan and initialization.
4
+ */
5
+ export declare const Component: () => ClassDecorator;
6
+ /**
7
+ * Checks if a class is marked as a component.
8
+ */
9
+ export declare const isComponent: (target: any) => boolean;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isComponent = exports.Component = void 0;
4
+ require("reflect-metadata");
5
+ const COMPONENT_METADATA_KEY = Symbol("Component");
6
+ /**
7
+ * Marks a class as a component for auto-scan and initialization.
8
+ */
9
+ const Component = () => {
10
+ return target => {
11
+ Reflect.defineMetadata(COMPONENT_METADATA_KEY, true, target);
12
+ };
13
+ };
14
+ exports.Component = Component;
15
+ /**
16
+ * Checks if a class is marked as a component.
17
+ */
18
+ const isComponent = (target) => {
19
+ return Reflect.getMetadata(COMPONENT_METADATA_KEY, target) === true;
20
+ };
21
+ exports.isComponent = isComponent;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY29yYXRvcnMvY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDRCQUEwQjtBQUUxQixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVuRDs7R0FFRztBQUNJLE1BQU0sU0FBUyxHQUFHLEdBQW1CLEVBQUU7SUFDNUMsT0FBTyxNQUFNLENBQUMsRUFBRTtRQUNkLE9BQU8sQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsU0FBUyxhQUlwQjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFXLEVBQVcsRUFBRTtJQUNsRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUZXLFFBQUEsV0FBVyxlQUV0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuY29uc3QgQ09NUE9ORU5UX01FVEFEQVRBX0tFWSA9IFN5bWJvbChcIkNvbXBvbmVudFwiKTtcblxuLyoqXG4gKiBNYXJrcyBhIGNsYXNzIGFzIGEgY29tcG9uZW50IGZvciBhdXRvLXNjYW4gYW5kIGluaXRpYWxpemF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgQ29tcG9uZW50ID0gKCk6IENsYXNzRGVjb3JhdG9yID0+IHtcbiAgcmV0dXJuIHRhcmdldCA9PiB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShDT01QT05FTlRfTUVUQURBVEFfS0VZLCB0cnVlLCB0YXJnZXQpO1xuICB9O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjbGFzcyBpcyBtYXJrZWQgYXMgYSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBvbmVudCA9ICh0YXJnZXQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YShDT01QT05FTlRfTUVUQURBVEFfS0VZLCB0YXJnZXQpID09PSB0cnVlO1xufTtcbiJdfQ==
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Decorator Factory to centralize metadata operations.
3
+ */
4
+ export declare class DecoratorFactory {
5
+ /**
6
+ * Record an autowired property for later injection.
7
+ * This does NOT resolve the dependency immediately; it just stores the intent.
8
+ * The Injector will resolve and inject these properties after instance creation.
9
+ *
10
+ * @param target - The target class prototype.
11
+ * @param propertyKey - The property name.
12
+ * @param token - Optional token; defaults to property's design type.
13
+ */
14
+ static recordAutowiredProperty(target: object, propertyKey: string | symbol, token?: Function | symbol): void;
15
+ /**
16
+ * Inject all recorded autowired properties into an instance.
17
+ * Called by Injector after constructing the instance.
18
+ *
19
+ * @param instance - The class instance.
20
+ * @param target - The class constructor.
21
+ */
22
+ static injectAutowiredProperties(instance: any, target: Function): void;
23
+ /**
24
+ * Attach metadata to a method.
25
+ * @param metadataKey - The unique symbol key for the metadata.
26
+ * @param metadataValue - The metadata value to attach.
27
+ * @param target - The target class or prototype.
28
+ * @param propertyKey - The method name.
29
+ */
30
+ static attachMethodMetadata(metadataKey: symbol, metadataValue: any, target: object, propertyKey: string | symbol): void;
31
+ /**
32
+ * Attach metadata to a class.
33
+ * @param metadataKey - The unique symbol key for the metadata.
34
+ * @param metadataValue - The metadata value to attach.
35
+ * @param target - The target class.
36
+ */
37
+ static attachClassMetadata(metadataKey: symbol, metadataValue: Record<PropertyKey, unknown>, target: Function): void;
38
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // src/core/decorators/decorator-factory.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DecoratorFactory = void 0;
5
+ const injector_1 = require("../dependency-injection/injector");
6
+ const symbols_1 = require("../symbols");
7
+ /**
8
+ * Decorator Factory to centralize metadata operations.
9
+ */
10
+ class DecoratorFactory {
11
+ /**
12
+ * Record an autowired property for later injection.
13
+ * This does NOT resolve the dependency immediately; it just stores the intent.
14
+ * The Injector will resolve and inject these properties after instance creation.
15
+ *
16
+ * @param target - The target class prototype.
17
+ * @param propertyKey - The property name.
18
+ * @param token - Optional token; defaults to property's design type.
19
+ */
20
+ static recordAutowiredProperty(target, propertyKey, token) {
21
+ const properties = Reflect.getMetadata(symbols_1.AUTOWIRED_PROPERTIES_METADATA, target) || [];
22
+ properties.push({ key: propertyKey, token });
23
+ Reflect.defineMetadata(symbols_1.AUTOWIRED_PROPERTIES_METADATA, properties, target);
24
+ }
25
+ /**
26
+ * Inject all recorded autowired properties into an instance.
27
+ * Called by Injector after constructing the instance.
28
+ *
29
+ * @param instance - The class instance.
30
+ * @param target - The class constructor.
31
+ */
32
+ static injectAutowiredProperties(instance, target) {
33
+ // Walk the prototype chain to include inherited autowired properties
34
+ let current = target;
35
+ while (current && current !== Object.prototype) {
36
+ const properties = Reflect.getMetadata(symbols_1.AUTOWIRED_PROPERTIES_METADATA, current);
37
+ if (properties) {
38
+ for (const prop of properties) {
39
+ const token = prop.token || Reflect.getMetadata(symbols_1.BUILT_IN_TYPE_METADATA, instance, prop.key);
40
+ if (!token) {
41
+ throw new Error(`Cannot resolve injection token for autowired property '${String(prop.key)}'.`);
42
+ }
43
+ const depInstance = injector_1.Injector.getInstance(token);
44
+ Reflect.defineProperty(instance, prop.key, {
45
+ configurable: false,
46
+ enumerable: true,
47
+ value: depInstance,
48
+ writable: false
49
+ });
50
+ }
51
+ }
52
+ current = Object.getPrototypeOf(current);
53
+ }
54
+ }
55
+ /**
56
+ * Attach metadata to a method.
57
+ * @param metadataKey - The unique symbol key for the metadata.
58
+ * @param metadataValue - The metadata value to attach.
59
+ * @param target - The target class or prototype.
60
+ * @param propertyKey - The method name.
61
+ */
62
+ static attachMethodMetadata(metadataKey, metadataValue, target, propertyKey) {
63
+ Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
64
+ }
65
+ /**
66
+ * Attach metadata to a class.
67
+ * @param metadataKey - The unique symbol key for the metadata.
68
+ * @param metadataValue - The metadata value to attach.
69
+ * @param target - The target class.
70
+ */
71
+ static attachClassMetadata(metadataKey, metadataValue, target) {
72
+ Reflect.defineMetadata(metadataKey, metadataValue, target);
73
+ }
74
+ }
75
+ exports.DecoratorFactory = DecoratorFactory;
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy9kZWNvcmF0b3ItZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTJDOzs7QUFFM0MsK0RBQTREO0FBQzVELHdDQUFtRjtBQUVuRjs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBQzNCOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE1BQWMsRUFBRSxXQUE0QixFQUFFLEtBQXlCO1FBQ3BHLE1BQU0sVUFBVSxHQUNkLE9BQU8sQ0FBQyxXQUFXLENBQUMsdUNBQTZCLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25FLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLGNBQWMsQ0FBQyx1Q0FBNkIsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxRQUFhLEVBQUUsTUFBZ0I7UUFDOUQscUVBQXFFO1FBQ3JFLElBQUksT0FBTyxHQUFRLE1BQU0sQ0FBQztRQUMxQixPQUFPLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sVUFBVSxHQUNkLE9BQU8sQ0FBQyxXQUFXLENBQUMsdUNBQTZCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsZ0NBQXNCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsRyxDQUFDO29CQUNELE1BQU0sV0FBVyxHQUFHLG1CQUFRLENBQUMsV0FBVyxDQUFNLEtBQUssQ0FBQyxDQUFDO29CQUNyRCxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUN6QyxZQUFZLEVBQUUsS0FBSzt3QkFDbkIsVUFBVSxFQUFFLElBQUk7d0JBQ2hCLEtBQUssRUFBRSxXQUFXO3dCQUNsQixRQUFRLEVBQUUsS0FBSztxQkFDaEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQ3pCLFdBQW1CLEVBQ25CLGFBQWtCLEVBQ2xCLE1BQWMsRUFDZCxXQUE0QjtRQUU1QixPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFtQixFQUFFLGFBQTJDLEVBQUUsTUFBZ0I7UUFDM0csT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7Q0FDRjtBQTFFRCw0Q0EwRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvY29yZS9kZWNvcmF0b3JzL2RlY29yYXRvci1mYWN0b3J5LnRzXG5cbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSBcIi4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uL2luamVjdG9yXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFX01FVEFEQVRBLCBBVVRPV0lSRURfUFJPUEVSVElFU19NRVRBREFUQSB9IGZyb20gXCIuLi9zeW1ib2xzXCI7XG5cbi8qKlxuICogRGVjb3JhdG9yIEZhY3RvcnkgdG8gY2VudHJhbGl6ZSBtZXRhZGF0YSBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdG9yRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBSZWNvcmQgYW4gYXV0b3dpcmVkIHByb3BlcnR5IGZvciBsYXRlciBpbmplY3Rpb24uXG4gICAqIFRoaXMgZG9lcyBOT1QgcmVzb2x2ZSB0aGUgZGVwZW5kZW5jeSBpbW1lZGlhdGVseTsgaXQganVzdCBzdG9yZXMgdGhlIGludGVudC5cbiAgICogVGhlIEluamVjdG9yIHdpbGwgcmVzb2x2ZSBhbmQgaW5qZWN0IHRoZXNlIHByb3BlcnRpZXMgYWZ0ZXIgaW5zdGFuY2UgY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNsYXNzIHByb3RvdHlwZS5cbiAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB0b2tlbiAtIE9wdGlvbmFsIHRva2VuOyBkZWZhdWx0cyB0byBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLlxuICAgKi9cbiAgc3RhdGljIHJlY29yZEF1dG93aXJlZFByb3BlcnR5KHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLCB0b2tlbj86IEZ1bmN0aW9uIHwgc3ltYm9sKTogdm9pZCB7XG4gICAgY29uc3QgcHJvcGVydGllczogQXJyYXk8eyBrZXk6IHN0cmluZyB8IHN5bWJvbDsgdG9rZW4/OiBGdW5jdGlvbiB8IHN5bWJvbCB9PiA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFVVE9XSVJFRF9QUk9QRVJUSUVTX01FVEFEQVRBLCB0YXJnZXQpIHx8IFtdO1xuICAgIHByb3BlcnRpZXMucHVzaCh7IGtleTogcHJvcGVydHlLZXksIHRva2VuIH0pO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoQVVUT1dJUkVEX1BST1BFUlRJRVNfTUVUQURBVEEsIHByb3BlcnRpZXMsIHRhcmdldCk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGFsbCByZWNvcmRlZCBhdXRvd2lyZWQgcHJvcGVydGllcyBpbnRvIGFuIGluc3RhbmNlLlxuICAgKiBDYWxsZWQgYnkgSW5qZWN0b3IgYWZ0ZXIgY29uc3RydWN0aW5nIHRoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGluc3RhbmNlIC0gVGhlIGNsYXNzIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGNsYXNzIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgc3RhdGljIGluamVjdEF1dG93aXJlZFByb3BlcnRpZXMoaW5zdGFuY2U6IGFueSwgdGFyZ2V0OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIC8vIFdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmNsdWRlIGluaGVyaXRlZCBhdXRvd2lyZWQgcHJvcGVydGllc1xuICAgIGxldCBjdXJyZW50OiBhbnkgPSB0YXJnZXQ7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgY29uc3QgcHJvcGVydGllczogQXJyYXk8eyBrZXk6IHN0cmluZyB8IHN5bWJvbDsgdG9rZW4/OiBGdW5jdGlvbiB8IHN5bWJvbCB9PiA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQVVUT1dJUkVEX1BST1BFUlRJRVNfTUVUQURBVEEsIGN1cnJlbnQpO1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IHByb3AudG9rZW4gfHwgUmVmbGVjdC5nZXRNZXRhZGF0YShCVUlMVF9JTl9UWVBFX01FVEFEQVRBLCBpbnN0YW5jZSwgcHJvcC5rZXkpO1xuICAgICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgaW5qZWN0aW9uIHRva2VuIGZvciBhdXRvd2lyZWQgcHJvcGVydHkgJyR7U3RyaW5nKHByb3Aua2V5KX0nLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkZXBJbnN0YW5jZSA9IEluamVjdG9yLmdldEluc3RhbmNlPGFueT4odG9rZW4pO1xuICAgICAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UsIHByb3Aua2V5LCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBkZXBJbnN0YW5jZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggbWV0YWRhdGEgdG8gYSBtZXRob2QuXG4gICAqIEBwYXJhbSBtZXRhZGF0YUtleSAtIFRoZSB1bmlxdWUgc3ltYm9sIGtleSBmb3IgdGhlIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSAtIFRoZSBtZXRhZGF0YSB2YWx1ZSB0byBhdHRhY2guXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNsYXNzIG9yIHByb3RvdHlwZS5cbiAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIG1ldGhvZCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIGF0dGFjaE1ldGhvZE1ldGFkYXRhKFxuICAgIG1ldGFkYXRhS2V5OiBzeW1ib2wsXG4gICAgbWV0YWRhdGFWYWx1ZTogYW55LFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2xcbiAgKTogdm9pZCB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIG1ldGFkYXRhIHRvIGEgY2xhc3MuXG4gICAqIEBwYXJhbSBtZXRhZGF0YUtleSAtIFRoZSB1bmlxdWUgc3ltYm9sIGtleSBmb3IgdGhlIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSAtIFRoZSBtZXRhZGF0YSB2YWx1ZSB0byBhdHRhY2guXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGF0dGFjaENsYXNzTWV0YWRhdGEobWV0YWRhdGFLZXk6IHN5bWJvbCwgbWV0YWRhdGFWYWx1ZTogUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiwgdGFyZ2V0OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from "./repository";
2
+ export * from "./autowired";
3
+ export * from "./service";
4
+ export * from "./component";
5
+ export * from "./inject";
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ // src/core/decorators/index.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ __exportStar(require("./repository"), exports);
19
+ __exportStar(require("./autowired"), exports);
20
+ __exportStar(require("./service"), exports);
21
+ __exportStar(require("./component"), exports);
22
+ __exportStar(require("./inject"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCOzs7Ozs7Ozs7Ozs7Ozs7O0FBRS9CLCtDQUE2QjtBQUM3Qiw4Q0FBNEI7QUFDNUIsNENBQTBCO0FBQzFCLDhDQUE0QjtBQUM1QiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvY29yZS9kZWNvcmF0b3JzL2luZGV4LnRzXG5cbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dG93aXJlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbmplY3RcIjtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Inject decorator for property injection.
3
+ * @param token - The token or class constructor to inject. If not provided, uses the property's design type.
4
+ * @returns {PropertyDecorator} - A property decorator.
5
+ *
6
+ * @implementationNote
7
+ * The Inject decorator facilitates dependency injection by retrieving instances
8
+ * from the DI container and assigning them to class properties, promoting loose coupling.
9
+ */
10
+ export declare const Inject: (token?: Function | symbol) => PropertyDecorator;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // src/core/decorators/inject.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Inject = void 0;
5
+ const decorator_factory_1 = require("./decorator-factory");
6
+ /**
7
+ * Inject decorator for property injection.
8
+ * @param token - The token or class constructor to inject. If not provided, uses the property's design type.
9
+ * @returns {PropertyDecorator} - A property decorator.
10
+ *
11
+ * @implementationNote
12
+ * The Inject decorator facilitates dependency injection by retrieving instances
13
+ * from the DI container and assigning them to class properties, promoting loose coupling.
14
+ */
15
+ const Inject = (token) => {
16
+ return (target, propertyKey) => {
17
+ decorator_factory_1.DecoratorFactory.recordAutowiredProperty(target, propertyKey, token);
18
+ };
19
+ };
20
+ exports.Inject = Inject;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY29yYXRvcnMvaW5qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxnQ0FBZ0M7OztBQUVoQywyREFBdUQ7QUFFdkQ7Ozs7Ozs7O0dBUUc7QUFFSSxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQXlCLEVBQXFCLEVBQUU7SUFDckUsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRTtRQUM3QixvQ0FBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsTUFBTSxVQUlqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9jb3JlL2RlY29yYXRvcnMvaW5qZWN0LnRzXG5cbmltcG9ydCB7IERlY29yYXRvckZhY3RvcnkgfSBmcm9tIFwiLi9kZWNvcmF0b3ItZmFjdG9yeVwiO1xuXG4vKipcbiAqIEluamVjdCBkZWNvcmF0b3IgZm9yIHByb3BlcnR5IGluamVjdGlvbi5cbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB0b2tlbiBvciBjbGFzcyBjb25zdHJ1Y3RvciB0byBpbmplY3QuIElmIG5vdCBwcm92aWRlZCwgdXNlcyB0aGUgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gLSBBIHByb3BlcnR5IGRlY29yYXRvci5cbiAqXG4gKiBAaW1wbGVtZW50YXRpb25Ob3RlXG4gKiBUaGUgSW5qZWN0IGRlY29yYXRvciBmYWNpbGl0YXRlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBieSByZXRyaWV2aW5nIGluc3RhbmNlc1xuICogZnJvbSB0aGUgREkgY29udGFpbmVyIGFuZCBhc3NpZ25pbmcgdGhlbSB0byBjbGFzcyBwcm9wZXJ0aWVzLCBwcm9tb3RpbmcgbG9vc2UgY291cGxpbmcuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEluamVjdCA9ICh0b2tlbj86IEZ1bmN0aW9uIHwgc3ltYm9sKTogUHJvcGVydHlEZWNvcmF0b3IgPT4ge1xuICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICBEZWNvcmF0b3JGYWN0b3J5LnJlY29yZEF1dG93aXJlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHRva2VuKTtcbiAgfTtcbn07XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Marks a class as a repository and registers it as a singleton.
3
+ * This is a simplified implementation for DI purposes.
4
+ */
5
+ export declare const Repository: (target: Function) => void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Repository = void 0;
4
+ const service_1 = require("./service");
5
+ const symbols_1 = require("../symbols");
6
+ /**
7
+ * Marks a class as a repository and registers it as a singleton.
8
+ * This is a simplified implementation for DI purposes.
9
+ */
10
+ const Repository = (target) => {
11
+ // Register as a singleton service first
12
+ (0, service_1.Service)()(target);
13
+ // Mark the class as a repository
14
+ Reflect.defineMetadata(symbols_1.REPOSITORY_METADATA, true, target);
15
+ };
16
+ exports.Repository = Repository;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3NpdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQW9DO0FBQ3BDLHdDQUFpRDtBQUVqRDs7O0dBR0c7QUFDSSxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtJQUM3Qyx3Q0FBd0M7SUFDeEMsSUFBQSxpQkFBTyxHQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEIsaUNBQWlDO0lBQ2pDLE9BQU8sQ0FBQyxjQUFjLENBQUMsNkJBQW1CLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUxXLFFBQUEsVUFBVSxjQUtyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSRVBPU0lUT1JZX01FVEFEQVRBIH0gZnJvbSBcIi4uL3N5bWJvbHNcIjtcblxuLyoqXG4gKiBNYXJrcyBhIGNsYXNzIGFzIGEgcmVwb3NpdG9yeSBhbmQgcmVnaXN0ZXJzIGl0IGFzIGEgc2luZ2xldG9uLlxuICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIERJIHB1cnBvc2VzLlxuICovXG5leHBvcnQgY29uc3QgUmVwb3NpdG9yeSA9ICh0YXJnZXQ6IEZ1bmN0aW9uKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIGFzIGEgc2luZ2xldG9uIHNlcnZpY2UgZmlyc3RcbiAgU2VydmljZSgpKHRhcmdldCk7XG4gIC8vIE1hcmsgdGhlIGNsYXNzIGFzIGEgcmVwb3NpdG9yeVxuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFJFUE9TSVRPUllfTUVUQURBVEEsIHRydWUsIHRhcmdldCk7XG59O1xuIl19
@@ -0,0 +1,8 @@
1
+ import { Scope } from "../dependency-injection/injector";
2
+ /**
3
+ * Service decorator marks a class as a service with a specified lifecycle.
4
+ * Services are auto-discovered by ComponentScanner and registered in the DI container.
5
+ * @param lifecycle - The lifecycle of the service (default: Singleton).
6
+ * @returns {ClassDecorator} - The service class decorator.
7
+ */
8
+ export declare const Service: (lifecycle?: Scope) => ClassDecorator;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ // src/core/decorators/repository.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Service = void 0;
5
+ const injector_1 = require("../dependency-injection/injector");
6
+ const component_1 = require("./component");
7
+ const decorator_factory_1 = require("./decorator-factory");
8
+ const symbols_1 = require("../symbols");
9
+ /**
10
+ * Service decorator marks a class as a service with a specified lifecycle.
11
+ * Services are auto-discovered by ComponentScanner and registered in the DI container.
12
+ * @param lifecycle - The lifecycle of the service (default: Singleton).
13
+ * @returns {ClassDecorator} - The service class decorator.
14
+ */
15
+ const Service = (lifecycle = injector_1.Scope.Singleton) => {
16
+ return target => {
17
+ (0, component_1.Component)()(target);
18
+ decorator_factory_1.DecoratorFactory.attachClassMetadata(symbols_1.SERVICE_METADATA, { lifecycle }, target);
19
+ };
20
+ };
21
+ exports.Service = Service;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9DQUFvQzs7O0FBRXBDLCtEQUF5RDtBQUN6RCwyQ0FBd0M7QUFDeEMsMkRBQXVEO0FBQ3ZELHdDQUE4QztBQUU5Qzs7Ozs7R0FLRztBQUNJLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBbUIsZ0JBQUssQ0FBQyxTQUFTLEVBQWtCLEVBQUU7SUFDNUUsT0FBTyxNQUFNLENBQUMsRUFBRTtRQUNkLElBQUEscUJBQVMsR0FBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLG9DQUFnQixDQUFDLG1CQUFtQixDQUFDLDBCQUFnQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBTFcsUUFBQSxPQUFPLFdBS2xCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2NvcmUvZGVjb3JhdG9ycy9yZXBvc2l0b3J5LnRzXG5cbmltcG9ydCB7IFNjb3BlIH0gZnJvbSBcIi4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uL2luamVjdG9yXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IERlY29yYXRvckZhY3RvcnkgfSBmcm9tIFwiLi9kZWNvcmF0b3ItZmFjdG9yeVwiO1xuaW1wb3J0IHsgU0VSVklDRV9NRVRBREFUQSB9IGZyb20gXCIuLi9zeW1ib2xzXCI7XG5cbi8qKlxuICogU2VydmljZSBkZWNvcmF0b3IgbWFya3MgYSBjbGFzcyBhcyBhIHNlcnZpY2Ugd2l0aCBhIHNwZWNpZmllZCBsaWZlY3ljbGUuXG4gKiBTZXJ2aWNlcyBhcmUgYXV0by1kaXNjb3ZlcmVkIGJ5IENvbXBvbmVudFNjYW5uZXIgYW5kIHJlZ2lzdGVyZWQgaW4gdGhlIERJIGNvbnRhaW5lci5cbiAqIEBwYXJhbSBsaWZlY3ljbGUgLSBUaGUgbGlmZWN5Y2xlIG9mIHRoZSBzZXJ2aWNlIChkZWZhdWx0OiBTaW5nbGV0b24pLlxuICogQHJldHVybnMge0NsYXNzRGVjb3JhdG9yfSAtIFRoZSBzZXJ2aWNlIGNsYXNzIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcnZpY2UgPSAobGlmZWN5Y2xlOiBTY29wZSA9IFNjb3BlLlNpbmdsZXRvbik6IENsYXNzRGVjb3JhdG9yID0+IHtcbiAgcmV0dXJuIHRhcmdldCA9PiB7XG4gICAgQ29tcG9uZW50KCkodGFyZ2V0KTtcbiAgICBEZWNvcmF0b3JGYWN0b3J5LmF0dGFjaENsYXNzTWV0YWRhdGEoU0VSVklDRV9NRVRBREFUQSwgeyBsaWZlY3ljbGUgfSwgdGFyZ2V0KTtcbiAgfTtcbn07XG4iXX0=