kiru 0.52.3 → 0.53.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/dist/appContext.d.ts.map +1 -1
- package/dist/appContext.js +14 -11
- package/dist/appContext.js.map +1 -1
- package/dist/components/derive.d.ts +20 -0
- package/dist/components/derive.d.ts.map +1 -0
- package/dist/components/derive.js +57 -0
- package/dist/components/derive.js.map +1 -0
- package/dist/components/errorBoundary.d.ts +1 -1
- package/dist/components/errorBoundary.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/memo.d.ts +6 -3
- package/dist/components/memo.d.ts.map +1 -1
- package/dist/components/memo.js.map +1 -1
- package/dist/constants.d.ts +3 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -3
- package/dist/constants.js.map +1 -1
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +69 -66
- package/dist/dom.js.map +1 -1
- package/dist/element.d.ts +2 -2
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +20 -32
- package/dist/element.js.map +1 -1
- package/dist/globalContext.d.ts +6 -1
- package/dist/globalContext.d.ts.map +1 -1
- package/dist/globalContext.js +14 -2
- package/dist/globalContext.js.map +1 -1
- package/dist/hooks/usePromise.d.ts +4 -9
- package/dist/hooks/usePromise.d.ts.map +1 -1
- package/dist/hooks/usePromise.js +25 -28
- package/dist/hooks/usePromise.js.map +1 -1
- package/dist/hooks/useRef.d.ts +2 -2
- package/dist/hooks/useRef.d.ts.map +1 -1
- package/dist/jsx.d.ts +1 -1
- package/dist/jsx.d.ts.map +1 -1
- package/dist/reconciler.d.ts +1 -1
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +57 -117
- package/dist/reconciler.js.map +1 -1
- package/dist/recursiveRender.d.ts +4 -3
- package/dist/recursiveRender.d.ts.map +1 -1
- package/dist/recursiveRender.js +20 -19
- package/dist/recursiveRender.js.map +1 -1
- package/dist/renderToString.js +2 -2
- package/dist/renderToString.js.map +1 -1
- package/dist/router/fileRouterController.d.ts +1 -1
- package/dist/router/fileRouterController.d.ts.map +1 -1
- package/dist/router/fileRouterController.js +11 -9
- package/dist/router/fileRouterController.js.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/scrollStack.d.ts +0 -1
- package/dist/router/scrollStack.d.ts.map +1 -1
- package/dist/router/scrollStack.js +0 -3
- package/dist/router/scrollStack.js.map +1 -1
- package/dist/router/utils/index.d.ts +1 -1
- package/dist/router/utils/index.d.ts.map +1 -1
- package/dist/signals/base.d.ts +1 -3
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +3 -3
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts +4 -2
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +29 -6
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/for.d.ts +10 -0
- package/dist/signals/for.d.ts.map +1 -0
- package/dist/signals/for.js +7 -0
- package/dist/signals/for.js.map +1 -0
- package/dist/signals/index.d.ts +1 -1
- package/dist/signals/index.js +1 -1
- package/dist/signals/types.d.ts +1 -1
- package/dist/signals/types.d.ts.map +1 -1
- package/dist/ssr/server.js +13 -13
- package/dist/ssr/server.js.map +1 -1
- package/dist/types.d.ts +10 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.dom.d.ts +33 -32
- package/dist/types.dom.d.ts.map +1 -1
- package/dist/types.utils.d.ts +5 -1
- package/dist/types.utils.d.ts.map +1 -1
- package/dist/utils/format.d.ts +2 -2
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +4 -3
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/promise.d.ts +16 -0
- package/dist/utils/promise.d.ts.map +1 -0
- package/dist/utils/promise.js +14 -0
- package/dist/utils/promise.js.map +1 -0
- package/dist/utils/runtime.d.ts +10 -1
- package/dist/utils/runtime.d.ts.map +1 -1
- package/dist/utils/runtime.js +25 -1
- package/dist/utils/runtime.js.map +1 -1
- package/dist/utils/vdom.d.ts +4 -4
- package/dist/utils/vdom.d.ts.map +1 -1
- package/dist/utils/vdom.js +18 -17
- package/dist/utils/vdom.js.map +1 -1
- package/dist/vNode.d.ts +4 -0
- package/dist/vNode.d.ts.map +1 -0
- package/dist/vNode.js +22 -0
- package/dist/vNode.js.map +1 -0
- package/package.json +1 -1
- package/src/appContext.ts +15 -13
- package/src/components/derive.ts +121 -0
- package/src/components/index.ts +1 -1
- package/src/components/memo.ts +3 -2
- package/src/constants.ts +4 -4
- package/src/dom.ts +71 -66
- package/src/element.ts +22 -35
- package/src/globalContext.ts +24 -3
- package/src/hooks/usePromise.ts +32 -41
- package/src/hooks/useRef.ts +2 -2
- package/src/reconciler.ts +87 -125
- package/src/recursiveRender.ts +25 -23
- package/src/renderToString.ts +3 -3
- package/src/router/fileRouterController.ts +19 -9
- package/src/router/scrollStack.ts +23 -26
- package/src/signals/base.ts +3 -3
- package/src/signals/computed.ts +43 -6
- package/src/signals/for.ts +25 -0
- package/src/signals/index.ts +1 -1
- package/src/signals/types.ts +5 -1
- package/src/ssr/server.ts +15 -15
- package/src/types.dom.ts +40 -40
- package/src/types.ts +11 -11
- package/src/types.utils.ts +11 -1
- package/src/utils/format.ts +7 -4
- package/src/utils/index.ts +0 -2
- package/src/utils/promise.ts +26 -0
- package/src/utils/runtime.ts +29 -1
- package/src/utils/vdom.ts +20 -23
- package/src/vNode.ts +30 -0
- package/dist/components/suspense.d.ts +0 -24
- package/dist/components/suspense.d.ts.map +0 -1
- package/dist/components/suspense.js +0 -36
- package/dist/components/suspense.js.map +0 -1
- package/dist/signals/jsx.d.ts +0 -17
- package/dist/signals/jsx.d.ts.map +0 -1
- package/dist/signals/jsx.js +0 -11
- package/dist/signals/jsx.js.map +0 -1
- package/src/components/suspense.ts +0 -72
- package/src/signals/jsx.ts +0 -46
package/dist/utils/vdom.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Signal } from "../signals/base.js";
|
|
2
1
|
import { FLAG_DELETION, $FRAGMENT, $CONTEXT_PROVIDER, FLAG_PLACEMENT, FLAG_UPDATE, $ERROR_BOUNDARY, } from "../constants.js";
|
|
3
2
|
import { createElement } from "../index.js";
|
|
4
3
|
import { KiruError } from "../error.js";
|
|
5
4
|
import { node } from "../globals.js";
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { isMemoFn } from "../components/memo.js";
|
|
6
|
+
export { cloneElement, isVNodeDeleted, isElement, isVNode, isValidTextChild, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, findParentErrorBoundary, assertValidElementProps, normalizeElementKey, };
|
|
7
|
+
function cloneElement(vNode) {
|
|
8
8
|
const children = vNode.props.children;
|
|
9
9
|
let clonedChildren;
|
|
10
10
|
if (isVNode(children)) {
|
|
11
|
-
clonedChildren =
|
|
11
|
+
clonedChildren = cloneElement(children);
|
|
12
12
|
}
|
|
13
13
|
else if (Array.isArray(children)) {
|
|
14
|
-
clonedChildren = children.map((c) => (isVNode(c) ?
|
|
14
|
+
clonedChildren = children.map((c) => (isVNode(c) ? cloneElement(c) : c));
|
|
15
15
|
}
|
|
16
16
|
return createElement(vNode.type, { ...vNode.props, children: clonedChildren });
|
|
17
17
|
}
|
|
@@ -21,6 +21,9 @@ function isVNodeDeleted(vNode) {
|
|
|
21
21
|
function isVNode(thing) {
|
|
22
22
|
return typeof thing === "object" && thing !== null && "type" in thing;
|
|
23
23
|
}
|
|
24
|
+
function isElement(thing) {
|
|
25
|
+
return typeof thing === "object" && thing !== null && "type" in thing;
|
|
26
|
+
}
|
|
24
27
|
function isValidTextChild(thing) {
|
|
25
28
|
return ((typeof thing === "string" && thing !== "") ||
|
|
26
29
|
typeof thing === "number" ||
|
|
@@ -38,9 +41,7 @@ function isLazy(vNode) {
|
|
|
38
41
|
vNode.type.displayName === "Kiru.lazy");
|
|
39
42
|
}
|
|
40
43
|
function isMemo(vNode) {
|
|
41
|
-
return
|
|
42
|
-
"displayName" in vNode.type &&
|
|
43
|
-
vNode.type.displayName === "Kiru.memo");
|
|
44
|
+
return typeof vNode.type === "function" && isMemoFn(vNode.type);
|
|
44
45
|
}
|
|
45
46
|
function isContextProvider(thing) {
|
|
46
47
|
return isVNode(thing) && thing.type === $CONTEXT_PROVIDER;
|
|
@@ -59,8 +60,8 @@ function getVNodeAppContext(vNode) {
|
|
|
59
60
|
return null;
|
|
60
61
|
}
|
|
61
62
|
function commitSnapshot(vNode) {
|
|
62
|
-
const { props: { children, ...props }, memoizedProps, index, } = vNode;
|
|
63
|
-
vNode.prev = { props, memoizedProps, index };
|
|
63
|
+
const { props: { children, ...props }, key, memoizedProps, index, } = vNode;
|
|
64
|
+
vNode.prev = { props, key, memoizedProps, index };
|
|
64
65
|
vNode.flags &= ~(FLAG_UPDATE | FLAG_PLACEMENT | FLAG_DELETION);
|
|
65
66
|
}
|
|
66
67
|
function vNodeContains(haystack, needle) {
|
|
@@ -119,12 +120,12 @@ function assertValidElementProps(vNode) {
|
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
function
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
123
|
+
function normalizeElementKey(thing) {
|
|
124
|
+
if (thing === undefined)
|
|
125
|
+
return null;
|
|
126
|
+
if (typeof thing === "string" || typeof thing === "number") {
|
|
127
|
+
return thing;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
129
130
|
}
|
|
130
131
|
//# sourceMappingURL=vdom.js.map
|
package/dist/utils/vdom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"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"}
|
package/dist/vNode.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vNode.d.ts","sourceRoot":"","sources":["../src/vNode.ts"],"names":[],"mappings":"AAGA,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;AAEvB,wBAAgB,WAAW,CACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,MAAM,GAAE,KAAK,GAAG,IAAW,EAC3B,KAAK,GAAE,KAAK,CAAC,OAAO,CAAM,EAC1B,GAAG,GAAE,KAAK,CAAC,KAAK,CAAQ,EACxB,KAAK,SAAI,GACR,KAAK,CAkBP"}
|
package/dist/vNode.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { $FRAGMENT } from "./constants.js";
|
|
2
|
+
import { Fragment } from "./element.js";
|
|
3
|
+
export function createVNode(type, parent = null, props = {}, key = null, index = 0) {
|
|
4
|
+
if (type === Fragment) {
|
|
5
|
+
type = $FRAGMENT;
|
|
6
|
+
}
|
|
7
|
+
const depth = parent ? parent.depth + 1 : 0;
|
|
8
|
+
return {
|
|
9
|
+
type,
|
|
10
|
+
key,
|
|
11
|
+
props,
|
|
12
|
+
parent,
|
|
13
|
+
index,
|
|
14
|
+
depth,
|
|
15
|
+
flags: 0,
|
|
16
|
+
child: null,
|
|
17
|
+
sibling: null,
|
|
18
|
+
prev: null,
|
|
19
|
+
deletions: null,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=vNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vNode.js","sourceRoot":"","sources":["../src/vNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAIvC,MAAM,UAAU,WAAW,CACzB,IAAmB,EACnB,SAAuB,IAAI,EAC3B,QAAwB,EAAE,EAC1B,MAAoB,IAAI,EACxB,KAAK,GAAG,CAAC;IAET,IAAK,IAAY,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,GAAG,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,OAAO;QACL,IAAI;QACJ,GAAG;QACH,KAAK;QACL,MAAM;QACN,KAAK;QACL,KAAK;QACL,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;KAChB,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/appContext.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FLAG_STATIC_DOM } from "./constants.js"
|
|
2
|
-
import { createElement } from "./element.js"
|
|
3
2
|
import { __DEV__ } from "./env.js"
|
|
4
|
-
import { renderRootSync } from "./scheduler.js"
|
|
3
|
+
import { renderRootSync, requestUpdate } from "./scheduler.js"
|
|
4
|
+
import { createVNode } from "./vNode.js"
|
|
5
5
|
|
|
6
6
|
type VNode = Kiru.VNode
|
|
7
7
|
|
|
@@ -34,19 +34,11 @@ export function mount(
|
|
|
34
34
|
)
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
const rootNode =
|
|
38
|
-
if (__DEV__) {
|
|
39
|
-
container.__kiruNode = rootNode
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
rootNode.dom = container
|
|
43
|
-
rootNode.flags |= FLAG_STATIC_DOM
|
|
44
|
-
|
|
37
|
+
const rootNode = createRootNode(container)
|
|
45
38
|
const id = appId++
|
|
46
|
-
const name = options?.name ?? `App-${id}`
|
|
47
39
|
const appContext: AppContext = {
|
|
48
40
|
id,
|
|
49
|
-
name
|
|
41
|
+
name: options?.name ?? `App-${id}`,
|
|
50
42
|
rootNode,
|
|
51
43
|
render,
|
|
52
44
|
unmount,
|
|
@@ -72,7 +64,7 @@ export function mount(
|
|
|
72
64
|
}
|
|
73
65
|
|
|
74
66
|
render(children)
|
|
75
|
-
window.__kiru.emit("mount", appContext)
|
|
67
|
+
window.__kiru.emit("mount", appContext, requestUpdate)
|
|
76
68
|
if (__DEV__) {
|
|
77
69
|
queueMicrotask(() => {
|
|
78
70
|
window.dispatchEvent(new Event("kiru:ready"))
|
|
@@ -81,3 +73,13 @@ export function mount(
|
|
|
81
73
|
|
|
82
74
|
return appContext
|
|
83
75
|
}
|
|
76
|
+
|
|
77
|
+
function createRootNode(container: HTMLElement): Kiru.VNode {
|
|
78
|
+
const node = createVNode(container.nodeName.toLowerCase())
|
|
79
|
+
node.flags |= FLAG_STATIC_DOM
|
|
80
|
+
node.dom = container
|
|
81
|
+
if (__DEV__) {
|
|
82
|
+
container.__kiruNode = node
|
|
83
|
+
}
|
|
84
|
+
return node
|
|
85
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { node } from "../globals.js"
|
|
2
|
+
import { $STREAM_DATA } from "../constants.js"
|
|
3
|
+
import { requestUpdate } from "../scheduler.js"
|
|
4
|
+
import { useRef } from "../hooks/index.js"
|
|
5
|
+
import { Signal } from "../signals/index.js"
|
|
6
|
+
import { sideEffectsEnabled } from "../utils/index.js"
|
|
7
|
+
import type { RecordHas } from "../types.utils"
|
|
8
|
+
import { isStatefulPromise, StreamDataThrowValue } from "../utils/promise.js"
|
|
9
|
+
|
|
10
|
+
export type Derivable =
|
|
11
|
+
| Kiru.Signal<unknown>
|
|
12
|
+
| Kiru.StatefulPromise<unknown>
|
|
13
|
+
| Record<string, Kiru.Signal<unknown> | Kiru.StatefulPromise<unknown>>
|
|
14
|
+
|
|
15
|
+
type InnerOf<T> = T extends Kiru.Signal<infer V>
|
|
16
|
+
? V
|
|
17
|
+
: T extends Kiru.StatefulPromise<infer P>
|
|
18
|
+
? P
|
|
19
|
+
: never
|
|
20
|
+
|
|
21
|
+
type UnwrapDerive<T extends Derivable> = T extends
|
|
22
|
+
| Kiru.Signal<unknown>
|
|
23
|
+
| Kiru.StatefulPromise<any>
|
|
24
|
+
? InnerOf<T>
|
|
25
|
+
: { [K in keyof T]: InnerOf<T[K]> }
|
|
26
|
+
|
|
27
|
+
type RecordHasPromise<T extends Record<string, any>> = RecordHas<
|
|
28
|
+
T,
|
|
29
|
+
Kiru.StatefulPromise<any>
|
|
30
|
+
>
|
|
31
|
+
|
|
32
|
+
type ChildFn<T> = (value: T) => JSX.Children
|
|
33
|
+
type ChildFnWithStale<T> = (value: T, isStale: boolean) => JSX.Children
|
|
34
|
+
|
|
35
|
+
export type DeriveFallbackMode = "swr" | "fallback"
|
|
36
|
+
|
|
37
|
+
export interface DeriveProps<
|
|
38
|
+
T extends Derivable,
|
|
39
|
+
Mode extends DeriveFallbackMode = "fallback"
|
|
40
|
+
> {
|
|
41
|
+
from: T
|
|
42
|
+
mode?: Mode
|
|
43
|
+
children: T extends Kiru.StatefulPromise<infer U>
|
|
44
|
+
? Mode extends "swr"
|
|
45
|
+
? ChildFnWithStale<U>
|
|
46
|
+
: ChildFn<U>
|
|
47
|
+
: T extends Record<string, any>
|
|
48
|
+
? RecordHasPromise<T> extends true
|
|
49
|
+
? Mode extends "swr"
|
|
50
|
+
? ChildFnWithStale<UnwrapDerive<T>>
|
|
51
|
+
: ChildFn<UnwrapDerive<T>>
|
|
52
|
+
: ChildFn<UnwrapDerive<T>>
|
|
53
|
+
: ChildFn<UnwrapDerive<T>>
|
|
54
|
+
fallback?: T extends Kiru.StatefulPromise<any>
|
|
55
|
+
? JSX.Element
|
|
56
|
+
: T extends Record<string, any>
|
|
57
|
+
? RecordHasPromise<T> extends true
|
|
58
|
+
? JSX.Element
|
|
59
|
+
: never
|
|
60
|
+
: never
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function Derive<
|
|
64
|
+
T extends Derivable,
|
|
65
|
+
U extends DeriveFallbackMode = "swr"
|
|
66
|
+
>(props: DeriveProps<T, U>) {
|
|
67
|
+
const { from, children, fallback, mode } = props
|
|
68
|
+
const prevSuccess = useRef<UnwrapDerive<T> | null>(null)
|
|
69
|
+
|
|
70
|
+
const promises = new Set<Kiru.StatefulPromise<any>>()
|
|
71
|
+
let value: UnwrapDerive<T>
|
|
72
|
+
|
|
73
|
+
if (isStatefulPromise(from)) {
|
|
74
|
+
promises.add(from)
|
|
75
|
+
value = from.value as UnwrapDerive<T>
|
|
76
|
+
} else if (Signal.isSignal(from)) {
|
|
77
|
+
value = from.value as UnwrapDerive<T>
|
|
78
|
+
} else {
|
|
79
|
+
const out: Record<string, any> = {}
|
|
80
|
+
for (const key in from) {
|
|
81
|
+
const v = from[key]
|
|
82
|
+
if (isStatefulPromise(v)) promises.add(v)
|
|
83
|
+
out[key] = (v as Signal<unknown> | Kiru.StatefulPromise<unknown>).value
|
|
84
|
+
}
|
|
85
|
+
value = out as UnwrapDerive<T>
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (promises.size === 0) {
|
|
89
|
+
return (children as ChildFn<UnwrapDerive<T>>)(value)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (!sideEffectsEnabled()) {
|
|
93
|
+
throw {
|
|
94
|
+
[$STREAM_DATA]: {
|
|
95
|
+
fallback,
|
|
96
|
+
data: Array.from(promises),
|
|
97
|
+
},
|
|
98
|
+
} satisfies StreamDataThrowValue
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
for (const p of promises) {
|
|
102
|
+
if (p.state === "rejected") {
|
|
103
|
+
throw p.error
|
|
104
|
+
}
|
|
105
|
+
if (p.state === "pending") {
|
|
106
|
+
const nodeRef = node.current!
|
|
107
|
+
Promise.allSettled(promises).then(() => requestUpdate(nodeRef))
|
|
108
|
+
|
|
109
|
+
if (mode !== "fallback" && prevSuccess.current) {
|
|
110
|
+
return (children as ChildFnWithStale<UnwrapDerive<T>>)(
|
|
111
|
+
prevSuccess.current,
|
|
112
|
+
true
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
return fallback
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
prevSuccess.current = value
|
|
120
|
+
return (children as ChildFnWithStale<UnwrapDerive<T>>)(value, false)
|
|
121
|
+
}
|
package/src/components/index.ts
CHANGED
package/src/components/memo.ts
CHANGED
|
@@ -15,7 +15,8 @@ function _arePropsEqual<T extends Record<string, unknown>>(
|
|
|
15
15
|
return true
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export
|
|
18
|
+
export interface MemoFn<T extends Record<string, unknown> = {}> {
|
|
19
|
+
(props: T): JSX.Element
|
|
19
20
|
[$MEMO]: {
|
|
20
21
|
arePropsEqual: (
|
|
21
22
|
prevProps: Record<string, unknown>,
|
|
@@ -39,7 +40,7 @@ export function memo<T extends Record<string, unknown> = {}>(
|
|
|
39
40
|
)
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
export function isMemoFn(fn: any): fn is MemoFn {
|
|
43
|
+
export function isMemoFn(fn: Function & { [$MEMO]?: any }): fn is MemoFn {
|
|
43
44
|
return (
|
|
44
45
|
typeof fn === "function" && typeof fn[$MEMO]?.arePropsEqual === "function"
|
|
45
46
|
)
|
package/src/constants.ts
CHANGED
|
@@ -7,10 +7,10 @@ export {
|
|
|
7
7
|
$HMR_ACCEPT,
|
|
8
8
|
$MEMO,
|
|
9
9
|
$ERROR_BOUNDARY,
|
|
10
|
-
$
|
|
10
|
+
$STREAM_DATA,
|
|
11
11
|
$DEV_FILE_LINK,
|
|
12
12
|
CONSECUTIVE_DIRTY_LIMIT,
|
|
13
|
-
|
|
13
|
+
STREAMED_DATA_EVENT,
|
|
14
14
|
EVENT_PREFIX_REGEX,
|
|
15
15
|
FLAG_UPDATE,
|
|
16
16
|
FLAG_PLACEMENT,
|
|
@@ -31,11 +31,11 @@ const $KIRU_ERROR = Symbol.for("kiru.error")
|
|
|
31
31
|
const $HMR_ACCEPT = Symbol.for("kiru.hmrAccept")
|
|
32
32
|
const $MEMO = Symbol.for("kiru.memo")
|
|
33
33
|
const $ERROR_BOUNDARY = Symbol.for("kiru.errorBoundary")
|
|
34
|
-
const $
|
|
34
|
+
const $STREAM_DATA = Symbol.for("kiru.streamData")
|
|
35
35
|
const $DEV_FILE_LINK = Symbol.for("kiru.devFileLink")
|
|
36
36
|
|
|
37
37
|
const CONSECUTIVE_DIRTY_LIMIT = 50
|
|
38
|
-
const
|
|
38
|
+
const STREAMED_DATA_EVENT = "kiru:deferred"
|
|
39
39
|
|
|
40
40
|
const FLAG_UPDATE = 1 << 1
|
|
41
41
|
const FLAG_PLACEMENT = 1 << 2
|
package/src/dom.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
propFilters,
|
|
5
5
|
propToHtmlAttr,
|
|
6
6
|
getVNodeAppContext,
|
|
7
|
+
setRef,
|
|
7
8
|
} from "./utils/index.js"
|
|
8
9
|
import {
|
|
9
10
|
booleanAttributes,
|
|
@@ -73,21 +74,6 @@ function onAfterFlushDomChanges() {
|
|
|
73
74
|
persistingFocus = false
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
function setDomRef(ref: Kiru.Ref<SomeDom | null>, value: SomeDom | null) {
|
|
77
|
-
if (typeof ref === "function") {
|
|
78
|
-
ref(value)
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
-
if (Signal.isSignal(ref)) {
|
|
82
|
-
ref.sneak(value)
|
|
83
|
-
ref.notify({
|
|
84
|
-
filter: (sub) => typeof sub === "function",
|
|
85
|
-
})
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
;(ref as Kiru.MutableRefObject<SomeDom | null>).current = value
|
|
89
|
-
}
|
|
90
|
-
|
|
91
77
|
function createDom(vNode: DomVNode): SomeDom {
|
|
92
78
|
const t = vNode.type
|
|
93
79
|
const dom =
|
|
@@ -139,75 +125,85 @@ const vNodeToWrappedFocusEventHandlersMap = new WeakMap<
|
|
|
139
125
|
WrappedFocusEventMap
|
|
140
126
|
>()
|
|
141
127
|
|
|
142
|
-
function updateDom(vNode:
|
|
143
|
-
const dom = vNode
|
|
144
|
-
const prevProps
|
|
145
|
-
const nextProps
|
|
146
|
-
const keys = new Set([...Object.keys(prevProps), ...Object.keys(nextProps)])
|
|
128
|
+
function updateDom(vNode: DomVNode) {
|
|
129
|
+
const { dom, prev, props, cleanups } = vNode
|
|
130
|
+
const prevProps = prev?.props ?? {}
|
|
131
|
+
const nextProps = props ?? {}
|
|
147
132
|
const isHydration = renderMode.current === "hydrate"
|
|
148
133
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
if (prev) {
|
|
155
|
-
setDomRef(prev, null)
|
|
156
|
-
}
|
|
157
|
-
if (next) {
|
|
158
|
-
setDomRef(next, dom)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return
|
|
134
|
+
// TEXT NODE SHORT-PATH
|
|
135
|
+
if (dom instanceof Text) {
|
|
136
|
+
const nextVal = nextProps.nodeValue
|
|
137
|
+
if (!Signal.isSignal(nextVal) && dom.nodeValue !== nextVal) {
|
|
138
|
+
dom.nodeValue = nextVal
|
|
162
139
|
}
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const keys: string[] = []
|
|
144
|
+
for (const k in prevProps) keys.push(k)
|
|
145
|
+
for (const k in nextProps) {
|
|
146
|
+
if (!(k in prevProps)) keys.push(k)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
for (let i = 0; i < keys.length; i++) {
|
|
150
|
+
const key = keys[i]
|
|
151
|
+
const prevVal = prevProps[key]
|
|
152
|
+
const nextVal = nextProps[key]
|
|
163
153
|
|
|
164
154
|
if (propFilters.isEvent(key)) {
|
|
165
|
-
if (
|
|
155
|
+
if (prevVal !== nextVal || isHydration) {
|
|
166
156
|
const evtName = key.replace(EVENT_PREFIX_REGEX, "")
|
|
157
|
+
const isFocus = evtName === "focus" || evtName === "blur"
|
|
158
|
+
const wrappedMap = vNodeToWrappedFocusEventHandlersMap.get(vNode)
|
|
167
159
|
|
|
168
|
-
const isFocusEvent = evtName === "focus" || evtName === "blur"
|
|
169
160
|
if (key in prevProps) {
|
|
170
161
|
dom.removeEventListener(
|
|
171
162
|
evtName,
|
|
172
|
-
|
|
173
|
-
? vNodeToWrappedFocusEventHandlersMap.get(vNode)?.[evtName]
|
|
174
|
-
: prev
|
|
163
|
+
isFocus ? wrappedMap?.[evtName] : prevVal
|
|
175
164
|
)
|
|
176
165
|
}
|
|
166
|
+
|
|
177
167
|
if (key in nextProps) {
|
|
178
168
|
dom.addEventListener(
|
|
179
169
|
evtName,
|
|
180
|
-
|
|
170
|
+
isFocus ? wrapFocusEventHandler(vNode, evtName, nextVal) : nextVal
|
|
181
171
|
)
|
|
182
172
|
}
|
|
183
173
|
}
|
|
184
|
-
|
|
174
|
+
continue
|
|
185
175
|
}
|
|
186
176
|
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
177
|
+
if (propFilters.isInternalProp(key) && key !== "innerHTML") {
|
|
178
|
+
continue
|
|
179
|
+
}
|
|
191
180
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
v && (v(), delete vNode.cleanups[key])
|
|
195
|
-
}
|
|
196
|
-
if (Signal.isSignal(next)) {
|
|
197
|
-
return setSignalProp(vNode, dom, key, next, prev)
|
|
198
|
-
}
|
|
199
|
-
setProp(dom, key, next, prev)
|
|
200
|
-
return
|
|
181
|
+
if (prevVal === nextVal) {
|
|
182
|
+
continue
|
|
201
183
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
184
|
+
|
|
185
|
+
if (Signal.isSignal(prevVal) && cleanups) {
|
|
186
|
+
const disposer = cleanups[key]
|
|
187
|
+
if (disposer) {
|
|
188
|
+
disposer()
|
|
189
|
+
delete cleanups[key]
|
|
190
|
+
}
|
|
205
191
|
}
|
|
206
|
-
|
|
207
|
-
if (
|
|
208
|
-
dom
|
|
192
|
+
|
|
193
|
+
if (Signal.isSignal(nextVal)) {
|
|
194
|
+
setSignalProp(vNode, dom, key, nextVal, prevVal)
|
|
195
|
+
continue
|
|
209
196
|
}
|
|
210
|
-
|
|
197
|
+
|
|
198
|
+
setProp(dom, key, nextVal, prevVal)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const prevRef = prevProps.ref
|
|
202
|
+
const nextRef = nextProps.ref
|
|
203
|
+
if (prevRef !== nextRef) {
|
|
204
|
+
if (prevRef) setRef(prevRef, null)
|
|
205
|
+
if (nextRef) setRef(nextRef, dom)
|
|
206
|
+
}
|
|
211
207
|
}
|
|
212
208
|
|
|
213
209
|
function deriveSelectElementValue(dom: HTMLSelectElement) {
|
|
@@ -248,6 +244,7 @@ function setSignalProp(
|
|
|
248
244
|
const [modifier, attr] = key.split(":")
|
|
249
245
|
if (modifier !== "bind") {
|
|
250
246
|
cleanups[key] = signal.subscribe((value, prev) => {
|
|
247
|
+
if (value === prev) return
|
|
251
248
|
setProp(dom, key, value, prev)
|
|
252
249
|
if (__DEV__) {
|
|
253
250
|
window.__kiru.profilingContext?.emit(
|
|
@@ -257,7 +254,11 @@ function setSignalProp(
|
|
|
257
254
|
}
|
|
258
255
|
})
|
|
259
256
|
|
|
260
|
-
|
|
257
|
+
const value = signal.peek()
|
|
258
|
+
const prev = unwrap(prevValue)
|
|
259
|
+
if (value === prev) return
|
|
260
|
+
setProp(dom, key, value, prev)
|
|
261
|
+
return
|
|
261
262
|
}
|
|
262
263
|
|
|
263
264
|
const evtName = bindAttrToEventMap[attr]
|
|
@@ -285,7 +286,7 @@ function setSignalProp(
|
|
|
285
286
|
|
|
286
287
|
const setSigFromElement = (val: any) => {
|
|
287
288
|
signal.sneak(val)
|
|
288
|
-
signal.notify(
|
|
289
|
+
signal.notify((sub) => sub !== signalUpdateCallback)
|
|
289
290
|
}
|
|
290
291
|
|
|
291
292
|
let evtHandler: (evt: Event) => void
|
|
@@ -323,7 +324,10 @@ function setSignalProp(
|
|
|
323
324
|
unsub()
|
|
324
325
|
}
|
|
325
326
|
|
|
326
|
-
|
|
327
|
+
const value = signal.peek()
|
|
328
|
+
const prev = unwrap(prevValue)
|
|
329
|
+
if (value === prev) return
|
|
330
|
+
setProp(dom, attr, value, prev)
|
|
327
331
|
}
|
|
328
332
|
|
|
329
333
|
function subTextNode(vNode: VNode, textNode: Text, signal: Signal<string>) {
|
|
@@ -373,7 +377,7 @@ function hydrateDom(vNode: VNode) {
|
|
|
373
377
|
}
|
|
374
378
|
vNode.dom = dom
|
|
375
379
|
if (vNode.type !== "#text" && !(vNode.flags & FLAG_STATIC_DOM)) {
|
|
376
|
-
updateDom(vNode)
|
|
380
|
+
updateDom(vNode as DomVNode)
|
|
377
381
|
return
|
|
378
382
|
}
|
|
379
383
|
if (Signal.isSignal(vNode.props.nodeValue)) {
|
|
@@ -449,7 +453,6 @@ function setProp(
|
|
|
449
453
|
value: unknown,
|
|
450
454
|
prev: unknown
|
|
451
455
|
) {
|
|
452
|
-
if (value === prev) return
|
|
453
456
|
switch (key) {
|
|
454
457
|
case "style":
|
|
455
458
|
return setStyleProp(element, value, prev)
|
|
@@ -706,10 +709,12 @@ function commitDeletion(vNode: VNode) {
|
|
|
706
709
|
}
|
|
707
710
|
|
|
708
711
|
if (dom) {
|
|
709
|
-
if (ref) setDomRef(ref as Kiru.Ref<SomeDom>, null)
|
|
710
712
|
if (dom.isConnected && !(node.flags & FLAG_STATIC_DOM)) {
|
|
711
713
|
dom.remove()
|
|
712
714
|
}
|
|
715
|
+
if (ref) {
|
|
716
|
+
setRef(ref, null)
|
|
717
|
+
}
|
|
713
718
|
delete node.dom
|
|
714
719
|
}
|
|
715
720
|
})
|