react-hook-form 7.20.2 → 7.21.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.
package/dist/index.esm.js CHANGED
@@ -12,7 +12,7 @@ var isObject = (value) => !isNullOrUndefined(value) &&
12
12
  isObjectType(value) &&
13
13
  !isDateObject(value);
14
14
 
15
- var getControllerValue = (event) => isObject(event) && event.target
15
+ var getEventValue = (event) => isObject(event) && event.target
16
16
  ? isCheckBoxInput(event.target)
17
17
  ? event.target.checked
18
18
  : event.target.value
@@ -22,7 +22,7 @@ var getNodeParentName = (name) => name.substring(0, name.search(/.\d/)) || name;
22
22
 
23
23
  var isNameInFieldArray = (names, name) => [...names].some((current) => getNodeParentName(name) === current);
24
24
 
25
- var compact = (value) => value.filter(Boolean);
25
+ var compact = (value) => (value || []).filter(Boolean);
26
26
 
27
27
  var isUndefined = (val) => val === undefined;
28
28
 
@@ -250,7 +250,7 @@ function useController(props) {
250
250
  onChange: (event) => {
251
251
  registerProps.onChange({
252
252
  target: {
253
- value: getControllerValue(event),
253
+ value: getEventValue(event),
254
254
  name: name,
255
255
  },
256
256
  type: EVENTS.CHANGE,
@@ -448,68 +448,76 @@ const useFieldArray = (props) => {
448
448
  const append$1 = (value, options) => {
449
449
  const appendValue = convertToArrayPayload(value);
450
450
  const updatedFieldArrayValuesWithKey = append(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(appendValue, keyName));
451
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
452
+ control._names.focus = getFocusFieldName(name, fieldArrayValues.length - 1, options);
451
453
  setFields(updatedFieldArrayValuesWithKey);
452
454
  control._updateFieldArray(name, append, {
453
455
  argA: fillEmptyArray(value),
454
- }, updateValues(updatedFieldArrayValuesWithKey));
455
- control._names.focus = getFocusFieldName(name, updatedFieldArrayValuesWithKey.length - appendValue.length, options);
456
+ }, fieldArrayValues);
456
457
  };
457
458
  const prepend$1 = (value, options) => {
458
459
  const updatedFieldArrayValuesWithKey = prepend(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(convertToArrayPayload(value), keyName));
460
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
461
+ control._names.focus = getFocusFieldName(name, 0, options);
459
462
  setFields(updatedFieldArrayValuesWithKey);
460
463
  control._updateFieldArray(name, prepend, {
461
464
  argA: fillEmptyArray(value),
462
- }, updateValues(updatedFieldArrayValuesWithKey));
463
- control._names.focus = getFocusFieldName(name, 0, options);
465
+ }, fieldArrayValues);
464
466
  };
465
467
  const remove = (index) => {
466
468
  const updatedFieldArrayValuesWithKey = removeArrayAt(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index);
469
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
467
470
  setFields(updatedFieldArrayValuesWithKey);
468
471
  control._updateFieldArray(name, removeArrayAt, {
469
472
  argA: index,
470
- }, updateValues(updatedFieldArrayValuesWithKey));
473
+ }, fieldArrayValues);
471
474
  };
472
475
  const insert$1 = (index, value, options) => {
473
476
  const updatedFieldArrayValuesWithKey = insert(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index, mapIds(convertToArrayPayload(value), keyName));
477
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
478
+ control._names.focus = getFocusFieldName(name, index, options);
474
479
  setFields(updatedFieldArrayValuesWithKey);
475
480
  control._updateFieldArray(name, insert, {
476
481
  argA: index,
477
482
  argB: fillEmptyArray(value),
478
- }, updateValues(updatedFieldArrayValuesWithKey));
479
- control._names.focus = getFocusFieldName(name, index, options);
483
+ }, fieldArrayValues);
480
484
  };
481
485
  const swap = (indexA, indexB) => {
482
486
  const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
483
487
  swapArrayAt(updatedFieldArrayValuesWithKey, indexA, indexB);
488
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
484
489
  setFields(updatedFieldArrayValuesWithKey);
485
490
  control._updateFieldArray(name, swapArrayAt, {
486
491
  argA: indexA,
487
492
  argB: indexB,
488
- }, updateValues(updatedFieldArrayValuesWithKey), false);
493
+ }, fieldArrayValues, false);
489
494
  };
490
495
  const move = (from, to) => {
491
496
  const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
492
497
  moveArrayAt(updatedFieldArrayValuesWithKey, from, to);
498
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
499
+ setFields(updatedFieldArrayValuesWithKey);
493
500
  control._updateFieldArray(name, moveArrayAt, {
494
501
  argA: from,
495
502
  argB: to,
496
- }, updateValues(updatedFieldArrayValuesWithKey), false);
497
- setFields(updatedFieldArrayValuesWithKey);
503
+ }, fieldArrayValues, false);
498
504
  };
499
505
  const update = (index, value) => {
500
506
  const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
501
507
  const updatedFieldArrayValues = updateAt(updatedFieldArrayValuesWithKey, index, value);
502
508
  _fieldIds.current = mapIds(updatedFieldArrayValues, keyName);
509
+ const fieldArrayValues = updateValues(_fieldIds.current);
503
510
  setFields(_fieldIds.current);
504
511
  control._updateFieldArray(name, updateAt, {
505
512
  argA: index,
506
513
  argB: value,
507
- }, updateValues(_fieldIds.current), true, false);
514
+ }, fieldArrayValues, true, false);
508
515
  };
509
516
  const replace = (value) => {
510
517
  const updatedFieldArrayValuesWithKey = mapIds(convertToArrayPayload(value), keyName);
518
+ const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
511
519
  setFields(updatedFieldArrayValuesWithKey);
512
- control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, updateValues(updatedFieldArrayValuesWithKey), true, false);
520
+ control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, fieldArrayValues, true, false);
513
521
  };
514
522
  React.useEffect(() => {
515
523
  control._stateFlags.action = false;
@@ -659,7 +667,7 @@ var isMultipleSelect = (element) => element.type === `select-multiple`;
659
667
 
660
668
  var isRadioInput = (element) => element.type === 'radio';
661
669
 
662
- var isRadioOrCheckboxFunction = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);
670
+ var isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);
663
671
 
664
672
  var isWeb = typeof window !== 'undefined' &&
665
673
  typeof window.HTMLElement !== 'undefined' &&
@@ -706,6 +714,47 @@ function unset(object, path) {
706
714
  return object;
707
715
  }
708
716
 
717
+ function markFieldsDirty(data, fields = {}) {
718
+ const isParentNodeArray = Array.isArray(data);
719
+ if (isObject(data) || isParentNodeArray) {
720
+ for (const key in data) {
721
+ if (Array.isArray(data[key]) ||
722
+ (isObject(data[key]) && !objectHasFunction(data[key]))) {
723
+ fields[key] = Array.isArray(data[key]) ? [] : {};
724
+ markFieldsDirty(data[key], fields[key]);
725
+ }
726
+ else if (!isNullOrUndefined(data[key])) {
727
+ fields[key] = true;
728
+ }
729
+ }
730
+ }
731
+ return fields;
732
+ }
733
+ function getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {
734
+ const isParentNodeArray = Array.isArray(data);
735
+ if (isObject(data) || isParentNodeArray) {
736
+ for (const key in data) {
737
+ if (Array.isArray(data[key]) ||
738
+ (isObject(data[key]) && !objectHasFunction(data[key]))) {
739
+ if (isUndefined(formValues) ||
740
+ isPrimitive(dirtyFieldsFromValues[key])) {
741
+ dirtyFieldsFromValues[key] = Array.isArray(data[key])
742
+ ? markFieldsDirty(data[key], [])
743
+ : Object.assign({}, markFieldsDirty(data[key]));
744
+ }
745
+ else {
746
+ getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
747
+ }
748
+ }
749
+ else {
750
+ dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
751
+ }
752
+ }
753
+ }
754
+ return dirtyFieldsFromValues;
755
+ }
756
+ var getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));
757
+
709
758
  const defaultResult = {
710
759
  value: false,
711
760
  isValid: false,
@@ -737,7 +786,7 @@ var getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isU
737
786
  ? value === ''
738
787
  ? NaN
739
788
  : +value
740
- : valueAsDate
789
+ : valueAsDate && isString(value)
741
790
  ? new Date(value)
742
791
  : setValueAs
743
792
  ? setValueAs(value)
@@ -790,6 +839,18 @@ var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeVal
790
839
  };
791
840
  };
792
841
 
842
+ var isRegex = (value) => value instanceof RegExp;
843
+
844
+ var getRuleValue = (rule) => isUndefined(rule)
845
+ ? undefined
846
+ : isRegex(rule)
847
+ ? rule.source
848
+ : isObject(rule)
849
+ ? isRegex(rule.value)
850
+ ? rule.value.source
851
+ : rule.value
852
+ : rule;
853
+
793
854
  var hasValidation = (options) => options.mount &&
794
855
  (options.required ||
795
856
  options.min ||
@@ -828,49 +889,6 @@ function schemaErrorLookup(errors, _fields, name) {
828
889
  };
829
890
  }
830
891
 
831
- function deepMerge(target, source) {
832
- if (isPrimitive(target) || isPrimitive(source)) {
833
- return source;
834
- }
835
- for (const key in source) {
836
- const targetValue = target[key];
837
- const sourceValue = source[key];
838
- try {
839
- target[key] =
840
- (isObject(targetValue) && isObject(sourceValue)) ||
841
- (Array.isArray(targetValue) && Array.isArray(sourceValue))
842
- ? deepMerge(targetValue, sourceValue)
843
- : sourceValue;
844
- }
845
- catch (_a) { }
846
- }
847
- return target;
848
- }
849
-
850
- function setDirtyFields(values, defaultValues, dirtyFields, parentNode, parentName) {
851
- let index = -1;
852
- while (++index < values.length) {
853
- for (const key in values[index]) {
854
- if (Array.isArray(values[index][key])) {
855
- !dirtyFields[index] && (dirtyFields[index] = {});
856
- dirtyFields[index][key] = [];
857
- setDirtyFields(values[index][key], get(defaultValues[index] || {}, key, []), dirtyFields[index][key], dirtyFields[index], key);
858
- }
859
- else {
860
- !isNullOrUndefined(defaultValues) &&
861
- deepEqual(get(defaultValues[index] || {}, key), values[index][key])
862
- ? set(dirtyFields[index] || {}, key)
863
- : (dirtyFields[index] = Object.assign(Object.assign({}, dirtyFields[index]), { [key]: true }));
864
- }
865
- }
866
- parentNode &&
867
- !dirtyFields.length &&
868
- delete parentNode[parentName];
869
- }
870
- return dirtyFields;
871
- }
872
- var setFieldArrayDirtyFields = (values, defaultValues, dirtyFields) => deepMerge(setDirtyFields(values, defaultValues, dirtyFields.slice(0, values.length)), setDirtyFields(defaultValues, values, dirtyFields.slice(0, values.length)));
873
-
874
892
  var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {
875
893
  if (mode.isOnAll) {
876
894
  return false;
@@ -887,12 +905,10 @@ var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode)
887
905
  return true;
888
906
  };
889
907
 
890
- var unsetEmptyArray = (ref, name) => !compact(get(ref, name, [])).length && unset(ref, name);
908
+ var unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);
891
909
 
892
910
  var isMessage = (value) => isString(value) || React.isValidElement(value);
893
911
 
894
- var isRegex = (value) => value instanceof RegExp;
895
-
896
912
  function getValidateError(result, ref, type = 'validate') {
897
913
  if (isMessage(result) ||
898
914
  (Array.isArray(result) && result.every(isMessage)) ||
@@ -918,7 +934,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
918
934
  return {};
919
935
  }
920
936
  const inputRef = refs ? refs[0] : ref;
921
- const setCustomValidty = (message) => {
937
+ const setCustomValidity = (message) => {
922
938
  if (shouldUseNativeValidation && inputRef.reportValidity) {
923
939
  inputRef.setCustomValidity(isBoolean(message) ? '' : message || ' ');
924
940
  inputRef.reportValidity();
@@ -948,7 +964,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
948
964
  if (value) {
949
965
  error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.required, message, ref: inputRef }, appendErrorsCurry(INPUT_VALIDATION_RULES.required, message));
950
966
  if (!validateAllFieldCriteria) {
951
- setCustomValidty(message);
967
+ setCustomValidity(message);
952
968
  return error;
953
969
  }
954
970
  }
@@ -959,7 +975,8 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
959
975
  const maxOutput = getValueAndMessage(max);
960
976
  const minOutput = getValueAndMessage(min);
961
977
  if (!isNaN(inputValue)) {
962
- const valueNumber = ref.valueAsNumber || parseFloat(inputValue);
978
+ const valueNumber = ref.valueAsNumber ||
979
+ parseFloat(inputValue);
963
980
  if (!isNullOrUndefined(maxOutput.value)) {
964
981
  exceedMax = valueNumber > maxOutput.value;
965
982
  }
@@ -979,7 +996,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
979
996
  if (exceedMax || exceedMin) {
980
997
  getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);
981
998
  if (!validateAllFieldCriteria) {
982
- setCustomValidty(error[name].message);
999
+ setCustomValidity(error[name].message);
983
1000
  return error;
984
1001
  }
985
1002
  }
@@ -994,7 +1011,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
994
1011
  if (exceedMax || exceedMin) {
995
1012
  getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);
996
1013
  if (!validateAllFieldCriteria) {
997
- setCustomValidty(error[name].message);
1014
+ setCustomValidity(error[name].message);
998
1015
  return error;
999
1016
  }
1000
1017
  }
@@ -1005,7 +1022,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
1005
1022
  error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.pattern, message,
1006
1023
  ref }, appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message));
1007
1024
  if (!validateAllFieldCriteria) {
1008
- setCustomValidty(message);
1025
+ setCustomValidity(message);
1009
1026
  return error;
1010
1027
  }
1011
1028
  }
@@ -1017,7 +1034,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
1017
1034
  if (validateError) {
1018
1035
  error[name] = Object.assign(Object.assign({}, validateError), appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message));
1019
1036
  if (!validateAllFieldCriteria) {
1020
- setCustomValidty(validateError.message);
1037
+ setCustomValidity(validateError.message);
1021
1038
  return error;
1022
1039
  }
1023
1040
  }
@@ -1031,7 +1048,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
1031
1048
  const validateError = getValidateError(await validate[key](inputValue), inputRef, key);
1032
1049
  if (validateError) {
1033
1050
  validationResult = Object.assign(Object.assign({}, validateError), appendErrorsCurry(key, validateError.message));
1034
- setCustomValidty(validateError.message);
1051
+ setCustomValidity(validateError.message);
1035
1052
  if (validateAllFieldCriteria) {
1036
1053
  error[name] = validationResult;
1037
1054
  }
@@ -1045,7 +1062,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
1045
1062
  }
1046
1063
  }
1047
1064
  }
1048
- setCustomValidty(true);
1065
+ setCustomValidity(true);
1049
1066
  return error;
1050
1067
  };
1051
1068
 
@@ -1054,7 +1071,6 @@ const defaultOptions = {
1054
1071
  reValidateMode: VALIDATION_MODE.onChange,
1055
1072
  shouldFocusError: true,
1056
1073
  };
1057
- const isWindowUndefined = typeof window === 'undefined';
1058
1074
  function createFormControl(props = {}) {
1059
1075
  let _options = Object.assign(Object.assign({}, defaultOptions), props);
1060
1076
  let _formState = {
@@ -1141,7 +1157,7 @@ function createFormControl(props = {}) {
1141
1157
  unsetEmptyArray(_formState.touchedFields, name);
1142
1158
  }
1143
1159
  if (_proxyFormState.dirtyFields || _proxyFormState.isDirty) {
1144
- updateFieldArrayDirty(name, values);
1160
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1145
1161
  }
1146
1162
  _subjects.state.next({
1147
1163
  isDirty: _getDirty(name, values),
@@ -1199,8 +1215,6 @@ function createFormControl(props = {}) {
1199
1215
  isFieldDirty && shouldRender && _subjects.state.next(output);
1200
1216
  return isFieldDirty ? output : {};
1201
1217
  };
1202
- const updateFieldArrayDirty = (name, value) => (set(_formState.dirtyFields, name, setFieldArrayDirtyFields(value, get(_defaultValues, name, []), get(_formState.dirtyFields, name, []))),
1203
- unsetEmptyArray(_formState.dirtyFields, name));
1204
1218
  const shouldRenderByError = async (shouldSkipRender, name, isValid, error, fieldState) => {
1205
1219
  const previousFieldError = get(_formState.errors, name);
1206
1220
  const shouldUpdateValid = _proxyFormState.isValid && _formState.isValid !== isValid;
@@ -1312,10 +1326,7 @@ function createFormControl(props = {}) {
1312
1326
  isWeb && isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)
1313
1327
  ? ''
1314
1328
  : value;
1315
- if (isFileInput(fieldReference.ref) && !isString(fieldValue)) {
1316
- fieldReference.ref.files = fieldValue;
1317
- }
1318
- else if (isMultipleSelect(fieldReference.ref)) {
1329
+ if (isMultipleSelect(fieldReference.ref)) {
1319
1330
  [...fieldReference.ref.options].forEach((selectRef) => (selectRef.selected = fieldValue.includes(selectRef.value)));
1320
1331
  }
1321
1332
  else if (fieldReference.refs) {
@@ -1330,7 +1341,7 @@ function createFormControl(props = {}) {
1330
1341
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
1331
1342
  }
1332
1343
  }
1333
- else {
1344
+ else if (!isFileInput(fieldReference.ref)) {
1334
1345
  fieldReference.ref.value = fieldValue;
1335
1346
  }
1336
1347
  }
@@ -1363,7 +1374,7 @@ function createFormControl(props = {}) {
1363
1374
  });
1364
1375
  if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) &&
1365
1376
  options.shouldDirty) {
1366
- updateFieldArrayDirty(name, value);
1377
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1367
1378
  _subjects.state.next({
1368
1379
  name,
1369
1380
  dirtyFields: _formState.dirtyFields,
@@ -1381,14 +1392,16 @@ function createFormControl(props = {}) {
1381
1392
  name,
1382
1393
  });
1383
1394
  };
1384
- const handleChange = async (event) => {
1395
+ const onChange = async (event) => {
1385
1396
  const target = event.target;
1386
1397
  let name = target.name;
1387
1398
  const field = get(_fields, name);
1388
1399
  if (field) {
1389
1400
  let error;
1390
1401
  let isValid;
1391
- const fieldValue = target.type ? getFieldValue(field._f) : target.value;
1402
+ const fieldValue = target.type
1403
+ ? getFieldValue(field._f)
1404
+ : getEventValue(event);
1392
1405
  const isBlurEvent = event.type === EVENTS.BLUR;
1393
1406
  const shouldSkipValidation = (!hasValidation(field._f) &&
1394
1407
  !_options.resolver &&
@@ -1523,7 +1536,7 @@ function createFormControl(props = {}) {
1523
1536
  !options.keepIsValid && _updateValid();
1524
1537
  };
1525
1538
  const register = (name, options = {}) => {
1526
- const field = get(_fields, name);
1539
+ let field = get(_fields, name);
1527
1540
  set(_fields, name, {
1528
1541
  _f: Object.assign(Object.assign(Object.assign({}, (field && field._f ? field._f : { ref: { name } })), { name, mount: true }), options),
1529
1542
  });
@@ -1537,48 +1550,47 @@ function createFormControl(props = {}) {
1537
1550
  ? undefined
1538
1551
  : get(_formValues, name, getFieldValue(field._f)))
1539
1552
  : updateValidAndValue(name, true);
1540
- return isWindowUndefined
1541
- ? { name: name }
1542
- : Object.assign(Object.assign({ name }, (isBoolean(options.disabled)
1543
- ? { disabled: options.disabled }
1544
- : {})), { onChange: handleChange, onBlur: handleChange, ref: (ref) => {
1545
- if (ref) {
1546
- register(name, options);
1547
- let field = get(_fields, name);
1548
- const fieldRef = isUndefined(ref.value)
1549
- ? ref.querySelectorAll
1550
- ? ref.querySelectorAll('input,select,textarea')[0] ||
1551
- ref
1552
- : ref
1553
- : ref;
1554
- const isRadioOrCheckbox = isRadioOrCheckboxFunction(fieldRef);
1555
- if (fieldRef === field._f.ref ||
1556
- (isRadioOrCheckbox &&
1557
- compact(field._f.refs || []).find((option) => option === fieldRef))) {
1558
- return;
1559
- }
1560
- field = {
1561
- _f: isRadioOrCheckbox
1562
- ? Object.assign(Object.assign({}, field._f), { refs: [
1563
- ...compact(field._f.refs || []).filter(live),
1564
- fieldRef,
1565
- ], ref: { type: fieldRef.type, name } }) : Object.assign(Object.assign({}, field._f), { ref: fieldRef }),
1566
- };
1567
- set(_fields, name, field);
1568
- (!options || !options.disabled) &&
1569
- updateValidAndValue(name, false, fieldRef);
1553
+ return Object.assign(Object.assign(Object.assign({}, (isBoolean(options.disabled) ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
1554
+ ? {
1555
+ required: !!options.required,
1556
+ min: getRuleValue(options.min),
1557
+ max: getRuleValue(options.max),
1558
+ minLength: getRuleValue(options.minLength),
1559
+ maxLength: getRuleValue(options.maxLength),
1560
+ pattern: getRuleValue(options.pattern),
1561
+ }
1562
+ : {})), { name,
1563
+ onChange, onBlur: onChange, ref: (ref) => {
1564
+ if (ref) {
1565
+ register(name, options);
1566
+ field = get(_fields, name);
1567
+ const fieldRef = isUndefined(ref.value)
1568
+ ? ref.querySelectorAll
1569
+ ? ref.querySelectorAll('input,select,textarea')[0] || ref
1570
+ : ref
1571
+ : ref;
1572
+ const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
1573
+ if (fieldRef === field._f.ref ||
1574
+ (radioOrCheckbox &&
1575
+ compact(field._f.refs).find((option) => option === fieldRef))) {
1576
+ return;
1570
1577
  }
1571
- else {
1572
- const field = get(_fields, name, {});
1573
- const shouldUnregister = _options.shouldUnregister || options.shouldUnregister;
1574
- if (field._f) {
1575
- field._f.mount = false;
1576
- }
1577
- shouldUnregister &&
1578
- !(isNameInFieldArray(_names.array, name) && _stateFlags.action) &&
1579
- _names.unMount.add(name);
1578
+ set(_fields, name, {
1579
+ _f: radioOrCheckbox
1580
+ ? Object.assign(Object.assign({}, field._f), { refs: [...compact(field._f.refs).filter(live), fieldRef], ref: { type: fieldRef.type, name } }) : Object.assign(Object.assign({}, field._f), { ref: fieldRef }),
1581
+ });
1582
+ !options.disabled && updateValidAndValue(name, false, fieldRef);
1583
+ }
1584
+ else {
1585
+ field = get(_fields, name, {});
1586
+ if (field._f) {
1587
+ field._f.mount = false;
1580
1588
  }
1581
- } });
1589
+ (_options.shouldUnregister || options.shouldUnregister) &&
1590
+ !(isNameInFieldArray(_names.array, name) && _stateFlags.action) &&
1591
+ _names.unMount.add(name);
1592
+ }
1593
+ } });
1582
1594
  };
1583
1595
  const handleSubmit = (onValid, onInvalid) => async (e) => {
1584
1596
  if (e) {