diff --git a/package.json b/package.json index 351284e..798dd82 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,16 @@ "name": "@contentstack/delivery-sdk", "version": "4.6.1", "type": "module", + "description": "Contentstack Delivery SDK for TypeScript", + "homepage": "https://www.contentstack.com/", + "author": { + "name": "Contentstack", + "url": "https://www.contentstack.com/" + }, + "repository": { + "type": "git", + "url": "https://github.com/contentstack/contentstack-typescript" + }, "license": "MIT", "main": "./dist/legacy/index.cjs", "module": "./dist/legacy/index.js", diff --git a/src/lib/cache.ts b/src/lib/cache.ts deleted file mode 100644 index 228d656..0000000 --- a/src/lib/cache.ts +++ /dev/null @@ -1,82 +0,0 @@ -// import { PersistanceStore } from '../persistance'; - -import { PersistanceStore } from '../persistance'; -import { CacheOptions, Policy } from './types'; - -export async function handleRequest( - cacheOptions: CacheOptions, - apiKey: string, - defaultAdapter: any, - resolve: any, - reject: any, - config: any -) { - const cacheStore = new PersistanceStore(cacheOptions); - switch (cacheOptions.policy) { - case Policy.NETWORK_ELSE_CACHE: { - const apiResponse = await defaultAdapter(config); - - if (apiResponse.data) { - cacheStore.setItem(apiKey, JSON.parse(apiResponse.data), config.contentTypeUid, cacheOptions.maxAge); - - return resolve({data: JSON.parse(apiResponse.data)}); - } else { - const cacheResponse = cacheStore.getItem(apiKey, config.contentTypeUid); - if (cacheResponse) - return resolve({ - data: cacheResponse, - status: 200, - statusText: 'OK', - headers: {}, - config: {}, - }); - } - - return reject(apiResponse); - } - case Policy.CACHE_THEN_NETWORK: { - const cacheResponse = cacheStore.getItem(apiKey, config.contentTypeUid); - if (cacheResponse) - return resolve({ - data: cacheResponse, - status: 200, - statusText: 'OK', - headers: {}, - config: {}, - }); - - const apiResponse = await defaultAdapter(config); - - if (apiResponse.data) { - cacheStore.setItem(apiKey, JSON.parse(apiResponse.data), config.contentTypeUid, cacheOptions.maxAge); - - return resolve({data: JSON.parse(apiResponse.data)}); - } else { - return reject(apiResponse); - } - } - case Policy.CACHE_ELSE_NETWORK: { - const cacheResponse = cacheStore.getItem(apiKey, config.contentTypeUid); - - if (cacheResponse) - return resolve({ - data: cacheResponse, - status: 200, - statusText: 'OK', - headers: {}, - config: {}, - }); - else { - const apiResponse = await defaultAdapter(config); - - if (apiResponse.data) { - cacheStore.setItem(apiKey, JSON.parse(apiResponse.data), config.contentTypeUid, cacheOptions.maxAge); - - return resolve({data: JSON.parse(apiResponse.data)}); - } else { - return reject(apiResponse); - } - } - } - } -} diff --git a/src/lib/contentstack.ts b/src/lib/contentstack.ts index 1ba9f52..ad008e4 100644 --- a/src/lib/contentstack.ts +++ b/src/lib/contentstack.ts @@ -1,6 +1,5 @@ import { httpClient, retryRequestHandler, retryResponseErrorHandler, retryResponseHandler } from '@contentstack/core'; import { AxiosRequestHeaders } from 'axios'; -import { handleRequest } from './cache'; import { Stack as StackClass } from './stack'; import { Policy, StackConfig } from './types'; import * as Utility from './utils'; @@ -94,11 +93,25 @@ export function stack(config: StackConfig): StackClass { if (config.logHandler) client.defaults.logHandler = config.logHandler; if (config.cacheOptions && config.cacheOptions.policy !== Policy.IGNORE_CACHE) { + if (!config.cacheOptions.persistanceStore) { + throw new Error('Persistance store not provided. Please provide persistance store plugin object.'); + } const defaultAdapter = client.defaults.adapter; client.defaults.adapter = (adapterConfig: any) => { return new Promise(async (resolve, reject) => { - if (config.cacheOptions) - await handleRequest(config.cacheOptions, config.apiKey, defaultAdapter, resolve, reject, adapterConfig); + if (config.cacheOptions && config.cacheOptions.persistanceStore) { + await config.cacheOptions.persistanceStore.handleRequest( + config.cacheOptions.policy, + config.apiKey, + defaultAdapter, + resolve, + reject, + adapterConfig + ); + } + else { + throw new Error('Persistance store not provided. Please provide persistance store plugin object.'); + } }); }; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 78769bd..25d6050 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,6 +1,5 @@ /* eslint-disable @cspell/spellchecker */ import { HttpClientParams } from '@contentstack/core'; -import { PersistanceStoreOptions, StorageType } from '../persistance'; // Internal Types export type params = { @@ -36,9 +35,9 @@ export interface StackConfig extends HttpClientParams { port?: number; debug?: boolean; } -export interface CacheOptions extends PersistanceStoreOptions { +export interface CacheOptions { policy: Policy; - storeType?: StorageType; + persistanceStore?: any; } export enum Policy { diff --git a/src/persistance/config/persistance-storage-config.ts b/src/persistance/config/persistance-storage-config.ts deleted file mode 100644 index 39029fe..0000000 --- a/src/persistance/config/persistance-storage-config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Storage } from '../types/storage'; -import { StorageType } from '../types/storage-type'; - -export type PersistanceStoreConfig = - | (Store & PersistanceStoreOptions) - | ({ storeType?: StorageType } & PersistanceStoreOptions); -export interface Store { - storage: Storage; - storeType: 'customStorage'; -} -export interface PersistanceStoreOptions { - maxAge?: number; // default 24 hrs - serializer?: (content: any) => string; // default JSON.stringify - deserializer?: (cacheString: string) => any; // default JSON.parse -} diff --git a/src/persistance/helper/utils.ts b/src/persistance/helper/utils.ts deleted file mode 100644 index 5c87dba..0000000 --- a/src/persistance/helper/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type Callback = (value: string | null, key: string) => void; - -export const iGlobal = typeof window !== 'undefined' ? window : global; diff --git a/src/persistance/index.ts b/src/persistance/index.ts deleted file mode 100644 index e95bc51..0000000 --- a/src/persistance/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { Callback } from './helper/utils'; -export * from './types'; -export * from './storages'; -export * from './config/persistance-storage-config'; -export * from './persistance-store'; diff --git a/src/persistance/persistance-store.ts b/src/persistance/persistance-store.ts deleted file mode 100644 index 008e569..0000000 --- a/src/persistance/persistance-store.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Store, PersistanceStoreConfig } from './config/persistance-storage-config'; -import { localStorage } from './storages/local-storage'; -import { memoryStorage } from './storages/memory-storage'; -import { Storage } from './types/storage'; -import { StorageType } from './types/storage-type'; - -export class PersistanceStore { - protected store: Storage = localStorage; - readonly config: PersistanceStoreConfig; - protected name: string; - - constructor(config?: PersistanceStoreConfig) { - let defaultConfig: PersistanceStoreConfig = { - storeType: 'localStorage', - maxAge: 1000 * 60 * 60 * 24, - serializer: JSON.stringify, - deserializer: JSON.parse, - }; - defaultConfig = { - ...defaultConfig, - ...config, - }; - this.setStore(defaultConfig.storeType, (defaultConfig as unknown as Store).storage); - this.config = defaultConfig; - this.name = ''; // TODO add stack api key to name - } - private setStore(type?: StorageType | 'customStorage', store?: Storage) { - switch (type) { - case 'localStorage': - break; - case 'memoryStorage': - this.store = memoryStorage; - break; - case 'customStorage': - if (!store) { - throw new TypeError('StorageType `customStorage` should have `storage`.'); - } else { - this.store = store; - } - break; - } - } - setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number) { - if (!key) { - return; - } - const generatedKey = this.generateCSKey(key, contentTypeUid); - - if (!value) { - this.store.removeItem(generatedKey); - - return; - } - const expiry = this.calculateExpiry(maxAge); - let content: any = { value, expiry }; - if (this.config.serializer) { - content = this.config.serializer(content); - } - - this.store.setItem(generatedKey, content); - } - getItem(key: string, contentTypeUid?: string): any { - const generatedKey = this.generateCSKey(key, contentTypeUid); - const content = this.store.getItem(generatedKey); - - if (content) { - if (this.config.deserializer) { - const item = this.config.deserializer(content); - if (!this.isExpire(item.expiry)) { - return item.value; - } else { - this.removeItem(key, contentTypeUid); - } - } - } - } - - removeItem(key: string, contentTypeUid?: string) { - const generatedKey = this.generateCSKey(key, contentTypeUid); - this.store.removeItem(generatedKey); - } - - clear(contentTypeUid?: string) { - if (!contentTypeUid) { - this.store.clear(); - } else { - this.store.each((_, key) => { - if (key.match(contentTypeUid)) { - this.store.removeItem(key); - } - }); - } - } - - private generateCSKey(key: string, contentTypeUid?: string): string { - let keyPrefix = 'cs_store_js'; - if (contentTypeUid) { - keyPrefix = contentTypeUid + '_' + keyPrefix; - } - keyPrefix = this.name + '_' + keyPrefix + '_' + key; - - return keyPrefix; - } - private calculateExpiry(maxAge?: number): number { - const now = new Date(); - const nowMSec = now.getTime(); - if (maxAge) { - return nowMSec + maxAge; - } else if (this.config.maxAge) { - return nowMSec + this.config.maxAge; - } - - return 0; - } - - private isExpire(dateTime: number): boolean { - if (dateTime) { - return dateTime < new Date().getTime(); - } - - return true; - } -} diff --git a/src/persistance/storages/index.ts b/src/persistance/storages/index.ts deleted file mode 100644 index 40ff41b..0000000 --- a/src/persistance/storages/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { localStorage } from './local-storage'; -export { memoryStorage } from './memory-storage'; diff --git a/src/persistance/storages/local-storage.ts b/src/persistance/storages/local-storage.ts deleted file mode 100644 index 5152820..0000000 --- a/src/persistance/storages/local-storage.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { Callback } from '../helper/utils'; -import { iGlobal } from '../helper/utils'; -import { Storage } from '../types/storage'; - -export const localStorage: Storage = { - name: 'localStorage', - clear: clear, - each: each, - getItem: getItem, - removeItem: removeItem, - setItem: setItem, -}; - -function _localStorage() { - return iGlobal.localStorage; -} - -function clear() { - _localStorage().clear(); -} -function each(callback: Callback) { - for (let i = _localStorage().length - 1; i >= 0; i--) { - const key = _localStorage().key(i); - if (key && getItem(key)) { - const value = getItem(key); - callback(value, key); - } - } -} -function setItem(key: string, value: string) { - if (!key) { - return; - } - _localStorage().setItem(key, value); -} -function getItem(key: string): string | null { - return _localStorage().getItem(key); -} -function removeItem(key: string) { - _localStorage().removeItem(key); -} diff --git a/src/persistance/storages/memory-storage.ts b/src/persistance/storages/memory-storage.ts deleted file mode 100644 index bf1020b..0000000 --- a/src/persistance/storages/memory-storage.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Callback } from '../helper/utils'; -import { Storage } from '../types/storage'; - -export const memoryStorage: Storage = { - name: 'memoryStorage', - clear: clear, - each: each, - getItem: getItem, - removeItem: removeItem, - setItem: setItem, -}; - -let memory: { [key: string]: string | null } = {}; - -function clear() { - memory = {}; -} -function each(callback: Callback) { - for (const key in memory) { - const value = getItem(key); - callback(value, key); - } -} -function setItem(key: string, value: string) { - if (!key) { - return; - } - memory[key] = value; -} -function getItem(key: string): string | null { - return memory[key]; -} -function removeItem(key: string) { - delete memory[key]; -} diff --git a/src/persistance/types/index.ts b/src/persistance/types/index.ts deleted file mode 100644 index 04b364d..0000000 --- a/src/persistance/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { Storage } from './storage'; -export type { StorageType } from './storage-type'; diff --git a/src/persistance/types/storage-type.ts b/src/persistance/types/storage-type.ts deleted file mode 100644 index 5a63802..0000000 --- a/src/persistance/types/storage-type.ts +++ /dev/null @@ -1 +0,0 @@ -export type StorageType = 'localStorage' | 'memoryStorage'; diff --git a/src/persistance/types/storage.ts b/src/persistance/types/storage.ts deleted file mode 100644 index 74ef0a0..0000000 --- a/src/persistance/types/storage.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { Callback } from '../helper/utils'; - -export interface Storage { - name: string; - getItem: (key: string) => string | null; - setItem: (key: string, value: string) => void; - removeItem: (key: string) => void; - each: (callback: Callback) => void; - clear: () => void; -} diff --git a/test/unit/persistance/local-storage.spec.ts b/test/unit/persistance/local-storage.spec.ts deleted file mode 100644 index d5da9c4..0000000 --- a/test/unit/persistance/local-storage.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { iGlobal } from '../../../src/persistance/helper/utils'; -import { localStorage } from '../../../src/persistance/storages/local-storage'; -import { Storage } from '../../../src/persistance/types/storage'; -describe('local store', () => { - let store: Storage; - - beforeAll(() => { - store = localStorage; - }); - - it('should create store store', () => { - expect(store.name).toEqual('localStorage'); - expect(typeof store.clear).toEqual('function'); - expect(typeof store.each).toEqual('function'); - expect(typeof store.getItem).toEqual('function'); - expect(typeof store.setItem).toEqual('function'); - expect(typeof store.removeItem).toEqual('function'); - }); - - it('should set item for key with value', () => { - store.setItem('foo', 'bar'); - expect(store.getItem('foo')).toEqual('bar'); - }); - - it('should not blank key', () => { - store.setItem('', 'bar'); - expect(store.getItem('')).toEqual(null); - }); - - it('should remove item for key', () => { - store.removeItem('foo'); - expect(store.getItem('foo')).toEqual(null); - }); - - it('should not throw on blank or not present key', () => { - store.removeItem(''); - store.removeItem('foo'); - expect(store.getItem('')).toEqual(null); - }); - - it('should update item for key', () => { - store.setItem('foo', 'bar1'); - store.setItem('foo', 'bar2'); - expect(store.getItem('foo')).toEqual('bar2'); - }); - - it('should contain key value on removed another key', () => { - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.removeItem('foo'); - expect(store.getItem('foo')).toEqual(null); - expect(store.getItem('bar')).toEqual('foo'); - }); - - it('should not contain key value clear', () => { - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.clear(); - expect(store.getItem('foo')).toEqual(null); - expect(store.getItem('bar')).toEqual(null); - }); - - it('should not contain key value clear', () => { - iGlobal.document.cookie = ' = ; path=/'; - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.each((_, key) => { - expect(['foo', 'bar'].includes(key)).toBeTruthy(); - }); - store.clear(); - expect(store.getItem('foo')).toEqual(null); - expect(store.getItem('bar')).toEqual(null); - }); -}); diff --git a/test/unit/persistance/memory-storage.spec.ts b/test/unit/persistance/memory-storage.spec.ts deleted file mode 100644 index fb5e3fd..0000000 --- a/test/unit/persistance/memory-storage.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { memoryStorage } from '../../../src/persistance/storages/memory-storage'; -import { Storage } from '../../../src/persistance/types/storage'; -describe('memory store', () => { - let store: Storage; - - beforeAll(() => { - store = memoryStorage; - }); - - it('should create store store', () => { - expect(store.name).toEqual('memoryStorage'); - expect(typeof store.clear).toEqual('function'); - expect(typeof store.each).toEqual('function'); - expect(typeof store.getItem).toEqual('function'); - expect(typeof store.setItem).toEqual('function'); - expect(typeof store.removeItem).toEqual('function'); - }); - - it('should set item for key with value', () => { - store.setItem('foo', 'bar'); - expect(store.getItem('foo')).toEqual('bar'); - }); - - it('should not blank key', () => { - store.setItem('', 'bar'); - expect(store.getItem('')).toEqual(undefined); - }); - - it('should remove item for key', () => { - store.removeItem('foo'); - expect(store.getItem('foo')).toEqual(undefined); - }); - - it('should not throw on blank or not present key', () => { - store.removeItem(''); - store.removeItem('foo'); - expect(store.getItem('')).toEqual(undefined); - }); - - it('should update item for key', () => { - store.setItem('foo', 'bar1'); - store.setItem('foo', 'bar2'); - expect(store.getItem('foo')).toEqual('bar2'); - }); - - it('should contain key value on removed another key', () => { - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.removeItem('foo'); - expect(store.getItem('foo')).toEqual(undefined); - expect(store.getItem('bar')).toEqual('foo'); - }); - - it('should not contain key value clear', () => { - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.clear(); - expect(store.getItem('foo')).toEqual(undefined); - expect(store.getItem('bar')).toEqual(undefined); - }); - - it('should not contain key value clear', () => { - store.setItem('foo', 'bar'); - store.setItem('bar', 'foo'); - store.each((_, key) => { - expect(['foo', 'bar'].includes(key)).toBeTruthy(); - }); - store.clear(); - expect(store.getItem('foo')).toEqual(undefined); - expect(store.getItem('bar')).toEqual(undefined); - }); -}); diff --git a/test/unit/persistance/preference-store.spec.ts b/test/unit/persistance/preference-store.spec.ts deleted file mode 100644 index 40be660..0000000 --- a/test/unit/persistance/preference-store.spec.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { PersistanceStore } from '../../../src/persistance/persistance-store'; -import { StorageType } from '../../../src/persistance/types/storage-type'; -import { memoryStorage } from '../../../src/persistance/storages/memory-storage'; -describe('persistance store intiialization test', () => { - it('should initialize default persistance ', () => { - const persistance = new PersistanceStore(); - expect(persistance).toBeDefined(); - expect(persistance.config).toBeDefined(); - expect(persistance.config.maxAge).toEqual(86400000); - expect(persistance.config.storeType).toEqual('localStorage'); - }); - - it('should initialize persistance with name and local storage type ', () => { - const storeType = 'localStorage'; - const persistance = makePersistance({ storeType }); - expect(persistance).toBeDefined(); - expect(persistance.config).toBeDefined(); - expect(persistance.config.maxAge).toEqual(86400000); - expect(persistance.config.storeType).toEqual(storeType); - }); - it('should initialize persistance with name and memory storage type ', () => { - const storeType = 'memoryStorage'; - const persistance = makePersistance({ storeType }); - expect(persistance).toBeDefined(); - expect(persistance.config).toBeDefined(); - expect(persistance.config.maxAge).toEqual(86400000); - expect(persistance.config.storeType).toEqual(storeType); - }); - it('should initialize persistance with name and local storage type ', () => { - const storeType = 'customStorage'; - const persistance = makePersistance({ storeType }); - expect(persistance).toBeDefined(); - expect(persistance.config).toBeDefined(); - expect(persistance.config.maxAge).toEqual(86400000); - expect(persistance.config.storeType).toEqual(storeType); - }); - it('should throw error on custom storage without storage', () => { - const config: any = { name: 'foobar', storeType: 'customStorage' }; - config.storage = ''; - const persistance = () => { - new PersistanceStore(config); - }; - expect(persistance).toThrow(TypeError); - }); -}); - -describe('persistance store init', () => { - it('should set max age, serializer and deserializer', () => { - const serializer = jest.fn(); - const deserializer = jest.fn(); - const maxAge = 1000 * 60; - const persistance = new PersistanceStore({ serializer, deserializer, maxAge }); - expect(persistance.config.maxAge).toEqual(maxAge); - persistance.config.serializer!('foo'); - persistance.config.deserializer!('foo'); - expect(serializer.mock.calls.length).toEqual(1); - expect(deserializer.mock.calls.length).toEqual(1); - }); -}); - -describe('persistance functionality', () => { - const persistance = new PersistanceStore(); - const namespace = 'namespace'; - it('should set item for key with value', () => { - persistance.setItem('foo', 'bar'); - expect(persistance.getItem('foo')).toEqual('bar'); - }); - it('should not blank key', () => { - persistance.setItem('', 'bar'); - expect(persistance.getItem('')).toEqual(undefined); - }); - it('should remove item for key', () => { - persistance.setItem('foo', 'bar', namespace); - persistance.removeItem('foo'); - expect(persistance.getItem('foo')).toEqual(undefined); - expect(persistance.getItem('foo', namespace)).toEqual('bar'); - }); - - it('should not throw on blank or not present key', () => { - persistance.removeItem(''); - persistance.removeItem('foo'); - expect(persistance.getItem('')).toEqual(undefined); - }); - - it('should update item for key', () => { - persistance.setItem('foo', 'bar1'); - persistance.setItem('foo', 'bar2'); - expect(persistance.getItem('foo')).toEqual('bar2'); - }); - it('should contain key value on removed another key', () => { - persistance.setItem('foo', 'bar'); - persistance.setItem('bar', 'foo'); - persistance.removeItem('foo'); - expect(persistance.getItem('foo')).toEqual(undefined); - expect(persistance.getItem('bar')).toEqual('foo'); - }); - it('should return undefined on expiry', (done) => { - persistance.setItem('foo', 'bar', undefined, 10); - setTimeout(() => { - expect(persistance.getItem('foo')).toEqual(undefined); - done(); - }, 20); - }); - - it('should allow to set value undefined', () => { - persistance.setItem('foo', 'bar'); - persistance.setItem('foo', undefined); - - expect(persistance.getItem('foo')).toEqual(undefined); - }); - it('should not contain key value clear', () => { - persistance.setItem('foo', 'bar'); - persistance.setItem('bar', 'foo'); - persistance.clear(); - expect(persistance.getItem('foo')).toEqual(undefined); - expect(persistance.getItem('bar')).toEqual(undefined); - }); -}); - -describe('persistance with namespace functionality', () => { - const persistance = new PersistanceStore(); - const namespace = 'namespace'; - - it('should set item for key, value', () => { - persistance.setItem('foo', 'bar', namespace); - expect(persistance.getItem('foo')).toEqual(undefined); - expect(persistance.getItem('foo', namespace)).toEqual('bar'); - }); - it('should remove item for key', () => { - persistance.setItem('foo', 'bar'); - persistance.removeItem('foo', namespace); - expect(persistance.getItem('foo')).toEqual('bar'); - expect(persistance.getItem('foo', namespace)).toEqual(undefined); - }); - it('should update item for key', () => { - persistance.setItem('foo', 'bar1', namespace); - persistance.setItem('foo', 'bar2', namespace); - expect(persistance.getItem('foo', namespace)).toEqual('bar2'); - }); - - it('should contain key value on removed another key', () => { - persistance.setItem('foo', 'bar', namespace); - persistance.setItem('bar', 'foo', namespace); - persistance.removeItem('foo', namespace); - expect(persistance.getItem('foo', namespace)).toEqual(undefined); - expect(persistance.getItem('bar', namespace)).toEqual('foo'); - }); - it('should not contain key value clear', () => { - persistance.setItem('foo', 'bar', namespace); - persistance.setItem('bar', 'foo', namespace); - persistance.clear(namespace); - expect(persistance.getItem('foo', namespace)).toEqual(undefined); - expect(persistance.getItem('bar', namespace)).toEqual(undefined); - }); -}); - -describe('persistance with 0 maxAge', () => { - it('should allow max age to be set to 0', () => { - const persistance = new PersistanceStore({ maxAge: 0 }); - persistance.setItem('foo', 'bar'); - expect(persistance.getItem('foo')).toEqual(undefined); - }); -}); - -function makePersistance(config: { storeType: StorageType | 'customStorage' }) { - return new PersistanceStore({ storeType: config.storeType, storage: memoryStorage }); -}