@igo2/utils 18.0.1-next.2 → 18.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,249 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ export class ObjectUtils {
3
+ static resolve(obj, key) {
4
+ const keysArray = key.replace(/\[/g, '.').replace(/\]/g, '').split('.');
5
+ let current = obj;
6
+ while (keysArray.length) {
7
+ if (typeof current !== 'object') {
8
+ return undefined;
9
+ }
10
+ current = current[keysArray.shift()];
11
+ }
12
+ return current;
13
+ }
14
+ static isObject(item) {
15
+ return (item &&
16
+ typeof item === 'object' &&
17
+ !Array.isArray(item) &&
18
+ item !== null &&
19
+ !(item instanceof Date));
20
+ }
21
+ static mergeDeep(target, source, ignoreUndefined = false) {
22
+ const output = Object.assign({}, target);
23
+ if (ObjectUtils.isObject(target) && ObjectUtils.isObject(source)) {
24
+ Object.keys(source)
25
+ .filter((key) => !ignoreUndefined || source[key] !== undefined)
26
+ .forEach((key) => {
27
+ if (ObjectUtils.isObject(source[key])) {
28
+ if (!(key in target)) {
29
+ Object.assign(output, { [key]: source[key] });
30
+ }
31
+ else {
32
+ output[key] = ObjectUtils.mergeDeep(target[key], source[key], ignoreUndefined);
33
+ }
34
+ }
35
+ else {
36
+ Object.assign(output, { [key]: source[key] });
37
+ }
38
+ });
39
+ }
40
+ return output;
41
+ }
42
+ static copyDeep(src) {
43
+ const target = Array.isArray(src) ? [] : {};
44
+ for (const prop in src) {
45
+ if (src.hasOwnProperty(prop)) {
46
+ const value = src[prop];
47
+ if (value && typeof value === 'object') {
48
+ target[prop] = this.copyDeep(value);
49
+ }
50
+ else {
51
+ target[prop] = value;
52
+ }
53
+ }
54
+ }
55
+ return target;
56
+ }
57
+ static removeDuplicateCaseInsensitive(obj) {
58
+ const summaryCapitalizeObject = {};
59
+ const capitalizeObject = {};
60
+ const upperCaseCount = [];
61
+ for (const property in obj) {
62
+ if (obj.hasOwnProperty(property)) {
63
+ const upperCaseProperty = property.toUpperCase();
64
+ if (!summaryCapitalizeObject.hasOwnProperty(upperCaseProperty)) {
65
+ summaryCapitalizeObject[upperCaseProperty] = [
66
+ { [property]: obj[property] }
67
+ ];
68
+ }
69
+ else {
70
+ summaryCapitalizeObject[upperCaseProperty].push({
71
+ [property]: obj[property]
72
+ });
73
+ }
74
+ // counting the number of uppercase lettersMna
75
+ upperCaseCount.push({
76
+ key: property,
77
+ count: property.replace(/[^A-Z]/g, '').length
78
+ });
79
+ }
80
+ }
81
+ for (const capitalizedProperty in summaryCapitalizeObject) {
82
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
83
+ if (summaryCapitalizeObject.hasOwnProperty(capitalizedProperty)) {
84
+ const capitalizedPropertyObject = summaryCapitalizeObject[capitalizedProperty];
85
+ if (capitalizedPropertyObject.length === 1) {
86
+ // for single params (no duplicates)
87
+ const singlePossibility = capitalizedPropertyObject[0];
88
+ capitalizeObject[capitalizedProperty] =
89
+ singlePossibility[Object.keys(singlePossibility)[0]];
90
+ }
91
+ else if (capitalizedPropertyObject.length > 1) {
92
+ // defining the closest to lowercase property
93
+ const paramClosestToLowercase = upperCaseCount
94
+ .filter((f) => f.key.toLowerCase() === capitalizedProperty.toLowerCase())
95
+ .reduce((prev, current) => {
96
+ return prev.y < current.y ? prev : current;
97
+ });
98
+ capitalizeObject[paramClosestToLowercase.key.toUpperCase()] =
99
+ obj[paramClosestToLowercase.key];
100
+ }
101
+ }
102
+ }
103
+ }
104
+ for (const property in obj) {
105
+ if (obj.hasOwnProperty(property)) {
106
+ delete obj[property];
107
+ }
108
+ }
109
+ for (const property in capitalizeObject) {
110
+ if (capitalizeObject.hasOwnProperty(property)) {
111
+ obj[property] = capitalizeObject[property];
112
+ }
113
+ }
114
+ }
115
+ static removeUndefined(obj) {
116
+ const output = {};
117
+ if (ObjectUtils.isObject(obj)) {
118
+ Object.keys(obj)
119
+ .filter((key) => obj[key] !== undefined)
120
+ .forEach((key) => {
121
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
122
+ output[key] = ObjectUtils.removeUndefined(obj[key]);
123
+ }
124
+ else {
125
+ output[key] = obj[key];
126
+ }
127
+ });
128
+ return output;
129
+ }
130
+ if (Array.isArray(obj)) {
131
+ return obj.map((o) => ObjectUtils.removeUndefined(o));
132
+ }
133
+ return obj;
134
+ }
135
+ static removeNull(obj) {
136
+ const output = {};
137
+ if (ObjectUtils.isObject(obj)) {
138
+ Object.keys(obj)
139
+ .filter((key) => obj[key] !== null)
140
+ .forEach((key) => {
141
+ if (ObjectUtils.isObject(obj[key]) || Array.isArray(obj[key])) {
142
+ output[key] = ObjectUtils.removeNull(obj[key]);
143
+ }
144
+ else {
145
+ output[key] = obj[key];
146
+ }
147
+ });
148
+ return output;
149
+ }
150
+ if (Array.isArray(obj)) {
151
+ return obj.map((o) => ObjectUtils.removeNull(o));
152
+ }
153
+ return obj;
154
+ }
155
+ static naturalCompare(a, b, direction = 'asc', nullsFirst) {
156
+ if (direction === 'desc') {
157
+ b = [a, (a = b)][0];
158
+ }
159
+ // nullsFirst = undefined : end if direction = 'asc', first if direction = 'desc'
160
+ // nullsFirst = true : always first
161
+ // nullsFirst = false : always end
162
+ if (a === null ||
163
+ a === '' ||
164
+ a === undefined ||
165
+ b === null ||
166
+ b === '' ||
167
+ b === undefined) {
168
+ const nullScore = a === b
169
+ ? 0
170
+ : a === undefined
171
+ ? 3
172
+ : b === undefined
173
+ ? -3
174
+ : a === null
175
+ ? 2
176
+ : b === null
177
+ ? -2
178
+ : a === ''
179
+ ? 1
180
+ : -1;
181
+ if (direction === 'desc') {
182
+ return nullsFirst !== false ? nullScore : nullScore * -1;
183
+ }
184
+ return nullsFirst === true ? nullScore * -1 : nullScore;
185
+ }
186
+ const ax = [];
187
+ const bx = [];
188
+ a = '' + a;
189
+ b = '' + b;
190
+ a.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
191
+ ax.push([$1 || Infinity, $2 || '']);
192
+ });
193
+ b.replace(/(\d+)|(\D+)/g, (_, $1, $2) => {
194
+ bx.push([$1 || Infinity, $2 || '']);
195
+ });
196
+ while (ax.length && bx.length) {
197
+ const an = ax.shift();
198
+ const bn = bx.shift();
199
+ const nn = an[0] - bn[0] || an[1].localeCompare(bn[1]);
200
+ if (nn) {
201
+ return nn;
202
+ }
203
+ }
204
+ return ax.length - bx.length;
205
+ }
206
+ /**
207
+ * Return true if two object are equivalent.
208
+ * Objects are considered equivalent if they have the same properties and
209
+ * if all of their properties (first-level only) share the same value.
210
+ * @param obj1 First object
211
+ * @param obj2 Second object
212
+ * @returns Whether two objects arer equivalent
213
+ */
214
+ static objectsAreEquivalent(obj1, obj2) {
215
+ if (obj1 === obj2) {
216
+ return true;
217
+ }
218
+ const obj1Props = Object.getOwnPropertyNames(obj1);
219
+ const obj2Props = Object.getOwnPropertyNames(obj2);
220
+ if (obj1Props.length !== obj2Props.length) {
221
+ return false;
222
+ }
223
+ for (const prop of obj1Props) {
224
+ if (obj1[prop] !== obj2[prop]) {
225
+ return false;
226
+ }
227
+ }
228
+ return true;
229
+ }
230
+ /**
231
+ * Return a new object with an array of keys removed
232
+ * @param obj Source object
233
+ * @param keys Keys to remove
234
+ * @returns A new object
235
+ */
236
+ static removeKeys(obj, keys) {
237
+ const newObj = Object.keys(obj)
238
+ .filter((key) => keys.indexOf(key) < 0)
239
+ .reduce((_obj, key) => {
240
+ _obj[key] = obj[key];
241
+ return _obj;
242
+ }, {});
243
+ return newObj;
244
+ }
245
+ static isEmpty(obj) {
246
+ return Object.keys(obj).length === 0;
247
+ }
248
+ }
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9vYmplY3QtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMENBQTBDO0FBQzFDLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBVyxFQUFFLEdBQVc7UUFDckMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLE9BQU8sU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLE9BQU8sQ0FDTCxJQUFJO1lBQ0osT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3BCLElBQUksS0FBSyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUNkLE1BQWMsRUFDZCxNQUFjLEVBQ2QsZUFBZSxHQUFHLEtBQUs7UUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7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O2dCQUM5QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQVcsRUFBRSxJQUFjO1FBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQzVCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFVCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFXO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xuZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgc3RhdGljIHJlc29sdmUob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBrZXlzQXJyYXkgPSBrZXkucmVwbGFjZSgvXFxbL2csICcuJykucmVwbGFjZSgvXFxdL2csICcnKS5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIHdoaWxlIChrZXlzQXJyYXkubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXlzQXJyYXkuc2hpZnQoKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBzdGF0aWMgaXNPYmplY3QoaXRlbTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0gJiZcbiAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoaXRlbSkgJiZcbiAgICAgIGl0ZW0gIT09IG51bGwgJiZcbiAgICAgICEoaXRlbSBpbnN0YW5jZW9mIERhdGUpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZXAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgc291cmNlOiBvYmplY3QsXG4gICAgaWdub3JlVW5kZWZpbmVkID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBjb25zdCBvdXRwdXQgPSBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQpO1xuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdCh0YXJnZXQpICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSlcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhaWdub3JlVW5kZWZpbmVkIHx8IHNvdXJjZVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXRwdXRba2V5XSA9IE9iamVjdFV0aWxzLm1lcmdlRGVlcChcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSxcbiAgICAgICAgICAgICAgICBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmRlZmluZWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvdXRwdXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBzdGF0aWMgY29weURlZXAoc3JjKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBBcnJheS5pc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzcmNbcHJvcF07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdGhpcy5jb3B5RGVlcCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVEdXBsaWNhdGVDYXNlSW5zZW5zaXRpdmUob2JqOiBvYmplY3QpIHtcbiAgICBjb25zdCBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGNhcGl0YWxpemVPYmplY3QgPSB7fTtcbiAgICBjb25zdCB1cHBlckNhc2VDb3VudCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyQ2FzZVByb3BlcnR5ID0gcHJvcGVydHkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh1cHBlckNhc2VQcm9wZXJ0eSkpIHtcbiAgICAgICAgICBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdFt1cHBlckNhc2VQcm9wZXJ0eV0gPSBbXG4gICAgICAgICAgICB7IFtwcm9wZXJ0eV06IG9ialtwcm9wZXJ0eV0gfVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbdXBwZXJDYXNlUHJvcGVydHldLnB1c2goe1xuICAgICAgICAgICAgW3Byb3BlcnR5XTogb2JqW3Byb3BlcnR5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnNNbmFcbiAgICAgICAgdXBwZXJDYXNlQ291bnQucHVzaCh7XG4gICAgICAgICAga2V5OiBwcm9wZXJ0eSxcbiAgICAgICAgICBjb3VudDogcHJvcGVydHkucmVwbGFjZSgvW15BLVpdL2csICcnKS5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FwaXRhbGl6ZWRQcm9wZXJ0eSBpbiBzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdCkge1xuICAgICAgaWYgKHN1bW1hcnlDYXBpdGFsaXplT2JqZWN0Lmhhc093blByb3BlcnR5KGNhcGl0YWxpemVkUHJvcGVydHkpKSB7XG4gICAgICAgIGlmIChzdW1tYXJ5Q2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShjYXBpdGFsaXplZFByb3BlcnR5KSkge1xuICAgICAgICAgIGNvbnN0IGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QgPVxuICAgICAgICAgICAgc3VtbWFyeUNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKGNhcGl0YWxpemVkUHJvcGVydHlPYmplY3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2luZ2xlIHBhcmFtcyAobm8gZHVwbGljYXRlcylcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZVBvc3NpYmlsaXR5ID0gY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdFswXTtcbiAgICAgICAgICAgIGNhcGl0YWxpemVPYmplY3RbY2FwaXRhbGl6ZWRQcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICBzaW5nbGVQb3NzaWJpbGl0eVtPYmplY3Qua2V5cyhzaW5nbGVQb3NzaWJpbGl0eSlbMF1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2FwaXRhbGl6ZWRQcm9wZXJ0eU9iamVjdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmluZyB0aGUgY2xvc2VzdCB0byBsb3dlcmNhc2UgcHJvcGVydHlcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ2xvc2VzdFRvTG93ZXJjYXNlID0gdXBwZXJDYXNlQ291bnRcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZikgPT4gZi5rZXkudG9Mb3dlckNhc2UoKSA9PT0gY2FwaXRhbGl6ZWRQcm9wZXJ0eS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LnkgPCBjdXJyZW50LnkgPyBwcmV2IDogY3VycmVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXBpdGFsaXplT2JqZWN0W3BhcmFtQ2xvc2VzdFRvTG93ZXJjYXNlLmtleS50b1VwcGVyQ2FzZSgpXSA9XG4gICAgICAgICAgICAgIG9ialtwYXJhbUNsb3Nlc3RUb0xvd2VyY2FzZS5rZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgZGVsZXRlIG9ialtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjYXBpdGFsaXplT2JqZWN0KSB7XG4gICAgICBpZiAoY2FwaXRhbGl6ZU9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5XSA9IGNhcGl0YWxpemVPYmplY3RbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVVbmRlZmluZWQob2JqOiBvYmplY3QpOiBhbnkge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmopKSB7XG4gICAgICBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gb2JqW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlVW5kZWZpbmVkKG9ialtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKChvKSA9PiBPYmplY3RVdGlscy5yZW1vdmVVbmRlZmluZWQobykpO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlTnVsbChvYmo6IG9iamVjdCk6IGFueSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgIE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBvYmpba2V5XSAhPT0gbnVsbClcbiAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChvYmpba2V5XSkgfHwgQXJyYXkuaXNBcnJheShvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvYmpba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gb2JqLm1hcCgobykgPT4gT2JqZWN0VXRpbHMucmVtb3ZlTnVsbChvKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHN0YXRpYyBuYXR1cmFsQ29tcGFyZShhLCBiLCBkaXJlY3Rpb24gPSAnYXNjJywgbnVsbHNGaXJzdD86IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgIGIgPSBbYSwgKGEgPSBiKV1bMF07XG4gICAgfVxuXG4gICAgLy8gbnVsbHNGaXJzdCA9IHVuZGVmaW5lZCA6IGVuZCBpZiBkaXJlY3Rpb24gPSAnYXNjJywgZmlyc3QgaWYgZGlyZWN0aW9uID0gJ2Rlc2MnXG4gICAgLy8gbnVsbHNGaXJzdCA9IHRydWUgOiBhbHdheXMgZmlyc3RcbiAgICAvLyBudWxsc0ZpcnN0ID0gZmFsc2UgOiBhbHdheXMgZW5kXG4gICAgaWYgKFxuICAgICAgYSA9PT0gbnVsbCB8fFxuICAgICAgYSA9PT0gJycgfHxcbiAgICAgIGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgYiA9PT0gbnVsbCB8fFxuICAgICAgYiA9PT0gJycgfHxcbiAgICAgIGIgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgbnVsbFNjb3JlID1cbiAgICAgICAgYSA9PT0gYlxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogYSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDNcbiAgICAgICAgICAgIDogYiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gLTNcbiAgICAgICAgICAgICAgOiBhID09PSBudWxsXG4gICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgOiBiID09PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IC0yXG4gICAgICAgICAgICAgICAgICA6IGEgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgIHJldHVybiBudWxsc0ZpcnN0ICE9PSBmYWxzZSA/IG51bGxTY29yZSA6IG51bGxTY29yZSAqIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxzRmlyc3QgPT09IHRydWUgPyBudWxsU2NvcmUgKiAtMSA6IG51bGxTY29yZTtcbiAgICB9XG5cbiAgICBjb25zdCBheCA9IFtdO1xuICAgIGNvbnN0IGJ4ID0gW107XG4gICAgYSA9ICcnICsgYTtcbiAgICBiID0gJycgKyBiO1xuXG4gICAgYS5yZXBsYWNlKC8oXFxkKyl8KFxcRCspL2csIChfLCAkMSwgJDIpID0+IHtcbiAgICAgIGF4LnB1c2goWyQxIHx8IEluZmluaXR5LCAkMiB8fCAnJ10pO1xuICAgIH0pO1xuXG4gICAgYi5yZXBsYWNlKC8oXFxkKyl8KFxcRCspL2csIChfLCAkMSwgJDIpID0+IHtcbiAgICAgIGJ4LnB1c2goWyQxIHx8IEluZmluaXR5LCAkMiB8fCAnJ10pO1xuICAgIH0pO1xuXG4gICAgd2hpbGUgKGF4Lmxlbmd0aCAmJiBieC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGFuID0gYXguc2hpZnQoKTtcbiAgICAgIGNvbnN0IGJuID0gYnguc2hpZnQoKTtcbiAgICAgIGNvbnN0IG5uID0gYW5bMF0gLSBiblswXSB8fCBhblsxXS5sb2NhbGVDb21wYXJlKGJuWzFdKTtcbiAgICAgIGlmIChubikge1xuICAgICAgICByZXR1cm4gbm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF4Lmxlbmd0aCAtIGJ4Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB0d28gb2JqZWN0IGFyZSBlcXVpdmFsZW50LlxuICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHByb3BlcnRpZXMgYW5kXG4gICAqIGlmIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIChmaXJzdC1sZXZlbCBvbmx5KSBzaGFyZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICogQHBhcmFtIG9iajEgRmlyc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSBvYmoyIFNlY29uZCBvYmplY3RcbiAgICogQHJldHVybnMgV2hldGhlciB0d28gb2JqZWN0cyBhcmVyIGVxdWl2YWxlbnRcbiAgICovXG4gIHN0YXRpYyBvYmplY3RzQXJlRXF1aXZhbGVudChvYmoxOiBvYmplY3QsIG9iajI6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmIChvYmoxID09PSBvYmoyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBvYmoxUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmoxKTtcbiAgICBjb25zdCBvYmoyUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmoyKTtcbiAgICBpZiAob2JqMVByb3BzLmxlbmd0aCAhPT0gb2JqMlByb3BzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmoxUHJvcHMpIHtcbiAgICAgIGlmIChvYmoxW3Byb3BdICE9PSBvYmoyW3Byb3BdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBuZXcgb2JqZWN0IHdpdGggYW4gYXJyYXkgb2Yga2V5cyByZW1vdmVkXG4gICAqIEBwYXJhbSBvYmogU291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ga2V5cyBLZXlzIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBBIG5ldyBvYmplY3RcbiAgICovXG4gIHN0YXRpYyByZW1vdmVLZXlzKG9iajogb2JqZWN0LCBrZXlzOiBzdHJpbmdbXSk6IG9iamVjdCB7XG4gICAgY29uc3QgbmV3T2JqID0gT2JqZWN0LmtleXMob2JqKVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXlzLmluZGV4T2Yoa2V5KSA8IDApXG4gICAgICAucmVkdWNlKChfb2JqLCBrZXkpID0+IHtcbiAgICAgICAgX29ialtrZXldID0gb2JqW2tleV07XG4gICAgICAgIHJldHVybiBfb2JqO1xuICAgICAgfSwge30pO1xuXG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxuXG4gIHN0YXRpYyBpc0VtcHR5KG9iajogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /** Utility function to create a K:V from a list of strings */
2
+ export function strEnum(o) {
3
+ return o.reduce((res, key) => {
4
+ res[key] = key;
5
+ return res;
6
+ }, Object.create(null));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvc3RyZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLE9BQU8sQ0FBbUIsQ0FBTTtJQUM5QyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSzpWIGZyb20gYSBsaXN0IG9mIHN0cmluZ3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJFbnVtPFQgZXh0ZW5kcyBzdHJpbmc+KG86IFRbXSk6IHsgW0sgaW4gVF06IEsgfSB7XG4gIHJldHVybiBvLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcbiAgICByZXNba2V5XSA9IGtleTtcbiAgICByZXR1cm4gcmVzO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbiJdfQ==
@@ -0,0 +1,115 @@
1
+ export class StringUtils {
2
+ static diff(s1, s2, p = 4) {
3
+ if (!s1 && !s2) {
4
+ return '';
5
+ }
6
+ if (!s1) {
7
+ return '<span class="inserted">' + s2 + '</span>';
8
+ }
9
+ if (!s2) {
10
+ return '<span class="deleted">' + s1 + '</span>';
11
+ }
12
+ s1 = s1.toString();
13
+ s2 = s2.toString();
14
+ const changeData = StringUtils.getChanges(s1, s2, '', p);
15
+ const nextS = s2.slice(changeData.mtc.length + changeData.ins.length + changeData.sbs.length); // remaining part of "s"
16
+ const nextThis = s1.slice(changeData.mtc.length + changeData.del.length + changeData.sbs.length); // remaining part of "this"
17
+ let result = ''; // the glorious result
18
+ if (changeData.del.length > 0) {
19
+ changeData.del = '<span class="deleted">' + changeData.del + '</span>';
20
+ }
21
+ if (changeData.ins.length > 0) {
22
+ changeData.ins = '<span class="inserted">' + changeData.ins + '</span>';
23
+ }
24
+ result = changeData.mtc + changeData.del + changeData.ins + changeData.sbs;
25
+ result +=
26
+ nextThis !== '' || nextS !== ''
27
+ ? StringUtils.diff(nextThis, nextS, p)
28
+ : '';
29
+ return result;
30
+ }
31
+ static getMatchingSubstring(s, l, m) {
32
+ // returns the first matching substring in-between the two strings
33
+ let i = 0;
34
+ let match = false;
35
+ const slen = s.length;
36
+ const o = { fis: slen, mtc: m, sbs: '' }; // temporary object used to construct the cd (change data) object
37
+ while (i < slen) {
38
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
39
+ l[i] === s[i]
40
+ ? match
41
+ ? (o.sbs += s[i]) // o.sbs holds the matching substring itsef
42
+ : ((match = true), (o.fis = i), (o.sbs = s[i]))
43
+ : match
44
+ ? (i = slen) // stop after the first found substring
45
+ : // eslint-disable-next-line no-self-assign
46
+ (i = i);
47
+ ++i;
48
+ }
49
+ return o;
50
+ }
51
+ static getChanges(s1, s2, m, p) {
52
+ const isThisLonger = s1.length >= s1.length ? true : false;
53
+ let [longer, shorter] = isThisLonger ? [s1, s2] : [s2, s1]; // assignment of longer and shorter by es6 destructuring
54
+ let bi = 0; // base index designating the index of first mismacthing character in both strings
55
+ while (shorter[bi] === longer[bi] && bi < shorter.length) {
56
+ ++bi;
57
+ } // make bi the index of first mismatching character
58
+ longer = longer.split('').slice(bi); // as the longer string will be rotated it is converted into array
59
+ shorter = shorter.slice(bi); // shorter and longer now starts from the first mismatching character
60
+ const len = longer.length; // length of the longer string
61
+ let cd = {
62
+ fis: shorter.length, // the index of matching string in the shorter string
63
+ fil: len, // the index of matching string in the longer string
64
+ sbs: '', // the matching substring itself
65
+ mtc: m + s2.slice(0, bi)
66
+ }; // if exists mtc holds the matching string at the front
67
+ let sub = { sbs: '' }; // returned substring per 1 character rotation of the longer string
68
+ if (shorter !== '') {
69
+ for (let rc = 0; rc < len && sub.sbs.length < p; rc++) {
70
+ // rc -> rotate count, p -> precision factor
71
+ sub = StringUtils.getMatchingSubstring(shorter, StringUtils.rotateArray(longer, rc), cd.mtc); // rotate longer string 1 char and get substring
72
+ sub.fil =
73
+ rc < len - sub.fis
74
+ ? sub.fis + rc // mismatch is longer than the mismatch in short
75
+ : sub.fis - len + rc; // mismatch is shorter than the mismatch in short
76
+ if (sub.sbs.length > cd.sbs.length) {
77
+ cd = sub; // only keep the one with the longest substring.
78
+ }
79
+ }
80
+ }
81
+ // insert the mismatching delete subsrt and insert substr to the cd object and attach the previous substring
82
+ [cd.del, cd.ins] = isThisLonger
83
+ ? [longer.slice(0, cd.fil).join(''), shorter.slice(0, cd.fis)]
84
+ : [shorter.slice(0, cd.fis), longer.slice(0, cd.fil).join('')];
85
+ return cd.del.indexOf(' ') === -1 ||
86
+ cd.ins.indexOf(' ') === -1 ||
87
+ cd.del === '' ||
88
+ cd.ins === '' ||
89
+ cd.sbs === ''
90
+ ? cd
91
+ : StringUtils.getChanges(cd.del, cd.ins, cd.mtc, p);
92
+ }
93
+ static rotateArray(array, n) {
94
+ const len = array.length;
95
+ const res = new Array(array.length);
96
+ if (n % len === 0) {
97
+ return array.slice();
98
+ }
99
+ else {
100
+ for (let i = 0; i < len; i++) {
101
+ res[i] = array[(i + (len + (n % len))) % len];
102
+ }
103
+ }
104
+ return res;
105
+ }
106
+ static isValidNumber(value) {
107
+ return !isNaN(Number(value));
108
+ }
109
+ static isOctalNumber(value) {
110
+ return (StringUtils.isValidNumber(value) &&
111
+ value.startsWith('0') &&
112
+ value.length > 1);
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9zdHJpbmctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU8seUJBQXlCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQ25ELENBQUM7UUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUNwQixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMzQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUN2QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxD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QUMsTUFBTSxHQUFHLENBQUMsQ0FDakIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTdHJpbmdVdGlscyB7XG4gIHN0YXRpYyBkaWZmKHMxOiBzdHJpbmcsIHMyOiBzdHJpbmcsIHAgPSA0KTogc3RyaW5nIHtcbiAgICBpZiAoIXMxICYmICFzMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoIXMxKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwiaW5zZXJ0ZWRcIj4nICsgczIgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIGlmICghczIpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJkZWxldGVkXCI+JyArIHMxICsgJzwvc3Bhbj4nO1xuICAgIH1cbiAgICBzMSA9IHMxLnRvU3RyaW5nKCk7XG4gICAgczIgPSBzMi50b1N0cmluZygpO1xuICAgIGNvbnN0IGNoYW5nZURhdGEgPSBTdHJpbmdVdGlscy5nZXRDaGFuZ2VzKHMxLCBzMiwgJycsIHApO1xuICAgIGNvbnN0IG5leHRTID0gczIuc2xpY2UoXG4gICAgICBjaGFuZ2VEYXRhLm10Yy5sZW5ndGggKyBjaGFuZ2VEYXRhLmlucy5sZW5ndGggKyBjaGFuZ2VEYXRhLnNicy5sZW5ndGhcbiAgICApOyAvLyByZW1haW5pbmcgcGFydCBvZiBcInNcIlxuICAgIGNvbnN0IG5leHRUaGlzID0gczEuc2xpY2UoXG4gICAgICBjaGFuZ2VEYXRhLm10Yy5sZW5ndGggKyBjaGFuZ2VEYXRhLmRlbC5sZW5ndGggKyBjaGFuZ2VEYXRhLnNicy5sZW5ndGhcbiAgICApOyAvLyByZW1haW5pbmcgcGFydCBvZiBcInRoaXNcIlxuICAgIGxldCByZXN1bHQgPSAnJzsgLy8gdGhlIGdsb3Jpb3VzIHJlc3VsdFxuICAgIGlmIChjaGFuZ2VEYXRhLmRlbC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VEYXRhLmRlbCA9ICc8c3BhbiBjbGFzcz1cImRlbGV0ZWRcIj4nICsgY2hhbmdlRGF0YS5kZWwgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VEYXRhLmlucy5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VEYXRhLmlucyA9ICc8c3BhbiBjbGFzcz1cImluc2VydGVkXCI+JyArIGNoYW5nZURhdGEuaW5zICsgJzwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXN1bHQgPSBjaGFuZ2VEYXRhLm10YyArIGNoYW5nZURhdGEuZGVsICsgY2hhbmdlRGF0YS5pbnMgKyBjaGFuZ2VEYXRhLnNicztcbiAgICByZXN1bHQgKz1cbiAgICAgIG5leHRUaGlzICE9PSAnJyB8fCBuZXh0UyAhPT0gJydcbiAgICAgICAgPyBTdHJpbmdVdGlscy5kaWZmKG5leHRUaGlzLCBuZXh0UywgcClcbiAgICAgICAgOiAnJztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0Y2hpbmdTdWJzdHJpbmcocywgbCwgbSkge1xuICAgIC8vIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIHN1YnN0cmluZyBpbi1iZXR3ZWVuIHRoZSB0d28gc3RyaW5nc1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcbiAgICBjb25zdCBzbGVuID0gcy5sZW5ndGg7XG4gICAgY29uc3QgbyA9IHsgZmlzOiBzbGVuLCBtdGM6IG0sIHNiczogJycgfTsgLy8gdGVtcG9yYXJ5IG9iamVjdCB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgY2QgKGNoYW5nZSBkYXRhKSBvYmplY3RcblxuICAgIHdoaWxlIChpIDwgc2xlbikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgIGxbaV0gPT09IHNbaV1cbiAgICAgICAgPyBtYXRjaFxuICAgICAgICAgID8gKG8uc2JzICs9IHNbaV0pIC8vIG8uc2JzIGhvbGRzIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcgaXRzZWZcbiAgICAgICAgICA6ICgobWF0Y2ggPSB0cnVlKSwgKG8uZmlzID0gaSksIChvLnNicyA9IHNbaV0pKVxuICAgICAgICA6IG1hdGNoXG4gICAgICAgICAgPyAoaSA9IHNsZW4pIC8vIHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IGZvdW5kIHN1YnN0cmluZ1xuICAgICAgICAgIDogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgICAgICAgICAoaSA9IGkpO1xuICAgICAgKytpO1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENoYW5nZXMoczEsIHMyLCBtLCBwKSB7XG4gICAgY29uc3QgaXNUaGlzTG9uZ2VyID0gczEubGVuZ3RoID49IHMxLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgICBsZXQgW2xvbmdlciwgc2hvcnRlcl0gPSBpc1RoaXNMb25nZXIgPyBbczEsIHMyXSA6IFtzMiwgczFdOyAvLyBhc3NpZ25tZW50IG9mIGxvbmdlciBhbmQgc2hvcnRlciBieSBlczYgZGVzdHJ1Y3R1cmluZ1xuICAgIGxldCBiaSA9IDA7IC8vIGJhc2UgaW5kZXggZGVzaWduYXRpbmcgdGhlIGluZGV4IG9mIGZpcnN0IG1pc21hY3RoaW5nIGNoYXJhY3RlciBpbiBib3RoIHN0cmluZ3NcblxuICAgIHdoaWxlIChzaG9ydGVyW2JpXSA9PT0gbG9uZ2VyW2JpXSAmJiBiaSA8IHNob3J0ZXIubGVuZ3RoKSB7XG4gICAgICArK2JpO1xuICAgIH0gLy8gbWFrZSBiaSB0aGUgaW5kZXggb2YgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXG4gICAgbG9uZ2VyID0gbG9uZ2VyLnNwbGl0KCcnKS5zbGljZShiaSk7IC8vIGFzIHRoZSBsb25nZXIgc3RyaW5nIHdpbGwgYmUgcm90YXRlZCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhcnJheVxuICAgIHNob3J0ZXIgPSBzaG9ydGVyLnNsaWNlKGJpKTsgLy8gc2hvcnRlciBhbmQgbG9uZ2VyIG5vdyBzdGFydHMgZnJvbSB0aGUgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXG5cbiAgICBjb25zdCBsZW4gPSBsb25nZXIubGVuZ3RoOyAvLyBsZW5ndGggb2YgdGhlIGxvbmdlciBzdHJpbmdcbiAgICBsZXQgY2Q6IGFueSA9IHtcbiAgICAgIGZpczogc2hvcnRlci5sZW5ndGgsIC8vIHRoZSBpbmRleCBvZiBtYXRjaGluZyBzdHJpbmcgaW4gdGhlIHNob3J0ZXIgc3RyaW5nXG4gICAgICBmaWw6IGxlbiwgLy8gdGhlIGluZGV4IG9mIG1hdGNoaW5nIHN0cmluZyBpbiB0aGUgbG9uZ2VyIHN0cmluZ1xuICAgICAgc2JzOiAnJywgLy8gdGhlIG1hdGNoaW5nIHN1YnN0cmluZyBpdHNlbGZcbiAgICAgIG10YzogbSArIHMyLnNsaWNlKDAsIGJpKVxuICAgIH07IC8vIGlmIGV4aXN0cyBtdGMgaG9sZHMgdGhlIG1hdGNoaW5nIHN0cmluZyBhdCB0aGUgZnJvbnRcbiAgICBsZXQgc3ViOiBhbnkgPSB7IHNiczogJycgfTsgLy8gcmV0dXJuZWQgc3Vic3RyaW5nIHBlciAxIGNoYXJhY3RlciByb3RhdGlvbiBvZiB0aGUgbG9uZ2VyIHN0cmluZ1xuXG4gICAgaWYgKHNob3J0ZXIgIT09ICcnKSB7XG4gICAgICBmb3IgKGxldCByYyA9IDA7IHJjIDwgbGVuICYmIHN1Yi5zYnMubGVuZ3RoIDwgcDsgcmMrKykge1xuICAgICAgICAvLyByYyAtPiByb3RhdGUgY291bnQsIHAgLT4gcHJlY2lzaW9uIGZhY3RvclxuICAgICAgICBzdWIgPSBTdHJpbmdVdGlscy5nZXRNYXRjaGluZ1N1YnN0cmluZyhcbiAgICAgICAgICBzaG9ydGVyLFxuICAgICAgICAgIFN0cmluZ1V0aWxzLnJvdGF0ZUFycmF5KGxvbmdlciwgcmMpLFxuICAgICAgICAgIGNkLm10Y1xuICAgICAgICApOyAvLyByb3RhdGUgbG9uZ2VyIHN0cmluZyAxIGNoYXIgYW5kIGdldCBzdWJzdHJpbmdcbiAgICAgICAgc3ViLmZpbCA9XG4gICAgICAgICAgcmMgPCBsZW4gLSBzdWIuZmlzXG4gICAgICAgICAgICA/IHN1Yi5maXMgKyByYyAvLyBtaXNtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGUgbWlzbWF0Y2ggaW4gc2hvcnRcbiAgICAgICAgICAgIDogc3ViLmZpcyAtIGxlbiArIHJjOyAvLyBtaXNtYXRjaCBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XG4gICAgICAgIGlmIChzdWIuc2JzLmxlbmd0aCA+IGNkLnNicy5sZW5ndGgpIHtcbiAgICAgICAgICBjZCA9IHN1YjsgLy8gb25seSBrZWVwIHRoZSBvbmUgd2l0aCB0aGUgbG9uZ2VzdCBzdWJzdHJpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaW5zZXJ0IHRoZSBtaXNtYXRjaGluZyBkZWxldGUgc3Vic3J0IGFuZCBpbnNlcnQgc3Vic3RyIHRvIHRoZSBjZCBvYmplY3QgYW5kIGF0dGFjaCB0aGUgcHJldmlvdXMgc3Vic3RyaW5nXG4gICAgW2NkLmRlbCwgY2QuaW5zXSA9IGlzVGhpc0xvbmdlclxuICAgICAgPyBbbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyksIHNob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKV1cbiAgICAgIDogW3Nob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKSwgbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyldO1xuICAgIHJldHVybiBjZC5kZWwuaW5kZXhPZignICcpID09PSAtMSB8fFxuICAgICAgY2QuaW5zLmluZGV4T2YoJyAnKSA9PT0gLTEgfHxcbiAgICAgIGNkLmRlbCA9PT0gJycgfHxcbiAgICAgIGNkLmlucyA9PT0gJycgfHxcbiAgICAgIGNkLnNicyA9PT0gJydcbiAgICAgID8gY2RcbiAgICAgIDogU3RyaW5nVXRpbHMuZ2V0Q2hhbmdlcyhjZC5kZWwsIGNkLmlucywgY2QubXRjLCBwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJvdGF0ZUFycmF5KGFycmF5LCBuKSB7XG4gICAgY29uc3QgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgIGlmIChuICUgbGVuID09PSAwKSB7XG4gICAgICByZXR1cm4gYXJyYXkuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICByZXNbaV0gPSBhcnJheVsoaSArIChsZW4gKyAobiAlIGxlbikpKSAlIGxlbl07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE51bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFpc05hTihOdW1iZXIodmFsdWUpKTtcbiAgfVxuXG4gIHN0YXRpYyBpc09jdGFsTnVtYmVyKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgU3RyaW5nVXRpbHMuaXNWYWxpZE51bWJlcih2YWx1ZSkgJiZcbiAgICAgIHZhbHVlLnN0YXJ0c1dpdGgoJzAnKSAmJlxuICAgICAgdmFsdWUubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { DomUtils } from './dom.utils';
2
+ const PATH_PREBUILT_THEMES = 'assets/igo2/core/theming/prebuilt-themes';
3
+ const LINK_ID = 'theme-styles';
4
+ export function loadTheme(doc, themeName, path = PATH_PREBUILT_THEMES) {
5
+ const src = `${path}/${themeName}.css`;
6
+ const head = doc.getElementsByTagName('head')[0];
7
+ const themeLink = doc.getElementById(LINK_ID);
8
+ if (themeLink) {
9
+ themeLink.href = src;
10
+ }
11
+ else {
12
+ createHtmlLink(doc, src, head);
13
+ }
14
+ }
15
+ function createHtmlLink(doc, src, parent) {
16
+ const element = DomUtils.create(doc, 'link', {
17
+ id: LINK_ID,
18
+ rel: 'stylesheet',
19
+ href: src
20
+ });
21
+ parent.appendChild(element);
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91dGlscy9zcmMvbGliL3RoZW1lLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkMsTUFBTSxvQkFBb0IsR0FBRywwQ0FBMEMsQ0FBQztBQUN4RSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFFL0IsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsR0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsb0JBQW9CO0lBRW5DLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLFNBQVMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBb0IsQ0FBQztJQUVqRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztTQUFNLENBQUM7UUFDTixjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQWEsRUFBRSxHQUFXLEVBQUUsTUFBbUI7SUFDckUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO1FBQzNDLEVBQUUsRUFBRSxPQUFPO1FBQ1gsR0FBRyxFQUFFLFlBQVk7UUFDakIsSUFBSSxFQUFFLEdBQUc7S0FDVixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb21VdGlscyB9IGZyb20gJy4vZG9tLnV0aWxzJztcblxuY29uc3QgUEFUSF9QUkVCVUlMVF9USEVNRVMgPSAnYXNzZXRzL2lnbzIvY29yZS90aGVtaW5nL3ByZWJ1aWx0LXRoZW1lcyc7XG5jb25zdCBMSU5LX0lEID0gJ3RoZW1lLXN0eWxlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkVGhlbWUoXG4gIGRvYzogRG9jdW1lbnQsXG4gIHRoZW1lTmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcgPSBQQVRIX1BSRUJVSUxUX1RIRU1FU1xuKTogdm9pZCB7XG4gIGNvbnN0IHNyYyA9IGAke3BhdGh9LyR7dGhlbWVOYW1lfS5jc3NgO1xuICBjb25zdCBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XG5cbiAgY29uc3QgdGhlbWVMaW5rID0gZG9jLmdldEVsZW1lbnRCeUlkKExJTktfSUQpIGFzIEhUTUxMaW5rRWxlbWVudDtcblxuICBpZiAodGhlbWVMaW5rKSB7XG4gICAgdGhlbWVMaW5rLmhyZWYgPSBzcmM7XG4gIH0gZWxzZSB7XG4gICAgY3JlYXRlSHRtbExpbmsoZG9jLCBzcmMsIGhlYWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxMaW5rKGRvYzogRG9jdW1lbnQsIHNyYzogc3RyaW5nLCBwYXJlbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBEb21VdGlscy5jcmVhdGUoZG9jLCAnbGluaycsIHtcbiAgICBpZDogTElOS19JRCxcbiAgICByZWw6ICdzdHlsZXNoZWV0JyxcbiAgICBocmVmOiBzcmNcbiAgfSk7XG4gIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './tree';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy91dGlscy9zcmMvbGliL3RyZWUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RyZWUnO1xuIl19