@schukai/monster 3.43.0 → 3.44.1

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "3.43.0",
3
+ "version": "3.44.1",
4
4
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
5
5
  "keywords": [
6
6
  "framework",
@@ -60,6 +60,12 @@ const assembleMethodSymbol = Symbol.for("@schukai/monster/dom/@@assembleMethodSy
60
60
  */
61
61
  const attributeObserverSymbol = Symbol.for("@schukai/monster/dom/@@attributeObserver");
62
62
 
63
+ /**
64
+ * @private
65
+ * @type {symbol}
66
+ */
67
+ const attributeMutationObserverSymbol = Symbol("@schukai/monster/dom/@@mutationObserver");
68
+
63
69
  /**
64
70
  * HTMLElement
65
71
  * @external HTMLElement
@@ -203,9 +209,9 @@ class CustomElement extends HTMLElement {
203
209
  this[internalSymbol] = new ProxyObserver({
204
210
  options: initOptionsFromAttributes(this, extend({}, this.defaults)),
205
211
  });
206
- initAttributeChangeMutationObserver.call(this);
207
- initOptionObserver.call(this);
208
212
  this[initMethodSymbol]();
213
+ initOptionObserver.call(this);
214
+
209
215
  }
210
216
 
211
217
  /**
@@ -229,6 +235,28 @@ class CustomElement extends HTMLElement {
229
235
  return [ATTRIBUTE_OPTIONS, ATTRIBUTE_DISABLED];
230
236
  }
231
237
 
238
+ /**
239
+ *
240
+ * @param attribute
241
+ * @param callback
242
+ * @returns {Monster.DOM.CustomElement}
243
+ */
244
+ addAttributeObserver(attribute, callback) {
245
+ validateFunction(callback);
246
+ this[attributeObserverSymbol][attribute] = callback;
247
+ return this;
248
+ }
249
+
250
+ /**
251
+ *
252
+ * @param attribute
253
+ * @returns {Monster.DOM.CustomElement}
254
+ */
255
+ removeAttributeObserver(attribute) {
256
+ delete this[attributeObserverSymbol][attribute];
257
+ return this;
258
+ }
259
+
232
260
  /**
233
261
  * Derived classes can override and extend this method as follows.
234
262
  *
@@ -524,6 +552,9 @@ class CustomElement extends HTMLElement {
524
552
  customElementUpdaterLinkSymbol,
525
553
  clone(self[internalSymbol].getRealSubject()["options"]),
526
554
  );
555
+
556
+ attachAttributeChangeMutationObserver.call(this);
557
+
527
558
  return self;
528
559
  }
529
560
 
@@ -539,6 +570,7 @@ class CustomElement extends HTMLElement {
539
570
  if (!hasObjectLink(self, customElementUpdaterLinkSymbol)) {
540
571
  self[assembleMethodSymbol]();
541
572
  }
573
+
542
574
  }
543
575
 
544
576
  /**
@@ -576,7 +608,12 @@ class CustomElement extends HTMLElement {
576
608
  const callback = self[attributeObserverSymbol]?.[attrName];
577
609
 
578
610
  if (isFunction(callback)) {
579
- callback.call(self, newVal, oldVal);
611
+ try {
612
+ callback.call(self, newVal, oldVal);
613
+ } catch (e) {
614
+ addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.toString());
615
+ }
616
+
580
617
  }
581
618
  }
582
619
 
@@ -604,32 +641,34 @@ class CustomElement extends HTMLElement {
604
641
 
605
642
  /**
606
643
  * This method is called when the element is first created.
607
- *
644
+ *
608
645
  * @private
609
646
  * @this CustomElement
610
647
  */
611
- function initAttributeChangeMutationObserver() {
648
+ function attachAttributeChangeMutationObserver() {
612
649
  const self = this;
613
650
 
614
- if (self[attributeObserverSymbol] === undefined) {
615
- self[attributeObserverSymbol] = {};
616
- }
617
-
618
- if(Object.keys(self[attributeObserverSymbol]).length === 0) {
651
+ if (typeof self[attributeMutationObserverSymbol] !== "undefined") {
619
652
  return;
620
653
  }
621
654
 
622
- new MutationObserver(function (mutations) {
655
+ self[attributeMutationObserverSymbol] = new MutationObserver(function (mutations, observer) {
623
656
  for (const mutation of mutations) {
624
657
  if (mutation.type === "attributes") {
625
658
  self.attributeChangedCallback(mutation.attributeName, mutation.oldValue, mutation.target.getAttribute(mutation.attributeName));
626
659
  }
627
660
  }
628
- }).observe(self, {
629
- attributes: true,
630
- attributeOldValue: true,
631
- attributeFilter: Object.keys(self[attributeObserverSymbol]),
632
661
  });
662
+
663
+ try {
664
+ self[attributeMutationObserverSymbol].observe(self, {
665
+ attributes: true,
666
+ attributeOldValue: true,
667
+ });
668
+
669
+ } catch (e) {
670
+ addAttributeToken(self, ATTRIBUTE_ERRORMESSAGE, e.toString());
671
+ }
633
672
  }
634
673
 
635
674
  /**
@@ -37,7 +37,7 @@ export { Updater, addObjectWithUpdaterToElement };
37
37
  * The updater class connects an object with the dom. In this way, structures and contents in the DOM can be programmatically adapted via attributes.
38
38
  *
39
39
  * For example, to include a string from an object, the attribute `data-monster-replace` can be used.
40
- * a further explanation can be found under {@tutorial dom-based-templating-implementation}.
40
+ * a further explanation can be found under [monsterjs.org](https://monsterjs.org/)
41
41
  *
42
42
  * Changes to attributes are made only when the direct values are changed. If you want to assign changes to other values
43
43
  * as well, you have to insert the attribute `data-monster-select-this`. This should be done with care, as it can reduce performance.
@@ -142,7 +142,7 @@ function getMonsterVersion() {
142
142
  }
143
143
 
144
144
  /** don't touch, replaced by make with package.json version */
145
- monsterVersion = new Version("3.43.0");
145
+ monsterVersion = new Version("3.44.1");
146
146
 
147
147
  return monsterVersion;
148
148
  }
@@ -7,7 +7,7 @@ describe('Monster', function () {
7
7
  let monsterVersion
8
8
 
9
9
  /** don´t touch, replaced by make with package.json version */
10
- monsterVersion = new Version("3.43.0")
10
+ monsterVersion = new Version("3.44.1")
11
11
 
12
12
  let m = getMonsterVersion();
13
13