@jcoreio/zod-forms 1.0.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 (521) hide show
  1. package/FieldPath.d.ts +26 -0
  2. package/FieldPath.d.ts.map +1 -0
  3. package/FieldPath.js +155 -0
  4. package/FieldPath.js.map +1 -0
  5. package/FieldPath.mjs +138 -0
  6. package/FieldPath.mjs.map +1 -0
  7. package/FormAction.d.ts +15 -0
  8. package/FormAction.d.ts.map +1 -0
  9. package/FormAction.js +6 -0
  10. package/FormAction.js.map +1 -0
  11. package/FormAction.mjs +2 -0
  12. package/FormAction.mjs.map +1 -0
  13. package/FormContext.d.ts +39 -0
  14. package/FormContext.d.ts.map +1 -0
  15. package/FormContext.js +10 -0
  16. package/FormContext.js.map +1 -0
  17. package/FormContext.mjs +3 -0
  18. package/FormContext.mjs.map +1 -0
  19. package/FormState.d.ts +31 -0
  20. package/FormState.d.ts.map +1 -0
  21. package/FormState.js +6 -0
  22. package/FormState.js.map +1 -0
  23. package/FormState.mjs +2 -0
  24. package/FormState.mjs.map +1 -0
  25. package/FormStateContext.d.ts +8 -0
  26. package/FormStateContext.d.ts.map +1 -0
  27. package/FormStateContext.js +10 -0
  28. package/FormStateContext.js.map +1 -0
  29. package/FormStateContext.mjs +3 -0
  30. package/FormStateContext.mjs.map +1 -0
  31. package/LICENSE.md +21 -0
  32. package/README.md +154 -0
  33. package/actions/addHandlers.d.ts +15 -0
  34. package/actions/addHandlers.d.ts.map +1 -0
  35. package/actions/addHandlers.js +16 -0
  36. package/actions/addHandlers.js.map +1 -0
  37. package/actions/addHandlers.mjs +7 -0
  38. package/actions/addHandlers.mjs.map +1 -0
  39. package/actions/arrayActions.d.ts +113 -0
  40. package/actions/arrayActions.d.ts.map +1 -0
  41. package/actions/arrayActions.js +146 -0
  42. package/actions/arrayActions.js.map +1 -0
  43. package/actions/arrayActions.mjs +120 -0
  44. package/actions/arrayActions.mjs.map +1 -0
  45. package/actions/initialize.d.ts +13 -0
  46. package/actions/initialize.d.ts.map +1 -0
  47. package/actions/initialize.js +16 -0
  48. package/actions/initialize.js.map +1 -0
  49. package/actions/initialize.mjs +7 -0
  50. package/actions/initialize.mjs.map +1 -0
  51. package/actions/removeHandlers.d.ts +10 -0
  52. package/actions/removeHandlers.d.ts.map +1 -0
  53. package/actions/removeHandlers.js +16 -0
  54. package/actions/removeHandlers.js.map +1 -0
  55. package/actions/removeHandlers.mjs +7 -0
  56. package/actions/removeHandlers.mjs.map +1 -0
  57. package/actions/setMeta.d.ts +9 -0
  58. package/actions/setMeta.d.ts.map +1 -0
  59. package/actions/setMeta.js +14 -0
  60. package/actions/setMeta.js.map +1 -0
  61. package/actions/setMeta.mjs +8 -0
  62. package/actions/setMeta.mjs.map +1 -0
  63. package/actions/setMounted.d.ts +6 -0
  64. package/actions/setMounted.d.ts.map +1 -0
  65. package/actions/setMounted.js +13 -0
  66. package/actions/setMounted.js.map +1 -0
  67. package/actions/setMounted.mjs +7 -0
  68. package/actions/setMounted.mjs.map +1 -0
  69. package/actions/setRawValue.d.ts +9 -0
  70. package/actions/setRawValue.d.ts.map +1 -0
  71. package/actions/setRawValue.js +14 -0
  72. package/actions/setRawValue.js.map +1 -0
  73. package/actions/setRawValue.mjs +8 -0
  74. package/actions/setRawValue.mjs.map +1 -0
  75. package/actions/setSubmitStatus.d.ts +14 -0
  76. package/actions/setSubmitStatus.d.ts.map +1 -0
  77. package/actions/setSubmitStatus.js +16 -0
  78. package/actions/setSubmitStatus.js.map +1 -0
  79. package/actions/setSubmitStatus.mjs +7 -0
  80. package/actions/setSubmitStatus.mjs.map +1 -0
  81. package/actions/setValue.d.ts +12 -0
  82. package/actions/setValue.d.ts.map +1 -0
  83. package/actions/setValue.js +18 -0
  84. package/actions/setValue.js.map +1 -0
  85. package/actions/setValue.mjs +9 -0
  86. package/actions/setValue.mjs.map +1 -0
  87. package/actions/submit.d.ts +5 -0
  88. package/actions/submit.d.ts.map +1 -0
  89. package/actions/submit.js +12 -0
  90. package/actions/submit.js.map +1 -0
  91. package/actions/submit.mjs +6 -0
  92. package/actions/submit.mjs.map +1 -0
  93. package/actions/submitSucceeded.d.ts +5 -0
  94. package/actions/submitSucceeded.d.ts.map +1 -0
  95. package/actions/submitSucceeded.js +12 -0
  96. package/actions/submitSucceeded.js.map +1 -0
  97. package/actions/submitSucceeded.mjs +6 -0
  98. package/actions/submitSucceeded.mjs.map +1 -0
  99. package/createFormMiddleware.d.ts +6 -0
  100. package/createFormMiddleware.d.ts.map +1 -0
  101. package/createFormMiddleware.js +186 -0
  102. package/createFormMiddleware.js.map +1 -0
  103. package/createFormMiddleware.mjs +53 -0
  104. package/createFormMiddleware.mjs.map +1 -0
  105. package/createFormProvider.d.ts +7 -0
  106. package/createFormProvider.d.ts.map +1 -0
  107. package/createFormProvider.js +85 -0
  108. package/createFormProvider.js.map +1 -0
  109. package/createFormProvider.mjs +63 -0
  110. package/createFormProvider.mjs.map +1 -0
  111. package/createFormReducer.d.ts +9 -0
  112. package/createFormReducer.d.ts.map +1 -0
  113. package/createFormReducer.js +95 -0
  114. package/createFormReducer.js.map +1 -0
  115. package/createFormReducer.mjs +84 -0
  116. package/createFormReducer.mjs.map +1 -0
  117. package/createSelectFieldErrorMap.d.ts +32 -0
  118. package/createSelectFieldErrorMap.d.ts.map +1 -0
  119. package/createSelectFieldErrorMap.js +43 -0
  120. package/createSelectFieldErrorMap.js.map +1 -0
  121. package/createSelectFieldErrorMap.mjs +24 -0
  122. package/createSelectFieldErrorMap.mjs.map +1 -0
  123. package/createSelectFormStatus.d.ts +89 -0
  124. package/createSelectFormStatus.d.ts.map +1 -0
  125. package/createSelectFormStatus.js +54 -0
  126. package/createSelectFormStatus.js.map +1 -0
  127. package/createSelectFormStatus.mjs +28 -0
  128. package/createSelectFormStatus.mjs.map +1 -0
  129. package/createSelectFormValues.d.ts +45 -0
  130. package/createSelectFormValues.d.ts.map +1 -0
  131. package/createSelectFormValues.js +24 -0
  132. package/createSelectFormValues.js.map +1 -0
  133. package/createSelectFormValues.mjs +10 -0
  134. package/createSelectFormValues.mjs.map +1 -0
  135. package/createZodForm.d.ts +33 -0
  136. package/createZodForm.d.ts.map +1 -0
  137. package/createZodForm.js +51 -0
  138. package/createZodForm.js.map +1 -0
  139. package/createZodForm.mjs +46 -0
  140. package/createZodForm.mjs.map +1 -0
  141. package/index.d.ts +14 -0
  142. package/index.d.ts.map +1 -0
  143. package/index.js +76 -0
  144. package/index.js.map +1 -0
  145. package/index.mjs +11 -0
  146. package/index.mjs.map +1 -0
  147. package/initFormState.d.ts +4 -0
  148. package/initFormState.d.ts.map +1 -0
  149. package/initFormState.js +22 -0
  150. package/initFormState.js.map +1 -0
  151. package/initFormState.mjs +16 -0
  152. package/initFormState.mjs.map +1 -0
  153. package/package.json +49 -0
  154. package/reducers/addHandlers.d.ts +24 -0
  155. package/reducers/addHandlers.d.ts.map +1 -0
  156. package/reducers/addHandlers.js +24 -0
  157. package/reducers/addHandlers.js.map +1 -0
  158. package/reducers/addHandlers.mjs +21 -0
  159. package/reducers/addHandlers.mjs.map +1 -0
  160. package/reducers/arrayInsert.d.ts +7 -0
  161. package/reducers/arrayInsert.d.ts.map +1 -0
  162. package/reducers/arrayInsert.js +16 -0
  163. package/reducers/arrayInsert.js.map +1 -0
  164. package/reducers/arrayInsert.mjs +12 -0
  165. package/reducers/arrayInsert.mjs.map +1 -0
  166. package/reducers/arrayInsertRaw.d.ts +7 -0
  167. package/reducers/arrayInsertRaw.d.ts.map +1 -0
  168. package/reducers/arrayInsertRaw.js +22 -0
  169. package/reducers/arrayInsertRaw.js.map +1 -0
  170. package/reducers/arrayInsertRaw.mjs +14 -0
  171. package/reducers/arrayInsertRaw.mjs.map +1 -0
  172. package/reducers/arrayMove.d.ts +8 -0
  173. package/reducers/arrayMove.d.ts.map +1 -0
  174. package/reducers/arrayMove.js +25 -0
  175. package/reducers/arrayMove.js.map +1 -0
  176. package/reducers/arrayMove.mjs +16 -0
  177. package/reducers/arrayMove.mjs.map +1 -0
  178. package/reducers/arrayPop.d.ts +7 -0
  179. package/reducers/arrayPop.d.ts.map +1 -0
  180. package/reducers/arrayPop.js +13 -0
  181. package/reducers/arrayPop.js.map +1 -0
  182. package/reducers/arrayPop.mjs +5 -0
  183. package/reducers/arrayPop.mjs.map +1 -0
  184. package/reducers/arrayPush.d.ts +7 -0
  185. package/reducers/arrayPush.d.ts.map +1 -0
  186. package/reducers/arrayPush.js +15 -0
  187. package/reducers/arrayPush.js.map +1 -0
  188. package/reducers/arrayPush.mjs +11 -0
  189. package/reducers/arrayPush.mjs.map +1 -0
  190. package/reducers/arrayPushRaw.d.ts +7 -0
  191. package/reducers/arrayPushRaw.d.ts.map +1 -0
  192. package/reducers/arrayPushRaw.js +17 -0
  193. package/reducers/arrayPushRaw.js.map +1 -0
  194. package/reducers/arrayPushRaw.mjs +9 -0
  195. package/reducers/arrayPushRaw.mjs.map +1 -0
  196. package/reducers/arrayRemove.d.ts +7 -0
  197. package/reducers/arrayRemove.d.ts.map +1 -0
  198. package/reducers/arrayRemove.js +21 -0
  199. package/reducers/arrayRemove.js.map +1 -0
  200. package/reducers/arrayRemove.mjs +13 -0
  201. package/reducers/arrayRemove.mjs.map +1 -0
  202. package/reducers/arrayRemoveAll.d.ts +7 -0
  203. package/reducers/arrayRemoveAll.d.ts.map +1 -0
  204. package/reducers/arrayRemoveAll.js +14 -0
  205. package/reducers/arrayRemoveAll.js.map +1 -0
  206. package/reducers/arrayRemoveAll.mjs +8 -0
  207. package/reducers/arrayRemoveAll.mjs.map +1 -0
  208. package/reducers/arrayShift.d.ts +7 -0
  209. package/reducers/arrayShift.d.ts.map +1 -0
  210. package/reducers/arrayShift.js +14 -0
  211. package/reducers/arrayShift.js.map +1 -0
  212. package/reducers/arrayShift.mjs +8 -0
  213. package/reducers/arrayShift.mjs.map +1 -0
  214. package/reducers/arraySplice.d.ts +7 -0
  215. package/reducers/arraySplice.d.ts.map +1 -0
  216. package/reducers/arraySplice.js +20 -0
  217. package/reducers/arraySplice.js.map +1 -0
  218. package/reducers/arraySplice.mjs +14 -0
  219. package/reducers/arraySplice.mjs.map +1 -0
  220. package/reducers/arraySpliceRaw.d.ts +7 -0
  221. package/reducers/arraySpliceRaw.d.ts.map +1 -0
  222. package/reducers/arraySpliceRaw.js +26 -0
  223. package/reducers/arraySpliceRaw.js.map +1 -0
  224. package/reducers/arraySpliceRaw.mjs +18 -0
  225. package/reducers/arraySpliceRaw.mjs.map +1 -0
  226. package/reducers/arraySwap.d.ts +8 -0
  227. package/reducers/arraySwap.d.ts.map +1 -0
  228. package/reducers/arraySwap.js +27 -0
  229. package/reducers/arraySwap.js.map +1 -0
  230. package/reducers/arraySwap.mjs +18 -0
  231. package/reducers/arraySwap.mjs.map +1 -0
  232. package/reducers/arrayUnshift.d.ts +7 -0
  233. package/reducers/arrayUnshift.d.ts.map +1 -0
  234. package/reducers/arrayUnshift.js +15 -0
  235. package/reducers/arrayUnshift.js.map +1 -0
  236. package/reducers/arrayUnshift.mjs +11 -0
  237. package/reducers/arrayUnshift.mjs.map +1 -0
  238. package/reducers/arrayUnshiftRaw.d.ts +7 -0
  239. package/reducers/arrayUnshiftRaw.d.ts.map +1 -0
  240. package/reducers/arrayUnshiftRaw.js +17 -0
  241. package/reducers/arrayUnshiftRaw.js.map +1 -0
  242. package/reducers/arrayUnshiftRaw.mjs +9 -0
  243. package/reducers/arrayUnshiftRaw.mjs.map +1 -0
  244. package/reducers/initialize.d.ts +46 -0
  245. package/reducers/initialize.d.ts.map +1 -0
  246. package/reducers/initialize.js +46 -0
  247. package/reducers/initialize.js.map +1 -0
  248. package/reducers/initialize.mjs +38 -0
  249. package/reducers/initialize.mjs.map +1 -0
  250. package/reducers/removeHandlers.d.ts +24 -0
  251. package/reducers/removeHandlers.d.ts.map +1 -0
  252. package/reducers/removeHandlers.js +24 -0
  253. package/reducers/removeHandlers.js.map +1 -0
  254. package/reducers/removeHandlers.mjs +21 -0
  255. package/reducers/removeHandlers.mjs.map +1 -0
  256. package/reducers/setMeta.d.ts +6 -0
  257. package/reducers/setMeta.d.ts.map +1 -0
  258. package/reducers/setMeta.js +28 -0
  259. package/reducers/setMeta.js.map +1 -0
  260. package/reducers/setMeta.mjs +21 -0
  261. package/reducers/setMeta.mjs.map +1 -0
  262. package/reducers/setRawValue.d.ts +27 -0
  263. package/reducers/setRawValue.d.ts.map +1 -0
  264. package/reducers/setRawValue.js +35 -0
  265. package/reducers/setRawValue.js.map +1 -0
  266. package/reducers/setRawValue.mjs +26 -0
  267. package/reducers/setRawValue.mjs.map +1 -0
  268. package/reducers/setSubmitStatus.d.ts +24 -0
  269. package/reducers/setSubmitStatus.d.ts.map +1 -0
  270. package/reducers/setSubmitStatus.js +18 -0
  271. package/reducers/setSubmitStatus.js.map +1 -0
  272. package/reducers/setSubmitStatus.mjs +12 -0
  273. package/reducers/setSubmitStatus.mjs.map +1 -0
  274. package/reducers/setValue.d.ts +28 -0
  275. package/reducers/setValue.d.ts.map +1 -0
  276. package/reducers/setValue.js +41 -0
  277. package/reducers/setValue.js.map +1 -0
  278. package/reducers/setValue.mjs +32 -0
  279. package/reducers/setValue.mjs.map +1 -0
  280. package/reducers/submitSucceeded.d.ts +23 -0
  281. package/reducers/submitSucceeded.d.ts.map +1 -0
  282. package/reducers/submitSucceeded.js +22 -0
  283. package/reducers/submitSucceeded.js.map +1 -0
  284. package/reducers/submitSucceeded.mjs +13 -0
  285. package/reducers/submitSucceeded.mjs.map +1 -0
  286. package/reducers/util/getInverseArrayElementSchema.d.ts +3 -0
  287. package/reducers/util/getInverseArrayElementSchema.d.ts.map +1 -0
  288. package/reducers/util/getInverseArrayElementSchema.js +14 -0
  289. package/reducers/util/getInverseArrayElementSchema.js.map +1 -0
  290. package/reducers/util/getInverseArrayElementSchema.mjs +8 -0
  291. package/reducers/util/getInverseArrayElementSchema.mjs.map +1 -0
  292. package/reducers/util/updateRawArray.d.ts +7 -0
  293. package/reducers/util/updateRawArray.d.ts.map +1 -0
  294. package/reducers/util/updateRawArray.js +14 -0
  295. package/reducers/util/updateRawArray.js.map +1 -0
  296. package/reducers/util/updateRawArray.mjs +8 -0
  297. package/reducers/util/updateRawArray.mjs.map +1 -0
  298. package/src/FieldPath.ts +215 -0
  299. package/src/FormAction.ts +26 -0
  300. package/src/FormContext.ts +44 -0
  301. package/src/FormState.ts +36 -0
  302. package/src/FormStateContext.ts +13 -0
  303. package/src/actions/addHandlers.ts +23 -0
  304. package/src/actions/arrayActions.ts +183 -0
  305. package/src/actions/initialize.ts +16 -0
  306. package/src/actions/removeHandlers.ts +13 -0
  307. package/src/actions/setMeta.ts +17 -0
  308. package/src/actions/setMounted.ts +8 -0
  309. package/src/actions/setRawValue.ts +17 -0
  310. package/src/actions/setSubmitStatus.ts +26 -0
  311. package/src/actions/setValue.ts +21 -0
  312. package/src/actions/submit.ts +7 -0
  313. package/src/actions/submitSucceeded.ts +7 -0
  314. package/src/createFormMiddleware.ts +74 -0
  315. package/src/createFormProvider.tsx +101 -0
  316. package/src/createFormReducer.ts +91 -0
  317. package/src/createSelectFieldErrorMap.ts +47 -0
  318. package/src/createSelectFormStatus.ts +41 -0
  319. package/src/createSelectFormValues.ts +16 -0
  320. package/src/createZodForm.ts +57 -0
  321. package/src/index.ts +32 -0
  322. package/src/initFormState.ts +18 -0
  323. package/src/reducers/addHandlers.ts +21 -0
  324. package/src/reducers/arrayInsert.ts +19 -0
  325. package/src/reducers/arrayInsertRaw.ts +22 -0
  326. package/src/reducers/arrayMove.ts +36 -0
  327. package/src/reducers/arrayPop.ts +16 -0
  328. package/src/reducers/arrayPush.ts +20 -0
  329. package/src/reducers/arrayPushRaw.ts +18 -0
  330. package/src/reducers/arrayRemove.ts +22 -0
  331. package/src/reducers/arrayRemoveAll.ts +15 -0
  332. package/src/reducers/arrayShift.ts +15 -0
  333. package/src/reducers/arraySplice.ts +17 -0
  334. package/src/reducers/arraySpliceRaw.ts +30 -0
  335. package/src/reducers/arraySwap.ts +29 -0
  336. package/src/reducers/arrayUnshift.ts +16 -0
  337. package/src/reducers/arrayUnshiftRaw.ts +18 -0
  338. package/src/reducers/initialize.ts +47 -0
  339. package/src/reducers/removeHandlers.ts +21 -0
  340. package/src/reducers/setMeta.ts +26 -0
  341. package/src/reducers/setRawValue.ts +40 -0
  342. package/src/reducers/setSubmitStatus.ts +15 -0
  343. package/src/reducers/setValue.ts +49 -0
  344. package/src/reducers/submitSucceeded.ts +17 -0
  345. package/src/reducers/util/getInverseArrayElementSchema.ts +9 -0
  346. package/src/reducers/util/updateRawArray.ts +25 -0
  347. package/src/useArrayField.ts +161 -0
  348. package/src/useField.ts +152 -0
  349. package/src/useFormContext.ts +11 -0
  350. package/src/useFormDispatch.ts +13 -0
  351. package/src/useFormSelector.ts +9 -0
  352. package/src/useFormStatus.ts +14 -0
  353. package/src/useFormValues.ts +8 -0
  354. package/src/useHtmlField.ts +235 -0
  355. package/src/useInitialize.ts +14 -0
  356. package/src/useSubmit.ts +29 -0
  357. package/src/util/PathInSchema.ts +7 -0
  358. package/src/util/PathInType.ts +26 -0
  359. package/src/util/SchemaAt.ts +68 -0
  360. package/src/util/acceptsArray.ts +72 -0
  361. package/src/util/acceptsBigint.ts +71 -0
  362. package/src/util/acceptsNumber.ts +71 -0
  363. package/src/util/bindActionsToField.ts +22 -0
  364. package/src/util/get.ts +10 -0
  365. package/src/util/getArrayElementSchema.ts +74 -0
  366. package/src/util/maybeParse.ts +9 -0
  367. package/src/util/parsePathstring.ts +119 -0
  368. package/src/util/pathstring.ts +32 -0
  369. package/src/util/set.ts +25 -0
  370. package/src/util/setAdd.ts +6 -0
  371. package/src/util/setDelete.ts +6 -0
  372. package/useArrayField.d.ts +34 -0
  373. package/useArrayField.d.ts.map +1 -0
  374. package/useArrayField.js +99 -0
  375. package/useArrayField.js.map +1 -0
  376. package/useArrayField.mjs +75 -0
  377. package/useArrayField.mjs.map +1 -0
  378. package/useField.d.ts +34 -0
  379. package/useField.d.ts.map +1 -0
  380. package/useField.js +98 -0
  381. package/useField.js.map +1 -0
  382. package/useField.mjs +75 -0
  383. package/useField.mjs.map +1 -0
  384. package/useFormContext.d.ts +4 -0
  385. package/useFormContext.d.ts.map +1 -0
  386. package/useFormContext.js +17 -0
  387. package/useFormContext.js.map +1 -0
  388. package/useFormContext.mjs +10 -0
  389. package/useFormContext.mjs.map +1 -0
  390. package/useFormDispatch.d.ts +7 -0
  391. package/useFormDispatch.d.ts.map +1 -0
  392. package/useFormDispatch.js +10 -0
  393. package/useFormDispatch.js.map +1 -0
  394. package/useFormDispatch.mjs +4 -0
  395. package/useFormDispatch.mjs.map +1 -0
  396. package/useFormSelector.d.ts +6 -0
  397. package/useFormSelector.d.ts.map +1 -0
  398. package/useFormSelector.js +10 -0
  399. package/useFormSelector.js.map +1 -0
  400. package/useFormSelector.mjs +4 -0
  401. package/useFormSelector.mjs.map +1 -0
  402. package/useFormStatus.d.ts +13 -0
  403. package/useFormStatus.d.ts.map +1 -0
  404. package/useFormStatus.js +15 -0
  405. package/useFormStatus.js.map +1 -0
  406. package/useFormStatus.mjs +10 -0
  407. package/useFormStatus.mjs.map +1 -0
  408. package/useFormValues.d.ts +8 -0
  409. package/useFormValues.d.ts.map +1 -0
  410. package/useFormValues.js +14 -0
  411. package/useFormValues.js.map +1 -0
  412. package/useFormValues.mjs +9 -0
  413. package/useFormValues.mjs.map +1 -0
  414. package/useHtmlField.d.ts +41 -0
  415. package/useHtmlField.d.ts.map +1 -0
  416. package/useHtmlField.js +161 -0
  417. package/useHtmlField.js.map +1 -0
  418. package/useHtmlField.mjs +148 -0
  419. package/useHtmlField.mjs.map +1 -0
  420. package/useInitialize.d.ts +5 -0
  421. package/useInitialize.d.ts.map +1 -0
  422. package/useInitialize.js +18 -0
  423. package/useInitialize.js.map +1 -0
  424. package/useInitialize.mjs +11 -0
  425. package/useInitialize.mjs.map +1 -0
  426. package/useSubmit.d.ts +5 -0
  427. package/useSubmit.d.ts.map +1 -0
  428. package/useSubmit.js +53 -0
  429. package/useSubmit.js.map +1 -0
  430. package/useSubmit.mjs +39 -0
  431. package/useSubmit.mjs.map +1 -0
  432. package/util/PathInSchema.d.ts +5 -0
  433. package/util/PathInSchema.d.ts.map +1 -0
  434. package/util/PathInSchema.js +6 -0
  435. package/util/PathInSchema.js.map +1 -0
  436. package/util/PathInSchema.mjs +2 -0
  437. package/util/PathInSchema.mjs.map +1 -0
  438. package/util/PathInType.d.ts +11 -0
  439. package/util/PathInType.d.ts.map +1 -0
  440. package/util/PathInType.js +6 -0
  441. package/util/PathInType.js.map +1 -0
  442. package/util/PathInType.mjs +2 -0
  443. package/util/PathInType.mjs.map +1 -0
  444. package/util/SchemaAt.d.ts +5 -0
  445. package/util/SchemaAt.d.ts.map +1 -0
  446. package/util/SchemaAt.js +6 -0
  447. package/util/SchemaAt.js.map +1 -0
  448. package/util/SchemaAt.mjs +2 -0
  449. package/util/SchemaAt.mjs.map +1 -0
  450. package/util/acceptsArray.d.ts +3 -0
  451. package/util/acceptsArray.d.ts.map +1 -0
  452. package/util/acceptsArray.js +89 -0
  453. package/util/acceptsArray.js.map +1 -0
  454. package/util/acceptsArray.mjs +105 -0
  455. package/util/acceptsArray.mjs.map +1 -0
  456. package/util/acceptsBigint.d.ts +3 -0
  457. package/util/acceptsBigint.d.ts.map +1 -0
  458. package/util/acceptsBigint.js +88 -0
  459. package/util/acceptsBigint.js.map +1 -0
  460. package/util/acceptsBigint.mjs +104 -0
  461. package/util/acceptsBigint.mjs.map +1 -0
  462. package/util/acceptsNumber.d.ts +3 -0
  463. package/util/acceptsNumber.d.ts.map +1 -0
  464. package/util/acceptsNumber.js +88 -0
  465. package/util/acceptsNumber.js.map +1 -0
  466. package/util/acceptsNumber.mjs +104 -0
  467. package/util/acceptsNumber.mjs.map +1 -0
  468. package/util/bindActionsToField.d.ts +7 -0
  469. package/util/bindActionsToField.d.ts.map +1 -0
  470. package/util/bindActionsToField.js +22 -0
  471. package/util/bindActionsToField.js.map +1 -0
  472. package/util/bindActionsToField.mjs +4 -0
  473. package/util/bindActionsToField.mjs.map +1 -0
  474. package/util/get.d.ts +2 -0
  475. package/util/get.d.ts.map +1 -0
  476. package/util/get.js +12 -0
  477. package/util/get.js.map +1 -0
  478. package/util/get.mjs +4 -0
  479. package/util/get.mjs.map +1 -0
  480. package/util/getArrayElementSchema.d.ts +3 -0
  481. package/util/getArrayElementSchema.d.ts.map +1 -0
  482. package/util/getArrayElementSchema.js +87 -0
  483. package/util/getArrayElementSchema.js.map +1 -0
  484. package/util/getArrayElementSchema.mjs +102 -0
  485. package/util/getArrayElementSchema.mjs.map +1 -0
  486. package/util/maybeParse.d.ts +3 -0
  487. package/util/maybeParse.d.ts.map +1 -0
  488. package/util/maybeParse.js +11 -0
  489. package/util/maybeParse.js.map +1 -0
  490. package/util/maybeParse.mjs +5 -0
  491. package/util/maybeParse.mjs.map +1 -0
  492. package/util/parsePathstring.d.ts +40 -0
  493. package/util/parsePathstring.d.ts.map +1 -0
  494. package/util/parsePathstring.js +55 -0
  495. package/util/parsePathstring.js.map +1 -0
  496. package/util/parsePathstring.mjs +35 -0
  497. package/util/parsePathstring.mjs.map +1 -0
  498. package/util/pathstring.d.ts +13 -0
  499. package/util/pathstring.d.ts.map +1 -0
  500. package/util/pathstring.js +15 -0
  501. package/util/pathstring.js.map +1 -0
  502. package/util/pathstring.mjs +7 -0
  503. package/util/pathstring.mjs.map +1 -0
  504. package/util/set.d.ts +2 -0
  505. package/util/set.d.ts.map +1 -0
  506. package/util/set.js +33 -0
  507. package/util/set.js.map +1 -0
  508. package/util/set.mjs +23 -0
  509. package/util/set.mjs.map +1 -0
  510. package/util/setAdd.d.ts +2 -0
  511. package/util/setAdd.d.ts.map +1 -0
  512. package/util/setAdd.js +13 -0
  513. package/util/setAdd.js.map +1 -0
  514. package/util/setAdd.mjs +7 -0
  515. package/util/setAdd.mjs.map +1 -0
  516. package/util/setDelete.d.ts +2 -0
  517. package/util/setDelete.d.ts.map +1 -0
  518. package/util/setDelete.js +13 -0
  519. package/util/setDelete.js.map +1 -0
  520. package/util/setDelete.mjs +7 -0
  521. package/util/setDelete.mjs.map +1 -0
@@ -0,0 +1,17 @@
1
+ import z from 'zod'
2
+ import { FormState } from '../FormState'
3
+
4
+ export function submitSucceededReducer<T extends z.ZodTypeAny>(
5
+ state: FormState<T>
6
+ ) {
7
+ return {
8
+ ...state,
9
+ submitting: false,
10
+ submitSucceeded: true,
11
+ submitFailed: false,
12
+ submitError: undefined,
13
+ submitPromise: undefined,
14
+ initialValues: state.submittedValues,
15
+ rawInitialValues: state.rawSubmittedValues,
16
+ }
17
+ }
@@ -0,0 +1,9 @@
1
+ import z from 'zod'
2
+ import { getArrayElementSchema } from '../../util/getArrayElementSchema'
3
+ import { invert } from 'zod-invertible'
4
+
5
+ export function getInverseArrayElementSchema(schema: z.ZodTypeAny) {
6
+ const elemSchema = getArrayElementSchema(schema)
7
+ if (!elemSchema) throw new Error('field is not an array')
8
+ return invert(elemSchema)
9
+ }
@@ -0,0 +1,25 @@
1
+ import z from 'zod'
2
+ import { Reducer } from 'react'
3
+ import { FieldPath, FieldPathForRawValue } from '../../FieldPath'
4
+ import { FormState } from '../../FormState'
5
+ import { FormAction } from '../../FormAction'
6
+ import { get } from '../../util/get'
7
+ import { setRawValue } from '../../actions/setRawValue'
8
+
9
+ export function updateRawArray<
10
+ T extends z.ZodTypeAny,
11
+ Field extends FieldPathForRawValue<any[]>
12
+ >(
13
+ reducer: Reducer<FormState<T>, FormAction<T>>,
14
+ state: FormState<T>,
15
+ field: FieldPath,
16
+ updater: (
17
+ array: z.input<Field['schema']> | undefined
18
+ ) => z.input<Field['schema']> | undefined
19
+ ) {
20
+ const oldValue = get(state.rawValues, field.path)
21
+ const newValue = updater(oldValue as any)
22
+ return newValue === oldValue
23
+ ? state
24
+ : reducer(state, setRawValue(field, newValue))
25
+ }
@@ -0,0 +1,161 @@
1
+ import z from 'zod'
2
+ import { BasePath, FieldPath, FieldPathForRawValue } from './FieldPath'
3
+ import React from 'react'
4
+ import { useFormContext } from './useFormContext'
5
+ import { PathInSchema, PathstringInSchema } from './util/PathInSchema'
6
+ import { parsePathstring } from './util/parsePathstring'
7
+ import { SchemaAt } from './util/SchemaAt'
8
+ import { bindActionsToField } from './util/bindActionsToField'
9
+ import { arrayActions } from './actions/arrayActions'
10
+ import { createSelector, createStructuredSelector } from 'reselect'
11
+ import { get } from './util/get'
12
+ import isEqual from 'fast-deep-equal'
13
+ import {
14
+ TypedUseFormSelector,
15
+ useFormSelector as untypedUseFormSelector,
16
+ } from './useFormSelector'
17
+ import { shallowEqual } from 'react-redux'
18
+ import { setValue } from './actions/setValue'
19
+ import { setRawValue } from './actions/setRawValue'
20
+ import { setMeta } from './actions/setMeta'
21
+ import { FieldMeta } from './FormState'
22
+
23
+ export type UseArrayFieldProps<Field extends FieldPath> = NonNullable<
24
+ z.input<Field['schema']>
25
+ > extends any[]
26
+ ? FieldMeta &
27
+ ReturnType<
28
+ typeof bindActionsToField<
29
+ typeof arrayActions & {
30
+ setValue: typeof setValue
31
+ setRawValue: typeof setRawValue
32
+ setMeta: typeof setMeta
33
+ }
34
+ >
35
+ > & {
36
+ elements: FieldPath<SchemaAt<Field['schema'], [number]>>[]
37
+ error?: string
38
+ dirty: boolean
39
+ pristine: boolean
40
+ valid: boolean
41
+ invalid: boolean
42
+ }
43
+ : { ERROR: 'not an array field' }
44
+
45
+ export interface TypedUseArrayField<T extends z.ZodTypeAny> {
46
+ <Field extends FieldPathForRawValue<any[] | null | undefined>>(
47
+ field: Field
48
+ ): UseArrayFieldProps<Field>
49
+ <Path extends PathInSchema<T>>(path: Path): UseArrayFieldProps<
50
+ FieldPath<SchemaAt<T, Path>>
51
+ >
52
+ <Pathstring extends PathstringInSchema<T>>(
53
+ path: Pathstring
54
+ ): UseArrayFieldProps<FieldPath<SchemaAt<T, parsePathstring<Pathstring>>>>
55
+ }
56
+
57
+ function useArrayFieldBase<Field extends FieldPath>(
58
+ field: Field
59
+ ): UseArrayFieldProps<Field> {
60
+ type Schema = Field['schema']
61
+
62
+ const {
63
+ arrayActions,
64
+ setValue,
65
+ setRawValue,
66
+ setMeta,
67
+ selectFormValues,
68
+ selectFieldErrorMap,
69
+ } = useFormContext()
70
+
71
+ const useFormSelector = untypedUseFormSelector as TypedUseFormSelector<Schema>
72
+
73
+ const valuesSelector = React.useMemo(
74
+ () =>
75
+ createSelector(
76
+ [selectFormValues],
77
+ createSelector(
78
+ [
79
+ createStructuredSelector({
80
+ value: ({ values }) =>
81
+ get(values, field.path) as z.output<Schema> | undefined,
82
+ rawValue: ({ rawValues }) =>
83
+ get(rawValues, field.path) as unknown,
84
+ initialValue: ({ initialValues }) =>
85
+ get(initialValues, field.path) as z.output<Schema> | undefined,
86
+ }),
87
+ ],
88
+ ({ rawValue, value, initialValue }) => {
89
+ const dirty = !isEqual(value, initialValue)
90
+ const pristine = !dirty
91
+ return {
92
+ dirty,
93
+ pristine,
94
+ length: Array.isArray(rawValue) ? rawValue.length : 0,
95
+ }
96
+ }
97
+ )
98
+ ),
99
+ [field.pathstring]
100
+ )
101
+
102
+ const { dirty, pristine, length } = useFormSelector(
103
+ valuesSelector,
104
+ shallowEqual
105
+ )
106
+
107
+ const error = useFormSelector(
108
+ (state) => selectFieldErrorMap(state)[field.pathstring]
109
+ )
110
+ const meta = useFormSelector((state) => state.fieldMeta[field.pathstring])
111
+ const submitFailed = useFormSelector((state) => state.submitFailed)
112
+
113
+ const boundActions = React.useMemo(
114
+ () =>
115
+ bindActionsToField(
116
+ { ...arrayActions, setValue, setRawValue, setMeta },
117
+ field
118
+ ),
119
+ [field.pathstring]
120
+ )
121
+ const elements = React.useMemo(
122
+ () => [...new Array(length).keys()].map((index) => field.subfield(index)),
123
+ [length]
124
+ )
125
+
126
+ return React.useMemo(
127
+ () => ({
128
+ ...boundActions,
129
+ visited: meta?.visited || false,
130
+ touched: meta?.touched || submitFailed,
131
+ elements,
132
+ dirty,
133
+ pristine,
134
+ valid: !error,
135
+ invalid: Boolean(error),
136
+ }),
137
+ [dirty, boundActions, elements, meta, submitFailed, error]
138
+ ) as any
139
+ }
140
+
141
+ export function useArrayField<Field extends FieldPath>(
142
+ field: Field
143
+ ): UseArrayFieldProps<Field>
144
+ export function useArrayField<
145
+ T extends z.ZodTypeAny,
146
+ Path extends PathInSchema<T>
147
+ >(field: Path): UseArrayFieldProps<FieldPath<SchemaAt<T, Path>>>
148
+ export function useArrayField<
149
+ T extends z.ZodTypeAny,
150
+ Pathstring extends PathstringInSchema<T>
151
+ >(
152
+ field: Pathstring
153
+ ): UseArrayFieldProps<FieldPath<SchemaAt<T, parsePathstring<Pathstring>>>>
154
+ export function useArrayField<T extends z.ZodTypeAny>(
155
+ field: FieldPath | BasePath | string
156
+ ): UseArrayFieldProps<any> {
157
+ const { root } = useFormContext<T>()
158
+ return useArrayFieldBase(
159
+ field instanceof FieldPath ? field : root.get(field as any)
160
+ )
161
+ }
@@ -0,0 +1,152 @@
1
+ import z from 'zod'
2
+ import { BasePath, FieldPath } from './FieldPath'
3
+ import { FieldMeta } from './FormState'
4
+ import { get } from './util/get'
5
+ import React from 'react'
6
+ import { setValue } from './actions/setValue'
7
+ import { setRawValue } from './actions/setRawValue'
8
+ import { setMeta } from './actions/setMeta'
9
+ import {
10
+ useFormSelector as untypedUseFormSelector,
11
+ TypedUseFormSelector,
12
+ } from './useFormSelector'
13
+ import { useFormContext } from './useFormContext'
14
+ import { createSelector, createStructuredSelector } from 'reselect'
15
+ import { shallowEqual } from 'react-redux'
16
+ import isEqual from 'fast-deep-equal'
17
+ import { PathInSchema, PathstringInSchema } from './util/PathInSchema'
18
+ import { parsePathstring } from './util/parsePathstring'
19
+ import { SchemaAt } from './util/SchemaAt'
20
+ import { maybeParse } from './util/maybeParse'
21
+ import { bindActionsToField } from './util/bindActionsToField'
22
+
23
+ export type UseFieldProps<Field extends FieldPath> = FieldMeta &
24
+ ReturnType<
25
+ typeof bindActionsToField<{
26
+ setValue: typeof setValue
27
+ setRawValue: typeof setRawValue
28
+ setMeta: typeof setMeta
29
+ }>
30
+ > & {
31
+ value: z.output<Field['schema']> | undefined
32
+ rawValue: unknown
33
+ initialValue: z.output<Field['schema']> | undefined
34
+ rawInitialValue: unknown
35
+ error?: string
36
+ dirty: boolean
37
+ pristine: boolean
38
+ valid: boolean
39
+ invalid: boolean
40
+ }
41
+
42
+ export interface TypedUseField<T extends z.ZodTypeAny> {
43
+ <Field extends FieldPath>(field: Field): UseFieldProps<Field>
44
+ <Path extends PathInSchema<T>>(path: Path): UseFieldProps<
45
+ FieldPath<SchemaAt<T, Path>>
46
+ >
47
+ <Pathstring extends PathstringInSchema<T>>(path: Pathstring): UseFieldProps<
48
+ FieldPath<SchemaAt<T, parsePathstring<Pathstring>>>
49
+ >
50
+ }
51
+
52
+ function useFieldBase<T extends z.ZodTypeAny, Field extends FieldPath>(
53
+ field: Field
54
+ ): UseFieldProps<Field> {
55
+ type Schema = Field['schema']
56
+
57
+ const {
58
+ setValue,
59
+ setRawValue,
60
+ setMeta,
61
+ selectFormValues,
62
+ selectFieldErrorMap,
63
+ } = useFormContext<T>()
64
+
65
+ const useFormSelector = untypedUseFormSelector as TypedUseFormSelector<T>
66
+
67
+ const valuesSelector = React.useMemo(
68
+ () =>
69
+ createSelector(
70
+ [selectFormValues],
71
+ createSelector(
72
+ [
73
+ createStructuredSelector({
74
+ value: ({ values }) =>
75
+ get(values, field.path) as z.output<Schema> | undefined,
76
+ rawValue: ({ rawValues }) =>
77
+ get(rawValues, field.path) as unknown,
78
+ initialValue: ({ initialValues }) =>
79
+ get(initialValues, field.path) as z.output<Schema> | undefined,
80
+ rawInitialValue: ({ rawInitialValues }) =>
81
+ get(rawInitialValues, field.path) as unknown,
82
+ }),
83
+ ],
84
+ ({
85
+ rawValue,
86
+ value = maybeParse(field.schema, rawValue),
87
+ rawInitialValue,
88
+ initialValue = maybeParse(field.schema, rawInitialValue),
89
+ }) => {
90
+ const dirty = !isEqual(value, initialValue)
91
+ const pristine = !dirty
92
+ return {
93
+ value,
94
+ rawValue,
95
+ initialValue,
96
+ rawInitialValue,
97
+ dirty,
98
+ pristine,
99
+ }
100
+ }
101
+ )
102
+ ),
103
+ [field.pathstring]
104
+ )
105
+
106
+ const values = useFormSelector(valuesSelector, shallowEqual)
107
+
108
+ const error = useFormSelector(
109
+ (state) => selectFieldErrorMap(state)[field.pathstring]
110
+ )
111
+ const meta = useFormSelector((state) => state.fieldMeta[field.pathstring])
112
+ const submitFailed = useFormSelector((state) => state.submitFailed)
113
+
114
+ const boundActions = React.useMemo(
115
+ () => bindActionsToField({ setValue, setRawValue, setMeta }, field),
116
+ [field.pathstring]
117
+ )
118
+
119
+ return React.useMemo(
120
+ () => ({
121
+ ...boundActions,
122
+ ...values,
123
+ visited: meta?.visited || false,
124
+ touched: meta?.touched || submitFailed,
125
+ error,
126
+ valid: !error,
127
+ invalid: Boolean(error),
128
+ }),
129
+ [field.pathstring, values, meta, error, submitFailed]
130
+ ) as any
131
+ }
132
+
133
+ export function useField<Field extends FieldPath>(
134
+ field: Field
135
+ ): UseFieldProps<Field>
136
+ export function useField<T extends z.ZodTypeAny, Path extends PathInSchema<T>>(
137
+ field: Path
138
+ ): UseFieldProps<FieldPath<SchemaAt<T, Path>>>
139
+ export function useField<
140
+ T extends z.ZodTypeAny,
141
+ Pathstring extends PathstringInSchema<T>
142
+ >(
143
+ field: Pathstring
144
+ ): UseFieldProps<FieldPath<SchemaAt<T, parsePathstring<Pathstring>>>>
145
+ export function useField<T extends z.ZodTypeAny>(
146
+ field: FieldPath | BasePath | string
147
+ ): UseFieldProps<any> {
148
+ const { root } = useFormContext<T>()
149
+ return useFieldBase(
150
+ field instanceof FieldPath ? field : root.get(field as any)
151
+ )
152
+ }
@@ -0,0 +1,11 @@
1
+ import z from 'zod'
2
+ import React from 'react'
3
+ import { FormContext, FormContextProps } from './FormContext'
4
+
5
+ export function useFormContext<T extends z.ZodTypeAny>(): FormContextProps<T> {
6
+ const props: FormContextProps<T> = React.useContext(FormContext) as any
7
+ if (!props) {
8
+ throw new Error(`must be used inside a <FormProvider>`)
9
+ }
10
+ return props
11
+ }
@@ -0,0 +1,13 @@
1
+ import { createDispatchHook } from 'react-redux'
2
+ import { FormStateContext } from './FormStateContext'
3
+ import z from 'zod'
4
+ import { FormAction } from './FormAction'
5
+ import { Dispatch } from 'redux'
6
+
7
+ export const useFormDispatch = createDispatchHook(
8
+ FormStateContext
9
+ ) as typeof useFormDispatchType
10
+
11
+ declare function useFormDispatchType<T extends z.ZodTypeAny>(): Dispatch<
12
+ FormAction<T>
13
+ >
@@ -0,0 +1,9 @@
1
+ import { createSelectorHook, TypedUseSelectorHook } from 'react-redux'
2
+ import { FormStateContext } from './FormStateContext'
3
+ import { FormState } from './FormState'
4
+ import z from 'zod'
5
+
6
+ export const useFormSelector = createSelectorHook(FormStateContext)
7
+ export type TypedUseFormSelector<T extends z.ZodTypeAny> = TypedUseSelectorHook<
8
+ FormState<T>
9
+ >
@@ -0,0 +1,14 @@
1
+ import z from 'zod'
2
+ import {
3
+ useFormSelector as untypedUseFormSelector,
4
+ TypedUseFormSelector,
5
+ } from './useFormSelector'
6
+ import { useFormContext } from './useFormContext'
7
+
8
+ const useFormSelector =
9
+ untypedUseFormSelector as TypedUseFormSelector<z.ZodTypeAny>
10
+
11
+ export function useFormStatus() {
12
+ const { selectFormStatus } = useFormContext()
13
+ return useFormSelector(selectFormStatus)
14
+ }
@@ -0,0 +1,8 @@
1
+ import z from 'zod'
2
+ import { useFormSelector, TypedUseFormSelector } from './useFormSelector'
3
+ import { useFormContext } from './useFormContext'
4
+
5
+ export function useFormValues<T extends z.ZodTypeAny>() {
6
+ const { selectFormValues } = useFormContext<T>()
7
+ return (useFormSelector as TypedUseFormSelector<T>)(selectFormValues)
8
+ }
@@ -0,0 +1,235 @@
1
+ import z from 'zod'
2
+ import { BasePath, FieldPath } from './FieldPath'
3
+ import { useField, UseFieldProps } from './useField'
4
+ import React, { HTMLInputTypeAttribute } from 'react'
5
+ import { invert } from 'zod-invertible'
6
+ import { useFormContext } from './useFormContext'
7
+ import { acceptsNumber } from './util/acceptsNumber'
8
+ import { acceptsBigint } from './util/acceptsBigint'
9
+ import { PathInSchema, PathstringInSchema } from './util/PathInSchema'
10
+ import { parsePathstring } from './util/parsePathstring'
11
+ import { SchemaAt } from './util/SchemaAt'
12
+
13
+ export type HtmlFieldInputProps = {
14
+ name: string
15
+ type: HTMLInputTypeAttribute
16
+ value: string
17
+ checked?: boolean
18
+ onChange: React.ChangeEventHandler
19
+ onFocus: React.FocusEventHandler
20
+ onBlur: React.FocusEventHandler
21
+ }
22
+
23
+ export type ValidUseHtmlFieldProps<Field extends FieldPath> = {
24
+ input: HtmlFieldInputProps
25
+ meta: UseFieldProps<Field>
26
+ }
27
+
28
+ export type UseHtmlFieldProps<Field extends FieldPath> = z.input<
29
+ Field['schema']
30
+ > extends string | number | bigint | boolean | null | undefined
31
+ ? {
32
+ input: HtmlFieldInputProps
33
+ meta: UseFieldProps<Field>
34
+ }
35
+ : {
36
+ ERROR: 'field schema input must be a nullish string, number, boolean or bigint'
37
+ }
38
+
39
+ type UseHtmlFieldOptions<Field, Schema extends z.ZodTypeAny> = {
40
+ field: Field
41
+ type: z.input<Schema> extends boolean | null | undefined
42
+ ? 'checkbox'
43
+ : Exclude<HTMLInputTypeAttribute, 'checkbox'>
44
+ normalizeOnBlur?: boolean
45
+ }
46
+
47
+ export interface TypedUseHtmlField<T extends z.ZodTypeAny> {
48
+ <Field extends FieldPath>(
49
+ options: UseHtmlFieldOptions<Field, Field['schema']>
50
+ ): UseHtmlFieldProps<Field>
51
+ <Path extends PathInSchema<T>>(
52
+ options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>
53
+ ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>
54
+ <Path extends PathstringInSchema<T>>(
55
+ options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>
56
+ ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>
57
+ }
58
+
59
+ function useHtmlFieldBase<Field extends FieldPath>(
60
+ options: UseHtmlFieldOptions<Field, Field['schema']>
61
+ ): UseHtmlFieldProps<Field> {
62
+ const { field, type, normalizeOnBlur = true } = options
63
+ const props = useField(field)
64
+ const {
65
+ value,
66
+ rawValue,
67
+ initialValue,
68
+ rawInitialValue,
69
+ setValue,
70
+ setRawValue,
71
+ setMeta,
72
+ ...meta
73
+ } = props
74
+
75
+ const { schema } = field
76
+
77
+ // tempRawValue is used for storing blank text when we've coerced the
78
+ // raw value to null or undefined, or storing numeric text when we've
79
+ // coerced the raw value to a number or bigint.
80
+ // This way we can set a raw value that will parse better in the form
81
+ // state without interfering with the text the user is typing.
82
+ const [tempRawValue, setTempRawValue] = React.useState(
83
+ rawValue as string | null | undefined
84
+ )
85
+
86
+ const tryNumber = React.useMemo(() => acceptsNumber(schema), [schema])
87
+ const tryBigint = React.useMemo(() => acceptsBigint(schema), [schema])
88
+
89
+ const onChange = React.useCallback(
90
+ (e: React.ChangeEvent) => {
91
+ if (e.currentTarget instanceof HTMLInputElement) {
92
+ const rawValue = getRawValue(e.currentTarget)
93
+ const normalized = normalizeRawValue(rawValue, {
94
+ schema,
95
+ tryNumber,
96
+ tryBigint,
97
+ })
98
+ if (typeof rawValue === 'string' && typeof normalized !== 'string') {
99
+ setTempRawValue(rawValue)
100
+ }
101
+ setRawValue(normalized)
102
+ }
103
+ },
104
+ [getRawValue, setRawValue, schema]
105
+ )
106
+
107
+ const onFocus = React.useCallback(() => {
108
+ setMeta({ visited: true })
109
+ }, [])
110
+
111
+ const onBlur = React.useCallback(
112
+ (e: React.FocusEvent) => {
113
+ if (e.currentTarget instanceof HTMLInputElement) {
114
+ let rawValue = normalizeRawValue(getRawValue(e.currentTarget), {
115
+ schema,
116
+ tryNumber,
117
+ tryBigint,
118
+ })
119
+ if (normalizeOnBlur) {
120
+ const parsed = field.schema.safeParse(rawValue)
121
+ const formatted = parsed.success
122
+ ? invert(field.schema).safeParse(parsed.data)
123
+ : undefined
124
+ if (formatted?.success) rawValue = formatted.data
125
+ }
126
+ setRawValue(rawValue)
127
+ setTempRawValue(undefined)
128
+ }
129
+ setMeta({ visited: true, touched: true })
130
+ },
131
+ [getRawValue, setRawValue, schema]
132
+ )
133
+
134
+ return React.useMemo(
135
+ (): ValidUseHtmlFieldProps<Field> => ({
136
+ input: {
137
+ name: field.pathstring,
138
+ type,
139
+ value:
140
+ typeof rawValue === 'boolean'
141
+ ? String(rawValue)
142
+ : typeof rawValue === 'string'
143
+ ? rawValue || tempRawValue || ''
144
+ : tempRawValue || (rawValue == null ? '' : String(rawValue) || ''),
145
+ ...(type === 'checkbox' && { checked: Boolean(rawValue) }),
146
+ onChange,
147
+ onFocus,
148
+ onBlur,
149
+ },
150
+ meta: {
151
+ ...meta,
152
+ value,
153
+ rawValue,
154
+ initialValue,
155
+ rawInitialValue,
156
+ setValue,
157
+ setRawValue,
158
+ setMeta,
159
+ },
160
+ }),
161
+ [props, tempRawValue, onChange]
162
+ ) as any
163
+ }
164
+
165
+ function getRawValue(el: HTMLInputElement | HTMLSelectElement) {
166
+ return el.type === 'checkbox' ? el.checked : el.value
167
+ }
168
+
169
+ function normalizeBlank(schema: z.ZodTypeAny): any {
170
+ if (schema.safeParse(undefined).success) return undefined
171
+ if (schema.safeParse(null).success) return null
172
+ return undefined
173
+ }
174
+
175
+ function safeBigInt(rawValue: string): bigint | undefined {
176
+ try {
177
+ return BigInt(rawValue)
178
+ } catch (error) {
179
+ return undefined
180
+ }
181
+ }
182
+
183
+ function normalizeRawValue(
184
+ rawValue: string | boolean,
185
+ {
186
+ schema,
187
+ tryNumber,
188
+ tryBigint,
189
+ }: { schema: z.ZodTypeAny; tryNumber: boolean; tryBigint: boolean }
190
+ ): string | boolean | number | bigint | null | undefined {
191
+ if (typeof rawValue === 'boolean') return rawValue
192
+ if (typeof rawValue === 'string' && !/\S/.test(rawValue)) {
193
+ return normalizeBlank(schema)
194
+ }
195
+ if (typeof rawValue === 'string' && !schema.safeParse(rawValue).success) {
196
+ if (tryNumber) {
197
+ const num = Number(rawValue)
198
+ if (!isNaN(num)) return num
199
+ }
200
+ if (tryBigint) {
201
+ const bigint = safeBigInt(rawValue)
202
+ if (bigint != null) return bigint
203
+ }
204
+ }
205
+ return rawValue
206
+ }
207
+
208
+ export function useHtmlField<Field extends FieldPath>(
209
+ options: UseHtmlFieldOptions<Field, Field['schema']>
210
+ ): UseHtmlFieldProps<Field>
211
+ export function useHtmlField<
212
+ T extends z.ZodTypeAny,
213
+ Path extends PathInSchema<T>
214
+ >(
215
+ options: UseHtmlFieldOptions<Path, SchemaAt<T, Path>>
216
+ ): UseHtmlFieldProps<FieldPath<SchemaAt<T, Path>>>
217
+ export function useHtmlField<
218
+ T extends z.ZodTypeAny,
219
+ Path extends PathstringInSchema<T>
220
+ >(
221
+ options: UseHtmlFieldOptions<Path, SchemaAt<T, parsePathstring<Path>>>
222
+ ): UseHtmlFieldProps<FieldPath<SchemaAt<T, parsePathstring<Path>>>>
223
+ export function useHtmlField({
224
+ field,
225
+ ...rest
226
+ }: UseHtmlFieldOptions<
227
+ FieldPath | BasePath,
228
+ z.ZodTypeAny
229
+ >): UseHtmlFieldProps<any> {
230
+ const { root } = useFormContext()
231
+ return useHtmlFieldBase({
232
+ field: field instanceof FieldPath ? field : root.get(field),
233
+ ...rest,
234
+ })
235
+ }
@@ -0,0 +1,14 @@
1
+ import z from 'zod'
2
+ import React, { DependencyList } from 'react'
3
+ import { useFormContext } from './useFormContext'
4
+ import { InitializeAction } from './actions/initialize'
5
+
6
+ export function useInitialize<T extends z.ZodTypeAny>(
7
+ options: Omit<InitializeAction<T>, 'type'>,
8
+ deps: DependencyList = [options.values, options.rawValues]
9
+ ) {
10
+ const { initialize } = useFormContext<T>()
11
+ React.useEffect(() => {
12
+ initialize(options)
13
+ }, deps)
14
+ }