@decaf-ts/injectable-decorators 1.6.1 → 1.6.2

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.
@@ -1,74 +1,102 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inject = exports.injectable = void 0;
3
+ exports.injectable = injectable;
4
+ exports.inject = inject;
4
5
  const constants_1 = require("./constants.cjs");
5
6
  const Injectables_1 = require("./Injectables.cjs");
6
7
  const utils_1 = require("./utils.cjs");
7
8
  /**
8
- * @summary Return the reflection key for injectables
9
- *
10
- * @param {string} key
9
+ * @description Generates a fully qualified reflection metadata key.
10
+ * @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
11
+ * @param {string} key The key to be prefixed
12
+ * @return {string} The fully qualified reflection key
11
13
  * @function getInjectKey
12
- *
13
14
  * @memberOf module:injectable-decorators
14
15
  */
15
16
  const getInjectKey = (key) => constants_1.InjectablesKeys.REFLECT + key;
16
17
  /**
17
- * @summary Defines a class as an injectable
18
+ * @description Decorator that marks a class as available for dependency injection.
19
+ * @summary Defines a class as an injectable singleton that can be retrieved from the registry.
20
+ * When applied to a class, replaces its constructor with one that returns a singleton instance.
18
21
  *
19
- * @param {string} [category] defaults to the class Name. (Useful when minification occours and names are changed so we can no longer rely on the class name, or when we want to upcast the Object)
20
- * @param {boolean} [force] defines if the injectable should override the already existing instance (if any). (only meant for extending decorators
21
- * @param instanceCallback
22
+ * @param {string} [category] Defaults to the class name. Useful when minification occurs and names are changed,
23
+ * or when you want to upcast the object to a different type.
24
+ * @param {boolean} [force] Defines if the injectable should override an already existing instance (if any).
25
+ * Only meant for extending decorators.
26
+ * @param {Function} [instanceCallback] Optional callback function that will be called with the instance after creation.
27
+ * @return {Function} A decorator function that transforms the class into an injectable.
22
28
  *
23
29
  * @function injectable
30
+ * @category Class Decorators
31
+ *
32
+ * @mermaid
33
+ * sequenceDiagram
34
+ * participant Client
35
+ * participant Decorator
36
+ * participant Injectables
24
37
  *
25
- * @memberOf module:injectable-decorators.Decorators
38
+ * Client->>Decorator: @injectable()
39
+ * Decorator->>Decorator: Create new constructor
40
+ *
41
+ * Note over Decorator: When new instance requested
42
+ * Decorator->>Injectables: get(name)
43
+ * alt Instance exists
44
+ * Injectables-->>Decorator: Return existing instance
45
+ * else No instance
46
+ * Decorator->>Injectables: register(original, name)
47
+ * Decorator->>Injectables: get(name)
48
+ * Injectables-->>Decorator: Return new instance
49
+ * opt Has callback
50
+ * Decorator->>Decorator: Call instanceCallback
51
+ * end
52
+ * end
53
+ * Decorator->>Decorator: Define metadata
54
+ * Decorator-->>Client: Return instance
26
55
  */
27
- const injectable = (category = undefined, force = false, instanceCallback) =>
28
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
- (original, propertyKey) => {
30
- const name = category || original.name;
31
- // the new constructor behaviour
32
- const newConstructor = function (...args) {
33
- let inj = Injectables_1.Injectables.get(name, ...args);
34
- if (!inj) {
35
- Injectables_1.Injectables.register(original, name, true, force);
36
- inj = Injectables_1.Injectables.get(name, ...args);
37
- if (!inj)
38
- return undefined;
39
- if (instanceCallback)
40
- try {
41
- instanceCallback(inj);
42
- }
43
- catch (e) {
44
- console.error(`Failed to call injectable callback for ${name}: ${e}`);
45
- }
46
- }
47
- const metadata = Object.assign({}, {
48
- class: name,
56
+ function injectable(category = undefined, force = false, instanceCallback) {
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
+ return (original, propertyKey) => {
59
+ const name = category || original.name;
60
+ // the new constructor behaviour
61
+ const newConstructor = function (...args) {
62
+ let inj = Injectables_1.Injectables.get(name, ...args);
63
+ if (!inj) {
64
+ Injectables_1.Injectables.register(original, name, true, force);
65
+ inj = Injectables_1.Injectables.get(name, ...args);
66
+ if (!inj)
67
+ return undefined;
68
+ if (instanceCallback)
69
+ try {
70
+ instanceCallback(inj);
71
+ }
72
+ catch (e) {
73
+ console.error(`Failed to call injectable callback for ${name}: ${e}`);
74
+ }
75
+ }
76
+ const metadata = Object.assign({}, {
77
+ class: name,
78
+ });
79
+ Reflect.defineMetadata(getInjectKey(constants_1.InjectablesKeys.INJECTABLE), metadata, inj.constructor);
80
+ return inj;
81
+ };
82
+ // copy prototype so instanceof operator still works
83
+ newConstructor.prototype = original.prototype;
84
+ // newConstructor.__proto__ = original.__proto__;
85
+ // Sets the proper constructor name for type verification
86
+ Object.defineProperty(newConstructor, "name", {
87
+ writable: false,
88
+ enumerable: true,
89
+ configurable: false,
90
+ value: original.prototype.constructor.name,
49
91
  });
50
- Reflect.defineMetadata(getInjectKey(constants_1.InjectablesKeys.INJECTABLE), metadata, inj.constructor);
51
- return inj;
92
+ // return new constructor (will override original)
93
+ return newConstructor;
52
94
  };
53
- // copy prototype so instanceof operator still works
54
- newConstructor.prototype = original.prototype;
55
- // newConstructor.__proto__ = original.__proto__;
56
- // Sets the proper constructor name for type verification
57
- Object.defineProperty(newConstructor, "name", {
58
- writable: false,
59
- enumerable: true,
60
- configurable: false,
61
- value: original.prototype.constructor.name,
62
- });
63
- // return new constructor (will override original)
64
- return newConstructor;
65
- };
66
- exports.injectable = injectable;
95
+ }
67
96
  /**
68
- * @summary Allows for the injection of an {@link injectable} decorated dependency
69
- * @description the property must be typed for the requested dependency.
70
- *
71
- * Only concrete classes. No generics are supported
97
+ * @description Property decorator that injects a dependency into a class property.
98
+ * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
99
+ * The property must be typed for the requested dependency. Only concrete classes are supported; generics are not.
72
100
  *
73
101
  * Injected properties should be described like so:
74
102
  * <pre>
@@ -83,54 +111,86 @@ exports.injectable = injectable;
83
111
  * </pre>
84
112
  *
85
113
  * where InjectableClass is the class you want to inject.
86
- * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined
87
- * For project where minification occours, you should use the category param to ensure the name is the same throughout
114
+ * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined.
115
+ * For projects where minification occurs, you should use the category param to ensure the name is the same throughout.
88
116
  *
89
- * @param {string} [category] defaults to the class Name. (Useful when minification occours and names are changed so we can no longer rely on the class name, or when we want to upcast the Object)
90
- * @param {InstanceTransformer} [transformer]
117
+ * @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
118
+ * and names are changed, or when you want to upcast the object to a different type.
119
+ * @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
120
+ * @return {Function} A property decorator function that sets up the dependency injection.
91
121
  *
92
122
  * @function inject
123
+ * @category Property Decorators
124
+ *
125
+ * @mermaid
126
+ * sequenceDiagram
127
+ * participant Client
128
+ * participant Decorator
129
+ * participant Injectables
93
130
  *
94
- * @memberOf module:injectable-decorators.Decorators
131
+ * Client->>Decorator: @inject()
132
+ * Decorator->>Decorator: Get type from property
133
+ * Decorator->>Decorator: Define metadata
134
+ * Decorator->>Decorator: Define property getter
135
+ *
136
+ * Note over Decorator: When property accessed
137
+ * Client->>Decorator: access property
138
+ * Decorator->>Decorator: Check if instance exists
139
+ * alt Instance exists in WeakMap
140
+ * Decorator-->>Client: Return cached instance
141
+ * else No instance
142
+ * Decorator->>Injectables: get(name)
143
+ * alt Injectable found
144
+ * Injectables-->>Decorator: Return injectable instance
145
+ * opt Has transformer
146
+ * Decorator->>Decorator: Call transformer
147
+ * end
148
+ * Decorator->>Decorator: Store in WeakMap
149
+ * Decorator-->>Client: Return instance
150
+ * else No injectable
151
+ * Decorator-->>Client: Throw error
152
+ * end
153
+ * end
95
154
  */
96
- const inject = (category, transformer) => (target, propertyKey) => {
97
- const values = new WeakMap();
98
- const name = category || (0, utils_1.getTypeFromDecorator)(target, propertyKey);
99
- if (!name)
100
- throw new Error(`Could not get Type from decorator`);
101
- Reflect.defineMetadata(getInjectKey(constants_1.InjectablesKeys.INJECT), {
102
- injectable: name,
103
- }, target, propertyKey);
104
- Object.defineProperty(target, propertyKey, {
105
- configurable: true,
106
- get() {
107
- const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
108
- if (descriptor.configurable) {
109
- Object.defineProperty(this, propertyKey, {
110
- enumerable: true,
111
- configurable: false,
112
- get() {
113
- let obj = values.get(this);
114
- if (!obj) {
115
- obj = Injectables_1.Injectables.get(name);
116
- if (!obj)
117
- throw new Error(`Could not get Injectable ${name} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
118
- if (transformer)
119
- try {
120
- obj = transformer(obj, target);
121
- }
122
- catch (e) {
123
- console.error(e);
124
- }
125
- values.set(this, obj);
126
- }
127
- return obj;
128
- },
129
- });
130
- return this[propertyKey];
131
- }
132
- },
133
- });
134
- };
135
- exports.inject = inject;
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE4QztBQUM5QyxtREFBNEM7QUFDNUMsdUNBQStDO0FBRS9DOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsMkJBQWUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBRXBFOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLFVBQVUsR0FDckIsQ0FDRSxXQUErQixTQUFTLEVBQ3hDLFFBQWlCLEtBQUssRUFDdEIsZ0JBQTBELEVBQzFELEVBQUU7QUFDSiw2REFBNkQ7QUFDN0QsQ0FBQyxRQUFhLEVBQUUsV0FBaUIsRUFBRSxFQUFFO0lBQ25DLE1BQU0sSUFBSSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLGdDQUFnQztJQUNoQyxNQUFNLGNBQWMsR0FBUSxVQUFVLEdBQUcsSUFBVztRQUNsRCxJQUFJLEdBQUcsR0FBUSx5QkFBVyxDQUFDLEdBQUcsQ0FBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxHQUFHLEdBQUcseUJBQVcsQ0FBQyxHQUFHLENBQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFFM0IsSUFBSSxnQkFBZ0I7Z0JBQ2xCLElBQUksQ0FBQztvQkFDSCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO29CQUNoQixPQUFPLENBQUMsS0FBSyxDQUNYLDBDQUEwQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQ3ZELENBQUM7Z0JBQ0osQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUM1QixFQUFFLEVBQ0Y7WUFDRSxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQ0YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxjQUFjLENBQ3BCLFlBQVksQ0FBQywyQkFBZSxDQUFDLFVBQVUsQ0FBQyxFQUN4QyxRQUFRLEVBQ1IsR0FBRyxDQUFDLFdBQVcsQ0FDaEIsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsb0RBQW9EO0lBQ3BELGNBQWMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUM5QyxpREFBaUQ7SUFDakQseURBQXlEO0lBQ3pELE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRTtRQUM1QyxRQUFRLEVBQUUsS0FBSztRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFlBQVksRUFBRSxLQUFLO1FBQ25CLEtBQUssRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJO0tBQzNDLENBQUMsQ0FBQztJQUNILGtEQUFrRDtJQUNsRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUM7QUF2RFMsUUFBQSxVQUFVLGNBdURuQjtBQVlKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0ksTUFBTSxNQUFNLEdBQ2pCLENBQUMsUUFBaUIsRUFBRSxXQUFpQyxFQUFFLEVBQUUsQ0FDekQsQ0FBQyxNQUFXLEVBQUUsV0FBaUIsRUFBRSxFQUFFO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFFN0IsTUFBTSxJQUFJLEdBQ1IsUUFBUSxJQUFJLElBQUEsNEJBQW9CLEVBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxJQUFJO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sQ0FBQyxjQUFjLENBQ3BCLFlBQVksQ0FBQywyQkFBZSxDQUFDLE1BQU0sQ0FBQyxFQUNwQztRQUNFLFVBQVUsRUFBRSxJQUFJO0tBQ2pCLEVBQ0QsTUFBTSxFQUNOLFdBQVcsQ0FDWixDQUFDO0lBRUYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFO1FBQ3pDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLEdBQUc7WUFDRCxNQUFNLFVBQVUsR0FBdUIsTUFBTSxDQUFDLHdCQUF3QixDQUNwRSxNQUFNLEVBQ04sV0FBVyxDQUNVLENBQUM7WUFDeEIsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtvQkFDdkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFlBQVksRUFBRSxLQUFLO29CQUNuQixHQUFHO3dCQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzNCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDVCxHQUFHLEdBQUcseUJBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzVCLElBQUksQ0FBQyxHQUFHO2dDQUNOLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEJBQTRCLElBQUksaUJBQWlCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLFdBQVcsRUFBRSxDQUMvSCxDQUFDOzRCQUNKLElBQUksV0FBVztnQ0FDYixJQUFJLENBQUM7b0NBQ0gsR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0NBQ2pDLENBQUM7Z0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQ0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixDQUFDOzRCQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN4QixDQUFDO3dCQUNELE9BQU8sR0FBRyxDQUFDO29CQUNiLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBcERTLFFBQUEsTUFBTSxVQW9EZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0VHlwZUZyb21EZWNvcmF0b3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgcmVmbGVjdGlvbiBrZXkgZm9yIGluamVjdGFibGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQGZ1bmN0aW9uIGdldEluamVjdEtleVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmNvbnN0IGdldEluamVjdEtleSA9IChrZXk6IHN0cmluZykgPT4gSW5qZWN0YWJsZXNLZXlzLlJFRkxFQ1QgKyBrZXk7XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBkZWZhdWx0cyB0byB0aGUgY2xhc3MgTmFtZS4gKFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2NvdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCBzbyB3ZSBjYW4gbm8gbG9uZ2VyIHJlbHkgb24gdGhlIGNsYXNzIG5hbWUsIG9yIHdoZW4gd2Ugd2FudCB0byB1cGNhc3QgdGhlIE9iamVjdClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSBkZWZpbmVzIGlmIHRoZSBpbmplY3RhYmxlIHNob3VsZCBvdmVycmlkZSB0aGUgYWxyZWFkeSBleGlzdGluZyBpbnN0YW5jZSAoaWYgYW55KS4gKG9ubHkgbWVhbnQgZm9yIGV4dGVuZGluZyBkZWNvcmF0b3JzXG4gKiBAcGFyYW0gaW5zdGFuY2VDYWxsYmFja1xuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnMuRGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgaW5qZWN0YWJsZSA9XG4gIChcbiAgICBjYXRlZ29yeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5zdGFuY2VDYWxsYmFjaz86IChpbnN0YW5jZTogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxuICApID0+XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBsZXQgaW5qOiBhbnkgPSBJbmplY3RhYmxlcy5nZXQ8YW55PihuYW1lLCAuLi5hcmdzKTtcbiAgICAgIGlmICghaW5qKSB7XG4gICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBuYW1lLCB0cnVlLCBmb3JjZSk7XG4gICAgICAgIGluaiA9IEluamVjdGFibGVzLmdldDxhbnk+KG5hbWUsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoIWluaikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaW5zdGFuY2VDYWxsYmFjaylcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2VDYWxsYmFjayhpbmopO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBjYWxsIGluamVjdGFibGUgY2FsbGJhY2sgZm9yICR7bmFtZX06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzOiBuYW1lLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgaW5qLmNvbnN0cnVjdG9yXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gaW5qO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIG5ld0NvbnN0cnVjdG9yLl9fcHJvdG9fXyA9IG9yaWdpbmFsLl9fcHJvdG9fXztcbiAgICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgICB9KTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcblxuLyoqXG4gKiBAc3VtbWFyeSBmdW5jdGlvbiB3aXRjaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfVxuICpcbiAqIEBwYXJhbSB7YW55fSBpbmplY3RhYmxlXG4gKiBAcGFyYW0ge2FueX0gb2JqIHRoZSBvYmogdGhlIGluamVjdGFibGUgd2lsbCBiZSBpbmplY3RlZCBvblxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlVHJhbnNmb3JtZXIgPSAoaW5qZWN0YWJsZTogYW55LCBvYmo6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3lcbiAqIEBkZXNjcmlwdGlvbiB0aGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LlxuICpcbiAqIE9ubHkgY29uY3JldGUgY2xhc3Nlcy4gTm8gZ2VuZXJpY3MgYXJlIHN1cHBvcnRlZFxuICpcbiAqIEluamVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBsaWtlIHNvOlxuICogPHByZT5cbiAqICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAuLi5cbiAqXG4gKiAgICAgICAgIEBpbmplY3QoKVxuICogICAgICAgICBwcm9wZXJ0eU5hbWUhOiBJbmplY3RhYmxlQ2xhc3M7XG4gKlxuICogICAgICAgICAuLi5cbiAqICAgICB9XG4gKiA8L3ByZT5cbiAqXG4gKiB3aGVyZSBJbmplY3RhYmxlQ2xhc3MgaXMgdGhlIGNsYXNzIHlvdSB3YW50IHRvIGluamVjdC5cbiAqIE5vdGljZSB0aGUgdXNlIG9mICchOicgdG8gZW5zdXJlIHRoZSB0cmFuc3BpbGVyIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBidXQgd2lsbCBhbHdheXMgYmUgZGVmaW5lZFxuICogRm9yIHByb2plY3Qgd2hlcmUgbWluaWZpY2F0aW9uIG9jY291cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIGRlZmF1bHRzIHRvIHRoZSBjbGFzcyBOYW1lLiAoVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY291cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkIHNvIHdlIGNhbiBubyBsb25nZXIgcmVseSBvbiB0aGUgY2xhc3MgbmFtZSwgb3Igd2hlbiB3ZSB3YW50IHRvIHVwY2FzdCB0aGUgT2JqZWN0KVxuICogQHBhcmFtIHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzLkRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluamVjdCA9XG4gIChjYXRlZ29yeT86IHN0cmluZywgdHJhbnNmb3JtZXI/OiBJbnN0YW5jZVRyYW5zZm9ybWVyKSA9PlxuICAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIGNvbnN0IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBjYXRlZ29yeSB8fCBnZXRUeXBlRnJvbURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCBUeXBlIGZyb20gZGVjb3JhdG9yYCk7XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvYmogPSB0cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCBvYmopO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbiJdfQ==
155
+ function inject(category, transformer) {
156
+ return (target, propertyKey) => {
157
+ const values = new WeakMap();
158
+ const name = category || (0, utils_1.getTypeFromDecorator)(target, propertyKey);
159
+ if (!name)
160
+ throw new Error(`Could not get Type from decorator`);
161
+ Reflect.defineMetadata(getInjectKey(constants_1.InjectablesKeys.INJECT), {
162
+ injectable: name,
163
+ }, target, propertyKey);
164
+ Object.defineProperty(target, propertyKey, {
165
+ configurable: true,
166
+ get() {
167
+ const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
168
+ if (descriptor.configurable) {
169
+ Object.defineProperty(this, propertyKey, {
170
+ enumerable: true,
171
+ configurable: false,
172
+ get() {
173
+ let obj = values.get(this);
174
+ if (!obj) {
175
+ obj = Injectables_1.Injectables.get(name);
176
+ if (!obj)
177
+ throw new Error(`Could not get Injectable ${name} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
178
+ if (transformer)
179
+ try {
180
+ obj = transformer(obj, target);
181
+ }
182
+ catch (e) {
183
+ console.error(e);
184
+ }
185
+ values.set(this, obj);
186
+ }
187
+ return obj;
188
+ },
189
+ });
190
+ return this[propertyKey];
191
+ }
192
+ },
193
+ });
194
+ };
195
+ }
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcURBLGdDQXVEQztBQXlFRCx3QkFvREM7QUF6T0QsK0NBQThDO0FBQzlDLG1EQUE0QztBQUM1Qyx1Q0FBK0M7QUFFL0M7Ozs7Ozs7R0FPRztBQUNILE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQywyQkFBZSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFFcEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixXQUErQixTQUFTLEVBQ3hDLFFBQWlCLEtBQUssRUFDdEIsZ0JBQTBEO0lBRTFELDZEQUE2RDtJQUM3RCxPQUFPLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMxQyxNQUFNLElBQUksR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDaEMsTUFBTSxjQUFjLEdBQVEsVUFBVSxHQUFHLElBQVc7WUFDbEQsSUFBSSxHQUFHLEdBQVEseUJBQVcsQ0FBQyxHQUFHLENBQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULHlCQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNsRCxHQUFHLEdBQUcseUJBQVcsQ0FBQyxHQUFHLENBQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxHQUFHO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUUzQixJQUFJLGdCQUFnQjtvQkFDbEIsSUFBSSxDQUFDO3dCQUNILGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN4QixD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b0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3Q0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNuQixDQUFDO2dDQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN4QixDQUFDOzRCQUNELE9BQU8sR0FBRyxDQUFDO3dCQUNiLENBQUM7cUJBQ0YsQ0FBQyxDQUFDO29CQUNILE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5LlxuICogQHN1bW1hcnkgUmV0dXJucyB0aGUgcmVmbGVjdGlvbiBrZXkgZm9yIGluamVjdGFibGVzIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIGJhc2UgcmVmbGVjdGlvbiBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIGtleVxuICogQGZ1bmN0aW9uIGdldEluamVjdEtleVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgc2luZ2xldG9uIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSBEZWZpbmVzIGlmIHRoZSBpbmplY3RhYmxlIHNob3VsZCBvdmVycmlkZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGluc3RhbmNlIChpZiBhbnkpLlxuICogT25seSBtZWFudCBmb3IgZXh0ZW5kaW5nIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5zdGFuY2VDYWxsYmFja10gT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpbnN0YW5jZSBhZnRlciBjcmVhdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdGFibGUoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENyZWF0ZSBuZXcgY29uc3RydWN0b3JcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gbmV3IGluc3RhbmNlIHJlcXVlc3RlZFxuICogICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHNcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBleGlzdGluZyBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKG9yaWdpbmFsLCBuYW1lKVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgICBvcHQgSGFzIGNhbGxiYWNrXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgaW5zdGFuY2VDYWxsYmFja1xuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICBmb3JjZTogYm9vbGVhbiA9IGZhbHNlLFxuICBpbnN0YW5jZUNhbGxiYWNrPzogKGluc3RhbmNlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG4pIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBsZXQgaW5qOiBhbnkgPSBJbmplY3RhYmxlcy5nZXQ8YW55PihuYW1lLCAuLi5hcmdzKTtcbiAgICAgIGlmICghaW5qKSB7XG4gICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBuYW1lLCB0cnVlLCBmb3JjZSk7XG4gICAgICAgIGluaiA9IEluamVjdGFibGVzLmdldDxhbnk+KG5hbWUsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoIWluaikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaW5zdGFuY2VDYWxsYmFjaylcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2VDYWxsYmFjayhpbmopO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBjYWxsIGluamVjdGFibGUgY2FsbGJhY2sgZm9yICR7bmFtZX06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzOiBuYW1lLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgaW5qLmNvbnN0cnVjdG9yXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gaW5qO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIG5ld0NvbnN0cnVjdG9yLl9fcHJvdG9fXyA9IG9yaWdpbmFsLl9fcHJvdG9fXztcbiAgICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgICB9KTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHR5cGUgZm9yIHRyYW5zZm9ybWluZyBpbmplY3RhYmxlIGluc3RhbmNlcyBiZWZvcmUgdGhleSdyZSBpbmplY3RlZC5cbiAqIEBzdW1tYXJ5IEZ1bmN0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSBjYWNoZWQge0BsaW5rIGluamVjdGFibGV9IGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkIGludG8gYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbmplY3RhYmxlIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRoZSBpbmplY3RhYmxlIHdpbGwgYmUgaW5qZWN0ZWQgb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHRyYW5zZm9ybWVkIGluamVjdGFibGUgaW5zdGFuY2VcbiAqXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IEluc3RhbmNlVHJhbnNmb3JtZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlVHJhbnNmb3JtZXIgPSAoaW5qZWN0YWJsZTogYW55LCBvYmo6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEluamVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBsaWtlIHNvOlxuICogPHByZT5cbiAqICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAuLi5cbiAqXG4gKiAgICAgICAgIEBpbmplY3QoKVxuICogICAgICAgICBwcm9wZXJ0eU5hbWUhOiBJbmplY3RhYmxlQ2xhc3M7XG4gKlxuICogICAgICAgICAuLi5cbiAqICAgICB9XG4gKiA8L3ByZT5cbiAqXG4gKiB3aGVyZSBJbmplY3RhYmxlQ2xhc3MgaXMgdGhlIGNsYXNzIHlvdSB3YW50IHRvIGluamVjdC5cbiAqIE5vdGljZSB0aGUgdXNlIG9mICchOicgdG8gZW5zdXJlIHRoZSB0cmFuc3BpbGVyIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBidXQgd2lsbCBhbHdheXMgYmUgZGVmaW5lZC5cbiAqIEZvciBwcm9qZWN0cyB3aGVyZSBtaW5pZmljYXRpb24gb2NjdXJzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgY2F0ZWdvcnkgcGFyYW0gdG8gZW5zdXJlIHRoZSBuYW1lIGlzIHRoZSBzYW1lIHRocm91Z2hvdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2VUcmFuc2Zvcm1lcn0gW3RyYW5zZm9ybWVyXSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0KClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBHZXQgdHlwZSBmcm9tIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIHByb3BlcnR5IGdldHRlclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBwcm9wZXJ0eSBhY2Nlc3NlZFxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGFjY2VzcyBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENoZWNrIGlmIGluc3RhbmNlIGV4aXN0c1xuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGluIFdlYWtNYXBcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgICAgYWx0IEluamVjdGFibGUgZm91bmRcbiAqICAgICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGluamVjdGFibGUgaW5zdGFuY2VcbiAqICAgICAgIG9wdCBIYXMgdHJhbnNmb3JtZXJcbiAqICAgICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIHRyYW5zZm9ybWVyXG4gKiAgICAgICBlbmRcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgaW4gV2Vha01hcFxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKiAgICAgZWxzZSBObyBpbmplY3RhYmxlXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChjYXRlZ29yeT86IHN0cmluZywgdHJhbnNmb3JtZXI/OiBJbnN0YW5jZVRyYW5zZm9ybWVyKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIGNvbnN0IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBjYXRlZ29yeSB8fCBnZXRUeXBlRnJvbURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCBUeXBlIGZyb20gZGVjb3JhdG9yYCk7XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvYmogPSB0cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCBvYmopO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==
@@ -1,29 +1,59 @@
1
1
  /**
2
- * @summary Defines a class as an injectable
2
+ * @description Decorator that marks a class as available for dependency injection.
3
+ * @summary Defines a class as an injectable singleton that can be retrieved from the registry.
4
+ * When applied to a class, replaces its constructor with one that returns a singleton instance.
3
5
  *
4
- * @param {string} [category] defaults to the class Name. (Useful when minification occours and names are changed so we can no longer rely on the class name, or when we want to upcast the Object)
5
- * @param {boolean} [force] defines if the injectable should override the already existing instance (if any). (only meant for extending decorators
6
- * @param instanceCallback
6
+ * @param {string} [category] Defaults to the class name. Useful when minification occurs and names are changed,
7
+ * or when you want to upcast the object to a different type.
8
+ * @param {boolean} [force] Defines if the injectable should override an already existing instance (if any).
9
+ * Only meant for extending decorators.
10
+ * @param {Function} [instanceCallback] Optional callback function that will be called with the instance after creation.
11
+ * @return {Function} A decorator function that transforms the class into an injectable.
7
12
  *
8
13
  * @function injectable
14
+ * @category Class Decorators
9
15
  *
10
- * @memberOf module:injectable-decorators.Decorators
16
+ * @mermaid
17
+ * sequenceDiagram
18
+ * participant Client
19
+ * participant Decorator
20
+ * participant Injectables
21
+ *
22
+ * Client->>Decorator: @injectable()
23
+ * Decorator->>Decorator: Create new constructor
24
+ *
25
+ * Note over Decorator: When new instance requested
26
+ * Decorator->>Injectables: get(name)
27
+ * alt Instance exists
28
+ * Injectables-->>Decorator: Return existing instance
29
+ * else No instance
30
+ * Decorator->>Injectables: register(original, name)
31
+ * Decorator->>Injectables: get(name)
32
+ * Injectables-->>Decorator: Return new instance
33
+ * opt Has callback
34
+ * Decorator->>Decorator: Call instanceCallback
35
+ * end
36
+ * end
37
+ * Decorator->>Decorator: Define metadata
38
+ * Decorator-->>Client: Return instance
11
39
  */
12
- export declare const injectable: (category?: string | undefined, force?: boolean, instanceCallback?: (instance: any, ...args: any[]) => void) => (original: any, propertyKey?: any) => any;
40
+ export declare function injectable(category?: string | undefined, force?: boolean, instanceCallback?: (instance: any, ...args: any[]) => void): (original: any, propertyKey?: any) => any;
13
41
  /**
14
- * @summary function witch transforms a cached {@link injectable}
42
+ * @description Function type for transforming injectable instances before they're injected.
43
+ * @summary Function which transforms a cached {@link injectable} instance before it's injected into a target object.
15
44
  *
16
- * @param {any} injectable
17
- * @param {any} obj the obj the injectable will be injected on
45
+ * @param {any} injectable The injectable instance to transform
46
+ * @param {any} obj The object the injectable will be injected on
47
+ * @return {any} The transformed injectable instance
18
48
  *
49
+ * @typedef {Function} InstanceTransformer
19
50
  * @memberOf module:injectable-decorators
20
51
  */
21
52
  export type InstanceTransformer = (injectable: any, obj: any) => any;
22
53
  /**
23
- * @summary Allows for the injection of an {@link injectable} decorated dependency
24
- * @description the property must be typed for the requested dependency.
25
- *
26
- * Only concrete classes. No generics are supported
54
+ * @description Property decorator that injects a dependency into a class property.
55
+ * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
56
+ * The property must be typed for the requested dependency. Only concrete classes are supported; generics are not.
27
57
  *
28
58
  * Injected properties should be described like so:
29
59
  * <pre>
@@ -38,14 +68,45 @@ export type InstanceTransformer = (injectable: any, obj: any) => any;
38
68
  * </pre>
39
69
  *
40
70
  * where InjectableClass is the class you want to inject.
41
- * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined
42
- * For project where minification occours, you should use the category param to ensure the name is the same throughout
71
+ * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined.
72
+ * For projects where minification occurs, you should use the category param to ensure the name is the same throughout.
43
73
  *
44
- * @param {string} [category] defaults to the class Name. (Useful when minification occours and names are changed so we can no longer rely on the class name, or when we want to upcast the Object)
45
- * @param {InstanceTransformer} [transformer]
74
+ * @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
75
+ * and names are changed, or when you want to upcast the object to a different type.
76
+ * @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
77
+ * @return {Function} A property decorator function that sets up the dependency injection.
46
78
  *
47
79
  * @function inject
80
+ * @category Property Decorators
81
+ *
82
+ * @mermaid
83
+ * sequenceDiagram
84
+ * participant Client
85
+ * participant Decorator
86
+ * participant Injectables
87
+ *
88
+ * Client->>Decorator: @inject()
89
+ * Decorator->>Decorator: Get type from property
90
+ * Decorator->>Decorator: Define metadata
91
+ * Decorator->>Decorator: Define property getter
48
92
  *
49
- * @memberOf module:injectable-decorators.Decorators
93
+ * Note over Decorator: When property accessed
94
+ * Client->>Decorator: access property
95
+ * Decorator->>Decorator: Check if instance exists
96
+ * alt Instance exists in WeakMap
97
+ * Decorator-->>Client: Return cached instance
98
+ * else No instance
99
+ * Decorator->>Injectables: get(name)
100
+ * alt Injectable found
101
+ * Injectables-->>Decorator: Return injectable instance
102
+ * opt Has transformer
103
+ * Decorator->>Decorator: Call transformer
104
+ * end
105
+ * Decorator->>Decorator: Store in WeakMap
106
+ * Decorator-->>Client: Return instance
107
+ * else No injectable
108
+ * Decorator-->>Client: Throw error
109
+ * end
110
+ * end
50
111
  */
51
- export declare const inject: (category?: string, transformer?: InstanceTransformer) => (target: any, propertyKey?: any) => void;
112
+ export declare function inject(category?: string, transformer?: InstanceTransformer): (target: any, propertyKey?: any) => void;
@@ -1,43 +1,101 @@
1
1
  import { Injectable, InjectablesRegistry } from "./registry";
2
2
  /**
3
- * @summary Static class Holding the access to the injectables functions
3
+ * @description Central registry for managing injectable dependencies.
4
+ * @summary Static class holding the access to the injectables functions. Provides methods for registering,
5
+ * retrieving, and building injectable objects.
6
+ * @template T Type of the injectable object
4
7
  *
5
8
  * @class Injectables
6
- * @static
9
+ *
10
+ * @example
11
+ * // Define an injectable class
12
+ * @injectable()
13
+ * class MyService {
14
+ * doSomething() {
15
+ * return 'Hello World';
16
+ * }
17
+ * }
18
+ *
19
+ * // Inject the service into another class
20
+ * class MyComponent {
21
+ * @inject()
22
+ * private service!: MyService;
23
+ *
24
+ * useService() {
25
+ * return this.service.doSomething();
26
+ * }
27
+ * }
28
+ *
29
+ * @mermaid
30
+ * sequenceDiagram
31
+ * participant Client
32
+ * participant Injectables
33
+ * participant Registry
34
+ *
35
+ * Client->>Injectables: register(MyService)
36
+ * Injectables->>Registry: register(MyService)
37
+ * Registry-->>Injectables: void
38
+ *
39
+ * Client->>Injectables: get("MyService")
40
+ * Injectables->>Registry: get("MyService")
41
+ * Registry-->>Injectables: MyService instance
42
+ * Injectables-->>Client: MyService instance
7
43
  */
8
44
  export declare class Injectables {
9
45
  private static actingInjectablesRegistry?;
10
46
  private constructor();
11
47
  /**
12
- * @summary Retrieves the named {@link Injectable} from the registry
13
- * @param {string} name
14
- * @param {any[]} args
48
+ * @description Fetches an injectable instance by its registered name.
49
+ * @summary Retrieves the named {@link Injectable} from the registry. If the injectable is a singleton,
50
+ * returns the existing instance. Otherwise, creates a new instance.
51
+ * @template T Type of the injectable object to retrieve
52
+ * @param {string} name The registered name of the injectable to retrieve
53
+ * @param {any[]} args Constructor arguments to pass when instantiating the injectable
54
+ * @return {Injectable<T> | undefined} The injectable instance or undefined if not found
15
55
  */
16
56
  static get<T>(name: string, ...args: any[]): Injectable<T> | undefined;
17
57
  /**
18
- * @summary registers an injectable constructor
19
- * @param {Injectable} constructor
20
- * @param {any[]} args
21
- *
58
+ * @description Adds a class or object to the injectable registry.
59
+ * @summary Registers an injectable constructor or instance with the registry, making it available for injection.
60
+ * @template T Type of the injectable object to register
61
+ * @param {Injectable<T>} constructor The class constructor or object instance to register
62
+ * @param {any[]} args Additional arguments for registration (category, singleton flag, etc.)
63
+ * @return {void}
22
64
  */
23
65
  static register<T>(constructor: Injectable<T>, ...args: any[]): void;
24
66
  /**
25
- * @summary Instantiates an Injectable
26
- * @param {Record<string, any>} obj
27
- * @param {any[]} args
28
- * @return T
29
- *
67
+ * @description Creates a new instance of an injectable class.
68
+ * @summary Instantiates an injectable class using its constructor and the provided arguments.
69
+ * @template T Type of the object to build
70
+ * @param {Record<string, any>} obj Object containing the name of the injectable to build
71
+ * @param {any[]} args Constructor arguments to pass when instantiating the injectable
72
+ * @return {T} The newly created instance
30
73
  */
31
74
  static build<T>(obj: Record<string, any>, ...args: any[]): T;
32
75
  /**
33
- * @summary Sets a new {@link InjectablesRegistry}
34
- * @param {InjectablesRegistry} operationsRegistry the new implementation of Registry
76
+ * @description Replaces the current registry implementation.
77
+ * @summary Sets a new {@link InjectablesRegistry} implementation, allowing for custom registry behavior.
78
+ * @param {InjectablesRegistry} operationsRegistry The new implementation of Registry to use
79
+ * @return {void}
35
80
  */
36
81
  static setRegistry(operationsRegistry: InjectablesRegistry): void;
37
82
  /**
38
- * @summary Returns the current {@link InjectablesRegistry}
83
+ * @description Provides access to the current registry instance.
84
+ * @summary Returns the current {@link InjectablesRegistry} or creates a default one if none exists.
85
+ * @return {InjectablesRegistry} The current registry instance
39
86
  */
40
87
  private static getRegistry;
88
+ /**
89
+ * @description Clears all registered injectables.
90
+ * @summary Resets the registry to a clean state by creating a new empty registry instance.
91
+ * @return {void}
92
+ */
41
93
  static reset(): void;
94
+ /**
95
+ * @description Removes specific injectables from the registry based on a pattern.
96
+ * @summary Selectively resets the registry by removing only the injectables whose names match the provided pattern.
97
+ * @param {string | RegExp} match A string or regular expression pattern to match against injectable names
98
+ * @return {void}
99
+ */
42
100
  static selectiveReset(match: string | RegExp): void;
43
101
  }