@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,70 +1,98 @@
1
- import { InjectablesKeys } from "./constants";
2
- import { Injectables } from "./Injectables";
3
- import { getTypeFromDecorator } from "./utils";
1
+ import { InjectablesKeys } from "./constants.js";
2
+ import { Injectables } from "./Injectables.js";
3
+ import { getTypeFromDecorator } from "./utils.js";
4
4
  /**
5
- * @summary Return the reflection key for injectables
6
- *
7
- * @param {string} key
5
+ * @description Generates a fully qualified reflection metadata key.
6
+ * @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
7
+ * @param {string} key The key to be prefixed
8
+ * @return {string} The fully qualified reflection key
8
9
  * @function getInjectKey
9
- *
10
10
  * @memberOf module:injectable-decorators
11
11
  */
12
12
  const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
13
13
  /**
14
- * @summary Defines a class as an injectable
14
+ * @description Decorator that marks a class as available for dependency injection.
15
+ * @summary Defines a class as an injectable singleton that can be retrieved from the registry.
16
+ * When applied to a class, replaces its constructor with one that returns a singleton instance.
15
17
  *
16
- * @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)
17
- * @param {boolean} [force] defines if the injectable should override the already existing instance (if any). (only meant for extending decorators
18
- * @param instanceCallback
18
+ * @param {string} [category] Defaults to the class name. Useful when minification occurs and names are changed,
19
+ * or when you want to upcast the object to a different type.
20
+ * @param {boolean} [force] Defines if the injectable should override an already existing instance (if any).
21
+ * Only meant for extending decorators.
22
+ * @param {Function} [instanceCallback] Optional callback function that will be called with the instance after creation.
23
+ * @return {Function} A decorator function that transforms the class into an injectable.
19
24
  *
20
25
  * @function injectable
26
+ * @category Class Decorators
27
+ *
28
+ * @mermaid
29
+ * sequenceDiagram
30
+ * participant Client
31
+ * participant Decorator
32
+ * participant Injectables
33
+ *
34
+ * Client->>Decorator: @injectable()
35
+ * Decorator->>Decorator: Create new constructor
21
36
  *
22
- * @memberOf module:injectable-decorators.Decorators
37
+ * Note over Decorator: When new instance requested
38
+ * Decorator->>Injectables: get(name)
39
+ * alt Instance exists
40
+ * Injectables-->>Decorator: Return existing instance
41
+ * else No instance
42
+ * Decorator->>Injectables: register(original, name)
43
+ * Decorator->>Injectables: get(name)
44
+ * Injectables-->>Decorator: Return new instance
45
+ * opt Has callback
46
+ * Decorator->>Decorator: Call instanceCallback
47
+ * end
48
+ * end
49
+ * Decorator->>Decorator: Define metadata
50
+ * Decorator-->>Client: Return instance
23
51
  */
24
- export const injectable = (category = undefined, force = false, instanceCallback) =>
25
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
26
- (original, propertyKey) => {
27
- const name = category || original.name;
28
- // the new constructor behaviour
29
- const newConstructor = function (...args) {
30
- let inj = Injectables.get(name, ...args);
31
- if (!inj) {
32
- Injectables.register(original, name, true, force);
33
- inj = Injectables.get(name, ...args);
34
- if (!inj)
35
- return undefined;
36
- if (instanceCallback)
37
- try {
38
- instanceCallback(inj);
39
- }
40
- catch (e) {
41
- console.error(`Failed to call injectable callback for ${name}: ${e}`);
42
- }
43
- }
44
- const metadata = Object.assign({}, {
45
- class: name,
52
+ export function injectable(category = undefined, force = false, instanceCallback) {
53
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ return (original, propertyKey) => {
55
+ const name = category || original.name;
56
+ // the new constructor behaviour
57
+ const newConstructor = function (...args) {
58
+ let inj = Injectables.get(name, ...args);
59
+ if (!inj) {
60
+ Injectables.register(original, name, true, force);
61
+ inj = Injectables.get(name, ...args);
62
+ if (!inj)
63
+ return undefined;
64
+ if (instanceCallback)
65
+ try {
66
+ instanceCallback(inj);
67
+ }
68
+ catch (e) {
69
+ console.error(`Failed to call injectable callback for ${name}: ${e}`);
70
+ }
71
+ }
72
+ const metadata = Object.assign({}, {
73
+ class: name,
74
+ });
75
+ Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECTABLE), metadata, inj.constructor);
76
+ return inj;
77
+ };
78
+ // copy prototype so instanceof operator still works
79
+ newConstructor.prototype = original.prototype;
80
+ // newConstructor.__proto__ = original.__proto__;
81
+ // Sets the proper constructor name for type verification
82
+ Object.defineProperty(newConstructor, "name", {
83
+ writable: false,
84
+ enumerable: true,
85
+ configurable: false,
86
+ value: original.prototype.constructor.name,
46
87
  });
47
- Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECTABLE), metadata, inj.constructor);
48
- return inj;
88
+ // return new constructor (will override original)
89
+ return newConstructor;
49
90
  };
50
- // copy prototype so instanceof operator still works
51
- newConstructor.prototype = original.prototype;
52
- // newConstructor.__proto__ = original.__proto__;
53
- // Sets the proper constructor name for type verification
54
- Object.defineProperty(newConstructor, "name", {
55
- writable: false,
56
- enumerable: true,
57
- configurable: false,
58
- value: original.prototype.constructor.name,
59
- });
60
- // return new constructor (will override original)
61
- return newConstructor;
62
- };
91
+ }
63
92
  /**
64
- * @summary Allows for the injection of an {@link injectable} decorated dependency
65
- * @description the property must be typed for the requested dependency.
66
- *
67
- * Only concrete classes. No generics are supported
93
+ * @description Property decorator that injects a dependency into a class property.
94
+ * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
95
+ * The property must be typed for the requested dependency. Only concrete classes are supported; generics are not.
68
96
  *
69
97
  * Injected properties should be described like so:
70
98
  * <pre>
@@ -79,53 +107,86 @@ export const injectable = (category = undefined, force = false, instanceCallback
79
107
  * </pre>
80
108
  *
81
109
  * where InjectableClass is the class you want to inject.
82
- * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined
83
- * For project where minification occours, you should use the category param to ensure the name is the same throughout
110
+ * Notice the use of '!:' to ensure the transpiler the property will be set outside the constructor but will always be defined.
111
+ * For projects where minification occurs, you should use the category param to ensure the name is the same throughout.
84
112
  *
85
- * @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)
86
- * @param {InstanceTransformer} [transformer]
113
+ * @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
114
+ * and names are changed, or when you want to upcast the object to a different type.
115
+ * @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
116
+ * @return {Function} A property decorator function that sets up the dependency injection.
87
117
  *
88
118
  * @function inject
119
+ * @category Property Decorators
120
+ *
121
+ * @mermaid
122
+ * sequenceDiagram
123
+ * participant Client
124
+ * participant Decorator
125
+ * participant Injectables
89
126
  *
90
- * @memberOf module:injectable-decorators.Decorators
127
+ * Client->>Decorator: @inject()
128
+ * Decorator->>Decorator: Get type from property
129
+ * Decorator->>Decorator: Define metadata
130
+ * Decorator->>Decorator: Define property getter
131
+ *
132
+ * Note over Decorator: When property accessed
133
+ * Client->>Decorator: access property
134
+ * Decorator->>Decorator: Check if instance exists
135
+ * alt Instance exists in WeakMap
136
+ * Decorator-->>Client: Return cached instance
137
+ * else No instance
138
+ * Decorator->>Injectables: get(name)
139
+ * alt Injectable found
140
+ * Injectables-->>Decorator: Return injectable instance
141
+ * opt Has transformer
142
+ * Decorator->>Decorator: Call transformer
143
+ * end
144
+ * Decorator->>Decorator: Store in WeakMap
145
+ * Decorator-->>Client: Return instance
146
+ * else No injectable
147
+ * Decorator-->>Client: Throw error
148
+ * end
149
+ * end
91
150
  */
92
- export const inject = (category, transformer) => (target, propertyKey) => {
93
- const values = new WeakMap();
94
- const name = category || getTypeFromDecorator(target, propertyKey);
95
- if (!name)
96
- throw new Error(`Could not get Type from decorator`);
97
- Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECT), {
98
- injectable: name,
99
- }, target, propertyKey);
100
- Object.defineProperty(target, propertyKey, {
101
- configurable: true,
102
- get() {
103
- const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
104
- if (descriptor.configurable) {
105
- Object.defineProperty(this, propertyKey, {
106
- enumerable: true,
107
- configurable: false,
108
- get() {
109
- let obj = values.get(this);
110
- if (!obj) {
111
- obj = Injectables.get(name);
112
- if (!obj)
113
- throw new Error(`Could not get Injectable ${name} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
114
- if (transformer)
115
- try {
116
- obj = transformer(obj, target);
117
- }
118
- catch (e) {
119
- console.error(e);
120
- }
121
- values.set(this, obj);
122
- }
123
- return obj;
124
- },
125
- });
126
- return this[propertyKey];
127
- }
128
- },
129
- });
130
- };
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFL0M7Ozs7Ozs7R0FPRztBQUNILE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUVwRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUNyQixDQUNFLFdBQStCLFNBQVMsRUFDeEMsUUFBaUIsS0FBSyxFQUN0QixnQkFBMEQsRUFDMUQsRUFBRTtBQUNKLDZEQUE2RDtBQUM3RCxDQUFDLFFBQWEsRUFBRSxXQUFpQixFQUFFLEVBQUU7SUFDbkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdkMsZ0NBQWdDO0lBQ2hDLE1BQU0sY0FBYyxHQUFRLFVBQVUsR0FBRyxJQUFXO1FBQ2xELElBQUksR0FBRyxHQUFRLFdBQVcsQ0FBQyxHQUFHLENBQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUUzQixJQUFJLGdCQUFnQjtnQkFDbEIsSUFBSSxDQUFD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Q0FDakMsQ0FBQztnQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29DQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ25CLENBQUM7NEJBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3hCLENBQUM7d0JBQ0QsT0FBTyxHQUFHLENBQUM7b0JBQ2IsQ0FBQztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHJlZmxlY3Rpb24ga2V5IGZvciBpbmplY3RhYmxlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RLZXlcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5jb25zdCBnZXRJbmplY3RLZXkgPSAoa2V5OiBzdHJpbmcpID0+IEluamVjdGFibGVzS2V5cy5SRUZMRUNUICsga2V5O1xuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gZGVmYXVsdHMgdG8gdGhlIGNsYXNzIE5hbWUuIChVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2Njb3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQgc28gd2UgY2FuIG5vIGxvbmdlciByZWx5IG9uIHRoZSBjbGFzcyBuYW1lLCBvciB3aGVuIHdlIHdhbnQgdG8gdXBjYXN0IHRoZSBPYmplY3QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZV0gZGVmaW5lcyBpZiB0aGUgaW5qZWN0YWJsZSBzaG91bGQgb3ZlcnJpZGUgdGhlIGFscmVhZHkgZXhpc3RpbmcgaW5zdGFuY2UgKGlmIGFueSkuIChvbmx5IG1lYW50IGZvciBleHRlbmRpbmcgZGVjb3JhdG9yc1xuICogQHBhcmFtIGluc3RhbmNlQ2FsbGJhY2tcbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzLkRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGluamVjdGFibGUgPVxuICAoXG4gICAgY2F0ZWdvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBmb3JjZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluc3RhbmNlQ2FsbGJhY2s/OiAoaW5zdGFuY2U6IGFueSwgLi4uYXJnczogYW55W10pID0+IHZvaWRcbiAgKSA9PlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBjYXRlZ29yeSB8fCBvcmlnaW5hbC5uYW1lO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgbGV0IGluajogYW55ID0gSW5qZWN0YWJsZXMuZ2V0PGFueT4obmFtZSwgLi4uYXJncyk7XG4gICAgICBpZiAoIWluaikge1xuICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihvcmlnaW5hbCwgbmFtZSwgdHJ1ZSwgZm9yY2UpO1xuICAgICAgICBpbmogPSBJbmplY3RhYmxlcy5nZXQ8YW55PihuYW1lLCAuLi5hcmdzKTtcbiAgICAgICAgaWYgKCFpbmopIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlQ2FsbGJhY2spXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2FsbGJhY2soaW5qKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gY2FsbCBpbmplY3RhYmxlIGNhbGxiYWNrIGZvciAke25hbWV9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzczogbmFtZSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGluai5jb25zdHJ1Y3RvclxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGluajtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcbiAgICAvLyBuZXdDb25zdHJ1Y3Rvci5fX3Byb3RvX18gPSBvcmlnaW5hbC5fX3Byb3RvX187XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG5cbi8qKlxuICogQHN1bW1hcnkgZnVuY3Rpb24gd2l0Y2ggdHJhbnNmb3JtcyBhIGNhY2hlZCB7QGxpbmsgaW5qZWN0YWJsZX1cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZVxuICogQHBhcmFtIHthbnl9IG9iaiB0aGUgb2JqIHRoZSBpbmplY3RhYmxlIHdpbGwgYmUgaW5qZWN0ZWQgb25cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbnN0YW5jZVRyYW5zZm9ybWVyID0gKGluamVjdGFibGU6IGFueSwgb2JqOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5XG4gKiBAZGVzY3JpcHRpb24gdGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS5cbiAqXG4gKiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMuIE5vIGdlbmVyaWNzIGFyZSBzdXBwb3J0ZWRcbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWRcbiAqIEZvciBwcm9qZWN0IHdoZXJlIG1pbmlmaWNhdGlvbiBvY2NvdXJzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgY2F0ZWdvcnkgcGFyYW0gdG8gZW5zdXJlIHRoZSBuYW1lIGlzIHRoZSBzYW1lIHRocm91Z2hvdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBkZWZhdWx0cyB0byB0aGUgY2xhc3MgTmFtZS4gKFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2NvdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCBzbyB3ZSBjYW4gbm8gbG9uZ2VyIHJlbHkgb24gdGhlIGNsYXNzIG5hbWUsIG9yIHdoZW4gd2Ugd2FudCB0byB1cGNhc3QgdGhlIE9iamVjdClcbiAqIEBwYXJhbSB7SW5zdGFuY2VUcmFuc2Zvcm1lcn0gW3RyYW5zZm9ybWVyXVxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9ycy5EZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3QgPVxuICAoY2F0ZWdvcnk/OiBzdHJpbmcsIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcikgPT5cbiAgKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgY2F0ZWdvcnkgfHwgZ2V0VHlwZUZyb21EZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUKSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0YWJsZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICAgICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gdHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG4iXX0=
151
+ export function inject(category, transformer) {
152
+ return (target, propertyKey) => {
153
+ const values = new WeakMap();
154
+ const name = category || getTypeFromDecorator(target, propertyKey);
155
+ if (!name)
156
+ throw new Error(`Could not get Type from decorator`);
157
+ Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECT), {
158
+ injectable: name,
159
+ }, target, propertyKey);
160
+ Object.defineProperty(target, propertyKey, {
161
+ configurable: true,
162
+ get() {
163
+ const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
164
+ if (descriptor.configurable) {
165
+ Object.defineProperty(this, propertyKey, {
166
+ enumerable: true,
167
+ configurable: false,
168
+ get() {
169
+ let obj = values.get(this);
170
+ if (!obj) {
171
+ obj = Injectables.get(name);
172
+ if (!obj)
173
+ throw new Error(`Could not get Injectable ${name} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
174
+ if (transformer)
175
+ try {
176
+ obj = transformer(obj, target);
177
+ }
178
+ catch (e) {
179
+ console.error(e);
180
+ }
181
+ values.set(this, obj);
182
+ }
183
+ return obj;
184
+ },
185
+ });
186
+ return this[propertyKey];
187
+ }
188
+ },
189
+ });
190
+ };
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsdUJBQW9CO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUseUJBQXNCO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7R0FPRztBQUNILE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUVwRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixXQUErQixTQUFTLEVBQ3hDLFFBQWlCLEtBQUssRUFDdEIsZ0JBQTBEO0lBRTFELDZEQUE2RDtJQUM3RCxPQUFPLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMxQyxNQUFNLElBQUksR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDaEMsTUFBTSxjQUFjLEdBQVEsVUFBVSxHQUFHLElBQVc7WUFDbEQsSUFBSSxHQUFHLEdBQVEsV0FBVyxDQUFDLEdBQUcsQ0FBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEQsR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxHQUFHO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUUzQixJQUFJLGdCQUFnQjtvQkFDbEIsSUFBSSxDQUFDO3dCQUNI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RUFBRSxNQUFNLENBQUMsQ0FBQztvQ0FDakMsQ0FBQztvQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dDQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ25CLENBQUM7Z0NBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQ3hCLENBQUM7NEJBQ0QsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQztxQkFDRixDQUFDLENBQUM7b0JBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0VHlwZUZyb21EZWNvcmF0b3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXMgYnkgcHJlZml4aW5nIHRoZSBwcm92aWRlZCBrZXkgd2l0aCB0aGUgYmFzZSByZWZsZWN0aW9uIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBwcmVmaXhlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5jb25zdCBnZXRJbmplY3RLZXkgPSAoa2V5OiBzdHJpbmcpID0+IEluamVjdGFibGVzS2V5cy5SRUZMRUNUICsga2V5O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSBzaW5nbGV0b24gdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2VdIERlZmluZXMgaWYgdGhlIGluamVjdGFibGUgc2hvdWxkIG92ZXJyaWRlIGFuIGFscmVhZHkgZXhpc3RpbmcgaW5zdGFuY2UgKGlmIGFueSkuXG4gKiBPbmx5IG1lYW50IGZvciBleHRlbmRpbmcgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbnN0YW5jZUNhbGxiYWNrXSBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGluc3RhbmNlIGFmdGVyIGNyZWF0aW9uLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0YWJsZSgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ3JlYXRlIG5ldyBjb25zdHJ1Y3RvclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBuZXcgaW5zdGFuY2UgcmVxdWVzdGVkXG4gKiAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIG5hbWUpXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIG5ldyBpbnN0YW5jZVxuICogICAgIG9wdCBIYXMgY2FsbGJhY2tcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCBpbnN0YW5jZUNhbGxiYWNrXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIGZvcmNlOiBib29sZWFuID0gZmFsc2UsXG4gIGluc3RhbmNlQ2FsbGJhY2s/OiAoaW5zdGFuY2U6IGFueSwgLi4uYXJnczogYW55W10pID0+IHZvaWRcbikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBuYW1lID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGxldCBpbmo6IGFueSA9IEluamVjdGFibGVzLmdldDxhbnk+KG5hbWUsIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFpbmopIHtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIob3JpZ2luYWwsIG5hbWUsIHRydWUsIGZvcmNlKTtcbiAgICAgICAgaW5qID0gSW5qZWN0YWJsZXMuZ2V0PGFueT4obmFtZSwgLi4uYXJncyk7XG4gICAgICAgIGlmICghaW5qKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZUNhbGxiYWNrKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNhbGxiYWNrKGluaik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGNhbGwgaW5qZWN0YWJsZSBjYWxsYmFjayBmb3IgJHtuYW1lfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3M6IG5hbWUsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBpbmouY29uc3RydWN0b3JcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBpbmo7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9O1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdHlwZSBmb3IgdHJhbnNmb3JtaW5nIGluamVjdGFibGUgaW5zdGFuY2VzIGJlZm9yZSB0aGV5J3JlIGluamVjdGVkLlxuICogQHN1bW1hcnkgRnVuY3Rpb24gd2hpY2ggdHJhbnNmb3JtcyBhIGNhY2hlZCB7QGxpbmsgaW5qZWN0YWJsZX0gaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQgaW50byBhIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHthbnl9IGluamVjdGFibGUgVGhlIGluamVjdGFibGUgaW5zdGFuY2UgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdGhlIGluamVjdGFibGUgd2lsbCBiZSBpbmplY3RlZCBvblxuICogQHJldHVybiB7YW55fSBUaGUgdHJhbnNmb3JtZWQgaW5qZWN0YWJsZSBpbnN0YW5jZVxuICpcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gSW5zdGFuY2VUcmFuc2Zvcm1lclxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KGNhdGVnb3J5Pzogc3RyaW5nLCB0cmFuc2Zvcm1lcj86IEluc3RhbmNlVHJhbnNmb3JtZXIpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgY29uc3QgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGNhdGVnb3J5IHx8IGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWV9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuIl19
@@ -1,22 +1,20 @@
1
1
  /**
2
+ * @description A lightweight dependency injection library for TypeScript applications.
2
3
  * @summary Adds a simple Injectables implementation to create singleton instances of an object
3
- * and easily inject it into other objects
4
+ * and easily inject it into other objects. Provides decorators for marking classes as injectable
5
+ * and for injecting dependencies into class properties.
4
6
  *
5
7
  * @module injectable-decorators
6
8
  */
7
- /**
8
- * @summary functions that decorate classes or class properties
9
- * @namespace Decorators
10
- * @memberOf module:injectable-decorators
11
- */
12
9
  export * from "./constants";
13
10
  export * from "./decorators";
14
11
  export * from "./Injectables";
15
12
  export * from "./registry";
16
13
  export * from "./utils";
17
14
  /**
18
- * @summary Defined on library build. holds the library current version
15
+ * @description Current version of the injectable-decorators library.
16
+ * @summary Defined on library build. Holds the library's current version string.
19
17
  * @const VERSION
20
18
  * @memberOf module:injectable-decorators
21
19
  */
22
- export declare const VERSION = "1.6.1";
20
+ export declare const VERSION = "1.6.2";
package/lib/esm/index.js CHANGED
@@ -1,23 +1,21 @@
1
1
  /**
2
+ * @description A lightweight dependency injection library for TypeScript applications.
2
3
  * @summary Adds a simple Injectables implementation to create singleton instances of an object
3
- * and easily inject it into other objects
4
+ * and easily inject it into other objects. Provides decorators for marking classes as injectable
5
+ * and for injecting dependencies into class properties.
4
6
  *
5
7
  * @module injectable-decorators
6
8
  */
9
+ export * from "./constants.js";
10
+ export * from "./decorators.js";
11
+ export * from "./Injectables.js";
12
+ export * from "./registry.js";
13
+ export * from "./utils.js";
7
14
  /**
8
- * @summary functions that decorate classes or class properties
9
- * @namespace Decorators
10
- * @memberOf module:injectable-decorators
11
- */
12
- export * from "./constants";
13
- export * from "./decorators";
14
- export * from "./Injectables";
15
- export * from "./registry";
16
- export * from "./utils";
17
- /**
18
- * @summary Defined on library build. holds the library current version
15
+ * @description Current version of the injectable-decorators library.
16
+ * @summary Defined on library build. Holds the library's current version string.
19
17
  * @const VERSION
20
18
  * @memberOf module:injectable-decorators
21
19
  */
22
- export const VERSION = "1.6.1";
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSDs7OztHQUlHO0FBRUgsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxTQUFTLENBQUM7QUFFeEI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IEFkZHMgYSBzaW1wbGUgSW5qZWN0YWJsZXMgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIHNpbmdsZXRvbiBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0XG4gKiBhbmQgZWFzaWx5IGluamVjdCBpdCBpbnRvIG90aGVyIG9iamVjdHNcbiAqXG4gKiBAbW9kdWxlIGluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5cbi8qKlxuICogQHN1bW1hcnkgZnVuY3Rpb25zIHRoYXQgZGVjb3JhdGUgY2xhc3NlcyBvciBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAbmFtZXNwYWNlIERlY29yYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lZCBvbiBsaWJyYXJ5IGJ1aWxkLiBob2xkcyB0aGUgbGlicmFyeSBjdXJyZW50IHZlcnNpb25cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
20
+ export const VERSION = "1.6.2";
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILCtCQUE0QjtBQUM1QixnQ0FBNkI7QUFDN0IsaUNBQThCO0FBQzlCLDhCQUEyQjtBQUMzQiwyQkFBd0I7QUFFeEI7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBsaWdodHdlaWdodCBkZXBlbmRlbmN5IGluamVjdGlvbiBsaWJyYXJ5IGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIEBzdW1tYXJ5IEFkZHMgYSBzaW1wbGUgSW5qZWN0YWJsZXMgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIHNpbmdsZXRvbiBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0XG4gKiBhbmQgZWFzaWx5IGluamVjdCBpdCBpbnRvIG90aGVyIG9iamVjdHMuIFByb3ZpZGVzIGRlY29yYXRvcnMgZm9yIG1hcmtpbmcgY2xhc3NlcyBhcyBpbmplY3RhYmxlXG4gKiBhbmQgZm9yIGluamVjdGluZyBkZXBlbmRlbmNpZXMgaW50byBjbGFzcyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBtb2R1bGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzIGxpYnJhcnkuXG4gKiBAc3VtbWFyeSBEZWZpbmVkIG9uIGxpYnJhcnkgYnVpbGQuIEhvbGRzIHRoZSBsaWJyYXJ5J3MgY3VycmVudCB2ZXJzaW9uIHN0cmluZy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
@@ -1,46 +1,93 @@
1
1
  /**
2
- * @summary defines an Injectable type
2
+ * @description Type representing either a class constructor or an instance.
3
+ * @summary Defines an Injectable type that can be either a class constructor or an instance of a class.
4
+ * @template T The type of the injectable object
5
+ * @typedef {function(any): T | T} Injectable
3
6
  * @memberOf module:injectable-decorators
4
7
  */
5
8
  export type Injectable<T> = {
6
9
  new (...args: any[]): T;
7
10
  } | T;
8
11
  /**
9
- * @summary Interface for an injectable registry
10
- * @interface InjectableRegistry
12
+ * @description Contract for a registry that manages injectable objects.
13
+ * @summary Interface for an injectable registry that provides methods for retrieving, registering, and building injectable objects.
14
+ * @template T Type parameter used in the interface methods
15
+ * @interface InjectablesRegistry
16
+ * @memberOf module:injectable-decorators
11
17
  */
12
18
  export interface InjectablesRegistry {
13
19
  /**
14
- * @summary retrieves an {@link Injectable}
15
- * @param {string} name
16
- * @param {any[]} args
17
- * @return {Injectable | undefined}
18
- *
19
- * @method
20
+ * @description Fetches an injectable instance by its registered name.
21
+ * @summary Retrieves an {@link Injectable} from the registry by name, optionally passing constructor arguments.
22
+ * @template T Type of the injectable object to retrieve
23
+ * @param {string} name The registered name of the injectable to retrieve
24
+ * @param {any[]} args Constructor arguments to pass when instantiating the injectable
25
+ * @return {Injectable<T> | undefined} The injectable instance or undefined if not found
26
+ * @memberOf module:injectable-decorators
20
27
  */
21
28
  get<T>(name: string, ...args: any[]): Injectable<T> | undefined;
22
29
  /**
23
- * @summary registers an injectable constructor
24
- * @param {Injectable} constructor
25
- * @param {any[]} args
26
- *
27
- * @method
30
+ * @description Adds a class or object to the injectable registry.
31
+ * @summary Registers an injectable constructor or instance with the registry, making it available for injection.
32
+ * @template T Type of the injectable object to register
33
+ * @param {Injectable<T>} constructor The class constructor or object instance to register
34
+ * @param {any[]} args Additional arguments for registration (category, singleton flag, etc.)
35
+ * @return {void}
36
+ * @memberOf module:injectable-decorators
28
37
  */
29
38
  register<T>(constructor: Injectable<T>, ...args: any[]): void;
30
39
  /**
31
- * @summary Instantiates an Injectable
32
- * @param {Record<string, any>} obj
33
- * @param {any[]} args
34
- * @return T
35
- *
36
- * @method
40
+ * @description Creates a new instance of an injectable class.
41
+ * @summary Instantiates an injectable class using its constructor and the provided arguments.
42
+ * @template T Type of the object to build
43
+ * @param {Record<string, any>} obj Object containing the name of the injectable to build
44
+ * @param {any[]} args Constructor arguments to pass when instantiating the injectable
45
+ * @return {T} The newly created instance
46
+ * @memberOf module:injectable-decorators
37
47
  */
38
48
  build<T>(obj: Record<string, any>, ...args: any[]): T;
39
49
  }
40
50
  /**
41
- * @summary Holds the vairous {@link Injectable}s
51
+ * @description Default implementation of the InjectablesRegistry interface.
52
+ * @summary Holds the various {@link Injectable}s in a cache and provides methods to register, retrieve, and build them.
53
+ * @template T Type parameter used in the class methods
54
+ *
42
55
  * @class InjectableRegistryImp
43
56
  * @implements InjectablesRegistry
57
+ *
58
+ * @memberOf module:injectable-decorators
59
+ *
60
+ * @example
61
+ * // Create a new registry
62
+ * const registry = new InjectableRegistryImp();
63
+ *
64
+ * // Register a class
65
+ * class MyService {
66
+ * doSomething() {
67
+ * return 'Hello World';
68
+ * }
69
+ * }
70
+ * registry.register(MyService, 'MyService', true);
71
+ *
72
+ * // Get the instance
73
+ * const service = registry.get('MyService');
74
+ * service.doSomething(); // 'Hello World'
75
+ *
76
+ * @mermaid
77
+ * sequenceDiagram
78
+ * participant Client
79
+ * participant Registry
80
+ *
81
+ * Client->>Registry: register(MyService)
82
+ * Registry->>Registry: Store in cache
83
+ *
84
+ * Client->>Registry: get("MyService")
85
+ * alt Instance exists and is singleton
86
+ * Registry-->>Client: Return cached instance
87
+ * else No instance or not singleton
88
+ * Registry->>Registry: build(name)
89
+ * Registry-->>Client: Return new instance
90
+ * end
44
91
  */
45
92
  export declare class InjectableRegistryImp implements InjectablesRegistry {
46
93
  private cache;
@@ -1,7 +1,44 @@
1
1
  /**
2
- * @summary Holds the vairous {@link Injectable}s
2
+ * @description Default implementation of the InjectablesRegistry interface.
3
+ * @summary Holds the various {@link Injectable}s in a cache and provides methods to register, retrieve, and build them.
4
+ * @template T Type parameter used in the class methods
5
+ *
3
6
  * @class InjectableRegistryImp
4
7
  * @implements InjectablesRegistry
8
+ *
9
+ * @memberOf module:injectable-decorators
10
+ *
11
+ * @example
12
+ * // Create a new registry
13
+ * const registry = new InjectableRegistryImp();
14
+ *
15
+ * // Register a class
16
+ * class MyService {
17
+ * doSomething() {
18
+ * return 'Hello World';
19
+ * }
20
+ * }
21
+ * registry.register(MyService, 'MyService', true);
22
+ *
23
+ * // Get the instance
24
+ * const service = registry.get('MyService');
25
+ * service.doSomething(); // 'Hello World'
26
+ *
27
+ * @mermaid
28
+ * sequenceDiagram
29
+ * participant Client
30
+ * participant Registry
31
+ *
32
+ * Client->>Registry: register(MyService)
33
+ * Registry->>Registry: Store in cache
34
+ *
35
+ * Client->>Registry: get("MyService")
36
+ * alt Instance exists and is singleton
37
+ * Registry-->>Client: Return cached instance
38
+ * else No instance or not singleton
39
+ * Registry->>Registry: build(name)
40
+ * Registry-->>Client: Return new instance
41
+ * end
5
42
  */
6
43
  export class InjectableRegistryImp {
7
44
  constructor() {
@@ -56,4 +93,4 @@ export class InjectableRegistryImp {
56
93
  return instance;
57
94
  }
58
95
  }
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUNBOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBQ1UsVUFBSyxHQUErQixFQUFFLENBQUM7SUE0RGpELENBQUM7SUExREM7O09BRUc7SUFDSCxHQUFHLENBQUksSUFBWSxFQUFFLEdBQUcsSUFBVztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7Z0JBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBSSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBSSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMvRCw2REFBNkQ7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNEOztPQUVHO0lBQ0gsUUFBUSxDQUNOLEdBQWtCLEVBQ2xCLFdBQStCLFNBQVMsRUFDeEMsY0FBdUIsSUFBSSxFQUMzQixRQUFpQixLQUFLO1FBRXRCLE1BQU0sT0FBTyxHQUF3QixHQUEwQixDQUFDO1FBRWhFLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3pELElBQUksT0FBTyxPQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsV0FBVztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSxDQUNuRSxDQUFDO1FBRUosTUFBTSxJQUFJLEdBQ1IsUUFBUTtZQUNSLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUNqRSxDQUFDLENBQUUsV0FBMEMsQ0FBQyxJQUFJO2dCQUNsRCxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUs7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRztnQkFDakIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUN2QyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDM0MsU0FBUyxFQUFFLFdBQVc7YUFDdkIsQ0FBQztJQUNOLENBQUM7SUFDRDs7T0FFRztJQUNILEtBQUssQ0FBSSxJQUFzQixFQUFFLEdBQUcsSUFBVztRQUM3QyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyBhbiBJbmplY3RhYmxlIHR5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGU8VD4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0gfCBUO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEludGVyZmFjZSBmb3IgYW4gaW5qZWN0YWJsZSByZWdpc3RyeVxuICogQGludGVyZmFjZSBJbmplY3RhYmxlUmVnaXN0cnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyBhbiB7QGxpbmsgSW5qZWN0YWJsZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBnZXQ8VD4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IEluamVjdGFibGU8VD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZX0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gSW5qZWN0YWJsZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqIEByZXR1cm4gVFxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBidWlsZDxUPihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgdmFpcm91cyB7QGxpbmsgSW5qZWN0YWJsZX1zXG4gKiBAY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wXG4gKiBAaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAgaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBjYWNoZTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdldDxUPihuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlubmVyQ2FjaGUgPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgY29uc3QgYnVpbGREZWYgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICAgIGlmICghaW5uZXJDYWNoZS5zaW5nbGV0b24gJiYgIWlubmVyQ2FjaGUuaW5zdGFuY2UpXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkPFQ+KGJ1aWxkRGVmLCAuLi5hcmdzKTtcbiAgICAgIHJldHVybiBpbm5lckNhY2hlLmluc3RhbmNlIHx8IHRoaXMuYnVpbGQ8VD4oYnVpbGREZWYsIC4uLmFyZ3MpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgb2JqOiBJbmplY3RhYmxlPFQ+LFxuICAgIGNhdGVnb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaXNTaW5nbGV0b246IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FzdE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgY29uc3QgY29uc3RydWN0b3IgPSAhY2FzdE9iai5uYW1lICYmIGNhc3RPYmouY29uc3RydWN0b3I7XG4gICAgaWYgKHR5cGVvZiBjYXN0T2JqICE9PSBcImZ1bmN0aW9uXCIgJiYgIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5qZWN0YWJsZSByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBuYW1lID1cbiAgICAgIGNhdGVnb3J5IHx8XG4gICAgICAoY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSAmJiBjb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY29uc3RydWN0b3IgYXMgeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0pLm5hbWVcbiAgICAgICAgOiBjYXN0T2JqLm5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdIHx8IGZvcmNlKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXSA9IHtcbiAgICAgICAgaW5zdGFuY2U6IGNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJ1Y3RvcjogIWNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGV0b246IGlzU2luZ2xldG9uLFxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGJ1aWxkPFQ+KGRlZnM6IHsgbmFtZTogc3RyaW5nIH0sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3Rvciwgc2luZ2xldG9uIH0gPSB0aGlzLmNhY2hlW2RlZnMubmFtZV07XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoLi4uYXJncyk7XG4gICAgdGhpcy5jYWNoZVtkZWZzLm5hbWVdID0ge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgY29uc3RydWN0b3I6IGNvbnN0cnVjdG9yLFxuICAgICAgc2luZ2xldG9uOiBzaW5nbGV0b24sXG4gICAgfTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbiJdfQ==
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbURBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFBbEM7UUFDVSxVQUFLLEdBQStCLEVBQUUsQ0FBQztJQTREakQsQ0FBQztJQTFEQzs7T0FFRztJQUNILEdBQUcsQ0FBSSxJQUFZLEVBQUUsR0FBRyxJQUFXO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtnQkFDL0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFJLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzFDLE9BQU8sVUFBVSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFJLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQy9ELDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxRQUFRLENBQ04sR0FBa0IsRUFDbEIsV0FBK0IsU0FBUyxFQUN4QyxjQUF1QixJQUFJLEVBQzNCLFFBQWlCLEtBQUs7UUFFdEIsTUFBTSxPQUFPLEdBQXdCLEdBQTBCLENBQUM7UUFFaEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDekQsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLElBQUksQ0FBQyxXQUFXO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFLENBQ25FLENBQUM7UUFFSixNQUFNLElBQUksR0FDUixRQUFRO1lBQ1IsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVU7Z0JBQ2pFLENBQUMsQ0FBRSxXQUEwQyxDQUFDLElBQUk7Z0JBQ2xELENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUNqQixRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3ZDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUMzQyxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUFDO0lBQ04sQ0FBQztJQUNEOztPQUVHO0lBQ0gsS0FBSyxDQUFJLElBQXNCLEVBQUUsR0FBRyxJQUFXO1FBQzdDLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsV0FBVztZQUN4QixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSByZXByZXNlbnRpbmcgZWl0aGVyIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2UuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGFuIEluamVjdGFibGUgdHlwZSB0aGF0IGNhbiBiZSBlaXRoZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oYW55KTogVCB8IFR9IEluamVjdGFibGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGU8VD4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0gfCBUO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250cmFjdCBmb3IgYSByZWdpc3RyeSB0aGF0IG1hbmFnZXMgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHN1bW1hcnkgSW50ZXJmYWNlIGZvciBhbiBpbmplY3RhYmxlIHJlZ2lzdHJ5IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZywgcmVnaXN0ZXJpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBpbnRlcmZhY2UgbWV0aG9kc1xuICogQGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGFibGVzUmVnaXN0cnkge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW4ge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IG5hbWUsIG9wdGlvbmFsbHkgcGFzc2luZyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgZ2V0PFQ+KG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNsYXNzIG9yIG9iamVjdCB0byB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIGluamVjdGFibGUgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCB0aGUgcmVnaXN0cnksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGluamVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtJbmplY3RhYmxlPFQ+fSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgY29uc3RydWN0b3Igb3Igb2JqZWN0IGluc3RhbmNlIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlZ2lzdHJhdGlvbiAoY2F0ZWdvcnksIHNpbmdsZXRvbiBmbGFnLCBldGMuKVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sIC4uLmFyZ3M6IGFueVtdKTogdm9pZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gYnVpbGRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7VH0gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIGJ1aWxkPFQ+KG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uYXJnczogYW55W10pOiBUO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IGludGVyZmFjZS5cbiAqIEBzdW1tYXJ5IEhvbGRzIHRoZSB2YXJpb3VzIHtAbGluayBJbmplY3RhYmxlfXMgaW4gYSBjYWNoZSBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byByZWdpc3RlciwgcmV0cmlldmUsIGFuZCBidWlsZCB0aGVtLlxuICogQHRlbXBsYXRlIFQgVHlwZSBwYXJhbWV0ZXIgdXNlZCBpbiB0aGUgY2xhc3MgbWV0aG9kc1xuICpcbiAqIEBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXBcbiAqIEBpbXBsZW1lbnRzIEluamVjdGFibGVzUmVnaXN0cnlcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgcmVnaXN0cnlcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGEgY2xhc3NcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGRvU29tZXRoaW5nKCkge1xuICogICAgIHJldHVybiAnSGVsbG8gV29ybGQnO1xuICogICB9XG4gKiB9XG4gKiByZWdpc3RyeS5yZWdpc3RlcihNeVNlcnZpY2UsICdNeVNlcnZpY2UnLCB0cnVlKTtcbiAqXG4gKiAvLyBHZXQgdGhlIGluc3RhbmNlXG4gKiBjb25zdCBzZXJ2aWNlID0gcmVnaXN0cnkuZ2V0KCdNeVNlcnZpY2UnKTtcbiAqIHNlcnZpY2UuZG9Tb21ldGhpbmcoKTsgLy8gJ0hlbGxvIFdvcmxkJ1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlZ2lzdHJ5XG4gKlxuICogICBDbGllbnQtPj5SZWdpc3RyeTogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBSZWdpc3RyeS0+PlJlZ2lzdHJ5OiBTdG9yZSBpbiBjYWNoZVxuICpcbiAqICAgQ2xpZW50LT4+UmVnaXN0cnk6IGdldChcIk15U2VydmljZVwiKVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGFuZCBpcyBzaW5nbGV0b25cbiAqICAgICBSZWdpc3RyeS0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZSBvciBub3Qgc2luZ2xldG9uXG4gKiAgICAgUmVnaXN0cnktPj5SZWdpc3RyeTogYnVpbGQobmFtZSlcbiAqICAgICBSZWdpc3RyeS0tPj5DbGllbnQ6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAgaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBjYWNoZTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdldDxUPihuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlubmVyQ2FjaGUgPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgY29uc3QgYnVpbGREZWYgPSB7IG5hbWU6IG5hbWUgfTtcbiAgICAgIGlmICghaW5uZXJDYWNoZS5zaW5nbGV0b24gJiYgIWlubmVyQ2FjaGUuaW5zdGFuY2UpXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkPFQ+KGJ1aWxkRGVmLCAuLi5hcmdzKTtcbiAgICAgIHJldHVybiBpbm5lckNhY2hlLmluc3RhbmNlIHx8IHRoaXMuYnVpbGQ8VD4oYnVpbGREZWYsIC4uLmFyZ3MpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgb2JqOiBJbmplY3RhYmxlPFQ+LFxuICAgIGNhdGVnb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaXNTaW5nbGV0b246IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FzdE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgY29uc3QgY29uc3RydWN0b3IgPSAhY2FzdE9iai5uYW1lICYmIGNhc3RPYmouY29uc3RydWN0b3I7XG4gICAgaWYgKHR5cGVvZiBjYXN0T2JqICE9PSBcImZ1bmN0aW9uXCIgJiYgIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5qZWN0YWJsZSByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBuYW1lID1cbiAgICAgIGNhdGVnb3J5IHx8XG4gICAgICAoY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSAmJiBjb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkZ1bmN0aW9uXCJcbiAgICAgICAgPyAoY29uc3RydWN0b3IgYXMgeyBbaW5kZXhlcjogc3RyaW5nXTogYW55IH0pLm5hbWVcbiAgICAgICAgOiBjYXN0T2JqLm5hbWUpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdIHx8IGZvcmNlKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXSA9IHtcbiAgICAgICAgaW5zdGFuY2U6IGNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJ1Y3RvcjogIWNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGV0b246IGlzU2luZ2xldG9uLFxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGJ1aWxkPFQ+KGRlZnM6IHsgbmFtZTogc3RyaW5nIH0sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3Rvciwgc2luZ2xldG9uIH0gPSB0aGlzLmNhY2hlW2RlZnMubmFtZV07XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoLi4uYXJncyk7XG4gICAgdGhpcy5jYWNoZVtkZWZzLm5hbWVdID0ge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgY29uc3RydWN0b3I6IGNvbnN0cnVjdG9yLFxuICAgICAgc2luZ2xldG9uOiBzaW5nbGV0b24sXG4gICAgfTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbiJdfQ==