@zat-design/sisyphus-react 3.14.2 → 3.14.3
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.esm.css +1 -1
- package/dist/less.esm.css +1 -1
- package/es/ProForm/index.js +4 -1
- package/es/ProTree/components/ProTreeSelect/index.js +107 -72
- package/es/ProTreeModal/style/index.less +6 -0
- package/lib/ProForm/index.js +4 -1
- package/lib/ProTree/components/ProTreeSelect/index.js +107 -72
- package/lib/ProTreeModal/style/index.less +6 -0
- package/package.json +2 -1
|
@@ -14,8 +14,8 @@ require("antd/es/input/style");
|
|
|
14
14
|
var _input = _interopRequireDefault(require("antd/es/input"));
|
|
15
15
|
require("antd/es/message/style");
|
|
16
16
|
var _message2 = _interopRequireDefault(require("antd/es/message"));
|
|
17
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
18
17
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
18
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
19
19
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
20
20
|
require("antd/es/tree-select/style");
|
|
21
21
|
var _treeSelect = _interopRequireDefault(require("antd/es/tree-select"));
|
|
@@ -23,18 +23,18 @@ var _ahooks = require("ahooks");
|
|
|
23
23
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
24
24
|
var _react = _interopRequireWildcard(require("react"));
|
|
25
25
|
var _lodash = require("lodash");
|
|
26
|
+
var _utils = require("@zat-design/utils");
|
|
26
27
|
var _locale = _interopRequireDefault(require("../../../locale"));
|
|
27
28
|
var _ProConfigProvider = require("../../../ProConfigProvider");
|
|
28
29
|
var _Container = _interopRequireDefault(require("../../../ProForm/components/Container"));
|
|
29
30
|
var _AdaptiveTooltip = _interopRequireDefault(require("../AdaptiveTooltip"));
|
|
30
31
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
31
|
-
var _excluded = ["disabled", "code", "dataSource", "defaultDisableValue", "onChange", "useRequest", "transformResponse", "fieldNames", "placeholder", "tooltip", "showSearch", "filterTreeNode", "treeNodeFilterProp", "defaultExpandAll", "expandedKeys", "treeCheckable", "onSearch", "otherProps", "width", "dropdownStyle", "popupClassName", "style", "allowClear", "listHeight", "showCodeName", "className", "checkStrictly", "checkable"]
|
|
32
|
-
_excluded2 = ["children"];
|
|
32
|
+
var _excluded = ["disabled", "code", "dataSource", "defaultDisableValue", "onChange", "useRequest", "transformResponse", "fieldNames", "placeholder", "tooltip", "showSearch", "filterTreeNode", "treeNodeFilterProp", "defaultExpandAll", "expandedKeys", "treeCheckable", "onSearch", "otherProps", "width", "dropdownStyle", "popupClassName", "style", "allowClear", "listHeight", "showCodeName", "className", "checkStrictly", "checkable"];
|
|
33
33
|
/* eslint-disable react/no-danger */
|
|
34
34
|
/* eslint-disable react/jsx-closing-tag-location */
|
|
35
35
|
var SHOW_PARENT = _treeSelect.default.SHOW_PARENT;
|
|
36
36
|
var ProTreeSelect = (props, ref) => {
|
|
37
|
-
var _useRequest$options;
|
|
37
|
+
var _useRequest$options, _useRequest$options3;
|
|
38
38
|
// 全局属性配置在ConfigProvider
|
|
39
39
|
var _ref = (0, _ProConfigProvider.useProConfig)('ProTreeSelect') || {},
|
|
40
40
|
_ref$fieldNames = _ref.fieldNames,
|
|
@@ -42,14 +42,7 @@ var ProTreeSelect = (props, ref) => {
|
|
|
42
42
|
var _useProConfig = (0, _ProConfigProvider.useProConfig)('ProEnum'),
|
|
43
43
|
_useProConfig$dics = _useProConfig.dics,
|
|
44
44
|
dics = _useProConfig$dics === void 0 ? {} : _useProConfig$dics;
|
|
45
|
-
|
|
46
|
-
var code = 'value';
|
|
47
|
-
var uuidKey = 'value';
|
|
48
|
-
if (proSelectFieldNames && Object.keys(proSelectFieldNames).length) {
|
|
49
|
-
code = proSelectFieldNames.value;
|
|
50
|
-
label = proSelectFieldNames.label;
|
|
51
|
-
uuidKey = proSelectFieldNames.key || proSelectFieldNames.value;
|
|
52
|
-
}
|
|
45
|
+
|
|
53
46
|
// 配置属性
|
|
54
47
|
var disabled = props.disabled,
|
|
55
48
|
enumCode = props.code,
|
|
@@ -95,11 +88,32 @@ var ProTreeSelect = (props, ref) => {
|
|
|
95
88
|
var _ref3 = otherProps || {},
|
|
96
89
|
isView = _ref3.isView,
|
|
97
90
|
viewEmpty = _ref3.viewEmpty;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
91
|
+
|
|
92
|
+
// 合并全局和组件级别的 fieldNames,优先级:组件级 > 全局
|
|
93
|
+
var finalFieldNames = (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
94
|
+
label: 'label',
|
|
95
|
+
value: 'value',
|
|
96
|
+
children: 'children'
|
|
97
|
+
}, proSelectFieldNames), fieldNames);
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 使用 tools.transformDataName 统一转换字段名
|
|
101
|
+
* 将原始数据转换为标准格式(label, value, children)
|
|
102
|
+
* tools.transformDataName 会自动检查数据是否已经是标准格式,如果是则直接返回
|
|
103
|
+
*/
|
|
104
|
+
var transformFieldNames = (0, _react.useCallback)(data => {
|
|
105
|
+
if (!data || !Array.isArray(data) || !data.length) {
|
|
106
|
+
return data || [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 使用 tools.transformDataName 转换字段名
|
|
110
|
+
// 它会自动检查数据是否已经是标准格式(label, value, children),如果是则直接返回
|
|
111
|
+
return _utils.tools.transformDataName(data, {
|
|
112
|
+
label: finalFieldNames.label,
|
|
113
|
+
value: finalFieldNames.value,
|
|
114
|
+
children: finalFieldNames.children
|
|
115
|
+
});
|
|
116
|
+
}, [finalFieldNames]);
|
|
103
117
|
// 经过处理后的枚举数据,可能来自用户配置的处理函数后返回的结果
|
|
104
118
|
var _useSetState = (0, _ahooks.useSetState)({}),
|
|
105
119
|
_useSetState2 = (0, _slicedToArray2.default)(_useSetState, 2),
|
|
@@ -112,6 +126,7 @@ var ProTreeSelect = (props, ref) => {
|
|
|
112
126
|
|
|
113
127
|
/**
|
|
114
128
|
* 如果数据少于10条那么将数据平铺返回
|
|
129
|
+
* 注意:当 treeCheckable 为 false 时(单选模式),应保持树形结构,不进行平铺
|
|
115
130
|
* @param dictsEnum 原始数据
|
|
116
131
|
* @returns 平铺或者原始数据
|
|
117
132
|
*/
|
|
@@ -119,50 +134,33 @@ var ProTreeSelect = (props, ref) => {
|
|
|
119
134
|
if (treeCheckable) {
|
|
120
135
|
return dictsEnum;
|
|
121
136
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
var loopCount = data => {
|
|
125
|
-
data.map(item => {
|
|
126
|
-
count += 1;
|
|
127
|
-
var children = item.children,
|
|
128
|
-
other = (0, _objectWithoutProperties2.default)(item, _excluded2);
|
|
129
|
-
result.push((0, _objectSpread2.default)({}, other));
|
|
130
|
-
if (item.children) {
|
|
131
|
-
loopCount(item.children);
|
|
132
|
-
}
|
|
133
|
-
return item;
|
|
134
|
-
});
|
|
135
|
-
};
|
|
136
|
-
if ((dictsEnum === null || dictsEnum === void 0 ? void 0 : dictsEnum.length) > 10) {
|
|
137
|
-
return dictsEnum;
|
|
138
|
-
}
|
|
139
|
-
loopCount(dictsEnum);
|
|
140
|
-
if (count <= 10) {
|
|
141
|
-
return result;
|
|
142
|
-
}
|
|
137
|
+
// 单选模式(treeCheckable=false)时,保持树形结构,不进行平铺
|
|
138
|
+
// 因为 TreeSelect 在单选模式下也需要树形结构来正确展示层级关系
|
|
143
139
|
return dictsEnum;
|
|
144
140
|
};
|
|
145
141
|
|
|
146
142
|
/**
|
|
147
143
|
* 如果要展示code-name,那么将源数据的label转为code-name
|
|
148
|
-
*
|
|
144
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
145
|
+
* @param dataArr 源数据(标准格式)
|
|
149
146
|
* @param showCodeAndName 是否展示code-name
|
|
150
147
|
* @returns 转换结果
|
|
151
148
|
*/
|
|
152
149
|
var transferDataSource = (dataArr, showCodeAndName) => {
|
|
150
|
+
if (!showCodeAndName) {
|
|
151
|
+
return dataArr;
|
|
152
|
+
}
|
|
153
153
|
var copyData = (0, _lodash.cloneDeep)(dataArr);
|
|
154
154
|
var loop = arr => {
|
|
155
155
|
arr.map(item => {
|
|
156
|
-
item
|
|
156
|
+
item.label = `${item.value}-${item.label}`;
|
|
157
157
|
if (item.children) {
|
|
158
158
|
loop(item.children);
|
|
159
159
|
}
|
|
160
160
|
return item;
|
|
161
161
|
});
|
|
162
162
|
};
|
|
163
|
-
|
|
164
|
-
loop(copyData);
|
|
165
|
-
}
|
|
163
|
+
loop(copyData);
|
|
166
164
|
return copyData;
|
|
167
165
|
};
|
|
168
166
|
var defaultOnSuccessFun = res => {
|
|
@@ -174,7 +172,9 @@ var ProTreeSelect = (props, ref) => {
|
|
|
174
172
|
_message2.default.error(msg);
|
|
175
173
|
return;
|
|
176
174
|
}
|
|
177
|
-
|
|
175
|
+
// 先转换字段名,再处理 code-name 展示
|
|
176
|
+
var transformedData = transformFieldNames(data || []);
|
|
177
|
+
var resultData = transferDataSource(transformedData, showCodeName);
|
|
178
178
|
setState({
|
|
179
179
|
selectList: resultData || [],
|
|
180
180
|
origDataSource: resultData || []
|
|
@@ -203,7 +203,9 @@ var ProTreeSelect = (props, ref) => {
|
|
|
203
203
|
onSuccess: data => {
|
|
204
204
|
if (transformResponse && typeof transformResponse === 'function') {
|
|
205
205
|
var responseData = transformResponse(data);
|
|
206
|
-
|
|
206
|
+
// 先转换字段名,再处理 code-name 展示
|
|
207
|
+
var transformedData = transformFieldNames(responseData);
|
|
208
|
+
var resultData = transferDataSource(transformedData, showCodeName);
|
|
207
209
|
setState({
|
|
208
210
|
selectList: countChild(resultData),
|
|
209
211
|
origDataSource: resultData
|
|
@@ -224,7 +226,9 @@ var ProTreeSelect = (props, ref) => {
|
|
|
224
226
|
if (fetchFunction !== null && fetchFunction !== void 0 && fetchFunction.data, useRequest !== null && useRequest !== void 0 && (_useRequest$options2 = useRequest.options) !== null && _useRequest$options2 !== void 0 && _useRequest$options2.cacheKey) {
|
|
225
227
|
if (transformResponse && typeof transformResponse === 'function') {
|
|
226
228
|
var responseData = transformResponse(fetchFunction.data);
|
|
227
|
-
|
|
229
|
+
// 先转换字段名,再处理 code-name 展示
|
|
230
|
+
var transformedData = transformFieldNames(responseData);
|
|
231
|
+
var resultData = transferDataSource(transformedData, showCodeName);
|
|
228
232
|
setState({
|
|
229
233
|
selectList: countChild(resultData),
|
|
230
234
|
origDataSource: resultData
|
|
@@ -233,23 +237,31 @@ var ProTreeSelect = (props, ref) => {
|
|
|
233
237
|
defaultOnSuccessFun(fetchFunction.data);
|
|
234
238
|
}
|
|
235
239
|
}
|
|
236
|
-
|
|
240
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
241
|
+
}, [fetchFunction === null || fetchFunction === void 0 ? void 0 : fetchFunction.data, useRequest === null || useRequest === void 0 || (_useRequest$options3 = useRequest.options) === null || _useRequest$options3 === void 0 ? void 0 : _useRequest$options3.cacheKey]);
|
|
237
242
|
(0, _ahooks.useDeepCompareEffect)(() => {
|
|
238
243
|
if (enumCode) {
|
|
239
244
|
var dictEnum = dics[enumCode] || [];
|
|
240
|
-
|
|
245
|
+
// 先转换字段名,再处理 code-name 展示
|
|
246
|
+
var transformedData = transformFieldNames(dictEnum);
|
|
247
|
+
var resultData = transferDataSource(transformedData, showCodeName);
|
|
248
|
+
var processedList = countChild(resultData);
|
|
241
249
|
setState({
|
|
242
|
-
selectList:
|
|
250
|
+
selectList: processedList,
|
|
243
251
|
origDataSource: resultData
|
|
244
252
|
});
|
|
245
253
|
} else if (dataSource) {
|
|
246
|
-
|
|
254
|
+
// 先转换字段名,再处理 code-name 展示
|
|
255
|
+
var _transformedData = transformFieldNames(dataSource);
|
|
256
|
+
var _resultData = transferDataSource(_transformedData, showCodeName);
|
|
257
|
+
var _processedList = countChild(_resultData);
|
|
247
258
|
setState({
|
|
248
|
-
selectList:
|
|
259
|
+
selectList: _processedList,
|
|
249
260
|
origDataSource: _resultData
|
|
250
261
|
});
|
|
251
262
|
}
|
|
252
|
-
|
|
263
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
264
|
+
}, [enumCode, dataSource, showCodeName]);
|
|
253
265
|
(0, _ahooks.useDeepCompareEffect)(() => {
|
|
254
266
|
// code存在huo dataSource存在,不执行接口请求
|
|
255
267
|
if (enumCode || dataSource) {
|
|
@@ -285,6 +297,7 @@ var ProTreeSelect = (props, ref) => {
|
|
|
285
297
|
|
|
286
298
|
/**
|
|
287
299
|
* 根据值进行回显
|
|
300
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
288
301
|
* @param value 输入值
|
|
289
302
|
* @returns 对应枚举label
|
|
290
303
|
*/
|
|
@@ -294,8 +307,8 @@ var ProTreeSelect = (props, ref) => {
|
|
|
294
307
|
}
|
|
295
308
|
var labelResult = [];
|
|
296
309
|
var queryLabel = dicts => dicts.map(item => {
|
|
297
|
-
if (value.includes(item
|
|
298
|
-
var labelText = item
|
|
310
|
+
if (value.includes(item.value)) {
|
|
311
|
+
var labelText = item.label;
|
|
299
312
|
labelResult.push(labelText);
|
|
300
313
|
}
|
|
301
314
|
if (item.children) {
|
|
@@ -340,15 +353,22 @@ var ProTreeSelect = (props, ref) => {
|
|
|
340
353
|
|
|
341
354
|
/**
|
|
342
355
|
* 自定义渲染子树
|
|
343
|
-
*
|
|
356
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
357
|
+
* @param node 每个节点数据对象(标准格式)
|
|
344
358
|
* @returns 整个react节点树
|
|
345
359
|
*/
|
|
346
360
|
var renderTreeNode = (node, grade) => {
|
|
347
361
|
var children = node.children,
|
|
348
|
-
icon = node.icon
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
362
|
+
icon = node.icon,
|
|
363
|
+
label = node.label,
|
|
364
|
+
nodeValue = node.value,
|
|
365
|
+
nodeKey = node.key;
|
|
366
|
+
var labelText = label;
|
|
367
|
+
var value = nodeValue;
|
|
368
|
+
var key = nodeValue; // 使用 value 作为 key,如果有 key 字段则使用 key
|
|
369
|
+
if (nodeKey !== undefined) {
|
|
370
|
+
key = nodeKey;
|
|
371
|
+
}
|
|
352
372
|
// 三无走默认
|
|
353
373
|
if (['undefined-undefined', 'undefined'].includes(labelText) && !value && !key) {
|
|
354
374
|
if (showCodeName) {
|
|
@@ -416,7 +436,8 @@ var ProTreeSelect = (props, ref) => {
|
|
|
416
436
|
|
|
417
437
|
/**
|
|
418
438
|
* 从树形数据中找出用户搜索得数据,并且将搜索字符串高亮标识
|
|
419
|
-
*
|
|
439
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
440
|
+
* @param data 全量树(标准格式)
|
|
420
441
|
* @param searchStr 搜索字符串
|
|
421
442
|
* @returns 处理后得树
|
|
422
443
|
*/
|
|
@@ -433,11 +454,11 @@ var ProTreeSelect = (props, ref) => {
|
|
|
433
454
|
}
|
|
434
455
|
// 迭代完子节点向上回溯,如果有匹配到得子节点,那么加入当前节点得孩子对象上,否则加入得是空数组
|
|
435
456
|
item.children = currentNodeChild;
|
|
436
|
-
// 判断节点
|
|
457
|
+
// 判断节点label是否包含关键字 如果有,那么直接进行下一循环
|
|
437
458
|
// @ts-ignore
|
|
438
|
-
if (item
|
|
459
|
+
if (item.label && item.label.indexOf(keyWord) > -1 && (selectProps === null || selectProps === void 0 ? void 0 : selectProps.mode) !== 'treeSelect') {
|
|
439
460
|
var regExp = new RegExp(keyWord);
|
|
440
|
-
item
|
|
461
|
+
item.label = item.label.replace(regExp, `<span class="highlight-search-text">${keyWord}</span>`);
|
|
441
462
|
}
|
|
442
463
|
currentAllNodeChild.push(item);
|
|
443
464
|
}
|
|
@@ -475,16 +496,23 @@ var ProTreeSelect = (props, ref) => {
|
|
|
475
496
|
return _ref6.apply(this, arguments);
|
|
476
497
|
};
|
|
477
498
|
}(), 500);
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* 从树形数据中查找节点
|
|
502
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
503
|
+
* @param treeList 树形数据(标准格式)
|
|
504
|
+
* @param nodeValue 节点值
|
|
505
|
+
* @returns 找到的节点
|
|
506
|
+
*/
|
|
478
507
|
function findTreeNode(treeList, nodeValue) {
|
|
479
508
|
var result = {};
|
|
480
509
|
var filterData = function filterData(data) {
|
|
481
510
|
for (var i = 0; i < data.length; i++) {
|
|
482
511
|
var item = data[i];
|
|
483
|
-
if (item
|
|
512
|
+
if (item.value === nodeValue || Array.isArray(nodeValue) && nodeValue.includes(item.value)) {
|
|
484
513
|
result = (0, _objectSpread2.default)({}, item);
|
|
485
|
-
|
|
486
|
-
result.
|
|
487
|
-
delete result[(fieldNames === null || fieldNames === void 0 ? void 0 : fieldNames.children) || 'children'];
|
|
514
|
+
// 删除 children 字段,避免循环引用
|
|
515
|
+
delete result.children;
|
|
488
516
|
return null;
|
|
489
517
|
}
|
|
490
518
|
// 一直递归到最后一层子节点
|
|
@@ -496,6 +524,13 @@ var ProTreeSelect = (props, ref) => {
|
|
|
496
524
|
filterData(treeList);
|
|
497
525
|
return result;
|
|
498
526
|
}
|
|
527
|
+
/**
|
|
528
|
+
* 根据值获取标签
|
|
529
|
+
* 注意:此时数据已经是标准格式(label, value, children)
|
|
530
|
+
* @param treeList 树形数据(标准格式)
|
|
531
|
+
* @param nodeValue 节点值
|
|
532
|
+
* @returns 标签对象或数组
|
|
533
|
+
*/
|
|
499
534
|
function getLabelByValue(treeList, nodeValue) {
|
|
500
535
|
var result = nodeValue;
|
|
501
536
|
if (nodeValue) {
|
|
@@ -507,19 +542,19 @@ var ProTreeSelect = (props, ref) => {
|
|
|
507
542
|
return item;
|
|
508
543
|
});
|
|
509
544
|
} else {
|
|
510
|
-
result = findTreeNode(treeList, nodeValue
|
|
545
|
+
result = findTreeNode(treeList, nodeValue.value);
|
|
511
546
|
}
|
|
512
547
|
}
|
|
513
548
|
return result;
|
|
514
549
|
}
|
|
515
550
|
var handleChange = (newVal, label, extra) => {
|
|
516
551
|
// newVal回来得一定是label、value
|
|
552
|
+
// 注意:此时数据已经是标准格式(label, value, children)
|
|
517
553
|
var _selectList = selectList.map(item => {
|
|
518
|
-
var
|
|
519
|
-
|
|
520
|
-
if (label) {
|
|
554
|
+
var _label = item.label;
|
|
555
|
+
if (_label) {
|
|
521
556
|
var regex = /<span class="highlight-search-text">(.*?)<\/span>/g;
|
|
522
|
-
_label = item
|
|
557
|
+
_label = item.label = _label.replace(regex, '$1');
|
|
523
558
|
}
|
|
524
559
|
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
|
525
560
|
label: _label
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
@root-entry-name: 'default';
|
|
2
2
|
@import (reference) '~antd/es/style/themes/index.less';
|
|
3
3
|
|
|
4
|
+
.pro-tree-select-drop-down-container{
|
|
5
|
+
.@{ant-prefix}-select-tree-checkbox{
|
|
6
|
+
margin-top: 0;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
4
10
|
.pro-tree-modal-container .@{ant-prefix}-modal-content .@{ant-prefix}-modal-body {
|
|
5
11
|
max-height: 498px;
|
|
6
12
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zat-design/sisyphus-react",
|
|
3
|
-
"version": "3.14.
|
|
3
|
+
"version": "3.14.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18.19.0"
|
|
@@ -91,6 +91,7 @@
|
|
|
91
91
|
"@commitlint/config-conventional": "^12.1.1",
|
|
92
92
|
"@testing-library/jest-dom": "6.2.0",
|
|
93
93
|
"@testing-library/react": "12.1.5",
|
|
94
|
+
"@testing-library/react-hooks": "^8.0.1",
|
|
94
95
|
"@types/classnames": "^2.3.1",
|
|
95
96
|
"@types/jest": "^29.5.11",
|
|
96
97
|
"@types/lodash": "^4.14.171",
|