varstor 0.0.1 → 0.0.3
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 +18 -1
- package/dist/varstor-webextension.js +639 -0
- package/dist/varstor-webextension.min.js +2 -0
- package/dist/varstor.js +17 -16
- package/dist/varstor.min.js +1 -1
- package/package.json +19 -3
- package/src/error.js +3 -3
- package/src/index.js +3 -4
- package/src/namespace.js +7 -8
- package/src/storage.js +4 -1
- package/src/webextension.js +49 -0
- package/webpack.config.js +6 -3
package/README.md
CHANGED
|
@@ -1,2 +1,19 @@
|
|
|
1
1
|
# Varstor
|
|
2
|
-
|
|
2
|
+
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.
|
|
3
|
+
|
|
4
|
+
## How to install and prepare
|
|
5
|
+
Install the library through
|
|
6
|
+
```sh
|
|
7
|
+
npm install varstor
|
|
8
|
+
```
|
|
9
|
+
then import with
|
|
10
|
+
```js
|
|
11
|
+
import varstor from 'varstor'
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
or, if you are developing a webextension (except content script)
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
import varstor from 'varstor/webextension'
|
|
18
|
+
```
|
|
19
|
+
in your script file.
|
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
(function webpackUniversalModuleDefinition(root, factory) {
|
|
2
|
+
if(typeof exports === 'object' && typeof module === 'object')
|
|
3
|
+
module.exports = factory();
|
|
4
|
+
else if(typeof define === 'function' && define.amd)
|
|
5
|
+
define([], factory);
|
|
6
|
+
else if(typeof exports === 'object')
|
|
7
|
+
exports["Varstor"] = factory();
|
|
8
|
+
else
|
|
9
|
+
root["Varstor"] = factory();
|
|
10
|
+
})(this, () => {
|
|
11
|
+
return /******/ (() => { // webpackBootstrap
|
|
12
|
+
/******/ var __webpack_modules__ = ({
|
|
13
|
+
|
|
14
|
+
/***/ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js"
|
|
15
|
+
/*!*************************************************************************!*\
|
|
16
|
+
!*** ./node_modules/webextension-polyfill/dist/browser-polyfill.min.js ***!
|
|
17
|
+
\*************************************************************************/
|
|
18
|
+
(module, exports) {
|
|
19
|
+
|
|
20
|
+
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(a,b){if(true)!(__WEBPACK_AMD_DEFINE_ARRAY__ = [module], __WEBPACK_AMD_DEFINE_FACTORY__ = (b),
|
|
21
|
+
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
|
|
22
|
+
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
|
|
23
|
+
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else // removed by dead control flow
|
|
24
|
+
{ var c; }})("undefined"==typeof globalThis?"undefined"==typeof self?this:self:globalThis,function(a){"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.");if(!(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)){a.exports=(a=>{const b={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(b).length)throw new Error("api-metadata.json has not been included in browser-polyfill");class c extends WeakMap{constructor(a,b=void 0){super(b),this.createItem=a}get(a){return this.has(a)||this.set(a,this.createItem(a)),super.get(a)}}const d=a=>a&&"object"==typeof a&&"function"==typeof a.then,e=(b,c)=>(...d)=>{a.runtime.lastError?b.reject(new Error(a.runtime.lastError.message)):c.singleCallbackArg||1>=d.length&&!1!==c.singleCallbackArg?b.resolve(d[0]):b.resolve(d)},f=a=>1==a?"argument":"arguments",g=(a,b)=>function(c,...d){if(d.length<b.minArgs)throw new Error(`Expected at least ${b.minArgs} ${f(b.minArgs)} for ${a}(), got ${d.length}`);if(d.length>b.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((f,g)=>{if(b.fallbackToNoCallback)try{c[a](...d,e({resolve:f,reject:g},b))}catch(e){console.warn(`${a} API method doesn't seem to support the callback parameter, `+"falling back to call it without a callback: ",e),c[a](...d),b.fallbackToNoCallback=!1,b.noCallback=!0,f()}else b.noCallback?(c[a](...d),f()):c[a](...d,e({resolve:f,reject:g},b))})},h=(a,b,c)=>new Proxy(b,{apply(b,d,e){return c.call(d,a,...e)}});let i=Function.call.bind(Object.prototype.hasOwnProperty);const j=(a,b={},c={})=>{let d=Object.create(null),e=Object.create(a);return new Proxy(e,{has(b,c){return c in a||c in d},get(e,f){if(f in d)return d[f];if(!(f in a))return;let k=a[f];if("function"==typeof k){if("function"==typeof b[f])k=h(a,a[f],b[f]);else if(i(c,f)){let b=g(f,c[f]);k=h(a,a[f],b)}else k=k.bind(a);}else if("object"==typeof k&&null!==k&&(i(b,f)||i(c,f)))k=j(k,b[f],c[f]);else if(i(c,"*"))k=j(k,b[f],c["*"]);else return Object.defineProperty(d,f,{configurable:!0,enumerable:!0,get(){return a[f]},set(b){a[f]=b}}),k;return d[f]=k,k},set(b,c,e){return c in d?d[c]=e:a[c]=e,!0},defineProperty(a,b,c){return Reflect.defineProperty(d,b,c)},deleteProperty(a,b){return Reflect.deleteProperty(d,b)}})},k=a=>({addListener(b,c,...d){b.addListener(a.get(c),...d)},hasListener(b,c){return b.hasListener(a.get(c))},removeListener(b,c){b.removeListener(a.get(c))}}),l=new c(a=>"function"==typeof a?function(b){const c=j(b,{},{getContent:{minArgs:0,maxArgs:0}});a(c)}:a),m=new c(a=>"function"==typeof a?function(b,c,e){let f,g,h=!1,i=new Promise(a=>{f=function(b){h=!0,a(b)}});try{g=a(b,c,f)}catch(a){g=Promise.reject(a)}const j=!0!==g&&d(g);if(!0!==g&&!j&&!h)return!1;const k=a=>{a.then(a=>{e(a)},a=>{let b;b=a&&(a instanceof Error||"string"==typeof a.message)?a.message:"An unexpected error occurred",e({__mozWebExtensionPolyfillReject__:!0,message:b})}).catch(a=>{console.error("Failed to send onMessage rejected reply",a)})};return j?k(g):k(i),!0}:a),n=({reject:b,resolve:c},d)=>{a.runtime.lastError?a.runtime.lastError.message==="The message port closed before a response was received."?c():b(new Error(a.runtime.lastError.message)):d&&d.__mozWebExtensionPolyfillReject__?b(new Error(d.message)):c(d)},o=(a,b,c,...d)=>{if(d.length<b.minArgs)throw new Error(`Expected at least ${b.minArgs} ${f(b.minArgs)} for ${a}(), got ${d.length}`);if(d.length>b.maxArgs)throw new Error(`Expected at most ${b.maxArgs} ${f(b.maxArgs)} for ${a}(), got ${d.length}`);return new Promise((a,b)=>{const e=n.bind(null,{resolve:a,reject:b});d.push(e),c.sendMessage(...d)})},p={devtools:{network:{onRequestFinished:k(l)}},runtime:{onMessage:k(m),onMessageExternal:k(m),sendMessage:o.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:o.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},q={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return b.privacy={network:{"*":q},services:{"*":q},websites:{"*":q}},j(a,p,b)})(chrome)}else a.exports=globalThis.browser});
|
|
25
|
+
//# sourceMappingURL=browser-polyfill.min.js.map
|
|
26
|
+
|
|
27
|
+
// webextension-polyfill v.0.12.0 (https://github.com/mozilla/webextension-polyfill)
|
|
28
|
+
|
|
29
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
30
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
31
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
32
|
+
|
|
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
|
+
/***/ },
|
|
63
|
+
|
|
64
|
+
/***/ "./src/helpers.js"
|
|
65
|
+
/*!************************!*\
|
|
66
|
+
!*** ./src/helpers.js ***!
|
|
67
|
+
\************************/
|
|
68
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
69
|
+
|
|
70
|
+
"use strict";
|
|
71
|
+
__webpack_require__.r(__webpack_exports__);
|
|
72
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
73
|
+
/* harmony export */ getKeys: () => (/* binding */ getKeys),
|
|
74
|
+
/* harmony export */ getParamNames: () => (/* binding */ getParamNames),
|
|
75
|
+
/* harmony export */ isArray: () => (/* binding */ isArray),
|
|
76
|
+
/* harmony export */ isFunction: () => (/* binding */ isFunction),
|
|
77
|
+
/* harmony export */ isObject: () => (/* binding */ isObject),
|
|
78
|
+
/* harmony export */ isString: () => (/* binding */ isString),
|
|
79
|
+
/* harmony export */ toCamelCase: () => (/* binding */ toCamelCase)
|
|
80
|
+
/* harmony export */ });
|
|
81
|
+
const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
|
|
82
|
+
const ARGUMENT_NAMES = /([^\s,]+)/g;
|
|
83
|
+
|
|
84
|
+
function isFunction(x) {
|
|
85
|
+
return typeof x === "function";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isObject(x) {
|
|
89
|
+
return typeof x === "object";
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isString(x) {
|
|
93
|
+
return typeof x === "string";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function isArray(x) {
|
|
97
|
+
return Array.isArray(x);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function getParamNames(fn) {
|
|
101
|
+
const fnStr = fn.toString().replace(STRIP_COMMENTS, "");
|
|
102
|
+
const names = fnStr
|
|
103
|
+
.slice(fnStr.indexOf("(") + 1, fnStr.indexOf(")"))
|
|
104
|
+
.match(ARGUMENT_NAMES);
|
|
105
|
+
|
|
106
|
+
if (names === null) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return names;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getKeys(obj, key) {
|
|
114
|
+
return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v[key]]));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function toCamelCase(str, delimiter) {
|
|
118
|
+
const strArr = str.split(delimiter);
|
|
119
|
+
return `${strArr[0]}${strArr.slice(1).reduce((a, c) => `${a}${c.charAt(0).toUpperCase()}${c.slice(1)}`, "")}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
/***/ },
|
|
124
|
+
|
|
125
|
+
/***/ "./src/index.js"
|
|
126
|
+
/*!**********************!*\
|
|
127
|
+
!*** ./src/index.js ***!
|
|
128
|
+
\**********************/
|
|
129
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
130
|
+
|
|
131
|
+
"use strict";
|
|
132
|
+
__webpack_require__.r(__webpack_exports__);
|
|
133
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
134
|
+
/* harmony export */ ACCESSORS: () => (/* binding */ ACCESSORS),
|
|
135
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
136
|
+
/* harmony export */ });
|
|
137
|
+
/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/storage.js");
|
|
138
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
139
|
+
/* 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");
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
const STATE = {};
|
|
150
|
+
const ACCESSORS = {};
|
|
151
|
+
const COMPUTED_DEPENDENCIES = {};
|
|
152
|
+
const COMPUTED_ARGUMENTS = {};
|
|
153
|
+
|
|
154
|
+
const STORAGE = {
|
|
155
|
+
GET_TYPE: null,
|
|
156
|
+
IS_AVAILABE: null,
|
|
157
|
+
UPDATE_STATE: null,
|
|
158
|
+
SET_VALUE: null
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
162
|
+
|
|
163
|
+
async function addState (namespace, initialState, isPersistent) {
|
|
164
|
+
const storageType = STORAGE.GET_TYPE(isPersistent);
|
|
165
|
+
const defaultValues = Object.assign({}, initialState);
|
|
166
|
+
const namespacedValues = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.namespacify)(namespace(), initialState);
|
|
167
|
+
|
|
168
|
+
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
169
|
+
await STORAGE.UPDATE_STATE(namespacedValues, storageType);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const accessors = {};
|
|
173
|
+
for (const key in initialState) {
|
|
174
|
+
accessors[namespace(key)] = setupValue(
|
|
175
|
+
namespace(key),
|
|
176
|
+
namespacedValues[namespace(key)],
|
|
177
|
+
defaultValues[key],
|
|
178
|
+
storageType,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Object.assign(ACCESSORS, accessors);
|
|
183
|
+
return createStore(namespace());
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function setupValue (key, value, defaultValue, storageType) {
|
|
187
|
+
const isComputedValue = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value);
|
|
188
|
+
|
|
189
|
+
if (isComputedValue) {
|
|
190
|
+
setupDependencies(key, value);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
STATE[key] = {
|
|
194
|
+
value: isComputedValue ? value.apply(null, getArguments(key)) : value,
|
|
195
|
+
computeFn: value,
|
|
196
|
+
listeners: [],
|
|
197
|
+
defaultValue,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
return createAccessor(key, value, storageType);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function setupDependencies(computedValueName, computeFn) {
|
|
204
|
+
const [, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(computedValueName);
|
|
205
|
+
const paramNames = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getParamNames)(computeFn).map((name) => (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.addNamespace)(namespace, name));
|
|
206
|
+
COMPUTED_ARGUMENTS[computedValueName] = paramNames;
|
|
207
|
+
|
|
208
|
+
paramNames.forEach((param) => {
|
|
209
|
+
if (COMPUTED_DEPENDENCIES[param]) {
|
|
210
|
+
COMPUTED_DEPENDENCIES[param].push(computedValueName);
|
|
211
|
+
} else {
|
|
212
|
+
COMPUTED_DEPENDENCIES[param] = [computedValueName];
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function getArguments(computedName) {
|
|
218
|
+
const values = getNamespaceValues(computedName);
|
|
219
|
+
|
|
220
|
+
return COMPUTED_ARGUMENTS[computedName]
|
|
221
|
+
.map((name) => values[(0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(name)[0]])
|
|
222
|
+
.concat(values);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function createAccessor(key, value, storageType) {
|
|
226
|
+
const accessor = () => STATE[key].value;
|
|
227
|
+
|
|
228
|
+
Object.assign(accessor, {
|
|
229
|
+
valueOf: () => STATE[key].value,
|
|
230
|
+
toString: () => STATE[key].value,
|
|
231
|
+
set: (value) => setValue(key, value, storageType),
|
|
232
|
+
onChange: (cb) => STATE[key].listeners.push(cb),
|
|
233
|
+
removeListener: (removeCb) =>
|
|
234
|
+
(STATE[key].listeners = STATE[key].listeners.filter(
|
|
235
|
+
(cb) => cb !== removeCb,
|
|
236
|
+
)),
|
|
237
|
+
reset: () => setValue(key, STATE[key].defaultValue, storageType),
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
return new Proxy(accessor, {
|
|
241
|
+
get: (target, prop) => {
|
|
242
|
+
if (Object.keys(accessor).includes(prop)) {
|
|
243
|
+
return target[prop];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return STATE[key].value[prop];
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function setValue (key, value, storageType) {
|
|
252
|
+
if (STORAGE.IS_AVAILABE(storageType)) {
|
|
253
|
+
const isAutoUpdate = STORAGE.SET_VALUE(storageType, key, value);
|
|
254
|
+
if (isAutoUpdate) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
onStateChange({ [key]: { newValue: value } });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function onStateChange (changes) {
|
|
263
|
+
const realChanges = {};
|
|
264
|
+
|
|
265
|
+
for (const key in changes) {
|
|
266
|
+
const prevValue = STATE[key].value;
|
|
267
|
+
const newValue = changes[key].newValue;
|
|
268
|
+
|
|
269
|
+
if (prevValue !== newValue) {
|
|
270
|
+
STATE[key].value = newValue;
|
|
271
|
+
realChanges[key] = { newValue, prevValue };
|
|
272
|
+
|
|
273
|
+
updateDependencies(key, realChanges);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
for (const key in realChanges) {
|
|
278
|
+
STATE[key].listeners.forEach((cb) => cb(STATE[key].value, getNamespaceValues(key), realChanges[key]));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function updateDependencies (key, realChanges) {
|
|
283
|
+
const computedDependencies = COMPUTED_DEPENDENCIES[key];
|
|
284
|
+
if (computedDependencies) {
|
|
285
|
+
computedDependencies.forEach((name) => {
|
|
286
|
+
const prevValue = STATE[name].value;
|
|
287
|
+
const newValue = STATE[name].computeFn.apply(null, getArguments(name));
|
|
288
|
+
if (prevValue !== newValue) {
|
|
289
|
+
STATE[name].value = newValue;
|
|
290
|
+
realChanges[name] = { newValue, prevValue };
|
|
291
|
+
updateDependencies(name, realChanges);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function getState(namespace, arg) {
|
|
298
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arg)) {
|
|
299
|
+
return createStore(arg);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(arg)) {
|
|
303
|
+
return getNamespaceAccessors(namespace(""), arg);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return getNamespaceValues(namespace(""));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function getNamespaceValues(namespace) {
|
|
310
|
+
return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getKeys)((0,_namespace__WEBPACK_IMPORTED_MODULE_2__.getByNamespace)(namespace, STATE), "value");
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function getNamespaceAccessors (namespace, cb) {
|
|
314
|
+
const accessors = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.getByNamespace)(namespace, ACCESSORS);
|
|
315
|
+
return cb.call(null, accessors, createStore(namespace()));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function setState (namespace, changes) {
|
|
319
|
+
const noKeys = !Object.keys(changes).length;
|
|
320
|
+
|
|
321
|
+
if (noKeys) {
|
|
322
|
+
resetAllState();
|
|
323
|
+
} else {
|
|
324
|
+
for (const [k,v] of Object.entries(changes)) {
|
|
325
|
+
(0,_error__WEBPACK_IMPORTED_MODULE_3__.isKeyPresent)(namespace(k)) && ACCESSORS[namespace(k)].set(v);
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return createStore(namespace());
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function resetAllState (namespace) {
|
|
333
|
+
Object.entries(ACCESSORS)
|
|
334
|
+
.filter(([k]) => k.startsWith(namespace()))
|
|
335
|
+
.forEach((k, { reset }) => reset());
|
|
336
|
+
|
|
337
|
+
return createStore(namespace());
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function addStateLitener (namespace, observables, cb) {
|
|
341
|
+
observables.forEach((key) => ACCESSORS[namespace(key)].onChange(cb));
|
|
342
|
+
|
|
343
|
+
return createStore(namespace());
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function removeStateListener(namespace, observables, cb) {
|
|
347
|
+
observables.forEach((key) =>
|
|
348
|
+
ACCESSORS[namespace(key)].removeListener(cb),
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
return createStore(namespace());
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function main () {
|
|
355
|
+
const arg1 = arguments[1];
|
|
356
|
+
|
|
357
|
+
if (!arg1 || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(arg1) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arg1)) {
|
|
358
|
+
return getState.apply(null, arguments);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (Array.isArray(arg1)) {
|
|
362
|
+
return addStateLitener.apply(null, arguments);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isObject)(arg1)) {
|
|
366
|
+
return setState.apply(null, arguments);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function setStorageUtils(storageUtils) {
|
|
371
|
+
Object.assign(STORAGE, storageUtils);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function createStore (_namespace) {
|
|
375
|
+
const namespace = (key) => (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.addNamespace)(_namespace, key);
|
|
376
|
+
|
|
377
|
+
return Object.assign(main.bind(null, namespace), {
|
|
378
|
+
add: (state) => addState(namespace, state, false),
|
|
379
|
+
addPersistent: (state) => addState(namespace, state, true),
|
|
380
|
+
get: (arg) => getState(namespace, arg),
|
|
381
|
+
set: (changes) => setState(namespace, changes),
|
|
382
|
+
resetAll: () => resetAllState(namespace),
|
|
383
|
+
onChange: (keys, cb) => addStateLitener(namespace, keys, cb),
|
|
384
|
+
removeListener: (keys, cb) => removeStateListener(namespace, keys, cb),
|
|
385
|
+
setStorageUtils,
|
|
386
|
+
onStateChange,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createStore(""));
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
/***/ },
|
|
394
|
+
|
|
395
|
+
/***/ "./src/namespace.js"
|
|
396
|
+
/*!**************************!*\
|
|
397
|
+
!*** ./src/namespace.js ***!
|
|
398
|
+
\**************************/
|
|
399
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
400
|
+
|
|
401
|
+
"use strict";
|
|
402
|
+
__webpack_require__.r(__webpack_exports__);
|
|
403
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
404
|
+
/* harmony export */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER),
|
|
405
|
+
/* harmony export */ addNamespace: () => (/* binding */ addNamespace),
|
|
406
|
+
/* harmony export */ getByNamespace: () => (/* binding */ getByNamespace),
|
|
407
|
+
/* harmony export */ namespacify: () => (/* binding */ namespacify),
|
|
408
|
+
/* harmony export */ splitFullKey: () => (/* binding */ splitFullKey)
|
|
409
|
+
/* harmony export */ });
|
|
410
|
+
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
const NAMESPACE_DELIMITER = ":";
|
|
414
|
+
|
|
415
|
+
function addNamespace(namespace, str) {
|
|
416
|
+
return `${namespace}${(0,_helpers__WEBPACK_IMPORTED_MODULE_0__.isString)(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function splitFullKey (str) {
|
|
420
|
+
const segments = str.split(NAMESPACE_DELIMITER);
|
|
421
|
+
|
|
422
|
+
return [
|
|
423
|
+
segments.slice(-1)[0],
|
|
424
|
+
segments.slice(0, -1).join(NAMESPACE_DELIMITER),
|
|
425
|
+
];
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function getByNamespace(str, obj) {
|
|
429
|
+
const namespace = splitFullKey(str)[1] + NAMESPACE_DELIMITER;
|
|
430
|
+
|
|
431
|
+
return Object.fromEntries(
|
|
432
|
+
Object.entries(obj)
|
|
433
|
+
.filter(([k, v]) => k.startsWith(namespace))
|
|
434
|
+
.map(([k, v]) => [k.slice(namespace.length), v]),
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function namespacify (namespace, obj) {
|
|
439
|
+
return Object.fromEntries(
|
|
440
|
+
Object.entries(obj)
|
|
441
|
+
.map(([k,v]) => [addNamespace(namespace, k), v]
|
|
442
|
+
));
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
/***/ },
|
|
447
|
+
|
|
448
|
+
/***/ "./src/storage.js"
|
|
449
|
+
/*!************************!*\
|
|
450
|
+
!*** ./src/storage.js ***!
|
|
451
|
+
\************************/
|
|
452
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
453
|
+
|
|
454
|
+
"use strict";
|
|
455
|
+
__webpack_require__.r(__webpack_exports__);
|
|
456
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
457
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
458
|
+
/* harmony export */ });
|
|
459
|
+
function updateFromLocalStorage(state) {
|
|
460
|
+
const stored = {};
|
|
461
|
+
for (const key in state) {
|
|
462
|
+
const value = localStorage.getItem(key);
|
|
463
|
+
if (value !== null) {
|
|
464
|
+
stored[key] = value;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return Object.assign(state, stored);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function getStorageType(isPersistent) {
|
|
472
|
+
return isPersistent && "localStorage";
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function isStorageAvailable(storageType) {
|
|
476
|
+
return storageType;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
function setStorageValue(storageType, key, value) {
|
|
480
|
+
window.localStorage.setItem(key, value);
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
485
|
+
GET_TYPE: getStorageType,
|
|
486
|
+
IS_AVAILABE: isStorageAvailable,
|
|
487
|
+
UPDATE_STATE: updateFromLocalStorage,
|
|
488
|
+
SET_VALUE: setStorageValue,
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
/***/ }
|
|
493
|
+
|
|
494
|
+
/******/ });
|
|
495
|
+
/************************************************************************/
|
|
496
|
+
/******/ // The module cache
|
|
497
|
+
/******/ const __webpack_module_cache__ = {};
|
|
498
|
+
/******/
|
|
499
|
+
/******/ // The require function
|
|
500
|
+
/******/ function __webpack_require__(moduleId) {
|
|
501
|
+
/******/ // Check if module is in cache
|
|
502
|
+
/******/ const cachedModule = __webpack_module_cache__[moduleId];
|
|
503
|
+
/******/ if (cachedModule !== undefined) {
|
|
504
|
+
/******/ return cachedModule.exports;
|
|
505
|
+
/******/ }
|
|
506
|
+
/******/ // Create a new module (and put it into the cache)
|
|
507
|
+
/******/ const module = __webpack_module_cache__[moduleId] = {
|
|
508
|
+
/******/ // no module.id needed
|
|
509
|
+
/******/ // no module.loaded needed
|
|
510
|
+
/******/ exports: {}
|
|
511
|
+
/******/ };
|
|
512
|
+
/******/
|
|
513
|
+
/******/ // Execute the module function
|
|
514
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
515
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
516
|
+
/******/ const e = new Error("Cannot find module '" + moduleId + "'");
|
|
517
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
518
|
+
/******/ throw e;
|
|
519
|
+
/******/ }
|
|
520
|
+
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
521
|
+
/******/
|
|
522
|
+
/******/ // Return the exports of the module
|
|
523
|
+
/******/ return module.exports;
|
|
524
|
+
/******/ }
|
|
525
|
+
/******/
|
|
526
|
+
/************************************************************************/
|
|
527
|
+
/******/ /* webpack/runtime/define property getters */
|
|
528
|
+
/******/ (() => {
|
|
529
|
+
/******/ // define getter/value functions for harmony exports
|
|
530
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
531
|
+
/******/ if(Array.isArray(definition)) {
|
|
532
|
+
/******/ var i = 0;
|
|
533
|
+
/******/ while(i < definition.length) {
|
|
534
|
+
/******/ var key = definition[i++];
|
|
535
|
+
/******/ var binding = definition[i++];
|
|
536
|
+
/******/ if(!__webpack_require__.o(exports, key)) {
|
|
537
|
+
/******/ if(binding === 0) {
|
|
538
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
|
|
539
|
+
/******/ } else {
|
|
540
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
|
|
541
|
+
/******/ }
|
|
542
|
+
/******/ } else if(binding === 0) { i++; }
|
|
543
|
+
/******/ }
|
|
544
|
+
/******/ } else {
|
|
545
|
+
/******/ for(var key in definition) {
|
|
546
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
547
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
548
|
+
/******/ }
|
|
549
|
+
/******/ }
|
|
550
|
+
/******/ }
|
|
551
|
+
/******/ };
|
|
552
|
+
/******/ })();
|
|
553
|
+
/******/
|
|
554
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
555
|
+
/******/ (() => {
|
|
556
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
557
|
+
/******/ })();
|
|
558
|
+
/******/
|
|
559
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
560
|
+
/******/ (() => {
|
|
561
|
+
/******/ // define __esModule on exports
|
|
562
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
563
|
+
/******/ if(Symbol.toStringTag) {
|
|
564
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
565
|
+
/******/ }
|
|
566
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
567
|
+
/******/ };
|
|
568
|
+
/******/ })();
|
|
569
|
+
/******/
|
|
570
|
+
/************************************************************************/
|
|
571
|
+
let __webpack_exports__ = {};
|
|
572
|
+
// This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
|
|
573
|
+
(() => {
|
|
574
|
+
"use strict";
|
|
575
|
+
/*!*****************************!*\
|
|
576
|
+
!*** ./src/webextension.js ***!
|
|
577
|
+
\*****************************/
|
|
578
|
+
__webpack_require__.r(__webpack_exports__);
|
|
579
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
580
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
581
|
+
/* harmony export */ });
|
|
582
|
+
/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
|
|
583
|
+
const browser = __webpack_require__(/*! webextension-polyfill/dist/browser-polyfill.min */ "./node_modules/webextension-polyfill/dist/browser-polyfill.min.js");
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
const { onStateChange, setStorageUtils } = ___WEBPACK_IMPORTED_MODULE_0__["default"];
|
|
588
|
+
|
|
589
|
+
if (isBackgroundScript()) {
|
|
590
|
+
browser.storage.local.onChanged.addListener(onStateChange);
|
|
591
|
+
isSessionStorageSupport() &&
|
|
592
|
+
browser.storage.session.onChanged.addListener(onStateChange);
|
|
593
|
+
}
|
|
594
|
+
|
|
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
|
+
}
|
|
630
|
+
|
|
631
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___WEBPACK_IMPORTED_MODULE_0__["default"]);
|
|
632
|
+
|
|
633
|
+
})();
|
|
634
|
+
|
|
635
|
+
__webpack_exports__ = __webpack_exports__["default"];
|
|
636
|
+
/******/ return __webpack_exports__;
|
|
637
|
+
/******/ })()
|
|
638
|
+
;
|
|
639
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
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})());
|
package/dist/varstor.js
CHANGED
|
@@ -27,9 +27,9 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
const isKeyPresent = (fullKey) => {
|
|
30
|
+
const isKeyPresent = (fullKey, obj) => {
|
|
31
31
|
if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
|
|
32
|
-
const [key, namespace] =
|
|
32
|
+
const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
|
|
33
33
|
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -177,7 +177,7 @@ function setupValue (key, value, defaultValue, storageType) {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
function setupDependencies(computedValueName, computeFn) {
|
|
180
|
-
const namespace = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.
|
|
180
|
+
const [, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(computedValueName);
|
|
181
181
|
const paramNames = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getParamNames)(computeFn).map((name) => (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.addNamespace)(namespace, name));
|
|
182
182
|
COMPUTED_ARGUMENTS[computedValueName] = paramNames;
|
|
183
183
|
|
|
@@ -194,7 +194,7 @@ function getArguments(computedName) {
|
|
|
194
194
|
const values = getNamespaceValues(computedName);
|
|
195
195
|
|
|
196
196
|
return COMPUTED_ARGUMENTS[computedName]
|
|
197
|
-
.map((name) => values[(0,_namespace__WEBPACK_IMPORTED_MODULE_2__.
|
|
197
|
+
.map((name) => values[(0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(name)[0]])
|
|
198
198
|
.concat(values);
|
|
199
199
|
}
|
|
200
200
|
|
|
@@ -379,9 +379,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
379
379
|
/* harmony export */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER),
|
|
380
380
|
/* harmony export */ addNamespace: () => (/* binding */ addNamespace),
|
|
381
381
|
/* harmony export */ getByNamespace: () => (/* binding */ getByNamespace),
|
|
382
|
-
/* harmony export */
|
|
383
|
-
/* harmony export */
|
|
384
|
-
/* harmony export */ namespacify: () => (/* binding */ namespacify)
|
|
382
|
+
/* harmony export */ namespacify: () => (/* binding */ namespacify),
|
|
383
|
+
/* harmony export */ splitFullKey: () => (/* binding */ splitFullKey)
|
|
385
384
|
/* harmony export */ });
|
|
386
385
|
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
|
|
387
386
|
|
|
@@ -392,18 +391,17 @@ function addNamespace(namespace, str) {
|
|
|
392
391
|
return `${namespace}${(0,_helpers__WEBPACK_IMPORTED_MODULE_0__.isString)(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
|
393
392
|
}
|
|
394
393
|
|
|
395
|
-
function
|
|
396
|
-
|
|
397
|
-
str.split(NAMESPACE_DELIMITER).slice(0, -1).join(NAMESPACE_DELIMITER)
|
|
398
|
-
);
|
|
399
|
-
}
|
|
394
|
+
function splitFullKey (str) {
|
|
395
|
+
const segments = str.split(NAMESPACE_DELIMITER);
|
|
400
396
|
|
|
401
|
-
|
|
402
|
-
|
|
397
|
+
return [
|
|
398
|
+
segments.slice(-1)[0],
|
|
399
|
+
segments.slice(0, -1).join(NAMESPACE_DELIMITER),
|
|
400
|
+
];
|
|
403
401
|
}
|
|
404
402
|
|
|
405
403
|
function getByNamespace(str, obj) {
|
|
406
|
-
const namespace =
|
|
404
|
+
const namespace = splitFullKey(str)[1] + NAMESPACE_DELIMITER;
|
|
407
405
|
|
|
408
406
|
return Object.fromEntries(
|
|
409
407
|
Object.entries(obj)
|
|
@@ -435,7 +433,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
435
433
|
function updateFromLocalStorage(state) {
|
|
436
434
|
const stored = {};
|
|
437
435
|
for (const key in state) {
|
|
438
|
-
|
|
436
|
+
const value = localStorage.getItem(key);
|
|
437
|
+
if (value !== null) {
|
|
438
|
+
stored[key] = value;
|
|
439
|
+
}
|
|
439
440
|
}
|
|
440
441
|
|
|
441
442
|
return Object.assign(state, stored);
|
package/dist/varstor.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see varstor.min.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Varstor=t():e.Varstor=t()}(this,()=>(()=>{"use strict";var e={"./src/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=>{if(!r.ACCESSORS[e]){const[t,n]=
|
|
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})());
|
package/package.json
CHANGED
|
@@ -1,20 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "varstor",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.3",
|
|
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
|
+
"exports": {
|
|
9
|
+
".": "./dist/varstor.js",
|
|
10
|
+
"./webextension": "./dist/varstor-webextension.js"
|
|
11
|
+
},
|
|
8
12
|
"scripts": {
|
|
9
13
|
"start": "webpack",
|
|
10
14
|
"build": "webpack --env production"
|
|
11
15
|
},
|
|
12
16
|
"devDependencies": {
|
|
13
17
|
"minimizer-webpack-plugin": "5.6.1",
|
|
18
|
+
"webextension-polyfill": "0.12.0",
|
|
14
19
|
"webpack": "5.108.4",
|
|
15
20
|
"webpack-cli": "7.2.1"
|
|
16
21
|
},
|
|
17
22
|
"homepage": "https://github.com/ismorozs/varstor",
|
|
18
23
|
"repository": "https://github.com/ismorozs/varstor.git",
|
|
19
|
-
"bugs": "https://github.com/ismorozs/varstor/issues"
|
|
24
|
+
"bugs": "https://github.com/ismorozs/varstor/issues",
|
|
25
|
+
"keywords": [
|
|
26
|
+
"webextension",
|
|
27
|
+
"extension",
|
|
28
|
+
"reactivity",
|
|
29
|
+
"state",
|
|
30
|
+
"store",
|
|
31
|
+
"storage",
|
|
32
|
+
"reactive",
|
|
33
|
+
"management",
|
|
34
|
+
"development"
|
|
35
|
+
]
|
|
20
36
|
}
|
package/src/error.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ACCESSORS } from "."
|
|
2
|
-
import {
|
|
2
|
+
import { splitFullKey } from "./namespace";
|
|
3
3
|
|
|
4
|
-
export const isKeyPresent = (fullKey) => {
|
|
4
|
+
export const isKeyPresent = (fullKey, obj) => {
|
|
5
5
|
if (!ACCESSORS[fullKey]) {
|
|
6
|
-
const [key, namespace] = fullKey
|
|
6
|
+
const [key, namespace] = splitFullKey(fullKey);
|
|
7
7
|
throw new Error (`Trying to access "${key}" key in "${namespace}" namespace, but it doesn't exist`);
|
|
8
8
|
}
|
|
9
9
|
|
package/src/index.js
CHANGED
|
@@ -8,8 +8,7 @@ import {
|
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
addNamespace,
|
|
11
|
-
|
|
12
|
-
getKey,
|
|
11
|
+
splitFullKey,
|
|
13
12
|
namespacify,
|
|
14
13
|
getByNamespace,
|
|
15
14
|
} from "./namespace";
|
|
@@ -73,7 +72,7 @@ function setupValue (key, value, defaultValue, storageType) {
|
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
function setupDependencies(computedValueName, computeFn) {
|
|
76
|
-
const namespace =
|
|
75
|
+
const [, namespace] = splitFullKey(computedValueName);
|
|
77
76
|
const paramNames = getParamNames(computeFn).map((name) => addNamespace(namespace, name));
|
|
78
77
|
COMPUTED_ARGUMENTS[computedValueName] = paramNames;
|
|
79
78
|
|
|
@@ -90,7 +89,7 @@ function getArguments(computedName) {
|
|
|
90
89
|
const values = getNamespaceValues(computedName);
|
|
91
90
|
|
|
92
91
|
return COMPUTED_ARGUMENTS[computedName]
|
|
93
|
-
.map((name) => values[
|
|
92
|
+
.map((name) => values[splitFullKey(name)[0]])
|
|
94
93
|
.concat(values);
|
|
95
94
|
}
|
|
96
95
|
|
package/src/namespace.js
CHANGED
|
@@ -8,18 +8,17 @@ export function addNamespace(namespace, str) {
|
|
|
8
8
|
return `${namespace}${isString(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export function
|
|
12
|
-
|
|
13
|
-
str.split(NAMESPACE_DELIMITER).slice(0, -1).join(NAMESPACE_DELIMITER)
|
|
14
|
-
);
|
|
15
|
-
}
|
|
11
|
+
export function splitFullKey (str) {
|
|
12
|
+
const segments = str.split(NAMESPACE_DELIMITER);
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
return [
|
|
15
|
+
segments.slice(-1)[0],
|
|
16
|
+
segments.slice(0, -1).join(NAMESPACE_DELIMITER),
|
|
17
|
+
];
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
export function getByNamespace(str, obj) {
|
|
22
|
-
const namespace =
|
|
21
|
+
const namespace = splitFullKey(str)[1] + NAMESPACE_DELIMITER;
|
|
23
22
|
|
|
24
23
|
return Object.fromEntries(
|
|
25
24
|
Object.entries(obj)
|
package/src/storage.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
function updateFromLocalStorage(state) {
|
|
2
2
|
const stored = {};
|
|
3
3
|
for (const key in state) {
|
|
4
|
-
|
|
4
|
+
const value = localStorage.getItem(key);
|
|
5
|
+
if (value !== null) {
|
|
6
|
+
stored[key] = value;
|
|
7
|
+
}
|
|
5
8
|
}
|
|
6
9
|
|
|
7
10
|
return Object.assign(state, stored);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const browser = require("webextension-polyfill/dist/browser-polyfill.min");
|
|
2
|
+
|
|
3
|
+
import main from '.';
|
|
4
|
+
|
|
5
|
+
const { onStateChange, setStorageUtils } = main;
|
|
6
|
+
|
|
7
|
+
if (isBackgroundScript()) {
|
|
8
|
+
browser.storage.local.onChanged.addListener(onStateChange);
|
|
9
|
+
isSessionStorageSupport() &&
|
|
10
|
+
browser.storage.session.onChanged.addListener(onStateChange);
|
|
11
|
+
}
|
|
12
|
+
|
|
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
|
+
}
|
|
48
|
+
|
|
49
|
+
export default main;
|
package/webpack.config.js
CHANGED
|
@@ -2,9 +2,12 @@ const MinimizerPlugin = require("minimizer-webpack-plugin");
|
|
|
2
2
|
|
|
3
3
|
module.exports = (env) => {
|
|
4
4
|
const options = {
|
|
5
|
-
entry:
|
|
5
|
+
entry: {
|
|
6
|
+
varstor: "./src/index.js",
|
|
7
|
+
"varstor-webextension": "./src/webextension.js",
|
|
8
|
+
},
|
|
6
9
|
output: {
|
|
7
|
-
filename:
|
|
10
|
+
filename: ({ chunk }) => `./${chunk.name}.js`,
|
|
8
11
|
library: "Varstor",
|
|
9
12
|
libraryTarget: "umd",
|
|
10
13
|
libraryExport: "default",
|
|
@@ -25,7 +28,7 @@ module.exports = (env) => {
|
|
|
25
28
|
minimize: true,
|
|
26
29
|
minimizer: [new MinimizerPlugin()],
|
|
27
30
|
};
|
|
28
|
-
options.output.filename =
|
|
31
|
+
options.output.filename = ({ chunk }) => `./${chunk.name}.min.js`;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
return options;
|