@fukict/basic 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/component-class/fukict.d.ts +207 -0
- package/dist/component-class/fukict.d.ts.map +1 -0
- package/dist/component-class/fukict.js +299 -0
- package/dist/component-class/fukict.js.map +1 -0
- package/dist/component-class/index.d.ts +5 -0
- package/dist/component-class/index.d.ts.map +1 -0
- package/dist/component-class/index.js +5 -0
- package/dist/component-class/index.js.map +1 -0
- package/dist/component-class/slot.d.ts +9 -0
- package/dist/component-class/slot.d.ts.map +1 -0
- package/dist/component-class/slot.js +46 -0
- package/dist/component-class/slot.js.map +1 -0
- package/dist/component-function/define.d.ts +36 -0
- package/dist/component-function/define.d.ts.map +1 -0
- package/dist/component-function/define.js +23 -0
- package/dist/component-function/define.js.map +1 -0
- package/dist/component-function/index.d.ts +6 -0
- package/dist/component-function/index.d.ts.map +1 -0
- package/dist/component-function/index.js +5 -0
- package/dist/component-function/index.js.map +1 -0
- package/dist/dom/attributes.d.ts +36 -0
- package/dist/dom/attributes.d.ts.map +1 -0
- package/dist/dom/attributes.js +113 -0
- package/dist/dom/attributes.js.map +1 -0
- package/dist/dom/element.d.ts +22 -0
- package/dist/dom/element.d.ts.map +1 -0
- package/dist/dom/element.js +98 -0
- package/dist/dom/element.js.map +1 -0
- package/dist/dom/events.d.ts +14 -0
- package/dist/dom/events.d.ts.map +1 -0
- package/dist/dom/events.js +18 -0
- package/dist/dom/events.js.map +1 -0
- package/dist/dom/index.d.ts +10 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +14 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/dom/node.d.ts +22 -0
- package/dist/dom/node.d.ts.map +1 -0
- package/dist/dom/node.js +30 -0
- package/dist/dom/node.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.d.ts +10 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +9 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +14 -0
- package/dist/metadata.js.map +1 -0
- package/dist/renderer/attributes.d.ts +15 -0
- package/dist/renderer/attributes.d.ts.map +1 -0
- package/dist/renderer/attributes.js +61 -0
- package/dist/renderer/attributes.js.map +1 -0
- package/dist/renderer/create.d.ts +30 -0
- package/dist/renderer/create.d.ts.map +1 -0
- package/dist/renderer/create.js +223 -0
- package/dist/renderer/create.js.map +1 -0
- package/dist/renderer/diff/children.d.ts +12 -0
- package/dist/renderer/diff/children.d.ts.map +1 -0
- package/dist/renderer/diff/children.js +55 -0
- package/dist/renderer/diff/children.js.map +1 -0
- package/dist/renderer/diff/class.d.ts +8 -0
- package/dist/renderer/diff/class.d.ts.map +1 -0
- package/dist/renderer/diff/class.js +38 -0
- package/dist/renderer/diff/class.js.map +1 -0
- package/dist/renderer/diff/element.d.ts +14 -0
- package/dist/renderer/diff/element.d.ts.map +1 -0
- package/dist/renderer/diff/element.js +34 -0
- package/dist/renderer/diff/element.js.map +1 -0
- package/dist/renderer/diff/fragment.d.ts +13 -0
- package/dist/renderer/diff/fragment.d.ts.map +1 -0
- package/dist/renderer/diff/fragment.js +32 -0
- package/dist/renderer/diff/fragment.js.map +1 -0
- package/dist/renderer/diff/function.d.ts +9 -0
- package/dist/renderer/diff/function.d.ts.map +1 -0
- package/dist/renderer/diff/function.js +58 -0
- package/dist/renderer/diff/function.js.map +1 -0
- package/dist/renderer/diff/helpers.d.ts +19 -0
- package/dist/renderer/diff/helpers.d.ts.map +1 -0
- package/dist/renderer/diff/helpers.js +194 -0
- package/dist/renderer/diff/helpers.js.map +1 -0
- package/dist/renderer/diff/index.d.ts +18 -0
- package/dist/renderer/diff/index.d.ts.map +1 -0
- package/dist/renderer/diff/index.js +103 -0
- package/dist/renderer/diff/index.js.map +1 -0
- package/dist/renderer/diff/props.d.ts +18 -0
- package/dist/renderer/diff/props.d.ts.map +1 -0
- package/dist/renderer/diff/props.js +99 -0
- package/dist/renderer/diff/props.js.map +1 -0
- package/dist/renderer/index.d.ts +26 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +93 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/mount.d.ts +30 -0
- package/dist/renderer/mount.d.ts.map +1 -0
- package/dist/renderer/mount.js +209 -0
- package/dist/renderer/mount.js.map +1 -0
- package/dist/types/class.d.ts +88 -0
- package/dist/types/class.d.ts.map +1 -0
- package/dist/types/class.js +2 -0
- package/dist/types/class.js.map +1 -0
- package/dist/types/context.d.ts +36 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +9 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/core.d.ts +124 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +15 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/dom-attributes.d.ts +236 -0
- package/dist/types/dom-attributes.d.ts.map +1 -0
- package/dist/types/dom-attributes.js +2 -0
- package/dist/types/dom-attributes.js.map +1 -0
- package/dist/types/events.d.ts +13 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +7 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/jsx.d.ts +215 -0
- package/dist/types/jsx.d.ts.map +1 -0
- package/dist/types/jsx.js +2 -0
- package/dist/types/jsx.js.map +1 -0
- package/dist/utils/context.d.ts +31 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +80 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/dom-helpers.d.ts +29 -0
- package/dist/utils/dom-helpers.d.ts.map +1 -0
- package/dist/utils/dom-helpers.js +53 -0
- package/dist/utils/dom-helpers.js.map +1 -0
- package/dist/vnode.d.ts +28 -0
- package/dist/vnode.d.ts.map +1 -0
- package/dist/vnode.js +68 -0
- package/dist/vnode.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Renderer
|
|
3
|
+
*
|
|
4
|
+
* Main rendering API
|
|
5
|
+
*/
|
|
6
|
+
import * as dom from '../dom/index.js';
|
|
7
|
+
import { createRealNode } from './create.js';
|
|
8
|
+
import { removeNode } from './diff/index.js';
|
|
9
|
+
import { activate } from './mount.js';
|
|
10
|
+
// Export diff function for use in Fukict.update
|
|
11
|
+
export { diff } from './diff/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Attach VNode to container (complete mounting flow)
|
|
14
|
+
*
|
|
15
|
+
* @param vnode - VNode to render
|
|
16
|
+
* @param container - Container element
|
|
17
|
+
* @returns Unmount function
|
|
18
|
+
*/
|
|
19
|
+
export function attach(vnode, container) {
|
|
20
|
+
if (vnode === null || vnode === undefined) {
|
|
21
|
+
// Clear container
|
|
22
|
+
while (container.firstChild) {
|
|
23
|
+
dom.removeChild(container, container.firstChild);
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// 1. Create real DOM nodes (ClassComponent creates placeholder)
|
|
28
|
+
createRealNode(vnode);
|
|
29
|
+
// 2. Activate: mount DOM and trigger lifecycle
|
|
30
|
+
activate({ vnode, container });
|
|
31
|
+
// Return unmount function
|
|
32
|
+
return () => {
|
|
33
|
+
removeNode(vnode, container);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Replace an existing DOM node with a new VNode
|
|
38
|
+
*
|
|
39
|
+
* @param oldNode - Existing DOM node to replace
|
|
40
|
+
* @param newVNode - New VNode to render
|
|
41
|
+
* @param _oldVNode - Optional VNode associated with oldNode (unused, kept for API compatibility)
|
|
42
|
+
* @returns New DOM node(s) or null
|
|
43
|
+
*/
|
|
44
|
+
export function replaceNode(oldNode, newVNode, _oldVNode) {
|
|
45
|
+
const parentNode = oldNode.parentNode;
|
|
46
|
+
if (!parentNode) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
// If new VNode is null, just remove old node
|
|
50
|
+
if (newVNode === null || newVNode === undefined) {
|
|
51
|
+
dom.removeChild(parentNode, oldNode);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
// Create new node(s)
|
|
55
|
+
const newNode = createRealNode(newVNode);
|
|
56
|
+
if (newNode) {
|
|
57
|
+
if (Array.isArray(newNode)) {
|
|
58
|
+
// Multiple nodes - insert all before oldNode, then remove oldNode
|
|
59
|
+
newNode.forEach(n => {
|
|
60
|
+
parentNode.insertBefore(n, oldNode);
|
|
61
|
+
});
|
|
62
|
+
parentNode.removeChild(oldNode);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Single node - replace directly
|
|
66
|
+
dom.replaceChild(parentNode, newNode, oldNode);
|
|
67
|
+
}
|
|
68
|
+
return newNode;
|
|
69
|
+
}
|
|
70
|
+
// If creation failed, remove old node
|
|
71
|
+
dom.removeChild(parentNode, oldNode);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Unmount node (DOM removal)
|
|
76
|
+
*
|
|
77
|
+
* @param node - DOM node or node array
|
|
78
|
+
*/
|
|
79
|
+
export function unmount(node) {
|
|
80
|
+
if (Array.isArray(node)) {
|
|
81
|
+
node.forEach(n => {
|
|
82
|
+
if (n.parentNode) {
|
|
83
|
+
dom.removeChild(n.parentNode, n);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (node.parentNode) {
|
|
89
|
+
dom.removeChild(node.parentNode, node);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,gDAAgD;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CACpB,KAAiB,EACjB,SAAkB;IAElB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,kBAAkB;QAClB,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;YAC5B,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/B,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,OAAa,EACb,QAAoB,EACpB,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,kEAAkE;YAClE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sCAAsC;IACtC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAmB;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACf,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Renderer: Activate Nodes
|
|
3
|
+
*
|
|
4
|
+
* Mount DOM nodes and trigger lifecycle hooks at mounting moment
|
|
5
|
+
*/
|
|
6
|
+
import type { VNodeChild } from '../types/index.js';
|
|
7
|
+
type ActivateOptions = {
|
|
8
|
+
vnode: VNodeChild;
|
|
9
|
+
container: Element;
|
|
10
|
+
onMounted?: () => void;
|
|
11
|
+
} | {
|
|
12
|
+
vnode: VNodeChild;
|
|
13
|
+
placeholder: Comment;
|
|
14
|
+
onMounted?: () => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Strategy registry
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Activate VNode: mount DOM and trigger lifecycle at mounting moment
|
|
21
|
+
*
|
|
22
|
+
* Two modes:
|
|
23
|
+
* 1. container mode: mount DOM to container (used by attach)
|
|
24
|
+
* 2. placeholder mode: replace placeholder with DOM (used by ClassComponent.mount)
|
|
25
|
+
*
|
|
26
|
+
* @param options - { vnode, container } or { vnode, placeholder }
|
|
27
|
+
*/
|
|
28
|
+
export declare function activate(options: ActivateOptions): void;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAOV,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,KAAK,eAAe,GAChB;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AA0MN;;GAEG;AAQH;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAuCvD"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { VNodeType } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Helper: Auto-activate ClassComponents in VNode tree
|
|
4
|
+
*
|
|
5
|
+
* For JSX natural mounting - placeholders are already in DOM.
|
|
6
|
+
* Recursively searches for ClassComponents, but stops at ClassComponent nodes
|
|
7
|
+
* (since they handle their own children).
|
|
8
|
+
*/
|
|
9
|
+
function autoActivateClassComponentsInTree(vnode, _container) {
|
|
10
|
+
// Special handling for FunctionComponent: use __rendered__ instead of children
|
|
11
|
+
if (vnode.__type__ === VNodeType.FunctionComponent) {
|
|
12
|
+
const rendered = vnode.__rendered__;
|
|
13
|
+
if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
|
|
14
|
+
autoActivateClassComponentsInTree(rendered, _container);
|
|
15
|
+
}
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// For other node types (Element, Fragment), check children
|
|
19
|
+
if (vnode.children && Array.isArray(vnode.children)) {
|
|
20
|
+
for (const child of vnode.children) {
|
|
21
|
+
if (child && typeof child === 'object' && '__type__' in child) {
|
|
22
|
+
const childVNode = child;
|
|
23
|
+
// If child is a ClassComponent, activate it and stop recursion
|
|
24
|
+
if (childVNode.__type__ === VNodeType.ClassComponent) {
|
|
25
|
+
const instance = childVNode.__instance__;
|
|
26
|
+
const placeholder = childVNode.__placeholder__;
|
|
27
|
+
// Placeholder is already in DOM (from parent's createRealNode)
|
|
28
|
+
// Use placeholder replacement mounting
|
|
29
|
+
if (instance && placeholder && placeholder.parentNode) {
|
|
30
|
+
instance.mount(placeholder.parentNode, placeholder);
|
|
31
|
+
}
|
|
32
|
+
// Don't recurse into ClassComponent's children (it handles its own)
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// For other node types, recurse
|
|
36
|
+
autoActivateClassComponentsInTree(childVNode, _container);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Strategy: Activate ClassComponent
|
|
44
|
+
*
|
|
45
|
+
* Supports both container and placeholder modes:
|
|
46
|
+
* - container mode: for manual mounting via attach()
|
|
47
|
+
* - placeholder mode: for diff/replace operations
|
|
48
|
+
*/
|
|
49
|
+
function activateClassComponent(ctx) {
|
|
50
|
+
const { vnode, container, placeholder, onMounted } = ctx;
|
|
51
|
+
const instance = vnode.__instance__;
|
|
52
|
+
if (!instance)
|
|
53
|
+
return;
|
|
54
|
+
// Determine which mode to use
|
|
55
|
+
if (placeholder && placeholder.parentNode) {
|
|
56
|
+
// Placeholder mode: replace placeholder with component DOM
|
|
57
|
+
onMounted?.();
|
|
58
|
+
instance.mount(placeholder.parentNode, placeholder);
|
|
59
|
+
}
|
|
60
|
+
else if (container) {
|
|
61
|
+
// Container mode: mount to container
|
|
62
|
+
onMounted?.();
|
|
63
|
+
instance.mount(container);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Strategy: Activate Element
|
|
68
|
+
*/
|
|
69
|
+
function activateElement(ctx) {
|
|
70
|
+
const { vnode, container, placeholder, onMounted } = ctx;
|
|
71
|
+
const dom = vnode.__dom__;
|
|
72
|
+
const actualContainer = container || placeholder?.parentNode;
|
|
73
|
+
if (!actualContainer)
|
|
74
|
+
return;
|
|
75
|
+
// Mount or replace DOM
|
|
76
|
+
if (dom) {
|
|
77
|
+
if (placeholder && placeholder.parentNode) {
|
|
78
|
+
placeholder.parentNode.replaceChild(dom, placeholder);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
actualContainer.appendChild(dom);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
onMounted?.();
|
|
85
|
+
// Auto-activate ClassComponent children (their placeholders are already in dom)
|
|
86
|
+
autoActivateClassComponentsInTree(vnode, dom);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Strategy: Activate Fragment
|
|
90
|
+
*/
|
|
91
|
+
function activateFragment(ctx) {
|
|
92
|
+
const { vnode, container, placeholder, onMounted } = ctx;
|
|
93
|
+
const domArray = vnode.__dom__;
|
|
94
|
+
const actualContainer = container || placeholder?.parentNode;
|
|
95
|
+
if (!actualContainer)
|
|
96
|
+
return;
|
|
97
|
+
// Mount or replace DOM array
|
|
98
|
+
if (Array.isArray(domArray)) {
|
|
99
|
+
if (placeholder && placeholder.parentNode) {
|
|
100
|
+
// Replace mode: insert all before placeholder, then remove
|
|
101
|
+
domArray.forEach(node => {
|
|
102
|
+
placeholder.parentNode.insertBefore(node, placeholder);
|
|
103
|
+
});
|
|
104
|
+
placeholder.parentNode.removeChild(placeholder);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Mount mode: append all to container
|
|
108
|
+
domArray.forEach(node => actualContainer.appendChild(node));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
onMounted?.();
|
|
112
|
+
// Auto-activate ClassComponent children (their placeholders are already in actualContainer)
|
|
113
|
+
autoActivateClassComponentsInTree(vnode, actualContainer);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Strategy: Activate FunctionComponent
|
|
117
|
+
*/
|
|
118
|
+
function activateFunctionComponent(ctx) {
|
|
119
|
+
const { vnode, container, placeholder, onMounted } = ctx;
|
|
120
|
+
const dom = vnode.__dom__;
|
|
121
|
+
const actualContainer = container || placeholder?.parentNode;
|
|
122
|
+
if (!actualContainer)
|
|
123
|
+
return;
|
|
124
|
+
// Mount or replace DOM (can be single or array)
|
|
125
|
+
if (dom) {
|
|
126
|
+
if (placeholder && placeholder.parentNode) {
|
|
127
|
+
// Replace mode
|
|
128
|
+
if (Array.isArray(dom)) {
|
|
129
|
+
dom.forEach(node => {
|
|
130
|
+
placeholder.parentNode.insertBefore(node, placeholder);
|
|
131
|
+
});
|
|
132
|
+
placeholder.parentNode.removeChild(placeholder);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
placeholder.parentNode.replaceChild(dom, placeholder);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Mount mode
|
|
140
|
+
if (Array.isArray(dom)) {
|
|
141
|
+
dom.forEach(node => actualContainer.appendChild(node));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
actualContainer.appendChild(dom);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
onMounted?.();
|
|
149
|
+
// Auto-activate all ClassComponents in __rendered__ tree
|
|
150
|
+
const rendered = vnode.__rendered__;
|
|
151
|
+
if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
|
|
152
|
+
autoActivateClassComponentsInTree(rendered, actualContainer);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Strategy registry
|
|
157
|
+
*/
|
|
158
|
+
// const strategies: Record<VNodeType, ActivateStrategy> = {
|
|
159
|
+
// [VNodeType.ClassComponent]: activateClassComponent,
|
|
160
|
+
// [VNodeType.Element]: activateElement,
|
|
161
|
+
// [VNodeType.Fragment]: activateFragment,
|
|
162
|
+
// [VNodeType.FunctionComponent]: activateFunctionComponent,
|
|
163
|
+
// };
|
|
164
|
+
/**
|
|
165
|
+
* Activate VNode: mount DOM and trigger lifecycle at mounting moment
|
|
166
|
+
*
|
|
167
|
+
* Two modes:
|
|
168
|
+
* 1. container mode: mount DOM to container (used by attach)
|
|
169
|
+
* 2. placeholder mode: replace placeholder with DOM (used by ClassComponent.mount)
|
|
170
|
+
*
|
|
171
|
+
* @param options - { vnode, container } or { vnode, placeholder }
|
|
172
|
+
*/
|
|
173
|
+
export function activate(options) {
|
|
174
|
+
const { vnode, onMounted } = options;
|
|
175
|
+
const container = 'container' in options ? options.container : undefined;
|
|
176
|
+
const placeholder = 'placeholder' in options ? options.placeholder : undefined;
|
|
177
|
+
// Early return for invalid vnodes
|
|
178
|
+
if (!vnode || typeof vnode !== 'object' || !('__type__' in vnode)) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const vnodeObj = vnode;
|
|
182
|
+
switch (vnodeObj.__type__) {
|
|
183
|
+
case VNodeType.ClassComponent:
|
|
184
|
+
activateClassComponent({
|
|
185
|
+
vnode: vnodeObj,
|
|
186
|
+
container,
|
|
187
|
+
placeholder,
|
|
188
|
+
onMounted,
|
|
189
|
+
});
|
|
190
|
+
break;
|
|
191
|
+
case VNodeType.Element:
|
|
192
|
+
activateElement({ vnode: vnodeObj, container, placeholder, onMounted });
|
|
193
|
+
break;
|
|
194
|
+
case VNodeType.Fragment:
|
|
195
|
+
activateFragment({ vnode: vnodeObj, container, placeholder, onMounted });
|
|
196
|
+
break;
|
|
197
|
+
case VNodeType.FunctionComponent:
|
|
198
|
+
activateFunctionComponent({
|
|
199
|
+
vnode: vnodeObj,
|
|
200
|
+
container,
|
|
201
|
+
placeholder,
|
|
202
|
+
onMounted,
|
|
203
|
+
});
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Class Component Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Types for Fukict class components (stateful, lifecycle, self-updating)
|
|
5
|
+
* Runtime implementation is in component-class/index.ts
|
|
6
|
+
*/
|
|
7
|
+
import type { VNode, VNodeChild } from './core.js';
|
|
8
|
+
/**
|
|
9
|
+
* Slots object type
|
|
10
|
+
* Maps slot names to their content (single VNodeChild or array)
|
|
11
|
+
*/
|
|
12
|
+
export type Slots = Record<string, VNodeChild | VNodeChild[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Ref object type
|
|
15
|
+
* Holds a reference to a DOM element or component instance
|
|
16
|
+
*/
|
|
17
|
+
export interface Ref<T = any> {
|
|
18
|
+
current: T | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Lifecycle hooks interface for Fukict class components
|
|
22
|
+
*/
|
|
23
|
+
export interface FukictLifecycle<P extends Record<string, any> = any> {
|
|
24
|
+
/**
|
|
25
|
+
* Called after component is mounted to DOM
|
|
26
|
+
* Use for: DOM manipulation, event listeners, data fetching
|
|
27
|
+
*/
|
|
28
|
+
mounted?(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Called before component is unmounted from DOM
|
|
31
|
+
* Use for: cleanup, removing event listeners, canceling timers
|
|
32
|
+
*/
|
|
33
|
+
beforeUnmount?(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Called after component is updated (props changed or self-update)
|
|
36
|
+
* @param prevProps - Previous props before update
|
|
37
|
+
*/
|
|
38
|
+
updated?(prevProps: P): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Fukict class component interface
|
|
42
|
+
*
|
|
43
|
+
* Type parameters:
|
|
44
|
+
* - P: Props type (extends Record<string, any>)
|
|
45
|
+
* - S: Slots type (extends Slots, default to Slots)
|
|
46
|
+
*/
|
|
47
|
+
export interface FukictComponent<P extends Record<string, any> = {}, S extends Slots = Slots> extends FukictLifecycle<P> {
|
|
48
|
+
/** Component props (readonly) */
|
|
49
|
+
readonly props: P;
|
|
50
|
+
/** Extracted slots from children */
|
|
51
|
+
readonly slots: S;
|
|
52
|
+
/** Refs map (shared with framework and user) */
|
|
53
|
+
readonly refs: Map<string | symbol, Ref>;
|
|
54
|
+
/** Current rendered VNode (internal, framework use) */
|
|
55
|
+
__vnode__: VNode | null;
|
|
56
|
+
/** Parent DOM container (internal, framework use) */
|
|
57
|
+
__container__: Element | null;
|
|
58
|
+
/** Render method (must be implemented) */
|
|
59
|
+
render(): VNode;
|
|
60
|
+
/**
|
|
61
|
+
* Update component (props-driven update with built-in diff)
|
|
62
|
+
*
|
|
63
|
+
* Called by renderer when parent updates props.
|
|
64
|
+
* Can be overridden for custom update logic (e.g., shouldUpdate).
|
|
65
|
+
* Skipped when fukict:detach is set (props updated, but no re-render).
|
|
66
|
+
*/
|
|
67
|
+
update(newProps: P): void;
|
|
68
|
+
/**
|
|
69
|
+
* Mount method (called by renderer after instance creation)
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
mount(container: Element, placeholder?: Comment): void;
|
|
73
|
+
/** Unmount method (internal, framework use) */
|
|
74
|
+
unmount(): void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Helper type to extract props type from Fukict component
|
|
78
|
+
*/
|
|
79
|
+
export type FukictProps<T> = T extends FukictComponent<infer P, any> ? P : never;
|
|
80
|
+
/**
|
|
81
|
+
* Helper type to extract slots type from Fukict component
|
|
82
|
+
*/
|
|
83
|
+
export type FukictSlots<T> = T extends FukictComponent<any, infer S> ? S : never;
|
|
84
|
+
/**
|
|
85
|
+
* Helper type for Fukict class constructor
|
|
86
|
+
*/
|
|
87
|
+
export type FukictConstructor<P extends Record<string, any> = any, S extends Slots = Slots> = new (props: P, children?: VNodeChild[]) => FukictComponent<P, S>;
|
|
88
|
+
//# sourceMappingURL=class.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/types/class.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG;IAC1B,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;IAClE;;;OAGG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,IAAI,IAAI,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe,CAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAClC,CAAC,SAAS,KAAK,GAAG,KAAK,CACvB,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC,uDAAuD;IACvD,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IAExB,qDAAqD;IACrD,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,IAAI,KAAK,CAAC;IAEhB;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAEvD,+CAA+C;IAC/C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EACnC,CAAC,SAAS,KAAK,GAAG,KAAK,IACrB,KAAK,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/types/class.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/basic - Context Types
|
|
3
|
+
*
|
|
4
|
+
* Context system for passing data down the component tree
|
|
5
|
+
* without prop drilling. Context is stored on VNode tree with
|
|
6
|
+
* no global state.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Context definition
|
|
10
|
+
*
|
|
11
|
+
* Use Symbol or string as key for type-safe context.
|
|
12
|
+
* Symbol is recommended for production to avoid naming collisions.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* // contexts.ts
|
|
17
|
+
* export const THEME_CONTEXT = Symbol('theme');
|
|
18
|
+
* export interface ThemeContext {
|
|
19
|
+
* mode: 'light' | 'dark';
|
|
20
|
+
* color: string;
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export interface Context<T> {
|
|
25
|
+
key: string | symbol;
|
|
26
|
+
defaultValue?: T;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Context data structure on VNode
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export interface ContextData {
|
|
33
|
+
[key: string | symbol]: any;
|
|
34
|
+
__parent__?: ContextData;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;IAC5B,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fukict/runtime - Core Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core VNode and basic runtime types
|
|
5
|
+
*/
|
|
6
|
+
import type { ContextData } from './context.js';
|
|
7
|
+
/**
|
|
8
|
+
* VNode child types - supports primitives, VNodes, and nested arrays
|
|
9
|
+
*/
|
|
10
|
+
export type VNodeChild = VNode | string | number | boolean | null | undefined | VNodeChild[];
|
|
11
|
+
/**
|
|
12
|
+
* VNode type enum
|
|
13
|
+
*/
|
|
14
|
+
export declare enum VNodeType {
|
|
15
|
+
Element = "element",
|
|
16
|
+
Fragment = "fragment",
|
|
17
|
+
FunctionComponent = "function",
|
|
18
|
+
ClassComponent = "class"
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Base VNode properties (shared by all VNode types)
|
|
22
|
+
*/
|
|
23
|
+
interface VNodeBase {
|
|
24
|
+
/** Props (including on: prefixed events) */
|
|
25
|
+
props: Record<string, any> | null;
|
|
26
|
+
/** Child VNodes */
|
|
27
|
+
children: VNodeChild[];
|
|
28
|
+
/**
|
|
29
|
+
* Detached flag
|
|
30
|
+
* When true, component won't be updated by parent
|
|
31
|
+
*/
|
|
32
|
+
__detached__?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Slot name for slot mechanism
|
|
35
|
+
*/
|
|
36
|
+
__slot_name__?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Context data (added in v3.1)
|
|
39
|
+
* Stores context chain for data passing without prop drilling
|
|
40
|
+
* @see {@link ContextData}
|
|
41
|
+
*/
|
|
42
|
+
__context__?: ContextData;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Element VNode
|
|
46
|
+
* - type: string (tag name like 'div', 'span')
|
|
47
|
+
* - __dom__: Node (single DOM element)
|
|
48
|
+
*/
|
|
49
|
+
export interface ElementVNode extends VNodeBase {
|
|
50
|
+
__type__: VNodeType.Element;
|
|
51
|
+
type: string;
|
|
52
|
+
__dom__?: Node | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Fragment VNode
|
|
56
|
+
* - type: Fragment symbol
|
|
57
|
+
* - __dom__: Node[] (all child nodes)
|
|
58
|
+
*/
|
|
59
|
+
export interface FragmentVNode extends VNodeBase {
|
|
60
|
+
__type__: VNodeType.Fragment;
|
|
61
|
+
type: symbol;
|
|
62
|
+
__dom__?: Node[] | null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Function Component VNode
|
|
66
|
+
* - type: Function
|
|
67
|
+
* - __rendered__: VNode (cached result of function call)
|
|
68
|
+
* - __dom__: Node | Node[] (depends on rendered result)
|
|
69
|
+
*/
|
|
70
|
+
export interface FunctionComponentVNode extends VNodeBase {
|
|
71
|
+
__type__: VNodeType.FunctionComponent;
|
|
72
|
+
type: Function;
|
|
73
|
+
__rendered__?: VNode;
|
|
74
|
+
__dom__?: Node | Node[] | null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Class Component VNode
|
|
78
|
+
* - type: Function (class constructor)
|
|
79
|
+
* - __instance__: FukictInstance (component instance)
|
|
80
|
+
* - __placeholder__: Comment node as placeholder for insertion position
|
|
81
|
+
* - __dom__: ❌ NOT USED (managed by instance)
|
|
82
|
+
*/
|
|
83
|
+
export interface ClassComponentVNode extends VNodeBase {
|
|
84
|
+
__type__: VNodeType.ClassComponent;
|
|
85
|
+
type: Function;
|
|
86
|
+
__instance__?: any;
|
|
87
|
+
__placeholder__?: Comment;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* VNode - Discriminated Union
|
|
91
|
+
*
|
|
92
|
+
* Use __type__ to narrow down to specific VNode type:
|
|
93
|
+
*
|
|
94
|
+
* ```typescript
|
|
95
|
+
* if (vnode.__type__ === VNodeType.Element) {
|
|
96
|
+
* // vnode is ElementVNode
|
|
97
|
+
* const element: Node = vnode.__dom__;
|
|
98
|
+
* } else if (vnode.__type__ === VNodeType.Fragment) {
|
|
99
|
+
* // vnode is FragmentVNode
|
|
100
|
+
* const nodes: Node[] = vnode.__dom__;
|
|
101
|
+
* } else if (vnode.__type__ === VNodeType.FunctionComponent) {
|
|
102
|
+
* // vnode is FunctionComponentVNode
|
|
103
|
+
* const rendered = vnode.__rendered__;
|
|
104
|
+
* } else if (vnode.__type__ === VNodeType.ClassComponent) {
|
|
105
|
+
* // vnode is ClassComponentVNode
|
|
106
|
+
* const instance = vnode.__instance__;
|
|
107
|
+
* }
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export type VNode = ElementVNode | FragmentVNode | FunctionComponentVNode | ClassComponentVNode;
|
|
111
|
+
/**
|
|
112
|
+
* Fragment symbol for multiple root elements
|
|
113
|
+
*/
|
|
114
|
+
export declare const Fragment: unique symbol;
|
|
115
|
+
/**
|
|
116
|
+
* Ref callback type
|
|
117
|
+
*/
|
|
118
|
+
export type RefCallback<T extends Element = Element> = (element: T) => void;
|
|
119
|
+
/**
|
|
120
|
+
* Unregister function returned by registration APIs
|
|
121
|
+
*/
|
|
122
|
+
export type UnregisterFn = () => void;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,UAAU,EAAE,CAAC;AAEjB;;GAEG;AACH,oBAAY,SAAS;IACnB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,iBAAiB,aAAa;IAC9B,cAAc,UAAU;CACzB;AAED;;GAEG;AACH,UAAU,SAAS;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAElC,mBAAmB;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,QAAQ,EAAE,SAAS,CAAC,cAAc,CAAC;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAE3B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,KAAK,GACb,YAAY,GACZ,aAAa,GACb,sBAAsB,GACtB,mBAAmB,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,QAAQ,eAAqB,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VNode type enum
|
|
3
|
+
*/
|
|
4
|
+
export var VNodeType;
|
|
5
|
+
(function (VNodeType) {
|
|
6
|
+
VNodeType["Element"] = "element";
|
|
7
|
+
VNodeType["Fragment"] = "fragment";
|
|
8
|
+
VNodeType["FunctionComponent"] = "function";
|
|
9
|
+
VNodeType["ClassComponent"] = "class";
|
|
10
|
+
})(VNodeType || (VNodeType = {}));
|
|
11
|
+
/**
|
|
12
|
+
* Fragment symbol for multiple root elements
|
|
13
|
+
*/
|
|
14
|
+
export const Fragment = Symbol('Fragment');
|
|
15
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;IACrB,2CAA8B,CAAA;IAC9B,qCAAwB,CAAA;AAC1B,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB;AA4GD;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC"}
|