UNPKG

react-native-mmkv

Version:

⚡️ The fastest key/value storage for React Native.

110 lines (106 loc) 2.92 kB
import type { MMKV } from '../specs/MMKV.nitro' import type { Configuration } from '../specs/MMKVFactory.nitro' /** * Mock MMKV instance when used in a Jest/Test environment. */ export function createMockMMKV( config: Configuration = { id: 'mmkv.default' } ): MMKV { const storage = new Map<string, string | boolean | number | ArrayBuffer>() const listeners = new Set<(key: string) => void>() const notifyListeners = (key: string) => { listeners.forEach((listener) => { listener(key) }) } return { id: config.id, get length(): number { return storage.size }, get size(): number { return this.byteSize }, get byteSize(): number { // estimate - assumes UTF8 return JSON.stringify(storage).length }, isReadOnly: false, isEncrypted: false, clearAll: () => { const keysBefore = storage.keys() storage.clear() // Notify all listeners for all keys that were cleared for (const key of keysBefore) { notifyListeners(key) } }, remove: (key) => { const deleted = storage.delete(key) if (deleted) { notifyListeners(key) } return deleted }, set: (key, value) => { if (key === '') throw new Error('Cannot set a value for an empty key!') storage.set(key, value) notifyListeners(key) }, getString: (key) => { const result = storage.get(key) return typeof result === 'string' ? result : undefined }, getNumber: (key) => { const result = storage.get(key) return typeof result === 'number' ? result : undefined }, getBoolean: (key) => { const result = storage.get(key) return typeof result === 'boolean' ? result : undefined }, getBuffer: (key) => { const result = storage.get(key) return result instanceof ArrayBuffer ? result : undefined }, getAllKeys: () => Array.from(storage.keys()), contains: (key) => storage.has(key), recrypt: () => { console.warn('Encryption is not supported in mocked MMKV instances!') }, encrypt: () => { console.warn('Encryption is not supported in mocked MMKV instances!') }, decrypt: () => { console.warn('Encryption is not supported in mocked MMKV instances!') }, trim: () => { // no-op }, name: 'MMKV', dispose: () => {}, equals: () => { return false }, addOnValueChangedListener: (listener) => { listeners.add(listener) return { remove: () => { listeners.delete(listener) }, } }, importAllFrom: (other) => { const keys = other.getAllKeys() let imported = 0 for (const key of keys) { const data = other.getBuffer(key) if (data != null) { storage.set(key, data) imported++ } } return imported }, } }