@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,67 @@
1
+ import "reflect-metadata";
2
+ /**
3
+ * Enum representing the Scope of a component.
4
+ */
5
+ export declare enum Scope {
6
+ Singleton = "Singleton",
7
+ Request = "Request"
8
+ }
9
+ /**
10
+ * Injector class manages dependency registration and retrieval.
11
+ */
12
+ export declare class InjectorClass {
13
+ private singletons;
14
+ private instances;
15
+ private resolving;
16
+ private autoWire;
17
+ /**
18
+ * Resolves a singleton instance.
19
+ * @param target - The class constructor to instantiate.
20
+ * @returns {T} - The instantiated singleton.
21
+ *
22
+ * @implementationNote
23
+ * This method handles instantiation of singletons, ensuring that dependencies are resolved recursively.
24
+ */
25
+ private resolveSingleton;
26
+ /**
27
+ * Retrieves an instance by token or class constructor.
28
+ * @param token - The token (symbol or constructor) to retrieve the instance for.
29
+ * @returns {T} - The instance associated with the token.
30
+ * @throws Will throw an error if no instance is found or if a circular dependency is detected.
31
+ */
32
+ getInstance<T>(token: Function | symbol): T;
33
+ /**
34
+ * Registers an existing instance with a specific token.
35
+ * @param token - The token to register the instance under.
36
+ * @param instance - The instance to associate with the token.
37
+ */
38
+ registerInstance(token: symbol, instance: any): void;
39
+ /**
40
+ * Checks if a component is already registered.
41
+ * @param token - The token (symbol or constructor) to check.
42
+ * @returns {boolean} - True if registered, false otherwise.
43
+ */
44
+ isRegistered(token: Function | symbol): boolean;
45
+ /**
46
+ * Registers a class as a singleton.
47
+ * @param target - The class constructor to register.
48
+ */
49
+ registerSingleton(target: Function): void;
50
+ /**
51
+ * Clears all registered instances and singletons.
52
+ * Useful for testing to ensure clean state between tests.
53
+ */
54
+ clear(): void;
55
+ /**
56
+ * Sets the autoWire flag for the injector.
57
+ * When autoWire is true, the injector will attempt to automatically
58
+ * instantiate and register unregistered class constructors.
59
+ * @param flag - Enable or disable auto-wiring.
60
+ */
61
+ setAutoWire(flag: boolean): void;
62
+ }
63
+ /**
64
+ * Singleton instance of the Injector.
65
+ */
66
+ export declare const Injector: InjectorClass;
67
+ export type InjectorType = InjectorClass;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ // src/core/dependency-injection/injector.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Injector = exports.InjectorClass = exports.Scope = void 0;
5
+ require("reflect-metadata");
6
+ const symbols_1 = require("../symbols");
7
+ const decorator_factory_1 = require("../decorators/decorator-factory");
8
+ /**
9
+ * Enum representing the Scope of a component.
10
+ */
11
+ var Scope;
12
+ (function (Scope) {
13
+ Scope["Singleton"] = "Singleton";
14
+ Scope["Request"] = "Request"; // Future use
15
+ })(Scope || (exports.Scope = Scope = {}));
16
+ /**
17
+ * Injector class manages dependency registration and retrieval.
18
+ */
19
+ class InjectorClass {
20
+ constructor() {
21
+ this.singletons = new Map();
22
+ this.instances = new Map();
23
+ this.resolving = new Set();
24
+ this.autoWire = false;
25
+ }
26
+ /**
27
+ * Resolves a singleton instance.
28
+ * @param target - The class constructor to instantiate.
29
+ * @returns {T} - The instantiated singleton.
30
+ *
31
+ * @implementationNote
32
+ * This method handles instantiation of singletons, ensuring that dependencies are resolved recursively.
33
+ */
34
+ resolveSingleton(target) {
35
+ if (this.singletons.has(target)) {
36
+ const existingInstance = this.singletons.get(target);
37
+ if (existingInstance && typeof existingInstance !== "function") {
38
+ return existingInstance;
39
+ }
40
+ }
41
+ if (this.resolving.has(target)) {
42
+ const chain = Array.from(this.resolving)
43
+ .map(t => t.name)
44
+ .join(" -> ");
45
+ throw new Error(`Injector: Circular dependency detected: ${chain} -> ${target.name}`);
46
+ }
47
+ this.resolving.add(target);
48
+ try {
49
+ // Resolve constructor dependencies
50
+ const paramTypes = Reflect.getMetadata(symbols_1.BUILT_IN_PARAMETER_TYPE_METADATA, target) || [];
51
+ const dependencies = paramTypes.map(param => {
52
+ if (param === Object) {
53
+ throw new Error(`Injector: Failed to resolve dependency for ${target.name}. Did you forget to use @Service or @Repository decorator?`);
54
+ }
55
+ return this.getInstance(param);
56
+ });
57
+ // Instantiate the class with dependencies
58
+ const instance = new target(...dependencies);
59
+ // Inject autowired properties (lazy property injection)
60
+ // This must happen after construction, so dependencies are available
61
+ decorator_factory_1.DecoratorFactory.injectAutowiredProperties(instance, target);
62
+ // Register the singleton instance
63
+ this.singletons.set(target, instance);
64
+ return instance;
65
+ }
66
+ finally {
67
+ this.resolving.delete(target);
68
+ }
69
+ }
70
+ /**
71
+ * Retrieves an instance by token or class constructor.
72
+ * @param token - The token (symbol or constructor) to retrieve the instance for.
73
+ * @returns {T} - The instance associated with the token.
74
+ * @throws Will throw an error if no instance is found or if a circular dependency is detected.
75
+ */
76
+ getInstance(token) {
77
+ const tokenName = typeof token === "function" ? token.name : token.toString();
78
+ // Check if an instance is registered directly via symbol
79
+ if (typeof token === "symbol") {
80
+ if (this.instances.has(token)) {
81
+ return this.instances.get(token);
82
+ }
83
+ else {
84
+ throw new Error(`Injector: No instance registered for token: ${tokenName}`);
85
+ }
86
+ }
87
+ // Check for singleton registration via class constructor
88
+ if (typeof token === "function") {
89
+ if (this.singletons.has(token)) {
90
+ const cached = this.singletons.get(token);
91
+ // If the cached value is a constructor, we need to resolve it (first access)
92
+ if (cached && typeof cached === "function") {
93
+ return this.resolveSingleton(cached);
94
+ }
95
+ else {
96
+ // Return the cached instance directly (subsequent accesses)
97
+ return cached;
98
+ }
99
+ }
100
+ else {
101
+ // Auto-wiring: automatically register and resolve if enabled
102
+ if (this.autoWire) {
103
+ this.registerSingleton(token);
104
+ return this.resolveSingleton(token);
105
+ }
106
+ throw new Error(`Injector: No provider found for token: ${tokenName}. Did you forget to use @Service or @Repository?`);
107
+ }
108
+ }
109
+ throw new Error(`Injector: No provider found for token: ${tokenName}`);
110
+ }
111
+ /**
112
+ * Registers an existing instance with a specific token.
113
+ * @param token - The token to register the instance under.
114
+ * @param instance - The instance to associate with the token.
115
+ */
116
+ registerInstance(token, instance) {
117
+ if (!this.instances.has(token)) {
118
+ this.instances.set(token, instance);
119
+ }
120
+ }
121
+ /**
122
+ * Checks if a component is already registered.
123
+ * @param token - The token (symbol or constructor) to check.
124
+ * @returns {boolean} - True if registered, false otherwise.
125
+ */
126
+ isRegistered(token) {
127
+ if (typeof token === "symbol") {
128
+ return this.instances.has(token);
129
+ }
130
+ return this.singletons.has(token);
131
+ }
132
+ /**
133
+ * Registers a class as a singleton.
134
+ * @param target - The class constructor to register.
135
+ */
136
+ registerSingleton(target) {
137
+ if (!this.singletons.has(target)) {
138
+ this.singletons.set(target, target);
139
+ }
140
+ }
141
+ /**
142
+ * Clears all registered instances and singletons.
143
+ * Useful for testing to ensure clean state between tests.
144
+ */
145
+ clear() {
146
+ this.singletons.clear();
147
+ this.instances.clear();
148
+ this.resolving.clear();
149
+ }
150
+ /**
151
+ * Sets the autoWire flag for the injector.
152
+ * When autoWire is true, the injector will attempt to automatically
153
+ * instantiate and register unregistered class constructors.
154
+ * @param flag - Enable or disable auto-wiring.
155
+ */
156
+ setAutoWire(flag) {
157
+ this.autoWire = flag;
158
+ }
159
+ }
160
+ exports.InjectorClass = InjectorClass;
161
+ /**
162
+ * Singleton instance of the Injector.
163
+ */
164
+ exports.Injector = new InjectorClass();
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24vaW5qZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDRDQUE0Qzs7O0FBRTVDLDRCQUEwQjtBQUMxQix3Q0FBOEQ7QUFDOUQsdUVBQW1FO0FBRW5FOztHQUVHO0FBQ0gsSUFBWSxLQUdYO0FBSEQsV0FBWSxLQUFLO0lBQ2YsZ0NBQXVCLENBQUE7SUFDdkIsNEJBQW1CLENBQUEsQ0FBQyxhQUFhO0FBQ25DLENBQUMsRUFIVyxLQUFLLHFCQUFMLEtBQUssUUFHaEI7QUFFRDs7R0FFRztBQUNILE1BQWEsYUFBYTtJQUExQjtRQUNVLGVBQVUsR0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMzQyxjQUFTLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEMsY0FBUyxHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLGFBQVEsR0FBWSxLQUFLLENBQUM7SUF3SnBDLENBQUM7SUF0SkM7Ozs7Ozs7T0FPRztJQUNNLGdCQUFnQixDQUFJLE1BQWdCO1FBQzFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksZ0JBQWdCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxnQkFBZ0IsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7aUJBQ3JDLEdBQUcsQ0FBQyxDQUFD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LENBQUM7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksV0FBVyxDQUFDLElBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBNUpELHNDQTRKQztBQUVEOztHQUVHO0FBQ1UsUUFBQSxRQUFRLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9jb3JlL2RlcGVuZGVuY3ktaW5qZWN0aW9uL2luamVjdG9yLnRzXG5cbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1BBUkFNRVRFUl9UWVBFX01FVEFEQVRBIH0gZnJvbSBcIi4uL3N5bWJvbHNcIjtcbmltcG9ydCB7IERlY29yYXRvckZhY3RvcnkgfSBmcm9tIFwiLi4vZGVjb3JhdG9ycy9kZWNvcmF0b3ItZmFjdG9yeVwiO1xuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBTY29wZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGVudW0gU2NvcGUge1xuICBTaW5nbGV0b24gPSBcIlNpbmdsZXRvblwiLFxuICBSZXF1ZXN0ID0gXCJSZXF1ZXN0XCIgLy8gRnV0dXJlIHVzZVxufVxuXG4vKipcbiAqIEluamVjdG9yIGNsYXNzIG1hbmFnZXMgZGVwZW5kZW5jeSByZWdpc3RyYXRpb24gYW5kIHJldHJpZXZhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdG9yQ2xhc3Mge1xuICBwcml2YXRlIHNpbmdsZXRvbnM6IE1hcDxGdW5jdGlvbiwgYW55PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBpbnN0YW5jZXM6IE1hcDxzeW1ib2wsIGFueT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVzb2x2aW5nOiBTZXQ8RnVuY3Rpb24+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGF1dG9XaXJlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlLlxuICAgKiBAcmV0dXJucyB7VH0gLSBUaGUgaW5zdGFudGlhdGVkIHNpbmdsZXRvbi5cbiAgICpcbiAgICogQGltcGxlbWVudGF0aW9uTm90ZVxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGluc3RhbnRpYXRpb24gb2Ygc2luZ2xldG9ucywgZW5zdXJpbmcgdGhhdCBkZXBlbmRlbmNpZXMgYXJlIHJlc29sdmVkIHJlY3Vyc2l2ZWx5LlxuICAgKi9cbiAgIHByaXZhdGUgcmVzb2x2ZVNpbmdsZXRvbjxUPih0YXJnZXQ6IEZ1bmN0aW9uKTogVCB7XG4gICAgIGlmICh0aGlzLnNpbmdsZXRvbnMuaGFzKHRhcmdldCkpIHtcbiAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5zaW5nbGV0b25zLmdldCh0YXJnZXQpO1xuICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlICYmIHR5cGVvZiBleGlzdGluZ0luc3RhbmNlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlO1xuICAgICAgIH1cbiAgICAgfVxuXG4gICAgIGlmICh0aGlzLnJlc29sdmluZy5oYXModGFyZ2V0KSkge1xuICAgICAgIGNvbnN0IGNoYWluID0gQXJyYXkuZnJvbSh0aGlzLnJlc29sdmluZylcbiAgICAgICAgIC5tYXAodCA9PiB0Lm5hbWUpXG4gICAgICAgICAuam9pbihcIiAtPiBcIik7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmplY3RvcjogQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogJHtjaGFpbn0gLT4gJHt0YXJnZXQubmFtZX1gKTtcbiAgICAgfVxuXG4gICAgIHRoaXMucmVzb2x2aW5nLmFkZCh0YXJnZXQpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZXNvbHZlIGNvbnN0cnVjdG9yIGRlcGVuZGVuY2llc1xuICAgICAgICBjb25zdCBwYXJhbVR5cGVzOiBGdW5jdGlvbltdID0gUmVmbGVjdC5nZXRNZXRhZGF0YShCVUlMVF9JTl9QQVJBTUVURVJfVFlQRV9NRVRBREFUQSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYXJhbVR5cGVzLm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgaWYgKHBhcmFtID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEluamVjdG9yOiBGYWlsZWQgdG8gcmVzb2x2ZSBkZXBlbmRlbmN5IGZvciAke3RhcmdldC5uYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIEBTZXJ2aWNlIG9yIEBSZXBvc2l0b3J5IGRlY29yYXRvcj9gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZTxhbnk+KHBhcmFtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGNsYXNzIHdpdGggZGVwZW5kZW5jaWVzXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3ICh0YXJnZXQgYXMgYW55KSguLi5kZXBlbmRlbmNpZXMpO1xuXG4gICAgICAgIC8vIEluamVjdCBhdXRvd2lyZWQgcHJvcGVydGllcyAobGF6eSBwcm9wZXJ0eSBpbmplY3Rpb24pXG4gICAgICAgIC8vIFRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgY29uc3RydWN0aW9uLCBzbyBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZVxuICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LmluamVjdEF1dG93aXJlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHRhcmdldCk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICAgICAgICB0aGlzLnNpbmdsZXRvbnMuc2V0KHRhcmdldCwgaW5zdGFuY2UpO1xuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMucmVzb2x2aW5nLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgfVxuICAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgYnkgdG9rZW4gb3IgY2xhc3MgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB0b2tlbiAoc3ltYm9sIG9yIGNvbnN0cnVjdG9yKSB0byByZXRyaWV2ZSB0aGUgaW5zdGFuY2UgZm9yLlxuICAgKiBAcmV0dXJucyB7VH0gLSBUaGUgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi5cbiAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG5vIGluc3RhbmNlIGlzIGZvdW5kIG9yIGlmIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRJbnN0YW5jZTxUPih0b2tlbjogRnVuY3Rpb24gfCBzeW1ib2wpOiBUIHtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB0eXBlb2YgdG9rZW4gPT09IFwiZnVuY3Rpb25cIiA/IHRva2VuLm5hbWUgOiB0b2tlbi50b1N0cmluZygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW4gaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBkaXJlY3RseSB2aWEgc3ltYm9sXG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgaWYgKHRoaXMuaW5zdGFuY2VzLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmdldCh0b2tlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluamVjdG9yOiBObyBpbnN0YW5jZSByZWdpc3RlcmVkIGZvciB0b2tlbjogJHt0b2tlbk5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHNpbmdsZXRvbiByZWdpc3RyYXRpb24gdmlhIGNsYXNzIGNvbnN0cnVjdG9yXG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAodGhpcy5zaW5nbGV0b25zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5zaW5nbGV0b25zLmdldCh0b2tlbik7XG4gICAgICAgIC8vIElmIHRoZSBjYWNoZWQgdmFsdWUgaXMgYSBjb25zdHJ1Y3Rvciwgd2UgbmVlZCB0byByZXNvbHZlIGl0IChmaXJzdCBhY2Nlc3MpXG4gICAgICAgIGlmIChjYWNoZWQgJiYgdHlwZW9mIGNhY2hlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNpbmdsZXRvbjxUPihjYWNoZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiB0aGUgY2FjaGVkIGluc3RhbmNlIGRpcmVjdGx5IChzdWJzZXF1ZW50IGFjY2Vzc2VzKVxuICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF1dG8td2lyaW5nOiBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyIGFuZCByZXNvbHZlIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0b1dpcmUpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyU2luZ2xldG9uKHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2luZ2xldG9uPFQ+KHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEluamVjdG9yOiBObyBwcm92aWRlciBmb3VuZCBmb3IgdG9rZW46ICR7dG9rZW5OYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIEBTZXJ2aWNlIG9yIEBSZXBvc2l0b3J5P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluamVjdG9yOiBObyBwcm92aWRlciBmb3VuZCBmb3IgdG9rZW46ICR7dG9rZW5OYW1lfWApO1xuICB9XG5cbiAgIC8qKlxuICAgICogUmVnaXN0ZXJzIGFuIGV4aXN0aW5nIGluc3RhbmNlIHdpdGggYSBzcGVjaWZpYyB0b2tlbi5cbiAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB0b2tlbiB0byByZWdpc3RlciB0aGUgaW5zdGFuY2UgdW5kZXIuXG4gICAgKiBAcGFyYW0gaW5zdGFuY2UgLSBUaGUgaW5zdGFuY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRva2VuLlxuICAgICovXG4gIHB1YmxpYyByZWdpc3Rlckluc3RhbmNlKHRva2VuOiBzeW1ib2wsIGluc3RhbmNlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VzLmhhcyh0b2tlbikpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldCh0b2tlbiwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgdG9rZW4gKHN5bWJvbCBvciBjb25zdHJ1Y3RvcikgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZCh0b2tlbjogRnVuY3Rpb24gfCBzeW1ib2wpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRva2VuID09PSBcInN5bWJvbFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5oYXModG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGFzIGEgc2luZ2xldG9uLlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyU2luZ2xldG9uKHRhcmdldDogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2luZ2xldG9ucy5oYXModGFyZ2V0KSkge1xuICAgICAgdGhpcy5zaW5nbGV0b25zLnNldCh0YXJnZXQsIHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgICogQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGluc3RhbmNlcyBhbmQgc2luZ2xldG9ucy5cbiAgICAqIFVzZWZ1bCBmb3IgdGVzdGluZyB0byBlbnN1cmUgY2xlYW4gc3RhdGUgYmV0d2VlbiB0ZXN0cy5cbiAgICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaW5nbGV0b25zLmNsZWFyKCk7XG4gICAgdGhpcy5pbnN0YW5jZXMuY2xlYXIoKTtcbiAgICB0aGlzLnJlc29sdmluZy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGF1dG9XaXJlIGZsYWcgZm9yIHRoZSBpbmplY3Rvci5cbiAgICogV2hlbiBhdXRvV2lyZSBpcyB0cnVlLCB0aGUgaW5qZWN0b3Igd2lsbCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHlcbiAgICogaW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIHVucmVnaXN0ZXJlZCBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwYXJhbSBmbGFnIC0gRW5hYmxlIG9yIGRpc2FibGUgYXV0by13aXJpbmcuXG4gICAqL1xuICBwdWJsaWMgc2V0QXV0b1dpcmUoZmxhZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYXV0b1dpcmUgPSBmbGFnO1xuICB9XG59XG5cbi8qKlxuICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBJbmplY3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IEluamVjdG9yID0gbmV3IEluamVjdG9yQ2xhc3MoKTtcblxuZXhwb3J0IHR5cGUgSW5qZWN0b3JUeXBlID0gSW5qZWN0b3JDbGFzcztcbiJdfQ==
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Valid lifecycle events for Controller request handling.
3
+ */
4
+ export type RequestHooks = "preSerialization" | "preValidation" | "preParsing" | "preHandler" | "onResponse" | "onRequest" | "onTimeout" | "onError" | "onSend";
5
+ /**
6
+ * Decorator to register a method as a controller request lifecycle hook.
7
+ * @param name - The name of the controller lifecycle event.
8
+ * @deprecated Use controller-specific hook decorators (@OnRequest, @PreHandler, etc.) instead.
9
+ * This global hook decorator will be removed in a future version.
10
+ */
11
+ export declare const Hook: (name: RequestHooks) => MethodDecorator;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Hook = void 0;
4
+ const registries_1 = require("../registry/registries");
5
+ /**
6
+ * Decorator to register a method as a controller request lifecycle hook.
7
+ * @param name - The name of the controller lifecycle event.
8
+ * @deprecated Use controller-specific hook decorators (@OnRequest, @PreHandler, etc.) instead.
9
+ * This global hook decorator will be removed in a future version.
10
+ */
11
+ const Hook = (name) => (target, propertyKey, descriptor) => {
12
+ if (!descriptor) {
13
+ throw new Error("@Hook can only be applied to methods.");
14
+ }
15
+ const handler = descriptor.value;
16
+ if (typeof handler !== "function") {
17
+ throw new Error("@Hook can only be applied to functions.");
18
+ }
19
+ // Register the hook directly in the registry
20
+ registries_1.requestHooksRegistry.register(name, handler.bind(target));
21
+ };
22
+ exports.Hook = Hook;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9kZWNvcmF0b3JzL2hvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQThEO0FBZ0I5RDs7Ozs7R0FLRztBQUNJLE1BQU0sSUFBSSxHQUNmLENBQUMsSUFBa0IsRUFBbUIsRUFBRSxDQUN4QyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVqQyxJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLGlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUMsQ0FBQztBQWZTLFFBQUEsSUFBSSxRQWViIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVxdWVzdEhvb2tzUmVnaXN0cnkgfSBmcm9tIFwiLi4vcmVnaXN0cnkvcmVnaXN0cmllc1wiO1xuXG4vKipcbiAqIFZhbGlkIGxpZmVjeWNsZSBldmVudHMgZm9yIENvbnRyb2xsZXIgcmVxdWVzdCBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdEhvb2tzID1cbiAgfCBcInByZVNlcmlhbGl6YXRpb25cIlxuICB8IFwicHJlVmFsaWRhdGlvblwiXG4gIHwgXCJwcmVQYXJzaW5nXCJcbiAgfCBcInByZUhhbmRsZXJcIlxuICB8IFwib25SZXNwb25zZVwiXG4gIHwgXCJvblJlcXVlc3RcIlxuICB8IFwib25UaW1lb3V0XCJcbiAgfCBcIm9uRXJyb3JcIlxuICB8IFwib25TZW5kXCI7XG5cbi8qKlxuICogRGVjb3JhdG9yIHRvIHJlZ2lzdGVyIGEgbWV0aG9kIGFzIGEgY29udHJvbGxlciByZXF1ZXN0IGxpZmVjeWNsZSBob29rLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29udHJvbGxlciBsaWZlY3ljbGUgZXZlbnQuXG4gKiBAZGVwcmVjYXRlZCBVc2UgY29udHJvbGxlci1zcGVjaWZpYyBob29rIGRlY29yYXRvcnMgKEBPblJlcXVlc3QsIEBQcmVIYW5kbGVyLCBldGMuKSBpbnN0ZWFkLlxuICogVGhpcyBnbG9iYWwgaG9vayBkZWNvcmF0b3Igd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBIb29rID1cbiAgKG5hbWU6IFJlcXVlc3RIb29rcyk6IE1ldGhvZERlY29yYXRvciA9PlxuICAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQEhvb2sgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBtZXRob2RzLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJASG9vayBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGZ1bmN0aW9ucy5cIik7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGhvb2sgZGlyZWN0bHkgaW4gdGhlIHJlZ2lzdHJ5XG4gICAgcmVxdWVzdEhvb2tzUmVnaXN0cnkucmVnaXN0ZXIobmFtZSwgaGFuZGxlci5iaW5kKHRhcmdldCkpO1xuICB9O1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from "./lifecycle-hooks";
2
+ export * from "./hook";
@@ -0,0 +1,20 @@
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("./lifecycle-hooks"), exports);
19
+ __exportStar(require("./hook"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvZGVjb3JhdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCOzs7Ozs7Ozs7Ozs7Ozs7O0FBRS9CLG9EQUFrQztBQUNsQyx5Q0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvY29yZS9kZWNvcmF0b3JzL2luZGV4LnRzXG5cbmV4cG9ydCAqIGZyb20gXCIuL2xpZmVjeWNsZS1ob29rc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaG9va1wiO1xuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Valid lifecycle events for Fastify lifecycle and autowired initialization.
3
+ */
4
+ export type LifecycleHooks = "PLUGIN_REGISTRATION" | "APP_DESTROY" | "APP_READY" | "APP_START";
5
+ export declare const ApplicationStart: () => MethodDecorator;
6
+ export declare const PluginRegistration: () => MethodDecorator;
7
+ export declare const LifecycleHooks: (hook: LifecycleHooks, decoratorName?: string) => MethodDecorator;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LifecycleHooks = exports.PluginRegistration = exports.ApplicationStart = void 0;
4
+ const registries_1 = require("../registry/registries");
5
+ const ApplicationStart = () => (target, propertyKey, descriptor) => {
6
+ if (registries_1.lifecycleHooksRegistry.hasHandler("APP_START")) {
7
+ throw new Error("@ApplicationStart can only be registered once.");
8
+ }
9
+ (0, exports.LifecycleHooks)("APP_START", "@ApplicationStart")(target, propertyKey, descriptor);
10
+ };
11
+ exports.ApplicationStart = ApplicationStart;
12
+ const PluginRegistration = () => (target, propertyKey, descriptor) => {
13
+ (0, exports.LifecycleHooks)("PLUGIN_REGISTRATION", "@PluginRegistration")(target, propertyKey, descriptor);
14
+ };
15
+ exports.PluginRegistration = PluginRegistration;
16
+ const LifecycleHooks = (hook, decoratorName = "@LifecycleHook") => (target, propertyKey, descriptor) => {
17
+ if (!descriptor) {
18
+ throw new Error(`${decoratorName} can only be applied to methods.`);
19
+ }
20
+ const handler = descriptor.value;
21
+ if (typeof handler !== "function") {
22
+ throw new Error(`${decoratorName} can only be applied to functions.`);
23
+ }
24
+ registries_1.lifecycleHooksRegistry.register(hook, handler.bind(target));
25
+ };
26
+ exports.LifecycleHooks = LifecycleHooks;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWhvb2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL2RlY29yYXRvcnMvbGlmZWN5Y2xlLWhvb2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUFnRTtBQU96RCxNQUFNLGdCQUFnQixHQUFHLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDekYsSUFBSSxtQ0FBc0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUEsc0JBQWMsRUFBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BGLENBQUMsQ0FBQztBQUxXLFFBQUEsZ0JBQWdCLG9CQUszQjtBQUVLLE1BQU0sa0JBQWtCLEdBQUcsR0FBb0IsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUMzRixJQUFBLHNCQUFjLEVBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2hHLENBQUMsQ0FBQztBQUZXLFFBQUEsa0JBQWtCLHNCQUU3QjtBQUVLLE1BQU0sY0FBYyxHQUN6QixDQUFDLElBQW9CLEVBQUUsZ0JBQXdCLGdCQUFnQixFQUFtQixFQUFFLENBQ3BGLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRTtJQUNsQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGFBQWEsa0NBQWtDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVqQyxJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxhQUFhLG9DQUFvQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELG1DQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQztBQVpTLFFBQUEsY0FBYyxrQkFZdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsaWZlY3ljbGVIb29rc1JlZ2lzdHJ5IH0gZnJvbSBcIi4uL3JlZ2lzdHJ5L3JlZ2lzdHJpZXNcIjtcblxuLyoqXG4gKiBWYWxpZCBsaWZlY3ljbGUgZXZlbnRzIGZvciBGYXN0aWZ5IGxpZmVjeWNsZSBhbmQgYXV0b3dpcmVkIGluaXRpYWxpemF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVIb29rcyA9IFwiUExVR0lOX1JFR0lTVFJBVElPTlwiIHwgXCJBUFBfREVTVFJPWVwiIHwgXCJBUFBfUkVBRFlcIiB8IFwiQVBQX1NUQVJUXCI7XG5cbmV4cG9ydCBjb25zdCBBcHBsaWNhdGlvblN0YXJ0ID0gKCk6IE1ldGhvZERlY29yYXRvciA9PiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICBpZiAobGlmZWN5Y2xlSG9va3NSZWdpc3RyeS5oYXNIYW5kbGVyKFwiQVBQX1NUQVJUXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQEFwcGxpY2F0aW9uU3RhcnQgY2FuIG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlLlwiKTtcbiAgfVxuICBMaWZlY3ljbGVIb29rcyhcIkFQUF9TVEFSVFwiLCBcIkBBcHBsaWNhdGlvblN0YXJ0XCIpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xufTtcblxuZXhwb3J0IGNvbnN0IFBsdWdpblJlZ2lzdHJhdGlvbiA9ICgpOiBNZXRob2REZWNvcmF0b3IgPT4gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpID0+IHtcbiAgTGlmZWN5Y2xlSG9va3MoXCJQTFVHSU5fUkVHSVNUUkFUSU9OXCIsIFwiQFBsdWdpblJlZ2lzdHJhdGlvblwiKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbn07XG5cbmV4cG9ydCBjb25zdCBMaWZlY3ljbGVIb29rcyA9XG4gIChob29rOiBMaWZlY3ljbGVIb29rcywgZGVjb3JhdG9yTmFtZTogc3RyaW5nID0gXCJATGlmZWN5Y2xlSG9va1wiKTogTWV0aG9kRGVjb3JhdG9yID0+XG4gICh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZGVjb3JhdG9yTmFtZX0gY2FuIG9ubHkgYmUgYXBwbGllZCB0byBtZXRob2RzLmApO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZGVjb3JhdG9yTmFtZX0gY2FuIG9ubHkgYmUgYXBwbGllZCB0byBmdW5jdGlvbnMuYCk7XG4gICAgfVxuICAgIGxpZmVjeWNsZUhvb2tzUmVnaXN0cnkucmVnaXN0ZXIoaG9vaywgaGFuZGxlci5iaW5kKHRhcmdldCkpO1xuICB9O1xuIl19
File without changes
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ // // src/web/hooks/initialization.ts
3
+ //
4
+ // import { lifecycleHooksRegistry } from "@core/registry/hooks.registry";
5
+ // import { Injector } from "@core/dependency-injection/injector";
6
+ // import { FastifyInstance } from "fastify";
7
+ //
8
+ // import { classLoaderFactory, patchMethods } from "../utils/container.utils";
9
+ //
10
+ // /**
11
+ // * Hook: appInitialization
12
+ // * Registers the Fastify instance and decorates it with a class loader.
13
+ // */
14
+ // lifecycleHooksRegistry.register("appInitialization", (fastify: FastifyInstance) => {
15
+ // fastify.log.trace("Executing appInitialization hook");
16
+ // // Decorate Fastify with the class loader
17
+ // try {
18
+ // fastify.decorate("CLASS_LOADER", classLoaderFactory(Injector));
19
+ // fastify.log.trace("Fastify: Decorated with CLASS_LOADER");
20
+ // } catch (error) {
21
+ // fastify.log.error(error, "Fastify: Failed to decorate with CLASS_LOADER:");
22
+ // }
23
+ // });
24
+ //
25
+ // /**
26
+ // * Hook: beforeControllerCreation
27
+ // * Patches controller methods, e.g., adding logging.
28
+ // */
29
+ // lifecycleHooksRegistry.register("beforeControllerCreation", (fastifyInstance: FastifyInstance, target: Function) => {
30
+ // fastifyInstance.log.info(`Executing beforeControllerCreation hook for ${target.name}`);
31
+ // try {
32
+ // patchMethods(target.prototype); // Patch the prototype to affect all instances
33
+ // fastifyInstance.log.trace(`Patching methods for ${target.name} completed successfully`);
34
+ // } catch (error) {
35
+ // fastifyInstance.log.error(error, `Failed to patch methods for ${target.name}:`);
36
+ // }
37
+ // });
38
+ //
39
+ // /**
40
+ // * Hook: afterControllerCreation
41
+ // * Performs additional setup after controller instantiation.
42
+ // */
43
+ // lifecycleHooksRegistry.register(
44
+ // "afterControllerCreation",
45
+ // async (fastifyInstance: FastifyInstance, target: Function, instance: any) => {
46
+ // fastifyInstance.log.trace(`Executing afterControllerCreation hook for ${target.name}`);
47
+ // try {
48
+ // // Example: Initialize resources or perform additional setup
49
+ // if (typeof instance.initialize === "function") {
50
+ // await instance.initialize();
51
+ // fastifyInstance.log.trace(`Initialized resources for controller '${target.name}'`);
52
+ // }
53
+ //
54
+ // // Example: Register controller-specific plugins or middleware
55
+ // if (Array.isArray(instance.plugins)) {
56
+ // for (const plugin of instance.plugins) {
57
+ // fastifyInstance.register(plugin);
58
+ // fastifyInstance.log.trace(`Registered plugin '${plugin.name}' for controller '${target.name}'`);
59
+ // }
60
+ // }
61
+ //
62
+ // // Implementation Note: Allows controllers to define their own initialization logic
63
+ // // by implementing an `initialize` method or specifying plugins.
64
+ // } catch (error) {
65
+ // fastifyInstance.log.error(error, `Error in afterControllerInitialization hook for ${target.name}:`);
66
+ // throw error; // Optionally re-throw to prevent application from starting
67
+ // }
68
+ // }
69
+ // );
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvaW5pdGlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQztBQUNyQyxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLGtFQUFrRTtBQUNsRSw2Q0FBNkM7QUFDN0MsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSxFQUFFO0FBQ0YsTUFBTTtBQUNOLDZCQUE2QjtBQUM3QiwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLHVGQUF1RjtBQUN2RiwyREFBMkQ7QUFDM0QsOENBQThDO0FBQzlDLFVBQVU7QUFDVixzRUFBc0U7QUFDdEUsaUVBQWlFO0FBQ2pFLHNCQUFzQjtBQUN0QixrRkFBa0Y7QUFDbEYsTUFBTTtBQUNOLE1BQU07QUFDTixFQUFFO0FBQ0YsTUFBTTtBQUNOLG9DQUFvQztBQUNwQyx1REFBdUQ7QUFDdkQsTUFBTTtBQUNOLHdIQUF3SDtBQUN4SCw0RkFBNEY7QUFDNUYsVUFBVTtBQUNWLHFGQUFxRjtBQUNyRiwrRkFBK0Y7QUFDL0Ysc0JBQXNCO0FBQ3RCLHVGQUF1RjtBQUN2RixNQUFNO0FBQ04sTUFBTTtBQUNOLEVBQUU7QUFDRixNQUFNO0FBQ04sbUNBQW1DO0FBQ25DLCtEQUErRDtBQUMvRCxNQUFNO0FBQ04sbUNBQW1DO0FBQ25DLCtCQUErQjtBQUMvQixtRkFBbUY7QUFDbkYsOEZBQThGO0FBQzlGLFlBQVk7QUFDWixxRUFBcUU7QUFDckUseURBQXlEO0FBQ3pELHVDQUF1QztBQUN2Qyw4RkFBOEY7QUFDOUYsVUFBVTtBQUNWLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsK0NBQStDO0FBQy9DLG1EQUFtRDtBQUNuRCw4Q0FBOEM7QUFDOUMsNkdBQTZHO0FBQzdHLFlBQVk7QUFDWixVQUFVO0FBQ1YsRUFBRTtBQUNGLDRGQUE0RjtBQUM1Rix5RUFBeUU7QUFDekUsd0JBQXdCO0FBQ3hCLDZHQUE2RztBQUM3RyxpRkFBaUY7QUFDakYsUUFBUTtBQUNSLE1BQU07QUFDTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLy8gc3JjL3dlYi9ob29rcy9pbml0aWFsaXphdGlvbi50c1xuLy9cbi8vIGltcG9ydCB7IGxpZmVjeWNsZUhvb2tzUmVnaXN0cnkgfSBmcm9tIFwiQGNvcmUvcmVnaXN0cnkvaG9va3MucmVnaXN0cnlcIjtcbi8vIGltcG9ydCB7IEluamVjdG9yIH0gZnJvbSBcIkBjb3JlL2RlcGVuZGVuY3ktaW5qZWN0aW9uL2luamVjdG9yXCI7XG4vLyBpbXBvcnQgeyBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuLy9cbi8vIGltcG9ydCB7IGNsYXNzTG9hZGVyRmFjdG9yeSwgcGF0Y2hNZXRob2RzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRhaW5lci51dGlsc1wiO1xuLy9cbi8vIC8qKlxuLy8gICogSG9vazogYXBwSW5pdGlhbGl6YXRpb25cbi8vICAqIFJlZ2lzdGVycyB0aGUgRmFzdGlmeSBpbnN0YW5jZSBhbmQgZGVjb3JhdGVzIGl0IHdpdGggYSBjbGFzcyBsb2FkZXIuXG4vLyAgKi9cbi8vIGxpZmVjeWNsZUhvb2tzUmVnaXN0cnkucmVnaXN0ZXIoXCJhcHBJbml0aWFsaXphdGlvblwiLCAoZmFzdGlmeTogRmFzdGlmeUluc3RhbmNlKSA9PiB7XG4vLyAgIGZhc3RpZnkubG9nLnRyYWNlKFwiRXhlY3V0aW5nIGFwcEluaXRpYWxpemF0aW9uIGhvb2tcIik7XG4vLyAgIC8vIERlY29yYXRlIEZhc3RpZnkgd2l0aCB0aGUgY2xhc3MgbG9hZGVyXG4vLyAgIHRyeSB7XG4vLyAgICAgZmFzdGlmeS5kZWNvcmF0ZShcIkNMQVNTX0xPQURFUlwiLCBjbGFzc0xvYWRlckZhY3RvcnkoSW5qZWN0b3IpKTtcbi8vICAgICBmYXN0aWZ5LmxvZy50cmFjZShcIkZhc3RpZnk6IERlY29yYXRlZCB3aXRoIENMQVNTX0xPQURFUlwiKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBmYXN0aWZ5LmxvZy5lcnJvcihlcnJvciwgXCJGYXN0aWZ5OiBGYWlsZWQgdG8gZGVjb3JhdGUgd2l0aCBDTEFTU19MT0FERVI6XCIpO1xuLy8gICB9XG4vLyB9KTtcbi8vXG4vLyAvKipcbi8vICAqIEhvb2s6IGJlZm9yZUNvbnRyb2xsZXJDcmVhdGlvblxuLy8gICogUGF0Y2hlcyBjb250cm9sbGVyIG1ldGhvZHMsIGUuZy4sIGFkZGluZyBsb2dnaW5nLlxuLy8gICovXG4vLyBsaWZlY3ljbGVIb29rc1JlZ2lzdHJ5LnJlZ2lzdGVyKFwiYmVmb3JlQ29udHJvbGxlckNyZWF0aW9uXCIsIChmYXN0aWZ5SW5zdGFuY2U6IEZhc3RpZnlJbnN0YW5jZSwgdGFyZ2V0OiBGdW5jdGlvbikgPT4ge1xuLy8gICBmYXN0aWZ5SW5zdGFuY2UubG9nLmluZm8oYEV4ZWN1dGluZyBiZWZvcmVDb250cm9sbGVyQ3JlYXRpb24gaG9vayBmb3IgJHt0YXJnZXQubmFtZX1gKTtcbi8vICAgdHJ5IHtcbi8vICAgICBwYXRjaE1ldGhvZHModGFyZ2V0LnByb3RvdHlwZSk7IC8vIFBhdGNoIHRoZSBwcm90b3R5cGUgdG8gYWZmZWN0IGFsbCBpbnN0YW5jZXNcbi8vICAgICBmYXN0aWZ5SW5zdGFuY2UubG9nLnRyYWNlKGBQYXRjaGluZyBtZXRob2RzIGZvciAke3RhcmdldC5uYW1lfSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG4vLyAgIH0gY2F0Y2ggKGVycm9yKSB7XG4vLyAgICAgZmFzdGlmeUluc3RhbmNlLmxvZy5lcnJvcihlcnJvciwgYEZhaWxlZCB0byBwYXRjaCBtZXRob2RzIGZvciAke3RhcmdldC5uYW1lfTpgKTtcbi8vICAgfVxuLy8gfSk7XG4vL1xuLy8gLyoqXG4vLyAgKiBIb29rOiBhZnRlckNvbnRyb2xsZXJDcmVhdGlvblxuLy8gICogUGVyZm9ybXMgYWRkaXRpb25hbCBzZXR1cCBhZnRlciBjb250cm9sbGVyIGluc3RhbnRpYXRpb24uXG4vLyAgKi9cbi8vIGxpZmVjeWNsZUhvb2tzUmVnaXN0cnkucmVnaXN0ZXIoXG4vLyAgIFwiYWZ0ZXJDb250cm9sbGVyQ3JlYXRpb25cIixcbi8vICAgYXN5bmMgKGZhc3RpZnlJbnN0YW5jZTogRmFzdGlmeUluc3RhbmNlLCB0YXJnZXQ6IEZ1bmN0aW9uLCBpbnN0YW5jZTogYW55KSA9PiB7XG4vLyAgICAgZmFzdGlmeUluc3RhbmNlLmxvZy50cmFjZShgRXhlY3V0aW5nIGFmdGVyQ29udHJvbGxlckNyZWF0aW9uIGhvb2sgZm9yICR7dGFyZ2V0Lm5hbWV9YCk7XG4vLyAgICAgdHJ5IHtcbi8vICAgICAgIC8vIEV4YW1wbGU6IEluaXRpYWxpemUgcmVzb3VyY2VzIG9yIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cFxuLy8gICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5pbml0aWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHtcbi8vICAgICAgICAgYXdhaXQgaW5zdGFuY2UuaW5pdGlhbGl6ZSgpO1xuLy8gICAgICAgICBmYXN0aWZ5SW5zdGFuY2UubG9nLnRyYWNlKGBJbml0aWFsaXplZCByZXNvdXJjZXMgZm9yIGNvbnRyb2xsZXIgJyR7dGFyZ2V0Lm5hbWV9J2ApO1xuLy8gICAgICAgfVxuLy9cbi8vICAgICAgIC8vIEV4YW1wbGU6IFJlZ2lzdGVyIGNvbnRyb2xsZXItc3BlY2lmaWMgcGx1Z2lucyBvciBtaWRkbGV3YXJlXG4vLyAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnN0YW5jZS5wbHVnaW5zKSkge1xuLy8gICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbnN0YW5jZS5wbHVnaW5zKSB7XG4vLyAgICAgICAgICAgZmFzdGlmeUluc3RhbmNlLnJlZ2lzdGVyKHBsdWdpbik7XG4vLyAgICAgICAgICAgZmFzdGlmeUluc3RhbmNlLmxvZy50cmFjZShgUmVnaXN0ZXJlZCBwbHVnaW4gJyR7cGx1Z2luLm5hbWV9JyBmb3IgY29udHJvbGxlciAnJHt0YXJnZXQubmFtZX0nYCk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgIH1cbi8vXG4vLyAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBOb3RlOiBBbGxvd3MgY29udHJvbGxlcnMgdG8gZGVmaW5lIHRoZWlyIG93biBpbml0aWFsaXphdGlvbiBsb2dpY1xuLy8gICAgICAgLy8gYnkgaW1wbGVtZW50aW5nIGFuIGBpbml0aWFsaXplYCBtZXRob2Qgb3Igc3BlY2lmeWluZyBwbHVnaW5zLlxuLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4vLyAgICAgICBmYXN0aWZ5SW5zdGFuY2UubG9nLmVycm9yKGVycm9yLCBgRXJyb3IgaW4gYWZ0ZXJDb250cm9sbGVySW5pdGlhbGl6YXRpb24gaG9vayBmb3IgJHt0YXJnZXQubmFtZX06YCk7XG4vLyAgICAgICB0aHJvdyBlcnJvcjsgLy8gT3B0aW9uYWxseSByZS10aHJvdyB0byBwcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gc3RhcnRpbmdcbi8vICAgICB9XG4vLyAgIH1cbi8vICk7XG4iXX0=
@@ -0,0 +1,23 @@
1
+ export declare class HookRegistry<T extends string> {
2
+ private readonly registry;
3
+ constructor(hookNames: T[]);
4
+ /**
5
+ * Execute all registered handlers for a specific hook.
6
+ * @param hookName - The name of the hook.
7
+ * @param args - Arguments to pass to the handlers.
8
+ */
9
+ execute(hookName: T, ...args: any[]): Promise<void>;
10
+ /**
11
+ * Register a hook function for a specific hook.
12
+ * @param hookName - The name of the hook.
13
+ * @param handler - The function to execute for this hook.
14
+ */
15
+ register(hookName: T, handler: (...args: any[]) => unknown): void;
16
+ hasHandler(hookName: T): boolean;
17
+ /**
18
+ * Get all handlers registered for a specific hook.
19
+ * @param hookName - The name of the hook.
20
+ * @returns Array of registered handlers.
21
+ */
22
+ getHandlers(hookName: T): Array<(...args: any[]) => unknown>;
23
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HookRegistry = void 0;
4
+ class HookRegistry {
5
+ constructor(hookNames) {
6
+ this.registry = {};
7
+ // Initialize registry with empty arrays for each hook
8
+ for (const hookName of hookNames) {
9
+ this.registry[hookName] = [];
10
+ }
11
+ }
12
+ /**
13
+ * Execute all registered handlers for a specific hook.
14
+ * @param hookName - The name of the hook.
15
+ * @param args - Arguments to pass to the handlers.
16
+ */
17
+ async execute(hookName, ...args) {
18
+ if (!this.registry[hookName]) {
19
+ throw new Error(`Hook '${hookName}' is not a valid hook stage.`);
20
+ }
21
+ for (const handler of this.registry[hookName]) {
22
+ await handler(...args);
23
+ }
24
+ }
25
+ /**
26
+ * Register a hook function for a specific hook.
27
+ * @param hookName - The name of the hook.
28
+ * @param handler - The function to execute for this hook.
29
+ */
30
+ register(hookName, handler) {
31
+ if (!this.registry[hookName]) {
32
+ throw new Error(`Hook '${hookName}' is not a valid hook stage.`);
33
+ }
34
+ this.registry[hookName].push(handler);
35
+ }
36
+ hasHandler(hookName) {
37
+ const handlers = this.registry[hookName];
38
+ return handlers.length !== 0;
39
+ }
40
+ /**
41
+ * Get all handlers registered for a specific hook.
42
+ * @param hookName - The name of the hook.
43
+ * @returns Array of registered handlers.
44
+ */
45
+ getHandlers(hookName) {
46
+ return this.registry[hookName] || [];
47
+ }
48
+ }
49
+ exports.HookRegistry = HookRegistry;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9yZWdpc3RyeS9ob29rLnJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQWEsWUFBWTtJQUd2QixZQUFZLFNBQWM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFtRCxDQUFDO1FBRXBFLHNEQUFzRDtRQUN0RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBVyxFQUFFLEdBQUcsSUFBVztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxRQUFRLDhCQUE4QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFFBQVcsRUFBRSxPQUFvQztRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxRQUFRLDhCQUE4QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBVztRQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsUUFBVztRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQXBERCxvQ0FvREMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgSG9va1JlZ2lzdHJ5PFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogUmVjb3JkPFQsIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdW5rbm93bj4+O1xuXG4gIGNvbnN0cnVjdG9yKGhvb2tOYW1lczogVFtdKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IHt9IGFzIFJlY29yZDxULCBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHVua25vd24+PjtcblxuICAgIC8vIEluaXRpYWxpemUgcmVnaXN0cnkgd2l0aCBlbXB0eSBhcnJheXMgZm9yIGVhY2ggaG9va1xuICAgIGZvciAoY29uc3QgaG9va05hbWUgb2YgaG9va05hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5W2hvb2tOYW1lXSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIGZvciBhIHNwZWNpZmljIGhvb2suXG4gICAqIEBwYXJhbSBob29rTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBob29rLlxuICAgKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBoYW5kbGVycy5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaG9va05hbWU6IFQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJlZ2lzdHJ5W2hvb2tOYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIb29rICcke2hvb2tOYW1lfScgaXMgbm90IGEgdmFsaWQgaG9vayBzdGFnZS5gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5yZWdpc3RyeVtob29rTmFtZV0pIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgaG9vayBmdW5jdGlvbiBmb3IgYSBzcGVjaWZpYyBob29rLlxuICAgKiBAcGFyYW0gaG9va05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9vay5cbiAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgdGhpcyBob29rLlxuICAgKi9cbiAgcmVnaXN0ZXIoaG9va05hbWU6IFQsIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWdpc3RyeVtob29rTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSG9vayAnJHtob29rTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGhvb2sgc3RhZ2UuYCk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0cnlbaG9va05hbWVdLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBoYXNIYW5kbGVyKGhvb2tOYW1lOiBUKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLnJlZ2lzdHJ5W2hvb2tOYW1lXTtcbiAgICByZXR1cm4gaGFuZGxlcnMubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBob29rLlxuICAgKiBAcGFyYW0gaG9va05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9vay5cbiAgICogQHJldHVybnMgQXJyYXkgb2YgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICovXG4gIGdldEhhbmRsZXJzKGhvb2tOYW1lOiBUKTogQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnlbaG9va05hbWVdIHx8IFtdO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import { LifecycleHooks } from "../decorators/lifecycle-hooks";
2
+ import { HookRegistry } from "./hook.registry";
3
+ import { RequestHooks } from "../decorators/hook";
4
+ export declare const lifecycleHooksRegistry: HookRegistry<LifecycleHooks>;
5
+ export declare const requestHooksRegistry: HookRegistry<RequestHooks>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestHooksRegistry = exports.lifecycleHooksRegistry = void 0;
4
+ const hook_registry_1 = require("./hook.registry");
5
+ exports.lifecycleHooksRegistry = new hook_registry_1.HookRegistry([
6
+ "PLUGIN_REGISTRATION",
7
+ "APP_DESTROY",
8
+ "APP_READY",
9
+ "APP_START"
10
+ ]);
11
+ // Request Hooks Registry
12
+ exports.requestHooksRegistry = new hook_registry_1.HookRegistry([
13
+ "preSerialization",
14
+ "preValidation",
15
+ "preParsing",
16
+ "preHandler",
17
+ "onResponse",
18
+ "onRequest",
19
+ "onTimeout",
20
+ "onError",
21
+ "onSend"
22
+ ]);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9yZWdpc3RyeS9yZWdpc3RyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1EQUErQztBQUdsQyxRQUFBLHNCQUFzQixHQUFHLElBQUksNEJBQVksQ0FBaUI7SUFDckUscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYixXQUFXO0lBQ1gsV0FBVztDQUNaLENBQUMsQ0FBQztBQUVILHlCQUF5QjtBQUNaLFFBQUEsb0JBQW9CLEdBQUcsSUFBSSw0QkFBWSxDQUFlO0lBQ2pFLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsUUFBUTtDQUNULENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpZmVjeWNsZUhvb2tzIH0gZnJvbSBcIi4uL2RlY29yYXRvcnMvbGlmZWN5Y2xlLWhvb2tzXCI7XG5pbXBvcnQgeyBIb29rUmVnaXN0cnkgfSBmcm9tIFwiLi9ob29rLnJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBSZXF1ZXN0SG9va3MgfSBmcm9tIFwiLi4vZGVjb3JhdG9ycy9ob29rXCI7XG5cbmV4cG9ydCBjb25zdCBsaWZlY3ljbGVIb29rc1JlZ2lzdHJ5ID0gbmV3IEhvb2tSZWdpc3RyeTxMaWZlY3ljbGVIb29rcz4oW1xuICBcIlBMVUdJTl9SRUdJU1RSQVRJT05cIixcbiAgXCJBUFBfREVTVFJPWVwiLFxuICBcIkFQUF9SRUFEWVwiLFxuICBcIkFQUF9TVEFSVFwiXG5dKTtcblxuLy8gUmVxdWVzdCBIb29rcyBSZWdpc3RyeVxuZXhwb3J0IGNvbnN0IHJlcXVlc3RIb29rc1JlZ2lzdHJ5ID0gbmV3IEhvb2tSZWdpc3RyeTxSZXF1ZXN0SG9va3M+KFtcbiAgXCJwcmVTZXJpYWxpemF0aW9uXCIsXG4gIFwicHJlVmFsaWRhdGlvblwiLFxuICBcInByZVBhcnNpbmdcIixcbiAgXCJwcmVIYW5kbGVyXCIsXG4gIFwib25SZXNwb25zZVwiLFxuICBcIm9uUmVxdWVzdFwiLFxuICBcIm9uVGltZW91dFwiLFxuICBcIm9uRXJyb3JcIixcbiAgXCJvblNlbmRcIlxuXSk7XG4iXX0=
@@ -0,0 +1,15 @@
1
+ export * from "./symbols";
2
+ export { ComponentScanner } from "./component-scanner";
3
+ export * from "./decorators";
4
+ export { DecoratorFactory } from "./decorators/decorator-factory";
5
+ export { Injector, Scope } from "./dependency-injection/injector";
6
+ export { lifecycleHooksRegistry, requestHooksRegistry, } from "./hooks/registry/registries";
7
+ export { HookRegistry } from "./hooks/registry/hook.registry";
8
+ export { Hook, RequestHooks, RequestHooks as RequestHook, } from "./hooks/decorators/hook";
9
+ export { LifecycleHooks, ApplicationStart, PluginRegistration, } from "./hooks/decorators/lifecycle-hooks";
10
+ export { MetadataUtils } from "./utils/metadata.utils";
11
+ export { timedFunction } from "./utils/time.utils";
12
+ export { printBanner } from "./utils/banner.utils";
13
+ export { resolveCallerDirectory } from "./utils/path.utils";
14
+ export type { Constructor } from "./types";
15
+ export type { LifecycleHook } from "./lifecycle/lifecycle.interface";