native-document 1.0.120 → 1.0.121

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.
@@ -363,16 +363,16 @@ var NativeComponents = (function (exports) {
363
363
  // });
364
364
  };
365
365
 
366
- let DebugManager$1 = {};
366
+ let DebugManager$2 = {};
367
367
  {
368
- DebugManager$1 = {
368
+ DebugManager$2 = {
369
369
  log() {},
370
370
  warn() {},
371
371
  error() {},
372
372
  disable() {}
373
373
  };
374
374
  }
375
- var DebugManager$2 = DebugManager$1;
375
+ var DebugManager$1 = DebugManager$2;
376
376
 
377
377
  /**
378
378
  *
@@ -846,17 +846,17 @@ var NativeComponents = (function (exports) {
846
846
  const method = methods[name];
847
847
 
848
848
  if (typeof method !== 'function') {
849
- DebugManager$2.warn('NDElement.extend', `"${name}" is not a function, skipping`);
849
+ DebugManager$1.warn('NDElement.extend', `"${name}" is not a function, skipping`);
850
850
  continue;
851
851
  }
852
852
 
853
853
  if (protectedMethods.has(name)) {
854
- DebugManager$2.error('NDElement.extend', `Cannot override protected method "${name}"`);
854
+ DebugManager$1.error('NDElement.extend', `Cannot override protected method "${name}"`);
855
855
  throw new NativeDocumentError(`Cannot override protected method "${name}"`);
856
856
  }
857
857
 
858
858
  if (NDElement.prototype[name]) {
859
- DebugManager$2.warn('NDElement.extend', `Overwriting existing prototype method "${name}"`);
859
+ DebugManager$1.warn('NDElement.extend', `Overwriting existing prototype method "${name}"`);
860
860
  }
861
861
 
862
862
  NDElement.prototype[name] = method;
@@ -1081,7 +1081,7 @@ var NativeComponents = (function (exports) {
1081
1081
  }
1082
1082
  }
1083
1083
  if (cleanedCount > 0) {
1084
- DebugManager$2.log('Memory Auto Clean', `🧹 Cleaned ${cleanedCount} orphaned observables`);
1084
+ DebugManager$1.log('Memory Auto Clean', `🧹 Cleaned ${cleanedCount} orphaned observables`);
1085
1085
  }
1086
1086
  }
1087
1087
  };
@@ -1969,22 +1969,7 @@ var NativeComponents = (function (exports) {
1969
1969
  */
1970
1970
  const bindClassAttribute = (element, data) => {
1971
1971
  for(const className in data) {
1972
- const value = data[className];
1973
- if(value.__$isObservable) {
1974
- element.classes.toggle(className, value.val());
1975
- value.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
1976
- continue;
1977
- }
1978
- if(value.__$isObservableWhen) {
1979
- element.classes.toggle(className, value.isActive());
1980
- value.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
1981
- continue;
1982
- }
1983
- if(value.$hydrate) {
1984
- value.$hydrate(element, className);
1985
- continue;
1986
- }
1987
- element.classes.toggle(className, value);
1972
+ data[className].bindClassProperty(element, className);
1988
1973
  }
1989
1974
  };
1990
1975
 
@@ -2054,39 +2039,47 @@ var NativeComponents = (function (exports) {
2054
2039
  element.setAttribute(attributeName, value.val());
2055
2040
  };
2056
2041
 
2057
- /**
2058
- *
2059
- * @param {HTMLElement} element
2060
- * @param {Object} attributes
2061
- */
2062
- const AttributesWrapper = (element, attributes) => {
2063
2042
 
2064
- for(const originalAttributeName in attributes) {
2065
- const attributeName = originalAttributeName.toLowerCase();
2066
- let value = attributes[originalAttributeName];
2043
+ const AttributeHandlers = {
2044
+ string: (element, attributeName, value) => element.setAttribute(attributeName, value),
2045
+ number: (element, attributeName, value) => element.setAttribute(attributeName, value),
2046
+ boolean: (element, attributeName, value) => bindBooleanAttribute(element, attributeName, value),
2047
+ object: (element, attributeName, value) => {
2067
2048
  if(value == null) {
2068
- continue;
2049
+ return;
2069
2050
  }
2051
+
2070
2052
  if(value.handleNdAttribute) {
2071
- value.handleNdAttribute(element, attributeName, value);
2072
- continue;
2053
+ value.handleNdAttribute(element, attributeName);
2054
+ return;
2073
2055
  }
2074
- if(typeof value === 'object') {
2075
- if(attributeName === 'class') {
2076
- bindClassAttribute(element, value);
2077
- continue;
2078
- }
2079
- if(attributeName === 'style') {
2080
- bindStyleAttribute(element, value);
2081
- continue;
2082
- }
2056
+
2057
+ if(attributeName === 'class') {
2058
+ bindClassAttribute(element, value);
2059
+ return;
2060
+ }
2061
+ if(attributeName === 'style') {
2062
+ bindStyleAttribute(element, value);
2063
+ return;
2083
2064
  }
2084
2065
  if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
2085
2066
  bindBooleanAttribute(element, attributeName, value);
2086
- continue;
2087
2067
  }
2068
+ }
2069
+ };
2088
2070
 
2089
- element.setAttribute(attributeName, value);
2071
+ /**
2072
+ *
2073
+ * @param {HTMLElement} element
2074
+ * @param {Object} attributes
2075
+ */
2076
+ const AttributesWrapper = (element, attributes) => {
2077
+
2078
+ for(const originalAttributeName in attributes) {
2079
+ const attributeName = originalAttributeName.toLowerCase();
2080
+ let value = attributes[originalAttributeName];
2081
+ const typeOf = typeof value;
2082
+ AttributeHandlers[typeOf](element, attributeName, value);
2090
2083
  }
2091
2084
  return element;
2092
2085
  };
@@ -2226,10 +2219,6 @@ var NativeComponents = (function (exports) {
2226
2219
  return this;
2227
2220
  };
2228
2221
 
2229
- String.prototype.handleNdAttribute = function(element, attributeName) {
2230
- element.setAttribute(attributeName, this);
2231
- };
2232
-
2233
2222
  ObservableItem.prototype.handleNdAttribute = function(element, attributeName) {
2234
2223
  if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
2235
2224
  bindBooleanAttribute(element, attributeName, this);
@@ -2239,6 +2228,20 @@ var NativeComponents = (function (exports) {
2239
2228
  bindAttributeWithObservable(element, attributeName, this);
2240
2229
  };
2241
2230
 
2231
+ ObservableItem.prototype.bindClassProperty = function(element, className) {
2232
+ element.classes.toggle(className, this.val());
2233
+ this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
2234
+ };
2235
+
2236
+ ObservableWhen.prototype.bindClassProperty = function(element, className) {
2237
+ element.classes.toggle(className, this.isActive());
2238
+ this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
2239
+ };
2240
+
2241
+ Boolean.prototype.bindClassProperty = function(element, className) {
2242
+ element.classes.toggle(className, this);
2243
+ };
2244
+
2242
2245
  let $textNodeCache = null;
2243
2246
 
2244
2247
  const ElementCreator = {
@@ -3070,19 +3073,22 @@ var NativeComponents = (function (exports) {
3070
3073
  }
3071
3074
  }
3072
3075
  if(this.$classes) {
3073
- const cache = {};
3074
3076
  const keys = Object.keys(this.$classes);
3075
3077
 
3076
3078
  if(keys.length === 1) {
3077
3079
  const key = keys[0];
3078
3080
  const callback = this.$classes[key];
3079
3081
  steps.push((clonedNode, data) => {
3080
- cache[key] = callback.apply(null, data);
3081
- ElementCreator.processClassAttribute(clonedNode, cache);
3082
+ callback.apply(null, data).bindClassProperty(clonedNode, key);
3082
3083
  });
3083
3084
  } else {
3085
+ const properties = this.$classes;
3086
+ const keysLength = keys.length;
3084
3087
  steps.push((clonedNode, data) => {
3085
- ElementCreator.processClassAttribute(clonedNode, buildProperties(cache, this.$classes, data));
3088
+ for(let i = 0; i < keysLength; i++) {
3089
+ const key = keys[i];
3090
+ properties[key].apply(null, data).bindClassProperty(clonedNode, key);
3091
+ }
3086
3092
  });
3087
3093
  }
3088
3094
  }
@@ -3946,7 +3952,7 @@ var NativeComponents = (function (exports) {
3946
3952
  const $getStoreOrThrow = (method, name) => {
3947
3953
  const item = $stores.get(name);
3948
3954
  if (!item) {
3949
- DebugManager$2.error('Store', `Store.${method}('${name}') : store not found. Did you call Store.create('${name}') first?`);
3955
+ DebugManager$1.error('Store', `Store.${method}('${name}') : store not found. Did you call Store.create('${name}') first?`);
3950
3956
  throw new NativeDocumentError(
3951
3957
  `Store.${method}('${name}') : store not found.`
3952
3958
  );
@@ -3959,7 +3965,7 @@ var NativeComponents = (function (exports) {
3959
3965
  */
3960
3966
  const $applyReadOnly = (observer, name, context) => {
3961
3967
  const readOnlyError = (method) => () => {
3962
- DebugManager$2.error('Store', `Store.${context}('${name}') is read-only. '${method}()' is not allowed.`);
3968
+ DebugManager$1.error('Store', `Store.${context}('${name}') is read-only. '${method}()' is not allowed.`);
3963
3969
  throw new NativeDocumentError(
3964
3970
  `Store.${context}('${name}') is read-only.`
3965
3971
  );
@@ -3990,7 +3996,7 @@ var NativeComponents = (function (exports) {
3990
3996
  */
3991
3997
  create(name, value) {
3992
3998
  if ($stores.has(name)) {
3993
- DebugManager$2.warn('Store', `Store.create('${name}') : a store with this name already exists. Use Store.get('${name}') to retrieve it.`);
3999
+ DebugManager$1.warn('Store', `Store.create('${name}') : a store with this name already exists. Use Store.get('${name}') to retrieve it.`);
3994
4000
  throw new NativeDocumentError(
3995
4001
  `Store.create('${name}') : a store with this name already exists.`
3996
4002
  );
@@ -4011,7 +4017,7 @@ var NativeComponents = (function (exports) {
4011
4017
  */
4012
4018
  createResettable(name, value) {
4013
4019
  if ($stores.has(name)) {
4014
- DebugManager$2.warn('Store', `Store.createResettable('${name}') : a store with this name already exists.`);
4020
+ DebugManager$1.warn('Store', `Store.createResettable('${name}') : a store with this name already exists.`);
4015
4021
  throw new NativeDocumentError(
4016
4022
  `Store.createResettable('${name}') : a store with this name already exists.`
4017
4023
  );
@@ -4047,7 +4053,7 @@ var NativeComponents = (function (exports) {
4047
4053
  */
4048
4054
  createComposed(name, computation, dependencies) {
4049
4055
  if ($stores.has(name)) {
4050
- DebugManager$2.warn('Store', `Store.createComposed('${name}') : a store with this name already exists.`);
4056
+ DebugManager$1.warn('Store', `Store.createComposed('${name}') : a store with this name already exists.`);
4051
4057
  throw new NativeDocumentError(
4052
4058
  `Store.createComposed('${name}') : a store with this name already exists.`
4053
4059
  );
@@ -4070,7 +4076,7 @@ var NativeComponents = (function (exports) {
4070
4076
  }
4071
4077
  const depItem = $stores.get(depName);
4072
4078
  if (!depItem) {
4073
- DebugManager$2.error('Store', `Store.createComposed('${name}') : dependency '${depName}' not found. Create it first.`);
4079
+ DebugManager$1.error('Store', `Store.createComposed('${name}') : dependency '${depName}' not found. Create it first.`);
4074
4080
  throw new NativeDocumentError(
4075
4081
  `Store.createComposed('${name}') : dependency store '${depName}' not found.`
4076
4082
  );
@@ -4104,13 +4110,13 @@ var NativeComponents = (function (exports) {
4104
4110
  reset(name) {
4105
4111
  const item = $getStoreOrThrow('reset', name);
4106
4112
  if (item.composed) {
4107
- DebugManager$2.error('Store', `Store.reset('${name}') : composed stores cannot be reset. Their value is derived from dependencies.`);
4113
+ DebugManager$1.error('Store', `Store.reset('${name}') : composed stores cannot be reset. Their value is derived from dependencies.`);
4108
4114
  throw new NativeDocumentError(
4109
4115
  `Store.reset('${name}') : composed stores cannot be reset.`
4110
4116
  );
4111
4117
  }
4112
4118
  if (!item.resettable) {
4113
- DebugManager$2.error('Store', `Store.reset('${name}') : this store is not resettable. Use Store.createResettable('${name}', value) instead of Store.create().`);
4119
+ DebugManager$1.error('Store', `Store.reset('${name}') : this store is not resettable. Use Store.createResettable('${name}', value) instead of Store.create().`);
4114
4120
  throw new NativeDocumentError(
4115
4121
  `Store.reset('${name}') : this store is not resettable. Use Store.createResettable('${name}', value) instead of Store.create().`
4116
4122
  );
@@ -4131,7 +4137,7 @@ var NativeComponents = (function (exports) {
4131
4137
  const item = $getStoreOrThrow('use', name);
4132
4138
 
4133
4139
  if (item.composed) {
4134
- DebugManager$2.error('Store', `Store.use('${name}') : composed stores are read-only. Use Store.follow('${name}') instead.`);
4140
+ DebugManager$1.error('Store', `Store.use('${name}') : composed stores are read-only. Use Store.follow('${name}') instead.`);
4135
4141
  throw new NativeDocumentError(
4136
4142
  `Store.use('${name}') : composed stores are read-only. Use Store.follow('${name}') instead.`
4137
4143
  );
@@ -4198,7 +4204,7 @@ var NativeComponents = (function (exports) {
4198
4204
  get(name) {
4199
4205
  const item = $stores.get(name);
4200
4206
  if (!item) {
4201
- DebugManager$2.warn('Store', `Store.get('${name}') : store not found.`);
4207
+ DebugManager$1.warn('Store', `Store.get('${name}') : store not found.`);
4202
4208
  return null;
4203
4209
  }
4204
4210
  return item.observer;
@@ -4220,7 +4226,7 @@ var NativeComponents = (function (exports) {
4220
4226
  delete(name) {
4221
4227
  const item = $stores.get(name);
4222
4228
  if (!item) {
4223
- DebugManager$2.warn('Store', `Store.delete('${name}') : store not found, nothing to delete.`);
4229
+ DebugManager$1.warn('Store', `Store.delete('${name}') : store not found, nothing to delete.`);
4224
4230
  return;
4225
4231
  }
4226
4232
  item.subscribers.forEach(follower => follower.destroy());
@@ -4322,7 +4328,7 @@ var NativeComponents = (function (exports) {
4322
4328
  return undefined;
4323
4329
  },
4324
4330
  set(target, prop, value) {
4325
- DebugManager$2.error('Store', `Forbidden: You cannot overwrite the store key '${String(prop)}'. Use .use('${String(prop)}').set(value) instead.`);
4331
+ DebugManager$1.error('Store', `Forbidden: You cannot overwrite the store key '${String(prop)}'. Use .use('${String(prop)}').set(value) instead.`);
4326
4332
  throw new NativeDocumentError(`Store structure is immutable. Use .set() on the observable.`);
4327
4333
  },
4328
4334
  deleteProperty(target, prop) {
@@ -1788,22 +1788,7 @@ var NativeDocument = (function (exports) {
1788
1788
  */
1789
1789
  const bindClassAttribute = (element, data) => {
1790
1790
  for(const className in data) {
1791
- const value = data[className];
1792
- if(value.__$isObservable) {
1793
- element.classes.toggle(className, value.val());
1794
- value.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
1795
- continue;
1796
- }
1797
- if(value.__$isObservableWhen) {
1798
- element.classes.toggle(className, value.isActive());
1799
- value.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
1800
- continue;
1801
- }
1802
- if(value.$hydrate) {
1803
- value.$hydrate(element, className);
1804
- continue;
1805
- }
1806
- element.classes.toggle(className, value);
1791
+ data[className].bindClassProperty(element, className);
1807
1792
  }
1808
1793
  };
1809
1794
 
@@ -1873,6 +1858,35 @@ var NativeDocument = (function (exports) {
1873
1858
  element.setAttribute(attributeName, value.val());
1874
1859
  };
1875
1860
 
1861
+
1862
+ const AttributeHandlers = {
1863
+ string: (element, attributeName, value) => element.setAttribute(attributeName, value),
1864
+ number: (element, attributeName, value) => element.setAttribute(attributeName, value),
1865
+ boolean: (element, attributeName, value) => bindBooleanAttribute(element, attributeName, value),
1866
+ object: (element, attributeName, value) => {
1867
+ if(value == null) {
1868
+ return;
1869
+ }
1870
+
1871
+ if(value.handleNdAttribute) {
1872
+ value.handleNdAttribute(element, attributeName);
1873
+ return;
1874
+ }
1875
+
1876
+ if(attributeName === 'class') {
1877
+ bindClassAttribute(element, value);
1878
+ return;
1879
+ }
1880
+ if(attributeName === 'style') {
1881
+ bindStyleAttribute(element, value);
1882
+ return;
1883
+ }
1884
+ if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
1885
+ bindBooleanAttribute(element, attributeName, value);
1886
+ }
1887
+ }
1888
+ };
1889
+
1876
1890
  /**
1877
1891
  *
1878
1892
  * @param {HTMLElement} element
@@ -1887,29 +1901,8 @@ var NativeDocument = (function (exports) {
1887
1901
  for(const originalAttributeName in attributes) {
1888
1902
  const attributeName = originalAttributeName.toLowerCase();
1889
1903
  let value = attributes[originalAttributeName];
1890
- if(value == null) {
1891
- continue;
1892
- }
1893
- if(value.handleNdAttribute) {
1894
- value.handleNdAttribute(element, attributeName, value);
1895
- continue;
1896
- }
1897
- if(typeof value === 'object') {
1898
- if(attributeName === 'class') {
1899
- bindClassAttribute(element, value);
1900
- continue;
1901
- }
1902
- if(attributeName === 'style') {
1903
- bindStyleAttribute(element, value);
1904
- continue;
1905
- }
1906
- }
1907
- if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
1908
- bindBooleanAttribute(element, attributeName, value);
1909
- continue;
1910
- }
1911
-
1912
- element.setAttribute(attributeName, value);
1904
+ const typeOf = typeof value;
1905
+ AttributeHandlers[typeOf](element, attributeName, value);
1913
1906
  }
1914
1907
  return element;
1915
1908
  };
@@ -2062,10 +2055,6 @@ var NativeDocument = (function (exports) {
2062
2055
  return this;
2063
2056
  };
2064
2057
 
2065
- String.prototype.handleNdAttribute = function(element, attributeName) {
2066
- element.setAttribute(attributeName, this);
2067
- };
2068
-
2069
2058
  ObservableItem.prototype.handleNdAttribute = function(element, attributeName) {
2070
2059
  if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
2071
2060
  bindBooleanAttribute(element, attributeName, this);
@@ -2079,6 +2068,24 @@ var NativeDocument = (function (exports) {
2079
2068
  this.$hydrate(element, attributeName);
2080
2069
  };
2081
2070
 
2071
+ ObservableItem.prototype.bindClassProperty = function(element, className) {
2072
+ element.classes.toggle(className, this.val());
2073
+ this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
2074
+ };
2075
+
2076
+ ObservableWhen.prototype.bindClassProperty = function(element, className) {
2077
+ element.classes.toggle(className, this.isActive());
2078
+ this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
2079
+ };
2080
+
2081
+ TemplateBinding.prototype.bindClassProperty = function(element, className) {
2082
+ this.$hydrate(element, className);
2083
+ };
2084
+
2085
+ Boolean.prototype.bindClassProperty = function(element, className) {
2086
+ element.classes.toggle(className, this);
2087
+ };
2088
+
2082
2089
  let $textNodeCache = null;
2083
2090
 
2084
2091
  const ElementCreator = {
@@ -3039,19 +3046,22 @@ var NativeDocument = (function (exports) {
3039
3046
  }
3040
3047
  }
3041
3048
  if(this.$classes) {
3042
- const cache = {};
3043
3049
  const keys = Object.keys(this.$classes);
3044
3050
 
3045
3051
  if(keys.length === 1) {
3046
3052
  const key = keys[0];
3047
3053
  const callback = this.$classes[key];
3048
3054
  steps.push((clonedNode, data) => {
3049
- cache[key] = callback.apply(null, data);
3050
- ElementCreator.processClassAttribute(clonedNode, cache);
3055
+ callback.apply(null, data).bindClassProperty(clonedNode, key);
3051
3056
  });
3052
3057
  } else {
3058
+ const properties = this.$classes;
3059
+ const keysLength = keys.length;
3053
3060
  steps.push((clonedNode, data) => {
3054
- ElementCreator.processClassAttribute(clonedNode, buildProperties(cache, this.$classes, data));
3061
+ for(let i = 0; i < keysLength; i++) {
3062
+ const key = keys[i];
3063
+ properties[key].apply(null, data).bindClassProperty(clonedNode, key);
3064
+ }
3055
3065
  });
3056
3066
  }
3057
3067
  }