varstor 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/varstor-webextension.js +115 -70
- package/dist/varstor-webextension.min.js +1 -1
- package/dist/varstor.js +53 -32
- package/dist/varstor.min.js +1 -1
- package/package.json +2 -2
- package/src/index.js +5 -3
- package/src/namespace.js +1 -1
- package/src/storage.js +4 -1
- package/src/validation.js +28 -0
- package/src/webextension-storage.js +39 -0
- package/src/webextension.js +2 -35
- package/src/error.js +0 -11
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Varstor
|
|
2
|
-
State manager for web applications and
|
|
2
|
+
State manager for web applications and webextensions, employing reactivity, wrapping, and uniting the usage of different storages' values and common variables into a simple universal interface.
|
|
3
3
|
|
|
4
4
|
## How to install and prepare
|
|
5
5
|
Install the library through
|
|
@@ -31,34 +31,6 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
|
|
|
31
31
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
/***/ },
|
|
35
|
-
|
|
36
|
-
/***/ "./src/error.js"
|
|
37
|
-
/*!**********************!*\
|
|
38
|
-
!*** ./src/error.js ***!
|
|
39
|
-
\**********************/
|
|
40
|
-
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
41
|
-
|
|
42
|
-
"use strict";
|
|
43
|
-
__webpack_require__.r(__webpack_exports__);
|
|
44
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
45
|
-
/* harmony export */ isKeyPresent: () => (/* binding */ isKeyPresent)
|
|
46
|
-
/* harmony export */ });
|
|
47
|
-
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
48
|
-
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const isKeyPresent = (fullKey) => {
|
|
53
|
-
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
54
|
-
const [key, namespace] = fullKey.split(_namespace__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER);
|
|
55
|
-
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
34
|
/***/ },
|
|
63
35
|
|
|
64
36
|
/***/ "./src/helpers.js"
|
|
@@ -137,7 +109,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
137
109
|
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/storage.js");
|
|
138
110
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
139
111
|
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
140
|
-
/* harmony import */ var
|
|
112
|
+
/* harmony import */ var _validation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validation */ "./src/validation.js");
|
|
141
113
|
|
|
142
114
|
|
|
143
115
|
|
|
@@ -171,6 +143,7 @@ async function addState (namespace, initialState, isPersistent) {
|
|
|
171
143
|
|
|
172
144
|
const accessors = {};
|
|
173
145
|
for (const key in initialState) {
|
|
146
|
+
_validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Defining(namespace(key));
|
|
174
147
|
accessors[namespace(key)] = setupValue(
|
|
175
148
|
namespace(key),
|
|
176
149
|
namespacedValues[namespace(key)],
|
|
@@ -322,7 +295,8 @@ function setState (namespace, changes) {
|
|
|
322
295
|
resetAllState();
|
|
323
296
|
} else {
|
|
324
297
|
for (const [k,v] of Object.entries(changes)) {
|
|
325
|
-
|
|
298
|
+
_validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Setting(namespace(k));
|
|
299
|
+
ACCESSORS[namespace(k)].set(v);
|
|
326
300
|
};
|
|
327
301
|
}
|
|
328
302
|
|
|
@@ -401,7 +375,6 @@ function createStore (_namespace) {
|
|
|
401
375
|
"use strict";
|
|
402
376
|
__webpack_require__.r(__webpack_exports__);
|
|
403
377
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
404
|
-
/* harmony export */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER),
|
|
405
378
|
/* harmony export */ addNamespace: () => (/* binding */ addNamespace),
|
|
406
379
|
/* harmony export */ getByNamespace: () => (/* binding */ getByNamespace),
|
|
407
380
|
/* harmony export */ namespacify: () => (/* binding */ namespacify),
|
|
@@ -410,7 +383,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
410
383
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
411
384
|
|
|
412
385
|
|
|
413
|
-
const NAMESPACE_DELIMITER = "
|
|
386
|
+
const NAMESPACE_DELIMITER = "::";
|
|
414
387
|
|
|
415
388
|
function addNamespace(namespace, str) {
|
|
416
389
|
return `${namespace}${(0,_helpers__WEBPACK_IMPORTED_MODULE_0__.isString)(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
|
@@ -459,7 +432,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
459
432
|
function updateFromLocalStorage(state) {
|
|
460
433
|
const stored = {};
|
|
461
434
|
for (const key in state) {
|
|
462
|
-
|
|
435
|
+
const value = localStorage.getItem(key);
|
|
436
|
+
if (value !== null) {
|
|
437
|
+
stored[key] = value;
|
|
438
|
+
}
|
|
463
439
|
}
|
|
464
440
|
|
|
465
441
|
return Object.assign(state, stored);
|
|
@@ -486,6 +462,107 @@ function setStorageValue(storageType, key, value) {
|
|
|
486
462
|
});
|
|
487
463
|
|
|
488
464
|
|
|
465
|
+
/***/ },
|
|
466
|
+
|
|
467
|
+
/***/ "./src/validation.js"
|
|
468
|
+
/*!***************************!*\
|
|
469
|
+
!*** ./src/validation.js ***!
|
|
470
|
+
\***************************/
|
|
471
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
472
|
+
|
|
473
|
+
"use strict";
|
|
474
|
+
__webpack_require__.r(__webpack_exports__);
|
|
475
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
476
|
+
/* harmony export */ isValid: () => (/* binding */ isValid)
|
|
477
|
+
/* harmony export */ });
|
|
478
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
479
|
+
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
const isValid = {
|
|
485
|
+
Setting: (fullKey) => {
|
|
486
|
+
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
487
|
+
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
488
|
+
throw new Error(
|
|
489
|
+
`Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`,
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return true;
|
|
494
|
+
},
|
|
495
|
+
|
|
496
|
+
Defining: (fullKey) => {
|
|
497
|
+
if (___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
498
|
+
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
499
|
+
throw new Error(
|
|
500
|
+
`Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`,
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
/***/ },
|
|
511
|
+
|
|
512
|
+
/***/ "./src/webextension-storage.js"
|
|
513
|
+
/*!*************************************!*\
|
|
514
|
+
!*** ./src/webextension-storage.js ***!
|
|
515
|
+
\*************************************/
|
|
516
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
517
|
+
|
|
518
|
+
"use strict";
|
|
519
|
+
__webpack_require__.r(__webpack_exports__);
|
|
520
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
521
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
|
|
522
|
+
/* harmony export */ isBackgroundScript: () => (/* binding */ isBackgroundScript),
|
|
523
|
+
/* harmony export */ isSessionStorageSupport: () => (/* binding */ isSessionStorageSupport)
|
|
524
|
+
/* harmony export */ });
|
|
525
|
+
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
526
|
+
|
|
527
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
528
|
+
GET_TYPE: getStorageType,
|
|
529
|
+
IS_AVAILABE: isStorageAvailable,
|
|
530
|
+
UPDATE_STATE: updateStateFromStorage,
|
|
531
|
+
SET_VALUE: setStorageValue,
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
function getStorageType(isPersistent) {
|
|
535
|
+
return (isBackgroundScript() && isPersistent && "local") || "session";
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function isStorageAvailable(storageType) {
|
|
539
|
+
return (
|
|
540
|
+
storageType === "local" ||
|
|
541
|
+
(storageType === "session" && isSessionStorageSupport())
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
async function updateStateFromStorage(state, type) {
|
|
546
|
+
return Object.assign(state, await browser.storage[type].get());
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function setStorageValue(type, key, value) {
|
|
550
|
+
browser.storage[type].set({ [key]: value });
|
|
551
|
+
return true;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
function isSessionStorageSupport() {
|
|
555
|
+
return !!browser.storage.session;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function isBackgroundScript() {
|
|
559
|
+
return (
|
|
560
|
+
window.location.protocol === "chrome-extension:" ||
|
|
561
|
+
window.location.protocol === "moz-extension:"
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
|
|
489
566
|
/***/ }
|
|
490
567
|
|
|
491
568
|
/******/ });
|
|
@@ -577,53 +654,21 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
577
654
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
578
655
|
/* harmony export */ });
|
|
579
656
|
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
657
|
+
/* harmony import */ var _webextension_storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webextension-storage */ "./src/webextension-storage.js");
|
|
580
658
|
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
581
659
|
|
|
582
660
|
|
|
583
661
|
|
|
662
|
+
|
|
584
663
|
const { onStateChange, setStorageUtils } = ___WEBPACK_IMPORTED_MODULE_0__["default"];
|
|
585
664
|
|
|
586
|
-
if (isBackgroundScript()) {
|
|
665
|
+
if ((0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isBackgroundScript)()) {
|
|
587
666
|
browser.storage.local.onChanged.addListener(onStateChange);
|
|
588
|
-
isSessionStorageSupport() &&
|
|
667
|
+
(0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isSessionStorageSupport)() &&
|
|
589
668
|
browser.storage.session.onChanged.addListener(onStateChange);
|
|
590
669
|
}
|
|
591
670
|
|
|
592
|
-
setStorageUtils(
|
|
593
|
-
GET_TYPE: getStorageType,
|
|
594
|
-
IS_AVAILABE: isStorageAvailable,
|
|
595
|
-
UPDATE_STATE: updateStateFromStorage,
|
|
596
|
-
SET_VALUE: setStorageValue,
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
function getStorageType (isPersistent) {
|
|
600
|
-
return isBackgroundScript() && isPersistent && "local" || "session";
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
function isStorageAvailable (storageType) {
|
|
604
|
-
return storageType === "local" ||
|
|
605
|
-
(storageType === "session" && isSessionStorageSupport());
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
async function updateStateFromStorage (state, type) {
|
|
609
|
-
return Object.assign(state, await browser.storage[type].get());
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
function setStorageValue (type, key, value) {
|
|
613
|
-
browser.storage[type].set({ [key]: value });
|
|
614
|
-
return true;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
function isSessionStorageSupport () {
|
|
618
|
-
return !!browser.storage.session;
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
function isBackgroundScript() {
|
|
622
|
-
return (
|
|
623
|
-
window.location.protocol === "chrome-extension:" ||
|
|
624
|
-
window.location.protocol === "moz-extension:"
|
|
625
|
-
);
|
|
626
|
-
}
|
|
671
|
+
setStorageUtils(_webextension_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
627
672
|
|
|
628
673
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
629
674
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see varstor-webextension.min.js.LICENSE.txt */
|
|
2
|
-
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.Varstor=r():e.Varstor=r()}(this,()=>(()=>{var e={"./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"(e,r){var s,n,t;"undefined"==typeof globalThis?"undefined"==typeof self||self:globalThis,n=[e],void 0===(t="function"==typeof(s=function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id?e.exports=globalThis.browser:e.exports=(e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class s extends WeakMap{constructor(e,r=void 0){super(r),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const n=e=>e&&"object"==typeof e&&"function"==typeof e.then,t=(r,s)=>(...n)=>{e.runtime.lastError?r.reject(new Error(e.runtime.lastError.message)):s.singleCallbackArg||1>=n.length&&!1!==s.singleCallbackArg?r.resolve(n[0]):r.resolve(n)},a=e=>1==e?"argument":"arguments",g=(e,r)=>function(s,...n){if(n.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${n.length}`);if(n.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${n.length}`);return new Promise((a,g)=>{if(r.fallbackToNoCallback)try{s[e](...n,t({resolve:a,reject:g},r))}catch(t){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,t),s[e](...n),r.fallbackToNoCallback=!1,r.noCallback=!0,a()}else r.noCallback?(s[e](...n),a()):s[e](...n,t({resolve:a,reject:g},r))})},i=(e,r,s)=>new Proxy(r,{apply:(r,n,t)=>s.call(n,e,...t)});let o=Function.call.bind(Object.prototype.hasOwnProperty);const m=(e,r={},s={})=>{let n=Object.create(null),t=Object.create(e);return new Proxy(t,{has:(r,s)=>s in e||s in n,get(t,a){if(a in n)return n[a];if(!(a in e))return;let l=e[a];if("function"==typeof l)if("function"==typeof r[a])l=i(e,e[a],r[a]);else if(o(s,a)){let r=g(a,s[a]);l=i(e,e[a],r)}else l=l.bind(e);else if("object"==typeof l&&null!==l&&(o(r,a)||o(s,a)))l=m(l,r[a],s[a]);else{if(!o(s,"*"))return Object.defineProperty(n,a,{configurable:!0,enumerable:!0,get:()=>e[a],set(r){e[a]=r}}),l;l=m(l,r[a],s["*"])}return n[a]=l,l},set:(r,s,t)=>(s in n?n[s]=t:e[s]=t,!0),defineProperty:(e,r,s)=>Reflect.defineProperty(n,r,s),deleteProperty:(e,r)=>Reflect.deleteProperty(n,r)})},l=e=>({addListener(r,s,...n){r.addListener(e.get(s),...n)},hasListener:(r,s)=>r.hasListener(e.get(s)),removeListener(r,s){r.removeListener(e.get(s))}}),A=new s(e=>"function"==typeof e?function(r){const s=m(r,{},{getContent:{minArgs:0,maxArgs:0}});e(s)}:e),c=new s(e=>"function"==typeof e?function(r,s,t){let a,g,i=!1,o=new Promise(e=>{a=function(r){i=!0,e(r)}});try{g=e(r,s,a)}catch(e){g=Promise.reject(e)}const m=!0!==g&&n(g);if(!0!==g&&!m&&!i)return!1;const l=e=>{e.then(e=>{t(e)},e=>{let r;r=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",t({__mozWebExtensionPolyfillReject__:!0,message:r})}).catch(e=>{console.error("Failed to send onMessage rejected reply",e)})};return l(m?g:o),!0}:e),u=({reject:r,resolve:s},n)=>{e.runtime.lastError?"The message port closed before a response was received."===e.runtime.lastError.message?s():r(new Error(e.runtime.lastError.message)):n&&n.__mozWebExtensionPolyfillReject__?r(new Error(n.message)):s(n)},x=(e,r,s,...n)=>{if(n.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${n.length}`);if(n.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${n.length}`);return new Promise((e,r)=>{const t=u.bind(null,{resolve:e,reject:r});n.push(t),s.sendMessage(...n)})},f={devtools:{network:{onRequestFinished:l(A)}},runtime:{onMessage:l(c),onMessageExternal:l(c),sendMessage:x.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:x.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},d={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":d},services:{"*":d},websites:{"*":d}},m(e,f,r)})(chrome)})?s.apply(r,n):s)||(e.exports=t)},"./src/error.js"(e,r,s){"use strict";s.r(r),s.d(r,{isKeyPresent:()=>a});var n=s("./src/index.js"),t=s("./src/namespace.js");const a=e=>{if(!n.ACCESSORS[e]){const[r,s]=e.split(t.NAMESPACE_DELIMITER);throw new Error(`Trying to access "${r}" key in "${s}" namespace, but it doesn't exist`)}return!0}},"./src/helpers.js"(e,r,s){"use strict";s.r(r),s.d(r,{getKeys:()=>l,getParamNames:()=>m,isArray:()=>o,isFunction:()=>a,isObject:()=>g,isString:()=>i,toCamelCase:()=>A});const n=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,t=/([^\s,]+)/g;function a(e){return"function"==typeof e}function g(e){return"object"==typeof e}function i(e){return"string"==typeof e}function o(e){return Array.isArray(e)}function m(e){const r=e.toString().replace(n,""),s=r.slice(r.indexOf("(")+1,r.indexOf(")")).match(t);return null===s?[]:s}function l(e,r){return Object.fromEntries(Object.entries(e).map(([e,s])=>[e,s[r]]))}function A(e,r){const s=e.split(r);return`${s[0]}${s.slice(1).reduce((e,r)=>`${e}${r.charAt(0).toUpperCase()}${r.slice(1)}`,"")}`}},"./src/index.js"(e,r,s){"use strict";s.r(r),s.d(r,{ACCESSORS:()=>o,default:()=>S});var n=s("./src/storage.js"),t=s("./src/helpers.js"),a=s("./src/namespace.js"),g=s("./src/error.js");const i={},o={},m={},l={},A={GET_TYPE:null,IS_AVAILABE:null,UPDATE_STATE:null,SET_VALUE:null};async function c(e,r,s){const n=A.GET_TYPE(s),t=Object.assign({},r),g=(0,a.namespacify)(e(),r);A.IS_AVAILABE(n)&&await A.UPDATE_STATE(g,n);const i={};for(const s in r)i[e(s)]=u(e(s),g[e(s)],t[s],n);return Object.assign(o,i),j(e())}function u(e,r,s,n){const g=(0,t.isFunction)(r);return g&&function(e,r){const[,s]=(0,a.splitFullKey)(e),n=(0,t.getParamNames)(r).map(e=>(0,a.addNamespace)(s,e));l[e]=n,n.forEach(r=>{m[r]?m[r].push(e):m[r]=[e]})}(e,r),i[e]={value:g?r.apply(null,x(e)):r,computeFn:r,listeners:[],defaultValue:s},function(e,r,s){const n=()=>i[e].value;return Object.assign(n,{valueOf:()=>i[e].value,toString:()=>i[e].value,set:r=>f(e,r,s),onChange:r=>i[e].listeners.push(r),removeListener:r=>i[e].listeners=i[e].listeners.filter(e=>e!==r),reset:()=>f(e,i[e].defaultValue,s)}),new Proxy(n,{get:(r,s)=>Object.keys(n).includes(s)?r[s]:i[e].value[s]})}(e,0,n)}function x(e){const r=h(e);return l[e].map(e=>r[(0,a.splitFullKey)(e)[0]]).concat(r)}function f(e,r,s){if(A.IS_AVAILABE(s)){if(A.SET_VALUE(s,e,r))return}d({[e]:{newValue:r}})}function d(e){const r={};for(const s in e){const n=i[s].value,t=e[s].newValue;n!==t&&(i[s].value=t,r[s]={newValue:t,prevValue:n},p(s,r))}for(const e in r)i[e].listeners.forEach(s=>s(i[e].value,h(e),r[e]))}function p(e,r){const s=m[e];s&&s.forEach(e=>{const s=i[e].value,n=i[e].computeFn.apply(null,x(e));s!==n&&(i[e].value=n,r[e]={newValue:n,prevValue:s},p(e,r))})}function b(e,r){return(0,t.isString)(r)?j(r):(0,t.isFunction)(r)?function(e,r){const s=(0,a.getByNamespace)(e,o);return r.call(null,s,j(e()))}(e(""),r):h(e(""))}function h(e){return(0,t.getKeys)((0,a.getByNamespace)(e,i),"value")}function y(e,r){if(!Object.keys(r).length)v();else for(const[s,n]of Object.entries(r))(0,g.isKeyPresent)(e(s))&&o[e(s)].set(n);return j(e())}function v(e){return Object.entries(o).filter(([r])=>r.startsWith(e())).forEach((e,{reset:r})=>r()),j(e())}function w(e,r,s){return r.forEach(r=>o[e(r)].onChange(s)),j(e())}function E(){const e=arguments[1];return!e||(0,t.isFunction)(e)||(0,t.isString)(e)?b.apply(null,arguments):Array.isArray(e)?w.apply(null,arguments):(0,t.isObject)(e)?y.apply(null,arguments):void 0}function T(e){Object.assign(A,e)}function j(e){const r=r=>(0,a.addNamespace)(e,r);return Object.assign(E.bind(null,r),{add:e=>c(r,e,!1),addPersistent:e=>c(r,e,!0),get:e=>b(r,e),set:e=>y(r,e),resetAll:()=>v(r),onChange:(e,s)=>w(r,e,s),removeListener:(e,s)=>function(e,r,s){return r.forEach(r=>o[e(r)].removeListener(s)),j(e())}(r,e,s),setStorageUtils:T,onStateChange:d})}T(n.default);const S=j("")},"./src/namespace.js"(e,r,s){"use strict";s.r(r),s.d(r,{NAMESPACE_DELIMITER:()=>t,addNamespace:()=>a,getByNamespace:()=>i,namespacify:()=>o,splitFullKey:()=>g});var n=s("./src/helpers.js");const t=":";function a(e,r){return`${e}${(0,n.isString)(r)&&t||""}${r||""}`}function g(e){const r=e.split(t);return[r.slice(-1)[0],r.slice(0,-1).join(t)]}function i(e,r){const s=g(e)[1]+t;return Object.fromEntries(Object.entries(r).filter(([e,r])=>e.startsWith(s)).map(([e,r])=>[e.slice(s.length),r]))}function o(e,r){return Object.fromEntries(Object.entries(r).map(([r,s])=>[a(e,r),s]))}},"./src/storage.js"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>n});const n={GET_TYPE:function(e){return e&&"localStorage"},IS_AVAILABE:function(e){return e},UPDATE_STATE:function(e){const r={};for(const s in e)r[s]=localStorage.getItem(s);return Object.assign(e,r)},SET_VALUE:function(e,r,s){return window.localStorage.setItem(r,s),!1}}}};const r={};function s(n){const t=r[n];if(void 0!==t)return t.exports;const a=r[n]={exports:{}};if(!(n in e)){delete r[n];const e=new Error("Cannot find module '"+n+"'");throw e.code="MODULE_NOT_FOUND",e}return e[n].call(a.exports,a,a.exports,s),a.exports}s.d=(e,r)=>{if(Array.isArray(r))for(var n=0;n<r.length;){var t=r[n++],a=r[n++];s.o(e,t)?0===a&&n++:0===a?Object.defineProperty(e,t,{enumerable:!0,value:r[n++]}):Object.defineProperty(e,t,{enumerable:!0,get:a})}else for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),s.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let n={};return(()=>{"use strict";s.r(n),s.d(n,{default:()=>o});var e=s("./src/index.js");const r=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),{onStateChange:t,setStorageUtils:a}=e.default;function g(){return!!r.storage.session}function i(){return"chrome-extension:"===window.location.protocol||"moz-extension:"===window.location.protocol}i()&&(r.storage.local.onChanged.addListener(t),g()&&r.storage.session.onChanged.addListener(t)),a({GET_TYPE:function(e){return i()&&e?"local":"session"},IS_AVAILABE:function(e){return"local"===e||"session"===e&&g()},UPDATE_STATE:async function(e,s){return Object.assign(e,await r.storage[s].get())},SET_VALUE:function(e,s,n){return r.storage[e].set({[s]:n}),!0}});const o=e.default})(),n=n.default,n})());
|
|
2
|
+
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.Varstor=r():e.Varstor=r()}(this,()=>(()=>{var e={"./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"(e,r){var s,n,t;"undefined"==typeof globalThis?"undefined"==typeof self||self:globalThis,n=[e],void 0===(t="function"==typeof(s=function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id?e.exports=globalThis.browser:e.exports=(e=>{const r={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(0===Object.keys(r).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class s extends WeakMap{constructor(e,r=void 0){super(r),this.createItem=e}get(e){return this.has(e)||this.set(e,this.createItem(e)),super.get(e)}}const n=e=>e&&"object"==typeof e&&"function"==typeof e.then,t=(r,s)=>(...n)=>{e.runtime.lastError?r.reject(new Error(e.runtime.lastError.message)):s.singleCallbackArg||1>=n.length&&!1!==s.singleCallbackArg?r.resolve(n[0]):r.resolve(n)},a=e=>1==e?"argument":"arguments",i=(e,r)=>function(s,...n){if(n.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${n.length}`);if(n.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${n.length}`);return new Promise((a,i)=>{if(r.fallbackToNoCallback)try{s[e](...n,t({resolve:a,reject:i},r))}catch(t){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,t),s[e](...n),r.fallbackToNoCallback=!1,r.noCallback=!0,a()}else r.noCallback?(s[e](...n),a()):s[e](...n,t({resolve:a,reject:i},r))})},o=(e,r,s)=>new Proxy(r,{apply:(r,n,t)=>s.call(n,e,...t)});let g=Function.call.bind(Object.prototype.hasOwnProperty);const m=(e,r={},s={})=>{let n=Object.create(null),t=Object.create(e);return new Proxy(t,{has:(r,s)=>s in e||s in n,get(t,a){if(a in n)return n[a];if(!(a in e))return;let l=e[a];if("function"==typeof l)if("function"==typeof r[a])l=o(e,e[a],r[a]);else if(g(s,a)){let r=i(a,s[a]);l=o(e,e[a],r)}else l=l.bind(e);else if("object"==typeof l&&null!==l&&(g(r,a)||g(s,a)))l=m(l,r[a],s[a]);else{if(!g(s,"*"))return Object.defineProperty(n,a,{configurable:!0,enumerable:!0,get:()=>e[a],set(r){e[a]=r}}),l;l=m(l,r[a],s["*"])}return n[a]=l,l},set:(r,s,t)=>(s in n?n[s]=t:e[s]=t,!0),defineProperty:(e,r,s)=>Reflect.defineProperty(n,r,s),deleteProperty:(e,r)=>Reflect.deleteProperty(n,r)})},l=e=>({addListener(r,s,...n){r.addListener(e.get(s),...n)},hasListener:(r,s)=>r.hasListener(e.get(s)),removeListener(r,s){r.removeListener(e.get(s))}}),A=new s(e=>"function"==typeof e?function(r){const s=m(r,{},{getContent:{minArgs:0,maxArgs:0}});e(s)}:e),c=new s(e=>"function"==typeof e?function(r,s,t){let a,i,o=!1,g=new Promise(e=>{a=function(r){o=!0,e(r)}});try{i=e(r,s,a)}catch(e){i=Promise.reject(e)}const m=!0!==i&&n(i);if(!0!==i&&!m&&!o)return!1;const l=e=>{e.then(e=>{t(e)},e=>{let r;r=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",t({__mozWebExtensionPolyfillReject__:!0,message:r})}).catch(e=>{console.error("Failed to send onMessage rejected reply",e)})};return l(m?i:g),!0}:e),u=({reject:r,resolve:s},n)=>{e.runtime.lastError?"The message port closed before a response was received."===e.runtime.lastError.message?s():r(new Error(e.runtime.lastError.message)):n&&n.__mozWebExtensionPolyfillReject__?r(new Error(n.message)):s(n)},x=(e,r,s,...n)=>{if(n.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${n.length}`);if(n.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${n.length}`);return new Promise((e,r)=>{const t=u.bind(null,{resolve:e,reject:r});n.push(t),s.sendMessage(...n)})},f={devtools:{network:{onRequestFinished:l(A)}},runtime:{onMessage:l(c),onMessageExternal:l(c),sendMessage:x.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:x.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},d={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":d},services:{"*":d},websites:{"*":d}},m(e,f,r)})(chrome)})?s.apply(r,n):s)||(e.exports=t)},"./src/helpers.js"(e,r,s){"use strict";s.r(r),s.d(r,{getKeys:()=>l,getParamNames:()=>m,isArray:()=>g,isFunction:()=>a,isObject:()=>i,isString:()=>o,toCamelCase:()=>A});const n=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,t=/([^\s,]+)/g;function a(e){return"function"==typeof e}function i(e){return"object"==typeof e}function o(e){return"string"==typeof e}function g(e){return Array.isArray(e)}function m(e){const r=e.toString().replace(n,""),s=r.slice(r.indexOf("(")+1,r.indexOf(")")).match(t);return null===s?[]:s}function l(e,r){return Object.fromEntries(Object.entries(e).map(([e,s])=>[e,s[r]]))}function A(e,r){const s=e.split(r);return`${s[0]}${s.slice(1).reduce((e,r)=>`${e}${r.charAt(0).toUpperCase()}${r.slice(1)}`,"")}`}},"./src/index.js"(e,r,s){"use strict";s.r(r),s.d(r,{ACCESSORS:()=>g,default:()=>T});var n=s("./src/storage.js"),t=s("./src/helpers.js"),a=s("./src/namespace.js"),i=s("./src/validation.js");const o={},g={},m={},l={},A={GET_TYPE:null,IS_AVAILABE:null,UPDATE_STATE:null,SET_VALUE:null};async function c(e,r,s){const n=A.GET_TYPE(s),t=Object.assign({},r),o=(0,a.namespacify)(e(),r);A.IS_AVAILABE(n)&&await A.UPDATE_STATE(o,n);const m={};for(const s in r)i.isValid.Defining(e(s)),m[e(s)]=u(e(s),o[e(s)],t[s],n);return Object.assign(g,m),j(e())}function u(e,r,s,n){const i=(0,t.isFunction)(r);return i&&function(e,r){const[,s]=(0,a.splitFullKey)(e),n=(0,t.getParamNames)(r).map(e=>(0,a.addNamespace)(s,e));l[e]=n,n.forEach(r=>{m[r]?m[r].push(e):m[r]=[e]})}(e,r),o[e]={value:i?r.apply(null,x(e)):r,computeFn:r,listeners:[],defaultValue:s},function(e,r,s){const n=()=>o[e].value;return Object.assign(n,{valueOf:()=>o[e].value,toString:()=>o[e].value,set:r=>f(e,r,s),onChange:r=>o[e].listeners.push(r),removeListener:r=>o[e].listeners=o[e].listeners.filter(e=>e!==r),reset:()=>f(e,o[e].defaultValue,s)}),new Proxy(n,{get:(r,s)=>Object.keys(n).includes(s)?r[s]:o[e].value[s]})}(e,0,n)}function x(e){const r=h(e);return l[e].map(e=>r[(0,a.splitFullKey)(e)[0]]).concat(r)}function f(e,r,s){if(A.IS_AVAILABE(s)){if(A.SET_VALUE(s,e,r))return}d({[e]:{newValue:r}})}function d(e){const r={};for(const s in e){const n=o[s].value,t=e[s].newValue;n!==t&&(o[s].value=t,r[s]={newValue:t,prevValue:n},p(s,r))}for(const e in r)o[e].listeners.forEach(s=>s(o[e].value,h(e),r[e]))}function p(e,r){const s=m[e];s&&s.forEach(e=>{const s=o[e].value,n=o[e].computeFn.apply(null,x(e));s!==n&&(o[e].value=n,r[e]={newValue:n,prevValue:s},p(e,r))})}function b(e,r){return(0,t.isString)(r)?j(r):(0,t.isFunction)(r)?function(e,r){const s=(0,a.getByNamespace)(e,g);return r.call(null,s,j(e()))}(e(""),r):h(e(""))}function h(e){return(0,t.getKeys)((0,a.getByNamespace)(e,o),"value")}function y(e,r){if(!Object.keys(r).length)w();else for(const[s,n]of Object.entries(r))i.isValid.Setting(e(s)),g[e(s)].set(n);return j(e())}function w(e){return Object.entries(g).filter(([r])=>r.startsWith(e())).forEach((e,{reset:r})=>r()),j(e())}function v(e,r,s){return r.forEach(r=>g[e(r)].onChange(s)),j(e())}function E(){const e=arguments[1];return!e||(0,t.isFunction)(e)||(0,t.isString)(e)?b.apply(null,arguments):Array.isArray(e)?v.apply(null,arguments):(0,t.isObject)(e)?y.apply(null,arguments):void 0}function S(e){Object.assign(A,e)}function j(e){const r=r=>(0,a.addNamespace)(e,r);return Object.assign(E.bind(null,r),{add:e=>c(r,e,!1),addPersistent:e=>c(r,e,!0),get:e=>b(r,e),set:e=>y(r,e),resetAll:()=>w(r),onChange:(e,s)=>v(r,e,s),removeListener:(e,s)=>function(e,r,s){return r.forEach(r=>g[e(r)].removeListener(s)),j(e())}(r,e,s),setStorageUtils:S,onStateChange:d})}S(n.default);const T=j("")},"./src/namespace.js"(e,r,s){"use strict";s.r(r),s.d(r,{addNamespace:()=>a,getByNamespace:()=>o,namespacify:()=>g,splitFullKey:()=>i});var n=s("./src/helpers.js");const t="::";function a(e,r){return`${e}${(0,n.isString)(r)&&t||""}${r||""}`}function i(e){const r=e.split(t);return[r.slice(-1)[0],r.slice(0,-1).join(t)]}function o(e,r){const s=i(e)[1]+t;return Object.fromEntries(Object.entries(r).filter(([e,r])=>e.startsWith(s)).map(([e,r])=>[e.slice(s.length),r]))}function g(e,r){return Object.fromEntries(Object.entries(r).map(([r,s])=>[a(e,r),s]))}},"./src/storage.js"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>n});const n={GET_TYPE:function(e){return e&&"localStorage"},IS_AVAILABE:function(e){return e},UPDATE_STATE:function(e){const r={};for(const s in e){const e=localStorage.getItem(s);null!==e&&(r[s]=e)}return Object.assign(e,r)},SET_VALUE:function(e,r,s){return window.localStorage.setItem(r,s),!1}}},"./src/validation.js"(e,r,s){"use strict";s.r(r),s.d(r,{isValid:()=>a});var n=s("./src/index.js"),t=s("./src/namespace.js");const a={Setting:e=>{if(!n.ACCESSORS[e]){const[r,s]=(0,t.splitFullKey)(e);throw new Error(`Setting "${r}" key in "${s}" namespace. DOES NOT EXIST`)}return!0},Defining:e=>{if(n.ACCESSORS[e]){const[r,s]=(0,t.splitFullKey)(e);throw new Error(`Redefining "${r}" key in "${s}" namespace. ALREADY DEFINED`)}return!0}}},"./src/webextension-storage.js"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>t,isBackgroundScript:()=>i,isSessionStorageSupport:()=>a});const n=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),t={GET_TYPE:function(e){return i()&&e?"local":"session"},IS_AVAILABE:function(e){return"local"===e||"session"===e&&a()},UPDATE_STATE:async function(e,r){return Object.assign(e,await n.storage[r].get())},SET_VALUE:function(e,r,s){return n.storage[e].set({[r]:s}),!0}};function a(){return!!n.storage.session}function i(){return"chrome-extension:"===window.location.protocol||"moz-extension:"===window.location.protocol}}};const r={};function s(n){const t=r[n];if(void 0!==t)return t.exports;const a=r[n]={exports:{}};if(!(n in e)){delete r[n];const e=new Error("Cannot find module '"+n+"'");throw e.code="MODULE_NOT_FOUND",e}return e[n].call(a.exports,a,a.exports,s),a.exports}s.d=(e,r)=>{if(Array.isArray(r))for(var n=0;n<r.length;){var t=r[n++],a=r[n++];s.o(e,t)?0===a&&n++:0===a?Object.defineProperty(e,t,{enumerable:!0,value:r[n++]}):Object.defineProperty(e,t,{enumerable:!0,get:a})}else for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),s.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let n={};return(()=>{"use strict";s.r(n),s.d(n,{default:()=>o});var e=s("./src/index.js"),r=s("./src/webextension-storage.js");const t=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),{onStateChange:a,setStorageUtils:i}=e.default;(0,r.isBackgroundScript)()&&(t.storage.local.onChanged.addListener(a),(0,r.isSessionStorageSupport)()&&t.storage.session.onChanged.addListener(a)),i(r.default);const o=e.default})(),n=n.default,n})());
|
package/dist/varstor.js
CHANGED
|
@@ -12,33 +12,6 @@ return /******/ (() => { // webpackBootstrap
|
|
|
12
12
|
/******/ "use strict";
|
|
13
13
|
/******/ var __webpack_modules__ = ({
|
|
14
14
|
|
|
15
|
-
/***/ "./src/error.js"
|
|
16
|
-
/*!**********************!*\
|
|
17
|
-
!*** ./src/error.js ***!
|
|
18
|
-
\**********************/
|
|
19
|
-
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
20
|
-
|
|
21
|
-
__webpack_require__.r(__webpack_exports__);
|
|
22
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
23
|
-
/* harmony export */ isKeyPresent: () => (/* binding */ isKeyPresent)
|
|
24
|
-
/* harmony export */ });
|
|
25
|
-
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
26
|
-
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const isKeyPresent = (fullKey) => {
|
|
31
|
-
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
32
|
-
const [key, namespace] = fullKey.split(_namespace__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER);
|
|
33
|
-
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
/***/ },
|
|
41
|
-
|
|
42
15
|
/***/ "./src/helpers.js"
|
|
43
16
|
/*!************************!*\
|
|
44
17
|
!*** ./src/helpers.js ***!
|
|
@@ -113,7 +86,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
113
86
|
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/storage.js");
|
|
114
87
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
115
88
|
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
116
|
-
/* harmony import */ var
|
|
89
|
+
/* harmony import */ var _validation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validation */ "./src/validation.js");
|
|
117
90
|
|
|
118
91
|
|
|
119
92
|
|
|
@@ -147,6 +120,7 @@ async function addState (namespace, initialState, isPersistent) {
|
|
|
147
120
|
|
|
148
121
|
const accessors = {};
|
|
149
122
|
for (const key in initialState) {
|
|
123
|
+
_validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Defining(namespace(key));
|
|
150
124
|
accessors[namespace(key)] = setupValue(
|
|
151
125
|
namespace(key),
|
|
152
126
|
namespacedValues[namespace(key)],
|
|
@@ -298,7 +272,8 @@ function setState (namespace, changes) {
|
|
|
298
272
|
resetAllState();
|
|
299
273
|
} else {
|
|
300
274
|
for (const [k,v] of Object.entries(changes)) {
|
|
301
|
-
|
|
275
|
+
_validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Setting(namespace(k));
|
|
276
|
+
ACCESSORS[namespace(k)].set(v);
|
|
302
277
|
};
|
|
303
278
|
}
|
|
304
279
|
|
|
@@ -376,7 +351,6 @@ function createStore (_namespace) {
|
|
|
376
351
|
|
|
377
352
|
__webpack_require__.r(__webpack_exports__);
|
|
378
353
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
379
|
-
/* harmony export */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER),
|
|
380
354
|
/* harmony export */ addNamespace: () => (/* binding */ addNamespace),
|
|
381
355
|
/* harmony export */ getByNamespace: () => (/* binding */ getByNamespace),
|
|
382
356
|
/* harmony export */ namespacify: () => (/* binding */ namespacify),
|
|
@@ -385,7 +359,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
385
359
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
386
360
|
|
|
387
361
|
|
|
388
|
-
const NAMESPACE_DELIMITER = "
|
|
362
|
+
const NAMESPACE_DELIMITER = "::";
|
|
389
363
|
|
|
390
364
|
function addNamespace(namespace, str) {
|
|
391
365
|
return `${namespace}${(0,_helpers__WEBPACK_IMPORTED_MODULE_0__.isString)(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
|
@@ -433,7 +407,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
433
407
|
function updateFromLocalStorage(state) {
|
|
434
408
|
const stored = {};
|
|
435
409
|
for (const key in state) {
|
|
436
|
-
|
|
410
|
+
const value = localStorage.getItem(key);
|
|
411
|
+
if (value !== null) {
|
|
412
|
+
stored[key] = value;
|
|
413
|
+
}
|
|
437
414
|
}
|
|
438
415
|
|
|
439
416
|
return Object.assign(state, stored);
|
|
@@ -460,6 +437,50 @@ function setStorageValue(storageType, key, value) {
|
|
|
460
437
|
});
|
|
461
438
|
|
|
462
439
|
|
|
440
|
+
/***/ },
|
|
441
|
+
|
|
442
|
+
/***/ "./src/validation.js"
|
|
443
|
+
/*!***************************!*\
|
|
444
|
+
!*** ./src/validation.js ***!
|
|
445
|
+
\***************************/
|
|
446
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
447
|
+
|
|
448
|
+
__webpack_require__.r(__webpack_exports__);
|
|
449
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
450
|
+
/* harmony export */ isValid: () => (/* binding */ isValid)
|
|
451
|
+
/* harmony export */ });
|
|
452
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
453
|
+
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
const isValid = {
|
|
459
|
+
Setting: (fullKey) => {
|
|
460
|
+
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
461
|
+
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
462
|
+
throw new Error(
|
|
463
|
+
`Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`,
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return true;
|
|
468
|
+
},
|
|
469
|
+
|
|
470
|
+
Defining: (fullKey) => {
|
|
471
|
+
if (___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
472
|
+
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
473
|
+
throw new Error(
|
|
474
|
+
`Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`,
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return true;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
|
|
463
484
|
/***/ }
|
|
464
485
|
|
|
465
486
|
/******/ });
|
package/dist/varstor.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see varstor.min.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Varstor=t():e.Varstor=t()}(this,()=>(()=>{"use strict";var e={"./src/
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Varstor=t():e.Varstor=t()}(this,()=>(()=>{"use strict";var e={"./src/helpers.js"(e,t,n){n.r(t),n.d(t,{getKeys:()=>l,getParamNames:()=>u,isArray:()=>a,isFunction:()=>o,isObject:()=>i,isString:()=>c,toCamelCase:()=>f});const r=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,s=/([^\s,]+)/g;function o(e){return"function"==typeof e}function i(e){return"object"==typeof e}function c(e){return"string"==typeof e}function a(e){return Array.isArray(e)}function u(e){const t=e.toString().replace(r,""),n=t.slice(t.indexOf("(")+1,t.indexOf(")")).match(s);return null===n?[]:n}function l(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,n[t]]))}function f(e,t){const n=e.split(t);return`${n[0]}${n.slice(1).reduce((e,t)=>`${e}${t.charAt(0).toUpperCase()}${t.slice(1)}`,"")}`}},"./src/index.js"(e,t,n){n.r(t),n.d(t,{ACCESSORS:()=>a,default:()=>V});var r=n("./src/storage.js"),s=n("./src/helpers.js"),o=n("./src/namespace.js"),i=n("./src/validation.js");const c={},a={},u={},l={},f={GET_TYPE:null,IS_AVAILABE:null,UPDATE_STATE:null,SET_VALUE:null};async function p(e,t,n){const r=f.GET_TYPE(n),s=Object.assign({},t),c=(0,o.namespacify)(e(),t);f.IS_AVAILABE(r)&&await f.UPDATE_STATE(c,r);const u={};for(const n in t)i.isValid.Defining(e(n)),u[e(n)]=d(e(n),c[e(n)],s[n],r);return Object.assign(a,u),T(e())}function d(e,t,n,r){const i=(0,s.isFunction)(t);return i&&function(e,t){const[,n]=(0,o.splitFullKey)(e),r=(0,s.getParamNames)(t).map(e=>(0,o.addNamespace)(n,e));l[e]=r,r.forEach(t=>{u[t]?u[t].push(e):u[t]=[e]})}(e,t),c[e]={value:i?t.apply(null,g(e)):t,computeFn:t,listeners:[],defaultValue:n},function(e,t,n){const r=()=>c[e].value;return Object.assign(r,{valueOf:()=>c[e].value,toString:()=>c[e].value,set:t=>y(e,t,n),onChange:t=>c[e].listeners.push(t),removeListener:t=>c[e].listeners=c[e].listeners.filter(e=>e!==t),reset:()=>y(e,c[e].defaultValue,n)}),new Proxy(r,{get:(t,n)=>Object.keys(r).includes(n)?t[n]:c[e].value[n]})}(e,0,r)}function g(e){const t=S(e);return l[e].map(e=>t[(0,o.splitFullKey)(e)[0]]).concat(t)}function y(e,t,n){if(f.IS_AVAILABE(n)){if(f.SET_VALUE(n,e,t))return}m({[e]:{newValue:t}})}function m(e){const t={};for(const n in e){const r=c[n].value,s=e[n].newValue;r!==s&&(c[n].value=s,t[n]={newValue:s,prevValue:r},E(n,t))}for(const e in t)c[e].listeners.forEach(n=>n(c[e].value,S(e),t[e]))}function E(e,t){const n=u[e];n&&n.forEach(e=>{const n=c[e].value,r=c[e].computeFn.apply(null,g(e));n!==r&&(c[e].value=r,t[e]={newValue:r,prevValue:n},E(e,t))})}function j(e,t){return(0,s.isString)(t)?T(t):(0,s.isFunction)(t)?function(e,t){const n=(0,o.getByNamespace)(e,a);return t.call(null,n,T(e()))}(e(""),t):S(e(""))}function S(e){return(0,s.getKeys)((0,o.getByNamespace)(e,c),"value")}function O(e,t){if(!Object.keys(t).length)A();else for(const[n,r]of Object.entries(t))i.isValid.Setting(e(n)),a[e(n)].set(r);return T(e())}function A(e){return Object.entries(a).filter(([t])=>t.startsWith(e())).forEach((e,{reset:t})=>t()),T(e())}function b(e,t,n){return t.forEach(t=>a[e(t)].onChange(n)),T(e())}function v(){const e=arguments[1];return!e||(0,s.isFunction)(e)||(0,s.isString)(e)?j.apply(null,arguments):Array.isArray(e)?b.apply(null,arguments):(0,s.isObject)(e)?O.apply(null,arguments):void 0}function h(e){Object.assign(f,e)}function T(e){const t=t=>(0,o.addNamespace)(e,t);return Object.assign(v.bind(null,t),{add:e=>p(t,e,!1),addPersistent:e=>p(t,e,!0),get:e=>j(t,e),set:e=>O(t,e),resetAll:()=>A(t),onChange:(e,n)=>b(t,e,n),removeListener:(e,n)=>function(e,t,n){return t.forEach(t=>a[e(t)].removeListener(n)),T(e())}(t,e,n),setStorageUtils:h,onStateChange:m})}h(r.default);const V=T("")},"./src/namespace.js"(e,t,n){n.r(t),n.d(t,{addNamespace:()=>o,getByNamespace:()=>c,namespacify:()=>a,splitFullKey:()=>i});var r=n("./src/helpers.js");const s="::";function o(e,t){return`${e}${(0,r.isString)(t)&&s||""}${t||""}`}function i(e){const t=e.split(s);return[t.slice(-1)[0],t.slice(0,-1).join(s)]}function c(e,t){const n=i(e)[1]+s;return Object.fromEntries(Object.entries(t).filter(([e,t])=>e.startsWith(n)).map(([e,t])=>[e.slice(n.length),t]))}function a(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[o(e,t),n]))}},"./src/storage.js"(e,t,n){n.r(t),n.d(t,{default:()=>r});const r={GET_TYPE:function(e){return e&&"localStorage"},IS_AVAILABE:function(e){return e},UPDATE_STATE:function(e){const t={};for(const n in e){const e=localStorage.getItem(n);null!==e&&(t[n]=e)}return Object.assign(e,t)},SET_VALUE:function(e,t,n){return window.localStorage.setItem(t,n),!1}}},"./src/validation.js"(e,t,n){n.r(t),n.d(t,{isValid:()=>o});var r=n("./src/index.js"),s=n("./src/namespace.js");const o={Setting:e=>{if(!r.ACCESSORS[e]){const[t,n]=(0,s.splitFullKey)(e);throw new Error(`Setting "${t}" key in "${n}" namespace. DOES NOT EXIST`)}return!0},Defining:e=>{if(r.ACCESSORS[e]){const[t,n]=(0,s.splitFullKey)(e);throw new Error(`Redefining "${t}" key in "${n}" namespace. ALREADY DEFINED`)}return!0}}}};const t={};function n(r){const s=t[r];if(void 0!==s)return s.exports;const o=t[r]={exports:{}};if(!(r in e)){delete t[r];const e=new Error("Cannot find module '"+r+"'");throw e.code="MODULE_NOT_FOUND",e}return e[r](o,o.exports,n),o.exports}n.d=(e,t)=>{if(Array.isArray(t))for(var r=0;r<t.length;){var s=t[r++],o=t[r++];n.o(e,s)?0===o&&r++:0===o?Object.defineProperty(e,s,{enumerable:!0,value:t[r++]}):Object.defineProperty(e,s,{enumerable:!0,get:o})}else for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let r=n("./src/index.js");return r=r.default,r})());
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "varstor",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "State manager for web applications and
|
|
3
|
+
"version": "0.0.4",
|
|
4
|
+
"description": "State manager for web applications and webextensions, employing reactivity, wrapping, and uniting the usage of different storages' values and common variables into a simple universal interface",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Igor Morozov <ismorozs@gmail.com>",
|
|
7
7
|
"main": "./dist/varstor.js",
|
package/src/index.js
CHANGED
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
} from "./namespace";
|
|
15
15
|
|
|
16
16
|
import {
|
|
17
|
-
|
|
18
|
-
} from './
|
|
17
|
+
isValid
|
|
18
|
+
} from './validation';
|
|
19
19
|
|
|
20
20
|
const STATE = {};
|
|
21
21
|
export const ACCESSORS = {};
|
|
@@ -42,6 +42,7 @@ async function addState (namespace, initialState, isPersistent) {
|
|
|
42
42
|
|
|
43
43
|
const accessors = {};
|
|
44
44
|
for (const key in initialState) {
|
|
45
|
+
isValid.Defining(namespace(key));
|
|
45
46
|
accessors[namespace(key)] = setupValue(
|
|
46
47
|
namespace(key),
|
|
47
48
|
namespacedValues[namespace(key)],
|
|
@@ -193,7 +194,8 @@ function setState (namespace, changes) {
|
|
|
193
194
|
resetAllState();
|
|
194
195
|
} else {
|
|
195
196
|
for (const [k,v] of Object.entries(changes)) {
|
|
196
|
-
|
|
197
|
+
isValid.Setting(namespace(k));
|
|
198
|
+
ACCESSORS[namespace(k)].set(v);
|
|
197
199
|
};
|
|
198
200
|
}
|
|
199
201
|
|
package/src/namespace.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
getKeys, isString, toCamelCase
|
|
3
3
|
} from './helpers';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
const NAMESPACE_DELIMITER = "::";
|
|
6
6
|
|
|
7
7
|
export function addNamespace(namespace, str) {
|
|
8
8
|
return `${namespace}${isString(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
package/src/storage.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
function updateFromLocalStorage(state) {
|
|
2
2
|
const stored = {};
|
|
3
3
|
for (const key in state) {
|
|
4
|
-
|
|
4
|
+
const value = localStorage.getItem(key);
|
|
5
|
+
if (value !== null) {
|
|
6
|
+
stored[key] = value;
|
|
7
|
+
}
|
|
5
8
|
}
|
|
6
9
|
|
|
7
10
|
return Object.assign(state, stored);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ACCESSORS } from "."
|
|
2
|
+
import { splitFullKey } from "./namespace";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export const isValid = {
|
|
6
|
+
Setting: (fullKey) => {
|
|
7
|
+
if (!ACCESSORS[fullKey]) {
|
|
8
|
+
const [key, namespace] = splitFullKey(fullKey);
|
|
9
|
+
throw new Error(
|
|
10
|
+
`Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`,
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return true;
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
Defining: (fullKey) => {
|
|
18
|
+
if (ACCESSORS[fullKey]) {
|
|
19
|
+
const [key, namespace] = splitFullKey(fullKey);
|
|
20
|
+
throw new Error(
|
|
21
|
+
`Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`,
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const browser = require("webextension-polyfill/dist/browser-polyfill.min");
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
GET_TYPE: getStorageType,
|
|
5
|
+
IS_AVAILABE: isStorageAvailable,
|
|
6
|
+
UPDATE_STATE: updateStateFromStorage,
|
|
7
|
+
SET_VALUE: setStorageValue,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
function getStorageType(isPersistent) {
|
|
11
|
+
return (isBackgroundScript() && isPersistent && "local") || "session";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function isStorageAvailable(storageType) {
|
|
15
|
+
return (
|
|
16
|
+
storageType === "local" ||
|
|
17
|
+
(storageType === "session" && isSessionStorageSupport())
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function updateStateFromStorage(state, type) {
|
|
22
|
+
return Object.assign(state, await browser.storage[type].get());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function setStorageValue(type, key, value) {
|
|
26
|
+
browser.storage[type].set({ [key]: value });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function isSessionStorageSupport() {
|
|
31
|
+
return !!browser.storage.session;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function isBackgroundScript() {
|
|
35
|
+
return (
|
|
36
|
+
window.location.protocol === "chrome-extension:" ||
|
|
37
|
+
window.location.protocol === "moz-extension:"
|
|
38
|
+
);
|
|
39
|
+
}
|
package/src/webextension.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const browser = require("webextension-polyfill/dist/browser-polyfill.min");
|
|
2
2
|
|
|
3
3
|
import main from '.';
|
|
4
|
+
import webextensionStorageUtils, { isBackgroundScript, isSessionStorageSupport } from './webextension-storage';
|
|
4
5
|
|
|
5
6
|
const { onStateChange, setStorageUtils } = main;
|
|
6
7
|
|
|
@@ -10,40 +11,6 @@ if (isBackgroundScript()) {
|
|
|
10
11
|
browser.storage.session.onChanged.addListener(onStateChange);
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
setStorageUtils(
|
|
14
|
-
GET_TYPE: getStorageType,
|
|
15
|
-
IS_AVAILABE: isStorageAvailable,
|
|
16
|
-
UPDATE_STATE: updateStateFromStorage,
|
|
17
|
-
SET_VALUE: setStorageValue,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
function getStorageType (isPersistent) {
|
|
21
|
-
return isBackgroundScript() && isPersistent && "local" || "session";
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function isStorageAvailable (storageType) {
|
|
25
|
-
return storageType === "local" ||
|
|
26
|
-
(storageType === "session" && isSessionStorageSupport());
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async function updateStateFromStorage (state, type) {
|
|
30
|
-
return Object.assign(state, await browser.storage[type].get());
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function setStorageValue (type, key, value) {
|
|
34
|
-
browser.storage[type].set({ [key]: value });
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function isSessionStorageSupport () {
|
|
39
|
-
return !!browser.storage.session;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function isBackgroundScript() {
|
|
43
|
-
return (
|
|
44
|
-
window.location.protocol === "chrome-extension:" ||
|
|
45
|
-
window.location.protocol === "moz-extension:"
|
|
46
|
-
);
|
|
47
|
-
}
|
|
14
|
+
setStorageUtils(webextensionStorageUtils);
|
|
48
15
|
|
|
49
16
|
export default main;
|
package/src/error.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { ACCESSORS } from "."
|
|
2
|
-
import { NAMESPACE_DELIMITER } from "./namespace";
|
|
3
|
-
|
|
4
|
-
export const isKeyPresent = (fullKey) => {
|
|
5
|
-
if (!ACCESSORS[fullKey]) {
|
|
6
|
-
const [key, namespace] = fullKey.split(NAMESPACE_DELIMITER);
|
|
7
|
-
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return true;
|
|
11
|
-
}
|