@schukai/monster 3.4.2 → 3.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,18 +5,20 @@
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
6
6
|
*/
|
7
7
|
|
8
|
-
import {extend} from "../../data/extend.mjs";
|
8
|
+
import { extend } from "../../data/extend.mjs";
|
9
9
|
import {
|
10
10
|
ATTRIBUTE_CLASS,
|
11
11
|
ATTRIBUTE_HREF,
|
12
12
|
ATTRIBUTE_ID,
|
13
|
-
ATTRIBUTE_NONCE,
|
14
|
-
|
15
|
-
|
13
|
+
ATTRIBUTE_NONCE,
|
14
|
+
ATTRIBUTE_SRC,
|
15
|
+
ATTRIBUTE_TITLE,
|
16
|
+
ATTRIBUTE_TYPE,
|
17
|
+
TAG_LINK,
|
16
18
|
} from "../constants.mjs";
|
17
|
-
import {KEY_DOCUMENT, referenceSymbol, Resource} from "../resource.mjs";
|
18
|
-
import {instanceSymbol} from
|
19
|
-
export {Link}
|
19
|
+
import { KEY_DOCUMENT, referenceSymbol, Resource } from "../resource.mjs";
|
20
|
+
import { instanceSymbol } from "../../constants.mjs";
|
21
|
+
export { Link };
|
20
22
|
|
21
23
|
/**
|
22
24
|
* This class is used by the resource manager to embed external resources.
|
@@ -29,7 +31,6 @@ export {Link}
|
|
29
31
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link
|
30
32
|
*/
|
31
33
|
class Link extends Resource {
|
32
|
-
|
33
34
|
/**
|
34
35
|
* @property {string} as {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-as}
|
35
36
|
* @property {string} crossOrigin=anonymous {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-crossorigin}
|
@@ -50,7 +51,7 @@ class Link extends Resource {
|
|
50
51
|
get defaults() {
|
51
52
|
return extend({}, super.defaults, {
|
52
53
|
as: undefined,
|
53
|
-
crossOrigin:
|
54
|
+
crossOrigin: "anonymous",
|
54
55
|
disabled: undefined,
|
55
56
|
href: undefined,
|
56
57
|
hreflang: undefined,
|
@@ -63,8 +64,8 @@ class Link extends Resource {
|
|
63
64
|
rel: undefined,
|
64
65
|
sizes: undefined,
|
65
66
|
type: undefined,
|
66
|
-
nonce: undefined
|
67
|
-
})
|
67
|
+
nonce: undefined,
|
68
|
+
});
|
68
69
|
}
|
69
70
|
|
70
71
|
/**
|
@@ -76,7 +77,6 @@ class Link extends Resource {
|
|
76
77
|
return Symbol.for("@schukai/monster/dom/resource/link");
|
77
78
|
}
|
78
79
|
|
79
|
-
|
80
80
|
/**
|
81
81
|
*
|
82
82
|
* @return {Monster.DOM.Resource.Link}
|
@@ -90,9 +90,8 @@ class Link extends Resource {
|
|
90
90
|
* @return {string}
|
91
91
|
*/
|
92
92
|
static getURLAttribute() {
|
93
|
-
return ATTRIBUTE_HREF
|
93
|
+
return ATTRIBUTE_HREF;
|
94
94
|
}
|
95
|
-
|
96
95
|
}
|
97
96
|
|
98
97
|
/**
|
@@ -105,11 +104,31 @@ function createElement() {
|
|
105
104
|
const document = self.getOption(KEY_DOCUMENT);
|
106
105
|
self[referenceSymbol] = document.createElement(TAG_LINK);
|
107
106
|
|
108
|
-
for (let key of [
|
107
|
+
for (let key of [
|
108
|
+
"as",
|
109
|
+
"crossOrigin",
|
110
|
+
"disabled",
|
111
|
+
"href",
|
112
|
+
"hreflang",
|
113
|
+
"imagesizes",
|
114
|
+
"imagesrcset",
|
115
|
+
"integrity",
|
116
|
+
"media",
|
117
|
+
"prefetch",
|
118
|
+
"referrerpolicy",
|
119
|
+
"sizes",
|
120
|
+
"rel",
|
121
|
+
"type",
|
122
|
+
ATTRIBUTE_HREF,
|
123
|
+
ATTRIBUTE_ID,
|
124
|
+
ATTRIBUTE_CLASS,
|
125
|
+
ATTRIBUTE_TITLE,
|
126
|
+
ATTRIBUTE_NONCE,
|
127
|
+
]) {
|
109
128
|
if (self.getOption(key) !== undefined) {
|
110
129
|
self[referenceSymbol][key] = self.getOption(key);
|
111
130
|
}
|
112
|
-
}
|
113
|
-
|
131
|
+
}
|
132
|
+
|
114
133
|
return self;
|
115
134
|
}
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
6
6
|
*/
|
7
7
|
|
8
|
-
import {extend} from "../../data/extend.mjs";
|
8
|
+
import { extend } from "../../data/extend.mjs";
|
9
9
|
import {
|
10
10
|
ATTRIBUTE_CLASS,
|
11
11
|
ATTRIBUTE_ID,
|
@@ -13,11 +13,11 @@ import {
|
|
13
13
|
ATTRIBUTE_SRC,
|
14
14
|
ATTRIBUTE_TITLE,
|
15
15
|
ATTRIBUTE_TYPE,
|
16
|
-
TAG_SCRIPT
|
16
|
+
TAG_SCRIPT,
|
17
17
|
} from "../constants.mjs";
|
18
|
-
import {KEY_DOCUMENT, referenceSymbol, Resource} from "../resource.mjs";
|
19
|
-
import {instanceSymbol} from
|
20
|
-
export {Script}
|
18
|
+
import { KEY_DOCUMENT, referenceSymbol, Resource } from "../resource.mjs";
|
19
|
+
import { instanceSymbol } from "../../constants.mjs";
|
20
|
+
export { Script };
|
21
21
|
|
22
22
|
/**
|
23
23
|
* This class is used by the resource manager to embed scripts.
|
@@ -29,7 +29,6 @@ export {Script}
|
|
29
29
|
* @summary A Resource class
|
30
30
|
*/
|
31
31
|
class Script extends Resource {
|
32
|
-
|
33
32
|
/**
|
34
33
|
* @property {boolean} async=true {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-async}
|
35
34
|
* @property {string} crossOrigin=anonymous {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-crossorigin}
|
@@ -43,14 +42,14 @@ class Script extends Resource {
|
|
43
42
|
get defaults() {
|
44
43
|
return extend({}, super.defaults, {
|
45
44
|
async: true,
|
46
|
-
crossOrigin:
|
45
|
+
crossOrigin: "anonymous",
|
47
46
|
defer: false,
|
48
47
|
integrity: undefined,
|
49
48
|
nomodule: false,
|
50
49
|
nonce: undefined,
|
51
50
|
referrerpolicy: undefined,
|
52
|
-
type:
|
53
|
-
})
|
51
|
+
type: "text/javascript",
|
52
|
+
});
|
54
53
|
}
|
55
54
|
|
56
55
|
/**
|
@@ -75,9 +74,8 @@ class Script extends Resource {
|
|
75
74
|
* @return {string}
|
76
75
|
*/
|
77
76
|
static getURLAttribute() {
|
78
|
-
return ATTRIBUTE_SRC
|
77
|
+
return ATTRIBUTE_SRC;
|
79
78
|
}
|
80
|
-
|
81
79
|
}
|
82
80
|
|
83
81
|
/**
|
@@ -90,12 +88,24 @@ function createElement() {
|
|
90
88
|
const document = self.getOption(KEY_DOCUMENT);
|
91
89
|
self[referenceSymbol] = document.createElement(TAG_SCRIPT);
|
92
90
|
|
93
|
-
for (let key of [
|
91
|
+
for (let key of [
|
92
|
+
"crossOrigin",
|
93
|
+
"defer",
|
94
|
+
"async",
|
95
|
+
"integrity",
|
96
|
+
"nomodule",
|
97
|
+
ATTRIBUTE_NONCE,
|
98
|
+
"referrerpolicy",
|
99
|
+
ATTRIBUTE_TYPE,
|
100
|
+
ATTRIBUTE_SRC,
|
101
|
+
ATTRIBUTE_ID,
|
102
|
+
ATTRIBUTE_CLASS,
|
103
|
+
ATTRIBUTE_TITLE,
|
104
|
+
]) {
|
94
105
|
if (self.getOption(key) !== undefined) {
|
95
106
|
self[referenceSymbol][key] = self.getOption(key);
|
96
107
|
}
|
97
108
|
}
|
98
109
|
|
99
|
-
|
100
110
|
return self;
|
101
111
|
}
|
package/source/dom/resource.mjs
CHANGED
@@ -5,42 +5,42 @@
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
6
6
|
*/
|
7
7
|
|
8
|
-
import {internalStateSymbol, internalSymbol
|
9
|
-
import {extend} from "../data/extend.mjs";
|
10
|
-
import {BaseWithOptions} from "../types/basewithoptions.mjs";
|
11
|
-
import {getGlobalObject} from "../types/global.mjs";
|
12
|
-
import {ID} from "../types/id.mjs";
|
13
|
-
import {isString} from "../types/is.mjs";
|
14
|
-
import {Observer} from "../types/observer.mjs";
|
15
|
-
import {ProxyObserver} from "../types/proxyobserver.mjs";
|
16
|
-
import {ATTRIBUTE_CLASS, ATTRIBUTE_ID, ATTRIBUTE_TITLE} from "./constants.mjs";
|
17
|
-
import {instanceSymbol} from "../constants.mjs";
|
18
|
-
|
19
|
-
export {Resource, KEY_DOCUMENT, KEY_QUERY, referenceSymbol}
|
8
|
+
import { internalStateSymbol, internalSymbol } from "../constants.mjs";
|
9
|
+
import { extend } from "../data/extend.mjs";
|
10
|
+
import { BaseWithOptions } from "../types/basewithoptions.mjs";
|
11
|
+
import { getGlobalObject } from "../types/global.mjs";
|
12
|
+
import { ID } from "../types/id.mjs";
|
13
|
+
import { isString } from "../types/is.mjs";
|
14
|
+
import { Observer } from "../types/observer.mjs";
|
15
|
+
import { ProxyObserver } from "../types/proxyobserver.mjs";
|
16
|
+
import { ATTRIBUTE_CLASS, ATTRIBUTE_ID, ATTRIBUTE_TITLE } from "./constants.mjs";
|
17
|
+
import { instanceSymbol } from "../constants.mjs";
|
18
|
+
|
19
|
+
export { Resource, KEY_DOCUMENT, KEY_QUERY, referenceSymbol };
|
20
20
|
|
21
21
|
/**
|
22
22
|
* @private
|
23
23
|
* @type {string}
|
24
24
|
*/
|
25
|
-
const KEY_DOCUMENT =
|
25
|
+
const KEY_DOCUMENT = "document";
|
26
26
|
|
27
27
|
/**
|
28
28
|
* @private
|
29
29
|
* @type {string}
|
30
30
|
*/
|
31
|
-
const KEY_QUERY =
|
31
|
+
const KEY_QUERY = "query";
|
32
32
|
|
33
33
|
/**
|
34
34
|
* @private
|
35
35
|
* @type {string}
|
36
36
|
*/
|
37
|
-
const KEY_TIMEOUT =
|
37
|
+
const KEY_TIMEOUT = "timeout";
|
38
38
|
|
39
39
|
/**
|
40
40
|
* @private
|
41
41
|
* @type {symbol}
|
42
42
|
*/
|
43
|
-
const referenceSymbol = Symbol(
|
43
|
+
const referenceSymbol = Symbol("reference");
|
44
44
|
|
45
45
|
/**
|
46
46
|
* This class is the base class for all resources to be loaded.
|
@@ -52,7 +52,6 @@ const referenceSymbol = Symbol('reference');
|
|
52
52
|
* @summary A Resource class
|
53
53
|
*/
|
54
54
|
class Resource extends BaseWithOptions {
|
55
|
-
|
56
55
|
/**
|
57
56
|
*
|
58
57
|
* @param {Object|undefined} options
|
@@ -63,28 +62,26 @@ class Resource extends BaseWithOptions {
|
|
63
62
|
let uri = this.getOption(this.constructor.getURLAttribute());
|
64
63
|
|
65
64
|
if (uri === undefined) {
|
66
|
-
throw new Error(
|
65
|
+
throw new Error("missing source");
|
67
66
|
} else if (uri instanceof URL) {
|
68
67
|
uri = uri.toString();
|
69
68
|
} else if (!isString(uri)) {
|
70
|
-
throw new Error(
|
69
|
+
throw new Error("unsupported url type");
|
71
70
|
}
|
72
71
|
|
73
72
|
this[internalSymbol][this.constructor.getURLAttribute()] = uri;
|
74
73
|
this[internalStateSymbol] = new ProxyObserver({
|
75
74
|
loaded: false,
|
76
75
|
error: undefined,
|
77
|
-
})
|
76
|
+
});
|
78
77
|
|
79
78
|
this[referenceSymbol] = undefined;
|
80
|
-
|
81
79
|
}
|
82
80
|
|
83
81
|
/**
|
84
82
|
* @return {boolean}
|
85
83
|
*/
|
86
84
|
isConnected() {
|
87
|
-
|
88
85
|
if (this[referenceSymbol] instanceof HTMLElement) {
|
89
86
|
return this[referenceSymbol].isConnected;
|
90
87
|
}
|
@@ -111,7 +108,6 @@ class Resource extends BaseWithOptions {
|
|
111
108
|
* @return {Monster.DOM.Resource}
|
112
109
|
*/
|
113
110
|
connect() {
|
114
|
-
|
115
111
|
if (!(this[referenceSymbol] instanceof HTMLElement)) {
|
116
112
|
this.create();
|
117
113
|
}
|
@@ -132,13 +128,13 @@ class Resource extends BaseWithOptions {
|
|
132
128
|
get defaults() {
|
133
129
|
return extend({}, super.defaults, {
|
134
130
|
[this.constructor.getURLAttribute()]: undefined,
|
135
|
-
[KEY_DOCUMENT]: getGlobalObject(
|
136
|
-
[KEY_QUERY]:
|
131
|
+
[KEY_DOCUMENT]: getGlobalObject("document"),
|
132
|
+
[KEY_QUERY]: "head",
|
137
133
|
[KEY_TIMEOUT]: 10000,
|
138
|
-
[ATTRIBUTE_ID]:
|
134
|
+
[ATTRIBUTE_ID]: new ID("resource").toString(),
|
139
135
|
[ATTRIBUTE_CLASS]: undefined,
|
140
|
-
[ATTRIBUTE_TITLE]: undefined
|
141
|
-
})
|
136
|
+
[ATTRIBUTE_TITLE]: undefined,
|
137
|
+
});
|
142
138
|
}
|
143
139
|
|
144
140
|
/**
|
@@ -150,40 +146,35 @@ class Resource extends BaseWithOptions {
|
|
150
146
|
available() {
|
151
147
|
const self = this;
|
152
148
|
if (!(self[referenceSymbol] instanceof HTMLElement)) {
|
153
|
-
return Promise.reject(
|
149
|
+
return Promise.reject("no element");
|
154
150
|
}
|
155
151
|
|
156
152
|
if (!self.isConnected()) {
|
157
|
-
return Promise.reject(
|
153
|
+
return Promise.reject("element not connected");
|
158
154
|
}
|
159
155
|
|
160
|
-
if (self[internalStateSymbol].getSubject()[
|
161
|
-
|
162
|
-
|
163
|
-
return Promise.reject(self[internalStateSymbol].getSubject()['error']);
|
156
|
+
if (self[internalStateSymbol].getSubject()["loaded"] === true) {
|
157
|
+
if (self[internalStateSymbol].getSubject()["error"] !== undefined) {
|
158
|
+
return Promise.reject(self[internalStateSymbol].getSubject()["error"]);
|
164
159
|
}
|
165
160
|
|
166
161
|
return Promise.resolve();
|
167
|
-
|
168
162
|
}
|
169
163
|
|
170
164
|
return new Promise(function (resolve, reject) {
|
171
|
-
|
172
165
|
const timeout = setTimeout(() => {
|
173
|
-
reject(
|
174
|
-
}, self.getOption(
|
166
|
+
reject("timeout");
|
167
|
+
}, self.getOption("timeout"));
|
175
168
|
|
176
169
|
const observer = new Observer(() => {
|
177
170
|
clearTimeout(timeout);
|
178
171
|
self[internalStateSymbol].detachObserver(observer);
|
179
172
|
resolve();
|
180
|
-
})
|
173
|
+
});
|
181
174
|
|
182
175
|
self[internalStateSymbol].attachObserver(observer);
|
183
|
-
|
184
176
|
});
|
185
|
-
|
186
|
-
};
|
177
|
+
}
|
187
178
|
|
188
179
|
/**
|
189
180
|
* @return {string}
|
@@ -191,17 +182,15 @@ class Resource extends BaseWithOptions {
|
|
191
182
|
static getURLAttribute() {
|
192
183
|
throw new Error("this method must be implemented by derived classes");
|
193
184
|
}
|
194
|
-
|
185
|
+
|
195
186
|
/**
|
196
187
|
* @return {symbol}
|
197
188
|
*/
|
198
189
|
static get [instanceSymbol]() {
|
199
190
|
return Symbol.for("@schukai/monster/dom/resource");
|
200
191
|
}
|
201
|
-
|
202
192
|
}
|
203
193
|
|
204
|
-
|
205
194
|
/**
|
206
195
|
* @private
|
207
196
|
* @return {Promise}
|
@@ -210,9 +199,9 @@ class Resource extends BaseWithOptions {
|
|
210
199
|
function appendToDocument() {
|
211
200
|
const self = this;
|
212
201
|
|
213
|
-
const targetNode = document.querySelector(self.getOption(KEY_QUERY,
|
202
|
+
const targetNode = document.querySelector(self.getOption(KEY_QUERY, "head"));
|
214
203
|
if (!(targetNode instanceof HTMLElement)) {
|
215
|
-
throw new Error(
|
204
|
+
throw new Error("target not found");
|
216
205
|
}
|
217
206
|
|
218
207
|
addEvents.call(self);
|
@@ -229,28 +218,26 @@ function addEvents() {
|
|
229
218
|
const self = this;
|
230
219
|
|
231
220
|
const onError = () => {
|
232
|
-
|
233
|
-
self[referenceSymbol].removeEventListener(
|
234
|
-
self[referenceSymbol].removeEventListener('load', onLoad);
|
221
|
+
self[referenceSymbol].removeEventListener("error", onError);
|
222
|
+
self[referenceSymbol].removeEventListener("load", onLoad);
|
235
223
|
|
236
224
|
self[internalStateSymbol].setSubject({
|
237
225
|
loaded: true,
|
238
|
-
error: self[referenceSymbol][self.constructor.getURLAttribute()]
|
239
|
-
})
|
226
|
+
error: `${self[referenceSymbol][self.constructor.getURLAttribute()]} is not available`,
|
227
|
+
});
|
240
228
|
|
241
229
|
return;
|
242
|
-
}
|
230
|
+
};
|
243
231
|
|
244
232
|
const onLoad = () => {
|
245
|
-
self[referenceSymbol].removeEventListener(
|
246
|
-
self[referenceSymbol].removeEventListener(
|
247
|
-
self[internalStateSymbol].getSubject()[
|
233
|
+
self[referenceSymbol].removeEventListener("error", onError);
|
234
|
+
self[referenceSymbol].removeEventListener("load", onLoad);
|
235
|
+
self[internalStateSymbol].getSubject()["loaded"] = true;
|
248
236
|
return;
|
249
|
-
}
|
237
|
+
};
|
250
238
|
|
251
|
-
self[referenceSymbol].addEventListener(
|
252
|
-
self[referenceSymbol].addEventListener(
|
239
|
+
self[referenceSymbol].addEventListener("load", onLoad, false);
|
240
|
+
self[referenceSymbol].addEventListener("error", onError, false);
|
253
241
|
|
254
242
|
return self;
|
255
|
-
|
256
243
|
}
|
@@ -5,17 +5,17 @@
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
6
6
|
*/
|
7
7
|
|
8
|
-
import {extend} from "../data/extend.mjs";
|
9
|
-
import {BaseWithOptions} from "../types/basewithoptions.mjs";
|
10
|
-
import {getGlobalObject} from "../types/global.mjs";
|
11
|
-
import {isArray} from "../types/is.mjs";
|
12
|
-
import {ATTRIBUTE_HREF, ATTRIBUTE_SRC} from "./constants.mjs";
|
13
|
-
import {Resource} from "./resource.mjs";
|
14
|
-
import {Data} from "./resource/data.mjs";
|
15
|
-
import {Stylesheet} from "./resource/link/stylesheet.mjs";
|
16
|
-
import {Script} from "./resource/script.mjs";
|
17
|
-
|
18
|
-
export {ResourceManager}
|
8
|
+
import { extend } from "../data/extend.mjs";
|
9
|
+
import { BaseWithOptions } from "../types/basewithoptions.mjs";
|
10
|
+
import { getGlobalObject } from "../types/global.mjs";
|
11
|
+
import { isArray } from "../types/is.mjs";
|
12
|
+
import { ATTRIBUTE_HREF, ATTRIBUTE_SRC } from "./constants.mjs";
|
13
|
+
import { Resource } from "./resource.mjs";
|
14
|
+
import { Data } from "./resource/data.mjs";
|
15
|
+
import { Stylesheet } from "./resource/link/stylesheet.mjs";
|
16
|
+
import { Script } from "./resource/script.mjs";
|
17
|
+
|
18
|
+
export { ResourceManager };
|
19
19
|
|
20
20
|
/**
|
21
21
|
* The ResourceManager is a singleton that manages all resources.
|
@@ -26,8 +26,7 @@ export {ResourceManager}
|
|
26
26
|
* @memberOf Monster.DOM
|
27
27
|
* @summary A Resource class
|
28
28
|
*/
|
29
|
-
|
30
|
-
|
29
|
+
class ResourceManager extends BaseWithOptions {
|
31
30
|
/**
|
32
31
|
*
|
33
32
|
* @param {Object} options
|
@@ -36,18 +35,16 @@ export {ResourceManager}
|
|
36
35
|
constructor(options) {
|
37
36
|
super(options);
|
38
37
|
|
39
|
-
if (!(this.getOption(
|
40
|
-
throw new Error(
|
38
|
+
if (!(this.getOption("document") instanceof Document)) {
|
39
|
+
throw new Error("unsupported document type");
|
41
40
|
}
|
42
|
-
|
43
|
-
|
44
41
|
}
|
45
42
|
|
46
43
|
/**
|
47
44
|
* @property {string} baseurl
|
48
45
|
*/
|
49
46
|
getBaseURL() {
|
50
|
-
this.getOption(
|
47
|
+
this.getOption("document")?.baseURL;
|
51
48
|
}
|
52
49
|
|
53
50
|
/**
|
@@ -60,13 +57,13 @@ export {ResourceManager}
|
|
60
57
|
*/
|
61
58
|
get defaults() {
|
62
59
|
return Object.assign({}, super.defaults, {
|
63
|
-
document: getGlobalObject(
|
60
|
+
document: getGlobalObject("document"),
|
64
61
|
resources: {
|
65
62
|
scripts: [],
|
66
63
|
stylesheets: [],
|
67
|
-
data: []
|
68
|
-
}
|
69
|
-
})
|
64
|
+
data: [],
|
65
|
+
},
|
66
|
+
});
|
70
67
|
}
|
71
68
|
|
72
69
|
/**
|
@@ -76,7 +73,7 @@ export {ResourceManager}
|
|
76
73
|
* @throws {Error} unsupported resource definition
|
77
74
|
*/
|
78
75
|
connect() {
|
79
|
-
runResourceMethod.call(this,
|
76
|
+
runResourceMethod.call(this, "connect");
|
80
77
|
return this;
|
81
78
|
}
|
82
79
|
|
@@ -87,7 +84,7 @@ export {ResourceManager}
|
|
87
84
|
* @throws {Error} unsupported resource definition
|
88
85
|
*/
|
89
86
|
available() {
|
90
|
-
return Promise.all(runResourceMethod.call(this,
|
87
|
+
return Promise.all(runResourceMethod.call(this, "available"));
|
91
88
|
}
|
92
89
|
|
93
90
|
/**
|
@@ -99,10 +96,9 @@ export {ResourceManager}
|
|
99
96
|
* @see Monster.DOM.Resource.Script
|
100
97
|
*/
|
101
98
|
addScript(url, options) {
|
102
|
-
return addResource.call(this,
|
99
|
+
return addResource.call(this, "scripts", url, options);
|
103
100
|
}
|
104
101
|
|
105
|
-
|
106
102
|
/**
|
107
103
|
* Add Stylesheet
|
108
104
|
*
|
@@ -112,7 +108,7 @@ export {ResourceManager}
|
|
112
108
|
* @see Monster.DOM.Resource.Link.Stylesheet
|
113
109
|
*/
|
114
110
|
addStylesheet(url, options) {
|
115
|
-
return addResource.call(this,
|
111
|
+
return addResource.call(this, "stylesheets", url, options);
|
116
112
|
}
|
117
113
|
|
118
114
|
/**
|
@@ -124,10 +120,8 @@ export {ResourceManager}
|
|
124
120
|
* @see Monster.DOM.Resource.Data
|
125
121
|
*/
|
126
122
|
addData(url, options) {
|
127
|
-
return addResource.call(this,
|
123
|
+
return addResource.call(this, "data", url, options);
|
128
124
|
}
|
129
|
-
|
130
|
-
|
131
125
|
}
|
132
126
|
|
133
127
|
/**
|
@@ -140,20 +134,19 @@ function runResourceMethod(method) {
|
|
140
134
|
|
141
135
|
const result = [];
|
142
136
|
|
143
|
-
for (const type of [
|
144
|
-
const resources = self.getOption(
|
137
|
+
for (const type of ["scripts", "stylesheets", "data"]) {
|
138
|
+
const resources = self.getOption(`resources.${type}`);
|
145
139
|
if (!isArray(resources)) {
|
146
140
|
continue;
|
147
141
|
}
|
148
142
|
|
149
143
|
for (const resource of resources) {
|
150
144
|
if (!(resource instanceof Resource)) {
|
151
|
-
throw new Error(
|
145
|
+
throw new Error("unsupported resource definition");
|
152
146
|
}
|
153
147
|
|
154
148
|
result.push(resource[method]());
|
155
149
|
}
|
156
|
-
|
157
150
|
}
|
158
151
|
|
159
152
|
return result;
|
@@ -174,23 +167,23 @@ function addResource(type, url, options) {
|
|
174
167
|
url = url.toString();
|
175
168
|
}
|
176
169
|
|
177
|
-
options = options || {}
|
170
|
+
options = options || {};
|
178
171
|
|
179
172
|
let resource;
|
180
173
|
switch (type) {
|
181
|
-
case
|
182
|
-
resource = new Script(extend({}, options, {[ATTRIBUTE_SRC]: url}))
|
174
|
+
case "scripts":
|
175
|
+
resource = new Script(extend({}, options, { [ATTRIBUTE_SRC]: url }));
|
183
176
|
break;
|
184
|
-
case
|
185
|
-
resource = new Stylesheet(extend({}, options, {[ATTRIBUTE_HREF]: url}))
|
177
|
+
case "stylesheets":
|
178
|
+
resource = new Stylesheet(extend({}, options, { [ATTRIBUTE_HREF]: url }));
|
186
179
|
break;
|
187
|
-
case
|
188
|
-
resource = new Data(extend({}, options, {[ATTRIBUTE_SRC]: url}))
|
180
|
+
case "data":
|
181
|
+
resource = new Data(extend({}, options, { [ATTRIBUTE_SRC]: url }));
|
189
182
|
break;
|
190
183
|
default:
|
191
|
-
throw new Error(
|
184
|
+
throw new Error(`unsupported type ${type}`);
|
192
185
|
}
|
193
186
|
|
194
|
-
|
187
|
+
self.getOption("resources")?.[type].push(resource);
|
195
188
|
return self;
|
196
189
|
}
|