react-hook-form 7.23.0-next.0 → 7.23.0-next.1

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.
@@ -2,7 +2,7 @@ import React from 'react';
2
2
 
3
3
  var isCheckBoxInput = (element) => element.type === 'checkbox';
4
4
 
5
- var isDateObject = (data) => data instanceof Date;
5
+ var isDateObject = (value) => value instanceof Date;
6
6
 
7
7
  var isNullOrUndefined = (value) => value == null;
8
8
 
@@ -22,20 +22,20 @@ 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
 
29
29
  var get = (obj, path, defaultValue) => {
30
- if (isObject(obj) && path) {
31
- const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => (isNullOrUndefined(result) ? result : result[key]), obj);
32
- return isUndefined(result) || result === obj
33
- ? isUndefined(obj[path])
34
- ? defaultValue
35
- : obj[path]
36
- : result;
30
+ if (!path || !isObject(obj)) {
31
+ return defaultValue;
37
32
  }
38
- return undefined;
33
+ const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], obj);
34
+ return isUndefined(result) || result === obj
35
+ ? isUndefined(obj[path])
36
+ ? defaultValue
37
+ : obj[path]
38
+ : result;
39
39
  };
40
40
 
41
41
  const EVENTS = {
@@ -343,6 +343,14 @@ const focusFieldBy = (fields, callback, fieldsNames) => {
343
343
  }
344
344
  };
345
345
 
346
+ var generateId = () => {
347
+ const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
348
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
349
+ const r = (Math.random() * 16 + d) % 16 | 0;
350
+ return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
351
+ });
352
+ };
353
+
346
354
  var getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)
347
355
  ? options.focusName ||
348
356
  `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`
@@ -354,20 +362,8 @@ var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
354
362
  [..._names.watch].some((watchName) => name.startsWith(watchName) &&
355
363
  /^\.\w+/.test(name.slice(watchName.length))));
356
364
 
357
- var generateId = () => {
358
- const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
359
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
360
- const r = (Math.random() * 16 + d) % 16 | 0;
361
- return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
362
- });
363
- };
364
-
365
- var mapCurrentIds = (values, keyName, _fieldIds) => values.map((value, index) => (Object.assign(Object.assign({}, value), { [keyName]: _fieldIds && _fieldIds.current[index]
366
- ? _fieldIds.current[index][keyName]
367
- : value[keyName] || generateId() })));
368
-
369
365
  function append(data, value) {
370
- return [...convertToArrayPayload(data), ...convertToArrayPayload(value)];
366
+ return [...data, ...convertToArrayPayload(value)];
371
367
  }
372
368
 
373
369
  function cloneObject(data) {
@@ -416,8 +412,6 @@ var moveArrayAt = (data, from, to) => {
416
412
  return [];
417
413
  };
418
414
 
419
- var omitKeys = (fields, keyName) => fields.map((field = {}) => omit(field, keyName));
420
-
421
415
  function prepend(data, value) {
422
416
  return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];
423
417
  }
@@ -447,8 +441,8 @@ var updateAt = (fieldValues, index, value) => {
447
441
  const useFieldArray = (props) => {
448
442
  const methods = useFormContext();
449
443
  const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;
450
- const _shouldKeepKeyName = React.useRef(get(control._getFieldArray(name)[0], keyName));
451
- const [fields, setFields] = React.useState(mapCurrentIds(control._getFieldArray(name), keyName));
444
+ const [fields, setFields] = React.useState(control._getFieldArray(name));
445
+ const ids = React.useRef(control._getFieldArray(name).map(generateId));
452
446
  const _fieldIds = React.useRef(fields);
453
447
  const _name = React.useRef(name);
454
448
  const _actioned = React.useRef(false);
@@ -457,98 +451,100 @@ const useFieldArray = (props) => {
457
451
  control._names.array.add(name);
458
452
  const callback = React.useCallback(({ values, name: fieldArrayName }) => {
459
453
  if (fieldArrayName === _name.current || !fieldArrayName) {
460
- setFields(mapCurrentIds(get(values, _name.current, []), keyName));
454
+ const fieldValues = get(values, _name.current, []);
455
+ setFields(fieldValues);
456
+ ids.current = fieldValues.map(generateId);
461
457
  }
462
- }, [keyName]);
458
+ }, []);
463
459
  useSubscribe({
464
460
  callback,
465
461
  subject: control._subjects.array,
466
462
  });
467
- const updateValues = React.useCallback((updatedFieldArrayValuesWithKey, hasKey = _shouldKeepKeyName.current) => {
468
- const updatedFieldArrayValues = hasKey
469
- ? updatedFieldArrayValuesWithKey
470
- : omitKeys(updatedFieldArrayValuesWithKey, keyName);
471
- hasKey && (_shouldKeepKeyName.current = true);
463
+ const updateValues = React.useCallback((updatedFieldArrayValues) => {
472
464
  _actioned.current = true;
473
465
  set(control._formValues, name, updatedFieldArrayValues);
474
- return updatedFieldArrayValues;
475
- }, [control, name, keyName]);
466
+ }, [control, name]);
476
467
  const append$1 = (value, options) => {
477
468
  const appendValue = convertToArrayPayload(cloneObject(value));
478
- const updatedFieldArrayValuesWithKey = append(mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds), mapCurrentIds(appendValue, keyName));
479
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey, appendValue[0][keyName]);
480
- control._names.focus = getFocusFieldName(name, fieldArrayValues.length - 1, options);
481
- setFields(updatedFieldArrayValuesWithKey);
469
+ const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
470
+ control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
471
+ ids.current = append(ids.current, appendValue.map(generateId));
472
+ setFields(updatedFieldArrayValues);
473
+ updateValues(updatedFieldArrayValues);
482
474
  control._updateFieldArray(name, append, {
483
475
  argA: fillEmptyArray(value),
484
- }, fieldArrayValues);
476
+ }, updatedFieldArrayValues);
485
477
  };
486
478
  const prepend$1 = (value, options) => {
487
479
  const prependValue = convertToArrayPayload(cloneObject(value));
488
- const updatedFieldArrayValuesWithKey = prepend(mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds), mapCurrentIds(prependValue, keyName));
489
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey, prependValue[0][keyName]);
480
+ const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
490
481
  control._names.focus = getFocusFieldName(name, 0, options);
491
- setFields(updatedFieldArrayValuesWithKey);
482
+ ids.current = prepend(ids.current, prependValue.map(generateId));
483
+ setFields(updatedFieldArrayValues);
484
+ updateValues(updatedFieldArrayValues);
492
485
  control._updateFieldArray(name, prepend, {
493
486
  argA: fillEmptyArray(value),
494
- }, fieldArrayValues);
487
+ }, updatedFieldArrayValues);
495
488
  };
496
489
  const remove = (index) => {
497
- const updatedFieldArrayValuesWithKey = removeArrayAt(mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds), index);
498
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
499
- setFields(updatedFieldArrayValuesWithKey);
490
+ const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
491
+ ids.current = removeArrayAt(ids.current, index);
492
+ setFields(updatedFieldArrayValues);
493
+ updateValues(updatedFieldArrayValues);
500
494
  control._updateFieldArray(name, removeArrayAt, {
501
495
  argA: index,
502
- }, fieldArrayValues);
496
+ }, updatedFieldArrayValues);
503
497
  };
504
498
  const insert$1 = (index, value, options) => {
505
499
  const insertValue = convertToArrayPayload(cloneObject(value));
506
- const updatedFieldArrayValuesWithKey = insert(mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds), index, mapCurrentIds(insertValue, keyName));
507
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey, insertValue[0][keyName]);
500
+ const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
501
+ updateValues(updatedFieldArrayValues);
508
502
  control._names.focus = getFocusFieldName(name, index, options);
509
- setFields(updatedFieldArrayValuesWithKey);
503
+ ids.current = insert(ids.current, index, insertValue.map(generateId));
504
+ setFields(updatedFieldArrayValues);
510
505
  control._updateFieldArray(name, insert, {
511
506
  argA: index,
512
507
  argB: fillEmptyArray(value),
513
- }, fieldArrayValues);
508
+ }, updatedFieldArrayValues);
514
509
  };
515
510
  const swap = (indexA, indexB) => {
516
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds);
517
- swapArrayAt(updatedFieldArrayValuesWithKey, indexA, indexB);
518
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
519
- setFields(updatedFieldArrayValuesWithKey);
511
+ const updatedFieldArrayValues = control._getFieldArray(name);
512
+ swapArrayAt(updatedFieldArrayValues, indexA, indexB);
513
+ swapArrayAt(ids.current, indexA, indexB);
514
+ setFields(updatedFieldArrayValues);
515
+ updateValues(updatedFieldArrayValues);
520
516
  control._updateFieldArray(name, swapArrayAt, {
521
517
  argA: indexA,
522
518
  argB: indexB,
523
- }, fieldArrayValues, false);
519
+ }, updatedFieldArrayValues, false);
524
520
  };
525
521
  const move = (from, to) => {
526
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds);
527
- moveArrayAt(updatedFieldArrayValuesWithKey, from, to);
528
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
529
- setFields(updatedFieldArrayValuesWithKey);
522
+ const updatedFieldArrayValues = control._getFieldArray(name);
523
+ moveArrayAt(updatedFieldArrayValues, from, to);
524
+ moveArrayAt(ids.current, from, to);
525
+ setFields(updatedFieldArrayValues);
526
+ updateValues(updatedFieldArrayValues);
530
527
  control._updateFieldArray(name, moveArrayAt, {
531
528
  argA: from,
532
529
  argB: to,
533
- }, fieldArrayValues, false);
530
+ }, updatedFieldArrayValues, false);
534
531
  };
535
532
  const update = (index, value) => {
536
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), keyName, _fieldIds);
537
- const updatedFieldArrayValues = updateAt(updatedFieldArrayValuesWithKey, index, value);
538
- _fieldIds.current = mapCurrentIds(updatedFieldArrayValues, keyName);
539
- const fieldArrayValues = updateValues(_fieldIds.current, get(value, keyName));
540
- setFields(_fieldIds.current);
533
+ const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, value);
534
+ ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
535
+ setFields([...updatedFieldArrayValues]);
536
+ updateValues(updatedFieldArrayValues);
541
537
  control._updateFieldArray(name, updateAt, {
542
538
  argA: index,
543
539
  argB: value,
544
- }, fieldArrayValues, true, false, false);
540
+ }, updatedFieldArrayValues, true, false, false);
545
541
  };
546
542
  const replace = (value) => {
547
- const updateValue = convertToArrayPayload(value);
548
- const updatedFieldArrayValuesWithKey = mapCurrentIds(updateValue, keyName);
549
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey, updateValue[0][keyName]);
550
- setFields(updatedFieldArrayValuesWithKey);
551
- control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, fieldArrayValues, true, false, false);
543
+ const updatedFieldArrayValues = convertToArrayPayload(value);
544
+ ids.current = updatedFieldArrayValues.map(generateId);
545
+ updateValues([...updatedFieldArrayValues]);
546
+ setFields([...updatedFieldArrayValues]);
547
+ control._updateFieldArray(name, () => updatedFieldArrayValues, {}, [...updatedFieldArrayValues], true, false, false);
552
548
  };
553
549
  React.useEffect(() => {
554
550
  control._stateFlags.action = false;
@@ -572,25 +568,24 @@ const useFieldArray = (props) => {
572
568
  focusFieldBy(control._fields, (key) => key.startsWith(control._names.focus));
573
569
  control._names.focus = '';
574
570
  control._proxyFormState.isValid && control._updateValid();
575
- }, [fields, name, control, keyName]);
571
+ }, [fields, name, control]);
576
572
  React.useEffect(() => {
577
573
  !get(control._formValues, name) && set(control._formValues, name, []);
578
574
  return () => {
579
- if (control._options.shouldUnregister || shouldUnregister) {
575
+ (control._options.shouldUnregister || shouldUnregister) &&
580
576
  control.unregister(name);
581
- }
582
577
  };
583
578
  }, [name, control, keyName, shouldUnregister]);
584
579
  return {
585
- swap: React.useCallback(swap, [updateValues, name, control, keyName]),
586
- move: React.useCallback(move, [updateValues, name, control, keyName]),
587
- prepend: React.useCallback(prepend$1, [updateValues, name, control, keyName]),
588
- append: React.useCallback(append$1, [updateValues, name, control, keyName]),
589
- remove: React.useCallback(remove, [updateValues, name, control, keyName]),
590
- insert: React.useCallback(insert$1, [updateValues, name, control, keyName]),
591
- update: React.useCallback(update, [updateValues, name, control, keyName]),
592
- replace: React.useCallback(replace, [updateValues, name, control, keyName]),
593
- fields: fields,
580
+ swap: React.useCallback(swap, [updateValues, name, control]),
581
+ move: React.useCallback(move, [updateValues, name, control]),
582
+ prepend: React.useCallback(prepend$1, [updateValues, name, control]),
583
+ append: React.useCallback(append$1, [updateValues, name, control]),
584
+ remove: React.useCallback(remove, [updateValues, name, control]),
585
+ insert: React.useCallback(insert$1, [updateValues, name, control]),
586
+ update: React.useCallback(update, [updateValues, name, control]),
587
+ replace: React.useCallback(replace, [updateValues, name, control]),
588
+ fields: React.useMemo(() => fields.map((field, index) => (Object.assign(Object.assign({}, field), { [keyName]: ids.current[index] || generateId() }))), [fields, keyName]),
594
589
  };
595
590
  };
596
591
 
@@ -679,7 +674,7 @@ var isWeb = typeof window !== 'undefined' &&
679
674
  typeof window.HTMLElement !== 'undefined' &&
680
675
  typeof document !== 'undefined';
681
676
 
682
- var live = (ref) => isHTMLElement(ref) && document.contains(ref);
677
+ var live = (ref) => isHTMLElement(ref) && ref.isConnected;
683
678
 
684
679
  function baseGet(object, updatePath) {
685
680
  const length = updatePath.slice(0, -1).length;
@@ -1176,10 +1171,10 @@ function createFormControl(props = {}) {
1176
1171
  _subjects.state.next({
1177
1172
  errors: _formState.errors,
1178
1173
  }));
1179
- const updateValidAndValue = (name, shouldSkipSetValueAs, ref) => {
1174
+ const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
1180
1175
  const field = get(_fields, name);
1181
1176
  if (field) {
1182
- const defaultValue = get(_formValues, name, get(_defaultValues, name));
1177
+ const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
1183
1178
  isUndefined(defaultValue) ||
1184
1179
  (ref && ref.defaultChecked) ||
1185
1180
  shouldSkipSetValueAs
@@ -1342,7 +1337,8 @@ function createFormControl(props = {}) {
1342
1337
  ? fieldReference.refs.forEach((checkboxRef) => (checkboxRef.checked = Array.isArray(fieldValue)
1343
1338
  ? !!fieldValue.find((data) => data === checkboxRef.value)
1344
1339
  : fieldValue === checkboxRef.value))
1345
- : (fieldReference.refs[0].checked = !!fieldValue);
1340
+ : fieldReference.refs[0] &&
1341
+ (fieldReference.refs[0].checked = !!fieldValue);
1346
1342
  }
1347
1343
  else {
1348
1344
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
@@ -1549,20 +1545,18 @@ function createFormControl(props = {}) {
1549
1545
  };
1550
1546
  const register = (name, options = {}) => {
1551
1547
  let field = get(_fields, name);
1548
+ const disabledIsDefined = isBoolean(options.disabled);
1552
1549
  set(_fields, name, {
1553
1550
  _f: Object.assign(Object.assign(Object.assign({}, (field && field._f ? field._f : { ref: { name } })), { name, mount: true }), options),
1554
1551
  });
1555
1552
  _names.mount.add(name);
1556
- !isUndefined(options.value) &&
1557
- !options.disabled &&
1558
- set(_formValues, name, get(_formValues, name, options.value));
1559
1553
  field
1560
- ? isBoolean(options.disabled) &&
1554
+ ? disabledIsDefined &&
1561
1555
  set(_formValues, name, options.disabled
1562
1556
  ? undefined
1563
1557
  : get(_formValues, name, getFieldValue(field._f)))
1564
- : updateValidAndValue(name, true);
1565
- return Object.assign(Object.assign(Object.assign({}, (isBoolean(options.disabled) ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
1558
+ : updateValidAndValue(name, true, options.value);
1559
+ return Object.assign(Object.assign(Object.assign({}, (disabledIsDefined ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
1566
1560
  ? {
1567
1561
  required: !!options.required,
1568
1562
  min: getRuleValue(options.min),
@@ -1582,16 +1576,21 @@ function createFormControl(props = {}) {
1582
1576
  : ref
1583
1577
  : ref;
1584
1578
  const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
1585
- if (fieldRef === field._f.ref ||
1586
- (radioOrCheckbox &&
1587
- compact(field._f.refs).find((option) => option === fieldRef))) {
1579
+ const refs = field._f.refs || [];
1580
+ if (radioOrCheckbox
1581
+ ? refs.find((option) => option === fieldRef)
1582
+ : fieldRef === field._f.ref) {
1588
1583
  return;
1589
1584
  }
1590
1585
  set(_fields, name, {
1591
- _f: radioOrCheckbox
1592
- ? 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 }),
1586
+ _f: Object.assign(Object.assign({}, field._f), (radioOrCheckbox
1587
+ ? {
1588
+ refs: refs.concat(fieldRef).filter(live),
1589
+ ref: { type: fieldRef.type, name },
1590
+ }
1591
+ : { ref: fieldRef })),
1593
1592
  });
1594
- updateValidAndValue(name, false, fieldRef);
1593
+ updateValidAndValue(name, false, undefined, fieldRef);
1595
1594
  }
1596
1595
  else {
1597
1596
  field = get(_fields, name, {});