varstor 0.6.65 → 0.6.66
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 +2 -2
- package/dist/varstor-webextension.js +93 -54
- package/dist/varstor-webextension.min.js +1 -1
- package/dist/varstor.js +96 -55
- package/dist/varstor.min.js +1 -1
- package/package.json +3 -1
- package/src/actions.ts +4 -0
- package/src/helpers.ts +1 -1
- package/src/index.ts +32 -16
- package/src/listeners.ts +17 -12
- package/src/storage.ts +3 -1
- package/src/types.d.ts +37 -11
- package/src/webextension-storage.ts +2 -0
- package/webpack.config.js +6 -2
package/README.md
CHANGED
|
@@ -161,7 +161,7 @@ Varstor.actions({
|
|
|
161
161
|
key2: StateAction2 (Varstor, ...arguments[]) => void
|
|
162
162
|
...
|
|
163
163
|
}
|
|
164
|
-
})
|
|
164
|
+
}) => Varstor
|
|
165
165
|
```
|
|
166
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.
|
|
167
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.
|
|
@@ -184,7 +184,7 @@ which will return a new instance of ```Varstor``` with the specified ```Namespac
|
|
|
184
184
|
|
|
185
185
|
|
|
186
186
|
## Method chaining <a name="chaining"></a>
|
|
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.
|
|
187
|
+
Methods ```.add```, ```.addPersistent```, ```.set()```, ```.reset()```, ```.actions()``` , ```.onChange()```, and ```.removeListener()``` all return a new instance of ```Varstor``` with the same namespace, so method chaining is possible.
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
## Shortcuts <a name="shortcuts"></a>
|
|
@@ -11,6 +11,16 @@
|
|
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
|
12
12
|
/******/ var __webpack_modules__ = ({
|
|
13
13
|
|
|
14
|
+
/***/ "./src/types.d.ts"
|
|
15
|
+
/*!************************!*\
|
|
16
|
+
!*** ./src/types.d.ts ***!
|
|
17
|
+
\************************/
|
|
18
|
+
() {
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/***/ },
|
|
23
|
+
|
|
14
24
|
/***/ "./src/actions.ts"
|
|
15
25
|
/*!************************!*\
|
|
16
26
|
!*** ./src/actions.ts ***!
|
|
@@ -22,18 +32,22 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
22
32
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
23
33
|
/* harmony export */ addStateActions: () => (/* binding */ addStateActions)
|
|
24
34
|
/* harmony export */ });
|
|
25
|
-
/* harmony import */ var
|
|
35
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
36
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
37
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
38
|
+
|
|
26
39
|
|
|
27
40
|
function addStateActions(namespace, actions) {
|
|
28
41
|
for (const [actionName, actionFn] of Object.entries(actions)) {
|
|
29
|
-
|
|
42
|
+
___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(actionName)] = {
|
|
30
43
|
key: actionName,
|
|
31
44
|
namespace,
|
|
32
|
-
value: actionFn.bind(null, (0,
|
|
45
|
+
value: actionFn.bind(null, (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace())),
|
|
33
46
|
isAction: true,
|
|
34
47
|
listeners: [],
|
|
35
48
|
};
|
|
36
49
|
}
|
|
50
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
37
51
|
}
|
|
38
52
|
|
|
39
53
|
|
|
@@ -162,11 +176,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
162
176
|
/* harmony export */ setState: () => (/* binding */ setState),
|
|
163
177
|
/* harmony export */ setupValue: () => (/* binding */ setupValue)
|
|
164
178
|
/* harmony export */ });
|
|
165
|
-
/* harmony import */ var
|
|
166
|
-
/* harmony import */ var
|
|
167
|
-
/* harmony import */ var
|
|
168
|
-
/* harmony import */ var
|
|
169
|
-
/* harmony import */ var
|
|
179
|
+
/* harmony import */ var _types_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types.d */ "./src/types.d.ts");
|
|
180
|
+
/* harmony import */ var _types_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_d__WEBPACK_IMPORTED_MODULE_0__);
|
|
181
|
+
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./storage */ "./src/storage.ts");
|
|
182
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
|
|
183
|
+
/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actions */ "./src/actions.ts");
|
|
184
|
+
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
185
|
+
/* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./listeners */ "./src/listeners.ts");
|
|
186
|
+
|
|
170
187
|
|
|
171
188
|
|
|
172
189
|
|
|
@@ -176,11 +193,11 @@ const STATE = {};
|
|
|
176
193
|
const STATE_CHANGED_PIECES = {};
|
|
177
194
|
const STATE_PENDING_CHANGES = {};
|
|
178
195
|
const STORAGE = {};
|
|
179
|
-
setStorageUtils(
|
|
196
|
+
setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
180
197
|
async function addState(namespace, initialState, isPersistent) {
|
|
181
198
|
const storageType = STORAGE.GET_TYPE(isPersistent);
|
|
182
199
|
const defaultValues = Object.assign({}, initialState);
|
|
183
|
-
const values = (0,
|
|
200
|
+
const values = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(initialState, (k, v) => [namespace(k), v]);
|
|
184
201
|
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
185
202
|
await STORAGE.UPDATE_STATE(values, storageType);
|
|
186
203
|
}
|
|
@@ -192,9 +209,9 @@ async function addState(namespace, initialState, isPersistent) {
|
|
|
192
209
|
}
|
|
193
210
|
function setupValue(key, namespace, value, defaultValue, storageType) {
|
|
194
211
|
const fullKey = namespace(key);
|
|
195
|
-
const isComputedValue = (0,
|
|
212
|
+
const isComputedValue = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(value);
|
|
196
213
|
const dependencies = isComputedValue
|
|
197
|
-
? (0,
|
|
214
|
+
? (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getParamNames)(value)
|
|
198
215
|
: [];
|
|
199
216
|
dependencies.forEach((dependency) => {
|
|
200
217
|
const fullDependencyKey = namespace(dependency);
|
|
@@ -224,10 +241,10 @@ function setupValue(key, namespace, value, defaultValue, storageType) {
|
|
|
224
241
|
};
|
|
225
242
|
}
|
|
226
243
|
function getNamespaceState(namespace) {
|
|
227
|
-
return (0,
|
|
244
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(STATE, (k, { key }) => k === namespace(key));
|
|
228
245
|
}
|
|
229
246
|
function getValues(namespace) {
|
|
230
|
-
return (0,
|
|
247
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(getNamespaceState(namespace), (k, { key, value }) => [
|
|
231
248
|
key,
|
|
232
249
|
value,
|
|
233
250
|
]);
|
|
@@ -270,7 +287,7 @@ async function onStateChange(changes) {
|
|
|
270
287
|
}
|
|
271
288
|
updateDependencies(key, changes, realChanges);
|
|
272
289
|
}
|
|
273
|
-
await (0,
|
|
290
|
+
await (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.runStateChangeListeners)((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(realChanges, (k, v) => !v.isSame));
|
|
274
291
|
}
|
|
275
292
|
function updateDependencies(key, changes, realChanges) {
|
|
276
293
|
STATE[key].dependants?.forEach((name) => {
|
|
@@ -296,16 +313,16 @@ function isEveryDependencyReady(dependencies, namespace, changesKeys, realChange
|
|
|
296
313
|
});
|
|
297
314
|
}
|
|
298
315
|
function getState(namespace, arg) {
|
|
299
|
-
if ((0,
|
|
316
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(arg)) {
|
|
300
317
|
return createStore(arg);
|
|
301
318
|
}
|
|
302
|
-
return (0,
|
|
319
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.recreateStructure)(getValues(namespace));
|
|
303
320
|
}
|
|
304
321
|
async function setState(namespace, changes) {
|
|
305
322
|
const storageChanges = {};
|
|
306
|
-
const updateId = (0,
|
|
323
|
+
const updateId = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.uid)();
|
|
307
324
|
const storageTypes = {};
|
|
308
|
-
(0,
|
|
325
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.forEach)(changes, (k, v) => {
|
|
309
326
|
const fullKey = namespace(k);
|
|
310
327
|
const { storageType, computeFn, isAction } = STATE[fullKey];
|
|
311
328
|
if (computeFn || isAction) {
|
|
@@ -334,16 +351,15 @@ async function setValues(storageType, changes) {
|
|
|
334
351
|
return;
|
|
335
352
|
}
|
|
336
353
|
}
|
|
337
|
-
joinStateChanges((0,
|
|
354
|
+
joinStateChanges((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(changes, (k, newValue) => [k, { newValue }]));
|
|
338
355
|
}
|
|
339
356
|
async function resetState(namespace, keys) {
|
|
340
|
-
|
|
341
|
-
return createStore(namespace());
|
|
357
|
+
return setState(namespace, getDefaultValues(namespace, keys));
|
|
342
358
|
}
|
|
343
359
|
function getDefaultValues(namespace, keys) {
|
|
344
360
|
const namespaceState = getNamespaceState(namespace);
|
|
345
|
-
return (0,
|
|
346
|
-
? (0,
|
|
361
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(keys
|
|
362
|
+
? (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(namespaceState, (k, { key }) => keys.includes(key))
|
|
347
363
|
: namespaceState, (k, { key, defaultValue }) => [key, defaultValue]);
|
|
348
364
|
}
|
|
349
365
|
function createPendingChanges(namespace) {
|
|
@@ -361,13 +377,15 @@ function createPendingChanges(namespace) {
|
|
|
361
377
|
};
|
|
362
378
|
}
|
|
363
379
|
function main(namespace) {
|
|
364
|
-
if (!arguments[1] || (0,
|
|
380
|
+
if (!arguments[1] || (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(arguments[1])) {
|
|
365
381
|
return getState.apply(null, arguments);
|
|
366
382
|
}
|
|
367
|
-
if ((0,
|
|
368
|
-
|
|
383
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isArray)(arguments[1]) ||
|
|
384
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(arguments[1]) ||
|
|
385
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(arguments[1])) {
|
|
386
|
+
return _listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener.apply(null, arguments);
|
|
369
387
|
}
|
|
370
|
-
if ((0,
|
|
388
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isObject)(arguments[1])) {
|
|
371
389
|
return setState.apply(null, arguments);
|
|
372
390
|
}
|
|
373
391
|
}
|
|
@@ -375,26 +393,26 @@ function setStorageUtils(storageUtils) {
|
|
|
375
393
|
Object.assign(STORAGE, storageUtils);
|
|
376
394
|
}
|
|
377
395
|
function addNamespace(namespace, str) {
|
|
378
|
-
return `${namespace}${((0,
|
|
396
|
+
return `${namespace}${((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(str) && _constants__WEBPACK_IMPORTED_MODULE_4__.NAMESPACE_DELIMITER) || ""}${str || ""}`;
|
|
379
397
|
}
|
|
380
398
|
function createStore(_namespace) {
|
|
381
399
|
const namespace = ((key) => addNamespace(_namespace, key));
|
|
382
400
|
if (!STATE_PENDING_CHANGES[namespace()]) {
|
|
383
401
|
STATE_PENDING_CHANGES[namespace()] = {};
|
|
384
402
|
}
|
|
385
|
-
if (!
|
|
386
|
-
|
|
403
|
+
if (!_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()]) {
|
|
404
|
+
_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()] = [];
|
|
387
405
|
}
|
|
388
406
|
return Object.assign(main.bind(null, namespace), {
|
|
389
407
|
add: (state) => addState(namespace, state, false),
|
|
390
408
|
addPersistent: (state) => addState(namespace, state, true),
|
|
391
409
|
get: (newNamespace) => getState(namespace, newNamespace),
|
|
392
|
-
set:
|
|
410
|
+
set: (changes) => setState(namespace, changes),
|
|
393
411
|
reset: (keys) => resetState(namespace, keys),
|
|
394
412
|
changes: createPendingChanges(namespace),
|
|
395
|
-
onChange: (keys, cb) => (0,
|
|
396
|
-
removeListener: (keys, cb) => (0,
|
|
397
|
-
actions: (actions) => (0,
|
|
413
|
+
onChange: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener)(namespace, keys, cb),
|
|
414
|
+
removeListener: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.removeStateListener)(namespace, keys, cb),
|
|
415
|
+
actions: (actions) => (0,_actions__WEBPACK_IMPORTED_MODULE_3__.addStateActions)(namespace, actions),
|
|
398
416
|
setStorageUtils,
|
|
399
417
|
joinStateChanges,
|
|
400
418
|
namespace,
|
|
@@ -419,21 +437,24 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
419
437
|
/* harmony export */ removeStateListener: () => (/* binding */ removeStateListener),
|
|
420
438
|
/* harmony export */ runStateChangeListeners: () => (/* binding */ runStateChangeListeners)
|
|
421
439
|
/* harmony export */ });
|
|
422
|
-
/* harmony import */ var
|
|
423
|
-
/* harmony import */ var
|
|
424
|
-
/* harmony import */ var
|
|
440
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
441
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
442
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
443
|
+
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
444
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
|
|
445
|
+
|
|
425
446
|
|
|
426
447
|
|
|
427
448
|
|
|
428
449
|
const LISTENERS = {};
|
|
429
450
|
async function runStateChangeListeners(realChanges) {
|
|
430
451
|
if (Object.keys(realChanges).length) {
|
|
431
|
-
const { namespace } =
|
|
452
|
+
const { namespace } = ___WEBPACK_IMPORTED_MODULE_1__.STATE[Object.keys(realChanges)[0]];
|
|
432
453
|
for (const [changeKey] of Object.entries(realChanges)) {
|
|
433
|
-
const { listeners, key } =
|
|
454
|
+
const { listeners, key } = ___WEBPACK_IMPORTED_MODULE_1__.STATE[changeKey];
|
|
434
455
|
for (const cb of listeners) {
|
|
435
|
-
const fn = cb.bind(null, [key], (0,
|
|
436
|
-
if ((0,
|
|
456
|
+
const fn = cb.bind(null, [key], (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace()));
|
|
457
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(cb)) {
|
|
437
458
|
await fn();
|
|
438
459
|
}
|
|
439
460
|
else {
|
|
@@ -441,11 +462,11 @@ async function runStateChangeListeners(realChanges) {
|
|
|
441
462
|
}
|
|
442
463
|
}
|
|
443
464
|
}
|
|
444
|
-
const namespaceLength = `${namespace()}${
|
|
445
|
-
const readableKeys = (0,
|
|
465
|
+
const namespaceLength = `${namespace()}${_constants__WEBPACK_IMPORTED_MODULE_2__.NAMESPACE_DELIMITER}`.length;
|
|
466
|
+
const readableKeys = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.map)(realChanges, (k) => k.slice(namespaceLength));
|
|
446
467
|
for (const cb of LISTENERS[namespace()]) {
|
|
447
|
-
const fn = cb.bind(null, readableKeys, (0,
|
|
448
|
-
if ((0,
|
|
468
|
+
const fn = cb.bind(null, readableKeys, (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace()));
|
|
469
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(cb)) {
|
|
449
470
|
await fn();
|
|
450
471
|
}
|
|
451
472
|
else {
|
|
@@ -455,25 +476,25 @@ async function runStateChangeListeners(realChanges) {
|
|
|
455
476
|
}
|
|
456
477
|
}
|
|
457
478
|
function addStateListener(namespace, observables, cb) {
|
|
458
|
-
if ((0,
|
|
479
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(observables)) {
|
|
459
480
|
LISTENERS[namespace()].push(observables);
|
|
460
|
-
return (0,
|
|
481
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
461
482
|
}
|
|
462
|
-
observables.forEach((key) =>
|
|
463
|
-
return (0,
|
|
483
|
+
observables.forEach((key) => ___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(key)].listeners?.push(cb));
|
|
484
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
464
485
|
}
|
|
465
486
|
function removeStateListener(namespace, observables, removeCb) {
|
|
466
|
-
if ((0,
|
|
487
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(observables)) {
|
|
467
488
|
const removeIdx = LISTENERS[namespace()].findIndex((cb) => cb === observables);
|
|
468
489
|
LISTENERS[namespace()].splice(removeIdx, 1);
|
|
469
|
-
return (0,
|
|
490
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
470
491
|
}
|
|
471
492
|
observables.forEach((key) => {
|
|
472
|
-
const listeners =
|
|
493
|
+
const listeners = ___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(key)].listeners;
|
|
473
494
|
const removeIdx = listeners?.findIndex((cb) => cb === removeCb);
|
|
474
495
|
listeners?.splice(removeIdx, 1);
|
|
475
496
|
});
|
|
476
|
-
return (0,
|
|
497
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
477
498
|
}
|
|
478
499
|
|
|
479
500
|
|
|
@@ -490,6 +511,9 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
490
511
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
491
512
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
492
513
|
/* harmony export */ });
|
|
514
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
515
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
516
|
+
|
|
493
517
|
async function updateFromLocalStorage(state) {
|
|
494
518
|
const stored = {};
|
|
495
519
|
for (const key in state) {
|
|
@@ -541,7 +565,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
541
565
|
/* harmony export */ isBackgroundScript: () => (/* binding */ isBackgroundScript),
|
|
542
566
|
/* harmony export */ isSessionStorageSupport: () => (/* binding */ isSessionStorageSupport)
|
|
543
567
|
/* harmony export */ });
|
|
568
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
569
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
544
570
|
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
571
|
+
|
|
545
572
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
546
573
|
GET_TYPE: getStorageType,
|
|
547
574
|
IS_AVAILABE: isStorageAvailable,
|
|
@@ -634,6 +661,18 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
|
|
|
634
661
|
/******/ }
|
|
635
662
|
/******/
|
|
636
663
|
/************************************************************************/
|
|
664
|
+
/******/ /* webpack/runtime/compat get default export */
|
|
665
|
+
/******/ (() => {
|
|
666
|
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
667
|
+
/******/ __webpack_require__.n = (module) => {
|
|
668
|
+
/******/ const getter = module && module.__esModule ?
|
|
669
|
+
/******/ () => (module['default']) :
|
|
670
|
+
/******/ () => (module);
|
|
671
|
+
/******/ __webpack_require__.d(getter, { a: getter });
|
|
672
|
+
/******/ return getter;
|
|
673
|
+
/******/ };
|
|
674
|
+
/******/ })();
|
|
675
|
+
/******/
|
|
637
676
|
/******/ /* webpack/runtime/define property getters */
|
|
638
677
|
/******/ (() => {
|
|
639
678
|
/******/ // define getter/value functions for harmony exports
|
|
@@ -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){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})());
|
|
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/types.d.ts"(){},"./src/actions.ts"(e,r,s){"use strict";s.r(r),s.d(r,{addStateActions:()=>n});s("./src/types.d.ts");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:[]};return(0,t.createStore)(e())}},"./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});s("./src/types.d.ts");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 S(e,T(e,r))}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:e=>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});s("./src/types.d.ts");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});s("./src/types.d.ts");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});s("./src/types.d.ts");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.n=e=>{const r=e&&e.__esModule?()=>e.default:()=>e;return s.d(r,{a:r}),r},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})());
|
package/dist/varstor.js
CHANGED
|
@@ -9,31 +9,45 @@
|
|
|
9
9
|
root["Varstor"] = factory();
|
|
10
10
|
})(this, () => {
|
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
|
12
|
-
/******/ "use strict";
|
|
13
12
|
/******/ var __webpack_modules__ = ({
|
|
14
13
|
|
|
14
|
+
/***/ "./src/types.d.ts"
|
|
15
|
+
/*!************************!*\
|
|
16
|
+
!*** ./src/types.d.ts ***!
|
|
17
|
+
\************************/
|
|
18
|
+
() {
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/***/ },
|
|
23
|
+
|
|
15
24
|
/***/ "./src/actions.ts"
|
|
16
25
|
/*!************************!*\
|
|
17
26
|
!*** ./src/actions.ts ***!
|
|
18
27
|
\************************/
|
|
19
28
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
20
29
|
|
|
30
|
+
"use strict";
|
|
21
31
|
__webpack_require__.r(__webpack_exports__);
|
|
22
32
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
23
33
|
/* harmony export */ addStateActions: () => (/* binding */ addStateActions)
|
|
24
34
|
/* harmony export */ });
|
|
25
|
-
/* harmony import */ var
|
|
35
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
36
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
37
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
38
|
+
|
|
26
39
|
|
|
27
40
|
function addStateActions(namespace, actions) {
|
|
28
41
|
for (const [actionName, actionFn] of Object.entries(actions)) {
|
|
29
|
-
|
|
42
|
+
___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(actionName)] = {
|
|
30
43
|
key: actionName,
|
|
31
44
|
namespace,
|
|
32
|
-
value: actionFn.bind(null, (0,
|
|
45
|
+
value: actionFn.bind(null, (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace())),
|
|
33
46
|
isAction: true,
|
|
34
47
|
listeners: [],
|
|
35
48
|
};
|
|
36
49
|
}
|
|
50
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
37
51
|
}
|
|
38
52
|
|
|
39
53
|
|
|
@@ -45,6 +59,7 @@ function addStateActions(namespace, actions) {
|
|
|
45
59
|
\**************************/
|
|
46
60
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
47
61
|
|
|
62
|
+
"use strict";
|
|
48
63
|
__webpack_require__.r(__webpack_exports__);
|
|
49
64
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
50
65
|
/* harmony export */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER)
|
|
@@ -60,6 +75,7 @@ const NAMESPACE_DELIMITER = "::";
|
|
|
60
75
|
\************************/
|
|
61
76
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
62
77
|
|
|
78
|
+
"use strict";
|
|
63
79
|
__webpack_require__.r(__webpack_exports__);
|
|
64
80
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
65
81
|
/* harmony export */ filter: () => (/* binding */ filter),
|
|
@@ -146,6 +162,7 @@ function uid() {
|
|
|
146
162
|
\**********************/
|
|
147
163
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
148
164
|
|
|
165
|
+
"use strict";
|
|
149
166
|
__webpack_require__.r(__webpack_exports__);
|
|
150
167
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
151
168
|
/* harmony export */ STATE: () => (/* binding */ STATE),
|
|
@@ -159,11 +176,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
159
176
|
/* harmony export */ setState: () => (/* binding */ setState),
|
|
160
177
|
/* harmony export */ setupValue: () => (/* binding */ setupValue)
|
|
161
178
|
/* harmony export */ });
|
|
162
|
-
/* harmony import */ var
|
|
163
|
-
/* harmony import */ var
|
|
164
|
-
/* harmony import */ var
|
|
165
|
-
/* harmony import */ var
|
|
166
|
-
/* harmony import */ var
|
|
179
|
+
/* harmony import */ var _types_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types.d */ "./src/types.d.ts");
|
|
180
|
+
/* harmony import */ var _types_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_d__WEBPACK_IMPORTED_MODULE_0__);
|
|
181
|
+
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./storage */ "./src/storage.ts");
|
|
182
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
|
|
183
|
+
/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./actions */ "./src/actions.ts");
|
|
184
|
+
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
185
|
+
/* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./listeners */ "./src/listeners.ts");
|
|
186
|
+
|
|
167
187
|
|
|
168
188
|
|
|
169
189
|
|
|
@@ -173,11 +193,11 @@ const STATE = {};
|
|
|
173
193
|
const STATE_CHANGED_PIECES = {};
|
|
174
194
|
const STATE_PENDING_CHANGES = {};
|
|
175
195
|
const STORAGE = {};
|
|
176
|
-
setStorageUtils(
|
|
196
|
+
setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_1__["default"]);
|
|
177
197
|
async function addState(namespace, initialState, isPersistent) {
|
|
178
198
|
const storageType = STORAGE.GET_TYPE(isPersistent);
|
|
179
199
|
const defaultValues = Object.assign({}, initialState);
|
|
180
|
-
const values = (0,
|
|
200
|
+
const values = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(initialState, (k, v) => [namespace(k), v]);
|
|
181
201
|
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
182
202
|
await STORAGE.UPDATE_STATE(values, storageType);
|
|
183
203
|
}
|
|
@@ -189,9 +209,9 @@ async function addState(namespace, initialState, isPersistent) {
|
|
|
189
209
|
}
|
|
190
210
|
function setupValue(key, namespace, value, defaultValue, storageType) {
|
|
191
211
|
const fullKey = namespace(key);
|
|
192
|
-
const isComputedValue = (0,
|
|
212
|
+
const isComputedValue = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(value);
|
|
193
213
|
const dependencies = isComputedValue
|
|
194
|
-
? (0,
|
|
214
|
+
? (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.getParamNames)(value)
|
|
195
215
|
: [];
|
|
196
216
|
dependencies.forEach((dependency) => {
|
|
197
217
|
const fullDependencyKey = namespace(dependency);
|
|
@@ -221,10 +241,10 @@ function setupValue(key, namespace, value, defaultValue, storageType) {
|
|
|
221
241
|
};
|
|
222
242
|
}
|
|
223
243
|
function getNamespaceState(namespace) {
|
|
224
|
-
return (0,
|
|
244
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(STATE, (k, { key }) => k === namespace(key));
|
|
225
245
|
}
|
|
226
246
|
function getValues(namespace) {
|
|
227
|
-
return (0,
|
|
247
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(getNamespaceState(namespace), (k, { key, value }) => [
|
|
228
248
|
key,
|
|
229
249
|
value,
|
|
230
250
|
]);
|
|
@@ -267,7 +287,7 @@ async function onStateChange(changes) {
|
|
|
267
287
|
}
|
|
268
288
|
updateDependencies(key, changes, realChanges);
|
|
269
289
|
}
|
|
270
|
-
await (0,
|
|
290
|
+
await (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.runStateChangeListeners)((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(realChanges, (k, v) => !v.isSame));
|
|
271
291
|
}
|
|
272
292
|
function updateDependencies(key, changes, realChanges) {
|
|
273
293
|
STATE[key].dependants?.forEach((name) => {
|
|
@@ -293,16 +313,16 @@ function isEveryDependencyReady(dependencies, namespace, changesKeys, realChange
|
|
|
293
313
|
});
|
|
294
314
|
}
|
|
295
315
|
function getState(namespace, arg) {
|
|
296
|
-
if ((0,
|
|
316
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(arg)) {
|
|
297
317
|
return createStore(arg);
|
|
298
318
|
}
|
|
299
|
-
return (0,
|
|
319
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.recreateStructure)(getValues(namespace));
|
|
300
320
|
}
|
|
301
321
|
async function setState(namespace, changes) {
|
|
302
322
|
const storageChanges = {};
|
|
303
|
-
const updateId = (0,
|
|
323
|
+
const updateId = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.uid)();
|
|
304
324
|
const storageTypes = {};
|
|
305
|
-
(0,
|
|
325
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.forEach)(changes, (k, v) => {
|
|
306
326
|
const fullKey = namespace(k);
|
|
307
327
|
const { storageType, computeFn, isAction } = STATE[fullKey];
|
|
308
328
|
if (computeFn || isAction) {
|
|
@@ -331,16 +351,15 @@ async function setValues(storageType, changes) {
|
|
|
331
351
|
return;
|
|
332
352
|
}
|
|
333
353
|
}
|
|
334
|
-
joinStateChanges((0,
|
|
354
|
+
joinStateChanges((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(changes, (k, newValue) => [k, { newValue }]));
|
|
335
355
|
}
|
|
336
356
|
async function resetState(namespace, keys) {
|
|
337
|
-
|
|
338
|
-
return createStore(namespace());
|
|
357
|
+
return setState(namespace, getDefaultValues(namespace, keys));
|
|
339
358
|
}
|
|
340
359
|
function getDefaultValues(namespace, keys) {
|
|
341
360
|
const namespaceState = getNamespaceState(namespace);
|
|
342
|
-
return (0,
|
|
343
|
-
? (0,
|
|
361
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(keys
|
|
362
|
+
? (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.filter)(namespaceState, (k, { key }) => keys.includes(key))
|
|
344
363
|
: namespaceState, (k, { key, defaultValue }) => [key, defaultValue]);
|
|
345
364
|
}
|
|
346
365
|
function createPendingChanges(namespace) {
|
|
@@ -358,13 +377,15 @@ function createPendingChanges(namespace) {
|
|
|
358
377
|
};
|
|
359
378
|
}
|
|
360
379
|
function main(namespace) {
|
|
361
|
-
if (!arguments[1] || (0,
|
|
380
|
+
if (!arguments[1] || (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(arguments[1])) {
|
|
362
381
|
return getState.apply(null, arguments);
|
|
363
382
|
}
|
|
364
|
-
if ((0,
|
|
365
|
-
|
|
383
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isArray)(arguments[1]) ||
|
|
384
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(arguments[1]) ||
|
|
385
|
+
(0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isAsyncFunction)(arguments[1])) {
|
|
386
|
+
return _listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener.apply(null, arguments);
|
|
366
387
|
}
|
|
367
|
-
if ((0,
|
|
388
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isObject)(arguments[1])) {
|
|
368
389
|
return setState.apply(null, arguments);
|
|
369
390
|
}
|
|
370
391
|
}
|
|
@@ -372,26 +393,26 @@ function setStorageUtils(storageUtils) {
|
|
|
372
393
|
Object.assign(STORAGE, storageUtils);
|
|
373
394
|
}
|
|
374
395
|
function addNamespace(namespace, str) {
|
|
375
|
-
return `${namespace}${((0,
|
|
396
|
+
return `${namespace}${((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isString)(str) && _constants__WEBPACK_IMPORTED_MODULE_4__.NAMESPACE_DELIMITER) || ""}${str || ""}`;
|
|
376
397
|
}
|
|
377
398
|
function createStore(_namespace) {
|
|
378
399
|
const namespace = ((key) => addNamespace(_namespace, key));
|
|
379
400
|
if (!STATE_PENDING_CHANGES[namespace()]) {
|
|
380
401
|
STATE_PENDING_CHANGES[namespace()] = {};
|
|
381
402
|
}
|
|
382
|
-
if (!
|
|
383
|
-
|
|
403
|
+
if (!_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()]) {
|
|
404
|
+
_listeners__WEBPACK_IMPORTED_MODULE_5__.LISTENERS[namespace()] = [];
|
|
384
405
|
}
|
|
385
406
|
return Object.assign(main.bind(null, namespace), {
|
|
386
407
|
add: (state) => addState(namespace, state, false),
|
|
387
408
|
addPersistent: (state) => addState(namespace, state, true),
|
|
388
409
|
get: (newNamespace) => getState(namespace, newNamespace),
|
|
389
|
-
set:
|
|
410
|
+
set: (changes) => setState(namespace, changes),
|
|
390
411
|
reset: (keys) => resetState(namespace, keys),
|
|
391
412
|
changes: createPendingChanges(namespace),
|
|
392
|
-
onChange: (keys, cb) => (0,
|
|
393
|
-
removeListener: (keys, cb) => (0,
|
|
394
|
-
actions: (actions) => (0,
|
|
413
|
+
onChange: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.addStateListener)(namespace, keys, cb),
|
|
414
|
+
removeListener: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_5__.removeStateListener)(namespace, keys, cb),
|
|
415
|
+
actions: (actions) => (0,_actions__WEBPACK_IMPORTED_MODULE_3__.addStateActions)(namespace, actions),
|
|
395
416
|
setStorageUtils,
|
|
396
417
|
joinStateChanges,
|
|
397
418
|
namespace,
|
|
@@ -408,6 +429,7 @@ function createStore(_namespace) {
|
|
|
408
429
|
\**************************/
|
|
409
430
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
410
431
|
|
|
432
|
+
"use strict";
|
|
411
433
|
__webpack_require__.r(__webpack_exports__);
|
|
412
434
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
413
435
|
/* harmony export */ LISTENERS: () => (/* binding */ LISTENERS),
|
|
@@ -415,21 +437,24 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
415
437
|
/* harmony export */ removeStateListener: () => (/* binding */ removeStateListener),
|
|
416
438
|
/* harmony export */ runStateChangeListeners: () => (/* binding */ runStateChangeListeners)
|
|
417
439
|
/* harmony export */ });
|
|
418
|
-
/* harmony import */ var
|
|
419
|
-
/* harmony import */ var
|
|
420
|
-
/* harmony import */ var
|
|
440
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
441
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
442
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ "./src/index.ts");
|
|
443
|
+
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
|
|
444
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
|
|
445
|
+
|
|
421
446
|
|
|
422
447
|
|
|
423
448
|
|
|
424
449
|
const LISTENERS = {};
|
|
425
450
|
async function runStateChangeListeners(realChanges) {
|
|
426
451
|
if (Object.keys(realChanges).length) {
|
|
427
|
-
const { namespace } =
|
|
452
|
+
const { namespace } = ___WEBPACK_IMPORTED_MODULE_1__.STATE[Object.keys(realChanges)[0]];
|
|
428
453
|
for (const [changeKey] of Object.entries(realChanges)) {
|
|
429
|
-
const { listeners, key } =
|
|
454
|
+
const { listeners, key } = ___WEBPACK_IMPORTED_MODULE_1__.STATE[changeKey];
|
|
430
455
|
for (const cb of listeners) {
|
|
431
|
-
const fn = cb.bind(null, [key], (0,
|
|
432
|
-
if ((0,
|
|
456
|
+
const fn = cb.bind(null, [key], (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace()));
|
|
457
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(cb)) {
|
|
433
458
|
await fn();
|
|
434
459
|
}
|
|
435
460
|
else {
|
|
@@ -437,11 +462,11 @@ async function runStateChangeListeners(realChanges) {
|
|
|
437
462
|
}
|
|
438
463
|
}
|
|
439
464
|
}
|
|
440
|
-
const namespaceLength = `${namespace()}${
|
|
441
|
-
const readableKeys = (0,
|
|
465
|
+
const namespaceLength = `${namespace()}${_constants__WEBPACK_IMPORTED_MODULE_2__.NAMESPACE_DELIMITER}`.length;
|
|
466
|
+
const readableKeys = (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.map)(realChanges, (k) => k.slice(namespaceLength));
|
|
442
467
|
for (const cb of LISTENERS[namespace()]) {
|
|
443
|
-
const fn = cb.bind(null, readableKeys, (0,
|
|
444
|
-
if ((0,
|
|
468
|
+
const fn = cb.bind(null, readableKeys, (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace()));
|
|
469
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(cb)) {
|
|
445
470
|
await fn();
|
|
446
471
|
}
|
|
447
472
|
else {
|
|
@@ -451,25 +476,25 @@ async function runStateChangeListeners(realChanges) {
|
|
|
451
476
|
}
|
|
452
477
|
}
|
|
453
478
|
function addStateListener(namespace, observables, cb) {
|
|
454
|
-
if ((0,
|
|
479
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(observables)) {
|
|
455
480
|
LISTENERS[namespace()].push(observables);
|
|
456
|
-
return (0,
|
|
481
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
457
482
|
}
|
|
458
|
-
observables.forEach((key) =>
|
|
459
|
-
return (0,
|
|
483
|
+
observables.forEach((key) => ___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(key)].listeners?.push(cb));
|
|
484
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
460
485
|
}
|
|
461
486
|
function removeStateListener(namespace, observables, removeCb) {
|
|
462
|
-
if ((0,
|
|
487
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isFunction)(observables) || (0,_helpers__WEBPACK_IMPORTED_MODULE_3__.isAsyncFunction)(observables)) {
|
|
463
488
|
const removeIdx = LISTENERS[namespace()].findIndex((cb) => cb === observables);
|
|
464
489
|
LISTENERS[namespace()].splice(removeIdx, 1);
|
|
465
|
-
return (0,
|
|
490
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
466
491
|
}
|
|
467
492
|
observables.forEach((key) => {
|
|
468
|
-
const listeners =
|
|
493
|
+
const listeners = ___WEBPACK_IMPORTED_MODULE_1__.STATE[namespace(key)].listeners;
|
|
469
494
|
const removeIdx = listeners?.findIndex((cb) => cb === removeCb);
|
|
470
495
|
listeners?.splice(removeIdx, 1);
|
|
471
496
|
});
|
|
472
|
-
return (0,
|
|
497
|
+
return (0,___WEBPACK_IMPORTED_MODULE_1__.createStore)(namespace());
|
|
473
498
|
}
|
|
474
499
|
|
|
475
500
|
|
|
@@ -481,10 +506,14 @@ function removeStateListener(namespace, observables, removeCb) {
|
|
|
481
506
|
\************************/
|
|
482
507
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
483
508
|
|
|
509
|
+
"use strict";
|
|
484
510
|
__webpack_require__.r(__webpack_exports__);
|
|
485
511
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
486
512
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
487
513
|
/* harmony export */ });
|
|
514
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ "./src/types.d.ts");
|
|
515
|
+
/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
516
|
+
|
|
488
517
|
async function updateFromLocalStorage(state) {
|
|
489
518
|
const stored = {};
|
|
490
519
|
for (const key in state) {
|
|
@@ -556,6 +585,18 @@ function removeStorageKey(type, key) {
|
|
|
556
585
|
/******/ }
|
|
557
586
|
/******/
|
|
558
587
|
/************************************************************************/
|
|
588
|
+
/******/ /* webpack/runtime/compat get default export */
|
|
589
|
+
/******/ (() => {
|
|
590
|
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
591
|
+
/******/ __webpack_require__.n = (module) => {
|
|
592
|
+
/******/ const getter = module && module.__esModule ?
|
|
593
|
+
/******/ () => (module['default']) :
|
|
594
|
+
/******/ () => (module);
|
|
595
|
+
/******/ __webpack_require__.d(getter, { a: getter });
|
|
596
|
+
/******/ return getter;
|
|
597
|
+
/******/ };
|
|
598
|
+
/******/ })();
|
|
599
|
+
/******/
|
|
559
600
|
/******/ /* webpack/runtime/define property getters */
|
|
560
601
|
/******/ (() => {
|
|
561
602
|
/******/ // define getter/value functions for harmony exports
|
package/dist/varstor.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see varstor.min.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Varstor=t():e.Varstor=t()}(this,()=>(()=>{
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Varstor=t():e.Varstor=t()}(this,()=>(()=>{var e={"./src/types.d.ts"(){},"./src/actions.ts"(e,t,n){"use strict";n.r(t),n.d(t,{addStateActions:()=>s});n("./src/types.d.ts");var r=n("./src/index.ts");function s(e,t){for(const[n,s]of Object.entries(t))r.STATE[e(n)]={key:n,namespace:e,value:s.bind(null,(0,r.createStore)(e())),isAction:!0,listeners:[]};return(0,r.createStore)(e())}},"./src/constants.ts"(e,t,n){"use strict";n.r(t),n.d(t,{NAMESPACE_DELIMITER:()=>r});const r="::"},"./src/helpers.ts"(e,t,n){"use strict";n.r(t),n.d(t,{filter:()=>S,forEach:()=>p,getParamNames:()=>f,isArray:()=>c,isAsyncFunction:()=>a,isFunction:()=>i,isObject:()=>u,isString:()=>o,map:()=>d,recreateStructure:()=>y,uid:()=>g});const r=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,s=/([^\s,]+)/g;function c(e){return"[object Array]"===l(e)}function o(e){return"[object String]"===l(e)}function i(e){return"[object Function]"===l(e)}function a(e){return"[object AsyncFunction]"===l(e)}function u(e){return"[object Object]"===l(e)}function l(e){return Object.prototype.toString.call(e)}function f(e){const t=e.toString().replace(r,"").split("=>")[0],n=t.slice(t.indexOf("(")+1,t.indexOf(")")).match(s);return null===n?[]:n}function d(e,t){const n=Object.entries(e).map(([e,n])=>t(e,n));return 2===n[0]?.length?Object.fromEntries(n):n}function p(e,t){Object.entries(e||{}).forEach(([e,n])=>t(e,n))}function S(e,t){return Object.fromEntries(Object.entries(e||{}).filter(([e,n])=>!0===t(e,n)))}function y(e){let t=e;if(c(e))return t=[],e.forEach(e=>t.push(y(e))),t;if(u(e)){t={};for(let n in e)t[n]=y(e[n]);return t}return t}function g(){return Date.now().toString(36)+Math.random().toString(36).substr(2)}},"./src/index.ts"(e,t,n){"use strict";n.r(t),n.d(t,{STATE:()=>a,createPendingChanges:()=>v,createStore:()=>V,default:()=>_,getState:()=>A,getValues:()=>y,joinStateChanges:()=>E,resetState:()=>O,setState:()=>j,setupValue:()=>p});n("./src/types.d.ts");var r=n("./src/storage.ts"),s=n("./src/helpers.ts"),c=n("./src/actions.ts"),o=n("./src/constants.ts"),i=n("./src/listeners.ts");const a={},u={},l={},f={};async function d(e,t,n){const r=f.GET_TYPE(n),c=Object.assign({},t),o=(0,s.map)(t,(t,n)=>[e(t),n]);f.IS_AVAILABE(r)&&await f.UPDATE_STATE(o,r);for(const n in t){const t=e(n);a[t]=p(n,e,o[t],c[n],r)}return V(e())}function p(e,t,n,r,c){const o=t(e),i=(0,s.isFunction)(n),u=i?(0,s.getParamNames)(n):[];return u.forEach(e=>{const n=t(e);a[n]||(a[n]={dependants:[],dependencies:[],namespace:t,storageType:c}),a[n].dependants?.push(o)}),{key:e,fullKey:o,value:i?n.apply(null,g(u,t)):n,computeFn:i&&n,dependencies:u,dependants:[],listeners:[],defaultValue:r,storageType:c,namespace:t}}function S(e){return(0,s.filter)(a,(t,{key:n})=>t===e(n))}function y(e){return(0,s.map)(S(e),(e,{key:t,value:n})=>[t,n])}function g(e,t){const n=y(t);return e.map(e=>n[e])}async function E(e){for(const[t,{storageTypes:n,readyStorageTypes:r,changes:s}]of Object.entries(u))if(e[t]){const c=e[t].newValue;r[c]=!0,delete e[t],Object.assign(s,e),f.IS_AVAILABE(c)&&f.REMOVE_KEY(c,t);for(const e in n)if(!r[e])return;delete u[t],await b(s)}}async function b(e){const t={};for(const n in e){const r=a[n].value,s=e[n].newValue;r!==s?(t[n]={newValue:s,prevValue:r},a[n].value=s):t[n]={isSame:!0},m(n,e,t)}await(0,i.runStateChangeListeners)((0,s.filter)(t,(e,t)=>!t.isSame))}function m(e,t,n){a[e].dependants?.forEach(e=>{const{dependencies:r,namespace:s}=a[e];if(!function(e,t,n,r){return e.every(e=>{const s=t(e);return n.includes(s)&&r.includes(s)||!n.includes(s)})}(r,s,Object.keys(t),Object.keys(n))||n[e])return;const c=a[e].value,o=a[e].computeFn?.apply(null,g(r,s));c!==o&&(n[e]={newValue:o,prevValue:c},a[e].value=o,m(e,t,n))})}function A(e,t){return(0,s.isString)(t)?V(t):(0,s.recreateStructure)(y(e))}async function j(e,t){const n={},r=(0,s.uid)(),c={};(0,s.forEach)(t,(t,r)=>{const s=e(t),{storageType:o,computeFn:i,isAction:u}=a[s];i||u||(n[o]||(n[o]={}),c[o]=!0,n[o][s]=r)}),u[r]={storageTypes:c,readyStorageTypes:{},changes:{}};for(let[e,t]of Object.entries(n))await T(e,{...t,[r]:e});return V(e())}async function T(e,t){if(f.IS_AVAILABE(e)){if(await f.SET_VALUES(e,t))return}E((0,s.map)(t,(e,t)=>[e,{newValue:t}]))}async function O(e,t){return j(e,h(e,t))}function h(e,t){const n=S(e);return(0,s.map)(t?(0,s.filter)(n,(e,{key:n})=>t.includes(n)):n,(e,{key:t,defaultValue:n})=>[t,n])}function v(e){const t=()=>{const t=l[e()];return l[e()]={},t};return{add:t=>Object.assign(l[e()],t),reset:t=>Object.assign(l[e()],h(e,t)),get:()=>l[e()],flush:t,commit:()=>j(e,t())}}function I(e){return!arguments[1]||(0,s.isString)(arguments[1])?A.apply(null,arguments):(0,s.isArray)(arguments[1])||(0,s.isFunction)(arguments[1])||(0,s.isAsyncFunction)(arguments[1])?i.addStateListener.apply(null,arguments):(0,s.isObject)(arguments[1])?j.apply(null,arguments):void 0}function L(e){Object.assign(f,e)}function V(e){const t=t=>function(e,t){return`${e}${(0,s.isString)(t)&&o.NAMESPACE_DELIMITER||""}${t||""}`}(e,t);return l[t()]||(l[t()]={}),i.LISTENERS[t()]||(i.LISTENERS[t()]=[]),Object.assign(I.bind(null,t),{add:e=>d(t,e,!1),addPersistent:e=>d(t,e,!0),get:e=>A(t,e),set:e=>j(t,e),reset:e=>O(t,e),changes:v(t),onChange:(e,n)=>(0,i.addStateListener)(t,e,n),removeListener:(e,n)=>(0,i.removeStateListener)(t,e,n),actions:e=>(0,c.addStateActions)(t,e),setStorageUtils:L,joinStateChanges:E,namespace:t})}L(r.default);const _=V("")},"./src/listeners.ts"(e,t,n){"use strict";n.r(t),n.d(t,{LISTENERS:()=>o,addStateListener:()=>a,removeStateListener:()=>u,runStateChangeListeners:()=>i});n("./src/types.d.ts");var r=n("./src/index.ts"),s=n("./src/constants.ts"),c=n("./src/helpers.ts");const o={};async function i(e){if(Object.keys(e).length){const{namespace:t}=r.STATE[Object.keys(e)[0]];for(const[n]of Object.entries(e)){const{listeners:e,key:s}=r.STATE[n];for(const n of e){const e=n.bind(null,[s],(0,r.createStore)(t()));(0,c.isAsyncFunction)(n)?await e():e()}}const n=`${t()}${s.NAMESPACE_DELIMITER}`.length,i=(0,c.map)(e,e=>e.slice(n));for(const e of o[t()]){const n=e.bind(null,i,(0,r.createStore)(t()));(0,c.isAsyncFunction)(e)?await n():n()}}}function a(e,t,n){return(0,c.isFunction)(t)||(0,c.isAsyncFunction)(t)?(o[e()].push(t),(0,r.createStore)(e())):(t.forEach(t=>r.STATE[e(t)].listeners?.push(n)),(0,r.createStore)(e()))}function u(e,t,n){if((0,c.isFunction)(t)||(0,c.isAsyncFunction)(t)){const n=o[e()].findIndex(e=>e===t);return o[e()].splice(n,1),(0,r.createStore)(e())}return t.forEach(t=>{const s=r.STATE[e(t)].listeners,c=s?.findIndex(e=>e===n);s?.splice(c,1)}),(0,r.createStore)(e())}},"./src/storage.ts"(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>r});n("./src/types.d.ts");const r={GET_TYPE:function(e){return e?"localStorage":""},IS_AVAILABE:function(e){return!!e},UPDATE_STATE:async function(e){const t={};for(const n in e){const e=localStorage.getItem(n);null!==e&&(t[n]=e)}return Object.assign(e,t)},SET_VALUES:async function(e,t){for(let[e,n]of Object.entries(t))localStorage.setItem(e,n);return!1},REMOVE_KEY:function(e,t){e&&localStorage.removeItem(t)}}}};const t={};function n(r){const s=t[r];if(void 0!==s)return s.exports;const c=t[r]={exports:{}};if(!(r in e)){delete t[r];const e=new Error("Cannot find module '"+r+"'");throw e.code="MODULE_NOT_FOUND",e}return e[r](c,c.exports,n),c.exports}n.n=e=>{const t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{if(Array.isArray(t))for(var r=0;r<t.length;){var s=t[r++],c=t[r++];n.o(e,s)?0===c&&r++:0===c?Object.defineProperty(e,s,{enumerable:!0,value:t[r++]}):Object.defineProperty(e,s,{enumerable:!0,get:c})}else for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let r=n("./src/index.ts");return r=r.default,r})());
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "varstor",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.66",
|
|
4
4
|
"description": "State manager for web applications and webextensions, employing reactivity, wrapping, and uniting the usage of different storages' values and common variables into a simple universal interface",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Igor Morozov <ismorozs@gmail.com>",
|
|
7
7
|
"main": "./dist/varstor.js",
|
|
8
|
+
"types": "./src/types.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": "./dist/varstor.js",
|
|
10
11
|
"./min": "./dist/varstor.min.js",
|
|
@@ -18,6 +19,7 @@
|
|
|
18
19
|
"devDependencies": {
|
|
19
20
|
"@types/node": "26.6.3",
|
|
20
21
|
"@types/webpack-env": "1.18.8",
|
|
22
|
+
"ignore-loader": "^0.1.2",
|
|
21
23
|
"minimizer-webpack-plugin": "5.6.1",
|
|
22
24
|
"ts-loader": "9.6.2",
|
|
23
25
|
"typescript": "6.0.3",
|
package/src/actions.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type INamespace, type IStateActions } from "./types";
|
|
2
|
+
|
|
1
3
|
import { STATE, createStore } from ".";
|
|
2
4
|
|
|
3
5
|
export function addStateActions(namespace: INamespace, actions: IStateActions) {
|
|
@@ -10,4 +12,6 @@ export function addStateActions(namespace: INamespace, actions: IStateActions) {
|
|
|
10
12
|
listeners: [],
|
|
11
13
|
};
|
|
12
14
|
}
|
|
15
|
+
|
|
16
|
+
return createStore(namespace());
|
|
13
17
|
}
|
package/src/helpers.ts
CHANGED
|
@@ -13,7 +13,7 @@ export function isFunction(obj: unknown) {
|
|
|
13
13
|
return getObjectType(obj) === "[object Function]";
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function isAsyncFunction
|
|
16
|
+
export function isAsyncFunction(obj: unknown) {
|
|
17
17
|
return getObjectType(obj) === "[object AsyncFunction]";
|
|
18
18
|
}
|
|
19
19
|
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type IVarstor,
|
|
3
|
+
type IState,
|
|
4
|
+
type IStateUpdatePieces,
|
|
5
|
+
type IStatePendingChanges,
|
|
6
|
+
type IStorageFunctions,
|
|
7
|
+
type INamespace,
|
|
8
|
+
type IStateDefault,
|
|
9
|
+
type IComputeFunction,
|
|
10
|
+
type IValue,
|
|
11
|
+
type IStateChanges,
|
|
12
|
+
type IStateActions,
|
|
13
|
+
type IStateListener,
|
|
14
|
+
} from "./types.d";
|
|
15
|
+
|
|
1
16
|
import storageUtils from "./storage";
|
|
2
17
|
|
|
3
18
|
import {
|
|
@@ -224,13 +239,13 @@ export function getState(namespace: INamespace, arg: string) {
|
|
|
224
239
|
return createStore(arg);
|
|
225
240
|
}
|
|
226
241
|
|
|
227
|
-
return recreateStructure(getValues(namespace))
|
|
242
|
+
return recreateStructure(getValues(namespace)) as Record<string, any>;
|
|
228
243
|
}
|
|
229
244
|
|
|
230
245
|
export async function setState(
|
|
231
246
|
namespace: INamespace,
|
|
232
247
|
changes: Record<string, unknown>,
|
|
233
|
-
): Promise<
|
|
248
|
+
): Promise<IVarstor> {
|
|
234
249
|
const storageChanges: Record<string, any> = {};
|
|
235
250
|
const updateId = uid();
|
|
236
251
|
const storageTypes = {} as Record<string, boolean>;
|
|
@@ -282,9 +297,7 @@ async function setValues(
|
|
|
282
297
|
}
|
|
283
298
|
|
|
284
299
|
export async function resetState(namespace: INamespace, keys?: string[]) {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
return createStore(namespace());
|
|
300
|
+
return setState(namespace, getDefaultValues(namespace, keys));
|
|
288
301
|
}
|
|
289
302
|
|
|
290
303
|
function getDefaultValues(namespace: INamespace, keys?: string[]) {
|
|
@@ -303,7 +316,7 @@ export function createPendingChanges(namespace: INamespace) {
|
|
|
303
316
|
const changes = STATE_PENDING_CHANGES[namespace()];
|
|
304
317
|
STATE_PENDING_CHANGES[namespace()] = {};
|
|
305
318
|
return changes;
|
|
306
|
-
}
|
|
319
|
+
};
|
|
307
320
|
|
|
308
321
|
return {
|
|
309
322
|
add: (changes: Record<string, any>) =>
|
|
@@ -319,12 +332,16 @@ export function createPendingChanges(namespace: INamespace) {
|
|
|
319
332
|
};
|
|
320
333
|
}
|
|
321
334
|
|
|
322
|
-
function main(namespace
|
|
335
|
+
function main(namespace?: INamespace): any {
|
|
323
336
|
if (!arguments[1] || isString(arguments[1])) {
|
|
324
337
|
return getState.apply(null, arguments as unknown as [INamespace, string]);
|
|
325
338
|
}
|
|
326
339
|
|
|
327
|
-
if (
|
|
340
|
+
if (
|
|
341
|
+
isArray(arguments[1]) ||
|
|
342
|
+
isFunction(arguments[1]) ||
|
|
343
|
+
isAsyncFunction(arguments[1])
|
|
344
|
+
) {
|
|
328
345
|
return addStateListener.apply(
|
|
329
346
|
null,
|
|
330
347
|
arguments as unknown as [INamespace, string[], () => {}],
|
|
@@ -347,7 +364,7 @@ function addNamespace(namespace: string, str: string) {
|
|
|
347
364
|
return `${namespace}${(isString(str) && NAMESPACE_DELIMITER) || ""}${str || ""}`;
|
|
348
365
|
}
|
|
349
366
|
|
|
350
|
-
export function createStore(_namespace: string) {
|
|
367
|
+
export function createStore(_namespace: string): IVarstor {
|
|
351
368
|
const namespace = ((key: string) =>
|
|
352
369
|
addNamespace(_namespace, key)) as INamespace;
|
|
353
370
|
|
|
@@ -362,15 +379,14 @@ export function createStore(_namespace: string) {
|
|
|
362
379
|
return Object.assign(main.bind(null, namespace), {
|
|
363
380
|
add: (state: IStateDefault) => addState(namespace, state, false),
|
|
364
381
|
addPersistent: (state: IStateDefault) => addState(namespace, state, true),
|
|
365
|
-
get: (newNamespace
|
|
366
|
-
set:
|
|
367
|
-
await setState(namespace, changes),
|
|
382
|
+
get: (newNamespace?: string) => getState(namespace, newNamespace!),
|
|
383
|
+
set: (changes: Record<string, unknown>) => setState(namespace, changes),
|
|
368
384
|
reset: (keys: string[]) => resetState(namespace, keys),
|
|
369
385
|
changes: createPendingChanges(namespace),
|
|
370
|
-
onChange: (keys: string[], cb
|
|
371
|
-
addStateListener(namespace, keys, cb),
|
|
372
|
-
removeListener: (keys: string[], cb
|
|
373
|
-
removeStateListener(namespace, keys, cb),
|
|
386
|
+
onChange: (keys: string[] | IStateListener, cb?: IStateListener) =>
|
|
387
|
+
addStateListener(namespace, keys, cb!),
|
|
388
|
+
removeListener: (keys: string[] | IStateListener, cb?: IStateListener) =>
|
|
389
|
+
removeStateListener(namespace, keys, cb!),
|
|
374
390
|
actions: (actions: IStateActions) => addStateActions(namespace, actions),
|
|
375
391
|
setStorageUtils,
|
|
376
392
|
joinStateChanges,
|
package/src/listeners.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type INamespace,
|
|
3
|
+
type IStateListeners,
|
|
4
|
+
type IStateChanges,
|
|
5
|
+
type IStateListener,
|
|
6
|
+
type IValue,
|
|
7
|
+
} from "./types";
|
|
8
|
+
|
|
1
9
|
import { STATE, createStore } from ".";
|
|
2
10
|
import { NAMESPACE_DELIMITER } from "./constants";
|
|
3
11
|
import { map, isFunction, isAsyncFunction } from "./helpers";
|
|
@@ -6,12 +14,13 @@ export const LISTENERS = {} as IStateListeners;
|
|
|
6
14
|
|
|
7
15
|
export async function runStateChangeListeners(realChanges: IStateChanges) {
|
|
8
16
|
if (Object.keys(realChanges).length) {
|
|
9
|
-
const { namespace } =
|
|
10
|
-
|
|
17
|
+
const { namespace } = STATE[
|
|
18
|
+
Object.keys(realChanges)[0] as keyof typeof STATE
|
|
19
|
+
] as IValue;
|
|
11
20
|
for (const [changeKey] of Object.entries(realChanges)) {
|
|
12
21
|
const { listeners, key } = STATE[changeKey];
|
|
13
22
|
for (const cb of listeners!) {
|
|
14
|
-
const fn = cb.bind(null, [key], createStore(namespace()));
|
|
23
|
+
const fn = cb.bind(null, [key!], createStore(namespace()));
|
|
15
24
|
if (isAsyncFunction(cb)) {
|
|
16
25
|
await fn();
|
|
17
26
|
} else {
|
|
@@ -26,11 +35,7 @@ export async function runStateChangeListeners(realChanges: IStateChanges) {
|
|
|
26
35
|
) as string[];
|
|
27
36
|
|
|
28
37
|
for (const cb of LISTENERS[namespace()]) {
|
|
29
|
-
const fn = cb.bind(
|
|
30
|
-
null,
|
|
31
|
-
readableKeys,
|
|
32
|
-
createStore(namespace())
|
|
33
|
-
);
|
|
38
|
+
const fn = cb.bind(null, readableKeys, createStore(namespace()));
|
|
34
39
|
if (isAsyncFunction(cb)) {
|
|
35
40
|
await fn();
|
|
36
41
|
} else {
|
|
@@ -43,7 +48,7 @@ export async function runStateChangeListeners(realChanges: IStateChanges) {
|
|
|
43
48
|
export function addStateListener(
|
|
44
49
|
namespace: INamespace,
|
|
45
50
|
observables: string[] | IStateListener,
|
|
46
|
-
cb:
|
|
51
|
+
cb: IStateListener,
|
|
47
52
|
) {
|
|
48
53
|
if (isFunction(observables) || isAsyncFunction(observables)) {
|
|
49
54
|
LISTENERS[namespace()].push(observables as IStateListener);
|
|
@@ -60,7 +65,7 @@ export function addStateListener(
|
|
|
60
65
|
export function removeStateListener(
|
|
61
66
|
namespace: INamespace,
|
|
62
67
|
observables: string[] | IStateListener,
|
|
63
|
-
removeCb:
|
|
68
|
+
removeCb: IStateListener,
|
|
64
69
|
) {
|
|
65
70
|
if (isFunction(observables) || isAsyncFunction(observables)) {
|
|
66
71
|
const removeIdx = LISTENERS[namespace()].findIndex(
|
|
@@ -72,8 +77,8 @@ export function removeStateListener(
|
|
|
72
77
|
|
|
73
78
|
(observables as string[]).forEach((key) => {
|
|
74
79
|
const listeners = STATE[namespace(key)].listeners;
|
|
75
|
-
const removeIdx = listeners?.findIndex((cb) => cb === removeCb)
|
|
76
|
-
listeners?.splice(removeIdx
|
|
80
|
+
const removeIdx = listeners?.findIndex((cb) => cb === removeCb);
|
|
81
|
+
listeners?.splice(removeIdx!, 1);
|
|
77
82
|
});
|
|
78
83
|
|
|
79
84
|
return createStore(namespace());
|
package/src/storage.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type IStateDefault } from "./types";
|
|
2
|
+
|
|
1
3
|
async function updateFromLocalStorage(state: IStateDefault) {
|
|
2
4
|
const stored = {} as IStateDefault;
|
|
3
5
|
for (const key in state) {
|
|
@@ -29,7 +31,7 @@ async function setStorageValue(
|
|
|
29
31
|
return false;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
function removeStorageKey
|
|
34
|
+
function removeStorageKey(type: string, key: string) {
|
|
33
35
|
if (type) {
|
|
34
36
|
localStorage.removeItem(key);
|
|
35
37
|
}
|
package/src/types.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ type IValue = {
|
|
|
11
11
|
dependencies?: string[];
|
|
12
12
|
dependants?: string[];
|
|
13
13
|
storageType?: string;
|
|
14
|
-
listeners?:
|
|
14
|
+
listeners?: IStateListener[];
|
|
15
15
|
defaultValue?: any;
|
|
16
16
|
namespace: INamespace;
|
|
17
17
|
};
|
|
@@ -32,10 +32,7 @@ type IStorageFunctions = {
|
|
|
32
32
|
REMOVE_KEY: (type: string, key: string) => void;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
type IStateListener = (
|
|
36
|
-
changes: string[],
|
|
37
|
-
store: Record<string, any>,
|
|
38
|
-
) => any;
|
|
35
|
+
type IStateListener = (changes: string[], store: IStore) => void;
|
|
39
36
|
|
|
40
37
|
type IStateListeners = Record<string, IStateListener[]>;
|
|
41
38
|
|
|
@@ -43,10 +40,39 @@ type IStateAction = (mutator: IStateMutator, args: any[]) => void;
|
|
|
43
40
|
|
|
44
41
|
type IStateActions = Record<string, IStateAction>;
|
|
45
42
|
|
|
46
|
-
type IStateUpdatePieces = Record<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
type IStateUpdatePieces = Record<
|
|
44
|
+
string,
|
|
45
|
+
{
|
|
46
|
+
storageTypes: Record<string, boolean>;
|
|
47
|
+
readyStorageTypes: Record<string, boolean>;
|
|
48
|
+
changes: IStateChanges;
|
|
49
|
+
}
|
|
50
|
+
>;
|
|
51
51
|
|
|
52
|
-
type IStatePendingChanges = Record<string, Record<string, any>>;
|
|
52
|
+
type IStatePendingChanges = Record<string, Record<string, any>>;
|
|
53
|
+
|
|
54
|
+
type IStatePendingChangesFunctions = {
|
|
55
|
+
add: (changes: Record<string, any>) => Record<string, any>;
|
|
56
|
+
reset: (keys: string[]) => Record<string, any>;
|
|
57
|
+
get: () => Record<string, any>;
|
|
58
|
+
flush: () => Record<string, any>;
|
|
59
|
+
commit: () => Promise<unknown>;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type IVarstor = ((namespace?: INamespace) => any) & {
|
|
63
|
+
add: (state: IStateDefault) => Promise<IVarstor>;
|
|
64
|
+
addPersistent: (state: IStateDefault) => Promise<IVarstor>;
|
|
65
|
+
get: (newNamespace?: string) => IVarstor | Record<string, any>;
|
|
66
|
+
set: (changes: Record<string, unknown>) => Promise<IVarstor>;
|
|
67
|
+
reset: (keys: string[]) => Promise<IVarstor>;
|
|
68
|
+
changes: IStatePendingChangesFunctions;
|
|
69
|
+
onChange: (keys: string[] | IStateListener, cb?: IStateListener) => IVarstor;
|
|
70
|
+
removeListener: (
|
|
71
|
+
keys: string[] | IStateListener,
|
|
72
|
+
cb?: IStateListener,
|
|
73
|
+
) => IVarstor;
|
|
74
|
+
actions: (actions: IStateActions) => IVarstor;
|
|
75
|
+
setStorageUtils: (storageUtils: IStorageFunctions) => void;
|
|
76
|
+
joinStateChanges: (changesPiece: IStateChanges) => Promise<unknown>;
|
|
77
|
+
namespace: INamespace;
|
|
78
|
+
};
|
package/webpack.config.js
CHANGED
|
@@ -25,13 +25,17 @@ module.exports = (env) => {
|
|
|
25
25
|
{
|
|
26
26
|
test: /\.(ts|tsx)$/i,
|
|
27
27
|
loader: "ts-loader",
|
|
28
|
-
exclude:
|
|
28
|
+
exclude: /node_modules|\.d\.ts$/,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
test: /\.d\.ts$/,
|
|
32
|
+
loader: "ignore-loader",
|
|
29
33
|
},
|
|
30
34
|
],
|
|
31
35
|
},
|
|
32
36
|
|
|
33
37
|
resolve: {
|
|
34
|
-
extensions: [".ts", ".js"],
|
|
38
|
+
extensions: [".ts", ".js", ".d.ts"],
|
|
35
39
|
},
|
|
36
40
|
|
|
37
41
|
devtool: false,
|