@cloudcome/utils-core 1.19.1 → 1.20.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 (161) hide show
  1. package/README.md +72 -73
  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 +104 -103
  39. package/dist/easing.cjs.map +1 -1
  40. package/dist/easing.mjs +105 -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 +2 -2
  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 +1 -1
  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 +109 -110
  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/env.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.mjs","sources":["../src/env.ts"],"sourcesContent":["import { isNullish } from './type';\n\n/**\n * 判断当前环境是否为浏览器环境\n * @returns 如果是浏览器环境返回 true,否则返回 false\n */\nexport function isBrowser() {\n if (IS_TEST) return TEST_MOCK.IS_BROWSER || false;\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * 判断当前环境是否为 Node.js 环境\n * @returns 如果是 Node.js 环境返回 true,否则返回 false\n */\nexport function isNode() {\n if (IS_TEST) return TEST_MOCK.IS_NODE || false;\n\n return typeof process !== 'undefined' && !isNullish(process.versions) && !isNullish(process.versions.node);\n}\n\n/**\n * 判断当前环境是否为 Web Worker 环境\n * @returns 如果是 Web Worker 环境返回 true,否则返回 false\n * @remarks\n * 使用 @ts-ignore 忽略 self 的类型检查,因为 self 在 Web Worker 中可用但在其他环境中可能未定义\n */\nexport function isWorker() {\n // @ts-ignore\n return typeof self !== 'undefined' && self.importScripts != null;\n}\n\n/**\n * 判断当前操作系统是否为 macOS\n * @returns 如果是 macOS 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isMacOS() {\n return isBrowser() ? /^mac/i.test(navigator.platform) : isNode() ? /^darwin/i.test(process.platform) : false;\n}\n\n/**\n * 判断当前操作系统是否为 Linux\n * @returns 如果是 Linux 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isLinux() {\n return isBrowser() ? /^linux/i.test(navigator.platform) : isNode() ? /^linux/i.test(process.platform) : false;\n}\n\n/**\n * 判断当前操作系统是否为 Windows\n * @returns 如果是 Windows 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isWindows() {\n return isBrowser() ? /^win/i.test(navigator.platform) : isNode() ? /^win/i.test(process.platform) : false;\n}\n"],"names":[],"mappings":";AAMO,SAAS,YAAY;AAG1B,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAMO,SAAS,SAAS;AAGvB,SAAO,OAAO,YAAY,eAAe,CAAC,UAAU,QAAQ,QAAQ,KAAK,CAAC,UAAU,QAAQ,SAAS,IAAI;AAC3G;AAQO,SAAS,WAAW;AAEzB,SAAO,OAAO,SAAS,eAAe,KAAK,iBAAiB;AAC9D;AAQO,SAAS,UAAU;AACxB,SAAO,UAAU,IAAI,QAAQ,KAAK,UAAU,QAAQ,IAAI,OAAA,IAAW,WAAW,KAAK,QAAQ,QAAQ,IAAI;AACzG;AAQO,SAAS,UAAU;AACxB,SAAO,UAAU,IAAI,UAAU,KAAK,UAAU,QAAQ,IAAI,OAAA,IAAW,UAAU,KAAK,QAAQ,QAAQ,IAAI;AAC1G;AAQO,SAAS,YAAY;AAC1B,SAAO,UAAU,IAAI,QAAQ,KAAK,UAAU,QAAQ,IAAI,OAAA,IAAW,QAAQ,KAAK,QAAQ,QAAQ,IAAI;AACtG;"}
1
+ {"version":3,"file":"env.mjs","names":[],"sources":["../src/env.ts"],"sourcesContent":["import { isNullish } from './type';\n\n/**\n * 判断当前环境是否为浏览器环境\n * @returns 如果是浏览器环境返回 true,否则返回 false\n */\nexport function isBrowser() {\n if (IS_TEST) return TEST_MOCK.IS_BROWSER || false;\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * 判断当前环境是否为 Node.js 环境\n * @returns 如果是 Node.js 环境返回 true,否则返回 false\n */\nexport function isNode() {\n if (IS_TEST) return TEST_MOCK.IS_NODE || false;\n\n return typeof process !== 'undefined' && !isNullish(process.versions) && !isNullish(process.versions.node);\n}\n\n/**\n * 判断当前环境是否为 Web Worker 环境\n * @returns 如果是 Web Worker 环境返回 true,否则返回 false\n * @remarks\n * 使用 @ts-expect-error 忽略 self 的类型检查,因为 self 在 Web Worker 中可用但在其他环境中可能未定义\n */\nexport function isWorker() {\n // @ts-expect-error\n return typeof self !== 'undefined' && self.importScripts != null;\n}\n\n/**\n * 判断当前操作系统是否为 macOS\n * @returns 如果是 macOS 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isMacOS() {\n return isBrowser() ? /^mac/i.test(navigator.platform) : isNode() ? /^darwin/i.test(process.platform) : false;\n}\n\n/**\n * 判断当前操作系统是否为 Linux\n * @returns 如果是 Linux 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isLinux() {\n return isBrowser() ? /^linux/i.test(navigator.platform) : isNode() ? /^linux/i.test(process.platform) : false;\n}\n\n/**\n * 判断当前操作系统是否为 Windows\n * @returns 如果是 Windows 返回 true,否则返回 false\n * @remarks\n * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测\n */\nexport function isWindows() {\n return isBrowser() ? /^win/i.test(navigator.platform) : isNode() ? /^win/i.test(process.platform) : false;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,YAAY;CAG1B,OAAO,OAAO,WAAW,eAAe,OAAO,aAAa;;;;;;AAO9D,SAAgB,SAAS;CAGvB,OAAO,OAAO,YAAY,eAAe,CAAC,UAAU,QAAQ,SAAS,IAAI,CAAC,UAAU,QAAQ,SAAS,KAAK;;;;;;;;AAS5G,SAAgB,WAAW;CAEzB,OAAO,OAAO,SAAS,eAAe,KAAK,iBAAiB;;;;;;;;AAS9D,SAAgB,UAAU;CACxB,OAAO,WAAW,GAAG,QAAQ,KAAK,UAAU,SAAS,GAAG,QAAQ,GAAG,WAAW,KAAK,QAAQ,SAAS,GAAG;;;;;;;;AASzG,SAAgB,UAAU;CACxB,OAAO,WAAW,GAAG,UAAU,KAAK,UAAU,SAAS,GAAG,QAAQ,GAAG,UAAU,KAAK,QAAQ,SAAS,GAAG;;;;;;;;AAS1G,SAAgB,YAAY;CAC1B,OAAO,WAAW,GAAG,QAAQ,KAAK,UAAU,SAAS,GAAG,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG"}
package/dist/error.cjs CHANGED
@@ -1,12 +1,33 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const type = require("./type.cjs");
2
+ const require_type = require("./type.cjs");
3
+ //#region src/error.ts
4
+ /**
5
+ * 标准化处理 Error 对象,适用于 try-catch
6
+ * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串
7
+ * @returns {Error}
8
+ * @example
9
+ * const error = errorNormalize('这是一个错误');
10
+ * console.log(error.message); // 输出: 这是一个错误
11
+ */
4
12
  function errorNormalize(throwError) {
5
- return type.isError(throwError) ? throwError : new Error(String(type.isNullish(throwError) ? "" : throwError));
13
+ return require_type.isError(throwError) ? throwError : new Error(String(require_type.isNullish(throwError) ? "" : throwError));
6
14
  }
15
+ /**
16
+ * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数
17
+ * @param {Error} error
18
+ * @param {E} source
19
+ * @returns {Error & E}
20
+ * @example
21
+ * const error = new Error('原始错误');
22
+ * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });
23
+ * console.log(extendedError.code); // 输出: 404
24
+ * console.log(extendedError.message); // 输出: 未找到资源
25
+ */
7
26
  function errorAssign(error, source) {
8
- return Object.assign(error, source);
27
+ return Object.assign(error, source);
9
28
  }
29
+ //#endregion
10
30
  exports.errorAssign = errorAssign;
11
31
  exports.errorNormalize = errorNormalize;
12
- //# sourceMappingURL=error.cjs.map
32
+
33
+ //# sourceMappingURL=error.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.cjs","sources":["../src/error.ts"],"sourcesContent":["import { isError, isNullish } from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 标准化处理 Error 对象,适用于 try-catch\n * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串\n * @returns {Error}\n * @example\n * const error = errorNormalize('这是一个错误');\n * console.log(error.message); // 输出: 这是一个错误\n */\nexport function errorNormalize<E extends Error | unknown = unknown>(throwError: E) {\n return (\n isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? '' : throwError))\n ) as E extends Error ? E : Error;\n}\n\n/**\n * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数\n * @param {Error} error\n * @param {E} source\n * @returns {Error & E}\n * @example\n * const error = new Error('原始错误');\n * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });\n * console.log(extendedError.code); // 输出: 404\n * console.log(extendedError.message); // 输出: 未找到资源\n */\nexport function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E {\n return Object.assign(error, source) as Error & E;\n}\n"],"names":["isError","isNullish"],"mappings":";;;AAWO,SAAS,eAAoD,YAAe;AACjF,SACEA,aAAQ,UAAU,IAAI,aAAa,IAAI,MAAM,OAAOC,KAAAA,UAAU,UAAU,IAAI,KAAK,UAAU,CAAC;AAEhG;AAagB,SAAA,YAAiC,OAAc,QAAsB;AAC5E,SAAA,OAAO,OAAO,OAAO,MAAM;AACpC;;;"}
1
+ {"version":3,"file":"error.cjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["import { isError, isNullish } from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 标准化处理 Error 对象,适用于 try-catch\n * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串\n * @returns {Error}\n * @example\n * const error = errorNormalize('这是一个错误');\n * console.log(error.message); // 输出: 这是一个错误\n */\nexport function errorNormalize<E extends Error | unknown = unknown>(throwError: E) {\n return (\n isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? '' : throwError))\n ) as E extends Error ? E : Error;\n}\n\n/**\n * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数\n * @param {Error} error\n * @param {E} source\n * @returns {Error & E}\n * @example\n * const error = new Error('原始错误');\n * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });\n * console.log(extendedError.code); // 输出: 404\n * console.log(extendedError.message); // 输出: 未找到资源\n */\nexport function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E {\n return Object.assign(error, source) as Error & E;\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAoD,YAAe;CACjF,OACE,aAAA,QAAQ,WAAW,GAAG,aAAa,IAAI,MAAM,OAAO,aAAA,UAAU,WAAW,GAAG,KAAK,WAAW,CAAC;;;;;;;;;;;;;AAejG,SAAgB,YAAiC,OAAc,QAAsB;CACnF,OAAO,OAAO,OAAO,OAAO,OAAO"}
package/dist/error.mjs CHANGED
@@ -1,12 +1,31 @@
1
1
  import { isError, isNullish } from "./type.mjs";
2
+ //#region src/error.ts
3
+ /**
4
+ * 标准化处理 Error 对象,适用于 try-catch
5
+ * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串
6
+ * @returns {Error}
7
+ * @example
8
+ * const error = errorNormalize('这是一个错误');
9
+ * console.log(error.message); // 输出: 这是一个错误
10
+ */
2
11
  function errorNormalize(throwError) {
3
- return isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? "" : throwError));
12
+ return isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? "" : throwError));
4
13
  }
14
+ /**
15
+ * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数
16
+ * @param {Error} error
17
+ * @param {E} source
18
+ * @returns {Error & E}
19
+ * @example
20
+ * const error = new Error('原始错误');
21
+ * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });
22
+ * console.log(extendedError.code); // 输出: 404
23
+ * console.log(extendedError.message); // 输出: 未找到资源
24
+ */
5
25
  function errorAssign(error, source) {
6
- return Object.assign(error, source);
26
+ return Object.assign(error, source);
7
27
  }
8
- export {
9
- errorAssign,
10
- errorNormalize
11
- };
12
- //# sourceMappingURL=error.mjs.map
28
+ //#endregion
29
+ export { errorAssign, errorNormalize };
30
+
31
+ //# sourceMappingURL=error.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.mjs","sources":["../src/error.ts"],"sourcesContent":["import { isError, isNullish } from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 标准化处理 Error 对象,适用于 try-catch\n * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串\n * @returns {Error}\n * @example\n * const error = errorNormalize('这是一个错误');\n * console.log(error.message); // 输出: 这是一个错误\n */\nexport function errorNormalize<E extends Error | unknown = unknown>(throwError: E) {\n return (\n isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? '' : throwError))\n ) as E extends Error ? E : Error;\n}\n\n/**\n * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数\n * @param {Error} error\n * @param {E} source\n * @returns {Error & E}\n * @example\n * const error = new Error('原始错误');\n * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });\n * console.log(extendedError.code); // 输出: 404\n * console.log(extendedError.message); // 输出: 未找到资源\n */\nexport function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E {\n return Object.assign(error, source) as Error & E;\n}\n"],"names":[],"mappings":";AAWO,SAAS,eAAoD,YAAe;AACjF,SACE,QAAQ,UAAU,IAAI,aAAa,IAAI,MAAM,OAAO,UAAU,UAAU,IAAI,KAAK,UAAU,CAAC;AAEhG;AAagB,SAAA,YAAiC,OAAc,QAAsB;AAC5E,SAAA,OAAO,OAAO,OAAO,MAAM;AACpC;"}
1
+ {"version":3,"file":"error.mjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["import { isError, isNullish } from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 标准化处理 Error 对象,适用于 try-catch\n * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串\n * @returns {Error}\n * @example\n * const error = errorNormalize('这是一个错误');\n * console.log(error.message); // 输出: 这是一个错误\n */\nexport function errorNormalize<E extends Error | unknown = unknown>(throwError: E) {\n return (\n isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? '' : throwError))\n ) as E extends Error ? E : Error;\n}\n\n/**\n * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数\n * @param {Error} error\n * @param {E} source\n * @returns {Error & E}\n * @example\n * const error = new Error('原始错误');\n * const extendedError = errorAssign(error, { code: 404, message: '未找到资源' });\n * console.log(extendedError.code); // 输出: 404\n * console.log(extendedError.message); // 输出: 未找到资源\n */\nexport function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E {\n return Object.assign(error, source) as Error & E;\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,eAAoD,YAAe;CACjF,OACE,QAAQ,WAAW,GAAG,aAAa,IAAI,MAAM,OAAO,UAAU,WAAW,GAAG,KAAK,WAAW,CAAC;;;;;;;;;;;;;AAejG,SAAgB,YAAiC,OAAc,QAAsB;CACnF,OAAO,OAAO,OAAO,OAAO,OAAO"}
@@ -1,22 +1,40 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const merge = require("./merge.cjs");
4
- const defaults = {
5
- /**
6
- * 默认消息格式函数
7
- * @default (name, message) => `[${name}] ${message}`
8
- */
9
- format: (name, message) => `[${name}] ${message}`
10
- };
11
- function buildException(name, options) {
12
- const { format } = merge.objectDefaults(options || {}, defaults);
13
- return class extends Error {
14
- constructor(message, extra) {
15
- super(format(name, message));
16
- this.name = name;
17
- Object.assign(this, extra);
18
- }
19
- };
2
+ const require_object = require("./object.cjs");
3
+ //#region src/exception.ts
4
+ /**
5
+ * 默认的异常构建选项
6
+ */
7
+ var defaults = {
8
+ /**
9
+ * 默认消息格式函数
10
+ * @default (name, message) => `[${name}] ${message}`
11
+ */
12
+ format: (name, message) => `[${name}] ${message}` };
13
+ /**
14
+ * 自定义异常类
15
+ * @template T 额外属性的类型
16
+ * @param name 异常类名称
17
+ * @param options 构建选项
18
+ * @returns 自定义异常类
19
+ * @example
20
+ * const MyException = defineException<{ code: number }>('MyException');
21
+ * const err = new MyException('error', { code: 404 });
22
+ *
23
+ * @example
24
+ * const SimpleException = defineException('SimpleException');
25
+ * const err = new SimpleException('error', undefined);
26
+ */
27
+ function defineException(name, options) {
28
+ const { format } = require_object.objectDefaults(options || {}, defaults);
29
+ return class extends Error {
30
+ constructor(message, extra) {
31
+ super(format(name, message));
32
+ this.name = name;
33
+ Object.assign(this, extra);
34
+ }
35
+ };
20
36
  }
21
- exports.buildException = buildException;
22
- //# sourceMappingURL=exception.cjs.map
37
+ //#endregion
38
+ exports.defineException = defineException;
39
+
40
+ //# sourceMappingURL=exception.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"exception.cjs","sources":["../src/exception.ts"],"sourcesContent":["import { objectDefaults } from './object';\nimport type { AnyObject } from './types';\n\n/**\n * 构建异常选项\n */\nexport type BuildExceptionOptions = {\n /**\n * 自定义错误消息格式函数\n * @param name 错误名称\n * @param message 原始错误消息\n * @returns 格式化后的错误消息\n * @example\n * (name, message) => `${name}::${message}`\n */\n format?: (name: string, message: string) => string;\n};\n\n/**\n * 默认的异常构建选项\n */\nconst defaults: BuildExceptionOptions = {\n /**\n * 默认消息格式函数\n * @default (name, message) => `[${name}] ${message}`\n */\n format: (name, message) => `[${name}] ${message}`,\n};\n\n/**\n * 构建自定义异常类\n * @template T 额外属性的类型\n * @param name 异常类名称\n * @param options 构建选项\n * @returns 自定义异常类\n * @example\n * const MyException = buildException<{ code: number }>('MyException');\n * const err = new MyException('error', { code: 404 });\n *\n * @example\n * const SimpleException = buildException('SimpleException');\n * const err = new SimpleException('error', undefined);\n */\nexport function buildException<T = void>(name: string, options?: BuildExceptionOptions) {\n const { format } = objectDefaults(options || {}, defaults) as Required<BuildExceptionOptions>;\n\n return class extends Error {\n constructor(message: string, extra: T) {\n super(format(name, message));\n this.name = name;\n Object.assign(this, extra);\n }\n } as unknown as {\n new (message: string, extra: T): Error & T;\n };\n}\n\n// const MyException = buildException<{ foo: string; bar: number }>('MyException: ');\n// const myException = new MyException('bar', { foo: '1', bar: 1 });\n// myException.foo;\n// myException.bar;\n// myException.name;\n// myException.message;\n// myException.stack;\n// myException.cause;\n\n// const MyException2 = buildException('MyException2: ');\n// const myException2 = new MyException2('bar');\n"],"names":["objectDefaults"],"mappings":";;;AAqBA,MAAM,WAAkC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,QAAQ,CAAC,MAAM,YAAY,IAAI,IAAI,KAAK,OAAO;AACjD;AAgBgB,SAAA,eAAyB,MAAc,SAAiC;AACtF,QAAM,EAAE,OAAO,IAAIA,MAAAA,eAAe,WAAW,CAAA,GAAI,QAAQ;AAEzD,SAAO,cAAc,MAAM;AAAA,IACzB,YAAY,SAAiB,OAAU;AAC/B,YAAA,OAAO,MAAM,OAAO,CAAC;AAC3B,WAAK,OAAO;AACL,aAAA,OAAO,MAAM,KAAK;AAAA,IAAA;AAAA,EAE7B;AAGF;;"}
1
+ {"version":3,"file":"exception.cjs","names":[],"sources":["../src/exception.ts"],"sourcesContent":["import { objectDefaults } from './object';\n\n/**\n * 构建异常选项\n */\nexport type DefineExceptionOptions = {\n /**\n * 自定义错误消息格式函数\n * @param name 错误名称\n * @param message 原始错误消息\n * @returns 格式化后的错误消息\n * @example\n * (name, message) => `${name}::${message}`\n */\n format?: (name: string, message: string) => string;\n};\n\n/**\n * 默认的异常构建选项\n */\nconst defaults: DefineExceptionOptions = {\n /**\n * 默认消息格式函数\n * @default (name, message) => `[${name}] ${message}`\n */\n format: (name, message) => `[${name}] ${message}`,\n};\n\n/**\n * 自定义异常类\n * @template T 额外属性的类型\n * @param name 异常类名称\n * @param options 构建选项\n * @returns 自定义异常类\n * @example\n * const MyException = defineException<{ code: number }>('MyException');\n * const err = new MyException('error', { code: 404 });\n *\n * @example\n * const SimpleException = defineException('SimpleException');\n * const err = new SimpleException('error', undefined);\n */\nexport function defineException<T = void>(name: string, options?: DefineExceptionOptions) {\n const { format } = objectDefaults(options || {}, defaults) as Required<DefineExceptionOptions>;\n\n return class extends Error {\n constructor(message: string, extra: T) {\n super(format(name, message));\n this.name = name;\n Object.assign(this, extra);\n }\n } as unknown as {\n new (message: string, extra: T): Error & T;\n };\n}\n\n// const MyException = defineException<{ foo: string; bar: number }>('MyException: ');\n// const myException = new MyException('bar', { foo: '1', bar: 1 });\n// myException.foo;\n// myException.bar;\n// myException.name;\n// myException.message;\n// myException.stack;\n// myException.cause;\n\n// const MyException2 = defineException('MyException2: ');\n// const myException2 = new MyException2('bar');\n"],"mappings":";;;;;;AAoBA,IAAM,WAAmC;;;;;AAKvC,SAAS,MAAM,YAAY,IAAI,KAAK,IAAI,WACzC;;;;;;;;;;;;;;;AAgBD,SAAgB,gBAA0B,MAAc,SAAkC;CACxF,MAAM,EAAE,WAAW,eAAA,eAAe,WAAW,EAAE,EAAE,SAAS;CAE1D,OAAO,cAAc,MAAM;EACzB,YAAY,SAAiB,OAAU;GACrC,MAAM,OAAO,MAAM,QAAQ,CAAC;GAC5B,KAAK,OAAO;GACZ,OAAO,OAAO,MAAM,MAAM"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * 构建异常选项
3
3
  */
4
- export type BuildExceptionOptions = {
4
+ export type DefineExceptionOptions = {
5
5
  /**
6
6
  * 自定义错误消息格式函数
7
7
  * @param name 错误名称
@@ -13,19 +13,19 @@ export type BuildExceptionOptions = {
13
13
  format?: (name: string, message: string) => string;
14
14
  };
15
15
  /**
16
- * 构建自定义异常类
16
+ * 自定义异常类
17
17
  * @template T 额外属性的类型
18
18
  * @param name 异常类名称
19
19
  * @param options 构建选项
20
20
  * @returns 自定义异常类
21
21
  * @example
22
- * const MyException = buildException<{ code: number }>('MyException');
22
+ * const MyException = defineException<{ code: number }>('MyException');
23
23
  * const err = new MyException('error', { code: 404 });
24
24
  *
25
25
  * @example
26
- * const SimpleException = buildException('SimpleException');
26
+ * const SimpleException = defineException('SimpleException');
27
27
  * const err = new SimpleException('error', undefined);
28
28
  */
29
- export declare function buildException<T = void>(name: string, options?: BuildExceptionOptions): {
29
+ export declare function defineException<T = void>(name: string, options?: DefineExceptionOptions): {
30
30
  new (message: string, extra: T): Error & T;
31
31
  };
@@ -1,22 +1,39 @@
1
- import { o as objectDefaults } from "./merge.mjs";
2
- const defaults = {
3
- /**
4
- * 默认消息格式函数
5
- * @default (name, message) => `[${name}] ${message}`
6
- */
7
- format: (name, message) => `[${name}] ${message}`
8
- };
9
- function buildException(name, options) {
10
- const { format } = objectDefaults(options || {}, defaults);
11
- return class extends Error {
12
- constructor(message, extra) {
13
- super(format(name, message));
14
- this.name = name;
15
- Object.assign(this, extra);
16
- }
17
- };
1
+ import { objectDefaults } from "./object.mjs";
2
+ //#region src/exception.ts
3
+ /**
4
+ * 默认的异常构建选项
5
+ */
6
+ var defaults = {
7
+ /**
8
+ * 默认消息格式函数
9
+ * @default (name, message) => `[${name}] ${message}`
10
+ */
11
+ format: (name, message) => `[${name}] ${message}` };
12
+ /**
13
+ * 自定义异常类
14
+ * @template T 额外属性的类型
15
+ * @param name 异常类名称
16
+ * @param options 构建选项
17
+ * @returns 自定义异常类
18
+ * @example
19
+ * const MyException = defineException<{ code: number }>('MyException');
20
+ * const err = new MyException('error', { code: 404 });
21
+ *
22
+ * @example
23
+ * const SimpleException = defineException('SimpleException');
24
+ * const err = new SimpleException('error', undefined);
25
+ */
26
+ function defineException(name, options) {
27
+ const { format } = objectDefaults(options || {}, defaults);
28
+ return class extends Error {
29
+ constructor(message, extra) {
30
+ super(format(name, message));
31
+ this.name = name;
32
+ Object.assign(this, extra);
33
+ }
34
+ };
18
35
  }
19
- export {
20
- buildException
21
- };
22
- //# sourceMappingURL=exception.mjs.map
36
+ //#endregion
37
+ export { defineException };
38
+
39
+ //# sourceMappingURL=exception.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"exception.mjs","sources":["../src/exception.ts"],"sourcesContent":["import { objectDefaults } from './object';\nimport type { AnyObject } from './types';\n\n/**\n * 构建异常选项\n */\nexport type BuildExceptionOptions = {\n /**\n * 自定义错误消息格式函数\n * @param name 错误名称\n * @param message 原始错误消息\n * @returns 格式化后的错误消息\n * @example\n * (name, message) => `${name}::${message}`\n */\n format?: (name: string, message: string) => string;\n};\n\n/**\n * 默认的异常构建选项\n */\nconst defaults: BuildExceptionOptions = {\n /**\n * 默认消息格式函数\n * @default (name, message) => `[${name}] ${message}`\n */\n format: (name, message) => `[${name}] ${message}`,\n};\n\n/**\n * 构建自定义异常类\n * @template T 额外属性的类型\n * @param name 异常类名称\n * @param options 构建选项\n * @returns 自定义异常类\n * @example\n * const MyException = buildException<{ code: number }>('MyException');\n * const err = new MyException('error', { code: 404 });\n *\n * @example\n * const SimpleException = buildException('SimpleException');\n * const err = new SimpleException('error', undefined);\n */\nexport function buildException<T = void>(name: string, options?: BuildExceptionOptions) {\n const { format } = objectDefaults(options || {}, defaults) as Required<BuildExceptionOptions>;\n\n return class extends Error {\n constructor(message: string, extra: T) {\n super(format(name, message));\n this.name = name;\n Object.assign(this, extra);\n }\n } as unknown as {\n new (message: string, extra: T): Error & T;\n };\n}\n\n// const MyException = buildException<{ foo: string; bar: number }>('MyException: ');\n// const myException = new MyException('bar', { foo: '1', bar: 1 });\n// myException.foo;\n// myException.bar;\n// myException.name;\n// myException.message;\n// myException.stack;\n// myException.cause;\n\n// const MyException2 = buildException('MyException2: ');\n// const myException2 = new MyException2('bar');\n"],"names":[],"mappings":";AAqBA,MAAM,WAAkC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtC,QAAQ,CAAC,MAAM,YAAY,IAAI,IAAI,KAAK,OAAO;AACjD;AAgBgB,SAAA,eAAyB,MAAc,SAAiC;AACtF,QAAM,EAAE,OAAO,IAAI,eAAe,WAAW,CAAA,GAAI,QAAQ;AAEzD,SAAO,cAAc,MAAM;AAAA,IACzB,YAAY,SAAiB,OAAU;AAC/B,YAAA,OAAO,MAAM,OAAO,CAAC;AAC3B,WAAK,OAAO;AACL,aAAA,OAAO,MAAM,KAAK;AAAA,IAAA;AAAA,EAE7B;AAGF;"}
1
+ {"version":3,"file":"exception.mjs","names":[],"sources":["../src/exception.ts"],"sourcesContent":["import { objectDefaults } from './object';\n\n/**\n * 构建异常选项\n */\nexport type DefineExceptionOptions = {\n /**\n * 自定义错误消息格式函数\n * @param name 错误名称\n * @param message 原始错误消息\n * @returns 格式化后的错误消息\n * @example\n * (name, message) => `${name}::${message}`\n */\n format?: (name: string, message: string) => string;\n};\n\n/**\n * 默认的异常构建选项\n */\nconst defaults: DefineExceptionOptions = {\n /**\n * 默认消息格式函数\n * @default (name, message) => `[${name}] ${message}`\n */\n format: (name, message) => `[${name}] ${message}`,\n};\n\n/**\n * 自定义异常类\n * @template T 额外属性的类型\n * @param name 异常类名称\n * @param options 构建选项\n * @returns 自定义异常类\n * @example\n * const MyException = defineException<{ code: number }>('MyException');\n * const err = new MyException('error', { code: 404 });\n *\n * @example\n * const SimpleException = defineException('SimpleException');\n * const err = new SimpleException('error', undefined);\n */\nexport function defineException<T = void>(name: string, options?: DefineExceptionOptions) {\n const { format } = objectDefaults(options || {}, defaults) as Required<DefineExceptionOptions>;\n\n return class extends Error {\n constructor(message: string, extra: T) {\n super(format(name, message));\n this.name = name;\n Object.assign(this, extra);\n }\n } as unknown as {\n new (message: string, extra: T): Error & T;\n };\n}\n\n// const MyException = defineException<{ foo: string; bar: number }>('MyException: ');\n// const myException = new MyException('bar', { foo: '1', bar: 1 });\n// myException.foo;\n// myException.bar;\n// myException.name;\n// myException.message;\n// myException.stack;\n// myException.cause;\n\n// const MyException2 = defineException('MyException2: ');\n// const myException2 = new MyException2('bar');\n"],"mappings":";;;;;AAoBA,IAAM,WAAmC;;;;;AAKvC,SAAS,MAAM,YAAY,IAAI,KAAK,IAAI,WACzC;;;;;;;;;;;;;;;AAgBD,SAAgB,gBAA0B,MAAc,SAAkC;CACxF,MAAM,EAAE,WAAW,eAAe,WAAW,EAAE,EAAE,SAAS;CAE1D,OAAO,cAAc,MAAM;EACzB,YAAY,SAAiB,OAAU;GACrC,MAAM,OAAO,MAAM,QAAQ,CAAC;GAC5B,KAAK,OAAO;GACZ,OAAO,OAAO,MAAM,MAAM"}
package/dist/function.cjs CHANGED
@@ -1,79 +1,139 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const type = require("./type.cjs");
4
- function fnNoop() {
5
- }
2
+ const require_type = require("./type.cjs");
3
+ //#region src/function.ts
4
+ /**
5
+ * 一个空操作函数,不执行任何操作。
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * fnNoop(); // 不执行任何操作
10
+ * ```
11
+ */
12
+ function fnNoop() {}
13
+ /**
14
+ * 创建一个防抖函数,该函数会在指定的等待时间后执行,如果在等待时间内再次调用,则重新计时。
15
+ *
16
+ * @param fn - 需要防抖的函数。
17
+ * @param wait - 等待时间(毫秒)或包含 `wait` 和 `leading` 选项的对象。
18
+ * @returns 返回一个防抖函数,该函数具有 `cancel` 方法,用于取消防抖操作。
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const debouncedFn = fnDebounce(() => {
23
+ * console.log('Debounced!');
24
+ * }, 100);
25
+ *
26
+ * debouncedFn(); // 不会立即执行
27
+ * debouncedFn(); // 重新计时
28
+ * debouncedFn.cancel(); // 取消防抖操作
29
+ * ```
30
+ */
6
31
  function fnDebounce(fn, wait) {
7
- const options = type.isNumber(wait) ? { wait } : wait;
8
- let canceled = false;
9
- let timer;
10
- let leading = false;
11
- const debounced = function(...args) {
12
- if (canceled) return;
13
- if (options.leading && !leading) {
14
- leading = true;
15
- fn.apply(this, args);
16
- return;
17
- }
18
- clearTimeout(timer);
19
- timer = setTimeout(() => {
20
- if (canceled) return;
21
- fn.apply(this, args);
22
- }, options.wait);
23
- };
24
- debounced.cancel = () => {
25
- clearTimeout(timer);
26
- canceled = true;
27
- };
28
- return debounced;
32
+ const options = require_type.isNumber(wait) ? { wait } : wait;
33
+ let canceled = false;
34
+ let timer;
35
+ let leading = false;
36
+ const debounced = function(...args) {
37
+ if (canceled) return;
38
+ if (options.leading && !leading) {
39
+ leading = true;
40
+ fn.apply(this, args);
41
+ return;
42
+ }
43
+ clearTimeout(timer);
44
+ timer = setTimeout(() => {
45
+ if (canceled) return;
46
+ fn.apply(this, args);
47
+ }, options.wait);
48
+ };
49
+ debounced.cancel = () => {
50
+ clearTimeout(timer);
51
+ canceled = true;
52
+ };
53
+ return debounced;
29
54
  }
55
+ /**
56
+ * 创建一个节流函数,该函数会在指定的等待时间内最多执行一次,如果在等待时间内再次调用,则忽略后续调用。
57
+ *
58
+ * @param fn - 需要节流的函数。
59
+ * @param wait - 等待时间(毫秒)或包含 `wait`、`leading` 和 `trailing` 选项的对象。
60
+ * @returns 返回一个节流函数,该函数具有 `cancel` 方法,用于取消节流操作。
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const throttledFn = fnThrottle(() => {
65
+ * console.log('Throttled!');
66
+ * }, 100);
67
+ *
68
+ * throttledFn(); // 立即执行
69
+ * throttledFn(); // 忽略
70
+ * throttledFn.cancel(); // 取消节流操作
71
+ * ```
72
+ */
30
73
  function fnThrottle(fn, wait) {
31
- const options = type.isNumber(wait) ? { wait } : wait;
32
- const waitFinal = options.wait;
33
- let lastTime = 0;
34
- let canceled = false;
35
- let timer;
36
- const throttled = function(...args) {
37
- if (canceled) return;
38
- const now = Date.now();
39
- let executed = false;
40
- if (options.leading && lastTime === 0) {
41
- lastTime = now;
42
- fn.apply(this, args);
43
- executed = true;
44
- } else if (lastTime > 0 && now - lastTime >= waitFinal) {
45
- lastTime = now;
46
- fn.apply(this, args);
47
- executed = true;
48
- } else if (lastTime === 0) {
49
- lastTime = now;
50
- }
51
- if (options.trailing && !executed) {
52
- clearTimeout(timer);
53
- timer = setTimeout(() => {
54
- fn.apply(this, args);
55
- }, waitFinal);
56
- }
57
- };
58
- throttled.cancel = () => {
59
- canceled = true;
60
- clearTimeout(timer);
61
- };
62
- return throttled;
74
+ const options = require_type.isNumber(wait) ? { wait } : wait;
75
+ const waitFinal = options.wait;
76
+ let lastTime = 0;
77
+ let canceled = false;
78
+ let timer;
79
+ const throttled = function(...args) {
80
+ if (canceled) return;
81
+ const now = Date.now();
82
+ let executed = false;
83
+ if (options.leading && lastTime === 0) {
84
+ lastTime = now;
85
+ fn.apply(this, args);
86
+ executed = true;
87
+ } else if (lastTime > 0 && now - lastTime >= waitFinal) {
88
+ lastTime = now;
89
+ fn.apply(this, args);
90
+ executed = true;
91
+ } else if (lastTime === 0) lastTime = now;
92
+ if (options.trailing && !executed) {
93
+ clearTimeout(timer);
94
+ timer = setTimeout(() => {
95
+ fn.apply(this, args);
96
+ }, waitFinal);
97
+ }
98
+ };
99
+ throttled.cancel = () => {
100
+ canceled = true;
101
+ clearTimeout(timer);
102
+ };
103
+ return throttled;
63
104
  }
105
+ /**
106
+ * 创建一个只执行一次的函数,无论调用多少次,实际执行的函数体也只会执行一次。
107
+ *
108
+ * @param fn - 需要只执行一次的函数。
109
+ * @returns 返回一个只执行一次的函数,该函数在第一次调用后会缓存结果并返回缓存的结果。
110
+ *
111
+ * @example
112
+ * ```typescript
113
+ * const onceFn = fnOnce(() => {
114
+ * console.log('This will be logged only once.');
115
+ * return 42;
116
+ * });
117
+ *
118
+ * console.log(onceFn()); // 输出: This will be logged only once. 42
119
+ * console.log(onceFn()); // 输出: 42
120
+ * ```
121
+ */
64
122
  function fnOnce(fn) {
65
- let called = false;
66
- let result;
67
- return function(...args) {
68
- if (!called) {
69
- called = true;
70
- result = fn.apply(this, args);
71
- }
72
- return result;
73
- };
123
+ let called = false;
124
+ let result;
125
+ return function(...args) {
126
+ if (!called) {
127
+ called = true;
128
+ result = fn.apply(this, args);
129
+ }
130
+ return result;
131
+ };
74
132
  }
133
+ //#endregion
75
134
  exports.fnDebounce = fnDebounce;
76
135
  exports.fnNoop = fnNoop;
77
136
  exports.fnOnce = fnOnce;
78
137
  exports.fnThrottle = fnThrottle;
79
- //# sourceMappingURL=function.cjs.map
138
+
139
+ //# sourceMappingURL=function.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"function.cjs","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":["isNumber"],"mappings":";;;AAWO,SAAS,SAAS;AAEzB;AAmCgB,SAAA,WAAkC,IAAO,MAAgC;AACvF,QAAM,UAA2BA,KAAAA,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,UAAUA,KAAAA,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.cjs","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>(fn: F, wait: number | DebounceOptions) {\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>(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: 内部使用\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,WAAkC,IAAO,MAAgC;CACvF,MAAM,UAA2B,aAAA,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,WAAkC,IAAO,MAAgC;CACvF,MAAM,UAAU,aAAA,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"}