@lukekaalim/act-web 1.0.0 → 1.1.0
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/node.js +13 -5
- package/package.json +3 -3
- package/prop.js +10 -3
- package/reconciler.js +2 -2
- package/renderer.js +26 -9
package/node.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
/*:: import type { Element } from '@lukekaalim/act'; */
|
|
3
|
+
/*:: import type { RenderResult } from '@lukekaalim/act-renderer-core'; */
|
|
3
4
|
/*:: import type { CommitDiff } from '@lukekaalim/act-reconciler'; */
|
|
4
5
|
|
|
5
6
|
export const createNode = (element/*: Element*/, namespace/*: string*/)/*: null | Node*/ => {
|
|
@@ -11,6 +12,8 @@ export const createNode = (element/*: Element*/, namespace/*: string*/)/*: null
|
|
|
11
12
|
return document.createTextNode('');
|
|
12
13
|
if (element.type === 'act:context')
|
|
13
14
|
return null;
|
|
15
|
+
if (element.type === 'act:boundary')
|
|
16
|
+
return null;
|
|
14
17
|
return document.createElementNS(namespace, element.type);
|
|
15
18
|
};
|
|
16
19
|
export const removeNode = (node/*: Node*/) => {
|
|
@@ -18,13 +21,18 @@ export const removeNode = (node/*: Node*/) => {
|
|
|
18
21
|
if (parent)
|
|
19
22
|
parent.removeChild(node);
|
|
20
23
|
}
|
|
21
|
-
export const
|
|
24
|
+
export const setNodeChildren = (diff/*: CommitDiff*/, parent/*: Node*/, children/*: RenderResult<Node>[]*/) => {
|
|
25
|
+
const childrenToAttach = children.filter(r => !r.commit.suspension).map(r => r.node);
|
|
26
|
+
const childrenToRemove = children.filter(r => r.commit.suspension).map(r => r.node);
|
|
27
|
+
for (let i = 0; i < childrenToRemove.length; i++)
|
|
28
|
+
removeNode(childrenToRemove[i]);
|
|
29
|
+
|
|
22
30
|
// iterate backwards through the children
|
|
23
|
-
for (let i =
|
|
24
|
-
const child =
|
|
25
|
-
const rightSibling =
|
|
31
|
+
for (let i = childrenToAttach.length; i > 0; i--) {
|
|
32
|
+
const child = childrenToAttach[i - 1];
|
|
33
|
+
const rightSibling = childrenToAttach[i];
|
|
26
34
|
if (parent !== child.parentNode || (rightSibling && child.nextSibling !== rightSibling)) {
|
|
27
35
|
parent.insertBefore(child, rightSibling);
|
|
28
36
|
}
|
|
29
37
|
}
|
|
30
|
-
}
|
|
38
|
+
}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@lukekaalim/act-web",
|
|
3
3
|
"main": "entry.js",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.1.0",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"scripts": {
|
|
8
8
|
"test": "cd ../..; npm test",
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"preversion": "npm run test"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@lukekaalim/act-renderer-core": "^
|
|
14
|
-
"@lukekaalim/act-reconciler": "^2.0
|
|
13
|
+
"@lukekaalim/act-renderer-core": "^3.0.0",
|
|
14
|
+
"@lukekaalim/act-reconciler": "^2.1.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@lukekaalim/act": "*"
|
package/prop.js
CHANGED
|
@@ -42,10 +42,17 @@ export const setAttributeProp = (
|
|
|
42
42
|
element/*: Element*/,
|
|
43
43
|
{ key, prev, next }/*: PropDiff*/
|
|
44
44
|
) => {
|
|
45
|
-
if (next === null &&
|
|
45
|
+
if (next === null && prev !== null)
|
|
46
46
|
element.removeAttribute(key);
|
|
47
|
-
else if (
|
|
48
|
-
|
|
47
|
+
else if (next !== null)
|
|
48
|
+
switch (typeof next) {
|
|
49
|
+
case 'string':
|
|
50
|
+
element.setAttribute(key, next);
|
|
51
|
+
case 'number':
|
|
52
|
+
case 'boolean':
|
|
53
|
+
element.setAttribute(key, next.toString());
|
|
54
|
+
default:
|
|
55
|
+
}
|
|
49
56
|
};
|
|
50
57
|
|
|
51
58
|
export const setHTMLProp = (
|
package/reconciler.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
/*:: import type { Element } from '@lukekaalim/act'; */
|
|
3
3
|
import { createTree } from '@lukekaalim/act-reconciler';
|
|
4
|
-
import { attachNodes } from './node.js';
|
|
5
4
|
import { createWebRenderer } from './renderer.js';
|
|
5
|
+
import { setNodeChildren } from "./node.js";
|
|
6
6
|
|
|
7
7
|
export const render = (element/*: Element*/, node/*: HTMLElement*/) => {
|
|
8
8
|
const web = createWebRenderer();
|
|
9
|
-
const onDiff = diff =>
|
|
9
|
+
const onDiff = diff => setNodeChildren(diff, node, web.render(diff));
|
|
10
10
|
const options = {
|
|
11
11
|
onDiff,
|
|
12
12
|
scheduleWork: (c) => requestAnimationFrame(() => void c()),
|
package/renderer.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
// @flow strict
|
|
2
2
|
/*:: import type { ElementType } from '@lukekaalim/act'; */
|
|
3
|
-
/*:: import type { Renderer } from '@lukekaalim/act-renderer-core'; */
|
|
3
|
+
/*:: import type { Renderer, RenderResult } from '@lukekaalim/act-renderer-core'; */
|
|
4
4
|
import { createManagedRenderer } from '@lukekaalim/act-renderer-core';
|
|
5
5
|
import { setProps, setRef } from './prop.js';
|
|
6
|
-
import { createNode,
|
|
6
|
+
import { createNode, removeNode, setNodeChildren } from './node.js';
|
|
7
7
|
|
|
8
8
|
export const createDOMRenderer = (
|
|
9
9
|
namespace/*: string*/,
|
|
10
10
|
nodeSubRenderers/*: { [type: string]: ?Renderer<Node> }*/ = {},
|
|
11
11
|
)/*: Renderer<Node>*/ => {
|
|
12
12
|
const add = (diff)/*: null | Node*/ => {
|
|
13
|
-
|
|
13
|
+
const node = createNode(diff.next.element, namespace);
|
|
14
|
+
if (node !== null) {
|
|
15
|
+
const parentId = diff.next.path[diff.next.path.length - 1];
|
|
16
|
+
nodeRenderer.nodesByCommitID.get(parentId);
|
|
17
|
+
}
|
|
18
|
+
return node;
|
|
14
19
|
}
|
|
15
20
|
const remove = (node) => {
|
|
16
21
|
removeNode(node);
|
|
@@ -22,17 +27,29 @@ export const createDOMRenderer = (
|
|
|
22
27
|
return;
|
|
23
28
|
|
|
24
29
|
setProps(node, diff);
|
|
25
|
-
|
|
30
|
+
setNodeChildren(diff, node, children);
|
|
26
31
|
}
|
|
27
32
|
|
|
28
|
-
const next = (diff)/*: Node[]*/ => {
|
|
29
|
-
const {
|
|
30
|
-
|
|
33
|
+
const next = (diff)/*: RenderResult<Node>[]*/ => {
|
|
34
|
+
const { type } = diff.next.element;
|
|
35
|
+
const subrenderer = typeof type === 'string' && nodeSubRenderers[type];
|
|
36
|
+
if (subrenderer) {
|
|
37
|
+
return subrenderer.render(diff);
|
|
38
|
+
}
|
|
39
|
+
return nodeRenderer.render(diff);
|
|
31
40
|
};
|
|
41
|
+
const getExternalNodes = (commit) => {
|
|
42
|
+
const { type } = commit.element;
|
|
43
|
+
const subrenderer = typeof type === 'string' && nodeSubRenderers[type];
|
|
44
|
+
if (subrenderer) {
|
|
45
|
+
return subrenderer.getNodes(commit);
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
32
49
|
|
|
33
|
-
const
|
|
50
|
+
const nodeRenderer = createManagedRenderer({ add, remove, update, next, getExternalNodes });
|
|
34
51
|
|
|
35
|
-
return
|
|
52
|
+
return nodeRenderer;
|
|
36
53
|
};
|
|
37
54
|
|
|
38
55
|
export const createWebRenderer = (
|