react-hook-form 7.72.1 → 7.74.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 (242) hide show
  1. package/README.md +3 -20
  2. package/dist/form.d.ts.map +1 -1
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.esm.mjs +88 -48
  6. package/dist/index.esm.mjs.map +1 -1
  7. package/dist/index.umd.js +1 -1
  8. package/dist/index.umd.js.map +1 -1
  9. package/dist/logic/createFormControl.d.ts.map +1 -1
  10. package/dist/logic/validateField.d.ts.map +1 -1
  11. package/dist/react-server.esm.mjs +68 -33
  12. package/dist/react-server.esm.mjs.map +1 -1
  13. package/dist/types/form.d.ts +2 -0
  14. package/dist/types/form.d.ts.map +1 -1
  15. package/dist/useController.d.ts.map +1 -1
  16. package/dist/useFieldArray.d.ts.map +1 -1
  17. package/dist/utils/deepEqual.d.ts +1 -1
  18. package/dist/utils/deepEqual.d.ts.map +1 -1
  19. package/dist/utils/unset.d.ts.map +1 -1
  20. package/package.json +1 -1
  21. package/dist/__tests__/controller.server.test.d.ts +0 -2
  22. package/dist/__tests__/controller.server.test.d.ts.map +0 -1
  23. package/dist/__tests__/controller.test.d.ts +0 -2
  24. package/dist/__tests__/controller.test.d.ts.map +0 -1
  25. package/dist/__tests__/form.test.d.ts +0 -2
  26. package/dist/__tests__/form.test.d.ts.map +0 -1
  27. package/dist/__tests__/formStateSubscribe.server.test.d.ts +0 -2
  28. package/dist/__tests__/formStateSubscribe.server.test.d.ts.map +0 -1
  29. package/dist/__tests__/formStateSubscribe.test.d.ts +0 -2
  30. package/dist/__tests__/formStateSubscribe.test.d.ts.map +0 -1
  31. package/dist/__tests__/isPlainObject.test.d.ts +0 -2
  32. package/dist/__tests__/isPlainObject.test.d.ts.map +0 -1
  33. package/dist/__tests__/logic/appendErrors.test.d.ts +0 -2
  34. package/dist/__tests__/logic/appendErrors.test.d.ts.map +0 -1
  35. package/dist/__tests__/logic/createFormControl.test.d.ts +0 -2
  36. package/dist/__tests__/logic/createFormControl.test.d.ts.map +0 -1
  37. package/dist/__tests__/logic/generateId.test.d.ts +0 -2
  38. package/dist/__tests__/logic/generateId.test.d.ts.map +0 -1
  39. package/dist/__tests__/logic/getCheckboxValue.test.d.ts +0 -2
  40. package/dist/__tests__/logic/getCheckboxValue.test.d.ts.map +0 -1
  41. package/dist/__tests__/logic/getDirtyFields.test.d.ts +0 -2
  42. package/dist/__tests__/logic/getDirtyFields.test.d.ts.map +0 -1
  43. package/dist/__tests__/logic/getEventValue.test.d.ts +0 -2
  44. package/dist/__tests__/logic/getEventValue.test.d.ts.map +0 -1
  45. package/dist/__tests__/logic/getFieldValue.test.d.ts +0 -2
  46. package/dist/__tests__/logic/getFieldValue.test.d.ts.map +0 -1
  47. package/dist/__tests__/logic/getFieldValueAs.test.d.ts +0 -2
  48. package/dist/__tests__/logic/getFieldValueAs.test.d.ts.map +0 -1
  49. package/dist/__tests__/logic/getFocusFieldName.test.d.ts +0 -2
  50. package/dist/__tests__/logic/getFocusFieldName.test.d.ts.map +0 -1
  51. package/dist/__tests__/logic/getNodeParentName.test.d.ts +0 -2
  52. package/dist/__tests__/logic/getNodeParentName.test.d.ts.map +0 -1
  53. package/dist/__tests__/logic/getRadioValue.test.d.ts +0 -2
  54. package/dist/__tests__/logic/getRadioValue.test.d.ts.map +0 -1
  55. package/dist/__tests__/logic/getResolverOptions.test.d.ts +0 -2
  56. package/dist/__tests__/logic/getResolverOptions.test.d.ts.map +0 -1
  57. package/dist/__tests__/logic/getRuleValue.test.d.ts +0 -2
  58. package/dist/__tests__/logic/getRuleValue.test.d.ts.map +0 -1
  59. package/dist/__tests__/logic/getValidateError.test.d.ts +0 -2
  60. package/dist/__tests__/logic/getValidateError.test.d.ts.map +0 -1
  61. package/dist/__tests__/logic/getValidationModes.test.d.ts +0 -2
  62. package/dist/__tests__/logic/getValidationModes.test.d.ts.map +0 -1
  63. package/dist/__tests__/logic/getValueAndMessage.test.d.ts +0 -2
  64. package/dist/__tests__/logic/getValueAndMessage.test.d.ts.map +0 -1
  65. package/dist/__tests__/logic/hasPromiseValidation.test.d.ts +0 -2
  66. package/dist/__tests__/logic/hasPromiseValidation.test.d.ts.map +0 -1
  67. package/dist/__tests__/logic/hasValidation.test.d.ts +0 -2
  68. package/dist/__tests__/logic/hasValidation.test.d.ts.map +0 -1
  69. package/dist/__tests__/logic/isNameInFieldArray.test.d.ts +0 -2
  70. package/dist/__tests__/logic/isNameInFieldArray.test.d.ts.map +0 -1
  71. package/dist/__tests__/logic/isWatched.test.d.ts +0 -2
  72. package/dist/__tests__/logic/isWatched.test.d.ts.map +0 -1
  73. package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts +0 -2
  74. package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts.map +0 -1
  75. package/dist/__tests__/logic/schemaErrorLookup.test.d.ts +0 -2
  76. package/dist/__tests__/logic/schemaErrorLookup.test.d.ts.map +0 -1
  77. package/dist/__tests__/logic/shouldRenderFormState.test.d.ts +0 -2
  78. package/dist/__tests__/logic/shouldRenderFormState.test.d.ts.map +0 -1
  79. package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts +0 -2
  80. package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts.map +0 -1
  81. package/dist/__tests__/logic/skipValidation.test.d.ts +0 -2
  82. package/dist/__tests__/logic/skipValidation.test.d.ts.map +0 -1
  83. package/dist/__tests__/logic/unsetEmptyArray.test.d.ts +0 -2
  84. package/dist/__tests__/logic/unsetEmptyArray.test.d.ts.map +0 -1
  85. package/dist/__tests__/logic/validateField.test.d.ts +0 -2
  86. package/dist/__tests__/logic/validateField.test.d.ts.map +0 -1
  87. package/dist/__tests__/type.test.d.ts +0 -2
  88. package/dist/__tests__/type.test.d.ts.map +0 -1
  89. package/dist/__tests__/useController.test.d.ts +0 -2
  90. package/dist/__tests__/useController.test.d.ts.map +0 -1
  91. package/dist/__tests__/useFieldArray/append.test.d.ts +0 -2
  92. package/dist/__tests__/useFieldArray/append.test.d.ts.map +0 -1
  93. package/dist/__tests__/useFieldArray/dirtyFields.test.d.ts +0 -2
  94. package/dist/__tests__/useFieldArray/dirtyFields.test.d.ts.map +0 -1
  95. package/dist/__tests__/useFieldArray/focus.test.d.ts +0 -2
  96. package/dist/__tests__/useFieldArray/focus.test.d.ts.map +0 -1
  97. package/dist/__tests__/useFieldArray/insert.test.d.ts +0 -2
  98. package/dist/__tests__/useFieldArray/insert.test.d.ts.map +0 -1
  99. package/dist/__tests__/useFieldArray/move.test.d.ts +0 -2
  100. package/dist/__tests__/useFieldArray/move.test.d.ts.map +0 -1
  101. package/dist/__tests__/useFieldArray/prepend.test.d.ts +0 -2
  102. package/dist/__tests__/useFieldArray/prepend.test.d.ts.map +0 -1
  103. package/dist/__tests__/useFieldArray/remove.test.d.ts +0 -2
  104. package/dist/__tests__/useFieldArray/remove.test.d.ts.map +0 -1
  105. package/dist/__tests__/useFieldArray/replace.test.d.ts +0 -2
  106. package/dist/__tests__/useFieldArray/replace.test.d.ts.map +0 -1
  107. package/dist/__tests__/useFieldArray/swap.test.d.ts +0 -2
  108. package/dist/__tests__/useFieldArray/swap.test.d.ts.map +0 -1
  109. package/dist/__tests__/useFieldArray/update.test.d.ts +0 -2
  110. package/dist/__tests__/useFieldArray/update.test.d.ts.map +0 -1
  111. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  112. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  113. package/dist/__tests__/useForm/clearErrors.test.d.ts +0 -2
  114. package/dist/__tests__/useForm/clearErrors.test.d.ts.map +0 -1
  115. package/dist/__tests__/useForm/formState.test.d.ts +0 -2
  116. package/dist/__tests__/useForm/formState.test.d.ts.map +0 -1
  117. package/dist/__tests__/useForm/getFieldState.test.d.ts +0 -2
  118. package/dist/__tests__/useForm/getFieldState.test.d.ts.map +0 -1
  119. package/dist/__tests__/useForm/getValues.test.d.ts +0 -2
  120. package/dist/__tests__/useForm/getValues.test.d.ts.map +0 -1
  121. package/dist/__tests__/useForm/handleSubmit.test.d.ts +0 -2
  122. package/dist/__tests__/useForm/handleSubmit.test.d.ts.map +0 -1
  123. package/dist/__tests__/useForm/register.test.d.ts +0 -2
  124. package/dist/__tests__/useForm/register.test.d.ts.map +0 -1
  125. package/dist/__tests__/useForm/reset.test.d.ts +0 -2
  126. package/dist/__tests__/useForm/reset.test.d.ts.map +0 -1
  127. package/dist/__tests__/useForm/resetField.test.d.ts +0 -2
  128. package/dist/__tests__/useForm/resetField.test.d.ts.map +0 -1
  129. package/dist/__tests__/useForm/resolver.test.d.ts +0 -2
  130. package/dist/__tests__/useForm/resolver.test.d.ts.map +0 -1
  131. package/dist/__tests__/useForm/setError.test.d.ts +0 -2
  132. package/dist/__tests__/useForm/setError.test.d.ts.map +0 -1
  133. package/dist/__tests__/useForm/setFocus.test.d.ts +0 -2
  134. package/dist/__tests__/useForm/setFocus.test.d.ts.map +0 -1
  135. package/dist/__tests__/useForm/setValue.test.d.ts +0 -2
  136. package/dist/__tests__/useForm/setValue.test.d.ts.map +0 -1
  137. package/dist/__tests__/useForm/subscribe.test.d.ts +0 -2
  138. package/dist/__tests__/useForm/subscribe.test.d.ts.map +0 -1
  139. package/dist/__tests__/useForm/trigger.test.d.ts +0 -2
  140. package/dist/__tests__/useForm/trigger.test.d.ts.map +0 -1
  141. package/dist/__tests__/useForm/unregister.test.d.ts +0 -2
  142. package/dist/__tests__/useForm/unregister.test.d.ts.map +0 -1
  143. package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts +0 -2
  144. package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts.map +0 -1
  145. package/dist/__tests__/useForm/watch.test.d.ts +0 -2
  146. package/dist/__tests__/useForm/watch.test.d.ts.map +0 -1
  147. package/dist/__tests__/useForm.server.test.d.ts +0 -2
  148. package/dist/__tests__/useForm.server.test.d.ts.map +0 -1
  149. package/dist/__tests__/useForm.test.d.ts +0 -2
  150. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  151. package/dist/__tests__/useFormContext.server.test.d.ts +0 -2
  152. package/dist/__tests__/useFormContext.server.test.d.ts.map +0 -1
  153. package/dist/__tests__/useFormContext.test.d.ts +0 -2
  154. package/dist/__tests__/useFormContext.test.d.ts.map +0 -1
  155. package/dist/__tests__/useFormState.test.d.ts +0 -2
  156. package/dist/__tests__/useFormState.test.d.ts.map +0 -1
  157. package/dist/__tests__/useWatch.test.d.ts +0 -2
  158. package/dist/__tests__/useWatch.test.d.ts.map +0 -1
  159. package/dist/__tests__/utils/append.test.d.ts +0 -2
  160. package/dist/__tests__/utils/append.test.d.ts.map +0 -1
  161. package/dist/__tests__/utils/cloneObject.test.d.ts +0 -2
  162. package/dist/__tests__/utils/cloneObject.test.d.ts.map +0 -1
  163. package/dist/__tests__/utils/compact.test.d.ts +0 -2
  164. package/dist/__tests__/utils/compact.test.d.ts.map +0 -1
  165. package/dist/__tests__/utils/convertToArrayPayload.test.d.ts +0 -2
  166. package/dist/__tests__/utils/convertToArrayPayload.test.d.ts.map +0 -1
  167. package/dist/__tests__/utils/createSubject.test.d.ts +0 -2
  168. package/dist/__tests__/utils/createSubject.test.d.ts.map +0 -1
  169. package/dist/__tests__/utils/deepEqual.test.d.ts +0 -2
  170. package/dist/__tests__/utils/deepEqual.test.d.ts.map +0 -1
  171. package/dist/__tests__/utils/deepMerge.test.d.ts +0 -2
  172. package/dist/__tests__/utils/deepMerge.test.d.ts.map +0 -1
  173. package/dist/__tests__/utils/extractFormValues.test.d.ts +0 -2
  174. package/dist/__tests__/utils/extractFormValues.test.d.ts.map +0 -1
  175. package/dist/__tests__/utils/fillEmptyArray.test.d.ts +0 -2
  176. package/dist/__tests__/utils/fillEmptyArray.test.d.ts.map +0 -1
  177. package/dist/__tests__/utils/flatten.test.d.ts +0 -2
  178. package/dist/__tests__/utils/flatten.test.d.ts.map +0 -1
  179. package/dist/__tests__/utils/get.test.d.ts +0 -2
  180. package/dist/__tests__/utils/get.test.d.ts.map +0 -1
  181. package/dist/__tests__/utils/insert.test.d.ts +0 -2
  182. package/dist/__tests__/utils/insert.test.d.ts.map +0 -1
  183. package/dist/__tests__/utils/isBoolean.test.d.ts +0 -2
  184. package/dist/__tests__/utils/isBoolean.test.d.ts.map +0 -1
  185. package/dist/__tests__/utils/isCheckBoxInput.test.d.ts +0 -2
  186. package/dist/__tests__/utils/isCheckBoxInput.test.d.ts.map +0 -1
  187. package/dist/__tests__/utils/isEmptyObject.test.d.ts +0 -2
  188. package/dist/__tests__/utils/isEmptyObject.test.d.ts.map +0 -1
  189. package/dist/__tests__/utils/isFileInput.test.d.ts +0 -2
  190. package/dist/__tests__/utils/isFileInput.test.d.ts.map +0 -1
  191. package/dist/__tests__/utils/isFunction.test.d.ts +0 -2
  192. package/dist/__tests__/utils/isFunction.test.d.ts.map +0 -1
  193. package/dist/__tests__/utils/isHTMLElement.test.d.ts +0 -2
  194. package/dist/__tests__/utils/isHTMLElement.test.d.ts.map +0 -1
  195. package/dist/__tests__/utils/isKey.test.d.ts +0 -2
  196. package/dist/__tests__/utils/isKey.test.d.ts.map +0 -1
  197. package/dist/__tests__/utils/isMultipleSelect.test.d.ts +0 -2
  198. package/dist/__tests__/utils/isMultipleSelect.test.d.ts.map +0 -1
  199. package/dist/__tests__/utils/isNullOrUndefined.test.d.ts +0 -2
  200. package/dist/__tests__/utils/isNullOrUndefined.test.d.ts.map +0 -1
  201. package/dist/__tests__/utils/isObject.test.d.ts +0 -2
  202. package/dist/__tests__/utils/isObject.test.d.ts.map +0 -1
  203. package/dist/__tests__/utils/isPrimitive.test.d.ts +0 -2
  204. package/dist/__tests__/utils/isPrimitive.test.d.ts.map +0 -1
  205. package/dist/__tests__/utils/isRadioInput.test.d.ts +0 -2
  206. package/dist/__tests__/utils/isRadioInput.test.d.ts.map +0 -1
  207. package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts +0 -2
  208. package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts.map +0 -1
  209. package/dist/__tests__/utils/isRegex.test.d.ts +0 -2
  210. package/dist/__tests__/utils/isRegex.test.d.ts.map +0 -1
  211. package/dist/__tests__/utils/isString.test.d.ts +0 -2
  212. package/dist/__tests__/utils/isString.test.d.ts.map +0 -1
  213. package/dist/__tests__/utils/isUndefined.test.d.ts +0 -2
  214. package/dist/__tests__/utils/isUndefined.test.d.ts.map +0 -1
  215. package/dist/__tests__/utils/live.test.d.ts +0 -2
  216. package/dist/__tests__/utils/live.test.d.ts.map +0 -1
  217. package/dist/__tests__/utils/move.test.d.ts +0 -2
  218. package/dist/__tests__/utils/move.test.d.ts.map +0 -1
  219. package/dist/__tests__/utils/noop.test.d.ts +0 -2
  220. package/dist/__tests__/utils/noop.test.d.ts.map +0 -1
  221. package/dist/__tests__/utils/objectHasFunction.test.d.ts +0 -2
  222. package/dist/__tests__/utils/objectHasFunction.test.d.ts.map +0 -1
  223. package/dist/__tests__/utils/prepend.test.d.ts +0 -2
  224. package/dist/__tests__/utils/prepend.test.d.ts.map +0 -1
  225. package/dist/__tests__/utils/remove.test.d.ts +0 -2
  226. package/dist/__tests__/utils/remove.test.d.ts.map +0 -1
  227. package/dist/__tests__/utils/set.test.d.ts +0 -2
  228. package/dist/__tests__/utils/set.test.d.ts.map +0 -1
  229. package/dist/__tests__/utils/stringToPath.test.d.ts +0 -2
  230. package/dist/__tests__/utils/stringToPath.test.d.ts.map +0 -1
  231. package/dist/__tests__/utils/swap.test.d.ts +0 -2
  232. package/dist/__tests__/utils/swap.test.d.ts.map +0 -1
  233. package/dist/__tests__/utils/unset.test.d.ts +0 -2
  234. package/dist/__tests__/utils/unset.test.d.ts.map +0 -1
  235. package/dist/__tests__/utils/update.test.d.ts +0 -2
  236. package/dist/__tests__/utils/update.test.d.ts.map +0 -1
  237. package/dist/__tests__/utils/validationModeChecker.test.d.ts +0 -2
  238. package/dist/__tests__/utils/validationModeChecker.test.d.ts.map +0 -1
  239. package/dist/__tests__/watch.server.test.d.ts +0 -2
  240. package/dist/__tests__/watch.server.test.d.ts.map +0 -1
  241. package/dist/__tests__/watch.test.d.ts +0 -2
  242. package/dist/__tests__/watch.test.d.ts.map +0 -1
@@ -64,7 +64,10 @@ var get = (object, path, defaultValue) => {
64
64
  if (!path || !isObject(object)) {
65
65
  return defaultValue;
66
66
  }
67
- const result = (isKey(path) ? [path] : stringToPath(path)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
67
+ const paths = isKey(path) ? [path] : stringToPath(path);
68
+ const result = paths.reduce((result, key) => {
69
+ return isNullOrUndefined(result) ? undefined : result[key];
70
+ }, object);
68
71
  return isUndefined(result) || result === object
69
72
  ? isUndefined(object[path])
70
73
  ? defaultValue
@@ -239,7 +242,10 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
239
242
 
240
243
  var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
241
244
 
242
- function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
245
+ function deepEqual(object1, object2, visited = new WeakSet()) {
246
+ if (object1 === object2) {
247
+ return true;
248
+ }
243
249
  if (isPrimitive(object1) || isPrimitive(object2)) {
244
250
  return Object.is(object1, object2);
245
251
  }
@@ -251,14 +257,14 @@ function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
251
257
  if (keys1.length !== keys2.length) {
252
258
  return false;
253
259
  }
254
- if (_internal_visited.has(object1) || _internal_visited.has(object2)) {
260
+ if (visited.has(object1) || visited.has(object2)) {
255
261
  return true;
256
262
  }
257
- _internal_visited.add(object1);
258
- _internal_visited.add(object2);
263
+ visited.add(object1);
264
+ visited.add(object2);
259
265
  for (const key of keys1) {
260
266
  const val1 = object1[key];
261
- if (!keys2.includes(key)) {
267
+ if (!(key in object2)) {
262
268
  return false;
263
269
  }
264
270
  if (key !== 'ref') {
@@ -266,7 +272,7 @@ function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
266
272
  if ((isDateObject(val1) && isDateObject(val2)) ||
267
273
  ((isObject(val1) || Array.isArray(val1)) &&
268
274
  (isObject(val2) || Array.isArray(val2)))
269
- ? !deepEqual(val1, val2, _internal_visited)
275
+ ? !deepEqual(val1, val2, visited)
270
276
  : !Object.is(val1, val2)) {
271
277
  return false;
272
278
  }
@@ -402,7 +408,6 @@ function useController(props) {
402
408
  exact,
403
409
  });
404
410
  const _props = React.useRef(props);
405
- const _previousNameRef = React.useRef(undefined);
406
411
  const _registerProps = React.useRef(control.register(name, {
407
412
  ...props.rules,
408
413
  value,
@@ -468,10 +473,6 @@ function useController(props) {
468
473
  }), [name, disabled, formState.disabled, onChange, onBlur, ref, value]);
469
474
  React.useEffect(() => {
470
475
  const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
471
- const previousName = _previousNameRef.current;
472
- if (previousName && previousName !== name && !isArrayField) {
473
- control.unregister(previousName);
474
- }
475
476
  control.register(name, {
476
477
  ..._props.current.rules,
477
478
  ...(isBoolean(_props.current.disabled)
@@ -493,7 +494,6 @@ function useController(props) {
493
494
  }
494
495
  }
495
496
  !isArrayField && control.register(name);
496
- _previousNameRef.current = name;
497
497
  return () => {
498
498
  (isArrayField
499
499
  ? _shouldUnregisterField && !control._state.action
@@ -706,7 +706,7 @@ function Form(props) {
706
706
  const methods = useFormContext();
707
707
  const [mounted, setMounted] = React.useState(false);
708
708
  const { control = methods.control, onSubmit, children, action, method = POST_REQUEST, headers, encType, onError, render, onSuccess, validateStatus, ...rest } = props;
709
- const submit = async (event) => {
709
+ const submit = React.useCallback(async (event) => {
710
710
  let hasError = false;
711
711
  let type = '';
712
712
  await control.handleSubmit(async (data) => {
@@ -716,7 +716,7 @@ function Form(props) {
716
716
  formDataJson = JSON.stringify(data);
717
717
  }
718
718
  catch (_a) { }
719
- const flattenFormValues = flatten(control._formValues);
719
+ const flattenFormValues = flatten(data);
720
720
  for (const key in flattenFormValues) {
721
721
  formData.append(key, flattenFormValues[key]);
722
722
  }
@@ -763,15 +763,25 @@ function Form(props) {
763
763
  }
764
764
  }
765
765
  })(event);
766
- if (hasError && props.control) {
767
- props.control._subjects.state.next({
766
+ if (hasError && control) {
767
+ control._subjects.state.next({
768
768
  isSubmitSuccessful: false,
769
769
  });
770
- props.control.setError('root.server', {
770
+ control.setError('root.server', {
771
771
  type,
772
772
  });
773
773
  }
774
- };
774
+ }, [
775
+ control,
776
+ onSubmit,
777
+ method,
778
+ action,
779
+ headers,
780
+ encType,
781
+ validateStatus,
782
+ onError,
783
+ onSuccess,
784
+ ]);
775
785
  React.useEffect(() => {
776
786
  setMounted(true);
777
787
  }, []);
@@ -867,7 +877,12 @@ function baseGet(object, updatePath) {
867
877
  const length = updatePath.slice(0, -1).length;
868
878
  let index = 0;
869
879
  while (index < length) {
870
- object = isUndefined(object) ? index++ : object[updatePath[index++]];
880
+ if (isNullOrUndefined(object)) {
881
+ object = undefined;
882
+ break;
883
+ }
884
+ object = object[updatePath[index]];
885
+ index++;
871
886
  }
872
887
  return object;
873
888
  }
@@ -880,6 +895,10 @@ function isEmptyArray(obj) {
880
895
  return true;
881
896
  }
882
897
  function unset(object, path) {
898
+ if (isString(path) && Object.prototype.hasOwnProperty.call(object, path)) {
899
+ delete object[path];
900
+ return object;
901
+ }
883
902
  const paths = Array.isArray(path)
884
903
  ? path
885
904
  : isKey(path)
@@ -1221,7 +1240,8 @@ var validateField = async (field, disabledFieldNames, formValues, validateAllFie
1221
1240
  isUndefined(inputValue)) ||
1222
1241
  (isHTMLElement(ref) && ref.value === '') ||
1223
1242
  inputValue === '' ||
1224
- (Array.isArray(inputValue) && !inputValue.length);
1243
+ (Array.isArray(inputValue) && !inputValue.length) ||
1244
+ (valueAsNumber && typeof inputValue === 'number' && isNaN(inputValue));
1225
1245
  const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);
1226
1246
  const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {
1227
1247
  const message = exceedMax ? maxLengthMessage : minLengthMessage;
@@ -1821,7 +1841,7 @@ function createFormControl(props = {}) {
1821
1841
  updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);
1822
1842
  options.shouldValidate && trigger(name);
1823
1843
  };
1824
- const setValues = (name, value, options) => {
1844
+ const setFieldValues = (name, value, options) => {
1825
1845
  for (const fieldKey in value) {
1826
1846
  if (!value.hasOwnProperty(fieldKey)) {
1827
1847
  return;
@@ -1833,7 +1853,7 @@ function createFormControl(props = {}) {
1833
1853
  isObject(fieldValue) ||
1834
1854
  (field && !field._f)) &&
1835
1855
  !isDateObject(fieldValue)
1836
- ? setValues(fieldName, fieldValue, options)
1856
+ ? setFieldValues(fieldName, fieldValue, options)
1837
1857
  : setFieldValue(fieldName, fieldValue, options);
1838
1858
  }
1839
1859
  };
@@ -1841,17 +1861,15 @@ function createFormControl(props = {}) {
1841
1861
  const field = get(_fields, name);
1842
1862
  const isFieldArray = _names.array.has(name);
1843
1863
  const cloneValue = cloneObject(value);
1864
+ const previousValue = get(_formValues, name);
1865
+ const isValueUnchanged = deepEqual(previousValue, cloneValue);
1844
1866
  set(_formValues, name, cloneValue);
1845
1867
  if (isFieldArray) {
1846
1868
  _subjects.array.next({
1847
1869
  name,
1848
1870
  values: cloneObject(_formValues),
1849
1871
  });
1850
- if ((_proxyFormState.isDirty ||
1851
- _proxyFormState.dirtyFields ||
1852
- _proxySubscribeFormState.isDirty ||
1853
- _proxySubscribeFormState.dirtyFields) &&
1854
- options.shouldDirty) {
1872
+ if (options.shouldDirty) {
1855
1873
  _updateDirtyFields(name);
1856
1874
  _subjects.state.next({
1857
1875
  name,
@@ -1861,22 +1879,41 @@ function createFormControl(props = {}) {
1861
1879
  }
1862
1880
  }
1863
1881
  else {
1864
- field && !field._f && !isNullOrUndefined(cloneValue)
1865
- ? setValues(name, cloneValue, options)
1866
- : setFieldValue(name, cloneValue, options);
1882
+ const isEmpty = (Array.isArray(cloneValue) && !cloneValue.length) ||
1883
+ isEmptyObject(cloneValue);
1884
+ if (!field || field._f || isNullOrUndefined(cloneValue) || isEmpty) {
1885
+ setFieldValue(name, cloneValue, options);
1886
+ }
1887
+ else {
1888
+ setFieldValues(name, cloneValue, options);
1889
+ }
1867
1890
  }
1868
- if (isWatched(name, _names)) {
1869
- _subjects.state.next({
1870
- ..._formState,
1871
- name,
1872
- values: cloneObject(_formValues),
1873
- });
1891
+ if (!isValueUnchanged) {
1892
+ if (isWatched(name, _names)) {
1893
+ _subjects.state.next({
1894
+ ..._formState,
1895
+ name,
1896
+ values: cloneObject(_formValues),
1897
+ });
1898
+ }
1899
+ else {
1900
+ _subjects.state.next({
1901
+ name: _state.mount ? name : undefined,
1902
+ values: cloneObject(_formValues),
1903
+ });
1904
+ }
1874
1905
  }
1875
- else {
1876
- _subjects.state.next({
1877
- name: _state.mount ? name : undefined,
1878
- values: cloneObject(_formValues),
1879
- });
1906
+ };
1907
+ const setValues = (formValues) => {
1908
+ const updatedFormValues = isFunction(formValues)
1909
+ ? formValues(_formValues)
1910
+ : formValues;
1911
+ if (!deepEqual(_formValues, updatedFormValues)) {
1912
+ _formValues = {
1913
+ ..._formValues,
1914
+ ...updatedFormValues,
1915
+ };
1916
+ _subjects.state.next({ ..._formState, values: _formValues });
1880
1917
  }
1881
1918
  };
1882
1919
  const onChange = async (event) => {
@@ -2095,15 +2132,16 @@ function createFormControl(props = {}) {
2095
2132
  const watch = (name, defaultValue) => isFunction(name)
2096
2133
  ? _subjects.state.subscribe({
2097
2134
  next: (payload) => 'values' in payload &&
2098
- name(_getWatch(undefined, defaultValue), payload),
2135
+ name(payload.values || _getWatch(undefined, defaultValue), payload),
2099
2136
  })
2100
2137
  : _getWatch(name, defaultValue, true);
2101
2138
  const _subscribe = (props) => _subjects.state.subscribe({
2102
2139
  next: (formState) => {
2103
2140
  if (shouldSubscribeByName(props.name, formState.name, props.exact) &&
2104
2141
  shouldRenderFormState(formState, props.formState || _proxyFormState, _setFormState, props.reRenderRoot)) {
2142
+ const snapshot = { ..._formValues };
2105
2143
  props.callback({
2106
- values: { ..._formValues },
2144
+ values: snapshot,
2107
2145
  ..._formState,
2108
2146
  ...formState,
2109
2147
  defaultValues: _defaultValues,
@@ -2165,7 +2203,7 @@ function createFormControl(props = {}) {
2165
2203
  const register = (name, options = {}) => {
2166
2204
  let field = get(_fields, name);
2167
2205
  const disabledIsDefined = isBoolean(options.disabled) || isBoolean(_options.disabled);
2168
- const shouldRevalidateRemount = !_names.registerName.has(name) && field && !field._f.mount;
2206
+ const shouldRevalidateRemount = !_names.registerName.has(name) && field && field._f && !field._f.mount;
2169
2207
  set(_fields, name, {
2170
2208
  ...(field || {}),
2171
2209
  _f: {
@@ -2575,6 +2613,7 @@ function createFormControl(props = {}) {
2575
2613
  handleSubmit,
2576
2614
  watch,
2577
2615
  setValue,
2616
+ setValues,
2578
2617
  getValues,
2579
2618
  reset,
2580
2619
  resetField,
@@ -2812,10 +2851,11 @@ function useFieldArray(props) {
2812
2851
  control._subjects.state.next({
2813
2852
  ...control._formState,
2814
2853
  });
2854
+ const validationModes = getValidationModes(control._options.mode);
2815
2855
  if (_actioned.current &&
2816
- (!getValidationModes(control._options.mode).isOnSubmit ||
2817
- control._formState.isSubmitted) &&
2818
- !getValidationModes(control._options.reValidateMode).isOnSubmit) {
2856
+ (!validationModes.isOnSubmit || control._formState.isSubmitted) &&
2857
+ !getValidationModes(control._options.reValidateMode).isOnSubmit &&
2858
+ !validationModes.isOnBlur) {
2819
2859
  if (control._options.resolver) {
2820
2860
  control._runSchema([name]).then((result) => {
2821
2861
  control._updateIsValidating([name]);