@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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/dist/component-class/fukict.d.ts +207 -0
  3. package/dist/component-class/fukict.d.ts.map +1 -0
  4. package/dist/component-class/fukict.js +299 -0
  5. package/dist/component-class/fukict.js.map +1 -0
  6. package/dist/component-class/index.d.ts +5 -0
  7. package/dist/component-class/index.d.ts.map +1 -0
  8. package/dist/component-class/index.js +5 -0
  9. package/dist/component-class/index.js.map +1 -0
  10. package/dist/component-class/slot.d.ts +9 -0
  11. package/dist/component-class/slot.d.ts.map +1 -0
  12. package/dist/component-class/slot.js +46 -0
  13. package/dist/component-class/slot.js.map +1 -0
  14. package/dist/component-function/define.d.ts +36 -0
  15. package/dist/component-function/define.d.ts.map +1 -0
  16. package/dist/component-function/define.js +23 -0
  17. package/dist/component-function/define.js.map +1 -0
  18. package/dist/component-function/index.d.ts +6 -0
  19. package/dist/component-function/index.d.ts.map +1 -0
  20. package/dist/component-function/index.js +5 -0
  21. package/dist/component-function/index.js.map +1 -0
  22. package/dist/dom/attributes.d.ts +36 -0
  23. package/dist/dom/attributes.d.ts.map +1 -0
  24. package/dist/dom/attributes.js +113 -0
  25. package/dist/dom/attributes.js.map +1 -0
  26. package/dist/dom/element.d.ts +22 -0
  27. package/dist/dom/element.d.ts.map +1 -0
  28. package/dist/dom/element.js +98 -0
  29. package/dist/dom/element.js.map +1 -0
  30. package/dist/dom/events.d.ts +14 -0
  31. package/dist/dom/events.d.ts.map +1 -0
  32. package/dist/dom/events.js +18 -0
  33. package/dist/dom/events.js.map +1 -0
  34. package/dist/dom/index.d.ts +10 -0
  35. package/dist/dom/index.d.ts.map +1 -0
  36. package/dist/dom/index.js +14 -0
  37. package/dist/dom/index.js.map +1 -0
  38. package/dist/dom/node.d.ts +22 -0
  39. package/dist/dom/node.d.ts.map +1 -0
  40. package/dist/dom/node.js +30 -0
  41. package/dist/dom/node.js.map +1 -0
  42. package/dist/index.d.ts +22 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +26 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/jsx-runtime.d.ts +10 -0
  47. package/dist/jsx-runtime.d.ts.map +1 -0
  48. package/dist/jsx-runtime.js +9 -0
  49. package/dist/jsx-runtime.js.map +1 -0
  50. package/dist/metadata.d.ts +14 -0
  51. package/dist/metadata.d.ts.map +1 -0
  52. package/dist/metadata.js +14 -0
  53. package/dist/metadata.js.map +1 -0
  54. package/dist/renderer/attributes.d.ts +15 -0
  55. package/dist/renderer/attributes.d.ts.map +1 -0
  56. package/dist/renderer/attributes.js +61 -0
  57. package/dist/renderer/attributes.js.map +1 -0
  58. package/dist/renderer/create.d.ts +30 -0
  59. package/dist/renderer/create.d.ts.map +1 -0
  60. package/dist/renderer/create.js +223 -0
  61. package/dist/renderer/create.js.map +1 -0
  62. package/dist/renderer/diff/children.d.ts +12 -0
  63. package/dist/renderer/diff/children.d.ts.map +1 -0
  64. package/dist/renderer/diff/children.js +55 -0
  65. package/dist/renderer/diff/children.js.map +1 -0
  66. package/dist/renderer/diff/class.d.ts +8 -0
  67. package/dist/renderer/diff/class.d.ts.map +1 -0
  68. package/dist/renderer/diff/class.js +38 -0
  69. package/dist/renderer/diff/class.js.map +1 -0
  70. package/dist/renderer/diff/element.d.ts +14 -0
  71. package/dist/renderer/diff/element.d.ts.map +1 -0
  72. package/dist/renderer/diff/element.js +34 -0
  73. package/dist/renderer/diff/element.js.map +1 -0
  74. package/dist/renderer/diff/fragment.d.ts +13 -0
  75. package/dist/renderer/diff/fragment.d.ts.map +1 -0
  76. package/dist/renderer/diff/fragment.js +32 -0
  77. package/dist/renderer/diff/fragment.js.map +1 -0
  78. package/dist/renderer/diff/function.d.ts +9 -0
  79. package/dist/renderer/diff/function.d.ts.map +1 -0
  80. package/dist/renderer/diff/function.js +58 -0
  81. package/dist/renderer/diff/function.js.map +1 -0
  82. package/dist/renderer/diff/helpers.d.ts +19 -0
  83. package/dist/renderer/diff/helpers.d.ts.map +1 -0
  84. package/dist/renderer/diff/helpers.js +194 -0
  85. package/dist/renderer/diff/helpers.js.map +1 -0
  86. package/dist/renderer/diff/index.d.ts +18 -0
  87. package/dist/renderer/diff/index.d.ts.map +1 -0
  88. package/dist/renderer/diff/index.js +103 -0
  89. package/dist/renderer/diff/index.js.map +1 -0
  90. package/dist/renderer/diff/props.d.ts +18 -0
  91. package/dist/renderer/diff/props.d.ts.map +1 -0
  92. package/dist/renderer/diff/props.js +99 -0
  93. package/dist/renderer/diff/props.js.map +1 -0
  94. package/dist/renderer/index.d.ts +26 -0
  95. package/dist/renderer/index.d.ts.map +1 -0
  96. package/dist/renderer/index.js +93 -0
  97. package/dist/renderer/index.js.map +1 -0
  98. package/dist/renderer/mount.d.ts +30 -0
  99. package/dist/renderer/mount.d.ts.map +1 -0
  100. package/dist/renderer/mount.js +209 -0
  101. package/dist/renderer/mount.js.map +1 -0
  102. package/dist/types/class.d.ts +88 -0
  103. package/dist/types/class.d.ts.map +1 -0
  104. package/dist/types/class.js +2 -0
  105. package/dist/types/class.js.map +1 -0
  106. package/dist/types/context.d.ts +36 -0
  107. package/dist/types/context.d.ts.map +1 -0
  108. package/dist/types/context.js +9 -0
  109. package/dist/types/context.js.map +1 -0
  110. package/dist/types/core.d.ts +124 -0
  111. package/dist/types/core.d.ts.map +1 -0
  112. package/dist/types/core.js +15 -0
  113. package/dist/types/core.js.map +1 -0
  114. package/dist/types/dom-attributes.d.ts +236 -0
  115. package/dist/types/dom-attributes.d.ts.map +1 -0
  116. package/dist/types/dom-attributes.js +2 -0
  117. package/dist/types/dom-attributes.js.map +1 -0
  118. package/dist/types/events.d.ts +13 -0
  119. package/dist/types/events.d.ts.map +1 -0
  120. package/dist/types/events.js +7 -0
  121. package/dist/types/events.js.map +1 -0
  122. package/dist/types/index.d.ts +12 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +7 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/types/jsx.d.ts +215 -0
  127. package/dist/types/jsx.d.ts.map +1 -0
  128. package/dist/types/jsx.js +2 -0
  129. package/dist/types/jsx.js.map +1 -0
  130. package/dist/utils/context.d.ts +31 -0
  131. package/dist/utils/context.d.ts.map +1 -0
  132. package/dist/utils/context.js +80 -0
  133. package/dist/utils/context.js.map +1 -0
  134. package/dist/utils/dom-helpers.d.ts +29 -0
  135. package/dist/utils/dom-helpers.d.ts.map +1 -0
  136. package/dist/utils/dom-helpers.js +53 -0
  137. package/dist/utils/dom-helpers.js.map +1 -0
  138. package/dist/vnode.d.ts +28 -0
  139. package/dist/vnode.d.ts.map +1 -0
  140. package/dist/vnode.js +68 -0
  141. package/dist/vnode.js.map +1 -0
  142. 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"}