@schukai/monster 3.5.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/package.json +1 -1
  2. package/source/constants.mjs +4 -9
  3. package/source/constraints/abstract.mjs +4 -6
  4. package/source/constraints/abstractoperator.mjs +6 -12
  5. package/source/constraints/andoperator.mjs +3 -6
  6. package/source/constraints/invalid.mjs +3 -6
  7. package/source/constraints/isarray.mjs +6 -9
  8. package/source/constraints/isobject.mjs +4 -7
  9. package/source/constraints/namespace.mjs +1 -3
  10. package/source/constraints/oroperator.mjs +26 -25
  11. package/source/constraints/valid.mjs +3 -6
  12. package/source/data/buildmap.mjs +20 -36
  13. package/source/data/buildtree.mjs +29 -29
  14. package/source/data/datasource/namespace.mjs +1 -1
  15. package/source/data/datasource/server/restapi/writeerror.mjs +6 -6
  16. package/source/data/datasource/server/restapi.mjs +51 -65
  17. package/source/data/datasource/server/webconnect.mjs +26 -35
  18. package/source/data/datasource/server.mjs +16 -20
  19. package/source/data/datasource/storage/localstorage.mjs +8 -11
  20. package/source/data/datasource/storage/sessionstorage.mjs +8 -10
  21. package/source/data/datasource/storage.mjs +18 -22
  22. package/source/data/datasource.mjs +27 -43
  23. package/source/data/diff.mjs +20 -32
  24. package/source/data/extend.mjs +20 -14
  25. package/source/data/namespace.mjs +1 -3
  26. package/source/data/pathfinder.mjs +105 -87
  27. package/source/data/pipe.mjs +6 -10
  28. package/source/data/transformer.mjs +141 -157
  29. package/source/dom/assembler.mjs +6 -9
  30. package/source/dom/attributes.mjs +36 -48
  31. package/source/dom/constants.mjs +55 -71
  32. package/source/dom/customcontrol.mjs +16 -21
  33. package/source/dom/customelement.mjs +140 -164
  34. package/source/dom/events.mjs +17 -24
  35. package/source/dom/focusmanager.mjs +31 -49
  36. package/source/dom/locale.mjs +18 -20
  37. package/source/dom/namespace.mjs +1 -1
  38. package/source/dom/ready.mjs +7 -10
  39. package/source/dom/resource/data.mjs +38 -46
  40. package/source/dom/resource/link/namespace.mjs +1 -3
  41. package/source/dom/resource/link/stylesheet.mjs +7 -11
  42. package/source/dom/resource/link.mjs +36 -17
  43. package/source/dom/resource/namespace.mjs +1 -1
  44. package/source/dom/resource/script.mjs +23 -13
  45. package/source/dom/resource.mjs +47 -60
  46. package/source/dom/resourcemanager.mjs +36 -43
  47. package/source/dom/template.mjs +17 -24
  48. package/source/dom/theme.mjs +8 -12
  49. package/source/dom/updater.mjs +150 -196
  50. package/source/dom/util.mjs +11 -12
  51. package/source/dom/worker/factory.mjs +21 -25
  52. package/source/dom/worker/namespace.mjs +1 -1
  53. package/source/i18n/formatter.mjs +20 -24
  54. package/source/i18n/locale.mjs +42 -55
  55. package/source/i18n/namespace.mjs +1 -1
  56. package/source/i18n/provider.mjs +4 -7
  57. package/source/i18n/providers/embed.mjs +16 -26
  58. package/source/i18n/providers/fetch.mjs +30 -36
  59. package/source/i18n/translations.mjs +17 -24
  60. package/source/logging/handler/console.mjs +6 -10
  61. package/source/logging/handler.mjs +15 -18
  62. package/source/logging/logentry.mjs +8 -9
  63. package/source/logging/logger.mjs +73 -55
  64. package/source/logging/namespace.mjs +1 -1
  65. package/source/math/namespace.mjs +1 -1
  66. package/source/math/random.mjs +13 -14
  67. package/source/monster.mjs +132 -100
  68. package/source/net/namespace.mjs +1 -3
  69. package/source/net/webconnect/message.mjs +6 -8
  70. package/source/net/webconnect/namespace.mjs +1 -3
  71. package/source/net/webconnect.mjs +28 -39
  72. package/source/text/formatter.mjs +44 -55
  73. package/source/types/base.mjs +16 -26
  74. package/source/types/basewithoptions.mjs +8 -14
  75. package/source/types/binary.mjs +4 -5
  76. package/source/types/dataurl.mjs +19 -27
  77. package/source/types/global.mjs +14 -26
  78. package/source/types/id.mjs +4 -6
  79. package/source/types/is.mjs +11 -16
  80. package/source/types/mediatype.mjs +29 -44
  81. package/source/types/namespace.mjs +0 -1
  82. package/source/types/node.mjs +16 -22
  83. package/source/types/nodelist.mjs +10 -14
  84. package/source/types/noderecursiveiterator.mjs +11 -14
  85. package/source/types/observablequeue.mjs +13 -16
  86. package/source/types/observer.mjs +16 -23
  87. package/source/types/observerlist.mjs +18 -21
  88. package/source/types/proxyobserver.mjs +24 -37
  89. package/source/types/queue.mjs +8 -13
  90. package/source/types/randomid.mjs +10 -10
  91. package/source/types/regex.mjs +3 -5
  92. package/source/types/stack.mjs +4 -8
  93. package/source/types/tokenlist.mjs +24 -31
  94. package/source/types/typeof.mjs +5 -7
  95. package/source/types/uniquequeue.mjs +8 -13
  96. package/source/types/uuid.mjs +18 -25
  97. package/source/types/validate.mjs +26 -27
  98. package/source/types/version.mjs +17 -25
  99. package/source/util/clone.mjs +23 -32
  100. package/source/util/comparator.mjs +7 -15
  101. package/source/util/deadmansswitch.mjs +16 -23
  102. package/source/util/freeze.mjs +5 -7
  103. package/source/util/namespace.mjs +1 -1
  104. package/source/util/processing.mjs +33 -39
  105. package/source/util/trimspaces.mjs +17 -24
  106. package/test/cases/monster.mjs +1 -1
@@ -5,12 +5,12 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {Base} from '../types/base.mjs';
9
- import {isArray, isInteger, isObject, isPrimitive} from '../types/is.mjs';
10
- import {Stack} from "../types/stack.mjs";
11
- import {validateInteger, validateString} from '../types/validate.mjs';
8
+ import { Base } from "../types/base.mjs";
9
+ import { isArray, isInteger, isObject, isPrimitive, isString } from "../types/is.mjs";
10
+ import { Stack } from "../types/stack.mjs";
11
+ import { validateInteger, validateBoolean, validateString } from "../types/validate.mjs";
12
12
 
13
- export {Pathfinder, DELIMITER, WILDCARD}
13
+ export { Pathfinder, DELIMITER, WILDCARD };
14
14
 
15
15
  /**
16
16
  * path separator
@@ -18,13 +18,13 @@ export {Pathfinder, DELIMITER, WILDCARD}
18
18
  * @private
19
19
  * @type {string}
20
20
  */
21
- const DELIMITER = '.';
21
+ const DELIMITER = ".";
22
22
 
23
23
  /**
24
24
  * @private
25
25
  * @type {string}
26
26
  */
27
- const WILDCARD = '*';
27
+ const WILDCARD = "*";
28
28
 
29
29
  /**
30
30
  * Pathfinder is a class to find a path to an object.
@@ -72,7 +72,6 @@ const WILDCARD = '*';
72
72
  * @memberOf Monster.Data
73
73
  */
74
74
  class Pathfinder extends Base {
75
-
76
75
  /**
77
76
  * @param {array|object|Map|Set} value
78
77
  * @since 1.4.0
@@ -82,7 +81,7 @@ class Pathfinder extends Base {
82
81
  super();
83
82
 
84
83
  if (isPrimitive(object)) {
85
- throw new Error('the parameter must not be a simple type');
84
+ throw new Error("the parameter must not be a simple type");
86
85
  }
87
86
 
88
87
  this.object = object;
@@ -104,7 +103,7 @@ class Pathfinder extends Base {
104
103
 
105
104
  /**
106
105
  *
107
- * @param {string} path
106
+ * @param {string|array} path
108
107
  * @since 1.4.0
109
108
  * @returns {*}
110
109
  * @throws {TypeError} unsupported type
@@ -114,12 +113,12 @@ class Pathfinder extends Base {
114
113
  * @throws {Error} unsupported action for this data type
115
114
  */
116
115
  getVia(path) {
117
- return getValueViaPath.call(this, this.object, validateString(path));
116
+ return getValueViaPath.call(this, this.object, path);
118
117
  }
119
118
 
120
119
  /**
121
120
  *
122
- * @param {string} path
121
+ * @param {string|array} path
123
122
  * @param {*} value
124
123
  * @returns {Pathfinder}
125
124
  * @since 1.4.0
@@ -129,7 +128,6 @@ class Pathfinder extends Base {
129
128
  * @throws {Error} unsupported action for this data type
130
129
  */
131
130
  setVia(path, value) {
132
- validateString(path);
133
131
  setValueViaPath.call(this, this.object, path, value);
134
132
  return this;
135
133
  }
@@ -137,7 +135,7 @@ class Pathfinder extends Base {
137
135
  /**
138
136
  * Delete Via Path
139
137
  *
140
- * @param {string} path
138
+ * @param {string|array} path
141
139
  * @returns {Pathfinder}
142
140
  * @since 1.6.0
143
141
  * @throws {TypeError} unsupported type
@@ -146,14 +144,13 @@ class Pathfinder extends Base {
146
144
  * @throws {Error} unsupported action for this data type
147
145
  */
148
146
  deleteVia(path) {
149
- validateString(path);
150
147
  deleteValueViaPath.call(this, this.object, path);
151
148
  return this;
152
149
  }
153
150
 
154
151
  /**
155
152
  *
156
- * @param {string} path
153
+ * @param {string|array} path
157
154
  * @return {bool}
158
155
  * @throws {TypeError} unsupported type
159
156
  * @throws {TypeError} value is not a string
@@ -161,25 +158,20 @@ class Pathfinder extends Base {
161
158
  * @since 1.4.0
162
159
  */
163
160
  exists(path) {
164
- validateString(path);
165
161
  try {
166
162
  getValueViaPath.call(this, this.object, path, true);
167
163
  return true;
168
- } catch (e) {
169
-
170
- }
164
+ } catch (e) {}
171
165
 
172
166
  return false;
173
167
  }
174
-
175
168
  }
176
169
 
177
-
178
170
  /**
179
171
  *
180
172
  * @param {*} subject
181
- * @param {string} path
182
- * @param {string} check
173
+ * @param {string|array} path
174
+ * @param {boolean} check
183
175
  * @return {Map}
184
176
  * @throws {TypeError} unsupported type
185
177
  * @throws {Error} the journey is not at its end
@@ -187,12 +179,20 @@ class Pathfinder extends Base {
187
179
  * @private
188
180
  */
189
181
  function iterate(subject, path, check) {
182
+ if (check === undefined) {
183
+ check = false;
184
+ }
185
+ validateBoolean(check);
190
186
 
191
- const result = new Map;
187
+ const result = new Map();
188
+
189
+ if (isArray(path)) {
190
+ path = path.join(DELIMITER);
191
+ }
192
192
 
193
193
  if (isObject(subject) || isArray(subject)) {
194
194
  for (const [key, value] of Object.entries(subject)) {
195
- result.set(key, getValueViaPath.call(this, value, path, check))
195
+ result.set(key, getValueViaPath.call(this, value, path, check));
196
196
  }
197
197
  } else {
198
198
  let key = path.split(DELIMITER).shift();
@@ -200,15 +200,13 @@ function iterate(subject, path, check) {
200
200
  }
201
201
 
202
202
  return result;
203
-
204
-
205
203
  }
206
204
 
207
205
  /**
208
206
  *
209
207
  * @param {*} subject
210
- * @param [string} path
211
- * @param [boolean} check
208
+ * @param [string|array} path
209
+ * @param [boolean} check
212
210
  * @returns {*}
213
211
  * @throws {TypeError} unsupported type
214
212
  * @throws {Error} the journey is not at its end
@@ -216,12 +214,24 @@ function iterate(subject, path, check) {
216
214
  * @private
217
215
  */
218
216
  function getValueViaPath(subject, path, check) {
217
+ if (check === undefined) {
218
+ check = false;
219
+ }
220
+ validateBoolean(check);
219
221
 
220
- if (path === "") {
221
- return subject;
222
+ if (!(isArray(path) || isString(path))) {
223
+ throw new Error("type error: path must be a string or an array");
224
+ }
225
+
226
+ let parts;
227
+ if (isString(path)) {
228
+ if (path === "") {
229
+ return subject;
230
+ }
231
+
232
+ parts = path.split(DELIMITER);
222
233
  }
223
234
 
224
- let parts = path.split(DELIMITER)
225
235
  let current = parts.shift();
226
236
 
227
237
  if (current === this.wildCard) {
@@ -229,58 +239,50 @@ function getValueViaPath(subject, path, check) {
229
239
  }
230
240
 
231
241
  if (isObject(subject) || isArray(subject)) {
232
-
233
242
  let anchor;
234
243
  if (subject instanceof Map || subject instanceof WeakMap) {
235
244
  anchor = subject.get(current);
236
-
237
245
  } else if (subject instanceof Set || subject instanceof WeakSet) {
238
246
  current = parseInt(current);
239
- validateInteger(current)
247
+ validateInteger(current);
240
248
  anchor = [...subject]?.[current];
241
-
242
- } else if (typeof WeakRef === 'function' && subject instanceof WeakRef) {
243
- throw Error('unsupported action for this data type');
244
-
249
+ } else if (typeof WeakRef === "function" && subject instanceof WeakRef) {
250
+ throw Error("unsupported action for this data type");
245
251
  } else if (isArray(subject)) {
246
252
  current = parseInt(current);
247
- validateInteger(current)
253
+ validateInteger(current);
248
254
  anchor = subject?.[current];
249
255
  } else {
250
256
  anchor = subject?.[current];
251
257
  }
252
258
 
253
259
  if (isObject(anchor) || isArray(anchor)) {
254
- return getValueViaPath.call(this, anchor, parts.join(DELIMITER), check)
260
+ return getValueViaPath.call(this, anchor, parts.join(DELIMITER), check);
255
261
  }
256
262
 
257
263
  if (parts.length > 0) {
258
- throw Error("the journey is not at its end (" + parts.join(DELIMITER) + ")");
264
+ throw Error(`the journey is not at its end (${parts.join(DELIMITER)})`);
259
265
  }
260
266
 
261
-
262
267
  if (check === true) {
263
268
  const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(subject), current);
264
269
 
265
270
  if (!subject.hasOwnProperty(current) && descriptor === undefined) {
266
- throw Error('unknown value');
271
+ throw Error("unknown value");
267
272
  }
268
-
269
273
  }
270
274
 
271
275
  return anchor;
272
-
273
276
  }
274
277
 
275
- throw TypeError("unsupported type " + typeof subject)
276
-
278
+ throw TypeError(`unsupported type ${typeof subject}`);
277
279
  }
278
280
 
279
281
  /**
280
282
  *
281
- * @param object
282
- * @param path
283
- * @param value
283
+ * @param {object} subject
284
+ * @param {string|array} path
285
+ * @param {*} value
284
286
  * @returns {void}
285
287
  * @throws {TypeError} unsupported type
286
288
  * @throws {TypeError} unsupported type
@@ -288,24 +290,32 @@ function getValueViaPath(subject, path, check) {
288
290
  * @throws {Error} unsupported action for this data type
289
291
  * @private
290
292
  */
291
- function setValueViaPath(object, path, value) {
293
+ function setValueViaPath(subject, path, value) {
294
+ if (!(isArray(path) || isString(path))) {
295
+ throw new Error("type error: path must be a string or an array");
296
+ }
292
297
 
293
- validateString(path);
298
+ let parts;
299
+ if (isArray(path)) {
300
+ if (path.length === 0) {
301
+ return subject;
302
+ }
303
+
304
+ parts = path;
305
+ } else {
306
+ parts = path.split(DELIMITER);
307
+ }
294
308
 
295
- let parts = path.split(DELIMITER)
296
309
  let last = parts.pop();
297
310
  let subpath = parts.join(DELIMITER);
298
311
 
299
- let stack = new Stack()
312
+ let stack = new Stack();
300
313
  let current = subpath;
301
314
  while (true) {
302
-
303
315
  try {
304
- getValueViaPath.call(this, object, current, true)
316
+ getValueViaPath.call(this, subject, current, true);
305
317
  break;
306
- } catch (e) {
307
-
308
- }
318
+ } catch (e) {}
309
319
 
310
320
  stack.push(current);
311
321
  parts.pop();
@@ -323,35 +333,30 @@ function setValueViaPath(object, path, value) {
323
333
  if (isInteger(parseInt(n))) {
324
334
  obj = [];
325
335
  }
326
-
327
336
  }
328
337
 
329
- setValueViaPath.call(this, object, current, obj);
338
+ setValueViaPath.call(this, subject, current, obj);
330
339
  }
331
340
 
332
- let anchor = getValueViaPath.call(this, object, subpath);
341
+ let anchor = getValueViaPath.call(this, subject, subpath);
333
342
 
334
- if (!isObject(object) && !isArray(object)) {
335
- throw TypeError("unsupported type: " + typeof object);
343
+ if (!(isObject(subject) || isArray(subject))) {
344
+ throw TypeError(`unsupported type: ${typeof subject}`);
336
345
  }
337
346
 
338
347
  if (anchor instanceof Map || anchor instanceof WeakMap) {
339
348
  anchor.set(last, value);
340
349
  } else if (anchor instanceof Set || anchor instanceof WeakSet) {
341
- anchor.append(value)
342
-
343
- } else if (typeof WeakRef === 'function' && anchor instanceof WeakRef) {
344
- throw Error('unsupported action for this data type');
345
-
350
+ anchor.append(value);
351
+ } else if (typeof WeakRef === "function" && anchor instanceof WeakRef) {
352
+ throw Error("unsupported action for this data type");
346
353
  } else if (isArray(anchor)) {
347
354
  last = parseInt(last);
348
- validateInteger(last)
355
+ validateInteger(last);
349
356
  assignProperty(anchor, last, value);
350
357
  } else {
351
358
  assignProperty(anchor, last, value);
352
359
  }
353
-
354
-
355
360
  }
356
361
 
357
362
  /**
@@ -361,7 +366,6 @@ function setValueViaPath(object, path, value) {
361
366
  * @param {*} value
362
367
  */
363
368
  function assignProperty(object, key, value) {
364
-
365
369
  if (!object.hasOwnProperty(key)) {
366
370
  object[key] = value;
367
371
  return;
@@ -372,13 +376,12 @@ function assignProperty(object, key, value) {
372
376
  }
373
377
 
374
378
  object[key] = value;
375
-
376
379
  }
377
380
 
378
381
  /**
379
382
  *
380
- * @param object
381
- * @param path
383
+ * @param {object} subject
384
+ * @param {string} path
382
385
  * @returns {void}
383
386
  * @throws {TypeError} unsupported type
384
387
  * @throws {TypeError} unsupported type
@@ -388,26 +391,41 @@ function assignProperty(object, key, value) {
388
391
  * @since 1.6.0
389
392
  * @private
390
393
  */
391
- function deleteValueViaPath(object, path) {
394
+ function deleteValueViaPath(subject, path) {
395
+ if (!(isArray(path) || isString(path))) {
396
+ throw new Error("type error: path must be a string or an array");
397
+ }
398
+
399
+ let parts;
400
+ if (isArray(path)) {
401
+ if (path.length === 0) {
402
+ return subject;
403
+ }
404
+
405
+ parts = path;
406
+ } else {
407
+ parts = path.split(DELIMITER);
408
+ }
392
409
 
393
- const parts = path.split(DELIMITER)
394
410
  let last = parts.pop();
395
411
  const subpath = parts.join(DELIMITER);
396
412
 
397
- const anchor = getValueViaPath.call(this, object, subpath);
413
+ const anchor = getValueViaPath.call(this, subject, subpath);
398
414
 
399
415
  if (anchor instanceof Map) {
400
416
  anchor.delete(last);
401
- } else if (anchor instanceof Set || anchor instanceof WeakMap || anchor instanceof WeakSet || (typeof WeakRef === 'function' && anchor instanceof WeakRef)) {
402
- throw Error('unsupported action for this data type');
403
-
417
+ } else if (
418
+ anchor instanceof Set ||
419
+ anchor instanceof WeakMap ||
420
+ anchor instanceof WeakSet ||
421
+ (typeof WeakRef === "function" && anchor instanceof WeakRef)
422
+ ) {
423
+ throw Error("unsupported action for this data type");
404
424
  } else if (isArray(anchor)) {
405
425
  last = parseInt(last);
406
- validateInteger(last)
426
+ validateInteger(last);
407
427
  delete anchor[last];
408
428
  } else {
409
429
  delete anchor[last];
410
430
  }
411
-
412
-
413
431
  }
@@ -5,17 +5,17 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {Base} from '../types/base.mjs';
9
- import {validateString} from '../types/validate.mjs';
10
- import {Transformer} from './transformer.mjs';
8
+ import { Base } from "../types/base.mjs";
9
+ import { validateString } from "../types/validate.mjs";
10
+ import { Transformer } from "./transformer.mjs";
11
11
 
12
- export {Pipe}
12
+ export { Pipe };
13
13
 
14
14
  /**
15
15
  * @private
16
16
  * @type {string}
17
17
  */
18
- const DELIMITER = '|';
18
+ const DELIMITER = "|";
19
19
 
20
20
  /**
21
21
  * The pipe class makes it possible to combine several processing steps.
@@ -32,7 +32,6 @@ const DELIMITER = '|';
32
32
  * @memberOf Monster.Data
33
33
  */
34
34
  class Pipe extends Base {
35
-
36
35
  /**
37
36
  * @param {string} pipe a pipe consists of commands whose input and output are connected with the pipe symbol `|`.
38
37
  * @throws {TypeError}
@@ -40,12 +39,10 @@ class Pipe extends Base {
40
39
  constructor(pipe) {
41
40
  super();
42
41
  validateString(pipe);
43
-
42
+
44
43
  this.pipe = pipe.split(DELIMITER).map((v) => {
45
44
  return new Transformer(v);
46
45
  });
47
-
48
-
49
46
  }
50
47
 
51
48
  /**
@@ -57,7 +54,6 @@ class Pipe extends Base {
57
54
  * @throws {TypeError} value is not a function
58
55
  */
59
56
  setCallback(name, callback, context) {
60
-
61
57
  for (const [, t] of Object.entries(this.pipe)) {
62
58
  t.setCallback(name, callback, context);
63
59
  }