@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.
- package/example/i18n/providers/embed.mjs +5 -0
- package/package.json +1 -1
- package/source/constants.mjs +4 -9
- package/source/constraints/abstract.mjs +4 -6
- package/source/constraints/abstractoperator.mjs +6 -12
- package/source/constraints/andoperator.mjs +3 -6
- package/source/constraints/invalid.mjs +3 -6
- package/source/constraints/isarray.mjs +6 -9
- package/source/constraints/isobject.mjs +4 -7
- package/source/constraints/namespace.mjs +1 -3
- package/source/constraints/oroperator.mjs +26 -25
- package/source/constraints/valid.mjs +3 -6
- package/source/data/buildmap.mjs +20 -36
- package/source/data/buildtree.mjs +29 -29
- package/source/data/datasource/namespace.mjs +1 -1
- package/source/data/datasource/server/restapi/writeerror.mjs +6 -6
- package/source/data/datasource/server/restapi.mjs +51 -65
- package/source/data/datasource/server/webconnect.mjs +26 -35
- package/source/data/datasource/server.mjs +17 -21
- package/source/data/datasource/storage/localstorage.mjs +8 -11
- package/source/data/datasource/storage/sessionstorage.mjs +8 -10
- package/source/data/datasource/storage.mjs +18 -22
- package/source/data/datasource.mjs +27 -43
- package/source/data/diff.mjs +20 -32
- package/source/data/extend.mjs +20 -14
- package/source/data/namespace.mjs +1 -3
- package/source/data/pathfinder.mjs +40 -67
- package/source/data/pipe.mjs +6 -10
- package/source/data/transformer.mjs +141 -157
- package/source/dom/assembler.mjs +6 -9
- package/source/dom/attributes.mjs +36 -48
- package/source/dom/constants.mjs +55 -71
- package/source/dom/customcontrol.mjs +16 -21
- package/source/dom/customelement.mjs +140 -164
- package/source/dom/events.mjs +17 -24
- package/source/dom/focusmanager.mjs +30 -48
- package/source/dom/locale.mjs +41 -10
- package/source/dom/namespace.mjs +1 -1
- package/source/dom/ready.mjs +7 -10
- package/source/dom/resource/data.mjs +38 -46
- package/source/dom/resource/link/namespace.mjs +1 -3
- package/source/dom/resource/link/stylesheet.mjs +7 -11
- package/source/dom/resource/link.mjs +36 -17
- package/source/dom/resource/namespace.mjs +1 -1
- package/source/dom/resource/script.mjs +23 -13
- package/source/dom/resource.mjs +47 -60
- package/source/dom/resourcemanager.mjs +36 -43
- package/source/dom/template.mjs +17 -24
- package/source/dom/theme.mjs +8 -12
- package/source/dom/updater.mjs +150 -196
- package/source/dom/util.mjs +11 -12
- package/source/dom/worker/factory.mjs +21 -25
- package/source/dom/worker/namespace.mjs +1 -1
- package/source/i18n/formatter.mjs +20 -24
- package/source/i18n/locale.mjs +40 -42
- package/source/i18n/namespace.mjs +1 -1
- package/source/i18n/provider.mjs +4 -7
- package/source/i18n/providers/embed.mjs +115 -0
- package/source/i18n/providers/fetch.mjs +33 -38
- package/source/i18n/translations.mjs +16 -20
- package/source/logging/handler/console.mjs +6 -10
- package/source/logging/handler.mjs +15 -18
- package/source/logging/logentry.mjs +8 -9
- package/source/logging/logger.mjs +73 -55
- package/source/logging/namespace.mjs +1 -1
- package/source/math/namespace.mjs +1 -1
- package/source/math/random.mjs +13 -14
- package/source/monster.mjs +132 -100
- package/source/net/namespace.mjs +1 -3
- package/source/net/webconnect/message.mjs +6 -8
- package/source/net/webconnect/namespace.mjs +1 -3
- package/source/net/webconnect.mjs +28 -39
- package/source/text/formatter.mjs +44 -55
- package/source/types/base.mjs +16 -26
- package/source/types/basewithoptions.mjs +8 -14
- package/source/types/binary.mjs +4 -5
- package/source/types/dataurl.mjs +19 -27
- package/source/types/global.mjs +14 -26
- package/source/types/id.mjs +4 -6
- package/source/types/is.mjs +11 -16
- package/source/types/mediatype.mjs +29 -44
- package/source/types/namespace.mjs +0 -1
- package/source/types/node.mjs +16 -22
- package/source/types/nodelist.mjs +10 -14
- package/source/types/noderecursiveiterator.mjs +11 -14
- package/source/types/observablequeue.mjs +13 -16
- package/source/types/observer.mjs +16 -23
- package/source/types/observerlist.mjs +18 -21
- package/source/types/proxyobserver.mjs +24 -37
- package/source/types/queue.mjs +8 -13
- package/source/types/randomid.mjs +10 -10
- package/source/types/regex.mjs +3 -5
- package/source/types/stack.mjs +4 -8
- package/source/types/tokenlist.mjs +24 -31
- package/source/types/typeof.mjs +5 -7
- package/source/types/uniquequeue.mjs +8 -13
- package/source/types/uuid.mjs +18 -25
- package/source/types/validate.mjs +26 -27
- package/source/types/version.mjs +17 -25
- package/source/util/clone.mjs +23 -32
- package/source/util/comparator.mjs +7 -15
- package/source/util/deadmansswitch.mjs +16 -23
- package/source/util/freeze.mjs +5 -7
- package/source/util/namespace.mjs +1 -1
- package/source/util/processing.mjs +33 -39
- package/source/util/trimspaces.mjs +17 -24
- package/test/cases/dom/locale.mjs +15 -0
- package/test/cases/i18n/providers/embed.mjs +72 -0
- package/test/cases/monster.mjs +1 -1
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {internalSymbol,instanceSymbol} from "../../constants.mjs";
|
|
9
|
-
import {validateString} from "../../types/validate.mjs";
|
|
10
|
-
import {Datasource} from "../datasource.mjs";
|
|
8
|
+
import { internalSymbol, instanceSymbol } from "../../constants.mjs";
|
|
9
|
+
import { validateString } from "../../types/validate.mjs";
|
|
10
|
+
import { Datasource } from "../datasource.mjs";
|
|
11
11
|
|
|
12
|
-
export {Storage, storageObjectSymbol}
|
|
12
|
+
export { Storage, storageObjectSymbol };
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @private
|
|
16
16
|
* @type {symbol}
|
|
17
17
|
*/
|
|
18
|
-
const storageObjectSymbol = Symbol.for
|
|
18
|
+
const storageObjectSymbol = Symbol.for("@schukai/monster/data/datasource/storage/@@storageObject");
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* The class represents a record.
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* @license AGPLv3
|
|
24
24
|
* @since 1.22.0
|
|
25
25
|
* @copyright schukai GmbH
|
|
@@ -27,7 +27,6 @@ const storageObjectSymbol = Symbol.for ('@schukai/monster/data/datasource/stora
|
|
|
27
27
|
* @summary The Storage class encapsulates the access to data objects over WebStorageAPI.
|
|
28
28
|
*/
|
|
29
29
|
class Storage extends Datasource {
|
|
30
|
-
|
|
31
30
|
/**
|
|
32
31
|
*
|
|
33
32
|
* @param {string} key LocalStorage Key
|
|
@@ -35,7 +34,7 @@ class Storage extends Datasource {
|
|
|
35
34
|
*/
|
|
36
35
|
constructor(key) {
|
|
37
36
|
super();
|
|
38
|
-
this.setOption(
|
|
37
|
+
this.setOption("key", validateString(key));
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
/**
|
|
@@ -45,7 +44,7 @@ class Storage extends Datasource {
|
|
|
45
44
|
*/
|
|
46
45
|
static get [instanceSymbol]() {
|
|
47
46
|
return Symbol.for("@schukai/monster/data/datasource/storage");
|
|
48
|
-
}
|
|
47
|
+
}
|
|
49
48
|
|
|
50
49
|
/**
|
|
51
50
|
* @property {string} key=undefined LocalStorage Key
|
|
@@ -62,7 +61,7 @@ class Storage extends Datasource {
|
|
|
62
61
|
* @private
|
|
63
62
|
*/
|
|
64
63
|
[storageObjectSymbol]() {
|
|
65
|
-
throw new Error("this method must be implemented by derived classes")
|
|
64
|
+
throw new Error("this method must be implemented by derived classes");
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
/**
|
|
@@ -77,11 +76,10 @@ class Storage extends Datasource {
|
|
|
77
76
|
const storage = self[storageObjectSymbol]();
|
|
78
77
|
|
|
79
78
|
return new Promise(function (resolve) {
|
|
80
|
-
const data = JSON.parse(storage.getItem(self.getOption(
|
|
81
|
-
self.set(data??{});
|
|
79
|
+
const data = JSON.parse(storage.getItem(self.getOption("key")));
|
|
80
|
+
self.set(data ?? {});
|
|
82
81
|
resolve();
|
|
83
|
-
})
|
|
84
|
-
|
|
82
|
+
});
|
|
85
83
|
}
|
|
86
84
|
|
|
87
85
|
/**
|
|
@@ -94,24 +92,22 @@ class Storage extends Datasource {
|
|
|
94
92
|
const storage = self[storageObjectSymbol]();
|
|
95
93
|
|
|
96
94
|
return new Promise(function (resolve) {
|
|
97
|
-
|
|
98
95
|
const data = self.get();
|
|
99
96
|
if (data === undefined) {
|
|
100
|
-
storage.removeItem(self.getOption(
|
|
97
|
+
storage.removeItem(self.getOption("key"));
|
|
101
98
|
} else {
|
|
102
|
-
storage.setItem(self.getOption(
|
|
99
|
+
storage.setItem(self.getOption("key"), JSON.stringify(data));
|
|
103
100
|
}
|
|
104
101
|
|
|
105
102
|
resolve();
|
|
106
|
-
})
|
|
103
|
+
});
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
/**
|
|
110
107
|
* @return {Storage}
|
|
111
108
|
*/
|
|
112
109
|
getClone() {
|
|
113
|
-
const self=this;
|
|
114
|
-
return new Storage(self[internalSymbol].getRealSubject()[
|
|
115
|
-
}
|
|
116
|
-
|
|
110
|
+
const self = this;
|
|
111
|
+
return new Storage(self[internalSymbol].getRealSubject()["options"].key);
|
|
112
|
+
}
|
|
117
113
|
}
|
|
@@ -5,18 +5,17 @@
|
|
|
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 {instanceSymbol} from
|
|
10
|
-
import {Base} from "../types/base.mjs";
|
|
11
|
-
import {parseDataURL} from "../types/dataurl.mjs";
|
|
12
|
-
import {isString} from "../types/is.mjs";
|
|
13
|
-
import {ProxyObserver} from "../types/proxyobserver.mjs";
|
|
14
|
-
import {validateObject} from "../types/validate.mjs";
|
|
15
|
-
import {extend} from "./extend.mjs";
|
|
16
|
-
import {Pathfinder} from "./pathfinder.mjs";
|
|
17
|
-
|
|
18
|
-
export {Datasource}
|
|
19
|
-
|
|
8
|
+
import { internalSymbol } from "../constants.mjs";
|
|
9
|
+
import { instanceSymbol } from "../constants.mjs";
|
|
10
|
+
import { Base } from "../types/base.mjs";
|
|
11
|
+
import { parseDataURL } from "../types/dataurl.mjs";
|
|
12
|
+
import { isString } from "../types/is.mjs";
|
|
13
|
+
import { ProxyObserver } from "../types/proxyobserver.mjs";
|
|
14
|
+
import { validateObject } from "../types/validate.mjs";
|
|
15
|
+
import { extend } from "./extend.mjs";
|
|
16
|
+
import { Pathfinder } from "./pathfinder.mjs";
|
|
17
|
+
|
|
18
|
+
export { Datasource };
|
|
20
19
|
|
|
21
20
|
/**
|
|
22
21
|
* This callback can be passed to a datasource and is used to adapt data structures.
|
|
@@ -28,7 +27,6 @@ export {Datasource}
|
|
|
28
27
|
* @see Monster.Data.Datasource
|
|
29
28
|
*/
|
|
30
29
|
|
|
31
|
-
|
|
32
30
|
/**
|
|
33
31
|
* @private
|
|
34
32
|
* @type {symbol}
|
|
@@ -36,7 +34,7 @@ export {Datasource}
|
|
|
36
34
|
* @license AGPLv3
|
|
37
35
|
* @since 1.24.0
|
|
38
36
|
*/
|
|
39
|
-
const internalDataSymbol = Symbol.for(
|
|
37
|
+
const internalDataSymbol = Symbol.for("@schukai/monster/data/datasource/@@data");
|
|
40
38
|
|
|
41
39
|
/**
|
|
42
40
|
* The datasource class is the basis for dealing with different data sources.
|
|
@@ -49,22 +47,17 @@ const internalDataSymbol = Symbol.for('@schukai/monster/data/datasource/@@data')
|
|
|
49
47
|
* @summary The datasource class encapsulates the access to data objects.
|
|
50
48
|
*/
|
|
51
49
|
class Datasource extends Base {
|
|
52
|
-
|
|
53
50
|
/**
|
|
54
51
|
* creates a new datasource
|
|
55
|
-
*
|
|
52
|
+
*
|
|
56
53
|
*/
|
|
57
54
|
constructor() {
|
|
58
55
|
super();
|
|
59
56
|
this[internalSymbol] = new ProxyObserver({
|
|
60
|
-
|
|
57
|
+
options: extend({}, this.defaults),
|
|
61
58
|
});
|
|
62
|
-
|
|
63
|
-
this[internalDataSymbol] = new ProxyObserver({
|
|
64
59
|
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
this[internalDataSymbol] = new ProxyObserver({});
|
|
68
61
|
}
|
|
69
62
|
|
|
70
63
|
/**
|
|
@@ -74,7 +67,7 @@ class Datasource extends Base {
|
|
|
74
67
|
* @returns {Datasource}
|
|
75
68
|
*/
|
|
76
69
|
attachObserver(observer) {
|
|
77
|
-
this[internalDataSymbol].attachObserver(observer)
|
|
70
|
+
this[internalDataSymbol].attachObserver(observer);
|
|
78
71
|
return this;
|
|
79
72
|
}
|
|
80
73
|
|
|
@@ -85,7 +78,7 @@ class Datasource extends Base {
|
|
|
85
78
|
* @returns {Datasource}
|
|
86
79
|
*/
|
|
87
80
|
detachObserver(observer) {
|
|
88
|
-
this[internalDataSymbol].detachObserver(observer)
|
|
81
|
+
this[internalDataSymbol].detachObserver(observer);
|
|
89
82
|
return this;
|
|
90
83
|
}
|
|
91
84
|
|
|
@@ -120,7 +113,7 @@ class Datasource extends Base {
|
|
|
120
113
|
* @return {Datasource}
|
|
121
114
|
*/
|
|
122
115
|
setOption(path, value) {
|
|
123
|
-
new Pathfinder(this[internalSymbol].getSubject()[
|
|
116
|
+
new Pathfinder(this[internalSymbol].getSubject()["options"]).setVia(path, value);
|
|
124
117
|
return this;
|
|
125
118
|
}
|
|
126
119
|
|
|
@@ -130,13 +123,12 @@ class Datasource extends Base {
|
|
|
130
123
|
* @throws {Error} the options does not contain a valid json definition
|
|
131
124
|
*/
|
|
132
125
|
setOptions(options) {
|
|
133
|
-
|
|
134
126
|
if (isString(options)) {
|
|
135
|
-
options = parseOptionsJSON(options)
|
|
127
|
+
options = parseOptionsJSON(options);
|
|
136
128
|
}
|
|
137
129
|
|
|
138
130
|
const self = this;
|
|
139
|
-
extend(self[internalSymbol].getSubject()[
|
|
131
|
+
extend(self[internalSymbol].getSubject()["options"], self.defaults, options);
|
|
140
132
|
|
|
141
133
|
return self;
|
|
142
134
|
}
|
|
@@ -152,10 +144,8 @@ class Datasource extends Base {
|
|
|
152
144
|
let value;
|
|
153
145
|
|
|
154
146
|
try {
|
|
155
|
-
value = new Pathfinder(this[internalSymbol].getRealSubject()[
|
|
156
|
-
} catch (e) {
|
|
157
|
-
|
|
158
|
-
}
|
|
147
|
+
value = new Pathfinder(this[internalSymbol].getRealSubject()["options"]).getVia(path);
|
|
148
|
+
} catch (e) {}
|
|
159
149
|
|
|
160
150
|
if (value === undefined) return defaultValue;
|
|
161
151
|
return value;
|
|
@@ -166,7 +156,7 @@ class Datasource extends Base {
|
|
|
166
156
|
* @return {Promise}
|
|
167
157
|
*/
|
|
168
158
|
read() {
|
|
169
|
-
throw new Error("this method must be implemented by derived classes")
|
|
159
|
+
throw new Error("this method must be implemented by derived classes");
|
|
170
160
|
}
|
|
171
161
|
|
|
172
162
|
/**
|
|
@@ -174,13 +164,12 @@ class Datasource extends Base {
|
|
|
174
164
|
* @return {Promise}
|
|
175
165
|
*/
|
|
176
166
|
write() {
|
|
177
|
-
throw new Error("this method must be implemented by derived classes")
|
|
167
|
+
throw new Error("this method must be implemented by derived classes");
|
|
178
168
|
}
|
|
179
169
|
|
|
180
|
-
|
|
181
170
|
/**
|
|
182
171
|
* Returns real object
|
|
183
|
-
*
|
|
172
|
+
*
|
|
184
173
|
* @return {Object|Array}
|
|
185
174
|
*/
|
|
186
175
|
get() {
|
|
@@ -206,7 +195,6 @@ class Datasource extends Base {
|
|
|
206
195
|
static get [instanceSymbol]() {
|
|
207
196
|
return Symbol.for("@schukai/monster/data/datasource");
|
|
208
197
|
}
|
|
209
|
-
|
|
210
198
|
}
|
|
211
199
|
|
|
212
200
|
/**
|
|
@@ -217,22 +205,18 @@ class Datasource extends Base {
|
|
|
217
205
|
*/
|
|
218
206
|
function parseOptionsJSON(data) {
|
|
219
207
|
if (isString(data)) {
|
|
220
|
-
|
|
221
208
|
// the configuration can be specified as a data url.
|
|
222
209
|
try {
|
|
223
210
|
let dataUrl = parseDataURL(data);
|
|
224
211
|
data = dataUrl.content;
|
|
225
|
-
} catch (e) {
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
|
|
212
|
+
} catch (e) {}
|
|
229
213
|
|
|
230
214
|
try {
|
|
231
215
|
let obj = JSON.parse(data);
|
|
232
216
|
validateObject(obj);
|
|
233
217
|
return obj;
|
|
234
218
|
} catch (e) {
|
|
235
|
-
throw new Error(
|
|
219
|
+
throw new Error(`the options does not contain a valid json definition (actual: ${data}).`);
|
|
236
220
|
}
|
|
237
221
|
}
|
|
238
222
|
|
package/source/data/diff.mjs
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {isArray, isObject} from "../types/is.mjs";
|
|
9
|
-
import {typeOf} from "../types/typeof.mjs";
|
|
8
|
+
import { isArray, isObject } from "../types/is.mjs";
|
|
9
|
+
import { typeOf } from "../types/typeof.mjs";
|
|
10
10
|
|
|
11
|
-
export {diff}
|
|
11
|
+
export { diff };
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* With the diff function you can perform the change of one object to another. The result shows the changes of the second object to the first object.
|
|
@@ -25,7 +25,7 @@ export {diff}
|
|
|
25
25
|
* @memberOf Monster.Data
|
|
26
26
|
*/
|
|
27
27
|
function diff(first, second) {
|
|
28
|
-
return doDiff(first, second)
|
|
28
|
+
return doDiff(first, second);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
@@ -54,37 +54,30 @@ function getKeys(a, b, type) {
|
|
|
54
54
|
* @return {array}
|
|
55
55
|
*/
|
|
56
56
|
function doDiff(a, b, path, diff) {
|
|
57
|
-
|
|
58
|
-
let
|
|
59
|
-
let typeB = typeOf(b)
|
|
57
|
+
let typeA = typeOf(a);
|
|
58
|
+
let typeB = typeOf(b);
|
|
60
59
|
|
|
61
60
|
const currPath = path || [];
|
|
62
61
|
const currDiff = diff || [];
|
|
63
62
|
|
|
64
|
-
if (typeA === typeB && (typeA ===
|
|
65
|
-
|
|
63
|
+
if (typeA === typeB && (typeA === "object" || typeA === "array")) {
|
|
66
64
|
getKeys(a, b, typeA).forEach((v) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
currDiff.push(buildResult(a[v], b[v], 'delete', currPath.concat(v)));
|
|
65
|
+
if (!Object.prototype.hasOwnProperty.call(a, v)) {
|
|
66
|
+
currDiff.push(buildResult(a[v], b[v], "add", currPath.concat(v)));
|
|
67
|
+
} else if (!Object.prototype.hasOwnProperty.call(b, v)) {
|
|
68
|
+
currDiff.push(buildResult(a[v], b[v], "delete", currPath.concat(v)));
|
|
72
69
|
} else {
|
|
73
70
|
doDiff(a[v], b[v], currPath.concat(v), currDiff);
|
|
74
71
|
}
|
|
75
72
|
});
|
|
76
|
-
|
|
77
73
|
} else {
|
|
78
|
-
|
|
79
74
|
const o = getOperator(a, b, typeA, typeB);
|
|
80
75
|
if (o !== undefined) {
|
|
81
76
|
currDiff.push(buildResult(a, b, o, path));
|
|
82
77
|
}
|
|
83
|
-
|
|
84
78
|
}
|
|
85
79
|
|
|
86
80
|
return currDiff;
|
|
87
|
-
|
|
88
81
|
}
|
|
89
82
|
|
|
90
83
|
/**
|
|
@@ -97,16 +90,15 @@ function doDiff(a, b, path, diff) {
|
|
|
97
90
|
* @private
|
|
98
91
|
*/
|
|
99
92
|
function buildResult(a, b, operator, path) {
|
|
100
|
-
|
|
101
93
|
const result = {
|
|
102
94
|
operator,
|
|
103
95
|
path,
|
|
104
96
|
};
|
|
105
97
|
|
|
106
|
-
if (operator !==
|
|
98
|
+
if (operator !== "add") {
|
|
107
99
|
result.first = {
|
|
108
100
|
value: a,
|
|
109
|
-
type: typeof a
|
|
101
|
+
type: typeof a,
|
|
110
102
|
};
|
|
111
103
|
|
|
112
104
|
if (isObject(a)) {
|
|
@@ -117,10 +109,10 @@ function buildResult(a, b, operator, path) {
|
|
|
117
109
|
}
|
|
118
110
|
}
|
|
119
111
|
|
|
120
|
-
if (operator ===
|
|
112
|
+
if (operator === "add" || operator === "update") {
|
|
121
113
|
result.second = {
|
|
122
114
|
value: b,
|
|
123
|
-
type: typeof b
|
|
115
|
+
type: typeof b,
|
|
124
116
|
};
|
|
125
117
|
|
|
126
118
|
if (isObject(b)) {
|
|
@@ -129,7 +121,6 @@ function buildResult(a, b, operator, path) {
|
|
|
129
121
|
result.second.instance = name;
|
|
130
122
|
}
|
|
131
123
|
}
|
|
132
|
-
|
|
133
124
|
}
|
|
134
125
|
|
|
135
126
|
return result;
|
|
@@ -142,7 +133,6 @@ function buildResult(a, b, operator, path) {
|
|
|
142
133
|
* @return {boolean}
|
|
143
134
|
*/
|
|
144
135
|
function isNotEqual(a, b) {
|
|
145
|
-
|
|
146
136
|
if (typeof a !== typeof b) {
|
|
147
137
|
return true;
|
|
148
138
|
}
|
|
@@ -161,7 +151,6 @@ function isNotEqual(a, b) {
|
|
|
161
151
|
* @return {string|undefined}
|
|
162
152
|
*/
|
|
163
153
|
function getOperator(a, b) {
|
|
164
|
-
|
|
165
154
|
/**
|
|
166
155
|
* @type {string|undefined}
|
|
167
156
|
*/
|
|
@@ -177,14 +166,13 @@ function getOperator(a, b) {
|
|
|
177
166
|
*/
|
|
178
167
|
let typeB = typeof b;
|
|
179
168
|
|
|
180
|
-
if (typeA ===
|
|
181
|
-
operator =
|
|
182
|
-
} else if (typeA !==
|
|
183
|
-
operator =
|
|
169
|
+
if (typeA === "undefined" && typeB !== "undefined") {
|
|
170
|
+
operator = "add";
|
|
171
|
+
} else if (typeA !== "undefined" && typeB === "undefined") {
|
|
172
|
+
operator = "delete";
|
|
184
173
|
} else if (isNotEqual(a, b)) {
|
|
185
|
-
operator =
|
|
174
|
+
operator = "update";
|
|
186
175
|
}
|
|
187
176
|
|
|
188
177
|
return operator;
|
|
189
|
-
|
|
190
178
|
}
|
package/source/data/extend.mjs
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {isArray, isObject} from "../types/is.mjs";
|
|
9
|
-
import {typeOf} from "../types/typeof.mjs";
|
|
8
|
+
import { isArray, isObject } from "../types/is.mjs";
|
|
9
|
+
import { typeOf } from "../types/typeof.mjs";
|
|
10
10
|
|
|
11
|
-
export {extend}
|
|
11
|
+
export { extend };
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Extend copies all enumerable own properties from one or
|
|
@@ -23,15 +23,21 @@ export {extend}
|
|
|
23
23
|
* @memberOf Monster.Data
|
|
24
24
|
* @throws {Error} unsupported argument
|
|
25
25
|
* @throws {Error} type mismatch
|
|
26
|
+
* @throws {Error} unsupported argument
|
|
26
27
|
*/
|
|
27
|
-
function extend() {
|
|
28
|
-
let o
|
|
28
|
+
function extend(...args) {
|
|
29
|
+
let o;
|
|
30
|
+
let i;
|
|
31
|
+
|
|
32
|
+
if (typeof args !== "object" || args[0] === null) {
|
|
33
|
+
throw new Error(`unsupported argument ${JSON.stringify(args[0])}`);
|
|
34
|
+
}
|
|
29
35
|
|
|
30
|
-
for (i = 0; i <
|
|
31
|
-
let a =
|
|
36
|
+
for (i = 0; i < args.length; i++) {
|
|
37
|
+
let a = args[i];
|
|
32
38
|
|
|
33
39
|
if (!(isObject(a) || isArray(a))) {
|
|
34
|
-
throw new Error(
|
|
40
|
+
throw new Error(`unsupported argument ${JSON.stringify(a)}`);
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
if (o === undefined) {
|
|
@@ -40,15 +46,13 @@ function extend() {
|
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
for (let k in a) {
|
|
43
|
-
|
|
44
49
|
let v = a?.[k];
|
|
45
50
|
|
|
46
51
|
if (v === o?.[k]) {
|
|
47
52
|
continue;
|
|
48
53
|
}
|
|
49
54
|
|
|
50
|
-
if ((isObject(v)&&typeOf(v)===
|
|
51
|
-
|
|
55
|
+
if ((isObject(v) && typeOf(v) === "object") || isArray(v)) {
|
|
52
56
|
if (o[k] === undefined) {
|
|
53
57
|
if (isArray(v)) {
|
|
54
58
|
o[k] = [];
|
|
@@ -57,16 +61,18 @@ function extend() {
|
|
|
57
61
|
}
|
|
58
62
|
} else {
|
|
59
63
|
if (typeOf(o[k]) !== typeOf(v)) {
|
|
60
|
-
throw new Error(
|
|
64
|
+
throw new Error(
|
|
65
|
+
`type mismatch: ${JSON.stringify(o[k])}(${typeOf(o[k])}) != ${JSON.stringify(v)}(${typeOf(
|
|
66
|
+
v,
|
|
67
|
+
)})`,
|
|
68
|
+
);
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
o[k] = extend(o[k], v);
|
|
65
|
-
|
|
66
73
|
} else {
|
|
67
74
|
o[k] = v;
|
|
68
75
|
}
|
|
69
|
-
|
|
70
76
|
}
|
|
71
77
|
}
|
|
72
78
|
|