@geekmidas/cache 0.0.7 → 0.1.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.
- package/dist/{chunk-DWy1uDak.cjs → chunk-CUT6urMc.cjs} +0 -9
- package/dist/expo.cjs +4 -3
- package/dist/expo.cjs.map +1 -0
- package/dist/expo.d.cts +6 -5
- package/dist/expo.d.mts +6 -5
- package/dist/expo.mjs +3 -2
- package/dist/expo.mjs.map +1 -0
- package/dist/{index-B6eF5Yxi.d.cts → index-CExVL1mV.d.cts} +7 -5
- package/dist/{index-Bv61mxVT.d.mts → index-M02PehQA.d.mts} +7 -5
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/memory.cjs +35 -3
- package/dist/memory.cjs.map +1 -0
- package/dist/memory.d.cts +6 -5
- package/dist/memory.d.mts +6 -5
- package/dist/memory.mjs +34 -3
- package/dist/memory.mjs.map +1 -0
- package/dist/{src-DVpoP03o.mjs → src-CrE4Nl5T.mjs} +2 -1
- package/dist/src-CrE4Nl5T.mjs.map +1 -0
- package/dist/{src-C7d6HaTp.cjs → src-zfYb7mdS.cjs} +3 -2
- package/dist/src-zfYb7mdS.cjs.map +1 -0
- package/dist/upstash.cjs +32 -2
- package/dist/upstash.cjs.map +1 -0
- package/dist/upstash.d.cts +6 -5
- package/dist/upstash.d.mts +6 -5
- package/dist/upstash.mjs +31 -2
- package/dist/upstash.mjs.map +1 -0
- package/package.json +6 -2
- package/src/__benchmarks__/memory.bench.ts +51 -0
- package/src/__tests__/cache.spec.ts +31 -35
- package/src/__tests__/integration.spec.ts +32 -23
- package/src/__tests__/memory.spec.ts +1 -1
- package/src/__tests__/upstash.spec.ts +1 -1
- package/src/expo.ts +3 -4
- package/src/index.ts +5 -4
- package/src/memory.ts +6 -5
- package/src/upstash.ts +4 -4
- package/dist/__tests__/cache.spec.cjs +0 -77
- package/dist/__tests__/cache.spec.d.cts +0 -1
- package/dist/__tests__/cache.spec.d.mts +0 -1
- package/dist/__tests__/cache.spec.mjs +0 -77
- package/dist/__tests__/integration.spec.cjs +0 -235
- package/dist/__tests__/integration.spec.d.cts +0 -1
- package/dist/__tests__/integration.spec.d.mts +0 -1
- package/dist/__tests__/integration.spec.mjs +0 -235
- package/dist/__tests__/memory.spec.cjs +0 -126
- package/dist/__tests__/memory.spec.d.cts +0 -1
- package/dist/__tests__/memory.spec.d.mts +0 -1
- package/dist/__tests__/memory.spec.mjs +0 -126
- package/dist/__tests__/upstash.spec.cjs +0 -201
- package/dist/__tests__/upstash.spec.d.cts +0 -1
- package/dist/__tests__/upstash.spec.d.mts +0 -1
- package/dist/__tests__/upstash.spec.mjs +0 -201
- package/dist/magic-string.es-CBih0MJw.mjs +0 -1014
- package/dist/magic-string.es-KiPEzMtt.cjs +0 -1015
- package/dist/memory-Csy6J-Ak.cjs +0 -39
- package/dist/memory-QDTnSEX5.mjs +0 -33
- package/dist/upstash-CXy_duOa.mjs +0 -31
- package/dist/upstash-u8Hs4sZG.cjs +0 -37
- package/dist/vi.bdSIJ99Y-B-qkABPq.cjs +0 -14955
- package/dist/vi.bdSIJ99Y-CB5havZF.mjs +0 -14951
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
require('../src-C7d6HaTp.cjs');
|
|
2
|
-
const require_memory = require('../memory-Csy6J-Ak.cjs');
|
|
3
|
-
const require_vi_bdSIJ99Y = require('../vi.bdSIJ99Y-B-qkABPq.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/__tests__/integration.spec.ts
|
|
6
|
-
require_vi_bdSIJ99Y.describe("Cache Integration Tests", () => {
|
|
7
|
-
let memoryCache;
|
|
8
|
-
require_vi_bdSIJ99Y.beforeEach(() => {
|
|
9
|
-
memoryCache = new require_memory.InMemoryCache();
|
|
10
|
-
});
|
|
11
|
-
require_vi_bdSIJ99Y.describe("cross-cache behavior consistency", () => {
|
|
12
|
-
const testCases = [{
|
|
13
|
-
name: "InMemoryCache",
|
|
14
|
-
cache: () => new require_memory.InMemoryCache()
|
|
15
|
-
}];
|
|
16
|
-
testCases.forEach(({ name, cache }) => {
|
|
17
|
-
require_vi_bdSIJ99Y.describe(name, () => {
|
|
18
|
-
let cacheInstance;
|
|
19
|
-
require_vi_bdSIJ99Y.beforeEach(() => {
|
|
20
|
-
cacheInstance = cache();
|
|
21
|
-
});
|
|
22
|
-
require_vi_bdSIJ99Y.it("should handle basic CRUD operations", async () => {
|
|
23
|
-
await cacheInstance.set("user:1", {
|
|
24
|
-
id: 1,
|
|
25
|
-
name: "John"
|
|
26
|
-
});
|
|
27
|
-
const user = await cacheInstance.get("user:1");
|
|
28
|
-
require_vi_bdSIJ99Y.globalExpect(user).toEqual({
|
|
29
|
-
id: 1,
|
|
30
|
-
name: "John"
|
|
31
|
-
});
|
|
32
|
-
await cacheInstance.set("user:1", {
|
|
33
|
-
id: 1,
|
|
34
|
-
name: "Jane"
|
|
35
|
-
});
|
|
36
|
-
const updatedUser = await cacheInstance.get("user:1");
|
|
37
|
-
require_vi_bdSIJ99Y.globalExpect(updatedUser).toEqual({
|
|
38
|
-
id: 1,
|
|
39
|
-
name: "Jane"
|
|
40
|
-
});
|
|
41
|
-
await cacheInstance.delete("user:1");
|
|
42
|
-
const deletedUser = await cacheInstance.get("user:1");
|
|
43
|
-
require_vi_bdSIJ99Y.globalExpect(deletedUser).toBeUndefined();
|
|
44
|
-
});
|
|
45
|
-
require_vi_bdSIJ99Y.it("should handle concurrent operations", async () => {
|
|
46
|
-
const operations = [
|
|
47
|
-
cacheInstance.set("key1", "value1"),
|
|
48
|
-
cacheInstance.set("key2", "value2"),
|
|
49
|
-
cacheInstance.set("key3", "value3")
|
|
50
|
-
];
|
|
51
|
-
await Promise.all(operations);
|
|
52
|
-
const results = await Promise.all([
|
|
53
|
-
cacheInstance.get("key1"),
|
|
54
|
-
cacheInstance.get("key2"),
|
|
55
|
-
cacheInstance.get("key3")
|
|
56
|
-
]);
|
|
57
|
-
require_vi_bdSIJ99Y.globalExpect(results).toEqual([
|
|
58
|
-
"value1",
|
|
59
|
-
"value2",
|
|
60
|
-
"value3"
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
require_vi_bdSIJ99Y.it("should handle data type preservation", async () => {
|
|
64
|
-
const testData = {
|
|
65
|
-
string: "hello",
|
|
66
|
-
number: 42,
|
|
67
|
-
boolean: true,
|
|
68
|
-
object: { nested: true },
|
|
69
|
-
array: [
|
|
70
|
-
1,
|
|
71
|
-
2,
|
|
72
|
-
3
|
|
73
|
-
],
|
|
74
|
-
null: null
|
|
75
|
-
};
|
|
76
|
-
await Promise.all(Object.entries(testData).map(([key, value]) => cacheInstance.set(key, value)));
|
|
77
|
-
const results = await Promise.all(Object.keys(testData).map((key) => cacheInstance.get(key)));
|
|
78
|
-
require_vi_bdSIJ99Y.globalExpect(results[0]).toBe("hello");
|
|
79
|
-
require_vi_bdSIJ99Y.globalExpect(results[1]).toBe(42);
|
|
80
|
-
require_vi_bdSIJ99Y.globalExpect(results[2]).toBe(true);
|
|
81
|
-
require_vi_bdSIJ99Y.globalExpect(results[3]).toEqual({ nested: true });
|
|
82
|
-
require_vi_bdSIJ99Y.globalExpect(results[4]).toEqual([
|
|
83
|
-
1,
|
|
84
|
-
2,
|
|
85
|
-
3
|
|
86
|
-
]);
|
|
87
|
-
require_vi_bdSIJ99Y.globalExpect(results[5]).toBeNull();
|
|
88
|
-
});
|
|
89
|
-
require_vi_bdSIJ99Y.it("should handle key isolation", async () => {
|
|
90
|
-
await cacheInstance.set("user:1", "User One");
|
|
91
|
-
await cacheInstance.set("user:2", "User Two");
|
|
92
|
-
await cacheInstance.set("session:1", "Session One");
|
|
93
|
-
await cacheInstance.delete("user:1");
|
|
94
|
-
require_vi_bdSIJ99Y.globalExpect(await cacheInstance.get("user:1")).toBeUndefined();
|
|
95
|
-
require_vi_bdSIJ99Y.globalExpect(await cacheInstance.get("user:2")).toBe("User Two");
|
|
96
|
-
require_vi_bdSIJ99Y.globalExpect(await cacheInstance.get("session:1")).toBe("Session One");
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
require_vi_bdSIJ99Y.describe("cache migration scenarios", () => {
|
|
102
|
-
require_vi_bdSIJ99Y.it("should support migrating data between cache implementations", async () => {
|
|
103
|
-
const sourceCache = new require_memory.InMemoryCache();
|
|
104
|
-
const targetCache = new require_memory.InMemoryCache();
|
|
105
|
-
const testData = {
|
|
106
|
-
"user:1": {
|
|
107
|
-
id: 1,
|
|
108
|
-
name: "John"
|
|
109
|
-
},
|
|
110
|
-
"user:2": {
|
|
111
|
-
id: 2,
|
|
112
|
-
name: "Jane"
|
|
113
|
-
},
|
|
114
|
-
"config:app": {
|
|
115
|
-
theme: "dark",
|
|
116
|
-
notifications: true
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
for (const [key, value] of Object.entries(testData)) await sourceCache.set(key, value);
|
|
120
|
-
const migrationKeys = Object.keys(testData);
|
|
121
|
-
for (const key of migrationKeys) {
|
|
122
|
-
const value = await sourceCache.get(key);
|
|
123
|
-
if (value !== void 0) await targetCache.set(key, value);
|
|
124
|
-
}
|
|
125
|
-
for (const [key, expectedValue] of Object.entries(testData)) {
|
|
126
|
-
const migratedValue = await targetCache.get(key);
|
|
127
|
-
require_vi_bdSIJ99Y.globalExpect(migratedValue).toEqual(expectedValue);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
require_vi_bdSIJ99Y.describe("cache abstraction patterns", () => {
|
|
132
|
-
require_vi_bdSIJ99Y.it("should support cache factory pattern", async () => {
|
|
133
|
-
const createCache = (type) => {
|
|
134
|
-
switch (type) {
|
|
135
|
-
case "memory": return new require_memory.InMemoryCache();
|
|
136
|
-
default: throw new Error(`Unknown cache type: ${type}`);
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
const userCache = createCache("memory");
|
|
140
|
-
const sessionCache = createCache("memory");
|
|
141
|
-
await userCache.set("user:1", {
|
|
142
|
-
id: 1,
|
|
143
|
-
name: "John"
|
|
144
|
-
});
|
|
145
|
-
await sessionCache.set("session:abc", "active");
|
|
146
|
-
require_vi_bdSIJ99Y.globalExpect(await userCache.get("user:1")).toEqual({
|
|
147
|
-
id: 1,
|
|
148
|
-
name: "John"
|
|
149
|
-
});
|
|
150
|
-
require_vi_bdSIJ99Y.globalExpect(await sessionCache.get("session:abc")).toBe("active");
|
|
151
|
-
});
|
|
152
|
-
require_vi_bdSIJ99Y.it("should support cache wrapper pattern", async () => {
|
|
153
|
-
class LoggingCache {
|
|
154
|
-
logs = [];
|
|
155
|
-
constructor(underlying) {
|
|
156
|
-
this.underlying = underlying;
|
|
157
|
-
}
|
|
158
|
-
async get(key) {
|
|
159
|
-
this.logs.push(`GET ${key}`);
|
|
160
|
-
return this.underlying.get(key);
|
|
161
|
-
}
|
|
162
|
-
async set(key, value) {
|
|
163
|
-
this.logs.push(`SET ${key}`);
|
|
164
|
-
return this.underlying.set(key, value);
|
|
165
|
-
}
|
|
166
|
-
async delete(key) {
|
|
167
|
-
this.logs.push(`DELETE ${key}`);
|
|
168
|
-
return this.underlying.delete(key);
|
|
169
|
-
}
|
|
170
|
-
getLogs() {
|
|
171
|
-
return [...this.logs];
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const baseCache = new require_memory.InMemoryCache();
|
|
175
|
-
const loggingCache = new LoggingCache(baseCache);
|
|
176
|
-
await loggingCache.set("test", "value");
|
|
177
|
-
await loggingCache.get("test");
|
|
178
|
-
await loggingCache.delete("test");
|
|
179
|
-
const logs = loggingCache.getLogs();
|
|
180
|
-
require_vi_bdSIJ99Y.globalExpect(logs).toEqual([
|
|
181
|
-
"SET test",
|
|
182
|
-
"GET test",
|
|
183
|
-
"DELETE test"
|
|
184
|
-
]);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
require_vi_bdSIJ99Y.describe("performance and stress tests", () => {
|
|
188
|
-
require_vi_bdSIJ99Y.it("should handle large number of operations", async () => {
|
|
189
|
-
const cache = new require_memory.InMemoryCache();
|
|
190
|
-
const operationCount = 1e3;
|
|
191
|
-
const insertPromises = Array.from({ length: operationCount }, (_, i) => cache.set(`key:${i}`, i));
|
|
192
|
-
await Promise.all(insertPromises);
|
|
193
|
-
const readPromises = Array.from({ length: operationCount }, (_, i) => cache.get(`key:${i}`));
|
|
194
|
-
const results = await Promise.all(readPromises);
|
|
195
|
-
for (let i = 0; i < operationCount; i++) require_vi_bdSIJ99Y.globalExpect(results[i]).toBe(i);
|
|
196
|
-
const deletePromises = Array.from({ length: operationCount }, (_, i) => cache.delete(`key:${i}`));
|
|
197
|
-
await Promise.all(deletePromises);
|
|
198
|
-
const postDeleteRead = await cache.get("key:0");
|
|
199
|
-
require_vi_bdSIJ99Y.globalExpect(postDeleteRead).toBeUndefined();
|
|
200
|
-
});
|
|
201
|
-
require_vi_bdSIJ99Y.it("should handle large objects efficiently", async () => {
|
|
202
|
-
const cache = new require_memory.InMemoryCache();
|
|
203
|
-
const largeObject = {
|
|
204
|
-
id: 1,
|
|
205
|
-
data: Array.from({ length: 1e3 }, (_, i) => ({
|
|
206
|
-
index: i,
|
|
207
|
-
value: `value-${i}`,
|
|
208
|
-
metadata: {
|
|
209
|
-
timestamp: Date.now(),
|
|
210
|
-
random: Math.random()
|
|
211
|
-
}
|
|
212
|
-
}))
|
|
213
|
-
};
|
|
214
|
-
const startTime = Date.now();
|
|
215
|
-
await cache.set("large-object", largeObject);
|
|
216
|
-
const result = await cache.get("large-object");
|
|
217
|
-
const endTime = Date.now();
|
|
218
|
-
require_vi_bdSIJ99Y.globalExpect(result).toEqual(largeObject);
|
|
219
|
-
require_vi_bdSIJ99Y.globalExpect(endTime - startTime).toBeLessThan(100);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
require_vi_bdSIJ99Y.describe("error scenarios", () => {
|
|
223
|
-
require_vi_bdSIJ99Y.it("should handle operations after errors gracefully", async () => {
|
|
224
|
-
const cache = new require_memory.InMemoryCache();
|
|
225
|
-
await cache.set("valid-key", "valid-value");
|
|
226
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("valid-key")).toBe("valid-value");
|
|
227
|
-
await cache.set("another-key", "another-value");
|
|
228
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("another-key")).toBe("another-value");
|
|
229
|
-
await cache.delete("valid-key");
|
|
230
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("valid-key")).toBeUndefined();
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
//#endregion
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, globalExpect, it } from "../vi.bdSIJ99Y-CB5havZF.mjs";
|
|
2
|
-
import "../src-DVpoP03o.mjs";
|
|
3
|
-
import { InMemoryCache } from "../memory-QDTnSEX5.mjs";
|
|
4
|
-
|
|
5
|
-
//#region src/__tests__/integration.spec.ts
|
|
6
|
-
describe("Cache Integration Tests", () => {
|
|
7
|
-
let memoryCache;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
memoryCache = new InMemoryCache();
|
|
10
|
-
});
|
|
11
|
-
describe("cross-cache behavior consistency", () => {
|
|
12
|
-
const testCases = [{
|
|
13
|
-
name: "InMemoryCache",
|
|
14
|
-
cache: () => new InMemoryCache()
|
|
15
|
-
}];
|
|
16
|
-
testCases.forEach(({ name, cache }) => {
|
|
17
|
-
describe(name, () => {
|
|
18
|
-
let cacheInstance;
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
cacheInstance = cache();
|
|
21
|
-
});
|
|
22
|
-
it("should handle basic CRUD operations", async () => {
|
|
23
|
-
await cacheInstance.set("user:1", {
|
|
24
|
-
id: 1,
|
|
25
|
-
name: "John"
|
|
26
|
-
});
|
|
27
|
-
const user = await cacheInstance.get("user:1");
|
|
28
|
-
globalExpect(user).toEqual({
|
|
29
|
-
id: 1,
|
|
30
|
-
name: "John"
|
|
31
|
-
});
|
|
32
|
-
await cacheInstance.set("user:1", {
|
|
33
|
-
id: 1,
|
|
34
|
-
name: "Jane"
|
|
35
|
-
});
|
|
36
|
-
const updatedUser = await cacheInstance.get("user:1");
|
|
37
|
-
globalExpect(updatedUser).toEqual({
|
|
38
|
-
id: 1,
|
|
39
|
-
name: "Jane"
|
|
40
|
-
});
|
|
41
|
-
await cacheInstance.delete("user:1");
|
|
42
|
-
const deletedUser = await cacheInstance.get("user:1");
|
|
43
|
-
globalExpect(deletedUser).toBeUndefined();
|
|
44
|
-
});
|
|
45
|
-
it("should handle concurrent operations", async () => {
|
|
46
|
-
const operations = [
|
|
47
|
-
cacheInstance.set("key1", "value1"),
|
|
48
|
-
cacheInstance.set("key2", "value2"),
|
|
49
|
-
cacheInstance.set("key3", "value3")
|
|
50
|
-
];
|
|
51
|
-
await Promise.all(operations);
|
|
52
|
-
const results = await Promise.all([
|
|
53
|
-
cacheInstance.get("key1"),
|
|
54
|
-
cacheInstance.get("key2"),
|
|
55
|
-
cacheInstance.get("key3")
|
|
56
|
-
]);
|
|
57
|
-
globalExpect(results).toEqual([
|
|
58
|
-
"value1",
|
|
59
|
-
"value2",
|
|
60
|
-
"value3"
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
it("should handle data type preservation", async () => {
|
|
64
|
-
const testData = {
|
|
65
|
-
string: "hello",
|
|
66
|
-
number: 42,
|
|
67
|
-
boolean: true,
|
|
68
|
-
object: { nested: true },
|
|
69
|
-
array: [
|
|
70
|
-
1,
|
|
71
|
-
2,
|
|
72
|
-
3
|
|
73
|
-
],
|
|
74
|
-
null: null
|
|
75
|
-
};
|
|
76
|
-
await Promise.all(Object.entries(testData).map(([key, value]) => cacheInstance.set(key, value)));
|
|
77
|
-
const results = await Promise.all(Object.keys(testData).map((key) => cacheInstance.get(key)));
|
|
78
|
-
globalExpect(results[0]).toBe("hello");
|
|
79
|
-
globalExpect(results[1]).toBe(42);
|
|
80
|
-
globalExpect(results[2]).toBe(true);
|
|
81
|
-
globalExpect(results[3]).toEqual({ nested: true });
|
|
82
|
-
globalExpect(results[4]).toEqual([
|
|
83
|
-
1,
|
|
84
|
-
2,
|
|
85
|
-
3
|
|
86
|
-
]);
|
|
87
|
-
globalExpect(results[5]).toBeNull();
|
|
88
|
-
});
|
|
89
|
-
it("should handle key isolation", async () => {
|
|
90
|
-
await cacheInstance.set("user:1", "User One");
|
|
91
|
-
await cacheInstance.set("user:2", "User Two");
|
|
92
|
-
await cacheInstance.set("session:1", "Session One");
|
|
93
|
-
await cacheInstance.delete("user:1");
|
|
94
|
-
globalExpect(await cacheInstance.get("user:1")).toBeUndefined();
|
|
95
|
-
globalExpect(await cacheInstance.get("user:2")).toBe("User Two");
|
|
96
|
-
globalExpect(await cacheInstance.get("session:1")).toBe("Session One");
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
describe("cache migration scenarios", () => {
|
|
102
|
-
it("should support migrating data between cache implementations", async () => {
|
|
103
|
-
const sourceCache = new InMemoryCache();
|
|
104
|
-
const targetCache = new InMemoryCache();
|
|
105
|
-
const testData = {
|
|
106
|
-
"user:1": {
|
|
107
|
-
id: 1,
|
|
108
|
-
name: "John"
|
|
109
|
-
},
|
|
110
|
-
"user:2": {
|
|
111
|
-
id: 2,
|
|
112
|
-
name: "Jane"
|
|
113
|
-
},
|
|
114
|
-
"config:app": {
|
|
115
|
-
theme: "dark",
|
|
116
|
-
notifications: true
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
for (const [key, value] of Object.entries(testData)) await sourceCache.set(key, value);
|
|
120
|
-
const migrationKeys = Object.keys(testData);
|
|
121
|
-
for (const key of migrationKeys) {
|
|
122
|
-
const value = await sourceCache.get(key);
|
|
123
|
-
if (value !== void 0) await targetCache.set(key, value);
|
|
124
|
-
}
|
|
125
|
-
for (const [key, expectedValue] of Object.entries(testData)) {
|
|
126
|
-
const migratedValue = await targetCache.get(key);
|
|
127
|
-
globalExpect(migratedValue).toEqual(expectedValue);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe("cache abstraction patterns", () => {
|
|
132
|
-
it("should support cache factory pattern", async () => {
|
|
133
|
-
const createCache = (type) => {
|
|
134
|
-
switch (type) {
|
|
135
|
-
case "memory": return new InMemoryCache();
|
|
136
|
-
default: throw new Error(`Unknown cache type: ${type}`);
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
const userCache = createCache("memory");
|
|
140
|
-
const sessionCache = createCache("memory");
|
|
141
|
-
await userCache.set("user:1", {
|
|
142
|
-
id: 1,
|
|
143
|
-
name: "John"
|
|
144
|
-
});
|
|
145
|
-
await sessionCache.set("session:abc", "active");
|
|
146
|
-
globalExpect(await userCache.get("user:1")).toEqual({
|
|
147
|
-
id: 1,
|
|
148
|
-
name: "John"
|
|
149
|
-
});
|
|
150
|
-
globalExpect(await sessionCache.get("session:abc")).toBe("active");
|
|
151
|
-
});
|
|
152
|
-
it("should support cache wrapper pattern", async () => {
|
|
153
|
-
class LoggingCache {
|
|
154
|
-
logs = [];
|
|
155
|
-
constructor(underlying) {
|
|
156
|
-
this.underlying = underlying;
|
|
157
|
-
}
|
|
158
|
-
async get(key) {
|
|
159
|
-
this.logs.push(`GET ${key}`);
|
|
160
|
-
return this.underlying.get(key);
|
|
161
|
-
}
|
|
162
|
-
async set(key, value) {
|
|
163
|
-
this.logs.push(`SET ${key}`);
|
|
164
|
-
return this.underlying.set(key, value);
|
|
165
|
-
}
|
|
166
|
-
async delete(key) {
|
|
167
|
-
this.logs.push(`DELETE ${key}`);
|
|
168
|
-
return this.underlying.delete(key);
|
|
169
|
-
}
|
|
170
|
-
getLogs() {
|
|
171
|
-
return [...this.logs];
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const baseCache = new InMemoryCache();
|
|
175
|
-
const loggingCache = new LoggingCache(baseCache);
|
|
176
|
-
await loggingCache.set("test", "value");
|
|
177
|
-
await loggingCache.get("test");
|
|
178
|
-
await loggingCache.delete("test");
|
|
179
|
-
const logs = loggingCache.getLogs();
|
|
180
|
-
globalExpect(logs).toEqual([
|
|
181
|
-
"SET test",
|
|
182
|
-
"GET test",
|
|
183
|
-
"DELETE test"
|
|
184
|
-
]);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
describe("performance and stress tests", () => {
|
|
188
|
-
it("should handle large number of operations", async () => {
|
|
189
|
-
const cache = new InMemoryCache();
|
|
190
|
-
const operationCount = 1e3;
|
|
191
|
-
const insertPromises = Array.from({ length: operationCount }, (_, i) => cache.set(`key:${i}`, i));
|
|
192
|
-
await Promise.all(insertPromises);
|
|
193
|
-
const readPromises = Array.from({ length: operationCount }, (_, i) => cache.get(`key:${i}`));
|
|
194
|
-
const results = await Promise.all(readPromises);
|
|
195
|
-
for (let i = 0; i < operationCount; i++) globalExpect(results[i]).toBe(i);
|
|
196
|
-
const deletePromises = Array.from({ length: operationCount }, (_, i) => cache.delete(`key:${i}`));
|
|
197
|
-
await Promise.all(deletePromises);
|
|
198
|
-
const postDeleteRead = await cache.get("key:0");
|
|
199
|
-
globalExpect(postDeleteRead).toBeUndefined();
|
|
200
|
-
});
|
|
201
|
-
it("should handle large objects efficiently", async () => {
|
|
202
|
-
const cache = new InMemoryCache();
|
|
203
|
-
const largeObject = {
|
|
204
|
-
id: 1,
|
|
205
|
-
data: Array.from({ length: 1e3 }, (_, i) => ({
|
|
206
|
-
index: i,
|
|
207
|
-
value: `value-${i}`,
|
|
208
|
-
metadata: {
|
|
209
|
-
timestamp: Date.now(),
|
|
210
|
-
random: Math.random()
|
|
211
|
-
}
|
|
212
|
-
}))
|
|
213
|
-
};
|
|
214
|
-
const startTime = Date.now();
|
|
215
|
-
await cache.set("large-object", largeObject);
|
|
216
|
-
const result = await cache.get("large-object");
|
|
217
|
-
const endTime = Date.now();
|
|
218
|
-
globalExpect(result).toEqual(largeObject);
|
|
219
|
-
globalExpect(endTime - startTime).toBeLessThan(100);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
describe("error scenarios", () => {
|
|
223
|
-
it("should handle operations after errors gracefully", async () => {
|
|
224
|
-
const cache = new InMemoryCache();
|
|
225
|
-
await cache.set("valid-key", "valid-value");
|
|
226
|
-
globalExpect(await cache.get("valid-key")).toBe("valid-value");
|
|
227
|
-
await cache.set("another-key", "another-value");
|
|
228
|
-
globalExpect(await cache.get("another-key")).toBe("another-value");
|
|
229
|
-
await cache.delete("valid-key");
|
|
230
|
-
globalExpect(await cache.get("valid-key")).toBeUndefined();
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
//#endregion
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
require('../src-C7d6HaTp.cjs');
|
|
2
|
-
const require_memory = require('../memory-Csy6J-Ak.cjs');
|
|
3
|
-
const require_vi_bdSIJ99Y = require('../vi.bdSIJ99Y-B-qkABPq.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/__tests__/memory.spec.ts
|
|
6
|
-
require_vi_bdSIJ99Y.describe("InMemoryCache", () => {
|
|
7
|
-
let cache;
|
|
8
|
-
require_vi_bdSIJ99Y.beforeEach(() => {
|
|
9
|
-
cache = new require_memory.InMemoryCache();
|
|
10
|
-
});
|
|
11
|
-
require_vi_bdSIJ99Y.describe("get", () => {
|
|
12
|
-
require_vi_bdSIJ99Y.it("should return undefined for non-existent key", async () => {
|
|
13
|
-
const result = await cache.get("non-existent");
|
|
14
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBeUndefined();
|
|
15
|
-
});
|
|
16
|
-
require_vi_bdSIJ99Y.it("should return value for existing key", async () => {
|
|
17
|
-
await cache.set("test-key", "test-value");
|
|
18
|
-
const result = await cache.get("test-key");
|
|
19
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBe("test-value");
|
|
20
|
-
});
|
|
21
|
-
require_vi_bdSIJ99Y.it("should handle different data types", async () => {
|
|
22
|
-
const objectValue = {
|
|
23
|
-
id: 1,
|
|
24
|
-
name: "test"
|
|
25
|
-
};
|
|
26
|
-
const arrayValue = [
|
|
27
|
-
1,
|
|
28
|
-
2,
|
|
29
|
-
3
|
|
30
|
-
];
|
|
31
|
-
const numberValue = 42;
|
|
32
|
-
const booleanValue = true;
|
|
33
|
-
await cache.set("object", objectValue);
|
|
34
|
-
await cache.set("array", arrayValue);
|
|
35
|
-
await cache.set("number", numberValue);
|
|
36
|
-
await cache.set("boolean", booleanValue);
|
|
37
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("object")).toEqual(objectValue);
|
|
38
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("array")).toEqual(arrayValue);
|
|
39
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("number")).toBe(numberValue);
|
|
40
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("boolean")).toBe(booleanValue);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
require_vi_bdSIJ99Y.describe("set", () => {
|
|
44
|
-
require_vi_bdSIJ99Y.it("should store string value", async () => {
|
|
45
|
-
await cache.set("string-key", "string-value");
|
|
46
|
-
const result = await cache.get("string-key");
|
|
47
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBe("string-value");
|
|
48
|
-
});
|
|
49
|
-
require_vi_bdSIJ99Y.it("should store object value", async () => {
|
|
50
|
-
const value = {
|
|
51
|
-
id: 1,
|
|
52
|
-
data: "test"
|
|
53
|
-
};
|
|
54
|
-
await cache.set("object-key", value);
|
|
55
|
-
const result = await cache.get("object-key");
|
|
56
|
-
require_vi_bdSIJ99Y.globalExpect(result).toEqual(value);
|
|
57
|
-
});
|
|
58
|
-
require_vi_bdSIJ99Y.it("should overwrite existing value", async () => {
|
|
59
|
-
await cache.set("key", "initial-value");
|
|
60
|
-
await cache.set("key", "updated-value");
|
|
61
|
-
const result = await cache.get("key");
|
|
62
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBe("updated-value");
|
|
63
|
-
});
|
|
64
|
-
require_vi_bdSIJ99Y.it("should handle null values", async () => {
|
|
65
|
-
await cache.set("null-key", null);
|
|
66
|
-
const result = await cache.get("null-key");
|
|
67
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBeNull();
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
require_vi_bdSIJ99Y.describe("delete", () => {
|
|
71
|
-
require_vi_bdSIJ99Y.it("should remove existing key", async () => {
|
|
72
|
-
await cache.set("to-delete", "value");
|
|
73
|
-
await cache.delete("to-delete");
|
|
74
|
-
const result = await cache.get("to-delete");
|
|
75
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBeUndefined();
|
|
76
|
-
});
|
|
77
|
-
require_vi_bdSIJ99Y.it("should not throw error for non-existent key", async () => {
|
|
78
|
-
await require_vi_bdSIJ99Y.globalExpect(cache.delete("non-existent")).resolves.not.toThrow();
|
|
79
|
-
});
|
|
80
|
-
require_vi_bdSIJ99Y.it("should only delete specified key", async () => {
|
|
81
|
-
await cache.set("key1", "value1");
|
|
82
|
-
await cache.set("key2", "value2");
|
|
83
|
-
await cache.delete("key1");
|
|
84
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("key1")).toBeUndefined();
|
|
85
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("key2")).toBe("value2");
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
require_vi_bdSIJ99Y.describe("multiple operations", () => {
|
|
89
|
-
require_vi_bdSIJ99Y.it("should handle multiple keys independently", async () => {
|
|
90
|
-
await cache.set("key1", "value1");
|
|
91
|
-
await cache.set("key2", "value2");
|
|
92
|
-
await cache.set("key3", "value3");
|
|
93
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("key1")).toBe("value1");
|
|
94
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("key2")).toBe("value2");
|
|
95
|
-
require_vi_bdSIJ99Y.globalExpect(await cache.get("key3")).toBe("value3");
|
|
96
|
-
});
|
|
97
|
-
require_vi_bdSIJ99Y.it("should maintain data integrity across operations", async () => {
|
|
98
|
-
const data = { count: 0 };
|
|
99
|
-
await cache.set("counter", data);
|
|
100
|
-
const retrieved = await cache.get("counter");
|
|
101
|
-
retrieved.count = 5;
|
|
102
|
-
const original = await cache.get("counter");
|
|
103
|
-
require_vi_bdSIJ99Y.globalExpect(original.count).toBe(5);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
require_vi_bdSIJ99Y.describe("edge cases", () => {
|
|
107
|
-
require_vi_bdSIJ99Y.it("should handle empty string as key", async () => {
|
|
108
|
-
await cache.set("", "empty-key-value");
|
|
109
|
-
const result = await cache.get("");
|
|
110
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBe("empty-key-value");
|
|
111
|
-
});
|
|
112
|
-
require_vi_bdSIJ99Y.it("should handle special characters in keys", async () => {
|
|
113
|
-
const specialKey = "key!@#$%^&*()_+{}|:\"<>?[]\\;',./?`~";
|
|
114
|
-
await cache.set(specialKey, "special-value");
|
|
115
|
-
const result = await cache.get(specialKey);
|
|
116
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBe("special-value");
|
|
117
|
-
});
|
|
118
|
-
require_vi_bdSIJ99Y.it("should handle undefined values", async () => {
|
|
119
|
-
await cache.set("undefined-key", void 0);
|
|
120
|
-
const result = await cache.get("undefined-key");
|
|
121
|
-
require_vi_bdSIJ99Y.globalExpect(result).toBeUndefined();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
//#endregion
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|