@fukict/basic 0.1.0 → 0.1.1
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/README.md +489 -0
- package/dist/component-class/fukict.d.ts +0 -5
- package/dist/component-class/fukict.d.ts.map +1 -1
- package/dist/component-class/fukict.js +0 -5
- package/dist/component-class/fukict.js.map +1 -1
- package/dist/component-function/define.d.ts +1 -1
- package/dist/component-function/define.d.ts.map +1 -1
- package/dist/component-function/define.js +1 -4
- package/dist/component-function/define.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/metadata.d.ts +1 -1
- package/dist/metadata.js +1 -1
- package/dist/renderer/class-helpers.d.ts +19 -0
- package/dist/renderer/class-helpers.d.ts.map +1 -0
- package/dist/renderer/class-helpers.js +55 -0
- package/dist/renderer/class-helpers.js.map +1 -0
- package/dist/renderer/create.d.ts.map +1 -1
- package/dist/renderer/create.js +19 -43
- package/dist/renderer/create.js.map +1 -1
- package/dist/renderer/diff/class.d.ts +8 -1
- package/dist/renderer/diff/class.d.ts.map +1 -1
- package/dist/renderer/diff/class.js +14 -7
- package/dist/renderer/diff/class.js.map +1 -1
- package/dist/renderer/diff/element.d.ts.map +1 -1
- package/dist/renderer/diff/element.js +11 -7
- package/dist/renderer/diff/element.js.map +1 -1
- package/dist/renderer/diff/fragment.d.ts.map +1 -1
- package/dist/renderer/diff/fragment.js +6 -3
- package/dist/renderer/diff/fragment.js.map +1 -1
- package/dist/renderer/diff/function.d.ts.map +1 -1
- package/dist/renderer/diff/function.js +13 -12
- package/dist/renderer/diff/function.js.map +1 -1
- package/dist/renderer/vnode-helpers.d.ts +35 -0
- package/dist/renderer/vnode-helpers.d.ts.map +1 -0
- package/dist/renderer/vnode-helpers.js +36 -0
- package/dist/renderer/vnode-helpers.js.map +1 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
# @fukict/basic
|
|
2
|
+
|
|
3
|
+
Lightweight DOM rendering engine with compile-time optimization and zero dependencies.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Lightweight**: Core rendering engine with minimal overhead
|
|
8
|
+
- **VNode System**: Virtual DOM with efficient diff algorithm
|
|
9
|
+
- **Component Model**: Both class and function components
|
|
10
|
+
- **Lifecycle Hooks**: Full lifecycle management (mounted, beforeUnmount, etc.)
|
|
11
|
+
- **Refs Management**: Component and DOM element references
|
|
12
|
+
- **Slots System**: Children composition with named slots
|
|
13
|
+
- **Event Handling**: Optimized event delegation with `on:` prefix
|
|
14
|
+
- **TypeScript**: Complete type definitions with excellent IDE support
|
|
15
|
+
- **Zero Dependencies**: No external runtime dependencies
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm add @fukict/basic
|
|
21
|
+
pnpm add -D @fukict/babel-preset @fukict/vite-plugin
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
### Vite Setup
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// vite.config.ts
|
|
30
|
+
import fukict from '@fukict/vite-plugin';
|
|
31
|
+
|
|
32
|
+
import { defineConfig } from 'vite';
|
|
33
|
+
|
|
34
|
+
export default defineConfig({
|
|
35
|
+
plugins: [fukict()],
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### TypeScript Configuration
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"compilerOptions": {
|
|
44
|
+
"jsx": "preserve",
|
|
45
|
+
"jsxImportSource": "@fukict/basic"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Component Types
|
|
51
|
+
|
|
52
|
+
### Class Components
|
|
53
|
+
|
|
54
|
+
Extend `Fukict` for components with lifecycle and state:
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import { Fukict } from '@fukict/basic';
|
|
58
|
+
|
|
59
|
+
interface CounterProps {
|
|
60
|
+
initial?: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
class Counter extends Fukict<CounterProps> {
|
|
64
|
+
private count = this.props.initial ?? 0;
|
|
65
|
+
private timer?: number;
|
|
66
|
+
|
|
67
|
+
increment = () => {
|
|
68
|
+
this.count++;
|
|
69
|
+
this.update(this.props);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
mounted() {
|
|
73
|
+
console.log('Component mounted');
|
|
74
|
+
this.timer = setInterval(this.increment, 1000);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
beforeUnmount() {
|
|
78
|
+
console.log('Component will unmount');
|
|
79
|
+
clearInterval(this.timer);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
render() {
|
|
83
|
+
return (
|
|
84
|
+
<div>
|
|
85
|
+
<p>Count: {this.count}</p>
|
|
86
|
+
<button on:click={this.increment}>Increment</button>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Function Components
|
|
94
|
+
|
|
95
|
+
Use `defineFukict()` for simple, stateless components:
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
import { defineFukict } from '@fukict/basic';
|
|
99
|
+
|
|
100
|
+
interface GreetingProps {
|
|
101
|
+
name: string;
|
|
102
|
+
age?: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const Greeting = defineFukict<GreetingProps>(({ name, age }) => (
|
|
106
|
+
<div>
|
|
107
|
+
<h1>Hello {name}!</h1>
|
|
108
|
+
{age && <p>You are {age} years old</p>}
|
|
109
|
+
</div>
|
|
110
|
+
));
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Core API
|
|
114
|
+
|
|
115
|
+
### Rendering
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
import { attach, replaceNode, unmount } from '@fukict/basic';
|
|
119
|
+
|
|
120
|
+
// Attach component to DOM
|
|
121
|
+
const vnode = attach(<App />, document.getElementById('app')!);
|
|
122
|
+
|
|
123
|
+
// Replace component
|
|
124
|
+
replaceNode(<NewApp />, vnode);
|
|
125
|
+
|
|
126
|
+
// Unmount component
|
|
127
|
+
unmount(vnode);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### VNode Creation
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
import { h, hyperscript, Fragment } from '@fukict/basic';
|
|
134
|
+
|
|
135
|
+
// Using JSX (recommended)
|
|
136
|
+
const element = <div class="container">Content</div>;
|
|
137
|
+
|
|
138
|
+
// Using hyperscript
|
|
139
|
+
const element = h('div', { class: 'container' }, ['Content']);
|
|
140
|
+
|
|
141
|
+
// Fragment
|
|
142
|
+
const list = (
|
|
143
|
+
<Fragment>
|
|
144
|
+
<li>Item 1</li>
|
|
145
|
+
<li>Item 2</li>
|
|
146
|
+
</Fragment>
|
|
147
|
+
);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Event Handling
|
|
151
|
+
|
|
152
|
+
Use `on:` prefix for event listeners:
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
class Form extends Fukict {
|
|
156
|
+
private value = '';
|
|
157
|
+
|
|
158
|
+
handleInput = (e: Event) => {
|
|
159
|
+
this.value = (e.target as HTMLInputElement).value;
|
|
160
|
+
this.update(this.props);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
handleSubmit = (e: Event) => {
|
|
164
|
+
e.preventDefault();
|
|
165
|
+
console.log('Submitted:', this.value);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
render() {
|
|
169
|
+
return (
|
|
170
|
+
<form on:submit={this.handleSubmit}>
|
|
171
|
+
<input on:input={this.handleInput} value={this.value} />
|
|
172
|
+
<button type="submit">Submit</button>
|
|
173
|
+
</form>
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Refs
|
|
180
|
+
|
|
181
|
+
**Component Refs** with `fukict:ref`:
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
class Parent extends Fukict {
|
|
185
|
+
private childRef?: Counter;
|
|
186
|
+
|
|
187
|
+
mounted() {
|
|
188
|
+
// Access child component instance
|
|
189
|
+
console.log('Child count:', this.childRef?.count);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
render() {
|
|
193
|
+
return (
|
|
194
|
+
<div>
|
|
195
|
+
<Counter fukict:ref={el => (this.childRef = el)} />
|
|
196
|
+
<button on:click={() => this.childRef?.increment()}>
|
|
197
|
+
Increment from parent
|
|
198
|
+
</button>
|
|
199
|
+
</div>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**DOM Refs** with `ref`:
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
class AutoFocusInput extends Fukict {
|
|
209
|
+
private inputRef?: HTMLInputElement;
|
|
210
|
+
|
|
211
|
+
mounted() {
|
|
212
|
+
this.inputRef?.focus();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
render() {
|
|
216
|
+
return <input ref={el => (this.inputRef = el)} />;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Slots (Children)
|
|
222
|
+
|
|
223
|
+
```tsx
|
|
224
|
+
interface CardProps {
|
|
225
|
+
title: string;
|
|
226
|
+
footer?: string;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
class Card extends Fukict<CardProps> {
|
|
230
|
+
render() {
|
|
231
|
+
return (
|
|
232
|
+
<div class="card">
|
|
233
|
+
<div class="card-header">
|
|
234
|
+
<h2>{this.props.title}</h2>
|
|
235
|
+
</div>
|
|
236
|
+
<div class="card-body">{this.slots.default}</div>
|
|
237
|
+
{this.props.footer && (
|
|
238
|
+
<div class="card-footer">{this.props.footer}</div>
|
|
239
|
+
)}
|
|
240
|
+
</div>
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Usage
|
|
246
|
+
<Card title="My Card" footer="Card footer">
|
|
247
|
+
<p>This is the card content</p>
|
|
248
|
+
<button>Action</button>
|
|
249
|
+
</Card>;
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Detached Rendering
|
|
253
|
+
|
|
254
|
+
Use `fukict:detach` to prevent component from being re-rendered when parent updates:
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
class Parent extends Fukict {
|
|
258
|
+
private count = 0;
|
|
259
|
+
|
|
260
|
+
increment = () => {
|
|
261
|
+
this.count++;
|
|
262
|
+
this.update(this.props);
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
render() {
|
|
266
|
+
return (
|
|
267
|
+
<div>
|
|
268
|
+
<p>Parent count: {this.count}</p>
|
|
269
|
+
{/* This component won't re-render when parent updates */}
|
|
270
|
+
<ExpensiveComponent fukict:detach={true} />
|
|
271
|
+
<button on:click={this.increment}>Increment</button>
|
|
272
|
+
</div>
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Lifecycle Hooks
|
|
279
|
+
|
|
280
|
+
```tsx
|
|
281
|
+
class LifecycleDemo extends Fukict {
|
|
282
|
+
// Called after component is mounted to DOM
|
|
283
|
+
mounted() {
|
|
284
|
+
console.log('Mounted');
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Called before component is removed from DOM
|
|
288
|
+
beforeUnmount() {
|
|
289
|
+
console.log('Before unmount');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Called after component updates
|
|
293
|
+
updated() {
|
|
294
|
+
console.log('Updated');
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
render() {
|
|
298
|
+
return <div>Lifecycle Demo</div>;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Advanced Features
|
|
304
|
+
|
|
305
|
+
### Component Update Control
|
|
306
|
+
|
|
307
|
+
```tsx
|
|
308
|
+
class OptimizedComponent extends Fukict<{ data: string }> {
|
|
309
|
+
// Manually trigger updates
|
|
310
|
+
handleChange = () => {
|
|
311
|
+
// Update with new props
|
|
312
|
+
this.update({ data: 'new data' });
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
render() {
|
|
316
|
+
return (
|
|
317
|
+
<div>
|
|
318
|
+
<p>{this.props.data}</p>
|
|
319
|
+
<button on:click={this.handleChange}>Change</button>
|
|
320
|
+
</div>
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### DOM Utilities
|
|
327
|
+
|
|
328
|
+
```tsx
|
|
329
|
+
import {
|
|
330
|
+
createRealNode,
|
|
331
|
+
getAllDomNodes,
|
|
332
|
+
getFirstDomNode,
|
|
333
|
+
isDomArray,
|
|
334
|
+
isVNode,
|
|
335
|
+
normalizeDom,
|
|
336
|
+
} from '@fukict/basic';
|
|
337
|
+
|
|
338
|
+
// Create DOM node from VNode
|
|
339
|
+
const vnode = <div>Hello</div>;
|
|
340
|
+
const domNode = createRealNode(vnode);
|
|
341
|
+
|
|
342
|
+
// Get DOM nodes from VNode
|
|
343
|
+
const firstNode = getFirstDomNode(vnode);
|
|
344
|
+
const allNodes = getAllDomNodes(vnode);
|
|
345
|
+
|
|
346
|
+
// Type checks
|
|
347
|
+
if (isVNode(value)) {
|
|
348
|
+
// value is a VNode
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (isDomArray(nodes)) {
|
|
352
|
+
// nodes is an array of DOM elements
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Type Definitions
|
|
357
|
+
|
|
358
|
+
```tsx
|
|
359
|
+
import type {
|
|
360
|
+
CSSProperties,
|
|
361
|
+
ClassComponentVNode,
|
|
362
|
+
ElementVNode,
|
|
363
|
+
FukictComponent,
|
|
364
|
+
FukictProps,
|
|
365
|
+
FunctionComponentVNode,
|
|
366
|
+
HTMLAttributes,
|
|
367
|
+
SVGAttributes,
|
|
368
|
+
VNode,
|
|
369
|
+
} from '@fukict/basic';
|
|
370
|
+
|
|
371
|
+
// Custom component props
|
|
372
|
+
interface MyComponentProps extends FukictProps {
|
|
373
|
+
title: string;
|
|
374
|
+
count: number;
|
|
375
|
+
onClick?: (e: MouseEvent) => void;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Custom element with specific attributes
|
|
379
|
+
type ButtonElement = ElementVNode & {
|
|
380
|
+
props: HTMLAttributes & {
|
|
381
|
+
type?: 'button' | 'submit' | 'reset';
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Performance Tips
|
|
387
|
+
|
|
388
|
+
1. **Use `fukict:detach`** for components that don't need to react to parent updates
|
|
389
|
+
2. **Minimize renders** by only calling `update()` when necessary
|
|
390
|
+
3. **Reuse components** instead of recreating them
|
|
391
|
+
4. **Event handlers** are automatically optimized with event delegation
|
|
392
|
+
5. **Refs** provide direct access to avoid unnecessary queries
|
|
393
|
+
|
|
394
|
+
## Best Practices
|
|
395
|
+
|
|
396
|
+
### Component Organization
|
|
397
|
+
|
|
398
|
+
```tsx
|
|
399
|
+
// ✅ Good: Separate concerns
|
|
400
|
+
class TodoList extends Fukict<{ items: Todo[] }> {
|
|
401
|
+
render() {
|
|
402
|
+
return (
|
|
403
|
+
<ul>
|
|
404
|
+
{this.props.items.map(item => (
|
|
405
|
+
<TodoItem item={item} />
|
|
406
|
+
))}
|
|
407
|
+
</ul>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// ❌ Bad: Too much in one component
|
|
413
|
+
class TodoApp extends Fukict {
|
|
414
|
+
render() {
|
|
415
|
+
return <div>{/* Everything in one component */}</div>;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Event Handlers
|
|
421
|
+
|
|
422
|
+
```tsx
|
|
423
|
+
// ✅ Good: Arrow function as class property
|
|
424
|
+
class Button extends Fukict {
|
|
425
|
+
handleClick = () => {
|
|
426
|
+
console.log('Clicked');
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
render() {
|
|
430
|
+
return <button on:click={this.handleClick}>Click</button>;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// ❌ Bad: Creates new function on every render
|
|
435
|
+
class Button extends Fukict {
|
|
436
|
+
render() {
|
|
437
|
+
return <button on:click={() => console.log('Clicked')}>Click</button>;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Refs Usage
|
|
443
|
+
|
|
444
|
+
```tsx
|
|
445
|
+
// ✅ Good: Use refs for direct DOM access
|
|
446
|
+
class Form extends Fukict {
|
|
447
|
+
private inputRef?: HTMLInputElement;
|
|
448
|
+
|
|
449
|
+
focus() {
|
|
450
|
+
this.inputRef?.focus();
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
render() {
|
|
454
|
+
return <input ref={(el) => (this.inputRef = el)} />;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ❌ Bad: Query DOM manually
|
|
459
|
+
class Form extends Fukict {
|
|
460
|
+
focus() {
|
|
461
|
+
document.querySelector('input')?.focus(); // Don't do this
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
render() {
|
|
465
|
+
return <input />;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Examples
|
|
471
|
+
|
|
472
|
+
See the [examples](../../examples) directory for complete examples:
|
|
473
|
+
|
|
474
|
+
- [Basic usage](../../examples/basic-vite)
|
|
475
|
+
- [Router integration](../../examples/infra-router)
|
|
476
|
+
- [State management](../../examples/infra-flux)
|
|
477
|
+
- [Complete app](../../examples/complete)
|
|
478
|
+
|
|
479
|
+
## Related Packages
|
|
480
|
+
|
|
481
|
+
- [@fukict/babel-preset](../babel-preset) - JSX transformation (required)
|
|
482
|
+
- [@fukict/vite-plugin](../vite-plugin) - Vite integration (recommended)
|
|
483
|
+
- [@fukict/router](../router) - SPA routing
|
|
484
|
+
- [@fukict/flux](../flux) - State management
|
|
485
|
+
- [@fukict/i18n](../i18n) - Internationalization
|
|
486
|
+
|
|
487
|
+
## License
|
|
488
|
+
|
|
489
|
+
MIT
|
|
@@ -50,11 +50,6 @@ export type FukictComponentProps<P extends Record<string, any>> = P & BaseProps
|
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
52
|
export declare abstract class Fukict<P extends Record<string, any> = {}, S extends Slots = Slots> {
|
|
53
|
-
/**
|
|
54
|
-
* Component type marker for Babel plugin
|
|
55
|
-
* @internal
|
|
56
|
-
*/
|
|
57
|
-
static readonly __COMPONENT_TYPE__: "class";
|
|
58
53
|
/**
|
|
59
54
|
* Unique component instance ID (for debugging)
|
|
60
55
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fukict.d.ts","sourceRoot":"","sources":["../../src/component-class/fukict.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAMpC;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GACjE,SAAS,GACT,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,8BAAsB,MAAM,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAClC,CAAC,SAAS,KAAK,GAAG,KAAK;IAEvB;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"fukict.d.ts","sourceRoot":"","sources":["../../src/component-class/fukict.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAMpC;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GACjE,SAAS,GACT,kBAAkB,GAClB,mBAAmB,GACnB,qBAAqB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,8BAAsB,MAAM,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAClC,CAAC,SAAS,KAAK,GAAG,KAAK;IAEvB;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAElD;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC;;;OAGG;IACH,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IAExB;;;;OAIG;IACH,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAEhC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAE1B;;OAEG;gBACS,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAoB1C;;OAEG;IACH,QAAQ,CAAC,MAAM,IAAI,KAAK;IAExB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAkBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,SAAS,CAAC,UAAU,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS;IA4BhB;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IA2ChD;;OAEG;IACH,OAAO,CAAC,IAAI,IAAI;IAEhB;;OAEG;IACH,aAAa,CAAC,IAAI,IAAI;IAEtB;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAElD;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IA8BtD;;;OAGG;IACH,OAAO,IAAI,IAAI;CAiBhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fukict.js","sourceRoot":"","sources":["../../src/component-class/fukict.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAShD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,mDAAmD;AACnD,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAoB3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,OAAgB,MAAM;IAI1B;;;OAGG;
|
|
1
|
+
{"version":3,"file":"fukict.js","sourceRoot":"","sources":["../../src/component-class/fukict.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export type FunctionComponent<P = {}> = (props: FunctionComponentProps<P>) => VN
|
|
|
30
30
|
* ```
|
|
31
31
|
*
|
|
32
32
|
* @param fn - Function component
|
|
33
|
-
* @returns The same function with better types
|
|
33
|
+
* @returns The same function with better types
|
|
34
34
|
*/
|
|
35
35
|
export declare function defineFukict<P = {}>(fn: FunctionComponent<P>): FunctionComponent<P>;
|
|
36
36
|
//# sourceMappingURL=define.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/component-function/define.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAC5C,mBAAmB,GAAG;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,EAAE,IAAI,CACtC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAC7B,KAAK,GAAG,IAAI,CAAC;AAElB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,EAAE,EACjC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACvB,iBAAiB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/component-function/define.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAC5C,mBAAmB,GAAG;IACpB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,EAAE,IAAI,CACtC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAC7B,KAAK,GAAG,IAAI,CAAC;AAElB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,EAAE,EACjC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACvB,iBAAiB,CAAC,CAAC,CAAC,CAEtB"}
|
|
@@ -12,12 +12,9 @@
|
|
|
12
12
|
* ```
|
|
13
13
|
*
|
|
14
14
|
* @param fn - Function component
|
|
15
|
-
* @returns The same function with better types
|
|
15
|
+
* @returns The same function with better types
|
|
16
16
|
*/
|
|
17
17
|
export function defineFukict(fn) {
|
|
18
|
-
// Add component type marker for Babel plugin
|
|
19
|
-
fn.__COMPONENT_TYPE__ =
|
|
20
|
-
'function';
|
|
21
18
|
return fn;
|
|
22
19
|
}
|
|
23
20
|
//# sourceMappingURL=define.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/component-function/define.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAwB;IAExB,
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/component-function/define.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAwB;IAExB,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { METADATA } from './metadata.js';
|
|
7
7
|
export { METADATA };
|
|
8
|
-
export declare const VERSION: "0.1.
|
|
8
|
+
export declare const VERSION: "0.1.1";
|
|
9
9
|
export type { VNode, VNodeChild, ElementVNode, FragmentVNode, FunctionComponentVNode, ClassComponentVNode, UnregisterFn, RefCallback, CSSProperties, ClassValue, RuntimeAttributes, EventHandlers, HTMLAttributes, SVGAttributes, Slots, Ref, FukictLifecycle, FukictComponent, FukictProps, FukictSlots, FukictConstructor, } from './types/index.js';
|
|
10
10
|
export type { Context, ContextData } from './types/context.js';
|
|
11
11
|
export { VNodeType } from './types/index.js';
|
package/dist/metadata.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const METADATA: {
|
|
6
6
|
readonly name: "@fukict/basic";
|
|
7
|
-
readonly version: "0.1.
|
|
7
|
+
readonly version: "0.1.1";
|
|
8
8
|
readonly description: "Lightweight DOM rendering basic with extension mechanism";
|
|
9
9
|
readonly author: "Fukict Team";
|
|
10
10
|
readonly license: "MIT";
|
package/dist/metadata.js
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ClassComponentVNode } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Setup ClassComponentVNode with instance, slots, refs, and parent references
|
|
4
|
+
*
|
|
5
|
+
* This function handles the common logic for both creating and updating class components:
|
|
6
|
+
* 1. Saves instance to vnode
|
|
7
|
+
* 2. Extracts and sets slots from children
|
|
8
|
+
* 3. Registers instance to parent's refs (if fukict:ref is specified)
|
|
9
|
+
* 4. Updates wrapper VNode reference
|
|
10
|
+
* 5. Updates parent instance reference on wrapper VNode
|
|
11
|
+
*
|
|
12
|
+
* Used by both renderClassComponent (create) and diffClassComponent (update).
|
|
13
|
+
*
|
|
14
|
+
* @param vnode - The ClassComponentVNode to setup
|
|
15
|
+
* @param instance - The class component instance
|
|
16
|
+
* @param parentInstance - The parent component instance (optional)
|
|
17
|
+
*/
|
|
18
|
+
export declare function setupClassComponentVNode(vnode: ClassComponentVNode, instance: unknown, parentInstance?: unknown): void;
|
|
19
|
+
//# sourceMappingURL=class-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-helpers.d.ts","sourceRoot":"","sources":["../../src/renderer/class-helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAS,MAAM,mBAAmB,CAAC;AAYpE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,OAAO,EACjB,cAAc,CAAC,EAAE,OAAO,GACvB,IAAI,CAuCN"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Class Component Shared Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for creating and updating class components
|
|
5
|
+
*/
|
|
6
|
+
import { extractSlots } from '../component-class/slot.js';
|
|
7
|
+
/**
|
|
8
|
+
* Setup ClassComponentVNode with instance, slots, refs, and parent references
|
|
9
|
+
*
|
|
10
|
+
* This function handles the common logic for both creating and updating class components:
|
|
11
|
+
* 1. Saves instance to vnode
|
|
12
|
+
* 2. Extracts and sets slots from children
|
|
13
|
+
* 3. Registers instance to parent's refs (if fukict:ref is specified)
|
|
14
|
+
* 4. Updates wrapper VNode reference
|
|
15
|
+
* 5. Updates parent instance reference on wrapper VNode
|
|
16
|
+
*
|
|
17
|
+
* Used by both renderClassComponent (create) and diffClassComponent (update).
|
|
18
|
+
*
|
|
19
|
+
* @param vnode - The ClassComponentVNode to setup
|
|
20
|
+
* @param instance - The class component instance
|
|
21
|
+
* @param parentInstance - The parent component instance (optional)
|
|
22
|
+
*/
|
|
23
|
+
export function setupClassComponentVNode(vnode, instance, parentInstance) {
|
|
24
|
+
const instanceInternal = instance;
|
|
25
|
+
// 1. Save instance to vnode
|
|
26
|
+
vnode.__instance__ = instance;
|
|
27
|
+
// 2. Extract and set slots from children
|
|
28
|
+
if (vnode.children) {
|
|
29
|
+
instanceInternal.slots = extractSlots(vnode.children);
|
|
30
|
+
}
|
|
31
|
+
// 3. Handle fukict:ref for class components
|
|
32
|
+
// If parent is a class component and this component has fukict:ref,
|
|
33
|
+
// register this instance to parent's refs
|
|
34
|
+
if (parentInstance && vnode.props && vnode.props['fukict:ref']) {
|
|
35
|
+
const refName = vnode.props['fukict:ref'];
|
|
36
|
+
if (typeof refName === 'string') {
|
|
37
|
+
const parentInternal = parentInstance;
|
|
38
|
+
// Create or update ref in parent component
|
|
39
|
+
if (!parentInternal.refs.has(refName)) {
|
|
40
|
+
parentInternal.refs.set(refName, { current: null });
|
|
41
|
+
}
|
|
42
|
+
const ref = parentInternal.refs.get(refName);
|
|
43
|
+
if (ref) {
|
|
44
|
+
ref.current = instance;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 4. Update wrapper VNode reference
|
|
49
|
+
instanceInternal.__wrapper__ = vnode;
|
|
50
|
+
// 5. Update parent instance reference on wrapper VNode (for context chain)
|
|
51
|
+
if (parentInstance) {
|
|
52
|
+
vnode.__parentInstance__ = parentInstance;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=class-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-helpers.js","sourceRoot":"","sources":["../../src/renderer/class-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAc1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAA0B,EAC1B,QAAiB,EACjB,cAAwB;IAExB,MAAM,gBAAgB,GAAG,QAAqC,CAAC;IAE/D,4BAA4B;IAC5B,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;IAE9B,yCAAyC;IACzC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,gBAAgB,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,4CAA4C;IAC5C,uEAAuE;IACvE,6CAA6C;IAC7C,IAAI,cAAc,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAY,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,cAA2C,CAAC;YAEnE,2CAA2C;YAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,gBAAgB,CAAC,WAAW,GAAG,KAAK,CAAC;IAErC,2EAA2E;IAC3E,IAAI,cAAc,EAAE,CAAC;QAEjB,KACD,CAAC,kBAAkB,GAAG,cAAc,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAGtD,OAAO,KAAK,EAKV,KAAK,EACL,UAAU,EACX,MAAM,mBAAmB,CAAC;AAU3B;;;;;;;;;;;;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"}
|
package/dist/renderer/create.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { extractSlots } from '../component-class/slot.js';
|
|
2
1
|
import * as dom from '../dom/index.js';
|
|
3
2
|
import { VNodeType } from '../types/index.js';
|
|
4
3
|
import { setAttributes } from './attributes.js';
|
|
4
|
+
import { setupClassComponentVNode } from './class-helpers.js';
|
|
5
|
+
import { setupElementVNode, setupFragmentVNode, setupFunctionComponentVNode, } from './vnode-helpers.js';
|
|
5
6
|
/**
|
|
6
7
|
* Create real DOM node(s) from VNode
|
|
7
8
|
*
|
|
@@ -78,7 +79,8 @@ function renderElement(vnode, componentInstance) {
|
|
|
78
79
|
if (vnode.__type__ !== VNodeType.Element) {
|
|
79
80
|
throw new Error('Expected ElementVNode');
|
|
80
81
|
}
|
|
81
|
-
const
|
|
82
|
+
const elementVNode = vnode;
|
|
83
|
+
const { type, props, children } = elementVNode;
|
|
82
84
|
const element = dom.createElement(type);
|
|
83
85
|
// Set attributes and events
|
|
84
86
|
if (props) {
|
|
@@ -102,8 +104,8 @@ function renderElement(vnode, componentInstance) {
|
|
|
102
104
|
else {
|
|
103
105
|
console.warn('Element vnode children is not an array:', vnode);
|
|
104
106
|
}
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
+
// Setup ElementVNode: save DOM reference
|
|
108
|
+
setupElementVNode(elementVNode, element);
|
|
107
109
|
return element;
|
|
108
110
|
}
|
|
109
111
|
/**
|
|
@@ -115,7 +117,8 @@ function renderFragment(vnode, componentInstance) {
|
|
|
115
117
|
if (vnode.__type__ !== VNodeType.Fragment) {
|
|
116
118
|
throw new Error('Expected FragmentVNode');
|
|
117
119
|
}
|
|
118
|
-
const
|
|
120
|
+
const fragmentVNode = vnode;
|
|
121
|
+
const { children } = fragmentVNode;
|
|
119
122
|
const nodes = [];
|
|
120
123
|
if (Array.isArray(children)) {
|
|
121
124
|
for (const child of children) {
|
|
@@ -134,8 +137,8 @@ function renderFragment(vnode, componentInstance) {
|
|
|
134
137
|
else {
|
|
135
138
|
console.warn('Element vnode children is not an array:', vnode);
|
|
136
139
|
}
|
|
137
|
-
//
|
|
138
|
-
|
|
140
|
+
// Setup FragmentVNode: save DOM nodes array reference
|
|
141
|
+
setupFragmentVNode(fragmentVNode, nodes);
|
|
139
142
|
return nodes;
|
|
140
143
|
}
|
|
141
144
|
/**
|
|
@@ -159,15 +162,14 @@ function renderFunctionComponent(vnode, componentInstance) {
|
|
|
159
162
|
const funcComponent = type;
|
|
160
163
|
const rendered = funcComponent(propsWithChildren);
|
|
161
164
|
if (!rendered) {
|
|
162
|
-
|
|
163
|
-
funcVNode
|
|
165
|
+
// Setup FunctionComponentVNode with empty result
|
|
166
|
+
setupFunctionComponentVNode(funcVNode, undefined, null);
|
|
164
167
|
return null;
|
|
165
168
|
}
|
|
166
169
|
// Render result (pass component instance for nested fukict:ref)
|
|
167
170
|
const domNode = createRealNode(rendered, componentInstance);
|
|
168
|
-
//
|
|
169
|
-
funcVNode
|
|
170
|
-
funcVNode.__dom__ = domNode; // 可能是 Node 或 Node[]
|
|
171
|
+
// Setup FunctionComponentVNode: save rendered VNode and DOM reference
|
|
172
|
+
setupFunctionComponentVNode(funcVNode, rendered, domNode);
|
|
171
173
|
return domNode;
|
|
172
174
|
}
|
|
173
175
|
/**
|
|
@@ -181,42 +183,16 @@ function renderClassComponent(vnode, componentInstance) {
|
|
|
181
183
|
}
|
|
182
184
|
// Type assertion after runtime check
|
|
183
185
|
const classVNode = vnode;
|
|
184
|
-
const { type, props
|
|
186
|
+
const { type, props } = classVNode;
|
|
185
187
|
// 1. Create instance (only props)
|
|
186
188
|
// Type assertion is safe here because we know it's a class constructor
|
|
187
189
|
const ComponentClass = type;
|
|
188
190
|
const instance = new ComponentClass(props ?? {});
|
|
189
|
-
// 2.
|
|
190
|
-
|
|
191
|
-
|
|
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
|
|
191
|
+
// 2. Setup ClassComponentVNode: instance, slots, refs, wrapper, parent reference
|
|
192
|
+
setupClassComponentVNode(classVNode, instance, componentInstance);
|
|
193
|
+
// 3. Create comment placeholder with instance ID and name
|
|
218
194
|
const placeholder = dom.createComment(`fukict:${instance.__name__}#${instance.__id__}`);
|
|
219
|
-
//
|
|
195
|
+
// 4. Save placeholder to vnode
|
|
220
196
|
classVNode.__placeholder__ = placeholder;
|
|
221
197
|
return placeholder;
|
|
222
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Diff: Class Component
|
|
3
|
+
*
|
|
4
|
+
* Diff class component VNodes
|
|
5
|
+
*/
|
|
6
|
+
import type { FukictComponent } from '../../types/class.js';
|
|
1
7
|
import type { VNode } from '../../types/index.js';
|
|
2
8
|
/**
|
|
3
9
|
* Diff Class Component VNode
|
|
10
|
+
* - Update slots and refs
|
|
4
11
|
* - Call instance.update(newProps)
|
|
5
12
|
* - Handle detached mode (fukict:detach)
|
|
6
13
|
*/
|
|
7
|
-
export declare function diffClassComponent(oldVNode: VNode, newVNode: VNode, container: Element): void;
|
|
14
|
+
export declare function diffClassComponent(oldVNode: VNode, newVNode: VNode, container: Element, parentInstance?: FukictComponent): void;
|
|
8
15
|
//# sourceMappingURL=class.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAavE;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,EAClB,cAAc,CAAC,EAAE,eAAe,GAC/B,IAAI,CA8CN"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { setupClassComponentVNode } from '../class-helpers.js';
|
|
2
3
|
import { replaceNode } from './helpers.js';
|
|
3
4
|
/**
|
|
4
5
|
* Diff Class Component VNode
|
|
6
|
+
* - Update slots and refs
|
|
5
7
|
* - Call instance.update(newProps)
|
|
6
8
|
* - Handle detached mode (fukict:detach)
|
|
7
9
|
*/
|
|
8
|
-
export function diffClassComponent(oldVNode, newVNode, container) {
|
|
10
|
+
export function diffClassComponent(oldVNode, newVNode, container, parentInstance) {
|
|
9
11
|
if (oldVNode.__type__ !== VNodeType.ClassComponent ||
|
|
10
12
|
newVNode.__type__ !== VNodeType.ClassComponent) {
|
|
11
13
|
throw new Error('Expected ClassComponentVNode');
|
|
@@ -20,18 +22,23 @@ export function diffClassComponent(oldVNode, newVNode, container) {
|
|
|
20
22
|
}
|
|
21
23
|
// Reuse instance
|
|
22
24
|
const instance = oldClassVNode.__instance__;
|
|
23
|
-
|
|
25
|
+
if (!instance) {
|
|
26
|
+
console.warn('[diffClassComponent] Instance is undefined, skipping diff');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Setup ClassComponentVNode: instance, slots, refs, wrapper, parent reference
|
|
30
|
+
setupClassComponentVNode(newClassVNode, instance, parentInstance);
|
|
31
|
+
// Copy placeholder from old vnode
|
|
32
|
+
newClassVNode.__placeholder__ = oldClassVNode.__placeholder__;
|
|
24
33
|
// Check detached mode
|
|
25
34
|
if (newClassVNode.props && newClassVNode.props['fukict:detach']) {
|
|
26
35
|
// Detached mode: only update props, skip update()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
instance.props = newClassVNode.props;
|
|
30
|
-
}
|
|
36
|
+
// Use same pattern as Fukict.update() - cast to bypass readonly
|
|
37
|
+
instance.props = newClassVNode.props;
|
|
31
38
|
return;
|
|
32
39
|
}
|
|
33
40
|
// Normal mode: call instance.update(newProps)
|
|
34
|
-
if (
|
|
41
|
+
if (typeof instance.update === 'function') {
|
|
35
42
|
instance.update(newClassVNode.props ?? {});
|
|
36
43
|
}
|
|
37
44
|
}
|
|
@@ -1 +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;
|
|
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,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAU3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAe,EACf,QAAe,EACf,SAAkB,EAClB,cAAgC;IAEhC,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,YAElB,CAAC;IAEd,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,wBAAwB,CAAC,aAAa,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAElE,kCAAkC;IAClC,aAAa,CAAC,eAAe,GAAG,aAAa,CAAC,eAAe,CAAC;IAE9D,sBAAsB;IACtB,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAChE,kDAAkD;QAClD,gEAAgE;QAC/D,QAAQ,CAAC,KAA6B,GAAG,aAAa,CAAC,KAAK,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1C,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAgB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAOhE;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CAiCN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { setupElementVNode } from '../vnode-helpers.js';
|
|
2
3
|
import { diffChildren } from './children.js';
|
|
3
4
|
import { replaceNode } from './helpers.js';
|
|
4
5
|
import { patchProps } from './props.js';
|
|
@@ -13,22 +14,25 @@ export function diffElement(oldVNode, newVNode, container) {
|
|
|
13
14
|
newVNode.__type__ !== VNodeType.Element) {
|
|
14
15
|
throw new Error('Expected ElementVNode');
|
|
15
16
|
}
|
|
17
|
+
const oldElementVNode = oldVNode;
|
|
18
|
+
const newElementVNode = newVNode;
|
|
16
19
|
// Tag name changed - replace entire element
|
|
17
|
-
if (
|
|
18
|
-
replaceNode(
|
|
20
|
+
if (oldElementVNode.type !== newElementVNode.type) {
|
|
21
|
+
replaceNode(oldElementVNode, newElementVNode, container);
|
|
19
22
|
return;
|
|
20
23
|
}
|
|
21
24
|
// Reuse DOM element
|
|
22
|
-
const element =
|
|
25
|
+
const element = oldElementVNode.__dom__;
|
|
23
26
|
if (!element) {
|
|
24
27
|
// DOM doesn't exist, replace node
|
|
25
|
-
replaceNode(
|
|
28
|
+
replaceNode(oldElementVNode, newElementVNode, container);
|
|
26
29
|
return;
|
|
27
30
|
}
|
|
28
|
-
|
|
31
|
+
// Setup ElementVNode: save DOM reference
|
|
32
|
+
setupElementVNode(newElementVNode, element);
|
|
29
33
|
// Patch props
|
|
30
|
-
patchProps(element,
|
|
34
|
+
patchProps(element, oldElementVNode.props, newElementVNode.props);
|
|
31
35
|
// Diff children
|
|
32
|
-
diffChildren(
|
|
36
|
+
diffChildren(oldElementVNode.children, newElementVNode.children, element);
|
|
33
37
|
}
|
|
34
38
|
//# sourceMappingURL=element.js.map
|
|
@@ -1 +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,
|
|
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,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,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,MAAM,eAAe,GAAG,QAAwB,CAAC;IACjD,MAAM,eAAe,GAAG,QAAwB,CAAC;IAEjD,4CAA4C;IAC5C,IAAI,eAAe,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC;QAClD,WAAW,CAAC,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,eAAe,CAAC,OAAkB,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,kCAAkC;QAClC,WAAW,CAAC,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,iBAAiB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAE5C,cAAc;IACd,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAElE,gBAAgB;IAChB,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAiB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAKjE;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA8BN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { setupFragmentVNode } from '../vnode-helpers.js';
|
|
2
3
|
import { diffChildren } from './children.js';
|
|
3
4
|
/**
|
|
4
5
|
* Diff Fragment VNode
|
|
@@ -10,11 +11,12 @@ export function diffFragment(oldVNode, newVNode, container) {
|
|
|
10
11
|
newVNode.__type__ !== VNodeType.Fragment) {
|
|
11
12
|
throw new Error('Expected FragmentVNode');
|
|
12
13
|
}
|
|
14
|
+
const newFragmentVNode = newVNode;
|
|
13
15
|
// Diff children
|
|
14
|
-
diffChildren(oldVNode.children,
|
|
16
|
+
diffChildren(oldVNode.children, newFragmentVNode.children, container);
|
|
15
17
|
// Update __dom__ reference (collect all current child nodes)
|
|
16
18
|
const newNodes = [];
|
|
17
|
-
for (const child of
|
|
19
|
+
for (const child of newFragmentVNode.children) {
|
|
18
20
|
if (child && typeof child === 'object' && '__dom__' in child) {
|
|
19
21
|
const dom = child.__dom__;
|
|
20
22
|
if (dom) {
|
|
@@ -27,6 +29,7 @@ export function diffFragment(oldVNode, newVNode, container) {
|
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
|
-
|
|
32
|
+
// Setup FragmentVNode: save DOM nodes array reference
|
|
33
|
+
setupFragmentVNode(newFragmentVNode, newNodes);
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=fragment.js.map
|
|
@@ -1 +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,
|
|
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,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,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,MAAM,gBAAgB,GAAG,QAAyB,CAAC;IAEnD,gBAAgB;IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEtE,6DAA6D;IAC7D,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC9C,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;IAED,sDAAsD;IACtD,kBAAkB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -1 +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;
|
|
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;AAM9B;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CAkEN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VNodeType } from '../../types/index.js';
|
|
2
|
+
import { setupFunctionComponentVNode } from '../vnode-helpers.js';
|
|
2
3
|
import { replaceNode, shallowEqual } from './helpers.js';
|
|
3
4
|
import { diff } from './index.js';
|
|
4
5
|
/**
|
|
@@ -23,8 +24,8 @@ export function diffFunctionComponent(oldVNode, newVNode, container) {
|
|
|
23
24
|
// Shallow compare props
|
|
24
25
|
if (shallowEqual(oldFuncVNode.props, newFuncVNode.props)) {
|
|
25
26
|
// Props unchanged - reuse rendered result
|
|
26
|
-
|
|
27
|
-
newFuncVNode.
|
|
27
|
+
// Setup FunctionComponentVNode with reused data
|
|
28
|
+
setupFunctionComponentVNode(newFuncVNode, oldFuncVNode.__rendered__, oldFuncVNode.__dom__ ?? null);
|
|
28
29
|
return;
|
|
29
30
|
}
|
|
30
31
|
// Props changed - re-call function
|
|
@@ -39,20 +40,20 @@ export function diffFunctionComponent(oldVNode, newVNode, container) {
|
|
|
39
40
|
const funcComponent = newFuncVNode.type;
|
|
40
41
|
const rendered = funcComponent(propsWithChildren);
|
|
41
42
|
// Store rendered VNode (only if it's a VNode object)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const renderedVNode = rendered && typeof rendered === 'object' && '__type__' in rendered
|
|
44
|
+
? rendered
|
|
45
|
+
: undefined;
|
|
45
46
|
// Diff old and new rendered result
|
|
46
47
|
const oldRendered = oldFuncVNode.__rendered__;
|
|
47
48
|
diff(oldRendered, rendered, container);
|
|
48
49
|
// Update __dom__ reference (only for non-ClassComponent VNodes)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
newFuncVNode.__dom__ = renderedVNode.__dom__;
|
|
55
|
-
}
|
|
50
|
+
let domNode = null;
|
|
51
|
+
if (renderedVNode &&
|
|
52
|
+
renderedVNode.__type__ !== VNodeType.ClassComponent &&
|
|
53
|
+
'__dom__' in renderedVNode) {
|
|
54
|
+
domNode = renderedVNode.__dom__ ?? null;
|
|
56
55
|
}
|
|
56
|
+
// Setup FunctionComponentVNode: save rendered VNode and DOM reference
|
|
57
|
+
setupFunctionComponentVNode(newFuncVNode, renderedVNode, domNode);
|
|
57
58
|
}
|
|
58
59
|
//# sourceMappingURL=function.js.map
|
|
@@ -1 +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,
|
|
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,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,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,gDAAgD;QAChD,2BAA2B,CACzB,YAAY,EACZ,YAAY,CAAC,YAAY,EACzB,YAAY,CAAC,OAAO,IAAI,IAAI,CAC7B,CAAC;QACF,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,MAAM,aAAa,GACjB,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,UAAU,IAAI,QAAQ;QAChE,CAAC,CAAE,QAAkB;QACrB,CAAC,CAAC,SAAS,CAAC;IAEhB,mCAAmC;IACnC,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC;IAC9C,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEvC,gEAAgE;IAChE,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,IACE,aAAa;QACb,aAAa,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc;QACnD,SAAS,IAAI,aAAa,EAC1B,CAAC;QACD,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,sEAAsE;IACtE,2BAA2B,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - VNode Shared Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for setting up VNode references across create and diff operations
|
|
5
|
+
*/
|
|
6
|
+
import type { ElementVNode, FragmentVNode, FunctionComponentVNode, VNode } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Setup ElementVNode with DOM reference
|
|
9
|
+
*
|
|
10
|
+
* Used by both renderElement (create) and diffElement (update).
|
|
11
|
+
*
|
|
12
|
+
* @param vnode - The ElementVNode to setup
|
|
13
|
+
* @param element - The DOM element
|
|
14
|
+
*/
|
|
15
|
+
export declare function setupElementVNode(vnode: ElementVNode, element: Element): void;
|
|
16
|
+
/**
|
|
17
|
+
* Setup FragmentVNode with DOM nodes array reference
|
|
18
|
+
*
|
|
19
|
+
* Used by both renderFragment (create) and diffFragment (update).
|
|
20
|
+
*
|
|
21
|
+
* @param vnode - The FragmentVNode to setup
|
|
22
|
+
* @param nodes - The array of DOM nodes
|
|
23
|
+
*/
|
|
24
|
+
export declare function setupFragmentVNode(vnode: FragmentVNode, nodes: Node[]): void;
|
|
25
|
+
/**
|
|
26
|
+
* Setup FunctionComponentVNode with rendered VNode and DOM reference
|
|
27
|
+
*
|
|
28
|
+
* Used by both renderFunctionComponent (create) and diffFunctionComponent (update).
|
|
29
|
+
*
|
|
30
|
+
* @param vnode - The FunctionComponentVNode to setup
|
|
31
|
+
* @param rendered - The rendered VNode result (can be undefined)
|
|
32
|
+
* @param domNode - The DOM node or nodes (can be null or Node or Node[])
|
|
33
|
+
*/
|
|
34
|
+
export declare function setupFunctionComponentVNode(vnode: FunctionComponentVNode, rendered: VNode | undefined, domNode: Node | Node[] | null): void;
|
|
35
|
+
//# sourceMappingURL=vnode-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode-helpers.d.ts","sourceRoot":"","sources":["../../src/renderer/vnode-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,KAAK,EACN,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAE7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAE5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,GAC5B,IAAI,CAGN"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup ElementVNode with DOM reference
|
|
3
|
+
*
|
|
4
|
+
* Used by both renderElement (create) and diffElement (update).
|
|
5
|
+
*
|
|
6
|
+
* @param vnode - The ElementVNode to setup
|
|
7
|
+
* @param element - The DOM element
|
|
8
|
+
*/
|
|
9
|
+
export function setupElementVNode(vnode, element) {
|
|
10
|
+
vnode.__dom__ = element;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Setup FragmentVNode with DOM nodes array reference
|
|
14
|
+
*
|
|
15
|
+
* Used by both renderFragment (create) and diffFragment (update).
|
|
16
|
+
*
|
|
17
|
+
* @param vnode - The FragmentVNode to setup
|
|
18
|
+
* @param nodes - The array of DOM nodes
|
|
19
|
+
*/
|
|
20
|
+
export function setupFragmentVNode(vnode, nodes) {
|
|
21
|
+
vnode.__dom__ = nodes;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Setup FunctionComponentVNode with rendered VNode and DOM reference
|
|
25
|
+
*
|
|
26
|
+
* Used by both renderFunctionComponent (create) and diffFunctionComponent (update).
|
|
27
|
+
*
|
|
28
|
+
* @param vnode - The FunctionComponentVNode to setup
|
|
29
|
+
* @param rendered - The rendered VNode result (can be undefined)
|
|
30
|
+
* @param domNode - The DOM node or nodes (can be null or Node or Node[])
|
|
31
|
+
*/
|
|
32
|
+
export function setupFunctionComponentVNode(vnode, rendered, domNode) {
|
|
33
|
+
vnode.__rendered__ = rendered;
|
|
34
|
+
vnode.__dom__ = domNode;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=vnode-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode-helpers.js","sourceRoot":"","sources":["../../src/renderer/vnode-helpers.ts"],"names":[],"mappings":"AAYA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,OAAgB;IACrE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB,EAAE,KAAa;IACpE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAA6B,EAC7B,QAA2B,EAC3B,OAA6B;IAE7B,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC;IAC9B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B,CAAC"}
|