@jcoreio/zod-forms 1.2.1 → 2.0.0-beta.2

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 (257) hide show
  1. package/FieldPath.d.ts +2 -2
  2. package/FieldPath.d.ts.map +1 -1
  3. package/FieldPath.js.map +1 -1
  4. package/FieldPath.mjs.map +1 -1
  5. package/FormAction.d.ts +2 -2
  6. package/FormAction.d.ts.map +1 -1
  7. package/FormAction.js.map +1 -1
  8. package/FormAction.mjs.map +1 -1
  9. package/FormContext.d.ts +7 -6
  10. package/FormContext.d.ts.map +1 -1
  11. package/FormContext.js.map +1 -1
  12. package/FormContext.mjs.map +1 -1
  13. package/FormState.d.ts +10 -8
  14. package/FormState.d.ts.map +1 -1
  15. package/FormState.js.map +1 -1
  16. package/FormState.mjs.map +1 -1
  17. package/README.md +2 -2
  18. package/actions/arrayActions.d.ts +40 -39
  19. package/actions/arrayActions.d.ts.map +1 -1
  20. package/actions/arrayActions.js +37 -37
  21. package/actions/arrayActions.js.map +1 -1
  22. package/actions/arrayActions.mjs +29 -29
  23. package/actions/arrayActions.mjs.map +1 -1
  24. package/actions/initialize.d.ts +5 -4
  25. package/actions/initialize.d.ts.map +1 -1
  26. package/actions/initialize.js.map +1 -1
  27. package/actions/initialize.mjs.map +1 -1
  28. package/actions/setParsedValue.d.ts +12 -0
  29. package/actions/setParsedValue.d.ts.map +1 -0
  30. package/{reducers/setRawValue.js → actions/setParsedValue.js} +9 -26
  31. package/actions/setParsedValue.js.map +1 -0
  32. package/actions/setParsedValue.mjs +9 -0
  33. package/actions/setParsedValue.mjs.map +1 -0
  34. package/actions/setSubmitStatus.d.ts +3 -3
  35. package/actions/setSubmitStatus.d.ts.map +1 -1
  36. package/actions/setSubmitStatus.js.map +1 -1
  37. package/actions/setSubmitStatus.mjs.map +1 -1
  38. package/actions/setValue.d.ts +3 -5
  39. package/actions/setValue.d.ts.map +1 -1
  40. package/actions/setValue.js +3 -7
  41. package/actions/setValue.js.map +1 -1
  42. package/actions/setValue.mjs +2 -3
  43. package/actions/setValue.mjs.map +1 -1
  44. package/createFormMiddleware.d.ts.map +1 -1
  45. package/createFormMiddleware.js +7 -5
  46. package/createFormMiddleware.js.map +1 -1
  47. package/createFormMiddleware.mjs +7 -5
  48. package/createFormMiddleware.mjs.map +1 -1
  49. package/createFormProvider.d.ts.map +1 -1
  50. package/createFormProvider.js +10 -10
  51. package/createFormProvider.js.map +1 -1
  52. package/createFormProvider.mjs +7 -7
  53. package/createFormProvider.mjs.map +1 -1
  54. package/createFormReducer.js +17 -17
  55. package/createFormReducer.js.map +1 -1
  56. package/createFormReducer.mjs +17 -17
  57. package/createFormReducer.mjs.map +1 -1
  58. package/createSelectFormStatus.d.ts +1 -1
  59. package/createSelectFormStatus.d.ts.map +1 -1
  60. package/createSelectFormStatus.js +6 -6
  61. package/createSelectFormStatus.js.map +1 -1
  62. package/createSelectFormStatus.mjs +1 -1
  63. package/createSelectFormStatus.mjs.map +1 -1
  64. package/createSelectFormValues.d.ts +19 -19
  65. package/createSelectFormValues.d.ts.map +1 -1
  66. package/createSelectFormValues.js +5 -5
  67. package/createSelectFormValues.js.map +1 -1
  68. package/createSelectFormValues.mjs +3 -3
  69. package/createSelectFormValues.mjs.map +1 -1
  70. package/createZodForm.d.ts +4 -4
  71. package/index.d.ts +1 -1
  72. package/index.d.ts.map +1 -1
  73. package/index.js.map +1 -1
  74. package/index.mjs.map +1 -1
  75. package/initFormState.js +1 -1
  76. package/initFormState.js.map +1 -1
  77. package/initFormState.mjs +1 -1
  78. package/initFormState.mjs.map +1 -1
  79. package/package.json +4 -1
  80. package/reducers/addHandlers.d.ts +6 -6
  81. package/reducers/arrayInsert.d.ts.map +1 -1
  82. package/reducers/arrayInsert.js +10 -4
  83. package/reducers/arrayInsert.js.map +1 -1
  84. package/reducers/arrayInsert.mjs +6 -4
  85. package/reducers/arrayInsert.mjs.map +1 -1
  86. package/reducers/arrayInsertParsed.d.ts +7 -0
  87. package/reducers/arrayInsertParsed.d.ts.map +1 -0
  88. package/reducers/arrayInsertParsed.js +16 -0
  89. package/reducers/arrayInsertParsed.js.map +1 -0
  90. package/reducers/arrayInsertParsed.mjs +12 -0
  91. package/reducers/arrayInsertParsed.mjs.map +1 -0
  92. package/reducers/arrayPush.d.ts.map +1 -1
  93. package/reducers/arrayPush.js +6 -4
  94. package/reducers/arrayPush.js.map +1 -1
  95. package/reducers/arrayPush.mjs +2 -4
  96. package/reducers/arrayPush.mjs.map +1 -1
  97. package/reducers/arrayPushParsed.d.ts +7 -0
  98. package/reducers/{arrayUnshiftRaw.d.ts.map → arrayPushParsed.d.ts.map} +1 -1
  99. package/reducers/arrayPushParsed.js +15 -0
  100. package/reducers/arrayPushParsed.js.map +1 -0
  101. package/reducers/arrayPushParsed.mjs +11 -0
  102. package/reducers/arrayPushParsed.mjs.map +1 -0
  103. package/reducers/arraySplice.d.ts.map +1 -1
  104. package/reducers/arraySplice.js +12 -6
  105. package/reducers/arraySplice.js.map +1 -1
  106. package/reducers/arraySplice.mjs +9 -5
  107. package/reducers/arraySplice.mjs.map +1 -1
  108. package/reducers/arraySpliceParsed.d.ts +7 -0
  109. package/reducers/arraySpliceParsed.d.ts.map +1 -0
  110. package/reducers/arraySpliceParsed.js +20 -0
  111. package/reducers/arraySpliceParsed.js.map +1 -0
  112. package/reducers/arraySpliceParsed.mjs +14 -0
  113. package/reducers/arraySpliceParsed.mjs.map +1 -0
  114. package/reducers/arrayUnshift.d.ts.map +1 -1
  115. package/reducers/arrayUnshift.js +6 -4
  116. package/reducers/arrayUnshift.js.map +1 -1
  117. package/reducers/arrayUnshift.mjs +2 -4
  118. package/reducers/arrayUnshift.mjs.map +1 -1
  119. package/reducers/arrayUnshiftParsed.d.ts +7 -0
  120. package/reducers/arrayUnshiftParsed.d.ts.map +1 -0
  121. package/reducers/arrayUnshiftParsed.js +15 -0
  122. package/reducers/arrayUnshiftParsed.js.map +1 -0
  123. package/reducers/arrayUnshiftParsed.mjs +11 -0
  124. package/reducers/arrayUnshiftParsed.mjs.map +1 -0
  125. package/reducers/initialize.d.ts +12 -12
  126. package/reducers/initialize.d.ts.map +1 -1
  127. package/reducers/initialize.js +9 -9
  128. package/reducers/initialize.js.map +1 -1
  129. package/reducers/initialize.mjs +8 -8
  130. package/reducers/initialize.mjs.map +1 -1
  131. package/reducers/removeHandlers.d.ts +6 -6
  132. package/reducers/setParsedValue.d.ts +47 -0
  133. package/reducers/setParsedValue.d.ts.map +1 -0
  134. package/reducers/setParsedValue.js +41 -0
  135. package/reducers/setParsedValue.js.map +1 -0
  136. package/reducers/setParsedValue.mjs +32 -0
  137. package/reducers/setParsedValue.mjs.map +1 -0
  138. package/reducers/setSubmitStatus.d.ts +6 -6
  139. package/reducers/setValue.d.ts +9 -10
  140. package/reducers/setValue.d.ts.map +1 -1
  141. package/reducers/setValue.js +9 -15
  142. package/reducers/setValue.js.map +1 -1
  143. package/reducers/setValue.mjs +9 -15
  144. package/reducers/setValue.mjs.map +1 -1
  145. package/reducers/submitSucceeded.d.ts +6 -6
  146. package/reducers/submitSucceeded.js +2 -2
  147. package/reducers/submitSucceeded.js.map +1 -1
  148. package/reducers/submitSucceeded.mjs +2 -2
  149. package/reducers/submitSucceeded.mjs.map +1 -1
  150. package/reducers/util/updateRawArray.d.ts +2 -2
  151. package/reducers/util/updateRawArray.d.ts.map +1 -1
  152. package/reducers/util/updateRawArray.js +3 -3
  153. package/reducers/util/updateRawArray.js.map +1 -1
  154. package/reducers/util/updateRawArray.mjs +3 -3
  155. package/reducers/util/updateRawArray.mjs.map +1 -1
  156. package/src/FieldPath.ts +3 -5
  157. package/src/FormAction.ts +2 -2
  158. package/src/FormContext.ts +7 -6
  159. package/src/FormState.ts +12 -8
  160. package/src/actions/arrayActions.ts +66 -58
  161. package/src/actions/initialize.ts +3 -2
  162. package/src/actions/setParsedValue.ts +21 -0
  163. package/src/actions/setSubmitStatus.ts +1 -1
  164. package/src/actions/setValue.ts +2 -5
  165. package/src/createFormMiddleware.ts +5 -3
  166. package/src/createFormProvider.tsx +12 -9
  167. package/src/createFormReducer.ts +17 -17
  168. package/src/createSelectFormStatus.ts +5 -5
  169. package/src/createSelectFormValues.ts +2 -2
  170. package/src/index.ts +1 -1
  171. package/src/initFormState.ts +1 -1
  172. package/src/reducers/arrayInsert.ts +9 -6
  173. package/src/reducers/arrayInsertParsed.ts +19 -0
  174. package/src/reducers/arrayPush.ts +5 -7
  175. package/src/reducers/arrayPushParsed.ts +23 -0
  176. package/src/reducers/arraySplice.ts +18 -5
  177. package/src/reducers/arraySpliceParsed.ts +17 -0
  178. package/src/reducers/arrayUnshift.ts +6 -4
  179. package/src/reducers/arrayUnshiftParsed.ts +16 -0
  180. package/src/reducers/initialize.ts +10 -8
  181. package/src/reducers/setParsedValue.ts +61 -0
  182. package/src/reducers/setValue.ts +12 -21
  183. package/src/reducers/submitSucceeded.ts +1 -1
  184. package/src/reducers/util/updateRawArray.ts +5 -5
  185. package/src/useArrayField.ts +13 -12
  186. package/src/useField.ts +26 -24
  187. package/src/useHtmlField.ts +42 -42
  188. package/src/useInitialize.ts +1 -1
  189. package/src/util/maybeParse.ts +2 -2
  190. package/useArrayField.d.ts +4 -4
  191. package/useArrayField.d.ts.map +1 -1
  192. package/useArrayField.js +8 -13
  193. package/useArrayField.js.map +1 -1
  194. package/useArrayField.mjs +3 -7
  195. package/useArrayField.mjs.map +1 -1
  196. package/useField.d.ts +7 -6
  197. package/useField.d.ts.map +1 -1
  198. package/useField.js +24 -24
  199. package/useField.js.map +1 -1
  200. package/useField.mjs +18 -18
  201. package/useField.mjs.map +1 -1
  202. package/useFormValues.d.ts +4 -4
  203. package/useHtmlField.js +40 -40
  204. package/useHtmlField.js.map +1 -1
  205. package/useHtmlField.mjs +36 -36
  206. package/useHtmlField.mjs.map +1 -1
  207. package/useInitialize.d.ts.map +1 -1
  208. package/useInitialize.js +1 -1
  209. package/useInitialize.js.map +1 -1
  210. package/useInitialize.mjs +1 -1
  211. package/useInitialize.mjs.map +1 -1
  212. package/util/maybeParse.d.ts +1 -1
  213. package/util/maybeParse.d.ts.map +1 -1
  214. package/util/maybeParse.js +2 -2
  215. package/util/maybeParse.js.map +1 -1
  216. package/util/maybeParse.mjs +2 -2
  217. package/util/maybeParse.mjs.map +1 -1
  218. package/actions/setRawValue.d.ts +0 -9
  219. package/actions/setRawValue.d.ts.map +0 -1
  220. package/actions/setRawValue.js +0 -14
  221. package/actions/setRawValue.js.map +0 -1
  222. package/actions/setRawValue.mjs +0 -8
  223. package/actions/setRawValue.mjs.map +0 -1
  224. package/reducers/arrayInsertRaw.d.ts +0 -7
  225. package/reducers/arrayInsertRaw.d.ts.map +0 -1
  226. package/reducers/arrayInsertRaw.js +0 -22
  227. package/reducers/arrayInsertRaw.js.map +0 -1
  228. package/reducers/arrayInsertRaw.mjs +0 -14
  229. package/reducers/arrayInsertRaw.mjs.map +0 -1
  230. package/reducers/arrayPushRaw.d.ts +0 -7
  231. package/reducers/arrayPushRaw.d.ts.map +0 -1
  232. package/reducers/arrayPushRaw.js +0 -17
  233. package/reducers/arrayPushRaw.js.map +0 -1
  234. package/reducers/arrayPushRaw.mjs +0 -9
  235. package/reducers/arrayPushRaw.mjs.map +0 -1
  236. package/reducers/arraySpliceRaw.d.ts +0 -7
  237. package/reducers/arraySpliceRaw.d.ts.map +0 -1
  238. package/reducers/arraySpliceRaw.js +0 -26
  239. package/reducers/arraySpliceRaw.js.map +0 -1
  240. package/reducers/arraySpliceRaw.mjs +0 -18
  241. package/reducers/arraySpliceRaw.mjs.map +0 -1
  242. package/reducers/arrayUnshiftRaw.d.ts +0 -7
  243. package/reducers/arrayUnshiftRaw.js +0 -17
  244. package/reducers/arrayUnshiftRaw.js.map +0 -1
  245. package/reducers/arrayUnshiftRaw.mjs +0 -9
  246. package/reducers/arrayUnshiftRaw.mjs.map +0 -1
  247. package/reducers/setRawValue.d.ts +0 -27
  248. package/reducers/setRawValue.d.ts.map +0 -1
  249. package/reducers/setRawValue.js.map +0 -1
  250. package/reducers/setRawValue.mjs +0 -26
  251. package/reducers/setRawValue.mjs.map +0 -1
  252. package/src/actions/setRawValue.ts +0 -17
  253. package/src/reducers/arrayInsertRaw.ts +0 -22
  254. package/src/reducers/arrayPushRaw.ts +0 -18
  255. package/src/reducers/arraySpliceRaw.ts +0 -30
  256. package/src/reducers/arrayUnshiftRaw.ts +0 -18
  257. package/src/reducers/setRawValue.ts +0 -40
@@ -0,0 +1,23 @@
1
+ import z from 'zod'
2
+ import { FormState } from '../FormState'
3
+ import { ArrayPushParsedAction } from '../actions/arrayActions'
4
+ import { Reducer } from 'redux'
5
+ import { FormAction } from '../FormAction'
6
+ import { setParsedValue } from '../actions/setParsedValue'
7
+ import { get } from '../util/get'
8
+
9
+ export function arrayPushParsedReducer<T extends z.ZodTypeAny>(
10
+ reducer: Reducer<FormState<T>, FormAction<T>>,
11
+ state: FormState<T>,
12
+ action: ArrayPushParsedAction
13
+ ) {
14
+ const { field, parsedValue } = action
15
+ const array = get(state.values, field.path)
16
+ return reducer(
17
+ state,
18
+ setParsedValue(
19
+ field.get([Array.isArray(array) ? array.length : 0]),
20
+ parsedValue
21
+ )
22
+ )
23
+ }
@@ -1,9 +1,9 @@
1
1
  import z from 'zod'
2
2
  import { FormState } from '../FormState'
3
- import { ArraySpliceAction, arraySpliceRaw } from '../actions/arrayActions'
3
+ import { ArraySpliceAction } from '../actions/arrayActions'
4
4
  import { Reducer } from 'redux'
5
5
  import { FormAction } from '../FormAction'
6
- import { getInverseArrayElementSchema } from './util/getInverseArrayElementSchema'
6
+ import { updateRawArray } from './util/updateRawArray'
7
7
 
8
8
  export function arraySpliceReducer<T extends z.ZodTypeAny>(
9
9
  reducer: Reducer<FormState<T>, FormAction<T>>,
@@ -11,7 +11,20 @@ export function arraySpliceReducer<T extends z.ZodTypeAny>(
11
11
  action: ArraySpliceAction
12
12
  ) {
13
13
  const { field, index, deleteCount, values } = action
14
- const inverseSchema = getInverseArrayElementSchema(field.schema)
15
- const rawValues = values.map((v) => inverseSchema.parse(v))
16
- return reducer(state, arraySpliceRaw(field, index, deleteCount, rawValues))
14
+ return updateRawArray(reducer, state, field, (array) =>
15
+ splice(array ?? [], index, deleteCount, values)
16
+ )
17
+ }
18
+
19
+ function splice<T>(
20
+ array: T[],
21
+ index: number,
22
+ deleteCount: number,
23
+ parsedValues: T[]
24
+ ) {
25
+ if (index < 0 || index > array.length) throw new Error(`index out of range`)
26
+ if (!deleteCount && !parsedValues.length) return array
27
+ const result = [...array]
28
+ result.splice(index, deleteCount, ...parsedValues)
29
+ return result
17
30
  }
@@ -0,0 +1,17 @@
1
+ import z from 'zod'
2
+ import { FormState } from '../FormState'
3
+ import { ArraySpliceParsedAction, arraySplice } from '../actions/arrayActions'
4
+ import { Reducer } from 'redux'
5
+ import { FormAction } from '../FormAction'
6
+ import { getInverseArrayElementSchema } from './util/getInverseArrayElementSchema'
7
+
8
+ export function arraySpliceParsedReducer<T extends z.ZodTypeAny>(
9
+ reducer: Reducer<FormState<T>, FormAction<T>>,
10
+ state: FormState<T>,
11
+ action: ArraySpliceParsedAction
12
+ ) {
13
+ const { field, index, deleteCount, parsedValues } = action
14
+ const inverseSchema = getInverseArrayElementSchema(field.schema)
15
+ const values = parsedValues.map((v) => inverseSchema.parse(v))
16
+ return reducer(state, arraySplice(field, index, deleteCount, values))
17
+ }
@@ -1,9 +1,9 @@
1
1
  import z from 'zod'
2
2
  import { FormState } from '../FormState'
3
- import { ArrayUnshiftAction, arrayUnshiftRaw } from '../actions/arrayActions'
3
+ import { ArrayUnshiftAction } from '../actions/arrayActions'
4
4
  import { Reducer } from 'redux'
5
5
  import { FormAction } from '../FormAction'
6
- import { getInverseArrayElementSchema } from './util/getInverseArrayElementSchema'
6
+ import { updateRawArray } from './util/updateRawArray'
7
7
 
8
8
  export function arrayUnshiftReducer<T extends z.ZodTypeAny>(
9
9
  reducer: Reducer<FormState<T>, FormAction<T>>,
@@ -11,6 +11,8 @@ export function arrayUnshiftReducer<T extends z.ZodTypeAny>(
11
11
  action: ArrayUnshiftAction
12
12
  ) {
13
13
  const { field, value } = action
14
- const inverseSchema = getInverseArrayElementSchema(field.schema)
15
- return reducer(state, arrayUnshiftRaw(field, inverseSchema.parse(value)))
14
+ return updateRawArray(reducer, state, field, (array) => [
15
+ value,
16
+ ...(array ?? []),
17
+ ])
16
18
  }
@@ -0,0 +1,16 @@
1
+ import z from 'zod'
2
+ import { FormState } from '../FormState'
3
+ import { ArrayUnshiftParsedAction, arrayUnshift } from '../actions/arrayActions'
4
+ import { Reducer } from 'redux'
5
+ import { FormAction } from '../FormAction'
6
+ import { getInverseArrayElementSchema } from './util/getInverseArrayElementSchema'
7
+
8
+ export function arrayUnshiftParsedReducer<T extends z.ZodTypeAny>(
9
+ reducer: Reducer<FormState<T>, FormAction<T>>,
10
+ state: FormState<T>,
11
+ action: ArrayUnshiftParsedAction
12
+ ) {
13
+ const { field, parsedValue } = action
14
+ const inverseSchema = getInverseArrayElementSchema(field.schema)
15
+ return reducer(state, arrayUnshift(field, inverseSchema.parse(parsedValue)))
16
+ }
@@ -12,12 +12,14 @@ export const createInitializeReducer = <T extends z.ZodTypeAny>({
12
12
  function initializeReducer(state: FormState<T>, action: InitializeAction<T>) {
13
13
  const { keepSubmitSucceeded } = action
14
14
  try {
15
- const rawValues =
16
- action.rawValues ??
17
- (action.values ? inverseSchema.parse(action.values) : undefined)
18
15
  const values =
19
16
  action.values ??
20
- (action.rawValues ? schema.parse(action.rawValues) : undefined)
17
+ (action.parsedValues
18
+ ? inverseSchema.parse(action.parsedValues)
19
+ : undefined)
20
+ const parsedValues =
21
+ action.parsedValues ??
22
+ (action.values ? schema.parse(action.values) : undefined)
21
23
  return {
22
24
  ...state,
23
25
  validationError: undefined,
@@ -25,10 +27,10 @@ export const createInitializeReducer = <T extends z.ZodTypeAny>({
25
27
  submitting: false,
26
28
  submitFailed: false,
27
29
  submitSucceeded: keepSubmitSucceeded ? state.submitSucceeded : false,
28
- rawValues,
29
30
  values,
30
- rawInitialValues: rawValues,
31
+ parsedValues,
31
32
  initialValues: values,
33
+ initialParsedValues: parsedValues,
32
34
  }
33
35
  } catch (error) {
34
36
  return {
@@ -38,10 +40,10 @@ export const createInitializeReducer = <T extends z.ZodTypeAny>({
38
40
  submitting: false,
39
41
  submitFailed: false,
40
42
  submitSucceeded: keepSubmitSucceeded ? state.submitSucceeded : false,
41
- rawValues: action.rawValues,
42
43
  values: action.values,
43
- rawInitialValues: action.rawValues,
44
+ parsedValues: action.parsedValues,
44
45
  initialValues: action.values,
46
+ initialParsedValues: action.parsedValues,
45
47
  }
46
48
  }
47
49
  }
@@ -0,0 +1,61 @@
1
+ import z from 'zod'
2
+ import { FormState } from '../FormState'
3
+ import { SetParsedValueAction } from '../actions/setParsedValue'
4
+ import { set } from '../util/set'
5
+ import { FieldPath } from '../FieldPath'
6
+ import { invert } from 'zod-invertible'
7
+
8
+ export const createSetParsedValueReducer = <T extends z.ZodTypeAny>({
9
+ schema,
10
+ inverseSchema,
11
+ }: {
12
+ schema: T
13
+ inverseSchema: z.ZodType<z.input<T>, any, z.output<T>>
14
+ }) =>
15
+ function setParsedValueReducer<Field extends FieldPath>(
16
+ state: FormState<T>,
17
+ action: SetParsedValueAction<Field>
18
+ ) {
19
+ const newParsedValues = set(
20
+ state.parsedValues,
21
+ action.field.path,
22
+ action.parsedValue
23
+ ) as (typeof state)['parsedValues']
24
+ try {
25
+ const newValues = inverseSchema.parse(newParsedValues)
26
+ schema.parse(newValues)
27
+ return {
28
+ ...state,
29
+ submitError: undefined,
30
+ validationError: undefined,
31
+ values: newValues,
32
+ parsedValues: newParsedValues,
33
+ }
34
+ } catch (error) {
35
+ const newParsed = invert(action.field.schema).safeParse(
36
+ action.parsedValue
37
+ )
38
+ const values = newParsed.success
39
+ ? (set(
40
+ state.values,
41
+ action.field.path,
42
+ newParsed.data
43
+ ) as (typeof state)['values'])
44
+ : state.values
45
+ const newValidatedParsed = schema.safeParse(values)
46
+ const result = {
47
+ ...state,
48
+ submitError: undefined,
49
+ validationError: !newParsed.success
50
+ ? newParsed.error
51
+ : newValidatedParsed.success
52
+ ? undefined
53
+ : newValidatedParsed.error,
54
+ values,
55
+ parsedValues: newValidatedParsed.success
56
+ ? newValidatedParsed.data
57
+ : state.parsedValues,
58
+ }
59
+ return result
60
+ }
61
+ }
@@ -3,47 +3,38 @@ import { FormState } from '../FormState'
3
3
  import { SetValueAction } from '../actions/setValue'
4
4
  import { set } from '../util/set'
5
5
  import { FieldPath } from '../FieldPath'
6
- import { invert } from 'zod-invertible'
7
6
 
8
7
  export const createSetValueReducer = <T extends z.ZodTypeAny>({
9
8
  schema,
10
- inverseSchema,
11
9
  }: {
12
10
  schema: T
13
- inverseSchema: z.ZodType<z.input<T>, any, z.output<T>>
14
11
  }) =>
15
12
  function setValueReducer<Field extends FieldPath>(
16
13
  state: FormState<T>,
17
14
  action: SetValueAction<Field>
18
15
  ) {
19
- const newValues = set(state.values, action.field.path, action.value)
16
+ const newValues = set(
17
+ state.values,
18
+ action.field.path,
19
+ action.value
20
+ ) as (typeof state)['values']
21
+ if (newValues === state.values) return state
20
22
  try {
21
- const newRawValues = inverseSchema.parse(newValues)
22
- schema.parse(newRawValues)
23
+ const newParsedValues = schema.parse(newValues)
23
24
  return {
24
25
  ...state,
25
26
  submitError: undefined,
26
27
  validationError: undefined,
27
- rawValues: newRawValues,
28
28
  values: newValues,
29
+ parsedValues: newParsedValues,
29
30
  }
30
31
  } catch (error) {
31
- const newRawParsed = invert(action.field.schema).safeParse(action.value)
32
- const rawValues = newRawParsed.success
33
- ? set(state.rawValues, action.field.path, newRawParsed.data)
34
- : state.rawValues
35
- const newParsed = schema.safeParse(rawValues)
36
- const result = {
32
+ return {
37
33
  ...state,
38
34
  submitError: undefined,
39
- validationError: !newRawParsed.success
40
- ? newRawParsed.error
41
- : newParsed.success
42
- ? undefined
43
- : newParsed.error,
44
- rawValues,
45
- values: newParsed.success ? newParsed.data : state.values,
35
+ validationError: error,
36
+ values: newValues,
37
+ parsedValues: undefined,
46
38
  }
47
- return result
48
39
  }
49
40
  }
@@ -11,7 +11,7 @@ export function submitSucceededReducer<T extends z.ZodTypeAny>(
11
11
  submitFailed: false,
12
12
  submitError: undefined,
13
13
  submitPromise: undefined,
14
+ initialParsedValues: state.submittedParsedValues,
14
15
  initialValues: state.submittedValues,
15
- rawInitialValues: state.rawSubmittedValues,
16
16
  }
17
17
  }
@@ -1,14 +1,14 @@
1
1
  import z from 'zod'
2
2
  import { Reducer } from 'react'
3
- import { FieldPath, FieldPathForRawValue } from '../../FieldPath'
3
+ import { FieldPath, FieldPathForValue } from '../../FieldPath'
4
4
  import { FormState } from '../../FormState'
5
5
  import { FormAction } from '../../FormAction'
6
6
  import { get } from '../../util/get'
7
- import { setRawValue } from '../../actions/setRawValue'
7
+ import { setValue } from '../../actions/setValue'
8
8
 
9
9
  export function updateRawArray<
10
10
  T extends z.ZodTypeAny,
11
- Field extends FieldPathForRawValue<any[]>
11
+ Field extends FieldPathForValue<any[]>
12
12
  >(
13
13
  reducer: Reducer<FormState<T>, FormAction<T>>,
14
14
  state: FormState<T>,
@@ -17,9 +17,9 @@ export function updateRawArray<
17
17
  array: z.input<Field['schema']> | undefined
18
18
  ) => z.input<Field['schema']> | undefined
19
19
  ) {
20
- const oldValue = get(state.rawValues, field.path)
20
+ const oldValue = get(state.values, field.path)
21
21
  const newValue = updater(oldValue as any)
22
22
  return newValue === oldValue
23
23
  ? state
24
- : reducer(state, setRawValue(field, newValue))
24
+ : reducer(state, setValue(field, newValue))
25
25
  }
@@ -1,5 +1,5 @@
1
1
  import z from 'zod'
2
- import { BasePath, FieldPath, FieldPathForRawValue } from './FieldPath'
2
+ import { BasePath, FieldPath, FieldPathForValue } from './FieldPath'
3
3
  import React from 'react'
4
4
  import { useFormContext } from './useFormContext'
5
5
  import { PathInSchema, PathstringInSchema } from './util/PathInSchema'
@@ -15,10 +15,11 @@ import {
15
15
  useFormSelector as untypedUseFormSelector,
16
16
  } from './useFormSelector'
17
17
  import { shallowEqual } from 'react-redux'
18
+ import { setParsedValue } from './actions/setParsedValue'
18
19
  import { setValue } from './actions/setValue'
19
- import { setRawValue } from './actions/setRawValue'
20
20
  import { setMeta } from './actions/setMeta'
21
21
  import { FieldMeta } from './FormState'
22
+ import { DeepPartial } from './util/DeepPartial'
22
23
 
23
24
  export type UseArrayFieldProps<Field extends FieldPath> = NonNullable<
24
25
  z.input<Field['schema']>
@@ -27,8 +28,8 @@ export type UseArrayFieldProps<Field extends FieldPath> = NonNullable<
27
28
  ReturnType<
28
29
  typeof bindActionsToField<
29
30
  typeof arrayActions & {
31
+ setParsedValue: typeof setParsedValue
30
32
  setValue: typeof setValue
31
- setRawValue: typeof setRawValue
32
33
  setMeta: typeof setMeta
33
34
  }
34
35
  >
@@ -43,7 +44,7 @@ export type UseArrayFieldProps<Field extends FieldPath> = NonNullable<
43
44
  : { ERROR: 'not an array field' }
44
45
 
45
46
  export interface TypedUseArrayField<T extends z.ZodTypeAny> {
46
- <Field extends FieldPathForRawValue<any[] | null | undefined>>(
47
+ <Field extends FieldPathForValue<any[] | null | undefined>>(
47
48
  field: Field
48
49
  ): UseArrayFieldProps<Field>
49
50
  <Path extends PathInSchema<T>>(path: Path): UseArrayFieldProps<
@@ -61,8 +62,8 @@ function useArrayFieldBase<Field extends FieldPath>(
61
62
 
62
63
  const {
63
64
  arrayActions,
65
+ setParsedValue,
64
66
  setValue,
65
- setRawValue,
66
67
  setMeta,
67
68
  selectFormValues,
68
69
  selectFieldErrorMap,
@@ -78,20 +79,20 @@ function useArrayFieldBase<Field extends FieldPath>(
78
79
  [
79
80
  createStructuredSelector({
80
81
  value: ({ values }) =>
81
- get(values, field.path) as z.output<T> | undefined,
82
- rawValue: ({ rawValues }) =>
83
- get(rawValues, field.path) as unknown,
82
+ get(values, field.path) as DeepPartial<z.input<T>> | undefined,
84
83
  initialValue: ({ initialValues }) =>
85
- get(initialValues, field.path) as z.output<T> | undefined,
84
+ get(initialValues, field.path) as
85
+ | DeepPartial<z.input<T>>
86
+ | undefined,
86
87
  }),
87
88
  ],
88
- ({ rawValue, value, initialValue }) => {
89
+ ({ value, initialValue }) => {
89
90
  const dirty = !isEqual(value, initialValue)
90
91
  const pristine = !dirty
91
92
  return {
92
93
  dirty,
93
94
  pristine,
94
- length: Array.isArray(rawValue) ? rawValue.length : 0,
95
+ length: Array.isArray(value) ? value.length : 0,
95
96
  }
96
97
  }
97
98
  )
@@ -113,7 +114,7 @@ function useArrayFieldBase<Field extends FieldPath>(
113
114
  const boundActions = React.useMemo(
114
115
  () =>
115
116
  bindActionsToField(
116
- { ...arrayActions, setValue, setRawValue, setMeta },
117
+ { ...arrayActions, setParsedValue, setValue, setMeta },
117
118
  field
118
119
  ),
119
120
  [field.pathstring]
package/src/useField.ts CHANGED
@@ -3,8 +3,8 @@ import { BasePath, FieldPath } from './FieldPath'
3
3
  import { FieldMeta } from './FormState'
4
4
  import { get } from './util/get'
5
5
  import React from 'react'
6
+ import { setParsedValue } from './actions/setParsedValue'
6
7
  import { setValue } from './actions/setValue'
7
- import { setRawValue } from './actions/setRawValue'
8
8
  import { setMeta } from './actions/setMeta'
9
9
  import {
10
10
  useFormSelector as untypedUseFormSelector,
@@ -19,19 +19,20 @@ import { parsePathstring } from './util/parsePathstring'
19
19
  import { SchemaAt } from './util/SchemaAt'
20
20
  import { maybeParse } from './util/maybeParse'
21
21
  import { bindActionsToField } from './util/bindActionsToField'
22
+ import { DeepPartial } from './util/DeepPartial'
22
23
 
23
24
  export type UseFieldProps<Field extends FieldPath> = FieldMeta &
24
25
  ReturnType<
25
26
  typeof bindActionsToField<{
27
+ setParsedValue: typeof setParsedValue
26
28
  setValue: typeof setValue
27
- setRawValue: typeof setRawValue
28
29
  setMeta: typeof setMeta
29
30
  }>
30
31
  > & {
31
- value: z.output<Field['schema']> | undefined
32
- rawValue: unknown
33
- initialValue: z.output<Field['schema']> | undefined
34
- rawInitialValue: unknown
32
+ parsedValue?: z.output<Field['schema']>
33
+ value?: DeepPartial<z.input<Field['schema']>>
34
+ initialParsedValue?: z.output<Field['schema']>
35
+ initialValue?: DeepPartial<z.input<Field['schema']>>
35
36
  error?: string
36
37
  dirty: boolean
37
38
  pristine: boolean
@@ -55,8 +56,8 @@ function useFieldBase<T extends z.ZodTypeAny, Field extends FieldPath>(
55
56
  type Schema = Field['schema']
56
57
 
57
58
  const {
59
+ setParsedValue,
58
60
  setValue,
59
- setRawValue,
60
61
  setMeta,
61
62
  selectFormValues,
62
63
  selectFieldErrorMap,
@@ -71,29 +72,30 @@ function useFieldBase<T extends z.ZodTypeAny, Field extends FieldPath>(
71
72
  createSelector(
72
73
  [
73
74
  createStructuredSelector({
74
- value: ({ values }) =>
75
- get(values, field.path) as z.output<Schema> | undefined,
76
- rawValue: ({ rawValues }) =>
77
- get(rawValues, field.path) as unknown,
75
+ parsedValue: ({ parsedValues }) =>
76
+ get(parsedValues, field.path) as z.output<Schema> | undefined,
77
+ value: ({ values }) => get(values, field.path) as unknown,
78
+ initialParsedValue: ({ initialParsedValues }) =>
79
+ get(initialParsedValues, field.path) as
80
+ | z.output<Schema>
81
+ | undefined,
78
82
  initialValue: ({ initialValues }) =>
79
- get(initialValues, field.path) as z.output<Schema> | undefined,
80
- rawInitialValue: ({ rawInitialValues }) =>
81
- get(rawInitialValues, field.path) as unknown,
83
+ get(initialValues, field.path) as unknown,
82
84
  }),
83
85
  ],
84
86
  ({
85
- rawValue,
86
- value = maybeParse(field.schema, rawValue),
87
- rawInitialValue,
88
- initialValue = maybeParse(field.schema, rawInitialValue),
87
+ value,
88
+ parsedValue = maybeParse(field.schema, value),
89
+ initialValue,
90
+ initialParsedValue = maybeParse(field.schema, initialValue),
89
91
  }) => {
90
92
  const dirty = !isEqual(value, initialValue)
91
93
  const pristine = !dirty
92
94
  return {
95
+ parsedValue,
93
96
  value,
94
- rawValue,
97
+ initialParsedValue,
95
98
  initialValue,
96
- rawInitialValue,
97
99
  dirty,
98
100
  pristine,
99
101
  }
@@ -103,7 +105,7 @@ function useFieldBase<T extends z.ZodTypeAny, Field extends FieldPath>(
103
105
  [field.pathstring]
104
106
  )
105
107
 
106
- const values = useFormSelector(valuesSelector, shallowEqual)
108
+ const parsedValues = useFormSelector(valuesSelector, shallowEqual)
107
109
 
108
110
  const error = useFormSelector(
109
111
  (state) => selectFieldErrorMap(state)[field.pathstring]
@@ -112,21 +114,21 @@ function useFieldBase<T extends z.ZodTypeAny, Field extends FieldPath>(
112
114
  const submitFailed = useFormSelector((state) => state.submitFailed)
113
115
 
114
116
  const boundActions = React.useMemo(
115
- () => bindActionsToField({ setValue, setRawValue, setMeta }, field),
117
+ () => bindActionsToField({ setParsedValue, setValue, setMeta }, field),
116
118
  [field.pathstring]
117
119
  )
118
120
 
119
121
  return React.useMemo(
120
122
  () => ({
121
123
  ...boundActions,
122
- ...values,
124
+ ...parsedValues,
123
125
  visited: meta?.visited || false,
124
126
  touched: meta?.touched || submitFailed,
125
127
  error,
126
128
  valid: !error,
127
129
  invalid: Boolean(error),
128
130
  }),
129
- [field.pathstring, values, meta, error, submitFailed]
131
+ [field.pathstring, parsedValues, meta, error, submitFailed]
130
132
  ) as any
131
133
  }
132
134