@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,61 @@
|
|
|
1
|
+
import * as dom from '../dom/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Set attributes on element
|
|
4
|
+
*
|
|
5
|
+
* @param element - DOM element
|
|
6
|
+
* @param props - Props object
|
|
7
|
+
* @param componentInstance - Optional component instance for fukict:ref
|
|
8
|
+
*/
|
|
9
|
+
export function setAttributes(element, props, componentInstance) {
|
|
10
|
+
for (const [key, value] of Object.entries(props)) {
|
|
11
|
+
if (key === 'children') {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
// Handle fukict:ref (class component refs)
|
|
15
|
+
if (key === 'fukict:ref' &&
|
|
16
|
+
typeof value === 'string' &&
|
|
17
|
+
componentInstance) {
|
|
18
|
+
// Register ref in component's refs Map
|
|
19
|
+
if (!componentInstance.refs.has(value)) {
|
|
20
|
+
componentInstance.refs.set(value, { current: null });
|
|
21
|
+
}
|
|
22
|
+
const ref = componentInstance.refs.get(value);
|
|
23
|
+
if (ref) {
|
|
24
|
+
ref.current = element;
|
|
25
|
+
}
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// TODO: dom 应该统一处理流程
|
|
29
|
+
// Handle ref callback
|
|
30
|
+
if (key === 'ref' && typeof value === 'function') {
|
|
31
|
+
value(element);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Handle events (on: prefix)
|
|
35
|
+
if (key.startsWith('on:')) {
|
|
36
|
+
const eventName = key.slice(3);
|
|
37
|
+
dom.addEventListener(element, eventName, value);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
// Handle style object
|
|
41
|
+
if (key === 'style' && typeof value === 'object' && value !== null) {
|
|
42
|
+
for (const [styleKey, styleValue] of Object.entries(value)) {
|
|
43
|
+
dom.setStyle(element, styleKey, styleValue);
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Handle special properties
|
|
48
|
+
if (key === 'value' || key === 'checked' || key === 'selected') {
|
|
49
|
+
dom.setProperty(element, key, value);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// Handle class with enhanced support
|
|
53
|
+
if (key === 'class') {
|
|
54
|
+
dom.setClass(element, value);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Default: set as attribute
|
|
58
|
+
dom.setAttribute(element, key, value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/renderer/attributes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgB,EAChB,KAA8B,EAC9B,iBAA0B;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,2CAA2C;QAC3C,IACE,GAAG,KAAK,YAAY;YACpB,OAAO,KAAK,KAAK,QAAQ;YACzB,iBAAiB,EACjB,CAAC;YACD,uCAAuC;YACvC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,CAAC;YACD,SAAS;QACX,CAAC;QAED,qBAAqB;QAErB,sBAAsB;QACtB,IAAI,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChD,KAAoC,CAAC,OAAO,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAsB,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnE,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,QAAQ,CACV,OAAsB,EACtB,QAAQ,EACR,UAA6B,CAC9B,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,4BAA4B;QAC5B,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC/D,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,QAAQ,CACV,OAAO,EACP,KAAoD,CACrD,CAAC;YACF,SAAS;QACX,CAAC;QAED,4BAA4B;QAC5B,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Renderer: Create Real Nodes
|
|
3
|
+
*
|
|
4
|
+
* Create real DOM nodes from VNode (supports Node | Node[] return)
|
|
5
|
+
*/
|
|
6
|
+
import { Fukict } from '../component-class/fukict.js';
|
|
7
|
+
import type { VNode, VNodeChild } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create real DOM node(s) from VNode
|
|
10
|
+
*
|
|
11
|
+
* @param vnode - VNode or primitive (can be array from slots)
|
|
12
|
+
* @param componentInstance - Optional component instance for fukict:ref
|
|
13
|
+
* @returns Node | Node[] | null
|
|
14
|
+
* - Element: returns Node
|
|
15
|
+
* - Fragment: returns Node[]
|
|
16
|
+
* - Function Component: returns Node | Node[] (depends on rendered result)
|
|
17
|
+
* - Class Component: returns Comment placeholder
|
|
18
|
+
* - Primitives: returns Text Node
|
|
19
|
+
* - Array: returns Node[] (flattened)
|
|
20
|
+
*/
|
|
21
|
+
export declare function createRealNode(vnode: VNodeChild, componentInstance?: Fukict): Node | Node[] | null;
|
|
22
|
+
/**
|
|
23
|
+
* Create element from VNode object
|
|
24
|
+
*
|
|
25
|
+
* @param vnode - VNode
|
|
26
|
+
* @param componentInstance - Optional component instance for fukict:ref
|
|
27
|
+
* @returns Node | Node[] | null
|
|
28
|
+
*/
|
|
29
|
+
export declare function createElementFromVNode(vnode: VNode, componentInstance?: Fukict): Node | Node[] | null;
|
|
30
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAItD,OAAO,KAAK,EAGV,KAAK,EACL,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,iBAAiB,CAAC,EAAE,MAAM,GACzB,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAkCtB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,iBAAiB,CAAC,EAAE,MAAM,GACzB,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAkBtB"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { extractSlots } from '../component-class/slot.js';
|
|
2
|
+
import * as dom from '../dom/index.js';
|
|
3
|
+
import { VNodeType } from '../types/index.js';
|
|
4
|
+
import { setAttributes } from './attributes.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create real DOM node(s) from VNode
|
|
7
|
+
*
|
|
8
|
+
* @param vnode - VNode or primitive (can be array from slots)
|
|
9
|
+
* @param componentInstance - Optional component instance for fukict:ref
|
|
10
|
+
* @returns Node | Node[] | null
|
|
11
|
+
* - Element: returns Node
|
|
12
|
+
* - Fragment: returns Node[]
|
|
13
|
+
* - Function Component: returns Node | Node[] (depends on rendered result)
|
|
14
|
+
* - Class Component: returns Comment placeholder
|
|
15
|
+
* - Primitives: returns Text Node
|
|
16
|
+
* - Array: returns Node[] (flattened)
|
|
17
|
+
*/
|
|
18
|
+
export function createRealNode(vnode, componentInstance) {
|
|
19
|
+
// Handle arrays (e.g., from slots)
|
|
20
|
+
// Recursively flatten and render each item
|
|
21
|
+
if (Array.isArray(vnode)) {
|
|
22
|
+
const nodes = [];
|
|
23
|
+
for (const item of vnode) {
|
|
24
|
+
const node = createRealNode(item, componentInstance);
|
|
25
|
+
if (node) {
|
|
26
|
+
if (Array.isArray(node)) {
|
|
27
|
+
nodes.push(...node);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
nodes.push(node);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return nodes.length === 0 ? null : nodes;
|
|
35
|
+
}
|
|
36
|
+
// Filter out invalid values
|
|
37
|
+
if (vnode === null || vnode === undefined || typeof vnode === 'boolean') {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Primitive values become text nodes
|
|
41
|
+
if (typeof vnode === 'string' || typeof vnode === 'number') {
|
|
42
|
+
return dom.createTextNode(String(vnode));
|
|
43
|
+
}
|
|
44
|
+
// VNode object - use discriminated union
|
|
45
|
+
if (typeof vnode === 'object' && '__type__' in vnode) {
|
|
46
|
+
return createElementFromVNode(vnode, componentInstance);
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create element from VNode object
|
|
52
|
+
*
|
|
53
|
+
* @param vnode - VNode
|
|
54
|
+
* @param componentInstance - Optional component instance for fukict:ref
|
|
55
|
+
* @returns Node | Node[] | null
|
|
56
|
+
*/
|
|
57
|
+
export function createElementFromVNode(vnode, componentInstance) {
|
|
58
|
+
// Use discriminated union for type-safe rendering
|
|
59
|
+
switch (vnode.__type__) {
|
|
60
|
+
case VNodeType.Element:
|
|
61
|
+
return renderElement(vnode, componentInstance);
|
|
62
|
+
case VNodeType.Fragment:
|
|
63
|
+
return renderFragment(vnode, componentInstance);
|
|
64
|
+
case VNodeType.FunctionComponent:
|
|
65
|
+
return renderFunctionComponent(vnode, componentInstance);
|
|
66
|
+
case VNodeType.ClassComponent:
|
|
67
|
+
return renderClassComponent(vnode, componentInstance);
|
|
68
|
+
default:
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Render Element VNode
|
|
74
|
+
* Returns single DOM node
|
|
75
|
+
*/
|
|
76
|
+
function renderElement(vnode, componentInstance) {
|
|
77
|
+
// TypeScript now knows vnode is ElementVNode
|
|
78
|
+
if (vnode.__type__ !== VNodeType.Element) {
|
|
79
|
+
throw new Error('Expected ElementVNode');
|
|
80
|
+
}
|
|
81
|
+
const { type, props, children } = vnode;
|
|
82
|
+
const element = dom.createElement(type);
|
|
83
|
+
// Set attributes and events
|
|
84
|
+
if (props) {
|
|
85
|
+
setAttributes(element, props, componentInstance);
|
|
86
|
+
}
|
|
87
|
+
// Render children (pass component instance for nested fukict:ref)
|
|
88
|
+
if (Array.isArray(children)) {
|
|
89
|
+
for (const child of children) {
|
|
90
|
+
const node = createRealNode(child, componentInstance);
|
|
91
|
+
if (!node)
|
|
92
|
+
continue;
|
|
93
|
+
// node 可能是单个或数组
|
|
94
|
+
if (Array.isArray(node)) {
|
|
95
|
+
node.forEach(n => element.appendChild(n));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
element.appendChild(node);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.warn('Element vnode children is not an array:', vnode);
|
|
104
|
+
}
|
|
105
|
+
// 保存单个节点到 __dom__
|
|
106
|
+
vnode.__dom__ = element;
|
|
107
|
+
return element;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Render Fragment VNode
|
|
111
|
+
* Returns array of DOM nodes
|
|
112
|
+
*/
|
|
113
|
+
function renderFragment(vnode, componentInstance) {
|
|
114
|
+
// TypeScript now knows vnode is FragmentVNode
|
|
115
|
+
if (vnode.__type__ !== VNodeType.Fragment) {
|
|
116
|
+
throw new Error('Expected FragmentVNode');
|
|
117
|
+
}
|
|
118
|
+
const { children } = vnode;
|
|
119
|
+
const nodes = [];
|
|
120
|
+
if (Array.isArray(children)) {
|
|
121
|
+
for (const child of children) {
|
|
122
|
+
const node = createRealNode(child, componentInstance);
|
|
123
|
+
if (!node)
|
|
124
|
+
continue;
|
|
125
|
+
// node 可能是单个 Node 或 Node[](嵌套 Fragment)
|
|
126
|
+
if (Array.isArray(node)) {
|
|
127
|
+
nodes.push(...node);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
nodes.push(node);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
console.warn('Element vnode children is not an array:', vnode);
|
|
136
|
+
}
|
|
137
|
+
// 保存所有节点到 __dom__
|
|
138
|
+
vnode.__dom__ = nodes;
|
|
139
|
+
return nodes;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Render Function Component VNode
|
|
143
|
+
* Returns Node | Node[] | null (depends on rendered result)
|
|
144
|
+
*/
|
|
145
|
+
function renderFunctionComponent(vnode, componentInstance) {
|
|
146
|
+
// TypeScript now knows vnode is FunctionComponentVNode
|
|
147
|
+
if (vnode.__type__ !== VNodeType.FunctionComponent) {
|
|
148
|
+
throw new Error('Expected FunctionComponentVNode');
|
|
149
|
+
}
|
|
150
|
+
// Type assertion after runtime check
|
|
151
|
+
const funcVNode = vnode;
|
|
152
|
+
const { type, props, children } = funcVNode;
|
|
153
|
+
// Merge children into props (like React)
|
|
154
|
+
const propsWithChildren = {
|
|
155
|
+
...props,
|
|
156
|
+
children: children.length === 1 ? children[0] : children,
|
|
157
|
+
};
|
|
158
|
+
// Call function component with proper typing
|
|
159
|
+
const funcComponent = type;
|
|
160
|
+
const rendered = funcComponent(propsWithChildren);
|
|
161
|
+
if (!rendered) {
|
|
162
|
+
funcVNode.__rendered__ = undefined;
|
|
163
|
+
funcVNode.__dom__ = null;
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// Render result (pass component instance for nested fukict:ref)
|
|
167
|
+
const domNode = createRealNode(rendered, componentInstance);
|
|
168
|
+
// Save rendered VNode and DOM
|
|
169
|
+
funcVNode.__rendered__ = rendered;
|
|
170
|
+
funcVNode.__dom__ = domNode; // 可能是 Node 或 Node[]
|
|
171
|
+
return domNode;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Render Class Component VNode
|
|
175
|
+
* Returns Comment node as placeholder
|
|
176
|
+
*/
|
|
177
|
+
function renderClassComponent(vnode, componentInstance) {
|
|
178
|
+
// TypeScript now knows vnode is ClassComponentVNode
|
|
179
|
+
if (vnode.__type__ !== VNodeType.ClassComponent) {
|
|
180
|
+
throw new Error('Expected ClassComponentVNode');
|
|
181
|
+
}
|
|
182
|
+
// Type assertion after runtime check
|
|
183
|
+
const classVNode = vnode;
|
|
184
|
+
const { type, props, children } = classVNode;
|
|
185
|
+
// 1. Create instance (only props)
|
|
186
|
+
// Type assertion is safe here because we know it's a class constructor
|
|
187
|
+
const ComponentClass = type;
|
|
188
|
+
const instance = new ComponentClass(props ?? {});
|
|
189
|
+
// 2. Extract and set slots from children
|
|
190
|
+
if (children) {
|
|
191
|
+
instance.slots = extractSlots(children);
|
|
192
|
+
}
|
|
193
|
+
// 3. Handle fukict:ref for class components
|
|
194
|
+
// If parent is a class component and this component has fukict:ref,
|
|
195
|
+
// register this instance to parent's refs
|
|
196
|
+
if (componentInstance && props && props['fukict:ref']) {
|
|
197
|
+
const refName = props['fukict:ref'];
|
|
198
|
+
if (typeof refName === 'string') {
|
|
199
|
+
// Create or update ref in parent component
|
|
200
|
+
if (!componentInstance.refs.has(refName)) {
|
|
201
|
+
componentInstance.refs.set(refName, { current: null });
|
|
202
|
+
}
|
|
203
|
+
const ref = componentInstance.refs.get(refName);
|
|
204
|
+
if (ref) {
|
|
205
|
+
ref.current = instance;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// 4. Save instance to vnode
|
|
210
|
+
classVNode.__instance__ = instance;
|
|
211
|
+
// 5. Save wrapper VNode to instance (for context traversal)
|
|
212
|
+
instance.__wrapper__ = classVNode;
|
|
213
|
+
// 6. Save parent instance reference on wrapper VNode (for context chain)
|
|
214
|
+
if (componentInstance) {
|
|
215
|
+
classVNode.__parentInstance__ = componentInstance;
|
|
216
|
+
}
|
|
217
|
+
// 7. Create comment placeholder with instance ID and name
|
|
218
|
+
const placeholder = dom.createComment(`fukict:${instance.__name__}#${instance.__id__}`);
|
|
219
|
+
// 8. Save placeholder to vnode
|
|
220
|
+
classVNode.__placeholder__ = placeholder;
|
|
221
|
+
return placeholder;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Children
|
|
3
|
+
*
|
|
4
|
+
* Diff children arrays
|
|
5
|
+
*/
|
|
6
|
+
import type { VNodeChild } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Diff children arrays
|
|
9
|
+
* Simplified algorithm without key-based optimization
|
|
10
|
+
*/
|
|
11
|
+
export declare function diffChildren(oldChildren: VNodeChild[], newChildren: VNodeChild[], container: Element): void;
|
|
12
|
+
//# sourceMappingURL=children.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"children.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/children.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,OAAO,GACjB,IAAI,CAiDN"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createRealNode } from '../create.js';
|
|
2
|
+
import { activate } from '../mount.js';
|
|
3
|
+
import { removeNode } from './helpers.js';
|
|
4
|
+
import { diff } from './index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Diff children arrays
|
|
7
|
+
* Simplified algorithm without key-based optimization
|
|
8
|
+
*/
|
|
9
|
+
export function diffChildren(oldChildren, newChildren, container) {
|
|
10
|
+
const oldLen = oldChildren.length;
|
|
11
|
+
const newLen = newChildren.length;
|
|
12
|
+
const commonLen = Math.min(oldLen, newLen);
|
|
13
|
+
// Diff common children
|
|
14
|
+
for (let i = 0; i < commonLen; i++) {
|
|
15
|
+
const oldChild = oldChildren[i];
|
|
16
|
+
const newChild = newChildren[i];
|
|
17
|
+
// Both are primitives - update text node directly
|
|
18
|
+
if ((typeof oldChild === 'string' || typeof oldChild === 'number') &&
|
|
19
|
+
(typeof newChild === 'string' || typeof newChild === 'number')) {
|
|
20
|
+
if (oldChild !== newChild) {
|
|
21
|
+
// Find the i-th text node in container
|
|
22
|
+
const childNodes = Array.from(container.childNodes);
|
|
23
|
+
if (childNodes[i] && childNodes[i].nodeType === Node.TEXT_NODE) {
|
|
24
|
+
childNodes[i].textContent = String(newChild);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// VNode diff
|
|
30
|
+
diff(oldChild, newChild, container);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Remove extra old children
|
|
34
|
+
if (oldLen > newLen) {
|
|
35
|
+
for (let i = commonLen; i < oldLen; i++) {
|
|
36
|
+
removeNode(oldChildren[i], container);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Append new children
|
|
40
|
+
if (newLen > oldLen) {
|
|
41
|
+
for (let i = commonLen; i < newLen; i++) {
|
|
42
|
+
const node = createRealNode(newChildren[i]);
|
|
43
|
+
if (node) {
|
|
44
|
+
if (Array.isArray(node)) {
|
|
45
|
+
node.forEach(n => container.appendChild(n));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
container.appendChild(node);
|
|
49
|
+
}
|
|
50
|
+
activate({ vnode: newChildren[i], container });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"children.js","sourceRoot":"","sources":["../../../src/renderer/diff/children.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAyB,EACzB,WAAyB,EACzB,SAAkB;IAElB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAEhC,kDAAkD;QAClD,IACE,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC;YAC9D,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC,EAC9D,CAAC;YACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,uCAAuC;gBACvC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/D,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;YACb,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBACD,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VNode } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Diff Class Component VNode
|
|
4
|
+
* - Call instance.update(newProps)
|
|
5
|
+
* - Handle detached mode (fukict:detach)
|
|
6
|
+
*/
|
|
7
|
+
export declare function diffClassComponent(oldVNode: VNode, newVNode: VNode, container: Element): void;
|
|
8
|
+
//# sourceMappingURL=class.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIvE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CAoCN"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { replaceNode } from './helpers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Diff Class Component VNode
|
|
5
|
+
* - Call instance.update(newProps)
|
|
6
|
+
* - Handle detached mode (fukict:detach)
|
|
7
|
+
*/
|
|
8
|
+
export function diffClassComponent(oldVNode, newVNode, container) {
|
|
9
|
+
if (oldVNode.__type__ !== VNodeType.ClassComponent ||
|
|
10
|
+
newVNode.__type__ !== VNodeType.ClassComponent) {
|
|
11
|
+
throw new Error('Expected ClassComponentVNode');
|
|
12
|
+
}
|
|
13
|
+
// Type assertion after runtime check
|
|
14
|
+
const oldClassVNode = oldVNode;
|
|
15
|
+
const newClassVNode = newVNode;
|
|
16
|
+
// Class changed - replace entire component
|
|
17
|
+
if (oldClassVNode.type !== newClassVNode.type) {
|
|
18
|
+
replaceNode(oldClassVNode, newClassVNode, container);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Reuse instance
|
|
22
|
+
const instance = oldClassVNode.__instance__;
|
|
23
|
+
newClassVNode.__instance__ = instance;
|
|
24
|
+
// Check detached mode
|
|
25
|
+
if (newClassVNode.props && newClassVNode.props['fukict:detach']) {
|
|
26
|
+
// Detached mode: only update props, skip update()
|
|
27
|
+
if (instance) {
|
|
28
|
+
// Use same pattern as Fukict.update() - cast to bypass readonly
|
|
29
|
+
instance.props = newClassVNode.props;
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Normal mode: call instance.update(newProps)
|
|
34
|
+
if (instance && typeof instance.update === 'function') {
|
|
35
|
+
instance.update(newClassVNode.props ?? {});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.js","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc;QAC9C,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc,EAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAG,QAA+B,CAAC;IACtD,MAAM,aAAa,GAAG,QAA+B,CAAC;IAEtD,2CAA2C;IAC3C,IAAI,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9C,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,aAAa,CAAC,YAA2C,CAAC;IAC3E,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC;IAEtC,sBAAsB;IACtB,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAChE,kDAAkD;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,gEAAgE;YAC/D,QAAQ,CAAC,KAA6B,GAAG,aAAa,CAAC,KAAK,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Element
|
|
3
|
+
*
|
|
4
|
+
* Diff element VNodes
|
|
5
|
+
*/
|
|
6
|
+
import type { VNode } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Diff Element VNode
|
|
9
|
+
* - Reuse DOM node
|
|
10
|
+
* - Patch props
|
|
11
|
+
* - Recursively diff children
|
|
12
|
+
*/
|
|
13
|
+
export declare function diffElement(oldVNode: VNode, newVNode: VNode, container: Element): void;
|
|
14
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAMlD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA6BN"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { diffChildren } from './children.js';
|
|
3
|
+
import { replaceNode } from './helpers.js';
|
|
4
|
+
import { patchProps } from './props.js';
|
|
5
|
+
/**
|
|
6
|
+
* Diff Element VNode
|
|
7
|
+
* - Reuse DOM node
|
|
8
|
+
* - Patch props
|
|
9
|
+
* - Recursively diff children
|
|
10
|
+
*/
|
|
11
|
+
export function diffElement(oldVNode, newVNode, container) {
|
|
12
|
+
if (oldVNode.__type__ !== VNodeType.Element ||
|
|
13
|
+
newVNode.__type__ !== VNodeType.Element) {
|
|
14
|
+
throw new Error('Expected ElementVNode');
|
|
15
|
+
}
|
|
16
|
+
// Tag name changed - replace entire element
|
|
17
|
+
if (oldVNode.type !== newVNode.type) {
|
|
18
|
+
replaceNode(oldVNode, newVNode, container);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Reuse DOM element
|
|
22
|
+
const element = oldVNode.__dom__;
|
|
23
|
+
if (!element) {
|
|
24
|
+
// DOM doesn't exist, replace node
|
|
25
|
+
replaceNode(oldVNode, newVNode, container);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
newVNode.__dom__ = element;
|
|
29
|
+
// Patch props
|
|
30
|
+
patchProps(element, oldVNode.props, newVNode.props);
|
|
31
|
+
// Diff children
|
|
32
|
+
diffChildren(oldVNode.children, newVNode.children, element);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO;QACvC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,EACvC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAkB,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,kCAAkC;QAClC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAE3B,cAAc;IACd,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,gBAAgB;IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Fragment
|
|
3
|
+
*
|
|
4
|
+
* Diff fragment VNodes
|
|
5
|
+
*/
|
|
6
|
+
import type { VNode } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Diff Fragment VNode
|
|
9
|
+
* - Diff children array
|
|
10
|
+
* - Update __dom__ array
|
|
11
|
+
*/
|
|
12
|
+
export declare function diffFragment(oldVNode: VNode, newVNode: VNode, container: Element): void;
|
|
13
|
+
//# sourceMappingURL=fragment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA0BN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { diffChildren } from './children.js';
|
|
3
|
+
/**
|
|
4
|
+
* Diff Fragment VNode
|
|
5
|
+
* - Diff children array
|
|
6
|
+
* - Update __dom__ array
|
|
7
|
+
*/
|
|
8
|
+
export function diffFragment(oldVNode, newVNode, container) {
|
|
9
|
+
if (oldVNode.__type__ !== VNodeType.Fragment ||
|
|
10
|
+
newVNode.__type__ !== VNodeType.Fragment) {
|
|
11
|
+
throw new Error('Expected FragmentVNode');
|
|
12
|
+
}
|
|
13
|
+
// Diff children
|
|
14
|
+
diffChildren(oldVNode.children, newVNode.children, container);
|
|
15
|
+
// Update __dom__ reference (collect all current child nodes)
|
|
16
|
+
const newNodes = [];
|
|
17
|
+
for (const child of newVNode.children) {
|
|
18
|
+
if (child && typeof child === 'object' && '__dom__' in child) {
|
|
19
|
+
const dom = child.__dom__;
|
|
20
|
+
if (dom) {
|
|
21
|
+
if (Array.isArray(dom)) {
|
|
22
|
+
newNodes.push(...dom);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
newNodes.push(dom);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
newVNode.__dom__ = newNodes;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=fragment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QACxC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EACxC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,gBAAgB;IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9D,6DAA6D;IAC7D,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VNode } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Diff Function Component VNode
|
|
4
|
+
* - Shallow compare props
|
|
5
|
+
* - Re-call function if props changed
|
|
6
|
+
* - Recursively diff __rendered__
|
|
7
|
+
*/
|
|
8
|
+
export declare function diffFunctionComponent(oldVNode: VNode, newVNode: VNode, container: Element): void;
|
|
9
|
+
//# sourceMappingURL=function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/function.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,KAAK,EAEN,MAAM,sBAAsB,CAAC;AAK9B;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA4DN"}
|