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.
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +96 -57
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/createFormControl.d.ts +13 -0
- package/dist/logic/createFormControl.d.ts.map +1 -1
- package/dist/logic/getDirtyFields.d.ts.map +1 -1
- package/dist/logic/getProxyFormState.d.ts.map +1 -1
- package/dist/logic/getResolverOptions.d.ts +2 -2
- package/dist/logic/hasValidation.d.ts +1 -1
- package/dist/logic/shouldRenderFormState.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +74 -36
- package/dist/react-server.esm.mjs.map +1 -1
- package/dist/types/form.d.ts +1 -0
- package/dist/types/form.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/useFormContext.d.ts.map +1 -1
- package/dist/useFormState.d.ts.map +1 -1
- package/package.json +4 -5
|
@@ -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;
|
|
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;
|
|
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,
|
|
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("
|
|
6
|
+
ref: import("..").Ref;
|
|
7
7
|
name: InternalFieldName;
|
|
8
8
|
refs?: HTMLInputElement[];
|
|
9
9
|
mount?: boolean;
|
|
10
|
-
} & import("
|
|
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("
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
913
|
-
|
|
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(
|
|
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
|
|
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 (
|
|
1265
|
-
|
|
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
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
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) => {
|