@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.
Files changed (291) hide show
  1. package/dist/array.cjs +129 -0
  2. package/dist/array.cjs.map +1 -0
  3. package/dist/array.d.ts +171 -0
  4. package/dist/array.mjs +129 -0
  5. package/dist/array.mjs.map +1 -0
  6. package/dist/async.cjs +219 -0
  7. package/dist/async.cjs.map +1 -0
  8. package/dist/async.d.ts +137 -0
  9. package/dist/async.mjs +219 -0
  10. package/dist/async.mjs.map +1 -0
  11. package/dist/base64.cjs +16 -0
  12. package/dist/base64.cjs.map +1 -0
  13. package/dist/base64.d.ts +7 -0
  14. package/dist/base64.mjs +16 -0
  15. package/dist/base64.mjs.map +1 -0
  16. package/dist/cache.cjs +79 -0
  17. package/dist/cache.cjs.map +1 -0
  18. package/dist/cache.d.ts +90 -0
  19. package/dist/cache.mjs +79 -0
  20. package/dist/cache.mjs.map +1 -0
  21. package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
  22. package/dist/color/distance.d.ts +8 -0
  23. package/dist/color/helpers.d.ts +2 -0
  24. package/dist/color/hex-hsl.d.ts +3 -0
  25. package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
  26. package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
  27. package/dist/color/hex-rgb.d.ts +18 -0
  28. package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
  29. package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
  30. package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
  31. package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
  32. package/dist/color/rgb-hsl.d.ts +23 -0
  33. package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
  34. package/dist/color/rgb-hwb.d.ts +29 -0
  35. package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
  36. package/dist/color/rgb-whiter.d.ts +12 -0
  37. package/dist/color/rgb-xyz.d.ts +22 -0
  38. package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
  39. package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
  40. package/dist/color.cjs +250 -0
  41. package/dist/color.cjs.map +1 -0
  42. package/dist/color.mjs +250 -0
  43. package/dist/color.mjs.map +1 -0
  44. package/dist/const.cjs +14 -0
  45. package/dist/const.cjs.map +1 -0
  46. package/dist/const.mjs +15 -0
  47. package/dist/const.mjs.map +1 -0
  48. package/dist/core.cjs +250 -0
  49. package/dist/core.cjs.map +1 -0
  50. package/dist/core.mjs +251 -0
  51. package/dist/core.mjs.map +1 -0
  52. package/dist/crypto/md5.d.mts +1 -0
  53. package/dist/crypto/sha1.d.mts +1 -0
  54. package/dist/crypto/sha256.d.mts +1 -0
  55. package/dist/crypto/sha512.d.mts +1 -0
  56. package/dist/crypto.cjs +812 -0
  57. package/dist/crypto.cjs.map +1 -0
  58. package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
  59. package/dist/crypto.mjs +812 -0
  60. package/dist/crypto.mjs.map +1 -0
  61. package/dist/date/const.d.ts +6 -0
  62. package/dist/date/core.d.ts +52 -0
  63. package/dist/date/days.d.ts +23 -0
  64. package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
  65. package/dist/date/relative.d.ts +44 -0
  66. package/dist/date/start-end.d.ts +73 -0
  67. package/dist/date/timezone.d.ts +67 -0
  68. package/dist/date/weeks.d.ts +72 -0
  69. package/dist/date.cjs +239 -0
  70. package/dist/date.cjs.map +1 -0
  71. package/dist/date.mjs +241 -0
  72. package/dist/date.mjs.map +1 -0
  73. package/dist/dict.cjs +2 -0
  74. package/dist/dict.cjs.map +1 -0
  75. package/dist/dict.mjs +2 -0
  76. package/dist/dict.mjs.map +1 -0
  77. package/dist/each.cjs +18 -0
  78. package/dist/each.cjs.map +1 -0
  79. package/dist/each.mjs +19 -0
  80. package/dist/each.mjs.map +1 -0
  81. package/dist/easing.cjs +151 -0
  82. package/dist/easing.cjs.map +1 -0
  83. package/dist/easing.d.ts +46 -0
  84. package/dist/easing.mjs +151 -0
  85. package/dist/easing.mjs.map +1 -0
  86. package/dist/emitter.cjs +94 -0
  87. package/dist/emitter.cjs.map +1 -0
  88. package/dist/emitter.d.ts +68 -0
  89. package/dist/emitter.mjs +94 -0
  90. package/dist/emitter.mjs.map +1 -0
  91. package/dist/enum.cjs +58 -0
  92. package/dist/enum.cjs.map +1 -0
  93. package/dist/enum.d.ts +68 -0
  94. package/dist/enum.mjs +58 -0
  95. package/dist/enum.mjs.map +1 -0
  96. package/dist/env.cjs +28 -0
  97. package/dist/env.cjs.map +1 -0
  98. package/{src/env.ts → dist/env.d.ts} +6 -30
  99. package/dist/env.mjs +28 -0
  100. package/dist/env.mjs.map +1 -0
  101. package/dist/error.cjs +12 -0
  102. package/dist/error.cjs.map +1 -0
  103. package/{src/error.ts → dist/error.d.ts} +3 -12
  104. package/dist/error.mjs +12 -0
  105. package/dist/error.mjs.map +1 -0
  106. package/dist/exception.cjs +22 -0
  107. package/dist/exception.cjs.map +1 -0
  108. package/dist/exception.d.ts +31 -0
  109. package/dist/exception.mjs +22 -0
  110. package/dist/exception.mjs.map +1 -0
  111. package/dist/fn.cjs +76 -0
  112. package/dist/fn.cjs.map +1 -0
  113. package/dist/fn.d.ts +102 -0
  114. package/dist/fn.mjs +76 -0
  115. package/dist/fn.mjs.map +1 -0
  116. package/dist/index.cjs +5 -0
  117. package/dist/index.cjs.map +1 -0
  118. package/dist/index.d.ts +1 -0
  119. package/dist/index.mjs +5 -0
  120. package/dist/index.mjs.map +1 -0
  121. package/dist/merge.cjs +87 -0
  122. package/dist/merge.cjs.map +1 -0
  123. package/dist/merge.mjs +88 -0
  124. package/dist/merge.mjs.map +1 -0
  125. package/dist/number.cjs +14 -0
  126. package/dist/number.cjs.map +1 -0
  127. package/dist/number.d.ts +153 -0
  128. package/dist/number.mjs +14 -0
  129. package/dist/number.mjs.map +1 -0
  130. package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
  131. package/dist/object/get-set.d.ts +111 -0
  132. package/dist/object/is.d.ts +32 -0
  133. package/dist/object/merge.d.ts +72 -0
  134. package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
  135. package/dist/object.cjs +130 -0
  136. package/dist/object.cjs.map +1 -0
  137. package/dist/object.mjs +130 -0
  138. package/dist/object.mjs.map +1 -0
  139. package/dist/path.cjs +77 -0
  140. package/dist/path.cjs.map +1 -0
  141. package/dist/path.d.ts +82 -0
  142. package/dist/path.mjs +77 -0
  143. package/dist/path.mjs.map +1 -0
  144. package/dist/promise.cjs +62 -0
  145. package/dist/promise.cjs.map +1 -0
  146. package/{src/promise.ts → dist/promise.d.ts} +6 -67
  147. package/dist/promise.mjs +62 -0
  148. package/dist/promise.mjs.map +1 -0
  149. package/dist/qs.cjs +47 -0
  150. package/dist/qs.cjs.map +1 -0
  151. package/{src/qs.ts → dist/qs.d.ts} +3 -60
  152. package/dist/qs.mjs +47 -0
  153. package/dist/qs.mjs.map +1 -0
  154. package/dist/regexp.cjs +66 -0
  155. package/dist/regexp.cjs.map +1 -0
  156. package/dist/regexp.d.ts +65 -0
  157. package/dist/regexp.mjs +66 -0
  158. package/dist/regexp.mjs.map +1 -0
  159. package/dist/string.cjs +16 -0
  160. package/dist/string.cjs.map +1 -0
  161. package/dist/string.d.ts +80 -0
  162. package/dist/string.mjs +16 -0
  163. package/dist/string.mjs.map +1 -0
  164. package/dist/string2.cjs +157 -0
  165. package/dist/string2.cjs.map +1 -0
  166. package/dist/string2.mjs +158 -0
  167. package/dist/string2.mjs.map +1 -0
  168. package/dist/time/from.d.ts +14 -0
  169. package/dist/time/to.d.ts +38 -0
  170. package/dist/time.cjs +82 -0
  171. package/dist/time.cjs.map +1 -0
  172. package/dist/time.mjs +82 -0
  173. package/dist/time.mjs.map +1 -0
  174. package/dist/timer.cjs +119 -0
  175. package/dist/timer.cjs.map +1 -0
  176. package/dist/timer.d.ts +96 -0
  177. package/{src/timer.ts → dist/timer.mjs} +17 -124
  178. package/dist/timer.mjs.map +1 -0
  179. package/dist/tree.cjs +125 -0
  180. package/dist/tree.cjs.map +1 -0
  181. package/{src/tree.ts → dist/tree.d.ts} +41 -225
  182. package/dist/tree.mjs +125 -0
  183. package/dist/tree.mjs.map +1 -0
  184. package/dist/type.cjs +78 -0
  185. package/dist/type.cjs.map +1 -0
  186. package/{src/type.ts → dist/type.d.ts} +20 -96
  187. package/dist/type.mjs +78 -0
  188. package/dist/type.mjs.map +1 -0
  189. package/dist/types.cjs +2 -0
  190. package/dist/types.cjs.map +1 -0
  191. package/{src/types.ts → dist/types.d.ts} +12 -33
  192. package/dist/types.mjs +2 -0
  193. package/dist/types.mjs.map +1 -0
  194. package/dist/unique.cjs +46 -0
  195. package/dist/unique.cjs.map +1 -0
  196. package/dist/unique.d.ts +22 -0
  197. package/dist/unique.mjs +46 -0
  198. package/dist/unique.mjs.map +1 -0
  199. package/dist/url.cjs +37 -0
  200. package/dist/url.cjs.map +1 -0
  201. package/dist/url.d.ts +53 -0
  202. package/dist/url.mjs +37 -0
  203. package/dist/url.mjs.map +1 -0
  204. package/dist/version.cjs +33 -0
  205. package/dist/version.cjs.map +1 -0
  206. package/dist/version.d.ts +32 -0
  207. package/dist/version.mjs +33 -0
  208. package/dist/version.mjs.map +1 -0
  209. package/package.json +8 -2
  210. package/CHANGELOG.md +0 -52
  211. package/src/array.ts +0 -312
  212. package/src/async.ts +0 -379
  213. package/src/base64.ts +0 -20
  214. package/src/cache.ts +0 -146
  215. package/src/color/distance.ts +0 -28
  216. package/src/color/helpers.ts +0 -23
  217. package/src/color/hex-hsl.ts +0 -11
  218. package/src/color/hex-rgb.ts +0 -39
  219. package/src/color/rgb-hsl.ts +0 -53
  220. package/src/color/rgb-hwb.ts +0 -56
  221. package/src/color/rgb-whiter.ts +0 -22
  222. package/src/color/rgb-xyz.ts +0 -62
  223. package/src/crypto/md5.mjs +0 -357
  224. package/src/crypto/sha1.mjs +0 -300
  225. package/src/crypto/sha256.mjs +0 -310
  226. package/src/crypto/sha512.mjs +0 -459
  227. package/src/date/const.ts +0 -6
  228. package/src/date/core.ts +0 -162
  229. package/src/date/days.ts +0 -51
  230. package/src/date/relative.ts +0 -92
  231. package/src/date/start-end.ts +0 -246
  232. package/src/date/timezone.ts +0 -220
  233. package/src/date/weeks.ts +0 -100
  234. package/src/dts/global.d.ts +0 -27
  235. package/src/easing.ts +0 -166
  236. package/src/emitter.ts +0 -117
  237. package/src/enum.ts +0 -171
  238. package/src/exception.ts +0 -68
  239. package/src/fn.ts +0 -197
  240. package/src/index.ts +0 -1
  241. package/src/number.ts +0 -236
  242. package/src/object/get-set.ts +0 -273
  243. package/src/object/is.ts +0 -128
  244. package/src/object/merge.ts +0 -180
  245. package/src/path.ts +0 -188
  246. package/src/regexp.ts +0 -156
  247. package/src/string.ts +0 -146
  248. package/src/time/from.ts +0 -57
  249. package/src/time/to.ts +0 -106
  250. package/src/unique.ts +0 -77
  251. package/src/url.ts +0 -93
  252. package/src/version.ts +0 -71
  253. package/test/array.test.ts +0 -332
  254. package/test/async-real.test.ts +0 -39
  255. package/test/async.test.ts +0 -375
  256. package/test/base64.test.ts +0 -32
  257. package/test/cache.test.ts +0 -83
  258. package/test/color.test.ts +0 -163
  259. package/test/crypto.test.ts +0 -34
  260. package/test/date-tz.test.ts +0 -206
  261. package/test/date.test.ts +0 -353
  262. package/test/easing.test.ts +0 -33
  263. package/test/emitter.test.ts +0 -71
  264. package/test/enum.test.ts +0 -113
  265. package/test/env.test.ts +0 -69
  266. package/test/error.test.ts +0 -58
  267. package/test/exception.test.ts +0 -43
  268. package/test/fn.test.ts +0 -263
  269. package/test/helpers.ts +0 -23
  270. package/test/index.test.ts +0 -6
  271. package/test/number.test.ts +0 -213
  272. package/test/object.test.ts +0 -309
  273. package/test/path.test.ts +0 -156
  274. package/test/promise.test.ts +0 -199
  275. package/test/qs.test.ts +0 -79
  276. package/test/regexp.test.ts +0 -97
  277. package/test/string.test.ts +0 -150
  278. package/test/time.test.ts +0 -214
  279. package/test/timer.test.ts +0 -114
  280. package/test/tree.test.ts +0 -348
  281. package/test/type.test.ts +0 -226
  282. package/test/unique.test.ts +0 -71
  283. package/test/url.test.ts +0 -136
  284. package/test/version.test.ts +0 -52
  285. package/tsconfig.json +0 -31
  286. package/vite.config.mts +0 -114
  287. /package/{src/color.ts → dist/color.d.ts} +0 -0
  288. /package/{src/date.ts → dist/date.d.ts} +0 -0
  289. /package/{src/dict.ts → dist/dict.d.ts} +0 -0
  290. /package/{src/object.ts → dist/object.d.ts} +0 -0
  291. /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
- // }
@@ -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
- }