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 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
- **Important: ```add``` and ```addPersistent``` are asynchronous operations; you must `await` or use ```Promise.then``` to ensure all the data is ready to work with!**
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
- **Important: values are updated asynchronously; don't assume the script will recognize the change immediately on the next line. Instead, ```await``` or make use of ```onChange``` listeners!**
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 [], allValues {}, PreviousValues {}) => void
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
- ```ChangeCallback``` - function to run when a change happens
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 [], allValues {}, PreviousValues {}) => void
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 ```IStateAction```s.
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: IStateAction1 (Varstor, ...arguments[]) => void
142
- key2: IStateAction2 (Varstor, ...arguments[]) => void
160
+ key1: StateAction1 (Varstor, ...arguments[]) => void
161
+ key2: StateAction2 (Varstor, ...arguments[]) => void
143
162
  ...
144
163
  }
145
164
  })
146
165
  ```
147
- ```IStateAction``` function type binds ```Varstor``` instance as the first argument, followed by all other ```arguments``` provided by the user at the time of the call.
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()```, ```onChange```, and ```removeListener``` all return a new instance of ```Varstor``` with the same namespace, so method chaining is possible.
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, values, data) {
183
- console.log("onChange", changes, values, data);
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 stateAcessor = {
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, stateAcessor),
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 _validation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./validation */ "./src/validation.ts");
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,_listeners__WEBPACK_IMPORTED_MODULE_5__.runStateChangeListeners)((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(realChanges, (k, v) => !v.isSame));
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
- onStateChange((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(changes, (k, newValue) => [k, { newValue }]));
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
- await setState(namespace, (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(keys
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
- return createStore(namespace());
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 _listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener.apply(null, arguments);
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
- onChange: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener)(namespace, keys, cb),
343
- removeListener: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.removeStateListener)(namespace, keys, cb),
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
- onStateChange,
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 stateValues = (0,___WEBPACK_IMPORTED_MODULE_0__.getValues)(namespace);
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
- await cb([key], stateValues, change);
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 readableKeys = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(realChanges, (k) => k.slice(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER.length));
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
- await cb(readableKeys, stateValues, (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(realChanges, (k, v) => [
388
- k.slice(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER.length),
389
- v,
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 { onStateChange, setStorageUtils } = ___WEBPACK_IMPORTED_MODULE_0__["default"];
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(onStateChange);
699
+ browser.storage.local.onChanged.addListener(joinStateChanges);
664
700
  (0,_webextension_storage__WEBPACK_IMPORTED_MODULE_1__.isSessionStorageSupport)() &&
665
- browser.storage.session.onChanged.addListener(onStateChange);
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})());