react-hook-form 7.82.0 → 7.84.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 (47) hide show
  1. package/README.md +2 -2
  2. package/dist/fieldArray.d.ts +2 -1
  3. package/dist/fieldArray.d.ts.map +1 -1
  4. package/dist/form.d.ts +1 -1
  5. package/dist/form.d.ts.map +1 -1
  6. package/dist/formStateSubscribe.d.ts +8 -3
  7. package/dist/formStateSubscribe.d.ts.map +1 -1
  8. package/dist/index.cjs.js +1 -1
  9. package/dist/index.cjs.js.map +1 -1
  10. package/dist/index.d.ts +2 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.esm.mjs +150 -82
  13. package/dist/index.esm.mjs.map +1 -1
  14. package/dist/index.umd.js +1 -1
  15. package/dist/index.umd.js.map +1 -1
  16. package/dist/logic/collectDirtyFieldNames.d.ts +3 -0
  17. package/dist/logic/collectDirtyFieldNames.d.ts.map +1 -0
  18. package/dist/logic/createFormControl.d.ts.map +1 -1
  19. package/dist/logic/getEventValue.d.ts.map +1 -1
  20. package/dist/logic/getFieldValue.d.ts.map +1 -1
  21. package/dist/logic/getValueAndMessage.d.ts +1 -4
  22. package/dist/logic/getValueAndMessage.d.ts.map +1 -1
  23. package/dist/logic/iterateFieldsByAction.d.ts.map +1 -1
  24. package/dist/logic/shouldRenderFormState.d.ts.map +1 -1
  25. package/dist/react-server.esm.mjs +69 -27
  26. package/dist/react-server.esm.mjs.map +1 -1
  27. package/dist/types/errors.d.ts +2 -2
  28. package/dist/types/errors.d.ts.map +1 -1
  29. package/dist/types/form.d.ts +62 -61
  30. package/dist/types/form.d.ts.map +1 -1
  31. package/dist/types/path/common.d.ts +6 -0
  32. package/dist/types/path/common.d.ts.map +1 -1
  33. package/dist/types/path/eager.d.ts +15 -11
  34. package/dist/types/path/eager.d.ts.map +1 -1
  35. package/dist/types/utils.d.ts +1 -1
  36. package/dist/types/utils.d.ts.map +1 -1
  37. package/dist/types/validator.d.ts +1 -1
  38. package/dist/types/validator.d.ts.map +1 -1
  39. package/dist/types/watch.d.ts +1 -1
  40. package/dist/types/watch.d.ts.map +1 -1
  41. package/dist/useFormState.d.ts +2 -2
  42. package/dist/useWatch.d.ts +14 -14
  43. package/dist/utils/formData.d.ts +3 -0
  44. package/dist/utils/formData.d.ts.map +1 -0
  45. package/dist/utils/json.d.ts +9 -0
  46. package/dist/utils/json.d.ts.map +1 -0
  47. package/package.json +1 -3
@@ -0,0 +1,3 @@
1
+ import type { FieldValues } from '../types';
2
+ export default function collectDirtyFieldNames(dirtyTree: FieldValues, cachedDirtyFields: FieldValues, prefix?: string, names?: string[]): string[];
3
+ //# sourceMappingURL=collectDirtyFieldNames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectDirtyFieldNames.d.ts","sourceRoot":"","sources":["../../src/logic/collectDirtyFieldNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAQ5C,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,SAAS,EAAE,WAAW,EACtB,iBAAiB,EAAE,WAAW,EAC9B,MAAM,SAAK,EACX,KAAK,GAAE,MAAM,EAAO,YAiBrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,EAkBX,YAAY,EAKZ,aAAa,EAYd,MAAM,UAAU,CAAC;AA0DlB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;CAY9B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,KAAK,GAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAM,GACnE,IAAI,CACL,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,GAAG;IACF,WAAW,EAAE,IAAI,CACf,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,CAAC;CACH,CA62DA"}
1
+ {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,EAkBX,YAAY,EAKZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAwElB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;CAY9B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,KAAK,GAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAM,GACnE,IAAI,CACL,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,GAAG;IACF,WAAW,EAAE,IAAI,CACf,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,CAAC;CACH,CA83DA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"yBAKgB,OAAO,OAAO;AAA9B,wBAKY"}
1
+ {"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"yBAMgB,OAAO,OAAO;AAA9B,wBAOY"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFieldValue.d.ts","sourceRoot":"","sources":["../../src/logic/getFieldValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAWtC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAoBpD"}
1
+ {"version":3,"file":"getFieldValue.d.ts","sourceRoot":"","sources":["../../src/logic/getFieldValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAUtC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAoBpD"}
@@ -1,7 +1,4 @@
1
1
  import type { ValidationRule } from '../types';
2
- declare const _default: (validationData?: ValidationRule) => {
3
- value: string | number | boolean | RegExp | undefined;
4
- message: string;
5
- };
2
+ declare const _default: (validationData?: ValidationRule) => import("..").ValidationValueMessage<import("..").ValidationValue>;
6
3
  export default _default;
7
4
  //# sourceMappingURL=getValueAndMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc;;;;AAA/C,wBAMQ"}
1
+ {"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc;AAA/C,wBAMQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"iterateFieldsByAction.d.ts","sourceRoot":"","sources":["../../src/logic/iterateFieldsByAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIlE,QAAA,MAAM,qBAAqB,GACzB,QAAQ,SAAS,EACjB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,EACxD,cAAc,GAAG,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,EAAE,GAAG,CAAC,EAC9D,aAAa,OAAO,qBA0BrB,CAAC;AACF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"iterateFieldsByAction.d.ts","sourceRoot":"","sources":["../../src/logic/iterateFieldsByAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAIlE,QAAA,MAAM,qBAAqB,GACzB,QAAQ,SAAS,EACjB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,EACxD,cAAc,GAAG,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,EAAE,GAAG,CAAC,EAC9D,aAAa,OAAO,qBA8BrB,CAAC;AACF,eAAe,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAEF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,wBAsBE"}
1
+ {"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAEF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,wBAqBE"}
@@ -281,7 +281,7 @@ var set = (object, path, value) => {
281
281
  };
282
282
 
283
283
  function baseGet(object, updatePath) {
284
- const length = updatePath.slice(0, -1).length;
284
+ const length = updatePath.length - 1;
285
285
  let index = 0;
286
286
  while (index < length) {
287
287
  if (isNullOrUndefined(object)) {
@@ -328,6 +328,24 @@ function unset(object, path) {
328
328
  return object;
329
329
  }
330
330
 
331
+ function isDirtyContainer(value) {
332
+ return Array.isArray(value) || isObject(value);
333
+ }
334
+ function collectDirtyFieldNames(dirtyTree, cachedDirtyFields, prefix = '', names = []) {
335
+ for (const key in dirtyTree) {
336
+ const path = prefix ? `${prefix}.${key}` : key;
337
+ const value = dirtyTree[key];
338
+ if (isDirtyContainer(value) &&
339
+ isDirtyContainer(get(cachedDirtyFields, path))) {
340
+ collectDirtyFieldNames(value, cachedDirtyFields, path, names);
341
+ }
342
+ else {
343
+ names.push(path);
344
+ }
345
+ }
346
+ return names;
347
+ }
348
+
331
349
  var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {
332
350
  if (isString(names)) {
333
351
  isGlobal && _names.watch.add(names);
@@ -419,7 +437,9 @@ function getDirtyFields(data, formValues, dirtyFieldsFromValues, fieldRefs) {
419
437
  var getEventValue = (event) => isObject(event) && event.target
420
438
  ? isCheckBoxInput(event.target)
421
439
  ? event.target.checked
422
- : event.target.value
440
+ : isFileInput(event.target)
441
+ ? event.target.files
442
+ : event.target.value
423
443
  : event;
424
444
 
425
445
  const defaultResult = {
@@ -488,7 +508,7 @@ function getFieldValue(_f) {
488
508
  if (isCheckBoxInput(ref)) {
489
509
  return getCheckboxValue(_f.refs).value;
490
510
  }
491
- return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);
511
+ return getFieldValueAs(ref.value, _f);
492
512
  }
493
513
 
494
514
  var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {
@@ -570,9 +590,12 @@ var isWatched = (name, _names, isBlurEvent) => {
570
590
 
571
591
  const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
572
592
  for (const key of fieldsNames || Object.keys(fields)) {
573
- const field = get(fields, key);
593
+ if (key === '_f') {
594
+ continue;
595
+ }
596
+ const field = fieldsNames ? get(fields, key) : fields[key];
574
597
  if (field) {
575
- const { _f, ...currentField } = field;
598
+ const { _f } = field;
576
599
  if (_f) {
577
600
  if (_f.refs && _f.refs[0] && action(_f.refs[0], key) && !abortEarly) {
578
601
  return true;
@@ -581,13 +604,13 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
581
604
  return true;
582
605
  }
583
606
  else {
584
- if (iterateFieldsByAction(currentField, action)) {
607
+ if (iterateFieldsByAction(field, action)) {
585
608
  break;
586
609
  }
587
610
  }
588
611
  }
589
- else if (isObject(currentField)) {
590
- if (iterateFieldsByAction(currentField, action)) {
612
+ else if (isObject(field) || Array.isArray(field)) {
613
+ if (iterateFieldsByAction(field, action)) {
591
614
  break;
592
615
  }
593
616
  }
@@ -633,8 +656,7 @@ function schemaErrorLookup(errors, _fields, name) {
633
656
 
634
657
  var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {
635
658
  updateFormState(formStateData);
636
- const { name, ...formState } = formStateData;
637
- const keys = Object.keys(formState);
659
+ const keys = Object.keys(formStateData).filter((key) => key !== 'name');
638
660
  return (!keys.length ||
639
661
  (isRoot && keys.length >= Object.keys(_proxyFormState).length) ||
640
662
  keys.find((key) => _proxyFormState[key] ===
@@ -886,6 +908,14 @@ const defaultOptions = {
886
908
  shouldFocusError: true,
887
909
  };
888
910
  const FORM_ERROR_TYPE = 'form';
911
+ const updateDirtyFields = (dirtyFields, nextDirtyFields) => {
912
+ for (const key in dirtyFields) {
913
+ if (!(key in nextDirtyFields)) {
914
+ delete dirtyFields[key];
915
+ }
916
+ }
917
+ Object.assign(dirtyFields, nextDirtyFields);
918
+ };
889
919
  const DEFAULT_FORM_STATE = {
890
920
  submitCount: 0,
891
921
  isDirty: false,
@@ -1128,7 +1158,7 @@ function createFormControl(props = {}) {
1128
1158
  }
1129
1159
  isPreviousDirty = !!get(_formState.dirtyFields, name);
1130
1160
  if (isCurrentFieldPristine !== _formState.isDirty) {
1131
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues, undefined, _fields);
1161
+ updateDirtyFields(_formState.dirtyFields, getDirtyFields(_defaultValues, _formValues, undefined, _fields));
1132
1162
  }
1133
1163
  else {
1134
1164
  isCurrentFieldPristine
@@ -1389,6 +1419,12 @@ function createFormControl(props = {}) {
1389
1419
  });
1390
1420
  };
1391
1421
  const setFieldValues = (name, value, options, skipClone = false, skipRender = false) => {
1422
+ if (_names.array.has(name)) {
1423
+ _subjects.array.next({
1424
+ name,
1425
+ values: skipClone ? _formValues : cloneObject(_formValues),
1426
+ });
1427
+ }
1392
1428
  for (const fieldKey in value) {
1393
1429
  if (!value.hasOwnProperty(fieldKey)) {
1394
1430
  return;
@@ -1685,8 +1721,9 @@ function createFormControl(props = {}) {
1685
1721
  });
1686
1722
  }
1687
1723
  else {
1724
+ _formState.errors = {};
1688
1725
  _subjects.state.next({
1689
- errors: {},
1726
+ errors: _formState.errors,
1690
1727
  });
1691
1728
  }
1692
1729
  };
@@ -1871,20 +1908,23 @@ function createFormControl(props = {}) {
1871
1908
  : fieldRef === field._f.ref) {
1872
1909
  return;
1873
1910
  }
1911
+ const newField = {
1912
+ ...field._f,
1913
+ };
1914
+ if (radioOrCheckbox) {
1915
+ newField.refs = [
1916
+ ...refs.filter(live),
1917
+ fieldRef,
1918
+ ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
1919
+ ];
1920
+ newField.ref = { type: fieldRef.type, name };
1921
+ }
1922
+ else {
1923
+ newField.ref = fieldRef;
1924
+ delete newField.refs;
1925
+ }
1874
1926
  set(_fields, name, {
1875
- _f: {
1876
- ...field._f,
1877
- ...(radioOrCheckbox
1878
- ? {
1879
- refs: [
1880
- ...refs.filter(live),
1881
- fieldRef,
1882
- ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
1883
- ],
1884
- ref: { type: fieldRef.type, name },
1885
- }
1886
- : { ref: fieldRef }),
1887
- },
1927
+ _f: newField,
1888
1928
  });
1889
1929
  updateValidAndValue(name, false, undefined, fieldRef);
1890
1930
  }
@@ -1920,6 +1960,7 @@ function createFormControl(props = {}) {
1920
1960
  }
1921
1961
  };
1922
1962
  const handleSubmit = (onValid, onInvalid) => async (e) => {
1963
+ let result = undefined;
1923
1964
  let onValidError = undefined;
1924
1965
  if (e) {
1925
1966
  e.preventDefault && e.preventDefault();
@@ -1953,7 +1994,7 @@ function createFormControl(props = {}) {
1953
1994
  errors: {},
1954
1995
  });
1955
1996
  try {
1956
- await onValid(fieldValues, e);
1997
+ result = await onValid(fieldValues, e);
1957
1998
  }
1958
1999
  catch (error) {
1959
2000
  onValidError = error;
@@ -1976,6 +2017,7 @@ function createFormControl(props = {}) {
1976
2017
  if (onValidError) {
1977
2018
  throw onValidError;
1978
2019
  }
2020
+ return result;
1979
2021
  };
1980
2022
  const resetField = (name, options = {}) => {
1981
2023
  if (get(_fields, name)) {
@@ -2015,7 +2057,7 @@ function createFormControl(props = {}) {
2015
2057
  if (keepStateOptions.keepDirtyValues) {
2016
2058
  const fieldsToCheck = new Set([
2017
2059
  ..._names.mount,
2018
- ...Object.keys(getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs)),
2060
+ ...collectDirtyFieldNames(getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs), _formState.dirtyFields),
2019
2061
  ]);
2020
2062
  for (const fieldName of Array.from(fieldsToCheck)) {
2021
2063
  const isDirty = get(_formState.dirtyFields, fieldName);