ai-database 0.1.0 → 2.0.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.
Files changed (72) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +9 -0
  3. package/README.md +381 -68
  4. package/TESTING.md +410 -0
  5. package/TEST_SUMMARY.md +250 -0
  6. package/TODO.md +128 -0
  7. package/dist/ai-promise-db.d.ts +370 -0
  8. package/dist/ai-promise-db.d.ts.map +1 -0
  9. package/dist/ai-promise-db.js +839 -0
  10. package/dist/ai-promise-db.js.map +1 -0
  11. package/dist/authorization.d.ts +531 -0
  12. package/dist/authorization.d.ts.map +1 -0
  13. package/dist/authorization.js +632 -0
  14. package/dist/authorization.js.map +1 -0
  15. package/dist/durable-clickhouse.d.ts +193 -0
  16. package/dist/durable-clickhouse.d.ts.map +1 -0
  17. package/dist/durable-clickhouse.js +422 -0
  18. package/dist/durable-clickhouse.js.map +1 -0
  19. package/dist/durable-promise.d.ts +182 -0
  20. package/dist/durable-promise.d.ts.map +1 -0
  21. package/dist/durable-promise.js +409 -0
  22. package/dist/durable-promise.js.map +1 -0
  23. package/dist/execution-queue.d.ts +239 -0
  24. package/dist/execution-queue.d.ts.map +1 -0
  25. package/dist/execution-queue.js +400 -0
  26. package/dist/execution-queue.js.map +1 -0
  27. package/dist/index.d.ts +50 -191
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +79 -462
  30. package/dist/index.js.map +1 -0
  31. package/dist/linguistic.d.ts +115 -0
  32. package/dist/linguistic.d.ts.map +1 -0
  33. package/dist/linguistic.js +379 -0
  34. package/dist/linguistic.js.map +1 -0
  35. package/dist/memory-provider.d.ts +304 -0
  36. package/dist/memory-provider.d.ts.map +1 -0
  37. package/dist/memory-provider.js +785 -0
  38. package/dist/memory-provider.js.map +1 -0
  39. package/dist/schema.d.ts +899 -0
  40. package/dist/schema.d.ts.map +1 -0
  41. package/dist/schema.js +1165 -0
  42. package/dist/schema.js.map +1 -0
  43. package/dist/tests.d.ts +107 -0
  44. package/dist/tests.d.ts.map +1 -0
  45. package/dist/tests.js +568 -0
  46. package/dist/tests.js.map +1 -0
  47. package/dist/types.d.ts +972 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +126 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +37 -37
  52. package/src/ai-promise-db.ts +1243 -0
  53. package/src/authorization.ts +1102 -0
  54. package/src/durable-clickhouse.ts +596 -0
  55. package/src/durable-promise.ts +582 -0
  56. package/src/execution-queue.ts +608 -0
  57. package/src/index.test.ts +868 -0
  58. package/src/index.ts +337 -0
  59. package/src/linguistic.ts +404 -0
  60. package/src/memory-provider.test.ts +1036 -0
  61. package/src/memory-provider.ts +1119 -0
  62. package/src/schema.test.ts +1254 -0
  63. package/src/schema.ts +2296 -0
  64. package/src/tests.ts +725 -0
  65. package/src/types.ts +1177 -0
  66. package/test/README.md +153 -0
  67. package/test/edge-cases.test.ts +646 -0
  68. package/test/provider-resolution.test.ts +402 -0
  69. package/tsconfig.json +9 -0
  70. package/vitest.config.ts +19 -0
  71. package/dist/index.d.mts +0 -195
  72. package/dist/index.mjs +0 -430
package/dist/tests.js ADDED
@@ -0,0 +1,568 @@
1
+ /**
2
+ * Unified Compliance Test Suite for Database Adapters
3
+ *
4
+ * Provides reusable test factories that any DBClient/DBClientExtended
5
+ * implementation can use to verify compliance with the interface.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createTests } from 'ai-database/tests'
10
+ * import { createClickHouseDatabase } from '@mdxdb/clickhouse'
11
+ *
12
+ * createTests('ClickHouse', () => createClickHouseDatabase({ url: '...' }))
13
+ * ```
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
18
+ // =============================================================================
19
+ // Test Fixtures
20
+ // =============================================================================
21
+ export const fixtures = {
22
+ /** Sample namespace for tests */
23
+ ns: 'test.example.com',
24
+ /** Sample users */
25
+ users: [
26
+ { id: 'user-1', name: 'Alice', email: 'alice@example.com', role: 'admin' },
27
+ { id: 'user-2', name: 'Bob', email: 'bob@example.com', role: 'user' },
28
+ { id: 'user-3', name: 'Charlie', email: 'charlie@example.com', role: 'user' },
29
+ ],
30
+ /** Sample posts */
31
+ posts: [
32
+ { id: 'post-1', title: 'Hello World', content: 'First post', authorId: 'user-1' },
33
+ { id: 'post-2', title: 'Second Post', content: 'More content', authorId: 'user-1' },
34
+ { id: 'post-3', title: 'Bobs Post', content: 'From Bob', authorId: 'user-2' },
35
+ ],
36
+ /** Sample tags */
37
+ tags: [
38
+ { id: 'tag-1', name: 'typescript' },
39
+ { id: 'tag-2', name: 'database' },
40
+ { id: 'tag-3', name: 'testing' },
41
+ ],
42
+ };
43
+ // =============================================================================
44
+ // Main Test Factory
45
+ // =============================================================================
46
+ /**
47
+ * Create a comprehensive test suite for a DBClient implementation
48
+ *
49
+ * @example Basic usage
50
+ * ```ts
51
+ * import { createTests } from 'ai-database/tests'
52
+ *
53
+ * createTests('Memory', {
54
+ * factory: () => new MemoryDBClient()
55
+ * })
56
+ * ```
57
+ *
58
+ * @example With cleanup
59
+ * ```ts
60
+ * createTests('SQLite', {
61
+ * factory: async () => {
62
+ * const db = await createSQLiteClient({ path: ':memory:' })
63
+ * return db
64
+ * },
65
+ * cleanup: async () => {
66
+ * // cleanup temp files
67
+ * }
68
+ * })
69
+ * ```
70
+ *
71
+ * @example Skip certain tests
72
+ * ```ts
73
+ * createTests('Filesystem', {
74
+ * factory: () => createFsClient({ root: tempDir }),
75
+ * skip: { events: true, actions: true, artifacts: true }
76
+ * })
77
+ * ```
78
+ */
79
+ export function createTests(name, options) {
80
+ const { factory, cleanup, skip = {}, ns = fixtures.ns } = options;
81
+ describe(`${name} Compliance Tests`, () => {
82
+ let client;
83
+ beforeAll(async () => {
84
+ client = await factory();
85
+ });
86
+ afterAll(async () => {
87
+ await client.close?.();
88
+ await cleanup?.();
89
+ });
90
+ // =========================================================================
91
+ // Thing CRUD Operations
92
+ // =========================================================================
93
+ describe('Things - CRUD', () => {
94
+ const testThing = {
95
+ ns,
96
+ type: 'TestEntity',
97
+ id: 'crud-test-1',
98
+ data: { name: 'Test', value: 42 },
99
+ };
100
+ afterAll(async () => {
101
+ // Cleanup test data
102
+ try {
103
+ await client.delete(`https://${ns}/TestEntity/crud-test-1`);
104
+ await client.delete(`https://${ns}/TestEntity/crud-test-2`);
105
+ }
106
+ catch {
107
+ // Ignore cleanup errors
108
+ }
109
+ });
110
+ it('creates a thing', async () => {
111
+ const thing = await client.create(testThing);
112
+ expect(thing).toBeDefined();
113
+ expect(thing.ns).toBe(ns);
114
+ expect(thing.type).toBe('TestEntity');
115
+ expect(thing.id).toBe('crud-test-1');
116
+ expect(thing.data.name).toBe('Test');
117
+ expect(thing.data.value).toBe(42);
118
+ expect(thing.createdAt).toBeInstanceOf(Date);
119
+ expect(thing.updatedAt).toBeInstanceOf(Date);
120
+ });
121
+ it('gets a thing by URL', async () => {
122
+ const thing = await client.get(`https://${ns}/TestEntity/crud-test-1`);
123
+ expect(thing).not.toBeNull();
124
+ expect(thing?.data.name).toBe('Test');
125
+ });
126
+ it('gets a thing by ID components', async () => {
127
+ const thing = await client.getById(ns, 'TestEntity', 'crud-test-1');
128
+ expect(thing).not.toBeNull();
129
+ expect(thing?.data.name).toBe('Test');
130
+ });
131
+ it('returns null for non-existent thing', async () => {
132
+ const thing = await client.get(`https://${ns}/TestEntity/does-not-exist`);
133
+ expect(thing).toBeNull();
134
+ });
135
+ it('updates a thing', async () => {
136
+ const updated = await client.update(`https://${ns}/TestEntity/crud-test-1`, {
137
+ data: { name: 'Updated', value: 100 },
138
+ });
139
+ expect(updated.data.name).toBe('Updated');
140
+ expect(updated.data.value).toBe(100);
141
+ expect(updated.updatedAt.getTime()).toBeGreaterThanOrEqual(updated.createdAt.getTime());
142
+ });
143
+ it('upserts a new thing', async () => {
144
+ const thing = await client.upsert({
145
+ ns,
146
+ type: 'TestEntity',
147
+ id: 'crud-test-2',
148
+ data: { name: 'Upserted', value: 200 },
149
+ });
150
+ expect(thing.id).toBe('crud-test-2');
151
+ expect(thing.data.name).toBe('Upserted');
152
+ });
153
+ it('upserts an existing thing', async () => {
154
+ const thing = await client.upsert({
155
+ ns,
156
+ type: 'TestEntity',
157
+ id: 'crud-test-2',
158
+ data: { name: 'Upserted Again', value: 300 },
159
+ });
160
+ expect(thing.data.name).toBe('Upserted Again');
161
+ expect(thing.data.value).toBe(300);
162
+ });
163
+ it('deletes a thing', async () => {
164
+ // Create then delete
165
+ await client.create({
166
+ ns,
167
+ type: 'TestEntity',
168
+ id: 'to-delete',
169
+ data: { temp: true },
170
+ });
171
+ const deleted = await client.delete(`https://${ns}/TestEntity/to-delete`);
172
+ expect(deleted).toBe(true);
173
+ const thing = await client.get(`https://${ns}/TestEntity/to-delete`);
174
+ expect(thing).toBeNull();
175
+ });
176
+ it('returns false when deleting non-existent thing', async () => {
177
+ const deleted = await client.delete(`https://${ns}/TestEntity/never-existed`);
178
+ expect(deleted).toBe(false);
179
+ });
180
+ });
181
+ // =========================================================================
182
+ // Query Operations
183
+ // =========================================================================
184
+ describe('Things - Queries', () => {
185
+ beforeAll(async () => {
186
+ // Seed test data
187
+ for (const user of fixtures.users) {
188
+ await client.upsert({
189
+ ns,
190
+ type: 'User',
191
+ id: user.id,
192
+ data: user,
193
+ });
194
+ }
195
+ for (const post of fixtures.posts) {
196
+ await client.upsert({
197
+ ns,
198
+ type: 'Post',
199
+ id: post.id,
200
+ data: post,
201
+ });
202
+ }
203
+ });
204
+ afterAll(async () => {
205
+ // Cleanup
206
+ for (const user of fixtures.users) {
207
+ try {
208
+ await client.delete(`https://${ns}/User/${user.id}`);
209
+ }
210
+ catch { /* ignore */ }
211
+ }
212
+ for (const post of fixtures.posts) {
213
+ try {
214
+ await client.delete(`https://${ns}/Post/${post.id}`);
215
+ }
216
+ catch { /* ignore */ }
217
+ }
218
+ });
219
+ it('lists all things', async () => {
220
+ const things = await client.list({ ns });
221
+ expect(things.length).toBeGreaterThanOrEqual(fixtures.users.length + fixtures.posts.length);
222
+ });
223
+ it('lists things by type', async () => {
224
+ const users = await client.list({ ns, type: 'User' });
225
+ expect(users.length).toBe(fixtures.users.length);
226
+ expect(users.every(u => u.type === 'User')).toBe(true);
227
+ });
228
+ it('finds things with where clause', async () => {
229
+ const admins = await client.find({
230
+ ns,
231
+ type: 'User',
232
+ where: { role: 'admin' },
233
+ });
234
+ expect(admins.length).toBe(1);
235
+ expect(admins[0]?.data.name).toBe('Alice');
236
+ });
237
+ it('lists with limit', async () => {
238
+ const things = await client.list({ ns, type: 'User', limit: 2 });
239
+ expect(things.length).toBe(2);
240
+ });
241
+ it('lists with offset', async () => {
242
+ const all = await client.list({ ns, type: 'User', orderBy: 'id' });
243
+ const offset = await client.list({ ns, type: 'User', orderBy: 'id', offset: 1, limit: 2 });
244
+ expect(offset.length).toBe(2);
245
+ expect(offset[0]?.id).toBe(all[1]?.id);
246
+ });
247
+ it('lists with ordering', async () => {
248
+ const asc = await client.list({ ns, type: 'User', orderBy: 'id', order: 'asc' });
249
+ const desc = await client.list({ ns, type: 'User', orderBy: 'id', order: 'desc' });
250
+ expect(asc[0]?.id).toBe('user-1');
251
+ expect(desc[0]?.id).toBe('user-3');
252
+ });
253
+ it('iterates with forEach', async () => {
254
+ const ids = [];
255
+ await client.forEach({ ns, type: 'User' }, (thing) => {
256
+ ids.push(thing.id);
257
+ });
258
+ expect(ids.length).toBe(fixtures.users.length);
259
+ });
260
+ });
261
+ // =========================================================================
262
+ // Search Operations
263
+ // =========================================================================
264
+ if (!skip.search) {
265
+ describe('Things - Search', () => {
266
+ beforeAll(async () => {
267
+ // Ensure test data exists
268
+ for (const post of fixtures.posts) {
269
+ await client.upsert({
270
+ ns,
271
+ type: 'Post',
272
+ id: post.id,
273
+ data: post,
274
+ });
275
+ }
276
+ });
277
+ it('searches by query string', async () => {
278
+ const results = await client.search({
279
+ ns,
280
+ type: 'Post',
281
+ query: 'Hello',
282
+ });
283
+ expect(results.length).toBeGreaterThanOrEqual(1);
284
+ expect(results.some(r => r.data.title === 'Hello World')).toBe(true);
285
+ });
286
+ it('searches across fields', async () => {
287
+ const results = await client.search({
288
+ ns,
289
+ type: 'Post',
290
+ query: 'Bob',
291
+ });
292
+ expect(results.some(r => r.data.title === 'Bobs Post')).toBe(true);
293
+ });
294
+ });
295
+ }
296
+ // =========================================================================
297
+ // Relationship Operations
298
+ // =========================================================================
299
+ if (!skip.relationships) {
300
+ describe('Relationships', () => {
301
+ const authorUrl = `https://${ns}/User/user-1`;
302
+ const postUrl = `https://${ns}/Post/post-1`;
303
+ beforeAll(async () => {
304
+ // Ensure entities exist
305
+ await client.upsert({ ns, type: 'User', id: 'user-1', data: fixtures.users[0] });
306
+ await client.upsert({ ns, type: 'Post', id: 'post-1', data: fixtures.posts[0] });
307
+ });
308
+ afterAll(async () => {
309
+ try {
310
+ await client.unrelate(postUrl, 'author', authorUrl);
311
+ }
312
+ catch { /* ignore */ }
313
+ });
314
+ it('creates a relationship', async () => {
315
+ const rel = await client.relate({
316
+ type: 'author',
317
+ from: postUrl,
318
+ to: authorUrl,
319
+ });
320
+ expect(rel).toBeDefined();
321
+ expect(rel.type).toBe('author');
322
+ expect(rel.from).toBe(postUrl);
323
+ expect(rel.to).toBe(authorUrl);
324
+ });
325
+ it('queries outbound related things', async () => {
326
+ const authors = await client.related(postUrl, 'author', 'to');
327
+ expect(authors.length).toBe(1);
328
+ expect(authors[0]?.id).toBe('user-1');
329
+ });
330
+ it('queries inbound references', async () => {
331
+ const posts = await client.references(authorUrl, 'author');
332
+ expect(posts.length).toBeGreaterThanOrEqual(1);
333
+ expect(posts.some(p => p.id === 'post-1')).toBe(true);
334
+ });
335
+ it('lists relationships', async () => {
336
+ const rels = await client.relationships(postUrl, 'author');
337
+ expect(rels.length).toBeGreaterThanOrEqual(1);
338
+ expect(rels[0]?.type).toBe('author');
339
+ });
340
+ it('removes a relationship', async () => {
341
+ const removed = await client.unrelate(postUrl, 'author', authorUrl);
342
+ expect(removed).toBe(true);
343
+ const rels = await client.relationships(postUrl, 'author');
344
+ expect(rels.length).toBe(0);
345
+ });
346
+ });
347
+ }
348
+ });
349
+ }
350
+ // =============================================================================
351
+ // Extended Test Factory (Events, Actions, Artifacts)
352
+ // =============================================================================
353
+ /**
354
+ * Create extended tests for DBClientExtended implementations
355
+ *
356
+ * Includes all DBClient tests plus Events, Actions, and Artifacts
357
+ *
358
+ * @example
359
+ * ```ts
360
+ * import { createExtendedTests } from 'ai-database/tests'
361
+ *
362
+ * createExtendedTests('ClickHouse', {
363
+ * factory: () => createClickHouseDatabase({ url: '...' })
364
+ * })
365
+ * ```
366
+ */
367
+ export function createExtendedTests(name, options) {
368
+ const { factory, cleanup, skip = {}, ns = fixtures.ns } = options;
369
+ // Run base DBClient tests
370
+ createTests(name, options);
371
+ describe(`${name} Extended Compliance Tests`, () => {
372
+ let client;
373
+ beforeAll(async () => {
374
+ client = await factory();
375
+ });
376
+ afterAll(async () => {
377
+ await client.close?.();
378
+ await cleanup?.();
379
+ });
380
+ // =========================================================================
381
+ // Event Operations
382
+ // =========================================================================
383
+ if (!skip.events) {
384
+ describe('Events', () => {
385
+ let eventId;
386
+ it('tracks an event', async () => {
387
+ const event = await client.track({
388
+ type: 'User.created',
389
+ source: 'test-suite',
390
+ data: { userId: 'user-1', action: 'signup' },
391
+ });
392
+ eventId = event.id;
393
+ expect(event).toBeDefined();
394
+ expect(event.id).toBeDefined();
395
+ expect(event.type).toBe('User.created');
396
+ expect(event.source).toBe('test-suite');
397
+ expect(event.timestamp).toBeInstanceOf(Date);
398
+ });
399
+ it('gets an event by ID', async () => {
400
+ const event = await client.getEvent(eventId);
401
+ expect(event).not.toBeNull();
402
+ expect(event?.type).toBe('User.created');
403
+ });
404
+ it('queries events by type', async () => {
405
+ const events = await client.queryEvents({ type: 'User.created' });
406
+ expect(events.length).toBeGreaterThanOrEqual(1);
407
+ expect(events.every(e => e.type === 'User.created')).toBe(true);
408
+ });
409
+ it('queries events by source', async () => {
410
+ const events = await client.queryEvents({ source: 'test-suite' });
411
+ expect(events.length).toBeGreaterThanOrEqual(1);
412
+ });
413
+ it('tracks event with correlation ID', async () => {
414
+ const event = await client.track({
415
+ type: 'Order.placed',
416
+ source: 'test-suite',
417
+ data: { orderId: 'order-1' },
418
+ correlationId: 'session-123',
419
+ });
420
+ expect(event.correlationId).toBe('session-123');
421
+ const related = await client.queryEvents({ correlationId: 'session-123' });
422
+ expect(related.some(e => e.id === event.id)).toBe(true);
423
+ });
424
+ });
425
+ }
426
+ // =========================================================================
427
+ // Action Operations
428
+ // =========================================================================
429
+ if (!skip.actions) {
430
+ describe('Actions', () => {
431
+ let actionId;
432
+ it('sends an action (pending)', async () => {
433
+ const action = await client.send({
434
+ actor: 'user:test-user',
435
+ object: `https://${ns}/Order/order-1`,
436
+ action: 'approve',
437
+ });
438
+ actionId = action.id;
439
+ expect(action).toBeDefined();
440
+ expect(action.status).toBe('pending');
441
+ expect(action.actor).toBe('user:test-user');
442
+ expect(action.action).toBe('approve');
443
+ });
444
+ it('does an action (active)', async () => {
445
+ const action = await client.do({
446
+ actor: 'user:test-user',
447
+ object: `https://${ns}/Order/order-2`,
448
+ action: 'process',
449
+ });
450
+ expect(action.status).toBe('active');
451
+ expect(action.startedAt).toBeInstanceOf(Date);
452
+ });
453
+ it('gets an action by ID', async () => {
454
+ const action = await client.getAction(actionId);
455
+ expect(action).not.toBeNull();
456
+ expect(action?.action).toBe('approve');
457
+ });
458
+ it('starts a pending action', async () => {
459
+ const started = await client.startAction(actionId);
460
+ expect(started.status).toBe('active');
461
+ expect(started.startedAt).toBeInstanceOf(Date);
462
+ });
463
+ it('completes an action', async () => {
464
+ const completed = await client.completeAction(actionId, { approved: true });
465
+ expect(completed.status).toBe('completed');
466
+ expect(completed.completedAt).toBeInstanceOf(Date);
467
+ expect(completed.result).toEqual({ approved: true });
468
+ });
469
+ it('fails an action', async () => {
470
+ const action = await client.do({
471
+ actor: 'system',
472
+ object: `https://${ns}/Task/task-1`,
473
+ action: 'process',
474
+ });
475
+ const failed = await client.failAction(action.id, 'Connection timeout');
476
+ expect(failed.status).toBe('failed');
477
+ expect(failed.error).toBe('Connection timeout');
478
+ });
479
+ it('cancels an action', async () => {
480
+ const action = await client.send({
481
+ actor: 'user:test-user',
482
+ object: `https://${ns}/Report/report-1`,
483
+ action: 'generate',
484
+ });
485
+ const cancelled = await client.cancelAction(action.id);
486
+ expect(cancelled.status).toBe('cancelled');
487
+ });
488
+ it('queries actions by status', async () => {
489
+ const completed = await client.queryActions({ status: 'completed' });
490
+ expect(completed.every(a => a.status === 'completed')).toBe(true);
491
+ });
492
+ it('queries actions by actor', async () => {
493
+ const actions = await client.queryActions({ actor: 'user:test-user' });
494
+ expect(actions.every(a => a.actor === 'user:test-user')).toBe(true);
495
+ });
496
+ });
497
+ }
498
+ // =========================================================================
499
+ // Artifact Operations
500
+ // =========================================================================
501
+ if (!skip.artifacts) {
502
+ describe('Artifacts', () => {
503
+ const artifactKey = 'test-artifact-1';
504
+ afterAll(async () => {
505
+ try {
506
+ await client.deleteArtifact(artifactKey);
507
+ }
508
+ catch { /* ignore */ }
509
+ });
510
+ it('stores an artifact', async () => {
511
+ const artifact = await client.storeArtifact({
512
+ key: artifactKey,
513
+ type: 'esm',
514
+ source: `https://${ns}/Module/module-1`,
515
+ sourceHash: 'abc123',
516
+ content: 'export const foo = 42',
517
+ });
518
+ expect(artifact).toBeDefined();
519
+ expect(artifact.key).toBe(artifactKey);
520
+ expect(artifact.type).toBe('esm');
521
+ expect(artifact.content).toBe('export const foo = 42');
522
+ });
523
+ it('gets an artifact by key', async () => {
524
+ const artifact = await client.getArtifact(artifactKey);
525
+ expect(artifact).not.toBeNull();
526
+ expect(artifact?.content).toBe('export const foo = 42');
527
+ });
528
+ it('gets artifact by source', async () => {
529
+ const artifact = await client.getArtifactBySource(`https://${ns}/Module/module-1`, 'esm');
530
+ expect(artifact).not.toBeNull();
531
+ expect(artifact?.key).toBe(artifactKey);
532
+ });
533
+ it('deletes an artifact', async () => {
534
+ await client.storeArtifact({
535
+ key: 'to-delete',
536
+ type: 'ast',
537
+ source: `https://${ns}/File/file-1`,
538
+ sourceHash: 'xyz789',
539
+ content: { type: 'Program', body: [] },
540
+ });
541
+ const deleted = await client.deleteArtifact('to-delete');
542
+ expect(deleted).toBe(true);
543
+ const artifact = await client.getArtifact('to-delete');
544
+ expect(artifact).toBeNull();
545
+ });
546
+ it('stores artifact with TTL', async () => {
547
+ const artifact = await client.storeArtifact({
548
+ key: 'ttl-artifact',
549
+ type: 'html',
550
+ source: `https://${ns}/Page/page-1`,
551
+ sourceHash: 'def456',
552
+ content: '<html></html>',
553
+ ttl: 60000, // 1 minute
554
+ });
555
+ expect(artifact.expiresAt).toBeInstanceOf(Date);
556
+ expect(artifact.expiresAt.getTime()).toBeGreaterThan(Date.now());
557
+ // Cleanup
558
+ await client.deleteArtifact('ttl-artifact');
559
+ });
560
+ });
561
+ }
562
+ });
563
+ }
564
+ // =============================================================================
565
+ // Re-export for convenience
566
+ // =============================================================================
567
+ export { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
568
+ //# sourceMappingURL=tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.js","sourceRoot":"","sources":["../src/tests.ts"],"names":[],"mappings":"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"}