j-templates 5.0.51 → 5.0.53

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.
Files changed (45) hide show
  1. package/DOM/createEventAssignment.d.ts +3 -0
  2. package/DOM/createEventAssignment.js +29 -0
  3. package/DOM/createPropertyAssignment.d.ts +4 -0
  4. package/DOM/createPropertyAssignment.js +74 -0
  5. package/DOM/domNodeConfig.d.ts +1 -1
  6. package/DOM/domNodeConfig.js +27 -12
  7. package/DOM/elements.d.ts +1 -0
  8. package/DOM/elements.js +27 -24
  9. package/DOM/index.d.ts +2 -1
  10. package/DOM/index.js +2 -1
  11. package/DOM/svgElements.js +3 -4
  12. package/Node/boundNode.js +16 -34
  13. package/Node/boundNode.types.d.ts +10 -4
  14. package/Node/component.js +1 -0
  15. package/Node/componentNode.js +0 -1
  16. package/Node/elementNode.js +12 -13
  17. package/Node/nodeConfig.d.ts +10 -1
  18. package/Node/nodeRef.d.ts +1 -1
  19. package/Node/nodeRef.js +58 -26
  20. package/Node/nodeRef.types.d.ts +2 -4
  21. package/Store/Diff/diffTree.js +1 -2
  22. package/Store/Tree/observableComputed.d.ts +4 -0
  23. package/Store/Tree/observableComputed.js +45 -0
  24. package/Store/Tree/observableNode.d.ts +3 -0
  25. package/Store/Tree/observableNode.js +195 -0
  26. package/Store/Tree/observableScope.d.ts +7 -12
  27. package/Store/Tree/observableScope.js +38 -34
  28. package/Store/index.d.ts +2 -0
  29. package/Store/index.js +5 -1
  30. package/Utils/decorators.d.ts +3 -1
  31. package/Utils/decorators.js +36 -39
  32. package/Utils/emitter.d.ts +2 -6
  33. package/Utils/emitter.js +8 -1
  34. package/Utils/json.d.ts +7 -0
  35. package/Utils/json.js +109 -0
  36. package/Utils/list.js +7 -7
  37. package/Utils/thread.d.ts +9 -15
  38. package/Utils/thread.js +36 -29
  39. package/jTemplates.js +1 -3176
  40. package/jTemplates.js.map +1 -1
  41. package/package.json +1 -1
  42. package/web.export.d.ts +1 -1
  43. package/web.export.js +3 -1
  44. package/DOM/utils.d.ts +0 -1
  45. package/DOM/utils.js +0 -47
@@ -0,0 +1,3 @@
1
+ export declare function CreateEventAssignment(target: HTMLElement): (next: null | {
2
+ [event: string]: (event: Event) => void;
3
+ }) => void;
@@ -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,4 @@
1
+ export declare function CreateNodeValueAssignment(target: HTMLElement): (value: {
2
+ nodeValue: string;
3
+ }) => void;
4
+ export declare function CreatePropertyAssignment(target: any, root?: boolean): (next: any) => void;
@@ -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 ??= target.nodeName === 'INPUT' ? CreateValueAssignment(target) : AssignProp(target, 'value');
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
+ }
@@ -1,2 +1,2 @@
1
1
  import { INodeConfig } from '../Node/nodeConfig';
2
- export declare var DOMNodeConfig: INodeConfig;
2
+ export declare const DOMNodeConfig: INodeConfig;
@@ -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 utils_1 = require("./utils");
7
- const thread_1 = require("../Utils/thread");
8
- var pendingUpdates = list_1.List.Create();
9
- var updateScheduled = false;
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
- var callback;
13
+ const start = Date.now();
14
+ let callback;
13
15
  while ((callback = list_1.List.Pop(pendingUpdates)))
14
- (0, thread_1.Synch)(callback);
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 type !== "text" ?
23
- namespace ?
24
- window_1.wndw.document.createElementNS(namespace, type) :
25
- window_1.wndw.document.createElement(type) :
26
- window_1.wndw.document.createTextNode("");
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.td = exports.tr = exports.th = exports.table = exports.button = exports.style = exports.p = exports.h3 = exports.h2 = exports.h1 = exports.option = exports.select = exports.input = exports.source = exports.video = exports.img = exports.span = exports.b = exports.br = exports.li = exports.ul = exports.a = exports.div = void 0;
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
- exports.input = input;
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
@@ -1,3 +1,4 @@
1
1
  export * from "./elements";
2
2
  export * from "./svgElements";
3
- export * from "./utils";
3
+ export * from "./createPropertyAssignment";
4
+ export * from "./createEventAssignment";
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("./utils"), exports);
19
+ __exportStar(require("./createPropertyAssignment"), exports);
20
+ __exportStar(require("./createEventAssignment"), exports);
@@ -1,17 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.circle = exports.g = exports.svg = void 0;
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.destroyables.push(CreateScopeDestroyable(scope));
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
- SetProperties(boundNode, observableScope_1.ObservableScope.Value(scope));
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.destroyables.push(CreateScopeDestroyable(scope));
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.destroyables.push(CreateScopeDestroyable(scope));
25
- boundNode.destroyables.push({
26
- Destroy() {
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
- SetEvents(boundNode, observableScope_1.ObservableScope.Value(scope));
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
- SetProperties(node, observableScope_1.ObservableScope.Value(scope));
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
- SetEvents(node, observableScope_1.ObservableScope.Value(scope));
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
- lastProperties: any;
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
@@ -49,6 +49,7 @@ class Component {
49
49
  eventCallback && eventCallback(data);
50
50
  }
51
51
  Destroy() {
52
+ this.scope.Destroy();
52
53
  decorators_1.Destroy.All(this);
53
54
  }
54
55
  }
@@ -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;
@@ -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
- nodeRef_1.NodeRef.DestroyAll(curDetach.data.nodes);
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
- var newNodes = childrenFunc(value);
160
- if (typeof newNodes === "string") {
161
- var textNode = nodeRef_1.NodeRef.Create("text", null, nodeRef_1.NodeRefType.BoundNode);
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) };
@@ -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
- setProperties(target: any, lastProperties: any, properties: any): void;
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: INodeRefBase): void;
21
+ function Destroy(node: NodeRefTypes): void;
22
22
  function DestroyAll(nodes: Array<INodeRefBase>): void;
23
23
  }