react-native-onyx
Version:
State management for React Native
132 lines (131 loc) • 4.37 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setMockStore = exports.mockStore = exports.mockSet = void 0;
const underscore_1 = __importDefault(require("underscore"));
const utils_1 = __importDefault(require("../../utils"));
// eslint-disable-next-line import/no-mutable-exports
const storeInternal = {};
exports.mockStore = storeInternal;
const setInternal = (key, value) => {
storeInternal[key] = value;
return Promise.resolve(value);
};
const isJestRunning = typeof jest !== 'undefined';
const set = isJestRunning ? jest.fn(setInternal) : setInternal;
exports.mockSet = set;
const provider = {
store: storeInternal,
/**
* The name of the provider that can be printed to the logs
*/
name: 'MemoryOnlyProvider',
/**
* Initializes the storage provider
*/
init() {
// do nothing
},
/**
* Get the value of a given key or return `null` if it's not available in memory
*/
getItem(key) {
const value = provider.store[key];
return Promise.resolve(value === undefined ? null : value);
},
/**
* Get multiple key-value pairs for the give array of keys in a batch.
*/
multiGet(keys) {
const getPromises = underscore_1.default.map(keys, (key) => new Promise((resolve) => {
provider.getItem(key).then((value) => resolve([key, value]));
}));
return Promise.all(getPromises);
},
/**
* Sets the value for a given key. The only requirement is that the value should be serializable to JSON string
*/
setItem(key, value) {
set(key, value);
return Promise.resolve();
},
/**
* Stores multiple key-value pairs in a batch
*/
multiSet(pairs) {
const setPromises = underscore_1.default.map(pairs, ([key, value]) => provider.setItem(key, value));
return Promise.all(setPromises).then(() => undefined);
},
/**
* Merging an existing value with a new one
*/
mergeItem(key, change) {
// Since Onyx already merged the existing value with the changes, we can just set the value directly.
return provider.multiMerge([[key, change]]);
},
/**
* Multiple merging of existing and new values in a batch
* This function also removes all nested null values from an object.
*/
multiMerge(pairs) {
underscore_1.default.forEach(pairs, ([key, value]) => {
const existingValue = provider.store[key];
const newValue = utils_1.default.fastMerge(existingValue, value, {
shouldRemoveNestedNulls: true,
objectRemovalMode: 'replace',
}).result;
set(key, newValue);
});
return Promise.resolve();
},
/**
* Remove given key and it's value from memory
*/
removeItem(key) {
delete provider.store[key];
return Promise.resolve();
},
/**
* Remove given keys and their values from memory
*/
removeItems(keys) {
underscore_1.default.each(keys, (key) => {
delete provider.store[key];
});
return Promise.resolve();
},
/**
* Clear everything from memory
*/
clear() {
// Remove all keys without changing the root object reference.
for (const key of Object.keys(provider.store)) {
delete provider.store[key];
}
return Promise.resolve();
},
/**
* Returns all keys available in memory
*/
getAllKeys() {
return Promise.resolve(underscore_1.default.keys(provider.store));
},
/**
* Gets the total bytes of the store.
* `bytesRemaining` will always be `Number.POSITIVE_INFINITY` since we don't have a hard limit on memory.
*/
getDatabaseSize() {
return Promise.resolve({ bytesRemaining: Number.POSITIVE_INFINITY, bytesUsed: 0 });
},
};
const setMockStore = (data) => {
// Replace keys without changing the root object reference.
for (const key of Object.keys(storeInternal)) {
delete storeInternal[key];
}
Object.assign(storeInternal, data);
};
exports.setMockStore = setMockStore;
exports.default = provider;