reactive-localstorage
Version:
A reactive localStorage with no dependency
360 lines • 23.2 kB
JavaScript
"use strict";
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LocalStorage = void 0;
var env_1 = require("./env");
var $injectMark = Symbol.for('reactive-localstorage-inject-mark');
var $handlers = Symbol.for('reactive-localstorage-handlers');
var LocalStorage = /** @class */ (function () {
function LocalStorage(window, storage) {
var _this = this;
this._events = {};
this._length = 0;
this._injected = false;
// istanbul ignore next
if (window) {
this.supported = true;
}
else {
this.supported = false;
window = new Window();
}
this.native = storage || window.localStorage;
this._cache = new Map();
listen(window, function (_a) {
var key = _a.key, newValue = _a.newValue, oldValue = _a.oldValue, storageArea = _a.storageArea;
if (storageArea !== storage)
return;
_this.feed(key, newValue, oldValue);
});
}
Object.defineProperty(LocalStorage.prototype, "version", {
get: function () {
return env_1.version;
},
enumerable: false,
configurable: true
});
Object.defineProperty(LocalStorage.prototype, "length", {
get: function () {
return this.native.length;
},
enumerable: false,
configurable: true
});
LocalStorage.prototype.key = function (index) {
return this.native.key(index);
};
LocalStorage.prototype.getItem = function (key) {
this.inject();
var cache = this._cache;
if (cache.has(key))
return cache.get(key);
var value = getNative('getItem').call(this.native, key);
cache.set(key, value);
return value;
};
LocalStorage.prototype.setItem = function (key, value) {
return this.set(key, String(value));
};
LocalStorage.prototype.removeItem = function (key) {
return this.set(key, null);
};
LocalStorage.prototype.clear = function () {
var e_1, _a;
getNative('clear').call(this.native);
var cache = this._cache;
try {
for (var _b = __values(cache.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
cache.set(key, null);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
this.emit('change', null, null, null);
};
LocalStorage.prototype.on = function (name, fn) {
this.inject();
var set = this._events[name];
if (!set) {
this._events[name] = set = new Set();
}
set.add(fn);
};
LocalStorage.prototype.off = function (name, fn) {
var set = this._events[name];
if (set) {
set.delete(fn);
}
};
LocalStorage.prototype.feed = function (key, newValue, oldValue) {
if (typeof key === 'string') {
this._cache.set(key, newValue);
if (newValue !== oldValue) {
try {
this.emit('change', key, newValue, oldValue);
}
catch (e) {
// tslint:disable-next-line no-console
console.error(e);
}
}
}
else {
this._cache.clear();
try {
this.emit('change', key, newValue, oldValue);
}
catch (e) {
// tslint:disable-next-line no-console
console.error(e);
}
}
};
LocalStorage.prototype.set = function (key, value) {
var cache = this._cache;
var oldValue = cache.has(key) ? cache.get(key) : getNative('getItem').call(this.native, key);
if (typeof value === 'string') {
getNative('setItem').call(this.native, key, value);
}
else {
getNative('removeItem').call(this.native, key);
}
cache.set(key, value);
this.emit('change', key, value, oldValue);
};
LocalStorage.prototype.emit = function (name) {
var e_2, _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var set = this._events[name];
if (set) {
try {
for (var _b = __values(set.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
var fn = _c.value;
fn.apply(null, args);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
}
};
LocalStorage.prototype.inject = function () {
if (this._injected)
return;
this._injected = true;
var storage = this.native;
var me = this;
var cache = this._cache;
var handlers = storage[$handlers] || (storage[$handlers] = []);
handlers.push({
injector: this,
getItem: function (key, value) {
cache.set(key, value);
},
setItem: function (key, value) {
me.feed(key, value, me.getItem(key));
},
removeItem: function (key) {
me.feed(key, null, me.getItem(key));
},
clear: function () {
me.feed(null, null, null);
},
});
};
return LocalStorage;
}());
exports.LocalStorage = LocalStorage;
function listen(target, cb) {
if (target.addEventListener) {
target.addEventListener('storage', cb, true);
// istanbul ignore next
}
else if (target.attachEvent) {
target.attachEvent('storage', cb);
// istanbul ignore next
}
else {
return false;
}
return true;
}
inject();
function inject() {
var _a;
// istanbul ignore next
if (Storage.prototype[$injectMark]) {
console.warn("Storage has been injected, there might be multi versions of reactive-localstorage");
return;
}
var _b = Storage.prototype, nativeGetItem = _b.getItem, nativeSetItem = _b.setItem, nativeRemoveItem = _b.removeItem, nativeClear = _b.clear;
function injectedGetItem(key) {
var e_3, _a;
var value = nativeGetItem.call(this, key);
var handlers = this[$handlers];
if (handlers) {
try {
for (var handlers_1 = __values(handlers), handlers_1_1 = handlers_1.next(); !handlers_1_1.done; handlers_1_1 = handlers_1.next()) {
var _b = handlers_1_1.value, fn = _b.getItem, native = _b.injector.native;
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key, value);
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (handlers_1_1 && !handlers_1_1.done && (_a = handlers_1.return)) _a.call(handlers_1);
}
finally { if (e_3) throw e_3.error; }
}
}
return value;
}
injectedGetItem.native = nativeGetItem;
function injectedSetItem(key, value) {
var e_4, _a;
value = String(value);
var handlers = this[$handlers];
if (handlers) {
try {
for (var handlers_2 = __values(handlers), handlers_2_1 = handlers_2.next(); !handlers_2_1.done; handlers_2_1 = handlers_2.next()) {
var _b = handlers_2_1.value, fn = _b.setItem, native = _b.injector.native;
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key, value);
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (handlers_2_1 && !handlers_2_1.done && (_a = handlers_2.return)) _a.call(handlers_2);
}
finally { if (e_4) throw e_4.error; }
}
}
return nativeSetItem.call(this, key, value);
}
injectedSetItem.native = nativeSetItem;
function injectedRemoveItem(key) {
var e_5, _a;
var handlers = this[$handlers];
if (handlers) {
try {
for (var handlers_3 = __values(handlers), handlers_3_1 = handlers_3.next(); !handlers_3_1.done; handlers_3_1 = handlers_3.next()) {
var _b = handlers_3_1.value, fn = _b.removeItem, native = _b.injector.native;
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this, key);
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (handlers_3_1 && !handlers_3_1.done && (_a = handlers_3.return)) _a.call(handlers_3);
}
finally { if (e_5) throw e_5.error; }
}
}
return nativeRemoveItem.call(this, key);
}
injectedRemoveItem.native = nativeRemoveItem;
function injectedClear() {
var e_6, _a;
var handlers = this[$handlers];
if (handlers) {
try {
for (var handlers_4 = __values(handlers), handlers_4_1 = handlers_4.next(); !handlers_4_1.done; handlers_4_1 = handlers_4.next()) {
var _b = handlers_4_1.value, fn = _b.clear, native = _b.injector.native;
if (this !== native)
continue;
if (typeof fn === 'function') {
fn.call(this);
}
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (handlers_4_1 && !handlers_4_1.done && (_a = handlers_4.return)) _a.call(handlers_4);
}
finally { if (e_6) throw e_6.error; }
}
}
return nativeClear.call(this);
}
injectedClear.native = nativeClear;
Object.defineProperties(Storage.prototype, (_a = {},
_a[$injectMark] = {
configurable: true,
enumerable: false,
writable: true,
value: true,
},
_a[$handlers] = {
configurable: true,
enumerable: false,
writable: true,
value: [],
},
_a.getItem = {
configurable: true,
enumerable: false,
writable: true,
value: injectedGetItem,
},
_a.setItem = {
configurable: true,
enumerable: false,
writable: true,
value: injectedSetItem,
},
_a.removeItem = {
configurable: true,
enumerable: false,
writable: true,
value: injectedRemoveItem,
},
_a.clear = {
configurable: true,
enumerable: false,
writable: true,
value: injectedClear,
},
_a));
}
function getNative(key) {
var fn = Storage.prototype[key];
return fn && fn.native || fn;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvY2Fsc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLDZCQUErQjtBQUUvQixJQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7QUFDbkUsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0FBRTlEO0lBV0Usc0JBQVksTUFBZSxFQUFFLE9BQWlCO1FBQTlDLGlCQWNDO1FBckJTLFlBQU8sR0FFYixFQUFFLENBQUE7UUFFSSxZQUFPLEdBQUcsQ0FBQyxDQUFBO1FBQ1gsY0FBUyxHQUFHLEtBQUssQ0FBQTtRQUd6Qix1QkFBdUI7UUFDdkIsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDdEIsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUE7U0FDdEI7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFBO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN2QixNQUFNLENBQUMsTUFBTSxFQUFFLFVBQUMsRUFBd0M7Z0JBQXRDLEdBQUcsU0FBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLFFBQVEsY0FBQSxFQUFFLFdBQVcsaUJBQUE7WUFDcEQsSUFBSSxXQUFXLEtBQUssT0FBTztnQkFBRSxPQUFNO1lBQ25DLEtBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxzQkFBSSxpQ0FBTzthQUFYO1lBQ0UsT0FBTyxhQUFP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