@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.
- package/FieldPath.d.ts +26 -0
- package/FieldPath.d.ts.map +1 -0
- package/FieldPath.js +155 -0
- package/FieldPath.js.map +1 -0
- package/FieldPath.mjs +138 -0
- package/FieldPath.mjs.map +1 -0
- package/FormAction.d.ts +15 -0
- package/FormAction.d.ts.map +1 -0
- package/FormAction.js +6 -0
- package/FormAction.js.map +1 -0
- package/FormAction.mjs +2 -0
- package/FormAction.mjs.map +1 -0
- package/FormContext.d.ts +39 -0
- package/FormContext.d.ts.map +1 -0
- package/FormContext.js +10 -0
- package/FormContext.js.map +1 -0
- package/FormContext.mjs +3 -0
- package/FormContext.mjs.map +1 -0
- package/FormState.d.ts +31 -0
- package/FormState.d.ts.map +1 -0
- package/FormState.js +6 -0
- package/FormState.js.map +1 -0
- package/FormState.mjs +2 -0
- package/FormState.mjs.map +1 -0
- package/FormStateContext.d.ts +8 -0
- package/FormStateContext.d.ts.map +1 -0
- package/FormStateContext.js +10 -0
- package/FormStateContext.js.map +1 -0
- package/FormStateContext.mjs +3 -0
- package/FormStateContext.mjs.map +1 -0
- package/LICENSE.md +21 -0
- package/README.md +154 -0
- package/actions/addHandlers.d.ts +15 -0
- package/actions/addHandlers.d.ts.map +1 -0
- package/actions/addHandlers.js +16 -0
- package/actions/addHandlers.js.map +1 -0
- package/actions/addHandlers.mjs +7 -0
- package/actions/addHandlers.mjs.map +1 -0
- package/actions/arrayActions.d.ts +113 -0
- package/actions/arrayActions.d.ts.map +1 -0
- package/actions/arrayActions.js +146 -0
- package/actions/arrayActions.js.map +1 -0
- package/actions/arrayActions.mjs +120 -0
- package/actions/arrayActions.mjs.map +1 -0
- package/actions/initialize.d.ts +13 -0
- package/actions/initialize.d.ts.map +1 -0
- package/actions/initialize.js +16 -0
- package/actions/initialize.js.map +1 -0
- package/actions/initialize.mjs +7 -0
- package/actions/initialize.mjs.map +1 -0
- package/actions/removeHandlers.d.ts +10 -0
- package/actions/removeHandlers.d.ts.map +1 -0
- package/actions/removeHandlers.js +16 -0
- package/actions/removeHandlers.js.map +1 -0
- package/actions/removeHandlers.mjs +7 -0
- package/actions/removeHandlers.mjs.map +1 -0
- package/actions/setMeta.d.ts +9 -0
- package/actions/setMeta.d.ts.map +1 -0
- package/actions/setMeta.js +14 -0
- package/actions/setMeta.js.map +1 -0
- package/actions/setMeta.mjs +8 -0
- package/actions/setMeta.mjs.map +1 -0
- package/actions/setMounted.d.ts +6 -0
- package/actions/setMounted.d.ts.map +1 -0
- package/actions/setMounted.js +13 -0
- package/actions/setMounted.js.map +1 -0
- package/actions/setMounted.mjs +7 -0
- package/actions/setMounted.mjs.map +1 -0
- package/actions/setRawValue.d.ts +9 -0
- package/actions/setRawValue.d.ts.map +1 -0
- package/actions/setRawValue.js +14 -0
- package/actions/setRawValue.js.map +1 -0
- package/actions/setRawValue.mjs +8 -0
- package/actions/setRawValue.mjs.map +1 -0
- package/actions/setSubmitStatus.d.ts +14 -0
- package/actions/setSubmitStatus.d.ts.map +1 -0
- package/actions/setSubmitStatus.js +16 -0
- package/actions/setSubmitStatus.js.map +1 -0
- package/actions/setSubmitStatus.mjs +7 -0
- package/actions/setSubmitStatus.mjs.map +1 -0
- package/actions/setValue.d.ts +12 -0
- package/actions/setValue.d.ts.map +1 -0
- package/actions/setValue.js +18 -0
- package/actions/setValue.js.map +1 -0
- package/actions/setValue.mjs +9 -0
- package/actions/setValue.mjs.map +1 -0
- package/actions/submit.d.ts +5 -0
- package/actions/submit.d.ts.map +1 -0
- package/actions/submit.js +12 -0
- package/actions/submit.js.map +1 -0
- package/actions/submit.mjs +6 -0
- package/actions/submit.mjs.map +1 -0
- package/actions/submitSucceeded.d.ts +5 -0
- package/actions/submitSucceeded.d.ts.map +1 -0
- package/actions/submitSucceeded.js +12 -0
- package/actions/submitSucceeded.js.map +1 -0
- package/actions/submitSucceeded.mjs +6 -0
- package/actions/submitSucceeded.mjs.map +1 -0
- package/createFormMiddleware.d.ts +6 -0
- package/createFormMiddleware.d.ts.map +1 -0
- package/createFormMiddleware.js +186 -0
- package/createFormMiddleware.js.map +1 -0
- package/createFormMiddleware.mjs +53 -0
- package/createFormMiddleware.mjs.map +1 -0
- package/createFormProvider.d.ts +7 -0
- package/createFormProvider.d.ts.map +1 -0
- package/createFormProvider.js +85 -0
- package/createFormProvider.js.map +1 -0
- package/createFormProvider.mjs +63 -0
- package/createFormProvider.mjs.map +1 -0
- package/createFormReducer.d.ts +9 -0
- package/createFormReducer.d.ts.map +1 -0
- package/createFormReducer.js +95 -0
- package/createFormReducer.js.map +1 -0
- package/createFormReducer.mjs +84 -0
- package/createFormReducer.mjs.map +1 -0
- package/createSelectFieldErrorMap.d.ts +32 -0
- package/createSelectFieldErrorMap.d.ts.map +1 -0
- package/createSelectFieldErrorMap.js +43 -0
- package/createSelectFieldErrorMap.js.map +1 -0
- package/createSelectFieldErrorMap.mjs +24 -0
- package/createSelectFieldErrorMap.mjs.map +1 -0
- package/createSelectFormStatus.d.ts +89 -0
- package/createSelectFormStatus.d.ts.map +1 -0
- package/createSelectFormStatus.js +54 -0
- package/createSelectFormStatus.js.map +1 -0
- package/createSelectFormStatus.mjs +28 -0
- package/createSelectFormStatus.mjs.map +1 -0
- package/createSelectFormValues.d.ts +45 -0
- package/createSelectFormValues.d.ts.map +1 -0
- package/createSelectFormValues.js +24 -0
- package/createSelectFormValues.js.map +1 -0
- package/createSelectFormValues.mjs +10 -0
- package/createSelectFormValues.mjs.map +1 -0
- package/createZodForm.d.ts +33 -0
- package/createZodForm.d.ts.map +1 -0
- package/createZodForm.js +51 -0
- package/createZodForm.js.map +1 -0
- package/createZodForm.mjs +46 -0
- package/createZodForm.mjs.map +1 -0
- package/index.d.ts +14 -0
- package/index.d.ts.map +1 -0
- package/index.js +76 -0
- package/index.js.map +1 -0
- package/index.mjs +11 -0
- package/index.mjs.map +1 -0
- package/initFormState.d.ts +4 -0
- package/initFormState.d.ts.map +1 -0
- package/initFormState.js +22 -0
- package/initFormState.js.map +1 -0
- package/initFormState.mjs +16 -0
- package/initFormState.mjs.map +1 -0
- package/package.json +49 -0
- package/reducers/addHandlers.d.ts +24 -0
- package/reducers/addHandlers.d.ts.map +1 -0
- package/reducers/addHandlers.js +24 -0
- package/reducers/addHandlers.js.map +1 -0
- package/reducers/addHandlers.mjs +21 -0
- package/reducers/addHandlers.mjs.map +1 -0
- package/reducers/arrayInsert.d.ts +7 -0
- package/reducers/arrayInsert.d.ts.map +1 -0
- package/reducers/arrayInsert.js +16 -0
- package/reducers/arrayInsert.js.map +1 -0
- package/reducers/arrayInsert.mjs +12 -0
- package/reducers/arrayInsert.mjs.map +1 -0
- package/reducers/arrayInsertRaw.d.ts +7 -0
- package/reducers/arrayInsertRaw.d.ts.map +1 -0
- package/reducers/arrayInsertRaw.js +22 -0
- package/reducers/arrayInsertRaw.js.map +1 -0
- package/reducers/arrayInsertRaw.mjs +14 -0
- package/reducers/arrayInsertRaw.mjs.map +1 -0
- package/reducers/arrayMove.d.ts +8 -0
- package/reducers/arrayMove.d.ts.map +1 -0
- package/reducers/arrayMove.js +25 -0
- package/reducers/arrayMove.js.map +1 -0
- package/reducers/arrayMove.mjs +16 -0
- package/reducers/arrayMove.mjs.map +1 -0
- package/reducers/arrayPop.d.ts +7 -0
- package/reducers/arrayPop.d.ts.map +1 -0
- package/reducers/arrayPop.js +13 -0
- package/reducers/arrayPop.js.map +1 -0
- package/reducers/arrayPop.mjs +5 -0
- package/reducers/arrayPop.mjs.map +1 -0
- package/reducers/arrayPush.d.ts +7 -0
- package/reducers/arrayPush.d.ts.map +1 -0
- package/reducers/arrayPush.js +15 -0
- package/reducers/arrayPush.js.map +1 -0
- package/reducers/arrayPush.mjs +11 -0
- package/reducers/arrayPush.mjs.map +1 -0
- package/reducers/arrayPushRaw.d.ts +7 -0
- package/reducers/arrayPushRaw.d.ts.map +1 -0
- package/reducers/arrayPushRaw.js +17 -0
- package/reducers/arrayPushRaw.js.map +1 -0
- package/reducers/arrayPushRaw.mjs +9 -0
- package/reducers/arrayPushRaw.mjs.map +1 -0
- package/reducers/arrayRemove.d.ts +7 -0
- package/reducers/arrayRemove.d.ts.map +1 -0
- package/reducers/arrayRemove.js +21 -0
- package/reducers/arrayRemove.js.map +1 -0
- package/reducers/arrayRemove.mjs +13 -0
- package/reducers/arrayRemove.mjs.map +1 -0
- package/reducers/arrayRemoveAll.d.ts +7 -0
- package/reducers/arrayRemoveAll.d.ts.map +1 -0
- package/reducers/arrayRemoveAll.js +14 -0
- package/reducers/arrayRemoveAll.js.map +1 -0
- package/reducers/arrayRemoveAll.mjs +8 -0
- package/reducers/arrayRemoveAll.mjs.map +1 -0
- package/reducers/arrayShift.d.ts +7 -0
- package/reducers/arrayShift.d.ts.map +1 -0
- package/reducers/arrayShift.js +14 -0
- package/reducers/arrayShift.js.map +1 -0
- package/reducers/arrayShift.mjs +8 -0
- package/reducers/arrayShift.mjs.map +1 -0
- package/reducers/arraySplice.d.ts +7 -0
- package/reducers/arraySplice.d.ts.map +1 -0
- package/reducers/arraySplice.js +20 -0
- package/reducers/arraySplice.js.map +1 -0
- package/reducers/arraySplice.mjs +14 -0
- package/reducers/arraySplice.mjs.map +1 -0
- package/reducers/arraySpliceRaw.d.ts +7 -0
- package/reducers/arraySpliceRaw.d.ts.map +1 -0
- package/reducers/arraySpliceRaw.js +26 -0
- package/reducers/arraySpliceRaw.js.map +1 -0
- package/reducers/arraySpliceRaw.mjs +18 -0
- package/reducers/arraySpliceRaw.mjs.map +1 -0
- package/reducers/arraySwap.d.ts +8 -0
- package/reducers/arraySwap.d.ts.map +1 -0
- package/reducers/arraySwap.js +27 -0
- package/reducers/arraySwap.js.map +1 -0
- package/reducers/arraySwap.mjs +18 -0
- package/reducers/arraySwap.mjs.map +1 -0
- package/reducers/arrayUnshift.d.ts +7 -0
- package/reducers/arrayUnshift.d.ts.map +1 -0
- package/reducers/arrayUnshift.js +15 -0
- package/reducers/arrayUnshift.js.map +1 -0
- package/reducers/arrayUnshift.mjs +11 -0
- package/reducers/arrayUnshift.mjs.map +1 -0
- package/reducers/arrayUnshiftRaw.d.ts +7 -0
- package/reducers/arrayUnshiftRaw.d.ts.map +1 -0
- package/reducers/arrayUnshiftRaw.js +17 -0
- package/reducers/arrayUnshiftRaw.js.map +1 -0
- package/reducers/arrayUnshiftRaw.mjs +9 -0
- package/reducers/arrayUnshiftRaw.mjs.map +1 -0
- package/reducers/initialize.d.ts +46 -0
- package/reducers/initialize.d.ts.map +1 -0
- package/reducers/initialize.js +46 -0
- package/reducers/initialize.js.map +1 -0
- package/reducers/initialize.mjs +38 -0
- package/reducers/initialize.mjs.map +1 -0
- package/reducers/removeHandlers.d.ts +24 -0
- package/reducers/removeHandlers.d.ts.map +1 -0
- package/reducers/removeHandlers.js +24 -0
- package/reducers/removeHandlers.js.map +1 -0
- package/reducers/removeHandlers.mjs +21 -0
- package/reducers/removeHandlers.mjs.map +1 -0
- package/reducers/setMeta.d.ts +6 -0
- package/reducers/setMeta.d.ts.map +1 -0
- package/reducers/setMeta.js +28 -0
- package/reducers/setMeta.js.map +1 -0
- package/reducers/setMeta.mjs +21 -0
- package/reducers/setMeta.mjs.map +1 -0
- package/reducers/setRawValue.d.ts +27 -0
- package/reducers/setRawValue.d.ts.map +1 -0
- package/reducers/setRawValue.js +35 -0
- package/reducers/setRawValue.js.map +1 -0
- package/reducers/setRawValue.mjs +26 -0
- package/reducers/setRawValue.mjs.map +1 -0
- package/reducers/setSubmitStatus.d.ts +24 -0
- package/reducers/setSubmitStatus.d.ts.map +1 -0
- package/reducers/setSubmitStatus.js +18 -0
- package/reducers/setSubmitStatus.js.map +1 -0
- package/reducers/setSubmitStatus.mjs +12 -0
- package/reducers/setSubmitStatus.mjs.map +1 -0
- package/reducers/setValue.d.ts +28 -0
- package/reducers/setValue.d.ts.map +1 -0
- package/reducers/setValue.js +41 -0
- package/reducers/setValue.js.map +1 -0
- package/reducers/setValue.mjs +32 -0
- package/reducers/setValue.mjs.map +1 -0
- package/reducers/submitSucceeded.d.ts +23 -0
- package/reducers/submitSucceeded.d.ts.map +1 -0
- package/reducers/submitSucceeded.js +22 -0
- package/reducers/submitSucceeded.js.map +1 -0
- package/reducers/submitSucceeded.mjs +13 -0
- package/reducers/submitSucceeded.mjs.map +1 -0
- package/reducers/util/getInverseArrayElementSchema.d.ts +3 -0
- package/reducers/util/getInverseArrayElementSchema.d.ts.map +1 -0
- package/reducers/util/getInverseArrayElementSchema.js +14 -0
- package/reducers/util/getInverseArrayElementSchema.js.map +1 -0
- package/reducers/util/getInverseArrayElementSchema.mjs +8 -0
- package/reducers/util/getInverseArrayElementSchema.mjs.map +1 -0
- package/reducers/util/updateRawArray.d.ts +7 -0
- package/reducers/util/updateRawArray.d.ts.map +1 -0
- package/reducers/util/updateRawArray.js +14 -0
- package/reducers/util/updateRawArray.js.map +1 -0
- package/reducers/util/updateRawArray.mjs +8 -0
- package/reducers/util/updateRawArray.mjs.map +1 -0
- package/src/FieldPath.ts +215 -0
- package/src/FormAction.ts +26 -0
- package/src/FormContext.ts +44 -0
- package/src/FormState.ts +36 -0
- package/src/FormStateContext.ts +13 -0
- package/src/actions/addHandlers.ts +23 -0
- package/src/actions/arrayActions.ts +183 -0
- package/src/actions/initialize.ts +16 -0
- package/src/actions/removeHandlers.ts +13 -0
- package/src/actions/setMeta.ts +17 -0
- package/src/actions/setMounted.ts +8 -0
- package/src/actions/setRawValue.ts +17 -0
- package/src/actions/setSubmitStatus.ts +26 -0
- package/src/actions/setValue.ts +21 -0
- package/src/actions/submit.ts +7 -0
- package/src/actions/submitSucceeded.ts +7 -0
- package/src/createFormMiddleware.ts +74 -0
- package/src/createFormProvider.tsx +101 -0
- package/src/createFormReducer.ts +91 -0
- package/src/createSelectFieldErrorMap.ts +47 -0
- package/src/createSelectFormStatus.ts +41 -0
- package/src/createSelectFormValues.ts +16 -0
- package/src/createZodForm.ts +57 -0
- package/src/index.ts +32 -0
- package/src/initFormState.ts +18 -0
- package/src/reducers/addHandlers.ts +21 -0
- package/src/reducers/arrayInsert.ts +19 -0
- package/src/reducers/arrayInsertRaw.ts +22 -0
- package/src/reducers/arrayMove.ts +36 -0
- package/src/reducers/arrayPop.ts +16 -0
- package/src/reducers/arrayPush.ts +20 -0
- package/src/reducers/arrayPushRaw.ts +18 -0
- package/src/reducers/arrayRemove.ts +22 -0
- package/src/reducers/arrayRemoveAll.ts +15 -0
- package/src/reducers/arrayShift.ts +15 -0
- package/src/reducers/arraySplice.ts +17 -0
- package/src/reducers/arraySpliceRaw.ts +30 -0
- package/src/reducers/arraySwap.ts +29 -0
- package/src/reducers/arrayUnshift.ts +16 -0
- package/src/reducers/arrayUnshiftRaw.ts +18 -0
- package/src/reducers/initialize.ts +47 -0
- package/src/reducers/removeHandlers.ts +21 -0
- package/src/reducers/setMeta.ts +26 -0
- package/src/reducers/setRawValue.ts +40 -0
- package/src/reducers/setSubmitStatus.ts +15 -0
- package/src/reducers/setValue.ts +49 -0
- package/src/reducers/submitSucceeded.ts +17 -0
- package/src/reducers/util/getInverseArrayElementSchema.ts +9 -0
- package/src/reducers/util/updateRawArray.ts +25 -0
- package/src/useArrayField.ts +161 -0
- package/src/useField.ts +152 -0
- package/src/useFormContext.ts +11 -0
- package/src/useFormDispatch.ts +13 -0
- package/src/useFormSelector.ts +9 -0
- package/src/useFormStatus.ts +14 -0
- package/src/useFormValues.ts +8 -0
- package/src/useHtmlField.ts +235 -0
- package/src/useInitialize.ts +14 -0
- package/src/useSubmit.ts +29 -0
- package/src/util/PathInSchema.ts +7 -0
- package/src/util/PathInType.ts +26 -0
- package/src/util/SchemaAt.ts +68 -0
- package/src/util/acceptsArray.ts +72 -0
- package/src/util/acceptsBigint.ts +71 -0
- package/src/util/acceptsNumber.ts +71 -0
- package/src/util/bindActionsToField.ts +22 -0
- package/src/util/get.ts +10 -0
- package/src/util/getArrayElementSchema.ts +74 -0
- package/src/util/maybeParse.ts +9 -0
- package/src/util/parsePathstring.ts +119 -0
- package/src/util/pathstring.ts +32 -0
- package/src/util/set.ts +25 -0
- package/src/util/setAdd.ts +6 -0
- package/src/util/setDelete.ts +6 -0
- package/useArrayField.d.ts +34 -0
- package/useArrayField.d.ts.map +1 -0
- package/useArrayField.js +99 -0
- package/useArrayField.js.map +1 -0
- package/useArrayField.mjs +75 -0
- package/useArrayField.mjs.map +1 -0
- package/useField.d.ts +34 -0
- package/useField.d.ts.map +1 -0
- package/useField.js +98 -0
- package/useField.js.map +1 -0
- package/useField.mjs +75 -0
- package/useField.mjs.map +1 -0
- package/useFormContext.d.ts +4 -0
- package/useFormContext.d.ts.map +1 -0
- package/useFormContext.js +17 -0
- package/useFormContext.js.map +1 -0
- package/useFormContext.mjs +10 -0
- package/useFormContext.mjs.map +1 -0
- package/useFormDispatch.d.ts +7 -0
- package/useFormDispatch.d.ts.map +1 -0
- package/useFormDispatch.js +10 -0
- package/useFormDispatch.js.map +1 -0
- package/useFormDispatch.mjs +4 -0
- package/useFormDispatch.mjs.map +1 -0
- package/useFormSelector.d.ts +6 -0
- package/useFormSelector.d.ts.map +1 -0
- package/useFormSelector.js +10 -0
- package/useFormSelector.js.map +1 -0
- package/useFormSelector.mjs +4 -0
- package/useFormSelector.mjs.map +1 -0
- package/useFormStatus.d.ts +13 -0
- package/useFormStatus.d.ts.map +1 -0
- package/useFormStatus.js +15 -0
- package/useFormStatus.js.map +1 -0
- package/useFormStatus.mjs +10 -0
- package/useFormStatus.mjs.map +1 -0
- package/useFormValues.d.ts +8 -0
- package/useFormValues.d.ts.map +1 -0
- package/useFormValues.js +14 -0
- package/useFormValues.js.map +1 -0
- package/useFormValues.mjs +9 -0
- package/useFormValues.mjs.map +1 -0
- package/useHtmlField.d.ts +41 -0
- package/useHtmlField.d.ts.map +1 -0
- package/useHtmlField.js +161 -0
- package/useHtmlField.js.map +1 -0
- package/useHtmlField.mjs +148 -0
- package/useHtmlField.mjs.map +1 -0
- package/useInitialize.d.ts +5 -0
- package/useInitialize.d.ts.map +1 -0
- package/useInitialize.js +18 -0
- package/useInitialize.js.map +1 -0
- package/useInitialize.mjs +11 -0
- package/useInitialize.mjs.map +1 -0
- package/useSubmit.d.ts +5 -0
- package/useSubmit.d.ts.map +1 -0
- package/useSubmit.js +53 -0
- package/useSubmit.js.map +1 -0
- package/useSubmit.mjs +39 -0
- package/useSubmit.mjs.map +1 -0
- package/util/PathInSchema.d.ts +5 -0
- package/util/PathInSchema.d.ts.map +1 -0
- package/util/PathInSchema.js +6 -0
- package/util/PathInSchema.js.map +1 -0
- package/util/PathInSchema.mjs +2 -0
- package/util/PathInSchema.mjs.map +1 -0
- package/util/PathInType.d.ts +11 -0
- package/util/PathInType.d.ts.map +1 -0
- package/util/PathInType.js +6 -0
- package/util/PathInType.js.map +1 -0
- package/util/PathInType.mjs +2 -0
- package/util/PathInType.mjs.map +1 -0
- package/util/SchemaAt.d.ts +5 -0
- package/util/SchemaAt.d.ts.map +1 -0
- package/util/SchemaAt.js +6 -0
- package/util/SchemaAt.js.map +1 -0
- package/util/SchemaAt.mjs +2 -0
- package/util/SchemaAt.mjs.map +1 -0
- package/util/acceptsArray.d.ts +3 -0
- package/util/acceptsArray.d.ts.map +1 -0
- package/util/acceptsArray.js +89 -0
- package/util/acceptsArray.js.map +1 -0
- package/util/acceptsArray.mjs +105 -0
- package/util/acceptsArray.mjs.map +1 -0
- package/util/acceptsBigint.d.ts +3 -0
- package/util/acceptsBigint.d.ts.map +1 -0
- package/util/acceptsBigint.js +88 -0
- package/util/acceptsBigint.js.map +1 -0
- package/util/acceptsBigint.mjs +104 -0
- package/util/acceptsBigint.mjs.map +1 -0
- package/util/acceptsNumber.d.ts +3 -0
- package/util/acceptsNumber.d.ts.map +1 -0
- package/util/acceptsNumber.js +88 -0
- package/util/acceptsNumber.js.map +1 -0
- package/util/acceptsNumber.mjs +104 -0
- package/util/acceptsNumber.mjs.map +1 -0
- package/util/bindActionsToField.d.ts +7 -0
- package/util/bindActionsToField.d.ts.map +1 -0
- package/util/bindActionsToField.js +22 -0
- package/util/bindActionsToField.js.map +1 -0
- package/util/bindActionsToField.mjs +4 -0
- package/util/bindActionsToField.mjs.map +1 -0
- package/util/get.d.ts +2 -0
- package/util/get.d.ts.map +1 -0
- package/util/get.js +12 -0
- package/util/get.js.map +1 -0
- package/util/get.mjs +4 -0
- package/util/get.mjs.map +1 -0
- package/util/getArrayElementSchema.d.ts +3 -0
- package/util/getArrayElementSchema.d.ts.map +1 -0
- package/util/getArrayElementSchema.js +87 -0
- package/util/getArrayElementSchema.js.map +1 -0
- package/util/getArrayElementSchema.mjs +102 -0
- package/util/getArrayElementSchema.mjs.map +1 -0
- package/util/maybeParse.d.ts +3 -0
- package/util/maybeParse.d.ts.map +1 -0
- package/util/maybeParse.js +11 -0
- package/util/maybeParse.js.map +1 -0
- package/util/maybeParse.mjs +5 -0
- package/util/maybeParse.mjs.map +1 -0
- package/util/parsePathstring.d.ts +40 -0
- package/util/parsePathstring.d.ts.map +1 -0
- package/util/parsePathstring.js +55 -0
- package/util/parsePathstring.js.map +1 -0
- package/util/parsePathstring.mjs +35 -0
- package/util/parsePathstring.mjs.map +1 -0
- package/util/pathstring.d.ts +13 -0
- package/util/pathstring.d.ts.map +1 -0
- package/util/pathstring.js +15 -0
- package/util/pathstring.js.map +1 -0
- package/util/pathstring.mjs +7 -0
- package/util/pathstring.mjs.map +1 -0
- package/util/set.d.ts +2 -0
- package/util/set.d.ts.map +1 -0
- package/util/set.js +33 -0
- package/util/set.js.map +1 -0
- package/util/set.mjs +23 -0
- package/util/set.mjs.map +1 -0
- package/util/setAdd.d.ts +2 -0
- package/util/setAdd.d.ts.map +1 -0
- package/util/setAdd.js +13 -0
- package/util/setAdd.js.map +1 -0
- package/util/setAdd.mjs +7 -0
- package/util/setAdd.mjs.map +1 -0
- package/util/setDelete.d.ts +2 -0
- package/util/setDelete.d.ts.map +1 -0
- package/util/setDelete.js +13 -0
- package/util/setDelete.js.map +1 -0
- package/util/setDelete.mjs +7 -0
- 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
|
+
}
|
package/src/useField.ts
ADDED
|
@@ -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
|
+
}
|