@schukai/monster 1.23.0 → 1.26.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. package/CHANGELOG +53 -0
  2. package/README.md +4 -4
  3. package/dist/modules/constants.js +2 -2
  4. package/dist/modules/constraints/abstract.js +1 -1
  5. package/dist/modules/constraints/abstractoperator.js +1 -1
  6. package/dist/modules/constraints/andoperator.js +1 -1
  7. package/dist/modules/constraints/invalid.js +1 -1
  8. package/dist/modules/constraints/isarray.js +1 -1
  9. package/dist/modules/constraints/isobject.js +1 -1
  10. package/dist/modules/constraints/namespace.js +1 -1
  11. package/dist/modules/constraints/oroperator.js +1 -1
  12. package/dist/modules/constraints/valid.js +1 -1
  13. package/dist/modules/data/buildmap.js +2 -2
  14. package/dist/modules/data/buildtree.js +2 -0
  15. package/dist/modules/data/datasource/namespace.js +1 -1
  16. package/dist/modules/data/datasource/restapi/writeerror.js +2 -0
  17. package/dist/modules/data/datasource/restapi.js +2 -2
  18. package/dist/modules/data/datasource/storage/localstorage.js +2 -2
  19. package/dist/modules/data/datasource/storage/namespace.js +1 -1
  20. package/dist/modules/data/datasource/storage/sessionstorage.js +2 -2
  21. package/dist/modules/data/datasource/storage.js +2 -2
  22. package/dist/modules/data/datasource.js +2 -2
  23. package/dist/modules/data/diff.js +2 -2
  24. package/dist/modules/data/extend.js +1 -1
  25. package/dist/modules/data/namespace.js +1 -1
  26. package/dist/modules/data/pathfinder.js +2 -2
  27. package/dist/modules/data/pipe.js +1 -1
  28. package/dist/modules/data/transformer.js +2 -2
  29. package/dist/modules/dom/assembler.js +1 -1
  30. package/dist/modules/dom/attributes.js +1 -1
  31. package/dist/modules/dom/constants.js +2 -2
  32. package/dist/modules/dom/customcontrol.js +2 -2
  33. package/dist/modules/dom/customelement.js +2 -2
  34. package/dist/modules/dom/events.js +1 -1
  35. package/dist/modules/dom/focusmanager.js +2 -0
  36. package/dist/modules/dom/locale.js +1 -1
  37. package/dist/modules/dom/namespace.js +1 -1
  38. package/dist/modules/dom/resource/data.js +2 -0
  39. package/dist/modules/dom/resource/link/stylesheet.js +2 -0
  40. package/dist/modules/dom/resource/link.js +2 -0
  41. package/dist/modules/dom/resource/script.js +2 -0
  42. package/dist/modules/dom/resource.js +2 -0
  43. package/dist/modules/dom/resourcemanager.js +2 -0
  44. package/dist/modules/dom/template.js +2 -2
  45. package/dist/modules/dom/theme.js +1 -1
  46. package/dist/modules/dom/updater.js +2 -2
  47. package/dist/modules/dom/util.js +1 -1
  48. package/dist/modules/dom/worker/factory.js +2 -0
  49. package/dist/modules/i18n/formatter.js +2 -0
  50. package/dist/modules/i18n/locale.js +1 -1
  51. package/dist/modules/i18n/namespace.js +1 -1
  52. package/dist/modules/i18n/provider.js +1 -1
  53. package/dist/modules/i18n/providers/fetch.js +2 -2
  54. package/dist/modules/i18n/providers/namespace.js +1 -1
  55. package/dist/modules/i18n/translations.js +1 -1
  56. package/dist/modules/logging/handler/console.js +1 -1
  57. package/dist/modules/logging/handler/namespace.js +1 -1
  58. package/dist/modules/logging/handler.js +1 -1
  59. package/dist/modules/logging/logentry.js +1 -1
  60. package/dist/modules/logging/logger.js +1 -1
  61. package/dist/modules/logging/namespace.js +1 -1
  62. package/dist/modules/math/namespace.js +1 -1
  63. package/dist/modules/math/random.js +2 -2
  64. package/dist/modules/monster.js +1 -1
  65. package/dist/modules/namespace.js +1 -1
  66. package/dist/modules/text/formatter.js +2 -2
  67. package/dist/modules/text/namespace.js +1 -1
  68. package/dist/modules/types/base.js +1 -1
  69. package/dist/modules/types/basewithoptions.js +2 -2
  70. package/dist/modules/types/binary.js +1 -1
  71. package/dist/modules/types/dataurl.js +1 -1
  72. package/dist/modules/types/global.js +1 -1
  73. package/dist/modules/types/id.js +1 -1
  74. package/dist/modules/types/is.js +2 -2
  75. package/dist/modules/types/mediatype.js +1 -1
  76. package/dist/modules/types/namespace.js +1 -1
  77. package/dist/modules/types/node.js +2 -0
  78. package/dist/modules/types/nodelist.js +2 -0
  79. package/dist/modules/types/noderecursiveiterator.js +2 -0
  80. package/dist/modules/types/observer.js +1 -1
  81. package/dist/modules/types/observerlist.js +2 -2
  82. package/dist/modules/types/proxyobserver.js +2 -2
  83. package/dist/modules/types/queue.js +1 -1
  84. package/dist/modules/types/randomid.js +1 -1
  85. package/dist/modules/types/regex.js +2 -0
  86. package/dist/modules/types/stack.js +1 -1
  87. package/dist/modules/types/tokenlist.js +2 -2
  88. package/dist/modules/types/typeof.js +1 -1
  89. package/dist/modules/types/uniquequeue.js +1 -1
  90. package/dist/modules/types/uuid.js +2 -0
  91. package/dist/modules/types/validate.js +1 -1
  92. package/dist/modules/types/version.js +2 -2
  93. package/dist/modules/util/clone.js +1 -1
  94. package/dist/modules/util/comparator.js +2 -2
  95. package/dist/modules/util/freeze.js +1 -1
  96. package/dist/modules/util/namespace.js +1 -1
  97. package/dist/modules/util/processing.js +2 -2
  98. package/dist/modules/util/trimspaces.js +2 -0
  99. package/dist/monster.dev.js +1684 -696
  100. package/dist/monster.dev.js.map +1 -1
  101. package/dist/monster.js +2 -2
  102. package/package.json +13 -2
  103. package/source/constants.js +16 -7
  104. package/source/constraints/abstract.js +5 -0
  105. package/source/constraints/abstractoperator.js +5 -0
  106. package/source/constraints/andoperator.js +10 -5
  107. package/source/constraints/invalid.js +8 -3
  108. package/source/constraints/isarray.js +9 -4
  109. package/source/constraints/isobject.js +8 -3
  110. package/source/constraints/oroperator.js +10 -5
  111. package/source/constraints/valid.js +8 -3
  112. package/source/data/buildmap.js +27 -11
  113. package/source/data/buildtree.js +95 -0
  114. package/source/data/datasource/restapi/writeerror.js +49 -0
  115. package/source/data/datasource/restapi.js +87 -20
  116. package/source/data/datasource/storage/localstorage.js +4 -10
  117. package/source/data/datasource/storage/sessionstorage.js +4 -12
  118. package/source/data/datasource/storage.js +7 -14
  119. package/source/data/datasource.js +55 -17
  120. package/source/data/diff.js +8 -8
  121. package/source/data/extend.js +5 -5
  122. package/source/data/pathfinder.js +12 -6
  123. package/source/data/pipe.js +6 -5
  124. package/source/data/transformer.js +131 -24
  125. package/source/dom/assembler.js +2 -2
  126. package/source/dom/attributes.js +24 -24
  127. package/source/dom/constants.js +305 -12
  128. package/source/dom/customcontrol.js +40 -19
  129. package/source/dom/customelement.js +121 -92
  130. package/source/dom/events.js +6 -6
  131. package/source/dom/focusmanager.js +250 -0
  132. package/source/dom/locale.js +10 -5
  133. package/source/dom/resource/data.js +170 -0
  134. package/source/dom/resource/link/stylesheet.js +54 -0
  135. package/source/dom/resource/link.js +125 -0
  136. package/source/dom/resource/script.js +112 -0
  137. package/source/dom/resource.js +268 -0
  138. package/source/dom/resourcemanager.js +214 -0
  139. package/source/dom/template.js +52 -12
  140. package/source/dom/theme.js +3 -3
  141. package/source/dom/updater.js +47 -33
  142. package/source/dom/util.js +6 -6
  143. package/source/dom/worker/factory.js +134 -0
  144. package/source/i18n/formatter.js +140 -0
  145. package/source/i18n/locale.js +10 -8
  146. package/source/i18n/provider.js +4 -4
  147. package/source/i18n/providers/fetch.js +24 -14
  148. package/source/i18n/translations.js +20 -10
  149. package/source/logging/handler/console.js +2 -2
  150. package/source/logging/handler.js +2 -2
  151. package/source/logging/logentry.js +2 -2
  152. package/source/logging/logger.js +4 -4
  153. package/source/math/random.js +11 -5
  154. package/source/namespace.js +1 -1
  155. package/source/text/formatter.js +244 -27
  156. package/source/types/base.js +4 -4
  157. package/source/types/basewithoptions.js +10 -15
  158. package/source/types/binary.js +4 -4
  159. package/source/types/dataurl.js +6 -6
  160. package/source/types/global.js +9 -7
  161. package/source/types/id.js +6 -3
  162. package/source/types/is.js +103 -85
  163. package/source/types/mediatype.js +4 -4
  164. package/source/types/node.js +179 -0
  165. package/source/types/nodelist.js +125 -0
  166. package/source/types/noderecursiveiterator.js +126 -0
  167. package/source/types/observer.js +3 -3
  168. package/source/types/observerlist.js +3 -3
  169. package/source/types/proxyobserver.js +24 -7
  170. package/source/types/queue.js +6 -6
  171. package/source/types/randomid.js +2 -2
  172. package/source/types/regex.js +49 -0
  173. package/source/types/stack.js +2 -2
  174. package/source/types/tokenlist.js +8 -9
  175. package/source/types/typeof.js +3 -3
  176. package/source/types/uniquequeue.js +4 -4
  177. package/source/types/uuid.js +102 -0
  178. package/source/types/validate.js +20 -20
  179. package/source/types/version.js +6 -6
  180. package/source/util/clone.js +4 -5
  181. package/source/util/comparator.js +5 -5
  182. package/source/util/freeze.js +5 -5
  183. package/source/util/processing.js +33 -36
  184. package/source/util/trimspaces.js +85 -0
  185. package/test/cases/data/buildtree.js +149 -0
  186. package/test/cases/data/datasource/restapi.js +1 -1
  187. package/test/cases/data/datasource.js +4 -4
  188. package/test/cases/data/diff.js +4 -4
  189. package/test/cases/data/pathfinder.js +18 -9
  190. package/test/cases/data/pipe.js +26 -2
  191. package/test/cases/data/transformer.js +41 -10
  192. package/test/cases/dom/attributes.js +18 -14
  193. package/test/cases/dom/customcontrol.js +6 -5
  194. package/test/cases/dom/customelement.js +14 -16
  195. package/test/cases/dom/focusmanager.js +111 -0
  196. package/test/cases/dom/locale.js +1 -4
  197. package/test/cases/dom/resource/data.js +129 -0
  198. package/test/cases/dom/resource/link/stylesheet.js +101 -0
  199. package/test/cases/dom/resource/link.js +101 -0
  200. package/test/cases/dom/resource/script.js +115 -0
  201. package/test/cases/dom/resourcemanager.js +118 -0
  202. package/test/cases/dom/updater.js +28 -4
  203. package/test/cases/dom/worker/factory.js +63 -0
  204. package/test/cases/i18n/formatter.js +66 -0
  205. package/test/cases/monster.js +1 -1
  206. package/test/cases/text/formatter.js +71 -8
  207. package/test/cases/types/node.js +196 -0
  208. package/test/cases/types/nodelist.js +64 -0
  209. package/test/cases/types/noderecursiveiterator.js +54 -0
  210. package/test/cases/types/proxyobserver.js +55 -11
  211. package/test/cases/types/regex.js +32 -0
  212. package/test/cases/types/uuid.js +42 -0
  213. package/test/cases/util/freeze.js +30 -4
  214. package/test/cases/util/trimspaces.js +24 -0
  215. package/test/util/cleanupdom.js +48 -0
  216. package/test/util/jsdom.js +22 -9
  217. package/test/web/import.js +15 -0
  218. package/test/web/monster-dev.html +3 -3
  219. package/test/web/monster.html +2 -2
  220. package/test/web/test.html +3 -3
  221. package/test/web/tests.js +7 -7
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @author schukai GmbH
5
+ */
6
+
7
+
8
+ import {internalSymbol} from "../constants.js";
9
+ import {extend} from "../data/extend.js";
10
+ import {assignToNamespace, Monster} from '../namespace.js';
11
+ import {Formatter as TextFormatter} from "../text/formatter.js";
12
+ import {validateInstance, validateString} from "../types/validate.js";
13
+ import {Translations} from "./translations.js";
14
+
15
+ /**
16
+ * @private
17
+ * @type {symbol}
18
+ */
19
+ const internalTranslationSymbol = Symbol('internalTranslation')
20
+
21
+ /**
22
+ * The Formatter extends the Text.Formatter with the possibility to replace the key by a translation.
23
+ *
24
+ * You can create an instance via the monster namespace `new Monster.I18n.Formatter()`.
25
+ *
26
+ * ```
27
+ * <script type="module">
28
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
29
+ * new Monster.I18n.Formatter()
30
+ * </script>
31
+ * ```
32
+ *
33
+ * Alternatively, you can also integrate this function individually.
34
+ *
35
+ * ```
36
+ * <script type="module">
37
+ * import {Formatter} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/formatter.js';
38
+ * new Formatter()
39
+ * </script>
40
+ * ```
41
+ *
42
+ * @example
43
+ *
44
+ * import {Formatter} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/formatter.js';
45
+ * import {Translations} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/translations.js';
46
+ *
47
+ * const translations = new Translations('en')
48
+ * .assignTranslations({
49
+ * thekey: "${animal} has eaten the ${food}!"
50
+ * });
51
+ *
52
+ * new Formatter({}, translations).format("thekey:animal=dog::food=cake")
53
+ * // ↦ dog has eaten the cake!
54
+ *
55
+ * @since 1.26.0
56
+ * @copyright schukai GmbH
57
+ * @memberOf Monster.I18n
58
+ */
59
+ class Formatter extends TextFormatter {
60
+
61
+ /**
62
+ * Default values for the markers are `${` and `}`
63
+ *
64
+ * @param {object} object
65
+ * @throws {TypeError} value is not a object
66
+ */
67
+ constructor(object, translation, options) {
68
+ super(object, options);
69
+ this[internalTranslationSymbol] = validateInstance(translation, Translations);
70
+ }
71
+
72
+ /**
73
+ * @property {object} marker
74
+ * @property {array} marker.open=["i18n{","${"]
75
+ * @property {array} marker.close=["${"]
76
+ * @property {object} parameter
77
+ * @property {string} parameter.delimiter="::"
78
+ * @property {string} parameter.assignment="="
79
+ * @property {object} callbacks
80
+ * @property {function} callbacks.i18n=()=>{}
81
+ */
82
+ get defaults() {
83
+ const self = this;
84
+ return extend({}, super.defaults, {
85
+ callbacks: {
86
+ i18n: (value) => {
87
+ return self[internalTranslationSymbol].getText(validateString(value));
88
+ }
89
+ },
90
+ marker: {
91
+ open: ['i18n{', '${'],
92
+ close: ['}'],
93
+ },
94
+ })
95
+ }
96
+
97
+ /**
98
+ *
99
+ * @param {string} text
100
+ * @return {string}
101
+ * @throws {TypeError} value is not a string
102
+ * @throws {Error} too deep nesting
103
+ * @throws {Error} key not found
104
+ * @throws {Error} the closing marker is missing
105
+ */
106
+ format(text) {
107
+ validateString(text)
108
+
109
+ const openMarker = this[internalSymbol]['marker']['open']?.[0];
110
+ const closeMarker = this[internalSymbol]['marker']['close']?.[0];
111
+
112
+ if (text.indexOf(openMarker) === 0) {
113
+ text = text.substring(openMarker.length);
114
+
115
+ if (text.indexOf(closeMarker) === text.length - closeMarker.length) {
116
+ text = text.substring(0, text.length - closeMarker.length);
117
+ } else {
118
+ throw new Error("the closing marker is missing")
119
+ }
120
+ }
121
+
122
+
123
+ const parts = validateString(text).split('::')
124
+ const translationKey = parts.shift().trim(); // key value delimiter
125
+ const parameter = parts.join('::').trim();
126
+
127
+
128
+ let assembledText = openMarker + 'static:' + translationKey + ' | call:i18n';
129
+ if (parameter.length > 0) {
130
+ assembledText += '::' + parameter;
131
+ }
132
+ assembledText += closeMarker;
133
+ return super.format(assembledText);
134
+ }
135
+
136
+
137
+ }
138
+
139
+ assignToNamespace('Monster.I18n', Formatter);
140
+ export {Monster, Formatter}
@@ -25,8 +25,8 @@ const localeStringSymbol = Symbol('localeString');
25
25
  *
26
26
  * ```
27
27
  * <script type="module">
28
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/locale.js';
29
- * console.log(new Monster.I18n.Locale())
28
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
29
+ * new Monster.I18n.Locale()
30
30
  * </script>
31
31
  * ```
32
32
  *
@@ -34,8 +34,8 @@ const localeStringSymbol = Symbol('localeString');
34
34
  *
35
35
  * ```
36
36
  * <script type="module">
37
- * import {Locale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/locale.js';
38
- * console.log(new Locale())
37
+ * import {Locale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/locale.js';
38
+ * new Locale()
39
39
  * </script>
40
40
  * ```
41
41
  *
@@ -172,6 +172,8 @@ class Locale extends Base {
172
172
  }
173
173
 
174
174
  /**
175
+ * The structure has the following: language, script, region, variants, extlang, privateUse
176
+ *
175
177
  * @return {Monster.I18n.LocaleMap}
176
178
  */
177
179
  getMap() {
@@ -201,8 +203,8 @@ class Locale extends Base {
201
203
  *
202
204
  * ```
203
205
  * <script type="module">
204
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/locale.js';
205
- * console.log(new Monster.I18n.createLocale())
206
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
207
+ * new Monster.I18n.createLocale()
206
208
  * </script>
207
209
  * ```
208
210
  *
@@ -210,8 +212,8 @@ class Locale extends Base {
210
212
  *
211
213
  * ```
212
214
  * <script type="module">
213
- * import {createLocale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/locale.js';
214
- * console.log(createLocale())
215
+ * import {createLocale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/locale.js';
216
+ * createLocale()
215
217
  * </script>
216
218
  * ```
217
219
  *
@@ -15,8 +15,8 @@ import {Translations} from "./translations.js"
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/provider.js';
19
- * console.log(new Monster.I18n.Provider())
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
19
+ * new Monster.I18n.Provider()
20
20
  * </script>
21
21
  * ```
22
22
  *
@@ -24,8 +24,8 @@ import {Translations} from "./translations.js"
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {Provider} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/provider.js';
28
- * console.log(new Provider())
27
+ * import {Provider} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/provider.js';
28
+ * new Provider()
29
29
  * </script>
30
30
  * ```
31
31
  *
@@ -1,10 +1,11 @@
1
1
  'use strict';
2
2
 
3
- import {PROPERTY_KEY_INTERNALDATA} from "../../constants.js";
4
- import {extend} from "../../data/extend.js";
5
3
  /**
6
4
  * @author schukai GmbH
7
5
  */
6
+
7
+ import {internalSymbol} from "../../constants.js";
8
+ import {extend} from "../../data/extend.js";
8
9
  import {assignToNamespace, Monster} from '../../namespace.js';
9
10
  import {Formatter} from "../../text/formatter.js";
10
11
  import {getGlobalFunction} from "../../types/global.js";
@@ -14,12 +15,6 @@ import {parseLocale} from "../locale.js";
14
15
  import {Provider} from "../provider.js";
15
16
  import {Translations} from "../translations.js";
16
17
 
17
- /**
18
- * @private
19
- * @type {symbol}
20
- */
21
- const optionsSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
22
-
23
18
  /**
24
19
  * The fetch provider retrieves a JSON file from the given URL and returns a translation object.
25
20
  *
@@ -27,8 +22,8 @@ const optionsSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
27
22
  *
28
23
  * ```
29
24
  * <script type="module">
30
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/providers/fetch.js';
31
- * console.log(new Monster.I18n.Providers.Fetch())
25
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
26
+ * new Monster.I18n.Providers.Fetch()
32
27
  * </script>
33
28
  * ```
34
29
  *
@@ -36,21 +31,36 @@ const optionsSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
36
31
  *
37
32
  * ```
38
33
  * <script type="module">
39
- * import {Fetch} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/providers/fetch.js';
40
- * console.log(new Fetch())
34
+ * import {Fetch} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/providers/fetch.js';
35
+ * new Fetch()
41
36
  * </script>
42
37
  * ```
38
+ *
39
+ * @example <caption>das ist ein test</caption>
40
+ *
41
+ * import {Fetch} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/providers/fetch.js';
42
+ *
43
+ * // fetch from API
44
+ * const translation = new Fetch('https://example.com/${language}.json').getTranslation('en-GB');
45
+ * // ↦ https://example.com/en.json
43
46
  *
44
47
  * @since 1.13.0
45
48
  * @copyright schukai GmbH
46
49
  * @memberOf Monster.I18n.Providers
47
50
  * @see {@link https://datatracker.ietf.org/doc/html/rfc3066}
51
+ * @tutorial i18n-locale-and-formatter
48
52
  */
49
53
  class Fetch extends Provider {
50
54
 
51
55
  /**
52
56
  * As options the key `fetch` can be passed. This config object is passed to the fetch method as init.
53
- *
57
+ *
58
+ * The url may contain placeholders (language, script, region, variants, extlang, privateUse), so you can specify one url for all translations.
59
+ *
60
+ * ```
61
+ * new Fetch('https://www.example.com/assets/${language}.json')
62
+ * ```
63
+ *
54
64
  * @param {string|URL} url
55
65
  * @param {Object} options see {@link Monster.I18n.Providers.Fetch#defaults}
56
66
  * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/fetch}
@@ -77,7 +87,7 @@ class Fetch extends Provider {
77
87
  * @private
78
88
  * @property {Object} options
79
89
  */
80
- this[optionsSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
90
+ this[internalSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
81
91
 
82
92
  }
83
93
 
@@ -17,8 +17,8 @@ import {Locale, parseLocale} from "./locale.js";
17
17
  *
18
18
  * ```
19
19
  * <script type="module">
20
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/translations.js';
21
- * console.log(new Monster.I18n.Translations())
20
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
21
+ * new Monster.I18n.Translations()
22
22
  * </script>
23
23
  * ```
24
24
  *
@@ -26,22 +26,33 @@ import {Locale, parseLocale} from "./locale.js";
26
26
  *
27
27
  * ```
28
28
  * <script type="module">
29
- * import {Translations} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/i18n/translations.js';
30
- * console.log(new Translations())
29
+ * import {Translations} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/translations.js';
30
+ * new Translations()
31
31
  * </script>
32
32
  * ```
33
33
  *
34
34
  * @example
35
35
  *
36
+ * import {Translations} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/translations.js';
37
+ * import {parseLocale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/i18n/locale.js';
38
+ *
36
39
  * const translation = new Translations(parseLocale('en-GB'));
37
40
  *
38
41
  * translation.assignTranslations({
39
- * text1: "abc",
40
- * text2: {'other': 'xyz'}
41
- * });
42
+ * text1: "click",
43
+ * text2: {
44
+ * 'one': 'click once',
45
+ * 'other': 'click n times'
46
+ * }
47
+ * });
48
+ *
49
+ * console.log(translation.getText('text1'));
50
+ * // ↦ click
42
51
  *
43
- * translation.getText('text1);
44
- * translation.getPluralRuleText('text1',2);
52
+ * console.log(translation.getPluralRuleText('text2',1));
53
+ * // -> click once
54
+ * console.log(translation.getPluralRuleText('text2',2));
55
+ * // -> click n times
45
56
  *
46
57
  * @since 1.13.0
47
58
  * @copyright schukai GmbH
@@ -204,6 +215,5 @@ class Translations extends Base {
204
215
 
205
216
  }
206
217
 
207
-
208
218
  assignToNamespace('Monster.I18n', Translations);
209
219
  export {Monster, Translations}
@@ -15,7 +15,7 @@ import {LogEntry} from "../logentry.js";
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/handler/console.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
19
19
  * console.log(new Monster.Logging.Handler.ConsoleHandler())
20
20
  * </script>
21
21
  * ```
@@ -24,7 +24,7 @@ import {LogEntry} from "../logentry.js";
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {ConsoleHandler} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/handler/console.js';
27
+ * import {ConsoleHandler} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/logging/handler/console.js';
28
28
  * console.log(new ConsoleHandler())
29
29
  * </script>
30
30
  * ```
@@ -15,7 +15,7 @@ import {ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN} from "./logger.js";
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/handler.js';
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
19
19
  * console.log(new Monster.Logging.Handler())
20
20
  * </script>
21
21
  * ```
@@ -24,7 +24,7 @@ import {ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN} from "./logger.js";
24
24
  *
25
25
  * ```
26
26
  * <script type="module">
27
- * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/handler.js';
27
+ * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/logging/handler.js';
28
28
  * console.log(new Handler())
29
29
  * </script>
30
30
  * ```
@@ -14,7 +14,7 @@ import {validateInteger} from '../types/validate.js';
14
14
  *
15
15
  * ```
16
16
  * <script type="module">
17
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/logentry.js';
17
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
18
18
  * console.log(new Monster.Logging.LogEntry())
19
19
  * </script>
20
20
  * ```
@@ -23,7 +23,7 @@ import {validateInteger} from '../types/validate.js';
23
23
  *
24
24
  * ```
25
25
  * <script type="module">
26
- * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/logentry.js';
26
+ * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/logging/logentry.js';
27
27
  * console.log(new LogEntry())
28
28
  * </script>
29
29
  * ```
@@ -65,8 +65,8 @@ const OFF = 0;
65
65
  *
66
66
  * ```
67
67
  * <script type="module">
68
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/logger.js';
69
- * console.log(new Monster.Logging.Logger())
68
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
69
+ * new Monster.Logging.Logger()
70
70
  * </script>
71
71
  * ```
72
72
  *
@@ -74,8 +74,8 @@ const OFF = 0;
74
74
  *
75
75
  * ```
76
76
  * <script type="module">
77
- * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/logging/logger.js';
78
- * console.log(new Logger())
77
+ * import {ID} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/logging/logger.js';
78
+ * new Logger()
79
79
  * </script>
80
80
  * ```
81
81
  *
@@ -15,8 +15,9 @@ import {getGlobal} from '../types/global.js';
15
15
  *
16
16
  * ```
17
17
  * <script type="module">
18
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/math/random.js';
19
- * console.log(Monster.Math.random(1,10)) // ↦ 5
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
19
+ * Monster.Math.random(1,10)
20
+ * // ↦ 5
20
21
  * </script>
21
22
  * ```
22
23
  *
@@ -24,8 +25,9 @@ import {getGlobal} from '../types/global.js';
24
25
  *
25
26
  * ```
26
27
  * <script type="module">
27
- * import {random} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/math/random.js';
28
- * console.log(random(1,10)) // ↦ 5
28
+ * import {random} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/modules/math/random.js';
29
+ * random(1,10)
30
+ * // ↦ 5
29
31
  * </script>
30
32
  * ```
31
33
  *
@@ -116,7 +118,11 @@ function create(min, max) {
116
118
  return create(min, max);
117
119
  }
118
120
 
119
- return min + rval;
121
+ if (rval < min) {
122
+ rval += min;
123
+ }
124
+
125
+ return rval;
120
126
 
121
127
  }
122
128
 
@@ -65,7 +65,7 @@ export const Monster = new Namespace("Monster");
65
65
  *
66
66
  * ```
67
67
  * <script type="module">
68
- * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.23.0/dist/modules/namespace.js';
68
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.1/dist/monster.js';
69
69
  * function hello() {
70
70
  * console.log('Hello World!');
71
71
  * }