/
ComponentUtils.js
119 lines (104 loc) · 2.92 KB
/
ComponentUtils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
export default class ComponentUtils {
/**
* Initializes the registry used for managing component utils.
*
* @param {ObjectContainer} oc The application's dependency injector - the
* object container.
*/
constructor(oc) {
/**
* The application's dependency injector - the object container.
*
* @type {ObjectContainer}
*/
this._oc = oc;
/**
* Map of registered utilities.
*
* @type {Object<string, function(new: T, ...*)|function(...*): T>}
*/
this._utilityClasses = {};
/**
* Map of instantiated utilities
*
* @type {Object<string, Object>}
*/
this._utilities = null;
/**
* Map of referrers to utilities
*
* @type {Object<string, string>}
*/
this._utilityReferrers = {};
}
/**
* Registers single utility class or multiple classes in alias->class mapping.
*
* @param {string|Object<string, function(new: T, ...*)|function(...*): T>} name
* @param {function(new: T, ...*)|function(...*): T|String} componentUtilityClass
* @param {?string} referrer
*/
register(name, componentUtilityClass, referrer = null) {
if (
typeof componentUtilityClass === 'function' ||
typeof componentUtilityClass === 'string'
) {
const alias = String(name);
this._utilityClasses[alias] = componentUtilityClass;
if (referrer && typeof referrer === 'string') {
this._utilityReferrers[alias] = referrer;
}
if (this._utilities) {
this._createUtilityInstance(alias, componentUtilityClass);
}
} else if (
name &&
typeof name === 'object' &&
name.constructor === Object
) {
const utilityClasses = name;
referrer = componentUtilityClass;
for (const alias of Object.keys(utilityClasses)) {
if (!Object.prototype.hasOwnProperty.call(utilityClasses, alias)) {
continue;
}
this.register(alias, utilityClasses[alias], referrer);
}
}
}
/**
* Returns object containing all registered utilities
*
* @returns {Object<string, Object>}
*/
getUtils() {
if (this._utilities) {
return this._utilities;
}
this._utilities = {};
// create instance of each utility class
for (const alias of Object.keys(this._utilityClasses)) {
this._createUtilityInstance(alias, this._utilityClasses[alias]);
}
if (this._oc.has('$Utils')) {
// fallback for backward compatibility
Object.assign(this._utilities, this._oc.get('$Utils'));
}
return this._utilities;
}
/**
* @returns {Object<string, string>}
*/
getReferrers() {
return this._utilityReferrers;
}
/**
* @template T
* @param {string} alias
* @param {function(new: T, ...*)|function(...*): T|String} utilityClass
* @return {T}
*/
_createUtilityInstance(alias, utilityClass) {
return (this._utilities[alias] = this._oc.get(utilityClass));
}
}