react-hook-form 7.25.0 → 8.0.0-alpha.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 (113) hide show
  1. package/README.md +15 -4
  2. package/dist/__typetests__/__fixtures__/index.d.ts +2 -0
  3. package/dist/__typetests__/__fixtures__/index.d.ts.map +1 -0
  4. package/dist/__typetests__/__fixtures__/type.d.ts +12 -0
  5. package/dist/__typetests__/__fixtures__/type.d.ts.map +1 -0
  6. package/dist/__typetests__/types/__fixtures__/index.d.ts +4 -0
  7. package/dist/__typetests__/types/__fixtures__/index.d.ts.map +1 -0
  8. package/dist/__typetests__/types/__fixtures__/pathString.d.ts +4 -0
  9. package/dist/__typetests__/types/__fixtures__/pathString.d.ts.map +1 -0
  10. package/dist/__typetests__/types/__fixtures__/traversable.d.ts +14 -0
  11. package/dist/__typetests__/types/__fixtures__/traversable.d.ts.map +1 -0
  12. package/dist/__typetests__/types/__fixtures__/tuple.d.ts +15 -0
  13. package/dist/__typetests__/types/__fixtures__/tuple.d.ts.map +1 -0
  14. package/dist/__typetests__/types/form.test-d.d.ts +2 -0
  15. package/dist/__typetests__/types/form.test-d.d.ts.map +1 -0
  16. package/dist/__typetests__/types/path/auto.test-d.d.ts +2 -0
  17. package/dist/__typetests__/types/path/auto.test-d.d.ts.map +1 -0
  18. package/dist/__typetests__/types/path/internal/autoCompletePath.test-d.d.ts +2 -0
  19. package/dist/__typetests__/types/path/internal/autoCompletePath.test-d.d.ts.map +1 -0
  20. package/dist/__typetests__/types/path/internal/hasPath.test-d.d.ts +2 -0
  21. package/dist/__typetests__/types/path/internal/hasPath.test-d.d.ts.map +1 -0
  22. package/dist/__typetests__/types/path/internal/keys.test-d.d.ts +2 -0
  23. package/dist/__typetests__/types/path/internal/keys.test-d.d.ts.map +1 -0
  24. package/dist/__typetests__/types/path/internal/pathGetValue.test-d.d.ts +2 -0
  25. package/dist/__typetests__/types/path/internal/pathGetValue.test-d.d.ts.map +1 -0
  26. package/dist/__typetests__/types/path/internal/pathSetValue.test-d.d.ts +2 -0
  27. package/dist/__typetests__/types/path/internal/pathSetValue.test-d.d.ts.map +1 -0
  28. package/dist/__typetests__/types/path/internal/pathTuple.test-d.d.ts +2 -0
  29. package/dist/__typetests__/types/path/internal/pathTuple.test-d.d.ts.map +1 -0
  30. package/dist/__typetests__/types/path/internal/utils.test-d.d.ts +2 -0
  31. package/dist/__typetests__/types/path/internal/utils.test-d.d.ts.map +1 -0
  32. package/dist/__typetests__/types/path/lazy.test-d.d.ts +2 -0
  33. package/dist/__typetests__/types/path/lazy.test-d.d.ts.map +1 -0
  34. package/dist/__typetests__/types/path/value.test-d.d.ts +2 -0
  35. package/dist/__typetests__/types/path/value.test-d.d.ts.map +1 -0
  36. package/dist/__typetests__/types/util.test-d.d.ts +2 -0
  37. package/dist/__typetests__/types/util.test-d.d.ts.map +1 -0
  38. package/dist/__typetests__/utils/join.test-d.d.ts +2 -0
  39. package/dist/__typetests__/utils/join.test-d.d.ts.map +1 -0
  40. package/dist/__typetests__/utils/of.test-d.d.ts +2 -0
  41. package/dist/__typetests__/utils/of.test-d.d.ts.map +1 -0
  42. package/dist/constants.d.ts +1 -0
  43. package/dist/constants.d.ts.map +1 -1
  44. package/dist/controller.d.ts +1 -1
  45. package/dist/controller.d.ts.map +1 -1
  46. package/dist/index.cjs.js +1 -1
  47. package/dist/index.cjs.js.map +1 -1
  48. package/dist/index.esm.mjs +113 -90
  49. package/dist/index.esm.mjs.map +1 -1
  50. package/dist/index.umd.js +1 -1
  51. package/dist/index.umd.js.map +1 -1
  52. package/dist/logic/createFormControl.d.ts.map +1 -1
  53. package/dist/logic/getProxyFormState.d.ts.map +1 -1
  54. package/dist/logic/getResolverOptions.d.ts +2 -2
  55. package/dist/logic/hasValidation.d.ts +1 -1
  56. package/dist/logic/validateField.d.ts.map +1 -1
  57. package/dist/types/controller.d.ts +6 -6
  58. package/dist/types/controller.d.ts.map +1 -1
  59. package/dist/types/fieldArray.d.ts +7 -9
  60. package/dist/types/fieldArray.d.ts.map +1 -1
  61. package/dist/types/form.d.ts +26 -27
  62. package/dist/types/form.d.ts.map +1 -1
  63. package/dist/types/path/auto.d.ts +76 -0
  64. package/dist/types/path/auto.d.ts.map +1 -0
  65. package/dist/types/path/branded.d.ts +61 -0
  66. package/dist/types/path/branded.d.ts.map +1 -0
  67. package/dist/types/path/index.d.ts +7 -3
  68. package/dist/types/path/index.d.ts.map +1 -1
  69. package/dist/types/path/internal/autoCompletePath.d.ts +173 -0
  70. package/dist/types/path/internal/autoCompletePath.d.ts.map +1 -0
  71. package/dist/types/path/internal/hasPath.d.ts +56 -0
  72. package/dist/types/path/internal/hasPath.d.ts.map +1 -0
  73. package/dist/types/path/internal/keys.d.ts +103 -0
  74. package/dist/types/path/internal/keys.d.ts.map +1 -0
  75. package/dist/types/path/internal/pathGetValue.d.ts +76 -0
  76. package/dist/types/path/internal/pathGetValue.d.ts.map +1 -0
  77. package/dist/types/path/internal/pathSetValue.d.ts +96 -0
  78. package/dist/types/path/internal/pathSetValue.d.ts.map +1 -0
  79. package/dist/types/path/internal/pathTuple.d.ts +73 -0
  80. package/dist/types/path/internal/pathTuple.d.ts.map +1 -0
  81. package/dist/types/path/internal/utils.d.ts +84 -0
  82. package/dist/types/path/internal/utils.d.ts.map +1 -0
  83. package/dist/types/path/lazy.d.ts +62 -0
  84. package/dist/types/path/lazy.d.ts.map +1 -0
  85. package/dist/types/path/pathString.d.ts +6 -0
  86. package/dist/types/path/pathString.d.ts.map +1 -0
  87. package/dist/types/path/value.d.ts +49 -0
  88. package/dist/types/path/value.d.ts.map +1 -0
  89. package/dist/types/utils.d.ts +11 -2
  90. package/dist/types/utils.d.ts.map +1 -1
  91. package/dist/types/validator.d.ts +2 -2
  92. package/dist/types/validator.d.ts.map +1 -1
  93. package/dist/useController.d.ts +2 -2
  94. package/dist/useController.d.ts.map +1 -1
  95. package/dist/useFieldArray.d.ts +1 -1
  96. package/dist/useFieldArray.d.ts.map +1 -1
  97. package/dist/useFormState.d.ts +2 -2
  98. package/dist/useFormState.d.ts.map +1 -1
  99. package/dist/useWatch.d.ts +6 -7
  100. package/dist/useWatch.d.ts.map +1 -1
  101. package/dist/utils/index.d.ts +3 -1
  102. package/dist/utils/index.d.ts.map +1 -1
  103. package/dist/utils/join.d.ts +16 -0
  104. package/dist/utils/join.d.ts.map +1 -0
  105. package/dist/utils/of.d.ts +13 -0
  106. package/dist/utils/of.d.ts.map +1 -0
  107. package/package.json +24 -24
  108. package/dist/types/path/common.d.ts +0 -316
  109. package/dist/types/path/common.d.ts.map +0 -1
  110. package/dist/types/path/eager.d.ts +0 -82
  111. package/dist/types/path/eager.d.ts.map +0 -1
  112. package/dist/utils/omitKeys.d.ts +0 -3
  113. package/dist/utils/omitKeys.d.ts.map +0 -1
@@ -40,6 +40,7 @@ var get = (obj, path, defaultValue) => {
40
40
 
41
41
  const EVENTS = {
42
42
  BLUR: 'blur',
43
+ FOCUS_OUT: 'focusout',
43
44
  CHANGE: 'change',
44
45
  };
45
46
  const VALIDATION_MODE = {
@@ -70,22 +71,17 @@ const useFormContext = () => React.useContext(HookFormContext);
70
71
  const FormProvider = (props) => (React.createElement(HookFormContext.Provider, { value: omit(props, 'children') }, props.children));
71
72
 
72
73
  var getProxyFormState = (formState, _proxyFormState, localProxyFormState, isRoot = true) => {
73
- function createGetter(prop) {
74
- return () => {
75
- if (prop in formState) {
76
- if (_proxyFormState[prop] !== VALIDATION_MODE.all) {
77
- _proxyFormState[prop] = !isRoot || VALIDATION_MODE.all;
78
- }
79
- localProxyFormState && (localProxyFormState[prop] = true);
80
- return formState[prop];
81
- }
82
- return undefined;
83
- };
84
- }
85
74
  const result = {};
86
75
  for (const key in formState) {
87
76
  Object.defineProperty(result, key, {
88
- get: createGetter(key),
77
+ get: () => {
78
+ const _key = key;
79
+ if (_proxyFormState[_key] !== VALIDATION_MODE.all) {
80
+ _proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
81
+ }
82
+ localProxyFormState && (localProxyFormState[_key] = true);
83
+ return formState[_key];
84
+ },
89
85
  });
90
86
  }
91
87
  return result;
@@ -231,7 +227,7 @@ function useController(props) {
231
227
  control,
232
228
  name,
233
229
  });
234
- const _registerProps = React.useRef(control.register(name, Object.assign(Object.assign({}, props.rules), { value })));
230
+ const _registerProps = React.useRef(control.register(name, Object.assign(Object.assign({}, props.rules), { value: value })));
235
231
  React.useEffect(() => {
236
232
  const updateMounted = (name, value) => {
237
233
  const field = get(control._fields, name);
@@ -251,7 +247,7 @@ function useController(props) {
251
247
  }, [name, control, isArrayField, shouldUnregister]);
252
248
  return {
253
249
  field: {
254
- name,
250
+ name: name,
255
251
  value,
256
252
  onChange: React.useCallback((event) => {
257
253
  _registerProps.current.onChange({
@@ -280,7 +276,7 @@ function useController(props) {
280
276
  reportValidity: () => elm.reportValidity(),
281
277
  };
282
278
  }
283
- }, [name, control]),
279
+ }, [name, control._fields]),
284
280
  },
285
281
  formState,
286
282
  fieldState: control.getFieldState(name, formState),
@@ -292,6 +288,37 @@ const Controller = (props) => props.render(useController(props));
292
288
  var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria
293
289
  ? Object.assign(Object.assign({}, errors[name]), { types: Object.assign(Object.assign({}, (errors[name] && errors[name].types ? errors[name].types : {})), { [type]: message || true }) }) : {};
294
290
 
291
+ /**
292
+ * Function for joining two paths / path strings to a {@link TypedFieldPath}.
293
+ * @param path - base path
294
+ * @param childPath - the path which should be appended to the base path
295
+ * @example
296
+ * ```
297
+ * type Baz = { baz: string }
298
+ * type FooBarBaz = { foo: { bar: Baz }}
299
+ *
300
+ * const path: TypedFieldPath<FooBarBaz, Baz> = of('foo.bar')
301
+ * const joinedPath: TypedFieldPath<FooBar, string> = join(path, 'baz')
302
+ * ```
303
+ */
304
+ function join(path, childPath) {
305
+ return `${path}.${childPath}`;
306
+ }
307
+
308
+ /**
309
+ * Function for creating a {@link TypedFieldPath} from a path string.
310
+ * @param path - path string
311
+ * @example
312
+ * ```
313
+ * type FooBar = { foo: { bar: string }}
314
+ *
315
+ * const path: TypedFieldPath<FooBar, string> = of('foo.bar')
316
+ * ```
317
+ */
318
+ function of(path) {
319
+ return path;
320
+ }
321
+
295
322
  var isKey = (value) => /^\w*$/.test(value);
296
323
 
297
324
  var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
@@ -438,7 +465,7 @@ var updateAt = (fieldValues, index, value) => {
438
465
 
439
466
  const useFieldArray = (props) => {
440
467
  const methods = useFormContext();
441
- const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;
468
+ const { control = methods.control, name, shouldUnregister } = props;
442
469
  const [fields, setFields] = React.useState(control._getFieldArray(name));
443
470
  const ids = React.useRef(control._getFieldArray(name).map(generateId));
444
471
  const _fieldIds = React.useRef(fields);
@@ -460,89 +487,89 @@ const useFieldArray = (props) => {
460
487
  });
461
488
  const updateValues = React.useCallback((updatedFieldArrayValues) => {
462
489
  _actioned.current = true;
463
- set(control._formValues, name, updatedFieldArrayValues);
490
+ control._updateFieldArray(name, updatedFieldArrayValues);
464
491
  }, [control, name]);
465
492
  const append$1 = (value, options) => {
466
493
  const appendValue = convertToArrayPayload(cloneObject(value));
467
494
  const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
468
495
  control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
469
496
  ids.current = append(ids.current, appendValue.map(generateId));
470
- setFields(updatedFieldArrayValues);
471
497
  updateValues(updatedFieldArrayValues);
472
- control._updateFieldArray(name, append, {
498
+ setFields(updatedFieldArrayValues);
499
+ control._updateFieldArray(name, updatedFieldArrayValues, append, {
473
500
  argA: fillEmptyArray(value),
474
- }, updatedFieldArrayValues);
501
+ });
475
502
  };
476
503
  const prepend$1 = (value, options) => {
477
504
  const prependValue = convertToArrayPayload(cloneObject(value));
478
505
  const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
479
506
  control._names.focus = getFocusFieldName(name, 0, options);
480
507
  ids.current = prepend(ids.current, prependValue.map(generateId));
481
- setFields(updatedFieldArrayValues);
482
508
  updateValues(updatedFieldArrayValues);
483
- control._updateFieldArray(name, prepend, {
509
+ setFields(updatedFieldArrayValues);
510
+ control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
484
511
  argA: fillEmptyArray(value),
485
- }, updatedFieldArrayValues);
512
+ });
486
513
  };
487
514
  const remove = (index) => {
488
515
  const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
489
516
  ids.current = removeArrayAt(ids.current, index);
490
- setFields(updatedFieldArrayValues);
491
517
  updateValues(updatedFieldArrayValues);
492
- control._updateFieldArray(name, removeArrayAt, {
518
+ setFields(updatedFieldArrayValues);
519
+ control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
493
520
  argA: index,
494
- }, updatedFieldArrayValues);
521
+ });
495
522
  };
496
523
  const insert$1 = (index, value, options) => {
497
524
  const insertValue = convertToArrayPayload(cloneObject(value));
498
525
  const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
499
- updateValues(updatedFieldArrayValues);
500
526
  control._names.focus = getFocusFieldName(name, index, options);
501
527
  ids.current = insert(ids.current, index, insertValue.map(generateId));
528
+ updateValues(updatedFieldArrayValues);
502
529
  setFields(updatedFieldArrayValues);
503
- control._updateFieldArray(name, insert, {
530
+ control._updateFieldArray(name, updatedFieldArrayValues, insert, {
504
531
  argA: index,
505
532
  argB: fillEmptyArray(value),
506
- }, updatedFieldArrayValues);
533
+ });
507
534
  };
508
535
  const swap = (indexA, indexB) => {
509
536
  const updatedFieldArrayValues = control._getFieldArray(name);
510
537
  swapArrayAt(updatedFieldArrayValues, indexA, indexB);
511
538
  swapArrayAt(ids.current, indexA, indexB);
512
- setFields(updatedFieldArrayValues);
513
539
  updateValues(updatedFieldArrayValues);
514
- control._updateFieldArray(name, swapArrayAt, {
540
+ setFields(updatedFieldArrayValues);
541
+ control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
515
542
  argA: indexA,
516
543
  argB: indexB,
517
- }, updatedFieldArrayValues, false);
544
+ }, false);
518
545
  };
519
546
  const move = (from, to) => {
520
547
  const updatedFieldArrayValues = control._getFieldArray(name);
521
548
  moveArrayAt(updatedFieldArrayValues, from, to);
522
549
  moveArrayAt(ids.current, from, to);
523
- setFields(updatedFieldArrayValues);
524
550
  updateValues(updatedFieldArrayValues);
525
- control._updateFieldArray(name, moveArrayAt, {
551
+ setFields(updatedFieldArrayValues);
552
+ control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
526
553
  argA: from,
527
554
  argB: to,
528
- }, updatedFieldArrayValues, false);
555
+ }, false);
529
556
  };
530
557
  const update = (index, value) => {
531
558
  const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, value);
532
559
  ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
533
- setFields([...updatedFieldArrayValues]);
534
560
  updateValues(updatedFieldArrayValues);
535
- control._updateFieldArray(name, updateAt, {
561
+ setFields([...updatedFieldArrayValues]);
562
+ control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
536
563
  argA: index,
537
564
  argB: value,
538
- }, updatedFieldArrayValues, true, false);
565
+ }, true, false);
539
566
  };
540
567
  const replace = (value) => {
541
- const updatedFieldArrayValues = convertToArrayPayload(value);
568
+ const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));
542
569
  ids.current = updatedFieldArrayValues.map(generateId);
543
570
  updateValues([...updatedFieldArrayValues]);
544
571
  setFields([...updatedFieldArrayValues]);
545
- control._updateFieldArray(name, () => updatedFieldArrayValues, {}, [...updatedFieldArrayValues], true, false);
572
+ control._updateFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);
546
573
  };
547
574
  React.useEffect(() => {
548
575
  control._stateFlags.action = false;
@@ -568,12 +595,12 @@ const useFieldArray = (props) => {
568
595
  control._proxyFormState.isValid && control._updateValid();
569
596
  }, [fields, name, control]);
570
597
  React.useEffect(() => {
571
- !get(control._formValues, name) && set(control._formValues, name, []);
598
+ !get(control._formValues, name) && control._updateFieldArray(name);
572
599
  return () => {
573
600
  (control._options.shouldUnregister || shouldUnregister) &&
574
601
  control.unregister(name);
575
602
  };
576
- }, [name, control, keyName, shouldUnregister]);
603
+ }, [name, control, shouldUnregister]);
577
604
  return {
578
605
  swap: React.useCallback(swap, [updateValues, name, control]),
579
606
  move: React.useCallback(move, [updateValues, name, control]),
@@ -583,7 +610,7 @@ const useFieldArray = (props) => {
583
610
  insert: React.useCallback(insert$1, [updateValues, name, control]),
584
611
  update: React.useCallback(update, [updateValues, name, control]),
585
612
  replace: React.useCallback(replace, [updateValues, name, control]),
586
- fields: React.useMemo(() => fields.map((field, index) => (Object.assign(Object.assign({}, field), { [keyName]: ids.current[index] || generateId() }))), [fields, keyName]),
613
+ fields: React.useMemo(() => fields.map((field, index) => (Object.assign(Object.assign({}, field), { id: ids.current[index] || generateId() }))), [fields]),
587
614
  };
588
615
  };
589
616
 
@@ -974,8 +1001,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
974
1001
  const maxOutput = getValueAndMessage(max);
975
1002
  const minOutput = getValueAndMessage(min);
976
1003
  if (!isNaN(inputValue)) {
977
- const valueNumber = ref.valueAsNumber ||
978
- parseFloat(inputValue);
1004
+ const valueNumber = ref.valueAsNumber || +inputValue;
979
1005
  if (!isNullOrUndefined(maxOutput.value)) {
980
1006
  exceedMax = valueNumber > maxOutput.value;
981
1007
  }
@@ -1138,33 +1164,38 @@ function createFormControl(props = {}) {
1138
1164
  }
1139
1165
  return isValid;
1140
1166
  };
1141
- const _updateFieldArray = (name, method, args, values = [], shouldSetValues = true, shouldSetFields = true) => {
1142
- _stateFlags.action = true;
1143
- if (shouldSetFields && Array.isArray(get(_fields, name))) {
1144
- const fieldValues = method(get(_fields, name), args.argA, args.argB);
1145
- shouldSetValues && set(_fields, name, fieldValues);
1146
- }
1147
- if (_proxyFormState.errors &&
1148
- shouldSetFields &&
1149
- Array.isArray(get(_formState.errors, name))) {
1150
- const errors = method(get(_formState.errors, name), args.argA, args.argB);
1151
- shouldSetValues && set(_formState.errors, name, errors);
1152
- unsetEmptyArray(_formState.errors, name);
1153
- }
1154
- if (_proxyFormState.touchedFields &&
1155
- Array.isArray(get(_formState.touchedFields, name))) {
1156
- const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
1157
- shouldSetValues && set(_formState.touchedFields, name, touchedFields);
1167
+ const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndErrors = true) => {
1168
+ if (args && method) {
1169
+ _stateFlags.action = true;
1170
+ if (shouldUpdateFieldsAndErrors && Array.isArray(get(_fields, name))) {
1171
+ const fieldValues = method(get(_fields, name), args.argA, args.argB);
1172
+ shouldSetValues && set(_fields, name, fieldValues);
1173
+ }
1174
+ if (_proxyFormState.errors &&
1175
+ shouldUpdateFieldsAndErrors &&
1176
+ Array.isArray(get(_formState.errors, name))) {
1177
+ const errors = method(get(_formState.errors, name), args.argA, args.argB);
1178
+ shouldSetValues && set(_formState.errors, name, errors);
1179
+ unsetEmptyArray(_formState.errors, name);
1180
+ }
1181
+ if (_proxyFormState.touchedFields &&
1182
+ Array.isArray(get(_formState.touchedFields, name))) {
1183
+ const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
1184
+ shouldSetValues && set(_formState.touchedFields, name, touchedFields);
1185
+ }
1186
+ if (_proxyFormState.dirtyFields) {
1187
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1188
+ }
1189
+ _subjects.state.next({
1190
+ isDirty: _getDirty(name, values),
1191
+ dirtyFields: _formState.dirtyFields,
1192
+ errors: _formState.errors,
1193
+ isValid: _formState.isValid,
1194
+ });
1158
1195
  }
1159
- if (_proxyFormState.dirtyFields) {
1160
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1196
+ else {
1197
+ set(_formValues, name, values);
1161
1198
  }
1162
- _subjects.state.next({
1163
- isDirty: _getDirty(name, values),
1164
- dirtyFields: _formState.dirtyFields,
1165
- errors: _formState.errors,
1166
- isValid: _formState.isValid,
1167
- });
1168
1199
  };
1169
1200
  const updateErrors = (name, error) => (set(_formState.errors, name, error),
1170
1201
  _subjects.state.next({
@@ -1343,7 +1374,10 @@ function createFormControl(props = {}) {
1343
1374
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
1344
1375
  }
1345
1376
  }
1346
- else if (!isFileInput(fieldReference.ref)) {
1377
+ else if (isFileInput(fieldReference.ref)) {
1378
+ fieldReference.ref.value = '';
1379
+ }
1380
+ else {
1347
1381
  fieldReference.ref.value = fieldValue;
1348
1382
  if (!fieldReference.ref.type) {
1349
1383
  _subjects.watch.next({
@@ -1410,7 +1444,7 @@ function createFormControl(props = {}) {
1410
1444
  const fieldValue = target.type
1411
1445
  ? getFieldValue(field._f)
1412
1446
  : getEventValue(event);
1413
- const isBlurEvent = event.type === EVENTS.BLUR;
1447
+ const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;
1414
1448
  const shouldSkipValidation = (!hasValidation(field._f) &&
1415
1449
  !_options.resolver &&
1416
1450
  !get(_formState.errors, name) &&
@@ -1437,10 +1471,9 @@ function createFormControl(props = {}) {
1437
1471
  }
1438
1472
  !isBlurEvent && watched && _subjects.state.next({});
1439
1473
  validateFields[name] = validateFields[name] ? +1 : 1;
1440
- _proxyFormState.isValidating &&
1441
- _subjects.state.next({
1442
- isValidating: true,
1443
- });
1474
+ _subjects.state.next({
1475
+ isValidating: true,
1476
+ });
1444
1477
  if (_options.resolver) {
1445
1478
  const { errors } = await _executeSchema([name]);
1446
1479
  const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
@@ -1546,7 +1579,7 @@ function createFormControl(props = {}) {
1546
1579
  }
1547
1580
  _subjects.watch.next({});
1548
1581
  _subjects.state.next(Object.assign(Object.assign({}, _formState), (!options.keepDirty ? {} : { isDirty: _getDirty() })));
1549
- !options.keepIsValid && _updateValid();
1582
+ _proxyFormState.isValid && _updateValid();
1550
1583
  };
1551
1584
  const register = (name, options = {}) => {
1552
1585
  let field = get(_fields, name);
@@ -1730,8 +1763,7 @@ function createFormControl(props = {}) {
1730
1763
  watchAll: false,
1731
1764
  focus: '',
1732
1765
  };
1733
- _stateFlags.mount =
1734
- !_proxyFormState.isValid || !!keepStateOptions.keepIsValid;
1766
+ _stateFlags.mount = !_proxyFormState.isValid;
1735
1767
  _stateFlags.watch = !!props.shouldUnregister;
1736
1768
  _subjects.state.next({
1737
1769
  submitCount: keepStateOptions.keepSubmitCount
@@ -1781,15 +1813,9 @@ function createFormControl(props = {}) {
1781
1813
  get _fields() {
1782
1814
  return _fields;
1783
1815
  },
1784
- set _fields(value) {
1785
- _fields = value;
1786
- },
1787
1816
  get _formValues() {
1788
1817
  return _formValues;
1789
1818
  },
1790
- set _formValues(value) {
1791
- _formValues = value;
1792
- },
1793
1819
  get _stateFlags() {
1794
1820
  return _stateFlags;
1795
1821
  },
@@ -1799,9 +1825,6 @@ function createFormControl(props = {}) {
1799
1825
  get _defaultValues() {
1800
1826
  return _defaultValues;
1801
1827
  },
1802
- set _defaultValues(value) {
1803
- _defaultValues = value;
1804
- },
1805
1828
  get _names() {
1806
1829
  return _names;
1807
1830
  },
@@ -1883,5 +1906,5 @@ function useForm(props = {}) {
1883
1906
  return _formControl.current;
1884
1907
  }
1885
1908
 
1886
- export { Controller, FormProvider, appendErrors, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };
1909
+ export { Controller, FormProvider, appendErrors, get, join, of, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };
1887
1910
  //# sourceMappingURL=index.esm.mjs.map