react-hook-form 7.48.2 → 7.49.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 (41) hide show
  1. package/dist/index.cjs.js +1 -1
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.esm.mjs +56 -31
  4. package/dist/index.esm.mjs.map +1 -1
  5. package/dist/index.react-server.d.ts +3 -0
  6. package/dist/index.react-server.d.ts.map +1 -0
  7. package/dist/index.umd.js +1 -1
  8. package/dist/index.umd.js.map +1 -1
  9. package/dist/logic/createFormControl.d.ts +2 -1
  10. package/dist/logic/createFormControl.d.ts.map +1 -1
  11. package/dist/logic/focusFieldBy.d.ts +6 -2
  12. package/dist/logic/getDirtyFields.d.ts +1 -1
  13. package/dist/logic/getDirtyFields.d.ts.map +1 -1
  14. package/dist/logic/getValidationModes.d.ts +2 -8
  15. package/dist/logic/getValidationModes.d.ts.map +1 -1
  16. package/dist/logic/iterateFieldsByAction.d.ts.map +1 -1
  17. package/dist/logic/skipValidation.d.ts +2 -7
  18. package/dist/logic/skipValidation.d.ts.map +1 -1
  19. package/dist/react-server.esm.mjs +65 -0
  20. package/dist/react-server.esm.mjs.map +1 -0
  21. package/dist/types/form.d.ts +10 -1
  22. package/dist/types/form.d.ts.map +1 -1
  23. package/dist/useController.d.ts.map +1 -1
  24. package/dist/useForm.d.ts.map +1 -1
  25. package/dist/utils/append.d.ts +2 -1
  26. package/dist/utils/append.d.ts.map +1 -1
  27. package/dist/utils/createSubject.d.ts +2 -1
  28. package/dist/utils/createSubject.d.ts.map +1 -1
  29. package/dist/utils/deepMerge.d.ts +1 -1
  30. package/dist/utils/deepMerge.d.ts.map +1 -1
  31. package/dist/utils/get.d.ts +1 -1
  32. package/dist/utils/get.d.ts.map +1 -1
  33. package/dist/utils/isObject.d.ts +1 -1
  34. package/dist/utils/isObject.d.ts.map +1 -1
  35. package/dist/utils/prepend.d.ts +2 -1
  36. package/dist/utils/prepend.d.ts.map +1 -1
  37. package/dist/utils/set.d.ts +2 -1
  38. package/dist/utils/set.d.ts.map +1 -1
  39. package/dist/utils/sleep.d.ts +2 -1
  40. package/dist/utils/sleep.d.ts.map +1 -1
  41. package/package.json +7 -5
@@ -64,15 +64,15 @@ var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
64
64
 
65
65
  var isUndefined = (val) => val === undefined;
66
66
 
67
- var get = (obj, path, defaultValue) => {
68
- if (!path || !isObject(obj)) {
67
+ var get = (object, path, defaultValue) => {
68
+ if (!path || !isObject(object)) {
69
69
  return defaultValue;
70
70
  }
71
- const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], obj);
72
- return isUndefined(result) || result === obj
73
- ? isUndefined(obj[path])
71
+ const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
72
+ return isUndefined(result) || result === object
73
+ ? isUndefined(object[path])
74
74
  ? defaultValue
75
- : obj[path]
75
+ : object[path]
76
76
  : result;
77
77
  };
78
78
 
@@ -343,7 +343,7 @@ var isKey = (value) => /^\w*$/.test(value);
343
343
 
344
344
  var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
345
345
 
346
- function set(object, path, value) {
346
+ var set = (object, path, value) => {
347
347
  let index = -1;
348
348
  const tempPath = isKey(path) ? [path] : stringToPath(path);
349
349
  const length = tempPath.length;
@@ -364,7 +364,7 @@ function set(object, path, value) {
364
364
  object = object[key];
365
365
  }
366
366
  return object;
367
- }
367
+ };
368
368
 
369
369
  /**
370
370
  * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.
@@ -407,6 +407,7 @@ function useController(props) {
407
407
  const _registerProps = React.useRef(control.register(name, {
408
408
  ...props.rules,
409
409
  value,
410
+ disabled: props.disabled,
410
411
  }));
411
412
  _registerProps.current = control.register(name, props.rules);
412
413
  React.useEffect(() => {
@@ -689,6 +690,9 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
689
690
  else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {
690
691
  break;
691
692
  }
693
+ else {
694
+ iterateFieldsByAction(currentField, action);
695
+ }
692
696
  }
693
697
  else if (isObject(currentField)) {
694
698
  iterateFieldsByAction(currentField, action);
@@ -959,9 +963,10 @@ var validateField = async (field, formValues, validateAllFieldCriteria, shouldUs
959
963
  return error;
960
964
  };
961
965
 
962
- function append(data, value) {
963
- return [...data, ...convertToArrayPayload(value)];
964
- }
966
+ var appendAt = (data, value) => [
967
+ ...data,
968
+ ...convertToArrayPayload(value),
969
+ ];
965
970
 
966
971
  var fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;
967
972
 
@@ -984,9 +989,10 @@ var moveArrayAt = (data, from, to) => {
984
989
  return data;
985
990
  };
986
991
 
987
- function prepend(data, value) {
988
- return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];
989
- }
992
+ var prependAt = (data, value) => [
993
+ ...convertToArrayPayload(value),
994
+ ...convertToArrayPayload(data),
995
+ ];
990
996
 
991
997
  function removeAtIndexes(data, indexes) {
992
998
  let i = 0;
@@ -1002,7 +1008,7 @@ var removeArrayAt = (data, index) => isUndefined(index)
1002
1008
  : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));
1003
1009
 
1004
1010
  var swapArrayAt = (data, indexA, indexB) => {
1005
- data[indexA] = [data[indexB], (data[indexB] = data[indexA])][0];
1011
+ [data[indexA], data[indexB]] = [data[indexB], data[indexA]];
1006
1012
  };
1007
1013
 
1008
1014
  function baseGet(object, updatePath) {
@@ -1112,25 +1118,25 @@ function useFieldArray(props) {
1112
1118
  _actioned.current = true;
1113
1119
  control._updateFieldArray(name, updatedFieldArrayValues);
1114
1120
  }, [control, name]);
1115
- const append$1 = (value, options) => {
1121
+ const append = (value, options) => {
1116
1122
  const appendValue = convertToArrayPayload(cloneObject(value));
1117
- const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
1123
+ const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);
1118
1124
  control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
1119
- ids.current = append(ids.current, appendValue.map(generateId));
1125
+ ids.current = appendAt(ids.current, appendValue.map(generateId));
1120
1126
  updateValues(updatedFieldArrayValues);
1121
1127
  setFields(updatedFieldArrayValues);
1122
- control._updateFieldArray(name, updatedFieldArrayValues, append, {
1128
+ control._updateFieldArray(name, updatedFieldArrayValues, appendAt, {
1123
1129
  argA: fillEmptyArray(value),
1124
1130
  });
1125
1131
  };
1126
- const prepend$1 = (value, options) => {
1132
+ const prepend = (value, options) => {
1127
1133
  const prependValue = convertToArrayPayload(cloneObject(value));
1128
- const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
1134
+ const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);
1129
1135
  control._names.focus = getFocusFieldName(name, 0, options);
1130
- ids.current = prepend(ids.current, prependValue.map(generateId));
1136
+ ids.current = prependAt(ids.current, prependValue.map(generateId));
1131
1137
  updateValues(updatedFieldArrayValues);
1132
1138
  setFields(updatedFieldArrayValues);
1133
- control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
1139
+ control._updateFieldArray(name, updatedFieldArrayValues, prependAt, {
1134
1140
  argA: fillEmptyArray(value),
1135
1141
  });
1136
1142
  };
@@ -1261,8 +1267,8 @@ function useFieldArray(props) {
1261
1267
  return {
1262
1268
  swap: React.useCallback(swap, [updateValues, name, control]),
1263
1269
  move: React.useCallback(move, [updateValues, name, control]),
1264
- prepend: React.useCallback(prepend$1, [updateValues, name, control]),
1265
- append: React.useCallback(append$1, [updateValues, name, control]),
1270
+ prepend: React.useCallback(prepend, [updateValues, name, control]),
1271
+ append: React.useCallback(append, [updateValues, name, control]),
1266
1272
  remove: React.useCallback(remove, [updateValues, name, control]),
1267
1273
  insert: React.useCallback(insert$1, [updateValues, name, control]),
1268
1274
  update: React.useCallback(update, [updateValues, name, control]),
@@ -1274,7 +1280,7 @@ function useFieldArray(props) {
1274
1280
  };
1275
1281
  }
1276
1282
 
1277
- function createSubject() {
1283
+ var createSubject = () => {
1278
1284
  let _observers = [];
1279
1285
  const next = (value) => {
1280
1286
  for (const observer of _observers) {
@@ -1300,7 +1306,7 @@ function createSubject() {
1300
1306
  subscribe,
1301
1307
  unsubscribe,
1302
1308
  };
1303
- }
1309
+ };
1304
1310
 
1305
1311
  var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
1306
1312
 
@@ -1526,7 +1532,7 @@ function createFormControl(props = {}, flushRootRender) {
1526
1532
  isValid: false,
1527
1533
  touchedFields: {},
1528
1534
  dirtyFields: {},
1529
- errors: {},
1535
+ errors: _options.errors || {},
1530
1536
  disabled: false,
1531
1537
  };
1532
1538
  let _fields = {};
@@ -1626,6 +1632,13 @@ function createFormControl(props = {}, flushRootRender) {
1626
1632
  errors: _formState.errors,
1627
1633
  });
1628
1634
  };
1635
+ const _setErrors = (errors) => {
1636
+ _formState.errors = errors;
1637
+ _subjects.state.next({
1638
+ errors: _formState.errors,
1639
+ isValid: false,
1640
+ });
1641
+ };
1629
1642
  const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
1630
1643
  const field = get(_fields, name);
1631
1644
  if (field) {
@@ -2150,8 +2163,13 @@ function createFormControl(props = {}, flushRootRender) {
2150
2163
  const _disableForm = (disabled) => {
2151
2164
  if (isBoolean(disabled)) {
2152
2165
  _subjects.state.next({ disabled });
2153
- iterateFieldsByAction(_fields, (ref) => {
2154
- ref.disabled = disabled;
2166
+ iterateFieldsByAction(_fields, (ref, name) => {
2167
+ let requiredDisabledState = disabled;
2168
+ const currentField = get(_fields, name);
2169
+ if (currentField && isBoolean(currentField._f.disabled)) {
2170
+ requiredDisabledState || (requiredDisabledState = currentField._f.disabled);
2171
+ }
2172
+ ref.disabled = requiredDisabledState;
2155
2173
  }, 0, false);
2156
2174
  }
2157
2175
  };
@@ -2355,6 +2373,7 @@ function createFormControl(props = {}, flushRootRender) {
2355
2373
  _disableForm,
2356
2374
  _subjects,
2357
2375
  _proxyFormState,
2376
+ _setErrors,
2358
2377
  get _fields() {
2359
2378
  return _fields;
2360
2379
  },
@@ -2451,7 +2470,7 @@ function useForm(props = {}) {
2451
2470
  submitCount: 0,
2452
2471
  dirtyFields: {},
2453
2472
  touchedFields: {},
2454
- errors: {},
2473
+ errors: props.errors || {},
2455
2474
  disabled: false,
2456
2475
  defaultValues: isFunction(props.defaultValues)
2457
2476
  ? undefined
@@ -2488,11 +2507,17 @@ function useForm(props = {}) {
2488
2507
  if (props.values && !deepEqual(props.values, _values.current)) {
2489
2508
  control._reset(props.values, control._options.resetOptions);
2490
2509
  _values.current = props.values;
2510
+ updateFormState((state) => ({ ...state }));
2491
2511
  }
2492
2512
  else {
2493
2513
  control._resetDefaultValues();
2494
2514
  }
2495
2515
  }, [props.values, control]);
2516
+ React.useEffect(() => {
2517
+ if (props.errors) {
2518
+ control._setErrors(props.errors);
2519
+ }
2520
+ }, [props.errors, control]);
2496
2521
  React.useEffect(() => {
2497
2522
  if (!control._state.mount) {
2498
2523
  control._updateValid();