@cloudcome/utils-core 1.19.0 → 1.20.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 (161) hide show
  1. package/README.md +1 -1
  2. package/dist/array.cjs +181 -125
  3. package/dist/array.cjs.map +1 -1
  4. package/dist/array.mjs +181 -133
  5. package/dist/array.mjs.map +1 -1
  6. package/dist/async.cjs +181 -171
  7. package/dist/async.cjs.map +1 -1
  8. package/dist/async.mjs +181 -174
  9. package/dist/async.mjs.map +1 -1
  10. package/dist/base64.cjs +16 -12
  11. package/dist/base64.cjs.map +1 -1
  12. package/dist/base64.mjs +17 -14
  13. package/dist/base64.mjs.map +1 -1
  14. package/dist/cache.cjs +79 -67
  15. package/dist/cache.cjs.map +1 -1
  16. package/dist/cache.d.ts +3 -3
  17. package/dist/cache.mjs +80 -71
  18. package/dist/cache.mjs.map +1 -1
  19. package/dist/color.cjs +478 -167
  20. package/dist/color.cjs.map +1 -1
  21. package/dist/color.d.ts +3 -3
  22. package/dist/color.mjs +480 -197
  23. package/dist/color.mjs.map +1 -1
  24. package/dist/crypto.cjs +474 -687
  25. package/dist/crypto.cjs.map +1 -1
  26. package/dist/crypto.mjs +476 -693
  27. package/dist/crypto.mjs.map +1 -1
  28. package/dist/date.cjs +972 -161
  29. package/dist/date.cjs.map +1 -1
  30. package/dist/date.d.ts +2 -2
  31. package/dist/date.mjs +962 -191
  32. package/dist/date.mjs.map +1 -1
  33. package/dist/dict.cjs +90 -52
  34. package/dist/dict.cjs.map +1 -1
  35. package/dist/dict.d.ts +1 -1
  36. package/dist/dict.mjs +91 -54
  37. package/dist/dict.mjs.map +1 -1
  38. package/dist/easing.cjs +105 -103
  39. package/dist/easing.cjs.map +1 -1
  40. package/dist/easing.mjs +106 -133
  41. package/dist/easing.mjs.map +1 -1
  42. package/dist/emitter.cjs +101 -96
  43. package/dist/emitter.cjs.map +1 -1
  44. package/dist/emitter.mjs +101 -97
  45. package/dist/emitter.mjs.map +1 -1
  46. package/dist/env.cjs +43 -9
  47. package/dist/env.cjs.map +1 -1
  48. package/dist/env.d.ts +1 -1
  49. package/dist/env.mjs +43 -15
  50. package/dist/env.mjs.map +1 -1
  51. package/dist/error.cjs +26 -5
  52. package/dist/error.cjs.map +1 -1
  53. package/dist/error.mjs +26 -7
  54. package/dist/error.mjs.map +1 -1
  55. package/dist/exception.cjs +38 -20
  56. package/dist/exception.cjs.map +1 -1
  57. package/dist/exception.d.ts +5 -5
  58. package/dist/exception.mjs +38 -21
  59. package/dist/exception.mjs.map +1 -1
  60. package/dist/function.cjs +128 -68
  61. package/dist/function.cjs.map +1 -1
  62. package/dist/function.mjs +128 -72
  63. package/dist/function.mjs.map +1 -1
  64. package/dist/index.cjs +8 -3
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.mjs +9 -5
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/number.cjs +10 -14
  69. package/dist/number.mjs +2 -15
  70. package/dist/object/get-set.d.ts +27 -3
  71. package/dist/object/merge.d.ts +2 -2
  72. package/dist/object.cjs +369 -106
  73. package/dist/object.cjs.map +1 -1
  74. package/dist/object.mjs +366 -115
  75. package/dist/object.mjs.map +1 -1
  76. package/dist/path.cjs +144 -55
  77. package/dist/path.cjs.map +1 -1
  78. package/dist/path.mjs +144 -62
  79. package/dist/path.mjs.map +1 -1
  80. package/dist/promise.cjs +84 -43
  81. package/dist/promise.cjs.map +1 -1
  82. package/dist/promise.mjs +85 -50
  83. package/dist/promise.mjs.map +1 -1
  84. package/dist/qs.cjs +63 -39
  85. package/dist/qs.cjs.map +1 -1
  86. package/dist/qs.mjs +64 -42
  87. package/dist/qs.mjs.map +1 -1
  88. package/dist/regexp.cjs +118 -35
  89. package/dist/regexp.cjs.map +1 -1
  90. package/dist/regexp.mjs +119 -46
  91. package/dist/regexp.mjs.map +1 -1
  92. package/dist/string.cjs +12 -15
  93. package/dist/string.mjs +2 -16
  94. package/dist/string2.cjs +378 -142
  95. package/dist/string2.cjs.map +1 -1
  96. package/dist/string2.mjs +259 -143
  97. package/dist/string2.mjs.map +1 -1
  98. package/dist/time.cjs +136 -59
  99. package/dist/time.cjs.map +1 -1
  100. package/dist/time.mjs +136 -65
  101. package/dist/time.mjs.map +1 -1
  102. package/dist/timer.cjs +122 -112
  103. package/dist/timer.cjs.map +1 -1
  104. package/dist/timer.mjs +123 -115
  105. package/dist/timer.mjs.map +1 -1
  106. package/dist/tree.cjs +207 -112
  107. package/dist/tree.cjs.map +1 -1
  108. package/dist/tree.mjs +207 -116
  109. package/dist/tree.mjs.map +1 -1
  110. package/dist/try/curry.d.ts +1 -1
  111. package/dist/try.cjs +36 -37
  112. package/dist/try.cjs.map +1 -1
  113. package/dist/try.mjs +35 -37
  114. package/dist/try.mjs.map +1 -1
  115. package/dist/type.cjs +126 -24
  116. package/dist/type.cjs.map +1 -1
  117. package/dist/type.d.ts +2 -2
  118. package/dist/type.mjs +128 -45
  119. package/dist/type.mjs.map +1 -1
  120. package/dist/types.cjs +0 -2
  121. package/dist/types.d.ts +2 -2
  122. package/dist/types.mjs +0 -2
  123. package/dist/unique.cjs +41 -38
  124. package/dist/unique.cjs.map +1 -1
  125. package/dist/unique.mjs +42 -41
  126. package/dist/unique.mjs.map +1 -1
  127. package/dist/url.cjs +39 -30
  128. package/dist/url.cjs.map +1 -1
  129. package/dist/url.mjs +40 -33
  130. package/dist/url.mjs.map +1 -1
  131. package/dist/version.cjs +51 -33
  132. package/dist/version.cjs.map +1 -1
  133. package/dist/version.mjs +51 -35
  134. package/dist/version.mjs.map +1 -1
  135. package/package.json +104 -105
  136. package/dist/const.cjs +0 -14
  137. package/dist/const.cjs.map +0 -1
  138. package/dist/const.mjs +0 -15
  139. package/dist/const.mjs.map +0 -1
  140. package/dist/core.cjs +0 -362
  141. package/dist/core.cjs.map +0 -1
  142. package/dist/core.mjs +0 -363
  143. package/dist/core.mjs.map +0 -1
  144. package/dist/crypto/md5.d.mts +0 -1
  145. package/dist/crypto/sha1.d.mts +0 -1
  146. package/dist/crypto/sha256.d.mts +0 -1
  147. package/dist/crypto/sha512.d.mts +0 -1
  148. package/dist/each.cjs +0 -18
  149. package/dist/each.cjs.map +0 -1
  150. package/dist/each.mjs +0 -19
  151. package/dist/each.mjs.map +0 -1
  152. package/dist/merge.cjs +0 -87
  153. package/dist/merge.cjs.map +0 -1
  154. package/dist/merge.mjs +0 -88
  155. package/dist/merge.mjs.map +0 -1
  156. package/dist/number.cjs.map +0 -1
  157. package/dist/number.mjs.map +0 -1
  158. package/dist/string.cjs.map +0 -1
  159. package/dist/string.mjs.map +0 -1
  160. package/dist/types.cjs.map +0 -1
  161. package/dist/types.mjs.map +0 -1
package/dist/function.mjs CHANGED
@@ -1,79 +1,135 @@
1
1
  import { isNumber } from "./type.mjs";
2
- function fnNoop() {
3
- }
2
+ //#region src/function.ts
3
+ /**
4
+ * 一个空操作函数,不执行任何操作。
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * fnNoop(); // 不执行任何操作
9
+ * ```
10
+ */
11
+ function fnNoop() {}
12
+ /**
13
+ * 创建一个防抖函数,该函数会在指定的等待时间后执行,如果在等待时间内再次调用,则重新计时。
14
+ *
15
+ * @param fn - 需要防抖的函数。
16
+ * @param wait - 等待时间(毫秒)或包含 `wait` 和 `leading` 选项的对象。
17
+ * @returns 返回一个防抖函数,该函数具有 `cancel` 方法,用于取消防抖操作。
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const debouncedFn = fnDebounce(() => {
22
+ * console.log('Debounced!');
23
+ * }, 100);
24
+ *
25
+ * debouncedFn(); // 不会立即执行
26
+ * debouncedFn(); // 重新计时
27
+ * debouncedFn.cancel(); // 取消防抖操作
28
+ * ```
29
+ */
4
30
  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;
31
+ const options = isNumber(wait) ? { wait } : wait;
32
+ let canceled = false;
33
+ let timer;
34
+ let leading = false;
35
+ const debounced = function(...args) {
36
+ if (canceled) return;
37
+ if (options.leading && !leading) {
38
+ leading = true;
39
+ fn.apply(this, args);
40
+ return;
41
+ }
42
+ clearTimeout(timer);
43
+ timer = setTimeout(() => {
44
+ if (canceled) return;
45
+ fn.apply(this, args);
46
+ }, options.wait);
47
+ };
48
+ debounced.cancel = () => {
49
+ clearTimeout(timer);
50
+ canceled = true;
51
+ };
52
+ return debounced;
27
53
  }
54
+ /**
55
+ * 创建一个节流函数,该函数会在指定的等待时间内最多执行一次,如果在等待时间内再次调用,则忽略后续调用。
56
+ *
57
+ * @param fn - 需要节流的函数。
58
+ * @param wait - 等待时间(毫秒)或包含 `wait`、`leading` 和 `trailing` 选项的对象。
59
+ * @returns 返回一个节流函数,该函数具有 `cancel` 方法,用于取消节流操作。
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const throttledFn = fnThrottle(() => {
64
+ * console.log('Throttled!');
65
+ * }, 100);
66
+ *
67
+ * throttledFn(); // 立即执行
68
+ * throttledFn(); // 忽略
69
+ * throttledFn.cancel(); // 取消节流操作
70
+ * ```
71
+ */
28
72
  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
- let executed = false;
38
- if (options.leading && lastTime === 0) {
39
- lastTime = now;
40
- fn.apply(this, args);
41
- executed = true;
42
- } else if (lastTime > 0 && now - lastTime >= waitFinal) {
43
- lastTime = now;
44
- fn.apply(this, args);
45
- executed = true;
46
- } else if (lastTime === 0) {
47
- lastTime = now;
48
- }
49
- if (options.trailing && !executed) {
50
- clearTimeout(timer);
51
- timer = setTimeout(() => {
52
- fn.apply(this, args);
53
- }, waitFinal);
54
- }
55
- };
56
- throttled.cancel = () => {
57
- canceled = true;
58
- clearTimeout(timer);
59
- };
60
- return throttled;
73
+ const options = isNumber(wait) ? { wait } : wait;
74
+ const waitFinal = options.wait;
75
+ let lastTime = 0;
76
+ let canceled = false;
77
+ let timer;
78
+ const throttled = function(...args) {
79
+ if (canceled) return;
80
+ const now = Date.now();
81
+ let executed = false;
82
+ if (options.leading && lastTime === 0) {
83
+ lastTime = now;
84
+ fn.apply(this, args);
85
+ executed = true;
86
+ } else if (lastTime > 0 && now - lastTime >= waitFinal) {
87
+ lastTime = now;
88
+ fn.apply(this, args);
89
+ executed = true;
90
+ } else if (lastTime === 0) lastTime = now;
91
+ if (options.trailing && !executed) {
92
+ clearTimeout(timer);
93
+ timer = setTimeout(() => {
94
+ fn.apply(this, args);
95
+ }, waitFinal);
96
+ }
97
+ };
98
+ throttled.cancel = () => {
99
+ canceled = true;
100
+ clearTimeout(timer);
101
+ };
102
+ return throttled;
61
103
  }
104
+ /**
105
+ * 创建一个只执行一次的函数,无论调用多少次,实际执行的函数体也只会执行一次。
106
+ *
107
+ * @param fn - 需要只执行一次的函数。
108
+ * @returns 返回一个只执行一次的函数,该函数在第一次调用后会缓存结果并返回缓存的结果。
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const onceFn = fnOnce(() => {
113
+ * console.log('This will be logged only once.');
114
+ * return 42;
115
+ * });
116
+ *
117
+ * console.log(onceFn()); // 输出: This will be logged only once. 42
118
+ * console.log(onceFn()); // 输出: 42
119
+ * ```
120
+ */
62
121
  function fnOnce(fn) {
63
- let called = false;
64
- let result;
65
- return function(...args) {
66
- if (!called) {
67
- called = true;
68
- result = fn.apply(this, args);
69
- }
70
- return result;
71
- };
122
+ let called = false;
123
+ let result;
124
+ return function(...args) {
125
+ if (!called) {
126
+ called = true;
127
+ result = fn.apply(this, args);
128
+ }
129
+ return result;
130
+ };
72
131
  }
73
- export {
74
- fnDebounce,
75
- fnNoop,
76
- fnOnce,
77
- fnThrottle
78
- };
79
- //# sourceMappingURL=function.mjs.map
132
+ //#endregion
133
+ export { fnDebounce, fnNoop, fnOnce, fnThrottle };
134
+
135
+ //# sourceMappingURL=function.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"function.mjs","sources":["../src/function.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 DebounceOptions = {\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 | DebounceOptions) {\n const options: DebounceOptions = 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 ThrottleOptions = {\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 | ThrottleOptions) {\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 let executed = false;\n\n // 第一次执行\n if (options.leading && lastTime === 0) {\n lastTime = now;\n fn.apply(this, args);\n executed = true;\n }\n\n // 中间控频执行\n else if (lastTime > 0 && now - lastTime >= waitFinal) {\n lastTime = now;\n fn.apply(this, args);\n executed = true;\n }\n\n // 首次计时\n else if (lastTime === 0) {\n lastTime = now;\n }\n\n // 最后一次执行,仅在本次未执行时才设置 trailing\n if (options.trailing && !executed) {\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,MAAgC;AACvF,QAAM,UAA2B,SAAS,IAAI,IAAI,EAAE,KAAS,IAAA;AAC7D,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,MAAgC;AACvF,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;AACrB,QAAI,WAAW;AAGX,QAAA,QAAQ,WAAW,aAAa,GAAG;AAC1B,iBAAA;AACR,SAAA,MAAM,MAAM,IAAI;AACR,iBAAA;AAAA,IAIJ,WAAA,WAAW,KAAK,MAAM,YAAY,WAAW;AACzC,iBAAA;AACR,SAAA,MAAM,MAAM,IAAI;AACR,iBAAA;AAAA,IAAA,WAIJ,aAAa,GAAG;AACZ,iBAAA;AAAA,IAAA;AAIT,QAAA,QAAQ,YAAY,CAAC,UAAU;AACjC,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;"}
1
+ {"version":3,"file":"function.mjs","names":[],"sources":["../src/function.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 DebounceOptions = {\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>(\n fn: F,\n wait: number | DebounceOptions,\n) {\n const options: DebounceOptions = isNumber(wait) ? { wait } : wait;\n let canceled = false;\n // biome-ignore lint/suspicious/noExplicitAny: 内部使用\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 ThrottleOptions = {\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>(\n fn: F,\n wait: number | ThrottleOptions,\n) {\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: 内部使用\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 let executed = false;\n\n // 第一次执行\n if (options.leading && lastTime === 0) {\n lastTime = now;\n fn.apply(this, args);\n executed = true;\n }\n\n // 中间控频执行\n else if (lastTime > 0 && now - lastTime >= waitFinal) {\n lastTime = now;\n fn.apply(this, args);\n executed = true;\n }\n\n // 首次计时\n else if (lastTime === 0) {\n lastTime = now;\n }\n\n // 最后一次执行,仅在本次未执行时才设置 trailing\n if (options.trailing && !executed) {\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: 内部使用\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"],"mappings":";;;;;;;;;;AAWA,SAAgB,SAAS;;;;;;;;;;;;;;;;;;;AAqCzB,SAAgB,WACd,IACA,MACA;CACA,MAAM,UAA2B,SAAS,KAAK,GAAG,EAAE,MAAM,GAAG;CAC7D,IAAI,WAAW;CAEf,IAAI;CACJ,IAAI,UAAU;CAEd,MAAM,YAAY,SAAyB,GAAG,MAAqB;EACjE,IAAI,UAAU;EAGd,IAAI,QAAQ,WAAW,CAAC,SAAS;GAC/B,UAAU;GACV,GAAG,MAAM,MAAM,KAAK;GACpB;;EAIF,aAAa,MAAM;EACnB,QAAQ,iBAAiB;GACvB,IAAI,UAAU;GAEd,GAAG,MAAM,MAAM,KAAK;KACnB,QAAQ,KAAK;;CAGlB,UAAU,eAAe;EACvB,aAAa,MAAM;EACnB,WAAW;;CAGb,OAAO;;;;;;;;;;;;;;;;;;;;AAwCT,SAAgB,WACd,IACA,MACA;CACA,MAAM,UAAU,SAAS,KAAK,GAAG,EAAE,MAAM,GAAG;CAC5C,MAAM,YAAY,QAAQ;CAC1B,IAAI,WAAW;CACf,IAAI,WAAW;CAEf,IAAI;CAEJ,MAAM,YAAY,SAAyB,GAAG,MAAqB;EACjE,IAAI,UAAU;EAEd,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,WAAW;EAGf,IAAI,QAAQ,WAAW,aAAa,GAAG;GACrC,WAAW;GACX,GAAG,MAAM,MAAM,KAAK;GACpB,WAAW;SAIR,IAAI,WAAW,KAAK,MAAM,YAAY,WAAW;GACpD,WAAW;GACX,GAAG,MAAM,MAAM,KAAK;GACpB,WAAW;SAIR,IAAI,aAAa,GACpB,WAAW;EAIb,IAAI,QAAQ,YAAY,CAAC,UAAU;GACjC,aAAa,MAAM;GACnB,QAAQ,iBAAiB;IACvB,GAAG,MAAM,MAAM,KAAK;MACnB,UAAU;;;CAIjB,UAAU,eAAe;EACvB,WAAW;EACX,aAAa,MAAM;;CAGrB,OAAO;;;;;;;;;;;;;;;;;;;AAoBT,SAAgB,OAA8B,IAAO;CACnD,IAAI,SAAS;CAEb,IAAI;CAEJ,OAAO,SAAyB,GAAG,MAAqB;EACtD,IAAI,CAAC,QAAQ;GACX,SAAS;GACT,SAAS,GAAG,MAAM,MAAM,KAAK;;EAG/B,OAAO"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,10 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VERSION = "1.18.2";
2
+ //#region src/index.ts
3
+ /**
4
+ * `@cloudcome/utils-core` 版本号
5
+ */
6
+ var VERSION = "1.20.0";
7
+ //#endregion
4
8
  exports.VERSION = VERSION;
5
- //# sourceMappingURL=index.cjs.map
9
+
10
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-core` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"names":[],"mappings":";;AAGO,MAAM,UAAU;;"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-core` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"mappings":";;;;;AAGA,IAAa,UAAA"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,9 @@
1
- const VERSION = "1.18.2";
2
- export {
3
- VERSION
4
- };
5
- //# sourceMappingURL=index.mjs.map
1
+ //#region src/index.ts
2
+ /**
3
+ * `@cloudcome/utils-core` 版本号
4
+ */
5
+ var VERSION = "1.20.0";
6
+ //#endregion
7
+ export { VERSION };
8
+
9
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-core` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"names":[],"mappings":"AAGO,MAAM,UAAU;"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * `@cloudcome/utils-core` 版本号\n */\nexport const VERSION = PKG_VERSION;\n"],"mappings":";;;;AAGA,IAAa,UAAA"}
package/dist/number.cjs CHANGED
@@ -1,15 +1,11 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- require("./merge.cjs");
4
- const number = require("./string2.cjs");
5
- require("./type.cjs");
6
- exports.fileSizeAbbr = number.fileSizeAbbr;
7
- exports.numberAbbr = number.numberAbbr;
8
- exports.numberClamp = number.numberClamp;
9
- exports.numberConvert = number.numberConvert;
10
- exports.numberDecimals = number.numberDecimals;
11
- exports.numberFixed = number.numberFixed;
12
- exports.numberFormat = number.numberFormat;
13
- exports.numberUnit = number.numberUnit;
14
- exports.randomNumber = number.randomNumber;
15
- //# sourceMappingURL=number.cjs.map
2
+ const require_string = require("./string2.cjs");
3
+ exports.fileSizeAbbr = require_string.fileSizeAbbr;
4
+ exports.numberAbbr = require_string.numberAbbr;
5
+ exports.numberClamp = require_string.numberClamp;
6
+ exports.numberConvert = require_string.numberConvert;
7
+ exports.numberDecimals = require_string.numberDecimals;
8
+ exports.numberFixed = require_string.numberFixed;
9
+ exports.numberFormat = require_string.numberFormat;
10
+ exports.numberUnit = require_string.numberUnit;
11
+ exports.randomNumber = require_string.randomNumber;
package/dist/number.mjs CHANGED
@@ -1,15 +1,2 @@
1
- import "./merge.mjs";
2
- import { f, b, d, n, g, a, c, e, r } from "./string2.mjs";
3
- import "./type.mjs";
4
- export {
5
- f as fileSizeAbbr,
6
- b as numberAbbr,
7
- d as numberClamp,
8
- n as numberConvert,
9
- g as numberDecimals,
10
- a as numberFixed,
11
- c as numberFormat,
12
- e as numberUnit,
13
- r as randomNumber
14
- };
15
- //# sourceMappingURL=number.mjs.map
1
+ import { _ as numberFixed, b as randomNumber, f as fileSizeAbbr, g as numberDecimals, h as numberConvert, m as numberClamp, p as numberAbbr, v as numberFormat, y as numberUnit } from "./string2.mjs";
2
+ export { fileSizeAbbr, numberAbbr, numberClamp, numberConvert, numberDecimals, numberFixed, numberFormat, numberUnit, randomNumber };
@@ -1,7 +1,31 @@
1
1
  import { AnyArray, AnyObject } from '../types';
2
2
  type Idx<T, K> = K extends keyof T ? T[K] : number extends keyof T ? K extends `${number}` ? T[number] : never : never;
3
3
  type Join<K, P> = K extends string | number ? P extends string | number ? `${K}${'' extends P ? '' : '.'}${P}` : never : never;
4
- type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]];
4
+ type Prev = [
5
+ never,
6
+ 0,
7
+ 1,
8
+ 2,
9
+ 3,
10
+ 4,
11
+ 5,
12
+ 6,
13
+ 7,
14
+ 8,
15
+ 9,
16
+ 10,
17
+ 11,
18
+ 12,
19
+ 13,
20
+ 14,
21
+ 15,
22
+ 16,
23
+ 17,
24
+ 18,
25
+ 19,
26
+ 20,
27
+ ...0[]
28
+ ];
5
29
  export type ObjectPath<O, D extends number = 4> = [D] extends [never] ? never : O extends object ? {
6
30
  [K in keyof O]-?: K extends string | number ? `${K}` | Join<K, ObjectPath<O[K], Prev[D]>> : never;
7
31
  }[keyof O] : '';
@@ -68,7 +92,7 @@ export type ObjectSetOptions<O extends AnyObject> = {
68
92
  */
69
93
  beforeSet(node: ObjectNode<O> & {
70
94
  key: string;
71
- }): boolean | undefined | void;
95
+ }): boolean | undefined;
72
96
  /**
73
97
  * 当遇到未定义的中间节点时调用的钩子函数。
74
98
  * 返回值将用于创建中间节点。
@@ -76,7 +100,7 @@ export type ObjectSetOptions<O extends AnyObject> = {
76
100
  * @param {ObjectNode<O>} node - 当前节点信息。
77
101
  * @returns {AnyObject | AnyArray | undefined | void} 返回值将用于创建中间节点。
78
102
  */
79
- undefinedSet(node: ObjectNode<O>): AnyObject | AnyArray | undefined | void;
103
+ undefinedSet(node: ObjectNode<O>): AnyObject | AnyArray | undefined;
80
104
  };
81
105
  /**
82
106
  * 根据属性路径设置属性值
@@ -23,8 +23,8 @@ export type ObjectMergeRule = {
23
23
  target: AnyObject | AnyArray;
24
24
  source: AnyObject | AnyArray;
25
25
  key: string | number;
26
- merge: () => any;
27
- }) => any;
26
+ merge: () => unknown;
27
+ }) => unknown;
28
28
  };
29
29
  /**
30
30
  * 合并多个对象或数组。如果遇到循环引用,则直接返回目标对象。