native-document 1.0.16-8.3 → 1.0.16-8.4
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/package.json +1 -1
- package/src/core/wrappers/AttributesWrapper.js +22 -3
- package/src/core/wrappers/ElementCreator.js +0 -2
- package/src/core/wrappers/NDElement.js +8 -0
- package/src/core/wrappers/prototypes/attributes-extensions.js +9 -174
- package/src/core/wrappers/prototypes/nd-element-extensions.js +57 -83
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "native-document",
|
|
3
|
-
"version": "1.0.168.
|
|
3
|
+
"version": "1.0.168.04",
|
|
4
4
|
"description": "A reactive JavaScript framework that preserves native DOM simplicity without sacrificing modern features",
|
|
5
5
|
"author": "AfroCodeur <https://github.com/afrocodeur>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -97,7 +97,7 @@ export const bindBooleanAttribute = (element, attributeName, value) => {
|
|
|
97
97
|
|
|
98
98
|
const attributeRealName = BOOL_ATTRIBUTES_NAME[attributeName];
|
|
99
99
|
|
|
100
|
-
if(
|
|
100
|
+
if(Validator.isBoolean(defaultValue)) {
|
|
101
101
|
element[attributeRealName] = defaultValue;
|
|
102
102
|
}
|
|
103
103
|
else {
|
|
@@ -149,12 +149,31 @@ const AttributesWrapper = (element, attributes) => {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
for(const originalAttributeName in attributes) {
|
|
152
|
+
const attributeName = originalAttributeName.toLowerCase();
|
|
152
153
|
const value = attributes[originalAttributeName];
|
|
153
154
|
if(value == null) {
|
|
154
155
|
continue;
|
|
155
156
|
}
|
|
156
|
-
|
|
157
|
-
|
|
157
|
+
if(value.handleNdAttribute) {
|
|
158
|
+
value.handleNdAttribute(element, attributeName, value);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if(typeof value === 'object') {
|
|
162
|
+
if(attributeName === 'class') {
|
|
163
|
+
bindClassAttribute(element, value);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if(attributeName === 'style') {
|
|
167
|
+
bindStyleAttribute(element, value);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
|
|
172
|
+
bindBooleanAttribute(element, attributeName, value);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
element.setAttribute(attributeName, value);
|
|
158
177
|
}
|
|
159
178
|
return element;
|
|
160
179
|
};
|
|
@@ -38,6 +38,14 @@ NDElement.$getChild = (el) => el;
|
|
|
38
38
|
NDElement.prototype.ghostDom = function(element) {
|
|
39
39
|
if(!this.$attachements) {
|
|
40
40
|
this.$attachements = document.createDocumentFragment();
|
|
41
|
+
this.toNdElement = () => {
|
|
42
|
+
const fragment = document.createDocumentFragment();
|
|
43
|
+
if(!this.$attachements.contains(this.$element)) {
|
|
44
|
+
fragment.appendChild(this.$element);
|
|
45
|
+
}
|
|
46
|
+
fragment.appendChild(this.$attachements);
|
|
47
|
+
return fragment;
|
|
48
|
+
};
|
|
41
49
|
}
|
|
42
50
|
this.$attachements.appendChild(NDElement.$getChild(element));
|
|
43
51
|
return this;
|
|
@@ -1,189 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
-
bindAttributeWithObservable,
|
|
2
|
+
bindAttributeWithObservable,
|
|
3
|
+
bindBooleanAttribute,
|
|
3
4
|
} from '../AttributesWrapper';
|
|
4
5
|
import ObservableItem from '../../data/ObservableItem';
|
|
5
6
|
import TemplateBinding from '../TemplateBinding';
|
|
6
|
-
import {
|
|
7
|
-
import { Observable } from '../../data/Observable';
|
|
7
|
+
import {BOOLEAN_ATTRIBUTES} from '../constants';
|
|
8
8
|
import ObservableChecker from '../../data/ObservableChecker';
|
|
9
|
-
import { ObservableWhen } from '../../data/ObservableWhen';
|
|
10
9
|
|
|
11
|
-
/**
|
|
12
|
-
* Extends a prototype with a non-enumerable, configurable, writable property.
|
|
13
|
-
* Prevents prototype pollution issues (e.g. for...in loops) while keeping
|
|
14
|
-
* the property overridable and deletable.
|
|
15
|
-
*
|
|
16
|
-
* @param {Function} Constructor - The constructor whose prototype to extend
|
|
17
|
-
* @param {string} name - Property name
|
|
18
|
-
* @param {Function} fn - Implementation
|
|
19
|
-
*/
|
|
20
|
-
const extendsPrototype = (Constructor, name, fn) => {
|
|
21
|
-
Object.defineProperty(Constructor.prototype, name, {
|
|
22
|
-
value: fn,
|
|
23
|
-
enumerable: false,
|
|
24
|
-
configurable: true,
|
|
25
|
-
writable: true,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
10
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (attributeName === 'class') {
|
|
33
|
-
bindClassAttribute(element, this);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (attributeName === 'style') {
|
|
37
|
-
bindStyleAttribute(element, this);
|
|
11
|
+
ObservableItem.prototype.handleNdAttribute = function(element, attributeName) {
|
|
12
|
+
if(BOOLEAN_ATTRIBUTES.has(attributeName)) {
|
|
13
|
+
bindBooleanAttribute(element, attributeName, this);
|
|
38
14
|
return;
|
|
39
15
|
}
|
|
40
|
-
element.setAttribute(attributeName, JSON.stringify(this));
|
|
41
|
-
});
|
|
42
16
|
|
|
43
|
-
const handleAttributeFn = function(element, attributeName) {
|
|
44
|
-
if (BOOLEAN_ATTRIBUTES.has(attributeName)) {
|
|
45
|
-
this.handleNdBooleanAttribute(element, attributeName);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
17
|
bindAttributeWithObservable(element, attributeName, this);
|
|
49
18
|
};
|
|
50
|
-
extendsPrototype(ObservableItem, 'handleNdAttribute', handleAttributeFn);
|
|
51
|
-
extendsPrototype(ObservableWhen, 'handleNdAttribute', handleAttributeFn);
|
|
52
|
-
|
|
53
|
-
extendsPrototype(TemplateBinding, 'handleNdAttribute', function(element, attributeName) {
|
|
54
|
-
this.$hydrate(element, attributeName);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
extendsPrototype(Number, 'handleNdAttribute', function(element, attributeName) {
|
|
58
|
-
element.setAttribute(attributeName, this.toString());
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
extendsPrototype(String, 'handleNdAttribute', function(element, attributeName) {
|
|
62
|
-
element.setAttribute(attributeName, this.toString());
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
extendsPrototype(Array, 'handleNdAttribute', function(element, attributeName) {
|
|
66
|
-
element.setAttribute(attributeName, this.toString());
|
|
67
|
-
});
|
|
68
19
|
|
|
69
|
-
|
|
70
|
-
element[attributeName] = this;
|
|
71
|
-
});
|
|
20
|
+
ObservableChecker.prototype.handleNdAttribute = ObservableItem.prototype.handleNdAttribute;
|
|
72
21
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
extendsPrototype(Boolean, 'handleNdBooleanAttribute', function(element, attributeName) {
|
|
76
|
-
element[attributeName] = this;
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
extendsPrototype(String, 'handleNdBooleanAttribute', function(element, attributeName) {
|
|
80
|
-
element[attributeName] = this === element.value;
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
const booleanAttributeFn = function(element, attributeName) {
|
|
84
|
-
const defaultValue = this.val();
|
|
85
|
-
defaultValue.handleNdBooleanAttribute(element, attributeName);
|
|
86
|
-
|
|
87
|
-
if (attributeName === 'checked') {
|
|
88
|
-
if (typeof defaultValue === 'boolean') {
|
|
89
|
-
element.addEventListener('input', () => this.set(element[attributeName]));
|
|
90
|
-
} else {
|
|
91
|
-
element.addEventListener('input', () => this.set(element.value));
|
|
92
|
-
}
|
|
93
|
-
this.subscribe((newValue) => element[attributeName] = newValue);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
this.subscribe((newValue) => element[attributeName] = (newValue === element.value));
|
|
22
|
+
TemplateBinding.prototype.handleNdAttribute = function(element, attributeName) {
|
|
23
|
+
this.$hydrate(element, attributeName);
|
|
98
24
|
};
|
|
99
|
-
extendsPrototype(ObservableItem, 'handleNdBooleanAttribute', booleanAttributeFn);
|
|
100
|
-
extendsPrototype(ObservableWhen, 'handleNdBooleanAttribute', booleanAttributeFn);
|
|
101
|
-
|
|
102
|
-
// -- handleStyleProperty ------------------------------------------------------
|
|
103
|
-
//
|
|
104
|
-
// extendsPrototype(String, 'handleStyleProperty', function(element, styleName) {
|
|
105
|
-
// const isCustomProperty = styleName.startsWith('--');
|
|
106
|
-
// if (isCustomProperty) {
|
|
107
|
-
// element.style.setProperty(styleName, this);
|
|
108
|
-
// return;
|
|
109
|
-
// }
|
|
110
|
-
// element.style[styleName] = this;
|
|
111
|
-
// });
|
|
112
|
-
//
|
|
113
|
-
// extendsPrototype(Number, 'handleStyleProperty', String.prototype.handleStyleProperty);
|
|
114
|
-
//
|
|
115
|
-
// extendsPrototype(ObservableItem, 'handleStyleProperty', function(element, styleName) {
|
|
116
|
-
// const isCustomProperty = styleName.startsWith('--');
|
|
117
|
-
//
|
|
118
|
-
// if (isCustomProperty) {
|
|
119
|
-
// element.style.setProperty(styleName, this.val());
|
|
120
|
-
// this.subscribe((newValue) => {
|
|
121
|
-
// if (newValue === false) {
|
|
122
|
-
// element.style.removeProperty(styleName);
|
|
123
|
-
// return;
|
|
124
|
-
// }
|
|
125
|
-
// element.style.setProperty(styleName, newValue);
|
|
126
|
-
// });
|
|
127
|
-
// return;
|
|
128
|
-
// }
|
|
129
|
-
//
|
|
130
|
-
// element.style[styleName] = this.val();
|
|
131
|
-
// this.subscribe((newValue) => {
|
|
132
|
-
// if (newValue === false) {
|
|
133
|
-
// element.style.removeProperty(styleName);
|
|
134
|
-
// return;
|
|
135
|
-
// }
|
|
136
|
-
// element.style[styleName] = newValue;
|
|
137
|
-
// });
|
|
138
|
-
// });
|
|
139
|
-
//
|
|
140
|
-
// extendsPrototype(Array, 'handleStyleProperty', function(element, styleName) {
|
|
141
|
-
// const dependencies = this.filter((item) => item.__$Observable);
|
|
142
|
-
// if (dependencies.length) {
|
|
143
|
-
// const style = Observable.computed(
|
|
144
|
-
// () => this.map((item) => item.valueOf()).join(', '),
|
|
145
|
-
// dependencies,
|
|
146
|
-
// );
|
|
147
|
-
// style.handleStyleProperty(element, styleName);
|
|
148
|
-
// return;
|
|
149
|
-
// }
|
|
150
|
-
// element.style[styleName] = this.join(', ');
|
|
151
|
-
// });
|
|
152
|
-
|
|
153
|
-
// -- handleClassValue ------------------------------------------------------
|
|
154
|
-
// extendsPrototype(ObservableItem, 'handleClassValue', function(element, className) {
|
|
155
|
-
// element.classes.toggle(className, this.val());
|
|
156
|
-
// this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
|
|
157
|
-
// });
|
|
158
|
-
//
|
|
159
|
-
// extendsPrototype(ObservableWhen, 'handleClassValue', function(element, className) {
|
|
160
|
-
// element.classes.toggle(className, this.val());
|
|
161
|
-
// this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
|
|
162
|
-
// });
|
|
163
|
-
//
|
|
164
|
-
// extendsPrototype(ObservableChecker, 'handleClassValue', function(element, className) {
|
|
165
|
-
// let lastClass = this.val();
|
|
166
|
-
// if(typeof lastClass === 'string') {
|
|
167
|
-
// element.classes.toggle(lastClass, true);
|
|
168
|
-
// this.subscribe((currentValue) => {
|
|
169
|
-
// element.classes.remove(lastClass);
|
|
170
|
-
// element.classes.toggle(currentValue, true);
|
|
171
|
-
// lastClass = currentValue;
|
|
172
|
-
// });
|
|
173
|
-
// return;
|
|
174
|
-
// }
|
|
175
|
-
// element.classes.toggle(className, this.val());
|
|
176
|
-
// this.subscribe((shouldAdd) => element.classes.toggle(className, shouldAdd));
|
|
177
|
-
// });
|
|
178
|
-
//
|
|
179
|
-
// extendsPrototype(TemplateBinding, 'handleClassValue', function(element, className) {
|
|
180
|
-
// this.$hydrate(element, className);
|
|
181
|
-
// });
|
|
182
|
-
//
|
|
183
|
-
// extendsPrototype(String, 'handleClassValue', function(element, className) {
|
|
184
|
-
// element.classes.toggle(className, this);
|
|
185
|
-
// });
|
|
186
|
-
//
|
|
187
|
-
// extendsPrototype(Boolean, 'handleClassValue', function(element, className) {
|
|
188
|
-
// element.classes.toggle(className);
|
|
189
|
-
// });
|
|
@@ -1,157 +1,131 @@
|
|
|
1
1
|
import ObservableItem from '../../data/ObservableItem';
|
|
2
|
-
import {
|
|
2
|
+
import {NDElement} from '../NDElement';
|
|
3
3
|
import TemplateBinding from '../TemplateBinding';
|
|
4
|
-
import {
|
|
4
|
+
import {ElementCreator} from '../ElementCreator';
|
|
5
5
|
import PluginsManager from '../../utils/plugins-manager';
|
|
6
6
|
import ObservableChecker from '../../data/ObservableChecker';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Extends a prototype with a non-enumerable, configurable, writable property.
|
|
10
|
-
*
|
|
11
|
-
* @param {Function} Constructor - The constructor whose prototype to extend
|
|
12
|
-
* @param {string} name - Property name
|
|
13
|
-
* @param {Function} fn - Implementation
|
|
14
|
-
*/
|
|
15
|
-
function extendsPrototype(Constructor, name, fn) {
|
|
16
|
-
Object.defineProperty(Constructor.prototype, name, {
|
|
17
|
-
value: fn,
|
|
18
|
-
enumerable: false,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// -- Static assignment (not a prototype method) -------------------------------
|
|
25
8
|
|
|
26
9
|
NDElement.$getChild = ElementCreator.getChild;
|
|
27
10
|
|
|
28
|
-
// -- toNdElement --------------------------------------------------------------
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Converts a string to a static text node.
|
|
32
|
-
* @returns {Text}
|
|
33
|
-
*/
|
|
34
|
-
extendsPrototype(Object, 'toNdElement', function() {
|
|
35
|
-
return ElementCreator.createStaticTextNode(null, JSON.stringify(this));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
11
|
/**
|
|
39
|
-
* Converts a string to a
|
|
40
|
-
*
|
|
12
|
+
* Converts a string to a reactive text node.
|
|
13
|
+
*
|
|
14
|
+
* @returns {Text} Static text node containing the string value
|
|
41
15
|
*/
|
|
42
|
-
|
|
16
|
+
String.prototype.toNdElement = function () {
|
|
43
17
|
return ElementCreator.createStaticTextNode(null, this);
|
|
44
|
-
}
|
|
18
|
+
};
|
|
45
19
|
|
|
46
20
|
/**
|
|
47
21
|
* Converts a number to a static text node.
|
|
48
|
-
*
|
|
22
|
+
*
|
|
23
|
+
* @returns {Text} Static text node containing the number as a string
|
|
49
24
|
*/
|
|
50
|
-
|
|
25
|
+
Number.prototype.toNdElement = function () {
|
|
51
26
|
return ElementCreator.createStaticTextNode(null, this.toString());
|
|
52
|
-
}
|
|
27
|
+
};
|
|
53
28
|
|
|
54
29
|
/**
|
|
55
30
|
* Returns the element itself (identity for DOM compatibility).
|
|
56
|
-
*
|
|
31
|
+
*
|
|
32
|
+
* @returns {Element} this
|
|
57
33
|
*/
|
|
58
|
-
|
|
34
|
+
Element.prototype.toNdElement = function () {
|
|
59
35
|
return this;
|
|
60
|
-
}
|
|
36
|
+
};
|
|
61
37
|
|
|
62
38
|
/**
|
|
63
39
|
* Returns the text node itself (identity for DOM compatibility).
|
|
64
|
-
*
|
|
40
|
+
*
|
|
41
|
+
* @returns {Text} this
|
|
65
42
|
*/
|
|
66
|
-
|
|
43
|
+
Text.prototype.toNdElement = function () {
|
|
67
44
|
return this;
|
|
68
|
-
}
|
|
45
|
+
};
|
|
69
46
|
|
|
70
47
|
/**
|
|
71
48
|
* Returns the comment node itself (identity for DOM compatibility).
|
|
72
|
-
*
|
|
49
|
+
*
|
|
50
|
+
* @returns {Comment} this
|
|
73
51
|
*/
|
|
74
|
-
|
|
52
|
+
Comment.prototype.toNdElement = function () {
|
|
75
53
|
return this;
|
|
76
|
-
}
|
|
54
|
+
};
|
|
77
55
|
|
|
78
56
|
/**
|
|
79
57
|
* Returns the document itself (identity for DOM compatibility).
|
|
80
|
-
*
|
|
58
|
+
*
|
|
59
|
+
* @returns {Document} this
|
|
81
60
|
*/
|
|
82
|
-
|
|
61
|
+
Document.prototype.toNdElement = function () {
|
|
83
62
|
return this;
|
|
84
|
-
}
|
|
63
|
+
};
|
|
85
64
|
|
|
86
65
|
/**
|
|
87
66
|
* Returns the document fragment itself (identity for DOM compatibility).
|
|
88
|
-
*
|
|
67
|
+
*
|
|
68
|
+
* @returns {DocumentFragment} this
|
|
89
69
|
*/
|
|
90
|
-
|
|
70
|
+
DocumentFragment.prototype.toNdElement = function () {
|
|
91
71
|
return this;
|
|
92
|
-
}
|
|
72
|
+
};
|
|
93
73
|
|
|
94
74
|
/**
|
|
95
75
|
* Converts the ObservableItem to a reactive text node that updates automatically when the value changes.
|
|
96
|
-
*
|
|
76
|
+
*
|
|
77
|
+
* @returns {Text} Reactive text node bound to this observable
|
|
97
78
|
*/
|
|
98
|
-
|
|
79
|
+
ObservableItem.prototype.toNdElement = function () {
|
|
99
80
|
return ElementCreator.createObservableNode(null, this);
|
|
100
|
-
}
|
|
81
|
+
};
|
|
101
82
|
|
|
102
|
-
|
|
103
|
-
* ObservableChecker shares the same reactive text node behaviour as ObservableItem.
|
|
104
|
-
* @returns {Text}
|
|
105
|
-
*/
|
|
106
|
-
extendsPrototype(ObservableChecker, 'toNdElement', ObservableItem.prototype.toNdElement);
|
|
83
|
+
ObservableChecker.prototype.toNdElement = ObservableItem.prototype.toNdElement;
|
|
107
84
|
|
|
108
85
|
/**
|
|
109
86
|
* Converts the NDElement to its underlying HTMLElement (or ghost DOM fragment if ghostDom was used).
|
|
110
|
-
*
|
|
87
|
+
*
|
|
88
|
+
* @returns {HTMLElement|DocumentFragment} The underlying DOM node
|
|
111
89
|
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!this.$attachements.contains(this.$element)) {
|
|
116
|
-
this.$attachements.append(this.$element);
|
|
117
|
-
}
|
|
118
|
-
return this.$attachements;
|
|
119
|
-
}
|
|
120
|
-
return element;
|
|
121
|
-
});
|
|
90
|
+
NDElement.prototype.toNdElement = function () {
|
|
91
|
+
return this.$element;
|
|
92
|
+
};
|
|
122
93
|
|
|
123
94
|
/**
|
|
124
|
-
* Converts the array to a DocumentFragment containing all
|
|
95
|
+
* Converts the array to a DocumentFragment containing all elements.
|
|
125
96
|
* Each item is processed through ElementCreator.getChild().
|
|
126
|
-
*
|
|
97
|
+
*
|
|
98
|
+
* @returns {DocumentFragment} Fragment containing all array children
|
|
127
99
|
*/
|
|
128
|
-
|
|
100
|
+
Array.prototype.toNdElement = function () {
|
|
129
101
|
const fragment = document.createDocumentFragment();
|
|
130
|
-
for
|
|
102
|
+
for(let i = 0, length = this.length; i < length; i++) {
|
|
131
103
|
const child = ElementCreator.getChild(this[i]);
|
|
132
|
-
if
|
|
104
|
+
if(child === null) continue;
|
|
133
105
|
fragment.appendChild(child);
|
|
134
106
|
}
|
|
135
107
|
return fragment;
|
|
136
|
-
}
|
|
108
|
+
};
|
|
137
109
|
|
|
138
110
|
/**
|
|
139
111
|
* Calls the function and converts its return value to a DOM node.
|
|
140
112
|
* Used internally by ElementCreator to process function-based children.
|
|
141
|
-
*
|
|
113
|
+
*
|
|
114
|
+
* @returns {Node} The DOM node returned by the function
|
|
142
115
|
*/
|
|
143
|
-
|
|
116
|
+
Function.prototype.toNdElement = function () {
|
|
144
117
|
const child = this;
|
|
145
|
-
if
|
|
118
|
+
if(process.env.NODE_ENV === 'development') {
|
|
146
119
|
PluginsManager.emit('BeforeProcessComponent', child);
|
|
147
120
|
}
|
|
148
121
|
return ElementCreator.getChild(child());
|
|
149
|
-
}
|
|
122
|
+
};
|
|
150
123
|
|
|
151
124
|
/**
|
|
152
125
|
* Converts the TemplateBinding to a hydratable DOM node for use in TemplateCloner.
|
|
153
|
-
*
|
|
126
|
+
*
|
|
127
|
+
* @returns {Node} Hydratable node
|
|
154
128
|
*/
|
|
155
|
-
|
|
129
|
+
TemplateBinding.prototype.toNdElement = function () {
|
|
156
130
|
return ElementCreator.createHydratableNode(null, this);
|
|
157
|
-
}
|
|
131
|
+
};
|