varstor 0.0.3 → 0.0.4

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