react-hook-form 7.48.1 → 7.49.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 +68 -33
- 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 +8 -6
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,6 +407,7 @@ function useController(props) {
|
|
407
407
|
const _registerProps = React.useRef(control.register(name, {
|
408
408
|
...props.rules,
|
409
409
|
value,
|
410
|
+
disabled: props.disabled,
|
410
411
|
}));
|
411
412
|
_registerProps.current = control.register(name, props.rules);
|
412
413
|
React.useEffect(() => {
|
@@ -689,6 +690,9 @@ const iterateFieldsByAction = (fields, action, fieldsNames, abortEarly) => {
|
|
689
690
|
else if (_f.ref && action(_f.ref, _f.name) && !abortEarly) {
|
690
691
|
break;
|
691
692
|
}
|
693
|
+
else {
|
694
|
+
iterateFieldsByAction(currentField, action);
|
695
|
+
}
|
692
696
|
}
|
693
697
|
else if (isObject(currentField)) {
|
694
698
|
iterateFieldsByAction(currentField, action);
|
@@ -959,9 +963,10 @@ var validateField = async (field, formValues, validateAllFieldCriteria, shouldUs
|
|
959
963
|
return error;
|
960
964
|
};
|
961
965
|
|
962
|
-
|
963
|
-
|
964
|
-
|
966
|
+
var appendAt = (data, value) => [
|
967
|
+
...data,
|
968
|
+
...convertToArrayPayload(value),
|
969
|
+
];
|
965
970
|
|
966
971
|
var fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;
|
967
972
|
|
@@ -984,9 +989,10 @@ var moveArrayAt = (data, from, to) => {
|
|
984
989
|
return data;
|
985
990
|
};
|
986
991
|
|
987
|
-
|
988
|
-
|
989
|
-
|
992
|
+
var prependAt = (data, value) => [
|
993
|
+
...convertToArrayPayload(value),
|
994
|
+
...convertToArrayPayload(data),
|
995
|
+
];
|
990
996
|
|
991
997
|
function removeAtIndexes(data, indexes) {
|
992
998
|
let i = 0;
|
@@ -1002,7 +1008,7 @@ var removeArrayAt = (data, index) => isUndefined(index)
|
|
1002
1008
|
: removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));
|
1003
1009
|
|
1004
1010
|
var swapArrayAt = (data, indexA, indexB) => {
|
1005
|
-
data[indexA]
|
1011
|
+
[data[indexA], data[indexB]] = [data[indexB], data[indexA]];
|
1006
1012
|
};
|
1007
1013
|
|
1008
1014
|
function baseGet(object, updatePath) {
|
@@ -1112,25 +1118,25 @@ function useFieldArray(props) {
|
|
1112
1118
|
_actioned.current = true;
|
1113
1119
|
control._updateFieldArray(name, updatedFieldArrayValues);
|
1114
1120
|
}, [control, name]);
|
1115
|
-
const append
|
1121
|
+
const append = (value, options) => {
|
1116
1122
|
const appendValue = convertToArrayPayload(cloneObject(value));
|
1117
|
-
const updatedFieldArrayValues =
|
1123
|
+
const updatedFieldArrayValues = appendAt(control._getFieldArray(name), appendValue);
|
1118
1124
|
control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
|
1119
|
-
ids.current =
|
1125
|
+
ids.current = appendAt(ids.current, appendValue.map(generateId));
|
1120
1126
|
updateValues(updatedFieldArrayValues);
|
1121
1127
|
setFields(updatedFieldArrayValues);
|
1122
|
-
control._updateFieldArray(name, updatedFieldArrayValues,
|
1128
|
+
control._updateFieldArray(name, updatedFieldArrayValues, appendAt, {
|
1123
1129
|
argA: fillEmptyArray(value),
|
1124
1130
|
});
|
1125
1131
|
};
|
1126
|
-
const prepend
|
1132
|
+
const prepend = (value, options) => {
|
1127
1133
|
const prependValue = convertToArrayPayload(cloneObject(value));
|
1128
|
-
const updatedFieldArrayValues =
|
1134
|
+
const updatedFieldArrayValues = prependAt(control._getFieldArray(name), prependValue);
|
1129
1135
|
control._names.focus = getFocusFieldName(name, 0, options);
|
1130
|
-
ids.current =
|
1136
|
+
ids.current = prependAt(ids.current, prependValue.map(generateId));
|
1131
1137
|
updateValues(updatedFieldArrayValues);
|
1132
1138
|
setFields(updatedFieldArrayValues);
|
1133
|
-
control._updateFieldArray(name, updatedFieldArrayValues,
|
1139
|
+
control._updateFieldArray(name, updatedFieldArrayValues, prependAt, {
|
1134
1140
|
argA: fillEmptyArray(value),
|
1135
1141
|
});
|
1136
1142
|
};
|
@@ -1261,8 +1267,8 @@ function useFieldArray(props) {
|
|
1261
1267
|
return {
|
1262
1268
|
swap: React.useCallback(swap, [updateValues, name, control]),
|
1263
1269
|
move: React.useCallback(move, [updateValues, name, control]),
|
1264
|
-
prepend: React.useCallback(prepend
|
1265
|
-
append: React.useCallback(append
|
1270
|
+
prepend: React.useCallback(prepend, [updateValues, name, control]),
|
1271
|
+
append: React.useCallback(append, [updateValues, name, control]),
|
1266
1272
|
remove: React.useCallback(remove, [updateValues, name, control]),
|
1267
1273
|
insert: React.useCallback(insert$1, [updateValues, name, control]),
|
1268
1274
|
update: React.useCallback(update, [updateValues, name, control]),
|
@@ -1274,7 +1280,7 @@ function useFieldArray(props) {
|
|
1274
1280
|
};
|
1275
1281
|
}
|
1276
1282
|
|
1277
|
-
|
1283
|
+
var createSubject = () => {
|
1278
1284
|
let _observers = [];
|
1279
1285
|
const next = (value) => {
|
1280
1286
|
for (const observer of _observers) {
|
@@ -1300,7 +1306,7 @@ function createSubject() {
|
|
1300
1306
|
subscribe,
|
1301
1307
|
unsubscribe,
|
1302
1308
|
};
|
1303
|
-
}
|
1309
|
+
};
|
1304
1310
|
|
1305
1311
|
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
1306
1312
|
|
@@ -1526,7 +1532,7 @@ function createFormControl(props = {}, flushRootRender) {
|
|
1526
1532
|
isValid: false,
|
1527
1533
|
touchedFields: {},
|
1528
1534
|
dirtyFields: {},
|
1529
|
-
errors: {},
|
1535
|
+
errors: _options.errors || {},
|
1530
1536
|
disabled: false,
|
1531
1537
|
};
|
1532
1538
|
let _fields = {};
|
@@ -1626,6 +1632,13 @@ function createFormControl(props = {}, flushRootRender) {
|
|
1626
1632
|
errors: _formState.errors,
|
1627
1633
|
});
|
1628
1634
|
};
|
1635
|
+
const _setErrors = (errors) => {
|
1636
|
+
_formState.errors = errors;
|
1637
|
+
_subjects.state.next({
|
1638
|
+
errors: _formState.errors,
|
1639
|
+
isValid: false,
|
1640
|
+
});
|
1641
|
+
};
|
1629
1642
|
const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
|
1630
1643
|
const field = get(_fields, name);
|
1631
1644
|
if (field) {
|
@@ -2148,10 +2161,15 @@ function createFormControl(props = {}, flushRootRender) {
|
|
2148
2161
|
const _focusError = () => _options.shouldFocusError &&
|
2149
2162
|
iterateFieldsByAction(_fields, _focusInput, _names.mount);
|
2150
2163
|
const _disableForm = (disabled) => {
|
2151
|
-
if (isBoolean(
|
2152
|
-
_subjects.state.next({ disabled
|
2153
|
-
iterateFieldsByAction(_fields, (ref) => {
|
2154
|
-
|
2164
|
+
if (isBoolean(disabled)) {
|
2165
|
+
_subjects.state.next({ disabled });
|
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
|
@@ -2474,15 +2493,31 @@ function useForm(props = {}) {
|
|
2474
2493
|
},
|
2475
2494
|
});
|
2476
2495
|
React.useEffect(() => control._disableForm(props.disabled), [control, props.disabled]);
|
2496
|
+
React.useEffect(() => {
|
2497
|
+
if (control._proxyFormState.isDirty) {
|
2498
|
+
const isDirty = control._getDirty();
|
2499
|
+
if (isDirty !== formState.isDirty) {
|
2500
|
+
control._subjects.state.next({
|
2501
|
+
isDirty,
|
2502
|
+
});
|
2503
|
+
}
|
2504
|
+
}
|
2505
|
+
}, [control, formState.isDirty]);
|
2477
2506
|
React.useEffect(() => {
|
2478
2507
|
if (props.values && !deepEqual(props.values, _values.current)) {
|
2479
2508
|
control._reset(props.values, control._options.resetOptions);
|
2480
2509
|
_values.current = props.values;
|
2510
|
+
updateFormState((state) => ({ ...state }));
|
2481
2511
|
}
|
2482
2512
|
else {
|
2483
2513
|
control._resetDefaultValues();
|
2484
2514
|
}
|
2485
2515
|
}, [props.values, control]);
|
2516
|
+
React.useEffect(() => {
|
2517
|
+
if (props.errors) {
|
2518
|
+
control._setErrors(props.errors);
|
2519
|
+
}
|
2520
|
+
}, [props.errors, control]);
|
2486
2521
|
React.useEffect(() => {
|
2487
2522
|
if (!control._state.mount) {
|
2488
2523
|
control._updateValid();
|