@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.
Files changed (293) hide show
  1. package/README.md +18 -0
  2. package/dist/array.cjs +129 -0
  3. package/dist/array.cjs.map +1 -0
  4. package/dist/array.d.ts +171 -0
  5. package/dist/array.mjs +129 -0
  6. package/dist/array.mjs.map +1 -0
  7. package/dist/async.cjs +219 -0
  8. package/dist/async.cjs.map +1 -0
  9. package/dist/async.d.ts +137 -0
  10. package/dist/async.mjs +219 -0
  11. package/dist/async.mjs.map +1 -0
  12. package/dist/base64.cjs +16 -0
  13. package/dist/base64.cjs.map +1 -0
  14. package/dist/base64.d.ts +7 -0
  15. package/dist/base64.mjs +16 -0
  16. package/dist/base64.mjs.map +1 -0
  17. package/dist/cache.cjs +79 -0
  18. package/dist/cache.cjs.map +1 -0
  19. package/dist/cache.d.ts +90 -0
  20. package/dist/cache.mjs +79 -0
  21. package/dist/cache.mjs.map +1 -0
  22. package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
  23. package/dist/color/distance.d.ts +8 -0
  24. package/dist/color/helpers.d.ts +2 -0
  25. package/dist/color/hex-hsl.d.ts +3 -0
  26. package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
  27. package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
  28. package/dist/color/hex-rgb.d.ts +18 -0
  29. package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
  30. package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
  31. package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
  32. package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
  33. package/dist/color/rgb-hsl.d.ts +23 -0
  34. package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
  35. package/dist/color/rgb-hwb.d.ts +29 -0
  36. package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
  37. package/dist/color/rgb-whiter.d.ts +12 -0
  38. package/dist/color/rgb-xyz.d.ts +22 -0
  39. package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
  40. package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
  41. package/dist/color.cjs +250 -0
  42. package/dist/color.cjs.map +1 -0
  43. package/dist/color.mjs +250 -0
  44. package/dist/color.mjs.map +1 -0
  45. package/dist/const.cjs +14 -0
  46. package/dist/const.cjs.map +1 -0
  47. package/dist/const.mjs +15 -0
  48. package/dist/const.mjs.map +1 -0
  49. package/dist/core.cjs +250 -0
  50. package/dist/core.cjs.map +1 -0
  51. package/dist/core.mjs +251 -0
  52. package/dist/core.mjs.map +1 -0
  53. package/dist/crypto/md5.d.mts +1 -0
  54. package/dist/crypto/sha1.d.mts +1 -0
  55. package/dist/crypto/sha256.d.mts +1 -0
  56. package/dist/crypto/sha512.d.mts +1 -0
  57. package/dist/crypto.cjs +812 -0
  58. package/dist/crypto.cjs.map +1 -0
  59. package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
  60. package/dist/crypto.mjs +812 -0
  61. package/dist/crypto.mjs.map +1 -0
  62. package/dist/date/const.d.ts +6 -0
  63. package/dist/date/core.d.ts +52 -0
  64. package/dist/date/days.d.ts +23 -0
  65. package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
  66. package/dist/date/relative.d.ts +44 -0
  67. package/dist/date/start-end.d.ts +73 -0
  68. package/dist/date/timezone.d.ts +67 -0
  69. package/dist/date/weeks.d.ts +72 -0
  70. package/dist/date.cjs +239 -0
  71. package/dist/date.cjs.map +1 -0
  72. package/dist/date.mjs +241 -0
  73. package/dist/date.mjs.map +1 -0
  74. package/dist/dict.cjs +2 -0
  75. package/dist/dict.cjs.map +1 -0
  76. package/dist/dict.mjs +2 -0
  77. package/dist/dict.mjs.map +1 -0
  78. package/dist/each.cjs +18 -0
  79. package/dist/each.cjs.map +1 -0
  80. package/dist/each.mjs +19 -0
  81. package/dist/each.mjs.map +1 -0
  82. package/dist/easing.cjs +151 -0
  83. package/dist/easing.cjs.map +1 -0
  84. package/dist/easing.d.ts +46 -0
  85. package/dist/easing.mjs +151 -0
  86. package/dist/easing.mjs.map +1 -0
  87. package/dist/emitter.cjs +94 -0
  88. package/dist/emitter.cjs.map +1 -0
  89. package/dist/emitter.d.ts +68 -0
  90. package/dist/emitter.mjs +94 -0
  91. package/dist/emitter.mjs.map +1 -0
  92. package/dist/enum.cjs +58 -0
  93. package/dist/enum.cjs.map +1 -0
  94. package/dist/enum.d.ts +68 -0
  95. package/dist/enum.mjs +58 -0
  96. package/dist/enum.mjs.map +1 -0
  97. package/dist/env.cjs +28 -0
  98. package/dist/env.cjs.map +1 -0
  99. package/{src/env.ts → dist/env.d.ts} +6 -30
  100. package/dist/env.mjs +28 -0
  101. package/dist/env.mjs.map +1 -0
  102. package/dist/error.cjs +12 -0
  103. package/dist/error.cjs.map +1 -0
  104. package/{src/error.ts → dist/error.d.ts} +3 -12
  105. package/dist/error.mjs +12 -0
  106. package/dist/error.mjs.map +1 -0
  107. package/dist/exception.cjs +22 -0
  108. package/dist/exception.cjs.map +1 -0
  109. package/dist/exception.d.ts +31 -0
  110. package/dist/exception.mjs +22 -0
  111. package/dist/exception.mjs.map +1 -0
  112. package/dist/fn.cjs +76 -0
  113. package/dist/fn.cjs.map +1 -0
  114. package/dist/fn.d.ts +102 -0
  115. package/dist/fn.mjs +76 -0
  116. package/dist/fn.mjs.map +1 -0
  117. package/dist/index.cjs +5 -0
  118. package/dist/index.cjs.map +1 -0
  119. package/dist/index.d.ts +1 -0
  120. package/dist/index.mjs +5 -0
  121. package/dist/index.mjs.map +1 -0
  122. package/dist/merge.cjs +87 -0
  123. package/dist/merge.cjs.map +1 -0
  124. package/dist/merge.mjs +88 -0
  125. package/dist/merge.mjs.map +1 -0
  126. package/dist/number.cjs +14 -0
  127. package/dist/number.cjs.map +1 -0
  128. package/dist/number.d.ts +153 -0
  129. package/dist/number.mjs +14 -0
  130. package/dist/number.mjs.map +1 -0
  131. package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
  132. package/dist/object/get-set.d.ts +111 -0
  133. package/dist/object/is.d.ts +32 -0
  134. package/dist/object/merge.d.ts +72 -0
  135. package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
  136. package/dist/object.cjs +130 -0
  137. package/dist/object.cjs.map +1 -0
  138. package/dist/object.mjs +130 -0
  139. package/dist/object.mjs.map +1 -0
  140. package/dist/path.cjs +77 -0
  141. package/dist/path.cjs.map +1 -0
  142. package/dist/path.d.ts +82 -0
  143. package/dist/path.mjs +77 -0
  144. package/dist/path.mjs.map +1 -0
  145. package/dist/promise.cjs +62 -0
  146. package/dist/promise.cjs.map +1 -0
  147. package/{src/promise.ts → dist/promise.d.ts} +6 -67
  148. package/dist/promise.mjs +62 -0
  149. package/dist/promise.mjs.map +1 -0
  150. package/dist/qs.cjs +47 -0
  151. package/dist/qs.cjs.map +1 -0
  152. package/{src/qs.ts → dist/qs.d.ts} +3 -60
  153. package/dist/qs.mjs +47 -0
  154. package/dist/qs.mjs.map +1 -0
  155. package/dist/regexp.cjs +66 -0
  156. package/dist/regexp.cjs.map +1 -0
  157. package/dist/regexp.d.ts +65 -0
  158. package/dist/regexp.mjs +66 -0
  159. package/dist/regexp.mjs.map +1 -0
  160. package/dist/string.cjs +16 -0
  161. package/dist/string.cjs.map +1 -0
  162. package/dist/string.d.ts +80 -0
  163. package/dist/string.mjs +16 -0
  164. package/dist/string.mjs.map +1 -0
  165. package/dist/string2.cjs +157 -0
  166. package/dist/string2.cjs.map +1 -0
  167. package/dist/string2.mjs +158 -0
  168. package/dist/string2.mjs.map +1 -0
  169. package/dist/time/from.d.ts +14 -0
  170. package/dist/time/to.d.ts +38 -0
  171. package/dist/time.cjs +82 -0
  172. package/dist/time.cjs.map +1 -0
  173. package/dist/time.mjs +82 -0
  174. package/dist/time.mjs.map +1 -0
  175. package/dist/timer.cjs +119 -0
  176. package/dist/timer.cjs.map +1 -0
  177. package/dist/timer.d.ts +96 -0
  178. package/{src/timer.ts → dist/timer.mjs} +17 -124
  179. package/dist/timer.mjs.map +1 -0
  180. package/dist/tree.cjs +125 -0
  181. package/dist/tree.cjs.map +1 -0
  182. package/dist/tree.d.ts +210 -0
  183. package/dist/tree.mjs +125 -0
  184. package/dist/tree.mjs.map +1 -0
  185. package/dist/type.cjs +78 -0
  186. package/dist/type.cjs.map +1 -0
  187. package/{src/type.ts → dist/type.d.ts} +20 -96
  188. package/dist/type.mjs +78 -0
  189. package/dist/type.mjs.map +1 -0
  190. package/dist/types.cjs +2 -0
  191. package/dist/types.cjs.map +1 -0
  192. package/{src/types.ts → dist/types.d.ts} +12 -33
  193. package/dist/types.mjs +2 -0
  194. package/dist/types.mjs.map +1 -0
  195. package/dist/unique.cjs +46 -0
  196. package/dist/unique.cjs.map +1 -0
  197. package/dist/unique.d.ts +22 -0
  198. package/dist/unique.mjs +46 -0
  199. package/dist/unique.mjs.map +1 -0
  200. package/dist/url.cjs +37 -0
  201. package/dist/url.cjs.map +1 -0
  202. package/dist/url.d.ts +53 -0
  203. package/dist/url.mjs +37 -0
  204. package/dist/url.mjs.map +1 -0
  205. package/dist/version.cjs +33 -0
  206. package/dist/version.cjs.map +1 -0
  207. package/dist/version.d.ts +32 -0
  208. package/dist/version.mjs +33 -0
  209. package/dist/version.mjs.map +1 -0
  210. package/package.json +8 -2
  211. package/CHANGELOG.md +0 -52
  212. package/src/array.ts +0 -312
  213. package/src/async.ts +0 -379
  214. package/src/base64.ts +0 -20
  215. package/src/cache.ts +0 -146
  216. package/src/color/distance.ts +0 -28
  217. package/src/color/helpers.ts +0 -23
  218. package/src/color/hex-hsl.ts +0 -11
  219. package/src/color/hex-rgb.ts +0 -39
  220. package/src/color/rgb-hsl.ts +0 -53
  221. package/src/color/rgb-hwb.ts +0 -56
  222. package/src/color/rgb-whiter.ts +0 -22
  223. package/src/color/rgb-xyz.ts +0 -62
  224. package/src/crypto/md5.mjs +0 -357
  225. package/src/crypto/sha1.mjs +0 -300
  226. package/src/crypto/sha256.mjs +0 -310
  227. package/src/crypto/sha512.mjs +0 -459
  228. package/src/date/const.ts +0 -6
  229. package/src/date/core.ts +0 -162
  230. package/src/date/days.ts +0 -51
  231. package/src/date/relative.ts +0 -92
  232. package/src/date/start-end.ts +0 -246
  233. package/src/date/timezone.ts +0 -220
  234. package/src/date/weeks.ts +0 -100
  235. package/src/dts/global.d.ts +0 -27
  236. package/src/easing.ts +0 -166
  237. package/src/emitter.ts +0 -117
  238. package/src/enum.ts +0 -171
  239. package/src/exception.ts +0 -68
  240. package/src/fn.ts +0 -197
  241. package/src/index.ts +0 -1
  242. package/src/number.ts +0 -236
  243. package/src/object/get-set.ts +0 -273
  244. package/src/object/is.ts +0 -128
  245. package/src/object/merge.ts +0 -180
  246. package/src/path.ts +0 -188
  247. package/src/regexp.ts +0 -156
  248. package/src/string.ts +0 -146
  249. package/src/time/from.ts +0 -57
  250. package/src/time/to.ts +0 -106
  251. package/src/tree.ts +0 -394
  252. package/src/unique.ts +0 -77
  253. package/src/url.ts +0 -93
  254. package/src/version.ts +0 -71
  255. package/test/array.test.ts +0 -332
  256. package/test/async-real.test.ts +0 -39
  257. package/test/async.test.ts +0 -375
  258. package/test/base64.test.ts +0 -32
  259. package/test/cache.test.ts +0 -83
  260. package/test/color.test.ts +0 -163
  261. package/test/crypto.test.ts +0 -34
  262. package/test/date-tz.test.ts +0 -206
  263. package/test/date.test.ts +0 -353
  264. package/test/easing.test.ts +0 -33
  265. package/test/emitter.test.ts +0 -71
  266. package/test/enum.test.ts +0 -113
  267. package/test/env.test.ts +0 -69
  268. package/test/error.test.ts +0 -58
  269. package/test/exception.test.ts +0 -43
  270. package/test/fn.test.ts +0 -263
  271. package/test/helpers.ts +0 -23
  272. package/test/index.test.ts +0 -6
  273. package/test/number.test.ts +0 -213
  274. package/test/object.test.ts +0 -309
  275. package/test/path.test.ts +0 -156
  276. package/test/promise.test.ts +0 -199
  277. package/test/qs.test.ts +0 -79
  278. package/test/regexp.test.ts +0 -97
  279. package/test/string.test.ts +0 -150
  280. package/test/time.test.ts +0 -214
  281. package/test/timer.test.ts +0 -114
  282. package/test/tree.test.ts +0 -348
  283. package/test/type.test.ts +0 -226
  284. package/test/unique.test.ts +0 -71
  285. package/test/url.test.ts +0 -136
  286. package/test/version.test.ts +0 -52
  287. package/tsconfig.json +0 -31
  288. package/vite.config.mts +0 -114
  289. /package/{src/color.ts → dist/color.d.ts} +0 -0
  290. /package/{src/date.ts → dist/date.d.ts} +0 -0
  291. /package/{src/dict.ts → dist/dict.d.ts} +0 -0
  292. /package/{src/object.ts → dist/object.d.ts} +0 -0
  293. /package/{src/time.ts → dist/time.d.ts} +0 -0
package/src/unique.ts DELETED
@@ -1,77 +0,0 @@
1
- import { numberConvert, randomNumber } from './number';
2
- import { STRING_DICT } from './string';
3
- import { isNumber, isString } from './type';
4
-
5
- let lastTimestamp = 0;
6
- let lastSafePadding = 0;
7
-
8
- /**
9
- * 生成一个唯一的 BigInt 值。
10
- *
11
- * @param randomLength - 可选参数,指定随机部分的长度,默认为 0。
12
- * 如果大于 0,则会在结果中附加指定长度的随机数。
13
- * @returns 返回一个唯一的 BigInt 值,包含时间戳、随机部分(如果有)以及递增的填充值。
14
- */
15
- export function uniqueBigInt(randomLength = 0): bigint {
16
- const now = Date.now();
17
-
18
- if (now !== lastTimestamp) {
19
- lastTimestamp = now;
20
- lastSafePadding = 0;
21
- }
22
-
23
- let randomPart = '';
24
-
25
- if (randomLength > 0) {
26
- const randomMin = 10 ** (randomLength - 1);
27
- const randomMax = 10 ** randomLength - 1;
28
- randomPart = String(randomNumber(randomMin, randomMax));
29
- }
30
-
31
- return BigInt(randomPart + lastSafePadding++ + now);
32
- }
33
-
34
- const _randomChar = (dict: string): string => {
35
- const poolIndex = randomNumber(0, dict.length - 1);
36
-
37
- return dict[poolIndex];
38
- };
39
-
40
- /**
41
- * 生成一个唯一的字符串。
42
- *
43
- * @param minLength - 可选参数,指定生成字符串的最小长度。
44
- * 如果未提供或为字符串类型,则使用默认长度。
45
- * @param dict - 可选参数,指定生成字符串时使用的字符集。
46
- * 如果未提供,则使用默认字符集 `STRING_DICT`。
47
- * @returns 返回一个唯一的字符串,包含时间戳、随机部分(如果有)以及递增的填充值。
48
- * 如果指定了 `length`,则返回值的长度将被调整到指定长度。
49
- */
50
- export function uniqueString(minLength: number, dict: string): string;
51
- export function uniqueString(minLength: number): string;
52
- export function uniqueString(dict: string): string;
53
- export function uniqueString(): string;
54
- export function uniqueString(minLength?: number | string, dict?: string) {
55
- let finalLength = 0;
56
- let finalDict = STRING_DICT;
57
-
58
- if (isString(dict)) {
59
- finalLength = minLength as number;
60
- finalDict = dict;
61
- } else if (isNumber(minLength)) {
62
- finalLength = minLength;
63
- } else if (isString(minLength)) {
64
- finalDict = minLength;
65
- }
66
-
67
- let uniqueString = numberConvert(uniqueBigInt(), finalDict);
68
- let insertLength = finalLength - uniqueString.length;
69
-
70
- if (insertLength <= 0) return uniqueString;
71
-
72
- while (insertLength--) {
73
- uniqueString += _randomChar(finalDict);
74
- }
75
-
76
- return uniqueString;
77
- }
package/src/url.ts DELETED
@@ -1,93 +0,0 @@
1
- /**
2
- * 表示解析后的 URL 组件。
3
- */
4
- export type TURLMeta = {
5
- /**
6
- * 协议部分,包含冒号,例如 "https:"。
7
- */
8
- protocol: string;
9
- /**
10
- * 主机部分,包括主机名和端口。
11
- */
12
- host: string;
13
- /**
14
- * 主机名部分。
15
- */
16
- hostname: string;
17
- /**
18
- * 端口部分。
19
- */
20
- port: string;
21
- /**
22
- * 路径部分。
23
- */
24
- pathname: string;
25
- /**
26
- * 查询字符串部分。
27
- */
28
- search: string;
29
- /**
30
- * 哈希部分。
31
- */
32
- hash: string;
33
- /**
34
- * 用户名部分。
35
- */
36
- username: string;
37
- /**
38
- * 密码部分。
39
- */
40
- password: string;
41
- };
42
-
43
- /**
44
- * 解析 URL 字符串为组件对象。
45
- * @param url - 需要解析的 URL 字符串。
46
- * @returns 包含解析后 URL 组件的对象。
47
- */
48
- export function urlParse(url: string): TURLMeta {
49
- let result: URL | null = null;
50
-
51
- try {
52
- // 添加 globalThis 是便于对接外部环境 URL 的自行实现
53
- // 例如在 uni-app、微信小程序等运行环境。
54
- result = new globalThis.URL(url);
55
- } catch (e) {
56
- // ignore
57
- }
58
-
59
- const protocol = result?.protocol || '';
60
- const host = result?.host || '';
61
-
62
- return {
63
- protocol,
64
- host,
65
- hostname: result?.hostname || '',
66
- port: result?.port || '',
67
- pathname: result?.pathname || '',
68
- search: result?.search || '',
69
- hash: result?.hash || '',
70
- username: result?.username || '',
71
- password: result?.password || '',
72
- };
73
- }
74
-
75
- /**
76
- * 将 URLInfo 对象转换回 URL 字符串。
77
- * @param url - 需要转换的 URLInfo 对象。
78
- * @returns 转换后的 URL 字符串。
79
- */
80
- export function urlStringify(url: TURLMeta) {
81
- const { protocol, hostname, port, pathname, search, hash, username, password } = url;
82
- return [
83
- protocol ? `${protocol}//` : '',
84
- username && password ? `${username}:${password}@` : '',
85
- hostname,
86
- port ? `:${port}` : '',
87
- pathname,
88
- search,
89
- hash,
90
- ]
91
- .filter(Boolean)
92
- .join('');
93
- }
package/src/version.ts DELETED
@@ -1,71 +0,0 @@
1
- import { isUndefined } from './type';
2
-
3
- /**
4
- * 表示包含主版本号、次版本号和修订号的对象
5
- */
6
- export type TVersionObject = {
7
- /**
8
- * 主版本号,当有不兼容的API修改时递增
9
- */
10
- major: number;
11
- /**
12
- * 次版本号,当有向下兼容的功能新增时递增
13
- */
14
- minor: number;
15
- /**
16
- * 修订号,当有向下兼容的问题修正时递增
17
- */
18
- patch: number;
19
- };
20
-
21
- /**
22
- * 将数字转换为安全的数值,如果输入为NaN则返回0
23
- * @param n - 要转换的数字
24
- * @returns 安全的数字(如果输入为NaN则返回0)
25
- */
26
- function internal_numerical(n?: number) {
27
- return Number.isNaN(n) || isUndefined(n) ? 0 : n;
28
- }
29
-
30
- /**
31
- * 将语义化版本号字符串解析为VersionObject对象
32
- * @param version - 要解析的版本号字符串 (例如 "1.2.3")
33
- * @returns 包含主版本号、次版本号和修订号的对象
34
- * @throws 如果版本号字符串格式无效将抛出错误
35
- */
36
- export function versionParse(version: string): TVersionObject {
37
- const [major, minor, patch] = version.split('.').map(Number);
38
- return {
39
- major: internal_numerical(major),
40
- minor: internal_numerical(minor),
41
- patch: internal_numerical(patch),
42
- };
43
- }
44
-
45
- /**
46
- * 比较两个语义化版本号字符串
47
- * @param version1 - 要比较的第一个版本号字符串
48
- * @param version2 - 要比较的第二个版本号字符串
49
- * @returns 如果version1较大返回1,version2较大返回-1,相等返回0
50
- * @throws 如果任一版本号字符串格式无效将抛出错误
51
- */
52
- export function versionCompare(version1: string, version2: string): number {
53
- const vo1 = versionParse(version1);
54
- const vo2 = versionParse(version2);
55
- const order: (keyof TVersionObject)[] = ['major', 'minor', 'patch'];
56
-
57
- for (const key of order) {
58
- const n1 = vo1[key];
59
- const n2 = vo2[key];
60
-
61
- if (n1 > n2) {
62
- return 1;
63
- }
64
-
65
- if (n1 < n2) {
66
- return -1;
67
- }
68
- }
69
-
70
- return 0;
71
- }
@@ -1,332 +0,0 @@
1
- import { promiseDelay } from '@/promise';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { arrayDiff, arrayEach, arrayEachAsync, arrayMove, arrayOmit, arrayPick, isArrayLike } from '../src/array';
4
-
5
- describe('isArrayLike', () => {
6
- it('应正确判断类数组对象', () => {
7
- expect(isArrayLike({ length: 0 })).toBe(true);
8
- expect(isArrayLike({ length: 1, 0: 'a' })).toBe(true);
9
- expect(isArrayLike({ length: -1 })).toBe(false);
10
- expect(isArrayLike({ length: '1' })).toBe(false);
11
- expect(isArrayLike([])).toBe(true);
12
- expect(isArrayLike([1, 2, 3])).toBe(true);
13
- expect(isArrayLike({})).toBe(false);
14
- expect(isArrayLike(null)).toBe(false);
15
- expect(isArrayLike(undefined)).toBe(false);
16
- expect(isArrayLike('string')).toBe(false);
17
- expect(isArrayLike(123)).toBe(false);
18
- });
19
- });
20
-
21
- describe('arrayPick', () => {
22
- it('应从数组中选择指定索引的元素', () => {
23
- expect(arrayPick([1, 2, 3, 4], [0, 2])).toEqual([1, 3]);
24
- expect(arrayPick([1, 2, 3, 4], [2, 0])).toEqual([1, 3]);
25
- expect(arrayPick(['a', 'b', 'c'], [1])).toEqual(['b']);
26
- expect(arrayPick([true, false, true], [0, 1, 2])).toEqual([true, false, true]);
27
- expect(arrayPick([], [0, 1])).toEqual([]);
28
- expect(arrayPick([1, 2, 3], [])).toEqual([]);
29
- });
30
- });
31
-
32
- describe('arrayOmit', () => {
33
- it('应从数组中排除指定索引的元素', () => {
34
- expect(arrayOmit([1, 2, 3, 4], [0, 2])).toEqual([2, 4]);
35
- expect(arrayOmit(['a', 'b', 'c'], [1])).toEqual(['a', 'c']);
36
- expect(arrayOmit([true, false, true], [0, 1, 2])).toEqual([]);
37
- expect(arrayOmit([], [0, 1])).toEqual([]);
38
- expect(arrayOmit([1, 2, 3], [])).toEqual([1, 2, 3]);
39
- });
40
- });
41
-
42
- describe('arrayMove', () => {
43
- it('应正确移动数组中的元素', () => {
44
- const arr = [1, 2, 3, 4];
45
- expect(arrayMove(arr, 1, 3)).toEqual([1, 3, 4, 2]);
46
- expect(arrayMove(arr, 2, 0)).toEqual([3, 1, 2, 4]);
47
- });
48
-
49
- it('应处理移动到数组开头的情况', () => {
50
- const arr = [1, 2, 3, 4];
51
- expect(arrayMove(arr, 2, 0)).toEqual([3, 1, 2, 4]);
52
- });
53
-
54
- it('应处理移动到数组末尾的情况', () => {
55
- const arr = [1, 2, 3, 4];
56
- expect(arrayMove(arr, 1, 3)).toEqual([1, 3, 4, 2]);
57
- });
58
-
59
- it('应处理无效索引的情况', () => {
60
- const arr = [1, 2, 3, 4];
61
- expect(arrayMove(arr, 5, 0)).toEqual([1, 2, 3, 4]);
62
- expect(arrayMove(arr, 0, 5)).toEqual([1, 2, 3, 4]);
63
- });
64
-
65
- it('应处理空数组的情况', () => {
66
- const arr: number[] = [];
67
- expect(arrayMove(arr, 0, 1)).toEqual([]);
68
- });
69
- });
70
-
71
- describe('arrayEach', () => {
72
- it('应正确遍历数组中的每个元素', () => {
73
- const arr = [1, 2, 3];
74
- const results: number[] = [];
75
-
76
- arrayEach(arr, (item) => {
77
- results.push(item);
78
- });
79
-
80
- expect(results).toEqual([1, 2, 3]);
81
- });
82
-
83
- it('应支持提前终止遍历', () => {
84
- const arr = [1, 2, 3];
85
- const results: number[] = [];
86
-
87
- arrayEach(arr, (item) => {
88
- results.push(item);
89
- if (item === 2) return false;
90
- });
91
-
92
- expect(results).toEqual([1, 2]);
93
- });
94
-
95
- it('应正确反向遍历数组', () => {
96
- const arr = [1, 2, 3];
97
- const results: number[] = [];
98
-
99
- arrayEach(
100
- arr,
101
- (item) => {
102
- results.push(item);
103
- },
104
- true,
105
- );
106
-
107
- expect(results).toEqual([3, 2, 1]);
108
- });
109
-
110
- it('应支持反向遍历时提前终止', () => {
111
- const arr = [1, 2, 3];
112
- const results: number[] = [];
113
-
114
- arrayEach(
115
- arr,
116
- (item) => {
117
- results.push(item);
118
- if (item === 2) return false;
119
- },
120
- true,
121
- );
122
-
123
- expect(results).toEqual([3, 2]);
124
- });
125
-
126
- it('应支持在遍历过程中删除元素', () => {
127
- const arr = ['a', 'b', 'c'];
128
- const fn = vi.fn();
129
-
130
- arrayEach(arr, (val, idx) => {
131
- if (val === 'b') {
132
- arr.splice(idx, 1);
133
- }
134
-
135
- fn(val, idx);
136
- });
137
-
138
- expect(fn).toHaveBeenCalledTimes(3);
139
- expect(fn).toHaveBeenNthCalledWith(1, 'a', 0);
140
- expect(fn).toHaveBeenNthCalledWith(2, 'b', 1);
141
- expect(fn).toHaveBeenNthCalledWith(3, 'c', 2);
142
- expect(arr).toEqual(['a', 'c']);
143
- });
144
- });
145
-
146
- describe('arrayEachAsync', () => {
147
- it('应正确异步遍历数组中的每个元素', async () => {
148
- const arr = [1, 2, 3];
149
- const results: number[] = [];
150
-
151
- await arrayEachAsync(arr, async (item) => {
152
- await promiseDelay(1);
153
- results.push(item);
154
- });
155
-
156
- expect(results).toEqual([1, 2, 3]);
157
- });
158
-
159
- it('应支持提前终止异步遍历', async () => {
160
- const arr = [1, 2, 3];
161
- const results: number[] = [];
162
-
163
- await arrayEachAsync(arr, async (item) => {
164
- await promiseDelay(1);
165
- results.push(item);
166
-
167
- if (item === 2) return false;
168
- });
169
-
170
- expect(results).toEqual([1, 2]);
171
- });
172
-
173
- it('应正确反向异步遍历数组', async () => {
174
- const arr = [1, 2, 3];
175
- const results: number[] = [];
176
-
177
- await arrayEachAsync(
178
- arr,
179
- async (item) => {
180
- await promiseDelay(1);
181
- results.push(item);
182
- },
183
- true,
184
- );
185
-
186
- expect(results).toEqual([3, 2, 1]);
187
- });
188
-
189
- it('应支持反向异步遍历时提前终止', async () => {
190
- const arr = [1, 2, 3];
191
- const results: number[] = [];
192
-
193
- await arrayEachAsync(
194
- arr,
195
- async (item) => {
196
- await promiseDelay(1);
197
- results.push(item);
198
-
199
- if (item === 2) return false;
200
- },
201
- true,
202
- );
203
-
204
- expect(results).toEqual([3, 2]);
205
- });
206
- });
207
-
208
- describe('arrayDiff', () => {
209
- it('应正确识别新增和删除的元素', () => {
210
- const ref = [1, 2, 3];
211
- const cur = [2, 3, 4];
212
- const diff = arrayDiff(ref, cur);
213
-
214
- expect(diff.deletes).toEqual([{ refIndexes: [0], refValue: 1 }]);
215
- expect(diff.adds).toEqual([{ curIndexes: [2], curValue: 4 }]);
216
- expect(diff.equals).toEqual([
217
- { refIndexes: [1], curIndexes: [0], refValue: 2, curValue: 2 },
218
- { refIndexes: [2], curIndexes: [1], refValue: 3, curValue: 3 },
219
- ]);
220
- });
221
-
222
- it('应正确处理完全不同的数组', () => {
223
- const ref = [1, 2, 3];
224
- const cur = [4, 5, 6];
225
- const diff = arrayDiff(ref, cur);
226
-
227
- expect(diff.deletes).toEqual([
228
- { refIndexes: [0], refValue: 1 },
229
- { refIndexes: [1], refValue: 2 },
230
- { refIndexes: [2], refValue: 3 },
231
- ]);
232
- expect(diff.adds).toEqual([
233
- { curIndexes: [0], curValue: 4 },
234
- { curIndexes: [1], curValue: 5 },
235
- { curIndexes: [2], curValue: 6 },
236
- ]);
237
- expect(diff.equals).toEqual([]);
238
- });
239
-
240
- it('应正确处理完全相同的数组', () => {
241
- const ref = [1, 2, 3];
242
- const cur = [1, 2, 3];
243
- const diff = arrayDiff(ref, cur);
244
-
245
- expect(diff.deletes).toEqual([]);
246
- expect(diff.adds).toEqual([]);
247
- expect(diff.equals).toEqual([
248
- { refIndexes: [0], curIndexes: [0], refValue: 1, curValue: 1 },
249
- { refIndexes: [1], curIndexes: [1], refValue: 2, curValue: 2 },
250
- { refIndexes: [2], curIndexes: [2], refValue: 3, curValue: 3 },
251
- ]);
252
- });
253
-
254
- it('应正确处理重复元素的差异', () => {
255
- const ref = [1, 2, 2, 3];
256
- const cur = [2, 3, 3, 4];
257
- const diff = arrayDiff(ref, cur);
258
-
259
- expect(diff.deletes).toEqual([{ refIndexes: [0], refValue: 1 }]);
260
- expect(diff.adds).toEqual([{ curIndexes: [3], curValue: 4 }]);
261
- expect(diff.equals).toEqual([
262
- { refIndexes: [1, 2], curIndexes: [0], refValue: 2, curValue: 2 },
263
- { refIndexes: [3], curIndexes: [1, 2], refValue: 3, curValue: 3 },
264
- ]);
265
- });
266
-
267
- it('应正确处理空数组的情况', () => {
268
- expect(arrayDiff([], [1, 2])).toEqual({
269
- deletes: [],
270
- adds: [
271
- { curIndexes: [0], curValue: 1 },
272
- { curIndexes: [1], curValue: 2 },
273
- ],
274
- equals: [],
275
- });
276
-
277
- expect(arrayDiff([1, 2], [])).toEqual({
278
- deletes: [
279
- { refIndexes: [0], refValue: 1 },
280
- { refIndexes: [1], refValue: 2 },
281
- ],
282
- adds: [],
283
- equals: [],
284
- });
285
-
286
- expect(arrayDiff([], [])).toEqual({
287
- deletes: [],
288
- adds: [],
289
- equals: [],
290
- });
291
- });
292
-
293
- it('应正确处理包含引用类型的数组', () => {
294
- const obj1 = { id: 1 };
295
- const obj2 = { id: 2 };
296
- const obj3 = { id: 3 };
297
-
298
- const ref = [obj1, obj2];
299
- const cur = [obj2, obj3];
300
- const diff = arrayDiff(ref, cur);
301
-
302
- expect(diff.deletes).toEqual([{ refIndexes: [0], refValue: obj1 }]);
303
- expect(diff.adds).toEqual([{ curIndexes: [1], curValue: obj3 }]);
304
- expect(diff.equals).toEqual([{ refIndexes: [1], curIndexes: [0], refValue: obj2, curValue: obj2 }]);
305
- });
306
-
307
- it('应正确处理包含特殊值的数组', () => {
308
- const ref = [null, undefined, Number.NaN];
309
- const cur = [undefined, null];
310
- const diff = arrayDiff(ref, cur);
311
-
312
- expect(diff.deletes).toEqual([{ refIndexes: [2], refValue: Number.NaN }]);
313
- expect(diff.adds).toEqual([]);
314
- expect(diff.equals).toEqual([
315
- { refIndexes: [0], curIndexes: [1], refValue: null, curValue: null },
316
- { refIndexes: [1], curIndexes: [0], refValue: undefined, curValue: undefined },
317
- ]);
318
- });
319
-
320
- it('应正确处理包含NaN的情况', () => {
321
- const ref = [1, Number.NaN, 2];
322
- const cur = [Number.NaN, 3];
323
- const diff = arrayDiff(ref, cur);
324
-
325
- expect(diff.deletes).toEqual([
326
- { refIndexes: [0], refValue: 1 },
327
- { refIndexes: [2], refValue: 2 },
328
- ]);
329
- expect(diff.adds).toEqual([{ curIndexes: [1], curValue: 3 }]);
330
- expect(diff.equals).toEqual([{ refIndexes: [1], curIndexes: [0], refValue: Number.NaN, curValue: Number.NaN }]);
331
- });
332
- });
@@ -1,39 +0,0 @@
1
- import { asyncLimit } from '@/async';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { createAfn } from './helpers';
4
-
5
- describe('asyncLimit 异常', () => {
6
- it('应正确处理拒绝的 Promise', async () => {
7
- const reason = Math.random().toString();
8
- // const afn = createAfn({
9
- // timeout: 0,
10
- // reason: reason,
11
- // });
12
- // const p = afn();
13
- // await expect(p).rejects.toEqual(reason);
14
-
15
- const fn = vi.fn();
16
- const result = asyncLimit(
17
- [
18
- createAfn({
19
- delay: 100,
20
- result: 1,
21
- }),
22
- createAfn({
23
- delay: 10,
24
- reason: reason,
25
- }),
26
- // 并发 2,第 2 个 promise 提早报错后将不会再继续执行
27
- createAfn({
28
- delay: 1,
29
- result: 3,
30
- onFinally: fn,
31
- }),
32
- ],
33
- 2,
34
- );
35
-
36
- await expect(result).rejects.toThrow(reason);
37
- expect(fn).not.toHaveBeenCalled();
38
- });
39
- });