@cloudcome/utils-core 1.1.1 → 1.2.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/array.cjs +129 -0
- package/dist/array.cjs.map +1 -0
- package/dist/array.d.ts +171 -0
- package/dist/array.mjs +129 -0
- package/dist/array.mjs.map +1 -0
- package/dist/async.cjs +219 -0
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.ts +137 -0
- package/dist/async.mjs +219 -0
- package/dist/async.mjs.map +1 -0
- package/dist/base64.cjs +16 -0
- package/dist/base64.cjs.map +1 -0
- package/dist/base64.d.ts +7 -0
- package/dist/base64.mjs +16 -0
- package/dist/base64.mjs.map +1 -0
- package/dist/cache.cjs +79 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.mjs +79 -0
- package/dist/cache.mjs.map +1 -0
- package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
- package/dist/color/distance.d.ts +8 -0
- package/dist/color/helpers.d.ts +2 -0
- package/dist/color/hex-hsl.d.ts +3 -0
- package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
- package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
- package/dist/color/hex-rgb.d.ts +18 -0
- package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
- package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
- package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
- package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
- package/dist/color/rgb-hsl.d.ts +23 -0
- package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
- package/dist/color/rgb-hwb.d.ts +29 -0
- package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
- package/dist/color/rgb-whiter.d.ts +12 -0
- package/dist/color/rgb-xyz.d.ts +22 -0
- package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
- package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
- package/dist/color.cjs +250 -0
- package/dist/color.cjs.map +1 -0
- package/dist/color.mjs +250 -0
- package/dist/color.mjs.map +1 -0
- package/dist/const.cjs +14 -0
- package/dist/const.cjs.map +1 -0
- package/dist/const.mjs +15 -0
- package/dist/const.mjs.map +1 -0
- package/dist/core.cjs +250 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.mjs +251 -0
- package/dist/core.mjs.map +1 -0
- package/dist/crypto/md5.d.mts +1 -0
- package/dist/crypto/sha1.d.mts +1 -0
- package/dist/crypto/sha256.d.mts +1 -0
- package/dist/crypto/sha512.d.mts +1 -0
- package/dist/crypto.cjs +812 -0
- package/dist/crypto.cjs.map +1 -0
- package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
- package/dist/crypto.mjs +812 -0
- package/dist/crypto.mjs.map +1 -0
- package/dist/date/const.d.ts +6 -0
- package/dist/date/core.d.ts +52 -0
- package/dist/date/days.d.ts +23 -0
- package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
- package/dist/date/relative.d.ts +44 -0
- package/dist/date/start-end.d.ts +73 -0
- package/dist/date/timezone.d.ts +67 -0
- package/dist/date/weeks.d.ts +72 -0
- package/dist/date.cjs +239 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.mjs +241 -0
- package/dist/date.mjs.map +1 -0
- package/dist/dict.cjs +2 -0
- package/dist/dict.cjs.map +1 -0
- package/dist/dict.mjs +2 -0
- package/dist/dict.mjs.map +1 -0
- package/dist/each.cjs +18 -0
- package/dist/each.cjs.map +1 -0
- package/dist/each.mjs +19 -0
- package/dist/each.mjs.map +1 -0
- package/dist/easing.cjs +151 -0
- package/dist/easing.cjs.map +1 -0
- package/dist/easing.d.ts +46 -0
- package/dist/easing.mjs +151 -0
- package/dist/easing.mjs.map +1 -0
- package/dist/emitter.cjs +94 -0
- package/dist/emitter.cjs.map +1 -0
- package/dist/emitter.d.ts +68 -0
- package/dist/emitter.mjs +94 -0
- package/dist/emitter.mjs.map +1 -0
- package/dist/enum.cjs +58 -0
- package/dist/enum.cjs.map +1 -0
- package/dist/enum.d.ts +68 -0
- package/dist/enum.mjs +58 -0
- package/dist/enum.mjs.map +1 -0
- package/dist/env.cjs +28 -0
- package/dist/env.cjs.map +1 -0
- package/{src/env.ts → dist/env.d.ts} +6 -30
- package/dist/env.mjs +28 -0
- package/dist/env.mjs.map +1 -0
- package/dist/error.cjs +12 -0
- package/dist/error.cjs.map +1 -0
- package/{src/error.ts → dist/error.d.ts} +3 -12
- package/dist/error.mjs +12 -0
- package/dist/error.mjs.map +1 -0
- package/dist/exception.cjs +22 -0
- package/dist/exception.cjs.map +1 -0
- package/dist/exception.d.ts +31 -0
- package/dist/exception.mjs +22 -0
- package/dist/exception.mjs.map +1 -0
- package/dist/fn.cjs +76 -0
- package/dist/fn.cjs.map +1 -0
- package/dist/fn.d.ts +102 -0
- package/dist/fn.mjs +76 -0
- package/dist/fn.mjs.map +1 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/merge.cjs +87 -0
- package/dist/merge.cjs.map +1 -0
- package/dist/merge.mjs +88 -0
- package/dist/merge.mjs.map +1 -0
- package/dist/number.cjs +14 -0
- package/dist/number.cjs.map +1 -0
- package/dist/number.d.ts +153 -0
- package/dist/number.mjs +14 -0
- package/dist/number.mjs.map +1 -0
- package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
- package/dist/object/get-set.d.ts +111 -0
- package/dist/object/is.d.ts +32 -0
- package/dist/object/merge.d.ts +72 -0
- package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
- package/dist/object.cjs +130 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.mjs +130 -0
- package/dist/object.mjs.map +1 -0
- package/dist/path.cjs +77 -0
- package/dist/path.cjs.map +1 -0
- package/dist/path.d.ts +82 -0
- package/dist/path.mjs +77 -0
- package/dist/path.mjs.map +1 -0
- package/dist/promise.cjs +62 -0
- package/dist/promise.cjs.map +1 -0
- package/{src/promise.ts → dist/promise.d.ts} +6 -67
- package/dist/promise.mjs +62 -0
- package/dist/promise.mjs.map +1 -0
- package/dist/qs.cjs +47 -0
- package/dist/qs.cjs.map +1 -0
- package/{src/qs.ts → dist/qs.d.ts} +3 -60
- package/dist/qs.mjs +47 -0
- package/dist/qs.mjs.map +1 -0
- package/dist/regexp.cjs +66 -0
- package/dist/regexp.cjs.map +1 -0
- package/dist/regexp.d.ts +65 -0
- package/dist/regexp.mjs +66 -0
- package/dist/regexp.mjs.map +1 -0
- package/dist/string.cjs +16 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.ts +80 -0
- package/dist/string.mjs +16 -0
- package/dist/string.mjs.map +1 -0
- package/dist/string2.cjs +157 -0
- package/dist/string2.cjs.map +1 -0
- package/dist/string2.mjs +158 -0
- package/dist/string2.mjs.map +1 -0
- package/dist/time/from.d.ts +14 -0
- package/dist/time/to.d.ts +38 -0
- package/dist/time.cjs +82 -0
- package/dist/time.cjs.map +1 -0
- package/dist/time.mjs +82 -0
- package/dist/time.mjs.map +1 -0
- package/dist/timer.cjs +119 -0
- package/dist/timer.cjs.map +1 -0
- package/dist/timer.d.ts +96 -0
- package/{src/timer.ts → dist/timer.mjs} +17 -124
- package/dist/timer.mjs.map +1 -0
- package/dist/tree.cjs +125 -0
- package/dist/tree.cjs.map +1 -0
- package/{src/tree.ts → dist/tree.d.ts} +41 -225
- package/dist/tree.mjs +125 -0
- package/dist/tree.mjs.map +1 -0
- package/dist/type.cjs +78 -0
- package/dist/type.cjs.map +1 -0
- package/{src/type.ts → dist/type.d.ts} +20 -96
- package/dist/type.mjs +78 -0
- package/dist/type.mjs.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/{src/types.ts → dist/types.d.ts} +12 -33
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/unique.cjs +46 -0
- package/dist/unique.cjs.map +1 -0
- package/dist/unique.d.ts +22 -0
- package/dist/unique.mjs +46 -0
- package/dist/unique.mjs.map +1 -0
- package/dist/url.cjs +37 -0
- package/dist/url.cjs.map +1 -0
- package/dist/url.d.ts +53 -0
- package/dist/url.mjs +37 -0
- package/dist/url.mjs.map +1 -0
- package/dist/version.cjs +33 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.ts +32 -0
- package/dist/version.mjs +33 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +8 -2
- package/CHANGELOG.md +0 -52
- package/src/array.ts +0 -312
- package/src/async.ts +0 -379
- package/src/base64.ts +0 -20
- package/src/cache.ts +0 -146
- package/src/color/distance.ts +0 -28
- package/src/color/helpers.ts +0 -23
- package/src/color/hex-hsl.ts +0 -11
- package/src/color/hex-rgb.ts +0 -39
- package/src/color/rgb-hsl.ts +0 -53
- package/src/color/rgb-hwb.ts +0 -56
- package/src/color/rgb-whiter.ts +0 -22
- package/src/color/rgb-xyz.ts +0 -62
- package/src/crypto/md5.mjs +0 -357
- package/src/crypto/sha1.mjs +0 -300
- package/src/crypto/sha256.mjs +0 -310
- package/src/crypto/sha512.mjs +0 -459
- package/src/date/const.ts +0 -6
- package/src/date/core.ts +0 -162
- package/src/date/days.ts +0 -51
- package/src/date/relative.ts +0 -92
- package/src/date/start-end.ts +0 -246
- package/src/date/timezone.ts +0 -220
- package/src/date/weeks.ts +0 -100
- package/src/dts/global.d.ts +0 -27
- package/src/easing.ts +0 -166
- package/src/emitter.ts +0 -117
- package/src/enum.ts +0 -171
- package/src/exception.ts +0 -68
- package/src/fn.ts +0 -197
- package/src/index.ts +0 -1
- package/src/number.ts +0 -236
- package/src/object/get-set.ts +0 -273
- package/src/object/is.ts +0 -128
- package/src/object/merge.ts +0 -180
- package/src/path.ts +0 -188
- package/src/regexp.ts +0 -156
- package/src/string.ts +0 -146
- package/src/time/from.ts +0 -57
- package/src/time/to.ts +0 -106
- package/src/unique.ts +0 -77
- package/src/url.ts +0 -93
- package/src/version.ts +0 -71
- package/test/array.test.ts +0 -332
- package/test/async-real.test.ts +0 -39
- package/test/async.test.ts +0 -375
- package/test/base64.test.ts +0 -32
- package/test/cache.test.ts +0 -83
- package/test/color.test.ts +0 -163
- package/test/crypto.test.ts +0 -34
- package/test/date-tz.test.ts +0 -206
- package/test/date.test.ts +0 -353
- package/test/easing.test.ts +0 -33
- package/test/emitter.test.ts +0 -71
- package/test/enum.test.ts +0 -113
- package/test/env.test.ts +0 -69
- package/test/error.test.ts +0 -58
- package/test/exception.test.ts +0 -43
- package/test/fn.test.ts +0 -263
- package/test/helpers.ts +0 -23
- package/test/index.test.ts +0 -6
- package/test/number.test.ts +0 -213
- package/test/object.test.ts +0 -309
- package/test/path.test.ts +0 -156
- package/test/promise.test.ts +0 -199
- package/test/qs.test.ts +0 -79
- package/test/regexp.test.ts +0 -97
- package/test/string.test.ts +0 -150
- package/test/time.test.ts +0 -214
- package/test/timer.test.ts +0 -114
- package/test/tree.test.ts +0 -348
- package/test/type.test.ts +0 -226
- package/test/unique.test.ts +0 -71
- package/test/url.test.ts +0 -136
- package/test/version.test.ts +0 -52
- package/tsconfig.json +0 -31
- package/vite.config.mts +0 -114
- /package/{src/color.ts → dist/color.d.ts} +0 -0
- /package/{src/date.ts → dist/date.d.ts} +0 -0
- /package/{src/dict.ts → dist/dict.d.ts} +0 -0
- /package/{src/object.ts → dist/object.d.ts} +0 -0
- /package/{src/time.ts → dist/time.d.ts} +0 -0
package/src/fn.ts
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { isNumber } from './type';
|
|
2
|
-
import type { AnyFunction } from './types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 一个空操作函数,不执行任何操作。
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* fnNoop(); // 不执行任何操作
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
|
-
export function fnNoop() {
|
|
13
|
-
//
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* 防抖函数的配置选项。
|
|
18
|
-
*/
|
|
19
|
-
export type TDebounceOptions = {
|
|
20
|
-
/**
|
|
21
|
-
* 等待时间(毫秒)。
|
|
22
|
-
*/
|
|
23
|
-
wait: number;
|
|
24
|
-
/**
|
|
25
|
-
* 是否在等待开始时立即执行一次
|
|
26
|
-
* @default false
|
|
27
|
-
*/
|
|
28
|
-
leading?: boolean;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 创建一个防抖函数,该函数会在指定的等待时间后执行,如果在等待时间内再次调用,则重新计时。
|
|
33
|
-
*
|
|
34
|
-
* @param fn - 需要防抖的函数。
|
|
35
|
-
* @param wait - 等待时间(毫秒)或包含 `wait` 和 `leading` 选项的对象。
|
|
36
|
-
* @returns 返回一个防抖函数,该函数具有 `cancel` 方法,用于取消防抖操作。
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```typescript
|
|
40
|
-
* const debouncedFn = fnDebounce(() => {
|
|
41
|
-
* console.log('Debounced!');
|
|
42
|
-
* }, 100);
|
|
43
|
-
*
|
|
44
|
-
* debouncedFn(); // 不会立即执行
|
|
45
|
-
* debouncedFn(); // 重新计时
|
|
46
|
-
* debouncedFn.cancel(); // 取消防抖操作
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
export function fnDebounce<F extends AnyFunction>(fn: F, wait: number | TDebounceOptions) {
|
|
50
|
-
const options: TDebounceOptions = isNumber(wait) ? { wait } : wait;
|
|
51
|
-
let canceled = false;
|
|
52
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
53
|
-
let timer: any;
|
|
54
|
-
let leading = false;
|
|
55
|
-
|
|
56
|
-
const debounced = function (this: unknown, ...args: Parameters<F>) {
|
|
57
|
-
if (canceled) return;
|
|
58
|
-
|
|
59
|
-
// 第一次执行
|
|
60
|
-
if (options.leading && !leading) {
|
|
61
|
-
leading = true;
|
|
62
|
-
fn.apply(this, args);
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// 最后一次执行
|
|
67
|
-
clearTimeout(timer);
|
|
68
|
-
timer = setTimeout(() => {
|
|
69
|
-
if (canceled) return;
|
|
70
|
-
|
|
71
|
-
fn.apply(this, args);
|
|
72
|
-
}, options.wait);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
debounced.cancel = () => {
|
|
76
|
-
clearTimeout(timer);
|
|
77
|
-
canceled = true;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
return debounced;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export type TThrottleOptions = {
|
|
84
|
-
/**
|
|
85
|
-
* 等待时间(毫秒)。
|
|
86
|
-
*/
|
|
87
|
-
wait: number;
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* 是否在第一次调用时立即执行
|
|
91
|
-
* @default false
|
|
92
|
-
*/
|
|
93
|
-
leading?: boolean;
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 是否在调用结束后等待一段时间再执行
|
|
97
|
-
* @default false
|
|
98
|
-
*/
|
|
99
|
-
trailing?: boolean;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* 创建一个节流函数,该函数会在指定的等待时间内最多执行一次,如果在等待时间内再次调用,则忽略后续调用。
|
|
104
|
-
*
|
|
105
|
-
* @param fn - 需要节流的函数。
|
|
106
|
-
* @param wait - 等待时间(毫秒)或包含 `wait`、`leading` 和 `trailing` 选项的对象。
|
|
107
|
-
* @returns 返回一个节流函数,该函数具有 `cancel` 方法,用于取消节流操作。
|
|
108
|
-
*
|
|
109
|
-
* @example
|
|
110
|
-
* ```typescript
|
|
111
|
-
* const throttledFn = fnThrottle(() => {
|
|
112
|
-
* console.log('Throttled!');
|
|
113
|
-
* }, 100);
|
|
114
|
-
*
|
|
115
|
-
* throttledFn(); // 立即执行
|
|
116
|
-
* throttledFn(); // 忽略
|
|
117
|
-
* throttledFn.cancel(); // 取消节流操作
|
|
118
|
-
* ```
|
|
119
|
-
*/
|
|
120
|
-
export function fnThrottle<F extends AnyFunction>(fn: F, wait: number | TThrottleOptions) {
|
|
121
|
-
const options = isNumber(wait) ? { wait } : wait;
|
|
122
|
-
const waitFinal = options.wait;
|
|
123
|
-
let lastTime = 0;
|
|
124
|
-
let canceled = false;
|
|
125
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
126
|
-
let timer: any;
|
|
127
|
-
|
|
128
|
-
const throttled = function (this: unknown, ...args: Parameters<F>) {
|
|
129
|
-
if (canceled) return;
|
|
130
|
-
|
|
131
|
-
const now = Date.now();
|
|
132
|
-
|
|
133
|
-
// 第一次执行
|
|
134
|
-
if (options.leading && lastTime === 0) {
|
|
135
|
-
lastTime = now;
|
|
136
|
-
fn.apply(this, args);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// 中间控频执行
|
|
140
|
-
else if (lastTime > 0 && now - lastTime >= waitFinal) {
|
|
141
|
-
lastTime = now;
|
|
142
|
-
fn.apply(this, args);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// 首次计时
|
|
146
|
-
else if (lastTime === 0) {
|
|
147
|
-
lastTime = now;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// 最后一次执行
|
|
151
|
-
if (options.trailing) {
|
|
152
|
-
clearTimeout(timer);
|
|
153
|
-
timer = setTimeout(() => {
|
|
154
|
-
fn.apply(this, args);
|
|
155
|
-
}, waitFinal);
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
throttled.cancel = () => {
|
|
160
|
-
canceled = true;
|
|
161
|
-
clearTimeout(timer);
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
return throttled;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* 创建一个只执行一次的函数,无论调用多少次,实际执行的函数体也只会执行一次。
|
|
169
|
-
*
|
|
170
|
-
* @param fn - 需要只执行一次的函数。
|
|
171
|
-
* @returns 返回一个只执行一次的函数,该函数在第一次调用后会缓存结果并返回缓存的结果。
|
|
172
|
-
*
|
|
173
|
-
* @example
|
|
174
|
-
* ```typescript
|
|
175
|
-
* const onceFn = fnOnce(() => {
|
|
176
|
-
* console.log('This will be logged only once.');
|
|
177
|
-
* return 42;
|
|
178
|
-
* });
|
|
179
|
-
*
|
|
180
|
-
* console.log(onceFn()); // 输出: This will be logged only once. 42
|
|
181
|
-
* console.log(onceFn()); // 输出: 42
|
|
182
|
-
* ```
|
|
183
|
-
*/
|
|
184
|
-
export function fnOnce<F extends AnyFunction>(fn: F) {
|
|
185
|
-
let called = false;
|
|
186
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
187
|
-
let result: any;
|
|
188
|
-
|
|
189
|
-
return function (this: unknown, ...args: Parameters<F>) {
|
|
190
|
-
if (!called) {
|
|
191
|
-
called = true;
|
|
192
|
-
result = fn.apply(this, args);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return result;
|
|
196
|
-
};
|
|
197
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const VERSION = PKG_VERSION;
|
package/src/number.ts
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { objectDefaults } from './object';
|
|
2
|
-
import { STRING_DICT } from './string';
|
|
3
|
-
|
|
4
|
-
export type NumberFixedOptions = {
|
|
5
|
-
/**
|
|
6
|
-
* 保留的小数位数
|
|
7
|
-
* @default 0
|
|
8
|
-
*/
|
|
9
|
-
precision?: number;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* 舍入方法,0 为四舍五入,1 为向上取整,-1 为向下取整
|
|
13
|
-
* @default 0
|
|
14
|
-
*/
|
|
15
|
-
round?: 0 | 1 | -1;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* 对数字进行精确小数位数处理并按规则舍入
|
|
20
|
-
* @param number 需要处理的原始数值
|
|
21
|
-
* @param options 可选配置参数
|
|
22
|
-
* @returns 处理后的数值(number类型)
|
|
23
|
-
* @example
|
|
24
|
-
* // 四舍五入示例
|
|
25
|
-
* numberFixed(3.1415, { precision: 2 }); // 3.14
|
|
26
|
-
* // 向上取整示例
|
|
27
|
-
* numberFixed(3.1415, { precision: 2, round: 1 }); // 3.15
|
|
28
|
-
* // 向下取整示例
|
|
29
|
-
* numberFixed(3.9999, { precision: 1, round: -1 }); // 3.9
|
|
30
|
-
*/
|
|
31
|
-
export function numberFixed(number: number, options?: NumberFixedOptions) {
|
|
32
|
-
const { precision = 0, round = 0 } = options || {};
|
|
33
|
-
const scale = 10 ** precision;
|
|
34
|
-
|
|
35
|
-
if (round === 1) {
|
|
36
|
-
return Math.ceil(number * scale) / scale;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (round === -1) {
|
|
40
|
-
return Math.floor(number * scale) / scale;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return Math.round(number * scale) / scale;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* 生成指定范围内的随机整数
|
|
48
|
-
* @param {number} min - 随机数的最小值(包含)
|
|
49
|
-
* @param {number} max - 随机数的最大值(包含)
|
|
50
|
-
* @returns {number} - 生成的随机整数
|
|
51
|
-
* @example
|
|
52
|
-
* // 生成 1 到 10 之间的随机整数
|
|
53
|
-
* randomNumber(1, 10); // 可能返回 7
|
|
54
|
-
*/
|
|
55
|
-
export function randomNumber(min: number, max: number): number {
|
|
56
|
-
const [minFinal, maxFinal] = min > max ? [max, min] : [min, max];
|
|
57
|
-
return Math.floor(Math.random() * (maxFinal - minFinal + 1) + minFinal);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 数字缩写选项
|
|
62
|
-
*/
|
|
63
|
-
export type NumberAbbrOptions = {
|
|
64
|
-
/**
|
|
65
|
-
* 进制基数,用于计算单位进阶(如 1000 表示千进制)
|
|
66
|
-
* @default 1000
|
|
67
|
-
*/
|
|
68
|
-
base?: number;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 数值保留的小数位数
|
|
72
|
-
* @default 0
|
|
73
|
-
*/
|
|
74
|
-
precision?: number;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* 将数字转换为带单位缩写的字符串表示
|
|
79
|
-
*
|
|
80
|
-
* @param {number} number - 需要转换的原始数值
|
|
81
|
-
* @param {Array<string>} units - 单位数组,按从小到大顺序排列(如['B','KB','MB']),不能为空
|
|
82
|
-
* @param {NumberAbbrOptions} [options] - 可选配置参数
|
|
83
|
-
* @returns {string} - 转换后的带单位字符串(如"1.2KB")
|
|
84
|
-
* @example
|
|
85
|
-
* // 基础用法
|
|
86
|
-
* numberAbbr(1500, ['', 'K', 'M'], { base: 1000 }); // "1.5K"
|
|
87
|
-
* @example
|
|
88
|
-
* // 自定义小数位
|
|
89
|
-
* numberAbbr(123456, ['B','KB','MB'], { precision: 1 }); // "0.1MB"
|
|
90
|
-
* @example
|
|
91
|
-
* // 处理不足基数的情况
|
|
92
|
-
* numberAbbr(500, ['B','KB']); // "500B"
|
|
93
|
-
*/
|
|
94
|
-
export function numberAbbr(number: number, units: Array<string>, options?: NumberAbbrOptions): string {
|
|
95
|
-
const { base = 1000, precision = 0 } = options || {};
|
|
96
|
-
const { length } = units;
|
|
97
|
-
|
|
98
|
-
if (length === 0) throw new Error('数字单位组不能为空');
|
|
99
|
-
|
|
100
|
-
let numberFinal = number;
|
|
101
|
-
let step = 0;
|
|
102
|
-
|
|
103
|
-
while (numberFinal >= base && step < length - 1) {
|
|
104
|
-
numberFinal = numberFinal / base;
|
|
105
|
-
step++;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const value = numberFixed(numberFinal, { precision, round: -1 });
|
|
109
|
-
const unit = units[step];
|
|
110
|
-
|
|
111
|
-
return `${value}${unit}`;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* 将文件大小转换为带单位缩写的字符串表示
|
|
116
|
-
*
|
|
117
|
-
* @param {number} number - 需要转换的文件大小数值
|
|
118
|
-
* @param {number} [precision=0] - 数值保留的小数位数
|
|
119
|
-
* @returns {string} - 转换后的带单位字符串(如"1.2KB")
|
|
120
|
-
* @example
|
|
121
|
-
* // 基础用法
|
|
122
|
-
* fileSizeAbbr(1024); // "1KB"
|
|
123
|
-
* @example
|
|
124
|
-
* // 自定义小数位
|
|
125
|
-
* fileSizeAbbr(123456, 1); // "0.1MB"
|
|
126
|
-
*/
|
|
127
|
-
export function fileSizeAbbr(number: number, precision = 0) {
|
|
128
|
-
return numberAbbr(number, ['B', 'KB', 'MB', 'GB', 'TB'], {
|
|
129
|
-
base: 1024,
|
|
130
|
-
precision,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* 将十进制数转换为指定进制的字符串表示
|
|
136
|
-
*
|
|
137
|
-
* @param {number | bigint} decimal - 需要转换的十进制数,可以是任意长度的数字或大整数
|
|
138
|
-
* @param {string} [dict] - 用于表示进制的字符字典,默认为数字、小写字母和大写字母的组合(62 进制)
|
|
139
|
-
* @returns {string} - 转换后的指定进制字符串
|
|
140
|
-
* @throws {Error} - 如果字符字典的长度小于 2,将抛出错误
|
|
141
|
-
* @example
|
|
142
|
-
* // 默认 62 进制
|
|
143
|
-
* numberConvert(123456789); // "8M0kX"
|
|
144
|
-
* @example
|
|
145
|
-
* // 自定义 16 进制
|
|
146
|
-
* numberConvert(255, '0123456789ABCDEF'); // "FF"
|
|
147
|
-
* @example
|
|
148
|
-
* // 处理大整数
|
|
149
|
-
* numberConvert(9007199254740991n); // "2gosa7pa2GV"
|
|
150
|
-
*/
|
|
151
|
-
export function numberConvert(decimal: number | bigint, dict?: string): string {
|
|
152
|
-
const dictFinal = dict || STRING_DICT;
|
|
153
|
-
|
|
154
|
-
if (dictFinal.length < 2) throw new Error('进制转换字典长度不能小于 2');
|
|
155
|
-
|
|
156
|
-
let bigInt = BigInt(decimal);
|
|
157
|
-
const symbol = bigInt < 0n ? '-' : '';
|
|
158
|
-
bigInt = bigInt < 0n ? -bigInt : bigInt;
|
|
159
|
-
const result: Array<string> = [];
|
|
160
|
-
const { length } = dictFinal;
|
|
161
|
-
const bigLength = BigInt(length);
|
|
162
|
-
const calculate = (): void => {
|
|
163
|
-
const y = Number(bigInt % bigLength);
|
|
164
|
-
|
|
165
|
-
bigInt = bigInt / bigLength;
|
|
166
|
-
result.unshift(dictFinal[y]);
|
|
167
|
-
|
|
168
|
-
if (bigInt > 0) {
|
|
169
|
-
calculate();
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
calculate();
|
|
174
|
-
|
|
175
|
-
return symbol + result.join('');
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* 数字格式化配置选项
|
|
180
|
-
*/
|
|
181
|
-
export type NumberFormatOptions = {
|
|
182
|
-
/**
|
|
183
|
-
* 分隔符字符,用于数字分隔
|
|
184
|
-
* @default ','
|
|
185
|
-
* @example 使用 '_' 分隔符时,123456 会格式化为 '123_456'
|
|
186
|
-
*/
|
|
187
|
-
separator?: string;
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* 分隔步长,即每隔多少位添加分隔符
|
|
191
|
-
* @default 3
|
|
192
|
-
* @example 步长为 2 时,123456 会格式化为 '12,34,56'
|
|
193
|
-
*/
|
|
194
|
-
step?: number;
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* 数字格式化
|
|
199
|
-
* @param [number] {number} 数字
|
|
200
|
-
* @param options {NumberFormatOptions} 格式化配置
|
|
201
|
-
* @returns {string} 分割后的字符串
|
|
202
|
-
* @example
|
|
203
|
-
* // 使用默认分隔符和步长
|
|
204
|
-
* numberFormat(123456.789); // => "123,456.789"
|
|
205
|
-
* // 自定义分隔符
|
|
206
|
-
* numberFormat(123456.789, '_'); // => "123_456.789"
|
|
207
|
-
* // 自定义步长
|
|
208
|
-
* numberFormat(123456.789, 2); // => "12,34,56.789"
|
|
209
|
-
* // 使用对象配置
|
|
210
|
-
* numberFormat(123456.789, { separator: '.', step: 4 }); // => "12.3456.789"
|
|
211
|
-
*/
|
|
212
|
-
export function numberFormat(number: number, options: NumberFormatOptions): string;
|
|
213
|
-
export function numberFormat(number: number, separator: string): string;
|
|
214
|
-
export function numberFormat(number: number, step: number): string;
|
|
215
|
-
export function numberFormat(number: number): string;
|
|
216
|
-
export function numberFormat(number: number, options?: NumberFormatOptions | string | number) {
|
|
217
|
-
let optionsFinal: Required<NumberFormatOptions> = {
|
|
218
|
-
separator: ',',
|
|
219
|
-
step: 3,
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
if (typeof options === 'string') {
|
|
223
|
-
optionsFinal.separator = options;
|
|
224
|
-
} else if (typeof options === 'number') {
|
|
225
|
-
optionsFinal.step = options;
|
|
226
|
-
} else {
|
|
227
|
-
optionsFinal = objectDefaults(options || {}, optionsFinal) as Required<NumberFormatOptions>;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
const { separator, step } = optionsFinal;
|
|
231
|
-
const arr = String(number).split('.');
|
|
232
|
-
const re = new RegExp(`(\\d)(?=(\\d{${step}})+(?!\\d))`, 'g');
|
|
233
|
-
const p1 = arr[0].replace(re, `$1${separator}`);
|
|
234
|
-
|
|
235
|
-
return p1 + (arr[1] ? `.${arr[1]}` : '');
|
|
236
|
-
}
|
package/src/object/get-set.ts
DELETED
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import { isArray, isObject, isUndefined } from '@/type';
|
|
2
|
-
import type { AnyArray, AnyObject } from '@/types';
|
|
3
|
-
|
|
4
|
-
// @ref https://stackoverflow.com/a/67609485
|
|
5
|
-
|
|
6
|
-
type Idx<T, K> = K extends keyof T
|
|
7
|
-
? T[K]
|
|
8
|
-
: number extends keyof T
|
|
9
|
-
? K extends `${number}`
|
|
10
|
-
? T[number]
|
|
11
|
-
: never
|
|
12
|
-
: never;
|
|
13
|
-
|
|
14
|
-
type Join<K, P> = K extends string | number
|
|
15
|
-
? P extends string | number
|
|
16
|
-
? `${K}${'' extends P ? '' : '.'}${P}`
|
|
17
|
-
: never
|
|
18
|
-
: never;
|
|
19
|
-
|
|
20
|
-
type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];
|
|
21
|
-
|
|
22
|
-
export type ObjectPath<O, D extends number = 4> = [D] extends [never]
|
|
23
|
-
? never
|
|
24
|
-
: O extends object
|
|
25
|
-
? {
|
|
26
|
-
[K in keyof O]-?: K extends string | number ? `${K}` | Join<K, ObjectPath<O[K], Prev[D]>> : never;
|
|
27
|
-
}[keyof O]
|
|
28
|
-
: '';
|
|
29
|
-
|
|
30
|
-
export type ObjectLeafPath<O, D extends number = 4> = [D] extends [never]
|
|
31
|
-
? never
|
|
32
|
-
: O extends object
|
|
33
|
-
? {
|
|
34
|
-
[K in keyof O]-?: K extends string | number
|
|
35
|
-
? O[K] extends string | number
|
|
36
|
-
? `${K}` | Join<K, ObjectLeafPath<O[K], Prev[D]>>
|
|
37
|
-
: Join<K, ObjectLeafPath<O[K], Prev[D]>>
|
|
38
|
-
: never;
|
|
39
|
-
}[keyof O]
|
|
40
|
-
: '';
|
|
41
|
-
|
|
42
|
-
export type ObjectPathValue<O, P extends ObjectPath<O, 4>> = P extends `${infer Key}.${infer Rest}`
|
|
43
|
-
? Rest extends ObjectPath<Idx<O, Key>, 4>
|
|
44
|
-
? ObjectPathValue<Idx<O, Key>, Rest>
|
|
45
|
-
: never
|
|
46
|
-
: Idx<O, P>;
|
|
47
|
-
|
|
48
|
-
function pathToKeys(path: string | string[]) {
|
|
49
|
-
// 下文用到该数组时会进行修改操作,因此复制一份
|
|
50
|
-
if (isArray(path)) return [...path];
|
|
51
|
-
|
|
52
|
-
let pathFinal = path.replace(/\[(\w+)\]/g, '.$1');
|
|
53
|
-
pathFinal = pathFinal.replace(/^\./, '');
|
|
54
|
-
return pathFinal.split('.');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function isObjectOrArray(v: unknown) {
|
|
58
|
-
return isObject(v) || isArray(v);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* 表示对象节点的信息。
|
|
63
|
-
*
|
|
64
|
-
* @template V - 键值的类型。
|
|
65
|
-
*/
|
|
66
|
-
export type TObjectNode<V = unknown | undefined> = {
|
|
67
|
-
/**
|
|
68
|
-
* 当前节点的父级对象。
|
|
69
|
-
*/
|
|
70
|
-
parent: unknown | undefined;
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* 当前节点的键名路径。
|
|
74
|
-
*/
|
|
75
|
-
keys: string[];
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* 当前节点的键名。
|
|
79
|
-
*/
|
|
80
|
-
key: string | undefined;
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 当前节点的键值。
|
|
84
|
-
*/
|
|
85
|
-
value: V;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* 根据属性路径获取属性值
|
|
90
|
-
* @param {O} obj
|
|
91
|
-
* @param {string | string[] | P} path
|
|
92
|
-
* @returns {TObjectNode<O>}
|
|
93
|
-
* 根据属性路径获取属性值。
|
|
94
|
-
*
|
|
95
|
-
* @template O - 目标对象的类型。
|
|
96
|
-
* @template P - 属性路径的类型。
|
|
97
|
-
* @param {O} obj - 要操作的目标对象。
|
|
98
|
-
* @param {P | string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
|
|
99
|
-
* @returns {TObjectNode<O>} 返回一个包含父级、键名路径、键名和键值的对象节点。
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```typescript
|
|
103
|
-
* const obj = { a: { b: { c: 42 } } };
|
|
104
|
-
* const result = objectGet(obj, 'a.b.c');
|
|
105
|
-
* console.log(result.value); // 输出 42
|
|
106
|
-
* ```
|
|
107
|
-
*/
|
|
108
|
-
export function objectGet<O extends AnyObject, P extends ObjectPath<O>>(
|
|
109
|
-
obj: O,
|
|
110
|
-
path: P | string | string[],
|
|
111
|
-
): TObjectNode<O> {
|
|
112
|
-
const keys = pathToKeys(path);
|
|
113
|
-
const lastKey = keys.pop();
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
116
|
-
let parent: any = obj;
|
|
117
|
-
const keysFinal: string[] = [];
|
|
118
|
-
|
|
119
|
-
for (let i = 0; i < keys.length; i++) {
|
|
120
|
-
const key = keys[i];
|
|
121
|
-
|
|
122
|
-
keysFinal.push(key);
|
|
123
|
-
if (!isObjectOrArray(parent)) break;
|
|
124
|
-
|
|
125
|
-
// @ts-ignore
|
|
126
|
-
parent = parent[key];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
parent: parent,
|
|
131
|
-
keys: keysFinal,
|
|
132
|
-
key: lastKey,
|
|
133
|
-
// @ts-ignore
|
|
134
|
-
value: isObjectOrArray(parent) && lastKey ? parent[lastKey] : undefined,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// /**
|
|
139
|
-
// * 根据路径获取对象叶子节点值
|
|
140
|
-
// * @param {O} obj
|
|
141
|
-
// * @param {P} path
|
|
142
|
-
// * @returns {ObjectNode<O>}
|
|
143
|
-
// */
|
|
144
|
-
// export function objectLeaf<O extends AnyObject, P extends ObjectLeafPath<O>>(obj: O, path: P) {
|
|
145
|
-
// return objectGet(obj, path);
|
|
146
|
-
// }
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* 配置选项,用于控制 `objectSet` 的行为。
|
|
150
|
-
*
|
|
151
|
-
* @template O - 目标对象的类型。
|
|
152
|
-
*/
|
|
153
|
-
export type TObjectSetOptions<O extends AnyObject> = {
|
|
154
|
-
/**
|
|
155
|
-
* 在设置值之前调用的钩子函数。
|
|
156
|
-
* 如果返回 `false`,则阻止设置值。
|
|
157
|
-
*
|
|
158
|
-
* @param {TObjectNode<O> & { key: string }} node - 当前节点信息。
|
|
159
|
-
* @returns {boolean | undefined | void} 返回 `false` 时阻止设置值。
|
|
160
|
-
*/
|
|
161
|
-
// biome-ignore lint/suspicious/noConfusingVoidType: <explanation>
|
|
162
|
-
beforeSet(node: TObjectNode<O> & { key: string }): boolean | undefined | void;
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 当遇到未定义的中间节点时调用的钩子函数。
|
|
166
|
-
* 返回值将用于创建中间节点。
|
|
167
|
-
*
|
|
168
|
-
* @param {TObjectNode<O>} node - 当前节点信息。
|
|
169
|
-
* @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。
|
|
170
|
-
*/
|
|
171
|
-
// biome-ignore lint/suspicious/noConfusingVoidType: <explanation>
|
|
172
|
-
undefinedSet(node: TObjectNode<O>): AnyObject | AnyArray | undefined | void;
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
176
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
177
|
-
const defaultObjectSetOptions: TObjectSetOptions<any> = {
|
|
178
|
-
beforeSet: () => true,
|
|
179
|
-
undefinedSet: () => ({}),
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* 根据属性路径设置属性值
|
|
184
|
-
* @param {AnyObject} obj
|
|
185
|
-
* @param {string} path
|
|
186
|
-
* @param {V} val
|
|
187
|
-
* @param {Partial<TObjectSetOptions<O>>} options
|
|
188
|
-
* @returns {TObjectNode<O, V>}
|
|
189
|
-
* 根据属性路径设置属性值。
|
|
190
|
-
*
|
|
191
|
-
* @template O - 目标对象的类型。
|
|
192
|
-
* @template V - 要设置的值的类型。
|
|
193
|
-
* @param {O} obj - 要操作的目标对象。
|
|
194
|
-
* @param {string | string[]} path - 属性路径,可以是字符串或字符串数组。支持点分隔符(如 "a.b.c")或数组形式(如 ["a", "b", "c"])。
|
|
195
|
-
* @param {V} val - 要设置的值。
|
|
196
|
-
* @param {Partial<TObjectSetOptions<O>>} [options] - 可选配置项,用于控制设置行为。
|
|
197
|
-
* @returns {TObjectNode<V>} 返回一个包含父级、键名路径、键名和键值的对象节点。
|
|
198
|
-
*
|
|
199
|
-
* @example
|
|
200
|
-
* ```typescript
|
|
201
|
-
* const obj = {};
|
|
202
|
-
* objectSet(obj, 'a.b.c', 42);
|
|
203
|
-
* console.log(obj); // 输出 { a: { b: { c: 42 } } }
|
|
204
|
-
*
|
|
205
|
-
* objectSet(obj, 'a.b.c', 100, {
|
|
206
|
-
* beforeSet: (node) => node.key === 'c',
|
|
207
|
-
* });
|
|
208
|
-
* console.log(obj); // 输出 { a: { b: { c: 100 } } }
|
|
209
|
-
* ```
|
|
210
|
-
*/
|
|
211
|
-
export function objectSet<O extends AnyObject, V>(
|
|
212
|
-
obj: O,
|
|
213
|
-
path: string | string[],
|
|
214
|
-
val: V,
|
|
215
|
-
options?: Partial<TObjectSetOptions<O>>,
|
|
216
|
-
): TObjectNode<V> {
|
|
217
|
-
const { beforeSet, undefinedSet } = Object.assign({}, defaultObjectSetOptions, options);
|
|
218
|
-
const keys = pathToKeys(path);
|
|
219
|
-
const lastKey = keys.pop();
|
|
220
|
-
let parent = obj;
|
|
221
|
-
let stopped = false;
|
|
222
|
-
const keysFinal: string[] = [];
|
|
223
|
-
|
|
224
|
-
for (const key of keys) {
|
|
225
|
-
let val = parent[key];
|
|
226
|
-
keysFinal.push(key);
|
|
227
|
-
|
|
228
|
-
if (isUndefined(val)) {
|
|
229
|
-
const seted = undefinedSet({
|
|
230
|
-
parent: parent,
|
|
231
|
-
keys: keysFinal,
|
|
232
|
-
key: key,
|
|
233
|
-
value: val,
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
if (!seted) {
|
|
237
|
-
stopped = true;
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
242
|
-
// @ts-ignore
|
|
243
|
-
val = parent[key] = seted;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// @ts-ignore
|
|
247
|
-
parent = val;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (!stopped && !isUndefined(lastKey)) {
|
|
251
|
-
keysFinal.push(lastKey);
|
|
252
|
-
|
|
253
|
-
if (
|
|
254
|
-
beforeSet({
|
|
255
|
-
parent: parent,
|
|
256
|
-
keys: keysFinal,
|
|
257
|
-
key: lastKey,
|
|
258
|
-
value: parent[lastKey],
|
|
259
|
-
})
|
|
260
|
-
) {
|
|
261
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
262
|
-
// @ts-ignore
|
|
263
|
-
parent[lastKey] = val;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return {
|
|
268
|
-
keys: keysFinal,
|
|
269
|
-
parent: parent,
|
|
270
|
-
key: lastKey,
|
|
271
|
-
value: val,
|
|
272
|
-
};
|
|
273
|
-
}
|