react-hook-form 7.74.0 → 7.75.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;AAqDlB,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,CAsoDA"}
@@ -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 +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
@@ -422,8 +445,6 @@ function getFieldValue(_f) {
422
445
  return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);
423
446
  }
424
447
 
425
- var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
426
-
427
448
  var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {
428
449
  const fields = {};
429
450
  for (const name of fieldsNames) {
@@ -552,7 +573,8 @@ var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, is
552
573
  updateFormState(formStateData);
553
574
  const { name, ...formState } = formStateData;
554
575
  return (isEmptyObject(formState) ||
555
- Object.keys(formState).length >= Object.keys(_proxyFormState).length ||
576
+ (isRoot &&
577
+ Object.keys(formState).length >= Object.keys(_proxyFormState).length) ||
556
578
  Object.keys(formState).find((key) => _proxyFormState[key] ===
557
579
  (!isRoot || VALIDATION_MODE.all)));
558
580
  };
@@ -795,24 +817,27 @@ const defaultOptions = {
795
817
  reValidateMode: VALIDATION_MODE.onChange,
796
818
  shouldFocusError: true,
797
819
  };
820
+ const DEFAULT_FORM_STATE = {
821
+ submitCount: 0,
822
+ isDirty: false,
823
+ isReady: false,
824
+ isValidating: false,
825
+ isSubmitted: false,
826
+ isSubmitting: false,
827
+ isSubmitSuccessful: false,
828
+ isValid: false,
829
+ touchedFields: {},
830
+ dirtyFields: {},
831
+ validatingFields: {},
832
+ };
798
833
  function createFormControl(props = {}) {
799
834
  let _options = {
800
835
  ...defaultOptions,
801
836
  ...props,
802
837
  };
803
838
  let _formState = {
804
- submitCount: 0,
805
- isDirty: false,
806
- isReady: false,
839
+ ...cloneObject(DEFAULT_FORM_STATE),
807
840
  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
841
  errors: _options.errors || {},
817
842
  disabled: _options.disabled || false,
818
843
  };
@@ -909,10 +934,8 @@ function createFormControl(props = {}) {
909
934
  });
910
935
  }
911
936
  };
912
- const _updateDirtyFields = (name) => {
913
- const fullDirtyFields = getDirtyFields(_defaultValues, _formValues);
914
- const rootName = getNodeParentName(name);
915
- set(_formState.dirtyFields, rootName, get(fullDirtyFields, rootName));
937
+ const _updateDirtyFields = () => {
938
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
916
939
  };
917
940
  const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
918
941
  if (args && method && !_options.disabled) {
@@ -935,7 +958,7 @@ function createFormControl(props = {}) {
935
958
  shouldSetValues && set(_formState.touchedFields, name, touchedFields);
936
959
  }
937
960
  if (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) {
938
- _updateDirtyFields(name);
961
+ _updateDirtyFields();
939
962
  }
940
963
  _subjects.state.next({
941
964
  name,
@@ -965,13 +988,31 @@ function createFormControl(props = {}) {
965
988
  const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
966
989
  const field = get(_fields, name);
967
990
  if (field) {
991
+ const wasUnsetInFormValues = isUndefined(get(_formValues, name));
968
992
  const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
969
993
  isUndefined(defaultValue) ||
970
994
  (ref && ref.defaultChecked) ||
971
995
  shouldSkipSetValueAs
972
996
  ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
973
997
  : setFieldValue(name, defaultValue);
974
- _state.mount && !_state.action && _setValid();
998
+ if (_state.mount && !_state.action) {
999
+ _setValid();
1000
+ // Re-registering a field after a prior unregister puts its key back
1001
+ // into _formValues, which can flip isDirty back to false (#13397).
1002
+ // Only run when we are currently dirty, otherwise an initial register
1003
+ // for a field with no defaultValue would flip isDirty to true. Reset
1004
+ // paths repopulate _formValues before re-register, so the key is
1005
+ // present then and this branch is skipped (preserves keepDirty).
1006
+ if (wasUnsetInFormValues &&
1007
+ _formState.isDirty &&
1008
+ (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty)) {
1009
+ const isDirty = _getDirty();
1010
+ if (!isDirty) {
1011
+ _formState.isDirty = false;
1012
+ _subjects.state.next({ ..._formState });
1013
+ }
1014
+ }
1015
+ }
975
1016
  }
976
1017
  };
977
1018
  const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
@@ -1261,8 +1302,12 @@ function createFormControl(props = {}) {
1261
1302
  name,
1262
1303
  values: cloneObject(_formValues),
1263
1304
  });
1264
- if (options.shouldDirty) {
1265
- _updateDirtyFields(name);
1305
+ if ((_proxyFormState.isDirty ||
1306
+ _proxyFormState.dirtyFields ||
1307
+ _proxySubscribeFormState.isDirty ||
1308
+ _proxySubscribeFormState.dirtyFields) &&
1309
+ options.shouldDirty) {
1310
+ _updateDirtyFields();
1266
1311
  _subjects.state.next({
1267
1312
  name,
1268
1313
  dirtyFields: _formState.dirtyFields,
@@ -1281,19 +1326,12 @@ function createFormControl(props = {}) {
1281
1326
  }
1282
1327
  }
1283
1328
  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
- });
1296
- }
1329
+ const watched = isWatched(name, _names);
1330
+ _subjects.state.next({
1331
+ ...(watched && _formState),
1332
+ name: _state.mount || watched ? name : undefined,
1333
+ values: cloneObject(_formValues),
1334
+ });
1297
1335
  }
1298
1336
  };
1299
1337
  const setValues = (formValues) => {