react-hook-form 7.53.0 → 7.53.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 (104) hide show
  1. package/README.md +3 -0
  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 +75 -41
  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/react-server.esm.mjs.map +1 -1
  11. package/dist/types/fields.d.ts +3 -1
  12. package/dist/types/fields.d.ts.map +1 -1
  13. package/dist/types/form.d.ts +1 -1
  14. package/dist/types/form.d.ts.map +1 -1
  15. package/dist/utils/flatten.d.ts +3 -0
  16. package/dist/utils/flatten.d.ts.map +1 -0
  17. package/dist/utils/get.d.ts +1 -1
  18. package/dist/utils/get.d.ts.map +1 -1
  19. package/dist/utils/set.d.ts +2 -2
  20. package/dist/utils/set.d.ts.map +1 -1
  21. package/package.json +24 -24
  22. package/dist/__tests__/controller.server.test.d.ts +0 -2
  23. package/dist/__tests__/controller.server.test.d.ts.map +0 -1
  24. package/dist/__tests__/controller.test.d.ts +0 -2
  25. package/dist/__tests__/controller.test.d.ts.map +0 -1
  26. package/dist/__tests__/form.test.d.ts +0 -2
  27. package/dist/__tests__/form.test.d.ts.map +0 -1
  28. package/dist/__tests__/logic/validateField.test.d.ts +0 -2
  29. package/dist/__tests__/logic/validateField.test.d.ts.map +0 -1
  30. package/dist/__tests__/type.test.d.ts +0 -2
  31. package/dist/__tests__/type.test.d.ts.map +0 -1
  32. package/dist/__tests__/useController.test.d.ts +0 -2
  33. package/dist/__tests__/useController.test.d.ts.map +0 -1
  34. package/dist/__tests__/useFieldArray/append.test.d.ts +0 -2
  35. package/dist/__tests__/useFieldArray/append.test.d.ts.map +0 -1
  36. package/dist/__tests__/useFieldArray/focus.test.d.ts +0 -2
  37. package/dist/__tests__/useFieldArray/focus.test.d.ts.map +0 -1
  38. package/dist/__tests__/useFieldArray/insert.test.d.ts +0 -2
  39. package/dist/__tests__/useFieldArray/insert.test.d.ts.map +0 -1
  40. package/dist/__tests__/useFieldArray/move.test.d.ts +0 -2
  41. package/dist/__tests__/useFieldArray/move.test.d.ts.map +0 -1
  42. package/dist/__tests__/useFieldArray/prepend.test.d.ts +0 -2
  43. package/dist/__tests__/useFieldArray/prepend.test.d.ts.map +0 -1
  44. package/dist/__tests__/useFieldArray/remove.test.d.ts +0 -2
  45. package/dist/__tests__/useFieldArray/remove.test.d.ts.map +0 -1
  46. package/dist/__tests__/useFieldArray/replace.test.d.ts +0 -2
  47. package/dist/__tests__/useFieldArray/replace.test.d.ts.map +0 -1
  48. package/dist/__tests__/useFieldArray/swap.test.d.ts +0 -2
  49. package/dist/__tests__/useFieldArray/swap.test.d.ts.map +0 -1
  50. package/dist/__tests__/useFieldArray/update.test.d.ts +0 -2
  51. package/dist/__tests__/useFieldArray/update.test.d.ts.map +0 -1
  52. package/dist/__tests__/useFieldArray.test.d.ts +0 -2
  53. package/dist/__tests__/useFieldArray.test.d.ts.map +0 -1
  54. package/dist/__tests__/useForm/clearErrors.test.d.ts +0 -2
  55. package/dist/__tests__/useForm/clearErrors.test.d.ts.map +0 -1
  56. package/dist/__tests__/useForm/formState.test.d.ts +0 -2
  57. package/dist/__tests__/useForm/formState.test.d.ts.map +0 -1
  58. package/dist/__tests__/useForm/getFieldState.test.d.ts +0 -2
  59. package/dist/__tests__/useForm/getFieldState.test.d.ts.map +0 -1
  60. package/dist/__tests__/useForm/getValues.test.d.ts +0 -2
  61. package/dist/__tests__/useForm/getValues.test.d.ts.map +0 -1
  62. package/dist/__tests__/useForm/handleSubmit.test.d.ts +0 -2
  63. package/dist/__tests__/useForm/handleSubmit.test.d.ts.map +0 -1
  64. package/dist/__tests__/useForm/register.test.d.ts +0 -2
  65. package/dist/__tests__/useForm/register.test.d.ts.map +0 -1
  66. package/dist/__tests__/useForm/reset.test.d.ts +0 -2
  67. package/dist/__tests__/useForm/reset.test.d.ts.map +0 -1
  68. package/dist/__tests__/useForm/resetField.test.d.ts +0 -2
  69. package/dist/__tests__/useForm/resetField.test.d.ts.map +0 -1
  70. package/dist/__tests__/useForm/resolver.test.d.ts +0 -2
  71. package/dist/__tests__/useForm/resolver.test.d.ts.map +0 -1
  72. package/dist/__tests__/useForm/setError.test.d.ts +0 -2
  73. package/dist/__tests__/useForm/setError.test.d.ts.map +0 -1
  74. package/dist/__tests__/useForm/setValue.test.d.ts +0 -2
  75. package/dist/__tests__/useForm/setValue.test.d.ts.map +0 -1
  76. package/dist/__tests__/useForm/trigger.test.d.ts +0 -2
  77. package/dist/__tests__/useForm/trigger.test.d.ts.map +0 -1
  78. package/dist/__tests__/useForm/unregister.test.d.ts +0 -2
  79. package/dist/__tests__/useForm/unregister.test.d.ts.map +0 -1
  80. package/dist/__tests__/useForm/watch.test.d.ts +0 -2
  81. package/dist/__tests__/useForm/watch.test.d.ts.map +0 -1
  82. package/dist/__tests__/useForm.server.test.d.ts +0 -2
  83. package/dist/__tests__/useForm.server.test.d.ts.map +0 -1
  84. package/dist/__tests__/useForm.test.d.ts +0 -2
  85. package/dist/__tests__/useForm.test.d.ts.map +0 -1
  86. package/dist/__tests__/useFormContext.server.test.d.ts +0 -2
  87. package/dist/__tests__/useFormContext.server.test.d.ts.map +0 -1
  88. package/dist/__tests__/useFormContext.test.d.ts +0 -2
  89. package/dist/__tests__/useFormContext.test.d.ts.map +0 -1
  90. package/dist/__tests__/useFormState.test.d.ts +0 -2
  91. package/dist/__tests__/useFormState.test.d.ts.map +0 -1
  92. package/dist/__tests__/useWatch.test.d.ts +0 -2
  93. package/dist/__tests__/useWatch.test.d.ts.map +0 -1
  94. package/dist/logic/focusFieldBy.d.ts +0 -8
  95. package/dist/logic/focusFieldBy.d.ts.map +0 -1
  96. package/dist/tsdoc-metadata.json +0 -11
  97. package/dist/utils/fillBooleanArray.d.ts +0 -3
  98. package/dist/utils/fillBooleanArray.d.ts.map +0 -1
  99. package/dist/utils/isSelectInput.d.ts +0 -4
  100. package/dist/utils/isSelectInput.d.ts.map +0 -1
  101. package/dist/utils/objectHasTruthyValue.d.ts +0 -3
  102. package/dist/utils/objectHasTruthyValue.d.ts.map +0 -1
  103. package/dist/utils/omit.d.ts +0 -6
  104. package/dist/utils/omit.d.ts.map +0 -1
@@ -551,6 +551,22 @@ function useController(props) {
551
551
  */
552
552
  const Controller = (props) => props.render(useController(props));
553
553
 
554
+ const flatten = (obj) => {
555
+ const output = {};
556
+ for (const key of Object.keys(obj)) {
557
+ if (isObjectType(obj[key])) {
558
+ const nested = flatten(obj[key]);
559
+ for (const nestedKey of Object.keys(nested)) {
560
+ output[`${key}.${nestedKey}`] = nested[nestedKey];
561
+ }
562
+ }
563
+ else {
564
+ output[key] = obj[key];
565
+ }
566
+ }
567
+ return output;
568
+ };
569
+
554
570
  const POST_REQUEST = 'post';
555
571
  /**
556
572
  * Form component to manage submission.
@@ -588,8 +604,9 @@ function Form(props) {
588
604
  formDataJson = JSON.stringify(data);
589
605
  }
590
606
  catch (_a) { }
591
- for (const name of control._names.mount) {
592
- formData.append(name, get(data, name));
607
+ const flattenFormValues = flatten(control._formValues);
608
+ for (const key in flattenFormValues) {
609
+ formData.append(key, flattenFormValues[key]);
593
610
  }
594
611
  if (onSubmit) {
595
612
  await onSubmit({
@@ -1601,7 +1618,7 @@ function createFormControl(props = {}) {
1601
1618
  timer = setTimeout(callback, wait);
1602
1619
  };
1603
1620
  const _updateValid = async (shouldUpdateValid) => {
1604
- if (_proxyFormState.isValid || shouldUpdateValid) {
1621
+ if (!_options.disabled && (_proxyFormState.isValid || shouldUpdateValid)) {
1605
1622
  const isValid = _options.resolver
1606
1623
  ? isEmptyObject((await _executeSchema()).errors)
1607
1624
  : await executeBuiltInValidation(_fields, true);
@@ -1613,7 +1630,8 @@ function createFormControl(props = {}) {
1613
1630
  }
1614
1631
  };
1615
1632
  const _updateIsValidating = (names, isValidating) => {
1616
- if (_proxyFormState.isValidating || _proxyFormState.validatingFields) {
1633
+ if (!_options.disabled &&
1634
+ (_proxyFormState.isValidating || _proxyFormState.validatingFields)) {
1617
1635
  (names || Array.from(_names.mount)).forEach((name) => {
1618
1636
  if (name) {
1619
1637
  isValidating
@@ -1628,7 +1646,7 @@ function createFormControl(props = {}) {
1628
1646
  }
1629
1647
  };
1630
1648
  const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
1631
- if (args && method) {
1649
+ if (args && method && !_options.disabled) {
1632
1650
  _state.action = true;
1633
1651
  if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {
1634
1652
  const fieldValues = method(get(_fields, name), args.argA, args.argB);
@@ -1692,38 +1710,40 @@ function createFormControl(props = {}) {
1692
1710
  const output = {
1693
1711
  name,
1694
1712
  };
1695
- const disabledField = !!(get(_fields, name) &&
1696
- get(_fields, name)._f &&
1697
- get(_fields, name)._f.disabled);
1698
- if (!isBlurEvent || shouldDirty) {
1699
- if (_proxyFormState.isDirty) {
1700
- isPreviousDirty = _formState.isDirty;
1701
- _formState.isDirty = output.isDirty = _getDirty();
1702
- shouldUpdateField = isPreviousDirty !== output.isDirty;
1703
- }
1704
- const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);
1705
- isPreviousDirty = !!(!disabledField && get(_formState.dirtyFields, name));
1706
- isCurrentFieldPristine || disabledField
1707
- ? unset(_formState.dirtyFields, name)
1708
- : set(_formState.dirtyFields, name, true);
1709
- output.dirtyFields = _formState.dirtyFields;
1710
- shouldUpdateField =
1711
- shouldUpdateField ||
1712
- (_proxyFormState.dirtyFields &&
1713
- isPreviousDirty !== !isCurrentFieldPristine);
1714
- }
1715
- if (isBlurEvent) {
1716
- const isPreviousFieldTouched = get(_formState.touchedFields, name);
1717
- if (!isPreviousFieldTouched) {
1718
- set(_formState.touchedFields, name, isBlurEvent);
1719
- output.touchedFields = _formState.touchedFields;
1713
+ if (!_options.disabled) {
1714
+ const disabledField = !!(get(_fields, name) &&
1715
+ get(_fields, name)._f &&
1716
+ get(_fields, name)._f.disabled);
1717
+ if (!isBlurEvent || shouldDirty) {
1718
+ if (_proxyFormState.isDirty) {
1719
+ isPreviousDirty = _formState.isDirty;
1720
+ _formState.isDirty = output.isDirty = _getDirty();
1721
+ shouldUpdateField = isPreviousDirty !== output.isDirty;
1722
+ }
1723
+ const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);
1724
+ isPreviousDirty = !!(!disabledField && get(_formState.dirtyFields, name));
1725
+ isCurrentFieldPristine || disabledField
1726
+ ? unset(_formState.dirtyFields, name)
1727
+ : set(_formState.dirtyFields, name, true);
1728
+ output.dirtyFields = _formState.dirtyFields;
1720
1729
  shouldUpdateField =
1721
1730
  shouldUpdateField ||
1722
- (_proxyFormState.touchedFields &&
1723
- isPreviousFieldTouched !== isBlurEvent);
1731
+ (_proxyFormState.dirtyFields &&
1732
+ isPreviousDirty !== !isCurrentFieldPristine);
1724
1733
  }
1734
+ if (isBlurEvent) {
1735
+ const isPreviousFieldTouched = get(_formState.touchedFields, name);
1736
+ if (!isPreviousFieldTouched) {
1737
+ set(_formState.touchedFields, name, isBlurEvent);
1738
+ output.touchedFields = _formState.touchedFields;
1739
+ shouldUpdateField =
1740
+ shouldUpdateField ||
1741
+ (_proxyFormState.touchedFields &&
1742
+ isPreviousFieldTouched !== isBlurEvent);
1743
+ }
1744
+ }
1745
+ shouldUpdateField && shouldRender && _subjects.state.next(output);
1725
1746
  }
1726
- shouldUpdateField && shouldRender && _subjects.state.next(output);
1727
1747
  return shouldUpdateField ? output : {};
1728
1748
  };
1729
1749
  const shouldRenderByError = (name, isValid, error, fieldState) => {
@@ -1826,8 +1846,9 @@ function createFormControl(props = {}) {
1826
1846
  }
1827
1847
  _names.unMount = new Set();
1828
1848
  };
1829
- const _getDirty = (name, data) => (name && data && set(_formValues, name, data),
1830
- !deepEqual(getValues(), _defaultValues));
1849
+ const _getDirty = (name, data) => !_options.disabled &&
1850
+ (name && data && set(_formValues, name, data),
1851
+ !deepEqual(getValues(), _defaultValues));
1831
1852
  const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {
1832
1853
  ...(_state.mount
1833
1854
  ? _formValues
@@ -1891,7 +1912,7 @@ function createFormControl(props = {}) {
1891
1912
  const fieldName = `${name}.${fieldKey}`;
1892
1913
  const field = get(_fields, fieldName);
1893
1914
  (_names.array.has(name) ||
1894
- !isPrimitive(fieldValue) ||
1915
+ isObject(fieldValue) ||
1895
1916
  (field && !field._f)) &&
1896
1917
  !isDateObject(fieldValue)
1897
1918
  ? setValues(fieldName, fieldValue, options)
@@ -1938,6 +1959,7 @@ function createFormControl(props = {}) {
1938
1959
  const _updateIsFieldValueUpdated = (fieldValue) => {
1939
1960
  isFieldValueUpdated =
1940
1961
  Number.isNaN(fieldValue) ||
1962
+ (isDateObject(fieldValue) && isNaN(fieldValue.getTime())) ||
1941
1963
  deepEqual(fieldValue, get(_formValues, name, fieldValue));
1942
1964
  };
1943
1965
  if (field) {
@@ -2140,7 +2162,7 @@ function createFormControl(props = {}) {
2140
2162
  };
2141
2163
  const register = (name, options = {}) => {
2142
2164
  let field = get(_fields, name);
2143
- const disabledIsDefined = isBoolean(options.disabled) || isBoolean(props.disabled);
2165
+ const disabledIsDefined = isBoolean(options.disabled) || isBoolean(_options.disabled);
2144
2166
  set(_fields, name, {
2145
2167
  ...(field || {}),
2146
2168
  _f: {
@@ -2156,7 +2178,7 @@ function createFormControl(props = {}) {
2156
2178
  field,
2157
2179
  disabled: isBoolean(options.disabled)
2158
2180
  ? options.disabled
2159
- : props.disabled,
2181
+ : _options.disabled,
2160
2182
  name,
2161
2183
  value: options.value,
2162
2184
  });
@@ -2166,7 +2188,7 @@ function createFormControl(props = {}) {
2166
2188
  }
2167
2189
  return {
2168
2190
  ...(disabledIsDefined
2169
- ? { disabled: options.disabled || props.disabled }
2191
+ ? { disabled: options.disabled || _options.disabled }
2170
2192
  : {}),
2171
2193
  ...(_options.progressive
2172
2194
  ? {
@@ -2250,6 +2272,12 @@ function createFormControl(props = {}) {
2250
2272
  e.preventDefault && e.preventDefault();
2251
2273
  e.persist && e.persist();
2252
2274
  }
2275
+ if (_options.disabled) {
2276
+ if (onInvalid) {
2277
+ await onInvalid({ ..._formState.errors }, e);
2278
+ }
2279
+ return;
2280
+ }
2253
2281
  let fieldValues = cloneObject(_formValues);
2254
2282
  _subjects.state.next({
2255
2283
  isSubmitting: true,
@@ -2327,7 +2355,11 @@ function createFormControl(props = {}) {
2327
2355
  }
2328
2356
  if (!keepStateOptions.keepValues) {
2329
2357
  if (keepStateOptions.keepDirtyValues) {
2330
- for (const fieldName of _names.mount) {
2358
+ const fieldsToCheck = new Set([
2359
+ ..._names.mount,
2360
+ ...Object.keys(getDirtyFields(_defaultValues, _formValues)),
2361
+ ]);
2362
+ for (const fieldName of Array.from(fieldsToCheck)) {
2331
2363
  get(_formState.dirtyFields, fieldName)
2332
2364
  ? set(values, fieldName, get(_formValues, fieldName))
2333
2365
  : setValue(fieldName, get(values, fieldName));
@@ -2424,7 +2456,9 @@ function createFormControl(props = {}) {
2424
2456
  : fieldReference.ref;
2425
2457
  if (fieldRef.focus) {
2426
2458
  fieldRef.focus();
2427
- options.shouldSelect && fieldRef.select();
2459
+ options.shouldSelect &&
2460
+ isFunction(fieldRef.select) &&
2461
+ fieldRef.select();
2428
2462
  }
2429
2463
  }
2430
2464
  };