@fukict/basic 0.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/LICENSE +21 -0
- package/dist/component-class/fukict.d.ts +207 -0
- package/dist/component-class/fukict.d.ts.map +1 -0
- package/dist/component-class/fukict.js +299 -0
- package/dist/component-class/fukict.js.map +1 -0
- package/dist/component-class/index.d.ts +5 -0
- package/dist/component-class/index.d.ts.map +1 -0
- package/dist/component-class/index.js +5 -0
- package/dist/component-class/index.js.map +1 -0
- package/dist/component-class/slot.d.ts +9 -0
- package/dist/component-class/slot.d.ts.map +1 -0
- package/dist/component-class/slot.js +46 -0
- package/dist/component-class/slot.js.map +1 -0
- package/dist/component-function/define.d.ts +36 -0
- package/dist/component-function/define.d.ts.map +1 -0
- package/dist/component-function/define.js +23 -0
- package/dist/component-function/define.js.map +1 -0
- package/dist/component-function/index.d.ts +6 -0
- package/dist/component-function/index.d.ts.map +1 -0
- package/dist/component-function/index.js +5 -0
- package/dist/component-function/index.js.map +1 -0
- package/dist/dom/attributes.d.ts +36 -0
- package/dist/dom/attributes.d.ts.map +1 -0
- package/dist/dom/attributes.js +113 -0
- package/dist/dom/attributes.js.map +1 -0
- package/dist/dom/element.d.ts +22 -0
- package/dist/dom/element.d.ts.map +1 -0
- package/dist/dom/element.js +98 -0
- package/dist/dom/element.js.map +1 -0
- package/dist/dom/events.d.ts +14 -0
- package/dist/dom/events.d.ts.map +1 -0
- package/dist/dom/events.js +18 -0
- package/dist/dom/events.js.map +1 -0
- package/dist/dom/index.d.ts +10 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +14 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/dom/node.d.ts +22 -0
- package/dist/dom/node.d.ts.map +1 -0
- package/dist/dom/node.js +30 -0
- package/dist/dom/node.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.d.ts +10 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +9 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +14 -0
- package/dist/metadata.js.map +1 -0
- package/dist/renderer/attributes.d.ts +15 -0
- package/dist/renderer/attributes.d.ts.map +1 -0
- package/dist/renderer/attributes.js +61 -0
- package/dist/renderer/attributes.js.map +1 -0
- package/dist/renderer/create.d.ts +30 -0
- package/dist/renderer/create.d.ts.map +1 -0
- package/dist/renderer/create.js +223 -0
- package/dist/renderer/create.js.map +1 -0
- package/dist/renderer/diff/children.d.ts +12 -0
- package/dist/renderer/diff/children.d.ts.map +1 -0
- package/dist/renderer/diff/children.js +55 -0
- package/dist/renderer/diff/children.js.map +1 -0
- package/dist/renderer/diff/class.d.ts +8 -0
- package/dist/renderer/diff/class.d.ts.map +1 -0
- package/dist/renderer/diff/class.js +38 -0
- package/dist/renderer/diff/class.js.map +1 -0
- package/dist/renderer/diff/element.d.ts +14 -0
- package/dist/renderer/diff/element.d.ts.map +1 -0
- package/dist/renderer/diff/element.js +34 -0
- package/dist/renderer/diff/element.js.map +1 -0
- package/dist/renderer/diff/fragment.d.ts +13 -0
- package/dist/renderer/diff/fragment.d.ts.map +1 -0
- package/dist/renderer/diff/fragment.js +32 -0
- package/dist/renderer/diff/fragment.js.map +1 -0
- package/dist/renderer/diff/function.d.ts +9 -0
- package/dist/renderer/diff/function.d.ts.map +1 -0
- package/dist/renderer/diff/function.js +58 -0
- package/dist/renderer/diff/function.js.map +1 -0
- package/dist/renderer/diff/helpers.d.ts +19 -0
- package/dist/renderer/diff/helpers.d.ts.map +1 -0
- package/dist/renderer/diff/helpers.js +194 -0
- package/dist/renderer/diff/helpers.js.map +1 -0
- package/dist/renderer/diff/index.d.ts +18 -0
- package/dist/renderer/diff/index.d.ts.map +1 -0
- package/dist/renderer/diff/index.js +103 -0
- package/dist/renderer/diff/index.js.map +1 -0
- package/dist/renderer/diff/props.d.ts +18 -0
- package/dist/renderer/diff/props.d.ts.map +1 -0
- package/dist/renderer/diff/props.js +99 -0
- package/dist/renderer/diff/props.js.map +1 -0
- package/dist/renderer/index.d.ts +26 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +93 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/mount.d.ts +30 -0
- package/dist/renderer/mount.d.ts.map +1 -0
- package/dist/renderer/mount.js +209 -0
- package/dist/renderer/mount.js.map +1 -0
- package/dist/types/class.d.ts +88 -0
- package/dist/types/class.d.ts.map +1 -0
- package/dist/types/class.js +2 -0
- package/dist/types/class.js.map +1 -0
- package/dist/types/context.d.ts +36 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +9 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/core.d.ts +124 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +15 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/dom-attributes.d.ts +236 -0
- package/dist/types/dom-attributes.d.ts.map +1 -0
- package/dist/types/dom-attributes.js +2 -0
- package/dist/types/dom-attributes.js.map +1 -0
- package/dist/types/events.d.ts +13 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +7 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/jsx.d.ts +215 -0
- package/dist/types/jsx.d.ts.map +1 -0
- package/dist/types/jsx.js +2 -0
- package/dist/types/jsx.js.map +1 -0
- package/dist/utils/context.d.ts +31 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +80 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/dom-helpers.d.ts +29 -0
- package/dist/utils/dom-helpers.d.ts.map +1 -0
- package/dist/utils/dom-helpers.js +53 -0
- package/dist/utils/dom-helpers.js.map +1 -0
- package/dist/vnode.d.ts +28 -0
- package/dist/vnode.d.ts.map +1 -0
- package/dist/vnode.js +68 -0
- package/dist/vnode.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { replaceNode, shallowEqual } from './helpers.js';
|
|
3
|
+
import { diff } from './index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Diff Function Component VNode
|
|
6
|
+
* - Shallow compare props
|
|
7
|
+
* - Re-call function if props changed
|
|
8
|
+
* - Recursively diff __rendered__
|
|
9
|
+
*/
|
|
10
|
+
export function diffFunctionComponent(oldVNode, newVNode, container) {
|
|
11
|
+
if (oldVNode.__type__ !== VNodeType.FunctionComponent ||
|
|
12
|
+
newVNode.__type__ !== VNodeType.FunctionComponent) {
|
|
13
|
+
throw new Error('Expected FunctionComponentVNode');
|
|
14
|
+
}
|
|
15
|
+
// Type assertion after runtime check
|
|
16
|
+
const oldFuncVNode = oldVNode;
|
|
17
|
+
const newFuncVNode = newVNode;
|
|
18
|
+
// Function changed - replace
|
|
19
|
+
if (oldFuncVNode.type !== newFuncVNode.type) {
|
|
20
|
+
replaceNode(oldFuncVNode, newFuncVNode, container);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Shallow compare props
|
|
24
|
+
if (shallowEqual(oldFuncVNode.props, newFuncVNode.props)) {
|
|
25
|
+
// Props unchanged - reuse rendered result
|
|
26
|
+
newFuncVNode.__rendered__ = oldFuncVNode.__rendered__;
|
|
27
|
+
newFuncVNode.__dom__ = oldFuncVNode.__dom__;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Props changed - re-call function
|
|
31
|
+
// Merge children into props (like React)
|
|
32
|
+
const propsWithChildren = {
|
|
33
|
+
...(newFuncVNode.props ?? {}),
|
|
34
|
+
children: newFuncVNode.children.length === 1
|
|
35
|
+
? newFuncVNode.children[0]
|
|
36
|
+
: newFuncVNode.children,
|
|
37
|
+
};
|
|
38
|
+
// Call function component with typed signature
|
|
39
|
+
const funcComponent = newFuncVNode.type;
|
|
40
|
+
const rendered = funcComponent(propsWithChildren);
|
|
41
|
+
// Store rendered VNode (only if it's a VNode object)
|
|
42
|
+
if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
|
|
43
|
+
newFuncVNode.__rendered__ = rendered;
|
|
44
|
+
}
|
|
45
|
+
// Diff old and new rendered result
|
|
46
|
+
const oldRendered = oldFuncVNode.__rendered__;
|
|
47
|
+
diff(oldRendered, rendered, container);
|
|
48
|
+
// Update __dom__ reference (only for non-ClassComponent VNodes)
|
|
49
|
+
if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
|
|
50
|
+
const renderedVNode = rendered;
|
|
51
|
+
// ClassComponentVNode doesn't have __dom__, skip for that type
|
|
52
|
+
if (renderedVNode.__type__ !== VNodeType.ClassComponent &&
|
|
53
|
+
'__dom__' in renderedVNode) {
|
|
54
|
+
newFuncVNode.__dom__ = renderedVNode.__dom__;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../../src/renderer/diff/function.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,iBAAiB;QACjD,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,iBAAiB,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG,QAAkC,CAAC;IACxD,MAAM,YAAY,GAAG,QAAkC,CAAC;IAExD,6BAA6B;IAC7B,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;QAC5C,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,0CAA0C;QAC1C,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;QACtD,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,mCAAmC;IACnC,yCAAyC;IACzC,MAAM,iBAAiB,GAA4B;QACjD,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7B,QAAQ,EACN,YAAY,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAChC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,YAAY,CAAC,QAAQ;KAC5B,CAAC;IAEF,+CAA+C;IAC/C,MAAM,aAAa,GAAG,YAAY,CAAC,IAAoC,CAAC;IACxE,MAAM,QAAQ,GAAe,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAE9D,qDAAqD;IACrD,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QACvE,YAAY,CAAC,YAAY,GAAG,QAAiB,CAAC;IAChD,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC;IAC9C,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEvC,gEAAgE;IAChE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QACvE,MAAM,aAAa,GAAG,QAAiB,CAAC;QACxC,+DAA+D;QAC/D,IACE,aAAa,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc;YACnD,SAAS,IAAI,aAAa,EAC1B,CAAC;YACD,YAAY,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Helpers
|
|
3
|
+
*
|
|
4
|
+
* Helper functions for diff operations
|
|
5
|
+
*/
|
|
6
|
+
import type { VNodeChild } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Replace old node with new node
|
|
9
|
+
*/
|
|
10
|
+
export declare function replaceNode(oldVNode: VNodeChild, newVNode: VNodeChild, container: Element): void;
|
|
11
|
+
/**
|
|
12
|
+
* Remove node from DOM
|
|
13
|
+
*/
|
|
14
|
+
export declare function removeNode(vnode: VNodeChild, container: Element): void;
|
|
15
|
+
/**
|
|
16
|
+
* Shallow compare two objects
|
|
17
|
+
*/
|
|
18
|
+
export declare function shallowEqual(a: Record<string, unknown> | null, b: Record<string, unknown> | null): boolean;
|
|
19
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAOV,UAAU,EACX,MAAM,sBAAsB,CAAC;AAyD9B;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,OAAO,GACjB,IAAI,CA8BN;AAmED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAiDtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACjC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAChC,OAAO,CAcT"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { createRealNode } from '../create.js';
|
|
3
|
+
import { activate } from '../mount.js';
|
|
4
|
+
/**
|
|
5
|
+
* Get the first DOM node from a VNode
|
|
6
|
+
*/
|
|
7
|
+
function getFirstDomNode(vnode) {
|
|
8
|
+
if (!vnode)
|
|
9
|
+
return null;
|
|
10
|
+
// Primitive - not reliable
|
|
11
|
+
if (typeof vnode === 'string' ||
|
|
12
|
+
typeof vnode === 'number' ||
|
|
13
|
+
typeof vnode === 'boolean') {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// VNode object
|
|
17
|
+
if (typeof vnode === 'object' && '__type__' in vnode) {
|
|
18
|
+
const vnodeObj = vnode;
|
|
19
|
+
// Class Component - get DOM from instance
|
|
20
|
+
if (vnodeObj.__type__ === VNodeType.ClassComponent) {
|
|
21
|
+
const classVNode = vnodeObj;
|
|
22
|
+
const instance = classVNode.__instance__;
|
|
23
|
+
// Get from instance's rendered DOM
|
|
24
|
+
const instanceVNode = instance?.__vnode__;
|
|
25
|
+
if (instanceVNode && '__dom__' in instanceVNode) {
|
|
26
|
+
const dom = instanceVNode.__dom__;
|
|
27
|
+
if (dom) {
|
|
28
|
+
return Array.isArray(dom) ? dom[0] : dom;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Fallback: if not mounted yet, check placeholder
|
|
32
|
+
const placeholder = classVNode.__placeholder__;
|
|
33
|
+
if (placeholder?.parentNode) {
|
|
34
|
+
return placeholder;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// Other types - get from __dom__
|
|
39
|
+
const dom = vnodeObj.__dom__;
|
|
40
|
+
if (dom) {
|
|
41
|
+
return Array.isArray(dom) ? dom[0] : dom;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Replace old node with new node
|
|
48
|
+
*/
|
|
49
|
+
export function replaceNode(oldVNode, newVNode, container) {
|
|
50
|
+
if (!oldVNode) {
|
|
51
|
+
throw new Error('Old VNode is required for replaceNode');
|
|
52
|
+
}
|
|
53
|
+
// Get the first DOM node of oldVNode to find insertion position
|
|
54
|
+
const oldFirstNode = getFirstDomNode(oldVNode);
|
|
55
|
+
const nextSibling = oldFirstNode?.nextSibling ?? null;
|
|
56
|
+
// Remove old node
|
|
57
|
+
removeNode(oldVNode, container);
|
|
58
|
+
// Create new node
|
|
59
|
+
const node = createRealNode(newVNode);
|
|
60
|
+
if (!node) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Insert placeholder at the same position
|
|
64
|
+
const placeholder = document.createComment('fukict-replace');
|
|
65
|
+
if (nextSibling && nextSibling.parentNode === container) {
|
|
66
|
+
container.insertBefore(placeholder, nextSibling);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
container.appendChild(placeholder);
|
|
70
|
+
}
|
|
71
|
+
// Use activate in placeholder mode - it will replace placeholder with DOM
|
|
72
|
+
activate({ vnode: newVNode, placeholder });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Unmount VNode recursively (call beforeUnmount on all class components)
|
|
76
|
+
*/
|
|
77
|
+
function unmountVNode(vnode) {
|
|
78
|
+
if (!vnode)
|
|
79
|
+
return;
|
|
80
|
+
// Primitive - nothing to unmount
|
|
81
|
+
if (typeof vnode === 'string' ||
|
|
82
|
+
typeof vnode === 'number' ||
|
|
83
|
+
typeof vnode === 'boolean') {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Array - unmount each item
|
|
87
|
+
if (Array.isArray(vnode)) {
|
|
88
|
+
vnode.forEach(child => unmountVNode(child));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// VNode object
|
|
92
|
+
if (typeof vnode === 'object' && '__type__' in vnode) {
|
|
93
|
+
const vnodeObj = vnode;
|
|
94
|
+
// Class Component - call unmount (which will handle its own __vnode__)
|
|
95
|
+
if (vnodeObj.__type__ === VNodeType.ClassComponent) {
|
|
96
|
+
const classVNode = vnodeObj;
|
|
97
|
+
const instance = classVNode.__instance__;
|
|
98
|
+
if (instance?.unmount) {
|
|
99
|
+
instance.unmount();
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Function Component - unmount its rendered vnode
|
|
104
|
+
if (vnodeObj.__type__ === VNodeType.FunctionComponent) {
|
|
105
|
+
const funcVNode = vnodeObj;
|
|
106
|
+
const renderedVNode = funcVNode.__rendered__;
|
|
107
|
+
if (renderedVNode) {
|
|
108
|
+
unmountVNode(renderedVNode);
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Fragment - unmount all children
|
|
113
|
+
if (vnodeObj.__type__ === VNodeType.Fragment) {
|
|
114
|
+
const fragmentVNode = vnodeObj;
|
|
115
|
+
if (fragmentVNode.children && Array.isArray(fragmentVNode.children)) {
|
|
116
|
+
fragmentVNode.children.forEach(child => unmountVNode(child));
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Element - unmount all children recursively
|
|
121
|
+
if (vnodeObj.__type__ === VNodeType.Element) {
|
|
122
|
+
const elementVNode = vnodeObj;
|
|
123
|
+
if (elementVNode.children && Array.isArray(elementVNode.children)) {
|
|
124
|
+
elementVNode.children.forEach(child => unmountVNode(child));
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Remove node from DOM
|
|
132
|
+
*/
|
|
133
|
+
export function removeNode(vnode, container) {
|
|
134
|
+
if (!vnode)
|
|
135
|
+
return;
|
|
136
|
+
// First, unmount all components recursively (trigger beforeUnmount hooks)
|
|
137
|
+
unmountVNode(vnode);
|
|
138
|
+
// Then remove DOM nodes
|
|
139
|
+
// Primitive - find and remove text node (simplified)
|
|
140
|
+
if (typeof vnode === 'string' ||
|
|
141
|
+
typeof vnode === 'number' ||
|
|
142
|
+
typeof vnode === 'boolean') {
|
|
143
|
+
const text = String(vnode);
|
|
144
|
+
const textNodes = Array.from(container.childNodes).filter(node => node.nodeType === Node.TEXT_NODE && node.textContent === text);
|
|
145
|
+
textNodes.forEach(node => container.removeChild(node));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// VNode object
|
|
149
|
+
if (typeof vnode === 'object' && '__type__' in vnode) {
|
|
150
|
+
const vnodeObj = vnode;
|
|
151
|
+
// Class Component - remove placeholder if exists
|
|
152
|
+
if (vnodeObj.__type__ === VNodeType.ClassComponent) {
|
|
153
|
+
const classVNode = vnodeObj;
|
|
154
|
+
const placeholder = classVNode.__placeholder__;
|
|
155
|
+
if (placeholder?.parentNode) {
|
|
156
|
+
placeholder.parentNode.removeChild(placeholder);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Other types - remove __dom__
|
|
161
|
+
const dom = vnodeObj.__dom__;
|
|
162
|
+
if (dom) {
|
|
163
|
+
if (Array.isArray(dom)) {
|
|
164
|
+
dom.forEach((node) => {
|
|
165
|
+
if (node.parentNode) {
|
|
166
|
+
node.parentNode.removeChild(node);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else if (dom.parentNode) {
|
|
171
|
+
dom.parentNode.removeChild(dom);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Shallow compare two objects
|
|
178
|
+
*/
|
|
179
|
+
export function shallowEqual(a, b) {
|
|
180
|
+
if (a === b)
|
|
181
|
+
return true;
|
|
182
|
+
if (!a || !b)
|
|
183
|
+
return false;
|
|
184
|
+
const keysA = Object.keys(a);
|
|
185
|
+
const keysB = Object.keys(b);
|
|
186
|
+
if (keysA.length !== keysB.length)
|
|
187
|
+
return false;
|
|
188
|
+
for (const key of keysA) {
|
|
189
|
+
if (a[key] !== b[key])
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/renderer/diff/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff and Patch
|
|
3
|
+
*
|
|
4
|
+
* Update existing DOM by diffing old and new VNodes
|
|
5
|
+
*/
|
|
6
|
+
import type { VNodeChild } from '../../types/index.js';
|
|
7
|
+
export { replaceNode, removeNode, shallowEqual } from './helpers.js';
|
|
8
|
+
export { patchProps } from './props.js';
|
|
9
|
+
export { diffChildren } from './children.js';
|
|
10
|
+
/**
|
|
11
|
+
* Diff and patch VNode tree
|
|
12
|
+
*
|
|
13
|
+
* @param oldVNode - Old VNode (can be array from slots)
|
|
14
|
+
* @param newVNode - New VNode (can be array from slots)
|
|
15
|
+
* @param container - Container element
|
|
16
|
+
*/
|
|
17
|
+
export declare function diff(oldVNode: VNodeChild, newVNode: VNodeChild, container: Element): void;
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAY9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,IAAI,CAClB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,OAAO,GACjB,IAAI,CAmGN"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { createRealNode } from '../create.js';
|
|
3
|
+
import { activate } from '../mount.js';
|
|
4
|
+
import { diffChildren } from './children.js';
|
|
5
|
+
import { diffClassComponent } from './class.js';
|
|
6
|
+
import { diffElement } from './element.js';
|
|
7
|
+
import { diffFragment } from './fragment.js';
|
|
8
|
+
import { diffFunctionComponent } from './function.js';
|
|
9
|
+
import { removeNode, replaceNode } from './helpers.js';
|
|
10
|
+
// Re-export for external use
|
|
11
|
+
export { replaceNode, removeNode, shallowEqual } from './helpers.js';
|
|
12
|
+
export { patchProps } from './props.js';
|
|
13
|
+
export { diffChildren } from './children.js';
|
|
14
|
+
/**
|
|
15
|
+
* Diff and patch VNode tree
|
|
16
|
+
*
|
|
17
|
+
* @param oldVNode - Old VNode (can be array from slots)
|
|
18
|
+
* @param newVNode - New VNode (can be array from slots)
|
|
19
|
+
* @param container - Container element
|
|
20
|
+
*/
|
|
21
|
+
export function diff(oldVNode, newVNode, container) {
|
|
22
|
+
// Handle array types (e.g., from slots)
|
|
23
|
+
// If either is array, use diffChildren for array comparison
|
|
24
|
+
if (Array.isArray(oldVNode) || Array.isArray(newVNode)) {
|
|
25
|
+
const oldChildren = Array.isArray(oldVNode) ? oldVNode : [oldVNode];
|
|
26
|
+
const newChildren = Array.isArray(newVNode) ? newVNode : [newVNode];
|
|
27
|
+
diffChildren(oldChildren, newChildren, container);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Both null/undefined - no changes
|
|
31
|
+
if (!oldVNode && !newVNode) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Old exists, new is null - remove
|
|
35
|
+
if (oldVNode && !newVNode) {
|
|
36
|
+
removeNode(oldVNode, container);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Old is null, new exists - create and mount
|
|
40
|
+
if (!oldVNode && newVNode) {
|
|
41
|
+
const node = createRealNode(newVNode);
|
|
42
|
+
if (node) {
|
|
43
|
+
if (Array.isArray(node)) {
|
|
44
|
+
node.forEach(n => container.appendChild(n));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
container.appendChild(node);
|
|
48
|
+
}
|
|
49
|
+
activate({ vnode: newVNode, container });
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Both are primitives
|
|
54
|
+
if ((typeof oldVNode === 'string' ||
|
|
55
|
+
typeof oldVNode === 'number' ||
|
|
56
|
+
typeof oldVNode === 'boolean') &&
|
|
57
|
+
(typeof newVNode === 'string' ||
|
|
58
|
+
typeof newVNode === 'number' ||
|
|
59
|
+
typeof newVNode === 'boolean')) {
|
|
60
|
+
// Text changed - replace text node
|
|
61
|
+
if (oldVNode !== newVNode) {
|
|
62
|
+
const oldText = String(oldVNode);
|
|
63
|
+
const newText = String(newVNode);
|
|
64
|
+
// Find and replace text node (simplified - assumes single text node)
|
|
65
|
+
const textNodes = Array.from(container.childNodes).filter(node => node.nodeType === Node.TEXT_NODE && node.textContent === oldText);
|
|
66
|
+
if (textNodes.length > 0) {
|
|
67
|
+
textNodes[0].textContent = newText;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// One is primitive, one is VNode - replace
|
|
73
|
+
const isOldVNode = typeof oldVNode === 'object' && oldVNode !== null && '__type__' in oldVNode;
|
|
74
|
+
const isNewVNode = typeof newVNode === 'object' && newVNode !== null && '__type__' in newVNode;
|
|
75
|
+
if (!isOldVNode || !isNewVNode) {
|
|
76
|
+
replaceNode(oldVNode, newVNode, container);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Both are VNodes - check type match
|
|
80
|
+
const oldVN = oldVNode;
|
|
81
|
+
const newVN = newVNode;
|
|
82
|
+
// Type mismatch - replace entire node
|
|
83
|
+
if (oldVN.__type__ !== newVN.__type__) {
|
|
84
|
+
replaceNode(oldVN, newVN, container);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Same type - diff by type
|
|
88
|
+
switch (newVN.__type__) {
|
|
89
|
+
case VNodeType.Element:
|
|
90
|
+
diffElement(oldVN, newVN, container);
|
|
91
|
+
break;
|
|
92
|
+
case VNodeType.Fragment:
|
|
93
|
+
diffFragment(oldVN, newVN, container);
|
|
94
|
+
break;
|
|
95
|
+
case VNodeType.FunctionComponent:
|
|
96
|
+
diffFunctionComponent(oldVN, newVN, container);
|
|
97
|
+
break;
|
|
98
|
+
case VNodeType.ClassComponent:
|
|
99
|
+
diffClassComponent(oldVN, newVN, container);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer/diff/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prop value types
|
|
3
|
+
*/
|
|
4
|
+
type PropValue = unknown;
|
|
5
|
+
/**
|
|
6
|
+
* Patch element props
|
|
7
|
+
*/
|
|
8
|
+
export declare function patchProps(element: Element, oldProps: Record<string, PropValue> | null, newProps: Record<string, PropValue> | null): void;
|
|
9
|
+
/**
|
|
10
|
+
* Set single prop
|
|
11
|
+
*/
|
|
12
|
+
export declare function setProp(element: Element, key: string, value: PropValue, oldValue?: PropValue): void;
|
|
13
|
+
/**
|
|
14
|
+
* Remove single prop
|
|
15
|
+
*/
|
|
16
|
+
export declare function removeProp(element: Element, key: string, oldValue: PropValue): void;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/props.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,KAAK,SAAS,GAAG,OAAO,CAAC;AAEzB;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,EAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,GACzC,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,EAChB,QAAQ,CAAC,EAAE,SAAS,GACnB,IAAI,CAwDN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,SAAS,GAClB,IAAI,CAkBN"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Props
|
|
3
|
+
*
|
|
4
|
+
* Patch element properties
|
|
5
|
+
*/
|
|
6
|
+
import * as dom from '../../dom/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Patch element props
|
|
9
|
+
*/
|
|
10
|
+
export function patchProps(element, oldProps, newProps) {
|
|
11
|
+
const old = oldProps || {};
|
|
12
|
+
const newP = newProps || {};
|
|
13
|
+
// Remove old props not in new
|
|
14
|
+
for (const key of Object.keys(old)) {
|
|
15
|
+
if (!(key in newP)) {
|
|
16
|
+
removeProp(element, key, old[key]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// Set new props
|
|
20
|
+
for (const key of Object.keys(newP)) {
|
|
21
|
+
const oldValue = old[key];
|
|
22
|
+
const newValue = newP[key];
|
|
23
|
+
if (oldValue !== newValue) {
|
|
24
|
+
setProp(element, key, newValue, oldValue);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set single prop
|
|
30
|
+
*/
|
|
31
|
+
export function setProp(element, key, value, oldValue) {
|
|
32
|
+
// Handle ref callback
|
|
33
|
+
if (key === 'ref' && typeof value === 'function') {
|
|
34
|
+
value(element);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Handle events (on: prefix)
|
|
38
|
+
if (key.startsWith('on:')) {
|
|
39
|
+
const eventName = key.slice(3);
|
|
40
|
+
// Remove old listener if exists
|
|
41
|
+
if (oldValue && typeof oldValue === 'function') {
|
|
42
|
+
dom.removeEventListener(element, eventName, oldValue);
|
|
43
|
+
}
|
|
44
|
+
// Add new listener
|
|
45
|
+
if (value && typeof value === 'function') {
|
|
46
|
+
dom.addEventListener(element, eventName, value);
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Handle style object
|
|
51
|
+
if (key === 'style' && typeof value === 'object' && value !== null) {
|
|
52
|
+
const oldStyle = (typeof oldValue === 'object' && oldValue !== null ? oldValue : {});
|
|
53
|
+
const newStyle = value;
|
|
54
|
+
// Remove old styles not in new
|
|
55
|
+
for (const styleKey of Object.keys(oldStyle)) {
|
|
56
|
+
if (!(styleKey in newStyle)) {
|
|
57
|
+
dom.setStyle(element, styleKey, '');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Set new styles
|
|
61
|
+
for (const [styleKey, styleValue] of Object.entries(newStyle)) {
|
|
62
|
+
dom.setStyle(element, styleKey, styleValue);
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Handle special properties
|
|
67
|
+
if (key === 'value' || key === 'checked' || key === 'selected') {
|
|
68
|
+
dom.setProperty(element, key, value);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Handle class with enhanced support
|
|
72
|
+
if (key === 'class') {
|
|
73
|
+
dom.setClass(element, value);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Default: set as attribute
|
|
77
|
+
dom.setAttribute(element, key, value);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Remove single prop
|
|
81
|
+
*/
|
|
82
|
+
export function removeProp(element, key, oldValue) {
|
|
83
|
+
// Handle events (on: prefix)
|
|
84
|
+
if (key.startsWith('on:')) {
|
|
85
|
+
const eventName = key.slice(3);
|
|
86
|
+
if (typeof oldValue === 'function') {
|
|
87
|
+
dom.removeEventListener(element, eventName, oldValue);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Handle special properties
|
|
92
|
+
if (key === 'value' || key === 'checked' || key === 'selected') {
|
|
93
|
+
dom.setProperty(element, key, '');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Default: remove attribute
|
|
97
|
+
dom.removeAttribute(element, key);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../../src/renderer/diff/props.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { VNode, VNodeChild } from '../types/index.js';
|
|
2
|
+
export { diff } from './diff/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Attach VNode to container (complete mounting flow)
|
|
5
|
+
*
|
|
6
|
+
* @param vnode - VNode to render
|
|
7
|
+
* @param container - Container element
|
|
8
|
+
* @returns Unmount function
|
|
9
|
+
*/
|
|
10
|
+
export declare function attach(vnode: VNodeChild, container: Element): (() => void) | null;
|
|
11
|
+
/**
|
|
12
|
+
* Replace an existing DOM node with a new VNode
|
|
13
|
+
*
|
|
14
|
+
* @param oldNode - Existing DOM node to replace
|
|
15
|
+
* @param newVNode - New VNode to render
|
|
16
|
+
* @param _oldVNode - Optional VNode associated with oldNode (unused, kept for API compatibility)
|
|
17
|
+
* @returns New DOM node(s) or null
|
|
18
|
+
*/
|
|
19
|
+
export declare function replaceNode(oldNode: Node, newVNode: VNodeChild, _oldVNode?: VNode): Node | Node[] | null;
|
|
20
|
+
/**
|
|
21
|
+
* Unmount node (DOM removal)
|
|
22
|
+
*
|
|
23
|
+
* @param node - DOM node or node array
|
|
24
|
+
*/
|
|
25
|
+
export declare function unmount(node: Node | Node[]): void;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM3D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,OAAO,GACjB,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAmBrB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,KAAK,GAChB,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAgCtB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAYjD"}
|