@cloudcome/utils-core 1.1.0 → 1.1.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 (292) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +21 -0
  3. package/package.json +279 -1
  4. package/src/array.ts +312 -0
  5. package/src/async.ts +379 -0
  6. package/src/base64.ts +20 -0
  7. package/src/cache.ts +146 -0
  8. package/{dist/color/contrast.d.ts → src/color/contrast.ts} +12 -2
  9. package/src/color/distance.ts +28 -0
  10. package/src/color/helpers.ts +23 -0
  11. package/src/color/hex-hsl.ts +11 -0
  12. package/{dist/color/hex-hsv.d.ts → src/color/hex-hsv.ts} +11 -3
  13. package/{dist/color/hex-hwb.d.ts → src/color/hex-hwb.ts} +11 -3
  14. package/src/color/hex-rgb.ts +39 -0
  15. package/{dist/color/hsl-lighten.d.ts → src/color/hsl-lighten.ts} +7 -2
  16. package/{dist/color/hsv-brighten.d.ts → src/color/hsv-brighten.ts} +7 -2
  17. package/{dist/color/luminance.d.ts → src/color/luminance.ts} +9 -2
  18. package/{dist/color/mix.d.ts → src/color/mix.ts} +10 -2
  19. package/src/color/rgb-hsl.ts +53 -0
  20. package/{dist/color/rgb-hsv.d.ts → src/color/rgb-hsv.ts} +30 -3
  21. package/src/color/rgb-hwb.ts +56 -0
  22. package/{dist/color/rgb-lab.d.ts → src/color/rgb-lab.ts} +11 -3
  23. package/src/color/rgb-whiter.ts +22 -0
  24. package/src/color/rgb-xyz.ts +62 -0
  25. package/{dist/color/types.d.ts → src/color/types.ts} +12 -30
  26. package/{dist/color/xyz-lab.d.ts → src/color/xyz-lab.ts} +32 -3
  27. package/src/crypto/md5.mjs +357 -0
  28. package/src/crypto/sha1.mjs +300 -0
  29. package/src/crypto/sha256.mjs +310 -0
  30. package/src/crypto/sha512.mjs +459 -0
  31. package/{dist/crypto.d.ts → src/crypto.ts} +20 -4
  32. package/src/date/const.ts +6 -0
  33. package/src/date/core.ts +162 -0
  34. package/src/date/days.ts +51 -0
  35. package/{dist/date/is.d.ts → src/date/is.ts} +102 -8
  36. package/src/date/relative.ts +92 -0
  37. package/src/date/start-end.ts +246 -0
  38. package/src/date/timezone.ts +220 -0
  39. package/src/date/weeks.ts +100 -0
  40. package/src/dts/global.d.ts +27 -0
  41. package/src/easing.ts +166 -0
  42. package/src/emitter.ts +117 -0
  43. package/src/enum.ts +171 -0
  44. package/{dist/env.d.ts → src/env.ts} +30 -6
  45. package/{dist/error.d.ts → src/error.ts} +12 -3
  46. package/src/exception.ts +68 -0
  47. package/src/fn.ts +197 -0
  48. package/src/index.ts +1 -0
  49. package/src/number.ts +236 -0
  50. package/{dist/object/each.d.ts → src/object/each.ts} +23 -3
  51. package/src/object/get-set.ts +273 -0
  52. package/src/object/is.ts +128 -0
  53. package/src/object/merge.ts +180 -0
  54. package/{dist/object/process.d.ts → src/object/process.ts} +38 -4
  55. package/src/path.ts +188 -0
  56. package/{dist/promise.d.ts → src/promise.ts} +67 -6
  57. package/{dist/qs.d.ts → src/qs.ts} +60 -3
  58. package/src/regexp.ts +156 -0
  59. package/src/string.ts +146 -0
  60. package/src/time/from.ts +57 -0
  61. package/src/time/to.ts +106 -0
  62. package/{dist/timer.mjs → src/timer.ts} +124 -17
  63. package/{dist/tree.d.ts → src/tree.ts} +225 -41
  64. package/{dist/type.d.ts → src/type.ts} +96 -20
  65. package/{dist/types.d.ts → src/types.ts} +33 -12
  66. package/src/unique.ts +77 -0
  67. package/src/url.ts +93 -0
  68. package/src/version.ts +71 -0
  69. package/test/array.test.ts +332 -0
  70. package/test/async-real.test.ts +39 -0
  71. package/test/async.test.ts +375 -0
  72. package/test/base64.test.ts +32 -0
  73. package/test/cache.test.ts +83 -0
  74. package/test/color.test.ts +163 -0
  75. package/test/crypto.test.ts +34 -0
  76. package/test/date-tz.test.ts +206 -0
  77. package/test/date.test.ts +353 -0
  78. package/test/easing.test.ts +33 -0
  79. package/test/emitter.test.ts +71 -0
  80. package/test/enum.test.ts +113 -0
  81. package/test/env.test.ts +69 -0
  82. package/test/error.test.ts +58 -0
  83. package/test/exception.test.ts +43 -0
  84. package/test/fn.test.ts +263 -0
  85. package/test/helpers.ts +23 -0
  86. package/test/index.test.ts +6 -0
  87. package/test/number.test.ts +213 -0
  88. package/test/object.test.ts +309 -0
  89. package/test/path.test.ts +156 -0
  90. package/test/promise.test.ts +199 -0
  91. package/test/qs.test.ts +79 -0
  92. package/test/regexp.test.ts +97 -0
  93. package/test/string.test.ts +150 -0
  94. package/test/time.test.ts +214 -0
  95. package/test/timer.test.ts +114 -0
  96. package/test/tree.test.ts +348 -0
  97. package/test/type.test.ts +226 -0
  98. package/test/unique.test.ts +71 -0
  99. package/test/url.test.ts +136 -0
  100. package/test/version.test.ts +52 -0
  101. package/tsconfig.json +31 -0
  102. package/vite.config.mts +114 -0
  103. package/dist/array.cjs +0 -129
  104. package/dist/array.cjs.map +0 -1
  105. package/dist/array.d.ts +0 -171
  106. package/dist/array.mjs +0 -129
  107. package/dist/array.mjs.map +0 -1
  108. package/dist/async.cjs +0 -219
  109. package/dist/async.cjs.map +0 -1
  110. package/dist/async.d.ts +0 -137
  111. package/dist/async.mjs +0 -219
  112. package/dist/async.mjs.map +0 -1
  113. package/dist/base64.cjs +0 -16
  114. package/dist/base64.cjs.map +0 -1
  115. package/dist/base64.d.ts +0 -7
  116. package/dist/base64.mjs +0 -16
  117. package/dist/base64.mjs.map +0 -1
  118. package/dist/cache.cjs +0 -79
  119. package/dist/cache.cjs.map +0 -1
  120. package/dist/cache.d.ts +0 -90
  121. package/dist/cache.mjs +0 -79
  122. package/dist/cache.mjs.map +0 -1
  123. package/dist/color/distance.d.ts +0 -8
  124. package/dist/color/helpers.d.ts +0 -2
  125. package/dist/color/hex-hsl.d.ts +0 -3
  126. package/dist/color/hex-rgb.d.ts +0 -18
  127. package/dist/color/rgb-hsl.d.ts +0 -23
  128. package/dist/color/rgb-hwb.d.ts +0 -29
  129. package/dist/color/rgb-whiter.d.ts +0 -12
  130. package/dist/color/rgb-xyz.d.ts +0 -22
  131. package/dist/color.cjs +0 -250
  132. package/dist/color.cjs.map +0 -1
  133. package/dist/color.mjs +0 -250
  134. package/dist/color.mjs.map +0 -1
  135. package/dist/const.cjs +0 -14
  136. package/dist/const.cjs.map +0 -1
  137. package/dist/const.mjs +0 -15
  138. package/dist/const.mjs.map +0 -1
  139. package/dist/core.cjs +0 -250
  140. package/dist/core.cjs.map +0 -1
  141. package/dist/core.mjs +0 -251
  142. package/dist/core.mjs.map +0 -1
  143. package/dist/crypto/md5.d.mts +0 -1
  144. package/dist/crypto/sha1.d.mts +0 -1
  145. package/dist/crypto/sha256.d.mts +0 -1
  146. package/dist/crypto/sha512.d.mts +0 -1
  147. package/dist/crypto.cjs +0 -812
  148. package/dist/crypto.cjs.map +0 -1
  149. package/dist/crypto.mjs +0 -812
  150. package/dist/crypto.mjs.map +0 -1
  151. package/dist/date/const.d.ts +0 -6
  152. package/dist/date/core.d.ts +0 -52
  153. package/dist/date/days.d.ts +0 -23
  154. package/dist/date/relative.d.ts +0 -44
  155. package/dist/date/start-end.d.ts +0 -73
  156. package/dist/date/timezone.d.ts +0 -67
  157. package/dist/date/weeks.d.ts +0 -72
  158. package/dist/date.cjs +0 -239
  159. package/dist/date.cjs.map +0 -1
  160. package/dist/date.mjs +0 -241
  161. package/dist/date.mjs.map +0 -1
  162. package/dist/dict.cjs +0 -2
  163. package/dist/dict.cjs.map +0 -1
  164. package/dist/dict.mjs +0 -2
  165. package/dist/dict.mjs.map +0 -1
  166. package/dist/each.cjs +0 -18
  167. package/dist/each.cjs.map +0 -1
  168. package/dist/each.mjs +0 -19
  169. package/dist/each.mjs.map +0 -1
  170. package/dist/easing.cjs +0 -151
  171. package/dist/easing.cjs.map +0 -1
  172. package/dist/easing.d.ts +0 -46
  173. package/dist/easing.mjs +0 -151
  174. package/dist/easing.mjs.map +0 -1
  175. package/dist/emitter.cjs +0 -94
  176. package/dist/emitter.cjs.map +0 -1
  177. package/dist/emitter.d.ts +0 -68
  178. package/dist/emitter.mjs +0 -94
  179. package/dist/emitter.mjs.map +0 -1
  180. package/dist/enum.cjs +0 -58
  181. package/dist/enum.cjs.map +0 -1
  182. package/dist/enum.d.ts +0 -68
  183. package/dist/enum.mjs +0 -58
  184. package/dist/enum.mjs.map +0 -1
  185. package/dist/env.cjs +0 -28
  186. package/dist/env.cjs.map +0 -1
  187. package/dist/env.mjs +0 -28
  188. package/dist/env.mjs.map +0 -1
  189. package/dist/error.cjs +0 -12
  190. package/dist/error.cjs.map +0 -1
  191. package/dist/error.mjs +0 -12
  192. package/dist/error.mjs.map +0 -1
  193. package/dist/exception.cjs +0 -22
  194. package/dist/exception.cjs.map +0 -1
  195. package/dist/exception.d.ts +0 -31
  196. package/dist/exception.mjs +0 -22
  197. package/dist/exception.mjs.map +0 -1
  198. package/dist/fn.cjs +0 -76
  199. package/dist/fn.cjs.map +0 -1
  200. package/dist/fn.d.ts +0 -102
  201. package/dist/fn.mjs +0 -76
  202. package/dist/fn.mjs.map +0 -1
  203. package/dist/index.cjs +0 -5
  204. package/dist/index.cjs.map +0 -1
  205. package/dist/index.d.ts +0 -1
  206. package/dist/index.mjs +0 -5
  207. package/dist/index.mjs.map +0 -1
  208. package/dist/merge.cjs +0 -87
  209. package/dist/merge.cjs.map +0 -1
  210. package/dist/merge.mjs +0 -88
  211. package/dist/merge.mjs.map +0 -1
  212. package/dist/number.cjs +0 -11
  213. package/dist/number.cjs.map +0 -1
  214. package/dist/number.d.ts +0 -137
  215. package/dist/number.mjs +0 -11
  216. package/dist/number.mjs.map +0 -1
  217. package/dist/object/get-set.d.ts +0 -111
  218. package/dist/object/is.d.ts +0 -32
  219. package/dist/object/merge.d.ts +0 -72
  220. package/dist/object.cjs +0 -130
  221. package/dist/object.cjs.map +0 -1
  222. package/dist/object.mjs +0 -130
  223. package/dist/object.mjs.map +0 -1
  224. package/dist/path.cjs +0 -77
  225. package/dist/path.cjs.map +0 -1
  226. package/dist/path.d.ts +0 -82
  227. package/dist/path.mjs +0 -77
  228. package/dist/path.mjs.map +0 -1
  229. package/dist/promise.cjs +0 -62
  230. package/dist/promise.cjs.map +0 -1
  231. package/dist/promise.mjs +0 -62
  232. package/dist/promise.mjs.map +0 -1
  233. package/dist/qs.cjs +0 -47
  234. package/dist/qs.cjs.map +0 -1
  235. package/dist/qs.mjs +0 -47
  236. package/dist/qs.mjs.map +0 -1
  237. package/dist/regexp.cjs +0 -66
  238. package/dist/regexp.cjs.map +0 -1
  239. package/dist/regexp.d.ts +0 -65
  240. package/dist/regexp.mjs +0 -66
  241. package/dist/regexp.mjs.map +0 -1
  242. package/dist/string.cjs +0 -16
  243. package/dist/string.cjs.map +0 -1
  244. package/dist/string.d.ts +0 -80
  245. package/dist/string.mjs +0 -16
  246. package/dist/string.mjs.map +0 -1
  247. package/dist/string2.cjs +0 -147
  248. package/dist/string2.cjs.map +0 -1
  249. package/dist/string2.mjs +0 -148
  250. package/dist/string2.mjs.map +0 -1
  251. package/dist/time/from.d.ts +0 -14
  252. package/dist/time/to.d.ts +0 -38
  253. package/dist/time.cjs +0 -82
  254. package/dist/time.cjs.map +0 -1
  255. package/dist/time.mjs +0 -82
  256. package/dist/time.mjs.map +0 -1
  257. package/dist/timer.cjs +0 -119
  258. package/dist/timer.cjs.map +0 -1
  259. package/dist/timer.d.ts +0 -96
  260. package/dist/timer.mjs.map +0 -1
  261. package/dist/tree.cjs +0 -125
  262. package/dist/tree.cjs.map +0 -1
  263. package/dist/tree.mjs +0 -125
  264. package/dist/tree.mjs.map +0 -1
  265. package/dist/type.cjs +0 -78
  266. package/dist/type.cjs.map +0 -1
  267. package/dist/type.mjs +0 -78
  268. package/dist/type.mjs.map +0 -1
  269. package/dist/types.cjs +0 -2
  270. package/dist/types.cjs.map +0 -1
  271. package/dist/types.mjs +0 -2
  272. package/dist/types.mjs.map +0 -1
  273. package/dist/unique.cjs +0 -46
  274. package/dist/unique.cjs.map +0 -1
  275. package/dist/unique.d.ts +0 -22
  276. package/dist/unique.mjs +0 -46
  277. package/dist/unique.mjs.map +0 -1
  278. package/dist/url.cjs +0 -37
  279. package/dist/url.cjs.map +0 -1
  280. package/dist/url.d.ts +0 -53
  281. package/dist/url.mjs +0 -37
  282. package/dist/url.mjs.map +0 -1
  283. package/dist/version.cjs +0 -33
  284. package/dist/version.cjs.map +0 -1
  285. package/dist/version.d.ts +0 -32
  286. package/dist/version.mjs +0 -33
  287. package/dist/version.mjs.map +0 -1
  288. /package/{dist/color.d.ts → src/color.ts} +0 -0
  289. /package/{dist/date.d.ts → src/date.ts} +0 -0
  290. /package/{dist/dict.d.ts → src/dict.ts} +0 -0
  291. /package/{dist/object.d.ts → src/object.ts} +0 -0
  292. /package/{dist/time.d.ts → src/time.ts} +0 -0
package/dist/fn.d.ts DELETED
@@ -1,102 +0,0 @@
1
- import { AnyFunction } from './types';
2
- /**
3
- * 一个空操作函数,不执行任何操作。
4
- *
5
- * @example
6
- * ```typescript
7
- * fnNoop(); // 不执行任何操作
8
- * ```
9
- */
10
- export declare function fnNoop(): void;
11
- /**
12
- * 防抖函数的配置选项。
13
- */
14
- export type TDebounceOptions = {
15
- /**
16
- * 等待时间(毫秒)。
17
- */
18
- wait: number;
19
- /**
20
- * 是否在等待开始时立即执行一次
21
- * @default false
22
- */
23
- leading?: boolean;
24
- };
25
- /**
26
- * 创建一个防抖函数,该函数会在指定的等待时间后执行,如果在等待时间内再次调用,则重新计时。
27
- *
28
- * @param fn - 需要防抖的函数。
29
- * @param wait - 等待时间(毫秒)或包含 `wait` 和 `leading` 选项的对象。
30
- * @returns 返回一个防抖函数,该函数具有 `cancel` 方法,用于取消防抖操作。
31
- *
32
- * @example
33
- * ```typescript
34
- * const debouncedFn = fnDebounce(() => {
35
- * console.log('Debounced!');
36
- * }, 100);
37
- *
38
- * debouncedFn(); // 不会立即执行
39
- * debouncedFn(); // 重新计时
40
- * debouncedFn.cancel(); // 取消防抖操作
41
- * ```
42
- */
43
- export declare function fnDebounce<F extends AnyFunction>(fn: F, wait: number | TDebounceOptions): {
44
- (this: unknown, ...args: Parameters<F>): void;
45
- cancel(): void;
46
- };
47
- export type TThrottleOptions = {
48
- /**
49
- * 等待时间(毫秒)。
50
- */
51
- wait: number;
52
- /**
53
- * 是否在第一次调用时立即执行
54
- * @default false
55
- */
56
- leading?: boolean;
57
- /**
58
- * 是否在调用结束后等待一段时间再执行
59
- * @default false
60
- */
61
- trailing?: boolean;
62
- };
63
- /**
64
- * 创建一个节流函数,该函数会在指定的等待时间内最多执行一次,如果在等待时间内再次调用,则忽略后续调用。
65
- *
66
- * @param fn - 需要节流的函数。
67
- * @param wait - 等待时间(毫秒)或包含 `wait`、`leading` 和 `trailing` 选项的对象。
68
- * @returns 返回一个节流函数,该函数具有 `cancel` 方法,用于取消节流操作。
69
- *
70
- * @example
71
- * ```typescript
72
- * const throttledFn = fnThrottle(() => {
73
- * console.log('Throttled!');
74
- * }, 100);
75
- *
76
- * throttledFn(); // 立即执行
77
- * throttledFn(); // 忽略
78
- * throttledFn.cancel(); // 取消节流操作
79
- * ```
80
- */
81
- export declare function fnThrottle<F extends AnyFunction>(fn: F, wait: number | TThrottleOptions): {
82
- (this: unknown, ...args: Parameters<F>): void;
83
- cancel(): void;
84
- };
85
- /**
86
- * 创建一个只执行一次的函数,无论调用多少次,实际执行的函数体也只会执行一次。
87
- *
88
- * @param fn - 需要只执行一次的函数。
89
- * @returns 返回一个只执行一次的函数,该函数在第一次调用后会缓存结果并返回缓存的结果。
90
- *
91
- * @example
92
- * ```typescript
93
- * const onceFn = fnOnce(() => {
94
- * console.log('This will be logged only once.');
95
- * return 42;
96
- * });
97
- *
98
- * console.log(onceFn()); // 输出: This will be logged only once. 42
99
- * console.log(onceFn()); // 输出: 42
100
- * ```
101
- */
102
- export declare function fnOnce<F extends AnyFunction>(fn: F): (this: unknown, ...args: Parameters<F>) => any;
package/dist/fn.mjs DELETED
@@ -1,76 +0,0 @@
1
- import { isNumber } from "./type.mjs";
2
- function fnNoop() {
3
- }
4
- function fnDebounce(fn, wait) {
5
- const options = isNumber(wait) ? { wait } : wait;
6
- let canceled = false;
7
- let timer;
8
- let leading = false;
9
- const debounced = function(...args) {
10
- if (canceled) return;
11
- if (options.leading && !leading) {
12
- leading = true;
13
- fn.apply(this, args);
14
- return;
15
- }
16
- clearTimeout(timer);
17
- timer = setTimeout(() => {
18
- if (canceled) return;
19
- fn.apply(this, args);
20
- }, options.wait);
21
- };
22
- debounced.cancel = () => {
23
- clearTimeout(timer);
24
- canceled = true;
25
- };
26
- return debounced;
27
- }
28
- function fnThrottle(fn, wait) {
29
- const options = isNumber(wait) ? { wait } : wait;
30
- const waitFinal = options.wait;
31
- let lastTime = 0;
32
- let canceled = false;
33
- let timer;
34
- const throttled = function(...args) {
35
- if (canceled) return;
36
- const now = Date.now();
37
- if (options.leading && lastTime === 0) {
38
- lastTime = now;
39
- fn.apply(this, args);
40
- } else if (lastTime > 0 && now - lastTime >= waitFinal) {
41
- lastTime = now;
42
- fn.apply(this, args);
43
- } else if (lastTime === 0) {
44
- lastTime = now;
45
- }
46
- if (options.trailing) {
47
- clearTimeout(timer);
48
- timer = setTimeout(() => {
49
- fn.apply(this, args);
50
- }, waitFinal);
51
- }
52
- };
53
- throttled.cancel = () => {
54
- canceled = true;
55
- clearTimeout(timer);
56
- };
57
- return throttled;
58
- }
59
- function fnOnce(fn) {
60
- let called = false;
61
- let result;
62
- return function(...args) {
63
- if (!called) {
64
- called = true;
65
- result = fn.apply(this, args);
66
- }
67
- return result;
68
- };
69
- }
70
- export {
71
- fnDebounce,
72
- fnNoop,
73
- fnOnce,
74
- fnThrottle
75
- };
76
- //# sourceMappingURL=fn.mjs.map
package/dist/fn.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"fn.mjs","sources":["../src/fn.ts"],"sourcesContent":["import { isNumber } from './type';\nimport type { AnyFunction } from './types';\n\n/**\n * 一个空操作函数,不执行任何操作。\n *\n * @example\n * ```typescript\n * fnNoop(); // 不执行任何操作\n * ```\n */\nexport function fnNoop() {\n //\n}\n\n/**\n * 防抖函数的配置选项。\n */\nexport type TDebounceOptions = {\n /**\n * 等待时间(毫秒)。\n */\n wait: number;\n /**\n * 是否在等待开始时立即执行一次\n * @default false\n */\n leading?: boolean;\n};\n\n/**\n * 创建一个防抖函数,该函数会在指定的等待时间后执行,如果在等待时间内再次调用,则重新计时。\n *\n * @param fn - 需要防抖的函数。\n * @param wait - 等待时间(毫秒)或包含 `wait` 和 `leading` 选项的对象。\n * @returns 返回一个防抖函数,该函数具有 `cancel` 方法,用于取消防抖操作。\n *\n * @example\n * ```typescript\n * const debouncedFn = fnDebounce(() => {\n * console.log('Debounced!');\n * }, 100);\n *\n * debouncedFn(); // 不会立即执行\n * debouncedFn(); // 重新计时\n * debouncedFn.cancel(); // 取消防抖操作\n * ```\n */\nexport function fnDebounce<F extends AnyFunction>(fn: F, wait: number | TDebounceOptions) {\n const options: TDebounceOptions = isNumber(wait) ? { wait } : wait;\n let canceled = false;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let timer: any;\n let leading = false;\n\n const debounced = function (this: unknown, ...args: Parameters<F>) {\n if (canceled) return;\n\n // 第一次执行\n if (options.leading && !leading) {\n leading = true;\n fn.apply(this, args);\n return;\n }\n\n // 最后一次执行\n clearTimeout(timer);\n timer = setTimeout(() => {\n if (canceled) return;\n\n fn.apply(this, args);\n }, options.wait);\n };\n\n debounced.cancel = () => {\n clearTimeout(timer);\n canceled = true;\n };\n\n return debounced;\n}\n\nexport type TThrottleOptions = {\n /**\n * 等待时间(毫秒)。\n */\n wait: number;\n\n /**\n * 是否在第一次调用时立即执行\n * @default false\n */\n leading?: boolean;\n\n /**\n * 是否在调用结束后等待一段时间再执行\n * @default false\n */\n trailing?: boolean;\n};\n\n/**\n * 创建一个节流函数,该函数会在指定的等待时间内最多执行一次,如果在等待时间内再次调用,则忽略后续调用。\n *\n * @param fn - 需要节流的函数。\n * @param wait - 等待时间(毫秒)或包含 `wait`、`leading` 和 `trailing` 选项的对象。\n * @returns 返回一个节流函数,该函数具有 `cancel` 方法,用于取消节流操作。\n *\n * @example\n * ```typescript\n * const throttledFn = fnThrottle(() => {\n * console.log('Throttled!');\n * }, 100);\n *\n * throttledFn(); // 立即执行\n * throttledFn(); // 忽略\n * throttledFn.cancel(); // 取消节流操作\n * ```\n */\nexport function fnThrottle<F extends AnyFunction>(fn: F, wait: number | TThrottleOptions) {\n const options = isNumber(wait) ? { wait } : wait;\n const waitFinal = options.wait;\n let lastTime = 0;\n let canceled = false;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let timer: any;\n\n const throttled = function (this: unknown, ...args: Parameters<F>) {\n if (canceled) return;\n\n const now = Date.now();\n\n // 第一次执行\n if (options.leading && lastTime === 0) {\n lastTime = now;\n fn.apply(this, args);\n }\n\n // 中间控频执行\n else if (lastTime > 0 && now - lastTime >= waitFinal) {\n lastTime = now;\n fn.apply(this, args);\n }\n\n // 首次计时\n else if (lastTime === 0) {\n lastTime = now;\n }\n\n // 最后一次执行\n if (options.trailing) {\n clearTimeout(timer);\n timer = setTimeout(() => {\n fn.apply(this, args);\n }, waitFinal);\n }\n };\n\n throttled.cancel = () => {\n canceled = true;\n clearTimeout(timer);\n };\n\n return throttled;\n}\n\n/**\n * 创建一个只执行一次的函数,无论调用多少次,实际执行的函数体也只会执行一次。\n *\n * @param fn - 需要只执行一次的函数。\n * @returns 返回一个只执行一次的函数,该函数在第一次调用后会缓存结果并返回缓存的结果。\n *\n * @example\n * ```typescript\n * const onceFn = fnOnce(() => {\n * console.log('This will be logged only once.');\n * return 42;\n * });\n *\n * console.log(onceFn()); // 输出: This will be logged only once. 42\n * console.log(onceFn()); // 输出: 42\n * ```\n */\nexport function fnOnce<F extends AnyFunction>(fn: F) {\n let called = false;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let result: any;\n\n return function (this: unknown, ...args: Parameters<F>) {\n if (!called) {\n called = true;\n result = fn.apply(this, args);\n }\n\n return result;\n };\n}\n"],"names":[],"mappings":";AAWO,SAAS,SAAS;AAEzB;AAmCgB,SAAA,WAAkC,IAAO,MAAiC;AACxF,QAAM,UAA4B,SAAS,IAAI,IAAI,EAAE,KAAS,IAAA;AAC9D,MAAI,WAAW;AAEX,MAAA;AACJ,MAAI,UAAU;AAER,QAAA,YAAY,YAA4B,MAAqB;AACjE,QAAI,SAAU;AAGV,QAAA,QAAQ,WAAW,CAAC,SAAS;AACrB,gBAAA;AACP,SAAA,MAAM,MAAM,IAAI;AACnB;AAAA,IAAA;AAIF,iBAAa,KAAK;AAClB,YAAQ,WAAW,MAAM;AACvB,UAAI,SAAU;AAEX,SAAA,MAAM,MAAM,IAAI;AAAA,IAAA,GAClB,QAAQ,IAAI;AAAA,EACjB;AAEA,YAAU,SAAS,MAAM;AACvB,iBAAa,KAAK;AACP,eAAA;AAAA,EACb;AAEO,SAAA;AACT;AAuCgB,SAAA,WAAkC,IAAO,MAAiC;AACxF,QAAM,UAAU,SAAS,IAAI,IAAI,EAAE,KAAS,IAAA;AAC5C,QAAM,YAAY,QAAQ;AAC1B,MAAI,WAAW;AACf,MAAI,WAAW;AAEX,MAAA;AAEE,QAAA,YAAY,YAA4B,MAAqB;AACjE,QAAI,SAAU;AAER,UAAA,MAAM,KAAK,IAAI;AAGjB,QAAA,QAAQ,WAAW,aAAa,GAAG;AAC1B,iBAAA;AACR,SAAA,MAAM,MAAM,IAAI;AAAA,IAIZ,WAAA,WAAW,KAAK,MAAM,YAAY,WAAW;AACzC,iBAAA;AACR,SAAA,MAAM,MAAM,IAAI;AAAA,IAAA,WAIZ,aAAa,GAAG;AACZ,iBAAA;AAAA,IAAA;AAIb,QAAI,QAAQ,UAAU;AACpB,mBAAa,KAAK;AAClB,cAAQ,WAAW,MAAM;AACpB,WAAA,MAAM,MAAM,IAAI;AAAA,SAClB,SAAS;AAAA,IAAA;AAAA,EAEhB;AAEA,YAAU,SAAS,MAAM;AACZ,eAAA;AACX,iBAAa,KAAK;AAAA,EACpB;AAEO,SAAA;AACT;AAmBO,SAAS,OAA8B,IAAO;AACnD,MAAI,SAAS;AAET,MAAA;AAEJ,SAAO,YAA4B,MAAqB;AACtD,QAAI,CAAC,QAAQ;AACF,eAAA;AACA,eAAA,GAAG,MAAM,MAAM,IAAI;AAAA,IAAA;AAGvB,WAAA;AAAA,EACT;AACF;"}
package/dist/index.cjs DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VERSION = "1.1.0";
4
- exports.VERSION = VERSION;
5
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["export const VERSION = PKG_VERSION;\n"],"names":[],"mappings":";;AAAO,MAAM,UAAU;;"}
package/dist/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare const VERSION: string;
package/dist/index.mjs DELETED
@@ -1,5 +0,0 @@
1
- const VERSION = "1.1.0";
2
- export {
3
- VERSION
4
- };
5
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["export const VERSION = PKG_VERSION;\n"],"names":[],"mappings":"AAAO,MAAM,UAAU;"}
package/dist/merge.cjs DELETED
@@ -1,87 +0,0 @@
1
- "use strict";
2
- const type = require("./type.cjs");
3
- const each = require("./each.cjs");
4
- function _objectMerge(mergeRule, target, ...sources) {
5
- const seen = /* @__PURE__ */ new WeakMap();
6
- const { assign, next } = mergeRule;
7
- const align = (target2, source) => {
8
- const targetType = type.typeIs(target2);
9
- const sourceType = type.typeIs(source);
10
- if (targetType === sourceType) {
11
- return target2;
12
- }
13
- return sourceType === "array" ? [] : {};
14
- };
15
- const each$1 = (source, iterator) => {
16
- if (type.isObject(source)) {
17
- each.objectEach(source, iterator);
18
- } else {
19
- source.forEach(iterator);
20
- }
21
- };
22
- const merge = (target2, source) => {
23
- if (seen.has(source)) {
24
- return seen.get(source);
25
- }
26
- const merged = align(target2, source);
27
- seen.set(source, merged);
28
- each$1(source, (value, key) => {
29
- if (!next({ target: merged, source, key })) {
30
- return;
31
- }
32
- if (type.isObject(value) || type.isArray(value)) {
33
- merged[key] = assign({
34
- target: merged,
35
- source,
36
- key,
37
- // @ts-expect-error
38
- merge: () => merge(merged[key], value)
39
- });
40
- } else {
41
- merged[key] = assign({
42
- target: merged,
43
- source,
44
- key,
45
- merge: () => value
46
- });
47
- }
48
- });
49
- return merged;
50
- };
51
- let returnTarget = target;
52
- for (const source of sources) {
53
- returnTarget = merge(target, source);
54
- }
55
- return returnTarget;
56
- }
57
- function objectMerge(target, ...sources) {
58
- return _objectMerge(
59
- {
60
- next() {
61
- return true;
62
- },
63
- assign({ merge }) {
64
- return merge();
65
- }
66
- },
67
- target,
68
- ...sources
69
- );
70
- }
71
- function objectDefaults(target, defaults) {
72
- return _objectMerge(
73
- {
74
- next({ target: target2, source, key }) {
75
- return target2[key] === void 0 || type.isObject(target2[key]) || type.isArray(target2[key]);
76
- },
77
- assign({ merge }) {
78
- return merge();
79
- }
80
- },
81
- target,
82
- defaults
83
- );
84
- }
85
- exports.objectDefaults = objectDefaults;
86
- exports.objectMerge = objectMerge;
87
- //# sourceMappingURL=merge.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.cjs","sources":["../src/object/merge.ts"],"sourcesContent":["import { isArray, isObject, typeIs } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\nimport { objectEach } from './each';\n\nexport type TObjectMergeRule = {\n /**\n * 处理冲突\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回 true 表示继续处理,否则返回 false\n */\n next: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n }) => boolean;\n\n /**\n * 处理赋值\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回处理后的值\n */\n assign: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n merge: () => any;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n }) => any;\n};\n\nfunction _objectMerge(mergeRule: TObjectMergeRule, target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n const seen = new WeakMap<AnyObject | AnyArray, AnyObject | AnyArray>();\n const { assign, next } = mergeRule;\n const align = (target: AnyObject | AnyArray, source: AnyObject | AnyArray) => {\n const targetType = typeIs(target);\n const sourceType = typeIs(source);\n\n if (targetType === sourceType) {\n return target;\n }\n\n return sourceType === 'array' ? [] : {};\n };\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n const each = (source: AnyObject | AnyArray, iterator: (val: any, key: string | number) => void) => {\n if (isObject(source)) {\n objectEach(source, iterator);\n } else {\n source.forEach(iterator);\n }\n };\n\n const merge = (target: AnyObject | AnyArray, source: AnyObject | AnyArray): AnyObject | AnyArray => {\n // 如果循环引用了,则直接返回目标对象\n if (seen.has(source)) {\n // biome-ignore lint/style/noNonNullAssertion: <explanation>\n return seen.get(source)!;\n }\n\n // 对齐目标对象和源对象\n const merged = align(target, source);\n\n // 存储循环引用\n seen.set(source, merged);\n\n // 遍历源对象\n each(source, (value, key) => {\n if (!next({ target: merged, source, key })) {\n return;\n }\n\n if (isObject(value) || isArray(value)) {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n // @ts-expect-error\n merge: () => merge(merged[key], value),\n });\n } else {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n merge: () => value,\n });\n }\n });\n\n return merged;\n };\n\n let returnTarget = target;\n\n for (const source of sources) {\n returnTarget = merge(target, source);\n }\n\n return returnTarget;\n}\n\n/**\n * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。\n *\n * @param target - 目标对象或数组。\n * @param sources - 要合并的源对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj1 = { a: 1, b: { x: 10 } };\n * const obj2 = { b: { y: 20 }, c: 3 };\n * const merged = objectMerge(obj1, obj2);\n * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }\n * ```\n */\nexport function objectMerge(target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n return _objectMerge(\n {\n next() {\n return true;\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n ...sources,\n );\n}\n\n/**\n * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。\n * 支持多个默认对象,优先级从左到右依次降低。\n * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。\n *\n * @param target - 目标对象或数组。\n * @param defaults - 默认对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: undefined };\n * const defaults = { a: 4, b: 2, c: 3 };\n * const result = objectDefaults(obj, defaults);\n * console.log(result); // { a: 1, b: 2, c: 3 }\n *\n * const obj2 = { a: 1, b: 2 };\n * const defaults2 = { a: 5, b: 3, c: 4 };\n * const result2 = objectDefaults(obj2, defaults2);\n * console.log(result2); // { a: 1, b: 2, c: 4 }\n *\n * const obj3 = { a: { x: 1 }, b: undefined };\n * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };\n * const result3 = objectDefaults(obj3, defaults3);\n * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }\n * ```\n */\nexport function objectDefaults<T extends AnyObject | AnyArray>(target: T, defaults: T): T {\n return _objectMerge(\n {\n next({ target, source, key }) {\n // @ts-expect-error\n return target[key] === undefined || isObject(target[key]) || isArray(target[key]);\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n defaults,\n ) as T;\n}\n"],"names":["target","typeIs","each","isObject","objectEach","isArray"],"mappings":";;;AAmCA,SAAS,aAAa,WAA6B,WAAiC,SAAmC;AAC/G,QAAA,2BAAW,QAAoD;AAC/D,QAAA,EAAE,QAAQ,KAAA,IAAS;AACnB,QAAA,QAAQ,CAACA,SAA8B,WAAiC;AACtE,UAAA,aAAaC,YAAOD,OAAM;AAC1B,UAAA,aAAaC,YAAO,MAAM;AAEhC,QAAI,eAAe,YAAY;AACtBD,aAAAA;AAAAA,IAAA;AAGT,WAAO,eAAe,UAAU,CAAA,IAAK,CAAC;AAAA,EACxC;AAEM,QAAAE,SAAO,CAAC,QAA8B,aAAuD;AAC7F,QAAAC,KAAAA,SAAS,MAAM,GAAG;AACpBC,WAAA,WAAW,QAAQ,QAAQ;AAAA,IAAA,OACtB;AACL,aAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAEM,QAAA,QAAQ,CAACJ,SAA8B,WAAuD;AAE9F,QAAA,KAAK,IAAI,MAAM,GAAG;AAEb,aAAA,KAAK,IAAI,MAAM;AAAA,IAAA;AAIlB,UAAA,SAAS,MAAMA,SAAQ,MAAM;AAG9B,SAAA,IAAI,QAAQ,MAAM;AAGlBE,WAAA,QAAQ,CAAC,OAAO,QAAQ;AACvB,UAAA,CAAC,KAAK,EAAE,QAAQ,QAAQ,QAAQ,IAAA,CAAK,GAAG;AAC1C;AAAA,MAAA;AAGF,UAAIC,KAAS,SAAA,KAAK,KAAKE,KAAA,QAAQ,KAAK,GAAG;AAE9B,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA;AAAA,UAEA,OAAO,MAAM,MAAM,OAAO,GAAG,GAAG,KAAK;AAAA,QAAA,CACtC;AAAA,MAAA,OACI;AAEE,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,MAAM;AAAA,QAAA,CACd;AAAA,MAAA;AAAA,IACH,CACD;AAEM,WAAA;AAAA,EACT;AAEA,MAAI,eAAe;AAEnB,aAAW,UAAU,SAAS;AACb,mBAAA,MAAM,QAAQ,MAAM;AAAA,EAAA;AAG9B,SAAA;AACT;AAiBgB,SAAA,YAAY,WAAiC,SAAmC;AACvF,SAAA;AAAA,IACL;AAAA,MACE,OAAO;AACE,eAAA;AAAA,MACT;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AA6BgB,SAAA,eAA+C,QAAW,UAAgB;AACjF,SAAA;AAAA,IACL;AAAA,MACE,KAAK,EAAE,QAAAL,SAAQ,QAAQ,OAAO;AAE5B,eAAOA,QAAO,GAAG,MAAM,UAAaG,KAAAA,SAASH,QAAO,GAAG,CAAC,KAAKK,KAAAA,QAAQL,QAAO,GAAG,CAAC;AAAA,MAClF;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;"}
package/dist/merge.mjs DELETED
@@ -1,88 +0,0 @@
1
- import { typeIs, isObject, isArray } from "./type.mjs";
2
- import { o as objectEach } from "./each.mjs";
3
- function _objectMerge(mergeRule, target, ...sources) {
4
- const seen = /* @__PURE__ */ new WeakMap();
5
- const { assign, next } = mergeRule;
6
- const align = (target2, source) => {
7
- const targetType = typeIs(target2);
8
- const sourceType = typeIs(source);
9
- if (targetType === sourceType) {
10
- return target2;
11
- }
12
- return sourceType === "array" ? [] : {};
13
- };
14
- const each = (source, iterator) => {
15
- if (isObject(source)) {
16
- objectEach(source, iterator);
17
- } else {
18
- source.forEach(iterator);
19
- }
20
- };
21
- const merge = (target2, source) => {
22
- if (seen.has(source)) {
23
- return seen.get(source);
24
- }
25
- const merged = align(target2, source);
26
- seen.set(source, merged);
27
- each(source, (value, key) => {
28
- if (!next({ target: merged, source, key })) {
29
- return;
30
- }
31
- if (isObject(value) || isArray(value)) {
32
- merged[key] = assign({
33
- target: merged,
34
- source,
35
- key,
36
- // @ts-expect-error
37
- merge: () => merge(merged[key], value)
38
- });
39
- } else {
40
- merged[key] = assign({
41
- target: merged,
42
- source,
43
- key,
44
- merge: () => value
45
- });
46
- }
47
- });
48
- return merged;
49
- };
50
- let returnTarget = target;
51
- for (const source of sources) {
52
- returnTarget = merge(target, source);
53
- }
54
- return returnTarget;
55
- }
56
- function objectMerge(target, ...sources) {
57
- return _objectMerge(
58
- {
59
- next() {
60
- return true;
61
- },
62
- assign({ merge }) {
63
- return merge();
64
- }
65
- },
66
- target,
67
- ...sources
68
- );
69
- }
70
- function objectDefaults(target, defaults) {
71
- return _objectMerge(
72
- {
73
- next({ target: target2, source, key }) {
74
- return target2[key] === void 0 || isObject(target2[key]) || isArray(target2[key]);
75
- },
76
- assign({ merge }) {
77
- return merge();
78
- }
79
- },
80
- target,
81
- defaults
82
- );
83
- }
84
- export {
85
- objectMerge as a,
86
- objectDefaults as o
87
- };
88
- //# sourceMappingURL=merge.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge.mjs","sources":["../src/object/merge.ts"],"sourcesContent":["import { isArray, isObject, typeIs } from '@/type';\nimport type { AnyArray, AnyObject } from '@/types';\nimport { objectEach } from './each';\n\nexport type TObjectMergeRule = {\n /**\n * 处理冲突\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回 true 表示继续处理,否则返回 false\n */\n next: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n }) => boolean;\n\n /**\n * 处理赋值\n * @param target - 目标对象\n * @param source - 源对象\n * @param key - 键名\n * @returns 返回处理后的值\n */\n assign: (info: {\n target: AnyObject | AnyArray;\n source: AnyObject | AnyArray;\n key: string | number;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n merge: () => any;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n }) => any;\n};\n\nfunction _objectMerge(mergeRule: TObjectMergeRule, target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n const seen = new WeakMap<AnyObject | AnyArray, AnyObject | AnyArray>();\n const { assign, next } = mergeRule;\n const align = (target: AnyObject | AnyArray, source: AnyObject | AnyArray) => {\n const targetType = typeIs(target);\n const sourceType = typeIs(source);\n\n if (targetType === sourceType) {\n return target;\n }\n\n return sourceType === 'array' ? [] : {};\n };\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n const each = (source: AnyObject | AnyArray, iterator: (val: any, key: string | number) => void) => {\n if (isObject(source)) {\n objectEach(source, iterator);\n } else {\n source.forEach(iterator);\n }\n };\n\n const merge = (target: AnyObject | AnyArray, source: AnyObject | AnyArray): AnyObject | AnyArray => {\n // 如果循环引用了,则直接返回目标对象\n if (seen.has(source)) {\n // biome-ignore lint/style/noNonNullAssertion: <explanation>\n return seen.get(source)!;\n }\n\n // 对齐目标对象和源对象\n const merged = align(target, source);\n\n // 存储循环引用\n seen.set(source, merged);\n\n // 遍历源对象\n each(source, (value, key) => {\n if (!next({ target: merged, source, key })) {\n return;\n }\n\n if (isObject(value) || isArray(value)) {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n // @ts-expect-error\n merge: () => merge(merged[key], value),\n });\n } else {\n // @ts-expect-error\n merged[key] = assign({\n target: merged,\n source,\n key,\n merge: () => value,\n });\n }\n });\n\n return merged;\n };\n\n let returnTarget = target;\n\n for (const source of sources) {\n returnTarget = merge(target, source);\n }\n\n return returnTarget;\n}\n\n/**\n * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。\n *\n * @param target - 目标对象或数组。\n * @param sources - 要合并的源对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj1 = { a: 1, b: { x: 10 } };\n * const obj2 = { b: { y: 20 }, c: 3 };\n * const merged = objectMerge(obj1, obj2);\n * console.log(merged); // { a: 1, b: { x: 10, y: 20 }, c: 3 }\n * ```\n */\nexport function objectMerge(target: AnyObject | AnyArray, ...sources: (AnyObject | AnyArray)[]) {\n return _objectMerge(\n {\n next() {\n return true;\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n ...sources,\n );\n}\n\n/**\n * 为对象设置默认值。如果目标对象中的属性为 `undefined`,则使用默认对象中的属性值。\n * 支持多个默认对象,优先级从左到右依次降低。\n * 如果目标对象中的属性已经是对象或数组,则递归地设置默认值。\n *\n * @param target - 目标对象或数组。\n * @param defaults - 默认对象或数组。\n * @returns 合并后的对象或数组。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: undefined };\n * const defaults = { a: 4, b: 2, c: 3 };\n * const result = objectDefaults(obj, defaults);\n * console.log(result); // { a: 1, b: 2, c: 3 }\n *\n * const obj2 = { a: 1, b: 2 };\n * const defaults2 = { a: 5, b: 3, c: 4 };\n * const result2 = objectDefaults(obj2, defaults2);\n * console.log(result2); // { a: 1, b: 2, c: 4 }\n *\n * const obj3 = { a: { x: 1 }, b: undefined };\n * const defaults3 = { a: { x: 4, z: 3 }, b: { y: 2 } };\n * const result3 = objectDefaults(obj3, defaults3);\n * console.log(result3); // { a: { x: 1, z: 3 }, b: { y: 2 } }\n * ```\n */\nexport function objectDefaults<T extends AnyObject | AnyArray>(target: T, defaults: T): T {\n return _objectMerge(\n {\n next({ target, source, key }) {\n // @ts-expect-error\n return target[key] === undefined || isObject(target[key]) || isArray(target[key]);\n },\n assign({ merge }) {\n return merge();\n },\n },\n target,\n defaults,\n ) as T;\n}\n"],"names":["target"],"mappings":";;AAmCA,SAAS,aAAa,WAA6B,WAAiC,SAAmC;AAC/G,QAAA,2BAAW,QAAoD;AAC/D,QAAA,EAAE,QAAQ,KAAA,IAAS;AACnB,QAAA,QAAQ,CAACA,SAA8B,WAAiC;AACtE,UAAA,aAAa,OAAOA,OAAM;AAC1B,UAAA,aAAa,OAAO,MAAM;AAEhC,QAAI,eAAe,YAAY;AACtBA,aAAAA;AAAAA,IAAA;AAGT,WAAO,eAAe,UAAU,CAAA,IAAK,CAAC;AAAA,EACxC;AAEM,QAAA,OAAO,CAAC,QAA8B,aAAuD;AAC7F,QAAA,SAAS,MAAM,GAAG;AACpB,iBAAW,QAAQ,QAAQ;AAAA,IAAA,OACtB;AACL,aAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAEM,QAAA,QAAQ,CAACA,SAA8B,WAAuD;AAE9F,QAAA,KAAK,IAAI,MAAM,GAAG;AAEb,aAAA,KAAK,IAAI,MAAM;AAAA,IAAA;AAIlB,UAAA,SAAS,MAAMA,SAAQ,MAAM;AAG9B,SAAA,IAAI,QAAQ,MAAM;AAGlB,SAAA,QAAQ,CAAC,OAAO,QAAQ;AACvB,UAAA,CAAC,KAAK,EAAE,QAAQ,QAAQ,QAAQ,IAAA,CAAK,GAAG;AAC1C;AAAA,MAAA;AAGF,UAAI,SAAS,KAAK,KAAK,QAAQ,KAAK,GAAG;AAE9B,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA;AAAA,UAEA,OAAO,MAAM,MAAM,OAAO,GAAG,GAAG,KAAK;AAAA,QAAA,CACtC;AAAA,MAAA,OACI;AAEE,eAAA,GAAG,IAAI,OAAO;AAAA,UACnB,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,MAAM;AAAA,QAAA,CACd;AAAA,MAAA;AAAA,IACH,CACD;AAEM,WAAA;AAAA,EACT;AAEA,MAAI,eAAe;AAEnB,aAAW,UAAU,SAAS;AACb,mBAAA,MAAM,QAAQ,MAAM;AAAA,EAAA;AAG9B,SAAA;AACT;AAiBgB,SAAA,YAAY,WAAiC,SAAmC;AACvF,SAAA;AAAA,IACL;AAAA,MACE,OAAO;AACE,eAAA;AAAA,MACT;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AA6BgB,SAAA,eAA+C,QAAW,UAAgB;AACjF,SAAA;AAAA,IACL;AAAA,MACE,KAAK,EAAE,QAAAA,SAAQ,QAAQ,OAAO;AAE5B,eAAOA,QAAO,GAAG,MAAM,UAAa,SAASA,QAAO,GAAG,CAAC,KAAK,QAAQA,QAAO,GAAG,CAAC;AAAA,MAClF;AAAA,MACA,OAAO,EAAE,SAAS;AAChB,eAAO,MAAM;AAAA,MAAA;AAAA,IAEjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;"}
package/dist/number.cjs DELETED
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- require("./merge.cjs");
4
- const number = require("./string2.cjs");
5
- exports.fileSizeAbbr = number.fileSizeAbbr;
6
- exports.numberAbbr = number.numberAbbr;
7
- exports.numberConvert = number.numberConvert;
8
- exports.numberFixed = number.numberFixed;
9
- exports.numberFormat = number.numberFormat;
10
- exports.randomNumber = number.randomNumber;
11
- //# sourceMappingURL=number.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"number.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
package/dist/number.d.ts DELETED
@@ -1,137 +0,0 @@
1
- export type NumberFixedOptions = {
2
- /**
3
- * 保留的小数位数
4
- * @default 0
5
- */
6
- precision?: number;
7
- /**
8
- * 舍入方法,0 为四舍五入,1 为向上取整,-1 为向下取整
9
- * @default 0
10
- */
11
- round?: 0 | 1 | -1;
12
- };
13
- /**
14
- * 对数字进行精确小数位数处理并按规则舍入
15
- * @param number 需要处理的原始数值
16
- * @param options 可选配置参数
17
- * @returns 处理后的数值(number类型)
18
- * @example
19
- * // 四舍五入示例
20
- * numberFixed(3.1415, { precision: 2 }); // 3.14
21
- * // 向上取整示例
22
- * numberFixed(3.1415, { precision: 2, round: 1 }); // 3.15
23
- * // 向下取整示例
24
- * numberFixed(3.9999, { precision: 1, round: -1 }); // 3.9
25
- */
26
- export declare function numberFixed(number: number, options?: NumberFixedOptions): number;
27
- /**
28
- * 生成指定范围内的随机整数
29
- * @param {number} min - 随机数的最小值(包含)
30
- * @param {number} max - 随机数的最大值(包含)
31
- * @returns {number} - 生成的随机整数
32
- * @example
33
- * // 生成 1 到 10 之间的随机整数
34
- * randomNumber(1, 10); // 可能返回 7
35
- */
36
- export declare function randomNumber(min: number, max: number): number;
37
- /**
38
- * 数字缩写选项
39
- */
40
- export type NumberAbbrOptions = {
41
- /**
42
- * 进制基数,用于计算单位进阶(如 1000 表示千进制)
43
- * @default 1000
44
- */
45
- base?: number;
46
- /**
47
- * 数值保留的小数位数
48
- * @default 0
49
- */
50
- precision?: number;
51
- };
52
- /**
53
- * 将数字转换为带单位缩写的字符串表示
54
- *
55
- * @param {number} number - 需要转换的原始数值
56
- * @param {Array<string>} units - 单位数组,按从小到大顺序排列(如['B','KB','MB']),不能为空
57
- * @param {NumberAbbrOptions} [options] - 可选配置参数
58
- * @returns {string} - 转换后的带单位字符串(如"1.2KB")
59
- * @example
60
- * // 基础用法
61
- * numberAbbr(1500, ['', 'K', 'M'], { base: 1000 }); // "1.5K"
62
- * @example
63
- * // 自定义小数位
64
- * numberAbbr(123456, ['B','KB','MB'], { precision: 1 }); // "0.1MB"
65
- * @example
66
- * // 处理不足基数的情况
67
- * numberAbbr(500, ['B','KB']); // "500B"
68
- */
69
- export declare function numberAbbr(number: number, units: Array<string>, options?: NumberAbbrOptions): string;
70
- /**
71
- * 将文件大小转换为带单位缩写的字符串表示
72
- *
73
- * @param {number} number - 需要转换的文件大小数值
74
- * @param {number} [precision=0] - 数值保留的小数位数
75
- * @returns {string} - 转换后的带单位字符串(如"1.2KB")
76
- * @example
77
- * // 基础用法
78
- * fileSizeAbbr(1024); // "1KB"
79
- * @example
80
- * // 自定义小数位
81
- * fileSizeAbbr(123456, 1); // "0.1MB"
82
- */
83
- export declare function fileSizeAbbr(number: number, precision?: number): string;
84
- /**
85
- * 将十进制数转换为指定进制的字符串表示
86
- *
87
- * @param {number | bigint} decimal - 需要转换的十进制数,可以是任意长度的数字或大整数
88
- * @param {string} [dict] - 用于表示进制的字符字典,默认为数字、小写字母和大写字母的组合(62 进制)
89
- * @returns {string} - 转换后的指定进制字符串
90
- * @throws {Error} - 如果字符字典的长度小于 2,将抛出错误
91
- * @example
92
- * // 默认 62 进制
93
- * numberConvert(123456789); // "8M0kX"
94
- * @example
95
- * // 自定义 16 进制
96
- * numberConvert(255, '0123456789ABCDEF'); // "FF"
97
- * @example
98
- * // 处理大整数
99
- * numberConvert(9007199254740991n); // "2gosa7pa2GV"
100
- */
101
- export declare function numberConvert(decimal: number | bigint, dict?: string): string;
102
- /**
103
- * 数字格式化配置选项
104
- */
105
- export type NumberFormatOptions = {
106
- /**
107
- * 分隔符字符,用于数字分隔
108
- * @default ','
109
- * @example 使用 '_' 分隔符时,123456 会格式化为 '123_456'
110
- */
111
- separator?: string;
112
- /**
113
- * 分隔步长,即每隔多少位添加分隔符
114
- * @default 3
115
- * @example 步长为 2 时,123456 会格式化为 '12,34,56'
116
- */
117
- step?: number;
118
- };
119
- /**
120
- * 数字格式化
121
- * @param [number] {number} 数字
122
- * @param options {NumberFormatOptions} 格式化配置
123
- * @returns {string} 分割后的字符串
124
- * @example
125
- * // 使用默认分隔符和步长
126
- * numberFormat(123456.789); // => "123,456.789"
127
- * // 自定义分隔符
128
- * numberFormat(123456.789, '_'); // => "123_456.789"
129
- * // 自定义步长
130
- * numberFormat(123456.789, 2); // => "12,34,56.789"
131
- * // 使用对象配置
132
- * numberFormat(123456.789, { separator: '.', step: 4 }); // => "12.3456.789"
133
- */
134
- export declare function numberFormat(number: number, options: NumberFormatOptions): string;
135
- export declare function numberFormat(number: number, separator: string): string;
136
- export declare function numberFormat(number: number, step: number): string;
137
- export declare function numberFormat(number: number): string;
package/dist/number.mjs DELETED
@@ -1,11 +0,0 @@
1
- import "./merge.mjs";
2
- import { f, b, n, a, c, r } from "./string2.mjs";
3
- export {
4
- f as fileSizeAbbr,
5
- b as numberAbbr,
6
- n as numberConvert,
7
- a as numberFixed,
8
- c as numberFormat,
9
- r as randomNumber
10
- };
11
- //# sourceMappingURL=number.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"number.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}