@cloudcome/utils-core 1.1.1 → 1.2.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/README.md +18 -0
- 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/dist/tree.d.ts +210 -0
- 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/tree.ts +0 -394
- 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/object/is.ts
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { isArray, isObject, isString, typeIs } from '@/type';
|
|
2
|
-
import type { AnyArray, AnyFunction, AnyObject } from '@/types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 检查一个对象是否为空对象(不包含任何自有属性,包括符号属性)。
|
|
6
|
-
*
|
|
7
|
-
* @param obj - 要检查的对象
|
|
8
|
-
* @returns 如果对象没有自有属性(包括符号属性)则返回 true,否则返回 false
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* isEmptyObject({}); // true
|
|
13
|
-
* isEmptyObject({ a: 1 }); // false
|
|
14
|
-
* isEmptyObject(Object.create(null)); // true
|
|
15
|
-
* isEmptyObject({ [Symbol('key')]: 'value' }); // false
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
|
-
export function isEmptyObject(obj: AnyObject): boolean {
|
|
19
|
-
return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* 检查一个对象是否为纯对象(通过对象字面量或Object构造函数创建,而非其他构造函数的实例)。
|
|
24
|
-
*
|
|
25
|
-
* @param obj - 要检查的对象
|
|
26
|
-
* @returns 如果是纯对象则返回 true,否则返回 false
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```typescript
|
|
30
|
-
* isPlainObject({}); // true
|
|
31
|
-
* isPlainObject(Object.create(null)); // true
|
|
32
|
-
* isPlainObject(new Date()); // false
|
|
33
|
-
* isPlainObject([]); // false
|
|
34
|
-
* isPlainObject(() => {}); // false
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
export function isPlainObject(obj: AnyObject): boolean {
|
|
38
|
-
const proto: unknown = Object.getPrototypeOf(obj);
|
|
39
|
-
|
|
40
|
-
// 对象无原型
|
|
41
|
-
if (!proto) return true;
|
|
42
|
-
|
|
43
|
-
// 是否对象直接实例
|
|
44
|
-
return proto === Object.prototype;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 移除,原因是,定义对象尽可能的使用 type 关键字即可避开此问题
|
|
48
|
-
// /**
|
|
49
|
-
// * 精确对象,常用于联合类型判断
|
|
50
|
-
// * 相关 bug:https://l.ydr.me/Zp88vFKc
|
|
51
|
-
// */
|
|
52
|
-
// // biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
53
|
-
// export type ExactObject<T = any> = T extends AnyFunction
|
|
54
|
-
// ? never
|
|
55
|
-
// : T extends AnyArray
|
|
56
|
-
// ? never
|
|
57
|
-
// : T extends object
|
|
58
|
-
// ? T
|
|
59
|
-
// : never;
|
|
60
|
-
//
|
|
61
|
-
// /**
|
|
62
|
-
// * 检查值是否为精确接口对象
|
|
63
|
-
// * @param object - 传入对象,必须是一个对象与其他类型的联合
|
|
64
|
-
// * @returns 如果值为对象则返回 true,否则返回 false
|
|
65
|
-
// * @example
|
|
66
|
-
// * ```typescript
|
|
67
|
-
// * type Id = string | string[] | (() => string);
|
|
68
|
-
// *
|
|
69
|
-
// * interface Cache {
|
|
70
|
-
// * id?: Id;
|
|
71
|
-
// * }
|
|
72
|
-
// *
|
|
73
|
-
// * type Share = {
|
|
74
|
-
// * id?: Id;
|
|
75
|
-
// * }
|
|
76
|
-
// *
|
|
77
|
-
// * interface Options {
|
|
78
|
-
// * cache?: Id | Cache;
|
|
79
|
-
// * share?: Id | Share;
|
|
80
|
-
// * }
|
|
81
|
-
// *
|
|
82
|
-
// * function test(options: Options) {
|
|
83
|
-
// * // string | string[] | (() => string) | Cache | undefined
|
|
84
|
-
// * const cache = options.cache;
|
|
85
|
-
// *
|
|
86
|
-
// * // Cache
|
|
87
|
-
// * // 需要使用
|
|
88
|
-
// * if (isExactObject(cache)) {
|
|
89
|
-
// * cache.id;
|
|
90
|
-
// * }
|
|
91
|
-
// * // string[]
|
|
92
|
-
// * else if (isArray(cache)) {
|
|
93
|
-
// * cache.push();
|
|
94
|
-
// * }
|
|
95
|
-
// * // string
|
|
96
|
-
// * else if (isString(cache)) {
|
|
97
|
-
// * cache.charCodeAt(0);
|
|
98
|
-
// * }
|
|
99
|
-
// * // (() => string) | undefined
|
|
100
|
-
// * else {
|
|
101
|
-
// * cache?.();
|
|
102
|
-
// * }
|
|
103
|
-
// *
|
|
104
|
-
// * // string | string[] | (() => string) | Share | undefined
|
|
105
|
-
// * const share = options.share;
|
|
106
|
-
// *
|
|
107
|
-
// * // Share
|
|
108
|
-
// * if (isObject(share)) {
|
|
109
|
-
// * share.id;
|
|
110
|
-
// * }
|
|
111
|
-
// * // string[]
|
|
112
|
-
// * else if (isArray(share)) {
|
|
113
|
-
// * share.push();
|
|
114
|
-
// * }
|
|
115
|
-
// * // string
|
|
116
|
-
// * else if (isString(share)) {
|
|
117
|
-
// * share.charCodeAt(0);
|
|
118
|
-
// * }
|
|
119
|
-
// * // (() => string) | undefined
|
|
120
|
-
// * else {
|
|
121
|
-
// * share?.();
|
|
122
|
-
// * }
|
|
123
|
-
// * }
|
|
124
|
-
// * ```
|
|
125
|
-
// */
|
|
126
|
-
// export function isExactObject<T>(object: T): object is ExactObject<T> {
|
|
127
|
-
// return typeIs(object) === 'object';
|
|
128
|
-
// }
|
package/src/object/merge.ts
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { isArray, isObject, typeIs } from '@/type';
|
|
2
|
-
import type { AnyArray, AnyObject } from '@/types';
|
|
3
|
-
import { objectEach } from './each';
|
|
4
|
-
|
|
5
|
-
export type TObjectMergeRule = {
|
|
6
|
-
/**
|
|
7
|
-
* 处理冲突
|
|
8
|
-
* @param target - 目标对象
|
|
9
|
-
* @param source - 源对象
|
|
10
|
-
* @param key - 键名
|
|
11
|
-
* @returns 返回 true 表示继续处理,否则返回 false
|
|
12
|
-
*/
|
|
13
|
-
next: (info: {
|
|
14
|
-
target: AnyObject | AnyArray;
|
|
15
|
-
source: AnyObject | AnyArray;
|
|
16
|
-
key: string | number;
|
|
17
|
-
}) => boolean;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 处理赋值
|
|
21
|
-
* @param target - 目标对象
|
|
22
|
-
* @param source - 源对象
|
|
23
|
-
* @param key - 键名
|
|
24
|
-
* @returns 返回处理后的值
|
|
25
|
-
*/
|
|
26
|
-
assign: (info: {
|
|
27
|
-
target: AnyObject | AnyArray;
|
|
28
|
-
source: AnyObject | AnyArray;
|
|
29
|
-
key: string | number;
|
|
30
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
31
|
-
merge: () => any;
|
|
32
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
33
|
-
}) => any;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
function _objectMerge(mergeRule: TObjectMergeRule, target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {
|
|
37
|
-
const seen = new WeakMap<AnyObject | AnyArray, AnyObject | AnyArray>();
|
|
38
|
-
const { assign, next } = mergeRule;
|
|
39
|
-
const align = (target: AnyObject | AnyArray, source: AnyObject | AnyArray) => {
|
|
40
|
-
const targetType = typeIs(target);
|
|
41
|
-
const sourceType = typeIs(source);
|
|
42
|
-
|
|
43
|
-
if (targetType === sourceType) {
|
|
44
|
-
return target;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return sourceType === 'array' ? [] : {};
|
|
48
|
-
};
|
|
49
|
-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|
50
|
-
const each = (source: AnyObject | AnyArray, iterator: (val: any, key: string | number) => void) => {
|
|
51
|
-
if (isObject(source)) {
|
|
52
|
-
objectEach(source, iterator);
|
|
53
|
-
} else {
|
|
54
|
-
source.forEach(iterator);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const merge = (target: AnyObject | AnyArray, source: AnyObject | AnyArray): AnyObject | AnyArray => {
|
|
59
|
-
// 如果循环引用了,则直接返回目标对象
|
|
60
|
-
if (seen.has(source)) {
|
|
61
|
-
// biome-ignore lint/style/noNonNullAssertion: <explanation>
|
|
62
|
-
return seen.get(source)!;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// 对齐目标对象和源对象
|
|
66
|
-
const merged = align(target, source);
|
|
67
|
-
|
|
68
|
-
// 存储循环引用
|
|
69
|
-
seen.set(source, merged);
|
|
70
|
-
|
|
71
|
-
// 遍历源对象
|
|
72
|
-
each(source, (value, key) => {
|
|
73
|
-
if (!next({ target: merged, source, key })) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (isObject(value) || isArray(value)) {
|
|
78
|
-
// @ts-expect-error
|
|
79
|
-
merged[key] = assign({
|
|
80
|
-
target: merged,
|
|
81
|
-
source,
|
|
82
|
-
key,
|
|
83
|
-
// @ts-expect-error
|
|
84
|
-
merge: () => merge(merged[key], value),
|
|
85
|
-
});
|
|
86
|
-
} else {
|
|
87
|
-
// @ts-expect-error
|
|
88
|
-
merged[key] = assign({
|
|
89
|
-
target: merged,
|
|
90
|
-
source,
|
|
91
|
-
key,
|
|
92
|
-
merge: () => value,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
return merged;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
let returnTarget = target;
|
|
101
|
-
|
|
102
|
-
for (const source of sources) {
|
|
103
|
-
returnTarget = merge(target, source);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return returnTarget;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。
|
|
111
|
-
*
|
|
112
|
-
* @param target - 目标对象或数组。
|
|
113
|
-
* @param sources - 要合并的源对象或数组。
|
|
114
|
-
* @returns 合并后的对象或数组。
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* ```typescript
|
|
118
|
-
* const obj1 = { a: 1, b: { x: 10 } };
|
|
119
|
-
* const obj2 = { b: { y: 20 }, c: 3 };
|
|
120
|
-
* const merged = objectMerge(obj1, obj2);
|
|
121
|
-
* console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }
|
|
122
|
-
* ```
|
|
123
|
-
*/
|
|
124
|
-
export function objectMerge(target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {
|
|
125
|
-
return _objectMerge(
|
|
126
|
-
{
|
|
127
|
-
next() {
|
|
128
|
-
return true;
|
|
129
|
-
},
|
|
130
|
-
assign({ merge }) {
|
|
131
|
-
return merge();
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
target,
|
|
135
|
-
...sources,
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。
|
|
141
|
-
* 支持多个默认对象,优先级从左到右依次降低。
|
|
142
|
-
* 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。
|
|
143
|
-
*
|
|
144
|
-
* @param target - 目标对象或数组。
|
|
145
|
-
* @param defaults - 默认对象或数组。
|
|
146
|
-
* @returns 合并后的对象或数组。
|
|
147
|
-
*
|
|
148
|
-
* @example
|
|
149
|
-
* ```typescript
|
|
150
|
-
* const obj = { a: 1, b: undefined };
|
|
151
|
-
* const defaults = { a: 4, b: 2, c: 3 };
|
|
152
|
-
* const result = objectDefaults(obj, defaults);
|
|
153
|
-
* console.log(result); // { a: 1, b: 2, c: 3 }
|
|
154
|
-
*
|
|
155
|
-
* const obj2 = { a: 1, b: 2 };
|
|
156
|
-
* const defaults2 = { a: 5, b: 3, c: 4 };
|
|
157
|
-
* const result2 = objectDefaults(obj2, defaults2);
|
|
158
|
-
* console.log(result2); // { a: 1, b: 2, c: 4 }
|
|
159
|
-
*
|
|
160
|
-
* const obj3 = { a: { x: 1 }, b: undefined };
|
|
161
|
-
* const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };
|
|
162
|
-
* const result3 = objectDefaults(obj3, defaults3);
|
|
163
|
-
* console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }
|
|
164
|
-
* ```
|
|
165
|
-
*/
|
|
166
|
-
export function objectDefaults<T extends AnyObject | AnyArray>(target: T, defaults: T): T {
|
|
167
|
-
return _objectMerge(
|
|
168
|
-
{
|
|
169
|
-
next({ target, source, key }) {
|
|
170
|
-
// @ts-expect-error
|
|
171
|
-
return target[key] === undefined || isObject(target[key]) || isArray(target[key]);
|
|
172
|
-
},
|
|
173
|
-
assign({ merge }) {
|
|
174
|
-
return merge();
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
target,
|
|
178
|
-
defaults,
|
|
179
|
-
) as T;
|
|
180
|
-
}
|
package/src/path.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { arrayEach } from './array';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 判断是否是当前目录标记
|
|
5
|
-
* @param {string} slice - 路径片段
|
|
6
|
-
* @returns {boolean} - 如果是当前目录标记'.'则返回true,否则返回false
|
|
7
|
-
*/
|
|
8
|
-
function _isCurrentSlice(slice: string): boolean {
|
|
9
|
-
return slice === '.';
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* 判断是否是上级目录标记
|
|
14
|
-
* @param {string} slice - 路径片段
|
|
15
|
-
* @returns {boolean} - 如果是上级目录标记'..'则返回true,否则返回false
|
|
16
|
-
*/
|
|
17
|
-
function _isParentSlice(slice: string): boolean {
|
|
18
|
-
return slice === '..';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* 判断是否是绝对路径
|
|
23
|
-
* @param {string} path - 路径字符串
|
|
24
|
-
* @returns {boolean} - 如果是绝对路径则返回true,否则返回false
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* const isAbs = isAbsolutePath('/path/to/file');
|
|
28
|
-
* console.log(isAbs); // 输出: true
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export function isAbsolutePath(path: string): boolean {
|
|
32
|
-
return path.startsWith('/');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 判断是否是相对路径
|
|
37
|
-
* @param {string} path - 路径字符串
|
|
38
|
-
* @returns {boolean} - 如果是相对路径则返回true,否则返回false
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const isRel = isRelativePath('path/to/file');
|
|
42
|
-
* console.log(isRel); // 输出: true
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
export function isRelativePath(path: string): boolean {
|
|
46
|
-
return !isAbsolutePath(path);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* 标准化路径
|
|
51
|
-
* @param {string} path - 要标准化的路径字符串。
|
|
52
|
-
* @returns {string} - 标准化后的路径字符串。
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* const normalizedPath = pathNormalize('/path///to///file');
|
|
56
|
-
* console.log(normalizedPath); // 输出: '/path/to/file'
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
export function pathNormalize(path: string): string {
|
|
60
|
-
const slices = path
|
|
61
|
-
.replace(/\\/g, '/')
|
|
62
|
-
.replace(/\/{2,}/g, '/')
|
|
63
|
-
.replace(/\.{3,}/g, '..')
|
|
64
|
-
.replace(/\/\.\//g, '/')
|
|
65
|
-
.split('/')
|
|
66
|
-
.map((point) => point.trim());
|
|
67
|
-
const points: string[] = [];
|
|
68
|
-
const isAbs = slices[0] === '';
|
|
69
|
-
|
|
70
|
-
const push = (point: string) => {
|
|
71
|
-
points.push(point);
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const back = () => {
|
|
75
|
-
// 绝对路径不能退到根目录
|
|
76
|
-
if (points.length === 1 && isAbs) return;
|
|
77
|
-
|
|
78
|
-
//
|
|
79
|
-
if (points.length === 0 || points.at(-1) === '..') {
|
|
80
|
-
points.push('..');
|
|
81
|
-
} else {
|
|
82
|
-
points.pop();
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
for (const slice of slices) {
|
|
87
|
-
const isCurrent = _isCurrentSlice(slice);
|
|
88
|
-
const isParent = _isParentSlice(slice);
|
|
89
|
-
|
|
90
|
-
// // 未进入实际路径
|
|
91
|
-
// if (!inPoints) {
|
|
92
|
-
// push(slice);
|
|
93
|
-
// inPoints = !isCurrent && !isParent;
|
|
94
|
-
// continue;
|
|
95
|
-
// }
|
|
96
|
-
|
|
97
|
-
if (isCurrent) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (isParent) {
|
|
102
|
-
back();
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
push(slice);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return points.join('/');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* 路径合并
|
|
114
|
-
* @param {string} from - 起始路径。
|
|
115
|
-
* @param {...string[]} to - 要合并的路径片段。
|
|
116
|
-
* @returns {string} - 合并后的路径字符串。
|
|
117
|
-
* @example
|
|
118
|
-
* ```typescript
|
|
119
|
-
* const fullPath = pathJoin('/path', '/to', 'file');
|
|
120
|
-
* console.log(fullPath); // 输出: '/path/to/file'
|
|
121
|
-
* ```
|
|
122
|
-
*/
|
|
123
|
-
export function pathJoin(from: string, ...to: string[]): string {
|
|
124
|
-
return pathNormalize([from, ...to].join('/'));
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* 解析路径
|
|
129
|
-
* @param {string} from - 起始路径
|
|
130
|
-
* @param {...string[]} to - 要解析的路径片段
|
|
131
|
-
* @returns {string} - 解析后的绝对路径
|
|
132
|
-
* @example
|
|
133
|
-
* ```typescript
|
|
134
|
-
* const resolvedPath = pathResolve('/path', '/to', 'file');
|
|
135
|
-
* console.log(resolvedPath); // 输出: '/to/file'
|
|
136
|
-
* ```
|
|
137
|
-
*/
|
|
138
|
-
export function pathResolve(from: string, ...to: string[]): string {
|
|
139
|
-
const paths = [from, ...to].map(pathNormalize);
|
|
140
|
-
|
|
141
|
-
let lastStartPath = from;
|
|
142
|
-
let lastStartIndex = 0;
|
|
143
|
-
|
|
144
|
-
arrayEach(
|
|
145
|
-
paths,
|
|
146
|
-
(path, index) => {
|
|
147
|
-
if (isAbsolutePath(path)) {
|
|
148
|
-
lastStartPath = path;
|
|
149
|
-
lastStartIndex = index;
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
true,
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
return pathJoin(lastStartPath, ...paths.slice(lastStartIndex + 1));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* 将相对路径转换为标准的相对路径格式(添加'./'前缀)
|
|
161
|
-
*
|
|
162
|
-
* @param {string} path - 要处理的路径字符串
|
|
163
|
-
* @returns {string} 处理后的路径字符串
|
|
164
|
-
*
|
|
165
|
-
* @example <caption>处理绝对路径</caption>
|
|
166
|
-
* ```typescript
|
|
167
|
-
* const result = pathRelativize('/path/to/file');
|
|
168
|
-
* console.log(result); // 输出: '/path/to/file'
|
|
169
|
-
* ```
|
|
170
|
-
*
|
|
171
|
-
* @example <caption>处理已带'./'前缀的相对路径</caption>
|
|
172
|
-
* ```typescript
|
|
173
|
-
* const result = pathRelativize('./path/to/file');
|
|
174
|
-
* console.log(result); // 输出: './path/to/file'
|
|
175
|
-
* ```
|
|
176
|
-
*
|
|
177
|
-
* @example <caption>处理不带'./'前缀的相对路径</caption>
|
|
178
|
-
* ```typescript
|
|
179
|
-
* const result = pathRelativize('path/to/file');
|
|
180
|
-
* console.log(result); // 输出: './path/to/file'
|
|
181
|
-
* ```
|
|
182
|
-
*/
|
|
183
|
-
export function pathRelativize(path: string): string {
|
|
184
|
-
if (isAbsolutePath(path)) return path;
|
|
185
|
-
if (path.startsWith('./')) return path;
|
|
186
|
-
if (path.startsWith('../')) return path;
|
|
187
|
-
return `./${path}`;
|
|
188
|
-
}
|
package/src/regexp.ts
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
const specialRE = /[.*+?^=!:${}()|[\]/\\-]/g;
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 编码处理正则表达式
|
|
5
|
-
* @example
|
|
6
|
-
* ```js
|
|
7
|
-
* reEscape('/$')
|
|
8
|
-
* // => '\\/\\$'
|
|
9
|
-
* ```
|
|
10
|
-
* @param {string} string
|
|
11
|
-
* @returns {string}
|
|
12
|
-
*/
|
|
13
|
-
export function regexpEscape(string: string): string {
|
|
14
|
-
return string.replace(specialRE, '\\$&');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// 邮箱
|
|
18
|
-
const EMAIL_RE = /^\w+[-+.\w]*@([a-z\d-]+\.)+[a-z]{2,5}$/i;
|
|
19
|
-
/**
|
|
20
|
-
* 判断字符串是否为邮箱格式,不对邮箱真实性做验证,如域名是否正确等
|
|
21
|
-
* @param {string} value
|
|
22
|
-
* @returns {boolean}
|
|
23
|
-
*/
|
|
24
|
-
export function isEmail(value: string): boolean {
|
|
25
|
-
return EMAIL_RE.test(value);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// 手机号码
|
|
29
|
-
const PHONE_RE = /^1\d{10}$/;
|
|
30
|
-
/**
|
|
31
|
-
* 判断字符串是否为宽松手机格式,即首位为 1 的 11 位数字都属于手机号
|
|
32
|
-
* @param {string} value
|
|
33
|
-
* @returns {boolean}
|
|
34
|
-
*/
|
|
35
|
-
export function isPhone(value: string): boolean {
|
|
36
|
-
return PHONE_RE.test(value);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// 身份证号码
|
|
40
|
-
// http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/
|
|
41
|
-
// ["北京市", "天津市", "河北省", "山西省", "内蒙古自治区",
|
|
42
|
-
// "辽宁省", "吉林省", "黑龙江省",
|
|
43
|
-
// "上海市", "江苏省", "浙江省", "安徽省", "福建省", "江西省", "山东省",
|
|
44
|
-
// "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区", "海南省",
|
|
45
|
-
// "重庆市", "四川省", "贵州省", "云南省", "西藏自治区",
|
|
46
|
-
// "陕西省", "甘肃省", "青海省","宁夏回族自治区", "新疆维吾尔自治区",
|
|
47
|
-
// "台湾省",
|
|
48
|
-
// "香港特别行政区", "澳门特别行政区"]
|
|
49
|
-
// ["11", "12", "13", "14", "15",
|
|
50
|
-
// "21", "22", "23",
|
|
51
|
-
// "31", "32", "33", "34", "35", "36", "37",
|
|
52
|
-
// "41", "42", "43", "44", "45", "46",
|
|
53
|
-
// "50", "51", "52", "53", "54",
|
|
54
|
-
// "61", "62", "63", "64", "65",
|
|
55
|
-
// "71",
|
|
56
|
-
// "81", "82"]
|
|
57
|
-
// 91 国外
|
|
58
|
-
const IDNO_RE =
|
|
59
|
-
/^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|7[1]|8[1-2]|9[1])\d{4}(18|19|20)\d{2}[01]\d[0123]\d{4}[\dxX]$/;
|
|
60
|
-
/**
|
|
61
|
-
* 判断字符串是否为身份证号码格式
|
|
62
|
-
* @param {string} value
|
|
63
|
-
* @returns {boolean}
|
|
64
|
-
*/
|
|
65
|
-
export function isIDNo(value: string): boolean {
|
|
66
|
-
const isSameFormat = IDNO_RE.test(value);
|
|
67
|
-
|
|
68
|
-
if (!isSameFormat) return false;
|
|
69
|
-
|
|
70
|
-
const year = Number(value.slice(6, 10));
|
|
71
|
-
const month = Number(value.slice(10, 12));
|
|
72
|
-
const date = Number(value.slice(12, 14));
|
|
73
|
-
const d = new Date(year, month - 1, date);
|
|
74
|
-
const isSameDate = d.getFullYear() === year && d.getMonth() + 1 === month && d.getDate() === date;
|
|
75
|
-
|
|
76
|
-
if (!isSameDate) return false;
|
|
77
|
-
|
|
78
|
-
// 将身份证号码前面的17位数分别乘以不同的系数;
|
|
79
|
-
// 从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
|
|
80
|
-
// 将这17位数字和系数相乘的结果相加;
|
|
81
|
-
// 用加出来和除以11,看余数是多少;
|
|
82
|
-
// 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字;
|
|
83
|
-
// 其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2
|
|
84
|
-
// 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
|
|
85
|
-
const coefficientList = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|
86
|
-
const residueList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
|
|
87
|
-
let sum = 0;
|
|
88
|
-
|
|
89
|
-
for (let start = 0; start < 17; start++) {
|
|
90
|
-
sum += Number(value.slice(start, start + 1)) * coefficientList[start];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return residueList[sum % 11] === value.slice(-1);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// url
|
|
97
|
-
const URL_RE =
|
|
98
|
-
/^https?:\/\/(([a-z\d-]+\.)+[a-z]{2,5}|(\d{1,3}\.){3}\d{1,3})(:[1-9]\d{0,4})?(\/|\/[\w#!:.?+=&%@'/()-]+)?$/i;
|
|
99
|
-
/**
|
|
100
|
-
* 判断字符串是否为 url 格式,仅支持 http 协议,支持域名或者 ipV4
|
|
101
|
-
* @param {string} value
|
|
102
|
-
* @returns {boolean}
|
|
103
|
-
*/
|
|
104
|
-
export function isURL(value: string): boolean {
|
|
105
|
-
return URL_RE.test(value);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ipv4
|
|
109
|
-
const IPV4_RE = /^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/;
|
|
110
|
-
/**
|
|
111
|
-
* 判断字符串是否为 IPV4 格式,不对 ip 真实性做验证
|
|
112
|
-
* @param {string} value
|
|
113
|
-
* @returns {boolean}
|
|
114
|
-
*/
|
|
115
|
-
export function isIPV4(value: string): boolean {
|
|
116
|
-
return IPV4_RE.test(value);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const INTEGER_RE = /^(-?[1-9]\d*|0)$/;
|
|
120
|
-
/**
|
|
121
|
-
* 判断字符串是否为整数(自然数),即 ...,-3,-2,-1,0,1,2,3,...
|
|
122
|
-
* @param {string} value
|
|
123
|
-
* @returns {boolean}
|
|
124
|
-
*/
|
|
125
|
-
export function isInteger(value: string): boolean {
|
|
126
|
-
return INTEGER_RE.test(value);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const FLOAT_RE = /^-?([1-9]\d*|0)\.\d+$/;
|
|
130
|
-
/**
|
|
131
|
-
* 判断字符串是否为浮点数,即必须有小数点的有理数
|
|
132
|
-
* @param {string} value
|
|
133
|
-
* @returns {boolean}
|
|
134
|
-
*/
|
|
135
|
-
export function isFloat(value: string): boolean {
|
|
136
|
-
return FLOAT_RE.test(value);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 判断字符串是否为正确数值,包括整数和浮点数
|
|
141
|
-
* @param {string} value
|
|
142
|
-
* @returns {boolean}
|
|
143
|
-
*/
|
|
144
|
-
export function isNumerical(value: string): boolean {
|
|
145
|
-
return isInteger(value) || isFloat(value);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const DIGIT_RE = /^\d+$/;
|
|
149
|
-
/**
|
|
150
|
-
* 判断字符串是否为数字,例如六位数字短信验证码(093031)
|
|
151
|
-
* @param {string} value
|
|
152
|
-
* @returns {boolean}
|
|
153
|
-
*/
|
|
154
|
-
export function isDigit(value: string): boolean {
|
|
155
|
-
return DIGIT_RE.test(value);
|
|
156
|
-
}
|