react-hook-form 7.22.3 → 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.
Files changed (205) hide show
  1. package/README.md +6 -0
  2. package/dist/constants.d.ts +1 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/controller.d.ts +1 -0
  5. package/dist/controller.d.ts.map +1 -0
  6. package/dist/index.cjs.js +1 -1
  7. package/dist/index.cjs.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.esm.mjs +136 -126
  11. package/dist/index.esm.mjs.map +1 -1
  12. package/dist/index.umd.js +1 -1
  13. package/dist/index.umd.js.map +1 -1
  14. package/dist/logic/appendErrors.d.ts +1 -0
  15. package/dist/logic/appendErrors.d.ts.map +1 -0
  16. package/dist/logic/createFormControl.d.ts +1 -0
  17. package/dist/logic/createFormControl.d.ts.map +1 -0
  18. package/dist/logic/focusFieldBy.d.ts +1 -0
  19. package/dist/logic/focusFieldBy.d.ts.map +1 -0
  20. package/dist/logic/generateId.d.ts +1 -0
  21. package/dist/logic/generateId.d.ts.map +1 -0
  22. package/dist/logic/generateWatchOutput.d.ts +1 -0
  23. package/dist/logic/generateWatchOutput.d.ts.map +1 -0
  24. package/dist/logic/getCheckboxValue.d.ts +1 -0
  25. package/dist/logic/getCheckboxValue.d.ts.map +1 -0
  26. package/dist/logic/getDirtyFields.d.ts +1 -0
  27. package/dist/logic/getDirtyFields.d.ts.map +1 -0
  28. package/dist/logic/getEventValue.d.ts +1 -0
  29. package/dist/logic/getEventValue.d.ts.map +1 -0
  30. package/dist/logic/getFieldValue.d.ts +1 -0
  31. package/dist/logic/getFieldValue.d.ts.map +1 -0
  32. package/dist/logic/getFieldValueAs.d.ts +1 -0
  33. package/dist/logic/getFieldValueAs.d.ts.map +1 -0
  34. package/dist/logic/getFocusFieldName.d.ts +1 -0
  35. package/dist/logic/getFocusFieldName.d.ts.map +1 -0
  36. package/dist/logic/getNodeParentName.d.ts +1 -0
  37. package/dist/logic/getNodeParentName.d.ts.map +1 -0
  38. package/dist/logic/getProxyFormState.d.ts +1 -0
  39. package/dist/logic/getProxyFormState.d.ts.map +1 -0
  40. package/dist/logic/getRadioValue.d.ts +1 -0
  41. package/dist/logic/getRadioValue.d.ts.map +1 -0
  42. package/dist/logic/getResolverOptions.d.ts +1 -0
  43. package/dist/logic/getResolverOptions.d.ts.map +1 -0
  44. package/dist/logic/getRuleValue.d.ts +1 -0
  45. package/dist/logic/getRuleValue.d.ts.map +1 -0
  46. package/dist/logic/getValidateError.d.ts +1 -0
  47. package/dist/logic/getValidateError.d.ts.map +1 -0
  48. package/dist/logic/getValueAndMessage.d.ts +1 -0
  49. package/dist/logic/getValueAndMessage.d.ts.map +1 -0
  50. package/dist/logic/hasValidation.d.ts +1 -0
  51. package/dist/logic/hasValidation.d.ts.map +1 -0
  52. package/dist/logic/index.d.ts +1 -0
  53. package/dist/logic/index.d.ts.map +1 -0
  54. package/dist/logic/isNameInFieldArray.d.ts +1 -0
  55. package/dist/logic/isNameInFieldArray.d.ts.map +1 -0
  56. package/dist/logic/isWatched.d.ts +1 -0
  57. package/dist/logic/isWatched.d.ts.map +1 -0
  58. package/dist/logic/schemaErrorLookup.d.ts +1 -0
  59. package/dist/logic/schemaErrorLookup.d.ts.map +1 -0
  60. package/dist/logic/setCustomValidty.d.ts +1 -0
  61. package/dist/logic/setCustomValidty.d.ts.map +1 -0
  62. package/dist/logic/shouldRenderFormState.d.ts +1 -0
  63. package/dist/logic/shouldRenderFormState.d.ts.map +1 -0
  64. package/dist/logic/shouldSubscribeByName.d.ts +1 -0
  65. package/dist/logic/shouldSubscribeByName.d.ts.map +1 -0
  66. package/dist/logic/skipValidation.d.ts +1 -0
  67. package/dist/logic/skipValidation.d.ts.map +1 -0
  68. package/dist/logic/unsetEmptyArray.d.ts +1 -0
  69. package/dist/logic/unsetEmptyArray.d.ts.map +1 -0
  70. package/dist/logic/validateField.d.ts +1 -0
  71. package/dist/logic/validateField.d.ts.map +1 -0
  72. package/dist/types/controller.d.ts +1 -0
  73. package/dist/types/controller.d.ts.map +1 -0
  74. package/dist/types/errors.d.ts +1 -0
  75. package/dist/types/errors.d.ts.map +1 -0
  76. package/dist/types/events.d.ts +1 -0
  77. package/dist/types/events.d.ts.map +1 -0
  78. package/dist/types/fieldArray.d.ts +2 -1
  79. package/dist/types/fieldArray.d.ts.map +1 -0
  80. package/dist/types/fields.d.ts +1 -0
  81. package/dist/types/fields.d.ts.map +1 -0
  82. package/dist/types/form.d.ts +10 -8
  83. package/dist/types/form.d.ts.map +1 -0
  84. package/dist/types/index.d.ts +2 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/path/common.d.ts +316 -0
  87. package/dist/types/path/common.d.ts.map +1 -0
  88. package/dist/types/path/eager.d.ts +82 -0
  89. package/dist/types/path/eager.d.ts.map +1 -0
  90. package/dist/types/path/index.d.ts +4 -0
  91. package/dist/types/path/index.d.ts.map +1 -0
  92. package/dist/types/resolvers.d.ts +1 -0
  93. package/dist/types/resolvers.d.ts.map +1 -0
  94. package/dist/types/utils.d.ts +20 -25
  95. package/dist/types/utils.d.ts.map +1 -0
  96. package/dist/types/validator.d.ts +2 -1
  97. package/dist/types/validator.d.ts.map +1 -0
  98. package/dist/useController.d.ts +1 -0
  99. package/dist/useController.d.ts.map +1 -0
  100. package/dist/useFieldArray.d.ts +1 -0
  101. package/dist/useFieldArray.d.ts.map +1 -0
  102. package/dist/useForm.d.ts +1 -0
  103. package/dist/useForm.d.ts.map +1 -0
  104. package/dist/useFormContext.d.ts +1 -0
  105. package/dist/useFormContext.d.ts.map +1 -0
  106. package/dist/useFormState.d.ts +1 -0
  107. package/dist/useFormState.d.ts.map +1 -0
  108. package/dist/useSubscribe.d.ts +1 -0
  109. package/dist/useSubscribe.d.ts.map +1 -0
  110. package/dist/useWatch.d.ts +1 -0
  111. package/dist/useWatch.d.ts.map +1 -0
  112. package/dist/utils/append.d.ts +1 -0
  113. package/dist/utils/append.d.ts.map +1 -0
  114. package/dist/utils/cloneObject.d.ts +1 -0
  115. package/dist/utils/cloneObject.d.ts.map +1 -0
  116. package/dist/utils/compact.d.ts +2 -1
  117. package/dist/utils/compact.d.ts.map +1 -0
  118. package/dist/utils/convertToArrayPayload.d.ts +1 -0
  119. package/dist/utils/convertToArrayPayload.d.ts.map +1 -0
  120. package/dist/utils/createSubject.d.ts +1 -0
  121. package/dist/utils/createSubject.d.ts.map +1 -0
  122. package/dist/utils/deepEqual.d.ts +1 -0
  123. package/dist/utils/deepEqual.d.ts.map +1 -0
  124. package/dist/utils/deepMerge.d.ts +1 -0
  125. package/dist/utils/deepMerge.d.ts.map +1 -0
  126. package/dist/utils/fillBooleanArray.d.ts +1 -0
  127. package/dist/utils/fillBooleanArray.d.ts.map +1 -0
  128. package/dist/utils/fillEmptyArray.d.ts +1 -0
  129. package/dist/utils/fillEmptyArray.d.ts.map +1 -0
  130. package/dist/utils/get.d.ts +1 -0
  131. package/dist/utils/get.d.ts.map +1 -0
  132. package/dist/utils/getValidationModes.d.ts +1 -0
  133. package/dist/utils/getValidationModes.d.ts.map +1 -0
  134. package/dist/utils/index.d.ts +1 -0
  135. package/dist/utils/index.d.ts.map +1 -0
  136. package/dist/utils/insert.d.ts +1 -0
  137. package/dist/utils/insert.d.ts.map +1 -0
  138. package/dist/utils/isBoolean.d.ts +1 -0
  139. package/dist/utils/isBoolean.d.ts.map +1 -0
  140. package/dist/utils/isCheckBoxInput.d.ts +1 -0
  141. package/dist/utils/isCheckBoxInput.d.ts.map +1 -0
  142. package/dist/utils/isDateObject.d.ts +2 -1
  143. package/dist/utils/isDateObject.d.ts.map +1 -0
  144. package/dist/utils/isEmptyObject.d.ts +1 -0
  145. package/dist/utils/isEmptyObject.d.ts.map +1 -0
  146. package/dist/utils/isFileInput.d.ts +1 -0
  147. package/dist/utils/isFileInput.d.ts.map +1 -0
  148. package/dist/utils/isFunction.d.ts +1 -0
  149. package/dist/utils/isFunction.d.ts.map +1 -0
  150. package/dist/utils/isHTMLElement.d.ts +1 -0
  151. package/dist/utils/isHTMLElement.d.ts.map +1 -0
  152. package/dist/utils/isKey.d.ts +1 -0
  153. package/dist/utils/isKey.d.ts.map +1 -0
  154. package/dist/utils/isMessage.d.ts +1 -0
  155. package/dist/utils/isMessage.d.ts.map +1 -0
  156. package/dist/utils/isMultipleSelect.d.ts +1 -0
  157. package/dist/utils/isMultipleSelect.d.ts.map +1 -0
  158. package/dist/utils/isNullOrUndefined.d.ts +1 -0
  159. package/dist/utils/isNullOrUndefined.d.ts.map +1 -0
  160. package/dist/utils/isObject.d.ts +1 -0
  161. package/dist/utils/isObject.d.ts.map +1 -0
  162. package/dist/utils/isPrimitive.d.ts +1 -0
  163. package/dist/utils/isPrimitive.d.ts.map +1 -0
  164. package/dist/utils/isRadioInput.d.ts +1 -0
  165. package/dist/utils/isRadioInput.d.ts.map +1 -0
  166. package/dist/utils/isRadioOrCheckbox.d.ts +1 -0
  167. package/dist/utils/isRadioOrCheckbox.d.ts.map +1 -0
  168. package/dist/utils/isRegex.d.ts +1 -0
  169. package/dist/utils/isRegex.d.ts.map +1 -0
  170. package/dist/utils/isSelectInput.d.ts +1 -0
  171. package/dist/utils/isSelectInput.d.ts.map +1 -0
  172. package/dist/utils/isString.d.ts +1 -0
  173. package/dist/utils/isString.d.ts.map +1 -0
  174. package/dist/utils/isUndefined.d.ts +1 -0
  175. package/dist/utils/isUndefined.d.ts.map +1 -0
  176. package/dist/utils/isWeb.d.ts +1 -0
  177. package/dist/utils/isWeb.d.ts.map +1 -0
  178. package/dist/utils/live.d.ts +1 -0
  179. package/dist/utils/live.d.ts.map +1 -0
  180. package/dist/utils/move.d.ts +1 -0
  181. package/dist/utils/move.d.ts.map +1 -0
  182. package/dist/utils/objectHasFunction.d.ts +1 -0
  183. package/dist/utils/objectHasFunction.d.ts.map +1 -0
  184. package/dist/utils/omit.d.ts +1 -0
  185. package/dist/utils/omit.d.ts.map +1 -0
  186. package/dist/utils/omitKeys.d.ts +1 -0
  187. package/dist/utils/omitKeys.d.ts.map +1 -0
  188. package/dist/utils/prepend.d.ts +1 -0
  189. package/dist/utils/prepend.d.ts.map +1 -0
  190. package/dist/utils/remove.d.ts +1 -0
  191. package/dist/utils/remove.d.ts.map +1 -0
  192. package/dist/utils/set.d.ts +1 -0
  193. package/dist/utils/set.d.ts.map +1 -0
  194. package/dist/utils/stringToPath.d.ts +1 -0
  195. package/dist/utils/stringToPath.d.ts.map +1 -0
  196. package/dist/utils/swap.d.ts +1 -0
  197. package/dist/utils/swap.d.ts.map +1 -0
  198. package/dist/utils/unset.d.ts +1 -0
  199. package/dist/utils/unset.d.ts.map +1 -0
  200. package/dist/utils/update.d.ts +2 -1
  201. package/dist/utils/update.d.ts.map +1 -0
  202. package/package.json +24 -20
  203. package/CHANGELOG.md +0 -1311
  204. package/dist/logic/mapCurrentIds.d.ts +0 -5
  205. package/dist/logic/mapId.d.ts +0 -3
package/dist/index.d.ts CHANGED
@@ -8,3 +8,4 @@ export * from './useFormContext';
8
8
  export * from './useFormState';
9
9
  export * from './useWatch';
10
10
  export * from './utils';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -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 = {
@@ -143,11 +143,12 @@ function useFormState(props) {
143
143
  });
144
144
  const _name = React.useRef(name);
145
145
  _name.current = name;
146
+ const callback = React.useCallback((value) => shouldSubscribeByName(_name.current, value.name, exact) &&
147
+ shouldRenderFormState(value, _localProxyFormState.current) &&
148
+ updateFormState(Object.assign(Object.assign({}, control._formState), value)), [control, exact]);
146
149
  useSubscribe({
147
150
  disabled,
148
- callback: (value) => shouldSubscribeByName(_name.current, value.name, exact) &&
149
- shouldRenderFormState(value, _localProxyFormState.current) &&
150
- updateFormState(Object.assign(Object.assign({}, control._formState), value)),
151
+ callback,
151
152
  subject: control._subjects.state,
152
153
  });
153
154
  return getProxyFormState(formState, control._proxyFormState, _localProxyFormState.current, false);
@@ -185,19 +186,22 @@ function useWatch(props) {
185
186
  const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
186
187
  const _name = React.useRef(name);
187
188
  _name.current = name;
189
+ const callback = React.useCallback((formState) => {
190
+ if (shouldSubscribeByName(_name.current, formState.name, exact)) {
191
+ const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
192
+ updateValue(isUndefined(_name.current) ||
193
+ (isObject(fieldValues) && !objectHasFunction(fieldValues))
194
+ ? Object.assign({}, fieldValues) : Array.isArray(fieldValues)
195
+ ? [...fieldValues]
196
+ : isUndefined(fieldValues)
197
+ ? defaultValue
198
+ : fieldValues);
199
+ }
200
+ }, [control, exact, defaultValue]);
188
201
  useSubscribe({
189
202
  disabled,
190
203
  subject: control._subjects.watch,
191
- callback: (formState) => {
192
- if (shouldSubscribeByName(_name.current, formState.name, exact)) {
193
- const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
194
- updateValue(isUndefined(_name.current) ||
195
- (isObject(fieldValues) && !objectHasFunction(fieldValues))
196
- ? Object.assign({}, fieldValues) : Array.isArray(fieldValues)
197
- ? [...fieldValues]
198
- : fieldValues);
199
- }
200
- },
204
+ callback,
201
205
  });
202
206
  const [value, updateValue] = React.useState(isUndefined(defaultValue)
203
207
  ? control._getWatch(name)
@@ -339,6 +343,14 @@ const focusFieldBy = (fields, callback, fieldsNames) => {
339
343
  }
340
344
  };
341
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
+
342
354
  var getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)
343
355
  ? options.focusName ||
344
356
  `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`
@@ -350,23 +362,8 @@ var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
350
362
  [..._names.watch].some((watchName) => name.startsWith(watchName) &&
351
363
  /^\.\w+/.test(name.slice(watchName.length))));
352
364
 
353
- var mapCurrentIds = (values, _fieldIds, keyName) => values.map((value, index) => {
354
- const output = _fieldIds.current[index];
355
- return Object.assign(Object.assign({}, value), (output ? { [keyName]: output[keyName] } : {}));
356
- });
357
-
358
- var generateId = () => {
359
- const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
360
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
361
- const r = (Math.random() * 16 + d) % 16 | 0;
362
- return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
363
- });
364
- };
365
-
366
- var mapIds = (values = [], keyName) => values.map((value) => (Object.assign(Object.assign({}, (value[keyName] ? {} : { [keyName]: generateId() })), value)));
367
-
368
365
  function append(data, value) {
369
- return [...convertToArrayPayload(data), ...convertToArrayPayload(value)];
366
+ return [...data, ...convertToArrayPayload(value)];
370
367
  }
371
368
 
372
369
  function cloneObject(data) {
@@ -415,8 +412,6 @@ var moveArrayAt = (data, from, to) => {
415
412
  return [];
416
413
  };
417
414
 
418
- var omitKeys = (fields, keyName) => fields.map((field = {}) => omit(field, keyName));
419
-
420
415
  function prepend(data, value) {
421
416
  return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];
422
417
  }
@@ -446,100 +441,110 @@ var updateAt = (fieldValues, index, value) => {
446
441
  const useFieldArray = (props) => {
447
442
  const methods = useFormContext();
448
443
  const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;
449
- const [fields, setFields] = React.useState(mapIds(control._getFieldArray(name), keyName));
444
+ const [fields, setFields] = React.useState(control._getFieldArray(name));
445
+ const ids = React.useRef(control._getFieldArray(name).map(generateId));
450
446
  const _fieldIds = React.useRef(fields);
451
447
  const _name = React.useRef(name);
452
448
  const _actioned = React.useRef(false);
453
449
  _name.current = name;
454
450
  _fieldIds.current = fields;
455
451
  control._names.array.add(name);
452
+ const callback = React.useCallback(({ values, name: fieldArrayName }) => {
453
+ if (fieldArrayName === _name.current || !fieldArrayName) {
454
+ const fieldValues = get(values, _name.current, []);
455
+ setFields(fieldValues);
456
+ ids.current = fieldValues.map(generateId);
457
+ }
458
+ }, []);
456
459
  useSubscribe({
457
- callback: ({ values, name: fieldArrayName }) => {
458
- if (fieldArrayName === _name.current || !fieldArrayName) {
459
- setFields(mapIds(get(values, _name.current), keyName));
460
- }
461
- },
460
+ callback,
462
461
  subject: control._subjects.array,
463
462
  });
464
- const updateValues = React.useCallback((updatedFieldArrayValuesWithKey) => {
465
- const updatedFieldArrayValues = omitKeys(updatedFieldArrayValuesWithKey, keyName);
463
+ const updateValues = React.useCallback((updatedFieldArrayValues) => {
466
464
  _actioned.current = true;
467
465
  set(control._formValues, name, updatedFieldArrayValues);
468
- return updatedFieldArrayValues;
469
- }, [control, name, keyName]);
466
+ }, [control, name]);
470
467
  const append$1 = (value, options) => {
471
468
  const appendValue = convertToArrayPayload(cloneObject(value));
472
- const updatedFieldArrayValuesWithKey = append(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(appendValue, keyName));
473
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
474
- control._names.focus = getFocusFieldName(name, fieldArrayValues.length - 1, options);
475
- 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);
476
474
  control._updateFieldArray(name, append, {
477
475
  argA: fillEmptyArray(value),
478
- }, fieldArrayValues);
476
+ }, updatedFieldArrayValues);
479
477
  };
480
478
  const prepend$1 = (value, options) => {
481
- const updatedFieldArrayValuesWithKey = prepend(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(convertToArrayPayload(cloneObject(value)), keyName));
482
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
479
+ const prependValue = convertToArrayPayload(cloneObject(value));
480
+ const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
483
481
  control._names.focus = getFocusFieldName(name, 0, options);
484
- setFields(updatedFieldArrayValuesWithKey);
482
+ ids.current = prepend(ids.current, prependValue.map(generateId));
483
+ setFields(updatedFieldArrayValues);
484
+ updateValues(updatedFieldArrayValues);
485
485
  control._updateFieldArray(name, prepend, {
486
486
  argA: fillEmptyArray(value),
487
- }, fieldArrayValues);
487
+ }, updatedFieldArrayValues);
488
488
  };
489
489
  const remove = (index) => {
490
- const updatedFieldArrayValuesWithKey = removeArrayAt(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index);
491
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
492
- setFields(updatedFieldArrayValuesWithKey);
490
+ const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
491
+ ids.current = removeArrayAt(ids.current, index);
492
+ setFields(updatedFieldArrayValues);
493
+ updateValues(updatedFieldArrayValues);
493
494
  control._updateFieldArray(name, removeArrayAt, {
494
495
  argA: index,
495
- }, fieldArrayValues);
496
+ }, updatedFieldArrayValues);
496
497
  };
497
498
  const insert$1 = (index, value, options) => {
498
- const updatedFieldArrayValuesWithKey = insert(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index, mapIds(convertToArrayPayload(cloneObject(value)), keyName));
499
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
499
+ const insertValue = convertToArrayPayload(cloneObject(value));
500
+ const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
501
+ updateValues(updatedFieldArrayValues);
500
502
  control._names.focus = getFocusFieldName(name, index, options);
501
- setFields(updatedFieldArrayValuesWithKey);
503
+ ids.current = insert(ids.current, index, insertValue.map(generateId));
504
+ setFields(updatedFieldArrayValues);
502
505
  control._updateFieldArray(name, insert, {
503
506
  argA: index,
504
507
  argB: fillEmptyArray(value),
505
- }, fieldArrayValues);
508
+ }, updatedFieldArrayValues);
506
509
  };
507
510
  const swap = (indexA, indexB) => {
508
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
509
- swapArrayAt(updatedFieldArrayValuesWithKey, indexA, indexB);
510
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
511
- 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);
512
516
  control._updateFieldArray(name, swapArrayAt, {
513
517
  argA: indexA,
514
518
  argB: indexB,
515
- }, fieldArrayValues, false);
519
+ }, updatedFieldArrayValues, false);
516
520
  };
517
521
  const move = (from, to) => {
518
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
519
- moveArrayAt(updatedFieldArrayValuesWithKey, from, to);
520
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
521
- 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);
522
527
  control._updateFieldArray(name, moveArrayAt, {
523
528
  argA: from,
524
529
  argB: to,
525
- }, fieldArrayValues, false);
530
+ }, updatedFieldArrayValues, false);
526
531
  };
527
532
  const update = (index, value) => {
528
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
529
- const updatedFieldArrayValues = updateAt(updatedFieldArrayValuesWithKey, index, value);
530
- _fieldIds.current = mapIds(updatedFieldArrayValues, keyName);
531
- const fieldArrayValues = updateValues(_fieldIds.current);
532
- 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);
533
537
  control._updateFieldArray(name, updateAt, {
534
538
  argA: index,
535
539
  argB: value,
536
- }, fieldArrayValues, true, false);
540
+ }, updatedFieldArrayValues, true, false, false);
537
541
  };
538
542
  const replace = (value) => {
539
- const updatedFieldArrayValuesWithKey = mapIds(convertToArrayPayload(value), keyName);
540
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
541
- setFields(updatedFieldArrayValuesWithKey);
542
- control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, fieldArrayValues, true, 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);
543
548
  };
544
549
  React.useEffect(() => {
545
550
  control._stateFlags.action = false;
@@ -563,25 +568,24 @@ const useFieldArray = (props) => {
563
568
  focusFieldBy(control._fields, (key) => key.startsWith(control._names.focus));
564
569
  control._names.focus = '';
565
570
  control._proxyFormState.isValid && control._updateValid();
566
- }, [fields, name, control, keyName]);
571
+ }, [fields, name, control]);
567
572
  React.useEffect(() => {
568
573
  !get(control._formValues, name) && set(control._formValues, name, []);
569
574
  return () => {
570
- if (control._options.shouldUnregister || shouldUnregister) {
575
+ (control._options.shouldUnregister || shouldUnregister) &&
571
576
  control.unregister(name);
572
- }
573
577
  };
574
578
  }, [name, control, keyName, shouldUnregister]);
575
579
  return {
576
- swap: React.useCallback(swap, [updateValues, name, control, keyName]),
577
- move: React.useCallback(move, [updateValues, name, control, keyName]),
578
- prepend: React.useCallback(prepend$1, [updateValues, name, control, keyName]),
579
- append: React.useCallback(append$1, [updateValues, name, control, keyName]),
580
- remove: React.useCallback(remove, [updateValues, name, control, keyName]),
581
- insert: React.useCallback(insert$1, [updateValues, name, control, keyName]),
582
- update: React.useCallback(update, [updateValues, name, control, keyName]),
583
- replace: React.useCallback(replace, [updateValues, name, control, keyName]),
584
- 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]),
585
589
  };
586
590
  };
587
591
 
@@ -670,7 +674,7 @@ var isWeb = typeof window !== 'undefined' &&
670
674
  typeof window.HTMLElement !== 'undefined' &&
671
675
  typeof document !== 'undefined';
672
676
 
673
- var live = (ref) => isHTMLElement(ref) && document.contains(ref);
677
+ var live = (ref) => isHTMLElement(ref) && ref.isConnected;
674
678
 
675
679
  function baseGet(object, updatePath) {
676
680
  const length = updatePath.slice(0, -1).length;
@@ -1136,13 +1140,13 @@ function createFormControl(props = {}) {
1136
1140
  }
1137
1141
  return isValid;
1138
1142
  };
1139
- const _updateFieldArray = (name, method, args, values = [], shouldSetValues = true, shouldSetFields = true) => {
1143
+ const _updateFieldArray = (name, method, args, values = [], shouldSetValues = true, shouldSetFields = true, shouldSetError = true) => {
1140
1144
  _stateFlags.action = true;
1141
1145
  if (shouldSetFields && get(_fields, name)) {
1142
1146
  const fieldValues = method(get(_fields, name), args.argA, args.argB);
1143
1147
  shouldSetValues && set(_fields, name, fieldValues);
1144
1148
  }
1145
- if (Array.isArray(get(_formState.errors, name))) {
1149
+ if (shouldSetError && Array.isArray(get(_formState.errors, name))) {
1146
1150
  const errors = method(get(_formState.errors, name), args.argA, args.argB);
1147
1151
  shouldSetValues && set(_formState.errors, name, errors);
1148
1152
  unsetEmptyArray(_formState.errors, name);
@@ -1167,17 +1171,17 @@ function createFormControl(props = {}) {
1167
1171
  _subjects.state.next({
1168
1172
  errors: _formState.errors,
1169
1173
  }));
1170
- const updateValidAndValue = (name, shouldSkipSetValueAs, ref) => {
1174
+ const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
1171
1175
  const field = get(_fields, name);
1172
1176
  if (field) {
1173
- const defaultValue = get(_formValues, name, get(_defaultValues, name));
1177
+ const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
1174
1178
  isUndefined(defaultValue) ||
1175
1179
  (ref && ref.defaultChecked) ||
1176
1180
  shouldSkipSetValueAs
1177
1181
  ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
1178
1182
  : setFieldValue(name, defaultValue);
1183
+ _stateFlags.mount && _updateValid();
1179
1184
  }
1180
- _stateFlags.mount && _updateValid();
1181
1185
  };
1182
1186
  const updateTouchAndDirty = (name, fieldValue, isCurrentTouched, shouldRender = true) => {
1183
1187
  let isFieldDirty = false;
@@ -1318,7 +1322,8 @@ function createFormControl(props = {}) {
1318
1322
  if (field) {
1319
1323
  const fieldReference = field._f;
1320
1324
  if (fieldReference) {
1321
- set(_formValues, name, getFieldValueAs(value, fieldReference));
1325
+ !fieldReference.disabled &&
1326
+ set(_formValues, name, getFieldValueAs(value, fieldReference));
1322
1327
  fieldValue =
1323
1328
  isWeb && isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)
1324
1329
  ? ''
@@ -1332,7 +1337,8 @@ function createFormControl(props = {}) {
1332
1337
  ? fieldReference.refs.forEach((checkboxRef) => (checkboxRef.checked = Array.isArray(fieldValue)
1333
1338
  ? !!fieldValue.find((data) => data === checkboxRef.value)
1334
1339
  : fieldValue === checkboxRef.value))
1335
- : (fieldReference.refs[0].checked = !!fieldValue);
1340
+ : fieldReference.refs[0] &&
1341
+ (fieldReference.refs[0].checked = !!fieldValue);
1336
1342
  }
1337
1343
  else {
1338
1344
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
@@ -1539,20 +1545,18 @@ function createFormControl(props = {}) {
1539
1545
  };
1540
1546
  const register = (name, options = {}) => {
1541
1547
  let field = get(_fields, name);
1548
+ const disabledIsDefined = isBoolean(options.disabled);
1542
1549
  set(_fields, name, {
1543
1550
  _f: Object.assign(Object.assign(Object.assign({}, (field && field._f ? field._f : { ref: { name } })), { name, mount: true }), options),
1544
1551
  });
1545
1552
  _names.mount.add(name);
1546
- !isUndefined(options.value) &&
1547
- !options.disabled &&
1548
- set(_formValues, name, get(_formValues, name, options.value));
1549
1553
  field
1550
- ? isBoolean(options.disabled) &&
1554
+ ? disabledIsDefined &&
1551
1555
  set(_formValues, name, options.disabled
1552
1556
  ? undefined
1553
1557
  : get(_formValues, name, getFieldValue(field._f)))
1554
- : updateValidAndValue(name, true);
1555
- 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
1556
1560
  ? {
1557
1561
  required: !!options.required,
1558
1562
  min: getRuleValue(options.min),
@@ -1572,16 +1576,21 @@ function createFormControl(props = {}) {
1572
1576
  : ref
1573
1577
  : ref;
1574
1578
  const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
1575
- if (fieldRef === field._f.ref ||
1576
- (radioOrCheckbox &&
1577
- 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) {
1578
1583
  return;
1579
1584
  }
1580
1585
  set(_fields, name, {
1581
- _f: radioOrCheckbox
1582
- ? 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 })),
1583
1592
  });
1584
- !options.disabled && updateValidAndValue(name, false, fieldRef);
1593
+ updateValidAndValue(name, false, undefined, fieldRef);
1585
1594
  }
1586
1595
  else {
1587
1596
  field = get(_fields, name, {});
@@ -1840,14 +1849,15 @@ function useForm(props = {}) {
1840
1849
  _formControl.current = Object.assign(Object.assign({}, createFormControl(props)), { formState });
1841
1850
  }
1842
1851
  const control = _formControl.current.control;
1852
+ const callback = React.useCallback((value) => {
1853
+ if (shouldRenderFormState(value, control._proxyFormState, true)) {
1854
+ control._formState = Object.assign(Object.assign({}, control._formState), value);
1855
+ updateFormState(Object.assign({}, control._formState));
1856
+ }
1857
+ }, [control]);
1843
1858
  useSubscribe({
1844
1859
  subject: control._subjects.state,
1845
- callback: (value) => {
1846
- if (shouldRenderFormState(value, control._proxyFormState, true)) {
1847
- control._formState = Object.assign(Object.assign({}, control._formState), value);
1848
- updateFormState(Object.assign({}, control._formState));
1849
- }
1850
- },
1860
+ callback,
1851
1861
  });
1852
1862
  React.useEffect(() => {
1853
1863
  if (!control._stateFlags.mount) {