react-hook-form 7.81.0 → 7.83.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 +1 @@
1
- {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,EAiBX,YAAY,EAKZ,aAAa,EAYd,MAAM,UAAU,CAAC;AA0DlB,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,CA2zDA"}
1
+ {"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,EAkBX,YAAY,EAKZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAuElB,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,CAo3DA"}
@@ -1,4 +1,5 @@
1
- declare function markFieldsDirty<T>(data: T, fields?: Record<string, any>): Record<string, any>;
2
- export default function getDirtyFields<T>(data: T, formValues: T, dirtyFieldsFromValues?: Record<Extract<keyof T, string>, ReturnType<typeof markFieldsDirty> | boolean>): Record<Extract<keyof T, string>, boolean | Record<string, any>>;
1
+ import type { FieldRefs } from '../types';
2
+ declare function markFieldsDirty<T>(data: T, fields?: Record<string, any>, fieldRefs?: Record<string, any>): Record<string, any>;
3
+ export default function getDirtyFields<T>(data: T, formValues: T, dirtyFieldsFromValues?: Record<Extract<keyof T, string>, ReturnType<typeof markFieldsDirty> | boolean>, fieldRefs?: FieldRefs): Record<Extract<keyof T, string>, boolean | Record<string, any>>;
3
4
  export {};
4
5
  //# sourceMappingURL=getDirtyFields.d.ts.map
@@ -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;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
+ {"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA8B1C,iBAAS,eAAe,CAAC,CAAC,EACxB,IAAI,EAAE,CAAC,EACP,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBAsBhC;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,EACD,SAAS,CAAC,EAAE,SAAS,mEAwCtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"yBAKgB,OAAO,OAAO;AAA9B,wBAKY"}
1
+ {"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"yBAMgB,OAAO,OAAO;AAA9B,wBAOY"}
@@ -1,7 +1,4 @@
1
1
  import type { ValidationRule } from '../types';
2
- declare const _default: (validationData?: ValidationRule) => {
3
- value: string | number | boolean | RegExp | undefined;
4
- message: string;
5
- };
2
+ declare const _default: (validationData?: ValidationRule) => import("..").ValidationValueMessage<import("..").ValidationValue>;
6
3
  export default _default;
7
4
  //# sourceMappingURL=getValueAndMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc;;;;AAA/C,wBAMQ"}
1
+ {"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc;AAA/C,wBAMQ"}
@@ -353,12 +353,33 @@ var objectHasFunction = (data) => {
353
353
  function isTraversable(value) {
354
354
  return Array.isArray(value) || (isObject(value) && !objectHasFunction(value));
355
355
  }
356
- function markFieldsDirty(data, fields = {}) {
356
+ function isRegisteredLeaf(fieldRef) {
357
+ return !!(fieldRef && '_f' in fieldRef);
358
+ }
359
+ function isEmptyDirtyContainer(value) {
360
+ return Array.isArray(value)
361
+ ? !value.some((item) => !isUndefined(item))
362
+ : !Object.keys(value).length;
363
+ }
364
+ function clearDirtyField(container, key) {
365
+ if (Array.isArray(container)) {
366
+ container[key] = undefined;
367
+ }
368
+ else {
369
+ delete container[key];
370
+ }
371
+ }
372
+ function markFieldsDirty(data, fields = {}, fieldRefs) {
357
373
  for (const key in data) {
358
374
  const value = data[key];
359
- if (isTraversable(value)) {
375
+ const fieldRef = fieldRefs && fieldRefs[key];
376
+ if (isTraversable(value) &&
377
+ (!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
360
378
  fields[key] = Array.isArray(value) ? [] : {};
361
- markFieldsDirty(value, fields[key]);
379
+ markFieldsDirty(value, fields[key], fieldRef);
380
+ if (isEmptyDirtyContainer(fields[key])) {
381
+ clearDirtyField(fields, key);
382
+ }
362
383
  }
363
384
  else if (!isUndefined(value)) {
364
385
  fields[key] = true;
@@ -366,55 +387,41 @@ function markFieldsDirty(data, fields = {}) {
366
387
  }
367
388
  return fields;
368
389
  }
369
- function pruneDirtyFields(value) {
370
- if (value === false) {
371
- return undefined;
372
- }
373
- if (value === true) {
374
- return true;
375
- }
376
- if (Array.isArray(value)) {
377
- const result = value.map((value) => pruneDirtyFields(value));
378
- return (result.some((value) => value !== undefined) ? result : undefined);
379
- }
380
- if (isObject(value)) {
381
- const result = {};
382
- for (const key in value) {
383
- const pruned = pruneDirtyFields(value[key]);
384
- if (!isUndefined(pruned)) {
385
- result[key] = pruned;
386
- }
387
- }
388
- return (Object.keys(result).length ? result : undefined);
389
- }
390
- return undefined;
391
- }
392
- function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
390
+ function getDirtyFields(data, formValues, dirtyFieldsFromValues, fieldRefs) {
393
391
  if (!dirtyFieldsFromValues) {
394
- dirtyFieldsFromValues = markFieldsDirty(formValues);
392
+ dirtyFieldsFromValues = markFieldsDirty(formValues, {}, fieldRefs);
395
393
  }
396
394
  for (const key in data) {
397
395
  const value = data[key];
398
- if (isTraversable(value)) {
396
+ const fieldRef = fieldRefs && fieldRefs[key];
397
+ if (isTraversable(value) &&
398
+ (!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
399
399
  if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {
400
- dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {});
400
+ dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {}, fieldRef);
401
401
  }
402
402
  else {
403
- getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
403
+ getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key], fieldRef);
404
404
  }
405
+ if (isEmptyDirtyContainer(dirtyFieldsFromValues[key])) {
406
+ clearDirtyField(dirtyFieldsFromValues, key);
407
+ }
408
+ }
409
+ else if (deepEqual(value, formValues[key])) {
410
+ clearDirtyField(dirtyFieldsFromValues, key);
405
411
  }
406
412
  else {
407
- const formValue = formValues[key];
408
- dirtyFieldsFromValues[key] = !deepEqual(value, formValue);
413
+ dirtyFieldsFromValues[key] = true;
409
414
  }
410
415
  }
411
- return pruneDirtyFields(dirtyFieldsFromValues) || {};
416
+ return dirtyFieldsFromValues;
412
417
  }
413
418
 
414
419
  var getEventValue = (event) => isObject(event) && event.target
415
420
  ? isCheckBoxInput(event.target)
416
421
  ? event.target.checked
417
- : event.target.value
422
+ : isFileInput(event.target)
423
+ ? event.target.files
424
+ : event.target.value
418
425
  : event;
419
426
 
420
427
  const defaultResult = {
@@ -881,6 +888,14 @@ const defaultOptions = {
881
888
  shouldFocusError: true,
882
889
  };
883
890
  const FORM_ERROR_TYPE = 'form';
891
+ const updateDirtyFields = (dirtyFields, nextDirtyFields) => {
892
+ for (const key in dirtyFields) {
893
+ if (!(key in nextDirtyFields)) {
894
+ delete dirtyFields[key];
895
+ }
896
+ }
897
+ Object.assign(dirtyFields, nextDirtyFields);
898
+ };
884
899
  const DEFAULT_FORM_STATE = {
885
900
  submitCount: 0,
886
901
  isDirty: false,
@@ -926,8 +941,8 @@ function createFormControl(props = {}) {
926
941
  watch: new Set(),
927
942
  registerName: new Set(),
928
943
  };
929
- let delayErrorCallback;
930
- let timer = 0;
944
+ const delayErrorCallbacks = {};
945
+ const timers = {};
931
946
  let _valuesSubscriberCount = 0;
932
947
  let _validationModeBeforeSubmit = getValidationModes(_options.mode);
933
948
  let _validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
@@ -950,10 +965,11 @@ function createFormControl(props = {}) {
950
965
  array: createSubject(),
951
966
  state: createSubject(),
952
967
  };
968
+ let _setValidCallId = 0;
953
969
  const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;
954
- const debounce = (callback) => (wait) => {
955
- clearTimeout(timer);
956
- timer = setTimeout(callback, wait);
970
+ const debounce = (name, callback) => (wait) => {
971
+ clearTimeout(timers[name]);
972
+ timers[name] = setTimeout(callback, wait);
957
973
  };
958
974
  const _setValid = async (shouldUpdateValid) => {
959
975
  if (_state.keepIsValid) {
@@ -963,10 +979,11 @@ function createFormControl(props = {}) {
963
979
  (_proxyFormState.isValid ||
964
980
  _proxySubscribeFormState.isValid ||
965
981
  shouldUpdateValid)) {
982
+ const callId = ++_setValidCallId;
966
983
  let isValid;
967
984
  if (_options.resolver) {
968
985
  isValid = isEmptyObject((await _runSchema()).errors);
969
- _updateIsValidating();
986
+ callId === _setValidCallId && _updateIsValidating();
970
987
  }
971
988
  else {
972
989
  isValid = await executeBuiltInValidation({
@@ -975,7 +992,7 @@ function createFormControl(props = {}) {
975
992
  eventType: EVENTS.VALID,
976
993
  });
977
994
  }
978
- if (isValid !== _formState.isValid) {
995
+ if (callId === _setValidCallId && isValid !== _formState.isValid) {
979
996
  _subjects.state.next({
980
997
  isValid,
981
998
  });
@@ -1002,7 +1019,7 @@ function createFormControl(props = {}) {
1002
1019
  }
1003
1020
  };
1004
1021
  const _updateDirtyFields = () => {
1005
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1022
+ _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues, undefined, _fields);
1006
1023
  };
1007
1024
  const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
1008
1025
  if (args && method && !_options.disabled) {
@@ -1108,7 +1125,9 @@ function createFormControl(props = {}) {
1108
1125
  const output = {
1109
1126
  name,
1110
1127
  };
1111
- if (!_options.disabled) {
1128
+ // an explicit programmatic update (e.g. setValue with shouldDirty: true)
1129
+ // opts into dirty tracking even when the form is disabled
1130
+ if (!_options.disabled || shouldDirty === true) {
1112
1131
  if (!isBlurEvent || shouldDirty) {
1113
1132
  const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
1114
1133
  if (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty) {
@@ -1119,7 +1138,7 @@ function createFormControl(props = {}) {
1119
1138
  }
1120
1139
  isPreviousDirty = !!get(_formState.dirtyFields, name);
1121
1140
  if (isCurrentFieldPristine !== _formState.isDirty) {
1122
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1141
+ updateDirtyFields(_formState.dirtyFields, getDirtyFields(_defaultValues, _formValues, undefined, _fields));
1123
1142
  }
1124
1143
  else {
1125
1144
  isCurrentFieldPristine
@@ -1155,12 +1174,12 @@ function createFormControl(props = {}) {
1155
1174
  isBoolean(isValid) &&
1156
1175
  _formState.isValid !== isValid;
1157
1176
  if (_options.delayError && error) {
1158
- delayErrorCallback = debounce(() => updateErrors(name, error));
1159
- delayErrorCallback(_options.delayError);
1177
+ delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
1178
+ delayErrorCallbacks[name](_options.delayError);
1160
1179
  }
1161
1180
  else {
1162
- clearTimeout(timer);
1163
- delayErrorCallback = null;
1181
+ clearTimeout(timers[name]);
1182
+ delete delayErrorCallbacks[name];
1164
1183
  error
1165
1184
  ? set(_formState.errors, name, error)
1166
1185
  : unset(_formState.errors, name);
@@ -1313,9 +1332,8 @@ function createFormControl(props = {}) {
1313
1332
  }
1314
1333
  _names.unMount = new Set();
1315
1334
  };
1316
- const _getDirty = (name, data) => !_options.disabled &&
1317
- (name && data && set(_formValues, name, data),
1318
- !deepEqual(_state.mount ? _formValues : _defaultValues, _defaultValues));
1335
+ const _getDirty = (name, data) => (name && data && set(_formValues, name, data),
1336
+ !deepEqual(_state.mount ? _formValues : _defaultValues, _defaultValues));
1319
1337
  const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {
1320
1338
  ...(_state.mount
1321
1339
  ? _formValues
@@ -1375,7 +1393,10 @@ function createFormControl(props = {}) {
1375
1393
  }
1376
1394
  (options.shouldDirty || options.shouldTouch) &&
1377
1395
  updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, !skipRender);
1378
- options.shouldValidate && trigger(name);
1396
+ options.shouldValidate &&
1397
+ trigger(name, {
1398
+ delayError: options.delayError,
1399
+ });
1379
1400
  };
1380
1401
  const setFieldValues = (name, value, options, skipClone = false, skipRender = false) => {
1381
1402
  for (const fieldKey in value) {
@@ -1500,7 +1521,8 @@ function createFormControl(props = {}) {
1500
1521
  if (isBlurEvent) {
1501
1522
  if (!target || !target.readOnly) {
1502
1523
  field._f.onBlur && field._f.onBlur(event);
1503
- delayErrorCallback && delayErrorCallback(0);
1524
+ const pendingDelayError = delayErrorCallbacks[name];
1525
+ pendingDelayError && pendingDelayError(0);
1504
1526
  }
1505
1527
  }
1506
1528
  else if (field._f.onChange) {
@@ -1615,6 +1637,18 @@ function createFormControl(props = {}) {
1615
1637
  eventType: EVENTS.TRIGGER,
1616
1638
  });
1617
1639
  }
1640
+ if (options.delayError && _options.delayError && isString(name)) {
1641
+ const error = get(_formState.errors, name);
1642
+ if (error) {
1643
+ unset(_formState.errors, name);
1644
+ delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
1645
+ delayErrorCallbacks[name](_options.delayError);
1646
+ }
1647
+ else {
1648
+ clearTimeout(timers[name]);
1649
+ delete delayErrorCallbacks[name];
1650
+ }
1651
+ }
1618
1652
  _subjects.state.next({
1619
1653
  ...(!isString(name) ||
1620
1654
  ((_proxyFormState.isValid || _proxySubscribeFormState.isValid) &&
@@ -1661,8 +1695,9 @@ function createFormControl(props = {}) {
1661
1695
  });
1662
1696
  }
1663
1697
  else {
1698
+ _formState.errors = {};
1664
1699
  _subjects.state.next({
1665
- errors: {},
1700
+ errors: _formState.errors,
1666
1701
  });
1667
1702
  }
1668
1703
  };
@@ -1847,20 +1882,23 @@ function createFormControl(props = {}) {
1847
1882
  : fieldRef === field._f.ref) {
1848
1883
  return;
1849
1884
  }
1885
+ const newField = {
1886
+ ...field._f,
1887
+ };
1888
+ if (radioOrCheckbox) {
1889
+ newField.refs = [
1890
+ ...refs.filter(live),
1891
+ fieldRef,
1892
+ ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
1893
+ ];
1894
+ newField.ref = { type: fieldRef.type, name };
1895
+ }
1896
+ else {
1897
+ newField.ref = fieldRef;
1898
+ delete newField.refs;
1899
+ }
1850
1900
  set(_fields, name, {
1851
- _f: {
1852
- ...field._f,
1853
- ...(radioOrCheckbox
1854
- ? {
1855
- refs: [
1856
- ...refs.filter(live),
1857
- fieldRef,
1858
- ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
1859
- ],
1860
- ref: { type: fieldRef.type, name },
1861
- }
1862
- : { ref: fieldRef }),
1863
- },
1901
+ _f: newField,
1864
1902
  });
1865
1903
  updateValidAndValue(name, false, undefined, fieldRef);
1866
1904
  }
@@ -1983,6 +2021,7 @@ function createFormControl(props = {}) {
1983
2021
  const cloneUpdatedValues = cloneObject(updatedValues);
1984
2022
  const isEmptyResetValues = isEmptyObject(formValues);
1985
2023
  const values = cloneUpdatedValues;
2024
+ const fieldRefs = _fields;
1986
2025
  if (!keepStateOptions.keepDefaultValues) {
1987
2026
  _defaultValues = updatedValues;
1988
2027
  }
@@ -1990,7 +2029,7 @@ function createFormControl(props = {}) {
1990
2029
  if (keepStateOptions.keepDirtyValues) {
1991
2030
  const fieldsToCheck = new Set([
1992
2031
  ..._names.mount,
1993
- ...Object.keys(getDirtyFields(_defaultValues, _formValues)),
2032
+ ...Object.keys(getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs)),
1994
2033
  ]);
1995
2034
  for (const fieldName of Array.from(fieldsToCheck)) {
1996
2035
  const isDirty = get(_formState.dirtyFields, fieldName);
@@ -2093,10 +2132,10 @@ function createFormControl(props = {}) {
2093
2132
  ? {}
2094
2133
  : keepStateOptions.keepDirtyValues
2095
2134
  ? keepStateOptions.keepDefaultValues && _formValues
2096
- ? getDirtyFields(_defaultValues, _formValues)
2135
+ ? getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs)
2097
2136
  : _formState.dirtyFields
2098
2137
  : keepStateOptions.keepDefaultValues && formValues
2099
- ? getDirtyFields(_defaultValues, formValues)
2138
+ ? getDirtyFields(_defaultValues, formValues, undefined, fieldRefs)
2100
2139
  : keepStateOptions.keepDirty
2101
2140
  ? _formState.dirtyFields
2102
2141
  : {},
@@ -2153,7 +2192,7 @@ function createFormControl(props = {}) {
2153
2192
  const resetDefaultValues = (values, options = {}) => {
2154
2193
  _defaultValues = cloneObject(values);
2155
2194
  if (!options.keepDirty) {
2156
- const newDirtyFields = getDirtyFields(_defaultValues, _formValues);
2195
+ const newDirtyFields = getDirtyFields(_defaultValues, _formValues, undefined, _fields);
2157
2196
  _formState.dirtyFields = newDirtyFields;
2158
2197
  _formState.isDirty = !isEmptyObject(newDirtyFields);
2159
2198
  }