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.
Files changed (335) hide show
  1. package/dist/{appContext.d.ts → appHandle.d.ts} +4 -4
  2. package/dist/appHandle.d.ts.map +1 -0
  3. package/dist/{appContext.js → appHandle.js} +12 -9
  4. package/dist/appHandle.js.map +1 -0
  5. package/dist/components/derive.d.ts +10 -8
  6. package/dist/components/derive.d.ts.map +1 -1
  7. package/dist/components/derive.js +50 -47
  8. package/dist/components/derive.js.map +1 -1
  9. package/dist/components/index.d.ts +0 -1
  10. package/dist/components/index.d.ts.map +1 -1
  11. package/dist/components/index.js +0 -1
  12. package/dist/components/index.js.map +1 -1
  13. package/dist/components/lazy.d.ts.map +1 -1
  14. package/dist/components/lazy.js +5 -4
  15. package/dist/components/lazy.js.map +1 -1
  16. package/dist/components/portal.d.ts.map +1 -1
  17. package/dist/components/portal.js +2 -3
  18. package/dist/components/portal.js.map +1 -1
  19. package/dist/components/transition.d.ts +3 -2
  20. package/dist/components/transition.d.ts.map +1 -1
  21. package/dist/components/transition.js +29 -26
  22. package/dist/components/transition.js.map +1 -1
  23. package/dist/constants.d.ts +1 -5
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +1 -5
  26. package/dist/constants.js.map +1 -1
  27. package/dist/context.d.ts +1 -1
  28. package/dist/context.d.ts.map +1 -1
  29. package/dist/context.js +25 -19
  30. package/dist/context.js.map +1 -1
  31. package/dist/devtools.d.ts +7 -0
  32. package/dist/devtools.d.ts.map +1 -0
  33. package/dist/devtools.js +15 -0
  34. package/dist/devtools.js.map +1 -0
  35. package/dist/dom.d.ts.map +1 -1
  36. package/dist/dom.js +25 -58
  37. package/dist/dom.js.map +1 -1
  38. package/dist/globalContext.d.ts +15 -16
  39. package/dist/globalContext.d.ts.map +1 -1
  40. package/dist/globalContext.js +36 -46
  41. package/dist/globalContext.js.map +1 -1
  42. package/dist/globals.d.ts +1 -4
  43. package/dist/globals.d.ts.map +1 -1
  44. package/dist/globals.js +1 -4
  45. package/dist/globals.js.map +1 -1
  46. package/dist/headlessRender.d.ts +6 -0
  47. package/dist/headlessRender.d.ts.map +1 -0
  48. package/dist/{recursiveRender.js → headlessRender.js} +17 -16
  49. package/dist/headlessRender.js.map +1 -0
  50. package/dist/hmr.d.ts +5 -7
  51. package/dist/hmr.d.ts.map +1 -1
  52. package/dist/hmr.js +27 -32
  53. package/dist/hmr.js.map +1 -1
  54. package/dist/hooks/index.d.ts +3 -14
  55. package/dist/hooks/index.d.ts.map +1 -1
  56. package/dist/hooks/index.js +3 -14
  57. package/dist/hooks/index.js.map +1 -1
  58. package/dist/hooks/onBeforeMount.d.ts +9 -0
  59. package/dist/hooks/onBeforeMount.d.ts.map +1 -0
  60. package/dist/hooks/onBeforeMount.js +12 -0
  61. package/dist/hooks/onBeforeMount.js.map +1 -0
  62. package/dist/hooks/onCleanup.d.ts +8 -0
  63. package/dist/hooks/onCleanup.d.ts.map +1 -0
  64. package/dist/hooks/onCleanup.js +15 -0
  65. package/dist/hooks/onCleanup.js.map +1 -0
  66. package/dist/hooks/onMount.d.ts +9 -0
  67. package/dist/hooks/onMount.d.ts.map +1 -0
  68. package/dist/hooks/onMount.js +12 -0
  69. package/dist/hooks/onMount.js.map +1 -0
  70. package/dist/hooks/utils.d.ts +2 -62
  71. package/dist/hooks/utils.d.ts.map +1 -1
  72. package/dist/hooks/utils.js +22 -144
  73. package/dist/hooks/utils.js.map +1 -1
  74. package/dist/index.d.ts +8 -4
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +8 -6
  77. package/dist/index.js.map +1 -1
  78. package/dist/profiling.d.ts +15 -14
  79. package/dist/profiling.d.ts.map +1 -1
  80. package/dist/profiling.js +9 -4
  81. package/dist/profiling.js.map +1 -1
  82. package/dist/reconciler.d.ts.map +1 -1
  83. package/dist/reconciler.js +12 -25
  84. package/dist/reconciler.js.map +1 -1
  85. package/dist/ref.d.ts +4 -0
  86. package/dist/ref.d.ts.map +1 -0
  87. package/dist/ref.js +4 -0
  88. package/dist/ref.js.map +1 -0
  89. package/dist/renderToString.js +1 -1
  90. package/dist/renderToString.js.map +1 -1
  91. package/dist/router/context.d.ts.map +1 -1
  92. package/dist/router/context.js +1 -2
  93. package/dist/router/context.js.map +1 -1
  94. package/dist/router/fileRouter.d.ts +1 -1
  95. package/dist/router/fileRouter.d.ts.map +1 -1
  96. package/dist/router/fileRouter.js +17 -11
  97. package/dist/router/fileRouter.js.map +1 -1
  98. package/dist/router/fileRouterController.d.ts.map +1 -1
  99. package/dist/router/fileRouterController.js +68 -55
  100. package/dist/router/fileRouterController.js.map +1 -1
  101. package/dist/router/link.d.ts.map +1 -1
  102. package/dist/router/link.js +19 -23
  103. package/dist/router/link.js.map +1 -1
  104. package/dist/router/server/index.d.ts.map +1 -1
  105. package/dist/router/server/index.js +14 -11
  106. package/dist/router/server/index.js.map +1 -1
  107. package/dist/router/types.d.ts +11 -6
  108. package/dist/router/types.d.ts.map +1 -1
  109. package/dist/scheduler.d.ts +1 -0
  110. package/dist/scheduler.d.ts.map +1 -1
  111. package/dist/scheduler.js +65 -52
  112. package/dist/scheduler.js.map +1 -1
  113. package/dist/signals/base.d.ts +0 -1
  114. package/dist/signals/base.d.ts.map +1 -1
  115. package/dist/signals/base.js +13 -36
  116. package/dist/signals/base.js.map +1 -1
  117. package/dist/signals/computed.d.ts +0 -2
  118. package/dist/signals/computed.d.ts.map +1 -1
  119. package/dist/signals/computed.js +1 -40
  120. package/dist/signals/computed.js.map +1 -1
  121. package/dist/signals/effect.d.ts +15 -14
  122. package/dist/signals/effect.d.ts.map +1 -1
  123. package/dist/signals/effect.js +65 -37
  124. package/dist/signals/effect.js.map +1 -1
  125. package/dist/signals/globals.d.ts +0 -5
  126. package/dist/signals/globals.d.ts.map +1 -1
  127. package/dist/signals/globals.js +0 -6
  128. package/dist/signals/globals.js.map +1 -1
  129. package/dist/signals/index.d.ts +4 -4
  130. package/dist/signals/index.d.ts.map +1 -1
  131. package/dist/signals/index.js +4 -4
  132. package/dist/signals/index.js.map +1 -1
  133. package/dist/signals/{for.d.ts → jsx.d.ts} +8 -1
  134. package/dist/signals/jsx.d.ts.map +1 -0
  135. package/dist/signals/{for.js → jsx.js} +4 -1
  136. package/dist/signals/jsx.js.map +1 -0
  137. package/dist/signals/tracking.d.ts +23 -0
  138. package/dist/signals/tracking.d.ts.map +1 -0
  139. package/dist/signals/tracking.js +51 -0
  140. package/dist/signals/tracking.js.map +1 -0
  141. package/dist/signals/types.d.ts +1 -1
  142. package/dist/signals/types.d.ts.map +1 -1
  143. package/dist/signals/utils.d.ts +2 -1
  144. package/dist/signals/utils.d.ts.map +1 -1
  145. package/dist/signals/utils.js +9 -2
  146. package/dist/signals/utils.js.map +1 -1
  147. package/dist/ssr/client.d.ts +3 -3
  148. package/dist/ssr/client.d.ts.map +1 -1
  149. package/dist/ssr/client.js.map +1 -1
  150. package/dist/ssr/server.js +1 -1
  151. package/dist/ssr/server.js.map +1 -1
  152. package/dist/statefulPromise.d.ts +22 -0
  153. package/dist/statefulPromise.d.ts.map +1 -0
  154. package/dist/statefulPromise.js +94 -0
  155. package/dist/statefulPromise.js.map +1 -0
  156. package/dist/types.d.ts +36 -50
  157. package/dist/types.d.ts.map +1 -1
  158. package/dist/types.dom.d.ts +4 -7
  159. package/dist/types.dom.d.ts.map +1 -1
  160. package/dist/types.utils.d.ts +3 -4
  161. package/dist/types.utils.d.ts.map +1 -1
  162. package/dist/utils/vdom.d.ts +8 -6
  163. package/dist/utils/vdom.d.ts.map +1 -1
  164. package/dist/utils/vdom.js +32 -9
  165. package/dist/utils/vdom.js.map +1 -1
  166. package/dist/viewTransitions.d.ts +7 -0
  167. package/dist/viewTransitions.d.ts.map +1 -0
  168. package/dist/viewTransitions.js +71 -0
  169. package/dist/viewTransitions.js.map +1 -0
  170. package/package.json +1 -1
  171. package/src/{appContext.ts → appHandle.ts} +21 -16
  172. package/src/components/derive.ts +74 -69
  173. package/src/components/index.ts +0 -1
  174. package/src/components/lazy.ts +5 -4
  175. package/src/components/portal.ts +2 -3
  176. package/src/components/transition.ts +33 -35
  177. package/src/constants.ts +0 -8
  178. package/src/context.ts +30 -23
  179. package/src/devtools.ts +16 -0
  180. package/src/dom.ts +29 -63
  181. package/src/globalContext.ts +57 -74
  182. package/src/globals.ts +1 -5
  183. package/src/{recursiveRender.ts → headlessRender.ts} +18 -18
  184. package/src/hmr.ts +29 -38
  185. package/src/hooks/index.ts +3 -14
  186. package/src/hooks/onBeforeMount.ts +12 -0
  187. package/src/hooks/onCleanup.ts +15 -0
  188. package/src/hooks/onMount.ts +12 -0
  189. package/src/hooks/utils.ts +28 -238
  190. package/src/index.ts +14 -6
  191. package/src/profiling.ts +22 -20
  192. package/src/reconciler.ts +18 -30
  193. package/src/ref.ts +6 -0
  194. package/src/renderToString.ts +1 -1
  195. package/src/router/context.ts +1 -2
  196. package/src/router/fileRouter.ts +23 -13
  197. package/src/router/fileRouterController.ts +72 -64
  198. package/src/router/link.ts +11 -25
  199. package/src/router/server/index.ts +24 -13
  200. package/src/router/types.ts +15 -8
  201. package/src/scheduler.ts +74 -71
  202. package/src/signals/base.ts +12 -41
  203. package/src/signals/computed.ts +1 -62
  204. package/src/signals/effect.ts +95 -48
  205. package/src/signals/globals.ts +0 -7
  206. package/src/signals/index.ts +4 -4
  207. package/src/signals/{for.ts → jsx.ts} +10 -0
  208. package/src/signals/tracking.ts +69 -0
  209. package/src/signals/types.ts +1 -1
  210. package/src/signals/utils.ts +9 -1
  211. package/src/ssr/client.ts +4 -4
  212. package/src/ssr/server.ts +2 -2
  213. package/src/statefulPromise.ts +136 -0
  214. package/src/types.dom.ts +4 -8
  215. package/src/types.ts +45 -58
  216. package/src/types.utils.ts +3 -4
  217. package/src/utils/vdom.ts +44 -15
  218. package/src/viewTransitions.ts +88 -0
  219. package/dist/appContext.d.ts.map +0 -1
  220. package/dist/appContext.js.map +0 -1
  221. package/dist/components/memo.d.ts +0 -10
  222. package/dist/components/memo.d.ts.map +0 -1
  223. package/dist/components/memo.js +0 -23
  224. package/dist/components/memo.js.map +0 -1
  225. package/dist/form/index.d.ts +0 -4
  226. package/dist/form/index.d.ts.map +0 -1
  227. package/dist/form/index.js +0 -518
  228. package/dist/form/index.js.map +0 -1
  229. package/dist/form/types.d.ts +0 -122
  230. package/dist/form/types.d.ts.map +0 -1
  231. package/dist/form/types.js +0 -2
  232. package/dist/form/types.js.map +0 -1
  233. package/dist/form/utils.d.ts +0 -3
  234. package/dist/form/utils.d.ts.map +0 -1
  235. package/dist/form/utils.js +0 -16
  236. package/dist/form/utils.js.map +0 -1
  237. package/dist/hooks/useAsync.d.ts +0 -18
  238. package/dist/hooks/useAsync.d.ts.map +0 -1
  239. package/dist/hooks/useAsync.js +0 -96
  240. package/dist/hooks/useAsync.js.map +0 -1
  241. package/dist/hooks/useCallback.d.ts +0 -7
  242. package/dist/hooks/useCallback.d.ts.map +0 -1
  243. package/dist/hooks/useCallback.js +0 -30
  244. package/dist/hooks/useCallback.js.map +0 -1
  245. package/dist/hooks/useContext.d.ts +0 -7
  246. package/dist/hooks/useContext.d.ts.map +0 -1
  247. package/dist/hooks/useContext.js +0 -59
  248. package/dist/hooks/useContext.js.map +0 -1
  249. package/dist/hooks/useEffect.d.ts +0 -8
  250. package/dist/hooks/useEffect.d.ts.map +0 -1
  251. package/dist/hooks/useEffect.js +0 -34
  252. package/dist/hooks/useEffect.js.map +0 -1
  253. package/dist/hooks/useEffectEvent.d.ts +0 -8
  254. package/dist/hooks/useEffectEvent.d.ts.map +0 -1
  255. package/dist/hooks/useEffectEvent.js +0 -23
  256. package/dist/hooks/useEffectEvent.js.map +0 -1
  257. package/dist/hooks/useId.d.ts +0 -8
  258. package/dist/hooks/useId.d.ts.map +0 -1
  259. package/dist/hooks/useId.js +0 -35
  260. package/dist/hooks/useId.js.map +0 -1
  261. package/dist/hooks/useLayoutEffect.d.ts +0 -8
  262. package/dist/hooks/useLayoutEffect.d.ts.map +0 -1
  263. package/dist/hooks/useLayoutEffect.js +0 -34
  264. package/dist/hooks/useLayoutEffect.js.map +0 -1
  265. package/dist/hooks/useMemo.d.ts +0 -8
  266. package/dist/hooks/useMemo.d.ts.map +0 -1
  267. package/dist/hooks/useMemo.js +0 -31
  268. package/dist/hooks/useMemo.js.map +0 -1
  269. package/dist/hooks/usePromise.d.ts +0 -8
  270. package/dist/hooks/usePromise.d.ts.map +0 -1
  271. package/dist/hooks/usePromise.js +0 -90
  272. package/dist/hooks/usePromise.js.map +0 -1
  273. package/dist/hooks/useReducer.d.ts +0 -7
  274. package/dist/hooks/useReducer.d.ts.map +0 -1
  275. package/dist/hooks/useReducer.js +0 -44
  276. package/dist/hooks/useReducer.js.map +0 -1
  277. package/dist/hooks/useRef.d.ts +0 -10
  278. package/dist/hooks/useRef.d.ts.map +0 -1
  279. package/dist/hooks/useRef.js +0 -29
  280. package/dist/hooks/useRef.js.map +0 -1
  281. package/dist/hooks/useState.d.ts +0 -7
  282. package/dist/hooks/useState.d.ts.map +0 -1
  283. package/dist/hooks/useState.js +0 -54
  284. package/dist/hooks/useState.js.map +0 -1
  285. package/dist/hooks/useSyncExternalStore.d.ts +0 -8
  286. package/dist/hooks/useSyncExternalStore.d.ts.map +0 -1
  287. package/dist/hooks/useSyncExternalStore.js +0 -50
  288. package/dist/hooks/useSyncExternalStore.js.map +0 -1
  289. package/dist/hooks/useViewTransition.d.ts +0 -10
  290. package/dist/hooks/useViewTransition.d.ts.map +0 -1
  291. package/dist/hooks/useViewTransition.js +0 -27
  292. package/dist/hooks/useViewTransition.js.map +0 -1
  293. package/dist/recursiveRender.d.ts +0 -7
  294. package/dist/recursiveRender.d.ts.map +0 -1
  295. package/dist/recursiveRender.js.map +0 -1
  296. package/dist/signals/for.d.ts.map +0 -1
  297. package/dist/signals/for.js.map +0 -1
  298. package/dist/signals/watch.d.ts +0 -21
  299. package/dist/signals/watch.d.ts.map +0 -1
  300. package/dist/signals/watch.js +0 -86
  301. package/dist/signals/watch.js.map +0 -1
  302. package/dist/store.d.ts +0 -28
  303. package/dist/store.d.ts.map +0 -1
  304. package/dist/store.js +0 -166
  305. package/dist/store.js.map +0 -1
  306. package/dist/swr.d.ts +0 -63
  307. package/dist/swr.d.ts.map +0 -1
  308. package/dist/swr.js +0 -236
  309. package/dist/swr.js.map +0 -1
  310. package/dist/utils/promise.d.ts +0 -16
  311. package/dist/utils/promise.d.ts.map +0 -1
  312. package/dist/utils/promise.js +0 -14
  313. package/dist/utils/promise.js.map +0 -1
  314. package/src/components/memo.ts +0 -39
  315. package/src/form/index.ts +0 -676
  316. package/src/form/types.ts +0 -262
  317. package/src/form/utils.ts +0 -19
  318. package/src/hooks/useAsync.ts +0 -121
  319. package/src/hooks/useCallback.ts +0 -32
  320. package/src/hooks/useContext.ts +0 -79
  321. package/src/hooks/useEffect.ts +0 -40
  322. package/src/hooks/useEffectEvent.ts +0 -24
  323. package/src/hooks/useId.ts +0 -42
  324. package/src/hooks/useLayoutEffect.ts +0 -43
  325. package/src/hooks/useMemo.ts +0 -34
  326. package/src/hooks/usePromise.ts +0 -126
  327. package/src/hooks/useReducer.ts +0 -50
  328. package/src/hooks/useRef.ts +0 -41
  329. package/src/hooks/useState.ts +0 -62
  330. package/src/hooks/useSyncExternalStore.ts +0 -59
  331. package/src/hooks/useViewTransition.ts +0 -25
  332. package/src/signals/watch.ts +0 -139
  333. package/src/store.ts +0 -245
  334. package/src/swr.ts +0 -351
  335. 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
- }
@@ -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
- }