@variablesoftware/mock-kv
Version:
🎛️🏷️✨ Mock KV Namespace for testing Cloudflare Workers
46 lines (45 loc) • 1.82 kB
JavaScript
import { log } from '@variablesoftware/logface';
import { listHandler } from "./mockKVNamespace/methods/list.js";
import { getHandler } from "./mockKVNamespace/methods/get.js";
import { putHandler } from "./mockKVNamespace/methods/put.js";
import { deleteHandler } from "./mockKVNamespace/methods/delete.js";
import { expireKeyNowHandler } from "./mockKVNamespace/methods/expireKeyNow.js";
import { dumpHandler } from "./mockKVNamespace/methods/dump.js";
import { getWithMetadataHandler } from "./mockKVNamespace/methods/getWithMetadata.js";
/**
* Creates an in-memory mock implementation of the Cloudflare KVNamespace interface for use in tests.
*
* Features:
* - get / put / delete operations
* - TTL and absolute expiration support
* - Typed JSON parsing (via `{ type: 'json' }`)
* - Key listing with limit
* - .dump() for test inspection
*
* All expiration values are normalized into milliseconds using the `expiresAt` field.
*
* @example
* ```ts
* const kv = mockKVNamespace();
* await kv.put('foo', 'bar', { expirationTtl: 60 });
* const val = await kv.get('foo'); // 'bar'
* ```
*
* @param data - Optional initial KV data to populate the store.
* @returns A mock KVNamespace instance with Cloudflare-like API.
*/
export const mockKVNamespace = (data = Object.create(null)) => {
log.debug("Creating mock KVNamespace");
// Defensive: always use a clean object for data
// (Removed prototype-stripping code; assume trusted input or default)
// Compose the namespace using modular handlers
return {
get: getHandler(data),
put: putHandler(data),
delete: deleteHandler(data),
list: listHandler(data),
dump: dumpHandler(data),
expireKeyNow: expireKeyNowHandler(data),
getWithMetadata: getWithMetadataHandler(data),
};
};