@hazeljs/prompts 0.2.0-alpha.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/LICENSE +192 -0
- package/README.md +461 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +255 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/stores/file.store.test.d.ts +2 -0
- package/dist/__tests__/stores/file.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/file.store.test.js +134 -0
- package/dist/__tests__/stores/file.store.test.js.map +1 -0
- package/dist/__tests__/stores/memory.store.test.d.ts +2 -0
- package/dist/__tests__/stores/memory.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/memory.store.test.js +74 -0
- package/dist/__tests__/stores/memory.store.test.js.map +1 -0
- package/dist/__tests__/stores/multi.store.test.d.ts +2 -0
- package/dist/__tests__/stores/multi.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/multi.store.test.js +81 -0
- package/dist/__tests__/stores/multi.store.test.js.map +1 -0
- package/dist/__tests__/template.test.d.ts +2 -0
- package/dist/__tests__/template.test.d.ts.map +1 -0
- package/dist/__tests__/template.test.js +60 -0
- package/dist/__tests__/template.test.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +153 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +288 -0
- package/dist/registry.js.map +1 -0
- package/dist/stores/database.store.d.ts +93 -0
- package/dist/stores/database.store.d.ts.map +1 -0
- package/dist/stores/database.store.js +46 -0
- package/dist/stores/database.store.js.map +1 -0
- package/dist/stores/file.store.d.ts +49 -0
- package/dist/stores/file.store.d.ts.map +1 -0
- package/dist/stores/file.store.js +105 -0
- package/dist/stores/file.store.js.map +1 -0
- package/dist/stores/index.d.ts +10 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +14 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/memory.store.d.ts +21 -0
- package/dist/stores/memory.store.d.ts.map +1 -0
- package/dist/stores/memory.store.js +63 -0
- package/dist/stores/memory.store.js.map +1 -0
- package/dist/stores/multi.store.d.ts +44 -0
- package/dist/stores/multi.store.d.ts.map +1 -0
- package/dist/stores/multi.store.js +68 -0
- package/dist/stores/multi.store.js.map +1 -0
- package/dist/stores/redis.store.d.ts +65 -0
- package/dist/stores/redis.store.d.ts.map +1 -0
- package/dist/stores/redis.store.js +81 -0
- package/dist/stores/redis.store.js.map +1 -0
- package/dist/stores/store.interface.d.ts +62 -0
- package/dist/stores/store.interface.d.ts.map +1 -0
- package/dist/stores/store.interface.js +3 -0
- package/dist/stores/store.interface.js.map +1 -0
- package/dist/template.d.ts +38 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +46 -0
- package/dist/template.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_1 = require("../registry");
|
|
4
|
+
const template_1 = require("../template");
|
|
5
|
+
const memory_store_1 = require("../stores/memory.store");
|
|
6
|
+
function makeTpl(name, body = 'Hello {name}', version = '1.0.0') {
|
|
7
|
+
return new template_1.PromptTemplate(body, { name, version });
|
|
8
|
+
}
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
registry_1.PromptRegistry.clear();
|
|
11
|
+
registry_1.PromptRegistry.configure([]);
|
|
12
|
+
});
|
|
13
|
+
afterAll(() => {
|
|
14
|
+
registry_1.PromptRegistry.clear();
|
|
15
|
+
registry_1.PromptRegistry.configure([]);
|
|
16
|
+
});
|
|
17
|
+
// ── Sync API ──────────────────────────────────────────────────────────────────
|
|
18
|
+
describe('register()', () => {
|
|
19
|
+
it('registers a new prompt', () => {
|
|
20
|
+
registry_1.PromptRegistry.register('test:key', makeTpl('T'));
|
|
21
|
+
expect(registry_1.PromptRegistry.has('test:key')).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
it('does NOT overwrite an existing registration', () => {
|
|
24
|
+
registry_1.PromptRegistry.register('test:key', makeTpl('First', 'First template'));
|
|
25
|
+
registry_1.PromptRegistry.register('test:key', makeTpl('Second', 'Second template'));
|
|
26
|
+
expect(registry_1.PromptRegistry.get('test:key').template).toBe('First template');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('override()', () => {
|
|
30
|
+
it('registers a new prompt', () => {
|
|
31
|
+
registry_1.PromptRegistry.override('test:override', makeTpl('OV'));
|
|
32
|
+
expect(registry_1.PromptRegistry.has('test:override')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it('overwrites an existing registration', () => {
|
|
35
|
+
registry_1.PromptRegistry.register('test:key', makeTpl('First', 'First template'));
|
|
36
|
+
registry_1.PromptRegistry.override('test:key', makeTpl('Second', 'Second template'));
|
|
37
|
+
expect(registry_1.PromptRegistry.get('test:key').template).toBe('Second template');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('get()', () => {
|
|
41
|
+
it('returns a registered prompt', () => {
|
|
42
|
+
const tpl = makeTpl('Getter');
|
|
43
|
+
registry_1.PromptRegistry.register('get:test', tpl);
|
|
44
|
+
expect(registry_1.PromptRegistry.get('get:test')).toBe(tpl);
|
|
45
|
+
});
|
|
46
|
+
it('throws a descriptive error for unknown key', () => {
|
|
47
|
+
expect(() => registry_1.PromptRegistry.get('nonexistent:key')).toThrow('[PromptRegistry] Prompt not found: "nonexistent:key"');
|
|
48
|
+
});
|
|
49
|
+
it('error message lists registered keys', () => {
|
|
50
|
+
registry_1.PromptRegistry.register('existing:key', makeTpl('EX'));
|
|
51
|
+
expect(() => registry_1.PromptRegistry.get('unknown')).toThrow('existing:key');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('get() with version', () => {
|
|
55
|
+
it('returns a specific cached version', () => {
|
|
56
|
+
const v1 = new template_1.PromptTemplate('v1 template', { name: 'T', version: '1.0.0' });
|
|
57
|
+
const v2 = new template_1.PromptTemplate('v2 template', { name: 'T', version: '2.0.0' });
|
|
58
|
+
registry_1.PromptRegistry.register('versioned:key', v1);
|
|
59
|
+
registry_1.PromptRegistry.override('versioned:key', v2);
|
|
60
|
+
expect(registry_1.PromptRegistry.get('versioned:key', '1.0.0').template).toBe('v1 template');
|
|
61
|
+
expect(registry_1.PromptRegistry.get('versioned:key', '2.0.0').template).toBe('v2 template');
|
|
62
|
+
});
|
|
63
|
+
it('throws for an unknown version', () => {
|
|
64
|
+
registry_1.PromptRegistry.register('versioned:key', makeTpl('T', 'body', '1.0.0'));
|
|
65
|
+
expect(() => registry_1.PromptRegistry.get('versioned:key', '9.9.9')).toThrow('9.9.9');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('has()', () => {
|
|
69
|
+
it('returns true for registered key', () => {
|
|
70
|
+
registry_1.PromptRegistry.register('has:test', makeTpl('H'));
|
|
71
|
+
expect(registry_1.PromptRegistry.has('has:test')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('returns false for unregistered key', () => {
|
|
74
|
+
expect(registry_1.PromptRegistry.has('missing:key')).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it('checks a specific version', () => {
|
|
77
|
+
registry_1.PromptRegistry.register('has:v', makeTpl('HV', 'body', '1.0.0'));
|
|
78
|
+
expect(registry_1.PromptRegistry.has('has:v', '1.0.0')).toBe(true);
|
|
79
|
+
expect(registry_1.PromptRegistry.has('has:v', '2.0.0')).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('list()', () => {
|
|
83
|
+
it('returns empty array when nothing is registered', () => {
|
|
84
|
+
expect(registry_1.PromptRegistry.list()).toEqual([]);
|
|
85
|
+
});
|
|
86
|
+
it('returns all registered keys in insertion order', () => {
|
|
87
|
+
registry_1.PromptRegistry.register('a', makeTpl('A'));
|
|
88
|
+
registry_1.PromptRegistry.register('b', makeTpl('B'));
|
|
89
|
+
registry_1.PromptRegistry.register('c', makeTpl('C'));
|
|
90
|
+
expect(registry_1.PromptRegistry.list()).toEqual(['a', 'b', 'c']);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('versions()', () => {
|
|
94
|
+
it('returns empty array for unregistered key', () => {
|
|
95
|
+
expect(registry_1.PromptRegistry.versions('unknown')).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
it('returns cached versions for a key', () => {
|
|
98
|
+
registry_1.PromptRegistry.register('v:key', makeTpl('T', 'body', '1.0.0'));
|
|
99
|
+
registry_1.PromptRegistry.override('v:key', makeTpl('T', 'body', '2.0.0'));
|
|
100
|
+
const vers = registry_1.PromptRegistry.versions('v:key');
|
|
101
|
+
expect(vers).toContain('1.0.0');
|
|
102
|
+
expect(vers).toContain('2.0.0');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('unregister()', () => {
|
|
106
|
+
it('removes a registered key', () => {
|
|
107
|
+
registry_1.PromptRegistry.register('remove:me', makeTpl('RM'));
|
|
108
|
+
registry_1.PromptRegistry.unregister('remove:me');
|
|
109
|
+
expect(registry_1.PromptRegistry.has('remove:me')).toBe(false);
|
|
110
|
+
});
|
|
111
|
+
it('removes only a specific version when version supplied', () => {
|
|
112
|
+
registry_1.PromptRegistry.register('remove:v', makeTpl('RV', 'body', '1.0.0'));
|
|
113
|
+
registry_1.PromptRegistry.override('remove:v', makeTpl('RV', 'body', '2.0.0'));
|
|
114
|
+
registry_1.PromptRegistry.unregister('remove:v', '1.0.0');
|
|
115
|
+
expect(registry_1.PromptRegistry.has('remove:v', '1.0.0')).toBe(false);
|
|
116
|
+
expect(registry_1.PromptRegistry.has('remove:v', '2.0.0')).toBe(true);
|
|
117
|
+
});
|
|
118
|
+
it('is a no-op for non-existent key', () => {
|
|
119
|
+
expect(() => registry_1.PromptRegistry.unregister('does:not:exist')).not.toThrow();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('clear()', () => {
|
|
123
|
+
it('removes all registered prompts', () => {
|
|
124
|
+
registry_1.PromptRegistry.register('a', makeTpl('A'));
|
|
125
|
+
registry_1.PromptRegistry.register('b', makeTpl('B'));
|
|
126
|
+
registry_1.PromptRegistry.clear();
|
|
127
|
+
expect(registry_1.PromptRegistry.list()).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
// ── Store API ─────────────────────────────────────────────────────────────────
|
|
131
|
+
describe('configure() / addStore() / storeNames()', () => {
|
|
132
|
+
it('configure() sets stores', () => {
|
|
133
|
+
const store = new memory_store_1.MemoryStore();
|
|
134
|
+
registry_1.PromptRegistry.configure([store]);
|
|
135
|
+
expect(registry_1.PromptRegistry.storeNames()).toContain('memory');
|
|
136
|
+
});
|
|
137
|
+
it('addStore() appends a store', () => {
|
|
138
|
+
registry_1.PromptRegistry.configure([new memory_store_1.MemoryStore()]);
|
|
139
|
+
registry_1.PromptRegistry.addStore(new memory_store_1.MemoryStore());
|
|
140
|
+
expect(registry_1.PromptRegistry.storeNames()).toHaveLength(2);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('save() / saveAll()', () => {
|
|
144
|
+
it('save() persists to configured stores', async () => {
|
|
145
|
+
const store = new memory_store_1.MemoryStore();
|
|
146
|
+
registry_1.PromptRegistry.configure([store]);
|
|
147
|
+
registry_1.PromptRegistry.register('save:test', makeTpl('ST', 'body', '1.0.0'));
|
|
148
|
+
await registry_1.PromptRegistry.save('save:test');
|
|
149
|
+
expect(await store.has('save:test')).toBe(true);
|
|
150
|
+
});
|
|
151
|
+
it('saveAll() persists all prompts', async () => {
|
|
152
|
+
const store = new memory_store_1.MemoryStore();
|
|
153
|
+
registry_1.PromptRegistry.configure([store]);
|
|
154
|
+
registry_1.PromptRegistry.register('sa:1', makeTpl('SA1'));
|
|
155
|
+
registry_1.PromptRegistry.register('sa:2', makeTpl('SA2'));
|
|
156
|
+
await registry_1.PromptRegistry.saveAll();
|
|
157
|
+
expect(await store.has('sa:1')).toBe(true);
|
|
158
|
+
expect(await store.has('sa:2')).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('loadAll()', () => {
|
|
162
|
+
it('loads prompts from the primary store into cache', async () => {
|
|
163
|
+
const store = new memory_store_1.MemoryStore();
|
|
164
|
+
registry_1.PromptRegistry.configure([store]);
|
|
165
|
+
const tpl = makeTpl('Loaded', 'loaded body', '1.0.0');
|
|
166
|
+
await store.set({
|
|
167
|
+
key: 'load:test',
|
|
168
|
+
version: '1.0.0',
|
|
169
|
+
template: tpl.template,
|
|
170
|
+
metadata: tpl.metadata,
|
|
171
|
+
storedAt: new Date().toISOString(),
|
|
172
|
+
});
|
|
173
|
+
await registry_1.PromptRegistry.loadAll();
|
|
174
|
+
expect(registry_1.PromptRegistry.has('load:test')).toBe(true);
|
|
175
|
+
expect(registry_1.PromptRegistry.get('load:test').template).toBe('loaded body');
|
|
176
|
+
});
|
|
177
|
+
it('loadAll(true) overwrites existing cache entries', async () => {
|
|
178
|
+
const store = new memory_store_1.MemoryStore();
|
|
179
|
+
registry_1.PromptRegistry.configure([store]);
|
|
180
|
+
registry_1.PromptRegistry.register('overwrite:test', makeTpl('Old', 'old body'));
|
|
181
|
+
await store.set({
|
|
182
|
+
key: 'overwrite:test',
|
|
183
|
+
version: '2.0.0',
|
|
184
|
+
template: 'new body',
|
|
185
|
+
metadata: { name: 'New', version: '2.0.0' },
|
|
186
|
+
storedAt: new Date().toISOString(),
|
|
187
|
+
});
|
|
188
|
+
await registry_1.PromptRegistry.loadAll(true);
|
|
189
|
+
expect(registry_1.PromptRegistry.get('overwrite:test').template).toBe('new body');
|
|
190
|
+
});
|
|
191
|
+
it('loadAll() is a no-op when no stores configured', async () => {
|
|
192
|
+
registry_1.PromptRegistry.register('noop:test', makeTpl('NOOP'));
|
|
193
|
+
await expect(registry_1.PromptRegistry.loadAll()).resolves.not.toThrow();
|
|
194
|
+
expect(registry_1.PromptRegistry.has('noop:test')).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe('load()', () => {
|
|
198
|
+
it('loads a single prompt from store into cache', async () => {
|
|
199
|
+
const store = new memory_store_1.MemoryStore();
|
|
200
|
+
registry_1.PromptRegistry.configure([store]);
|
|
201
|
+
await store.set({
|
|
202
|
+
key: 'load:single',
|
|
203
|
+
version: 'latest',
|
|
204
|
+
template: 'single body',
|
|
205
|
+
metadata: { name: 'S' },
|
|
206
|
+
storedAt: new Date().toISOString(),
|
|
207
|
+
});
|
|
208
|
+
const tpl = await registry_1.PromptRegistry.load('load:single');
|
|
209
|
+
expect(tpl?.template).toBe('single body');
|
|
210
|
+
expect(registry_1.PromptRegistry.has('load:single')).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
it('returns null when not found in any store', async () => {
|
|
213
|
+
registry_1.PromptRegistry.configure([new memory_store_1.MemoryStore()]);
|
|
214
|
+
const result = await registry_1.PromptRegistry.load('totally:missing');
|
|
215
|
+
expect(result).toBeNull();
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('getAsync()', () => {
|
|
219
|
+
it('returns cached prompt without hitting stores', async () => {
|
|
220
|
+
const tpl = makeTpl('Cached');
|
|
221
|
+
registry_1.PromptRegistry.register('cached:key', tpl);
|
|
222
|
+
const result = await registry_1.PromptRegistry.getAsync('cached:key');
|
|
223
|
+
expect(result).toBe(tpl);
|
|
224
|
+
});
|
|
225
|
+
it('falls back to store when not in cache', async () => {
|
|
226
|
+
const store = new memory_store_1.MemoryStore();
|
|
227
|
+
registry_1.PromptRegistry.configure([store]);
|
|
228
|
+
await store.set({
|
|
229
|
+
key: 'async:key',
|
|
230
|
+
version: 'latest',
|
|
231
|
+
template: 'async body',
|
|
232
|
+
metadata: { name: 'Async' },
|
|
233
|
+
storedAt: new Date().toISOString(),
|
|
234
|
+
});
|
|
235
|
+
const result = await registry_1.PromptRegistry.getAsync('async:key');
|
|
236
|
+
expect(result.template).toBe('async body');
|
|
237
|
+
});
|
|
238
|
+
it('throws when not found anywhere', async () => {
|
|
239
|
+
registry_1.PromptRegistry.configure([new memory_store_1.MemoryStore()]);
|
|
240
|
+
await expect(registry_1.PromptRegistry.getAsync('totally:missing')).rejects.toThrow('[PromptRegistry] Prompt "totally:missing"');
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
// ── End-to-end ────────────────────────────────────────────────────────────────
|
|
244
|
+
describe('end-to-end render via registry', () => {
|
|
245
|
+
it('retrieves and renders correctly', () => {
|
|
246
|
+
const tpl = new template_1.PromptTemplate('Context: {context}\nQ: {query}', { name: 'E2E', version: '1.0.0' });
|
|
247
|
+
registry_1.PromptRegistry.register('e2e:test', tpl);
|
|
248
|
+
const rendered = registry_1.PromptRegistry.get('e2e:test').render({
|
|
249
|
+
query: 'What is TypeScript?',
|
|
250
|
+
context: 'TypeScript is a typed superset of JavaScript.',
|
|
251
|
+
});
|
|
252
|
+
expect(rendered).toBe('Context: TypeScript is a typed superset of JavaScript.\nQ: What is TypeScript?');
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.store.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/stores/file.store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const os_1 = require("os");
|
|
37
|
+
const path_1 = require("path");
|
|
38
|
+
const promises_1 = require("fs/promises");
|
|
39
|
+
const file_store_1 = require("../../stores/file.store");
|
|
40
|
+
function entry(key, version = '1.0.0', template = 'Hi {name}') {
|
|
41
|
+
return {
|
|
42
|
+
key,
|
|
43
|
+
version,
|
|
44
|
+
template,
|
|
45
|
+
metadata: { name: key, version },
|
|
46
|
+
storedAt: new Date().toISOString(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function tmpFile() {
|
|
50
|
+
return (0, path_1.join)((0, os_1.tmpdir)(), `prompts-test-${Date.now()}-${Math.random()}.json`);
|
|
51
|
+
}
|
|
52
|
+
describe('FileStore', () => {
|
|
53
|
+
let filePath;
|
|
54
|
+
let store;
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
filePath = tmpFile();
|
|
57
|
+
store = new file_store_1.FileStore({ filePath });
|
|
58
|
+
});
|
|
59
|
+
afterEach(async () => {
|
|
60
|
+
await (0, promises_1.rm)(filePath, { force: true });
|
|
61
|
+
});
|
|
62
|
+
it('has name "file"', () => {
|
|
63
|
+
expect(store.name).toBe('file');
|
|
64
|
+
});
|
|
65
|
+
it('set / get roundtrip', async () => {
|
|
66
|
+
await store.set(entry('a:key'));
|
|
67
|
+
const result = await store.get('a:key', '1.0.0');
|
|
68
|
+
expect(result?.template).toBe('Hi {name}');
|
|
69
|
+
});
|
|
70
|
+
it('get() defaults to latest', async () => {
|
|
71
|
+
await store.set(entry('a:key', '1.0.0'));
|
|
72
|
+
const latest = await store.get('a:key');
|
|
73
|
+
expect(latest?.version).toBe('latest');
|
|
74
|
+
});
|
|
75
|
+
it('get() returns undefined for missing key', async () => {
|
|
76
|
+
expect(await store.get('missing:key')).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
it('has() returns true when entry exists', async () => {
|
|
79
|
+
await store.set(entry('b:key'));
|
|
80
|
+
expect(await store.has('b:key', '1.0.0')).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('has() returns false when entry missing', async () => {
|
|
83
|
+
expect(await store.has('nope:key')).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('delete() by version removes only that version', async () => {
|
|
86
|
+
await store.set(entry('c:key', '1.0.0'));
|
|
87
|
+
await store.set(entry('c:key', '2.0.0'));
|
|
88
|
+
await store.delete('c:key', '1.0.0');
|
|
89
|
+
expect(await store.has('c:key', '1.0.0')).toBe(false);
|
|
90
|
+
expect(await store.has('c:key', '2.0.0')).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it('delete() without version removes all versions', async () => {
|
|
93
|
+
await store.set(entry('d:key', '1.0.0'));
|
|
94
|
+
await store.delete('d:key');
|
|
95
|
+
expect(await store.has('d:key')).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('keys() returns unique keys', async () => {
|
|
98
|
+
await store.set(entry('k1', '1.0.0'));
|
|
99
|
+
await store.set(entry('k1', '2.0.0'));
|
|
100
|
+
await store.set(entry('k2'));
|
|
101
|
+
const keys = await store.keys();
|
|
102
|
+
expect(keys).toContain('k1');
|
|
103
|
+
expect(keys).toContain('k2');
|
|
104
|
+
expect(keys.filter((k) => k === 'k1')).toHaveLength(1);
|
|
105
|
+
});
|
|
106
|
+
it('versions() returns all non-latest versions sorted', async () => {
|
|
107
|
+
await store.set(entry('ver:key', '1.0.0'));
|
|
108
|
+
await store.set(entry('ver:key', '2.0.0'));
|
|
109
|
+
const vers = await store.versions('ver:key');
|
|
110
|
+
expect(vers).toEqual(['1.0.0', '2.0.0']);
|
|
111
|
+
});
|
|
112
|
+
it('versions() returns empty array for unknown key', async () => {
|
|
113
|
+
expect(await store.versions('unknown')).toEqual([]);
|
|
114
|
+
});
|
|
115
|
+
it('persists across store instances (new FileStore reads same file)', async () => {
|
|
116
|
+
await store.set(entry('persist:key', '1.0.0', 'Persistent template'));
|
|
117
|
+
const store2 = new file_store_1.FileStore({ filePath });
|
|
118
|
+
const result = await store2.get('persist:key', '1.0.0');
|
|
119
|
+
expect(result?.template).toBe('Persistent template');
|
|
120
|
+
});
|
|
121
|
+
it('invalidate() forces re-read from disk', async () => {
|
|
122
|
+
await store.set(entry('inv:key'));
|
|
123
|
+
store.invalidate();
|
|
124
|
+
expect(await store.has('inv:key', '1.0.0')).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it('pretty option defaults to true (indented JSON)', async () => {
|
|
127
|
+
const prettyStore = new file_store_1.FileStore({ filePath, pretty: true });
|
|
128
|
+
await prettyStore.set(entry('pretty:key'));
|
|
129
|
+
const { readFile } = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
130
|
+
const raw = await readFile(filePath, 'utf8');
|
|
131
|
+
expect(raw).toMatch(/\n {2}/);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=file.store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.store.test.js","sourceRoot":"","sources":["../../../src/__tests__/stores/file.store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/stores/memory.store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const memory_store_1 = require("../../stores/memory.store");
|
|
4
|
+
function entry(key, version = '1.0.0', template = 'Hello {name}') {
|
|
5
|
+
return {
|
|
6
|
+
key,
|
|
7
|
+
version,
|
|
8
|
+
template,
|
|
9
|
+
metadata: { name: key, version },
|
|
10
|
+
storedAt: new Date().toISOString(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
describe('MemoryStore', () => {
|
|
14
|
+
let store;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
store = new memory_store_1.MemoryStore();
|
|
17
|
+
});
|
|
18
|
+
it('has name "memory"', () => {
|
|
19
|
+
expect(store.name).toBe('memory');
|
|
20
|
+
});
|
|
21
|
+
it('set / get roundtrip', async () => {
|
|
22
|
+
await store.set(entry('a:key'));
|
|
23
|
+
const result = await store.get('a:key', '1.0.0');
|
|
24
|
+
expect(result?.template).toBe('Hello {name}');
|
|
25
|
+
});
|
|
26
|
+
it('get() defaults to latest', async () => {
|
|
27
|
+
await store.set(entry('a:key', '1.0.0'));
|
|
28
|
+
const latest = await store.get('a:key');
|
|
29
|
+
expect(latest?.version).toBe('latest');
|
|
30
|
+
});
|
|
31
|
+
it('get() returns undefined for missing key', async () => {
|
|
32
|
+
expect(await store.get('missing:key')).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
it('has() returns true when entry exists', async () => {
|
|
35
|
+
await store.set(entry('b:key'));
|
|
36
|
+
expect(await store.has('b:key', '1.0.0')).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('has() returns false when entry missing', async () => {
|
|
39
|
+
expect(await store.has('nope:key')).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
it('delete() by version removes only that version', async () => {
|
|
42
|
+
await store.set(entry('c:key', '1.0.0'));
|
|
43
|
+
await store.set(entry('c:key', '2.0.0'));
|
|
44
|
+
await store.delete('c:key', '1.0.0');
|
|
45
|
+
expect(await store.has('c:key', '1.0.0')).toBe(false);
|
|
46
|
+
expect(await store.has('c:key', '2.0.0')).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('delete() without version removes all versions', async () => {
|
|
49
|
+
await store.set(entry('d:key', '1.0.0'));
|
|
50
|
+
await store.set(entry('d:key', '2.0.0'));
|
|
51
|
+
await store.delete('d:key');
|
|
52
|
+
expect(await store.has('d:key')).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('keys() returns unique keys', async () => {
|
|
55
|
+
await store.set(entry('k1', '1.0.0'));
|
|
56
|
+
await store.set(entry('k1', '2.0.0'));
|
|
57
|
+
await store.set(entry('k2'));
|
|
58
|
+
const keys = await store.keys();
|
|
59
|
+
expect(keys).toContain('k1');
|
|
60
|
+
expect(keys).toContain('k2');
|
|
61
|
+
// k1 appears only once despite multiple versions
|
|
62
|
+
expect(keys.filter((k) => k === 'k1')).toHaveLength(1);
|
|
63
|
+
});
|
|
64
|
+
it('versions() returns all non-latest versions sorted', async () => {
|
|
65
|
+
await store.set(entry('ver:key', '1.0.0'));
|
|
66
|
+
await store.set(entry('ver:key', '2.0.0'));
|
|
67
|
+
const vers = await store.versions('ver:key');
|
|
68
|
+
expect(vers).toEqual(['1.0.0', '2.0.0']);
|
|
69
|
+
});
|
|
70
|
+
it('versions() returns empty array for unknown key', async () => {
|
|
71
|
+
expect(await store.versions('unknown')).toEqual([]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=memory.store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.test.js","sourceRoot":"","sources":["../../../src/__tests__/stores/memory.store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi.store.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/stores/multi.store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const multi_store_1 = require("../../stores/multi.store");
|
|
4
|
+
const memory_store_1 = require("../../stores/memory.store");
|
|
5
|
+
function entry(key, version = '1.0.0', template = 'Hi {x}') {
|
|
6
|
+
return {
|
|
7
|
+
key,
|
|
8
|
+
version,
|
|
9
|
+
template,
|
|
10
|
+
metadata: { name: key, version },
|
|
11
|
+
storedAt: new Date().toISOString(),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
describe('MultiStore', () => {
|
|
15
|
+
it('name reflects inner store names', () => {
|
|
16
|
+
const multi = new multi_store_1.MultiStore([new memory_store_1.MemoryStore(), new memory_store_1.MemoryStore()]);
|
|
17
|
+
expect(multi.name).toContain('memory');
|
|
18
|
+
});
|
|
19
|
+
it('set() fans out to all stores', async () => {
|
|
20
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
21
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
22
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
23
|
+
await multi.set(entry('fan:key'));
|
|
24
|
+
expect(await s1.has('fan:key', '1.0.0')).toBe(true);
|
|
25
|
+
expect(await s2.has('fan:key', '1.0.0')).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('get() returns from first store that has the entry', async () => {
|
|
28
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
29
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
30
|
+
await s2.set(entry('only:s2', '1.0.0', 'from s2'));
|
|
31
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
32
|
+
const result = await multi.get('only:s2', '1.0.0');
|
|
33
|
+
expect(result?.template).toBe('from s2');
|
|
34
|
+
});
|
|
35
|
+
it('get() returns undefined when none have the entry', async () => {
|
|
36
|
+
const multi = new multi_store_1.MultiStore([new memory_store_1.MemoryStore()]);
|
|
37
|
+
expect(await multi.get('missing:key')).toBeUndefined();
|
|
38
|
+
});
|
|
39
|
+
it('has() returns true if any store has the entry', async () => {
|
|
40
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
41
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
42
|
+
await s2.set(entry('has:s2'));
|
|
43
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
44
|
+
expect(await multi.has('has:s2', '1.0.0')).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
it('has() returns false if no store has the entry', async () => {
|
|
47
|
+
const multi = new multi_store_1.MultiStore([new memory_store_1.MemoryStore()]);
|
|
48
|
+
expect(await multi.has('nope')).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('delete() removes from all stores', async () => {
|
|
51
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
52
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
53
|
+
await s1.set(entry('del:key'));
|
|
54
|
+
await s2.set(entry('del:key'));
|
|
55
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
56
|
+
await multi.delete('del:key', '1.0.0');
|
|
57
|
+
expect(await s1.has('del:key', '1.0.0')).toBe(false);
|
|
58
|
+
expect(await s2.has('del:key', '1.0.0')).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
it('keys() returns union of keys across stores', async () => {
|
|
61
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
62
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
63
|
+
await s1.set(entry('k1'));
|
|
64
|
+
await s2.set(entry('k2'));
|
|
65
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
66
|
+
const keys = await multi.keys();
|
|
67
|
+
expect(keys).toContain('k1');
|
|
68
|
+
expect(keys).toContain('k2');
|
|
69
|
+
});
|
|
70
|
+
it('versions() returns union of versions across stores', async () => {
|
|
71
|
+
const s1 = new memory_store_1.MemoryStore();
|
|
72
|
+
const s2 = new memory_store_1.MemoryStore();
|
|
73
|
+
await s1.set(entry('vk', '1.0.0'));
|
|
74
|
+
await s2.set(entry('vk', '2.0.0'));
|
|
75
|
+
const multi = new multi_store_1.MultiStore([s1, s2]);
|
|
76
|
+
const vers = await multi.versions('vk');
|
|
77
|
+
expect(vers).toContain('1.0.0');
|
|
78
|
+
expect(vers).toContain('2.0.0');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=multi.store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi.store.test.js","sourceRoot":"","sources":["../../../src/__tests__/stores/multi.store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/template.test.ts"],"names":[],"mappings":""}
|