varstor 0.6.63 → 0.6.65
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 +55 -18
- package/dist/varstor-webextension.js +114 -78
- package/dist/varstor-webextension.min.js +1 -1
- package/dist/varstor.js +105 -74
- package/dist/varstor.min.js +1 -1
- package/package.json +1 -1
- package/src/actions.ts +3 -9
- package/src/helpers.ts +8 -0
- package/src/index.ts +87 -20
- package/src/listeners.ts +21 -15
- package/src/storage.ts +7 -0
- package/src/types.d.ts +12 -4
- package/src/webextension-storage.ts +7 -0
- package/src/webextension.ts +3 -3
- package/src/validation.ts +0 -31
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ in your script file.
|
|
|
23
23
|
[1.1 Creation ```.add()```/```.addPersistent()```](#creation)
|
|
24
24
|
[1.2 Dynamic reevaluation (```ReactiveFunction```)](#reactivefunction)
|
|
25
25
|
[1.3 Accessing ```.get()```](#accessing)
|
|
26
|
-
[1.4 Mutating ```.set()```/```.reset()```](#mutating)
|
|
26
|
+
[1.4 Mutating ```.set()```/```.reset()```/```.changes.*()```](#mutating)
|
|
27
27
|
[1.5 Listening ```.onChange()```/```.removeListener()```](#listening)
|
|
28
28
|
[1.6 Data encapsulation ```.actions()```](#actions)
|
|
29
29
|
[1.7 Namespacing ```.get(Namespace)```](#namespacing)
|
|
@@ -32,20 +32,22 @@ in your script file.
|
|
|
32
32
|
3. [Example](#example)
|
|
33
33
|
|
|
34
34
|
## Usage <a name="overview"></a>
|
|
35
|
-
The library object features the following methods:
|
|
35
|
+
The library object features the following methods and properties:
|
|
36
36
|
```js
|
|
37
37
|
.add ()
|
|
38
38
|
.addPersistent ()
|
|
39
39
|
.get ()
|
|
40
40
|
.set ()
|
|
41
41
|
.reset ()
|
|
42
|
+
.changes {}
|
|
42
43
|
.onChange ()
|
|
43
44
|
.removeListener ()
|
|
44
45
|
.actions ()
|
|
46
|
+
.namespace () // just returns the string value of the current namespace
|
|
45
47
|
```
|
|
46
48
|
|
|
47
49
|
## Creation ```.add()```/```.addPersistent()``` <a name="creation"></a>
|
|
48
|
-
Values are added to the store with add or addPersistent methods. They perform the same functionality, except addPersistent saves state to the storage and lets you reuse it between browser sessions.
|
|
50
|
+
Values are added to the store with ```add``` or ```addPersistent``` methods. They perform the same functionality, except ```addPersistent``` saves state to the storage and lets you reuse it between browser sessions.
|
|
49
51
|
|
|
50
52
|
```js
|
|
51
53
|
async Varstor.add(
|
|
@@ -61,7 +63,10 @@ Where:
|
|
|
61
63
|
```KeysValues {}``` - a standard object with keys and values, where ```key``` is a name of piece of state, and ```value``` is a default value or ```ReactiveFunction```
|
|
62
64
|
```ReactiveFunction``` - re-evalutes and updates its value automatically each time arguments in ```valueNames``` list change. ```valueNames``` are any state values defined before the ```ReactiveFunction```. ```computedValue```s are not saved in storage.
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
> [!WARNING]
|
|
67
|
+
> ```add``` and ```addPersistent``` are asynchronous operations; you must `await` or use ```Promise.then``` to ensure all the data is ready to work with!
|
|
68
|
+
|
|
69
|
+
|
|
65
70
|
|
|
66
71
|
## Dynamic reevaluation (```ReactiveFunction```) <a name="reactivefunction"></a>
|
|
67
72
|
Values can change automatically with the help of ```ReactiveFunction```s when one or more of the other values in the namespace change.
|
|
@@ -89,7 +94,7 @@ Where:
|
|
|
89
94
|
|
|
90
95
|
|
|
91
96
|
|
|
92
|
-
## Mutating ```.set()```/```.reset()``` <a name="mutating"></a>
|
|
97
|
+
## Mutating ```.set()```/```.reset()```/```.changes.*()``` <a name="mutating"></a>
|
|
93
98
|
Values are mutated with:
|
|
94
99
|
```js
|
|
95
100
|
async Varstor.set(
|
|
@@ -99,14 +104,25 @@ async Varstor.set(
|
|
|
99
104
|
}
|
|
100
105
|
) => Varstor
|
|
101
106
|
```
|
|
102
|
-
|
|
103
|
-
|
|
107
|
+
\
|
|
104
108
|
To reset values back to defaults:
|
|
105
109
|
```js
|
|
106
110
|
async Varstor.reset(Keys []) => Varstor
|
|
107
111
|
```
|
|
108
112
|
Where:
|
|
109
113
|
```Keys[]``` (optional) - array of keys to return to default values. If omitted all values will be returned to defaults.
|
|
114
|
+
\
|
|
115
|
+
For more control over the timing of state changes in the namespace, use ```.changes {}``` methods collection.
|
|
116
|
+
```js
|
|
117
|
+
Varstor.changes.add(KeysValues {}) // => adds pending changes in the current namespace
|
|
118
|
+
Varstor.changes.reset(Keys []) // => adds pending changes that will reset some of the keys
|
|
119
|
+
Varstor.changes.get() // => gets pending changes in the current namespace
|
|
120
|
+
Varstor.changes.flush() // => returns and then empties the pending changes object
|
|
121
|
+
Varstor.changes.commit() // => actually commits all accumulated pending changes in the namespace
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
> [!WARNING]
|
|
125
|
+
> Values are mutated asynchronously; don't assume the script will recognize the change immediately on the next line. Instead, ```await``` or make use of ```onChange``` listeners!
|
|
110
126
|
|
|
111
127
|
|
|
112
128
|
## Listening ```.onChange()```/```.removeListener()``` <a name="listening"></a>
|
|
@@ -115,18 +131,21 @@ To listen and react to state changes:
|
|
|
115
131
|
```js
|
|
116
132
|
Varstor.onChange(
|
|
117
133
|
Keys[],
|
|
118
|
-
ChangeCallback(ChangedKeys [],
|
|
134
|
+
ChangeCallback(ChangedKeys [], Varstor) => void
|
|
119
135
|
) => Varstor
|
|
120
136
|
```
|
|
121
137
|
Where:
|
|
122
138
|
```Keys[]``` (optional) - array of keys of the state in the current namespace that you want to listen to. If omitted, ```ChangeCallback``` will run on any value change in the namespace.
|
|
123
|
-
|
|
139
|
+
|
|
124
140
|
|
|
141
|
+
```ChangeCallback``` - a function to run when the change happens. Takes ```ChangedKeys[]``` array of keys that have been changed as the first argument, and a ```Varstor``` instance as the second.
|
|
142
|
+
\
|
|
143
|
+
\
|
|
125
144
|
To remove the listener:
|
|
126
145
|
```js
|
|
127
146
|
Varstor.removeListener(
|
|
128
147
|
Keys[],
|
|
129
|
-
ChangeCallback(ChangedKeys [],
|
|
148
|
+
ChangeCallback(ChangedKeys [], Varstor) => void
|
|
130
149
|
) => Varstor
|
|
131
150
|
```
|
|
132
151
|
the same parameter usage.
|
|
@@ -134,17 +153,17 @@ the same parameter usage.
|
|
|
134
153
|
|
|
135
154
|
|
|
136
155
|
## Data encapsulation ```.actions()``` <a name="actions"></a>
|
|
137
|
-
Hide away all public data access and mutation into dedicated functions with the help of ```
|
|
156
|
+
Hide away all public data access and mutation into dedicated functions with the help of ```StateAction```s.
|
|
138
157
|
```js
|
|
139
158
|
Varstor.actions({
|
|
140
159
|
KeysActions {
|
|
141
|
-
key1:
|
|
142
|
-
key2:
|
|
160
|
+
key1: StateAction1 (Varstor, ...arguments[]) => void
|
|
161
|
+
key2: StateAction2 (Varstor, ...arguments[]) => void
|
|
143
162
|
...
|
|
144
163
|
}
|
|
145
164
|
})
|
|
146
165
|
```
|
|
147
|
-
```
|
|
166
|
+
```StateAction``` function type binds ```Varstor``` instance as the first argument, followed by all other ```arguments``` provided by the user at the time of the call.
|
|
148
167
|
These actions reside in the same scope as regular variables. So you can access them by the ```key```s defined in ```KeysActions``` object through the ```.get()``` method.
|
|
149
168
|
```js
|
|
150
169
|
Varstor.add({ x: 1 });
|
|
@@ -165,7 +184,7 @@ which will return a new instance of ```Varstor``` with the specified ```Namespac
|
|
|
165
184
|
|
|
166
185
|
|
|
167
186
|
## Method chaining <a name="chaining"></a>
|
|
168
|
-
Methods ```.add```, ```.addPersistent```, ```.set()```, ```.reset()```,
|
|
187
|
+
Methods ```.add```, ```.addPersistent```, ```.set()```, ```.reset()```, ```.onChange()```, and ```.removeListener()``` all return a new instance of ```Varstor``` with the same namespace, so method chaining is possible.
|
|
169
188
|
|
|
170
189
|
|
|
171
190
|
## Shortcuts <a name="shortcuts"></a>
|
|
@@ -174,13 +193,14 @@ The library/namespace object itself can be called with different types of argume
|
|
|
174
193
|
Varstor() -> Varstor.get()
|
|
175
194
|
Varstor(String namespace) -> Varstor.get(namespace)
|
|
176
195
|
Varstor({ key: value }) -> Varstor.set({ key: value })
|
|
177
|
-
Varstor([], () => {}) -> Varstor.onChange([], () => {})
|
|
196
|
+
Varstor([], () => {}) -> Varstor.onChange([], () => {})
|
|
197
|
+
Varstor(() => {}) -> Varstor.onChange(() => {})
|
|
178
198
|
```
|
|
179
199
|
|
|
180
200
|
## Example <a name="example"></a>
|
|
181
201
|
```js
|
|
182
|
-
function onChange(changes,
|
|
183
|
-
console.log("onChange",
|
|
202
|
+
function onChange(changes, store) {
|
|
203
|
+
console.log("onChange", store.get());
|
|
184
204
|
}
|
|
185
205
|
|
|
186
206
|
await Varstor.add({
|
|
@@ -237,4 +257,21 @@ logValues(); // x: 10, y: 3, z: 3
|
|
|
237
257
|
await newNamespace({ z: 110 });
|
|
238
258
|
|
|
239
259
|
console.log(Varstor("new namespace").get()); // {x: 10, y: 3, z: 110, logValues: ƒ, multiplyX: ƒ, …}
|
|
260
|
+
|
|
261
|
+
const thirdNamespace = Varstor("third namespace");
|
|
262
|
+
|
|
263
|
+
thirdNamespace.add({
|
|
264
|
+
phrase: "Hello",
|
|
265
|
+
to: "world",
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
thirdNamespace.changes.add({ phrase: "Greetings" });
|
|
269
|
+
thirdNamespace.changes.add({ to: "you" });
|
|
270
|
+
|
|
271
|
+
console.log(thirdNamespace.get()) // {phrase: 'Hello', to: 'world'}
|
|
272
|
+
|
|
273
|
+
thirdNamespace.changes.commit();
|
|
274
|
+
|
|
275
|
+
console.log(thirdNamespace.get()) // {phrase: 'Greetings', to: 'you'}
|
|
276
|
+
|
|
240
277
|
```
|
|
@@ -25,16 +25,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
25
25
|
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
26
26
|
|
|
27
27
|
function addStateActions(namespace, actions) {
|
|
28
|
-
const
|
|
29
|
-
get: ___WEBPACK_IMPORTED_MODULE_0__.getState.bind(null, namespace),
|
|
30
|
-
set: ___WEBPACK_IMPORTED_MODULE_0__.setState.bind(null, namespace),
|
|
31
|
-
reset: ___WEBPACK_IMPORTED_MODULE_0__.resetState.bind(null, namespace),
|
|
32
|
-
};
|
|
33
|
-
for (let [actionName, actionFn] of Object.entries(actions)) {
|
|
28
|
+
for (const [actionName, actionFn] of Object.entries(actions)) {
|
|
34
29
|
___WEBPACK_IMPORTED_MODULE_0__.STATE[namespace(actionName)] = {
|
|
35
30
|
key: actionName,
|
|
36
31
|
namespace,
|
|
37
|
-
value: actionFn.bind(null,
|
|
32
|
+
value: actionFn.bind(null, (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace())),
|
|
38
33
|
isAction: true,
|
|
39
34
|
listeners: [],
|
|
40
35
|
};
|
|
@@ -73,11 +68,13 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
73
68
|
/* harmony export */ forEach: () => (/* binding */ forEach),
|
|
74
69
|
/* harmony export */ getParamNames: () => (/* binding */ getParamNames),
|
|
75
70
|
/* harmony export */ isArray: () => (/* binding */ isArray),
|
|
71
|
+
/* harmony export */ isAsyncFunction: () => (/* binding */ isAsyncFunction),
|
|
76
72
|
/* harmony export */ isFunction: () => (/* binding */ isFunction),
|
|
77
73
|
/* harmony export */ isObject: () => (/* binding */ isObject),
|
|
78
74
|
/* harmony export */ isString: () => (/* binding */ isString),
|
|
79
75
|
/* harmony export */ map: () => (/* binding */ map),
|
|
80
|
-
/* harmony export */ recreateStructure: () => (/* binding */ recreateStructure)
|
|
76
|
+
/* harmony export */ recreateStructure: () => (/* binding */ recreateStructure),
|
|
77
|
+
/* harmony export */ uid: () => (/* binding */ uid)
|
|
81
78
|
/* harmony export */ });
|
|
82
79
|
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
|
|
83
80
|
const ARGUMENT_NAMES = /([^\s,]+)/g;
|
|
@@ -90,6 +87,9 @@ function isString(obj) {
|
|
|
90
87
|
function isFunction(obj) {
|
|
91
88
|
return getObjectType(obj) === "[object Function]";
|
|
92
89
|
}
|
|
90
|
+
function isAsyncFunction(obj) {
|
|
91
|
+
return getObjectType(obj) === "[object AsyncFunction]";
|
|
92
|
+
}
|
|
93
93
|
function isObject(obj) {
|
|
94
94
|
return getObjectType(obj) === "[object Object]";
|
|
95
95
|
}
|
|
@@ -135,6 +135,9 @@ function recreateStructure(value) {
|
|
|
135
135
|
}
|
|
136
136
|
return newValue;
|
|
137
137
|
}
|
|
138
|
+
function uid() {
|
|
139
|
+
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
|
140
|
+
}
|
|
138
141
|
|
|
139
142
|
|
|
140
143
|
/***/ },
|
|
@@ -149,10 +152,12 @@ function recreateStructure(value) {
|
|
|
149
152
|
__webpack_require__.r(__webpack_exports__);
|
|
150
153
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
151
154
|
/* harmony export */ STATE: () => (/* binding */ STATE),
|
|
155
|
+
/* harmony export */ createPendingChanges: () => (/* binding */ createPendingChanges),
|
|
152
156
|
/* harmony export */ createStore: () => (/* binding */ createStore),
|
|
153
157
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
|
|
154
158
|
/* harmony export */ getState: () => (/* binding */ getState),
|
|
155
159
|
/* harmony export */ getValues: () => (/* binding */ getValues),
|
|
160
|
+
/* harmony export */ joinStateChanges: () => (/* binding */ joinStateChanges),
|
|
156
161
|
/* harmony export */ resetState: () => (/* binding */ resetState),
|
|
157
162
|
/* harmony export */ setState: () => (/* binding */ setState),
|
|
158
163
|
/* harmony export */ setupValue: () => (/* binding */ setupValue)
|
|
@@ -161,15 +166,15 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
161
166
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
|
|
162
167
|
/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actions */ "./src/actions.ts");
|
|
163
168
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
164
|
-
/* harmony import */ var
|
|
165
|
-
/* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./listeners */ "./src/listeners.ts");
|
|
166
|
-
|
|
169
|
+
/* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./listeners */ "./src/listeners.ts");
|
|
167
170
|
|
|
168
171
|
|
|
169
172
|
|
|
170
173
|
|
|
171
174
|
|
|
172
175
|
const STATE = {};
|
|
176
|
+
const STATE_CHANGED_PIECES = {};
|
|
177
|
+
const STATE_PENDING_CHANGES = {};
|
|
173
178
|
const STORAGE = {};
|
|
174
179
|
setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
175
180
|
async function addState(namespace, initialState, isPersistent) {
|
|
@@ -179,12 +184,8 @@ async function addState(namespace, initialState, isPersistent) {
|
|
|
179
184
|
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
180
185
|
await STORAGE.UPDATE_STATE(values, storageType);
|
|
181
186
|
}
|
|
182
|
-
if (!_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()]) {
|
|
183
|
-
_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()] = [];
|
|
184
|
-
}
|
|
185
187
|
for (const key in initialState) {
|
|
186
188
|
const fullKey = namespace(key);
|
|
187
|
-
_validation__WEBPACK_IMPORTED_MODULE_4__.isValid.Defining(fullKey);
|
|
188
189
|
STATE[fullKey] = setupValue(key, namespace, values[fullKey], defaultValues[key], storageType);
|
|
189
190
|
}
|
|
190
191
|
return createStore(namespace());
|
|
@@ -235,6 +236,26 @@ function getArguments(dependencies, namespace) {
|
|
|
235
236
|
const values = getValues(namespace);
|
|
236
237
|
return dependencies.map((name) => values[name]);
|
|
237
238
|
}
|
|
239
|
+
async function joinStateChanges(changesPiece) {
|
|
240
|
+
for (const [updateId, { storageTypes, readyStorageTypes, changes },] of Object.entries(STATE_CHANGED_PIECES)) {
|
|
241
|
+
if (changesPiece[updateId]) {
|
|
242
|
+
const storageType = changesPiece[updateId].newValue;
|
|
243
|
+
readyStorageTypes[storageType] = true;
|
|
244
|
+
delete changesPiece[updateId];
|
|
245
|
+
Object.assign(changes, changesPiece);
|
|
246
|
+
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
247
|
+
STORAGE.REMOVE_KEY(storageType, updateId);
|
|
248
|
+
}
|
|
249
|
+
for (const key in storageTypes) {
|
|
250
|
+
if (!readyStorageTypes[key]) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
delete STATE_CHANGED_PIECES[updateId];
|
|
255
|
+
await onStateChange(changes);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
238
259
|
async function onStateChange(changes) {
|
|
239
260
|
const realChanges = {};
|
|
240
261
|
for (const key in changes) {
|
|
@@ -249,7 +270,7 @@ async function onStateChange(changes) {
|
|
|
249
270
|
}
|
|
250
271
|
updateDependencies(key, changes, realChanges);
|
|
251
272
|
}
|
|
252
|
-
await (0,
|
|
273
|
+
await (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.runStateChangeListeners)((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(realChanges, (k, v) => !v.isSame));
|
|
253
274
|
}
|
|
254
275
|
function updateDependencies(key, changes, realChanges) {
|
|
255
276
|
STATE[key].dependants?.forEach((name) => {
|
|
@@ -282,6 +303,8 @@ function getState(namespace, arg) {
|
|
|
282
303
|
}
|
|
283
304
|
async function setState(namespace, changes) {
|
|
284
305
|
const storageChanges = {};
|
|
306
|
+
const updateId = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.uid)();
|
|
307
|
+
const storageTypes = {};
|
|
285
308
|
(0,_helpers__WEBPACK_IMPORTED_MODULE_1__.forEach)(changes, (k, v) => {
|
|
286
309
|
const fullKey = namespace(k);
|
|
287
310
|
const { storageType, computeFn, isAction } = STATE[fullKey];
|
|
@@ -291,10 +314,16 @@ async function setState(namespace, changes) {
|
|
|
291
314
|
if (!storageChanges[storageType]) {
|
|
292
315
|
storageChanges[storageType] = {};
|
|
293
316
|
}
|
|
317
|
+
storageTypes[storageType] = true;
|
|
294
318
|
storageChanges[storageType][fullKey] = v;
|
|
295
319
|
});
|
|
320
|
+
STATE_CHANGED_PIECES[updateId] = {
|
|
321
|
+
storageTypes,
|
|
322
|
+
readyStorageTypes: {},
|
|
323
|
+
changes: {},
|
|
324
|
+
};
|
|
296
325
|
for (let [storageType, changes] of Object.entries(storageChanges)) {
|
|
297
|
-
await setValues(storageType, changes);
|
|
326
|
+
await setValues(storageType, { ...changes, [updateId]: storageType });
|
|
298
327
|
}
|
|
299
328
|
return createStore(namespace());
|
|
300
329
|
}
|
|
@@ -305,21 +334,38 @@ async function setValues(storageType, changes) {
|
|
|
305
334
|
return;
|
|
306
335
|
}
|
|
307
336
|
}
|
|
308
|
-
|
|
337
|
+
joinStateChanges((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(changes, (k, newValue) => [k, { newValue }]));
|
|
309
338
|
}
|
|
310
339
|
async function resetState(namespace, keys) {
|
|
340
|
+
await setState(namespace, getDefaultValues(namespace, keys));
|
|
341
|
+
return createStore(namespace());
|
|
342
|
+
}
|
|
343
|
+
function getDefaultValues(namespace, keys) {
|
|
311
344
|
const namespaceState = getNamespaceState(namespace);
|
|
312
|
-
|
|
345
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(keys
|
|
313
346
|
? (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(namespaceState, (k, { key }) => keys.includes(key))
|
|
314
|
-
: namespaceState, (k, { key, defaultValue }) => [key, defaultValue])
|
|
315
|
-
|
|
347
|
+
: namespaceState, (k, { key, defaultValue }) => [key, defaultValue]);
|
|
348
|
+
}
|
|
349
|
+
function createPendingChanges(namespace) {
|
|
350
|
+
const flush = () => {
|
|
351
|
+
const changes = STATE_PENDING_CHANGES[namespace()];
|
|
352
|
+
STATE_PENDING_CHANGES[namespace()] = {};
|
|
353
|
+
return changes;
|
|
354
|
+
};
|
|
355
|
+
return {
|
|
356
|
+
add: (changes) => Object.assign(STATE_PENDING_CHANGES[namespace()], changes),
|
|
357
|
+
reset: (keys) => Object.assign(STATE_PENDING_CHANGES[namespace()], getDefaultValues(namespace, keys)),
|
|
358
|
+
get: () => STATE_PENDING_CHANGES[namespace()],
|
|
359
|
+
flush,
|
|
360
|
+
commit: () => setState(namespace, flush()),
|
|
361
|
+
};
|
|
316
362
|
}
|
|
317
363
|
function main(namespace) {
|
|
318
364
|
if (!arguments[1] || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arguments[1])) {
|
|
319
365
|
return getState.apply(null, arguments);
|
|
320
366
|
}
|
|
321
|
-
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isArray)(arguments[1])) {
|
|
322
|
-
return
|
|
367
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isArray)(arguments[1]) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(arguments[1]) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isAsyncFunction)(arguments[1])) {
|
|
368
|
+
return _listeners__WEBPACK_IMPORTED_MODULE_4__.addStateListener.apply(null, arguments);
|
|
323
369
|
}
|
|
324
370
|
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isObject)(arguments[1])) {
|
|
325
371
|
return setState.apply(null, arguments);
|
|
@@ -333,17 +379,25 @@ function addNamespace(namespace, str) {
|
|
|
333
379
|
}
|
|
334
380
|
function createStore(_namespace) {
|
|
335
381
|
const namespace = ((key) => addNamespace(_namespace, key));
|
|
382
|
+
if (!STATE_PENDING_CHANGES[namespace()]) {
|
|
383
|
+
STATE_PENDING_CHANGES[namespace()] = {};
|
|
384
|
+
}
|
|
385
|
+
if (!_listeners__WEBPACK_IMPORTED_MODULE_4__.LISTENERS[namespace()]) {
|
|
386
|
+
_listeners__WEBPACK_IMPORTED_MODULE_4__.LISTENERS[namespace()] = [];
|
|
387
|
+
}
|
|
336
388
|
return Object.assign(main.bind(null, namespace), {
|
|
337
389
|
add: (state) => addState(namespace, state, false),
|
|
338
390
|
addPersistent: (state) => addState(namespace, state, true),
|
|
339
391
|
get: (newNamespace) => getState(namespace, newNamespace),
|
|
340
392
|
set: async (changes) => await setState(namespace, changes),
|
|
341
393
|
reset: (keys) => resetState(namespace, keys),
|
|
342
|
-
|
|
343
|
-
|
|
394
|
+
changes: createPendingChanges(namespace),
|
|
395
|
+
onChange: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.addStateListener)(namespace, keys, cb),
|
|
396
|
+
removeListener: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.removeStateListener)(namespace, keys, cb),
|
|
344
397
|
actions: (actions) => (0,_actions__WEBPACK_IMPORTED_MODULE_2__.addStateActions)(namespace, actions),
|
|
345
398
|
setStorageUtils,
|
|
346
|
-
|
|
399
|
+
joinStateChanges,
|
|
400
|
+
namespace,
|
|
347
401
|
});
|
|
348
402
|
}
|
|
349
403
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createStore(""));
|
|
@@ -375,24 +429,33 @@ const LISTENERS = {};
|
|
|
375
429
|
async function runStateChangeListeners(realChanges) {
|
|
376
430
|
if (Object.keys(realChanges).length) {
|
|
377
431
|
const { namespace } = ___WEBPACK_IMPORTED_MODULE_0__.STATE[Object.keys(realChanges)[0]];
|
|
378
|
-
const
|
|
379
|
-
for (let [changeKey, change] of Object.entries(realChanges)) {
|
|
432
|
+
for (const [changeKey] of Object.entries(realChanges)) {
|
|
380
433
|
const { listeners, key } = ___WEBPACK_IMPORTED_MODULE_0__.STATE[changeKey];
|
|
381
434
|
for (const cb of listeners) {
|
|
382
|
-
|
|
435
|
+
const fn = cb.bind(null, [key], (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace()));
|
|
436
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(cb)) {
|
|
437
|
+
await fn();
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
fn();
|
|
441
|
+
}
|
|
383
442
|
}
|
|
384
443
|
}
|
|
385
|
-
const
|
|
444
|
+
const namespaceLength = `${namespace()}${_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER}`.length;
|
|
445
|
+
const readableKeys = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(realChanges, (k) => k.slice(namespaceLength));
|
|
386
446
|
for (const cb of LISTENERS[namespace()]) {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
447
|
+
const fn = cb.bind(null, readableKeys, (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace()));
|
|
448
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(cb)) {
|
|
449
|
+
await fn();
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
fn();
|
|
453
|
+
}
|
|
391
454
|
}
|
|
392
455
|
}
|
|
393
456
|
}
|
|
394
457
|
function addStateListener(namespace, observables, cb) {
|
|
395
|
-
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables)) {
|
|
458
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(observables)) {
|
|
396
459
|
LISTENERS[namespace()].push(observables);
|
|
397
460
|
return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
|
|
398
461
|
}
|
|
@@ -400,7 +463,7 @@ function addStateListener(namespace, observables, cb) {
|
|
|
400
463
|
return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
|
|
401
464
|
}
|
|
402
465
|
function removeStateListener(namespace, observables, removeCb) {
|
|
403
|
-
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables)) {
|
|
466
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(observables)) {
|
|
404
467
|
const removeIdx = LISTENERS[namespace()].findIndex((cb) => cb === observables);
|
|
405
468
|
LISTENERS[namespace()].splice(removeIdx, 1);
|
|
406
469
|
return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
|
|
@@ -449,53 +512,20 @@ async function setStorageValue(storageType, changes) {
|
|
|
449
512
|
}
|
|
450
513
|
return false;
|
|
451
514
|
}
|
|
515
|
+
function removeStorageKey(type, key) {
|
|
516
|
+
if (type) {
|
|
517
|
+
localStorage.removeItem(key);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
452
520
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
453
521
|
GET_TYPE: getStorageType,
|
|
454
522
|
IS_AVAILABE: isStorageAvailable,
|
|
455
523
|
UPDATE_STATE: updateFromLocalStorage,
|
|
456
524
|
SET_VALUES: setStorageValue,
|
|
525
|
+
REMOVE_KEY: removeStorageKey,
|
|
457
526
|
});
|
|
458
527
|
|
|
459
528
|
|
|
460
|
-
/***/ },
|
|
461
|
-
|
|
462
|
-
/***/ "./src/validation.ts"
|
|
463
|
-
/*!***************************!*\
|
|
464
|
-
!*** ./src/validation.ts ***!
|
|
465
|
-
\***************************/
|
|
466
|
-
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
467
|
-
|
|
468
|
-
"use strict";
|
|
469
|
-
__webpack_require__.r(__webpack_exports__);
|
|
470
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
471
|
-
/* harmony export */ isValid: () => (/* binding */ isValid)
|
|
472
|
-
/* harmony export */ });
|
|
473
|
-
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
474
|
-
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
function splitFullKey(fullKey) {
|
|
478
|
-
const segments = fullKey.split(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER);
|
|
479
|
-
return [segments.slice(-1)[0], segments.join(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER)];
|
|
480
|
-
}
|
|
481
|
-
const isValid = {
|
|
482
|
-
Setting: (fullKey) => {
|
|
483
|
-
if (!___WEBPACK_IMPORTED_MODULE_0__.STATE[fullKey]) {
|
|
484
|
-
const [key, namespace] = splitFullKey(fullKey);
|
|
485
|
-
throw new Error(`Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`);
|
|
486
|
-
}
|
|
487
|
-
return true;
|
|
488
|
-
},
|
|
489
|
-
Defining: (fullKey) => {
|
|
490
|
-
if (___WEBPACK_IMPORTED_MODULE_0__.STATE[fullKey]) {
|
|
491
|
-
const [key, namespace] = splitFullKey(fullKey);
|
|
492
|
-
throw new Error(`Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`);
|
|
493
|
-
}
|
|
494
|
-
return true;
|
|
495
|
-
},
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
|
|
499
529
|
/***/ },
|
|
500
530
|
|
|
501
531
|
/***/ "./src/webextension-storage.ts"
|
|
@@ -517,6 +547,7 @@ const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyf
|
|
|
517
547
|
IS_AVAILABE: isStorageAvailable,
|
|
518
548
|
UPDATE_STATE: updateStateFromStorage,
|
|
519
549
|
SET_VALUES: setStorageValue,
|
|
550
|
+
REMOVE_KEY: removeStorageKey,
|
|
520
551
|
});
|
|
521
552
|
function getStorageType(isPersistent) {
|
|
522
553
|
return (isBackgroundScript() && isPersistent && "local") || "session";
|
|
@@ -532,6 +563,11 @@ async function setStorageValue(type, changes) {
|
|
|
532
563
|
await browser.storage[type].set(changes);
|
|
533
564
|
return true;
|
|
534
565
|
}
|
|
566
|
+
async function removeStorageKey(type, key) {
|
|
567
|
+
if (type) {
|
|
568
|
+
await browser.storage[type].remove(key);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
535
571
|
function isSessionStorageSupport() {
|
|
536
572
|
return !!browser.storage.session;
|
|
537
573
|
}
|
|
@@ -658,11 +694,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
658
694
|
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
659
695
|
|
|
660
696
|
|
|
661
|
-
const {
|
|
697
|
+
const { joinStateChanges, setStorageUtils } = ___WEBPACK_IMPORTED_MODULE_0__["default"];
|
|
662
698
|
if ((0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isBackgroundScript)()) {
|
|
663
|
-
browser.storage.local.onChanged.addListener(
|
|
699
|
+
browser.storage.local.onChanged.addListener(joinStateChanges);
|
|
664
700
|
(0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isSessionStorageSupport)() &&
|
|
665
|
-
browser.storage.session.onChanged.addListener(
|
|
701
|
+
browser.storage.session.onChanged.addListener(joinStateChanges);
|
|
666
702
|
}
|
|
667
703
|
setStorageUtils(_webextension_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
668
704
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
@@ -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={"./src/actions.ts"(e,r,s){"use strict";s.r(r),s.d(r,{addStateActions:()=>n});var t=s("./src/index.ts");function n(e,r){const s={get:t.getState.bind(null,e),set:t.setState.bind(null,e),reset:t.resetState.bind(null,e)};for(let[n,a]of Object.entries(r))t.STATE[e(n)]={key:n,namespace:e,value:a.bind(null,s),isAction:!0,listeners:[]}}},"./src/constants.ts"(e,r,s){"use strict";s.r(r),s.d(r,{NAMESPACE_DELIMITER:()=>t});const t="::"},"./src/helpers.ts"(e,r,s){"use strict";s.r(r),s.d(r,{filter:()=>u,forEach:()=>A,getParamNames:()=>l,isArray:()=>a,isFunction:()=>o,isObject:()=>g,isString:()=>i,map:()=>c,recreateStructure:()=>d});const t=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,n=/([^\s,]+)/g;function a(e){return"[object Array]"===m(e)}function i(e){return"[object String]"===m(e)}function o(e){return"[object Function]"===m(e)}function g(e){return"[object Object]"===m(e)}function m(e){return Object.prototype.toString.call(e)}function l(e){const r=e.toString().replace(t,"").split("=>")[0],s=r.slice(r.indexOf("(")+1,r.indexOf(")")).match(n);return null===s?[]:s}function c(e,r){const s=Object.entries(e).map(([e,s])=>r(e,s));return 2===s[0]?.length?Object.fromEntries(s):s}function A(e,r){Object.entries(e||{}).forEach(([e,s])=>r(e,s))}function u(e,r){return Object.fromEntries(Object.entries(e||{}).filter(([e,s])=>!0===r(e,s)))}function d(e){let r=e;if(a(e))return r=[],e.forEach(e=>r.push(d(e))),r;if(g(e)){r={};for(let s in e)r[s]=d(e[s]);return r}return r}},"./src/index.ts"(e,r,s){"use strict";s.r(r),s.d(r,{STATE:()=>m,createStore:()=>w,default:()=>v,getState:()=>b,getValues:()=>d,resetState:()=>E,setState:()=>h,setupValue:()=>A});var t=s("./src/storage.ts"),n=s("./src/helpers.ts"),a=s("./src/actions.ts"),i=s("./src/constants.ts"),o=s("./src/validation.ts"),g=s("./src/listeners.ts");const m={},l={};async function c(e,r,s){const t=l.GET_TYPE(s),a=Object.assign({},r),i=(0,n.map)(r,(r,s)=>[e(r),s]);l.IS_AVAILABE(t)&&await l.UPDATE_STATE(i,t),g.LISTENERS[e()]||(g.LISTENERS[e()]=[]);for(const s in r){const r=e(s);o.isValid.Defining(r),m[r]=A(s,e,i[r],a[s],t)}return w(e())}function A(e,r,s,t,a){const i=r(e),o=(0,n.isFunction)(s),g=o?(0,n.getParamNames)(s):[];return g.forEach(e=>{const s=r(e);m[s]||(m[s]={dependants:[],dependencies:[],namespace:r,storageType:a}),m[s].dependants?.push(i)}),{key:e,fullKey:i,value:o?s.apply(null,x(g,r)):s,computeFn:o&&s,dependencies:g,dependants:[],listeners:[],defaultValue:t,storageType:a,namespace:r}}function u(e){return(0,n.filter)(m,(r,{key:s})=>r===e(s))}function d(e){return(0,n.map)(u(e),(e,{key:r,value:s})=>[r,s])}function x(e,r){const s=d(r);return e.map(e=>s[e])}async function f(e){const r={};for(const s in e){const t=m[s].value,n=e[s].newValue;t!==n?(r[s]={newValue:n,prevValue:t},m[s].value=n):r[s]={isSame:!0},p(s,e,r)}await(0,g.runStateChangeListeners)((0,n.filter)(r,(e,r)=>!r.isSame))}function p(e,r,s){m[e].dependants?.forEach(e=>{const{dependencies:t,namespace:n}=m[e];if(!function(e,r,s,t){return e.every(e=>{const n=r(e);return s.includes(n)&&t.includes(n)||!s.includes(n)})}(t,n,Object.keys(r),Object.keys(s))||s[e])return;const a=m[e].value,i=m[e].computeFn?.apply(null,x(t,n));a!==i&&(s[e]={newValue:i,prevValue:a},m[e].value=i,p(e,r,s))})}function b(e,r){return(0,n.isString)(r)?w(r):(0,n.recreateStructure)(d(e))}async function h(e,r){const s={};(0,n.forEach)(r,(r,t)=>{const n=e(r),{storageType:a,computeFn:i,isAction:o}=m[n];i||o||(s[a]||(s[a]={}),s[a][n]=t)});for(let[e,r]of Object.entries(s))await S(e,r);return w(e())}async function S(e,r){if(l.IS_AVAILABE(e)){if(await l.SET_VALUES(e,r))return}f((0,n.map)(r,(e,r)=>[e,{newValue:r}]))}async function E(e,r){const s=u(e);return await h(e,(0,n.map)(r?(0,n.filter)(s,(e,{key:s})=>r.includes(s)):s,(e,{key:r,defaultValue:s})=>[r,s])),w(e())}function y(e){return!arguments[1]||(0,n.isString)(arguments[1])?b.apply(null,arguments):(0,n.isArray)(arguments[1])?g.addStateListener.apply(null,arguments):(0,n.isObject)(arguments[1])?h.apply(null,arguments):void 0}function T(e){Object.assign(l,e)}function w(e){const r=r=>function(e,r){return`${e}${(0,n.isString)(r)&&i.NAMESPACE_DELIMITER||""}${r||""}`}(e,r);return Object.assign(y.bind(null,r),{add:e=>c(r,e,!1),addPersistent:e=>c(r,e,!0),get:e=>b(r,e),set:async e=>await h(r,e),reset:e=>E(r,e),onChange:(e,s)=>(0,g.addStateListener)(r,e,s),removeListener:(e,s)=>(0,g.removeStateListener)(r,e,s),actions:e=>(0,a.addStateActions)(r,e),setStorageUtils:T,onStateChange:f})}T(t.default);const v=w("")},"./src/listeners.ts"(e,r,s){"use strict";s.r(r),s.d(r,{LISTENERS:()=>i,addStateListener:()=>g,removeStateListener:()=>m,runStateChangeListeners:()=>o});var t=s("./src/index.ts"),n=s("./src/constants.ts"),a=s("./src/helpers.ts");const i={};async function o(e){if(Object.keys(e).length){const{namespace:r}=t.STATE[Object.keys(e)[0]],s=(0,t.getValues)(r);for(let[r,n]of Object.entries(e)){const{listeners:e,key:a}=t.STATE[r];for(const r of e)await r([a],s,n)}const o=(0,a.map)(e,e=>e.slice(n.NAMESPACE_DELIMITER.length));for(const t of i[r()])await t(o,s,(0,a.map)(e,(e,r)=>[e.slice(n.NAMESPACE_DELIMITER.length),r]))}}function g(e,r,s){return(0,a.isFunction)(r)?(i[e()].push(r),(0,t.createStore)(e())):(r.forEach(r=>t.STATE[e(r)].listeners?.push(s)),(0,t.createStore)(e()))}function m(e,r,s){if((0,a.isFunction)(r)){const s=i[e()].findIndex(e=>e===r);return i[e()].splice(s,1),(0,t.createStore)(e())}return r.forEach(r=>{const n=t.STATE[e(r)].listeners,a=n?.findIndex(e=>e===s);n?.splice(a,1)}),(0,t.createStore)(e())}},"./src/storage.ts"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>t});const t={GET_TYPE:function(e){return e?"localStorage":""},IS_AVAILABE:function(e){return!!e},UPDATE_STATE:async 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_VALUES:async function(e,r){for(let[e,s]of Object.entries(r))localStorage.setItem(e,s);return!1}}},"./src/validation.ts"(e,r,s){"use strict";s.r(r),s.d(r,{isValid:()=>i});var t=s("./src/index.ts"),n=s("./src/constants.ts");function a(e){const r=e.split(n.NAMESPACE_DELIMITER);return[r.slice(-1)[0],r.join(n.NAMESPACE_DELIMITER)]}const i={Setting:e=>{if(!t.STATE[e]){const[r,s]=a(e);throw new Error(`Setting "${r}" key in "${s}" namespace. DOES NOT EXIST`)}return!0},Defining:e=>{if(t.STATE[e]){const[r,s]=a(e);throw new Error(`Redefining "${r}" key in "${s}" namespace. ALREADY DEFINED`)}return!0}}},"./src/webextension-storage.ts"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>n,isBackgroundScript:()=>i,isSessionStorageSupport:()=>a});const t=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),n={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 t.storage[r].get())},SET_VALUES:async function(e,r){return await t.storage[e].set(r),!0}};function a(){return!!t.storage.session}function i(){return"chrome-extension:"===window.location.protocol||"moz-extension:"===window.location.protocol}},"./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"(e,r){var s,t,n;"undefined"==typeof globalThis?"undefined"==typeof self||self:globalThis,t=[e],void 0===(n="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 t=e=>e&&"object"==typeof e&&"function"==typeof e.then,n=(r,s)=>(...t)=>{e.runtime.lastError?r.reject(new Error(e.runtime.lastError.message)):s.singleCallbackArg||1>=t.length&&!1!==s.singleCallbackArg?r.resolve(t[0]):r.resolve(t)},a=e=>1==e?"argument":"arguments",i=(e,r)=>function(s,...t){if(t.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${t.length}`);if(t.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${t.length}`);return new Promise((a,i)=>{if(r.fallbackToNoCallback)try{s[e](...t,n({resolve:a,reject:i},r))}catch(n){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,n),s[e](...t),r.fallbackToNoCallback=!1,r.noCallback=!0,a()}else r.noCallback?(s[e](...t),a()):s[e](...t,n({resolve:a,reject:i},r))})},o=(e,r,s)=>new Proxy(r,{apply:(r,t,n)=>s.call(t,e,...n)});let g=Function.call.bind(Object.prototype.hasOwnProperty);const m=(e,r={},s={})=>{let t=Object.create(null),n=Object.create(e);return new Proxy(n,{has:(r,s)=>s in e||s in t,get(n,a){if(a in t)return t[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(t,a,{configurable:!0,enumerable:!0,get:()=>e[a],set(r){e[a]=r}}),l;l=m(l,r[a],s["*"])}return t[a]=l,l},set:(r,s,n)=>(s in t?t[s]=n:e[s]=n,!0),defineProperty:(e,r,s)=>Reflect.defineProperty(t,r,s),deleteProperty:(e,r)=>Reflect.deleteProperty(t,r)})},l=e=>({addListener(r,s,...t){r.addListener(e.get(s),...t)},hasListener:(r,s)=>r.hasListener(e.get(s)),removeListener(r,s){r.removeListener(e.get(s))}}),c=new s(e=>"function"==typeof e?function(r){const s=m(r,{},{getContent:{minArgs:0,maxArgs:0}});e(s)}:e),A=new s(e=>"function"==typeof e?function(r,s,n){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&&t(i);if(!0!==i&&!m&&!o)return!1;const l=e=>{e.then(e=>{n(e)},e=>{let r;r=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",n({__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},t)=>{e.runtime.lastError?"The message port closed before a response was received."===e.runtime.lastError.message?s():r(new Error(e.runtime.lastError.message)):t&&t.__mozWebExtensionPolyfillReject__?r(new Error(t.message)):s(t)},d=(e,r,s,...t)=>{if(t.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${t.length}`);if(t.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${t.length}`);return new Promise((e,r)=>{const n=u.bind(null,{resolve:e,reject:r});t.push(n),s.sendMessage(...t)})},x={devtools:{network:{onRequestFinished:l(c)}},runtime:{onMessage:l(A),onMessageExternal:l(A),sendMessage:d.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:d.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},f={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":f},services:{"*":f},websites:{"*":f}},m(e,x,r)})(chrome)})?s.apply(r,t):s)||(e.exports=n)}};const r={};function s(t){const n=r[t];if(void 0!==n)return n.exports;const a=r[t]={exports:{}};if(!(t in e)){delete r[t];const e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return e[t].call(a.exports,a,a.exports,s),a.exports}s.d=(e,r)=>{if(Array.isArray(r))for(var t=0;t<r.length;){var n=r[t++],a=r[t++];s.o(e,n)?0===a&&t++:0===a?Object.defineProperty(e,n,{enumerable:!0,value:r[t++]}):Object.defineProperty(e,n,{enumerable:!0,get:a})}else for(var n in r)s.o(r,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},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 t={};return(()=>{"use strict";s.r(t),s.d(t,{default:()=>o});var e=s("./src/index.ts"),r=s("./src/webextension-storage.ts");const n=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),{onStateChange:a,setStorageUtils:i}=e.default;(0,r.isBackgroundScript)()&&(n.storage.local.onChanged.addListener(a),(0,r.isSessionStorageSupport)()&&n.storage.session.onChanged.addListener(a)),i(r.default);const o=e.default})(),t=t.default,t})());
|
|
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={"./src/actions.ts"(e,r,s){"use strict";s.r(r),s.d(r,{addStateActions:()=>n});var t=s("./src/index.ts");function n(e,r){for(const[s,n]of Object.entries(r))t.STATE[e(s)]={key:s,namespace:e,value:n.bind(null,(0,t.createStore)(e())),isAction:!0,listeners:[]}}},"./src/constants.ts"(e,r,s){"use strict";s.r(r),s.d(r,{NAMESPACE_DELIMITER:()=>t});const t="::"},"./src/helpers.ts"(e,r,s){"use strict";s.r(r),s.d(r,{filter:()=>d,forEach:()=>u,getParamNames:()=>l,isArray:()=>a,isAsyncFunction:()=>g,isFunction:()=>i,isObject:()=>m,isString:()=>o,map:()=>A,recreateStructure:()=>f,uid:()=>x});const t=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,n=/([^\s,]+)/g;function a(e){return"[object Array]"===c(e)}function o(e){return"[object String]"===c(e)}function i(e){return"[object Function]"===c(e)}function g(e){return"[object AsyncFunction]"===c(e)}function m(e){return"[object Object]"===c(e)}function c(e){return Object.prototype.toString.call(e)}function l(e){const r=e.toString().replace(t,"").split("=>")[0],s=r.slice(r.indexOf("(")+1,r.indexOf(")")).match(n);return null===s?[]:s}function A(e,r){const s=Object.entries(e).map(([e,s])=>r(e,s));return 2===s[0]?.length?Object.fromEntries(s):s}function u(e,r){Object.entries(e||{}).forEach(([e,s])=>r(e,s))}function d(e,r){return Object.fromEntries(Object.entries(e||{}).filter(([e,s])=>!0===r(e,s)))}function f(e){let r=e;if(a(e))return r=[],e.forEach(e=>r.push(f(e))),r;if(m(e)){r={};for(let s in e)r[s]=f(e[s]);return r}return r}function x(){return Date.now().toString(36)+Math.random().toString(36).substr(2)}},"./src/index.ts"(e,r,s){"use strict";s.r(r),s.d(r,{STATE:()=>g,createPendingChanges:()=>v,createStore:()=>O,default:()=>C,getState:()=>h,getValues:()=>f,joinStateChanges:()=>p,resetState:()=>w,setState:()=>S,setupValue:()=>u});var t=s("./src/storage.ts"),n=s("./src/helpers.ts"),a=s("./src/actions.ts"),o=s("./src/constants.ts"),i=s("./src/listeners.ts");const g={},m={},c={},l={};async function A(e,r,s){const t=l.GET_TYPE(s),a=Object.assign({},r),o=(0,n.map)(r,(r,s)=>[e(r),s]);l.IS_AVAILABE(t)&&await l.UPDATE_STATE(o,t);for(const s in r){const r=e(s);g[r]=u(s,e,o[r],a[s],t)}return O(e())}function u(e,r,s,t,a){const o=r(e),i=(0,n.isFunction)(s),m=i?(0,n.getParamNames)(s):[];return m.forEach(e=>{const s=r(e);g[s]||(g[s]={dependants:[],dependencies:[],namespace:r,storageType:a}),g[s].dependants?.push(o)}),{key:e,fullKey:o,value:i?s.apply(null,x(m,r)):s,computeFn:i&&s,dependencies:m,dependants:[],listeners:[],defaultValue:t,storageType:a,namespace:r}}function d(e){return(0,n.filter)(g,(r,{key:s})=>r===e(s))}function f(e){return(0,n.map)(d(e),(e,{key:r,value:s})=>[r,s])}function x(e,r){const s=f(r);return e.map(e=>s[e])}async function p(e){for(const[r,{storageTypes:s,readyStorageTypes:t,changes:n}]of Object.entries(m))if(e[r]){const a=e[r].newValue;t[a]=!0,delete e[r],Object.assign(n,e),l.IS_AVAILABE(a)&&l.REMOVE_KEY(a,r);for(const e in s)if(!t[e])return;delete m[r],await b(n)}}async function b(e){const r={};for(const s in e){const t=g[s].value,n=e[s].newValue;t!==n?(r[s]={newValue:n,prevValue:t},g[s].value=n):r[s]={isSame:!0},y(s,e,r)}await(0,i.runStateChangeListeners)((0,n.filter)(r,(e,r)=>!r.isSame))}function y(e,r,s){g[e].dependants?.forEach(e=>{const{dependencies:t,namespace:n}=g[e];if(!function(e,r,s,t){return e.every(e=>{const n=r(e);return s.includes(n)&&t.includes(n)||!s.includes(n)})}(t,n,Object.keys(r),Object.keys(s))||s[e])return;const a=g[e].value,o=g[e].computeFn?.apply(null,x(t,n));a!==o&&(s[e]={newValue:o,prevValue:a},g[e].value=o,y(e,r,s))})}function h(e,r){return(0,n.isString)(r)?O(r):(0,n.recreateStructure)(f(e))}async function S(e,r){const s={},t=(0,n.uid)(),a={};(0,n.forEach)(r,(r,t)=>{const n=e(r),{storageType:o,computeFn:i,isAction:m}=g[n];i||m||(s[o]||(s[o]={}),a[o]=!0,s[o][n]=t)}),m[t]={storageTypes:a,readyStorageTypes:{},changes:{}};for(let[e,r]of Object.entries(s))await E(e,{...r,[t]:e});return O(e())}async function E(e,r){if(l.IS_AVAILABE(e)){if(await l.SET_VALUES(e,r))return}p((0,n.map)(r,(e,r)=>[e,{newValue:r}]))}async function w(e,r){return await S(e,T(e,r)),O(e())}function T(e,r){const s=d(e);return(0,n.map)(r?(0,n.filter)(s,(e,{key:s})=>r.includes(s)):s,(e,{key:r,defaultValue:s})=>[r,s])}function v(e){const r=()=>{const r=c[e()];return c[e()]={},r};return{add:r=>Object.assign(c[e()],r),reset:r=>Object.assign(c[e()],T(e,r)),get:()=>c[e()],flush:r,commit:()=>S(e,r())}}function k(e){return!arguments[1]||(0,n.isString)(arguments[1])?h.apply(null,arguments):(0,n.isArray)(arguments[1])||(0,n.isFunction)(arguments[1])||(0,n.isAsyncFunction)(arguments[1])?i.addStateListener.apply(null,arguments):(0,n.isObject)(arguments[1])?S.apply(null,arguments):void 0}function j(e){Object.assign(l,e)}function O(e){const r=r=>function(e,r){return`${e}${(0,n.isString)(r)&&o.NAMESPACE_DELIMITER||""}${r||""}`}(e,r);return c[r()]||(c[r()]={}),i.LISTENERS[r()]||(i.LISTENERS[r()]=[]),Object.assign(k.bind(null,r),{add:e=>A(r,e,!1),addPersistent:e=>A(r,e,!0),get:e=>h(r,e),set:async e=>await S(r,e),reset:e=>w(r,e),changes:v(r),onChange:(e,s)=>(0,i.addStateListener)(r,e,s),removeListener:(e,s)=>(0,i.removeStateListener)(r,e,s),actions:e=>(0,a.addStateActions)(r,e),setStorageUtils:j,joinStateChanges:p,namespace:r})}j(t.default);const C=O("")},"./src/listeners.ts"(e,r,s){"use strict";s.r(r),s.d(r,{LISTENERS:()=>o,addStateListener:()=>g,removeStateListener:()=>m,runStateChangeListeners:()=>i});var t=s("./src/index.ts"),n=s("./src/constants.ts"),a=s("./src/helpers.ts");const o={};async function i(e){if(Object.keys(e).length){const{namespace:r}=t.STATE[Object.keys(e)[0]];for(const[s]of Object.entries(e)){const{listeners:e,key:n}=t.STATE[s];for(const s of e){const e=s.bind(null,[n],(0,t.createStore)(r()));(0,a.isAsyncFunction)(s)?await e():e()}}const s=`${r()}${n.NAMESPACE_DELIMITER}`.length,i=(0,a.map)(e,e=>e.slice(s));for(const e of o[r()]){const s=e.bind(null,i,(0,t.createStore)(r()));(0,a.isAsyncFunction)(e)?await s():s()}}}function g(e,r,s){return(0,a.isFunction)(r)||(0,a.isAsyncFunction)(r)?(o[e()].push(r),(0,t.createStore)(e())):(r.forEach(r=>t.STATE[e(r)].listeners?.push(s)),(0,t.createStore)(e()))}function m(e,r,s){if((0,a.isFunction)(r)||(0,a.isAsyncFunction)(r)){const s=o[e()].findIndex(e=>e===r);return o[e()].splice(s,1),(0,t.createStore)(e())}return r.forEach(r=>{const n=t.STATE[e(r)].listeners,a=n?.findIndex(e=>e===s);n?.splice(a,1)}),(0,t.createStore)(e())}},"./src/storage.ts"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>t});const t={GET_TYPE:function(e){return e?"localStorage":""},IS_AVAILABE:function(e){return!!e},UPDATE_STATE:async 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_VALUES:async function(e,r){for(let[e,s]of Object.entries(r))localStorage.setItem(e,s);return!1},REMOVE_KEY:function(e,r){e&&localStorage.removeItem(r)}}},"./src/webextension-storage.ts"(e,r,s){"use strict";s.r(r),s.d(r,{default:()=>n,isBackgroundScript:()=>o,isSessionStorageSupport:()=>a});const t=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),n={GET_TYPE:function(e){return o()&&e?"local":"session"},IS_AVAILABE:function(e){return"local"===e||"session"===e&&a()},UPDATE_STATE:async function(e,r){return Object.assign(e,await t.storage[r].get())},SET_VALUES:async function(e,r){return await t.storage[e].set(r),!0},REMOVE_KEY:async function(e,r){e&&await t.storage[e].remove(r)}};function a(){return!!t.storage.session}function o(){return"chrome-extension:"===window.location.protocol||"moz-extension:"===window.location.protocol}},"./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"(e,r){var s,t,n;"undefined"==typeof globalThis?"undefined"==typeof self||self:globalThis,t=[e],void 0===(n="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 t=e=>e&&"object"==typeof e&&"function"==typeof e.then,n=(r,s)=>(...t)=>{e.runtime.lastError?r.reject(new Error(e.runtime.lastError.message)):s.singleCallbackArg||1>=t.length&&!1!==s.singleCallbackArg?r.resolve(t[0]):r.resolve(t)},a=e=>1==e?"argument":"arguments",o=(e,r)=>function(s,...t){if(t.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${t.length}`);if(t.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${t.length}`);return new Promise((a,o)=>{if(r.fallbackToNoCallback)try{s[e](...t,n({resolve:a,reject:o},r))}catch(n){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,n),s[e](...t),r.fallbackToNoCallback=!1,r.noCallback=!0,a()}else r.noCallback?(s[e](...t),a()):s[e](...t,n({resolve:a,reject:o},r))})},i=(e,r,s)=>new Proxy(r,{apply:(r,t,n)=>s.call(t,e,...n)});let g=Function.call.bind(Object.prototype.hasOwnProperty);const m=(e,r={},s={})=>{let t=Object.create(null),n=Object.create(e);return new Proxy(n,{has:(r,s)=>s in e||s in t,get(n,a){if(a in t)return t[a];if(!(a in e))return;let c=e[a];if("function"==typeof c)if("function"==typeof r[a])c=i(e,e[a],r[a]);else if(g(s,a)){let r=o(a,s[a]);c=i(e,e[a],r)}else c=c.bind(e);else if("object"==typeof c&&null!==c&&(g(r,a)||g(s,a)))c=m(c,r[a],s[a]);else{if(!g(s,"*"))return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:()=>e[a],set(r){e[a]=r}}),c;c=m(c,r[a],s["*"])}return t[a]=c,c},set:(r,s,n)=>(s in t?t[s]=n:e[s]=n,!0),defineProperty:(e,r,s)=>Reflect.defineProperty(t,r,s),deleteProperty:(e,r)=>Reflect.deleteProperty(t,r)})},c=e=>({addListener(r,s,...t){r.addListener(e.get(s),...t)},hasListener:(r,s)=>r.hasListener(e.get(s)),removeListener(r,s){r.removeListener(e.get(s))}}),l=new s(e=>"function"==typeof e?function(r){const s=m(r,{},{getContent:{minArgs:0,maxArgs:0}});e(s)}:e),A=new s(e=>"function"==typeof e?function(r,s,n){let a,o,i=!1,g=new Promise(e=>{a=function(r){i=!0,e(r)}});try{o=e(r,s,a)}catch(e){o=Promise.reject(e)}const m=!0!==o&&t(o);if(!0!==o&&!m&&!i)return!1;const c=e=>{e.then(e=>{n(e)},e=>{let r;r=e&&(e instanceof Error||"string"==typeof e.message)?e.message:"An unexpected error occurred",n({__mozWebExtensionPolyfillReject__:!0,message:r})}).catch(e=>{console.error("Failed to send onMessage rejected reply",e)})};return c(m?o:g),!0}:e),u=({reject:r,resolve:s},t)=>{e.runtime.lastError?"The message port closed before a response was received."===e.runtime.lastError.message?s():r(new Error(e.runtime.lastError.message)):t&&t.__mozWebExtensionPolyfillReject__?r(new Error(t.message)):s(t)},d=(e,r,s,...t)=>{if(t.length<r.minArgs)throw new Error(`Expected at least ${r.minArgs} ${a(r.minArgs)} for ${e}(), got ${t.length}`);if(t.length>r.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${a(r.maxArgs)} for ${e}(), got ${t.length}`);return new Promise((e,r)=>{const n=u.bind(null,{resolve:e,reject:r});t.push(n),s.sendMessage(...t)})},f={devtools:{network:{onRequestFinished:c(l)}},runtime:{onMessage:c(A),onMessageExternal:c(A),sendMessage:d.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:d.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},x={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return r.privacy={network:{"*":x},services:{"*":x},websites:{"*":x}},m(e,f,r)})(chrome)})?s.apply(r,t):s)||(e.exports=n)}};const r={};function s(t){const n=r[t];if(void 0!==n)return n.exports;const a=r[t]={exports:{}};if(!(t in e)){delete r[t];const e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return e[t].call(a.exports,a,a.exports,s),a.exports}s.d=(e,r)=>{if(Array.isArray(r))for(var t=0;t<r.length;){var n=r[t++],a=r[t++];s.o(e,n)?0===a&&t++:0===a?Object.defineProperty(e,n,{enumerable:!0,value:r[t++]}):Object.defineProperty(e,n,{enumerable:!0,get:a})}else for(var n in r)s.o(r,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},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 t={};return(()=>{"use strict";s.r(t),s.d(t,{default:()=>i});var e=s("./src/index.ts"),r=s("./src/webextension-storage.ts");const n=s("./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"),{joinStateChanges:a,setStorageUtils:o}=e.default;(0,r.isBackgroundScript)()&&(n.storage.local.onChanged.addListener(a),(0,r.isSessionStorageSupport)()&&n.storage.session.onChanged.addListener(a)),o(r.default);const i=e.default})(),t=t.default,t})());
|