@bromscandium/runtime 1.0.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/README.md +91 -0
- package/dist/hooks.d.ts +99 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +145 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.d.ts +77 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +90 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/lifecycle.d.ts +87 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +116 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/renderer.d.ts +65 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +539 -0
- package/dist/renderer.js.map +1 -0
- package/dist/vnode.d.ts +111 -0
- package/dist/vnode.d.ts.map +1 -0
- package/dist/vnode.js +83 -0
- package/dist/vnode.js.map +1 -0
- package/package.json +49 -0
- package/src/env.d.ts +11 -0
- package/src/hooks.ts +166 -0
- package/src/index.ts +56 -0
- package/src/jsx-runtime.ts +132 -0
- package/src/jsx.d.ts +373 -0
- package/src/lifecycle.ts +133 -0
- package/src/renderer.ts +655 -0
- package/src/vnode.ts +159 -0
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Renderer with virtual DOM reconciliation and diffing.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { Fragment, Text } from './vnode.js';
|
|
6
|
+
import { effect, cleanup } from '@bromscandium/core';
|
|
7
|
+
import { setCurrentInstance, invokeLifecycleHooks } from './lifecycle.js';
|
|
8
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
9
|
+
const SVG_TAGS = new Set([
|
|
10
|
+
'svg', 'path', 'circle', 'ellipse', 'line', 'polygon', 'polyline', 'rect',
|
|
11
|
+
'g', 'defs', 'symbol', 'use', 'image', 'text', 'tspan', 'textPath',
|
|
12
|
+
'clipPath', 'mask', 'pattern', 'marker', 'linearGradient', 'radialGradient',
|
|
13
|
+
'stop', 'filter', 'feBlend', 'feColorMatrix', 'feComponentTransfer',
|
|
14
|
+
'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',
|
|
15
|
+
'feFlood', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode',
|
|
16
|
+
'feMorphology', 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence',
|
|
17
|
+
'foreignObject', 'animate', 'animateMotion', 'animateTransform', 'set'
|
|
18
|
+
]);
|
|
19
|
+
function camelToKebab(str) {
|
|
20
|
+
return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
const componentMap = new WeakMap();
|
|
23
|
+
/**
|
|
24
|
+
* Renders a virtual DOM tree into a container element.
|
|
25
|
+
* Handles mounting, updating, and unmounting based on the previous state.
|
|
26
|
+
*
|
|
27
|
+
* @param vnode - The virtual node to render, or null to unmount
|
|
28
|
+
* @param container - The DOM element to render into
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const vnode = h('div', { className: 'app' }, 'Hello');
|
|
33
|
+
* render(vnode, document.getElementById('root')!);
|
|
34
|
+
*
|
|
35
|
+
* // Update
|
|
36
|
+
* render(h('div', { className: 'app' }, 'Updated'), container);
|
|
37
|
+
*
|
|
38
|
+
* // Unmount
|
|
39
|
+
* render(null, container);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function render(vnode, container) {
|
|
43
|
+
const oldVNode = container._vnode;
|
|
44
|
+
if (vnode == null) {
|
|
45
|
+
if (oldVNode) {
|
|
46
|
+
unmount(oldVNode);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (oldVNode) {
|
|
50
|
+
patch(oldVNode, vnode, container, null);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
mount(vnode, container, null);
|
|
54
|
+
}
|
|
55
|
+
container._vnode = vnode;
|
|
56
|
+
}
|
|
57
|
+
function mount(vnode, container, anchor, isSVG = false) {
|
|
58
|
+
const { type } = vnode;
|
|
59
|
+
if (type === Fragment) {
|
|
60
|
+
mountFragment(vnode, container, anchor, isSVG);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (type === Text) {
|
|
64
|
+
mountText(vnode, container, anchor);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (typeof type === 'function') {
|
|
68
|
+
mountComponent(vnode, container, anchor, isSVG);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
mountElement(vnode, container, anchor, isSVG);
|
|
72
|
+
}
|
|
73
|
+
function mountElement(vnode, container, anchor, isSVG = false) {
|
|
74
|
+
const { type, props, children } = vnode;
|
|
75
|
+
const tagName = type;
|
|
76
|
+
const isCurrentSVG = isSVG || SVG_TAGS.has(tagName);
|
|
77
|
+
const el = isCurrentSVG
|
|
78
|
+
? document.createElementNS(SVG_NS, tagName)
|
|
79
|
+
: document.createElement(tagName);
|
|
80
|
+
vnode.el = el;
|
|
81
|
+
for (const [key, value] of Object.entries(props)) {
|
|
82
|
+
if (key === 'key' || key === 'ref')
|
|
83
|
+
continue;
|
|
84
|
+
setProp(el, key, value, null, isCurrentSVG);
|
|
85
|
+
}
|
|
86
|
+
children.forEach(child => {
|
|
87
|
+
if (child == null)
|
|
88
|
+
return;
|
|
89
|
+
if (typeof child === 'object') {
|
|
90
|
+
mount(child, el, null, isCurrentSVG);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
el.appendChild(document.createTextNode(String(child)));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
container.insertBefore(el, anchor);
|
|
97
|
+
}
|
|
98
|
+
function mountText(vnode, container, anchor) {
|
|
99
|
+
const textContent = vnode.children[0];
|
|
100
|
+
const el = document.createTextNode(textContent);
|
|
101
|
+
vnode.el = el;
|
|
102
|
+
container.insertBefore(el, anchor);
|
|
103
|
+
}
|
|
104
|
+
function mountFragment(vnode, container, anchor, isSVG = false) {
|
|
105
|
+
const fragmentAnchor = document.createComment('');
|
|
106
|
+
container.insertBefore(fragmentAnchor, anchor);
|
|
107
|
+
vnode.anchor = fragmentAnchor;
|
|
108
|
+
vnode.children.forEach(child => {
|
|
109
|
+
if (child == null)
|
|
110
|
+
return;
|
|
111
|
+
if (typeof child === 'object') {
|
|
112
|
+
mount(child, container, fragmentAnchor, isSVG);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const textNode = document.createTextNode(String(child));
|
|
116
|
+
container.insertBefore(textNode, fragmentAnchor);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function mountComponent(vnode, container, anchor, isSVG = false) {
|
|
121
|
+
const component = vnode.type;
|
|
122
|
+
const propsWithChildren = {
|
|
123
|
+
...vnode.props,
|
|
124
|
+
children: vnode.children.length > 0 ? vnode.children : undefined,
|
|
125
|
+
};
|
|
126
|
+
const instance = {
|
|
127
|
+
vnode,
|
|
128
|
+
props: propsWithChildren,
|
|
129
|
+
subTree: null,
|
|
130
|
+
isMounted: false,
|
|
131
|
+
update: null,
|
|
132
|
+
mounted: [],
|
|
133
|
+
unmounted: [],
|
|
134
|
+
updated: [],
|
|
135
|
+
hooks: [],
|
|
136
|
+
hookIndex: 0,
|
|
137
|
+
};
|
|
138
|
+
vnode.component = instance;
|
|
139
|
+
componentMap.set(vnode, instance);
|
|
140
|
+
const updateFn = () => {
|
|
141
|
+
setCurrentInstance(instance);
|
|
142
|
+
instance.hookIndex = 0;
|
|
143
|
+
try {
|
|
144
|
+
const subTree = component(instance.props);
|
|
145
|
+
if (!instance.isMounted) {
|
|
146
|
+
if (subTree) {
|
|
147
|
+
mount(subTree, container, anchor, isSVG);
|
|
148
|
+
instance.subTree = subTree;
|
|
149
|
+
}
|
|
150
|
+
instance.isMounted = true;
|
|
151
|
+
queueMicrotask(() => {
|
|
152
|
+
invokeLifecycleHooks(instance.mounted, 'onMounted');
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
if (instance.subTree && subTree) {
|
|
157
|
+
patch(instance.subTree, subTree, container, anchor, isSVG);
|
|
158
|
+
}
|
|
159
|
+
else if (subTree) {
|
|
160
|
+
mount(subTree, container, anchor, isSVG);
|
|
161
|
+
}
|
|
162
|
+
else if (instance.subTree) {
|
|
163
|
+
unmount(instance.subTree);
|
|
164
|
+
}
|
|
165
|
+
instance.subTree = subTree;
|
|
166
|
+
queueMicrotask(() => {
|
|
167
|
+
invokeLifecycleHooks(instance.updated, 'onUpdated');
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
setCurrentInstance(null);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
instance.update = effect(updateFn);
|
|
176
|
+
}
|
|
177
|
+
function patch(oldVNode, newVNode, container, anchor, isSVG = false) {
|
|
178
|
+
if (oldVNode.type !== newVNode.type) {
|
|
179
|
+
unmount(oldVNode);
|
|
180
|
+
mount(newVNode, container, anchor, isSVG);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
newVNode.el = oldVNode.el;
|
|
184
|
+
if (newVNode.type === Text) {
|
|
185
|
+
patchText(oldVNode, newVNode);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (newVNode.type === Fragment) {
|
|
189
|
+
patchFragment(oldVNode, newVNode, container, isSVG);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (typeof newVNode.type === 'function') {
|
|
193
|
+
patchComponent(oldVNode, newVNode, isSVG);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const tagName = newVNode.type;
|
|
197
|
+
const isCurrentSVG = isSVG || SVG_TAGS.has(tagName);
|
|
198
|
+
patchElement(oldVNode, newVNode, isCurrentSVG);
|
|
199
|
+
}
|
|
200
|
+
function patchElement(oldVNode, newVNode, isSVG = false) {
|
|
201
|
+
const el = (newVNode.el = oldVNode.el);
|
|
202
|
+
const oldProps = oldVNode.props;
|
|
203
|
+
const newProps = newVNode.props;
|
|
204
|
+
for (const key of Object.keys(newProps)) {
|
|
205
|
+
if (key === 'key' || key === 'ref')
|
|
206
|
+
continue;
|
|
207
|
+
if (oldProps[key] !== newProps[key]) {
|
|
208
|
+
setProp(el, key, newProps[key], oldProps[key], isSVG);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
for (const key of Object.keys(oldProps)) {
|
|
212
|
+
if (!(key in newProps)) {
|
|
213
|
+
setProp(el, key, null, oldProps[key], isSVG);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
patchChildren(oldVNode, newVNode, el, isSVG);
|
|
217
|
+
}
|
|
218
|
+
function patchText(oldVNode, newVNode) {
|
|
219
|
+
const el = (newVNode.el = oldVNode.el);
|
|
220
|
+
const oldText = oldVNode.children[0];
|
|
221
|
+
const newText = newVNode.children[0];
|
|
222
|
+
if (oldText !== newText) {
|
|
223
|
+
el.textContent = newText;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function patchFragment(oldVNode, newVNode, container, isSVG = false) {
|
|
227
|
+
newVNode.anchor = oldVNode.anchor;
|
|
228
|
+
patchChildren(oldVNode, newVNode, container, isSVG);
|
|
229
|
+
}
|
|
230
|
+
function patchComponent(oldVNode, newVNode, _isSVG = false) {
|
|
231
|
+
const instance = oldVNode.component;
|
|
232
|
+
newVNode.component = instance;
|
|
233
|
+
instance.vnode = newVNode;
|
|
234
|
+
const oldPropsWithChildren = {
|
|
235
|
+
...oldVNode.props,
|
|
236
|
+
children: oldVNode.children.length > 0 ? oldVNode.children : undefined,
|
|
237
|
+
};
|
|
238
|
+
const newPropsWithChildren = {
|
|
239
|
+
...newVNode.props,
|
|
240
|
+
children: newVNode.children.length > 0 ? newVNode.children : undefined,
|
|
241
|
+
};
|
|
242
|
+
let hasChanged = false;
|
|
243
|
+
for (const key of Object.keys(newPropsWithChildren)) {
|
|
244
|
+
if (oldPropsWithChildren[key] !== newPropsWithChildren[key]) {
|
|
245
|
+
hasChanged = true;
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (!hasChanged) {
|
|
250
|
+
for (const key of Object.keys(oldPropsWithChildren)) {
|
|
251
|
+
if (!(key in newPropsWithChildren)) {
|
|
252
|
+
hasChanged = true;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (hasChanged) {
|
|
258
|
+
instance.props = newPropsWithChildren;
|
|
259
|
+
instance.update?.();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function patchChildren(oldVNode, newVNode, container, isSVG = false) {
|
|
263
|
+
const oldChildren = oldVNode.children;
|
|
264
|
+
const newChildren = newVNode.children;
|
|
265
|
+
const anchor = newVNode.anchor || null;
|
|
266
|
+
if (oldChildren.length === 1 && newChildren.length === 1 &&
|
|
267
|
+
typeof oldChildren[0] !== 'object' && typeof newChildren[0] !== 'object') {
|
|
268
|
+
const oldText = String(oldChildren[0] ?? '');
|
|
269
|
+
const newText = String(newChildren[0] ?? '');
|
|
270
|
+
if (oldText !== newText) {
|
|
271
|
+
const textNode = Array.from(container.childNodes).find(n => n.nodeType === Node.TEXT_NODE);
|
|
272
|
+
if (textNode) {
|
|
273
|
+
textNode.textContent = newText;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const hasOnlyVNodeChildren = oldChildren.every(c => c == null || typeof c === 'object') &&
|
|
279
|
+
newChildren.every(c => c == null || typeof c === 'object');
|
|
280
|
+
if (!hasOnlyVNodeChildren) {
|
|
281
|
+
oldChildren.forEach((child) => {
|
|
282
|
+
if (child && typeof child === 'object') {
|
|
283
|
+
unmount(child);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
while (container.firstChild && container.firstChild !== anchor) {
|
|
287
|
+
container.removeChild(container.firstChild);
|
|
288
|
+
}
|
|
289
|
+
newChildren.forEach((child) => {
|
|
290
|
+
if (child == null)
|
|
291
|
+
return;
|
|
292
|
+
if (typeof child === 'object') {
|
|
293
|
+
mount(child, container, anchor, isSVG);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
const textNode = document.createTextNode(String(child));
|
|
297
|
+
container.insertBefore(textNode, anchor);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const oldKeyed = new Map();
|
|
303
|
+
const oldUnkeyed = [];
|
|
304
|
+
oldChildren.forEach((child) => {
|
|
305
|
+
if (child && typeof child === 'object') {
|
|
306
|
+
const vnode = child;
|
|
307
|
+
if (vnode.key != null) {
|
|
308
|
+
oldKeyed.set(vnode.key, vnode);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
oldUnkeyed.push(vnode);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
let unkeyedIndex = 0;
|
|
316
|
+
newChildren.forEach((child) => {
|
|
317
|
+
if (child == null)
|
|
318
|
+
return;
|
|
319
|
+
if (typeof child === 'object') {
|
|
320
|
+
const newChild = child;
|
|
321
|
+
let oldChild;
|
|
322
|
+
if (newChild.key != null) {
|
|
323
|
+
oldChild = oldKeyed.get(newChild.key);
|
|
324
|
+
if (oldChild) {
|
|
325
|
+
oldKeyed.delete(newChild.key);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
oldChild = oldUnkeyed[unkeyedIndex++];
|
|
330
|
+
}
|
|
331
|
+
if (oldChild) {
|
|
332
|
+
patch(oldChild, newChild, container, anchor, isSVG);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
mount(newChild, container, anchor, isSVG);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
oldKeyed.forEach(child => unmount(child));
|
|
340
|
+
for (let i = unkeyedIndex; i < oldUnkeyed.length; i++) {
|
|
341
|
+
unmount(oldUnkeyed[i]);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
function setProp(el, key, newValue, oldValue, isSVG = false) {
|
|
345
|
+
if (key.startsWith('on')) {
|
|
346
|
+
const event = key.slice(2).toLowerCase();
|
|
347
|
+
if (oldValue) {
|
|
348
|
+
el.removeEventListener(event, oldValue);
|
|
349
|
+
}
|
|
350
|
+
if (newValue) {
|
|
351
|
+
el.addEventListener(event, newValue);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else if (key === 'className') {
|
|
355
|
+
if (isSVG) {
|
|
356
|
+
if (newValue) {
|
|
357
|
+
el.setAttribute('class', newValue);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
el.removeAttribute('class');
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
if (newValue) {
|
|
365
|
+
el.setAttribute('class', newValue);
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
el.removeAttribute('class');
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else if (key === 'style') {
|
|
373
|
+
if (typeof newValue === 'object' && newValue !== null) {
|
|
374
|
+
const style = el.style;
|
|
375
|
+
if (typeof oldValue === 'object' && oldValue !== null) {
|
|
376
|
+
for (const prop of Object.keys(oldValue)) {
|
|
377
|
+
if (!(prop in newValue)) {
|
|
378
|
+
style.setProperty(prop, '');
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
for (const [prop, value] of Object.entries(newValue)) {
|
|
383
|
+
style.setProperty(prop, String(value));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else if (typeof newValue === 'string') {
|
|
387
|
+
el.style.cssText = newValue;
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
el.removeAttribute('style');
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
else if (key === 'dangerouslySetInnerHTML') {
|
|
394
|
+
if (newValue?.__html != null) {
|
|
395
|
+
el.innerHTML = newValue.__html;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else if (!isSVG && key === 'value' && (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) {
|
|
399
|
+
const newVal = newValue ?? '';
|
|
400
|
+
if (el.value !== newVal) {
|
|
401
|
+
el.value = newVal;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
else if (!isSVG && key === 'checked' && el instanceof HTMLInputElement) {
|
|
405
|
+
el.checked = !!newValue;
|
|
406
|
+
}
|
|
407
|
+
else if (key === 'disabled') {
|
|
408
|
+
if (newValue) {
|
|
409
|
+
el.setAttribute('disabled', '');
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
el.removeAttribute('disabled');
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
else if (newValue == null || newValue === false) {
|
|
416
|
+
const attrName = isSVG ? camelToKebab(key) : key;
|
|
417
|
+
el.removeAttribute(attrName);
|
|
418
|
+
}
|
|
419
|
+
else if (newValue === true) {
|
|
420
|
+
const attrName = isSVG ? camelToKebab(key) : key;
|
|
421
|
+
el.setAttribute(attrName, '');
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
const attrName = isSVG ? camelToKebab(key) : key;
|
|
425
|
+
el.setAttribute(attrName, String(newValue));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function unmount(vnode) {
|
|
429
|
+
const { type, el, component, children, anchor } = vnode;
|
|
430
|
+
if (typeof type === 'function' && component) {
|
|
431
|
+
invokeLifecycleHooks(component.unmounted, 'onUnmounted');
|
|
432
|
+
if (component.subTree) {
|
|
433
|
+
unmount(component.subTree);
|
|
434
|
+
}
|
|
435
|
+
if (component.update) {
|
|
436
|
+
cleanup(component.update);
|
|
437
|
+
}
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
if (type === Fragment) {
|
|
441
|
+
children.forEach(child => {
|
|
442
|
+
if (child && typeof child === 'object') {
|
|
443
|
+
unmount(child);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
anchor?.parentNode?.removeChild(anchor);
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
children.forEach(child => {
|
|
450
|
+
if (child && typeof child === 'object') {
|
|
451
|
+
unmount(child);
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
if (el?.parentNode) {
|
|
455
|
+
el.parentNode.removeChild(el);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
function setupFavicon(faviconPath) {
|
|
459
|
+
let baseUrl = import.meta.env?.BASE_URL || '/';
|
|
460
|
+
if (faviconPath.startsWith('/') || faviconPath.startsWith('http')) {
|
|
461
|
+
baseUrl = '';
|
|
462
|
+
}
|
|
463
|
+
const fullPath = baseUrl + faviconPath;
|
|
464
|
+
let favicon = document.querySelector("link[rel='icon']");
|
|
465
|
+
if (!favicon) {
|
|
466
|
+
favicon = document.createElement('link');
|
|
467
|
+
favicon.rel = 'icon';
|
|
468
|
+
document.head.appendChild(favicon);
|
|
469
|
+
}
|
|
470
|
+
favicon.href = fullPath;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Creates a new Bromium application instance.
|
|
474
|
+
*
|
|
475
|
+
* @param rootComponent - The root component function to render
|
|
476
|
+
* @param config - Optional application configuration
|
|
477
|
+
* @returns An app instance with mount and unmount methods
|
|
478
|
+
*
|
|
479
|
+
* @example
|
|
480
|
+
* ```ts
|
|
481
|
+
* function App() {
|
|
482
|
+
* return <div>Hello, Bromium!</div>;
|
|
483
|
+
* }
|
|
484
|
+
*
|
|
485
|
+
* const app = createApp(App, { favicon: '/icon.png' });
|
|
486
|
+
* app.mount('#app');
|
|
487
|
+
*
|
|
488
|
+
* // Later: app.unmount();
|
|
489
|
+
* ```
|
|
490
|
+
*/
|
|
491
|
+
export function createApp(rootComponent, config) {
|
|
492
|
+
let isMounted = false;
|
|
493
|
+
let rootVNode = null;
|
|
494
|
+
let container = null;
|
|
495
|
+
if (config?.favicon) {
|
|
496
|
+
setupFavicon(config.favicon);
|
|
497
|
+
}
|
|
498
|
+
const app = {
|
|
499
|
+
/**
|
|
500
|
+
* Mounts the application to a DOM element.
|
|
501
|
+
*
|
|
502
|
+
* @param selector - A CSS selector string or DOM Element to mount to
|
|
503
|
+
* @returns The app instance for chaining
|
|
504
|
+
*/
|
|
505
|
+
mount(selector) {
|
|
506
|
+
container =
|
|
507
|
+
typeof selector === 'string'
|
|
508
|
+
? document.querySelector(selector)
|
|
509
|
+
: selector;
|
|
510
|
+
if (!container) {
|
|
511
|
+
throw new Error(`Mount target "${selector}" not found`);
|
|
512
|
+
}
|
|
513
|
+
if (!isMounted) {
|
|
514
|
+
rootVNode = {
|
|
515
|
+
type: rootComponent,
|
|
516
|
+
props: {},
|
|
517
|
+
children: [],
|
|
518
|
+
key: null,
|
|
519
|
+
el: null,
|
|
520
|
+
};
|
|
521
|
+
render(rootVNode, container);
|
|
522
|
+
isMounted = true;
|
|
523
|
+
}
|
|
524
|
+
return app;
|
|
525
|
+
},
|
|
526
|
+
/**
|
|
527
|
+
* Unmounts the application and cleans up resources.
|
|
528
|
+
*/
|
|
529
|
+
unmount() {
|
|
530
|
+
if (isMounted && container) {
|
|
531
|
+
render(null, container);
|
|
532
|
+
isMounted = false;
|
|
533
|
+
rootVNode = null;
|
|
534
|
+
}
|
|
535
|
+
},
|
|
536
|
+
};
|
|
537
|
+
return app;
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAS,QAAQ,EAAE,IAAI,EAAwC,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAY,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAE5C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM;IACzE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IAClE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB;IAC3E,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB;IACnE,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB;IAC3E,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa;IAChE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,cAAc;IAC1E,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK;CACvE,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,OAAO,EAA4B,CAAC;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,MAAM,CAAC,KAAmB,EAAE,SAAkB;IAC5D,MAAM,QAAQ,GAAI,SAAiB,CAAC,MAAsB,CAAC;IAE3D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAEA,SAAiB,CAAC,MAAM,GAAG,KAAK,CAAC;AACpC,CAAC;AAED,SAAS,KAAK,CACZ,KAAY,EACZ,SAAkB,EAClB,MAAmB,EACnB,QAAiB,KAAK;IAEtB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CACnB,KAAY,EACZ,SAAkB,EAClB,MAAmB,EACnB,QAAiB,KAAK;IAEtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACxC,MAAM,OAAO,GAAG,IAAc,CAAC;IAE/B,MAAM,YAAY,GAAG,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,EAAE,GAAG,YAAY;QACrB,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;QAC3C,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;YAAE,SAAS;QAC7C,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;QAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAc,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAChB,KAAY,EACZ,SAAkB,EAClB,MAAmB;IAEnB,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAW,CAAC;IAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,SAAS,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CACpB,KAAY,EACZ,SAAkB,EAClB,MAAmB,EACnB,QAAiB,KAAK;IAEtB,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClD,SAAS,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC/C,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;IAE9B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;QAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,CAAC,KAAc,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,KAAY,EACZ,SAAkB,EAClB,MAAmB,EACnB,QAAiB,KAAK;IAEtB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAyB,CAAC;IAElD,MAAM,iBAAiB,GAAG;QACxB,GAAG,KAAK,CAAC,KAAK;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACjE,CAAC;IAEF,MAAM,QAAQ,GAAsB;QAClC,KAAK;QACL,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,OAAO,EAAE,CAAC;oBACZ,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBACzC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC7B,CAAC;gBACD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;gBAE1B,cAAc,CAAC,GAAG,EAAE;oBAClB,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,QAAQ,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;oBAChC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC7D,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACnB,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;qBAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;oBAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;gBACD,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;gBAE3B,cAAc,CAAC,GAAG,EAAE;oBAClB,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAA0B,CAAC;AAC9D,CAAC;AAED,SAAS,KAAK,CACZ,QAAe,EACf,QAAe,EACf,SAAkB,EAClB,MAAmB,EACnB,QAAiB,KAAK;IAEtB,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClB,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;IAE1B,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACxC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAc,CAAC;IACxC,MAAM,YAAY,GAAG,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,QAAe,EAAE,QAAe,EAAE,QAAiB,KAAK;IAC5E,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAY,CAAC;IAElD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;YAAE,SAAS;QAC7C,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,QAAe,EAAE,QAAe;IACjD,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAS,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAW,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAW,CAAC;IAE/C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,QAAe,EACf,QAAe,EACf,SAAkB,EAClB,QAAiB,KAAK;IAEtB,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAClC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,cAAc,CAAC,QAAe,EAAE,QAAe,EAAE,SAAkB,KAAK;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAU,CAAC;IACrC,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;IAE1B,MAAM,oBAAoB,GAAwB;QAChD,GAAG,QAAQ,CAAC,KAAK;QACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACvE,CAAC;IACF,MAAM,oBAAoB,GAAwB;QAChD,GAAG,QAAQ,CAAC,KAAK;QACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACvE,CAAC;IAEF,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACpD,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,CAAC,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC;gBACnC,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,GAAG,oBAAoB,CAAC;QACtC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,QAAe,EACf,QAAe,EACf,SAAkB,EAClB,QAAiB,KAAK;IAEtB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;IAEvC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QACpD,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CACnC,CAAC;YACF,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;QACzD,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEzF,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO,CAAC,KAAc,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC/D,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO;YAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,CAAC,KAAc,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,MAAM,UAAU,GAAY,EAAE,CAAC;IAE/B,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,KAAc,CAAC;YAC7B,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACtB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;QAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,KAAc,CAAC;YAChC,IAAI,QAA2B,CAAC;YAEhC,IAAI,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAE1C,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CACd,EAAW,EACX,GAAW,EACX,QAAa,EACb,QAAa,EACb,QAAiB,KAAK;IAEtB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAEzC,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,QAAQ,EAAE,CAAC;gBACb,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,EAAE,CAAC;gBACb,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,KAAK,GAAI,EAAkB,CAAC,KAAK,CAAC;YACxC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,CAAC;wBACxB,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,EAAkB,CAAC,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,yBAAyB,EAAE,CAAC;QAC7C,IAAI,QAAQ,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;QACjC,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,YAAY,gBAAgB,IAAI,EAAE,YAAY,mBAAmB,CAAC,EAAE,CAAC;QAC9G,MAAM,MAAM,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACxB,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,YAAY,gBAAgB,EAAE,CAAC;QACzE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC1B,CAAC;SAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACjD,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAY;IAC3B,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAExD,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,SAAS,EAAE,CAAC;QAC5C,oBAAoB,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAEzD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,SAAS,CAAC,MAA6B,CAAC,CAAC;QACnD,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO,CAAC,KAAc,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACvB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,KAAc,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC;QACnB,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAUD,SAAS,YAAY,CAAC,WAAmB;IACvC,IAAI,OAAO,GAAI,MAAM,CAAC,IAAY,CAAC,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC;IAExD,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;IAEvC,IAAI,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAoB,CAAC;IAE5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,SAAS,CAAC,aAAgC,EAAE,MAAkB;IAC5E,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,IAAI,SAAS,GAAmB,IAAI,CAAC;IAErC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,GAAG,GAAG;QACV;;;;;WAKG;QACH,KAAK,CAAC,QAA0B;YAC9B,SAAS;gBACP,OAAO,QAAQ,KAAK,QAAQ;oBAC1B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAClC,CAAC,CAAC,QAAQ,CAAC;YAEf,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,aAAa,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,GAAG;oBACV,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAE;oBACZ,GAAG,EAAE,IAAI;oBACT,EAAE,EAAE,IAAI;iBACT,CAAC;gBAEF,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC7B,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAED;;WAEG;QACH,OAAO;YACL,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,KAAK,CAAC;gBAClB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/vnode.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual DOM node types and utilities.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
/** Symbol used to identify Fragment nodes (multiple children without a wrapper) */
|
|
6
|
+
export declare const Fragment: unique symbol;
|
|
7
|
+
/** Symbol used to identify Text nodes */
|
|
8
|
+
export declare const Text: unique symbol;
|
|
9
|
+
/** The type of a virtual node - can be a tag name, component function, or special symbol */
|
|
10
|
+
export type VNodeType = string | ComponentFunction | typeof Fragment | typeof Text;
|
|
11
|
+
/**
|
|
12
|
+
* A virtual DOM node representing an element, component, or text.
|
|
13
|
+
*/
|
|
14
|
+
export interface VNode {
|
|
15
|
+
/** The type of node (tag name, component function, Fragment, or Text) */
|
|
16
|
+
type: VNodeType;
|
|
17
|
+
/** Properties/attributes passed to the node */
|
|
18
|
+
props: Record<string, any>;
|
|
19
|
+
/** Child nodes */
|
|
20
|
+
children: VNodeChild[];
|
|
21
|
+
/** Unique key for reconciliation optimization */
|
|
22
|
+
key?: string | number | null;
|
|
23
|
+
/** Reference to the actual DOM node after mounting */
|
|
24
|
+
el?: Node | null;
|
|
25
|
+
/** For component vnodes, the component instance */
|
|
26
|
+
component?: ComponentInstance | null;
|
|
27
|
+
/** For Fragment nodes, the anchor comment node */
|
|
28
|
+
anchor?: Node | null;
|
|
29
|
+
}
|
|
30
|
+
/** A valid child of a virtual node */
|
|
31
|
+
export type VNodeChild = VNode | string | number | boolean | null | undefined;
|
|
32
|
+
/** Children can be a single child or an array */
|
|
33
|
+
export type VNodeChildren = VNodeChild | VNodeChild[];
|
|
34
|
+
/**
|
|
35
|
+
* A component function that receives props and returns a virtual node tree.
|
|
36
|
+
*/
|
|
37
|
+
export interface ComponentFunction {
|
|
38
|
+
(props: Record<string, any>): VNode | null;
|
|
39
|
+
/** Optional display name for debugging */
|
|
40
|
+
displayName?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Internal state for a mounted component instance.
|
|
44
|
+
*/
|
|
45
|
+
export interface ComponentInstance {
|
|
46
|
+
/** The virtual node representing this component */
|
|
47
|
+
vnode: VNode;
|
|
48
|
+
/** Current props passed to the component */
|
|
49
|
+
props: Record<string, any>;
|
|
50
|
+
/** The rendered subtree */
|
|
51
|
+
subTree: VNode | null;
|
|
52
|
+
/** Whether the component has been mounted to the DOM */
|
|
53
|
+
isMounted: boolean;
|
|
54
|
+
/** Function to trigger a re-render */
|
|
55
|
+
update: (() => void) | null;
|
|
56
|
+
/** Callbacks to invoke after mounting */
|
|
57
|
+
mounted: Array<() => void>;
|
|
58
|
+
/** Callbacks to invoke before unmounting */
|
|
59
|
+
unmounted: Array<() => void>;
|
|
60
|
+
/** Callbacks to invoke after updates */
|
|
61
|
+
updated: Array<() => void>;
|
|
62
|
+
/** Hook state storage for React-style hooks */
|
|
63
|
+
hooks: any[];
|
|
64
|
+
/** Current hook index during render */
|
|
65
|
+
hookIndex: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates a virtual DOM node.
|
|
69
|
+
*
|
|
70
|
+
* @param type - The node type (tag name, component, Fragment, or Text)
|
|
71
|
+
* @param props - Properties/attributes for the node
|
|
72
|
+
* @param children - Child nodes
|
|
73
|
+
* @returns A new virtual node
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const vnode = createVNode('div', { className: 'container' }, [
|
|
78
|
+
* createVNode('span', null, ['Hello']),
|
|
79
|
+
* createVNode('span', null, ['World'])
|
|
80
|
+
* ]);
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function createVNode(type: VNodeType, props: Record<string, any> | null, children?: VNodeChildren): VNode;
|
|
84
|
+
/**
|
|
85
|
+
* Normalizes children into a flat array, filtering out invalid values.
|
|
86
|
+
* Handles nested arrays and removes nullish/boolean values from conditional rendering.
|
|
87
|
+
*
|
|
88
|
+
* @param children - The children to normalize
|
|
89
|
+
* @returns A flat array of valid children
|
|
90
|
+
*/
|
|
91
|
+
export declare function normalizeChildren(children: VNodeChildren): VNodeChild[];
|
|
92
|
+
/**
|
|
93
|
+
* Creates a text virtual node.
|
|
94
|
+
*
|
|
95
|
+
* @param text - The text content
|
|
96
|
+
* @returns A virtual node representing text
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const textNode = createTextVNode('Hello, world!');
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function createTextVNode(text: string | number): VNode;
|
|
104
|
+
/**
|
|
105
|
+
* Checks if a value is a virtual node.
|
|
106
|
+
*
|
|
107
|
+
* @param value - The value to check
|
|
108
|
+
* @returns True if the value is a VNode
|
|
109
|
+
*/
|
|
110
|
+
export declare function isVNode(value: any): value is VNode;
|
|
111
|
+
//# sourceMappingURL=vnode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnode.d.ts","sourceRoot":"","sources":["../src/vnode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mFAAmF;AACnF,eAAO,MAAM,QAAQ,eAAqB,CAAC;AAE3C,yCAAyC;AACzC,eAAO,MAAM,IAAI,eAAiB,CAAC;AAEnC,4FAA4F;AAC5F,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,iBAAiB,GAAG,OAAO,QAAQ,GAAG,OAAO,IAAI,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,yEAAyE;IACzE,IAAI,EAAE,SAAS,CAAC;IAChB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,kBAAkB;IAClB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B,sDAAsD;IACtD,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,kDAAkD;IAClD,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACtB;AAED,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE9E,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;IAC3C,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,KAAK,EAAE,KAAK,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACtB,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,yCAAyC;IACzC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,4CAA4C;IAC5C,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7B,wCAAwC;IACxC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACjC,QAAQ,GAAE,aAAkB,GAC3B,KAAK,CAWP;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,UAAU,EAAE,CAYvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAQ5D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAElD"}
|