kiru 0.54.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{appContext.d.ts → appHandle.d.ts} +4 -4
- package/dist/appHandle.d.ts.map +1 -0
- package/dist/{appContext.js → appHandle.js} +12 -9
- package/dist/appHandle.js.map +1 -0
- package/dist/components/derive.d.ts +10 -8
- package/dist/components/derive.d.ts.map +1 -1
- package/dist/components/derive.js +50 -47
- package/dist/components/derive.js.map +1 -1
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/lazy.d.ts.map +1 -1
- package/dist/components/lazy.js +5 -4
- package/dist/components/lazy.js.map +1 -1
- package/dist/components/portal.d.ts.map +1 -1
- package/dist/components/portal.js +2 -3
- package/dist/components/portal.js.map +1 -1
- package/dist/components/transition.d.ts +3 -2
- package/dist/components/transition.d.ts.map +1 -1
- package/dist/components/transition.js +29 -26
- package/dist/components/transition.js.map +1 -1
- package/dist/constants.d.ts +1 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -5
- package/dist/constants.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +25 -19
- package/dist/context.js.map +1 -1
- package/dist/devtools.d.ts +7 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +15 -0
- package/dist/devtools.js.map +1 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +25 -58
- package/dist/dom.js.map +1 -1
- package/dist/globalContext.d.ts +15 -16
- package/dist/globalContext.d.ts.map +1 -1
- package/dist/globalContext.js +36 -46
- package/dist/globalContext.js.map +1 -1
- package/dist/globals.d.ts +1 -4
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js +1 -4
- package/dist/globals.js.map +1 -1
- package/dist/headlessRender.d.ts +6 -0
- package/dist/headlessRender.d.ts.map +1 -0
- package/dist/{recursiveRender.js → headlessRender.js} +17 -16
- package/dist/headlessRender.js.map +1 -0
- package/dist/hmr.d.ts +5 -7
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +27 -32
- package/dist/hmr.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -14
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -14
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/onBeforeMount.d.ts +9 -0
- package/dist/hooks/onBeforeMount.d.ts.map +1 -0
- package/dist/hooks/onBeforeMount.js +12 -0
- package/dist/hooks/onBeforeMount.js.map +1 -0
- package/dist/hooks/onCleanup.d.ts +8 -0
- package/dist/hooks/onCleanup.d.ts.map +1 -0
- package/dist/hooks/onCleanup.js +15 -0
- package/dist/hooks/onCleanup.js.map +1 -0
- package/dist/hooks/onMount.d.ts +9 -0
- package/dist/hooks/onMount.d.ts.map +1 -0
- package/dist/hooks/onMount.js +12 -0
- package/dist/hooks/onMount.js.map +1 -0
- package/dist/hooks/utils.d.ts +2 -62
- package/dist/hooks/utils.d.ts.map +1 -1
- package/dist/hooks/utils.js +22 -144
- package/dist/hooks/utils.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/profiling.d.ts +15 -14
- package/dist/profiling.d.ts.map +1 -1
- package/dist/profiling.js +9 -4
- package/dist/profiling.js.map +1 -1
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +12 -25
- package/dist/reconciler.js.map +1 -1
- package/dist/ref.d.ts +4 -0
- package/dist/ref.d.ts.map +1 -0
- package/dist/ref.js +4 -0
- package/dist/ref.js.map +1 -0
- package/dist/renderToString.js +1 -1
- package/dist/renderToString.js.map +1 -1
- package/dist/router/context.d.ts.map +1 -1
- package/dist/router/context.js +1 -2
- package/dist/router/context.js.map +1 -1
- package/dist/router/fileRouter.d.ts +1 -1
- package/dist/router/fileRouter.d.ts.map +1 -1
- package/dist/router/fileRouter.js +17 -11
- package/dist/router/fileRouter.js.map +1 -1
- package/dist/router/fileRouterController.d.ts.map +1 -1
- package/dist/router/fileRouterController.js +68 -55
- package/dist/router/fileRouterController.js.map +1 -1
- package/dist/router/link.d.ts.map +1 -1
- package/dist/router/link.js +19 -23
- package/dist/router/link.js.map +1 -1
- package/dist/router/server/index.d.ts.map +1 -1
- package/dist/router/server/index.js +14 -11
- package/dist/router/server/index.js.map +1 -1
- package/dist/router/types.d.ts +11 -6
- package/dist/router/types.d.ts.map +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +65 -52
- package/dist/scheduler.js.map +1 -1
- package/dist/signals/base.d.ts +0 -1
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +13 -36
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts +0 -2
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +1 -40
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/effect.d.ts +15 -14
- package/dist/signals/effect.d.ts.map +1 -1
- package/dist/signals/effect.js +65 -37
- package/dist/signals/effect.js.map +1 -1
- package/dist/signals/globals.d.ts +0 -5
- package/dist/signals/globals.d.ts.map +1 -1
- package/dist/signals/globals.js +0 -6
- package/dist/signals/globals.js.map +1 -1
- package/dist/signals/index.d.ts +4 -4
- package/dist/signals/index.d.ts.map +1 -1
- package/dist/signals/index.js +4 -4
- package/dist/signals/index.js.map +1 -1
- package/dist/signals/{for.d.ts → jsx.d.ts} +8 -1
- package/dist/signals/jsx.d.ts.map +1 -0
- package/dist/signals/{for.js → jsx.js} +4 -1
- package/dist/signals/jsx.js.map +1 -0
- package/dist/signals/tracking.d.ts +23 -0
- package/dist/signals/tracking.d.ts.map +1 -0
- package/dist/signals/tracking.js +51 -0
- package/dist/signals/tracking.js.map +1 -0
- package/dist/signals/types.d.ts +1 -1
- package/dist/signals/types.d.ts.map +1 -1
- package/dist/signals/utils.d.ts +2 -1
- package/dist/signals/utils.d.ts.map +1 -1
- package/dist/signals/utils.js +9 -2
- package/dist/signals/utils.js.map +1 -1
- package/dist/ssr/client.d.ts +3 -3
- package/dist/ssr/client.d.ts.map +1 -1
- package/dist/ssr/client.js.map +1 -1
- package/dist/ssr/server.js +1 -1
- package/dist/ssr/server.js.map +1 -1
- package/dist/statefulPromise.d.ts +22 -0
- package/dist/statefulPromise.d.ts.map +1 -0
- package/dist/statefulPromise.js +94 -0
- package/dist/statefulPromise.js.map +1 -0
- package/dist/types.d.ts +36 -50
- package/dist/types.d.ts.map +1 -1
- package/dist/types.dom.d.ts +4 -7
- package/dist/types.dom.d.ts.map +1 -1
- package/dist/types.utils.d.ts +3 -4
- package/dist/types.utils.d.ts.map +1 -1
- package/dist/utils/vdom.d.ts +8 -6
- package/dist/utils/vdom.d.ts.map +1 -1
- package/dist/utils/vdom.js +32 -9
- package/dist/utils/vdom.js.map +1 -1
- package/dist/viewTransitions.d.ts +7 -0
- package/dist/viewTransitions.d.ts.map +1 -0
- package/dist/viewTransitions.js +71 -0
- package/dist/viewTransitions.js.map +1 -0
- package/package.json +1 -1
- package/src/{appContext.ts → appHandle.ts} +21 -16
- package/src/components/derive.ts +74 -69
- package/src/components/index.ts +0 -1
- package/src/components/lazy.ts +5 -4
- package/src/components/portal.ts +2 -3
- package/src/components/transition.ts +33 -35
- package/src/constants.ts +0 -8
- package/src/context.ts +30 -23
- package/src/devtools.ts +16 -0
- package/src/dom.ts +29 -63
- package/src/globalContext.ts +57 -74
- package/src/globals.ts +1 -5
- package/src/{recursiveRender.ts → headlessRender.ts} +18 -18
- package/src/hmr.ts +29 -38
- package/src/hooks/index.ts +3 -14
- package/src/hooks/onBeforeMount.ts +12 -0
- package/src/hooks/onCleanup.ts +15 -0
- package/src/hooks/onMount.ts +12 -0
- package/src/hooks/utils.ts +28 -238
- package/src/index.ts +14 -6
- package/src/profiling.ts +22 -20
- package/src/reconciler.ts +18 -30
- package/src/ref.ts +6 -0
- package/src/renderToString.ts +1 -1
- package/src/router/context.ts +1 -2
- package/src/router/fileRouter.ts +23 -13
- package/src/router/fileRouterController.ts +72 -64
- package/src/router/link.ts +11 -25
- package/src/router/server/index.ts +24 -13
- package/src/router/types.ts +15 -8
- package/src/scheduler.ts +74 -71
- package/src/signals/base.ts +12 -41
- package/src/signals/computed.ts +1 -62
- package/src/signals/effect.ts +95 -48
- package/src/signals/globals.ts +0 -7
- package/src/signals/index.ts +4 -4
- package/src/signals/{for.ts → jsx.ts} +10 -0
- package/src/signals/tracking.ts +69 -0
- package/src/signals/types.ts +1 -1
- package/src/signals/utils.ts +9 -1
- package/src/ssr/client.ts +4 -4
- package/src/ssr/server.ts +2 -2
- package/src/statefulPromise.ts +136 -0
- package/src/types.dom.ts +4 -8
- package/src/types.ts +45 -58
- package/src/types.utils.ts +3 -4
- package/src/utils/vdom.ts +44 -15
- package/src/viewTransitions.ts +88 -0
- package/dist/appContext.d.ts.map +0 -1
- package/dist/appContext.js.map +0 -1
- package/dist/components/memo.d.ts +0 -10
- package/dist/components/memo.d.ts.map +0 -1
- package/dist/components/memo.js +0 -23
- package/dist/components/memo.js.map +0 -1
- package/dist/form/index.d.ts +0 -4
- package/dist/form/index.d.ts.map +0 -1
- package/dist/form/index.js +0 -518
- package/dist/form/index.js.map +0 -1
- package/dist/form/types.d.ts +0 -122
- package/dist/form/types.d.ts.map +0 -1
- package/dist/form/types.js +0 -2
- package/dist/form/types.js.map +0 -1
- package/dist/form/utils.d.ts +0 -3
- package/dist/form/utils.d.ts.map +0 -1
- package/dist/form/utils.js +0 -16
- package/dist/form/utils.js.map +0 -1
- package/dist/hooks/useAsync.d.ts +0 -18
- package/dist/hooks/useAsync.d.ts.map +0 -1
- package/dist/hooks/useAsync.js +0 -96
- package/dist/hooks/useAsync.js.map +0 -1
- package/dist/hooks/useCallback.d.ts +0 -7
- package/dist/hooks/useCallback.d.ts.map +0 -1
- package/dist/hooks/useCallback.js +0 -30
- package/dist/hooks/useCallback.js.map +0 -1
- package/dist/hooks/useContext.d.ts +0 -7
- package/dist/hooks/useContext.d.ts.map +0 -1
- package/dist/hooks/useContext.js +0 -59
- package/dist/hooks/useContext.js.map +0 -1
- package/dist/hooks/useEffect.d.ts +0 -8
- package/dist/hooks/useEffect.d.ts.map +0 -1
- package/dist/hooks/useEffect.js +0 -34
- package/dist/hooks/useEffect.js.map +0 -1
- package/dist/hooks/useEffectEvent.d.ts +0 -8
- package/dist/hooks/useEffectEvent.d.ts.map +0 -1
- package/dist/hooks/useEffectEvent.js +0 -23
- package/dist/hooks/useEffectEvent.js.map +0 -1
- package/dist/hooks/useId.d.ts +0 -8
- package/dist/hooks/useId.d.ts.map +0 -1
- package/dist/hooks/useId.js +0 -35
- package/dist/hooks/useId.js.map +0 -1
- package/dist/hooks/useLayoutEffect.d.ts +0 -8
- package/dist/hooks/useLayoutEffect.d.ts.map +0 -1
- package/dist/hooks/useLayoutEffect.js +0 -34
- package/dist/hooks/useLayoutEffect.js.map +0 -1
- package/dist/hooks/useMemo.d.ts +0 -8
- package/dist/hooks/useMemo.d.ts.map +0 -1
- package/dist/hooks/useMemo.js +0 -31
- package/dist/hooks/useMemo.js.map +0 -1
- package/dist/hooks/usePromise.d.ts +0 -8
- package/dist/hooks/usePromise.d.ts.map +0 -1
- package/dist/hooks/usePromise.js +0 -90
- package/dist/hooks/usePromise.js.map +0 -1
- package/dist/hooks/useReducer.d.ts +0 -7
- package/dist/hooks/useReducer.d.ts.map +0 -1
- package/dist/hooks/useReducer.js +0 -44
- package/dist/hooks/useReducer.js.map +0 -1
- package/dist/hooks/useRef.d.ts +0 -10
- package/dist/hooks/useRef.d.ts.map +0 -1
- package/dist/hooks/useRef.js +0 -29
- package/dist/hooks/useRef.js.map +0 -1
- package/dist/hooks/useState.d.ts +0 -7
- package/dist/hooks/useState.d.ts.map +0 -1
- package/dist/hooks/useState.js +0 -54
- package/dist/hooks/useState.js.map +0 -1
- package/dist/hooks/useSyncExternalStore.d.ts +0 -8
- package/dist/hooks/useSyncExternalStore.d.ts.map +0 -1
- package/dist/hooks/useSyncExternalStore.js +0 -50
- package/dist/hooks/useSyncExternalStore.js.map +0 -1
- package/dist/hooks/useViewTransition.d.ts +0 -10
- package/dist/hooks/useViewTransition.d.ts.map +0 -1
- package/dist/hooks/useViewTransition.js +0 -27
- package/dist/hooks/useViewTransition.js.map +0 -1
- package/dist/recursiveRender.d.ts +0 -7
- package/dist/recursiveRender.d.ts.map +0 -1
- package/dist/recursiveRender.js.map +0 -1
- package/dist/signals/for.d.ts.map +0 -1
- package/dist/signals/for.js.map +0 -1
- package/dist/signals/watch.d.ts +0 -21
- package/dist/signals/watch.d.ts.map +0 -1
- package/dist/signals/watch.js +0 -86
- package/dist/signals/watch.js.map +0 -1
- package/dist/store.d.ts +0 -28
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -166
- package/dist/store.js.map +0 -1
- package/dist/swr.d.ts +0 -63
- package/dist/swr.d.ts.map +0 -1
- package/dist/swr.js +0 -236
- package/dist/swr.js.map +0 -1
- package/dist/utils/promise.d.ts +0 -16
- package/dist/utils/promise.d.ts.map +0 -1
- package/dist/utils/promise.js +0 -14
- package/dist/utils/promise.js.map +0 -1
- package/src/components/memo.ts +0 -39
- package/src/form/index.ts +0 -676
- package/src/form/types.ts +0 -262
- package/src/form/utils.ts +0 -19
- package/src/hooks/useAsync.ts +0 -121
- package/src/hooks/useCallback.ts +0 -32
- package/src/hooks/useContext.ts +0 -79
- package/src/hooks/useEffect.ts +0 -40
- package/src/hooks/useEffectEvent.ts +0 -24
- package/src/hooks/useId.ts +0 -42
- package/src/hooks/useLayoutEffect.ts +0 -43
- package/src/hooks/useMemo.ts +0 -34
- package/src/hooks/usePromise.ts +0 -126
- package/src/hooks/useReducer.ts +0 -50
- package/src/hooks/useRef.ts +0 -41
- package/src/hooks/useState.ts +0 -62
- package/src/hooks/useSyncExternalStore.ts +0 -59
- package/src/hooks/useViewTransition.ts +0 -25
- package/src/signals/watch.ts +0 -139
- package/src/store.ts +0 -245
- package/src/swr.ts +0 -351
- package/src/utils/promise.ts +0 -26
package/src/store.ts
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import type { Prettify } from "./types.utils.js"
|
|
2
|
-
import { __DEV__ } from "./env.js"
|
|
3
|
-
import { useHook } from "./hooks/utils.js"
|
|
4
|
-
import { $HMR_ACCEPT } from "./constants.js"
|
|
5
|
-
import { HMRAccept } from "./hmr.js"
|
|
6
|
-
import {
|
|
7
|
-
safeStringify,
|
|
8
|
-
shallowCompare,
|
|
9
|
-
sideEffectsEnabled,
|
|
10
|
-
} from "./utils/index.js"
|
|
11
|
-
|
|
12
|
-
export { createStore }
|
|
13
|
-
export type { Store, MethodFactory }
|
|
14
|
-
|
|
15
|
-
type MethodFactory<T> = (
|
|
16
|
-
setState: (setter: Kiru.StateSetter<T>) => void,
|
|
17
|
-
getState: () => T
|
|
18
|
-
) => Record<string, Function>
|
|
19
|
-
|
|
20
|
-
type StoreHook<T, U extends Record<string, Function>> = {
|
|
21
|
-
<R>(sliceFn: (state: T) => R): Prettify<{ value: R } & U>
|
|
22
|
-
<
|
|
23
|
-
F extends null | ((state: T) => unknown),
|
|
24
|
-
R extends F extends Function ? ReturnType<F> : T
|
|
25
|
-
>(
|
|
26
|
-
sliceFn: F,
|
|
27
|
-
equality: (prev: R, next: R, compare: typeof shallowCompare) => boolean
|
|
28
|
-
): Prettify<{ value: R } & U>
|
|
29
|
-
(): Prettify<{ value: T } & U>
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
type Subscribe<T> = {
|
|
33
|
-
(fn: (value: T) => void): () => void
|
|
34
|
-
<R>(sliceFn: (value: T) => R, fn: (value: R) => void): () => void
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type Store<T, U extends Record<string, Function>> = StoreHook<T, U> & {
|
|
38
|
-
getState: () => T
|
|
39
|
-
setState: (setter: Kiru.StateSetter<T>) => void
|
|
40
|
-
methods: U
|
|
41
|
-
subscribe: Subscribe<T>
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type NodeState = {
|
|
45
|
-
update: () => void
|
|
46
|
-
slices: {
|
|
47
|
-
sliceFn: Function | null
|
|
48
|
-
eq:
|
|
49
|
-
| ((prev: any, next: any, compare: typeof shallowCompare) => boolean)
|
|
50
|
-
| undefined
|
|
51
|
-
value: any
|
|
52
|
-
}[]
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
type InternalStoreState<T, U extends MethodFactory<T>> = {
|
|
56
|
-
value: T
|
|
57
|
-
epoch: number
|
|
58
|
-
subscribers: Set<Kiru.VNode | Function>
|
|
59
|
-
nodeStateMap: WeakMap<Kiru.VNode, NodeState>
|
|
60
|
-
methods: ReturnType<U>
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function createStore<T, U extends MethodFactory<T>>(
|
|
64
|
-
initial: T,
|
|
65
|
-
methodFactory: U
|
|
66
|
-
): Store<T, ReturnType<U>> {
|
|
67
|
-
const state = {
|
|
68
|
-
$initial: null as string | null,
|
|
69
|
-
current: {
|
|
70
|
-
value: initial,
|
|
71
|
-
epoch: 0,
|
|
72
|
-
subscribers: new Set<Kiru.VNode | Function>(),
|
|
73
|
-
nodeStateMap: new WeakMap<Kiru.VNode, NodeState>(),
|
|
74
|
-
methods: null as any as ReturnType<U>,
|
|
75
|
-
} satisfies InternalStoreState<T, U>,
|
|
76
|
-
}
|
|
77
|
-
if (__DEV__) {
|
|
78
|
-
state.$initial = safeStringify(initial)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const getState = () => state.current.value
|
|
82
|
-
|
|
83
|
-
const setState = (setter: Kiru.StateSetter<T>) => {
|
|
84
|
-
state.current.value =
|
|
85
|
-
typeof setter === "function"
|
|
86
|
-
? (setter as Function)(state.current.value)
|
|
87
|
-
: setter
|
|
88
|
-
|
|
89
|
-
const { value, subscribers, nodeStateMap } = state.current
|
|
90
|
-
|
|
91
|
-
subscribers.forEach((n) => {
|
|
92
|
-
if (typeof n === "function") return n(value)
|
|
93
|
-
const nodeState = nodeStateMap.get(n)
|
|
94
|
-
if (!nodeState) return
|
|
95
|
-
const { slices, update } = nodeState
|
|
96
|
-
let computeChanged = slices.length === 0
|
|
97
|
-
|
|
98
|
-
for (let i = 0; i < slices.length; i++) {
|
|
99
|
-
const slice = slices[i]
|
|
100
|
-
if (!slice) continue
|
|
101
|
-
const { sliceFn, eq, value: sliceVal } = slice
|
|
102
|
-
const newSliceVal = sliceFn === null ? value : sliceFn(value)
|
|
103
|
-
slices[i] = { sliceFn, eq, value: newSliceVal }
|
|
104
|
-
|
|
105
|
-
if (computeChanged) continue
|
|
106
|
-
if (eq && eq(sliceVal, newSliceVal, shallowCompare)) {
|
|
107
|
-
continue
|
|
108
|
-
} else if (!eq && shallowCompare(sliceVal, newSliceVal)) {
|
|
109
|
-
continue
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
computeChanged = true
|
|
113
|
-
}
|
|
114
|
-
if (computeChanged) {
|
|
115
|
-
update()
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
state.current.epoch++
|
|
119
|
-
}
|
|
120
|
-
state.current.methods = methodFactory(setState, getState) as ReturnType<U>
|
|
121
|
-
|
|
122
|
-
function useStore<R>(
|
|
123
|
-
sliceFn: null | ((state: T) => R) = null,
|
|
124
|
-
equality?: (prev: R, next: R, compare: typeof shallowCompare) => boolean
|
|
125
|
-
) {
|
|
126
|
-
if (!sideEffectsEnabled()) {
|
|
127
|
-
return {
|
|
128
|
-
value: sliceFn ? sliceFn(state.current.value) : state.current.value,
|
|
129
|
-
...state.current.methods,
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return useHook(
|
|
133
|
-
"useStore",
|
|
134
|
-
{ value: null as any as T | R, lastChangeSync: -1 },
|
|
135
|
-
({ hook, isInit, isHMR, vNode, index, update }) => {
|
|
136
|
-
if (__DEV__) {
|
|
137
|
-
if (isInit) {
|
|
138
|
-
hook.dev = {
|
|
139
|
-
devtools: {
|
|
140
|
-
get: () => ({ value: hook.value }),
|
|
141
|
-
},
|
|
142
|
-
initialArgs: [sliceFn, equality],
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (isHMR) {
|
|
146
|
-
const [fn, eq] = hook.dev!.initialArgs
|
|
147
|
-
if (fn !== sliceFn || eq !== equality) {
|
|
148
|
-
isInit = true
|
|
149
|
-
hook.dev!.initialArgs = [sliceFn, equality]
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
const { subscribers, nodeStateMap, epoch, value, methods } =
|
|
154
|
-
state.current
|
|
155
|
-
|
|
156
|
-
const nodeState = nodeStateMap.get(vNode) ?? {
|
|
157
|
-
slices: [],
|
|
158
|
-
update,
|
|
159
|
-
}
|
|
160
|
-
let slice: (typeof nodeState.slices)[number]
|
|
161
|
-
if (isInit || !nodeState.slices[index]) {
|
|
162
|
-
subscribers.add(vNode)
|
|
163
|
-
hook.lastChangeSync = epoch
|
|
164
|
-
hook.value = sliceFn === null ? value : sliceFn(value)
|
|
165
|
-
slice = nodeState.slices[index] = {
|
|
166
|
-
sliceFn,
|
|
167
|
-
eq: equality,
|
|
168
|
-
value: hook.value,
|
|
169
|
-
}
|
|
170
|
-
nodeStateMap.set(vNode, nodeState)
|
|
171
|
-
|
|
172
|
-
hook.cleanup = () => {
|
|
173
|
-
nodeStateMap.delete(vNode)
|
|
174
|
-
subscribers.delete(vNode)
|
|
175
|
-
}
|
|
176
|
-
} else {
|
|
177
|
-
slice = nodeState.slices[index]
|
|
178
|
-
if (slice.sliceFn !== sliceFn) {
|
|
179
|
-
slice.value = hook.value = sliceFn ? sliceFn(value) : value
|
|
180
|
-
slice.sliceFn = sliceFn
|
|
181
|
-
}
|
|
182
|
-
slice.eq = equality
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (hook.lastChangeSync !== epoch) {
|
|
186
|
-
hook.value = slice ? slice.value : state.current.value
|
|
187
|
-
hook.lastChangeSync = epoch
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return { value: hook.value, ...methods }
|
|
191
|
-
}
|
|
192
|
-
)
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const store = Object.assign(useStore, {
|
|
196
|
-
get getState() {
|
|
197
|
-
return getState
|
|
198
|
-
},
|
|
199
|
-
get setState() {
|
|
200
|
-
return setState
|
|
201
|
-
},
|
|
202
|
-
get methods() {
|
|
203
|
-
return { ...state.current.methods }
|
|
204
|
-
},
|
|
205
|
-
subscribe: ((sliceOrCb, cb) => {
|
|
206
|
-
if (cb === undefined) {
|
|
207
|
-
state.current.subscribers.add(sliceOrCb)
|
|
208
|
-
return () => (state.current.subscribers.delete(sliceOrCb), void 0)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const selection = {
|
|
212
|
-
current: null as ReturnType<typeof sliceOrCb> | null,
|
|
213
|
-
}
|
|
214
|
-
const sliceWrapper = (newState: T) => {
|
|
215
|
-
const next = sliceOrCb(newState)
|
|
216
|
-
if (shallowCompare(next, selection.current)) return
|
|
217
|
-
selection.current = next
|
|
218
|
-
cb(next)
|
|
219
|
-
}
|
|
220
|
-
state.current.subscribers.add(sliceWrapper)
|
|
221
|
-
return () => (state.current.subscribers.delete(sliceWrapper), void 0)
|
|
222
|
-
}) as Subscribe<T>,
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
if (__DEV__) {
|
|
226
|
-
return Object.assign(store, {
|
|
227
|
-
[$HMR_ACCEPT]: {
|
|
228
|
-
provide: () => state,
|
|
229
|
-
inject: (prev) => {
|
|
230
|
-
state.current = prev.current
|
|
231
|
-
state.current.methods = methodFactory(
|
|
232
|
-
setState,
|
|
233
|
-
getState
|
|
234
|
-
) as ReturnType<U>
|
|
235
|
-
if (state.$initial !== prev.$initial) {
|
|
236
|
-
setState(initial)
|
|
237
|
-
}
|
|
238
|
-
},
|
|
239
|
-
destroy: () => {},
|
|
240
|
-
} satisfies HMRAccept<typeof state>,
|
|
241
|
-
})
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return store
|
|
245
|
-
}
|
package/src/swr.ts
DELETED
|
@@ -1,351 +0,0 @@
|
|
|
1
|
-
import { __DEV__ } from "./env.js"
|
|
2
|
-
import { useHook } from "./hooks/utils.js"
|
|
3
|
-
import { Signal } from "./signals/base.js"
|
|
4
|
-
import { AsyncTaskState } from "./types.utils.js"
|
|
5
|
-
import {
|
|
6
|
-
deepCompare,
|
|
7
|
-
noop,
|
|
8
|
-
safeStringify,
|
|
9
|
-
shallowCompare,
|
|
10
|
-
sideEffectsEnabled,
|
|
11
|
-
} from "./utils/index.js"
|
|
12
|
-
|
|
13
|
-
export type UseSWRState<T> = AsyncTaskState<T, UseSWRError> & {
|
|
14
|
-
mutate: (callback: () => Promise<T>) => void
|
|
15
|
-
isMutating: Signal<boolean>
|
|
16
|
-
isValidating: Signal<boolean>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class UseSWRError extends Error {
|
|
20
|
-
constructor(message: unknown) {
|
|
21
|
-
super(message instanceof Error ? message.message : String(message))
|
|
22
|
-
this.name = "UseSWRError"
|
|
23
|
-
this.cause = message
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type SWRResourceState<T> = {
|
|
28
|
-
data: T | null
|
|
29
|
-
loading: boolean
|
|
30
|
-
error: Error | null
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export type SWRRetryState = {
|
|
34
|
-
count: number
|
|
35
|
-
timeout: number
|
|
36
|
-
delay: number
|
|
37
|
-
} | null
|
|
38
|
-
|
|
39
|
-
export interface SWRCacheEntry<T> {
|
|
40
|
-
key: any
|
|
41
|
-
resource: Signal<SWRResourceState<T>>
|
|
42
|
-
fetcher: (args: any) => Promise<T>
|
|
43
|
-
subscribers: Set<SWRHook>
|
|
44
|
-
isMutating: Signal<boolean>
|
|
45
|
-
isValidating: Signal<boolean>
|
|
46
|
-
retryState: SWRRetryState
|
|
47
|
-
options: SWROptions
|
|
48
|
-
refreshInterval?: number
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export type SWRCache = Map<string, SWRCacheEntry<any>>
|
|
52
|
-
|
|
53
|
-
export interface SWROptions {
|
|
54
|
-
/**
|
|
55
|
-
* Specify `false` to disable revalidation on focus
|
|
56
|
-
*/
|
|
57
|
-
revalidateOnFocus?: boolean
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Number of times to retry a failed fetch
|
|
61
|
-
* @default Infinity
|
|
62
|
-
*/
|
|
63
|
-
maxRetryCount?: number
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Enable automatic refetching of stale data every `refreshInterval` milliseconds
|
|
67
|
-
*/
|
|
68
|
-
refreshInterval?: number
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Enable refetching of stale data when offline - useful for offline-first apps
|
|
72
|
-
*/
|
|
73
|
-
refetchWhenOffline?: boolean
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
type SWRHook = Kiru.Hook<{
|
|
77
|
-
strKey: string
|
|
78
|
-
options: SWROptions
|
|
79
|
-
update: () => void
|
|
80
|
-
}>
|
|
81
|
-
|
|
82
|
-
type SWRTupleKey = readonly [any, ...unknown[]]
|
|
83
|
-
export type SWRKey =
|
|
84
|
-
| string
|
|
85
|
-
| SWRTupleKey
|
|
86
|
-
| Record<any, any>
|
|
87
|
-
| null
|
|
88
|
-
| undefined
|
|
89
|
-
| false
|
|
90
|
-
|
|
91
|
-
const SWRGlobalState = {
|
|
92
|
-
cache: null as any as SWRCache,
|
|
93
|
-
online: false,
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if ("window" in globalThis) {
|
|
97
|
-
if (__DEV__) {
|
|
98
|
-
SWRGlobalState.cache = window.__kiru.SWRGlobalCache ??= new Map()
|
|
99
|
-
} else {
|
|
100
|
-
SWRGlobalState.cache = new Map()
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
SWRGlobalState.online = navigator.onLine
|
|
104
|
-
window.addEventListener("online", () => {
|
|
105
|
-
SWRGlobalState.online = true
|
|
106
|
-
})
|
|
107
|
-
window.addEventListener("offline", () => {
|
|
108
|
-
SWRGlobalState.online = false
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
let blurStart: number | null = null
|
|
112
|
-
window.addEventListener("blur", () => {
|
|
113
|
-
blurStart = Date.now()
|
|
114
|
-
})
|
|
115
|
-
window.addEventListener("focus", () => {
|
|
116
|
-
const blurDuration = blurStart ? Date.now() - blurStart : 0
|
|
117
|
-
blurStart = null
|
|
118
|
-
if (blurDuration < 3_000) return // only trigger revalidation after 3 seconds
|
|
119
|
-
|
|
120
|
-
SWRGlobalState.cache.forEach((entry) => {
|
|
121
|
-
if (
|
|
122
|
-
entry.subscribers.size === 0 ||
|
|
123
|
-
entry.options.revalidateOnFocus === false ||
|
|
124
|
-
(entry.options.refetchWhenOffline === false &&
|
|
125
|
-
SWRGlobalState.online === false)
|
|
126
|
-
) {
|
|
127
|
-
return
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
entry.isValidating.value = true
|
|
131
|
-
performFetch(entry, () => {
|
|
132
|
-
entry.isValidating.value = false
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function createSWRCacheEntry<T, K extends SWRKey>(
|
|
139
|
-
key: K,
|
|
140
|
-
fetcher: (args: K) => Promise<T>
|
|
141
|
-
) {
|
|
142
|
-
return {
|
|
143
|
-
key,
|
|
144
|
-
resource: new Signal<SWRResourceState<T>>({
|
|
145
|
-
data: null,
|
|
146
|
-
loading: true,
|
|
147
|
-
error: null,
|
|
148
|
-
}),
|
|
149
|
-
fetcher,
|
|
150
|
-
subscribers: new Set(),
|
|
151
|
-
isMutating: new Signal(false),
|
|
152
|
-
isValidating: new Signal(false),
|
|
153
|
-
retryState: null,
|
|
154
|
-
options: {},
|
|
155
|
-
} satisfies SWRCacheEntry<T>
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function preloadSWR<T>(
|
|
159
|
-
key: SWRKey,
|
|
160
|
-
fetcher: (args: SWRKey) => Promise<T>
|
|
161
|
-
) {
|
|
162
|
-
if (!("window" in globalThis)) return
|
|
163
|
-
|
|
164
|
-
const strKey = safeStringify(key, { functions: false })
|
|
165
|
-
if (!SWRGlobalState.cache.has(strKey)) {
|
|
166
|
-
const entry = createSWRCacheEntry(key, fetcher)
|
|
167
|
-
SWRGlobalState.cache.set(strKey, entry)
|
|
168
|
-
performFetch(entry)
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function getSWRState<T>(key: SWRKey): SWRCacheEntry<T> | null {
|
|
173
|
-
const strKey = safeStringify(key, { functions: false })
|
|
174
|
-
return SWRGlobalState.cache.get(strKey) ?? null
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export function useSWR<T, K extends SWRKey>(
|
|
178
|
-
key: K,
|
|
179
|
-
fetcher: (args: K) => Promise<T>,
|
|
180
|
-
options: SWROptions = {}
|
|
181
|
-
) {
|
|
182
|
-
if (!sideEffectsEnabled())
|
|
183
|
-
return { data: null, error: null, loading: true } as UseSWRState<T>
|
|
184
|
-
|
|
185
|
-
return useHook(
|
|
186
|
-
"useSWR",
|
|
187
|
-
{ strKey: "", options, update: noop } satisfies SWRHook,
|
|
188
|
-
({ hook, isInit, isHMR, update }) => {
|
|
189
|
-
if (__DEV__) {
|
|
190
|
-
if (isInit) {
|
|
191
|
-
hook.dev = {
|
|
192
|
-
devtools: {
|
|
193
|
-
get: () => ({
|
|
194
|
-
key: hook.strKey,
|
|
195
|
-
value: SWRGlobalState.cache.get(strKey)!,
|
|
196
|
-
}),
|
|
197
|
-
},
|
|
198
|
-
initialArgs: [key, options],
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (isHMR) {
|
|
202
|
-
const entry = SWRGlobalState.cache.get(hook.strKey)
|
|
203
|
-
const [k, o] = hook.dev!.initialArgs
|
|
204
|
-
hook.dev!.initialArgs = [key, options]
|
|
205
|
-
|
|
206
|
-
if (entry) {
|
|
207
|
-
if (!shallowCompare(k, key)) {
|
|
208
|
-
// if key changed, new entry will be created
|
|
209
|
-
} else if (
|
|
210
|
-
entry.fetcher !== fetcher ||
|
|
211
|
-
!shallowCompare(o, options)
|
|
212
|
-
) {
|
|
213
|
-
entry.fetcher = fetcher
|
|
214
|
-
entry.options = options
|
|
215
|
-
clearTimeout(entry.refreshInterval)
|
|
216
|
-
clearTimeout(entry.retryState?.timeout)
|
|
217
|
-
performFetch(entry)
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
hook.options = options
|
|
223
|
-
const strKey = safeStringify(key, { functions: false })
|
|
224
|
-
let entry: SWRCacheEntry<T>
|
|
225
|
-
if (isInit || strKey !== hook.strKey) {
|
|
226
|
-
if (strKey !== hook.strKey) {
|
|
227
|
-
hook.cleanup?.()
|
|
228
|
-
}
|
|
229
|
-
hook.strKey = strKey
|
|
230
|
-
hook.update = update
|
|
231
|
-
|
|
232
|
-
let isNewEntry = false
|
|
233
|
-
if (!SWRGlobalState.cache.has(strKey)) {
|
|
234
|
-
isNewEntry = true
|
|
235
|
-
entry = createSWRCacheEntry(key, fetcher)
|
|
236
|
-
SWRGlobalState.cache.set(strKey, entry)
|
|
237
|
-
|
|
238
|
-
entry.resource.subscribe(() => {
|
|
239
|
-
entry.subscribers.forEach((sub) => sub.update())
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
performFetch(entry)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
entry ??= SWRGlobalState.cache.get(strKey)!
|
|
246
|
-
const subs = entry.subscribers
|
|
247
|
-
if (subs.size === 0) {
|
|
248
|
-
if (!isNewEntry) {
|
|
249
|
-
entry.isValidating.value = true
|
|
250
|
-
performFetch(entry, () => {
|
|
251
|
-
entry.isValidating.value = false
|
|
252
|
-
})
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
entry.options = options
|
|
256
|
-
if (options.refreshInterval) {
|
|
257
|
-
entry.refreshInterval = window.setInterval(() => {
|
|
258
|
-
if (entry.subscribers.size === 0) return
|
|
259
|
-
performFetch(entry)
|
|
260
|
-
}, options.refreshInterval)
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
subs.add(hook)
|
|
264
|
-
hook.cleanup = () => {
|
|
265
|
-
subs.delete(hook)
|
|
266
|
-
if (entry.subscribers.size === 0) {
|
|
267
|
-
window.clearInterval(entry.refreshInterval)
|
|
268
|
-
window.clearTimeout(entry.retryState?.timeout)
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
entry ??= SWRGlobalState.cache.get(strKey)!
|
|
274
|
-
const { resource, isMutating, isValidating } = entry
|
|
275
|
-
const { data, loading, error } = resource.peek()
|
|
276
|
-
|
|
277
|
-
const mutate: UseSWRState<T>["mutate"] = (callback) => {
|
|
278
|
-
isMutating.value = true
|
|
279
|
-
callback()
|
|
280
|
-
.then((data) => {
|
|
281
|
-
if (entry.retryState) {
|
|
282
|
-
window.clearTimeout(entry.retryState.timeout)
|
|
283
|
-
entry.retryState = null
|
|
284
|
-
entry.isValidating.value = false
|
|
285
|
-
}
|
|
286
|
-
const prev = resource.peek().data
|
|
287
|
-
if (deepCompare(prev, data)) return
|
|
288
|
-
resource.value = {
|
|
289
|
-
data,
|
|
290
|
-
loading: false,
|
|
291
|
-
error: null,
|
|
292
|
-
}
|
|
293
|
-
})
|
|
294
|
-
.finally(() => {
|
|
295
|
-
isMutating.value = false
|
|
296
|
-
})
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
return {
|
|
300
|
-
data,
|
|
301
|
-
loading,
|
|
302
|
-
error,
|
|
303
|
-
isMutating,
|
|
304
|
-
isValidating,
|
|
305
|
-
mutate,
|
|
306
|
-
} as UseSWRState<T>
|
|
307
|
-
}
|
|
308
|
-
)
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function performFetch<T>(entry: SWRCacheEntry<T>, onSuccess?: () => void) {
|
|
312
|
-
entry.fetcher(entry.key).then(
|
|
313
|
-
(data) => {
|
|
314
|
-
if (entry.retryState) {
|
|
315
|
-
window.clearTimeout(entry.retryState.timeout)
|
|
316
|
-
entry.retryState = null
|
|
317
|
-
}
|
|
318
|
-
const prev = entry.resource.peek().data
|
|
319
|
-
if (!deepCompare(prev, data)) {
|
|
320
|
-
entry.resource.value = {
|
|
321
|
-
data,
|
|
322
|
-
loading: false,
|
|
323
|
-
error: null,
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
onSuccess?.()
|
|
328
|
-
},
|
|
329
|
-
(error) => {
|
|
330
|
-
entry.resource.value = {
|
|
331
|
-
data: null,
|
|
332
|
-
loading: false,
|
|
333
|
-
error: new UseSWRError(error),
|
|
334
|
-
}
|
|
335
|
-
const retryState: SWRRetryState = (entry.retryState ??= {
|
|
336
|
-
count: 0,
|
|
337
|
-
timeout: 0,
|
|
338
|
-
delay: 250,
|
|
339
|
-
})
|
|
340
|
-
if (retryState.count >= (entry.options.maxRetryCount ?? Infinity)) {
|
|
341
|
-
return
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
retryState.timeout = window.setTimeout(() => {
|
|
345
|
-
retryState.count++
|
|
346
|
-
retryState.delay *= 2
|
|
347
|
-
performFetch(entry, onSuccess)
|
|
348
|
-
}, entry.retryState.delay)
|
|
349
|
-
}
|
|
350
|
-
)
|
|
351
|
-
}
|
package/src/utils/promise.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { $STREAM_DATA } from "../constants.js"
|
|
2
|
-
|
|
3
|
-
export interface StreamDataThrowValue {
|
|
4
|
-
[$STREAM_DATA]: {
|
|
5
|
-
fallback?: JSX.Element
|
|
6
|
-
data: Kiru.StatefulPromise<unknown>[]
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Returns true if the value is a {@link StreamDataThrowValue}
|
|
12
|
-
*/
|
|
13
|
-
export function isStreamDataThrowValue(
|
|
14
|
-
value: unknown
|
|
15
|
-
): value is StreamDataThrowValue {
|
|
16
|
-
return typeof value === "object" && !!value && $STREAM_DATA in value
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Returns true if the value is a {@link Kiru.StatefulPromise}
|
|
21
|
-
*/
|
|
22
|
-
export function isStatefulPromise(
|
|
23
|
-
thing: unknown
|
|
24
|
-
): thing is Kiru.StatefulPromise<unknown> {
|
|
25
|
-
return thing instanceof Promise && "id" in thing && "state" in thing
|
|
26
|
-
}
|