react-hook-form 7.48.2 → 7.49.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.
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +60 -35
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.react-server.d.ts +3 -0
- package/dist/index.react-server.d.ts.map +1 -0
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/createFormControl.d.ts +2 -1
- package/dist/logic/createFormControl.d.ts.map +1 -1
- package/dist/logic/focusFieldBy.d.ts +6 -2
- package/dist/logic/getDirtyFields.d.ts +1 -1
- package/dist/logic/getDirtyFields.d.ts.map +1 -1
- package/dist/logic/getValidationModes.d.ts +2 -8
- package/dist/logic/getValidationModes.d.ts.map +1 -1
- package/dist/logic/iterateFieldsByAction.d.ts.map +1 -1
- package/dist/logic/skipValidation.d.ts +2 -7
- package/dist/logic/skipValidation.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +65 -0
- package/dist/react-server.esm.mjs.map +1 -0
- package/dist/types/form.d.ts +10 -1
- package/dist/types/form.d.ts.map +1 -1
- package/dist/useController.d.ts.map +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/utils/append.d.ts +2 -1
- package/dist/utils/append.d.ts.map +1 -1
- package/dist/utils/createSubject.d.ts +2 -1
- package/dist/utils/createSubject.d.ts.map +1 -1
- package/dist/utils/deepMerge.d.ts +1 -1
- package/dist/utils/deepMerge.d.ts.map +1 -1
- package/dist/utils/get.d.ts +1 -1
- package/dist/utils/get.d.ts.map +1 -1
- package/dist/utils/isObject.d.ts +1 -1
- package/dist/utils/isObject.d.ts.map +1 -1
- package/dist/utils/prepend.d.ts +2 -1
- package/dist/utils/prepend.d.ts.map +1 -1
- package/dist/utils/set.d.ts +2 -1
- package/dist/utils/set.d.ts.map +1 -1
- package/dist/utils/sleep.d.ts +2 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/package.json +7 -5
package/dist/index.esm.mjs
CHANGED
@@ -64,15 +64,15 @@ var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
|
|
64
64
|
|
65
65
|
var isUndefined = (val) => val === undefined;
|
66
66
|
|
67
|
-
var get = (
|
68
|
-
if (!path || !isObject(
|
67
|
+
var get = (object, path, defaultValue) => {
|
68
|
+
if (!path || !isObject(object)) {
|
69
69
|
return defaultValue;
|
70
70
|
}
|
71
|
-
const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key],
|
72
|
-
return isUndefined(result) || result ===
|
73
|
-
? isUndefined(
|
71
|
+
const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
|
72
|
+
return isUndefined(result) || result === object
|
73
|
+
? isUndefined(object[path])
|
74
74
|
? defaultValue
|
75
|
-
:
|
75
|
+
: object[path]
|
76
76
|
: result;
|
77
77
|
};
|
78
78
|
|
@@ -343,7 +343,7 @@ var isKey = (value) => /^\w*$/.test(value);
|
|
343
343
|
|
344
344
|
var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
|
345
345
|
|
346
|
-
|
346
|
+
var set = (object, path, value) => {
|
347
347
|
let index = -1;
|
348
348
|
const tempPath = isKey(path) ? [path] : stringToPath(path);
|
349
349
|
const length = tempPath.length;
|
@@ -364,7 +364,7 @@ function set(object, path, value) {
|
|
364
364
|
object = object[key];
|
365
365
|
}
|
366
366
|
return object;
|
367
|
-
}
|
367
|
+
};
|
368
368
|
|
369
369
|
/**
|
370
370
|
* Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.
|
@@ -407,8 +407,8 @@ function useController(props) {
|
|
407
407
|
const _registerProps = React.useRef(control.register(name, {
|
408
408
|
...props.rules,
|
409
409
|
value,
|
410
|
+
...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),
|
410
411
|
}));
|
411
|
-
_registerProps.current = control.register(name, props.rules);
|
412
412
|
React.useEffect(() => {
|
413
413
|
const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
|
414
414
|
const updateMounted = (name, value) => {
|
@@ -689,6 +689,9 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
|
|
689
689
|
else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {
|
690
690
|
break;
|
691
691
|
}
|
692
|
+
else {
|
693
|
+
iterateFieldsByAction(currentField, action);
|
694
|
+
}
|
692
695
|
}
|
693
696
|
else if (isObject(currentField)) {
|
694
697
|
iterateFieldsByAction(currentField, action);
|
@@ -959,9 +962,10 @@ var validateField = async (field, formValues, validateAllFieldCriteria, shouldUs
|
|
959
962
|
return error;
|
960
963
|
};
|
961
964
|
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
+
var appendAt = (data, value) => [
|
966
|
+
...data,
|
967
|
+
...convertToArrayPayload(value),
|
968
|
+
];
|
965
969
|
|
966
970
|
var fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;
|
967
971
|
|
@@ -984,9 +988,10 @@ var moveArrayAt = (data, from, to) => {
|
|
984
988
|
return data;
|
985
989
|
};
|
986
990
|
|
987
|
-
|
988
|
-
|
989
|
-
|
991
|
+
var prependAt = (data, value) => [
|
992
|
+
...convertToArrayPayload(value),
|
993
|
+
...convertToArrayPayload(data),
|
994
|
+
];
|
990
995
|
|
991
996
|
function removeAtIndexes(data, indexes) {
|
992
997
|
let i = 0;
|
@@ -1002,7 +1007,7 @@ var removeArrayAt = (data, index) => isUndefined(index)
|
|
1002
1007
|
: removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));
|
1003
1008
|
|
1004
1009
|
var swapArrayAt = (data, indexA, indexB) => {
|
1005
|
-
data[indexA]
|
1010
|
+
[data[indexA], data[indexB]] = [data[indexB], data[indexA]];
|
1006
1011
|
};
|
1007
1012
|
|
1008
1013
|
function baseGet(object, updatePath) {
|
@@ -1112,25 +1117,25 @@ function useFieldArray(props) {
|
|
1112
1117
|
_actioned.current = true;
|
1113
1118
|
control._updateFieldArray(name, updatedFieldArrayValues);
|
1114
1119
|
}, [control, name]);
|
1115
|
-
const append
|
1120
|
+
const append = (value, options) => {
|
1116
1121
|
const appendValue = convertToArrayPayload(cloneObject(value));
|
1117
|
-
const updatedFieldArrayValues =
|
1122
|
+
const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);
|
1118
1123
|
control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
|
1119
|
-
ids.current =
|
1124
|
+
ids.current = appendAt(ids.current, appendValue.map(generateId));
|
1120
1125
|
updateValues(updatedFieldArrayValues);
|
1121
1126
|
setFields(updatedFieldArrayValues);
|
1122
|
-
control._updateFieldArray(name, updatedFieldArrayValues,
|
1127
|
+
control._updateFieldArray(name, updatedFieldArrayValues, appendAt, {
|
1123
1128
|
argA: fillEmptyArray(value),
|
1124
1129
|
});
|
1125
1130
|
};
|
1126
|
-
const prepend
|
1131
|
+
const prepend = (value, options) => {
|
1127
1132
|
const prependValue = convertToArrayPayload(cloneObject(value));
|
1128
|
-
const updatedFieldArrayValues =
|
1133
|
+
const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);
|
1129
1134
|
control._names.focus = getFocusFieldName(name, 0, options);
|
1130
|
-
ids.current =
|
1135
|
+
ids.current = prependAt(ids.current, prependValue.map(generateId));
|
1131
1136
|
updateValues(updatedFieldArrayValues);
|
1132
1137
|
setFields(updatedFieldArrayValues);
|
1133
|
-
control._updateFieldArray(name, updatedFieldArrayValues,
|
1138
|
+
control._updateFieldArray(name, updatedFieldArrayValues, prependAt, {
|
1134
1139
|
argA: fillEmptyArray(value),
|
1135
1140
|
});
|
1136
1141
|
};
|
@@ -1261,8 +1266,8 @@ function useFieldArray(props) {
|
|
1261
1266
|
return {
|
1262
1267
|
swap: React.useCallback(swap, [updateValues, name, control]),
|
1263
1268
|
move: React.useCallback(move, [updateValues, name, control]),
|
1264
|
-
prepend: React.useCallback(prepend
|
1265
|
-
append: React.useCallback(append
|
1269
|
+
prepend: React.useCallback(prepend, [updateValues, name, control]),
|
1270
|
+
append: React.useCallback(append, [updateValues, name, control]),
|
1266
1271
|
remove: React.useCallback(remove, [updateValues, name, control]),
|
1267
1272
|
insert: React.useCallback(insert$1, [updateValues, name, control]),
|
1268
1273
|
update: React.useCallback(update, [updateValues, name, control]),
|
@@ -1274,7 +1279,7 @@ function useFieldArray(props) {
|
|
1274
1279
|
};
|
1275
1280
|
}
|
1276
1281
|
|
1277
|
-
|
1282
|
+
var createSubject = () => {
|
1278
1283
|
let _observers = [];
|
1279
1284
|
const next = (value) => {
|
1280
1285
|
for (const observer of _observers) {
|
@@ -1300,7 +1305,7 @@ function createSubject() {
|
|
1300
1305
|
subscribe,
|
1301
1306
|
unsubscribe,
|
1302
1307
|
};
|
1303
|
-
}
|
1308
|
+
};
|
1304
1309
|
|
1305
1310
|
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
1306
1311
|
|
@@ -1526,7 +1531,7 @@ function createFormControl(props = {}, flushRootRender) {
|
|
1526
1531
|
isValid: false,
|
1527
1532
|
touchedFields: {},
|
1528
1533
|
dirtyFields: {},
|
1529
|
-
errors: {},
|
1534
|
+
errors: _options.errors || {},
|
1530
1535
|
disabled: false,
|
1531
1536
|
};
|
1532
1537
|
let _fields = {};
|
@@ -1626,6 +1631,13 @@ function createFormControl(props = {}, flushRootRender) {
|
|
1626
1631
|
errors: _formState.errors,
|
1627
1632
|
});
|
1628
1633
|
};
|
1634
|
+
const _setErrors = (errors) => {
|
1635
|
+
_formState.errors = errors;
|
1636
|
+
_subjects.state.next({
|
1637
|
+
errors: _formState.errors,
|
1638
|
+
isValid: false,
|
1639
|
+
});
|
1640
|
+
};
|
1629
1641
|
const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
|
1630
1642
|
const field = get(_fields, name);
|
1631
1643
|
if (field) {
|
@@ -1644,15 +1656,16 @@ function createFormControl(props = {}, flushRootRender) {
|
|
1644
1656
|
const output = {
|
1645
1657
|
name,
|
1646
1658
|
};
|
1659
|
+
const disabledField = get(_fields, name) && get(_fields, name)._f.disabled;
|
1647
1660
|
if (!isBlurEvent || shouldDirty) {
|
1648
1661
|
if (_proxyFormState.isDirty) {
|
1649
1662
|
isPreviousDirty = _formState.isDirty;
|
1650
1663
|
_formState.isDirty = output.isDirty = _getDirty();
|
1651
1664
|
shouldUpdateField = isPreviousDirty !== output.isDirty;
|
1652
1665
|
}
|
1653
|
-
const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
|
1654
|
-
isPreviousDirty = get(_formState.dirtyFields, name);
|
1655
|
-
isCurrentFieldPristine
|
1666
|
+
const isCurrentFieldPristine = disabledField || deepEqual(get(_defaultValues, name), fieldValue);
|
1667
|
+
isPreviousDirty = !disabledField && get(_formState.dirtyFields, name);
|
1668
|
+
isCurrentFieldPristine || disabledField
|
1656
1669
|
? unset(_formState.dirtyFields, name)
|
1657
1670
|
: set(_formState.dirtyFields, name, true);
|
1658
1671
|
output.dirtyFields = _formState.dirtyFields;
|
@@ -2150,8 +2163,13 @@ function createFormControl(props = {}, flushRootRender) {
|
|
2150
2163
|
const _disableForm = (disabled) => {
|
2151
2164
|
if (isBoolean(disabled)) {
|
2152
2165
|
_subjects.state.next({ disabled });
|
2153
|
-
iterateFieldsByAction(_fields, (ref) => {
|
2154
|
-
|
2166
|
+
iterateFieldsByAction(_fields, (ref, name) => {
|
2167
|
+
let requiredDisabledState = disabled;
|
2168
|
+
const currentField = get(_fields, name);
|
2169
|
+
if (currentField && isBoolean(currentField._f.disabled)) {
|
2170
|
+
requiredDisabledState || (requiredDisabledState = currentField._f.disabled);
|
2171
|
+
}
|
2172
|
+
ref.disabled = requiredDisabledState;
|
2155
2173
|
}, 0, false);
|
2156
2174
|
}
|
2157
2175
|
};
|
@@ -2355,6 +2373,7 @@ function createFormControl(props = {}, flushRootRender) {
|
|
2355
2373
|
_disableForm,
|
2356
2374
|
_subjects,
|
2357
2375
|
_proxyFormState,
|
2376
|
+
_setErrors,
|
2358
2377
|
get _fields() {
|
2359
2378
|
return _fields;
|
2360
2379
|
},
|
@@ -2451,7 +2470,7 @@ function useForm(props = {}) {
|
|
2451
2470
|
submitCount: 0,
|
2452
2471
|
dirtyFields: {},
|
2453
2472
|
touchedFields: {},
|
2454
|
-
errors: {},
|
2473
|
+
errors: props.errors || {},
|
2455
2474
|
disabled: false,
|
2456
2475
|
defaultValues: isFunction(props.defaultValues)
|
2457
2476
|
? undefined
|
@@ -2488,11 +2507,17 @@ function useForm(props = {}) {
|
|
2488
2507
|
if (props.values && !deepEqual(props.values, _values.current)) {
|
2489
2508
|
control._reset(props.values, control._options.resetOptions);
|
2490
2509
|
_values.current = props.values;
|
2510
|
+
updateFormState((state) => ({ ...state }));
|
2491
2511
|
}
|
2492
2512
|
else {
|
2493
2513
|
control._resetDefaultValues();
|
2494
2514
|
}
|
2495
2515
|
}, [props.values, control]);
|
2516
|
+
React.useEffect(() => {
|
2517
|
+
if (props.errors) {
|
2518
|
+
control._setErrors(props.errors);
|
2519
|
+
}
|
2520
|
+
}, [props.errors, control]);
|
2496
2521
|
React.useEffect(() => {
|
2497
2522
|
if (!control._state.mount) {
|
2498
2523
|
control._updateValid();
|