react-hook-form 7.74.0 → 7.76.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.
@@ -1,4 +1,17 @@
1
1
  import type { FieldValues, UseFormProps, UseFormReturn } from '../types';
2
+ export declare const DEFAULT_FORM_STATE: {
3
+ submitCount: number;
4
+ isDirty: boolean;
5
+ isReady: boolean;
6
+ isValidating: boolean;
7
+ isSubmitted: boolean;
8
+ isSubmitting: boolean;
9
+ isSubmitSuccessful: boolean;
10
+ isValid: boolean;
11
+ touchedFields: {};
12
+ dirtyFields: {};
13
+ validatingFields: {};
14
+ };
2
15
  export declare function createFormControl<TFieldValues extends FieldValues = FieldValues, TContext = any, TTransformedValues = TFieldValues>(props?: UseFormProps<TFieldValues, TContext, TTransformedValues>): Omit<UseFormReturn<TFieldValues, TContext, TTransformedValues>, 'formState'> & {
3
16
  formControl: Omit<UseFormReturn<TFieldValues, TContext, TTransformedValues>, 'formState'>;
4
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAaV,WAAW,EAiBX,YAAY,EAIZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAsDlB,wBAAgB,iBAAiB,CAC/B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,KAAK,GAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAM,GACnE,IAAI,CACL,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,GAAG;IACF,WAAW,EAAE,IAAI,CACf,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,CAAC;CACH,CAwnDA"}
1
+ {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAaV,WAAW,EAiBX,YAAY,EAIZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAuDlB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;CAY9B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,KAAK,GAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAM,GACnE,IAAI,CACL,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,GAAG;IACF,WAAW,EAAE,IAAI,CACf,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,CAAC;CACH,CAssDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAWA,iBAAS,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,uBAapE;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,CAAC,EACtC,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,qBAAqB,CAAC,EAAE,MAAM,CAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EACxB,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG,OAAO,CAC7C,mEA6BF"}
1
+ {"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAWA,iBAAS,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,uBAapE;AAmCD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,CAAC,EACtC,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,qBAAqB,CAAC,EAAE,MAAM,CAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EACxB,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG,OAAO,CAC7C,mEA6BF"}
@@ -1,4 +1,4 @@
1
1
  import type { InternalFieldName } from '../types';
2
- declare const _default: (names: Set<InternalFieldName>, name: InternalFieldName) => boolean;
2
+ declare const _default: (names: Set<InternalFieldName>, name: InternalFieldName) => string[];
3
3
  export default _default;
4
- //# sourceMappingURL=isNameInFieldArray.d.ts.map
4
+ //# sourceMappingURL=getFieldArrayParentNames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFieldArrayParentNames.d.ts","sourceRoot":"","sources":["../../src/logic/getFieldArrayParentNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;yBAElC,OAAO,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,iBAAiB;AAAtE,wBAUE"}
@@ -1 +1 @@
1
- {"version":3,"file":"getProxyFormState.d.ts","sourceRoot":"","sources":["../../src/logic/getProxyFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;yBAG7E,YAAY,SAAS,WAAW,EAChC,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,WAAW,SAAS,CAAC,YAAY,CAAC,EAClC,SAAS,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAC5D,sBAAsB,aAAa,EACnC,gBAAa;AARf,wBA8BE"}
1
+ {"version":3,"file":"getProxyFormState.d.ts","sourceRoot":"","sources":["../../src/logic/getProxyFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;yBAG7E,YAAY,SAAS,WAAW,EAChC,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,WAAW,SAAS,CAAC,YAAY,CAAC,EAClC,SAAS,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAC5D,sBAAsB,aAAa,EACnC,gBAAa;AARf,wBA4BE"}
@@ -3,11 +3,11 @@ declare const _default: <TFieldValues extends FieldValues>(fieldsNames: Set<Inte
3
3
  criteriaMode: CriteriaMode | undefined;
4
4
  names: FieldName<TFieldValues>[];
5
5
  fields: Record<string, {
6
- ref: import("../types").Ref;
6
+ ref: import("..").Ref;
7
7
  name: InternalFieldName;
8
8
  refs?: HTMLInputElement[];
9
9
  mount?: boolean;
10
- } & import("../types").RegisterOptions>;
10
+ } & import("..").RegisterOptions>;
11
11
  shouldUseNativeValidation: boolean | undefined;
12
12
  };
13
13
  export default _default;
@@ -1,4 +1,4 @@
1
1
  import type { Field } from '../types';
2
- declare const _default: (options: Field["_f"]) => string | number | boolean | import("../types").ValidationValueMessage<boolean> | import("../types").ValidationValueMessage<string | number> | import("../types").ValidationRule<RegExp> | import("../types").Validate<any, import("../types").FieldValues> | Record<string, import("../types").Validate<any, import("../types").FieldValues>> | undefined;
2
+ declare const _default: (options: Field["_f"]) => string | number | boolean | import("..").ValidationValueMessage<boolean> | import("..").ValidationValueMessage<string | number> | import("..").ValidationRule<RegExp> | import("..").Validate<any, import("..").FieldValues> | Record<string, import("..").Validate<any, import("..").FieldValues>> | undefined;
3
3
  export default _default;
4
4
  //# sourceMappingURL=hasValidation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAGF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,wBAqBE"}
1
+ {"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAGF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,wBAsBE"}
@@ -325,6 +325,29 @@ function markFieldsDirty(data, fields = {}) {
325
325
  }
326
326
  return fields;
327
327
  }
328
+ function pruneDirtyFields(value) {
329
+ if (value === false) {
330
+ return undefined;
331
+ }
332
+ if (value === true) {
333
+ return true;
334
+ }
335
+ if (Array.isArray(value)) {
336
+ const result = value.map((value) => pruneDirtyFields(value));
337
+ return (result.some((value) => value !== undefined) ? result : undefined);
338
+ }
339
+ if (isObject(value)) {
340
+ const result = {};
341
+ for (const key in value) {
342
+ const pruned = pruneDirtyFields(value[key]);
343
+ if (!isUndefined(pruned)) {
344
+ result[key] = pruned;
345
+ }
346
+ }
347
+ return (Object.keys(result).length ? result : undefined);
348
+ }
349
+ return undefined;
350
+ }
328
351
  function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
329
352
  if (!dirtyFieldsFromValues) {
330
353
  dirtyFieldsFromValues = markFieldsDirty(formValues);
@@ -344,7 +367,7 @@ function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
344
367
  dirtyFieldsFromValues[key] = !deepEqual(value, formValue);
345
368
  }
346
369
  }
347
- return dirtyFieldsFromValues;
370
+ return pruneDirtyFields(dirtyFieldsFromValues) || {};
348
371
  }
349
372
 
350
373
  var getEventValue = (event) => isObject(event) && event.target
@@ -353,6 +376,16 @@ var getEventValue = (event) => isObject(event) && event.target
353
376
  : event.target.value
354
377
  : event;
355
378
 
379
+ var getFieldArrayParentNames = (names, name) => {
380
+ const parts = name.split('.');
381
+ const matches = [];
382
+ let prefix = parts[0];
383
+ for (let i = 1; i < parts.length; prefix += '.' + parts[i++]) {
384
+ !isNaN(+parts[i]) && names.has(prefix) && matches.push(prefix);
385
+ }
386
+ return matches;
387
+ };
388
+
356
389
  const defaultResult = {
357
390
  value: false,
358
391
  isValid: false,
@@ -422,8 +455,6 @@ function getFieldValue(_f) {
422
455
  return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);
423
456
  }
424
457
 
425
- var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
426
-
427
458
  var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {
428
459
  const fields = {};
429
460
  for (const name of fieldsNames) {
@@ -475,10 +506,6 @@ var hasValidation = (options) => options.mount &&
475
506
  options.pattern ||
476
507
  options.validate);
477
508
 
478
- var isNameInFieldArray = (names, name) => name
479
- .split('.')
480
- .some((part, index, arr) => !isNaN(Number(part)) && names.has(arr.slice(0, index).join('.')));
481
-
482
509
  var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
483
510
  (_names.watchAll ||
484
511
  _names.watch.has(name) ||
@@ -552,7 +579,8 @@ var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, is
552
579
  updateFormState(formStateData);
553
580
  const { name, ...formState } = formStateData;
554
581
  return (isEmptyObject(formState) ||
555
- Object.keys(formState).length >= Object.keys(_proxyFormState).length ||
582
+ (isRoot &&
583
+ Object.keys(formState).length >= Object.keys(_proxyFormState).length) ||
556
584
  Object.keys(formState).find((key) => _proxyFormState[key] ===
557
585
  (!isRoot || VALIDATION_MODE.all)));
558
586
  };
@@ -795,24 +823,27 @@ const defaultOptions = {
795
823
  reValidateMode: VALIDATION_MODE.onChange,
796
824
  shouldFocusError: true,
797
825
  };
826
+ const DEFAULT_FORM_STATE = {
827
+ submitCount: 0,
828
+ isDirty: false,
829
+ isReady: false,
830
+ isValidating: false,
831
+ isSubmitted: false,
832
+ isSubmitting: false,
833
+ isSubmitSuccessful: false,
834
+ isValid: false,
835
+ touchedFields: {},
836
+ dirtyFields: {},
837
+ validatingFields: {},
838
+ };
798
839
  function createFormControl(props = {}) {
799
840
  let _options = {
800
841
  ...defaultOptions,
801
842
  ...props,
802
843
  };
803
844
  let _formState = {
804
- submitCount: 0,
805
- isDirty: false,
806
- isReady: false,
845
+ ...cloneObject(DEFAULT_FORM_STATE),
807
846
  isLoading: isFunction(_options.defaultValues),
808
- isValidating: false,
809
- isSubmitted: false,
810
- isSubmitting: false,
811
- isSubmitSuccessful: false,
812
- isValid: false,
813
- touchedFields: {},
814
- dirtyFields: {},
815
- validatingFields: {},
816
847
  errors: _options.errors || {},
817
848
  disabled: _options.disabled || false,
818
849
  };
@@ -909,10 +940,8 @@ function createFormControl(props = {}) {
909
940
  });
910
941
  }
911
942
  };
912
- const _updateDirtyFields = (name) => {
913
- const fullDirtyFields = getDirtyFields(_defaultValues, _formValues);
914
- const rootName = getNodeParentName(name);
915
- set(_formState.dirtyFields, rootName, get(fullDirtyFields, rootName));
943
+ const _updateDirtyFields = () => {
944
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
916
945
  };
917
946
  const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
918
947
  if (args && method && !_options.disabled) {
@@ -935,7 +964,7 @@ function createFormControl(props = {}) {
935
964
  shouldSetValues && set(_formState.touchedFields, name, touchedFields);
936
965
  }
937
966
  if (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) {
938
- _updateDirtyFields(name);
967
+ _updateDirtyFields();
939
968
  }
940
969
  _subjects.state.next({
941
970
  name,
@@ -962,16 +991,53 @@ function createFormControl(props = {}) {
962
991
  isValid: false,
963
992
  });
964
993
  };
994
+ const hasExplicitNullIntermediate = (name) => {
995
+ const segments = isKey(name) ? [name] : stringToPath(name);
996
+ let formValues = _formValues;
997
+ let defaultValues = _defaultValues;
998
+ for (let i = 0; i < segments.length - 1; i++) {
999
+ const key = segments[i];
1000
+ formValues = isNullOrUndefined(formValues) ? formValues : formValues[key];
1001
+ defaultValues = isNullOrUndefined(defaultValues)
1002
+ ? defaultValues
1003
+ : defaultValues[key];
1004
+ if (formValues === null && defaultValues !== null) {
1005
+ return true;
1006
+ }
1007
+ }
1008
+ return false;
1009
+ };
965
1010
  const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
966
1011
  const field = get(_fields, name);
967
1012
  if (field) {
1013
+ if (hasExplicitNullIntermediate(name)) {
1014
+ return;
1015
+ }
1016
+ const wasUnsetInFormValues = isUndefined(get(_formValues, name));
968
1017
  const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
969
1018
  isUndefined(defaultValue) ||
970
1019
  (ref && ref.defaultChecked) ||
971
1020
  shouldSkipSetValueAs
972
1021
  ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
973
1022
  : setFieldValue(name, defaultValue);
974
- _state.mount && !_state.action && _setValid();
1023
+ if (_state.mount && !_state.action) {
1024
+ _setValid();
1025
+ // Re-registering a field after a prior unregister puts its key back
1026
+ // into _formValues, which can flip isDirty back to false (#13397).
1027
+ // Only run when we are currently dirty, otherwise an initial register
1028
+ // for a field with no defaultValue would flip isDirty to true. Reset
1029
+ // paths repopulate _formValues before re-register, so the key is
1030
+ // present then and this branch is skipped (preserves keepDirty).
1031
+ if (wasUnsetInFormValues &&
1032
+ _formState.isDirty &&
1033
+ (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty)) {
1034
+ const isDirty = _getDirty();
1035
+ if (!isDirty) {
1036
+ _formState.isDirty = false;
1037
+ _subjects.state.next({ ..._formState });
1038
+ }
1039
+ }
1040
+ }
975
1041
  }
976
1042
  };
977
1043
  const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
@@ -989,9 +1055,14 @@ function createFormControl(props = {}) {
989
1055
  }
990
1056
  const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
991
1057
  isPreviousDirty = !!get(_formState.dirtyFields, name);
992
- isCurrentFieldPristine
993
- ? unset(_formState.dirtyFields, name)
994
- : set(_formState.dirtyFields, name, true);
1058
+ if (isCurrentFieldPristine !== _formState.isDirty) {
1059
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1060
+ }
1061
+ else {
1062
+ isCurrentFieldPristine
1063
+ ? unset(_formState.dirtyFields, name)
1064
+ : set(_formState.dirtyFields, name, true);
1065
+ }
995
1066
  output.dirtyFields = _formState.dirtyFields;
996
1067
  shouldUpdateField =
997
1068
  shouldUpdateField ||
@@ -1058,7 +1129,9 @@ function createFormControl(props = {}) {
1058
1129
  for (const name of names) {
1059
1130
  const error = get(errors, name);
1060
1131
  error
1061
- ? set(_formState.errors, name, error)
1132
+ ? _names.array.has(name) && isObject(error)
1133
+ ? updateFieldArrayRootError(_formState.errors, { [name]: error }, name)
1134
+ : set(_formState.errors, name, error)
1062
1135
  : unset(_formState.errors, name);
1063
1136
  }
1064
1137
  }
@@ -1080,8 +1153,8 @@ function createFormControl(props = {}) {
1080
1153
  const error = result[key];
1081
1154
  if (error) {
1082
1155
  setError(`${FORM_ERROR_TYPE}.${key}`, {
1083
- message: isString(result.message) ? result.message : '',
1084
- type: INPUT_VALIDATION_RULES.validate,
1156
+ message: isString(error.message) ? error.message : '',
1157
+ type: error.type || INPUT_VALIDATION_RULES.validate,
1085
1158
  });
1086
1159
  }
1087
1160
  }
@@ -1123,11 +1196,15 @@ function createFormControl(props = {}) {
1123
1196
  if (_f) {
1124
1197
  const isFieldArrayRoot = _names.array.has(_f.name);
1125
1198
  const isPromiseFunction = field._f && hasPromiseValidation(field._f);
1126
- if (isPromiseFunction && _proxyFormState.validatingFields) {
1199
+ const shouldTrackIsValidatingState = _proxyFormState.validatingFields ||
1200
+ _proxyFormState.isValidating ||
1201
+ _proxySubscribeFormState.validatingFields ||
1202
+ _proxySubscribeFormState.isValidating;
1203
+ if (isPromiseFunction && shouldTrackIsValidatingState) {
1127
1204
  _updateIsValidating([_f.name], true);
1128
1205
  }
1129
1206
  const fieldError = await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !onlyCheckValid, isFieldArrayRoot);
1130
- if (isPromiseFunction && _proxyFormState.validatingFields) {
1207
+ if (isPromiseFunction && shouldTrackIsValidatingState) {
1131
1208
  _updateIsValidating([_f.name]);
1132
1209
  }
1133
1210
  if (fieldError[_f.name]) {
@@ -1255,14 +1332,20 @@ function createFormControl(props = {}) {
1255
1332
  const cloneValue = cloneObject(value);
1256
1333
  const previousValue = get(_formValues, name);
1257
1334
  const isValueUnchanged = deepEqual(previousValue, cloneValue);
1258
- set(_formValues, name, cloneValue);
1335
+ if (!isValueUnchanged) {
1336
+ set(_formValues, name, cloneValue);
1337
+ }
1259
1338
  if (isFieldArray) {
1260
1339
  _subjects.array.next({
1261
1340
  name,
1262
1341
  values: cloneObject(_formValues),
1263
1342
  });
1264
- if (options.shouldDirty) {
1265
- _updateDirtyFields(name);
1343
+ if ((_proxyFormState.isDirty ||
1344
+ _proxyFormState.dirtyFields ||
1345
+ _proxySubscribeFormState.isDirty ||
1346
+ _proxySubscribeFormState.dirtyFields) &&
1347
+ options.shouldDirty) {
1348
+ _updateDirtyFields();
1266
1349
  _subjects.state.next({
1267
1350
  name,
1268
1351
  dirtyFields: _formState.dirtyFields,
@@ -1281,19 +1364,18 @@ function createFormControl(props = {}) {
1281
1364
  }
1282
1365
  }
1283
1366
  if (!isValueUnchanged) {
1284
- if (isWatched(name, _names)) {
1285
- _subjects.state.next({
1286
- ..._formState,
1287
- name,
1288
- values: cloneObject(_formValues),
1289
- });
1290
- }
1291
- else {
1292
- _subjects.state.next({
1293
- name: _state.mount ? name : undefined,
1294
- values: cloneObject(_formValues),
1295
- });
1367
+ const watched = isWatched(name, _names);
1368
+ const values = cloneObject(_formValues);
1369
+ if (!isFieldArray) {
1370
+ for (const arrayName of getFieldArrayParentNames(_names.array, name)) {
1371
+ _subjects.array.next({ name: arrayName, values });
1372
+ }
1296
1373
  }
1374
+ _subjects.state.next({
1375
+ ...(watched && _formState),
1376
+ name: _state.mount || watched ? name : undefined,
1377
+ values,
1378
+ });
1297
1379
  }
1298
1380
  };
1299
1381
  const setValues = (formValues) => {
@@ -1305,6 +1387,9 @@ function createFormControl(props = {}) {
1305
1387
  ..._formValues,
1306
1388
  ...updatedFormValues,
1307
1389
  };
1390
+ for (const fieldName of _names.mount) {
1391
+ setValue(fieldName, get(updatedFormValues, fieldName));
1392
+ }
1308
1393
  _subjects.state.next({ ..._formState, values: _formValues });
1309
1394
  }
1310
1395
  };
@@ -1675,13 +1760,15 @@ function createFormControl(props = {}) {
1675
1760
  field._f.mount = false;
1676
1761
  }
1677
1762
  (_options.shouldUnregister || options.shouldUnregister) &&
1678
- !(isNameInFieldArray(_names.array, name) && _state.action) &&
1763
+ !(getFieldArrayParentNames(_names.array, name).length &&
1764
+ _state.action) &&
1679
1765
  _names.unMount.add(name);
1680
1766
  }
1681
1767
  },
1682
1768
  };
1683
1769
  };
1684
1770
  const _focusError = () => _options.shouldFocusError &&
1771
+ !_options.shouldUseNativeValidation &&
1685
1772
  iterateFieldsByAction(_fields, _focusInput, _names.mount);
1686
1773
  const _disableForm = (disabled) => {
1687
1774
  if (isBoolean(disabled)) {