@schukai/monster 1.22.0 → 1.26.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.
- package/CHANGELOG +56 -0
- package/README.md +4 -4
- package/dist/modules/constants.js +2 -2
- package/dist/modules/constraints/abstract.js +1 -1
- package/dist/modules/constraints/abstractoperator.js +1 -1
- package/dist/modules/constraints/andoperator.js +1 -1
- package/dist/modules/constraints/invalid.js +1 -1
- package/dist/modules/constraints/isarray.js +1 -1
- package/dist/modules/constraints/isobject.js +1 -1
- package/dist/modules/constraints/namespace.js +1 -1
- package/dist/modules/constraints/oroperator.js +1 -1
- package/dist/modules/constraints/valid.js +1 -1
- package/dist/modules/data/buildmap.js +2 -2
- package/dist/modules/data/buildtree.js +2 -0
- package/dist/modules/data/datasource/namespace.js +1 -1
- package/dist/modules/data/datasource/restapi/writeerror.js +2 -0
- package/dist/modules/data/datasource/restapi.js +2 -2
- package/dist/modules/data/datasource/storage/localstorage.js +2 -2
- package/dist/modules/data/datasource/storage/namespace.js +1 -1
- package/dist/modules/data/datasource/storage/sessionstorage.js +2 -2
- package/dist/modules/data/datasource/storage.js +2 -2
- package/dist/modules/data/datasource.js +2 -2
- package/dist/modules/data/diff.js +2 -2
- package/dist/modules/data/extend.js +1 -1
- package/dist/modules/data/namespace.js +1 -1
- package/dist/modules/data/pathfinder.js +2 -2
- package/dist/modules/data/pipe.js +1 -1
- package/dist/modules/data/transformer.js +2 -2
- package/dist/modules/dom/assembler.js +1 -1
- package/dist/modules/dom/attributes.js +1 -1
- package/dist/modules/dom/constants.js +2 -2
- package/dist/modules/dom/customcontrol.js +2 -2
- package/dist/modules/dom/customelement.js +2 -2
- package/dist/modules/dom/events.js +1 -1
- package/dist/modules/dom/focusmanager.js +2 -0
- package/dist/modules/dom/locale.js +1 -1
- package/dist/modules/dom/namespace.js +1 -1
- package/dist/modules/dom/resource/data.js +2 -0
- package/dist/modules/dom/resource/link/stylesheet.js +2 -0
- package/dist/modules/dom/resource/link.js +2 -0
- package/dist/modules/dom/resource/script.js +2 -0
- package/dist/modules/dom/resource.js +2 -0
- package/dist/modules/dom/resourcemanager.js +2 -0
- package/dist/modules/dom/template.js +1 -1
- package/dist/modules/dom/theme.js +1 -1
- package/dist/modules/dom/updater.js +2 -2
- package/dist/modules/dom/util.js +1 -1
- package/dist/modules/dom/worker/factory.js +2 -0
- package/dist/modules/i18n/formatter.js +2 -0
- package/dist/modules/i18n/locale.js +1 -1
- package/dist/modules/i18n/namespace.js +1 -1
- package/dist/modules/i18n/provider.js +1 -1
- package/dist/modules/i18n/providers/fetch.js +2 -2
- package/dist/modules/i18n/providers/namespace.js +1 -1
- package/dist/modules/i18n/translations.js +1 -1
- package/dist/modules/logging/handler/console.js +1 -1
- package/dist/modules/logging/handler/namespace.js +1 -1
- package/dist/modules/logging/handler.js +1 -1
- package/dist/modules/logging/logentry.js +1 -1
- package/dist/modules/logging/logger.js +1 -1
- package/dist/modules/logging/namespace.js +1 -1
- package/dist/modules/math/namespace.js +1 -1
- package/dist/modules/math/random.js +2 -2
- package/dist/modules/monster.js +1 -1
- package/dist/modules/namespace.js +1 -1
- package/dist/modules/text/formatter.js +2 -2
- package/dist/modules/text/namespace.js +1 -1
- package/dist/modules/types/base.js +1 -1
- package/dist/modules/types/basewithoptions.js +2 -2
- package/dist/modules/types/binary.js +1 -1
- package/dist/modules/types/dataurl.js +1 -1
- package/dist/modules/types/global.js +1 -1
- package/dist/modules/types/id.js +1 -1
- package/dist/modules/types/is.js +2 -2
- package/dist/modules/types/mediatype.js +1 -1
- package/dist/modules/types/namespace.js +1 -1
- package/dist/modules/types/node.js +2 -0
- package/dist/modules/types/nodelist.js +2 -0
- package/dist/modules/types/noderecursiveiterator.js +2 -0
- package/dist/modules/types/observer.js +1 -1
- package/dist/modules/types/observerlist.js +2 -2
- package/dist/modules/types/proxyobserver.js +2 -2
- package/dist/modules/types/queue.js +1 -1
- package/dist/modules/types/randomid.js +1 -1
- package/dist/modules/types/regex.js +2 -0
- package/dist/modules/types/stack.js +1 -1
- package/dist/modules/types/tokenlist.js +2 -2
- package/dist/modules/types/typeof.js +1 -1
- package/dist/modules/types/uniquequeue.js +1 -1
- package/dist/modules/types/uuid.js +2 -0
- package/dist/modules/types/validate.js +1 -1
- package/dist/modules/types/version.js +2 -2
- package/dist/modules/util/clone.js +2 -2
- package/dist/modules/util/comparator.js +2 -2
- package/dist/modules/util/freeze.js +1 -1
- package/dist/modules/util/namespace.js +1 -1
- package/dist/modules/util/processing.js +2 -2
- package/dist/modules/util/trimspaces.js +2 -0
- package/dist/monster.dev.js +1838 -792
- package/dist/monster.dev.js.map +1 -1
- package/dist/monster.js +2 -2
- package/package.json +13 -2
- package/source/constants.js +16 -7
- package/source/constraints/abstract.js +5 -0
- package/source/constraints/abstractoperator.js +5 -0
- package/source/constraints/andoperator.js +10 -5
- package/source/constraints/invalid.js +8 -3
- package/source/constraints/isarray.js +9 -4
- package/source/constraints/isobject.js +8 -3
- package/source/constraints/oroperator.js +10 -5
- package/source/constraints/valid.js +8 -3
- package/source/data/buildmap.js +27 -11
- package/source/data/buildtree.js +95 -0
- package/source/data/datasource/restapi/writeerror.js +49 -0
- package/source/data/datasource/restapi.js +95 -11
- package/source/data/datasource/storage/localstorage.js +15 -8
- package/source/data/datasource/storage/sessionstorage.js +16 -12
- package/source/data/datasource/storage.js +16 -7
- package/source/data/datasource.js +60 -16
- package/source/data/diff.js +8 -8
- package/source/data/extend.js +5 -5
- package/source/data/pathfinder.js +12 -6
- package/source/data/pipe.js +6 -5
- package/source/data/transformer.js +131 -24
- package/source/dom/assembler.js +2 -2
- package/source/dom/attributes.js +24 -24
- package/source/dom/constants.js +305 -12
- package/source/dom/customcontrol.js +40 -19
- package/source/dom/customelement.js +182 -102
- package/source/dom/events.js +6 -6
- package/source/dom/focusmanager.js +250 -0
- package/source/dom/locale.js +10 -5
- package/source/dom/resource/data.js +170 -0
- package/source/dom/resource/link/stylesheet.js +54 -0
- package/source/dom/resource/link.js +125 -0
- package/source/dom/resource/script.js +112 -0
- package/source/dom/resource.js +268 -0
- package/source/dom/resourcemanager.js +214 -0
- package/source/dom/template.js +40 -10
- package/source/dom/theme.js +3 -3
- package/source/dom/updater.js +115 -39
- package/source/dom/util.js +6 -6
- package/source/dom/worker/factory.js +134 -0
- package/source/i18n/formatter.js +140 -0
- package/source/i18n/locale.js +10 -8
- package/source/i18n/provider.js +4 -4
- package/source/i18n/providers/fetch.js +24 -14
- package/source/i18n/translations.js +20 -10
- package/source/logging/handler/console.js +2 -2
- package/source/logging/handler.js +2 -2
- package/source/logging/logentry.js +2 -2
- package/source/logging/logger.js +4 -4
- package/source/math/random.js +11 -5
- package/source/namespace.js +1 -1
- package/source/text/formatter.js +244 -27
- package/source/types/base.js +4 -4
- package/source/types/basewithoptions.js +10 -15
- package/source/types/binary.js +8 -8
- package/source/types/dataurl.js +6 -6
- package/source/types/global.js +9 -7
- package/source/types/id.js +6 -3
- package/source/types/is.js +103 -85
- package/source/types/mediatype.js +4 -4
- package/source/types/node.js +179 -0
- package/source/types/nodelist.js +125 -0
- package/source/types/noderecursiveiterator.js +126 -0
- package/source/types/observer.js +3 -3
- package/source/types/observerlist.js +3 -3
- package/source/types/proxyobserver.js +24 -7
- package/source/types/queue.js +6 -6
- package/source/types/randomid.js +2 -2
- package/source/types/regex.js +49 -0
- package/source/types/stack.js +2 -2
- package/source/types/tokenlist.js +8 -9
- package/source/types/typeof.js +3 -3
- package/source/types/uniquequeue.js +4 -4
- package/source/types/uuid.js +102 -0
- package/source/types/validate.js +20 -20
- package/source/types/version.js +6 -6
- package/source/util/clone.js +5 -6
- package/source/util/comparator.js +5 -5
- package/source/util/freeze.js +5 -5
- package/source/util/processing.js +33 -36
- package/source/util/trimspaces.js +85 -0
- package/test/cases/data/buildtree.js +149 -0
- package/test/cases/data/datasource/restapi.js +1 -1
- package/test/cases/data/datasource.js +4 -4
- package/test/cases/data/diff.js +4 -4
- package/test/cases/data/pathfinder.js +18 -9
- package/test/cases/data/pipe.js +26 -2
- package/test/cases/data/transformer.js +41 -10
- package/test/cases/dom/attributes.js +18 -14
- package/test/cases/dom/customcontrol.js +6 -5
- package/test/cases/dom/customelement.js +25 -26
- package/test/cases/dom/focusmanager.js +111 -0
- package/test/cases/dom/locale.js +1 -4
- package/test/cases/dom/resource/data.js +129 -0
- package/test/cases/dom/resource/link/stylesheet.js +101 -0
- package/test/cases/dom/resource/link.js +101 -0
- package/test/cases/dom/resource/script.js +115 -0
- package/test/cases/dom/resourcemanager.js +118 -0
- package/test/cases/dom/updater.js +42 -19
- package/test/cases/dom/worker/factory.js +63 -0
- package/test/cases/i18n/formatter.js +66 -0
- package/test/cases/monster.js +1 -1
- package/test/cases/text/formatter.js +71 -8
- package/test/cases/types/node.js +196 -0
- package/test/cases/types/nodelist.js +64 -0
- package/test/cases/types/noderecursiveiterator.js +54 -0
- package/test/cases/types/proxyobserver.js +55 -11
- package/test/cases/types/regex.js +32 -0
- package/test/cases/types/uuid.js +42 -0
- package/test/cases/util/freeze.js +30 -4
- package/test/cases/util/trimspaces.js +24 -0
- package/test/util/cleanupdom.js +48 -0
- package/test/util/jsdom.js +22 -9
- package/test/web/import.js +15 -0
- package/test/web/monster-dev.html +3 -3
- package/test/web/monster.html +2 -2
- package/test/web/test.html +3 -3
- package/test/web/tests.js +7 -7
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @author schukai GmbH
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {internalSymbol} from "../constants.js";
|
|
8
|
+
import {random} from "../math/random.js";
|
|
9
|
+
import {assignToNamespace, Monster} from "../namespace.js";
|
|
10
|
+
import {isObject} from '../types/is.js';
|
|
11
|
+
import {Base} from "./base.js";
|
|
12
|
+
import {getGlobalObject} from "./global.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This is the base class from which all monster classes are derived.
|
|
16
|
+
*
|
|
17
|
+
* You can create an object using the namespace:
|
|
18
|
+
*
|
|
19
|
+
* ```
|
|
20
|
+
* <script type="module">
|
|
21
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
22
|
+
* new Monster.Types.UUID()
|
|
23
|
+
* </script>
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* Or directly via the class:
|
|
27
|
+
*
|
|
28
|
+
* ```
|
|
29
|
+
* <script type="module">
|
|
30
|
+
* import {Base} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/uuid.js';
|
|
31
|
+
* new UUID()
|
|
32
|
+
* </script>
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @since 1.25.0
|
|
36
|
+
* @copyright schukai GmbH
|
|
37
|
+
* @memberOf Monster.Types
|
|
38
|
+
* @throws {Error} unsupported
|
|
39
|
+
*/
|
|
40
|
+
class UUID extends Base {
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
constructor() {
|
|
46
|
+
super();
|
|
47
|
+
|
|
48
|
+
let uuid = createWithCrypto();
|
|
49
|
+
|
|
50
|
+
if (uuid === undefined) {
|
|
51
|
+
uuid = createWithRandom();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if (uuid === undefined) {
|
|
56
|
+
throw new Error('unsupported')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
this[internalSymbol] = {
|
|
60
|
+
value: uuid
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* @return {string}
|
|
68
|
+
*/
|
|
69
|
+
toString() {
|
|
70
|
+
return this[internalSymbol]['value'];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @private
|
|
78
|
+
* @return {string|undefined}
|
|
79
|
+
*/
|
|
80
|
+
function createWithRandom() {
|
|
81
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
82
|
+
var r = random(0, 65000) * 16 | 0,
|
|
83
|
+
v = ((c === 'x') ? r : (r & 0x3 | 0x8));
|
|
84
|
+
return v.toString(16)[0];
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @private
|
|
91
|
+
* @return {string|undefined}
|
|
92
|
+
*/
|
|
93
|
+
function createWithCrypto() {
|
|
94
|
+
const crypt = getGlobalObject('crypto');
|
|
95
|
+
if (!isObject(crypt)) return;
|
|
96
|
+
if (typeof crypt?.['randomUUID']) return;
|
|
97
|
+
return crypt.randomUUID();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
assignToNamespace('Monster.Types', UUID);
|
|
102
|
+
export {Monster, UUID}
|
package/source/types/validate.js
CHANGED
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
*
|
|
26
26
|
* ```
|
|
27
27
|
* <script type="module">
|
|
28
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
28
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
29
29
|
* console.log(Monster.Types.validateIterable('2')) // ↦ TypeError
|
|
30
30
|
* console.log(Monster.Types.validateIterable([])) // ↦ value
|
|
31
31
|
* </script>
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
*
|
|
36
36
|
* ```
|
|
37
37
|
* <script type="module">
|
|
38
|
-
* import {validateIterable} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
38
|
+
* import {validateIterable} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
39
39
|
* console.log(validateIterable('2')) // ↦ TypeError
|
|
40
40
|
* console.log(validateIterable([])) // ↦ value
|
|
41
41
|
* </script>
|
|
@@ -65,7 +65,7 @@ function validateIterable(value) {
|
|
|
65
65
|
*
|
|
66
66
|
* ```
|
|
67
67
|
* <script type="module">
|
|
68
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
68
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
69
69
|
* console.log(Monster.Types.validatePrimitive('2')) // ↦ value
|
|
70
70
|
* console.log(Monster.Types.validatePrimitive([])) // ↦ TypeError
|
|
71
71
|
* </script>
|
|
@@ -75,7 +75,7 @@ function validateIterable(value) {
|
|
|
75
75
|
*
|
|
76
76
|
* ```
|
|
77
77
|
* <script type="module">
|
|
78
|
-
* import {validatePrimitive} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
78
|
+
* import {validatePrimitive} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
79
79
|
* console.log(validatePrimitive('2')) // ↦ value
|
|
80
80
|
* console.log(validatePrimitive([])) // ↦ TypeError
|
|
81
81
|
* </script>
|
|
@@ -105,7 +105,7 @@ function validatePrimitive(value) {
|
|
|
105
105
|
*
|
|
106
106
|
* ```
|
|
107
107
|
* <script type="module">
|
|
108
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
108
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
109
109
|
* console.log(Monster.Types.validateBoolean(true)) // ↦ value
|
|
110
110
|
* console.log(Monster.Types.validateBoolean('2')) // ↦ TypeError
|
|
111
111
|
* console.log(Monster.Types.validateBoolean([])) // ↦ TypeError
|
|
@@ -116,7 +116,7 @@ function validatePrimitive(value) {
|
|
|
116
116
|
*
|
|
117
117
|
* ```
|
|
118
118
|
* <script type="module">
|
|
119
|
-
* import {validateBoolean} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
119
|
+
* import {validateBoolean} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
120
120
|
* console.log(validateBoolean(false)) // ↦ value
|
|
121
121
|
* console.log(validateBoolean('2')) // ↦ TypeError
|
|
122
122
|
* console.log(validateBoolean([])) // ↦ TypeError
|
|
@@ -145,7 +145,7 @@ function validateBoolean(value) {
|
|
|
145
145
|
*
|
|
146
146
|
* ```
|
|
147
147
|
* <script type="module">
|
|
148
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
148
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
149
149
|
* console.log(Monster.Types.validateString('2')) // ↦ value
|
|
150
150
|
* console.log(Monster.Types.validateString([])) // ↦ TypeError
|
|
151
151
|
* </script>
|
|
@@ -155,7 +155,7 @@ function validateBoolean(value) {
|
|
|
155
155
|
*
|
|
156
156
|
* ```
|
|
157
157
|
* <script type="module">
|
|
158
|
-
* import {validateString} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
158
|
+
* import {validateString} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
159
159
|
* console.log(validateString('2')) // ↦ value
|
|
160
160
|
* console.log(validateString([])) // ↦ TypeError
|
|
161
161
|
* </script>
|
|
@@ -183,7 +183,7 @@ function validateString(value) {
|
|
|
183
183
|
*
|
|
184
184
|
* ```
|
|
185
185
|
* <script type="module">
|
|
186
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
186
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
187
187
|
* console.log(Monster.Types.validateObject({})) // ↦ value
|
|
188
188
|
* console.log(Monster.Types.validateObject('2')) // ↦ TypeError
|
|
189
189
|
* console.log(Monster.Types.validateObject([])) // ↦ TypeError
|
|
@@ -194,7 +194,7 @@ function validateString(value) {
|
|
|
194
194
|
*
|
|
195
195
|
* ```
|
|
196
196
|
* <script type="module">
|
|
197
|
-
* import {validateObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
197
|
+
* import {validateObject} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
198
198
|
* console.log(validateObject({})) // ↦ value
|
|
199
199
|
* console.log(validateObject('2')) // ↦ TypeError
|
|
200
200
|
* console.log(validateObject([])) // ↦ TypeError
|
|
@@ -222,7 +222,7 @@ function validateObject(value) {
|
|
|
222
222
|
*
|
|
223
223
|
* ```
|
|
224
224
|
* <script type="module">
|
|
225
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
225
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
226
226
|
* console.log(Monster.Types.validateInstance({}, Object)) // ↦ value
|
|
227
227
|
* console.log(Monster.Types.validateInstance('2', Object)) // ↦ TypeError
|
|
228
228
|
* console.log(Monster.Types.validateInstance([], Object)) // ↦ TypeError
|
|
@@ -233,7 +233,7 @@ function validateObject(value) {
|
|
|
233
233
|
*
|
|
234
234
|
* ```
|
|
235
235
|
* <script type="module">
|
|
236
|
-
* import {validateInstance} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
236
|
+
* import {validateInstance} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
237
237
|
* console.log(validateInstance({}, Object)) // ↦ value
|
|
238
238
|
* console.log(validateInstance('2', Object)) // ↦ TypeError
|
|
239
239
|
* console.log(validateInstance([], Object)) // ↦ TypeError
|
|
@@ -270,7 +270,7 @@ function validateInstance(value, instance) {
|
|
|
270
270
|
*
|
|
271
271
|
* ```
|
|
272
272
|
* <script type="module">
|
|
273
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
273
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
274
274
|
* console.log(Monster.Types.validateArray('2')) // ↦ TypeError
|
|
275
275
|
* console.log(Monster.Types.validateArray([])) // ↦ value
|
|
276
276
|
* </script>
|
|
@@ -280,7 +280,7 @@ function validateInstance(value, instance) {
|
|
|
280
280
|
*
|
|
281
281
|
* ```
|
|
282
282
|
* <script type="module">
|
|
283
|
-
* import {validateArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
283
|
+
* import {validateArray} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
284
284
|
* console.log(validateArray('2')) // ↦ TypeError
|
|
285
285
|
* console.log(validateArray([])) // ↦ value
|
|
286
286
|
* </script>
|
|
@@ -307,7 +307,7 @@ function validateArray(value) {
|
|
|
307
307
|
*
|
|
308
308
|
* ```
|
|
309
309
|
* <script type="module">
|
|
310
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
310
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
311
311
|
* console.log(Monster.Types.validateSymbol('2')) // ↦ TypeError
|
|
312
312
|
* console.log(Monster.Types.validateSymbol([])) // ↦ value
|
|
313
313
|
* </script>
|
|
@@ -317,7 +317,7 @@ function validateArray(value) {
|
|
|
317
317
|
*
|
|
318
318
|
* ```
|
|
319
319
|
* <script type="module">
|
|
320
|
-
* import {validateSymbol} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
320
|
+
* import {validateSymbol} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
321
321
|
* console.log(validateSymbol('2')) // ↦ TypeError
|
|
322
322
|
* console.log(validateSymbol()) // ↦ value
|
|
323
323
|
* </script>
|
|
@@ -344,7 +344,7 @@ function validateSymbol(value) {
|
|
|
344
344
|
*
|
|
345
345
|
* ```
|
|
346
346
|
* <script type="module">
|
|
347
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
347
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
348
348
|
* console.log(Monster.Types.validateFunction(()=>{})) // ↦ value
|
|
349
349
|
* console.log(Monster.Types.validateFunction('2')) // ↦ TypeError
|
|
350
350
|
* console.log(Monster.Types.validateFunction([])) // ↦ TypeError
|
|
@@ -355,7 +355,7 @@ function validateSymbol(value) {
|
|
|
355
355
|
*
|
|
356
356
|
* ```
|
|
357
357
|
* <script type="module">
|
|
358
|
-
* import {validateFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
358
|
+
* import {validateFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
359
359
|
* console.log(validateFunction(()=>{})) // ↦ value
|
|
360
360
|
* console.log(validateFunction('2')) // ↦ TypeError
|
|
361
361
|
* console.log(validateFunction([])) // ↦ TypeError
|
|
@@ -383,7 +383,7 @@ function validateFunction(value) {
|
|
|
383
383
|
*
|
|
384
384
|
* ```
|
|
385
385
|
* <script type="module">
|
|
386
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
386
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
387
387
|
* console.log(Monster.Types.validateInteger(true)) // ↦ TypeError
|
|
388
388
|
* console.log(Monster.Types.validateInteger('2')) // ↦ TypeError
|
|
389
389
|
* console.log(Monster.Types.validateInteger(2)) // ↦ value
|
|
@@ -394,7 +394,7 @@ function validateFunction(value) {
|
|
|
394
394
|
*
|
|
395
395
|
* ```
|
|
396
396
|
* <script type="module">
|
|
397
|
-
* import {validateFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
397
|
+
* import {validateFunction} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/validate.js';
|
|
398
398
|
* console.log(validateInteger(true)) // ↦ TypeError
|
|
399
399
|
* console.log(validateInteger('2')) // ↦ TypeError
|
|
400
400
|
* console.log(validateInteger(2)) // ↦ value
|
package/source/types/version.js
CHANGED
|
@@ -10,7 +10,7 @@ import {Base} from './base.js';
|
|
|
10
10
|
*
|
|
11
11
|
* ```
|
|
12
12
|
* <script type="module">
|
|
13
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
13
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
14
14
|
* console.log(new Monster.Types.Version('1.2.3')) // ↦ 1.2.3
|
|
15
15
|
* console.log(new Monster.Types.Version('1')) // ↦ 1.0.0
|
|
16
16
|
* </script>
|
|
@@ -20,7 +20,7 @@ import {Base} from './base.js';
|
|
|
20
20
|
*
|
|
21
21
|
* ```
|
|
22
22
|
* <script type="module">
|
|
23
|
-
* import {Version} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
23
|
+
* import {Version} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/version.js';
|
|
24
24
|
* console.log(new Version('1.2.3')) // ↦ 1.2.3
|
|
25
25
|
* console.log(new Version('1')) // ↦ 1.0.0
|
|
26
26
|
* </script>
|
|
@@ -28,7 +28,7 @@ import {Base} from './base.js';
|
|
|
28
28
|
*
|
|
29
29
|
* @example
|
|
30
30
|
*
|
|
31
|
-
* import {Version} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
31
|
+
* import {Version} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/version.js';
|
|
32
32
|
*
|
|
33
33
|
* new Version('1.0.0') // ↦ 1.0.0
|
|
34
34
|
* new Version(1) // ↦ 1.0.0
|
|
@@ -151,7 +151,7 @@ let monsterVersion;
|
|
|
151
151
|
*
|
|
152
152
|
* ```
|
|
153
153
|
* <script type="module">
|
|
154
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
154
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
155
155
|
* console.log(Monster.getVersion())
|
|
156
156
|
* </script>
|
|
157
157
|
* ```
|
|
@@ -160,7 +160,7 @@ let monsterVersion;
|
|
|
160
160
|
*
|
|
161
161
|
* ```
|
|
162
162
|
* <script type="module">
|
|
163
|
-
* import {getVersion} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
163
|
+
* import {getVersion} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/types/version.js';
|
|
164
164
|
* console.log(getVersion())
|
|
165
165
|
* </script>
|
|
166
166
|
* ```
|
|
@@ -176,7 +176,7 @@ function getVersion() {
|
|
|
176
176
|
return monsterVersion;
|
|
177
177
|
}
|
|
178
178
|
/**#@+ dont touch, replaced by make with package.json version */
|
|
179
|
-
monsterVersion = new Version('1.
|
|
179
|
+
monsterVersion = new Version('1.26.0')
|
|
180
180
|
/**#@-*/
|
|
181
181
|
|
|
182
182
|
return monsterVersion;
|
package/source/util/clone.js
CHANGED
|
@@ -24,8 +24,8 @@ import {validateObject} from "../types/validate.js";
|
|
|
24
24
|
*
|
|
25
25
|
* ```
|
|
26
26
|
* <script type="module">
|
|
27
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
28
|
-
*
|
|
27
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
28
|
+
* Monster.Util.clone({})
|
|
29
29
|
* </script>
|
|
30
30
|
* ```
|
|
31
31
|
*
|
|
@@ -33,14 +33,13 @@ import {validateObject} from "../types/validate.js";
|
|
|
33
33
|
*
|
|
34
34
|
* ```
|
|
35
35
|
* <script type="module">
|
|
36
|
-
* import {clone} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
37
|
-
*
|
|
36
|
+
* import {clone} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/clone.js';
|
|
37
|
+
* clone({})
|
|
38
38
|
* </script>
|
|
39
39
|
* ```
|
|
40
40
|
*
|
|
41
41
|
* @param {*} obj object to be cloned
|
|
42
42
|
* @returns {*}
|
|
43
|
-
*
|
|
44
43
|
* @since 1.0.0
|
|
45
44
|
* @memberOf Monster.Util
|
|
46
45
|
* @copyright schukai GmbH
|
|
@@ -146,7 +145,7 @@ function cloneObject(obj) {
|
|
|
146
145
|
continue;
|
|
147
146
|
}
|
|
148
147
|
|
|
149
|
-
if (
|
|
148
|
+
if (isPrimitive(obj[key])) {
|
|
150
149
|
copy[key] = obj[key];
|
|
151
150
|
continue;
|
|
152
151
|
}
|
|
@@ -12,8 +12,8 @@ import {isFunction} from '../types/is.js';
|
|
|
12
12
|
*
|
|
13
13
|
* ```
|
|
14
14
|
* <script type="module">
|
|
15
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
16
|
-
*
|
|
15
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
16
|
+
* new Monster.Util.Comparator()
|
|
17
17
|
* </script>
|
|
18
18
|
* ```
|
|
19
19
|
*
|
|
@@ -21,7 +21,7 @@ import {isFunction} from '../types/is.js';
|
|
|
21
21
|
*
|
|
22
22
|
* ```
|
|
23
23
|
* <script type="module">
|
|
24
|
-
* import {Comparator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
24
|
+
* import {Comparator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/comparator.js';
|
|
25
25
|
* console.log(new Comparator())
|
|
26
26
|
* </script>
|
|
27
27
|
* ```
|
|
@@ -46,7 +46,7 @@ import {isFunction} from '../types/is.js';
|
|
|
46
46
|
*
|
|
47
47
|
* @example
|
|
48
48
|
*
|
|
49
|
-
* import {Comparator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
49
|
+
* import {Comparator} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/comparator.js';
|
|
50
50
|
*
|
|
51
51
|
* console.log(new Comparator().lessThanOrEqual(2, 5))
|
|
52
52
|
* // ↦ true
|
|
@@ -88,7 +88,7 @@ class Comparator extends Base {
|
|
|
88
88
|
this.compare = function (a, b) {
|
|
89
89
|
|
|
90
90
|
if (typeof a !== typeof b) {
|
|
91
|
-
throw new TypeError("impractical comparison")
|
|
91
|
+
throw new TypeError("impractical comparison", "types/comparator.js")
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
if (a === b) {
|
package/source/util/freeze.js
CHANGED
|
@@ -14,8 +14,8 @@ import {validateObject} 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.
|
|
18
|
-
*
|
|
17
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
18
|
+
* Monster.Util.deepFreeze({})
|
|
19
19
|
* </script>
|
|
20
20
|
* ```
|
|
21
21
|
*
|
|
@@ -23,8 +23,8 @@ import {validateObject} from '../types/validate.js';
|
|
|
23
23
|
*
|
|
24
24
|
* ```
|
|
25
25
|
* <script type="module">
|
|
26
|
-
* import {deepFreeze} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
27
|
-
*
|
|
26
|
+
* import {deepFreeze} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/freeze.js';
|
|
27
|
+
* deepFreeze({})
|
|
28
28
|
* </script>
|
|
29
29
|
* ```
|
|
30
30
|
*
|
|
@@ -46,7 +46,7 @@ function deepFreeze(object) {
|
|
|
46
46
|
for (let name of propNames) {
|
|
47
47
|
let value = object[name];
|
|
48
48
|
|
|
49
|
-
object[name] = value && typeof value === "object" ?
|
|
49
|
+
object[name] = (value && typeof value === "object") ?
|
|
50
50
|
deepFreeze(value) : value;
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* @author schukai GmbH
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import {internalSymbol} from "../constants.js";
|
|
8
9
|
import {assignToNamespace, Monster} from '../namespace.js';
|
|
9
10
|
import {Base} from "../types/base.js";
|
|
10
11
|
import {getGlobalFunction} from "../types/global.js";
|
|
@@ -13,12 +14,6 @@ import {Queue} from "../types/queue.js";
|
|
|
13
14
|
import {validateFunction, validateInteger} from "../types/validate.js";
|
|
14
15
|
|
|
15
16
|
|
|
16
|
-
/**
|
|
17
|
-
* @private
|
|
18
|
-
* @type {symbol}
|
|
19
|
-
*/
|
|
20
|
-
const internalDataSymbol = Symbol.for(PROPERTY_KEY_INTERNALDATA);
|
|
21
|
-
|
|
22
17
|
/**
|
|
23
18
|
* @private
|
|
24
19
|
*/
|
|
@@ -27,13 +22,13 @@ class Callback {
|
|
|
27
22
|
/**
|
|
28
23
|
*
|
|
29
24
|
* @param {function} callback
|
|
30
|
-
* @param {
|
|
25
|
+
* @param {int|undefined} time
|
|
31
26
|
* @throws {TypeError} value is not a function
|
|
32
27
|
* @throws {TypeError} value is not an integer
|
|
33
28
|
* @private
|
|
34
29
|
*/
|
|
35
30
|
constructor(callback, time) {
|
|
36
|
-
this[
|
|
31
|
+
this[internalSymbol] = {
|
|
37
32
|
callback: validateFunction(callback),
|
|
38
33
|
time: validateInteger(time ?? 0)
|
|
39
34
|
};
|
|
@@ -50,13 +45,13 @@ class Callback {
|
|
|
50
45
|
|
|
51
46
|
getGlobalFunction('setTimeout')(() => {
|
|
52
47
|
try {
|
|
53
|
-
resolve(self[
|
|
48
|
+
resolve(self[internalSymbol].callback(data));
|
|
54
49
|
} catch (e) {
|
|
55
50
|
reject(e);
|
|
56
51
|
}
|
|
57
52
|
|
|
58
53
|
},
|
|
59
|
-
self[
|
|
54
|
+
self[internalSymbol].time);
|
|
60
55
|
|
|
61
56
|
|
|
62
57
|
})
|
|
@@ -65,7 +60,7 @@ class Callback {
|
|
|
65
60
|
}
|
|
66
61
|
|
|
67
62
|
/**
|
|
68
|
-
* This class allows to execute several functions in order.
|
|
63
|
+
* This class allows to execute several functions in order.
|
|
69
64
|
*
|
|
70
65
|
* Functions and timeouts can be passed. If a timeout is passed, it applies to all further functions.
|
|
71
66
|
* In the example
|
|
@@ -75,14 +70,14 @@ class Callback {
|
|
|
75
70
|
* the timeout1 is valid for the functions 1, 2 and 3 and the timeout2 for the function4.
|
|
76
71
|
*
|
|
77
72
|
* So the execution time is timeout1+timeout1+timeout1+timeout2
|
|
78
|
-
*
|
|
73
|
+
*
|
|
79
74
|
* The result of `run()` is a promise.
|
|
80
|
-
*
|
|
75
|
+
*
|
|
81
76
|
* You can create an instance via the monster namespace `Monster.Util.Processing()`.
|
|
82
77
|
*
|
|
83
78
|
* ```
|
|
84
79
|
* <script type="module">
|
|
85
|
-
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
80
|
+
* import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/monster.js';
|
|
86
81
|
* new Monster.Util.Processing()
|
|
87
82
|
* </script>
|
|
88
83
|
* ```
|
|
@@ -91,16 +86,16 @@ class Callback {
|
|
|
91
86
|
*
|
|
92
87
|
* ```
|
|
93
88
|
* <script type="module">
|
|
94
|
-
* import {Processing} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
89
|
+
* import {Processing} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/processing.js';
|
|
95
90
|
* new Processing();
|
|
96
91
|
* </script>
|
|
97
92
|
* ```
|
|
98
93
|
*
|
|
99
94
|
* @example
|
|
100
|
-
* import {Processing} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.
|
|
101
|
-
*
|
|
95
|
+
* import {Processing} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.26.0/dist/modules/util/processing.js';
|
|
96
|
+
*
|
|
102
97
|
* let startTime = +new Date();
|
|
103
|
-
*
|
|
98
|
+
*
|
|
104
99
|
* new Processing((url)=>{
|
|
105
100
|
* return fetch(url)
|
|
106
101
|
* },(response)=>{
|
|
@@ -109,10 +104,12 @@ class Callback {
|
|
|
109
104
|
* },200,()=>{
|
|
110
105
|
* // this function is called 200 seconds after fetch is received.
|
|
111
106
|
* console.log('finished', +new Date()-startTime)
|
|
107
|
+
* return 'done'
|
|
112
108
|
* }).run('https://monsterjs.org/assets/world.json').then(r=>{
|
|
113
109
|
* console.log(r)
|
|
110
|
+
* // ↦ "done"
|
|
114
111
|
* })
|
|
115
|
-
*
|
|
112
|
+
*
|
|
116
113
|
* @copyright schukai GmbH
|
|
117
114
|
* @since 1.21.0
|
|
118
115
|
* @memberOf Monster.Util
|
|
@@ -122,24 +119,24 @@ class Processing extends Base {
|
|
|
122
119
|
|
|
123
120
|
/**
|
|
124
121
|
* Create new Processing
|
|
125
|
-
*
|
|
122
|
+
*
|
|
126
123
|
* Functions and timeouts can be passed. If a timeout is passed, it applies to all further functions.
|
|
127
|
-
* In the example
|
|
128
|
-
*
|
|
129
|
-
* `timeout1, function1, function2, function3, timeout2, function4`
|
|
130
|
-
*
|
|
124
|
+
* In the example
|
|
125
|
+
*
|
|
126
|
+
* `timeout1, function1, function2, function3, timeout2, function4`
|
|
127
|
+
*
|
|
131
128
|
* the timeout1 is valid for the functions 1, 2 and 3 and the timeout2 for the function4.
|
|
132
|
-
*
|
|
129
|
+
*
|
|
133
130
|
* So the execution time is timeout1+timeout1+timeout1+timeout2
|
|
134
|
-
*
|
|
135
|
-
* @param {
|
|
131
|
+
*
|
|
132
|
+
* @param {int} timeout Timeout
|
|
136
133
|
* @param {function} callback Callback
|
|
137
134
|
* @throw {TypeError} the arguments must be either integer or functions
|
|
138
135
|
*/
|
|
139
136
|
constructor() {
|
|
140
137
|
super();
|
|
141
138
|
|
|
142
|
-
this[
|
|
139
|
+
this[internalSymbol] = {
|
|
143
140
|
queue: new Queue
|
|
144
141
|
};
|
|
145
142
|
|
|
@@ -149,7 +146,7 @@ class Processing extends Base {
|
|
|
149
146
|
if (isInteger(arg) && arg >= 0) {
|
|
150
147
|
time = arg;
|
|
151
148
|
} else if (isFunction(arg)) {
|
|
152
|
-
this[
|
|
149
|
+
this[internalSymbol].queue.add(new Callback(arg, time))
|
|
153
150
|
} else {
|
|
154
151
|
throw new TypeError('the arguments must be either integer or functions')
|
|
155
152
|
}
|
|
@@ -163,29 +160,29 @@ class Processing extends Base {
|
|
|
163
160
|
* If no timeout is specified, the timeout of the previous function is used.
|
|
164
161
|
*
|
|
165
162
|
* @param {function} callback
|
|
166
|
-
* @param {
|
|
163
|
+
* @param {int|undefined} time
|
|
167
164
|
* @throws {TypeError} value is not a function
|
|
168
165
|
* @throws {TypeError} value is not an integer
|
|
169
166
|
*/
|
|
170
167
|
add(callback, time) {
|
|
171
|
-
this[
|
|
168
|
+
this[internalSymbol].queue.add(new Callback(callback, time))
|
|
172
169
|
return this;
|
|
173
170
|
}
|
|
174
171
|
|
|
175
172
|
|
|
176
173
|
/**
|
|
177
174
|
* Executes the defined functions in order.
|
|
178
|
-
*
|
|
175
|
+
*
|
|
179
176
|
* @param {*} data
|
|
180
177
|
* @return {Promise}
|
|
181
178
|
*/
|
|
182
179
|
run(data) {
|
|
183
180
|
const self = this;
|
|
184
|
-
if (this[
|
|
181
|
+
if (this[internalSymbol].queue.isEmpty()) {
|
|
185
182
|
return Promise.resolve(data);
|
|
186
183
|
}
|
|
187
|
-
|
|
188
|
-
|
|
184
|
+
|
|
185
|
+
return this[internalSymbol].queue.poll().run(data).then((result) => {
|
|
189
186
|
return self.run(result);
|
|
190
187
|
});
|
|
191
188
|
|