@taicode/common-base 3.0.1 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/output/batching-buffer/batching-buffer.test.js +1 -1
- package/output/batching-buffer/index.d.ts +2 -2
- package/output/batching-buffer/index.d.ts.map +1 -1
- package/output/batching-buffer/index.js +1 -1
- package/output/catch/catch.test.js +1 -1
- package/output/catch/index.d.ts +1 -1
- package/output/catch/index.d.ts.map +1 -1
- package/output/catch/index.js +1 -1
- package/output/color/color.d.ts.map +1 -1
- package/output/color/color.js +0 -1
- package/output/color/color.test.js +1 -1
- package/output/color/index.d.ts +1 -1
- package/output/color/index.d.ts.map +1 -1
- package/output/color/index.js +1 -1
- package/output/debounce/debounce.test.js +1 -1
- package/output/debounce/index.d.ts +1 -1
- package/output/debounce/index.d.ts.map +1 -1
- package/output/debounce/index.js +1 -1
- package/output/disposer/disposer.d.ts +4 -2
- package/output/disposer/disposer.d.ts.map +1 -1
- package/output/disposer/disposer.js +7 -5
- package/output/disposer/disposer.test.js +73 -49
- package/output/disposer/index.d.ts +1 -1
- package/output/disposer/index.d.ts.map +1 -1
- package/output/disposer/index.js +1 -1
- package/output/error/error.test.js +1 -1
- package/output/error/index.d.ts +2 -2
- package/output/error/index.d.ts.map +1 -1
- package/output/error/index.js +1 -1
- package/output/event-emitter/event-emitter.test.js +1 -1
- package/output/event-emitter/index.d.ts +1 -1
- package/output/event-emitter/index.d.ts.map +1 -1
- package/output/event-emitter/index.js +1 -1
- package/output/flow-queue/flow-queue.d.ts.map +1 -1
- package/output/flow-queue/flow-queue.js +4 -5
- package/output/flow-queue/flow-queue.test.js +7 -6
- package/output/flow-queue/index.d.ts +2 -2
- package/output/flow-queue/index.d.ts.map +1 -1
- package/output/flow-queue/index.js +1 -1
- package/output/index.d.ts +17 -17
- package/output/index.d.ts.map +1 -1
- package/output/index.js +17 -17
- package/output/logger/formatter.js +1 -1
- package/output/logger/formatter.test.js +3 -3
- package/output/logger/index.d.ts +3 -3
- package/output/logger/index.d.ts.map +1 -1
- package/output/logger/index.js +3 -3
- package/output/logger/logger.d.ts +2 -2
- package/output/logger/logger.d.ts.map +1 -1
- package/output/logger/logger.js +1 -1
- package/output/logger/logger.test.js +4 -4
- package/output/logger/transport.d.ts +1 -1
- package/output/logger/transport.d.ts.map +1 -1
- package/output/logger/transport.js +1 -1
- package/output/logger/transport.test.js +2 -2
- package/output/lru-cache/index.d.ts +1 -1
- package/output/lru-cache/index.d.ts.map +1 -1
- package/output/lru-cache/index.js +1 -1
- package/output/lru-cache/lru-cache.test.js +1 -1
- package/output/number/index.d.ts +1 -1
- package/output/number/index.d.ts.map +1 -1
- package/output/number/index.js +1 -1
- package/output/number/number.test.js +1 -1
- package/output/object/index.d.ts +1 -1
- package/output/object/index.d.ts.map +1 -1
- package/output/object/index.js +1 -1
- package/output/object/object.test.js +1 -1
- package/output/ring-cache/index.d.ts +1 -1
- package/output/ring-cache/index.d.ts.map +1 -1
- package/output/ring-cache/index.js +1 -1
- package/output/ring-cache/ring-cache.test.js +5 -4
- package/output/service/index.d.ts +1 -1
- package/output/service/index.d.ts.map +1 -1
- package/output/service/index.js +1 -1
- package/output/string/index.d.ts +1 -1
- package/output/string/index.d.ts.map +1 -1
- package/output/string/index.js +1 -1
- package/output/string/string.test.js +1 -1
- package/output/throttle/index.d.ts +1 -1
- package/output/throttle/index.d.ts.map +1 -1
- package/output/throttle/index.js +1 -1
- package/output/throttle/throttle.test.js +1 -1
- package/output/ttl-cache/index.d.ts +1 -1
- package/output/ttl-cache/index.d.ts.map +1 -1
- package/output/ttl-cache/index.js +1 -1
- package/output/ttl-cache/ttl-cache.test.js +1 -1
- package/package.json +10 -8
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { BatchingBuffer } from './batching-buffer';
|
|
2
|
-
export type { BatchingBufferOptions } from './batching-buffer';
|
|
1
|
+
export { BatchingBuffer } from './batching-buffer.js';
|
|
2
|
+
export type { BatchingBufferOptions } from './batching-buffer.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/batching-buffer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/batching-buffer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { BatchingBuffer } from './batching-buffer';
|
|
1
|
+
export { BatchingBuffer } from './batching-buffer.js';
|
package/output/catch/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './catch';
|
|
1
|
+
export * from './catch.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/catch/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/catch/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
|
package/output/catch/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './catch';
|
|
1
|
+
export * from './catch.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../source/color/color.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAcvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,IAMpC,QAAQ,SAAS,EAAE,QAAO,MAAY,
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../source/color/color.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAcvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,IAMpC,QAAQ,SAAS,EAAE,QAAO,MAAY,YAM/C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAO/E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAgBrE,OAAO,MAAM,KAAG,MAAM,CAgB/B;AAED,YAAY,EAAE,SAAS,EAAE,CAAA"}
|
package/output/color/color.js
CHANGED
|
@@ -14,7 +14,6 @@ export function getRandomColor(seed) {
|
|
|
14
14
|
const lightness = 45; // 明度(0-100)
|
|
15
15
|
return (offset, range = 360) => {
|
|
16
16
|
const normalizedOffset = normalizeSeed(offset);
|
|
17
|
-
console.log('normalizedOffset', offset, normalizedOffset);
|
|
18
17
|
const finalHue = (hue + normalizedOffset) % range;
|
|
19
18
|
return `hsl(${finalHue}, ${saturation}%, ${lightness}%)`;
|
|
20
19
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { getRandomColor, getRandomColors, interpolateColors } from './color';
|
|
2
|
+
import { getRandomColor, getRandomColors, interpolateColors } from './color.js';
|
|
3
3
|
describe('getRandomColor 函数', () => {
|
|
4
4
|
// Mock console.log to avoid noise in tests
|
|
5
5
|
beforeEach(() => {
|
package/output/color/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './color';
|
|
1
|
+
export * from './color.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/color/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/color/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
|
package/output/color/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './color';
|
|
1
|
+
export * from './color.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './debounce';
|
|
1
|
+
export * from './debounce.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/debounce/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/debounce/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
package/output/debounce/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './debounce';
|
|
1
|
+
export * from './debounce.js';
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
type CleanupFunction = () => unknown | Promise<unknown>;
|
|
1
2
|
export declare class Disposer {
|
|
2
3
|
private cleanupFunctions;
|
|
3
|
-
addDisposer(cleanupFn:
|
|
4
|
-
dispose(): void
|
|
4
|
+
addDisposer(cleanupFn: CleanupFunction): void;
|
|
5
|
+
dispose(): Promise<void>;
|
|
5
6
|
}
|
|
7
|
+
export {};
|
|
6
8
|
//# sourceMappingURL=disposer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disposer.d.ts","sourceRoot":"","sources":["../../source/disposer/disposer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"disposer.d.ts","sourceRoot":"","sources":["../../source/disposer/disposer.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEvD,qBAAa,QAAQ;IACnB,OAAO,CAAC,gBAAgB,CAAwB;IAGhD,WAAW,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAKvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logger } from '../logger/index.js';
|
|
1
2
|
export class Disposer {
|
|
2
3
|
cleanupFunctions = [];
|
|
3
4
|
// 添加清理函数
|
|
@@ -5,15 +6,16 @@ export class Disposer {
|
|
|
5
6
|
this.cleanupFunctions.push(cleanupFn);
|
|
6
7
|
}
|
|
7
8
|
// 执行所有清理函数
|
|
8
|
-
dispose() {
|
|
9
|
-
|
|
9
|
+
async dispose() {
|
|
10
|
+
const cleanupFunctions = this.cleanupFunctions;
|
|
11
|
+
this.cleanupFunctions = [];
|
|
12
|
+
for (const cleanupFn of cleanupFunctions) {
|
|
10
13
|
try {
|
|
11
|
-
cleanupFn();
|
|
14
|
+
await cleanupFn();
|
|
12
15
|
}
|
|
13
16
|
catch (error) {
|
|
14
|
-
|
|
17
|
+
logger.error('Error during cleanup:', error);
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
|
-
this.cleanupFunctions = []; // 清空清理函数列表
|
|
18
20
|
}
|
|
19
21
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { Disposer } from './disposer';
|
|
2
|
+
import { Disposer } from './disposer.js';
|
|
3
|
+
import { logger } from '../logger/index.js';
|
|
3
4
|
describe('Disposer', () => {
|
|
4
5
|
let disposer;
|
|
5
6
|
beforeEach(() => {
|
|
@@ -12,19 +13,19 @@ describe('Disposer', () => {
|
|
|
12
13
|
disposer.addDisposer(cleanupFn);
|
|
13
14
|
}).not.toThrow();
|
|
14
15
|
});
|
|
15
|
-
it('应该能够添加多个清理函数', () => {
|
|
16
|
+
it('应该能够添加多个清理函数', async () => {
|
|
16
17
|
const cleanupFn1 = vi.fn();
|
|
17
18
|
const cleanupFn2 = vi.fn();
|
|
18
19
|
const cleanupFn3 = vi.fn();
|
|
19
20
|
disposer.addDisposer(cleanupFn1);
|
|
20
21
|
disposer.addDisposer(cleanupFn2);
|
|
21
22
|
disposer.addDisposer(cleanupFn3);
|
|
22
|
-
disposer.dispose();
|
|
23
|
+
await disposer.dispose();
|
|
23
24
|
expect(cleanupFn1).toHaveBeenCalledOnce();
|
|
24
25
|
expect(cleanupFn2).toHaveBeenCalledOnce();
|
|
25
26
|
expect(cleanupFn3).toHaveBeenCalledOnce();
|
|
26
27
|
});
|
|
27
|
-
it('应该能够添加返回不同类型的清理函数', () => {
|
|
28
|
+
it('应该能够添加返回不同类型的清理函数', async () => {
|
|
28
29
|
const voidFn = vi.fn(() => { });
|
|
29
30
|
const stringFn = vi.fn(() => 'cleanup result');
|
|
30
31
|
const numberFn = vi.fn(() => 42);
|
|
@@ -33,7 +34,7 @@ describe('Disposer', () => {
|
|
|
33
34
|
disposer.addDisposer(stringFn);
|
|
34
35
|
disposer.addDisposer(numberFn);
|
|
35
36
|
disposer.addDisposer(promiseFn);
|
|
36
|
-
disposer.dispose();
|
|
37
|
+
await disposer.dispose();
|
|
37
38
|
expect(voidFn).toHaveBeenCalled();
|
|
38
39
|
expect(stringFn).toHaveBeenCalled();
|
|
39
40
|
expect(numberFn).toHaveBeenCalled();
|
|
@@ -41,111 +42,124 @@ describe('Disposer', () => {
|
|
|
41
42
|
});
|
|
42
43
|
});
|
|
43
44
|
describe('dispose', () => {
|
|
44
|
-
it('应该执行所有清理函数', () => {
|
|
45
|
+
it('应该执行所有清理函数', async () => {
|
|
45
46
|
const cleanupFn1 = vi.fn();
|
|
46
47
|
const cleanupFn2 = vi.fn();
|
|
47
48
|
const cleanupFn3 = vi.fn();
|
|
48
49
|
disposer.addDisposer(cleanupFn1);
|
|
49
50
|
disposer.addDisposer(cleanupFn2);
|
|
50
51
|
disposer.addDisposer(cleanupFn3);
|
|
51
|
-
disposer.dispose();
|
|
52
|
+
await disposer.dispose();
|
|
52
53
|
expect(cleanupFn1).toHaveBeenCalledOnce();
|
|
53
54
|
expect(cleanupFn2).toHaveBeenCalledOnce();
|
|
54
55
|
expect(cleanupFn3).toHaveBeenCalledOnce();
|
|
55
56
|
});
|
|
56
|
-
it('应该按添加顺序执行清理函数', () => {
|
|
57
|
+
it('应该按添加顺序执行清理函数', async () => {
|
|
57
58
|
const executionOrder = [];
|
|
58
59
|
disposer.addDisposer(() => executionOrder.push(1));
|
|
59
60
|
disposer.addDisposer(() => executionOrder.push(2));
|
|
60
61
|
disposer.addDisposer(() => executionOrder.push(3));
|
|
61
|
-
disposer.dispose();
|
|
62
|
+
await disposer.dispose();
|
|
62
63
|
expect(executionOrder).toEqual([1, 2, 3]);
|
|
63
64
|
});
|
|
64
|
-
it('
|
|
65
|
+
it('应该按添加顺序执行异步清理函数', async () => {
|
|
66
|
+
const executionOrder = [];
|
|
67
|
+
disposer.addDisposer(async () => {
|
|
68
|
+
await Promise.resolve();
|
|
69
|
+
executionOrder.push(1);
|
|
70
|
+
});
|
|
71
|
+
disposer.addDisposer(async () => {
|
|
72
|
+
await Promise.resolve();
|
|
73
|
+
executionOrder.push(2);
|
|
74
|
+
});
|
|
75
|
+
disposer.addDisposer(async () => {
|
|
76
|
+
await Promise.resolve();
|
|
77
|
+
executionOrder.push(3);
|
|
78
|
+
});
|
|
79
|
+
await disposer.dispose();
|
|
80
|
+
expect(executionOrder).toEqual([1, 2, 3]);
|
|
81
|
+
});
|
|
82
|
+
it('应该处理清理函数中的错误', async () => {
|
|
65
83
|
const workingFn1 = vi.fn();
|
|
66
84
|
const errorFn = vi.fn(() => {
|
|
67
85
|
throw new Error('Cleanup error');
|
|
68
86
|
});
|
|
69
87
|
const workingFn2 = vi.fn();
|
|
70
|
-
// 模拟
|
|
71
|
-
const
|
|
88
|
+
// 模拟 logger.error
|
|
89
|
+
const loggerErrorSpy = vi.spyOn(logger, 'error').mockImplementation(() => { });
|
|
72
90
|
disposer.addDisposer(workingFn1);
|
|
73
91
|
disposer.addDisposer(errorFn);
|
|
74
92
|
disposer.addDisposer(workingFn2);
|
|
75
93
|
// dispose 不应该抛出错误
|
|
76
|
-
expect(()
|
|
77
|
-
disposer.dispose();
|
|
78
|
-
}).not.toThrow();
|
|
94
|
+
await expect(disposer.dispose()).resolves.toBeUndefined();
|
|
79
95
|
// 所有函数都应该被调用
|
|
80
96
|
expect(workingFn1).toHaveBeenCalled();
|
|
81
97
|
expect(errorFn).toHaveBeenCalled();
|
|
82
98
|
expect(workingFn2).toHaveBeenCalled();
|
|
83
99
|
// 错误应该被记录
|
|
84
|
-
expect(
|
|
85
|
-
|
|
100
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith('Error during cleanup:', expect.any(Error));
|
|
101
|
+
loggerErrorSpy.mockRestore();
|
|
86
102
|
});
|
|
87
|
-
it('应该在执行后清空清理函数列表', () => {
|
|
103
|
+
it('应该在执行后清空清理函数列表', async () => {
|
|
88
104
|
const cleanupFn = vi.fn();
|
|
89
105
|
disposer.addDisposer(cleanupFn);
|
|
90
|
-
disposer.dispose();
|
|
106
|
+
await disposer.dispose();
|
|
91
107
|
expect(cleanupFn).toHaveBeenCalledOnce();
|
|
92
108
|
// 再次调用 dispose 不应该执行任何函数
|
|
93
|
-
disposer.dispose();
|
|
109
|
+
await disposer.dispose();
|
|
94
110
|
expect(cleanupFn).toHaveBeenCalledOnce();
|
|
95
111
|
});
|
|
96
|
-
it('应该能够在清空后重新添加清理函数', () => {
|
|
112
|
+
it('应该能够在清空后重新添加清理函数', async () => {
|
|
97
113
|
const firstCleanup = vi.fn();
|
|
98
114
|
const secondCleanup = vi.fn();
|
|
99
115
|
disposer.addDisposer(firstCleanup);
|
|
100
|
-
disposer.dispose();
|
|
116
|
+
await disposer.dispose();
|
|
101
117
|
disposer.addDisposer(secondCleanup);
|
|
102
|
-
disposer.dispose();
|
|
118
|
+
await disposer.dispose();
|
|
103
119
|
expect(firstCleanup).toHaveBeenCalledOnce();
|
|
104
120
|
expect(secondCleanup).toHaveBeenCalledOnce();
|
|
105
121
|
});
|
|
106
|
-
it('应该在没有清理函数时安全执行', () => {
|
|
107
|
-
expect(()
|
|
108
|
-
disposer.dispose();
|
|
109
|
-
}).not.toThrow();
|
|
122
|
+
it('应该在没有清理函数时安全执行', async () => {
|
|
123
|
+
await expect(disposer.dispose()).resolves.toBeUndefined();
|
|
110
124
|
});
|
|
111
|
-
it('应该能够多次调用 dispose', () => {
|
|
125
|
+
it('应该能够多次调用 dispose', async () => {
|
|
112
126
|
const cleanupFn = vi.fn();
|
|
113
127
|
disposer.addDisposer(cleanupFn);
|
|
114
|
-
disposer.dispose();
|
|
115
|
-
disposer.dispose();
|
|
116
|
-
disposer.dispose();
|
|
128
|
+
await disposer.dispose();
|
|
129
|
+
await disposer.dispose();
|
|
130
|
+
await disposer.dispose();
|
|
117
131
|
expect(cleanupFn).toHaveBeenCalledOnce();
|
|
118
132
|
});
|
|
119
133
|
});
|
|
120
134
|
describe('实际使用场景', () => {
|
|
121
|
-
it('应该能够清理事件监听器', () => {
|
|
135
|
+
it('应该能够清理事件监听器', async () => {
|
|
122
136
|
const removeEventListener = vi.fn();
|
|
123
137
|
const unsubscribe = vi.fn();
|
|
124
138
|
disposer.addDisposer(removeEventListener);
|
|
125
139
|
disposer.addDisposer(unsubscribe);
|
|
126
|
-
disposer.dispose();
|
|
140
|
+
await disposer.dispose();
|
|
127
141
|
expect(removeEventListener).toHaveBeenCalled();
|
|
128
142
|
expect(unsubscribe).toHaveBeenCalled();
|
|
129
143
|
});
|
|
130
|
-
it('应该能够清理定时器', () => {
|
|
144
|
+
it('应该能够清理定时器', async () => {
|
|
131
145
|
const clearTimeout = vi.fn();
|
|
132
146
|
const clearInterval = vi.fn();
|
|
133
147
|
disposer.addDisposer(() => clearTimeout(123));
|
|
134
148
|
disposer.addDisposer(() => clearInterval(456));
|
|
135
|
-
disposer.dispose();
|
|
149
|
+
await disposer.dispose();
|
|
136
150
|
expect(clearTimeout).toHaveBeenCalledWith(123);
|
|
137
151
|
expect(clearInterval).toHaveBeenCalledWith(456);
|
|
138
152
|
});
|
|
139
|
-
it('应该能够清理资源连接', () => {
|
|
153
|
+
it('应该能够清理资源连接', async () => {
|
|
140
154
|
const closeConnection = vi.fn();
|
|
141
155
|
const releaseResource = vi.fn();
|
|
142
156
|
disposer.addDisposer(() => closeConnection());
|
|
143
157
|
disposer.addDisposer(() => releaseResource());
|
|
144
|
-
disposer.dispose();
|
|
158
|
+
await disposer.dispose();
|
|
145
159
|
expect(closeConnection).toHaveBeenCalled();
|
|
146
160
|
expect(releaseResource).toHaveBeenCalled();
|
|
147
161
|
});
|
|
148
|
-
it('应该与 EventEmitter 配合使用', () => {
|
|
162
|
+
it('应该与 EventEmitter 配合使用', async () => {
|
|
149
163
|
// 模拟 EventEmitter 的使用
|
|
150
164
|
const mockEventEmitter = {
|
|
151
165
|
on: vi.fn().mockReturnValue(vi.fn()), // 返回 off 函数
|
|
@@ -156,25 +170,25 @@ describe('Disposer', () => {
|
|
|
156
170
|
disposer.addDisposer(offFunction1);
|
|
157
171
|
disposer.addDisposer(offFunction2);
|
|
158
172
|
disposer.addDisposer(() => mockEventEmitter.cleanup());
|
|
159
|
-
disposer.dispose();
|
|
173
|
+
await disposer.dispose();
|
|
160
174
|
expect(offFunction1).toHaveBeenCalled();
|
|
161
175
|
expect(offFunction2).toHaveBeenCalled();
|
|
162
176
|
expect(mockEventEmitter.cleanup).toHaveBeenCalled();
|
|
163
177
|
});
|
|
164
178
|
});
|
|
165
179
|
describe('错误处理', () => {
|
|
166
|
-
it('应该捕获并记录同步错误', () => {
|
|
167
|
-
const
|
|
180
|
+
it('应该捕获并记录同步错误', async () => {
|
|
181
|
+
const loggerErrorSpy = vi.spyOn(logger, 'error').mockImplementation(() => { });
|
|
168
182
|
const error = new Error('Sync error');
|
|
169
183
|
disposer.addDisposer(() => {
|
|
170
184
|
throw error;
|
|
171
185
|
});
|
|
172
|
-
disposer.dispose();
|
|
173
|
-
expect(
|
|
174
|
-
|
|
186
|
+
await disposer.dispose();
|
|
187
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith('Error during cleanup:', error);
|
|
188
|
+
loggerErrorSpy.mockRestore();
|
|
175
189
|
});
|
|
176
|
-
it('应该处理不同类型的错误', () => {
|
|
177
|
-
const
|
|
190
|
+
it('应该处理不同类型的错误', async () => {
|
|
191
|
+
const loggerErrorSpy = vi.spyOn(logger, 'error').mockImplementation(() => { });
|
|
178
192
|
disposer.addDisposer(() => {
|
|
179
193
|
throw new TypeError('Type error');
|
|
180
194
|
});
|
|
@@ -184,9 +198,19 @@ describe('Disposer', () => {
|
|
|
184
198
|
disposer.addDisposer(() => {
|
|
185
199
|
throw { message: 'Object error' };
|
|
186
200
|
});
|
|
187
|
-
disposer.dispose();
|
|
188
|
-
expect(
|
|
189
|
-
|
|
201
|
+
await disposer.dispose();
|
|
202
|
+
expect(loggerErrorSpy).toHaveBeenCalledTimes(3);
|
|
203
|
+
loggerErrorSpy.mockRestore();
|
|
204
|
+
});
|
|
205
|
+
it('应该捕获并记录异步错误', async () => {
|
|
206
|
+
const loggerErrorSpy = vi.spyOn(logger, 'error').mockImplementation(() => { });
|
|
207
|
+
const asyncError = new Error('Async error');
|
|
208
|
+
disposer.addDisposer(async () => {
|
|
209
|
+
throw asyncError;
|
|
210
|
+
});
|
|
211
|
+
await disposer.dispose();
|
|
212
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith('Error during cleanup:', asyncError);
|
|
213
|
+
loggerErrorSpy.mockRestore();
|
|
190
214
|
});
|
|
191
215
|
});
|
|
192
216
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './disposer';
|
|
1
|
+
export * from './disposer.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/disposer/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/disposer/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
package/output/disposer/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './disposer';
|
|
1
|
+
export * from './disposer.js';
|
package/output/error/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { UserError, SystemError } from './error';
|
|
2
|
-
export type { ErrorContext } from './error';
|
|
1
|
+
export { UserError, SystemError } from './error.js';
|
|
2
|
+
export type { ErrorContext } from './error.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/error/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,WAAW,EACZ,MAAM,
|
|
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"}
|
package/output/error/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { UserError, SystemError } from './error';
|
|
1
|
+
export { UserError, SystemError } from './error.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './event-emitter';
|
|
1
|
+
export * from './event-emitter.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/event-emitter/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/event-emitter/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './event-emitter';
|
|
1
|
+
export * from './event-emitter.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-queue.d.ts","sourceRoot":"","sources":["../../source/flow-queue/flow-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;
|
|
1
|
+
{"version":3,"file":"flow-queue.d.ts","sourceRoot":"","sources":["../../source/flow-queue/flow-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,7 +78,8 @@
|
|
|
78
78
|
* - **并发控制**:支持配置并发处理数量,默认为 1
|
|
79
79
|
* - **链式调用**:支持流畅的链式 API 调用
|
|
80
80
|
*/
|
|
81
|
-
import { catchIt } from '../catch';
|
|
81
|
+
import { catchIt } from '../catch/index.js';
|
|
82
|
+
import { logger } from '../logger/index.js';
|
|
82
83
|
function delay(arg0) {
|
|
83
84
|
return new Promise(resolve => setTimeout(() => resolve(), arg0));
|
|
84
85
|
}
|
|
@@ -365,7 +366,7 @@ export class FlowQueue {
|
|
|
365
366
|
}
|
|
366
367
|
}
|
|
367
368
|
catch (error) {
|
|
368
|
-
|
|
369
|
+
logger.error('Error in processFlow:', error);
|
|
369
370
|
}
|
|
370
371
|
finally {
|
|
371
372
|
// 减少正在处理的任务计数
|
|
@@ -381,7 +382,7 @@ export class FlowQueue {
|
|
|
381
382
|
for (const callback of this.onGenerates.values()) {
|
|
382
383
|
const result = await catchIt(() => callback(output));
|
|
383
384
|
if (result.isError()) {
|
|
384
|
-
|
|
385
|
+
logger.error('Error in onGenerate callback:', result.error);
|
|
385
386
|
}
|
|
386
387
|
}
|
|
387
388
|
}
|
|
@@ -527,13 +528,11 @@ export class FlowQueue {
|
|
|
527
528
|
}
|
|
528
529
|
// 如果已经标记为输入关闭且没有待处理的输入和正在处理的任务,立即返回 resolved Promise
|
|
529
530
|
if (this.isInputClosed && this.pendingInputs.length === 0 && this.processingCount === 0) {
|
|
530
|
-
console.log('所有输入已处理完毕');
|
|
531
531
|
return Promise.resolve();
|
|
532
532
|
}
|
|
533
533
|
// 创建新的 Promise
|
|
534
534
|
this.completionPromise = new Promise((resolve) => {
|
|
535
535
|
this.completionResolve = () => {
|
|
536
|
-
console.log('所有输入已处理完毕');
|
|
537
536
|
resolve();
|
|
538
537
|
};
|
|
539
538
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { FlowQueue } from './flow-queue';
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { FlowQueue } from './flow-queue.js';
|
|
3
|
+
import { logger } from '../logger/index.js';
|
|
3
4
|
describe('FlowQueue', () => {
|
|
4
5
|
let flowQueue;
|
|
5
6
|
let mockProcessor;
|
|
@@ -158,8 +159,8 @@ describe('FlowQueue', () => {
|
|
|
158
159
|
throw new Error('Callback error');
|
|
159
160
|
});
|
|
160
161
|
const normalCallback = vi.fn();
|
|
161
|
-
// Mock
|
|
162
|
-
const
|
|
162
|
+
// Mock logger.error 来验证错误被正确记录
|
|
163
|
+
const loggerErrorSpy = vi.spyOn(logger, 'error').mockImplementation(() => { });
|
|
163
164
|
mockProcessor = vi.fn().mockResolvedValue(expectedOutput);
|
|
164
165
|
flowQueue = new FlowQueue({ retry: { maxRetries: 3 } }, mockProcessor);
|
|
165
166
|
flowQueue.onGenerate(faultyCallback);
|
|
@@ -168,8 +169,8 @@ describe('FlowQueue', () => {
|
|
|
168
169
|
await new Promise(resolve => setTimeout(resolve, 50));
|
|
169
170
|
expect(faultyCallback).toHaveBeenCalled();
|
|
170
171
|
expect(normalCallback).toHaveBeenCalledWith(expectedOutput);
|
|
171
|
-
expect(
|
|
172
|
-
|
|
172
|
+
expect(loggerErrorSpy).toHaveBeenCalledWith('Error in onGenerate callback:', expect.any(Error));
|
|
173
|
+
loggerErrorSpy.mockRestore();
|
|
173
174
|
});
|
|
174
175
|
it('失败的处理不应该触发回调', async () => {
|
|
175
176
|
const testInput = { id: 1, data: 'test' };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { FlowQueue } from './flow-queue';
|
|
2
|
-
export type { FlowQueueOptions, FlowQueueProcessor, FlowQueueRetryStrategy, FlowQueueRetryConfig, FlowQueueDelayConfig, FlowQueueOnGenerate } from './flow-queue';
|
|
1
|
+
export { FlowQueue } from './flow-queue.js';
|
|
2
|
+
export type { FlowQueueOptions, FlowQueueProcessor, FlowQueueRetryStrategy, FlowQueueRetryConfig, FlowQueueDelayConfig, FlowQueueOnGenerate } from './flow-queue.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/flow-queue/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/flow-queue/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA"}
|
package/output/index.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export * from './disposer';
|
|
2
|
-
export * from './event-emitter';
|
|
3
|
-
export * from './logger';
|
|
4
|
-
export * from './error';
|
|
5
|
-
export * from './service';
|
|
6
|
-
export * from './ttl-cache';
|
|
7
|
-
export * from './lru-cache';
|
|
8
|
-
export * from './ring-cache';
|
|
9
|
-
export * from './batching-buffer';
|
|
10
|
-
export * from './string';
|
|
11
|
-
export * from './color';
|
|
12
|
-
export * from './object';
|
|
13
|
-
export * from './number';
|
|
14
|
-
export * from './catch';
|
|
15
|
-
export * from './debounce';
|
|
16
|
-
export * from './throttle';
|
|
17
|
-
export * from './flow-queue';
|
|
1
|
+
export * from './disposer/index.js';
|
|
2
|
+
export * from './event-emitter/index.js';
|
|
3
|
+
export * from './logger/index.js';
|
|
4
|
+
export * from './error/index.js';
|
|
5
|
+
export * from './service/index.js';
|
|
6
|
+
export * from './ttl-cache/index.js';
|
|
7
|
+
export * from './lru-cache/index.js';
|
|
8
|
+
export * from './ring-cache/index.js';
|
|
9
|
+
export * from './batching-buffer/index.js';
|
|
10
|
+
export * from './string/index.js';
|
|
11
|
+
export * from './color/index.js';
|
|
12
|
+
export * from './object/index.js';
|
|
13
|
+
export * from './number/index.js';
|
|
14
|
+
export * from './catch/index.js';
|
|
15
|
+
export * from './debounce/index.js';
|
|
16
|
+
export * from './throttle/index.js';
|
|
17
|
+
export * from './flow-queue/index.js';
|
|
18
18
|
//# sourceMappingURL=index.d.ts.map
|
package/output/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAA;AAGnC,cAAc,0BAA0B,CAAA;AAGxC,cAAc,mBAAmB,CAAA;AAGjC,cAAc,kBAAkB,CAAA;AAGhC,cAAc,oBAAoB,CAAA;AAGlC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AAGrC,cAAc,4BAA4B,CAAA;AAG1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAGhC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,uBAAuB,CAAA"}
|
package/output/index.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
// === 资源管理 ===
|
|
2
|
-
export * from './disposer';
|
|
2
|
+
export * from './disposer/index.js';
|
|
3
3
|
// === 事件系统 ===
|
|
4
|
-
export * from './event-emitter';
|
|
4
|
+
export * from './event-emitter/index.js';
|
|
5
5
|
// === 日志系统 ===
|
|
6
|
-
export * from './logger';
|
|
6
|
+
export * from './logger/index.js';
|
|
7
7
|
// === 错误处理 ===
|
|
8
|
-
export * from './error';
|
|
8
|
+
export * from './error/index.js';
|
|
9
9
|
// === 服务管理 ===
|
|
10
|
-
export * from './service';
|
|
10
|
+
export * from './service/index.js';
|
|
11
11
|
// === 缓存系统 ===
|
|
12
|
-
export * from './ttl-cache';
|
|
13
|
-
export * from './lru-cache';
|
|
14
|
-
export * from './ring-cache';
|
|
12
|
+
export * from './ttl-cache/index.js';
|
|
13
|
+
export * from './lru-cache/index.js';
|
|
14
|
+
export * from './ring-cache/index.js';
|
|
15
15
|
// === 数据管理 ===
|
|
16
|
-
export * from './batching-buffer';
|
|
16
|
+
export * from './batching-buffer/index.js';
|
|
17
17
|
// === 基础工具 ===
|
|
18
|
-
export * from './string';
|
|
19
|
-
export * from './color';
|
|
20
|
-
export * from './object';
|
|
21
|
-
export * from './number';
|
|
22
|
-
export * from './catch';
|
|
18
|
+
export * from './string/index.js';
|
|
19
|
+
export * from './color/index.js';
|
|
20
|
+
export * from './object/index.js';
|
|
21
|
+
export * from './number/index.js';
|
|
22
|
+
export * from './catch/index.js';
|
|
23
23
|
// === 函数增强 ===
|
|
24
|
-
export * from './debounce';
|
|
25
|
-
export * from './throttle';
|
|
26
|
-
export * from './flow-queue';
|
|
24
|
+
export * from './debounce/index.js';
|
|
25
|
+
export * from './throttle/index.js';
|
|
26
|
+
export * from './flow-queue/index.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { DefaultLogFormatter } from './formatter';
|
|
3
|
-
import { UserError, SystemError } from '../error';
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { DefaultLogFormatter } from './formatter.js';
|
|
3
|
+
import { UserError, SystemError } from '../error/index.js';
|
|
4
4
|
describe('DefaultLogFormatter', () => {
|
|
5
5
|
let formatter;
|
|
6
6
|
beforeEach(() => {
|
package/output/logger/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './logger';
|
|
2
|
-
export * from './formatter';
|
|
3
|
-
export * from './transport';
|
|
1
|
+
export * from './logger.js';
|
|
2
|
+
export * from './formatter.js';
|
|
3
|
+
export * from './transport.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/logger/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/logger/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
|
package/output/logger/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './logger';
|
|
2
|
-
export * from './formatter';
|
|
3
|
-
export * from './transport';
|
|
1
|
+
export * from './logger.js';
|
|
2
|
+
export * from './formatter.js';
|
|
3
|
+
export * from './transport.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LogTransport } from './transport';
|
|
2
|
-
import { LogFormatter } from './formatter';
|
|
1
|
+
import type { LogTransport } from './transport.js';
|
|
2
|
+
import { type LogFormatter } from './formatter.js';
|
|
3
3
|
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
4
4
|
export interface LoggerOptions {
|
|
5
5
|
level?: LogLevel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../source/logger/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../source/logger/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEvE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAE9E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,oCAAoC;IACpC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAA;IAC3B,aAAa;IACb,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAClD;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,KAAK,CAAC,CAA2C;gBAE7C,OAAO,GAAE,aAAkB;IAYvC,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,SAAS;IAKjB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOpB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOpB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOnB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOnB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOpB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOpB,MAAM;IAIN;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAI3C;;OAEG;IACH,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAI5C;;OAEG;IACH,aAAa,IAAI,SAAS,YAAY,EAAE;IAIxC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtC;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM;IAkB/E;;OAEG;IACH,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAE3B;CACF;AAED,eAAO,MAAM,MAAM,QAAe,CAAA"}
|
package/output/logger/logger.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { Logger } from './logger';
|
|
3
|
-
import { DefaultLogFormatter } from './formatter';
|
|
4
|
-
import { UserError, SystemError } from '../error';
|
|
5
|
-
import { MemoryTransport } from './transport'; // 测试向后兼容性
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { DefaultLogFormatter } from './formatter.js';
|
|
4
|
+
import { UserError, SystemError } from '../error/index.js';
|
|
5
|
+
import { MemoryTransport } from './transport.js'; // 测试向后兼容性
|
|
6
6
|
describe('Logger', () => {
|
|
7
7
|
it('应该默认记录 info 及以上级别', () => {
|
|
8
8
|
const print = vi.fn();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../source/logger/transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../source/logger/transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,KAAK,EAAE,QAAQ,CAAA;IACf,UAAU;IACV,SAAS,EAAE,IAAI,CAAA;IACf,aAAa;IACb,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,aAAa;IACb,KAAK,CAAC,EAAE,QAAQ,CAAA;IAEhB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5C;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa;IACb,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,YAAY;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,SAAgB,IAAI,EAAE,MAAM,CAAY;IACjC,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,EAAE,OAAO,CAAQ;IAE/B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAoE;gBAE1F,OAAO,GAAE,sBAA2B;IAQhD;;OAEG;IACH,OAAO,CAAC,SAAS;IAeV,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAQnC;;OAEG;IACI,UAAU,IAAI,SAAS,cAAc,EAAE;IAO9C;;OAEG;IACI,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,cAAc,EAAE;IAQ3D;;OAEG;IACI,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,cAAc,EAAE;IAQtE;;;OAGG;IACI,aAAa,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,GAAG,cAAc,EAAE;IAItF;;;OAGG;IACI,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE;IAsB5D;;OAEG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAOxD;;OAEG;IACI,QAAQ,IAAI;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACjC,eAAe,CAAC,EAAE,IAAI,CAAA;QACtB,eAAe,CAAC,EAAE,IAAI,CAAA;KACvB;IA4BD;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,YAAY,IAAI,MAAM;IAI7B;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { MemoryTransport } from './transport';
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
+
import { MemoryTransport } from './transport.js';
|
|
3
3
|
// 创建一个测试用的 Transport 实现
|
|
4
4
|
class TestTransport {
|
|
5
5
|
name;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { LruCache } from './lru-cache';
|
|
1
|
+
export { LruCache } from './lru-cache.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/lru-cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/lru-cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { LruCache } from './lru-cache';
|
|
1
|
+
export { LruCache } from './lru-cache.js';
|
package/output/number/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './number';
|
|
1
|
+
export * from './number.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/number/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/number/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
package/output/number/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './number';
|
|
1
|
+
export * from './number.js';
|
package/output/object/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './object';
|
|
1
|
+
export * from './object.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
package/output/object/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './object';
|
|
1
|
+
export * from './object.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/ring-cache/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/ring-cache/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,iBAAiB,CAAA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* RingCache 测试文件
|
|
3
3
|
*/
|
|
4
4
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
5
|
-
import { RingCache } from './ring-cache';
|
|
5
|
+
import { RingCache } from './ring-cache.js';
|
|
6
6
|
describe('RingCache', () => {
|
|
7
7
|
let cache;
|
|
8
8
|
beforeEach(() => {
|
|
@@ -77,9 +77,10 @@ describe('RingCache', () => {
|
|
|
77
77
|
expect(results.map(e => e.data)).toEqual(['apple', 'apricot']);
|
|
78
78
|
});
|
|
79
79
|
it('应该支持时间范围搜索', () => {
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
const
|
|
80
|
+
const entries = cache.getAll();
|
|
81
|
+
const start = new Date(entries[0].timestamp.getTime() - 1);
|
|
82
|
+
const end = new Date(entries[entries.length - 1].timestamp.getTime() + 1);
|
|
83
|
+
const results = cache.getByTimeRange(start, end);
|
|
83
84
|
expect(results.length).toBe(3);
|
|
84
85
|
});
|
|
85
86
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Service } from './service';
|
|
1
|
+
export { Service } from './service.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA"}
|
package/output/service/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { Service } from './service';
|
|
1
|
+
export { Service } from './service.js';
|
package/output/string/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './string';
|
|
1
|
+
export * from './string.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/string/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
package/output/string/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './string';
|
|
1
|
+
export * from './string.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './throttle';
|
|
1
|
+
export * from './throttle.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/throttle/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/throttle/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
package/output/throttle/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './throttle';
|
|
1
|
+
export * from './throttle.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TtlCache, type TtlCacheOptions, type TtlCacheStats } from './ttl-cache';
|
|
1
|
+
export { TtlCache, type TtlCacheOptions, type TtlCacheStats } from './ttl-cache.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/ttl-cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/ttl-cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { TtlCache } from './ttl-cache';
|
|
1
|
+
export { TtlCache } from './ttl-cache.js';
|
package/package.json
CHANGED
|
@@ -1,34 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taicode/common-base",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"author": "Alain",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"description": "",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=16.0.0"
|
|
10
|
+
},
|
|
7
11
|
"main": "./output/index.js",
|
|
8
12
|
"types": "./output/index.d.ts",
|
|
9
13
|
"exports": {
|
|
10
14
|
".": {
|
|
11
15
|
"types": "./output/index.d.ts",
|
|
12
|
-
"
|
|
13
|
-
"require": "./output/index.js"
|
|
16
|
+
"default": "./output/index.js"
|
|
14
17
|
},
|
|
15
18
|
"./*": {
|
|
16
19
|
"types": "./output/*/index.d.ts",
|
|
17
|
-
"
|
|
18
|
-
"require": "./output/*/index.js"
|
|
20
|
+
"default": "./output/*/index.js"
|
|
19
21
|
}
|
|
20
22
|
},
|
|
21
23
|
"scripts": {
|
|
22
24
|
"test": "vitest run",
|
|
23
|
-
"build": "tsc -p tsconfig.json",
|
|
25
|
+
"build": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json",
|
|
24
26
|
"prepublishOnly": "npm run build",
|
|
25
|
-
"dev": "tsc -p tsconfig.json --watch"
|
|
27
|
+
"dev": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json --watch"
|
|
26
28
|
},
|
|
27
29
|
"files": [
|
|
28
30
|
"output"
|
|
29
31
|
],
|
|
30
32
|
"devDependencies": {
|
|
31
33
|
"vitest": "^3.2.4",
|
|
32
|
-
"mobx": "^6.
|
|
34
|
+
"mobx": "^6.15.0"
|
|
33
35
|
}
|
|
34
36
|
}
|