kiru 0.54.4 → 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 +35 -49
  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 +31 -65
  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 +44 -59
  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 -40
  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
@@ -0,0 +1,88 @@
1
+ import { flushSync } from "./scheduler.js"
2
+
3
+ export namespace ViewTransitions {
4
+ type ViewTransitionJob = () => Promise<void>
5
+
6
+ const jobs: ViewTransitionJob[] = []
7
+ let running = false
8
+ let scheduled = false
9
+ let transition: ViewTransition | null = null
10
+ const supported =
11
+ "window" in globalThis && typeof document.startViewTransition === "function"
12
+
13
+ export function run<T>(
14
+ callback: () => T | Promise<T>,
15
+ options?: { signal?: AbortSignal }
16
+ ): Promise<T> {
17
+ const signal = options?.signal
18
+
19
+ return new Promise<T>((resolve) => {
20
+ const job: ViewTransitionJob = async () => {
21
+ const result = await callback()
22
+ resolve(result)
23
+ }
24
+
25
+ jobs.push(job)
26
+
27
+ signal?.addEventListener(
28
+ "abort",
29
+ () => {
30
+ const i = jobs.indexOf(job)
31
+ if (i !== -1) {
32
+ jobs.splice(i, 1)
33
+ } else {
34
+ transition?.skipTransition()
35
+ }
36
+ },
37
+ { once: true }
38
+ )
39
+
40
+ schedule()
41
+ })
42
+ }
43
+
44
+ export function stop() {
45
+ transition?.skipTransition()
46
+ transition = null
47
+ jobs.length = 0
48
+ running = false
49
+ scheduled = false
50
+ }
51
+
52
+ function schedule() {
53
+ if (scheduled) return
54
+ scheduled = true
55
+ queueMicrotask(() => {
56
+ scheduled = false
57
+ runJobs()
58
+ })
59
+ }
60
+
61
+ async function runJobs() {
62
+ if (running || jobs.length === 0) return
63
+
64
+ running = true
65
+
66
+ const __jobs = [...jobs]
67
+ jobs.length = 0
68
+
69
+ const runJobs = async () => {
70
+ await Promise.all(__jobs.map((j) => j()))
71
+ flushSync()
72
+ }
73
+
74
+ if (!supported) {
75
+ await runJobs()
76
+ } else {
77
+ transition = document.startViewTransition(runJobs)
78
+ await transition.finished
79
+ }
80
+
81
+ transition = null
82
+ running = false
83
+
84
+ if (jobs.length > 0) {
85
+ schedule()
86
+ }
87
+ }
88
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"appContext.d.ts","sourceRoot":"","sources":["../src/appContext.ts"],"names":[],"mappings":"AAKA,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;AAEvB,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAA;IACf,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;IACnC,OAAO,IAAI,IAAI,CAAA;CAChB;AAID,wBAAgB,KAAK,CACnB,QAAQ,EAAE,GAAG,CAAC,OAAO,EACrB,SAAS,EAAE,WAAW,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,UAAU,CA8CZ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"appContext.js","sourceRoot":"","sources":["../src/appContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAmBxC,IAAI,KAAK,GAAG,CAAC,CAAA;AAEb,MAAM,UAAU,KAAK,CACnB,QAAqB,EACrB,SAAsB,EACtB,OAA2B;IAE3B,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAA;QACH,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAA;IAClB,MAAM,UAAU,GAAe;QAC7B,EAAE;QACF,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,EAAE;QAClC,QAAQ;QACR,MAAM;QACN,OAAO;KACR,CAAA;IAED,SAAS,MAAM,CAAC,QAAqB;QACnC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAClC,cAAc,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;IAED,SAAS,OAAO;QACd,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC9B,cAAc,CAAC,QAAQ,CAAC,CAAA;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC,UAAU,CAAA;YAC3B,OAAO,QAAQ,CAAC,GAAG,CAAA;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,GAAG,GAAG,UAAU,CAAA;IAC3B,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAAA;IAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IACtD,IAAI,OAAO,EAAE,CAAC;QACZ,cAAc,CAAC,GAAG,EAAE;YAClB,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,SAAsB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC,KAAK,IAAI,eAAe,CAAA;IAC7B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAA;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,SAAS,CAAC,UAAU,GAAG,IAAI,CAAA;IAC7B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,10 +0,0 @@
1
- import { $MEMO } from "../constants.js";
2
- export interface MemoFn<T extends Record<string, unknown> = {}> {
3
- (props: T): JSX.Element;
4
- [$MEMO]: (prevProps: T, nextProps: T) => boolean;
5
- }
6
- export declare function memo<T extends Record<string, unknown> = {}>(fn: Kiru.FC<T>, arePropsEqual?: (prevProps: T, nextProps: T) => boolean): (props: T) => JSX.Element;
7
- export declare function isMemoFn(fn: Function & {
8
- [$MEMO]?: any;
9
- }): fn is MemoFn;
10
- //# sourceMappingURL=memo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/components/memo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAgBvC,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE;IAC5D,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAA;IACvB,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;CACjD;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EACzD,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EACd,aAAa,GAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAwB,GACtE,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,CAU3B;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,EAAE,IAAI,MAAM,CAEvE"}
@@ -1,23 +0,0 @@
1
- import { $MEMO } from "../constants.js";
2
- import { createElement } from "../element.js";
3
- function _arePropsEqual(prevProps, nextProps) {
4
- const keys = new Set([...Object.keys(prevProps), ...Object.keys(nextProps)]);
5
- for (const key of keys) {
6
- if (prevProps[key] !== nextProps[key]) {
7
- return false;
8
- }
9
- }
10
- return true;
11
- }
12
- export function memo(fn, arePropsEqual = _arePropsEqual) {
13
- return Object.assign(function Memo(props) {
14
- return createElement(fn, props);
15
- }, {
16
- [$MEMO]: arePropsEqual,
17
- displayName: "Kiru.memo",
18
- });
19
- }
20
- export function isMemoFn(fn) {
21
- return typeof fn[$MEMO] === "function";
22
- }
23
- //# sourceMappingURL=memo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memo.js","sourceRoot":"","sources":["../../src/components/memo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,SAAS,cAAc,CACrB,SAAY,EACZ,SAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC5E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAOD,MAAM,UAAU,IAAI,CAClB,EAAc,EACd,gBAAyD,cAAc;IAEvE,OAAO,MAAM,CAAC,MAAM,CAClB,SAAS,IAAI,CAAC,KAAQ;QACpB,OAAO,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC,EACD;QACE,CAAC,KAAK,CAAC,EAAE,aAAa;QACtB,WAAW,EAAE,WAAW;KACzB,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAgC;IACvD,OAAO,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,UAAU,CAAA;AACxC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { UseFormConfig, UseFormState } from "./types";
2
- export type * from "./types";
3
- export declare function useForm<T extends Record<string, unknown> = {}>(config: UseFormConfig<T>): UseFormState<T>;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAaV,aAAa,EAEb,YAAY,EACb,MAAM,SAAS,CAAA;AAEhB,mBAAmB,SAAS,CAAA;AAwf5B,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EAC5D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GACvB,YAAY,CAAC,CAAC,CAAC,CA0IjB"}
@@ -1,518 +0,0 @@
1
- import { __DEV__ } from "../env.js";
2
- import { Fragment } from "../element.js";
3
- import { safeStringify, shallowCompare, generateRandomID, call, } from "../utils/index.js";
4
- import { useEffect } from "../hooks/useEffect.js";
5
- import { useMemo } from "../hooks/useMemo.js";
6
- import { useRef } from "../hooks/useRef.js";
7
- import { useHook, useRequestUpdate } from "../hooks/utils.js";
8
- import { objGet, objSet } from "./utils.js";
9
- function createFormController(config) {
10
- let isSubmitting = false;
11
- const subscribers = new Set();
12
- const state = structuredClone(config.initialValues ?? {});
13
- const formFieldValidators = {};
14
- const formFieldDependencies = {};
15
- const formFieldsTouched = {};
16
- const formFieldUpdaters = new Map();
17
- const asyncFormFieldValidators = {};
18
- const formFieldErrors = {};
19
- const canSubmit = () => {
20
- return isAnyFieldValidating() === false && getErrors().length === 0;
21
- };
22
- const getSelectorState = () => {
23
- return {
24
- values: state,
25
- canSubmit: canSubmit(),
26
- isSubmitting,
27
- };
28
- };
29
- const updateSubscribers = () => {
30
- const selectorState = getSelectorState();
31
- for (const sub of subscribers) {
32
- const { selector, selection, update } = sub;
33
- const newSelection = selector(selectorState);
34
- if (shallowCompare(selection, newSelection))
35
- continue;
36
- sub.selection = newSelection;
37
- update();
38
- }
39
- };
40
- const updateFieldComponents = (name) => {
41
- if (!formFieldUpdaters.has(name))
42
- return;
43
- for (const update of formFieldUpdaters.get(name))
44
- update();
45
- };
46
- const validateField = async (name, evt) => {
47
- const fieldErrors = (formFieldErrors[name] ?? (formFieldErrors[name] = {}));
48
- const asyncFieldValidatorStates = (asyncFormFieldValidators[name] ?? (asyncFormFieldValidators[name] = {}));
49
- const fieldValidators = formFieldValidators[name] ?? {};
50
- const validatorCtx = { value: getFieldValue(name) };
51
- switch (evt) {
52
- case "onMount": {
53
- if (!fieldValidators.onMount)
54
- return;
55
- fieldErrors.onMount = fieldValidators.onMount(validatorCtx);
56
- updateSubscribers();
57
- updateFieldComponents(name);
58
- break;
59
- }
60
- case "onChange": {
61
- if (fieldErrors.onMount)
62
- delete fieldErrors.onMount;
63
- formFieldsTouched[name] = true;
64
- if (!fieldValidators.onChange)
65
- return;
66
- fieldErrors.onChange = fieldValidators.onChange(validatorCtx);
67
- if (asyncFieldValidatorStates.onChangeAsync &&
68
- asyncFieldValidatorStates.onChangeAsync.timeout !== -1) {
69
- window.clearTimeout(asyncFieldValidatorStates.onChangeAsync.timeout);
70
- asyncFieldValidatorStates.onChangeAsync.abortController?.abort();
71
- asyncFieldValidatorStates.onChangeAsync = {
72
- epoch: asyncFieldValidatorStates.onChangeAsync.epoch,
73
- timeout: -1,
74
- abortController: null,
75
- };
76
- delete fieldErrors.onChangeAsync;
77
- }
78
- else if (fieldErrors.onChangeAsync) {
79
- delete fieldErrors.onChangeAsync;
80
- }
81
- updateSubscribers();
82
- updateFieldComponents(name);
83
- break;
84
- }
85
- case "onBlur": {
86
- formFieldsTouched[name] = true;
87
- if (!fieldValidators.onBlur)
88
- return;
89
- fieldErrors.onBlur = fieldValidators.onBlur(validatorCtx);
90
- updateSubscribers();
91
- updateFieldComponents(name);
92
- break;
93
- }
94
- case "onChangeAsync": {
95
- if (fieldErrors.onChange || !fieldValidators.onChangeAsync)
96
- return;
97
- window.clearTimeout(asyncFieldValidatorStates.onChangeAsync?.timeout);
98
- const epoch = (asyncFieldValidatorStates.onChangeAsync?.epoch ?? 0) + 1;
99
- const debounceMs = fieldValidators.onChangeAsyncDebounceMs ?? 0;
100
- const abortController = new AbortController();
101
- const asyncValidatorCtx = {
102
- ...validatorCtx,
103
- abortSignal: abortController.signal,
104
- };
105
- if (debounceMs <= 0) {
106
- fieldErrors.onChangeAsync = await fieldValidators.onChangeAsync(asyncValidatorCtx);
107
- updateSubscribers();
108
- updateFieldComponents(name);
109
- return;
110
- }
111
- asyncFieldValidatorStates.onChangeAsync = {
112
- abortController,
113
- timeout: window.setTimeout(() => {
114
- fieldValidators
115
- .onChangeAsync?.(asyncValidatorCtx)
116
- .then((result) => {
117
- if (fieldErrors.onChange)
118
- return;
119
- if (epoch !== asyncFieldValidatorStates.onChangeAsync?.epoch) {
120
- return;
121
- }
122
- fieldErrors.onChangeAsync = result;
123
- asyncFieldValidatorStates.onChangeAsync = {
124
- timeout: -1,
125
- epoch,
126
- abortController,
127
- };
128
- updateSubscribers();
129
- updateFieldComponents(name);
130
- });
131
- }, debounceMs),
132
- epoch,
133
- };
134
- updateSubscribers();
135
- break;
136
- }
137
- case "onSubmit": {
138
- fieldErrors.onSubmit = fieldValidators.onSubmit?.(validatorCtx);
139
- }
140
- }
141
- };
142
- const getFieldValue = (name) => {
143
- return objGet(state, name.split("."));
144
- };
145
- const getFieldState = (name) => {
146
- let errors = [];
147
- let isValidating = false;
148
- const fieldErrors = formFieldErrors[name] ?? {};
149
- const asyncMeta = asyncFormFieldValidators[name] ?? {};
150
- if (asyncMeta.onChangeAsync && asyncMeta.onChangeAsync.timeout !== -1) {
151
- isValidating = true;
152
- }
153
- if (!isValidating) {
154
- errors.push(...[
155
- fieldErrors.onChangeAsync,
156
- fieldErrors.onMount,
157
- fieldErrors.onChange,
158
- fieldErrors.onBlur,
159
- ].filter(Boolean));
160
- }
161
- return {
162
- value: getFieldValue(name),
163
- errors,
164
- isTouched: !!formFieldsTouched[name],
165
- isValidating,
166
- };
167
- };
168
- const onFieldChanged = (name) => {
169
- validateField(name, "onChange");
170
- if (formFieldValidators[name]?.onChangeAsync) {
171
- validateField(name, "onChangeAsync");
172
- }
173
- if (formFieldDependencies[name]) {
174
- for (const dependentOn of formFieldDependencies[name]) {
175
- validateField(dependentOn, "onChange");
176
- if (formFieldValidators[dependentOn]?.onChangeAsync) {
177
- validateField(dependentOn, "onChangeAsync");
178
- }
179
- }
180
- }
181
- formFieldUpdaters.get(name)?.forEach(call);
182
- };
183
- const setFieldValue = (name, value) => {
184
- objSet(state, name.split("."), value);
185
- onFieldChanged(name);
186
- };
187
- const removeFieldMeta = (name) => {
188
- for (const metaMap of [
189
- formFieldErrors,
190
- asyncFormFieldValidators,
191
- formFieldsTouched,
192
- formFieldValidators,
193
- ]) {
194
- delete metaMap[name];
195
- for (const key in metaMap) {
196
- if (key.startsWith(`${name}.`)) {
197
- delete metaMap[key];
198
- }
199
- }
200
- }
201
- formFieldUpdaters.delete(name);
202
- for (const key in formFieldUpdaters) {
203
- if (key.startsWith(`${name}.`)) {
204
- formFieldUpdaters.delete(key);
205
- }
206
- }
207
- };
208
- const arrayFieldReplace = (name, index, value) => {
209
- const path = [...name.split("."), index.toString()];
210
- objSet(state, path, value);
211
- removeFieldMeta(`${name}.${index}`);
212
- onFieldChanged(name);
213
- updateFieldComponents(name);
214
- };
215
- const arrayFieldPush = (name, value) => {
216
- const path = [...name.split(".")];
217
- const arr = objGet(state, path);
218
- arr.push(value);
219
- onFieldChanged(name);
220
- updateFieldComponents(name);
221
- };
222
- const arrayFieldRemove = (name, index) => {
223
- const path = [...name.split(".")];
224
- const arr = objGet(state, path);
225
- arr.splice(index, 1);
226
- removeFieldMeta(`${name}.${index}`);
227
- onFieldChanged(name);
228
- updateFieldComponents(name);
229
- };
230
- const getErrors = () => {
231
- const errors = [];
232
- for (const fieldName in formFieldErrors) {
233
- const meta = formFieldErrors[fieldName];
234
- errors.push(...[
235
- meta.onChangeAsync,
236
- meta.onMount,
237
- meta.onChange,
238
- meta.onBlur,
239
- ].filter(Boolean));
240
- }
241
- return errors;
242
- };
243
- const isAnyFieldValidating = () => {
244
- for (const fieldName in asyncFormFieldValidators) {
245
- const fieldValidators = asyncFormFieldValidators[fieldName];
246
- if (fieldValidators.onChangeAsync &&
247
- fieldValidators.onChangeAsync.timeout !== -1) {
248
- return true;
249
- }
250
- }
251
- return false;
252
- };
253
- const connectField = (name, update) => {
254
- if (!formFieldUpdaters.has(name)) {
255
- formFieldUpdaters.set(name, new Set());
256
- }
257
- formFieldUpdaters.get(name).add(update);
258
- };
259
- const disconnectField = (name, update) => {
260
- if (!formFieldUpdaters.has(name))
261
- return;
262
- formFieldUpdaters.get(name).delete(update);
263
- const asyncValidators = asyncFormFieldValidators[name] ?? {};
264
- const { abortController, timeout } = asyncValidators.onChangeAsync ?? {};
265
- window.clearTimeout(timeout);
266
- abortController?.abort();
267
- };
268
- const reset = (values) => {
269
- if (values) {
270
- for (const key in values) {
271
- state[key] = values[key];
272
- }
273
- }
274
- else {
275
- const initialValues = (config.initialValues ?? {});
276
- const keys = new Set([
277
- ...Object.keys(state),
278
- ...Object.keys(initialValues),
279
- ]);
280
- for (const key of keys) {
281
- if (key in initialValues) {
282
- state[key] = structuredClone(initialValues[key]);
283
- }
284
- else {
285
- delete state[key];
286
- }
287
- }
288
- }
289
- for (const fieldName in formFieldsTouched) {
290
- delete formFieldsTouched[fieldName];
291
- }
292
- for (const fieldName in asyncFormFieldValidators) {
293
- const asyncFieldValidators = asyncFormFieldValidators[fieldName];
294
- const { timeout, abortController } = asyncFieldValidators?.onChangeAsync ?? {};
295
- if (timeout !== -1) {
296
- window.clearTimeout(timeout);
297
- }
298
- abortController?.abort();
299
- delete asyncFormFieldValidators[fieldName];
300
- }
301
- for (const fieldName in formFieldErrors) {
302
- delete formFieldErrors[fieldName];
303
- }
304
- updateSubscribers();
305
- formFieldUpdaters.forEach((updaters) => updaters.forEach(call));
306
- };
307
- const validateForm = async () => {
308
- var _a;
309
- for (const fieldName in formFieldValidators) {
310
- const fieldValidators = formFieldValidators[fieldName];
311
- if (fieldValidators?.onChange) {
312
- await validateField(fieldName, "onChange");
313
- }
314
- if (fieldValidators?.onSubmit) {
315
- await validateField(fieldName, "onSubmit");
316
- }
317
- if (!formFieldErrors[fieldName]?.onChange &&
318
- fieldValidators?.onChangeAsync) {
319
- const value = state[fieldName];
320
- const abortController = new AbortController();
321
- const asyncValidators = (asyncFormFieldValidators[_a = fieldName] ?? (asyncFormFieldValidators[_a] = {}));
322
- const epoch = asyncValidators.onChangeAsync?.epoch ?? 0;
323
- asyncValidators.onChangeAsync = {
324
- timeout: 0,
325
- epoch,
326
- abortController,
327
- };
328
- const ctx = {
329
- value,
330
- abortSignal: abortController.signal,
331
- };
332
- formFieldErrors[fieldName].onChangeAsync =
333
- await fieldValidators.onChangeAsync(ctx);
334
- asyncValidators.onChangeAsync = {
335
- timeout: -1,
336
- epoch,
337
- abortController: null,
338
- };
339
- updateFieldComponents(fieldName);
340
- updateSubscribers();
341
- }
342
- }
343
- return getErrors();
344
- };
345
- const deleteField = (name) => {
346
- delete state[name];
347
- delete formFieldErrors[name];
348
- delete asyncFormFieldValidators[name];
349
- delete formFieldsTouched[name];
350
- delete formFieldValidators[name];
351
- formFieldUpdaters.delete(name);
352
- updateSubscribers();
353
- };
354
- const resetField = (name) => {
355
- if (config.initialValues?.[name]) {
356
- state[name] = config.initialValues[name];
357
- }
358
- else {
359
- delete state[name];
360
- }
361
- delete formFieldErrors[name];
362
- delete asyncFormFieldValidators[name];
363
- delete formFieldsTouched[name];
364
- updateSubscribers();
365
- };
366
- const getFormContext = () => {
367
- return {
368
- deleteField,
369
- resetField,
370
- setFieldValue,
371
- validateForm,
372
- state,
373
- };
374
- };
375
- const setFieldValidators = (name, validators) => {
376
- formFieldValidators[name] = validators;
377
- if (validators.dependentOn && validators.dependentOn.length > 0) {
378
- for (const dependentOn of validators.dependentOn) {
379
- if (!formFieldDependencies[dependentOn]) {
380
- formFieldDependencies[dependentOn] = new Set();
381
- }
382
- formFieldDependencies[dependentOn].add(name);
383
- }
384
- }
385
- };
386
- const setSubmitting = (submitting) => {
387
- if (submitting !== isSubmitting) {
388
- isSubmitting = submitting;
389
- updateSubscribers();
390
- }
391
- };
392
- return {
393
- subscribers,
394
- state,
395
- validateField,
396
- getFieldState,
397
- setFieldValue,
398
- arrayFieldReplace,
399
- arrayFieldPush,
400
- arrayFieldRemove,
401
- connectField,
402
- disconnectField,
403
- setFieldValidators,
404
- getSelectorState,
405
- validateForm,
406
- reset,
407
- getFormContext,
408
- setSubmitting,
409
- };
410
- }
411
- export function useForm(config) {
412
- return useHook("useForm", {}, ({ hook, isInit, isHMR }) => {
413
- if (__DEV__) {
414
- if (isInit) {
415
- hook.dev = {
416
- initialArgs: [config],
417
- };
418
- }
419
- if (isHMR) {
420
- const [c] = hook.dev.initialArgs;
421
- if (safeStringify(c) !== safeStringify(config)) {
422
- hook.cleanup?.();
423
- isInit = true;
424
- hook.dev.initialArgs = [config];
425
- }
426
- }
427
- }
428
- if (isInit) {
429
- const $controller = (hook.formController = createFormController(config));
430
- hook.Field = function Field(props) {
431
- const didMount = useRef(false);
432
- const update = useRequestUpdate();
433
- if (props.validators) {
434
- $controller.setFieldValidators(props.name, props.validators);
435
- }
436
- useEffect(() => {
437
- $controller.connectField(props.name, update);
438
- if (props.validators?.onMount && !didMount.current) {
439
- didMount.current = true;
440
- $controller.validateField(props.name, "onMount");
441
- }
442
- return () => {
443
- $controller.disconnectField(props.name, update);
444
- };
445
- }, []);
446
- const fieldState = $controller.getFieldState(props.name);
447
- const childProps = {
448
- name: props.name,
449
- state: fieldState,
450
- handleChange: (value) => {
451
- $controller.setFieldValue(props.name, value);
452
- },
453
- handleBlur: () => {
454
- $controller.validateField(props.name, "onBlur");
455
- },
456
- };
457
- if (props.array) {
458
- const asArrayProps = childProps;
459
- asArrayProps.items = {
460
- replace: (index, value) => {
461
- $controller.arrayFieldReplace(props.name, index, value);
462
- },
463
- push: (value) => {
464
- $controller.arrayFieldPush(props.name, value);
465
- },
466
- remove: (index) => {
467
- $controller.arrayFieldRemove(props.name, index);
468
- },
469
- };
470
- }
471
- return Fragment({
472
- key: useMemo(generateRandomID, []),
473
- children: props.children(childProps),
474
- });
475
- };
476
- hook.Subscribe = function Subscribe(props) {
477
- const selection = useHook("useFormSubscription", { sub: null }, ({ hook, isInit, isHMR, update }) => {
478
- if (__DEV__ && isHMR) {
479
- isInit = true;
480
- hook.cleanup?.();
481
- }
482
- if (isInit) {
483
- hook.sub = {
484
- selector: props.selector,
485
- selection: props.selector($controller.getSelectorState()),
486
- update,
487
- };
488
- $controller.subscribers.add(hook.sub);
489
- hook.cleanup = () => $controller.subscribers.delete(hook.sub);
490
- }
491
- return hook.sub.selection;
492
- });
493
- return props.children(selection);
494
- };
495
- }
496
- return {
497
- Field: hook.Field,
498
- Subscribe: hook.Subscribe,
499
- handleSubmit: async () => {
500
- const controller = hook.formController;
501
- const errors = await controller.validateForm();
502
- const formCtx = controller.getFormContext();
503
- if (errors.length)
504
- return config.onSubmitInvalid?.(formCtx);
505
- controller.setSubmitting(true);
506
- try {
507
- await config.onSubmit?.(formCtx);
508
- }
509
- finally {
510
- controller.setSubmitting(false);
511
- }
512
- },
513
- reset: (values) => hook.formController.reset(values),
514
- getFieldState: (name) => hook.formController.getFieldState(name),
515
- };
516
- });
517
- }
518
- //# sourceMappingURL=index.js.map