@taicode/common-base 3.7.5 → 3.7.7

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +7 -8
  3. package/output/batching-buffer/batching-buffer.d.ts +0 -133
  4. package/output/batching-buffer/batching-buffer.d.ts.map +0 -1
  5. package/output/batching-buffer/batching-buffer.js +0 -264
  6. package/output/batching-buffer/batching-buffer.test.d.ts +0 -2
  7. package/output/batching-buffer/batching-buffer.test.d.ts.map +0 -1
  8. package/output/batching-buffer/batching-buffer.test.js +0 -358
  9. package/output/batching-buffer/index.d.ts +0 -3
  10. package/output/batching-buffer/index.d.ts.map +0 -1
  11. package/output/batching-buffer/index.js +0 -1
  12. package/output/catch/catch.d.ts +0 -46
  13. package/output/catch/catch.d.ts.map +0 -1
  14. package/output/catch/catch.js +0 -48
  15. package/output/catch/catch.test.d.ts +0 -2
  16. package/output/catch/catch.test.d.ts.map +0 -1
  17. package/output/catch/catch.test.js +0 -43
  18. package/output/catch/index.d.ts +0 -2
  19. package/output/catch/index.d.ts.map +0 -1
  20. package/output/catch/index.js +0 -1
  21. package/output/color/color.d.ts +0 -6
  22. package/output/color/color.d.ts.map +0 -1
  23. package/output/color/color.js +0 -56
  24. package/output/color/color.test.d.ts +0 -2
  25. package/output/color/color.test.d.ts.map +0 -1
  26. package/output/color/color.test.js +0 -110
  27. package/output/color/index.d.ts +0 -2
  28. package/output/color/index.d.ts.map +0 -1
  29. package/output/color/index.js +0 -1
  30. package/output/debounce/debounce.d.ts +0 -7
  31. package/output/debounce/debounce.d.ts.map +0 -1
  32. package/output/debounce/debounce.js +0 -36
  33. package/output/debounce/debounce.test.d.ts +0 -2
  34. package/output/debounce/debounce.test.d.ts.map +0 -1
  35. package/output/debounce/debounce.test.js +0 -135
  36. package/output/debounce/index.d.ts +0 -2
  37. package/output/debounce/index.d.ts.map +0 -1
  38. package/output/debounce/index.js +0 -1
  39. package/output/disposer/disposer.d.ts +0 -8
  40. package/output/disposer/disposer.d.ts.map +0 -1
  41. package/output/disposer/disposer.js +0 -21
  42. package/output/disposer/disposer.test.d.ts +0 -2
  43. package/output/disposer/disposer.test.d.ts.map +0 -1
  44. package/output/disposer/disposer.test.js +0 -216
  45. package/output/disposer/index.d.ts +0 -2
  46. package/output/disposer/index.d.ts.map +0 -1
  47. package/output/disposer/index.js +0 -1
  48. package/output/error/error.d.ts +0 -128
  49. package/output/error/error.d.ts.map +0 -1
  50. package/output/error/error.js +0 -141
  51. package/output/error/error.test.d.ts +0 -2
  52. package/output/error/error.test.d.ts.map +0 -1
  53. package/output/error/error.test.js +0 -420
  54. package/output/error/index.d.ts +0 -3
  55. package/output/error/index.d.ts.map +0 -1
  56. package/output/error/index.js +0 -1
  57. package/output/event-emitter/event-emitter.d.ts +0 -33
  58. package/output/event-emitter/event-emitter.d.ts.map +0 -1
  59. package/output/event-emitter/event-emitter.js +0 -66
  60. package/output/event-emitter/event-emitter.test.d.ts +0 -2
  61. package/output/event-emitter/event-emitter.test.d.ts.map +0 -1
  62. package/output/event-emitter/event-emitter.test.js +0 -177
  63. package/output/event-emitter/index.d.ts +0 -2
  64. package/output/event-emitter/index.d.ts.map +0 -1
  65. package/output/event-emitter/index.js +0 -1
  66. package/output/flow-queue/flow-queue.d.ts +0 -486
  67. package/output/flow-queue/flow-queue.d.ts.map +0 -1
  68. package/output/flow-queue/flow-queue.js +0 -654
  69. package/output/flow-queue/flow-queue.test.d.ts +0 -2
  70. package/output/flow-queue/flow-queue.test.d.ts.map +0 -1
  71. package/output/flow-queue/flow-queue.test.js +0 -1205
  72. package/output/flow-queue/index.d.ts +0 -3
  73. package/output/flow-queue/index.d.ts.map +0 -1
  74. package/output/flow-queue/index.js +0 -3
  75. package/output/index.d.ts +0 -18
  76. package/output/index.d.ts.map +0 -1
  77. package/output/index.js +0 -26
  78. package/output/logger/formatter.d.ts +0 -70
  79. package/output/logger/formatter.d.ts.map +0 -1
  80. package/output/logger/formatter.js +0 -206
  81. package/output/logger/formatter.test.d.ts +0 -2
  82. package/output/logger/formatter.test.d.ts.map +0 -1
  83. package/output/logger/formatter.test.js +0 -296
  84. package/output/logger/index.d.ts +0 -4
  85. package/output/logger/index.d.ts.map +0 -1
  86. package/output/logger/index.js +0 -3
  87. package/output/logger/logger.d.ts +0 -64
  88. package/output/logger/logger.d.ts.map +0 -1
  89. package/output/logger/logger.js +0 -179
  90. package/output/logger/logger.test.d.ts +0 -2
  91. package/output/logger/logger.test.d.ts.map +0 -1
  92. package/output/logger/logger.test.js +0 -299
  93. package/output/logger/transport.d.ts +0 -124
  94. package/output/logger/transport.d.ts.map +0 -1
  95. package/output/logger/transport.js +0 -153
  96. package/output/logger/transport.test.d.ts +0 -2
  97. package/output/logger/transport.test.d.ts.map +0 -1
  98. package/output/logger/transport.test.js +0 -309
  99. package/output/lru-cache/index.d.ts +0 -2
  100. package/output/lru-cache/index.d.ts.map +0 -1
  101. package/output/lru-cache/index.js +0 -1
  102. package/output/lru-cache/lru-cache.d.ts +0 -22
  103. package/output/lru-cache/lru-cache.d.ts.map +0 -1
  104. package/output/lru-cache/lru-cache.js +0 -147
  105. package/output/lru-cache/lru-cache.test.d.ts +0 -2
  106. package/output/lru-cache/lru-cache.test.d.ts.map +0 -1
  107. package/output/lru-cache/lru-cache.test.js +0 -239
  108. package/output/number/index.d.ts +0 -2
  109. package/output/number/index.d.ts.map +0 -1
  110. package/output/number/index.js +0 -1
  111. package/output/number/number.d.ts +0 -2
  112. package/output/number/number.d.ts.map +0 -1
  113. package/output/number/number.js +0 -23
  114. package/output/number/number.test.d.ts +0 -2
  115. package/output/number/number.test.d.ts.map +0 -1
  116. package/output/number/number.test.js +0 -50
  117. package/output/object/index.d.ts +0 -2
  118. package/output/object/index.d.ts.map +0 -1
  119. package/output/object/index.js +0 -1
  120. package/output/object/object.d.ts +0 -7
  121. package/output/object/object.d.ts.map +0 -1
  122. package/output/object/object.js +0 -27
  123. package/output/object/object.test.d.ts +0 -2
  124. package/output/object/object.test.d.ts.map +0 -1
  125. package/output/object/object.test.js +0 -42
  126. package/output/ring-cache/index.d.ts +0 -6
  127. package/output/ring-cache/index.d.ts.map +0 -1
  128. package/output/ring-cache/index.js +0 -5
  129. package/output/ring-cache/ring-cache.d.ts +0 -125
  130. package/output/ring-cache/ring-cache.d.ts.map +0 -1
  131. package/output/ring-cache/ring-cache.js +0 -197
  132. package/output/ring-cache/ring-cache.test.d.ts +0 -2
  133. package/output/ring-cache/ring-cache.test.d.ts.map +0 -1
  134. package/output/ring-cache/ring-cache.test.js +0 -196
  135. package/output/service/index.d.ts +0 -2
  136. package/output/service/index.d.ts.map +0 -1
  137. package/output/service/index.js +0 -1
  138. package/output/service/service.d.ts +0 -6
  139. package/output/service/service.d.ts.map +0 -1
  140. package/output/service/service.js +0 -3
  141. package/output/string/index.d.ts +0 -2
  142. package/output/string/index.d.ts.map +0 -1
  143. package/output/string/index.js +0 -1
  144. package/output/string/string.d.ts +0 -3
  145. package/output/string/string.d.ts.map +0 -1
  146. package/output/string/string.js +0 -9
  147. package/output/string/string.test.d.ts +0 -2
  148. package/output/string/string.test.d.ts.map +0 -1
  149. package/output/string/string.test.js +0 -77
  150. package/output/throttle/index.d.ts +0 -2
  151. package/output/throttle/index.d.ts.map +0 -1
  152. package/output/throttle/index.js +0 -1
  153. package/output/throttle/throttle.d.ts +0 -12
  154. package/output/throttle/throttle.d.ts.map +0 -1
  155. package/output/throttle/throttle.js +0 -55
  156. package/output/throttle/throttle.test.d.ts +0 -2
  157. package/output/throttle/throttle.test.d.ts.map +0 -1
  158. package/output/throttle/throttle.test.js +0 -177
  159. package/output/ttl-cache/index.d.ts +0 -2
  160. package/output/ttl-cache/index.d.ts.map +0 -1
  161. package/output/ttl-cache/index.js +0 -1
  162. package/output/ttl-cache/ttl-cache.d.ts +0 -148
  163. package/output/ttl-cache/ttl-cache.d.ts.map +0 -1
  164. package/output/ttl-cache/ttl-cache.js +0 -313
  165. package/output/ttl-cache/ttl-cache.test.d.ts +0 -2
  166. package/output/ttl-cache/ttl-cache.test.d.ts.map +0 -1
  167. package/output/ttl-cache/ttl-cache.test.js +0 -222
@@ -1,420 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { UserError, SystemError } from './error.js';
3
- describe('UserError', () => {
4
- describe('constructor', () => {
5
- it('应该正确创建UserError实例', () => {
6
- const type = 'VALIDATION_ERROR';
7
- const message = '输入验证失败';
8
- const error = new UserError(type, undefined, message);
9
- expect(error).toBeInstanceOf(Error);
10
- expect(error).toBeInstanceOf(UserError);
11
- expect(error.name).toBe('UserError');
12
- expect(error.type).toBe(type);
13
- expect(error.message).toBe(message);
14
- });
15
- it('应该在未提供message时使用空字符串作为默认message', () => {
16
- const type = 'VALIDATION_ERROR';
17
- const error = new UserError(type);
18
- expect(error).toBeInstanceOf(Error);
19
- expect(error).toBeInstanceOf(UserError);
20
- expect(error.name).toBe('UserError');
21
- expect(error.type).toBe(type);
22
- expect(error.message).toBe('');
23
- });
24
- it('应该在提供undefined message时使用空字符串作为默认message', () => {
25
- const type = 'VALIDATION_ERROR';
26
- const error = new UserError(type, undefined);
27
- expect(error).toBeInstanceOf(Error);
28
- expect(error).toBeInstanceOf(UserError);
29
- expect(error.name).toBe('UserError');
30
- expect(error.type).toBe(type);
31
- expect(error.message).toBe('');
32
- });
33
- it('应该在提供空字符串message时保持空字符串', () => {
34
- const type = 'VALIDATION_ERROR';
35
- const error = new UserError(type, {}, '');
36
- expect(error).toBeInstanceOf(Error);
37
- expect(error).toBeInstanceOf(UserError);
38
- expect(error.name).toBe('UserError');
39
- expect(error.type).toBe(type);
40
- expect(error.message).toBe('');
41
- });
42
- it('应该支持ErrorOptions参数', () => {
43
- const type = 'VALIDATION_ERROR';
44
- const message = '输入验证失败';
45
- const cause = new Error('原始错误');
46
- const error = new UserError(type, { cause }, message);
47
- expect(error.cause).toBe(cause);
48
- });
49
- it('应该支持ErrorOptions参数且message为可选', () => {
50
- const type = 'VALIDATION_ERROR';
51
- const cause = new Error('原始错误');
52
- const error = new UserError(type, { cause });
53
- expect(error.cause).toBe(cause);
54
- expect(error.message).toBe('');
55
- });
56
- it('应该正确设置错误堆栈信息', () => {
57
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
58
- expect(error.stack).toBeDefined();
59
- expect(error.stack).toContain('UserError');
60
- });
61
- });
62
- describe('is', () => {
63
- it('应该正确识别UserError实例', () => {
64
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
65
- expect(UserError.is(error)).toBe(true);
66
- });
67
- it('应该正确识别非UserError实例', () => {
68
- const regularError = new Error('普通错误');
69
- const systemError = new SystemError('SYSTEM_ERROR', undefined, '系统错误');
70
- expect(UserError.is(regularError)).toBe(false);
71
- expect(UserError.is(systemError)).toBe(false);
72
- expect(UserError.is(null)).toBe(false);
73
- expect(UserError.is(undefined)).toBe(false);
74
- expect(UserError.is('字符串')).toBe(false);
75
- expect(UserError.is(123)).toBe(false);
76
- expect(UserError.is({})).toBe(false);
77
- });
78
- it('应该支持类型守卫功能', () => {
79
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
80
- if (UserError.is(error)) {
81
- // 在类型守卫内部,error的类型应该被正确推断
82
- expect(error.type).toBe('TEST_ERROR');
83
- expect(error.message).toBe('测试错误');
84
- expect(error.name).toBe('UserError');
85
- }
86
- });
87
- it('在原型链丢失的情况下仍能通过品牌标记正确识别', () => {
88
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
89
- // 模拟编译/序列化后原型链丢失的情况
90
- const plainObj = Object.create(null);
91
- Object.assign(plainObj, error);
92
- // 手动复制品牌标记(Symbol.for 在不同模块实例中指向同一个 Symbol)
93
- const brand = Symbol.for('@taicode/common/UserError');
94
- Object.defineProperty(plainObj, brand, { value: true });
95
- expect(plainObj instanceof UserError).toBe(false); // instanceof 失效
96
- expect(UserError.is(plainObj)).toBe(true); // 品牌标记仍然有效
97
- });
98
- });
99
- describe('继承行为', () => {
100
- it('应该正确继承Error的所有属性和方法', () => {
101
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
102
- expect(error.toString()).toContain('测试错误');
103
- expect(error.toString()).toContain('UserError');
104
- expect(error instanceof Error).toBe(true);
105
- });
106
- it('应该支持Error的标准用法', () => {
107
- const error = new UserError('TEST_ERROR', undefined, '测试错误');
108
- try {
109
- throw error;
110
- }
111
- catch (caught) {
112
- expect(caught).toBe(error);
113
- expect(caught).toBeInstanceOf(UserError);
114
- }
115
- });
116
- });
117
- });
118
- describe('SystemError', () => {
119
- describe('constructor', () => {
120
- it('应该正确创建SystemError实例', () => {
121
- const type = 'DATABASE_ERROR';
122
- const message = '数据库连接失败';
123
- const error = new SystemError(type, undefined, message);
124
- expect(error).toBeInstanceOf(Error);
125
- expect(error).toBeInstanceOf(SystemError);
126
- expect(error.name).toBe('SystemError');
127
- expect(error.type).toBe(type);
128
- expect(error.message).toBe(message);
129
- });
130
- it('应该在未提供message时使用空字符串作为默认message', () => {
131
- const type = 'DATABASE_ERROR';
132
- const error = new SystemError(type);
133
- expect(error).toBeInstanceOf(Error);
134
- expect(error).toBeInstanceOf(SystemError);
135
- expect(error.name).toBe('SystemError');
136
- expect(error.type).toBe(type);
137
- expect(error.message).toBe('');
138
- });
139
- it('应该在提供undefined message时使用空字符串作为默认message', () => {
140
- const type = 'DATABASE_ERROR';
141
- const error = new SystemError(type, undefined);
142
- expect(error).toBeInstanceOf(Error);
143
- expect(error).toBeInstanceOf(SystemError);
144
- expect(error.name).toBe('SystemError');
145
- expect(error.type).toBe(type);
146
- expect(error.message).toBe('');
147
- });
148
- it('应该在提供空字符串message时保持空字符串', () => {
149
- const type = 'DATABASE_ERROR';
150
- const error = new SystemError(type, {}, '');
151
- expect(error).toBeInstanceOf(Error);
152
- expect(error).toBeInstanceOf(SystemError);
153
- expect(error.name).toBe('SystemError');
154
- expect(error.type).toBe(type);
155
- expect(error.message).toBe('');
156
- });
157
- it('应该支持ErrorOptions参数', () => {
158
- const type = 'NETWORK_ERROR';
159
- const message = '网络请求失败';
160
- const cause = new Error('连接超时');
161
- const error = new SystemError(type, { cause }, message);
162
- expect(error.cause).toBe(cause);
163
- });
164
- it('应该支持ErrorOptions参数且message为可选', () => {
165
- const type = 'NETWORK_ERROR';
166
- const cause = new Error('连接超时');
167
- const error = new SystemError(type, { cause });
168
- expect(error.cause).toBe(cause);
169
- expect(error.message).toBe('');
170
- });
171
- it('应该正确设置错误堆栈信息', () => {
172
- const error = new SystemError('FILE_ERROR', undefined, '文件读取失败');
173
- expect(error.stack).toBeDefined();
174
- expect(error.stack).toContain('SystemError');
175
- });
176
- });
177
- describe('is', () => {
178
- it('应该正确识别SystemError实例', () => {
179
- const error = new SystemError('TEST_ERROR', undefined, '测试错误');
180
- expect(SystemError.is(error)).toBe(true);
181
- });
182
- it('应该正确识别非SystemError实例', () => {
183
- const regularError = new Error('普通错误');
184
- const userError = new UserError('USER_ERROR', undefined, '用户错误');
185
- expect(SystemError.is(regularError)).toBe(false);
186
- expect(SystemError.is(userError)).toBe(false);
187
- expect(SystemError.is(null)).toBe(false);
188
- expect(SystemError.is(undefined)).toBe(false);
189
- expect(SystemError.is('字符串')).toBe(false);
190
- expect(SystemError.is(123)).toBe(false);
191
- expect(SystemError.is({})).toBe(false);
192
- });
193
- it('应该支持类型守卫功能', () => {
194
- const error = new SystemError('DATABASE_ERROR', undefined, '数据库错误');
195
- if (SystemError.is(error)) {
196
- // 在类型守卫内部,error的类型应该被正确推断
197
- expect(error.type).toBe('DATABASE_ERROR');
198
- expect(error.message).toBe('数据库错误');
199
- expect(error.name).toBe('SystemError');
200
- }
201
- });
202
- it('在原型链丢失的情况下仍能通过品牌标记正确识别', () => {
203
- const error = new SystemError('TEST_ERROR', undefined, '测试错误');
204
- // 模拟编译/序列化后原型链丢失的情况
205
- const plainObj = Object.create(null);
206
- Object.assign(plainObj, error);
207
- const brand = Symbol.for('@taicode/common/SystemError');
208
- Object.defineProperty(plainObj, brand, { value: true });
209
- expect(plainObj instanceof SystemError).toBe(false); // instanceof 失效
210
- expect(SystemError.is(plainObj)).toBe(true); // 品牌标记仍然有效
211
- });
212
- });
213
- describe('继承行为', () => {
214
- it('应该正确继承Error的所有属性和方法', () => {
215
- const error = new SystemError('TEST_ERROR', undefined, '测试错误');
216
- expect(error.toString()).toContain('测试错误');
217
- expect(error.toString()).toContain('SystemError');
218
- expect(error instanceof Error).toBe(true);
219
- });
220
- it('应该支持Error的标准用法', () => {
221
- const error = new SystemError('TEST_ERROR', undefined, '测试错误');
222
- try {
223
- throw error;
224
- }
225
- catch (caught) {
226
- expect(caught).toBe(error);
227
- expect(caught).toBeInstanceOf(SystemError);
228
- }
229
- });
230
- });
231
- });
232
- describe('错误类型区分', () => {
233
- it('两种错误类型应该是不同的类', () => {
234
- const userError = new UserError('USER_ERROR', undefined, '用户错误');
235
- const systemError = new SystemError('SYSTEM_ERROR', undefined, '系统错误');
236
- // 每种错误只能被自己的类型检查函数识别
237
- expect(UserError.is(userError)).toBe(true);
238
- expect(SystemError.is(userError)).toBe(false);
239
- expect(UserError.is(systemError)).toBe(false);
240
- expect(SystemError.is(systemError)).toBe(true);
241
- });
242
- it('所有错误类型都应该是Error的实例', () => {
243
- const userError = new UserError('USER_ERROR', undefined, '用户错误');
244
- const systemError = new SystemError('SYSTEM_ERROR', undefined, '系统错误');
245
- expect(userError instanceof Error).toBe(true);
246
- expect(systemError instanceof Error).toBe(true);
247
- });
248
- it('define 创建的 BoundError 也能被基类 is 方法识别', () => {
249
- const MyUserError = UserError.define({
250
- 'test': {}
251
- });
252
- const MySystemError = SystemError.define({
253
- 'test': {}
254
- });
255
- const userError = new MyUserError('test', { msg: 'hello' }, '测试');
256
- const systemError = new MySystemError('test', { msg: 'world' }, '测试');
257
- // 基类的 is 方法应该能识别 define 创建的子类实例
258
- expect(UserError.is(userError)).toBe(true);
259
- expect(SystemError.is(systemError)).toBe(true);
260
- // 但不会互相匹配
261
- expect(UserError.is(systemError)).toBe(false);
262
- expect(SystemError.is(userError)).toBe(false);
263
- });
264
- });
265
- describe('泛型类型支持', () => {
266
- it('UserError应该支持字符串字面量类型', () => {
267
- const error = new UserError('REQUIRED_FIELD', {}, '字段必填');
268
- expect(error.type).toBe('REQUIRED_FIELD');
269
- expect(UserError.is(error)).toBe(true);
270
- });
271
- it('SystemError应该支持字符串字面量类型', () => {
272
- const error = new SystemError('DATABASE_ERROR', {}, '数据库连接失败');
273
- expect(error.type).toBe('DATABASE_ERROR');
274
- expect(SystemError.is(error)).toBe(true);
275
- });
276
- });
277
- describe('define 工厂方法', () => {
278
- describe('UserError.define', () => {
279
- it('应该定义一个绑定了特定错误类型的 UserError 类', () => {
280
- const MyUserError = UserError.define({
281
- 'validation-failed': {},
282
- 'permission-denied': {},
283
- 'not-found': {}
284
- });
285
- const error = new MyUserError('validation-failed', {
286
- field: 'email',
287
- value: 'invalid@'
288
- }, '验证失败');
289
- expect(error).toBeInstanceOf(Error);
290
- expect(error.name).toBe('UserError');
291
- expect(error.type).toBe('validation-failed');
292
- expect(error.message).toBe('验证失败');
293
- expect(error.context).toEqual({ field: 'email', value: 'invalid@' });
294
- });
295
- it('应该支持 is 类型守卫', () => {
296
- const MyUserError = UserError.define({
297
- 'test-error': {}
298
- });
299
- const error = new MyUserError('test-error', { code: 123 }, '测试错误');
300
- expect(MyUserError.is(error)).toBe(true);
301
- expect(MyUserError.is(new Error('普通错误'))).toBe(false);
302
- expect(MyUserError.is(null)).toBe(false);
303
- });
304
- it('应该支持多次调用 define 定义不同的错误类', () => {
305
- const ValidationError = UserError.define({
306
- 'required': {},
307
- 'invalid': {}
308
- });
309
- const AuthError = UserError.define({
310
- 'unauthorized': {},
311
- 'forbidden': {}
312
- });
313
- const validationError = new ValidationError('required', { field: 'username' }, '必填字段');
314
- const authError = new AuthError('unauthorized', { reason: 'token expired' }, '未授权');
315
- expect(validationError.type).toBe('required');
316
- expect(authError.type).toBe('unauthorized');
317
- expect(ValidationError.is(validationError)).toBe(true);
318
- expect(ValidationError.is(authError)).toBe(false); // 不同的类不会互相识别
319
- expect(AuthError.is(authError)).toBe(true);
320
- expect(AuthError.is(validationError)).toBe(false); // 不同的类不会互相识别
321
- });
322
- it('应该支持不传 context 参数', () => {
323
- const MyUserError = UserError.define({
324
- 'simple-error': {}
325
- });
326
- const error = new MyUserError('simple-error', undefined, '简单错误');
327
- expect(error.type).toBe('simple-error');
328
- expect(error.message).toBe('简单错误');
329
- expect(error.context).toBeUndefined();
330
- });
331
- it('应该支持不传 message 参数', () => {
332
- const MyUserError = UserError.define({
333
- 'no-message': {}
334
- });
335
- const error = new MyUserError('no-message');
336
- expect(error.type).toBe('no-message');
337
- expect(error.message).toBe('');
338
- });
339
- it('应该暴露所有定义的错误类型', () => {
340
- const MyUserError = UserError.define({
341
- 'validation-failed': {},
342
- 'permission-denied': {},
343
- 'not-found': {}
344
- });
345
- expect(MyUserError.types).toEqual(['validation-failed', 'permission-denied', 'not-found']);
346
- expect(MyUserError.types).toHaveLength(3);
347
- });
348
- });
349
- describe('SystemError.define', () => {
350
- it('应该定义一个绑定了特定错误类型的 SystemError 类', () => {
351
- const MySystemError = SystemError.define({
352
- 'database-error': {},
353
- 'network-error': {},
354
- 'service-unavailable': {}
355
- });
356
- const error = new MySystemError('database-error', {
357
- query: 'SELECT * FROM users',
358
- table: 'users'
359
- }, '数据库错误');
360
- expect(error).toBeInstanceOf(Error);
361
- expect(error.name).toBe('SystemError');
362
- expect(error.type).toBe('database-error');
363
- expect(error.message).toBe('数据库错误');
364
- expect(error.context).toEqual({ query: 'SELECT * FROM users', table: 'users' });
365
- });
366
- it('应该支持 is 类型守卫', () => {
367
- const MySystemError = SystemError.define({
368
- 'test-error': {}
369
- });
370
- const error = new MySystemError('test-error', { code: 500 }, '测试错误');
371
- expect(MySystemError.is(error)).toBe(true);
372
- expect(MySystemError.is(new Error('普通错误'))).toBe(false);
373
- expect(MySystemError.is(null)).toBe(false);
374
- });
375
- it('应该支持多次调用 define 定义不同的错误类', () => {
376
- const DatabaseError = SystemError.define({
377
- 'connection-failed': {},
378
- 'query-timeout': {}
379
- });
380
- const NetworkError = SystemError.define({
381
- 'request-failed': {},
382
- 'timeout': {}
383
- });
384
- const dbError = new DatabaseError('connection-failed', { host: 'localhost', port: 5432 }, '连接失败');
385
- const netError = new NetworkError('request-failed', { url: '/api/data', method: 'GET' }, '请求失败');
386
- expect(dbError.type).toBe('connection-failed');
387
- expect(netError.type).toBe('request-failed');
388
- expect(DatabaseError.is(dbError)).toBe(true);
389
- expect(DatabaseError.is(netError)).toBe(false); // 不同的类不会互相识别
390
- expect(NetworkError.is(netError)).toBe(true);
391
- expect(NetworkError.is(dbError)).toBe(false); // 不同的类不会互相识别
392
- });
393
- it('应该支持不传 context 参数', () => {
394
- const MySystemError = SystemError.define({
395
- 'simple-error': {}
396
- });
397
- const error = new MySystemError('simple-error', undefined, '简单错误');
398
- expect(error.type).toBe('simple-error');
399
- expect(error.message).toBe('简单错误');
400
- expect(error.context).toBeUndefined();
401
- });
402
- it('应该支持不传 message 参数', () => {
403
- const MySystemError = SystemError.define({
404
- 'no-message': {}
405
- });
406
- const error = new MySystemError('no-message');
407
- expect(error.type).toBe('no-message');
408
- expect(error.message).toBe('');
409
- });
410
- it('应该暴露所有定义的错误类型', () => {
411
- const MySystemError = SystemError.define({
412
- 'database-error': {},
413
- 'network-error': {},
414
- 'service-unavailable': {}
415
- });
416
- expect(MySystemError.types).toEqual(['database-error', 'network-error', 'service-unavailable']);
417
- expect(MySystemError.types).toHaveLength(3);
418
- });
419
- });
420
- });
@@ -1,3 +0,0 @@
1
- export { UserError, SystemError } from './error.js';
2
- export type { ErrorContext } from './error.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/error/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,YAAY,EACb,MAAM,YAAY,CAAA"}
@@ -1 +0,0 @@
1
- export { UserError, SystemError } from './error.js';
@@ -1,33 +0,0 @@
1
- type OffFn = () => void;
2
- type Listener<T = unknown> = (data: T) => void;
3
- export declare class EventEmitter<Events extends object = object> {
4
- private listeners;
5
- constructor();
6
- /**
7
- * 订阅事件
8
- * @param type 事件类型
9
- * @param listener 回调函数
10
- */
11
- on<K extends keyof Events>(type: K, listener: Listener<Events[K]>): OffFn;
12
- /**
13
- * 取消订阅
14
- * @param type 事件类型
15
- * @param listener 要移除的回调函数(可选)
16
- */
17
- off<K extends keyof Events>(type: K, listener?: Listener<Events[K]>): void;
18
- /**
19
- * 触发事件
20
- * @param type 事件类型
21
- * @param data 要传递的数据
22
- */
23
- emit<K extends keyof Events>(type: K, data: Events[K]): void;
24
- /**
25
- * 一次性订阅
26
- * @param type 事件类型
27
- * @param listener 回调函数
28
- */
29
- once<K extends keyof Events>(type: K, listener: Listener<Events[K]>): void;
30
- cleanup(): void;
31
- }
32
- export type { OffFn, Listener };
33
- //# sourceMappingURL=event-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../source/event-emitter/event-emitter.ts"],"names":[],"mappings":"AAAA,KAAK,KAAK,GAAG,MAAM,IAAI,CAAA;AACvB,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAE9C,qBAAa,YAAY,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM;IACtD,OAAO,CAAC,SAAS,CAAsD;;IAUvE;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;IASzE;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAc1E;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ5D;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ1E,OAAO;CAGR;AAED,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA"}
@@ -1,66 +0,0 @@
1
- export class EventEmitter {
2
- listeners = {};
3
- constructor() {
4
- this.on = this.on.bind(this);
5
- this.off = this.off.bind(this);
6
- this.once = this.once.bind(this);
7
- this.emit = this.emit.bind(this);
8
- this.cleanup = this.cleanup.bind(this);
9
- }
10
- /**
11
- * 订阅事件
12
- * @param type 事件类型
13
- * @param listener 回调函数
14
- */
15
- on(type, listener) {
16
- if (!this.listeners[type]) {
17
- this.listeners[type] = [];
18
- }
19
- this.listeners[type].push(listener);
20
- return () => this.off(type, listener);
21
- }
22
- /**
23
- * 取消订阅
24
- * @param type 事件类型
25
- * @param listener 要移除的回调函数(可选)
26
- */
27
- off(type, listener) {
28
- if (!this.listeners[type])
29
- return;
30
- if (!listener) {
31
- // 移除该事件的所有监听器
32
- delete this.listeners[type];
33
- }
34
- else {
35
- // 移除特定监听器
36
- this.listeners[type] = this.listeners[type].filter((fn) => fn !== listener);
37
- }
38
- }
39
- /**
40
- * 触发事件
41
- * @param type 事件类型
42
- * @param data 要传递的数据
43
- */
44
- emit(type, data) {
45
- const listeners = this.listeners[type];
46
- // 复制数组避免回调中取消订阅导致的遍历问题
47
- if (listeners) {
48
- listeners.slice().forEach((fn) => fn(data));
49
- }
50
- }
51
- /**
52
- * 一次性订阅
53
- * @param type 事件类型
54
- * @param listener 回调函数
55
- */
56
- once(type, listener) {
57
- const onceWrapper = (data) => {
58
- listener(data);
59
- this.off(type, onceWrapper);
60
- };
61
- this.on(type, onceWrapper);
62
- }
63
- cleanup() {
64
- this.listeners = {};
65
- }
66
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=event-emitter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter.test.d.ts","sourceRoot":"","sources":["../../source/event-emitter/event-emitter.test.ts"],"names":[],"mappings":""}