@schukai/monster 3.22.1 → 3.25.0
Sign up to get free protection for your applications and to get access to all the features.
package/package.json
CHANGED
package/source/dom/constants.mjs
CHANGED
@@ -16,7 +16,6 @@ export {
|
|
16
16
|
ATTRIBUTE_UPDATER_SELECT_THIS,
|
17
17
|
ATTRIBUTE_UPDATER_REPLACE,
|
18
18
|
ATTRIBUTE_UPDATER_INSERT,
|
19
|
-
ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID,
|
20
19
|
ATTRIBUTE_UPDATER_INSERT_REFERENCE,
|
21
20
|
ATTRIBUTE_UPDATER_REMOVE,
|
22
21
|
ATTRIBUTE_UPDATER_BIND,
|
@@ -143,14 +142,6 @@ const ATTRIBUTE_UPDATER_REPLACE = `${ATTRIBUTE_PREFIX}replace`;
|
|
143
142
|
*/
|
144
143
|
const ATTRIBUTE_UPDATER_INSERT = `${ATTRIBUTE_PREFIX}insert`;
|
145
144
|
|
146
|
-
/**
|
147
|
-
* @memberOf Monster.DOM
|
148
|
-
* @type {string}
|
149
|
-
* @license AGPLv3
|
150
|
-
* @since 3.21.0
|
151
|
-
*/
|
152
|
-
const ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID = `${ATTRIBUTE_UPDATER_INSERT}-template-id`;
|
153
|
-
|
154
145
|
/**
|
155
146
|
* @memberOf Monster.DOM
|
156
147
|
* @type {string}
|
@@ -5,18 +5,19 @@
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
6
6
|
*/
|
7
7
|
|
8
|
-
import {
|
9
|
-
import {
|
10
|
-
import {
|
8
|
+
import {internalSymbol} from "../constants.mjs";
|
9
|
+
import {extend} from "../data/extend.mjs";
|
10
|
+
import {Pathfinder} from "../data/pathfinder.mjs";
|
11
|
+
import {Formatter} from "../text/formatter.mjs";
|
11
12
|
|
12
|
-
import {
|
13
|
-
import {
|
13
|
+
import {parseDataURL} from "../types/dataurl.mjs";
|
14
|
+
import {getGlobalObject} from "../types/global.mjs";
|
14
15
|
import {isArray, isFunction, isIterable, isObject, isString} from "../types/is.mjs";
|
15
|
-
import {
|
16
|
-
import {
|
17
|
-
import {
|
18
|
-
import {
|
19
|
-
import {
|
16
|
+
import {Observer} from "../types/observer.mjs";
|
17
|
+
import {ProxyObserver} from "../types/proxyobserver.mjs";
|
18
|
+
import {validateFunction, validateInstance, validateObject, validateString} from "../types/validate.mjs";
|
19
|
+
import {clone} from "../util/clone.mjs";
|
20
|
+
import {addAttributeToken, getLinkedObjects, hasObjectLink} from "./attributes.mjs";
|
20
21
|
import {
|
21
22
|
ATTRIBUTE_DISABLED,
|
22
23
|
ATTRIBUTE_ERRORMESSAGE,
|
@@ -24,9 +25,9 @@ import {
|
|
24
25
|
ATTRIBUTE_OPTIONS_SELECTOR,
|
25
26
|
customElementUpdaterLinkSymbol,
|
26
27
|
} from "./constants.mjs";
|
27
|
-
import {
|
28
|
-
import {
|
29
|
-
import {
|
28
|
+
import {findDocumentTemplate, Template} from "./template.mjs";
|
29
|
+
import {addObjectWithUpdaterToElement} from "./updater.mjs";
|
30
|
+
import {instanceSymbol} from "../constants.mjs";
|
30
31
|
import {getDocumentTranslations, Translations} from "../i18n/translations.mjs";
|
31
32
|
|
32
33
|
export {
|
@@ -267,6 +268,7 @@ class CustomElement extends HTMLElement {
|
|
267
268
|
* @property {Boolean} delegatesFocus=true A boolean that, when set to true, specifies behavior that mitigates custom element issues around focusability. When a non-focusable part of the shadow DOM is clicked, the first focusable part is given focus, and the shadow host is given any available :focus styling.
|
268
269
|
* @property {Object} templates Templates
|
269
270
|
* @property {string} templates.main=undefined Main template
|
271
|
+
* @property {Object} templateMapping Template mapping
|
270
272
|
*
|
271
273
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow
|
272
274
|
* @since 1.8.0
|
@@ -279,6 +281,7 @@ class CustomElement extends HTMLElement {
|
|
279
281
|
templates: {
|
280
282
|
main: undefined,
|
281
283
|
},
|
284
|
+
templateMapping: {},
|
282
285
|
};
|
283
286
|
}
|
284
287
|
|
@@ -288,7 +291,7 @@ class CustomElement extends HTMLElement {
|
|
288
291
|
* The labels are defined in the options object.
|
289
292
|
* The key of the label is used to retrieve the translation from the document.
|
290
293
|
* If the translation is different from the label, the label is updated.
|
291
|
-
*
|
294
|
+
*
|
292
295
|
* Before you can use this method, you must have loaded the translations.
|
293
296
|
*
|
294
297
|
* @returns {Monster.DOM.CustomElement}
|
@@ -301,10 +304,10 @@ class CustomElement extends HTMLElement {
|
|
301
304
|
}
|
302
305
|
|
303
306
|
const labels = this.getOption("labels");
|
304
|
-
if(!isIterable(labels)){
|
307
|
+
if (!isIterable(labels)) {
|
305
308
|
return this;
|
306
309
|
}
|
307
|
-
|
310
|
+
|
308
311
|
for (const key in labels) {
|
309
312
|
const text = translations.getText(key, labels[key]);
|
310
313
|
if (text !== labels[key]) {
|
@@ -313,8 +316,8 @@ class CustomElement extends HTMLElement {
|
|
313
316
|
|
314
317
|
}
|
315
318
|
return this;
|
316
|
-
}
|
317
|
-
|
319
|
+
}
|
320
|
+
|
318
321
|
/**
|
319
322
|
* There is no check on the name by this class. the developer is responsible for assigning an appropriate tag.
|
320
323
|
* if the name is not valid, registerCustomElement() will issue an error
|
@@ -327,7 +330,7 @@ class CustomElement extends HTMLElement {
|
|
327
330
|
static getTag() {
|
328
331
|
throw new Error("the method getTag must be overwritten by the derived class.");
|
329
332
|
}
|
330
|
-
|
333
|
+
|
331
334
|
|
332
335
|
/**
|
333
336
|
* At this point a `CSSStyleSheet` object can be returned. If the environment does not
|
@@ -354,7 +357,7 @@ class CustomElement extends HTMLElement {
|
|
354
357
|
static getCSSStyleSheet() {
|
355
358
|
return undefined;
|
356
359
|
}
|
357
|
-
|
360
|
+
|
358
361
|
/**
|
359
362
|
* attach a new observer
|
360
363
|
*
|
@@ -398,7 +401,8 @@ class CustomElement extends HTMLElement {
|
|
398
401
|
|
399
402
|
try {
|
400
403
|
value = new Pathfinder(this[internalSymbol].getRealSubject()["options"]).getVia(path);
|
401
|
-
} catch (e) {
|
404
|
+
} catch (e) {
|
405
|
+
}
|
402
406
|
|
403
407
|
if (value === undefined) return defaultValue;
|
404
408
|
return value;
|
@@ -468,7 +472,8 @@ class CustomElement extends HTMLElement {
|
|
468
472
|
try {
|
469
473
|
initShadowRoot.call(self);
|
470
474
|
elements = self.shadowRoot.childNodes;
|
471
|
-
} catch (e) {
|
475
|
+
} catch (e) {
|
476
|
+
}
|
472
477
|
|
473
478
|
try {
|
474
479
|
initCSSStylesheet.call(this);
|
@@ -519,7 +524,8 @@ class CustomElement extends HTMLElement {
|
|
519
524
|
* @return {void}
|
520
525
|
* @since 1.7.0
|
521
526
|
*/
|
522
|
-
disconnectedCallback() {
|
527
|
+
disconnectedCallback() {
|
528
|
+
}
|
523
529
|
|
524
530
|
/**
|
525
531
|
* The custom element has been moved into a new document (e.g. someone called document.adoptNode(el)).
|
@@ -527,7 +533,8 @@ class CustomElement extends HTMLElement {
|
|
527
533
|
* @return {void}
|
528
534
|
* @since 1.7.0
|
529
535
|
*/
|
530
|
-
adoptedCallback() {
|
536
|
+
adoptedCallback() {
|
537
|
+
}
|
531
538
|
|
532
539
|
/**
|
533
540
|
* Called when an observed attribute has been added, removed, updated, or replaced. Also called for initial
|
@@ -816,7 +823,8 @@ function parseOptionsJSON(data) {
|
|
816
823
|
try {
|
817
824
|
let dataUrl = parseDataURL(data);
|
818
825
|
data = dataUrl.content;
|
819
|
-
} catch (e) {
|
826
|
+
} catch (e) {
|
827
|
+
}
|
820
828
|
|
821
829
|
try {
|
822
830
|
obj = JSON.parse(data);
|
@@ -838,6 +846,11 @@ function initHtmlContent() {
|
|
838
846
|
} catch (e) {
|
839
847
|
let html = this.getOption("templates.main", "");
|
840
848
|
if (isString(html) && html.length > 0) {
|
849
|
+
|
850
|
+
const mapping = this.getOption("templateMapping", {});
|
851
|
+
if (isObject(mapping)) {
|
852
|
+
html = new Formatter(mapping).format(html);
|
853
|
+
}
|
841
854
|
this.innerHTML = html;
|
842
855
|
}
|
843
856
|
}
|
@@ -934,6 +947,11 @@ function initShadowRoot() {
|
|
934
947
|
return this;
|
935
948
|
}
|
936
949
|
|
950
|
+
const mapping = this.getOption("templateMapping", {});
|
951
|
+
if (isObject(mapping)) {
|
952
|
+
html = new Formatter(mapping).format(html);
|
953
|
+
}
|
954
|
+
|
937
955
|
this.shadowRoot.innerHTML = html;
|
938
956
|
return this;
|
939
957
|
}
|
package/source/dom/updater.mjs
CHANGED
@@ -17,8 +17,7 @@ import {
|
|
17
17
|
ATTRIBUTE_UPDATER_INSERT_REFERENCE,
|
18
18
|
ATTRIBUTE_UPDATER_REMOVE,
|
19
19
|
ATTRIBUTE_UPDATER_REPLACE,
|
20
|
-
ATTRIBUTE_UPDATER_SELECT_THIS
|
21
|
-
ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID
|
20
|
+
ATTRIBUTE_UPDATER_SELECT_THIS
|
22
21
|
} from "../dom/constants.mjs";
|
23
22
|
|
24
23
|
import {Base} from "../types/base.mjs";
|
@@ -514,50 +513,6 @@ function insertElement(change) {
|
|
514
513
|
}
|
515
514
|
}
|
516
515
|
|
517
|
-
/**
|
518
|
-
* @private
|
519
|
-
* @param container
|
520
|
-
* @param key
|
521
|
-
* @param ref
|
522
|
-
* @param path
|
523
|
-
* @returns {any}
|
524
|
-
*/
|
525
|
-
function internalTemplateLookUp(container, key, ref, path) {
|
526
|
-
|
527
|
-
let templateID = key;
|
528
|
-
let template;
|
529
|
-
|
530
|
-
if (container.hasAttribute(ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID)) {
|
531
|
-
templateID = container.getAttribute(ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID);
|
532
|
-
template = findDocumentTemplate(templateID, container);
|
533
|
-
if (template instanceof HTMLTemplateElement) {
|
534
|
-
return template;
|
535
|
-
}
|
536
|
-
}
|
537
|
-
|
538
|
-
if (container.closest(`[${ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID}]`)) {
|
539
|
-
templateID = container.closest(`[${ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID}]`).getAttribute(ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID);
|
540
|
-
template = findDocumentTemplate(templateID, container);
|
541
|
-
if (template instanceof HTMLTemplateElement) {
|
542
|
-
return template;
|
543
|
-
}
|
544
|
-
}
|
545
|
-
|
546
|
-
const rootNode = container.getRootNode();
|
547
|
-
if (rootNode instanceof ShadowRoot) {
|
548
|
-
const host = rootNode?.host;
|
549
|
-
if (host && host.hasAttribute(ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID)) {
|
550
|
-
templateID = host.getAttribute(ATTRIBUTE_UPDATER_INSERT_TEMPLATE_ID);
|
551
|
-
template = findDocumentTemplate(templateID, container);
|
552
|
-
if (template instanceof HTMLTemplateElement) {
|
553
|
-
return template;
|
554
|
-
}
|
555
|
-
}
|
556
|
-
}
|
557
|
-
|
558
|
-
return findDocumentTemplate(templateID, container);
|
559
|
-
}
|
560
|
-
|
561
516
|
/**
|
562
517
|
*
|
563
518
|
* @private
|
@@ -570,8 +525,7 @@ function internalTemplateLookUp(container, key, ref, path) {
|
|
570
525
|
* @throws {Error} no template was found with the specified key.
|
571
526
|
*/
|
572
527
|
function appendNewDocumentFragment(container, key, ref, path) {
|
573
|
-
|
574
|
-
let template = internalTemplateLookUp(container, key, ref, path);
|
528
|
+
let template = findDocumentTemplate(key, container);
|
575
529
|
|
576
530
|
let nodes = template.createDocumentFragment();
|
577
531
|
for (const [, node] of Object.entries(nodes.childNodes)) {
|
package/source/types/version.mjs
CHANGED
package/test/cases/monster.mjs
CHANGED