varstor 0.0.3 → 0.0.5
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 +120 -2
- package/dist/varstor-webextension.js +111 -69
- package/dist/varstor-webextension.min.js +1 -1
- package/dist/varstor.js +49 -31
- package/dist/varstor.min.js +1 -1
- package/package.json +4 -2
- package/src/index.js +5 -3
- package/src/namespace.js +1 -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
|
@@ -14,6 +14,124 @@ import varstor from 'varstor'
|
|
|
14
14
|
or, if you are developing a webextension (except content script)
|
|
15
15
|
|
|
16
16
|
```js
|
|
17
|
-
import
|
|
17
|
+
import Varstor from 'varstor/webextension'
|
|
18
18
|
```
|
|
19
|
-
in your script file.
|
|
19
|
+
in your script file.
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
The library object features the following methods:
|
|
23
|
+
```js
|
|
24
|
+
.add ()
|
|
25
|
+
.addPersistent ()
|
|
26
|
+
.get ()
|
|
27
|
+
.set ()
|
|
28
|
+
.resetAll ()
|
|
29
|
+
.onChange ()
|
|
30
|
+
.removeListener ()
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Values are added to the store with ```add``` or ```addPersistent``` methods. They perform the same functionality, except ```addPersistent``` allows state to be saved in storage and reused between browser sessions.
|
|
34
|
+
Signature of those methods is:
|
|
35
|
+
```js
|
|
36
|
+
async Varstor.add(
|
|
37
|
+
KeysValues {
|
|
38
|
+
key1: value1,
|
|
39
|
+
key2: value2,
|
|
40
|
+
key3: ComputeFunction(...dependencies) => computedValue
|
|
41
|
+
...
|
|
42
|
+
}
|
|
43
|
+
) =>
|
|
44
|
+
StateAccessors {
|
|
45
|
+
key: StateAccessor
|
|
46
|
+
...
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
Where:
|
|
50
|
+
```KeysValues``` - a standard object with keys and values, where ```key``` is used to identify a piece of state, and ```value``` to give it a default value or ```ComputeFunction```
|
|
51
|
+
```ComputeFunction``` - reevalutes and updates its value automatically each time ```dependencies``` parameters change. ```dependencies``` parameters are any state values defined before the ```ComputeFunction```. ```computedValue```s are not saved in storage.
|
|
52
|
+
```StateAccessors``` - a map linking state ```key```s to special ```StateAccessor``` objects which will perform data manipulations and listener management.
|
|
53
|
+
|
|
54
|
+
**Important: ```add``` and ```addPersistent``` are asynchronous operations; you must `await` or use ```Promise.then``` to ensure all the data is ready to work with!**
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Values can be accessed with:
|
|
59
|
+
```js
|
|
60
|
+
Varstor.get () => StateValues
|
|
61
|
+
```
|
|
62
|
+
Where:
|
|
63
|
+
```StateValues``` - an object representing all the values in the store in the current namespace at the current moment
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
or
|
|
67
|
+
```js
|
|
68
|
+
Varstor.get (AccessorsCallback (StateAccessors {}) => value) => value
|
|
69
|
+
```
|
|
70
|
+
Where:
|
|
71
|
+
```AccessorsCallback``` - a function that takes all ```StateAccessors``` in the current namespace, manipulates them, and can return any ```value```, which in turn will be returned from the whole ```get(Callback)``` call.
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
Values can be mutated with:
|
|
75
|
+
```js
|
|
76
|
+
async Varstor.set (
|
|
77
|
+
KeysValues {
|
|
78
|
+
key: value
|
|
79
|
+
...
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
**Important: values are updated asynchronously; don't assume the script will recognize the change immediately. Instead, make use of ```onChange``` listeners!**
|
|
84
|
+
|
|
85
|
+
To reset all stored values back to defaults:
|
|
86
|
+
```js
|
|
87
|
+
async Varstor.resetAll ()
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
To listen and react to state changes:
|
|
91
|
+
```js
|
|
92
|
+
Varstor.onChange (Keys[], ChangeCallback(newValue, allValues, previousValue) => void)
|
|
93
|
+
```
|
|
94
|
+
Where:
|
|
95
|
+
```Keys``` (optional) - array of keys of state that you want to listen to
|
|
96
|
+
```ChangeCallback``` - function to run when a change happens
|
|
97
|
+
|
|
98
|
+
To remove the listener:
|
|
99
|
+
```js
|
|
100
|
+
Varstor.removeListener(Keys, ChangeCallback)
|
|
101
|
+
```
|
|
102
|
+
the same parameter usage
|
|
103
|
+
|
|
104
|
+
## Namespacing
|
|
105
|
+
To avoid name collisions, put keys with the same name in different namespaces. You can do that with
|
|
106
|
+
```js
|
|
107
|
+
Varstor.get(String Namespace) => Varstor
|
|
108
|
+
```
|
|
109
|
+
which will return a new instance of ```Varstor``` with the specified ```Namespace```.
|
|
110
|
+
|
|
111
|
+
## Shortcuts
|
|
112
|
+
The library object itself can be called with different types of arguments, which will mirror almost all of its API.
|
|
113
|
+
```js
|
|
114
|
+
Varstor() -> Varstor.get()
|
|
115
|
+
Varstor(String namespace) -> Varstor.get(namespace)
|
|
116
|
+
Varstor(() => {}) -> Varstor.get(() => {})
|
|
117
|
+
Varstor({ key: value }) -> Varstor.set({ key: value })
|
|
118
|
+
Varstor({}) -> Varstor.resetAll()
|
|
119
|
+
Varstor([], () => {}) -> Varstor.onChange([], () => {})
|
|
120
|
+
```
|
|
121
|
+
Each call returns a new instance of ```Varstor```, so the chaining is possible.
|
|
122
|
+
|
|
123
|
+
## StateAccessor
|
|
124
|
+
```StateAccessor``` is a way to manipulate each piece of state individually. It's a function that can be called itself, but also an object with a set of methods:
|
|
125
|
+
```js
|
|
126
|
+
.()
|
|
127
|
+
.set(value)
|
|
128
|
+
.reset()
|
|
129
|
+
.onChange(Callback)
|
|
130
|
+
.removeListener(Callback)
|
|
131
|
+
```
|
|
132
|
+
Where:
|
|
133
|
+
```()``` (call the object itself) - returns the value
|
|
134
|
+
```.set(value)``` - sets the value
|
|
135
|
+
```.reset()``` - resets the value
|
|
136
|
+
```.onChange(Callback)``` - adds the listener
|
|
137
|
+
```.removeListener(Callback)``` - removes the listener
|
|
@@ -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, obj) => {
|
|
53
|
-
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
54
|
-
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
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 || ""}`;
|
|
@@ -489,6 +462,107 @@ function setStorageValue(storageType, key, value) {
|
|
|
489
462
|
});
|
|
490
463
|
|
|
491
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
|
+
|
|
492
566
|
/***/ }
|
|
493
567
|
|
|
494
568
|
/******/ });
|
|
@@ -580,53 +654,21 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
580
654
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
581
655
|
/* harmony export */ });
|
|
582
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");
|
|
583
658
|
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
584
659
|
|
|
585
660
|
|
|
586
661
|
|
|
662
|
+
|
|
587
663
|
const { onStateChange, setStorageUtils } = ___WEBPACK_IMPORTED_MODULE_0__["default"];
|
|
588
664
|
|
|
589
|
-
if (isBackgroundScript()) {
|
|
665
|
+
if ((0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isBackgroundScript)()) {
|
|
590
666
|
browser.storage.local.onChanged.addListener(onStateChange);
|
|
591
|
-
isSessionStorageSupport() &&
|
|
667
|
+
(0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isSessionStorageSupport)() &&
|
|
592
668
|
browser.storage.session.onChanged.addListener(onStateChange);
|
|
593
669
|
}
|
|
594
670
|
|
|
595
|
-
setStorageUtils(
|
|
596
|
-
GET_TYPE: getStorageType,
|
|
597
|
-
IS_AVAILABE: isStorageAvailable,
|
|
598
|
-
UPDATE_STATE: updateStateFromStorage,
|
|
599
|
-
SET_VALUE: setStorageValue,
|
|
600
|
-
});
|
|
601
|
-
|
|
602
|
-
function getStorageType (isPersistent) {
|
|
603
|
-
return isBackgroundScript() && isPersistent && "local" || "session";
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
function isStorageAvailable (storageType) {
|
|
607
|
-
return storageType === "local" ||
|
|
608
|
-
(storageType === "session" && isSessionStorageSupport());
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
async function updateStateFromStorage (state, type) {
|
|
612
|
-
return Object.assign(state, await browser.storage[type].get());
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
function setStorageValue (type, key, value) {
|
|
616
|
-
browser.storage[type].set({ [key]: value });
|
|
617
|
-
return true;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
function isSessionStorageSupport () {
|
|
621
|
-
return !!browser.storage.session;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
function isBackgroundScript() {
|
|
625
|
-
return (
|
|
626
|
-
window.location.protocol === "chrome-extension:" ||
|
|
627
|
-
window.location.protocol === "moz-extension:"
|
|
628
|
-
);
|
|
629
|
-
}
|
|
671
|
+
setStorageUtils(_webextension_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
630
672
|
|
|
631
673
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
632
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))})},o=(e,r,s)=>new Proxy(r,{apply:(r,n,t)=>s.call(n,e,...t)});let i=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(i(s,a)){let r=g(a,s[a]);l=o(e,e[a],r)}else l=l.bind(e);else if("object"==typeof l&&null!==l&&(i(r,a)||i(s,a)))l=m(l,r[a],s[a]);else{if(!i(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,o=!1,i=new Promise(e=>{a=function(r){o=!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&&!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?g:i),!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,r)=>{if(!n.ACCESSORS[e]){const[r,s]=(0,t.splitFullKey)(e);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:()=>i,isFunction:()=>a,isObject:()=>g,isString:()=>o,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 o(e){return"string"==typeof e}function i(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:()=>i,default:()=>k});var n=s("./src/storage.js"),t=s("./src/helpers.js"),a=s("./src/namespace.js"),g=s("./src/error.js");const o={},i={},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 o={};for(const s in r)o[e(s)]=u(e(s),g[e(s)],t[s],n);return Object.assign(i,o),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),o[e]={value:g?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,i);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)v();else for(const[s,n]of Object.entries(r))(0,g.isKeyPresent)(e(s))&&i[e(s)].set(n);return j(e())}function v(e){return Object.entries(i).filter(([r])=>r.startsWith(e())).forEach((e,{reset:r})=>r()),j(e())}function w(e,r,s){return r.forEach(r=>i[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=>i[e(r)].removeListener(s)),j(e())}(r,e,s),setStorageUtils:T,onStateChange:d})}T(n.default);const k=j("")},"./src/namespace.js"(e,r,s){"use strict";s.r(r),s.d(r,{NAMESPACE_DELIMITER:()=>t,addNamespace:()=>a,getByNamespace:()=>o,namespacify:()=>i,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 o(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 i(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}}}};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:()=>i});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 o(){return"chrome-extension:"===window.location.protocol||"moz-extension:"===window.location.protocol}o()&&(r.storage.local.onChanged.addListener(t),g()&&r.storage.session.onChanged.addListener(t)),a({GET_TYPE:function(e){return o()&&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 i=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, obj) => {
|
|
31
|
-
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
32
|
-
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
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 || ""}`;
|
|
@@ -463,6 +437,50 @@ function setStorageValue(storageType, key, value) {
|
|
|
463
437
|
});
|
|
464
438
|
|
|
465
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
|
+
|
|
466
484
|
/***/ }
|
|
467
485
|
|
|
468
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,13 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "varstor",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
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",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": "./dist/varstor.js",
|
|
10
|
-
"./
|
|
10
|
+
"./min": "./dist/varstor.min.js",
|
|
11
|
+
"./webextension": "./dist/varstor-webextension.js",
|
|
12
|
+
"./webextension/min": "./dist/varstor-webextension.min.js"
|
|
11
13
|
},
|
|
12
14
|
"scripts": {
|
|
13
15
|
"start": "webpack",
|
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 || ""}`;
|
|
@@ -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 { splitFullKey } from "./namespace";
|
|
3
|
-
|
|
4
|
-
export const isKeyPresent = (fullKey, obj) => {
|
|
5
|
-
if (!ACCESSORS[fullKey]) {
|
|
6
|
-
const [key, namespace] = splitFullKey(fullKey);
|
|
7
|
-
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return true;
|
|
11
|
-
}
|