kiru 0.54.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) 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} +13 -10
  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 +7 -6
  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 -30
  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 +19 -0
  34. package/dist/devtools.js.map +1 -0
  35. package/dist/dom/commit.d.ts +5 -0
  36. package/dist/dom/commit.d.ts.map +1 -0
  37. package/dist/dom/commit.js +94 -0
  38. package/dist/dom/commit.js.map +1 -0
  39. package/dist/dom/focus.d.ts +4 -0
  40. package/dist/dom/focus.d.ts.map +1 -0
  41. package/dist/dom/focus.js +32 -0
  42. package/dist/dom/focus.js.map +1 -0
  43. package/dist/dom/index.d.ts +4 -0
  44. package/dist/dom/index.d.ts.map +1 -0
  45. package/dist/dom/index.js +4 -0
  46. package/dist/dom/index.js.map +1 -0
  47. package/dist/dom/nodes.d.ts +12 -0
  48. package/dist/dom/nodes.d.ts.map +1 -0
  49. package/dist/dom/nodes.js +165 -0
  50. package/dist/dom/nodes.js.map +1 -0
  51. package/dist/dom/props.d.ts +8 -0
  52. package/dist/dom/props.d.ts.map +1 -0
  53. package/dist/dom/props.js +675 -0
  54. package/dist/dom/props.js.map +1 -0
  55. package/dist/env.d.ts +2 -0
  56. package/dist/env.d.ts.map +1 -1
  57. package/dist/env.js +2 -0
  58. package/dist/env.js.map +1 -1
  59. package/dist/globalContext.d.ts +17 -23
  60. package/dist/globalContext.d.ts.map +1 -1
  61. package/dist/globalContext.js +31 -53
  62. package/dist/globalContext.js.map +1 -1
  63. package/dist/globals.d.ts +21 -4
  64. package/dist/globals.d.ts.map +1 -1
  65. package/dist/globals.js +22 -5
  66. package/dist/globals.js.map +1 -1
  67. package/dist/headlessRender.d.ts +6 -0
  68. package/dist/headlessRender.d.ts.map +1 -0
  69. package/dist/{recursiveRender.js → headlessRender.js} +17 -16
  70. package/dist/headlessRender.js.map +1 -0
  71. package/dist/hmr.d.ts +21 -8
  72. package/dist/hmr.d.ts.map +1 -1
  73. package/dist/hmr.js +58 -37
  74. package/dist/hmr.js.map +1 -1
  75. package/dist/hooks/index.d.ts +4 -14
  76. package/dist/hooks/index.d.ts.map +1 -1
  77. package/dist/hooks/index.js +4 -14
  78. package/dist/hooks/index.js.map +1 -1
  79. package/dist/hooks/onBeforeMount.d.ts +9 -0
  80. package/dist/hooks/onBeforeMount.d.ts.map +1 -0
  81. package/dist/hooks/onBeforeMount.js +19 -0
  82. package/dist/hooks/onBeforeMount.js.map +1 -0
  83. package/dist/hooks/onCleanup.d.ts +8 -0
  84. package/dist/hooks/onCleanup.d.ts.map +1 -0
  85. package/dist/hooks/onCleanup.js +18 -0
  86. package/dist/hooks/onCleanup.js.map +1 -0
  87. package/dist/hooks/onMount.d.ts +9 -0
  88. package/dist/hooks/onMount.d.ts.map +1 -0
  89. package/dist/hooks/onMount.js +19 -0
  90. package/dist/hooks/onMount.js.map +1 -0
  91. package/dist/hooks/setup.d.ts +13 -0
  92. package/dist/hooks/setup.d.ts.map +1 -0
  93. package/dist/hooks/setup.js +54 -0
  94. package/dist/hooks/setup.js.map +1 -0
  95. package/dist/hooks/utils.d.ts +2 -63
  96. package/dist/hooks/utils.d.ts.map +1 -1
  97. package/dist/hooks/utils.js +17 -144
  98. package/dist/hooks/utils.js.map +1 -1
  99. package/dist/index.d.ts +9 -4
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +11 -8
  102. package/dist/index.js.map +1 -1
  103. package/dist/profiling.d.ts +15 -14
  104. package/dist/profiling.d.ts.map +1 -1
  105. package/dist/profiling.js +9 -4
  106. package/dist/profiling.js.map +1 -1
  107. package/dist/reconciler.d.ts.map +1 -1
  108. package/dist/reconciler.js +15 -28
  109. package/dist/reconciler.js.map +1 -1
  110. package/dist/ref.d.ts +4 -0
  111. package/dist/ref.d.ts.map +1 -0
  112. package/dist/ref.js +4 -0
  113. package/dist/ref.js.map +1 -0
  114. package/dist/renderToString.js +1 -1
  115. package/dist/renderToString.js.map +1 -1
  116. package/dist/router/context.d.ts.map +1 -1
  117. package/dist/router/context.js +1 -2
  118. package/dist/router/context.js.map +1 -1
  119. package/dist/router/fileRouter.d.ts +1 -1
  120. package/dist/router/fileRouter.d.ts.map +1 -1
  121. package/dist/router/fileRouter.js +17 -11
  122. package/dist/router/fileRouter.js.map +1 -1
  123. package/dist/router/fileRouterController.d.ts.map +1 -1
  124. package/dist/router/fileRouterController.js +68 -55
  125. package/dist/router/fileRouterController.js.map +1 -1
  126. package/dist/router/head.js +2 -2
  127. package/dist/router/head.js.map +1 -1
  128. package/dist/router/link.d.ts.map +1 -1
  129. package/dist/router/link.js +19 -23
  130. package/dist/router/link.js.map +1 -1
  131. package/dist/router/pageConfig.js +2 -2
  132. package/dist/router/pageConfig.js.map +1 -1
  133. package/dist/router/server/index.d.ts.map +1 -1
  134. package/dist/router/server/index.js +14 -11
  135. package/dist/router/server/index.js.map +1 -1
  136. package/dist/router/types.d.ts +11 -6
  137. package/dist/router/types.d.ts.map +1 -1
  138. package/dist/scheduler.d.ts +1 -0
  139. package/dist/scheduler.d.ts.map +1 -1
  140. package/dist/scheduler.js +91 -73
  141. package/dist/scheduler.js.map +1 -1
  142. package/dist/signals/base.d.ts +0 -1
  143. package/dist/signals/base.d.ts.map +1 -1
  144. package/dist/signals/base.js +14 -37
  145. package/dist/signals/base.js.map +1 -1
  146. package/dist/signals/computed.d.ts +0 -2
  147. package/dist/signals/computed.d.ts.map +1 -1
  148. package/dist/signals/computed.js +1 -40
  149. package/dist/signals/computed.js.map +1 -1
  150. package/dist/signals/effect.d.ts +15 -14
  151. package/dist/signals/effect.d.ts.map +1 -1
  152. package/dist/signals/effect.js +65 -37
  153. package/dist/signals/effect.js.map +1 -1
  154. package/dist/signals/globals.d.ts +0 -5
  155. package/dist/signals/globals.d.ts.map +1 -1
  156. package/dist/signals/globals.js +0 -6
  157. package/dist/signals/globals.js.map +1 -1
  158. package/dist/signals/index.d.ts +4 -4
  159. package/dist/signals/index.d.ts.map +1 -1
  160. package/dist/signals/index.js +4 -4
  161. package/dist/signals/index.js.map +1 -1
  162. package/dist/signals/{for.d.ts → jsx.d.ts} +8 -1
  163. package/dist/signals/jsx.d.ts.map +1 -0
  164. package/dist/signals/{for.js → jsx.js} +4 -1
  165. package/dist/signals/jsx.js.map +1 -0
  166. package/dist/signals/tracking.d.ts +24 -0
  167. package/dist/signals/tracking.d.ts.map +1 -0
  168. package/dist/signals/tracking.js +51 -0
  169. package/dist/signals/tracking.js.map +1 -0
  170. package/dist/signals/types.d.ts +1 -1
  171. package/dist/signals/types.d.ts.map +1 -1
  172. package/dist/signals/utils.d.ts +2 -1
  173. package/dist/signals/utils.d.ts.map +1 -1
  174. package/dist/signals/utils.js +9 -2
  175. package/dist/signals/utils.js.map +1 -1
  176. package/dist/ssr/client.d.ts +3 -3
  177. package/dist/ssr/client.d.ts.map +1 -1
  178. package/dist/ssr/client.js.map +1 -1
  179. package/dist/ssr/server.js +1 -1
  180. package/dist/ssr/server.js.map +1 -1
  181. package/dist/statefulPromise.d.ts +22 -0
  182. package/dist/statefulPromise.d.ts.map +1 -0
  183. package/dist/statefulPromise.js +94 -0
  184. package/dist/statefulPromise.js.map +1 -0
  185. package/dist/types.d.ts +40 -50
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.dom.d.ts +5 -8
  188. package/dist/types.dom.d.ts.map +1 -1
  189. package/dist/types.utils.d.ts +3 -4
  190. package/dist/types.utils.d.ts.map +1 -1
  191. package/dist/utils/format.d.ts.map +1 -1
  192. package/dist/utils/format.js +4 -1
  193. package/dist/utils/format.js.map +1 -1
  194. package/dist/utils/vdom.d.ts +8 -6
  195. package/dist/utils/vdom.d.ts.map +1 -1
  196. package/dist/utils/vdom.js +32 -9
  197. package/dist/utils/vdom.js.map +1 -1
  198. package/dist/viewTransitions.d.ts +7 -0
  199. package/dist/viewTransitions.d.ts.map +1 -0
  200. package/dist/viewTransitions.js +72 -0
  201. package/dist/viewTransitions.js.map +1 -0
  202. package/package.json +1 -1
  203. package/src/{appContext.ts → appHandle.ts} +22 -17
  204. package/src/components/derive.ts +74 -69
  205. package/src/components/index.ts +0 -1
  206. package/src/components/lazy.ts +10 -10
  207. package/src/components/portal.ts +2 -3
  208. package/src/components/transition.ts +33 -39
  209. package/src/constants.ts +0 -8
  210. package/src/context.ts +30 -23
  211. package/src/devtools.ts +18 -0
  212. package/src/dom/commit.ts +133 -0
  213. package/src/dom/focus.ts +34 -0
  214. package/src/dom/index.ts +3 -0
  215. package/src/dom/nodes.ts +204 -0
  216. package/src/dom/props.ts +818 -0
  217. package/src/env.ts +3 -0
  218. package/src/globalContext.ts +51 -85
  219. package/src/globals.ts +25 -6
  220. package/src/{recursiveRender.ts → headlessRender.ts} +18 -18
  221. package/src/hmr.ts +60 -42
  222. package/src/hooks/index.ts +4 -14
  223. package/src/hooks/onBeforeMount.ts +18 -0
  224. package/src/hooks/onCleanup.ts +21 -0
  225. package/src/hooks/onMount.ts +18 -0
  226. package/src/hooks/setup.ts +70 -0
  227. package/src/hooks/utils.ts +24 -239
  228. package/src/index.ts +17 -7
  229. package/src/profiling.ts +22 -20
  230. package/src/reconciler.ts +21 -33
  231. package/src/ref.ts +6 -0
  232. package/src/renderToString.ts +1 -1
  233. package/src/router/context.ts +1 -2
  234. package/src/router/fileRouter.ts +23 -13
  235. package/src/router/fileRouterController.ts +72 -64
  236. package/src/router/head.ts +2 -2
  237. package/src/router/link.ts +11 -25
  238. package/src/router/pageConfig.ts +2 -2
  239. package/src/router/server/index.ts +24 -13
  240. package/src/router/types.ts +15 -8
  241. package/src/scheduler.ts +116 -98
  242. package/src/signals/base.ts +13 -42
  243. package/src/signals/computed.ts +1 -62
  244. package/src/signals/effect.ts +93 -48
  245. package/src/signals/globals.ts +0 -7
  246. package/src/signals/index.ts +4 -4
  247. package/src/signals/{for.ts → jsx.ts} +10 -0
  248. package/src/signals/tracking.ts +70 -0
  249. package/src/signals/types.ts +1 -1
  250. package/src/signals/utils.ts +9 -1
  251. package/src/ssr/client.ts +4 -4
  252. package/src/ssr/server.ts +2 -2
  253. package/src/statefulPromise.ts +136 -0
  254. package/src/types.dom.ts +6 -10
  255. package/src/types.ts +51 -60
  256. package/src/types.utils.ts +3 -4
  257. package/src/utils/format.ts +3 -1
  258. package/src/utils/vdom.ts +44 -15
  259. package/src/viewTransitions.ts +89 -0
  260. package/dist/appContext.d.ts.map +0 -1
  261. package/dist/appContext.js.map +0 -1
  262. package/dist/components/memo.d.ts +0 -10
  263. package/dist/components/memo.d.ts.map +0 -1
  264. package/dist/components/memo.js +0 -23
  265. package/dist/components/memo.js.map +0 -1
  266. package/dist/dom.d.ts +0 -10
  267. package/dist/dom.d.ts.map +0 -1
  268. package/dist/dom.js +0 -634
  269. package/dist/dom.js.map +0 -1
  270. package/dist/form/index.d.ts +0 -4
  271. package/dist/form/index.d.ts.map +0 -1
  272. package/dist/form/index.js +0 -518
  273. package/dist/form/index.js.map +0 -1
  274. package/dist/form/types.d.ts +0 -122
  275. package/dist/form/types.d.ts.map +0 -1
  276. package/dist/form/types.js +0 -2
  277. package/dist/form/types.js.map +0 -1
  278. package/dist/form/utils.d.ts +0 -3
  279. package/dist/form/utils.d.ts.map +0 -1
  280. package/dist/form/utils.js +0 -16
  281. package/dist/form/utils.js.map +0 -1
  282. package/dist/hooks/useAsync.d.ts +0 -18
  283. package/dist/hooks/useAsync.d.ts.map +0 -1
  284. package/dist/hooks/useAsync.js +0 -96
  285. package/dist/hooks/useAsync.js.map +0 -1
  286. package/dist/hooks/useCallback.d.ts +0 -7
  287. package/dist/hooks/useCallback.d.ts.map +0 -1
  288. package/dist/hooks/useCallback.js +0 -30
  289. package/dist/hooks/useCallback.js.map +0 -1
  290. package/dist/hooks/useContext.d.ts +0 -7
  291. package/dist/hooks/useContext.d.ts.map +0 -1
  292. package/dist/hooks/useContext.js +0 -59
  293. package/dist/hooks/useContext.js.map +0 -1
  294. package/dist/hooks/useEffect.d.ts +0 -8
  295. package/dist/hooks/useEffect.d.ts.map +0 -1
  296. package/dist/hooks/useEffect.js +0 -34
  297. package/dist/hooks/useEffect.js.map +0 -1
  298. package/dist/hooks/useEffectEvent.d.ts +0 -8
  299. package/dist/hooks/useEffectEvent.d.ts.map +0 -1
  300. package/dist/hooks/useEffectEvent.js +0 -23
  301. package/dist/hooks/useEffectEvent.js.map +0 -1
  302. package/dist/hooks/useId.d.ts +0 -8
  303. package/dist/hooks/useId.d.ts.map +0 -1
  304. package/dist/hooks/useId.js +0 -35
  305. package/dist/hooks/useId.js.map +0 -1
  306. package/dist/hooks/useLayoutEffect.d.ts +0 -8
  307. package/dist/hooks/useLayoutEffect.d.ts.map +0 -1
  308. package/dist/hooks/useLayoutEffect.js +0 -34
  309. package/dist/hooks/useLayoutEffect.js.map +0 -1
  310. package/dist/hooks/useMemo.d.ts +0 -8
  311. package/dist/hooks/useMemo.d.ts.map +0 -1
  312. package/dist/hooks/useMemo.js +0 -31
  313. package/dist/hooks/useMemo.js.map +0 -1
  314. package/dist/hooks/usePromise.d.ts +0 -8
  315. package/dist/hooks/usePromise.d.ts.map +0 -1
  316. package/dist/hooks/usePromise.js +0 -90
  317. package/dist/hooks/usePromise.js.map +0 -1
  318. package/dist/hooks/useReducer.d.ts +0 -7
  319. package/dist/hooks/useReducer.d.ts.map +0 -1
  320. package/dist/hooks/useReducer.js +0 -44
  321. package/dist/hooks/useReducer.js.map +0 -1
  322. package/dist/hooks/useRef.d.ts +0 -10
  323. package/dist/hooks/useRef.d.ts.map +0 -1
  324. package/dist/hooks/useRef.js +0 -29
  325. package/dist/hooks/useRef.js.map +0 -1
  326. package/dist/hooks/useState.d.ts +0 -7
  327. package/dist/hooks/useState.d.ts.map +0 -1
  328. package/dist/hooks/useState.js +0 -54
  329. package/dist/hooks/useState.js.map +0 -1
  330. package/dist/hooks/useSyncExternalStore.d.ts +0 -8
  331. package/dist/hooks/useSyncExternalStore.d.ts.map +0 -1
  332. package/dist/hooks/useSyncExternalStore.js +0 -50
  333. package/dist/hooks/useSyncExternalStore.js.map +0 -1
  334. package/dist/hooks/useViewTransition.d.ts +0 -10
  335. package/dist/hooks/useViewTransition.d.ts.map +0 -1
  336. package/dist/hooks/useViewTransition.js +0 -27
  337. package/dist/hooks/useViewTransition.js.map +0 -1
  338. package/dist/recursiveRender.d.ts +0 -7
  339. package/dist/recursiveRender.d.ts.map +0 -1
  340. package/dist/recursiveRender.js.map +0 -1
  341. package/dist/signals/for.d.ts.map +0 -1
  342. package/dist/signals/for.js.map +0 -1
  343. package/dist/signals/watch.d.ts +0 -21
  344. package/dist/signals/watch.d.ts.map +0 -1
  345. package/dist/signals/watch.js +0 -86
  346. package/dist/signals/watch.js.map +0 -1
  347. package/dist/store.d.ts +0 -28
  348. package/dist/store.d.ts.map +0 -1
  349. package/dist/store.js +0 -166
  350. package/dist/store.js.map +0 -1
  351. package/dist/swr.d.ts +0 -63
  352. package/dist/swr.d.ts.map +0 -1
  353. package/dist/swr.js +0 -236
  354. package/dist/swr.js.map +0 -1
  355. package/dist/utils/promise.d.ts +0 -16
  356. package/dist/utils/promise.d.ts.map +0 -1
  357. package/dist/utils/promise.js +0 -14
  358. package/dist/utils/promise.js.map +0 -1
  359. package/src/components/memo.ts +0 -39
  360. package/src/dom.ts +0 -809
  361. package/src/form/index.ts +0 -676
  362. package/src/form/types.ts +0 -262
  363. package/src/form/utils.ts +0 -19
  364. package/src/hooks/useAsync.ts +0 -121
  365. package/src/hooks/useCallback.ts +0 -32
  366. package/src/hooks/useContext.ts +0 -79
  367. package/src/hooks/useEffect.ts +0 -40
  368. package/src/hooks/useEffectEvent.ts +0 -24
  369. package/src/hooks/useId.ts +0 -42
  370. package/src/hooks/useLayoutEffect.ts +0 -43
  371. package/src/hooks/useMemo.ts +0 -34
  372. package/src/hooks/usePromise.ts +0 -126
  373. package/src/hooks/useReducer.ts +0 -50
  374. package/src/hooks/useRef.ts +0 -40
  375. package/src/hooks/useState.ts +0 -62
  376. package/src/hooks/useSyncExternalStore.ts +0 -59
  377. package/src/hooks/useViewTransition.ts +0 -25
  378. package/src/signals/watch.ts +0 -139
  379. package/src/store.ts +0 -245
  380. package/src/swr.ts +0 -351
  381. package/src/utils/promise.ts +0 -26
@@ -1,126 +0,0 @@
1
- import { STREAMED_DATA_EVENT } from "../constants.js"
2
- import { hydrationMode, renderMode } from "../globals.js"
3
- import { Signal, useSignal } from "../signals/base.js"
4
- import { cleanupHook, depsRequireChange, useHook } from "./utils.js"
5
- import { useId } from "./useId.js"
6
-
7
- export { usePromise }
8
-
9
- const nodeToPromiseIndex = new WeakMap<Kiru.VNode, number>()
10
-
11
- type UsePromiseResult<T> = Kiru.StatefulPromise<T> & {
12
- refresh: () => void
13
- isPending: Signal<boolean>
14
- }
15
-
16
- function usePromise<T>(
17
- callback: (signal: AbortSignal) => Promise<T>,
18
- deps: unknown[]
19
- ): UsePromiseResult<T> {
20
- const id = useId()
21
- const isPending = useSignal(true)
22
-
23
- return useHook(
24
- "usePromise",
25
- {} as {
26
- promise: UsePromiseResult<T>
27
- abortController?: AbortController
28
- deps?: unknown[]
29
- },
30
- ({ hook, isInit, vNode, update }) => {
31
- if (isInit || depsRequireChange(deps, hook.deps)) {
32
- isPending.value = true
33
- hook.deps = deps
34
- cleanupHook(hook)
35
-
36
- const controller = (hook.abortController = new AbortController())
37
- hook.cleanup = () => controller.abort()
38
-
39
- const index = nodeToPromiseIndex.get(vNode) ?? 0
40
- nodeToPromiseIndex.set(vNode, index + 1)
41
-
42
- const promiseId = `${id}:data:${index}`
43
-
44
- let promise: Promise<T>
45
- if (renderMode.current === "string") {
46
- // if we're rendering to a string, there's no need to fire the callback
47
- promise = Promise.resolve() as Promise<T>
48
- } else if (
49
- renderMode.current === "hydrate" &&
50
- hydrationMode.current === "dynamic"
51
- ) {
52
- // if we're hydrating and the hydration mode is not static,
53
- // we need to resolve the promise from cache/event
54
- promise = resolveDeferredPromise<T>(promiseId, controller.signal)
55
- } else {
56
- // dom / stream / (hydrate + static)
57
- promise = callback(controller.signal)
58
- }
59
-
60
- const state: Kiru.PromiseState<T> = { id: promiseId, state: "pending" }
61
- const statefulPromise: Kiru.StatefulPromise<T> = (hook.promise =
62
- Object.assign(promise, state, {
63
- isPending,
64
- refresh: () => {
65
- hook.deps = undefined
66
- update()
67
- },
68
- }))
69
-
70
- statefulPromise
71
- .then((value) => {
72
- statefulPromise.state = "fulfilled"
73
- statefulPromise.value = value
74
- isPending.value = false
75
- })
76
- .catch((error) => {
77
- statefulPromise.state = "rejected"
78
- statefulPromise.error =
79
- error instanceof Error ? error : new Error(error)
80
- })
81
- }
82
- return hook.promise
83
- }
84
- )
85
- }
86
-
87
- interface DeferredPromiseEventDetail<T> {
88
- id: string
89
- data?: T
90
- error?: string
91
- }
92
-
93
- function resolveDeferredPromise<T>(
94
- id: string,
95
- signal: AbortSignal
96
- ): Promise<T> {
97
- return new Promise<T>((resolve, reject) => {
98
- const deferralCache: Map<string, { data?: T; error?: string }> = // @ts-ignore
99
- (window[STREAMED_DATA_EVENT] ??= new Map())
100
-
101
- const existing = deferralCache.get(id)
102
- if (existing) {
103
- const { data, error } = existing
104
- deferralCache.delete(id)
105
- if (error) return reject(error)
106
- return resolve(data!)
107
- }
108
-
109
- const onDataEvent = (event: Event) => {
110
- const { detail } = event as CustomEvent<DeferredPromiseEventDetail<T>>
111
- if (detail.id === id) {
112
- deferralCache.delete(id)
113
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
114
- const { data, error } = detail
115
- if (error) return reject(error)
116
- resolve(data!)
117
- }
118
- }
119
-
120
- window.addEventListener(STREAMED_DATA_EVENT, onDataEvent)
121
- signal.addEventListener("abort", () => {
122
- window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
123
- reject()
124
- })
125
- })
126
- }
@@ -1,50 +0,0 @@
1
- import { __DEV__ } from "../env.js"
2
- import { noop, sideEffectsEnabled } from "../utils/index.js"
3
- import { useHook } from "./utils.js"
4
-
5
- /**
6
- * Creates 'dispatcher-driven' state.
7
- *
8
- * @see https://kirujs.dev/docs/hooks/useReducer
9
- */
10
- export function useReducer<T, A>(
11
- reducer: (state: T, action: A) => T,
12
- state: T
13
- ): readonly [T, (action: A) => void] {
14
- if (!sideEffectsEnabled()) return [state, noop]
15
-
16
- return useHook(
17
- "useReducer",
18
- { state, dispatch: noop as (action: A) => void },
19
- ({ hook, isInit, isHMR, update }) => {
20
- if (__DEV__) {
21
- if (isInit) {
22
- hook.dev = {
23
- devtools: {
24
- get: () => ({ value: hook.state }),
25
- set: ({ value }) => (hook.state = value),
26
- } satisfies Kiru.HookDevtoolsProvisions<{ value: T }>,
27
- initialArgs: [reducer, state],
28
- }
29
- }
30
- if (isHMR) {
31
- const [r, s] = hook.dev!.initialArgs
32
- if (r !== reducer || s !== state) {
33
- hook.state = state
34
- isInit = true
35
- hook.dev!.initialArgs = [reducer, state]
36
- }
37
- }
38
- }
39
- if (isInit) {
40
- hook.dispatch = (action: A) => {
41
- const newState = reducer(hook.state, action)
42
- if (Object.is(hook.state, newState)) return
43
- hook.state = newState
44
- update()
45
- }
46
- }
47
- return [hook.state, hook.dispatch] as const
48
- }
49
- )
50
- }
@@ -1,40 +0,0 @@
1
- import { __DEV__ } from "../env.js"
2
- import { sideEffectsEnabled } from "../utils/index.js"
3
- import { useHook } from "./utils.js"
4
- /**
5
- * Creates a ref object. Useful for persisting values between renders or getting
6
- * a reference to an element.
7
- *
8
- * @see https://kirujs.dev/docs/hooks/useRef
9
- */
10
- export function useRef<T>(initialValue: T): Kiru.RefObject<T>
11
- export function useRef<T>(initialValue: T | null): Kiru.RefObject<T | null>
12
- export function useRef<T = undefined>(): Kiru.RefObject<T | undefined>
13
- export function useRef<T>(initialValue?: T | null) {
14
- if (!sideEffectsEnabled()) return { current: initialValue }
15
- return useHook(
16
- "useRef",
17
- { ref: { current: initialValue } },
18
- ({ hook, isInit, isHMR }) => {
19
- if (__DEV__) {
20
- if (isInit) {
21
- hook.dev = {
22
- devtools: {
23
- get: () => ({ value: hook.ref.current! }),
24
- set: ({ value }) => (hook.ref.current = value),
25
- } satisfies Kiru.HookDevtoolsProvisions<{ value: T }>,
26
- initialArgs: [hook.ref.current],
27
- }
28
- }
29
- if (isHMR) {
30
- const [v] = hook.dev!.initialArgs
31
- if (v !== initialValue) {
32
- hook.ref = { current: initialValue }
33
- hook.dev!.initialArgs = [initialValue]
34
- }
35
- }
36
- }
37
- return hook.ref
38
- }
39
- )
40
- }
@@ -1,62 +0,0 @@
1
- import { __DEV__ } from "../env.js"
2
- import { noop, sideEffectsEnabled } from "../utils/index.js"
3
- import { useHook } from "./utils.js"
4
-
5
- /**
6
- * Creates a stateful value, and returns the current value and a function to update it.
7
- *
8
- * @see https://kirujs.dev/docs/hooks/useState
9
- */
10
- export function useState<T>(
11
- initial: T | (() => T)
12
- ): readonly [T, (value: Kiru.StateSetter<T>) => void] {
13
- if (!sideEffectsEnabled()) {
14
- return [
15
- typeof initial === "function" ? (initial as Function)() : initial,
16
- noop,
17
- ]
18
- }
19
- return useHook(
20
- "useState",
21
- {
22
- state: undefined as T,
23
- dispatch: noop as (value: Kiru.StateSetter<T>) => void,
24
- },
25
- ({ hook, isInit, update, isHMR }) => {
26
- if (__DEV__) {
27
- if (isInit) {
28
- hook.dev = {
29
- devtools: {
30
- get: () => ({ value: hook.state }),
31
- set: ({ value }) => (hook.state = value),
32
- } satisfies Kiru.HookDevtoolsProvisions<{ value: T }>,
33
- initialArgs: [initial],
34
- }
35
- }
36
- if (isHMR) {
37
- const [v] = hook.dev!.initialArgs
38
- if (v !== initial) {
39
- isInit = true
40
- hook.dev!.initialArgs = [initial]
41
- }
42
- }
43
- }
44
-
45
- if (isInit) {
46
- hook.state =
47
- typeof initial === "function" ? (initial as Function)() : initial
48
- hook.dispatch = (setter: Kiru.StateSetter<T>) => {
49
- const newState =
50
- typeof setter === "function"
51
- ? (setter as Function)(hook.state)
52
- : setter
53
- if (Object.is(hook.state, newState)) return
54
- hook.state = newState
55
- update()
56
- }
57
- }
58
-
59
- return [hook.state, hook.dispatch] as const
60
- }
61
- )
62
- }
@@ -1,59 +0,0 @@
1
- import { node } from "../globals.js"
2
- import { KiruError } from "../error.js"
3
- import { noop, sideEffectsEnabled } from "../utils/index.js"
4
- import { useHook } from "./utils.js"
5
- import { __DEV__ } from "../env.js"
6
-
7
- /**
8
- * Allows you to use a generic external store as long as it provides
9
- * a subscribe function and a way to get its current state.
10
- *
11
- * @see https://kirujs.dev/docs/hooks/useSyncExternalStore
12
- */
13
- export function useSyncExternalStore<T>(
14
- subscribe: (callback: () => void) => () => void,
15
- getState: () => T,
16
- getServerState?: () => T
17
- ): T {
18
- if (!sideEffectsEnabled()) {
19
- if (getServerState === undefined) {
20
- throw new KiruError({
21
- message:
22
- "useSyncExternalStore must receive a getServerSnapshot function if the component is rendered on the server.",
23
- vNode: node.current!,
24
- })
25
- }
26
- return getServerState()
27
- }
28
-
29
- return useHook(
30
- "useSyncExternalStore",
31
- {
32
- state: null as T,
33
- unsubscribe: noop as () => void,
34
- subscribe,
35
- },
36
- ({ hook, isInit, update }) => {
37
- if (__DEV__) {
38
- hook.dev = {
39
- devtools: { get: () => ({ value: hook.state }) },
40
- }
41
- }
42
- if (isInit || hook.subscribe !== subscribe) {
43
- hook.state = getState()
44
- hook.subscribe = subscribe
45
- hook.unsubscribe = subscribe(() => {
46
- const newState = getState()
47
- if (Object.is(hook.state, newState)) return
48
- hook.state = newState
49
- update()
50
- })
51
- hook.cleanup = () => {
52
- hook.unsubscribe()
53
- hook.unsubscribe = noop
54
- }
55
- }
56
- return hook.state
57
- }
58
- )
59
- }
@@ -1,25 +0,0 @@
1
- import { flushSync } from "../scheduler.js"
2
- import { node } from "../globals.js"
3
- import { noop, sideEffectsEnabled } from "../utils/index.js"
4
-
5
- /**
6
- * Allows you to easily use the [View Transition API](https://developer.mozilla.org/en-US/docs/Web/API/Document/startViewTransition)
7
- * by wrapping the `callback` in a `document.startViewTransition` call.
8
- *
9
- * Falls back to the regular `callback` if not supported.
10
- *
11
- * @see https://kirujs.dev/docs/hooks/useViewTransition
12
- */
13
- export function useViewTransition() {
14
- if (!sideEffectsEnabled()) return noop
15
- return (callback: () => void) => {
16
- if (node.current) {
17
- throw new Error("useViewTransition can't be called during rendering.")
18
- }
19
- if (!document.startViewTransition) return callback()
20
- document.startViewTransition(() => {
21
- callback()
22
- flushSync()
23
- })
24
- }
25
- }
@@ -1,139 +0,0 @@
1
- import { __DEV__ } from "../env.js"
2
- import { useHook } from "../hooks/utils.js"
3
- import { effectQueue } from "./globals.js"
4
- import { executeWithTracking } from "./effect.js"
5
- import {
6
- latest,
7
- sideEffectsEnabled,
8
- generateRandomID,
9
- call,
10
- } from "../utils/index.js"
11
- import type { Signal } from "./base.js"
12
- import type { SignalValues } from "./types.js"
13
-
14
- type WatchCallbackReturn = (() => void) | void
15
-
16
- export class WatchEffect<const Deps extends readonly Signal<unknown>[] = []> {
17
- protected id: string
18
- protected getter: (...values: SignalValues<Deps>) => WatchCallbackReturn
19
- protected deps?: Deps
20
- protected unsubs: Map<string, Function>
21
- protected cleanup: (() => void) | null
22
- protected isRunning?: boolean
23
-
24
- constructor(
25
- getter: (...values: SignalValues<Deps>) => WatchCallbackReturn,
26
- deps?: Deps
27
- ) {
28
- this.id = generateRandomID()
29
- this.getter = getter
30
- this.deps = deps
31
- this.unsubs = new Map()
32
- this.isRunning = false
33
- this.cleanup = null
34
- if (__DEV__ && "window" in globalThis) {
35
- const { isWaitingForNextWatchCall, pushWatch } =
36
- window.__kiru.HMRContext!.signals
37
-
38
- if (isWaitingForNextWatchCall()) {
39
- pushWatch(this as WatchEffect)
40
- }
41
- }
42
- this.start()
43
- }
44
-
45
- start() {
46
- if (this.isRunning) {
47
- return
48
- }
49
-
50
- this.isRunning = true
51
-
52
- // postpone execution during HMR
53
- if (
54
- __DEV__ &&
55
- "window" in globalThis &&
56
- window.__kiru.HMRContext?.isReplacement()
57
- ) {
58
- return queueMicrotask(() => {
59
- if (this.isRunning) {
60
- WatchEffect.run(this as WatchEffect)
61
- }
62
- })
63
- }
64
- WatchEffect.run(this as WatchEffect)
65
- }
66
-
67
- stop() {
68
- effectQueue.delete(this.id)
69
- this.unsubs.forEach(call)
70
- this.unsubs.clear()
71
- this.cleanup?.()
72
- this.cleanup = null
73
- this.isRunning = false
74
- }
75
-
76
- private static run(watchEffect: WatchEffect) {
77
- const effect = latest(watchEffect)
78
- const { id, getter, unsubs: subs, deps } = effect
79
-
80
- effect.cleanup =
81
- executeWithTracking({
82
- id,
83
- subs,
84
- fn: getter,
85
- deps,
86
- onDepChanged: () => {
87
- effect.cleanup?.()
88
- WatchEffect.run(effect)
89
- },
90
- }) ?? null
91
- }
92
- }
93
-
94
- export function watch(getter: () => WatchCallbackReturn): WatchEffect
95
- export function watch<const Deps extends readonly Signal<unknown>[]>(
96
- dependencies: Deps,
97
- getter: (...values: SignalValues<Deps>) => WatchCallbackReturn
98
- ): WatchEffect<Deps>
99
- export function watch<const Deps extends readonly Signal<unknown>[]>(
100
- depsOrGetter: Deps | (() => WatchCallbackReturn),
101
- getter?: (...values: SignalValues<Deps>) => WatchCallbackReturn
102
- ): WatchEffect<Deps> | WatchEffect {
103
- if (typeof depsOrGetter === "function") {
104
- return new WatchEffect<[]>(depsOrGetter)
105
- }
106
- const dependencies = depsOrGetter
107
- const effectGetter = getter!
108
- return new WatchEffect(effectGetter, dependencies)
109
- }
110
-
111
- export function useWatch(getter: () => WatchCallbackReturn): WatchEffect
112
- export function useWatch<const Deps extends readonly Signal<unknown>[]>(
113
- dependencies: Deps,
114
- getter: (...values: SignalValues<Deps>) => WatchCallbackReturn
115
- ): WatchEffect<Deps> | undefined
116
-
117
- export function useWatch<const Deps extends readonly Signal<unknown>[]>(
118
- depsOrGetter: Deps | (() => WatchCallbackReturn),
119
- getter?: (...values: SignalValues<Deps>) => WatchCallbackReturn
120
- ): WatchEffect<Deps> | WatchEffect | undefined {
121
- if (!sideEffectsEnabled()) return
122
-
123
- return useHook(
124
- "useWatch",
125
- { watcher: null as any as WatchEffect<Deps> },
126
- ({ hook, isInit, isHMR }) => {
127
- if (__DEV__ && isHMR) {
128
- hook.cleanup?.()
129
- isInit = true
130
- }
131
- if (isInit) {
132
- const watcher = (hook.watcher = watch(depsOrGetter as Deps, getter!))
133
- hook.cleanup = () => watcher.stop()
134
- }
135
-
136
- return hook.watcher
137
- }
138
- )
139
- }