@taicode/common-base 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/output/error/error.d.ts +59 -9
  2. package/output/error/error.d.ts.map +1 -1
  3. package/output/error/error.js +50 -6
  4. package/output/error/index.d.ts +1 -1
  5. package/output/error/index.d.ts.map +1 -1
  6. package/output/logger/formatter.d.ts +71 -0
  7. package/output/logger/formatter.d.ts.map +1 -0
  8. package/output/logger/formatter.js +222 -0
  9. package/output/logger/formatter.test.d.ts +26 -0
  10. package/output/logger/formatter.test.d.ts.map +1 -0
  11. package/output/logger/formatter.test.js +315 -0
  12. package/output/logger/index.d.ts +3 -17
  13. package/output/logger/index.d.ts.map +1 -1
  14. package/output/logger/index.js +3 -34
  15. package/output/logger/logger.d.ts +51 -0
  16. package/output/logger/logger.d.ts.map +1 -0
  17. package/output/logger/logger.js +118 -0
  18. package/output/logger/logger.test.d.ts +19 -0
  19. package/output/logger/logger.test.d.ts.map +1 -1
  20. package/output/logger/logger.test.js +201 -15
  21. package/output/logger/transport.d.ts +124 -0
  22. package/output/logger/transport.d.ts.map +1 -0
  23. package/output/logger/transport.js +153 -0
  24. package/output/logger/transport.test.d.ts +2 -0
  25. package/output/logger/transport.test.d.ts.map +1 -0
  26. package/output/logger/transport.test.js +309 -0
  27. package/output/ring-cache/index.d.ts +6 -0
  28. package/output/ring-cache/index.d.ts.map +1 -0
  29. package/output/ring-cache/index.js +5 -0
  30. package/output/ring-cache/ring-cache.d.ts +125 -0
  31. package/output/ring-cache/ring-cache.d.ts.map +1 -0
  32. package/output/ring-cache/ring-cache.js +197 -0
  33. package/output/ring-cache/ring-cache.test.d.ts +2 -0
  34. package/output/ring-cache/ring-cache.test.d.ts.map +1 -0
  35. package/output/ring-cache/ring-cache.test.js +195 -0
  36. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * RingCache 测试文件
3
+ */
4
+ import { describe, it, expect, beforeEach } from 'vitest';
5
+ import { RingCache } from './ring-cache';
6
+ describe('RingCache', () => {
7
+ let cache;
8
+ beforeEach(() => {
9
+ cache = new RingCache({ capacity: 3 });
10
+ });
11
+ describe('基础功能', () => {
12
+ it('应该正确初始化', () => {
13
+ expect(cache.getSize()).toBe(0);
14
+ expect(cache.getCapacity()).toBe(3);
15
+ expect(cache.isEmpty()).toBe(true);
16
+ expect(cache.isFull()).toBe(false);
17
+ });
18
+ it('应该正确添加条目', () => {
19
+ const entry = cache.add('test1');
20
+ expect(entry.data).toBe('test1');
21
+ expect(entry.id).toBeDefined();
22
+ expect(entry.timestamp).toBeInstanceOf(Date);
23
+ expect(cache.getSize()).toBe(1);
24
+ expect(cache.isEmpty()).toBe(false);
25
+ });
26
+ it('应该正确处理容量限制', () => {
27
+ cache.add('test1');
28
+ cache.add('test2');
29
+ cache.add('test3');
30
+ expect(cache.getSize()).toBe(3);
31
+ expect(cache.isFull()).toBe(true);
32
+ // 添加第4个条目,应该覆盖第1个
33
+ cache.add('test4');
34
+ expect(cache.getSize()).toBe(3);
35
+ expect(cache.isFull()).toBe(true);
36
+ const all = cache.getAll();
37
+ expect(all.map(e => e.data)).toEqual(['test2', 'test3', 'test4']);
38
+ });
39
+ });
40
+ describe('获取功能', () => {
41
+ beforeEach(() => {
42
+ cache.add('first');
43
+ cache.add('second');
44
+ cache.add('third');
45
+ });
46
+ it('应该正确获取所有条目', () => {
47
+ const all = cache.getAll();
48
+ expect(all.length).toBe(3);
49
+ expect(all.map(e => e.data)).toEqual(['first', 'second', 'third']);
50
+ });
51
+ it('应该正确获取最近的条目', () => {
52
+ const recent = cache.getRecent(2);
53
+ expect(recent.length).toBe(2);
54
+ expect(recent.map(e => e.data)).toEqual(['second', 'third']);
55
+ });
56
+ it('应该正确获取最旧的条目', () => {
57
+ const oldest = cache.getOldest(2);
58
+ expect(oldest.length).toBe(2);
59
+ expect(oldest.map(e => e.data)).toEqual(['first', 'second']);
60
+ });
61
+ it('应该正确处理边界情况', () => {
62
+ expect(cache.getRecent(0)).toEqual([]);
63
+ expect(cache.getRecent(10)).toHaveLength(3);
64
+ expect(cache.getOldest(0)).toEqual([]);
65
+ expect(cache.getOldest(10)).toHaveLength(3);
66
+ });
67
+ });
68
+ describe('搜索功能', () => {
69
+ beforeEach(() => {
70
+ cache.add('apple');
71
+ cache.add('banana');
72
+ cache.add('apricot');
73
+ });
74
+ it('应该正确搜索条目', () => {
75
+ const results = cache.search(entry => entry.data.startsWith('ap'));
76
+ expect(results.length).toBe(2);
77
+ expect(results.map(e => e.data)).toEqual(['apple', 'apricot']);
78
+ });
79
+ it('应该支持时间范围搜索', () => {
80
+ const now = new Date();
81
+ const future = new Date(now.getTime() + 1000);
82
+ const results = cache.getByTimeRange(now, future);
83
+ expect(results.length).toBe(3);
84
+ });
85
+ });
86
+ describe('统计功能', () => {
87
+ it('应该正确返回空缓存的统计信息', () => {
88
+ const stats = cache.getStats();
89
+ expect(stats.size).toBe(0);
90
+ expect(stats.capacity).toBe(3);
91
+ expect(stats.isFull).toBe(false);
92
+ expect(stats.oldestTimestamp).toBeUndefined();
93
+ expect(stats.newestTimestamp).toBeUndefined();
94
+ expect(stats.totalAdded).toBe(0);
95
+ });
96
+ it('应该正确返回有数据的统计信息', () => {
97
+ cache.add('test1');
98
+ cache.add('test2');
99
+ const stats = cache.getStats();
100
+ expect(stats.size).toBe(2);
101
+ expect(stats.capacity).toBe(3);
102
+ expect(stats.isFull).toBe(false);
103
+ expect(stats.oldestTimestamp).toBeInstanceOf(Date);
104
+ expect(stats.newestTimestamp).toBeInstanceOf(Date);
105
+ expect(stats.totalAdded).toBe(2);
106
+ });
107
+ it('应该正确跟踪总添加数', () => {
108
+ // 添加超过容量的条目
109
+ cache.add('1');
110
+ cache.add('2');
111
+ cache.add('3');
112
+ cache.add('4');
113
+ cache.add('5');
114
+ const stats = cache.getStats();
115
+ expect(stats.size).toBe(3);
116
+ expect(stats.totalAdded).toBe(5);
117
+ });
118
+ });
119
+ describe('清空和导出功能', () => {
120
+ beforeEach(() => {
121
+ cache.add('test1');
122
+ cache.add('test2');
123
+ });
124
+ it('应该正确清空缓存', () => {
125
+ cache.clear();
126
+ expect(cache.getSize()).toBe(0);
127
+ expect(cache.isEmpty()).toBe(true);
128
+ expect(cache.getStats().totalAdded).toBe(0);
129
+ });
130
+ it('应该正确导出为数组', () => {
131
+ const array = cache.toArray();
132
+ expect(array).toEqual(['test1', 'test2']);
133
+ });
134
+ it('应该正确导出为JSON', () => {
135
+ const json = cache.toJSON();
136
+ const parsed = JSON.parse(json);
137
+ expect(parsed).toHaveLength(2);
138
+ expect(parsed[0].data).toBe('test1');
139
+ expect(parsed[1].data).toBe('test2');
140
+ });
141
+ });
142
+ describe('迭代器功能', () => {
143
+ it('应该支持for...of语法', () => {
144
+ cache.add('a');
145
+ cache.add('b');
146
+ cache.add('c');
147
+ const results = [];
148
+ for (const entry of cache) {
149
+ results.push(entry.data);
150
+ }
151
+ expect(results).toEqual(['a', 'b', 'c']);
152
+ });
153
+ });
154
+ describe('边界条件', () => {
155
+ it('应该拒绝无效的容量', () => {
156
+ expect(() => new RingCache({ capacity: 0 })).toThrow('Capacity must be greater than 0');
157
+ expect(() => new RingCache({ capacity: -1 })).toThrow('Capacity must be greater than 0');
158
+ });
159
+ it('应该正确处理空缓存的操作', () => {
160
+ const emptyCache = new RingCache();
161
+ expect(emptyCache.getAll()).toEqual([]);
162
+ expect(emptyCache.getRecent(1)).toEqual([]);
163
+ expect(emptyCache.getOldest(1)).toEqual([]);
164
+ expect(emptyCache.toArray()).toEqual([]);
165
+ });
166
+ it('应该正确处理单个容量的缓存', () => {
167
+ const singleCache = new RingCache({ capacity: 1 });
168
+ singleCache.add('first');
169
+ expect(singleCache.getAll().map(e => e.data)).toEqual(['first']);
170
+ singleCache.add('second');
171
+ expect(singleCache.getAll().map(e => e.data)).toEqual(['second']);
172
+ });
173
+ });
174
+ describe('复杂数据类型', () => {
175
+ it('应该支持对象数据', () => {
176
+ const objectCache = new RingCache();
177
+ const obj1 = { name: 'test1', value: 1 };
178
+ const obj2 = { name: 'test2', value: 2 };
179
+ objectCache.add(obj1);
180
+ objectCache.add(obj2);
181
+ const all = objectCache.getAll();
182
+ expect(all[0].data).toEqual(obj1);
183
+ expect(all[1].data).toEqual(obj2);
184
+ });
185
+ it('应该支持搜索对象属性', () => {
186
+ const objectCache = new RingCache();
187
+ objectCache.add({ name: 'apple', type: 'fruit' });
188
+ objectCache.add({ name: 'carrot', type: 'vegetable' });
189
+ objectCache.add({ name: 'banana', type: 'fruit' });
190
+ const fruits = objectCache.search(entry => entry.data.type === 'fruit');
191
+ expect(fruits.length).toBe(2);
192
+ expect(fruits.map(e => e.data.name)).toEqual(['apple', 'banana']);
193
+ });
194
+ });
195
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taicode/common-base",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "author": "Alain",
5
5
  "license": "ISC",
6
6
  "description": "",