@schukai/monster 3.5.0 → 3.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }