@cloudcome/utils-core 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/README.md +18 -0
  2. package/dist/array.cjs +129 -0
  3. package/dist/array.cjs.map +1 -0
  4. package/dist/array.d.ts +171 -0
  5. package/dist/array.mjs +129 -0
  6. package/dist/array.mjs.map +1 -0
  7. package/dist/async.cjs +219 -0
  8. package/dist/async.cjs.map +1 -0
  9. package/dist/async.d.ts +137 -0
  10. package/dist/async.mjs +219 -0
  11. package/dist/async.mjs.map +1 -0
  12. package/dist/base64.cjs +16 -0
  13. package/dist/base64.cjs.map +1 -0
  14. package/dist/base64.d.ts +7 -0
  15. package/dist/base64.mjs +16 -0
  16. package/dist/base64.mjs.map +1 -0
  17. package/dist/cache.cjs +79 -0
  18. package/dist/cache.cjs.map +1 -0
  19. package/dist/cache.d.ts +90 -0
  20. package/dist/cache.mjs +79 -0
  21. package/dist/cache.mjs.map +1 -0
  22. package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
  23. package/dist/color/distance.d.ts +8 -0
  24. package/dist/color/helpers.d.ts +2 -0
  25. package/dist/color/hex-hsl.d.ts +3 -0
  26. package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
  27. package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
  28. package/dist/color/hex-rgb.d.ts +18 -0
  29. package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
  30. package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
  31. package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
  32. package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
  33. package/dist/color/rgb-hsl.d.ts +23 -0
  34. package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
  35. package/dist/color/rgb-hwb.d.ts +29 -0
  36. package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
  37. package/dist/color/rgb-whiter.d.ts +12 -0
  38. package/dist/color/rgb-xyz.d.ts +22 -0
  39. package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
  40. package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
  41. package/dist/color.cjs +250 -0
  42. package/dist/color.cjs.map +1 -0
  43. package/dist/color.mjs +250 -0
  44. package/dist/color.mjs.map +1 -0
  45. package/dist/const.cjs +14 -0
  46. package/dist/const.cjs.map +1 -0
  47. package/dist/const.mjs +15 -0
  48. package/dist/const.mjs.map +1 -0
  49. package/dist/core.cjs +250 -0
  50. package/dist/core.cjs.map +1 -0
  51. package/dist/core.mjs +251 -0
  52. package/dist/core.mjs.map +1 -0
  53. package/dist/crypto/md5.d.mts +1 -0
  54. package/dist/crypto/sha1.d.mts +1 -0
  55. package/dist/crypto/sha256.d.mts +1 -0
  56. package/dist/crypto/sha512.d.mts +1 -0
  57. package/dist/crypto.cjs +812 -0
  58. package/dist/crypto.cjs.map +1 -0
  59. package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
  60. package/dist/crypto.mjs +812 -0
  61. package/dist/crypto.mjs.map +1 -0
  62. package/dist/date/const.d.ts +6 -0
  63. package/dist/date/core.d.ts +52 -0
  64. package/dist/date/days.d.ts +23 -0
  65. package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
  66. package/dist/date/relative.d.ts +44 -0
  67. package/dist/date/start-end.d.ts +73 -0
  68. package/dist/date/timezone.d.ts +67 -0
  69. package/dist/date/weeks.d.ts +72 -0
  70. package/dist/date.cjs +239 -0
  71. package/dist/date.cjs.map +1 -0
  72. package/dist/date.mjs +241 -0
  73. package/dist/date.mjs.map +1 -0
  74. package/dist/dict.cjs +2 -0
  75. package/dist/dict.cjs.map +1 -0
  76. package/dist/dict.mjs +2 -0
  77. package/dist/dict.mjs.map +1 -0
  78. package/dist/each.cjs +18 -0
  79. package/dist/each.cjs.map +1 -0
  80. package/dist/each.mjs +19 -0
  81. package/dist/each.mjs.map +1 -0
  82. package/dist/easing.cjs +151 -0
  83. package/dist/easing.cjs.map +1 -0
  84. package/dist/easing.d.ts +46 -0
  85. package/dist/easing.mjs +151 -0
  86. package/dist/easing.mjs.map +1 -0
  87. package/dist/emitter.cjs +94 -0
  88. package/dist/emitter.cjs.map +1 -0
  89. package/dist/emitter.d.ts +68 -0
  90. package/dist/emitter.mjs +94 -0
  91. package/dist/emitter.mjs.map +1 -0
  92. package/dist/enum.cjs +58 -0
  93. package/dist/enum.cjs.map +1 -0
  94. package/dist/enum.d.ts +68 -0
  95. package/dist/enum.mjs +58 -0
  96. package/dist/enum.mjs.map +1 -0
  97. package/dist/env.cjs +28 -0
  98. package/dist/env.cjs.map +1 -0
  99. package/{src/env.ts → dist/env.d.ts} +6 -30
  100. package/dist/env.mjs +28 -0
  101. package/dist/env.mjs.map +1 -0
  102. package/dist/error.cjs +12 -0
  103. package/dist/error.cjs.map +1 -0
  104. package/{src/error.ts → dist/error.d.ts} +3 -12
  105. package/dist/error.mjs +12 -0
  106. package/dist/error.mjs.map +1 -0
  107. package/dist/exception.cjs +22 -0
  108. package/dist/exception.cjs.map +1 -0
  109. package/dist/exception.d.ts +31 -0
  110. package/dist/exception.mjs +22 -0
  111. package/dist/exception.mjs.map +1 -0
  112. package/dist/fn.cjs +76 -0
  113. package/dist/fn.cjs.map +1 -0
  114. package/dist/fn.d.ts +102 -0
  115. package/dist/fn.mjs +76 -0
  116. package/dist/fn.mjs.map +1 -0
  117. package/dist/index.cjs +5 -0
  118. package/dist/index.cjs.map +1 -0
  119. package/dist/index.d.ts +1 -0
  120. package/dist/index.mjs +5 -0
  121. package/dist/index.mjs.map +1 -0
  122. package/dist/merge.cjs +87 -0
  123. package/dist/merge.cjs.map +1 -0
  124. package/dist/merge.mjs +88 -0
  125. package/dist/merge.mjs.map +1 -0
  126. package/dist/number.cjs +14 -0
  127. package/dist/number.cjs.map +1 -0
  128. package/dist/number.d.ts +153 -0
  129. package/dist/number.mjs +14 -0
  130. package/dist/number.mjs.map +1 -0
  131. package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
  132. package/dist/object/get-set.d.ts +111 -0
  133. package/dist/object/is.d.ts +32 -0
  134. package/dist/object/merge.d.ts +72 -0
  135. package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
  136. package/dist/object.cjs +130 -0
  137. package/dist/object.cjs.map +1 -0
  138. package/dist/object.mjs +130 -0
  139. package/dist/object.mjs.map +1 -0
  140. package/dist/path.cjs +77 -0
  141. package/dist/path.cjs.map +1 -0
  142. package/dist/path.d.ts +82 -0
  143. package/dist/path.mjs +77 -0
  144. package/dist/path.mjs.map +1 -0
  145. package/dist/promise.cjs +62 -0
  146. package/dist/promise.cjs.map +1 -0
  147. package/{src/promise.ts → dist/promise.d.ts} +6 -67
  148. package/dist/promise.mjs +62 -0
  149. package/dist/promise.mjs.map +1 -0
  150. package/dist/qs.cjs +47 -0
  151. package/dist/qs.cjs.map +1 -0
  152. package/{src/qs.ts → dist/qs.d.ts} +3 -60
  153. package/dist/qs.mjs +47 -0
  154. package/dist/qs.mjs.map +1 -0
  155. package/dist/regexp.cjs +66 -0
  156. package/dist/regexp.cjs.map +1 -0
  157. package/dist/regexp.d.ts +65 -0
  158. package/dist/regexp.mjs +66 -0
  159. package/dist/regexp.mjs.map +1 -0
  160. package/dist/string.cjs +16 -0
  161. package/dist/string.cjs.map +1 -0
  162. package/dist/string.d.ts +80 -0
  163. package/dist/string.mjs +16 -0
  164. package/dist/string.mjs.map +1 -0
  165. package/dist/string2.cjs +157 -0
  166. package/dist/string2.cjs.map +1 -0
  167. package/dist/string2.mjs +158 -0
  168. package/dist/string2.mjs.map +1 -0
  169. package/dist/time/from.d.ts +14 -0
  170. package/dist/time/to.d.ts +38 -0
  171. package/dist/time.cjs +82 -0
  172. package/dist/time.cjs.map +1 -0
  173. package/dist/time.mjs +82 -0
  174. package/dist/time.mjs.map +1 -0
  175. package/dist/timer.cjs +119 -0
  176. package/dist/timer.cjs.map +1 -0
  177. package/dist/timer.d.ts +96 -0
  178. package/{src/timer.ts → dist/timer.mjs} +17 -124
  179. package/dist/timer.mjs.map +1 -0
  180. package/dist/tree.cjs +125 -0
  181. package/dist/tree.cjs.map +1 -0
  182. package/dist/tree.d.ts +210 -0
  183. package/dist/tree.mjs +125 -0
  184. package/dist/tree.mjs.map +1 -0
  185. package/dist/type.cjs +78 -0
  186. package/dist/type.cjs.map +1 -0
  187. package/{src/type.ts → dist/type.d.ts} +20 -96
  188. package/dist/type.mjs +78 -0
  189. package/dist/type.mjs.map +1 -0
  190. package/dist/types.cjs +2 -0
  191. package/dist/types.cjs.map +1 -0
  192. package/{src/types.ts → dist/types.d.ts} +12 -33
  193. package/dist/types.mjs +2 -0
  194. package/dist/types.mjs.map +1 -0
  195. package/dist/unique.cjs +46 -0
  196. package/dist/unique.cjs.map +1 -0
  197. package/dist/unique.d.ts +22 -0
  198. package/dist/unique.mjs +46 -0
  199. package/dist/unique.mjs.map +1 -0
  200. package/dist/url.cjs +37 -0
  201. package/dist/url.cjs.map +1 -0
  202. package/dist/url.d.ts +53 -0
  203. package/dist/url.mjs +37 -0
  204. package/dist/url.mjs.map +1 -0
  205. package/dist/version.cjs +33 -0
  206. package/dist/version.cjs.map +1 -0
  207. package/dist/version.d.ts +32 -0
  208. package/dist/version.mjs +33 -0
  209. package/dist/version.mjs.map +1 -0
  210. package/package.json +8 -2
  211. package/CHANGELOG.md +0 -52
  212. package/src/array.ts +0 -312
  213. package/src/async.ts +0 -379
  214. package/src/base64.ts +0 -20
  215. package/src/cache.ts +0 -146
  216. package/src/color/distance.ts +0 -28
  217. package/src/color/helpers.ts +0 -23
  218. package/src/color/hex-hsl.ts +0 -11
  219. package/src/color/hex-rgb.ts +0 -39
  220. package/src/color/rgb-hsl.ts +0 -53
  221. package/src/color/rgb-hwb.ts +0 -56
  222. package/src/color/rgb-whiter.ts +0 -22
  223. package/src/color/rgb-xyz.ts +0 -62
  224. package/src/crypto/md5.mjs +0 -357
  225. package/src/crypto/sha1.mjs +0 -300
  226. package/src/crypto/sha256.mjs +0 -310
  227. package/src/crypto/sha512.mjs +0 -459
  228. package/src/date/const.ts +0 -6
  229. package/src/date/core.ts +0 -162
  230. package/src/date/days.ts +0 -51
  231. package/src/date/relative.ts +0 -92
  232. package/src/date/start-end.ts +0 -246
  233. package/src/date/timezone.ts +0 -220
  234. package/src/date/weeks.ts +0 -100
  235. package/src/dts/global.d.ts +0 -27
  236. package/src/easing.ts +0 -166
  237. package/src/emitter.ts +0 -117
  238. package/src/enum.ts +0 -171
  239. package/src/exception.ts +0 -68
  240. package/src/fn.ts +0 -197
  241. package/src/index.ts +0 -1
  242. package/src/number.ts +0 -236
  243. package/src/object/get-set.ts +0 -273
  244. package/src/object/is.ts +0 -128
  245. package/src/object/merge.ts +0 -180
  246. package/src/path.ts +0 -188
  247. package/src/regexp.ts +0 -156
  248. package/src/string.ts +0 -146
  249. package/src/time/from.ts +0 -57
  250. package/src/time/to.ts +0 -106
  251. package/src/tree.ts +0 -394
  252. package/src/unique.ts +0 -77
  253. package/src/url.ts +0 -93
  254. package/src/version.ts +0 -71
  255. package/test/array.test.ts +0 -332
  256. package/test/async-real.test.ts +0 -39
  257. package/test/async.test.ts +0 -375
  258. package/test/base64.test.ts +0 -32
  259. package/test/cache.test.ts +0 -83
  260. package/test/color.test.ts +0 -163
  261. package/test/crypto.test.ts +0 -34
  262. package/test/date-tz.test.ts +0 -206
  263. package/test/date.test.ts +0 -353
  264. package/test/easing.test.ts +0 -33
  265. package/test/emitter.test.ts +0 -71
  266. package/test/enum.test.ts +0 -113
  267. package/test/env.test.ts +0 -69
  268. package/test/error.test.ts +0 -58
  269. package/test/exception.test.ts +0 -43
  270. package/test/fn.test.ts +0 -263
  271. package/test/helpers.ts +0 -23
  272. package/test/index.test.ts +0 -6
  273. package/test/number.test.ts +0 -213
  274. package/test/object.test.ts +0 -309
  275. package/test/path.test.ts +0 -156
  276. package/test/promise.test.ts +0 -199
  277. package/test/qs.test.ts +0 -79
  278. package/test/regexp.test.ts +0 -97
  279. package/test/string.test.ts +0 -150
  280. package/test/time.test.ts +0 -214
  281. package/test/timer.test.ts +0 -114
  282. package/test/tree.test.ts +0 -348
  283. package/test/type.test.ts +0 -226
  284. package/test/unique.test.ts +0 -71
  285. package/test/url.test.ts +0 -136
  286. package/test/version.test.ts +0 -52
  287. package/tsconfig.json +0 -31
  288. package/vite.config.mts +0 -114
  289. /package/{src/color.ts → dist/color.d.ts} +0 -0
  290. /package/{src/date.ts → dist/date.d.ts} +0 -0
  291. /package/{src/dict.ts → dist/dict.d.ts} +0 -0
  292. /package/{src/object.ts → dist/object.d.ts} +0 -0
  293. /package/{src/time.ts → dist/time.d.ts} +0 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * 事件类型映射,key 为事件名称,value 为事件参数类型数组
3
+ */
4
+ export type EmitterMap = Record<string, unknown[]>;
5
+ /**
6
+ * 事件监听器函数类型
7
+ * @template E - EmitterMap 类型
8
+ * @template K - 事件名称类型
9
+ */
10
+ export type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;
11
+ /**
12
+ * 事件发射器类,用于管理事件监听和触发
13
+ * @template E - 事件类型映射
14
+ *
15
+ * @example
16
+ * type MyEvents = {
17
+ * 'click': [x: number, y: number];
18
+ * 'change': [value: string];
19
+ * };
20
+ *
21
+ * const emitter = new Emitter<MyEvents>();
22
+ * emitter.on('click', (x, y) => {
23
+ * console.log(`Clicked at (${x}, ${y})`);
24
+ * });
25
+ * emitter.emit('click', 10, 20);
26
+ */
27
+ export declare class Emitter<E extends EmitterMap> {
28
+ #private;
29
+ /**
30
+ * 注册事件监听器
31
+ * @param event - 要监听的事件名称
32
+ * @param listener - 事件监听器函数
33
+ * @example
34
+ * emitter.on('click', (x, y) => {
35
+ * console.log(`Clicked at (${x}, ${y})`);
36
+ * });
37
+ */
38
+ on<K extends keyof E>(event: K, listener: EmitterListener<E, K>): void;
39
+ /**
40
+ * 移除事件监听器,有三种使用方式:
41
+ * 1. 移除特定事件的特定监听器
42
+ * 2. 移除特定事件的所有监听器
43
+ * 3. 移除所有事件的所有监听器
44
+ * @param event - 要移除的事件名称(可选)
45
+ * @param listener - 要移除的监听器函数(可选)
46
+ * @example
47
+ * // 移除特定事件的特定监听器
48
+ * emitter.off('click', clickHandler);
49
+ *
50
+ * // 移除特定事件的所有监听器
51
+ * emitter.off('click');
52
+ *
53
+ * // 移除所有事件的所有监听器
54
+ * emitter.off();
55
+ */
56
+ off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>): void;
57
+ /**
58
+ * 触发指定事件,调用所有注册的监听器
59
+ * @param event - 要触发的事件名称
60
+ * @param payloads - 传递给监听器的参数
61
+ * @remarks
62
+ * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,
63
+ * 则后续监听器将不会被执行
64
+ * @example
65
+ * emitter.emit('click', 10, 20);
66
+ */
67
+ emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>): void;
68
+ }
@@ -0,0 +1,94 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
8
+ var _events, _Emitter_instances, offAll_fn, offEvent_fn, offListener_fn;
9
+ class Emitter {
10
+ constructor() {
11
+ __privateAdd(this, _Emitter_instances);
12
+ __privateAdd(this, _events, /* @__PURE__ */ new Map());
13
+ }
14
+ /**
15
+ * 注册事件监听器
16
+ * @param event - 要监听的事件名称
17
+ * @param listener - 事件监听器函数
18
+ * @example
19
+ * emitter.on('click', (x, y) => {
20
+ * console.log(`Clicked at (${x}, ${y})`);
21
+ * });
22
+ */
23
+ on(event, listener) {
24
+ const listeners = __privateGet(this, _events).get(event);
25
+ if (listeners) {
26
+ listeners.add(listener);
27
+ } else {
28
+ __privateGet(this, _events).set(event, /* @__PURE__ */ new Set([listener]));
29
+ }
30
+ }
31
+ /**
32
+ * 移除事件监听器,有三种使用方式:
33
+ * 1. 移除特定事件的特定监听器
34
+ * 2. 移除特定事件的所有监听器
35
+ * 3. 移除所有事件的所有监听器
36
+ * @param event - 要移除的事件名称(可选)
37
+ * @param listener - 要移除的监听器函数(可选)
38
+ * @example
39
+ * // 移除特定事件的特定监听器
40
+ * emitter.off('click', clickHandler);
41
+ *
42
+ * // 移除特定事件的所有监听器
43
+ * emitter.off('click');
44
+ *
45
+ * // 移除所有事件的所有监听器
46
+ * emitter.off();
47
+ */
48
+ off(event, listener) {
49
+ if (event && listener) {
50
+ __privateMethod(this, _Emitter_instances, offListener_fn).call(this, event, listener);
51
+ } else if (event) {
52
+ __privateMethod(this, _Emitter_instances, offEvent_fn).call(this, event);
53
+ } else {
54
+ __privateMethod(this, _Emitter_instances, offAll_fn).call(this);
55
+ }
56
+ }
57
+ /**
58
+ * 触发指定事件,调用所有注册的监听器
59
+ * @param event - 要触发的事件名称
60
+ * @param payloads - 传递给监听器的参数
61
+ * @remarks
62
+ * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,
63
+ * 则后续监听器将不会被执行
64
+ * @example
65
+ * emitter.emit('click', 10, 20);
66
+ */
67
+ emit(event, ...payloads) {
68
+ const listeners = __privateGet(this, _events).get(event);
69
+ if (!listeners) return;
70
+ for (const listener of [...listeners]) {
71
+ if (listener(...payloads) === false) {
72
+ break;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ _events = new WeakMap();
78
+ _Emitter_instances = new WeakSet();
79
+ offAll_fn = function() {
80
+ __privateGet(this, _events).clear();
81
+ };
82
+ offEvent_fn = function(event) {
83
+ __privateGet(this, _events).delete(event);
84
+ };
85
+ offListener_fn = function(event, listener) {
86
+ const listeners = __privateGet(this, _events).get(event);
87
+ if (listeners) {
88
+ listeners.delete(listener);
89
+ }
90
+ };
91
+ export {
92
+ Emitter
93
+ };
94
+ //# sourceMappingURL=emitter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.mjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap> {\n #events: Map<keyof E, Set<AnyFunction>> = new Map();\n\n /**\n * 注册事件监听器\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n on<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n if (listeners) {\n listeners.add(listener);\n } else {\n this.#events.set(event, new Set([listener]));\n }\n }\n\n /**\n * 移除事件监听器,有三种使用方式:\n * 1. 移除特定事件的特定监听器\n * 2. 移除特定事件的所有监听器\n * 3. 移除所有事件的所有监听器\n * @param event - 要移除的事件名称(可选)\n * @param listener - 要移除的监听器函数(可选)\n * @example\n * // 移除特定事件的特定监听器\n * emitter.off('click', clickHandler);\n *\n * // 移除特定事件的所有监听器\n * emitter.off('click');\n *\n * // 移除所有事件的所有监听器\n * emitter.off();\n */\n off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>) {\n if (event && listener) {\n this.#offListener(event, listener);\n } else if (event) {\n this.#offEvent(event);\n } else {\n this.#offAll();\n }\n }\n\n #offAll() {\n this.#events.clear();\n }\n\n #offEvent<K extends keyof E>(event: K) {\n this.#events.delete(event);\n }\n\n #offListener<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 触发指定事件,调用所有注册的监听器\n * @param event - 要触发的事件名称\n * @param payloads - 传递给监听器的参数\n * @remarks\n * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,\n * 则后续监听器将不会被执行\n * @example\n * emitter.emit('click', 10, 20);\n */\n emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>) {\n const listeners = this.#events.get(event) as Set<EmitterListener<E, K>> | undefined;\n\n if (!listeners) return;\n\n // 避免在 emit、on 的过程中改变 listeners 从而影响本次 emit\n for (const listener of [...listeners]) {\n if (listener(...payloads) === false) {\n break;\n }\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;AA8BO;AAAA,MAAM,QAA8B;AAAA,EAApC;AAAA;AACL,oDAA8C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,GAAsB,OAAU,UAAiC;AAC/D,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AACxC,QAAI,WAAW;AACb,gBAAU,IAAI,QAAQ;AAAA,IAAA,OACjB;AACA,yBAAA,SAAQ,IAAI,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBF,IAAuB,OAAW,UAAkC;AAClE,QAAI,SAAS,UAAU;AAChB,4BAAA,oCAAA,WAAa,OAAO;AAAA,eAChB,OAAO;AAChB,4BAAK,iCAAL,WAAe;AAAA,IAAK,OACf;AACL,4BAAK,+BAAL;AAAA,IAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BF,KAAwB,UAAa,UAA6C;AAChF,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,QAAI,CAAC,UAAW;AAGhB,eAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AACrC,UAAI,SAAS,GAAG,QAAQ,MAAM,OAAO;AACnC;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;AArFE;AADK;AAgDL,YAAU,WAAA;AACR,qBAAK,SAAQ,MAAM;AAAA;AAGrB,uBAA6B,OAAU;AAChC,qBAAA,SAAQ,OAAO,KAAK;AAAA;AAG3B,iBAAA,SAAgC,OAAU,UAAiC;AACzE,QAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,MAAI,WAAW;AACb,cAAU,OAAO,QAAQ;AAAA,EAAA;AAC3B;"}
package/dist/enum.cjs ADDED
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function defineEnum(definition) {
4
+ const keys = Object.keys(definition);
5
+ return {
6
+ ...[...Object.entries(definition)].reduce((acc, [key, dfn]) => {
7
+ if (key[0].toUpperCase() !== key[0]) {
8
+ throw new Error(`错误:枚举键名 ${key} 必须以大写字母开头`);
9
+ }
10
+ if (key.startsWith("$")) {
11
+ throw new Error(`错误:枚举键名 ${key} 不能以 $ 符号开头`);
12
+ }
13
+ acc[key] = dfn.value;
14
+ acc[`$${key}`] = { key, ...dfn };
15
+ return acc;
16
+ }, {}),
17
+ definition,
18
+ descriptions: keys.map((key) => ({
19
+ key,
20
+ ...definition[key]
21
+ })),
22
+ keys,
23
+ length: keys.length,
24
+ values: keys.map((key) => definition[key].value),
25
+ kvRecord: keys.reduce((acc, key) => {
26
+ acc[key] = definition[key].value;
27
+ return acc;
28
+ }, {}),
29
+ vkRecord: keys.reduce((acc, key) => {
30
+ acc[definition[key].value] = key;
31
+ return acc;
32
+ }, {}),
33
+ toKeyRecord(prop) {
34
+ return keys.reduce((acc, key) => {
35
+ acc[key] = definition[key][prop];
36
+ return acc;
37
+ }, {});
38
+ },
39
+ toValueRecord(prop) {
40
+ return keys.reduce(
41
+ (acc, key) => {
42
+ acc[definition[key].value] = definition[key][prop];
43
+ return acc;
44
+ },
45
+ {}
46
+ );
47
+ }
48
+ };
49
+ }
50
+ function declareEnum() {
51
+ return {
52
+ define(definition) {
53
+ return defineEnum(definition);
54
+ }
55
+ };
56
+ }
57
+ exports.declareEnum = declareEnum;
58
+ //# sourceMappingURL=enum.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.cjs","sources":["../src/enum.ts"],"sourcesContent":["import type { AnyObject, MergeIntersection, UnionToIntersection, UnionToTuple } from './types';\n\nexport type EnumKey = string;\nexport type EnumValue = number | string;\nexport type EnumMetaAppend = {\n key?: string;\n value?: string | number;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [key: string]: any;\n};\nexport type EnumMeta<A extends EnumMetaAppend> = A & {\n value: EnumValue;\n};\nexport type EnumDescription<A extends EnumMetaAppend> = Record<EnumKey, EnumMeta<A>>;\n\nconst enumError = Symbol('enumKeyError');\n\ntype _StartWithDollarSign<T extends string> = T extends `$${infer R}` ? R : never;\n\ntype _CheckDefinition<O extends AnyObject> = {\n // [K in keyof O & string]: K extends Capitalize<K> ? O[K] : `错误:枚举键名 ${K} 必须大写字母开头`;\n [K in keyof O & string]: K extends Capitalize<K>\n ? K extends `$${infer R}`\n ? O[K] & { [enumError]: `错误:枚举键名 ${K} 不能以 $ 符号开头` }\n : O[K]\n : O[K] & { [enumError]: `错误:枚举键名 ${K} 必须以大写字母开头` };\n};\n\ntype _ToOriginDefProp<T extends AnyObject> = {\n [K in keyof T as `$${K & string}`]: MergeIntersection<T[K] & { readonly key: K }>;\n};\n\ntype _KVRecord<T> = T extends Record<string, AnyObject>\n ? {\n readonly [K in keyof T]: T[K]['value'];\n }\n : never;\n\ntype _VKRecord<T> = T extends Record<string, AnyObject>\n ? MergeIntersection<\n UnionToIntersection<\n {\n [K in keyof T]: {\n [P in keyof T[K] as P extends 'value' ? T[K][P] & (string | number) : never]: K;\n };\n }[keyof T]\n >\n >\n : never;\n\nexport type EnumExpose<A extends EnumMetaAppend, E extends EnumDescription<A>> = _ToOriginDefProp<E> &\n _KVRecord<E> & {\n readonly definition: E;\n readonly descriptions: MergeIntersection<A & { key: keyof E }>[];\n readonly keys: UnionToTuple<keyof E>;\n readonly length: UnionToTuple<keyof E>['length'];\n readonly values: UnionToTuple<E[keyof E]['value']>;\n readonly kvRecord: _KVRecord<E>;\n readonly vkRecord: _VKRecord<E>;\n toKeyRecord: <P extends keyof A>(prop: P) => Record<keyof E, A[P]>;\n toValueRecord: <P extends keyof A>(prop: P) => Record<E[keyof E]['value'], A[P]>;\n };\n\n/**\n * 定义一个枚举类型,如果需要类型提示,需要使用 declareEnum 函数定义枚举。\n * @template A - 枚举元数据附加类型,扩展自 EnumMetaAppend\n * @template E - 枚举描述类型,键为枚举键名,值为枚举元数据\n * @param {_CheckDefinition<E>} definition - 枚举定义对象\n * @returns {EnumExpose<A, E>} 返回枚举的完整暴露对象\n * @example\n * ```typescript\n * const Status = defineEnum({\n * Pending: { value: 0, label: '待处理' },\n * Approved: { value: 1, label: '已批准' }\n * });\n * ```\n *\n * @property {E} definition - 原始枚举定义对象\n * @property {Array<MergeIntersection<A & { key: keyof E }>>} descriptions - 枚举项的完整描述数组\n * @property {UnionToTuple<keyof E>} keys - 枚举键名的元组\n * @property {\"UnionToTuple<keyof E>[\\\"length\\\"]\"} length - 枚举项的数量\n * @property {UnionToTuple<E[keyof E][\"value\"]>} values - 枚举值的元组\n * @property {Record<keyof E, E[keyof E][\"value\"]>} kvRecord - 键到值的映射记录\n * @property {Record<E[keyof E][\"value\"], E[keyof E]>} vkRecord - 值到键的映射记录\n * @property {function} toKeyRecord - 根据属性名创建键到属性值的映射记录\n * @property {function} toValueRecord - 根据属性名创建值到属性值的映射记录\n */\nfunction defineEnum<A extends EnumMetaAppend, const E extends EnumDescription<A>>(\n definition: _CheckDefinition<E>,\n): EnumExpose<A, E> {\n const keys = Object.keys(definition);\n\n return {\n ...[...Object.entries(definition)].reduce((acc, [key, dfn]) => {\n if (key[0].toUpperCase() !== key[0]) {\n throw new Error(`错误:枚举键名 ${key} 必须以大写字母开头`);\n }\n\n if (key.startsWith('$')) {\n throw new Error(`错误:枚举键名 ${key} 不能以 $ 符号开头`);\n }\n\n // @ts-ignore\n acc[key] = dfn.value;\n // @ts-ignore\n acc[`$${key}`] = { key, ...dfn };\n return acc;\n }, {}),\n definition,\n descriptions: keys.map((key) => ({\n key,\n ...definition[key],\n })),\n keys,\n length: keys.length,\n values: keys.map((key) => definition[key as keyof E].value),\n kvRecord: keys.reduce((acc, key) => {\n // @ts-ignore\n acc[key] = definition[key].value;\n return acc;\n }, {}),\n vkRecord: keys.reduce((acc, key) => {\n // @ts-ignore\n acc[definition[key].value] = key;\n return acc;\n }, {}),\n toKeyRecord<P extends keyof A>(prop: P) {\n return keys.reduce((acc, key) => {\n // @ts-ignore\n acc[key] = definition[key][prop];\n return acc;\n }, {});\n },\n toValueRecord<P extends keyof A>(prop: P) {\n return keys.reduce(\n (acc, key) => {\n // @ts-ignore\n acc[definition[key].value] = definition[key][prop];\n return acc;\n },\n {} as Record<E[keyof E]['value'], A[P]>,\n );\n },\n } as unknown as EnumExpose<A, E>;\n}\n\n/**\n * 声明一个枚举工厂函数\n * @template A - 枚举元数据附加类型,扩展自 EnumMetaAppend\n * @returns {Object} 返回包含 define 方法的对象\n *\n * @property {function} define - 定义枚举的函数\n * @template E - 枚举描述类型\n * @param {_CheckDefinition<E>} definition - 枚举定义对象\n * @returns {EnumExpose<A, E>} 返回枚举的完整暴露对象\n * @example\n * ```typescript\n * const createStatusEnum = declareEnum<{ label: string }>();\n * const Status = createStatusEnum.define({\n * Pending: { value: 0, label: '待处理' },\n * Approved: { value: 1, label: '已批准' }\n * });\n * ```\n */\nexport function declareEnum<A extends EnumMetaAppend>() {\n return {\n define<const E extends EnumDescription<A>>(definition: _CheckDefinition<E>): EnumExpose<A, E> {\n return defineEnum(definition);\n },\n };\n}\n"],"names":[],"mappings":";;AAuFA,SAAS,WACP,YACkB;AACZ,QAAA,OAAO,OAAO,KAAK,UAAU;AAE5B,SAAA;AAAA,IACL,GAAG,CAAC,GAAG,OAAO,QAAQ,UAAU,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC7D,UAAI,IAAI,CAAC,EAAE,kBAAkB,IAAI,CAAC,GAAG;AACnC,cAAM,IAAI,MAAM,WAAW,GAAG,YAAY;AAAA,MAAA;AAGxC,UAAA,IAAI,WAAW,GAAG,GAAG;AACvB,cAAM,IAAI,MAAM,WAAW,GAAG,aAAa;AAAA,MAAA;AAIzC,UAAA,GAAG,IAAI,IAAI;AAEf,UAAI,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;AACxB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL;AAAA,IACA,cAAc,KAAK,IAAI,CAAC,SAAS;AAAA,MAC/B;AAAA,MACA,GAAG,WAAW,GAAG;AAAA,IAAA,EACjB;AAAA,IACF;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,IAAI,CAAC,QAAQ,WAAW,GAAc,EAAE,KAAK;AAAA,IAC1D,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ;AAElC,UAAI,GAAG,IAAI,WAAW,GAAG,EAAE;AACpB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ;AAElC,UAAI,WAAW,GAAG,EAAE,KAAK,IAAI;AACtB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL,YAA+B,MAAS;AACtC,aAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAE/B,YAAI,GAAG,IAAI,WAAW,GAAG,EAAE,IAAI;AACxB,eAAA;AAAA,MACT,GAAG,EAAE;AAAA,IACP;AAAA,IACA,cAAiC,MAAS;AACxC,aAAO,KAAK;AAAA,QACV,CAAC,KAAK,QAAQ;AAER,cAAA,WAAW,GAAG,EAAE,KAAK,IAAI,WAAW,GAAG,EAAE,IAAI;AAC1C,iBAAA;AAAA,QACT;AAAA,QACA,CAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AACF;AAoBO,SAAS,cAAwC;AAC/C,SAAA;AAAA,IACL,OAA2C,YAAmD;AAC5F,aAAO,WAAW,UAAU;AAAA,IAAA;AAAA,EAEhC;AACF;;"}
package/dist/enum.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import { AnyObject, MergeIntersection, UnionToIntersection, UnionToTuple } from './types';
2
+ export type EnumKey = string;
3
+ export type EnumValue = number | string;
4
+ export type EnumMetaAppend = {
5
+ key?: string;
6
+ value?: string | number;
7
+ [key: string]: any;
8
+ };
9
+ export type EnumMeta<A extends EnumMetaAppend> = A & {
10
+ value: EnumValue;
11
+ };
12
+ export type EnumDescription<A extends EnumMetaAppend> = Record<EnumKey, EnumMeta<A>>;
13
+ declare const enumError: unique symbol;
14
+ type _CheckDefinition<O extends AnyObject> = {
15
+ [K in keyof O & string]: K extends Capitalize<K> ? K extends `$${infer R}` ? O[K] & {
16
+ [enumError]: `错误:枚举键名 ${K} 不能以 $ 符号开头`;
17
+ } : O[K] : O[K] & {
18
+ [enumError]: `错误:枚举键名 ${K} 必须以大写字母开头`;
19
+ };
20
+ };
21
+ type _ToOriginDefProp<T extends AnyObject> = {
22
+ [K in keyof T as `$${K & string}`]: MergeIntersection<T[K] & {
23
+ readonly key: K;
24
+ }>;
25
+ };
26
+ type _KVRecord<T> = T extends Record<string, AnyObject> ? {
27
+ readonly [K in keyof T]: T[K]['value'];
28
+ } : never;
29
+ type _VKRecord<T> = T extends Record<string, AnyObject> ? MergeIntersection<UnionToIntersection<{
30
+ [K in keyof T]: {
31
+ [P in keyof T[K] as P extends 'value' ? T[K][P] & (string | number) : never]: K;
32
+ };
33
+ }[keyof T]>> : never;
34
+ export type EnumExpose<A extends EnumMetaAppend, E extends EnumDescription<A>> = _ToOriginDefProp<E> & _KVRecord<E> & {
35
+ readonly definition: E;
36
+ readonly descriptions: MergeIntersection<A & {
37
+ key: keyof E;
38
+ }>[];
39
+ readonly keys: UnionToTuple<keyof E>;
40
+ readonly length: UnionToTuple<keyof E>['length'];
41
+ readonly values: UnionToTuple<E[keyof E]['value']>;
42
+ readonly kvRecord: _KVRecord<E>;
43
+ readonly vkRecord: _VKRecord<E>;
44
+ toKeyRecord: <P extends keyof A>(prop: P) => Record<keyof E, A[P]>;
45
+ toValueRecord: <P extends keyof A>(prop: P) => Record<E[keyof E]['value'], A[P]>;
46
+ };
47
+ /**
48
+ * 声明一个枚举工厂函数
49
+ * @template A - 枚举元数据附加类型,扩展自 EnumMetaAppend
50
+ * @returns {Object} 返回包含 define 方法的对象
51
+ *
52
+ * @property {function} define - 定义枚举的函数
53
+ * @template E - 枚举描述类型
54
+ * @param {_CheckDefinition<E>} definition - 枚举定义对象
55
+ * @returns {EnumExpose<A, E>} 返回枚举的完整暴露对象
56
+ * @example
57
+ * ```typescript
58
+ * const createStatusEnum = declareEnum<{ label: string }>();
59
+ * const Status = createStatusEnum.define({
60
+ * Pending: { value: 0, label: '待处理' },
61
+ * Approved: { value: 1, label: '已批准' }
62
+ * });
63
+ * ```
64
+ */
65
+ export declare function declareEnum<A extends EnumMetaAppend>(): {
66
+ define<const E extends EnumDescription<A>>(definition: _CheckDefinition<E>): EnumExpose<A, E>;
67
+ };
68
+ export {};
package/dist/enum.mjs ADDED
@@ -0,0 +1,58 @@
1
+ function defineEnum(definition) {
2
+ const keys = Object.keys(definition);
3
+ return {
4
+ ...[...Object.entries(definition)].reduce((acc, [key, dfn]) => {
5
+ if (key[0].toUpperCase() !== key[0]) {
6
+ throw new Error(`错误:枚举键名 ${key} 必须以大写字母开头`);
7
+ }
8
+ if (key.startsWith("$")) {
9
+ throw new Error(`错误:枚举键名 ${key} 不能以 $ 符号开头`);
10
+ }
11
+ acc[key] = dfn.value;
12
+ acc[`$${key}`] = { key, ...dfn };
13
+ return acc;
14
+ }, {}),
15
+ definition,
16
+ descriptions: keys.map((key) => ({
17
+ key,
18
+ ...definition[key]
19
+ })),
20
+ keys,
21
+ length: keys.length,
22
+ values: keys.map((key) => definition[key].value),
23
+ kvRecord: keys.reduce((acc, key) => {
24
+ acc[key] = definition[key].value;
25
+ return acc;
26
+ }, {}),
27
+ vkRecord: keys.reduce((acc, key) => {
28
+ acc[definition[key].value] = key;
29
+ return acc;
30
+ }, {}),
31
+ toKeyRecord(prop) {
32
+ return keys.reduce((acc, key) => {
33
+ acc[key] = definition[key][prop];
34
+ return acc;
35
+ }, {});
36
+ },
37
+ toValueRecord(prop) {
38
+ return keys.reduce(
39
+ (acc, key) => {
40
+ acc[definition[key].value] = definition[key][prop];
41
+ return acc;
42
+ },
43
+ {}
44
+ );
45
+ }
46
+ };
47
+ }
48
+ function declareEnum() {
49
+ return {
50
+ define(definition) {
51
+ return defineEnum(definition);
52
+ }
53
+ };
54
+ }
55
+ export {
56
+ declareEnum
57
+ };
58
+ //# sourceMappingURL=enum.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum.mjs","sources":["../src/enum.ts"],"sourcesContent":["import type { AnyObject, MergeIntersection, UnionToIntersection, UnionToTuple } from './types';\n\nexport type EnumKey = string;\nexport type EnumValue = number | string;\nexport type EnumMetaAppend = {\n key?: string;\n value?: string | number;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [key: string]: any;\n};\nexport type EnumMeta<A extends EnumMetaAppend> = A & {\n value: EnumValue;\n};\nexport type EnumDescription<A extends EnumMetaAppend> = Record<EnumKey, EnumMeta<A>>;\n\nconst enumError = Symbol('enumKeyError');\n\ntype _StartWithDollarSign<T extends string> = T extends `$${infer R}` ? R : never;\n\ntype _CheckDefinition<O extends AnyObject> = {\n // [K in keyof O & string]: K extends Capitalize<K> ? O[K] : `错误:枚举键名 ${K} 必须大写字母开头`;\n [K in keyof O & string]: K extends Capitalize<K>\n ? K extends `$${infer R}`\n ? O[K] & { [enumError]: `错误:枚举键名 ${K} 不能以 $ 符号开头` }\n : O[K]\n : O[K] & { [enumError]: `错误:枚举键名 ${K} 必须以大写字母开头` };\n};\n\ntype _ToOriginDefProp<T extends AnyObject> = {\n [K in keyof T as `$${K & string}`]: MergeIntersection<T[K] & { readonly key: K }>;\n};\n\ntype _KVRecord<T> = T extends Record<string, AnyObject>\n ? {\n readonly [K in keyof T]: T[K]['value'];\n }\n : never;\n\ntype _VKRecord<T> = T extends Record<string, AnyObject>\n ? MergeIntersection<\n UnionToIntersection<\n {\n [K in keyof T]: {\n [P in keyof T[K] as P extends 'value' ? T[K][P] & (string | number) : never]: K;\n };\n }[keyof T]\n >\n >\n : never;\n\nexport type EnumExpose<A extends EnumMetaAppend, E extends EnumDescription<A>> = _ToOriginDefProp<E> &\n _KVRecord<E> & {\n readonly definition: E;\n readonly descriptions: MergeIntersection<A & { key: keyof E }>[];\n readonly keys: UnionToTuple<keyof E>;\n readonly length: UnionToTuple<keyof E>['length'];\n readonly values: UnionToTuple<E[keyof E]['value']>;\n readonly kvRecord: _KVRecord<E>;\n readonly vkRecord: _VKRecord<E>;\n toKeyRecord: <P extends keyof A>(prop: P) => Record<keyof E, A[P]>;\n toValueRecord: <P extends keyof A>(prop: P) => Record<E[keyof E]['value'], A[P]>;\n };\n\n/**\n * 定义一个枚举类型,如果需要类型提示,需要使用 declareEnum 函数定义枚举。\n * @template A - 枚举元数据附加类型,扩展自 EnumMetaAppend\n * @template E - 枚举描述类型,键为枚举键名,值为枚举元数据\n * @param {_CheckDefinition<E>} definition - 枚举定义对象\n * @returns {EnumExpose<A, E>} 返回枚举的完整暴露对象\n * @example\n * ```typescript\n * const Status = defineEnum({\n * Pending: { value: 0, label: '待处理' },\n * Approved: { value: 1, label: '已批准' }\n * });\n * ```\n *\n * @property {E} definition - 原始枚举定义对象\n * @property {Array<MergeIntersection<A & { key: keyof E }>>} descriptions - 枚举项的完整描述数组\n * @property {UnionToTuple<keyof E>} keys - 枚举键名的元组\n * @property {\"UnionToTuple<keyof E>[\\\"length\\\"]\"} length - 枚举项的数量\n * @property {UnionToTuple<E[keyof E][\"value\"]>} values - 枚举值的元组\n * @property {Record<keyof E, E[keyof E][\"value\"]>} kvRecord - 键到值的映射记录\n * @property {Record<E[keyof E][\"value\"], E[keyof E]>} vkRecord - 值到键的映射记录\n * @property {function} toKeyRecord - 根据属性名创建键到属性值的映射记录\n * @property {function} toValueRecord - 根据属性名创建值到属性值的映射记录\n */\nfunction defineEnum<A extends EnumMetaAppend, const E extends EnumDescription<A>>(\n definition: _CheckDefinition<E>,\n): EnumExpose<A, E> {\n const keys = Object.keys(definition);\n\n return {\n ...[...Object.entries(definition)].reduce((acc, [key, dfn]) => {\n if (key[0].toUpperCase() !== key[0]) {\n throw new Error(`错误:枚举键名 ${key} 必须以大写字母开头`);\n }\n\n if (key.startsWith('$')) {\n throw new Error(`错误:枚举键名 ${key} 不能以 $ 符号开头`);\n }\n\n // @ts-ignore\n acc[key] = dfn.value;\n // @ts-ignore\n acc[`$${key}`] = { key, ...dfn };\n return acc;\n }, {}),\n definition,\n descriptions: keys.map((key) => ({\n key,\n ...definition[key],\n })),\n keys,\n length: keys.length,\n values: keys.map((key) => definition[key as keyof E].value),\n kvRecord: keys.reduce((acc, key) => {\n // @ts-ignore\n acc[key] = definition[key].value;\n return acc;\n }, {}),\n vkRecord: keys.reduce((acc, key) => {\n // @ts-ignore\n acc[definition[key].value] = key;\n return acc;\n }, {}),\n toKeyRecord<P extends keyof A>(prop: P) {\n return keys.reduce((acc, key) => {\n // @ts-ignore\n acc[key] = definition[key][prop];\n return acc;\n }, {});\n },\n toValueRecord<P extends keyof A>(prop: P) {\n return keys.reduce(\n (acc, key) => {\n // @ts-ignore\n acc[definition[key].value] = definition[key][prop];\n return acc;\n },\n {} as Record<E[keyof E]['value'], A[P]>,\n );\n },\n } as unknown as EnumExpose<A, E>;\n}\n\n/**\n * 声明一个枚举工厂函数\n * @template A - 枚举元数据附加类型,扩展自 EnumMetaAppend\n * @returns {Object} 返回包含 define 方法的对象\n *\n * @property {function} define - 定义枚举的函数\n * @template E - 枚举描述类型\n * @param {_CheckDefinition<E>} definition - 枚举定义对象\n * @returns {EnumExpose<A, E>} 返回枚举的完整暴露对象\n * @example\n * ```typescript\n * const createStatusEnum = declareEnum<{ label: string }>();\n * const Status = createStatusEnum.define({\n * Pending: { value: 0, label: '待处理' },\n * Approved: { value: 1, label: '已批准' }\n * });\n * ```\n */\nexport function declareEnum<A extends EnumMetaAppend>() {\n return {\n define<const E extends EnumDescription<A>>(definition: _CheckDefinition<E>): EnumExpose<A, E> {\n return defineEnum(definition);\n },\n };\n}\n"],"names":[],"mappings":"AAuFA,SAAS,WACP,YACkB;AACZ,QAAA,OAAO,OAAO,KAAK,UAAU;AAE5B,SAAA;AAAA,IACL,GAAG,CAAC,GAAG,OAAO,QAAQ,UAAU,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC7D,UAAI,IAAI,CAAC,EAAE,kBAAkB,IAAI,CAAC,GAAG;AACnC,cAAM,IAAI,MAAM,WAAW,GAAG,YAAY;AAAA,MAAA;AAGxC,UAAA,IAAI,WAAW,GAAG,GAAG;AACvB,cAAM,IAAI,MAAM,WAAW,GAAG,aAAa;AAAA,MAAA;AAIzC,UAAA,GAAG,IAAI,IAAI;AAEf,UAAI,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;AACxB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL;AAAA,IACA,cAAc,KAAK,IAAI,CAAC,SAAS;AAAA,MAC/B;AAAA,MACA,GAAG,WAAW,GAAG;AAAA,IAAA,EACjB;AAAA,IACF;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,IAAI,CAAC,QAAQ,WAAW,GAAc,EAAE,KAAK;AAAA,IAC1D,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ;AAElC,UAAI,GAAG,IAAI,WAAW,GAAG,EAAE;AACpB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL,UAAU,KAAK,OAAO,CAAC,KAAK,QAAQ;AAElC,UAAI,WAAW,GAAG,EAAE,KAAK,IAAI;AACtB,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,IACL,YAA+B,MAAS;AACtC,aAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAE/B,YAAI,GAAG,IAAI,WAAW,GAAG,EAAE,IAAI;AACxB,eAAA;AAAA,MACT,GAAG,EAAE;AAAA,IACP;AAAA,IACA,cAAiC,MAAS;AACxC,aAAO,KAAK;AAAA,QACV,CAAC,KAAK,QAAQ;AAER,cAAA,WAAW,GAAG,EAAE,KAAK,IAAI,WAAW,GAAG,EAAE,IAAI;AAC1C,iBAAA;AAAA,QACT;AAAA,QACA,CAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AACF;AAoBO,SAAS,cAAwC;AAC/C,SAAA;AAAA,IACL,OAA2C,YAAmD;AAC5F,aAAO,WAAW,UAAU;AAAA,IAAA;AAAA,EAEhC;AACF;"}
package/dist/env.cjs ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const type = require("./type.cjs");
4
+ function isBrowser() {
5
+ return typeof window !== "undefined" && typeof document !== "undefined";
6
+ }
7
+ function isNode() {
8
+ return typeof process !== "undefined" && !type.isNullish(process.versions) && !type.isNullish(process.versions.node);
9
+ }
10
+ function isWorker() {
11
+ return typeof self !== "undefined" && self.importScripts != null;
12
+ }
13
+ function isMacOS() {
14
+ return isBrowser() ? /^mac/i.test(navigator.platform) : isNode() ? /^darwin/i.test(process.platform) : false;
15
+ }
16
+ function isLinux() {
17
+ return isBrowser() ? /^linux/i.test(navigator.platform) : isNode() ? /^linux/i.test(process.platform) : false;
18
+ }
19
+ function isWindows() {
20
+ return isBrowser() ? /^win/i.test(navigator.platform) : isNode() ? /^win/i.test(process.platform) : false;
21
+ }
22
+ exports.isBrowser = isBrowser;
23
+ exports.isLinux = isLinux;
24
+ exports.isMacOS = isMacOS;
25
+ exports.isNode = isNode;
26
+ exports.isWindows = isWindows;
27
+ exports.isWorker = isWorker;
28
+ //# sourceMappingURL=env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.cjs","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":["isNullish"],"mappings":";;;AAMO,SAAS,YAAY;AAG1B,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAMO,SAAS,SAAS;AAGvB,SAAO,OAAO,YAAY,eAAe,CAACA,KAAU,UAAA,QAAQ,QAAQ,KAAK,CAACA,KAAA,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,62 +1,38 @@
1
- import { isNullish } from './type';
2
-
3
1
  /**
4
2
  * 判断当前环境是否为浏览器环境
5
3
  * @returns 如果是浏览器环境返回 true,否则返回 false
6
4
  */
7
- export function isBrowser() {
8
- if (IS_TEST) return TEST_MOCK.IS_BROWSER || false;
9
-
10
- return typeof window !== 'undefined' && typeof document !== 'undefined';
11
- }
12
-
5
+ export declare function isBrowser(): boolean;
13
6
  /**
14
7
  * 判断当前环境是否为 Node.js 环境
15
8
  * @returns 如果是 Node.js 环境返回 true,否则返回 false
16
9
  */
17
- export function isNode() {
18
- if (IS_TEST) return TEST_MOCK.IS_NODE || false;
19
-
20
- return typeof process !== 'undefined' && !isNullish(process.versions) && !isNullish(process.versions.node);
21
- }
22
-
10
+ export declare function isNode(): boolean;
23
11
  /**
24
12
  * 判断当前环境是否为 Web Worker 环境
25
13
  * @returns 如果是 Web Worker 环境返回 true,否则返回 false
26
14
  * @remarks
27
15
  * 使用 @ts-ignore 忽略 self 的类型检查,因为 self 在 Web Worker 中可用但在其他环境中可能未定义
28
16
  */
29
- export function isWorker() {
30
- // @ts-ignore
31
- return typeof self !== 'undefined' && self.importScripts != null;
32
- }
33
-
17
+ export declare function isWorker(): boolean;
34
18
  /**
35
19
  * 判断当前操作系统是否为 macOS
36
20
  * @returns 如果是 macOS 返回 true,否则返回 false
37
21
  * @remarks
38
22
  * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测
39
23
  */
40
- export function isMacOS() {
41
- return isBrowser() ? /^mac/i.test(navigator.platform) : isNode() ? /^darwin/i.test(process.platform) : false;
42
- }
43
-
24
+ export declare function isMacOS(): boolean;
44
25
  /**
45
26
  * 判断当前操作系统是否为 Linux
46
27
  * @returns 如果是 Linux 返回 true,否则返回 false
47
28
  * @remarks
48
29
  * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测
49
30
  */
50
- export function isLinux() {
51
- return isBrowser() ? /^linux/i.test(navigator.platform) : isNode() ? /^linux/i.test(process.platform) : false;
52
- }
53
-
31
+ export declare function isLinux(): boolean;
54
32
  /**
55
33
  * 判断当前操作系统是否为 Windows
56
34
  * @returns 如果是 Windows 返回 true,否则返回 false
57
35
  * @remarks
58
36
  * 在浏览器环境中通过 navigator.platform 检测,在 Node.js 环境中通过 process.platform 检测
59
37
  */
60
- export function isWindows() {
61
- return isBrowser() ? /^win/i.test(navigator.platform) : isNode() ? /^win/i.test(process.platform) : false;
62
- }
38
+ export declare function isWindows(): boolean;
package/dist/env.mjs ADDED
@@ -0,0 +1,28 @@
1
+ import { isNullish } from "./type.mjs";
2
+ function isBrowser() {
3
+ return typeof window !== "undefined" && typeof document !== "undefined";
4
+ }
5
+ function isNode() {
6
+ return typeof process !== "undefined" && !isNullish(process.versions) && !isNullish(process.versions.node);
7
+ }
8
+ function isWorker() {
9
+ return typeof self !== "undefined" && self.importScripts != null;
10
+ }
11
+ function isMacOS() {
12
+ return isBrowser() ? /^mac/i.test(navigator.platform) : isNode() ? /^darwin/i.test(process.platform) : false;
13
+ }
14
+ function isLinux() {
15
+ return isBrowser() ? /^linux/i.test(navigator.platform) : isNode() ? /^linux/i.test(process.platform) : false;
16
+ }
17
+ function isWindows() {
18
+ return isBrowser() ? /^win/i.test(navigator.platform) : isNode() ? /^win/i.test(process.platform) : false;
19
+ }
20
+ export {
21
+ isBrowser,
22
+ isLinux,
23
+ isMacOS,
24
+ isNode,
25
+ isWindows,
26
+ isWorker
27
+ };
28
+ //# sourceMappingURL=env.mjs.map
@@ -0,0 +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;"}
package/dist/error.cjs ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const type = require("./type.cjs");
4
+ function errorNormalize(throwError) {
5
+ return type.isError(throwError) ? throwError : new Error(String(type.isNullish(throwError) ? "" : throwError));
6
+ }
7
+ function errorAssign(error, source) {
8
+ return Object.assign(error, source);
9
+ }
10
+ exports.errorAssign = errorAssign;
11
+ exports.errorNormalize = errorNormalize;
12
+ //# sourceMappingURL=error.cjs.map
@@ -0,0 +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,6 +1,4 @@
1
- import { isError, isNullish } from './type';
2
- import type { AnyObject } from './types';
3
-
1
+ import { AnyObject } from './types';
4
2
  /**
5
3
  * 标准化处理 Error 对象,适用于 try-catch
6
4
  * @param throwError 接收抛出的错误字符串或者 Error 对象或字符串
@@ -9,12 +7,7 @@ import type { AnyObject } from './types';
9
7
  * const error = errorNormalize('这是一个错误');
10
8
  * console.log(error.message); // 输出: 这是一个错误
11
9
  */
12
- export function errorNormalize<E extends Error | unknown = unknown>(throwError: E) {
13
- return (
14
- isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? '' : throwError))
15
- ) as E extends Error ? E : Error;
16
- }
17
-
10
+ export declare function errorNormalize<E extends Error | unknown = unknown>(throwError: E): E extends Error ? E : Error;
18
11
  /**
19
12
  * 分配对象到 Error 对象上,适用于扩展 Error 实例,不影响原型和构造函数
20
13
  * @param {Error} error
@@ -26,6 +19,4 @@ export function errorNormalize<E extends Error | unknown = unknown>(throwError:
26
19
  * console.log(extendedError.code); // 输出: 404
27
20
  * console.log(extendedError.message); // 输出: 未找到资源
28
21
  */
29
- export function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E {
30
- return Object.assign(error, source) as Error & E;
31
- }
22
+ export declare function errorAssign<E extends AnyObject>(error: Error, source: E): Error & E;
package/dist/error.mjs ADDED
@@ -0,0 +1,12 @@
1
+ import { isError, isNullish } from "./type.mjs";
2
+ function errorNormalize(throwError) {
3
+ return isError(throwError) ? throwError : new Error(String(isNullish(throwError) ? "" : throwError));
4
+ }
5
+ function errorAssign(error, source) {
6
+ return Object.assign(error, source);
7
+ }
8
+ export {
9
+ errorAssign,
10
+ errorNormalize
11
+ };
12
+ //# sourceMappingURL=error.mjs.map
@@ -0,0 +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;"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ 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
+ };
20
+ }
21
+ exports.buildException = buildException;
22
+ //# sourceMappingURL=exception.cjs.map
@@ -0,0 +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;;"}