@schukai/monster 1.12.0 → 1.15.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 (163) hide show
  1. package/CHANGELOG +40 -1
  2. package/README.md +5 -5
  3. package/dist/modules/constants.js +2 -0
  4. package/dist/modules/constraints/abstract.js +2 -2
  5. package/dist/modules/constraints/abstractoperator.js +2 -2
  6. package/dist/modules/constraints/andoperator.js +2 -2
  7. package/dist/modules/constraints/invalid.js +2 -2
  8. package/dist/modules/constraints/isarray.js +2 -2
  9. package/dist/modules/constraints/isobject.js +2 -2
  10. package/dist/modules/constraints/namespace.js +1 -1
  11. package/dist/modules/constraints/oroperator.js +2 -2
  12. package/dist/modules/constraints/valid.js +2 -2
  13. package/dist/modules/data/buildmap.js +2 -2
  14. package/dist/modules/data/diff.js +2 -2
  15. package/dist/modules/data/extend.js +2 -2
  16. package/dist/modules/data/namespace.js +1 -1
  17. package/dist/modules/data/pathfinder.js +2 -2
  18. package/dist/modules/data/pipe.js +2 -2
  19. package/dist/modules/data/transformer.js +2 -2
  20. package/dist/modules/dom/assembler.js +2 -2
  21. package/dist/modules/dom/attributes.js +2 -2
  22. package/dist/modules/dom/constants.js +2 -2
  23. package/dist/modules/dom/customcontrol.js +2 -0
  24. package/dist/modules/dom/customelement.js +2 -2
  25. package/dist/modules/dom/events.js +2 -2
  26. package/dist/modules/dom/locale.js +2 -0
  27. package/dist/modules/dom/namespace.js +1 -1
  28. package/dist/modules/dom/template.js +2 -2
  29. package/dist/modules/dom/theme.js +2 -2
  30. package/dist/modules/dom/updater.js +2 -2
  31. package/dist/modules/dom/util.js +2 -2
  32. package/dist/modules/i18n/locale.js +2 -0
  33. package/dist/modules/i18n/namespace.js +2 -0
  34. package/dist/modules/i18n/provider.js +2 -0
  35. package/dist/modules/i18n/providers/fetch.js +2 -0
  36. package/dist/modules/i18n/providers/namespace.js +2 -0
  37. package/dist/modules/i18n/translations.js +2 -0
  38. package/dist/modules/logging/handler/console.js +2 -2
  39. package/dist/modules/logging/handler/namespace.js +1 -1
  40. package/dist/modules/logging/handler.js +2 -2
  41. package/dist/modules/logging/logentry.js +2 -2
  42. package/dist/modules/logging/logger.js +2 -2
  43. package/dist/modules/logging/namespace.js +1 -1
  44. package/dist/modules/math/namespace.js +1 -1
  45. package/dist/modules/math/random.js +2 -2
  46. package/dist/modules/monster.js +2 -2
  47. package/dist/modules/namespace.js +1 -1
  48. package/dist/modules/text/formatter.js +2 -2
  49. package/dist/modules/text/namespace.js +1 -1
  50. package/dist/modules/types/base.js +2 -2
  51. package/dist/modules/types/basewithoptions.js +2 -0
  52. package/dist/modules/types/global.js +2 -2
  53. package/dist/modules/types/id.js +2 -2
  54. package/dist/modules/types/is.js +2 -2
  55. package/dist/modules/types/namespace.js +1 -1
  56. package/dist/modules/types/observer.js +2 -2
  57. package/dist/modules/types/observerlist.js +2 -2
  58. package/dist/modules/types/proxyobserver.js +2 -2
  59. package/dist/modules/types/queue.js +2 -2
  60. package/dist/modules/types/randomid.js +2 -2
  61. package/dist/modules/types/stack.js +2 -2
  62. package/dist/modules/types/tokenlist.js +2 -2
  63. package/dist/modules/types/typeof.js +2 -2
  64. package/dist/modules/types/uniquequeue.js +2 -2
  65. package/dist/modules/types/validate.js +2 -2
  66. package/dist/modules/types/version.js +2 -2
  67. package/dist/modules/util/clone.js +2 -2
  68. package/dist/modules/util/comparator.js +2 -2
  69. package/dist/modules/util/freeze.js +2 -2
  70. package/dist/modules/util/namespace.js +1 -1
  71. package/dist/monster.dev.js +8692 -6669
  72. package/dist/monster.dev.js.map +1 -1
  73. package/dist/monster.js +3 -3
  74. package/package.json +1 -1
  75. package/source/constants.js +22 -0
  76. package/source/constraints/abstract.js +2 -2
  77. package/source/constraints/abstractoperator.js +3 -3
  78. package/source/constraints/andoperator.js +7 -7
  79. package/source/constraints/invalid.js +6 -6
  80. package/source/constraints/isarray.js +6 -6
  81. package/source/constraints/isobject.js +6 -6
  82. package/source/constraints/namespace.js +2 -0
  83. package/source/constraints/oroperator.js +8 -8
  84. package/source/constraints/valid.js +6 -6
  85. package/source/data/buildmap.js +15 -15
  86. package/source/data/diff.js +6 -6
  87. package/source/data/extend.js +55 -13
  88. package/source/data/namespace.js +2 -0
  89. package/source/data/pathfinder.js +6 -7
  90. package/source/data/pipe.js +5 -5
  91. package/source/data/transformer.js +6 -6
  92. package/source/dom/assembler.js +5 -5
  93. package/source/dom/attributes.js +89 -45
  94. package/source/dom/constants.js +8 -9
  95. package/source/dom/customcontrol.js +301 -0
  96. package/source/dom/customelement.js +149 -31
  97. package/source/dom/events.js +58 -8
  98. package/source/dom/locale.js +59 -0
  99. package/source/dom/namespace.js +2 -0
  100. package/source/dom/template.js +7 -7
  101. package/source/dom/theme.js +6 -6
  102. package/source/dom/updater.js +38 -11
  103. package/source/dom/util.js +10 -10
  104. package/source/i18n/locale.js +322 -0
  105. package/source/i18n/namespace.js +15 -0
  106. package/source/i18n/provider.js +58 -0
  107. package/source/i18n/providers/fetch.js +121 -0
  108. package/source/i18n/providers/namespace.js +15 -0
  109. package/source/i18n/translations.js +209 -0
  110. package/source/logging/handler/console.js +4 -4
  111. package/source/logging/handler.js +4 -4
  112. package/source/logging/logentry.js +4 -4
  113. package/source/logging/logger.js +4 -4
  114. package/source/logging/namespace.js +2 -0
  115. package/source/math/namespace.js +2 -0
  116. package/source/math/random.js +5 -5
  117. package/source/monster.js +26 -16
  118. package/source/namespace.js +10 -8
  119. package/source/text/formatter.js +4 -5
  120. package/source/text/namespace.js +1 -1
  121. package/source/types/base.js +4 -7
  122. package/source/types/basewithoptions.js +97 -0
  123. package/source/types/global.js +6 -6
  124. package/source/types/id.js +6 -6
  125. package/source/types/is.js +22 -22
  126. package/source/types/namespace.js +3 -1
  127. package/source/types/observer.js +5 -5
  128. package/source/types/observerlist.js +4 -4
  129. package/source/types/proxyobserver.js +32 -26
  130. package/source/types/queue.js +13 -7
  131. package/source/types/randomid.js +5 -5
  132. package/source/types/stack.js +11 -4
  133. package/source/types/tokenlist.js +4 -4
  134. package/source/types/typeof.js +5 -5
  135. package/source/types/uniquequeue.js +11 -4
  136. package/source/types/validate.js +22 -22
  137. package/source/types/version.js +9 -9
  138. package/source/util/clone.js +4 -4
  139. package/source/util/comparator.js +6 -6
  140. package/source/util/freeze.js +4 -4
  141. package/source/util/namespace.js +2 -0
  142. package/test/cases/data/extend.js +66 -13
  143. package/test/cases/dom/attributes.js +56 -1
  144. package/test/cases/dom/customcontrol.js +264 -0
  145. package/test/cases/dom/customelement.js +112 -51
  146. package/test/cases/dom/events.js +32 -14
  147. package/test/cases/dom/locale.js +44 -0
  148. package/test/cases/i18n/locale.js +80 -0
  149. package/test/cases/i18n/provider.js +15 -0
  150. package/test/cases/i18n/providers/fetch.js +65 -0
  151. package/test/cases/i18n/translations.js +57 -0
  152. package/test/cases/monster.js +3 -1
  153. package/test/cases/{util → text}/formatter.js +2 -0
  154. package/test/cases/types/basewithoptions.js +25 -0
  155. package/test/cases/types/proxyobserver.js +9 -0
  156. package/test/cases/{text → util}/clone.js +0 -0
  157. package/test/cases/{text → util}/comparator.js +0 -0
  158. package/test/util/jsdom.js +4 -0
  159. package/test/web/import.js +10 -3
  160. package/test/web/monster-dev.html +3 -3
  161. package/test/web/monster.html +3 -3
  162. package/test/web/test.html +3 -3
  163. package/test/web/tests.js +3 -3
@@ -0,0 +1,322 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @author schukai GmbH
5
+ */
6
+ import {Monster, assignToNamespace} from '../namespace.js';
7
+ import {Base} from "../types/base.js";
8
+ import {validateString} from "../types/validate.js";
9
+ import {clone} from "../util/clone.js";
10
+
11
+ /**
12
+ * @type {symbol}
13
+ */
14
+ const propertiesSymbol = Symbol('properties');
15
+
16
+ /**
17
+ * @type {symbol}
18
+ */
19
+ const localeStringSymbol = Symbol('localeString');
20
+
21
+ /**
22
+ * You can call the method via the monster namespace `new Monster.I18n.Locale()`.
23
+ *
24
+ * ```
25
+ * <script type="module">
26
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/locale.js';
27
+ * console.log(new Monster.I18n.Locale())
28
+ * </script>
29
+ * ```
30
+ *
31
+ * Alternatively, you can also integrate this function individually.
32
+ *
33
+ * ```
34
+ * <script type="module">
35
+ * import {Locale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/locale.js';
36
+ * console.log(new Locale())
37
+ * </script>
38
+ * ```
39
+ *
40
+ * RFC
41
+ *
42
+ * ```
43
+ * A Language-Tag consists of:
44
+ * langtag ; generated tag
45
+ * -or- private-use ; a private use tag
46
+ *
47
+ * langtag = (language
48
+ * ["-" script]
49
+ * ["-" region]
50
+ * *("-" variant)
51
+ * *("-" extension)
52
+ * ["-" privateuse])
53
+ *
54
+ * language = "en", "ale", or a registered value
55
+ *
56
+ * script = "Latn", "Cyrl", "Hant" ISO 15924 codes
57
+ *
58
+ * region = "US", "CS", "FR" ISO 3166 codes
59
+ * "419", "019", or UN M.49 codes
60
+ *
61
+ * variant = "rozaj", "nedis", "1996", multiple subtags can be used in a tag
62
+ *
63
+ * extension = single letter followed by additional subtags; more than one extension
64
+ * may be used in a language tag
65
+ *
66
+ * private-use = "x-" followed by additional subtags, as many as are required
67
+ * Note that these can start a tag or appear at the end (but not
68
+ * in the middle)
69
+ * ```
70
+ *
71
+ * @since 1.13.0
72
+ * @copyright schukai GmbH
73
+ * @memberOf Monster/I18n
74
+ * @see https://datatracker.ietf.org/doc/html/rfc3066
75
+ */
76
+ class Locale extends Base {
77
+
78
+ /**
79
+ * @param {string|undefined} language
80
+ * @param {string|undefined} region
81
+ * @param {string|undefined} script
82
+ * @param {string|undefined} variants
83
+ * @param {string|undefined} extlang
84
+ * @param {string|undefined} privateUse
85
+ * @throws {Error} unsupported locale
86
+ */
87
+ constructor(language, region, script, variants, extlang, privateUse) {
88
+ super();
89
+
90
+ this[propertiesSymbol] = {
91
+ language: (language === undefined) ? undefined : validateString(language),
92
+ script: (script === undefined) ? undefined : validateString(script),
93
+ region: (region === undefined) ? undefined : validateString(region),
94
+ variants: (variants === undefined) ? undefined : validateString(variants),
95
+ extlang: (extlang === undefined) ? undefined : validateString(extlang),
96
+ privateUse: (privateUse === undefined) ? undefined : validateString(privateUse),
97
+ };
98
+
99
+ let s = [];
100
+ if (language !== undefined) s.push(language);
101
+ if (script !== undefined) s.push(script);
102
+ if (region !== undefined) s.push(region);
103
+ if (variants !== undefined) s.push(variants);
104
+ if (extlang !== undefined) s.push(extlang);
105
+ if (privateUse !== undefined) s.push(privateUse);
106
+
107
+ if (s.length === 0) {
108
+ throw new Error('unsupported locale');
109
+ }
110
+
111
+ this[localeStringSymbol] = s.join('-');
112
+
113
+ }
114
+
115
+ /**
116
+ * @return {string}
117
+ */
118
+ get localeString() {
119
+ return this[localeStringSymbol];
120
+ }
121
+
122
+ /**
123
+ * @return {string|undefined}
124
+ */
125
+ get language() {
126
+ return this[propertiesSymbol].language;
127
+ }
128
+
129
+ /**
130
+ * @return {string|undefined}
131
+ */
132
+ get region() {
133
+ return this[propertiesSymbol].region;
134
+ }
135
+
136
+ /**
137
+ * @return {string|undefined}
138
+ */
139
+ get script() {
140
+ return this[propertiesSymbol].script;
141
+ }
142
+
143
+ /**
144
+ * @return {string|undefined}
145
+ */
146
+ get variants() {
147
+ return this[propertiesSymbol].variants;
148
+ }
149
+
150
+ /**
151
+ * @return {string|undefined}
152
+ */
153
+ get extlang() {
154
+ return this[propertiesSymbol].extlang;
155
+ }
156
+
157
+ /**
158
+ * @return {string|undefined}
159
+ */
160
+ get privateUse() {
161
+ return this[propertiesSymbol].privateValue;
162
+ }
163
+
164
+
165
+ /**
166
+ * @return {string}
167
+ */
168
+ toString() {
169
+ return "" + this.localeString;
170
+ }
171
+
172
+ /**
173
+ * @return {object}
174
+ */
175
+ getMap() {
176
+ return clone(this[propertiesSymbol])
177
+ }
178
+
179
+
180
+ }
181
+
182
+
183
+ /**
184
+ * Parse local according to rfc4646 standard
185
+ *
186
+ * Limitations: The regex cannot handle multiple variants or private.
187
+ *
188
+ * You can call the method via the monster namespace `Monster.I18n.createLocale()`.
189
+ *
190
+ * ```
191
+ * <script type="module">
192
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/locale.js';
193
+ * console.log(new Monster.I18n.createLocale())
194
+ * </script>
195
+ * ```
196
+ *
197
+ * Alternatively, you can also integrate this function individually.
198
+ *
199
+ * ```
200
+ * <script type="module">
201
+ * import {createLocale} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/locale.js';
202
+ * console.log(createLocale())
203
+ * </script>
204
+ * ```
205
+ *
206
+ * RFC
207
+ *
208
+ * ```
209
+ * The syntax of the language tag in ABNF [RFC4234] is:
210
+ *
211
+ * Language-Tag = langtag
212
+ * / privateuse ; private use tag
213
+ * / grandfathered ; grandfathered registrations
214
+ *
215
+ * langtag = (language
216
+ * ["-" script]
217
+ * ["-" region]
218
+ * *("-" variant)
219
+ * *("-" extension)
220
+ * ["-" privateuse])
221
+ *
222
+ * language = (2*3ALPHA [ extlang ]) ; shortest ISO 639 code
223
+ * / 4ALPHA ; reserved for future use
224
+ * / 5*8ALPHA ; registered language subtag
225
+ *
226
+ * extlang = *3("-" 3ALPHA) ; reserved for future use
227
+ *
228
+ * script = 4ALPHA ; ISO 15924 code
229
+ *
230
+ * region = 2ALPHA ; ISO 3166 code
231
+ * / 3DIGIT ; UN M.49 code
232
+ *
233
+ * variant = 5*8alphanum ; registered variants
234
+ * / (DIGIT 3alphanum)
235
+ *
236
+ * extension = singleton 1*("-" (2*8alphanum))
237
+ *
238
+ * singleton = %x41-57 / %x59-5A / %x61-77 / %x79-7A / DIGIT
239
+ * ; "a"-"w" / "y"-"z" / "A"-"W" / "Y"-"Z" / "0"-"9"
240
+ * ; Single letters: x/X is reserved for private use
241
+ *
242
+ * privateuse = ("x"/"X") 1*("-" (1*8alphanum))
243
+ *
244
+ * grandfathered = 1*3ALPHA 1*2("-" (2*8alphanum))
245
+ * ; grandfathered registration
246
+ * ; Note: i is the only singleton
247
+ * ; that starts a grandfathered tag
248
+ *
249
+ * alphanum = (ALPHA / DIGIT) ; letters and numbers
250
+ *
251
+ * Figure 1: Language Tag ABNF
252
+ * ```
253
+ *
254
+ * @param {string} locale
255
+ * @returns {Locale}
256
+ * @since 1.14.0
257
+ * @copyright schukai GmbH
258
+ * @memberOf Monster/I18n
259
+ * @throws {TypeError} value is not a string
260
+ * @throws {Error} unsupported locale
261
+ */
262
+ function parseLocale(locale) {
263
+
264
+ locale = validateString(locale).replace(/_/g, "-");
265
+
266
+ let language, region, variants, parts, script, extlang,
267
+ regexRegular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)",
268
+ regexIrregular = "(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)",
269
+ regexGrandfathered = "(" + regexIrregular + "|" + regexRegular + ")",
270
+ regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)",
271
+ regexSingleton = "[0-9A-WY-Za-wy-z]",
272
+ regexExtension = "(" + regexSingleton + "(-[A-Za-z0-9]{2,8})+)",
273
+ regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})",
274
+ regexRegion = "([A-Za-z]{2}|[0-9]{3})",
275
+ regexScript = "([A-Za-z]{4})",
276
+ regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})",
277
+ regexLanguage = "(([A-Za-z]{2,3}(-" + regexExtlang + ")?)|[A-Za-z]{4}|[A-Za-z]{5,8})",
278
+ regexLangtag = "(" + regexLanguage + "(-" + regexScript + ")?" + "(-" + regexRegion + ")?" + "(-" + regexVariant + ")*" + "(-" + regexExtension + ")*" + "(-" + regexPrivateUse + ")?" + ")",
279
+ regexLanguageTag = "^(" + regexGrandfathered + "|" + regexLangtag + "|" + regexPrivateUse + ")$",
280
+ regex = new RegExp(regexLanguageTag), match;
281
+
282
+
283
+ if ((match = regex.exec(locale)) !== null) {
284
+ if (match.index === regex.lastIndex) {
285
+ regex.lastIndex++;
286
+ }
287
+ }
288
+
289
+ if (match === undefined || match === null) {
290
+ throw new Error('unsupported locale');
291
+ }
292
+
293
+ if (match[6] !== undefined) {
294
+ language = match[6];
295
+
296
+ parts = language.split('-');
297
+ if (parts.length > 1) {
298
+ language = parts[0];
299
+ extlang = parts[1];
300
+ }
301
+
302
+ }
303
+
304
+ if (match[14] !== undefined) {
305
+ region = match[14];
306
+ }
307
+
308
+ if (match[12] !== undefined) {
309
+ script = match[12];
310
+ }
311
+
312
+ if (match[16] !== undefined) {
313
+ variants = match[16];
314
+ }
315
+
316
+ return new Locale(language, region, script, variants, extlang);
317
+
318
+ }
319
+
320
+
321
+ assignToNamespace('Monster.I18n', Locale, parseLocale);
322
+ export {Monster, Locale, parseLocale}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * In this namespace you will find classes and methods for handling locale and localized texts.
5
+ *
6
+ * @namespace Monster/I18n
7
+ * @author schukai GmbH
8
+ */
9
+
10
+
11
+ /**
12
+ * @private
13
+ * @type {string}
14
+ */
15
+ const namespace = "Monster.I18n";
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @author schukai GmbH
5
+ */
6
+ import {Monster, assignToNamespace} from '../namespace.js';
7
+ import {BaseWithOptions} from "../types/basewithoptions.js";
8
+ import {Locale} from "./locale.js"
9
+ import {Translations} from "./translations.js"
10
+
11
+ /**
12
+ * A provider makes a translation object available.
13
+ *
14
+ * You can call the method via the monster namespace `new Monster.I18n.Provider()`.
15
+ *
16
+ * ```
17
+ * <script type="module">
18
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/provider.js';
19
+ * console.log(new Monster.I18n.Provider())
20
+ * </script>
21
+ * ```
22
+ *
23
+ * Alternatively, you can also integrate this function individually.
24
+ *
25
+ * ```
26
+ * <script type="module">
27
+ * import {Provider} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/provider.js';
28
+ * console.log(new Provider())
29
+ * </script>
30
+ * ```
31
+ *
32
+ * @since 1.13.0
33
+ * @copyright schukai GmbH
34
+ * @memberOf Monster/I18n
35
+ * @see https://datatracker.ietf.org/doc/html/rfc3066
36
+ */
37
+ class Provider extends BaseWithOptions {
38
+
39
+ /**
40
+ * @param {Locale|string} locale
41
+ * @return {Promise}
42
+ */
43
+ getTranslations(locale) {
44
+ return new Promise((resolve, reject) => {
45
+ try {
46
+ resolve(new Translations(locale));
47
+ } catch (e) {
48
+ reject(e);
49
+ }
50
+
51
+ });
52
+ }
53
+
54
+ }
55
+
56
+
57
+ assignToNamespace('Monster.I18n', Provider);
58
+ export {Monster, Provider}
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @author schukai GmbH
5
+ */
6
+ import {Monster, assignToNamespace} from '../../namespace.js';
7
+ import {Formatter} from "../../text/formatter.js";
8
+ import {getGlobalFunction} from "../../types/global.js";
9
+ import { validateObject, validateString} from "../../types/validate.js";
10
+ import {isString, isInstance} from "../../types/is.js";
11
+ import {parseLocale} from "../locale.js";
12
+ import {Provider} from "../provider.js";
13
+ import {PROPERTY_KEY_INTERNALDATA} from "../../constants.js";
14
+ import {Translations} from "../translations.js";
15
+ import {extend} from "../../data/extend.js";
16
+
17
+ /**
18
+ * @private
19
+ * @type {symbol}
20
+ */
21
+ const optionsSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
22
+
23
+ /**
24
+ * The fetch provider retrieves a JSON file from the given URL and returns a translation object.
25
+ *
26
+ * You can call the method via the monster namespace `new Monster.I18n.Provider()`.
27
+ *
28
+ * ```
29
+ * <script type="module">
30
+ * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/providers/fetch.js';
31
+ * console.log(new Monster.I18n.Providers.Fetch())
32
+ * </script>
33
+ * ```
34
+ *
35
+ * Alternatively, you can also integrate this function individually.
36
+ *
37
+ * ```
38
+ * <script type="module">
39
+ * import {Fetch} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.15.0/dist/modules/i18n/providers/fetch.js';
40
+ * console.log(new Fetch())
41
+ * </script>
42
+ * ```
43
+ *
44
+ * @since 1.13.0
45
+ * @copyright schukai GmbH
46
+ * @memberOf Monster/I18n/Providers
47
+ * @see https://datatracker.ietf.org/doc/html/rfc3066
48
+ */
49
+ class Fetch extends Provider {
50
+
51
+ /**
52
+ * As options the key `fetch` can be passed. This config object is passed to the fetch method as init.
53
+ *
54
+ * @param {string|URL} url
55
+ * @param {object} options
56
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/fetch
57
+ */
58
+ constructor(url, options) {
59
+ super(options);
60
+
61
+ if (isInstance(url, URL)) {
62
+ url = url.toString();
63
+ }
64
+
65
+ if (options === undefined) {
66
+ options = {};
67
+ }
68
+
69
+ validateString(url);
70
+
71
+ this.url = url;
72
+ this[optionsSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
73
+
74
+ }
75
+
76
+ /**
77
+ * Defaults
78
+ * @return {object}
79
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
80
+ */
81
+ get defaults() {
82
+
83
+ return {
84
+ fetch: {
85
+ method: 'GET', // *GET, POST, PUT, DELETE, etc.
86
+ mode: 'cors', // no-cors, *cors, same-origin
87
+ cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
88
+ credentials: 'omit', // include, *same-origin, omit
89
+ redirect: 'follow', // manual, *follow, error
90
+ referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
91
+ }
92
+ }
93
+
94
+ }
95
+
96
+ /**
97
+ *
98
+ * @param {Locale|string} locale
99
+ * @return {Promise}
100
+ */
101
+ getTranslations(locale) {
102
+
103
+ if (isString(locale)) {
104
+ locale = parseLocale(locale);
105
+ }
106
+
107
+ let formatter = new Formatter(locale.getMap())
108
+
109
+ return getGlobalFunction('fetch')(formatter.format(this.url), this.getOption('fetch', {}))
110
+ .then((response) => response.json()).then(data => {
111
+ return new Translations(locale).assignTranslations(data);
112
+ });
113
+
114
+ }
115
+
116
+
117
+ }
118
+
119
+
120
+ assignToNamespace('Monster.I18n.Providers', Fetch);
121
+ export {Monster, Fetch}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Namespace for different translation providers.
5
+ *
6
+ * @namespace Monster/I18n/Providers
7
+ * @author schukai GmbH
8
+ */
9
+
10
+
11
+ /**
12
+ * @private
13
+ * @type {string}
14
+ */
15
+ const namespace = "Monster.I18n.Providers";