@schukai/monster 3.4.2 → 3.7.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 (109) hide show
  1. package/example/i18n/providers/embed.mjs +5 -0
  2. package/package.json +1 -1
  3. package/source/constants.mjs +4 -9
  4. package/source/constraints/abstract.mjs +4 -6
  5. package/source/constraints/abstractoperator.mjs +6 -12
  6. package/source/constraints/andoperator.mjs +3 -6
  7. package/source/constraints/invalid.mjs +3 -6
  8. package/source/constraints/isarray.mjs +6 -9
  9. package/source/constraints/isobject.mjs +4 -7
  10. package/source/constraints/namespace.mjs +1 -3
  11. package/source/constraints/oroperator.mjs +26 -25
  12. package/source/constraints/valid.mjs +3 -6
  13. package/source/data/buildmap.mjs +20 -36
  14. package/source/data/buildtree.mjs +29 -29
  15. package/source/data/datasource/namespace.mjs +1 -1
  16. package/source/data/datasource/server/restapi/writeerror.mjs +6 -6
  17. package/source/data/datasource/server/restapi.mjs +51 -65
  18. package/source/data/datasource/server/webconnect.mjs +26 -35
  19. package/source/data/datasource/server.mjs +17 -21
  20. package/source/data/datasource/storage/localstorage.mjs +8 -11
  21. package/source/data/datasource/storage/sessionstorage.mjs +8 -10
  22. package/source/data/datasource/storage.mjs +18 -22
  23. package/source/data/datasource.mjs +27 -43
  24. package/source/data/diff.mjs +20 -32
  25. package/source/data/extend.mjs +20 -14
  26. package/source/data/namespace.mjs +1 -3
  27. package/source/data/pathfinder.mjs +40 -67
  28. package/source/data/pipe.mjs +6 -10
  29. package/source/data/transformer.mjs +141 -157
  30. package/source/dom/assembler.mjs +6 -9
  31. package/source/dom/attributes.mjs +36 -48
  32. package/source/dom/constants.mjs +55 -71
  33. package/source/dom/customcontrol.mjs +16 -21
  34. package/source/dom/customelement.mjs +140 -164
  35. package/source/dom/events.mjs +17 -24
  36. package/source/dom/focusmanager.mjs +30 -48
  37. package/source/dom/locale.mjs +41 -10
  38. package/source/dom/namespace.mjs +1 -1
  39. package/source/dom/ready.mjs +7 -10
  40. package/source/dom/resource/data.mjs +38 -46
  41. package/source/dom/resource/link/namespace.mjs +1 -3
  42. package/source/dom/resource/link/stylesheet.mjs +7 -11
  43. package/source/dom/resource/link.mjs +36 -17
  44. package/source/dom/resource/namespace.mjs +1 -1
  45. package/source/dom/resource/script.mjs +23 -13
  46. package/source/dom/resource.mjs +47 -60
  47. package/source/dom/resourcemanager.mjs +36 -43
  48. package/source/dom/template.mjs +17 -24
  49. package/source/dom/theme.mjs +8 -12
  50. package/source/dom/updater.mjs +150 -196
  51. package/source/dom/util.mjs +11 -12
  52. package/source/dom/worker/factory.mjs +21 -25
  53. package/source/dom/worker/namespace.mjs +1 -1
  54. package/source/i18n/formatter.mjs +20 -24
  55. package/source/i18n/locale.mjs +40 -42
  56. package/source/i18n/namespace.mjs +1 -1
  57. package/source/i18n/provider.mjs +4 -7
  58. package/source/i18n/providers/embed.mjs +115 -0
  59. package/source/i18n/providers/fetch.mjs +33 -38
  60. package/source/i18n/translations.mjs +16 -20
  61. package/source/logging/handler/console.mjs +6 -10
  62. package/source/logging/handler.mjs +15 -18
  63. package/source/logging/logentry.mjs +8 -9
  64. package/source/logging/logger.mjs +73 -55
  65. package/source/logging/namespace.mjs +1 -1
  66. package/source/math/namespace.mjs +1 -1
  67. package/source/math/random.mjs +13 -14
  68. package/source/monster.mjs +132 -100
  69. package/source/net/namespace.mjs +1 -3
  70. package/source/net/webconnect/message.mjs +6 -8
  71. package/source/net/webconnect/namespace.mjs +1 -3
  72. package/source/net/webconnect.mjs +28 -39
  73. package/source/text/formatter.mjs +44 -55
  74. package/source/types/base.mjs +16 -26
  75. package/source/types/basewithoptions.mjs +8 -14
  76. package/source/types/binary.mjs +4 -5
  77. package/source/types/dataurl.mjs +19 -27
  78. package/source/types/global.mjs +14 -26
  79. package/source/types/id.mjs +4 -6
  80. package/source/types/is.mjs +11 -16
  81. package/source/types/mediatype.mjs +29 -44
  82. package/source/types/namespace.mjs +0 -1
  83. package/source/types/node.mjs +16 -22
  84. package/source/types/nodelist.mjs +10 -14
  85. package/source/types/noderecursiveiterator.mjs +11 -14
  86. package/source/types/observablequeue.mjs +13 -16
  87. package/source/types/observer.mjs +16 -23
  88. package/source/types/observerlist.mjs +18 -21
  89. package/source/types/proxyobserver.mjs +24 -37
  90. package/source/types/queue.mjs +8 -13
  91. package/source/types/randomid.mjs +10 -10
  92. package/source/types/regex.mjs +3 -5
  93. package/source/types/stack.mjs +4 -8
  94. package/source/types/tokenlist.mjs +24 -31
  95. package/source/types/typeof.mjs +5 -7
  96. package/source/types/uniquequeue.mjs +8 -13
  97. package/source/types/uuid.mjs +18 -25
  98. package/source/types/validate.mjs +26 -27
  99. package/source/types/version.mjs +17 -25
  100. package/source/util/clone.mjs +23 -32
  101. package/source/util/comparator.mjs +7 -15
  102. package/source/util/deadmansswitch.mjs +16 -23
  103. package/source/util/freeze.mjs +5 -7
  104. package/source/util/namespace.mjs +1 -1
  105. package/source/util/processing.mjs +33 -39
  106. package/source/util/trimspaces.mjs +17 -24
  107. package/test/cases/dom/locale.mjs +15 -0
  108. package/test/cases/i18n/providers/embed.mjs +72 -0
  109. 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 {getGlobal} from '../types/global.mjs';
9
- import {isArray, isFunction, isObject, isPrimitive} from '../types/is.mjs';
10
- import {typeOf} from "../types/typeof.mjs";
11
- import {validateObject} from "../types/validate.mjs";
8
+ import { getGlobal } from "../types/global.mjs";
9
+ import { isArray, isFunction, isObject, isPrimitive } from "../types/is.mjs";
10
+ import { typeOf } from "../types/typeof.mjs";
11
+ import { validateObject } from "../types/validate.mjs";
12
12
 
13
- export {clone}
13
+ export { clone };
14
14
 
15
15
  /**
16
16
  * With this function, objects can be cloned.
@@ -30,7 +30,6 @@ export {clone}
30
30
  * @throws {Error} unable to clone obj! its type isn't supported.
31
31
  */
32
32
  function clone(obj) {
33
-
34
33
  // typeof null results in 'object'. https://2ality.com/2013/10/typeof-null.html
35
34
  if (null === obj) {
36
35
  return obj;
@@ -57,8 +56,6 @@ function clone(obj) {
57
56
  }
58
57
 
59
58
  if (isObject(obj)) {
60
-
61
-
62
59
  // Handle Date
63
60
  if (obj instanceof Date) {
64
61
  let copy = new Date();
@@ -67,17 +64,17 @@ function clone(obj) {
67
64
  }
68
65
 
69
66
  /** Do not clone DOM nodes */
70
- if (typeof Element !== 'undefined' && obj instanceof Element) return obj;
71
- if (typeof HTMLDocument !== 'undefined' && obj instanceof HTMLDocument) return obj;
72
- if (typeof DocumentFragment !== 'undefined' && obj instanceof DocumentFragment) return obj;
67
+ if (typeof Element !== "undefined" && obj instanceof Element) return obj;
68
+ if (typeof HTMLDocument !== "undefined" && obj instanceof HTMLDocument) return obj;
69
+ if (typeof DocumentFragment !== "undefined" && obj instanceof DocumentFragment) return obj;
73
70
 
74
71
  /** Do not clone global objects */
75
72
  if (obj === getGlobal()) return obj;
76
- if (typeof globalContext !== 'undefined' && obj === globalContext) return obj;
77
- if (typeof window !== 'undefined' && obj === window) return obj;
78
- if (typeof document !== 'undefined' && obj === document) return obj;
79
- if (typeof navigator !== 'undefined' && obj === navigator) return obj;
80
- if (typeof JSON !== 'undefined' && obj === JSON) return obj;
73
+ if (typeof globalContext !== "undefined" && obj === globalContext) return obj;
74
+ if (typeof window !== "undefined" && obj === window) return obj;
75
+ if (typeof document !== "undefined" && obj === document) return obj;
76
+ if (typeof navigator !== "undefined" && obj === navigator) return obj;
77
+ if (typeof JSON !== "undefined" && obj === JSON) return obj;
81
78
 
82
79
  // Handle Proxy-Object
83
80
  try {
@@ -85,11 +82,9 @@ function clone(obj) {
85
82
  if (obj instanceof Proxy) {
86
83
  return obj;
87
84
  }
88
- } catch (e) {
89
- }
90
-
91
- return cloneObject(obj)
85
+ } catch (e) {}
92
86
 
87
+ return cloneObject(obj);
93
88
  }
94
89
 
95
90
  throw new Error("unable to clone obj! its type isn't supported.");
@@ -102,29 +97,26 @@ function clone(obj) {
102
97
  * @private
103
98
  */
104
99
  function cloneObject(obj) {
105
-
106
100
  validateObject(obj);
107
-
108
- const constructor = obj?.['constructor'];
101
+
102
+ const fkt = obj?.["constructor"];
109
103
 
110
104
  /** Object has clone method */
111
- if(typeOf(constructor)==='function') {
112
- const prototype = constructor?.prototype;
113
- if(typeof prototype==='object') {
114
- if(prototype.hasOwnProperty('getClone')&& typeOf(obj.getClone) === 'function') {
115
- return obj.getClone();
105
+ if (typeOf(fkt) === "function") {
106
+ const prototype = fkt?.prototype;
107
+ if (typeof prototype === "object") {
108
+ if (prototype.hasOwnProperty("getClone") && typeOf(obj.getClone) === "function") {
109
+ return obj.getClone();
116
110
  }
117
111
  }
118
112
  }
119
113
 
120
114
  let copy = {};
121
- if (typeof obj.constructor === 'function' &&
122
- typeof obj.constructor.call === 'function') {
115
+ if (typeof obj.constructor === "function" && typeof obj.constructor.call === "function") {
123
116
  copy = new obj.constructor();
124
117
  }
125
118
 
126
119
  for (let key in obj) {
127
-
128
120
  if (!obj.hasOwnProperty(key)) {
129
121
  continue;
130
122
  }
@@ -139,4 +131,3 @@ function cloneObject(obj) {
139
131
 
140
132
  return copy;
141
133
  }
142
-
@@ -5,14 +5,14 @@
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 {isFunction} from '../types/is.mjs';
8
+ import { Base } from "../types/base.mjs";
9
+ import { isFunction } from "../types/is.mjs";
10
10
 
11
- export {Comparator}
11
+ export { Comparator };
12
12
 
13
13
  /**
14
14
  * The comparator allows a comparison function to be abstracted.
15
- *
15
+ *
16
16
  * The following are some examples of the application of the class.
17
17
  *
18
18
  * ```
@@ -37,7 +37,6 @@ export {Comparator}
37
37
  * @memberOf Monster.Util
38
38
  */
39
39
  class Comparator extends Base {
40
-
41
40
  /**
42
41
  * create new comparator
43
42
  *
@@ -49,9 +48,9 @@ class Comparator extends Base {
49
48
  super();
50
49
 
51
50
  if (isFunction(callback)) {
52
- this.compare = callback
51
+ this.compare = callback;
53
52
  } else if (callback !== undefined) {
54
- throw new TypeError("unsupported type")
53
+ throw new TypeError("unsupported type");
55
54
  } else {
56
55
  // default compare function
57
56
 
@@ -62,9 +61,8 @@ class Comparator extends Base {
62
61
  * @return {integer} -1, 0 or 1
63
62
  */
64
63
  this.compare = function (a, b) {
65
-
66
64
  if (typeof a !== typeof b) {
67
- throw new TypeError("impractical comparison", "types/comparator.mjs")
65
+ throw new TypeError("impractical comparison", "types/comparator.mjs");
68
66
  }
69
67
 
70
68
  if (a === b) {
@@ -73,7 +71,6 @@ class Comparator extends Base {
73
71
  return a < b ? -1 : 1;
74
72
  };
75
73
  }
76
-
77
74
  }
78
75
 
79
76
  /**
@@ -99,7 +96,6 @@ class Comparator extends Base {
99
96
  return this.compare(a, b) === 0;
100
97
  }
101
98
 
102
-
103
99
  /**
104
100
  * Checks if variable `a` is greater than `b`
105
101
  *
@@ -147,11 +143,8 @@ class Comparator extends Base {
147
143
  lessThan(a, b) {
148
144
  return this.compare(a, b) < 0;
149
145
  }
150
-
151
-
152
146
  }
153
147
 
154
-
155
148
  /**
156
149
  * This is the description for the callback function used by the operator
157
150
  *
@@ -169,4 +162,3 @@ class Comparator extends Base {
169
162
  * @memberOf Monster.Util
170
163
  * @see Monster.Util.Comparator
171
164
  */
172
-
@@ -5,13 +5,13 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {internalSymbol} from "../constants.mjs";
8
+ import { internalSymbol } from "../constants.mjs";
9
9
 
10
- import {Base} from "../types/base.mjs";
11
- import {isInteger} from "../types/is.mjs";
12
- import {validateFunction, validateInteger} from "../types/validate.mjs";
10
+ import { Base } from "../types/base.mjs";
11
+ import { isInteger } from "../types/is.mjs";
12
+ import { validateFunction, validateInteger } from "../types/validate.mjs";
13
13
 
14
- export {DeadMansSwitch}
14
+ export { DeadMansSwitch };
15
15
 
16
16
  /**
17
17
  * The dead man's switch allows to set a timer which can be reset again and again within a defined period of time.
@@ -23,8 +23,7 @@ export {DeadMansSwitch}
23
23
  * @memberOf Monster.Util
24
24
  * @summary Class to be able to execute function chains
25
25
  */
26
- class DeadMansSwitch extends Base {
27
-
26
+ class DeadMansSwitch extends Base {
28
27
  /**
29
28
  * Create new dead man's switch
30
29
  *
@@ -44,18 +43,17 @@ export {DeadMansSwitch}
44
43
  * @param {Integer|undefined} [delay]
45
44
  */
46
45
  touch(delay) {
47
-
48
- if (this[internalSymbol]['isAlreadyRun'] === true) {
49
- throw new Error('has already run')
46
+ if (this[internalSymbol]["isAlreadyRun"] === true) {
47
+ throw new Error("has already run");
50
48
  }
51
49
 
52
50
  if (isInteger(delay)) {
53
- this[internalSymbol]['delay'] = delay
51
+ this[internalSymbol]["delay"] = delay;
54
52
  } else if (delay !== undefined) {
55
- throw new Error('unsupported argument')
53
+ throw new Error("unsupported argument");
56
54
  }
57
55
 
58
- clearTimeout(this[internalSymbol]['timer']);
56
+ clearTimeout(this[internalSymbol]["timer"]);
59
57
 
60
58
  initCallback.call(this);
61
59
 
@@ -67,13 +65,12 @@ export {DeadMansSwitch}
67
65
  * @private
68
66
  */
69
67
  function initCallback() {
70
-
71
68
  const self = this;
72
69
 
73
- self[internalSymbol]['timer'] = setTimeout(() => {
74
- self[internalSymbol]['isAlreadyRun'] = true;
75
- self[internalSymbol]['callback']();
76
- }, self[internalSymbol]['delay'])
70
+ self[internalSymbol]["timer"] = setTimeout(() => {
71
+ self[internalSymbol]["isAlreadyRun"] = true;
72
+ self[internalSymbol]["callback"]();
73
+ }, self[internalSymbol]["delay"]);
77
74
  }
78
75
 
79
76
  /**
@@ -88,12 +85,8 @@ function init(delay, callback) {
88
85
  callback,
89
86
  delay,
90
87
  isAlreadyRun: false,
91
- timer: undefined
88
+ timer: undefined,
92
89
  };
93
90
 
94
91
  initCallback.call(self);
95
-
96
92
  }
97
-
98
-
99
-
@@ -5,9 +5,9 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {validateObject} from '../types/validate.mjs';
8
+ import { validateObject } from "../types/validate.mjs";
9
9
 
10
- export {deepFreeze}
10
+ export { deepFreeze };
11
11
 
12
12
  /**
13
13
  * Deep freeze a object
@@ -20,9 +20,8 @@ export {deepFreeze}
20
20
  * @copyright schukai GmbH
21
21
  * @throws {TypeError} value is not a object
22
22
  */
23
- function deepFreeze(object) {
24
-
25
- validateObject(object)
23
+ function deepFreeze(object) {
24
+ validateObject(object);
26
25
 
27
26
  // Retrieve the defined property names of the object
28
27
  var propNames = Object.getOwnPropertyNames(object);
@@ -31,8 +30,7 @@ export {deepFreeze}
31
30
  for (let name of propNames) {
32
31
  let value = object[name];
33
32
 
34
- object[name] = (value && typeof value === "object") ?
35
- deepFreeze(value) : value;
33
+ object[name] = value && typeof value === "object" ? deepFreeze(value) : value;
36
34
  }
37
35
 
38
36
  return Object.freeze(object);
@@ -10,4 +10,4 @@
10
10
  * @memberOf Monster
11
11
  * @author schukai GmbH
12
12
  */
13
- const ns = {};
13
+ const ns = {};
@@ -5,20 +5,19 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {internalSymbol} from "../constants.mjs";
9
- import {Base} from "../types/base.mjs";
10
- import {getGlobalFunction} from "../types/global.mjs";
11
- import {isFunction, isInteger} from "../types/is.mjs";
12
- import {Queue} from "../types/queue.mjs";
13
- import {validateFunction, validateInteger} from "../types/validate.mjs";
8
+ import { internalSymbol } from "../constants.mjs";
9
+ import { Base } from "../types/base.mjs";
10
+ import { getGlobalFunction } from "../types/global.mjs";
11
+ import { isFunction, isInteger } from "../types/is.mjs";
12
+ import { Queue } from "../types/queue.mjs";
13
+ import { validateFunction, validateInteger } from "../types/validate.mjs";
14
14
 
15
- export {Processing}
15
+ export { Processing };
16
16
 
17
17
  /**
18
18
  * @private
19
19
  */
20
20
  class Callback {
21
-
22
21
  /**
23
22
  *
24
23
  * @param {function} callback
@@ -30,7 +29,7 @@ class Callback {
30
29
  constructor(callback, time) {
31
30
  this[internalSymbol] = {
32
31
  callback: validateFunction(callback),
33
- time: validateInteger(time ?? 0)
32
+ time: validateInteger(time ?? 0),
34
33
  };
35
34
  }
36
35
 
@@ -42,20 +41,14 @@ class Callback {
42
41
  run(data) {
43
42
  const self = this;
44
43
  return new Promise((resolve, reject) => {
45
-
46
- getGlobalFunction('setTimeout')(() => {
47
- try {
48
- resolve(self[internalSymbol].callback(data));
49
- } catch (e) {
50
- reject(e);
51
- }
52
-
53
- },
54
- self[internalSymbol].time);
55
-
56
-
57
- })
58
-
44
+ getGlobalFunction("setTimeout")(() => {
45
+ try {
46
+ resolve(self[internalSymbol].callback(data));
47
+ } catch (e) {
48
+ reject(e);
49
+ }
50
+ }, self[internalSymbol].time);
51
+ });
59
52
  }
60
53
  }
61
54
 
@@ -81,7 +74,6 @@ class Callback {
81
74
  * @summary Class to be able to execute function chains
82
75
  */
83
76
  class Processing extends Base {
84
-
85
77
  /**
86
78
  * Create new Processing
87
79
  *
@@ -98,26 +90,28 @@ class Processing extends Base {
98
90
  * @param {function} callback Callback
99
91
  * @throw {TypeError} the arguments must be either integer or functions
100
92
  */
101
- constructor() {
93
+ constructor(...args) {
102
94
  super();
103
95
 
104
96
  this[internalSymbol] = {
105
- queue: new Queue
97
+ queue: new Queue(),
106
98
  };
107
99
 
108
- let time = 0
100
+ let time = 0;
109
101
 
110
- for (const [, arg] of Object.entries(arguments)) {
102
+ if (typeof args !== "object" || args[0] === null) {
103
+ throw new TypeError("the arguments must be either integer or functions");
104
+ }
105
+
106
+ for (const [, arg] of Object.entries(args)) {
111
107
  if (isInteger(arg) && arg >= 0) {
112
108
  time = arg;
113
109
  } else if (isFunction(arg)) {
114
- this[internalSymbol].queue.add(new Callback(arg, time))
110
+ this[internalSymbol].queue.add(new Callback(arg, time));
115
111
  } else {
116
- throw new TypeError('the arguments must be either integer or functions')
112
+ throw new TypeError("the arguments must be either integer or functions");
117
113
  }
118
114
  }
119
-
120
-
121
115
  }
122
116
 
123
117
  /**
@@ -130,11 +124,10 @@ class Processing extends Base {
130
124
  * @throws {TypeError} value is not an integer
131
125
  */
132
126
  add(callback, time) {
133
- this[internalSymbol].queue.add(new Callback(callback, time))
127
+ this[internalSymbol].queue.add(new Callback(callback, time));
134
128
  return this;
135
129
  }
136
130
 
137
-
138
131
  /**
139
132
  * Executes the defined functions in order.
140
133
  *
@@ -147,10 +140,11 @@ class Processing extends Base {
147
140
  return Promise.resolve(data);
148
141
  }
149
142
 
150
- return this[internalSymbol].queue.poll().run(data).then((result) => {
151
- return self.run(result);
152
- });
153
-
143
+ return this[internalSymbol].queue
144
+ .poll()
145
+ .run(data)
146
+ .then((result) => {
147
+ return self.run(result);
148
+ });
154
149
  }
155
-
156
150
  }
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  /**
4
2
  * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
5
3
  * Node module: @schukai/monster
@@ -7,12 +5,11 @@
7
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
8
6
  */
9
7
 
8
+ import { ID } from "../types/id.mjs";
9
+ import { isObject } from "../types/is.mjs";
10
+ import { validateString } from "../types/validate.mjs";
10
11
 
11
- import {ID} from "../types/id.mjs";
12
- import {isObject} from "../types/is.mjs";
13
- import {validateString} from "../types/validate.mjs";
14
-
15
- export {trimSpaces}
12
+ export { trimSpaces };
16
13
 
17
14
  /**
18
15
  * This special trim function allows to trim spaces that have been protected by a special escape character.
@@ -23,14 +20,14 @@ export {trimSpaces}
23
20
  * trimSpaces(' hello \\ ')
24
21
  * </script>
25
22
  * ```
26
- *
23
+ *
27
24
  * Hint: One stroke is escaped by the javascript interpreter, the second stroke escapes the stroke.
28
- *
25
+ *
29
26
  * ```text
30
27
  * a\ b ↦ a b
31
28
  * a\\ b ↦ a\ b
32
29
  * ```
33
- *
30
+ *
34
31
  * @license AGPLv3
35
32
  * @since 1.24.0
36
33
  * @memberOf Monster.Util
@@ -39,40 +36,36 @@ export {trimSpaces}
39
36
  * @return {string}
40
37
  * @throws {TypeError} value is not a string
41
38
  */
42
- function trimSpaces(value) {
43
-
39
+ function trimSpaces(value) {
44
40
  validateString(value);
45
41
 
46
- let placeholder = new Map;
47
- const regex = /((?<pattern>\\(?<char>.)){1})/mig;
42
+ let placeholder = new Map();
43
+ const regex = /((?<pattern>\\(?<char>.)){1})/gim;
48
44
 
49
45
  // The separator for args must be escaped
50
46
  // undefined string which should not occur normally and is also not a regex
51
- let result = value.matchAll(regex)
47
+ let result = value.matchAll(regex);
52
48
 
53
49
  for (let m of result) {
54
- let g = m?.['groups'];
50
+ let g = m?.["groups"];
55
51
  if (!isObject(g)) {
56
52
  continue;
57
53
  }
58
54
 
59
- let p = g?.['pattern'];
60
- let c = g?.['char'];
55
+ let p = g?.["pattern"];
56
+ let c = g?.["char"];
61
57
 
62
58
  if (p && c) {
63
- let r = '__' + new ID().toString() + '__';
59
+ let r = `__${new ID().toString()}__`;
64
60
  placeholder.set(r, c);
65
61
  value = value.replace(p, r);
66
62
  }
67
-
68
63
  }
69
64
 
70
65
  value = value.trim();
71
66
  placeholder.forEach((v, k) => {
72
- value = value.replace(k, '\\' + v)
73
- })
67
+ value = value.replace(k, `\\${v}`);
68
+ });
74
69
 
75
70
  return value;
76
-
77
71
  }
78
-
@@ -2,6 +2,7 @@
2
2
 
3
3
  import {expect} from "chai"
4
4
 
5
+ import {Locale} from "../../../../application/source/i18n/locale.mjs";
5
6
  import {getLocaleOfDocument} from "../../../../application/source/dom/locale.mjs";
6
7
  import {initJSDOM} from "../../util/jsdom.mjs";
7
8
 
@@ -32,10 +33,24 @@ describe('Attributes', function () {
32
33
  node.setAttribute('lang', a);
33
34
  expect(getLocaleOfDocument().toString()).to.be.equal(a);
34
35
  })
36
+
37
+
35
38
 
36
39
  });
37
40
 
38
41
 
39
42
  });
43
+
44
+
45
+ it('return language en', function () {
46
+ let html = document.getElementsByTagName('html');
47
+ let node = html.item(0);
48
+
49
+ node.removeAttribute('lang');
50
+ const locale = getLocaleOfDocument();
51
+ expect(locale).to.be.instanceOf(Locale);
52
+ expect(locale.localeString).to.be.equal('en-US');
53
+ })
54
+
40
55
 
41
56
  })
@@ -0,0 +1,72 @@
1
+ import {expect} from "chai"
2
+
3
+
4
+ import {Embed} from "../../../../../application/source/i18n/providers/embed.mjs";
5
+ import {Translations} from "../../../../../application/source/i18n/translations.mjs";
6
+ import {getGlobal} from "../../../../../application/source/types/global.mjs";
7
+ import {initJSDOM} from "../../../util/jsdom.mjs";
8
+
9
+
10
+ const global = getGlobal();
11
+
12
+ const html1 = `
13
+ <script id="templocale" type="application/json">
14
+ {
15
+ "key": "translation"
16
+ }
17
+ </script>
18
+ `;
19
+
20
+ describe('Translation Provider Embed', function () {
21
+
22
+ before(function (done) {
23
+ initJSDOM().then(() => {
24
+ done()
25
+ });
26
+ });
27
+
28
+
29
+ afterEach(() => {
30
+ let mocks = document.getElementById('mocks');
31
+ mocks.innerHTML = "";
32
+ });
33
+
34
+ beforeEach(() => {
35
+ let mocks = document.getElementById('mocks');
36
+ mocks.innerHTML = html1;
37
+
38
+ })
39
+
40
+ describe('get mock data and create translation', function () {
41
+
42
+ it('embed', function (done) {
43
+
44
+ const e = new Embed('templocale');
45
+ let p = e.getTranslations('en');
46
+ expect(p).is.instanceof(Promise);
47
+
48
+ p.then(r => {
49
+
50
+ try {
51
+ expect(r).is.instanceof(Translations);
52
+
53
+ let t = r.getText('key')
54
+ expect(t).is.equal('translation');
55
+
56
+
57
+ done();
58
+ } catch (e) {
59
+ done(e);
60
+ }
61
+
62
+
63
+ }).catch(e => {
64
+ done(e);
65
+ })
66
+
67
+ });
68
+
69
+ });
70
+
71
+
72
+ });
@@ -7,7 +7,7 @@ describe('Monster', function () {
7
7
  let monsterVersion
8
8
 
9
9
  /** don´t touch, replaced by make with package.json version */
10
- monsterVersion = new Version('3.4.2')
10
+ monsterVersion = new Version("3.7.0")
11
11
 
12
12
  let m = getMonsterVersion();
13
13