j-templates 5.0.50 → 5.0.52
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/DOM/createEventAssignment.d.ts +3 -0
- package/DOM/createEventAssignment.js +29 -0
- package/DOM/createPropertyAssignment.d.ts +4 -0
- package/DOM/createPropertyAssignment.js +74 -0
- package/DOM/domNodeConfig.d.ts +1 -1
- package/DOM/domNodeConfig.js +27 -12
- package/DOM/elements.d.ts +1 -0
- package/DOM/elements.js +27 -24
- package/DOM/index.d.ts +2 -1
- package/DOM/index.js +2 -1
- package/DOM/svgElements.js +3 -4
- package/Node/boundNode.js +16 -34
- package/Node/boundNode.types.d.ts +10 -4
- package/Node/component.js +1 -0
- package/Node/componentNode.js +0 -1
- package/Node/elementNode.js +12 -13
- package/Node/nodeConfig.d.ts +10 -1
- package/Node/nodeRef.d.ts +1 -1
- package/Node/nodeRef.js +58 -26
- package/Node/nodeRef.types.d.ts +2 -4
- package/Store/Diff/diffTree.js +1 -2
- package/Store/Tree/observableComputed.d.ts +4 -0
- package/Store/Tree/observableComputed.js +45 -0
- package/Store/Tree/observableNode.d.ts +3 -0
- package/Store/Tree/observableNode.js +195 -0
- package/Store/Tree/observableScope.d.ts +7 -12
- package/Store/Tree/observableScope.js +38 -34
- package/Store/index.d.ts +2 -0
- package/Store/index.js +5 -1
- package/Utils/decorators.d.ts +3 -1
- package/Utils/decorators.js +36 -39
- package/Utils/emitter.d.ts +2 -6
- package/Utils/emitter.js +8 -1
- package/Utils/json.d.ts +7 -0
- package/Utils/json.js +109 -0
- package/Utils/list.js +7 -7
- package/Utils/thread.d.ts +9 -15
- package/Utils/thread.js +36 -29
- package/jTemplates.js +1 -3176
- package/jTemplates.js.map +1 -1
- package/package.json +1 -1
- package/web.export.d.ts +1 -1
- package/web.export.js +3 -1
- package/DOM/utils.d.ts +0 -1
- package/DOM/utils.js +0 -47
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateEventAssignment = CreateEventAssignment;
|
|
4
|
+
function AssignEvent(target, event) {
|
|
5
|
+
let lastValue;
|
|
6
|
+
return function Assign(value) {
|
|
7
|
+
if (value !== lastValue) {
|
|
8
|
+
lastValue && target.removeEventListener(event, lastValue);
|
|
9
|
+
value && target.addEventListener(event, value);
|
|
10
|
+
lastValue = value;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function DefaultAssignment(target, writeTo, next, event) {
|
|
15
|
+
const value = next;
|
|
16
|
+
writeTo[event] ??= AssignEvent(target, event);
|
|
17
|
+
writeTo[event](value);
|
|
18
|
+
}
|
|
19
|
+
function CreateEventAssignment(target) {
|
|
20
|
+
let priorKeys;
|
|
21
|
+
const writeTo = {};
|
|
22
|
+
return function AssignNext(next) {
|
|
23
|
+
const nextKeys = next !== null ? Object.keys(next) : [];
|
|
24
|
+
const keys = priorKeys === undefined ? nextKeys : nextKeys.concat(priorKeys);
|
|
25
|
+
priorKeys = nextKeys;
|
|
26
|
+
for (let x = 0; x < keys.length; x++)
|
|
27
|
+
DefaultAssignment(target, writeTo, next && next[keys[x]], keys[x]);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CreateNodeValueAssignment = CreateNodeValueAssignment;
|
|
4
|
+
exports.CreatePropertyAssignment = CreatePropertyAssignment;
|
|
5
|
+
const json_1 = require("../Utils/json");
|
|
6
|
+
function AssignProp(target, prop) {
|
|
7
|
+
let lastValue = target[prop];
|
|
8
|
+
return function Assign(value) {
|
|
9
|
+
if (value !== lastValue) {
|
|
10
|
+
target[prop] = value;
|
|
11
|
+
lastValue = value;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function CreateNodeValueAssignment(target) {
|
|
16
|
+
let lastValue = target.nodeValue;
|
|
17
|
+
return function AssignNodeValue(value) {
|
|
18
|
+
if (value.nodeValue !== lastValue) {
|
|
19
|
+
target.nodeValue = value.nodeValue;
|
|
20
|
+
lastValue = value.nodeValue;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function CreateValueAssignment(target) {
|
|
25
|
+
let lastValue = target.value;
|
|
26
|
+
target.addEventListener('blur', function () {
|
|
27
|
+
target.value = lastValue;
|
|
28
|
+
});
|
|
29
|
+
return function AssignValue(value) {
|
|
30
|
+
if (value !== lastValue) {
|
|
31
|
+
const start = target.selectionStart;
|
|
32
|
+
const end = target.selectionEnd;
|
|
33
|
+
target.value = value;
|
|
34
|
+
if (target.ownerDocument.activeElement === target)
|
|
35
|
+
target.setSelectionRange(start, end);
|
|
36
|
+
lastValue = value;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function ValueAssignment(target, writeTo, next) {
|
|
41
|
+
writeTo.value ??= CreateValueAssignment(target);
|
|
42
|
+
writeTo.value(next.value);
|
|
43
|
+
}
|
|
44
|
+
function DefaultAssignment(target, writeTo, next, prop) {
|
|
45
|
+
const value = next[prop];
|
|
46
|
+
writeTo[prop] ??= (0, json_1.JsonType)(value) === 'value' ?
|
|
47
|
+
AssignProp(target, prop) :
|
|
48
|
+
CreatePropertyAssignment(target[prop], false);
|
|
49
|
+
writeTo[prop](value);
|
|
50
|
+
}
|
|
51
|
+
function CreatePropertyAssignment(target, root = true) {
|
|
52
|
+
const writeTo = {};
|
|
53
|
+
return function AssignNext(next) {
|
|
54
|
+
const keys = Object.keys(next);
|
|
55
|
+
for (let x = 0; x < keys.length; x++) {
|
|
56
|
+
switch (root) {
|
|
57
|
+
case true: {
|
|
58
|
+
switch (keys[x]) {
|
|
59
|
+
case 'value':
|
|
60
|
+
ValueAssignment(target, writeTo, next);
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
DefaultAssignment(target, writeTo, next, keys[x]);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
DefaultAssignment(target, writeTo, next, keys[x]);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
package/DOM/domNodeConfig.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { INodeConfig } from '../Node/nodeConfig';
|
|
2
|
-
export declare
|
|
2
|
+
export declare const DOMNodeConfig: INodeConfig;
|
package/DOM/domNodeConfig.js
CHANGED
|
@@ -3,27 +3,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DOMNodeConfig = void 0;
|
|
4
4
|
const window_1 = require("./window");
|
|
5
5
|
const list_1 = require("../Utils/list");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const createPropertyAssignment_1 = require("./createPropertyAssignment");
|
|
7
|
+
const createEventAssignment_1 = require("./createEventAssignment");
|
|
8
|
+
let pendingUpdates = list_1.List.Create();
|
|
9
|
+
let updateScheduled = false;
|
|
10
|
+
const updateMs = 16;
|
|
10
11
|
function processUpdates() {
|
|
11
12
|
list_1.List.Add(pendingUpdates, null);
|
|
12
|
-
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
let callback;
|
|
13
15
|
while ((callback = list_1.List.Pop(pendingUpdates)))
|
|
14
|
-
(
|
|
16
|
+
callback();
|
|
15
17
|
if (pendingUpdates.size === 0)
|
|
16
18
|
updateScheduled = false;
|
|
19
|
+
else if (Date.now() - start < updateMs)
|
|
20
|
+
processUpdates();
|
|
17
21
|
else
|
|
18
22
|
window_1.wndw.requestAnimationFrame(processUpdates);
|
|
19
23
|
}
|
|
20
24
|
exports.DOMNodeConfig = {
|
|
21
25
|
createNode(type, namespace) {
|
|
22
|
-
return
|
|
23
|
-
namespace
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
return namespace ?
|
|
27
|
+
window_1.wndw.document.createElementNS(namespace, type) :
|
|
28
|
+
window_1.wndw.document.createElement(type);
|
|
29
|
+
},
|
|
30
|
+
createTextNode(value = '') {
|
|
31
|
+
return window_1.wndw.document.createTextNode(value);
|
|
27
32
|
},
|
|
28
33
|
scheduleUpdate(callback) {
|
|
29
34
|
list_1.List.Add(pendingUpdates, callback);
|
|
@@ -74,14 +79,24 @@ exports.DOMNodeConfig = {
|
|
|
74
79
|
setAttribute(target, attribute, value) {
|
|
75
80
|
target.setAttribute(attribute, value);
|
|
76
81
|
},
|
|
82
|
+
createPropertyAssignment(target) {
|
|
83
|
+
if (target.nodeType === Node.TEXT_NODE)
|
|
84
|
+
return (0, createPropertyAssignment_1.CreateNodeValueAssignment)(target);
|
|
85
|
+
return (0, createPropertyAssignment_1.CreatePropertyAssignment)(target);
|
|
86
|
+
},
|
|
87
|
+
createEventAssignment(target) {
|
|
88
|
+
return (0, createEventAssignment_1.CreateEventAssignment)(target);
|
|
89
|
+
},
|
|
77
90
|
fireEvent(target, event, data) {
|
|
78
91
|
var cEvent = new CustomEvent(event, data);
|
|
79
92
|
target.dispatchEvent(cEvent);
|
|
80
93
|
},
|
|
81
|
-
setProperties: utils_1.SetProperties,
|
|
82
94
|
getFirstChild(target) {
|
|
83
95
|
return target.firstChild;
|
|
84
96
|
},
|
|
97
|
+
getLastChild(target) {
|
|
98
|
+
return target.lastChild;
|
|
99
|
+
},
|
|
85
100
|
getNextSibling(target) {
|
|
86
101
|
return target.nextSibling;
|
|
87
102
|
},
|
package/DOM/elements.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare function img<T>(nodeDef: ElementNodeFunctionParam<T>): import("..
|
|
|
10
10
|
export declare function video<T>(nodeDef: ElementNodeFunctionParam<T>, children?: ElementChildrenFunction<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
11
11
|
export declare function source<T>(nodeDef: ElementNodeFunctionParam<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
12
12
|
export declare function input<T>(nodeDef: ElementNodeFunctionParam<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
13
|
+
export declare function textarea<T>(nodeDef: ElementNodeFunctionParam<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
13
14
|
export declare function select<T>(nodeDef: ElementNodeFunctionParam<T>, children?: ElementChildrenFunction<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
14
15
|
export declare function option<T>(nodeDef: ElementNodeFunctionParam<T>, children?: ElementChildrenFunction<T>): import("../Node/elementNode.types").IElementNode<T>;
|
|
15
16
|
export declare function h1<T>(nodeDef: ElementNodeFunctionParam<T>, children?: ElementChildrenFunction<T>): import("../Node/elementNode.types").IElementNode<T>;
|
package/DOM/elements.js
CHANGED
|
@@ -1,96 +1,99 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.div = div;
|
|
4
|
+
exports.a = a;
|
|
5
|
+
exports.ul = ul;
|
|
6
|
+
exports.li = li;
|
|
7
|
+
exports.br = br;
|
|
8
|
+
exports.b = b;
|
|
9
|
+
exports.span = span;
|
|
10
|
+
exports.img = img;
|
|
11
|
+
exports.video = video;
|
|
12
|
+
exports.source = source;
|
|
13
|
+
exports.input = input;
|
|
14
|
+
exports.textarea = textarea;
|
|
15
|
+
exports.select = select;
|
|
16
|
+
exports.option = option;
|
|
17
|
+
exports.h1 = h1;
|
|
18
|
+
exports.h2 = h2;
|
|
19
|
+
exports.h3 = h3;
|
|
20
|
+
exports.p = p;
|
|
21
|
+
exports.style = style;
|
|
22
|
+
exports.button = button;
|
|
23
|
+
exports.table = table;
|
|
24
|
+
exports.th = th;
|
|
25
|
+
exports.tr = tr;
|
|
26
|
+
exports.td = td;
|
|
4
27
|
const elementNode_1 = require("../Node/elementNode");
|
|
5
28
|
function div(nodeDef, children) {
|
|
6
29
|
return elementNode_1.ElementNode.Create("div", null, nodeDef, children);
|
|
7
30
|
}
|
|
8
|
-
exports.div = div;
|
|
9
31
|
function a(nodeDef, children) {
|
|
10
32
|
return elementNode_1.ElementNode.Create("a", null, nodeDef, children);
|
|
11
33
|
}
|
|
12
|
-
exports.a = a;
|
|
13
34
|
function ul(nodeDef, children) {
|
|
14
35
|
return elementNode_1.ElementNode.Create("ul", null, nodeDef, children);
|
|
15
36
|
}
|
|
16
|
-
exports.ul = ul;
|
|
17
37
|
function li(nodeDef, children) {
|
|
18
38
|
return elementNode_1.ElementNode.Create("li", null, nodeDef, children);
|
|
19
39
|
}
|
|
20
|
-
exports.li = li;
|
|
21
40
|
function br(nodeDef) {
|
|
22
41
|
return elementNode_1.ElementNode.Create("br", null, nodeDef, null);
|
|
23
42
|
}
|
|
24
|
-
exports.br = br;
|
|
25
43
|
function b(nodeDef, children) {
|
|
26
44
|
return elementNode_1.ElementNode.Create("b", null, nodeDef, children);
|
|
27
45
|
}
|
|
28
|
-
exports.b = b;
|
|
29
46
|
function span(nodeDef, children) {
|
|
30
47
|
return elementNode_1.ElementNode.Create("span", null, nodeDef, children);
|
|
31
48
|
}
|
|
32
|
-
exports.span = span;
|
|
33
49
|
function img(nodeDef) {
|
|
34
50
|
return elementNode_1.ElementNode.Create("img", null, nodeDef, null);
|
|
35
51
|
}
|
|
36
|
-
exports.img = img;
|
|
37
52
|
function video(nodeDef, children) {
|
|
38
53
|
return elementNode_1.ElementNode.Create("video", null, nodeDef, children);
|
|
39
54
|
}
|
|
40
|
-
exports.video = video;
|
|
41
55
|
function source(nodeDef) {
|
|
42
56
|
return elementNode_1.ElementNode.Create("source", null, nodeDef, null);
|
|
43
57
|
}
|
|
44
|
-
exports.source = source;
|
|
45
58
|
function input(nodeDef) {
|
|
46
59
|
return elementNode_1.ElementNode.Create("input", null, nodeDef, null);
|
|
47
60
|
}
|
|
48
|
-
|
|
61
|
+
function textarea(nodeDef) {
|
|
62
|
+
return elementNode_1.ElementNode.Create("textarea", null, nodeDef, null);
|
|
63
|
+
}
|
|
49
64
|
function select(nodeDef, children) {
|
|
50
65
|
return elementNode_1.ElementNode.Create("select", null, nodeDef, children);
|
|
51
66
|
}
|
|
52
|
-
exports.select = select;
|
|
53
67
|
function option(nodeDef, children) {
|
|
54
68
|
return elementNode_1.ElementNode.Create("option", null, nodeDef, children);
|
|
55
69
|
}
|
|
56
|
-
exports.option = option;
|
|
57
70
|
function h1(nodeDef, children) {
|
|
58
71
|
return elementNode_1.ElementNode.Create("h1", null, nodeDef, children);
|
|
59
72
|
}
|
|
60
|
-
exports.h1 = h1;
|
|
61
73
|
function h2(nodeDef, children) {
|
|
62
74
|
return elementNode_1.ElementNode.Create("h2", null, nodeDef, children);
|
|
63
75
|
}
|
|
64
|
-
exports.h2 = h2;
|
|
65
76
|
function h3(nodeDef, children) {
|
|
66
77
|
return elementNode_1.ElementNode.Create("h3", null, nodeDef, children);
|
|
67
78
|
}
|
|
68
|
-
exports.h3 = h3;
|
|
69
79
|
function p(nodeDef, children) {
|
|
70
80
|
return elementNode_1.ElementNode.Create("p", null, nodeDef, children);
|
|
71
81
|
}
|
|
72
|
-
exports.p = p;
|
|
73
82
|
function style(nodeDef, children) {
|
|
74
83
|
return elementNode_1.ElementNode.Create("style", null, nodeDef, children);
|
|
75
84
|
}
|
|
76
|
-
exports.style = style;
|
|
77
85
|
function button(nodeDef, children) {
|
|
78
86
|
return elementNode_1.ElementNode.Create("button", null, nodeDef, children);
|
|
79
87
|
}
|
|
80
|
-
exports.button = button;
|
|
81
88
|
function table(nodeDef, children) {
|
|
82
89
|
return elementNode_1.ElementNode.Create("table", null, nodeDef, children);
|
|
83
90
|
}
|
|
84
|
-
exports.table = table;
|
|
85
91
|
function th(nodeDef, children) {
|
|
86
92
|
return elementNode_1.ElementNode.Create("th", null, nodeDef, children);
|
|
87
93
|
}
|
|
88
|
-
exports.th = th;
|
|
89
94
|
function tr(nodeDef, children) {
|
|
90
95
|
return elementNode_1.ElementNode.Create("tr", null, nodeDef, children);
|
|
91
96
|
}
|
|
92
|
-
exports.tr = tr;
|
|
93
97
|
function td(nodeDef, children) {
|
|
94
98
|
return elementNode_1.ElementNode.Create("td", null, nodeDef, children);
|
|
95
99
|
}
|
|
96
|
-
exports.td = td;
|
package/DOM/index.d.ts
CHANGED
package/DOM/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./elements"), exports);
|
|
18
18
|
__exportStar(require("./svgElements"), exports);
|
|
19
|
-
__exportStar(require("./
|
|
19
|
+
__exportStar(require("./createPropertyAssignment"), exports);
|
|
20
|
+
__exportStar(require("./createEventAssignment"), exports);
|
package/DOM/svgElements.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.svg = svg;
|
|
4
|
+
exports.g = g;
|
|
5
|
+
exports.circle = circle;
|
|
4
6
|
const elementNode_1 = require("../Node/elementNode");
|
|
5
7
|
const svgNs = "http://www.w3.org/2000/svg";
|
|
6
8
|
function svg(nodeDef, children) {
|
|
7
9
|
return elementNode_1.ElementNode.Create("svg", svgNs, nodeDef, children);
|
|
8
10
|
}
|
|
9
|
-
exports.svg = svg;
|
|
10
11
|
function g(nodeDef, children) {
|
|
11
12
|
return elementNode_1.ElementNode.Create("g", svgNs, nodeDef, children);
|
|
12
13
|
}
|
|
13
|
-
exports.g = g;
|
|
14
14
|
function circle(nodeDef, children) {
|
|
15
15
|
return elementNode_1.ElementNode.Create("circle", svgNs, nodeDef, children);
|
|
16
16
|
}
|
|
17
|
-
exports.circle = circle;
|
package/Node/boundNode.js
CHANGED
|
@@ -9,37 +9,32 @@ var BoundNode;
|
|
|
9
9
|
const nodeDef = boundNode.nodeDef;
|
|
10
10
|
if (nodeDef.props) {
|
|
11
11
|
const scope = observableScope_1.ObservableScope.Create(nodeDef.props);
|
|
12
|
-
boundNode.
|
|
12
|
+
boundNode.scopes ??= [];
|
|
13
|
+
boundNode.scopes.push(scope);
|
|
14
|
+
boundNode.assignProperties = nodeConfig_1.NodeConfig.createPropertyAssignment(boundNode.node);
|
|
13
15
|
observableScope_1.ObservableScope.Watch(scope, function (scope) { ScheduleSetProperties(boundNode, scope); });
|
|
14
|
-
|
|
16
|
+
const next = observableScope_1.ObservableScope.Value(scope);
|
|
17
|
+
boundNode.assignProperties(next);
|
|
15
18
|
}
|
|
16
19
|
if (nodeDef.attrs) {
|
|
17
20
|
const scope = observableScope_1.ObservableScope.Create(nodeDef.attrs);
|
|
18
|
-
boundNode.
|
|
21
|
+
boundNode.scopes ??= [];
|
|
22
|
+
boundNode.scopes.push(scope);
|
|
19
23
|
observableScope_1.ObservableScope.Watch(scope, function (scope) { ScheduleSetAttributes(boundNode, scope); });
|
|
20
24
|
SetAttributes(boundNode, observableScope_1.ObservableScope.Value(scope));
|
|
21
25
|
}
|
|
22
26
|
if (nodeDef.on) {
|
|
23
27
|
const scope = observableScope_1.ObservableScope.Create(nodeDef.on);
|
|
24
|
-
boundNode.
|
|
25
|
-
boundNode.
|
|
26
|
-
|
|
27
|
-
SetEvents(boundNode, {});
|
|
28
|
-
}
|
|
29
|
-
});
|
|
28
|
+
boundNode.scopes ??= [];
|
|
29
|
+
boundNode.scopes.push(scope);
|
|
30
|
+
boundNode.assignEvents = nodeConfig_1.NodeConfig.createEventAssignment(boundNode.node);
|
|
30
31
|
observableScope_1.ObservableScope.Watch(scope, function (scope) { ScheduleSetEvents(boundNode, scope); });
|
|
31
|
-
|
|
32
|
+
const next = observableScope_1.ObservableScope.Value(scope);
|
|
33
|
+
boundNode.assignEvents(next);
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
BoundNode.Init = Init;
|
|
35
37
|
})(BoundNode || (exports.BoundNode = BoundNode = {}));
|
|
36
|
-
function CreateScopeDestroyable(scope) {
|
|
37
|
-
return {
|
|
38
|
-
Destroy() {
|
|
39
|
-
observableScope_1.ObservableScope.Destroy(scope);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
38
|
function ScheduleSetProperties(node, scope) {
|
|
44
39
|
if (node.setProperties)
|
|
45
40
|
return;
|
|
@@ -48,15 +43,10 @@ function ScheduleSetProperties(node, scope) {
|
|
|
48
43
|
node.setProperties = false;
|
|
49
44
|
if (node.destroyed)
|
|
50
45
|
return;
|
|
51
|
-
|
|
46
|
+
const next = observableScope_1.ObservableScope.Value(scope);
|
|
47
|
+
node.assignProperties(next);
|
|
52
48
|
});
|
|
53
49
|
}
|
|
54
|
-
function SetProperties(node, properties) {
|
|
55
|
-
if (!properties)
|
|
56
|
-
return;
|
|
57
|
-
nodeConfig_1.NodeConfig.setProperties(node.node, node.lastProperties, properties);
|
|
58
|
-
node.lastProperties = properties;
|
|
59
|
-
}
|
|
60
50
|
function ScheduleSetAttributes(node, scope) {
|
|
61
51
|
if (node.setAttributes)
|
|
62
52
|
return;
|
|
@@ -85,15 +75,7 @@ function ScheduleSetEvents(node, scope) {
|
|
|
85
75
|
node.setEvents = false;
|
|
86
76
|
if (node.destroyed)
|
|
87
77
|
return;
|
|
88
|
-
|
|
78
|
+
const next = observableScope_1.ObservableScope.Value(scope);
|
|
79
|
+
node.assignEvents(next);
|
|
89
80
|
});
|
|
90
81
|
}
|
|
91
|
-
function SetEvents(node, events) {
|
|
92
|
-
if (!events)
|
|
93
|
-
return;
|
|
94
|
-
for (var key in node.lastEvents)
|
|
95
|
-
nodeConfig_1.NodeConfig.removeListener(node.node, key, node.lastEvents[key]);
|
|
96
|
-
for (var key in events)
|
|
97
|
-
nodeConfig_1.NodeConfig.addListener(node.node, key, events[key]);
|
|
98
|
-
node.lastEvents = events;
|
|
99
|
-
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IObservableScope } from "../Store/Tree/observableScope";
|
|
1
2
|
import { NodeRefType } from "./nodeRef";
|
|
2
3
|
import { INodeRefBase } from "./nodeRef.types";
|
|
3
4
|
export type FunctionOr<T> = {
|
|
@@ -30,11 +31,16 @@ export interface BoundNodeFunctionParam {
|
|
|
30
31
|
}
|
|
31
32
|
export interface IBoundNodeBase extends INodeRefBase {
|
|
32
33
|
nodeDef: BoundNodeFunctionParam;
|
|
33
|
-
|
|
34
|
-
lastEvents: {
|
|
35
|
-
[name: string]: any;
|
|
36
|
-
};
|
|
34
|
+
scopes: IObservableScope<unknown>[];
|
|
37
35
|
setProperties: boolean;
|
|
36
|
+
assignProperties: {
|
|
37
|
+
(next: any): void;
|
|
38
|
+
};
|
|
39
|
+
assignEvents: {
|
|
40
|
+
(next: {
|
|
41
|
+
[event: string]: (event: Event) => void;
|
|
42
|
+
}): void;
|
|
43
|
+
};
|
|
38
44
|
setAttributes: boolean;
|
|
39
45
|
setEvents: boolean;
|
|
40
46
|
}
|
package/Node/component.js
CHANGED
package/Node/componentNode.js
CHANGED
|
@@ -28,7 +28,6 @@ var ComponentNode;
|
|
|
28
28
|
nodeDef.on = null;
|
|
29
29
|
componentNode.component = new componentNode.constructor(nodeDef.data, componentNode.templates, componentNode, events);
|
|
30
30
|
SetChildren(componentNode);
|
|
31
|
-
componentNode.destroyables.push(componentNode.component);
|
|
32
31
|
boundNode_1.BoundNode.Init(componentNode);
|
|
33
32
|
}
|
|
34
33
|
ComponentNode.Init = Init;
|
package/Node/elementNode.js
CHANGED
|
@@ -22,15 +22,13 @@ var ElementNode;
|
|
|
22
22
|
var nodeDef = elementNode.nodeDef;
|
|
23
23
|
if (nodeDef.data) {
|
|
24
24
|
const dataScope = observableScope_1.ObservableScope.Create(nodeDef.data);
|
|
25
|
+
elementNode.childNodes = new Set();
|
|
26
|
+
elementNode.scopes ??= [];
|
|
27
|
+
elementNode.scopes.push(dataScope);
|
|
25
28
|
observableScope_1.ObservableScope.Watch(dataScope, function () {
|
|
26
29
|
ScheduleSetData(elementNode, dataScope);
|
|
27
30
|
});
|
|
28
31
|
SetData(elementNode, GetValue(dataScope), true);
|
|
29
|
-
elementNode.destroyables.push({
|
|
30
|
-
Destroy: function () {
|
|
31
|
-
observableScope_1.ObservableScope.Destroy(dataScope);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
32
|
}
|
|
35
33
|
else
|
|
36
34
|
SetDefaultData(elementNode);
|
|
@@ -127,10 +125,11 @@ function ReconcileNodeData(node, values) {
|
|
|
127
125
|
if (currentNodeList) {
|
|
128
126
|
let curDetach = currentNodeList.head;
|
|
129
127
|
while (curDetach) {
|
|
130
|
-
|
|
131
|
-
for (let x = 0; x < curDetach.data.nodes.length; x++)
|
|
132
|
-
node.childNodes.delete(curDetach.data.nodes[x]);
|
|
128
|
+
const data = curDetach.data;
|
|
133
129
|
curDetach = curDetach.next;
|
|
130
|
+
for (let x = 0; x < data.nodes.length; x++)
|
|
131
|
+
node.childNodes.delete(data.nodes[x]);
|
|
132
|
+
nodeRef_1.NodeRef.DestroyAll(data.nodes);
|
|
134
133
|
}
|
|
135
134
|
list_1.List.Clear(currentNodeList);
|
|
136
135
|
}
|
|
@@ -141,10 +140,10 @@ function SetData(node, values, init = false) {
|
|
|
141
140
|
ReconcileNodeData(node, values);
|
|
142
141
|
const attachNodes = node.nodeList;
|
|
143
142
|
const startSize = attachNodes.size;
|
|
144
|
-
(0, thread_1.Thread)(function () {
|
|
143
|
+
(0, thread_1.Thread)(function (async) {
|
|
145
144
|
if (node.destroyed)
|
|
146
145
|
return;
|
|
147
|
-
if (init)
|
|
146
|
+
if (init || !async)
|
|
148
147
|
nodeRef_1.NodeRef.ReconcileChildren(node, attachNodes);
|
|
149
148
|
else
|
|
150
149
|
nodeConfig_1.NodeConfig.scheduleUpdate(function () {
|
|
@@ -156,9 +155,9 @@ function SetData(node, values, init = false) {
|
|
|
156
155
|
});
|
|
157
156
|
}
|
|
158
157
|
function CreateNodeArray(childrenFunc, value) {
|
|
159
|
-
|
|
160
|
-
if (typeof newNodes === "string") {
|
|
161
|
-
|
|
158
|
+
const newNodes = childrenFunc(value);
|
|
159
|
+
if (typeof newNodes === "string" || !newNodes) {
|
|
160
|
+
const textNode = nodeRef_1.NodeRef.Create("text", null, nodeRef_1.NodeRefType.BoundNode);
|
|
162
161
|
textNode.nodeDef = {
|
|
163
162
|
props: function () {
|
|
164
163
|
return { nodeValue: childrenFunc(value) };
|
package/Node/nodeConfig.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface INodeConfig {
|
|
2
2
|
createNode(type: any, namespace: string): any;
|
|
3
|
+
createTextNode(value?: string): any;
|
|
3
4
|
scheduleUpdate(callback: () => void): void;
|
|
4
5
|
setText(target: any, text: string): void;
|
|
5
6
|
getAttribute(target: any, attribute: string): string;
|
|
@@ -17,8 +18,16 @@ export interface INodeConfig {
|
|
|
17
18
|
removeChild(root: any, child: any): void;
|
|
18
19
|
remove(target: any): void;
|
|
19
20
|
fireEvent(target: any, event: string, data: any): void;
|
|
20
|
-
|
|
21
|
+
createPropertyAssignment(target: any): {
|
|
22
|
+
(next: any): void;
|
|
23
|
+
};
|
|
24
|
+
createEventAssignment(target: any): {
|
|
25
|
+
(next: {
|
|
26
|
+
[event: string]: (event: Event) => void;
|
|
27
|
+
}): void;
|
|
28
|
+
};
|
|
21
29
|
getFirstChild(target: any): any;
|
|
30
|
+
getLastChild(target: any): any;
|
|
22
31
|
getNextSibling(target: any): any;
|
|
23
32
|
replaceChildren(target: any, children: any[]): void;
|
|
24
33
|
}
|
package/Node/nodeRef.d.ts
CHANGED
|
@@ -18,6 +18,6 @@ export declare namespace NodeRef {
|
|
|
18
18
|
function AddChildAfter(node: INodeRefBase, currentChild: INodeRefBase, newChild: INodeRefBase): void;
|
|
19
19
|
function ReconcileChildren(node: INodeRefBase, nextChildren: IList<IElementDataNode<unknown>>): void;
|
|
20
20
|
function DetachChild(node: INodeRefBase, child: INodeRefBase): void;
|
|
21
|
-
function Destroy(node:
|
|
21
|
+
function Destroy(node: NodeRefTypes): void;
|
|
22
22
|
function DestroyAll(nodes: Array<INodeRefBase>): void;
|
|
23
23
|
}
|