varstor 0.6.61 → 0.6.62

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/dist/varstor.js CHANGED
@@ -12,411 +12,370 @@ return /******/ (() => { // webpackBootstrap
12
12
  /******/ "use strict";
13
13
  /******/ var __webpack_modules__ = ({
14
14
 
15
- /***/ "./src/helpers.js"
15
+ /***/ "./src/constants.ts"
16
+ /*!**************************!*\
17
+ !*** ./src/constants.ts ***!
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 */ NAMESPACE_DELIMITER: () => (/* binding */ NAMESPACE_DELIMITER)
24
+ /* harmony export */ });
25
+ const NAMESPACE_DELIMITER = "::";
26
+
27
+
28
+ /***/ },
29
+
30
+ /***/ "./src/helpers.ts"
16
31
  /*!************************!*\
17
- !*** ./src/helpers.js ***!
32
+ !*** ./src/helpers.ts ***!
18
33
  \************************/
19
34
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
20
35
 
21
36
  __webpack_require__.r(__webpack_exports__);
22
37
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
- /* harmony export */ getKeys: () => (/* binding */ getKeys),
38
+ /* harmony export */ filter: () => (/* binding */ filter),
39
+ /* harmony export */ forEach: () => (/* binding */ forEach),
24
40
  /* harmony export */ getParamNames: () => (/* binding */ getParamNames),
25
41
  /* harmony export */ isArray: () => (/* binding */ isArray),
26
42
  /* harmony export */ isFunction: () => (/* binding */ isFunction),
27
43
  /* harmony export */ isObject: () => (/* binding */ isObject),
28
44
  /* harmony export */ isString: () => (/* binding */ isString),
29
- /* harmony export */ toCamelCase: () => (/* binding */ toCamelCase)
45
+ /* harmony export */ map: () => (/* binding */ map),
46
+ /* harmony export */ recreateStructure: () => (/* binding */ recreateStructure)
30
47
  /* harmony export */ });
31
- const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
32
- const ARGUMENT_NAMES = /([^\s,]+)/g;
33
-
34
- function isFunction(x) {
35
- return typeof x === "function";
36
- }
37
-
38
- function isObject(x) {
39
- return Object.prototype.toString.call(x) === "[object Object]";
40
- }
41
-
42
- function isString(x) {
43
- return typeof x === "string";
44
- }
45
-
46
- function isArray(x) {
47
- return Array.isArray(x);
48
- }
49
-
50
- function getParamNames(fn) {
51
- const fnStr = fn.toString().replace(STRIP_COMMENTS, "").split("=>")[0];
52
- const names = fnStr
53
- .slice(fnStr.indexOf("(") + 1, fnStr.indexOf(")"))
54
- .match(ARGUMENT_NAMES);
55
-
56
- if (names === null) {
57
- return [];
58
- }
59
-
60
- return names;
61
- }
62
-
63
- function getKeys(obj, key) {
64
- return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v[key]]));
65
- }
66
-
67
- function toCamelCase(str, delimiter) {
68
- const strArr = str.split(delimiter);
69
- return `${strArr[0]}${strArr.slice(1).reduce((a, c) => `${a}${c.charAt(0).toUpperCase()}${c.slice(1)}`, "")}`;
70
- }
48
+ const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
49
+ const ARGUMENT_NAMES = /([^\s,]+)/g;
50
+ function isArray(obj) {
51
+ return getObjectType(obj) === "[object Array]";
52
+ }
53
+ function isString(obj) {
54
+ return getObjectType(obj) === "[object String]";
55
+ }
56
+ function isFunction(obj) {
57
+ return getObjectType(obj) === "[object Function]";
58
+ }
59
+ function isObject(obj) {
60
+ return getObjectType(obj) === "[object Object]";
61
+ }
62
+ function getObjectType(obj) {
63
+ return Object.prototype.toString.call(obj);
64
+ }
65
+ function getParamNames(fn) {
66
+ const fnStr = fn.toString().replace(STRIP_COMMENTS, "").split("=>")[0];
67
+ const names = fnStr
68
+ .slice(fnStr.indexOf("(") + 1, fnStr.indexOf(")"))
69
+ .match(ARGUMENT_NAMES);
70
+ if (names === null) {
71
+ return [];
72
+ }
73
+ return names;
74
+ }
75
+ function map(obj, cb) {
76
+ const res = Object.entries(obj).map(([k, v]) => cb(k, v));
77
+ if (res[0]?.length === 2) {
78
+ return Object.fromEntries(res);
79
+ }
80
+ return res;
81
+ }
82
+ function forEach(obj, cb) {
83
+ Object.entries(obj || {}).forEach(([k, v]) => cb(k, v));
84
+ }
85
+ function filter(obj, cb) {
86
+ return Object.fromEntries(Object.entries(obj || {}).filter(([k, v]) => cb(k, v) === true));
87
+ }
88
+ function recreateStructure(value) {
89
+ let newValue = value;
90
+ if (isArray(value)) {
91
+ newValue = [];
92
+ value.forEach((v) => newValue.push(recreateStructure(v)));
93
+ return newValue;
94
+ }
95
+ if (isObject(value)) {
96
+ newValue = {};
97
+ for (let key in value) {
98
+ newValue[key] = recreateStructure(value[key]);
99
+ }
100
+ return newValue;
101
+ }
102
+ return newValue;
103
+ }
71
104
 
72
105
 
73
106
  /***/ },
74
107
 
75
- /***/ "./src/index.js"
108
+ /***/ "./src/index.ts"
76
109
  /*!**********************!*\
77
- !*** ./src/index.js ***!
110
+ !*** ./src/index.ts ***!
78
111
  \**********************/
79
112
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
80
113
 
81
114
  __webpack_require__.r(__webpack_exports__);
82
115
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
83
- /* harmony export */ ACCESSORS: () => (/* binding */ ACCESSORS),
84
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
116
+ /* harmony export */ STATE: () => (/* binding */ STATE),
117
+ /* harmony export */ createStore: () => (/* binding */ createStore),
118
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
119
+ /* harmony export */ getValues: () => (/* binding */ getValues)
85
120
  /* harmony export */ });
86
- /* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/storage.js");
87
- /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
88
- /* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
89
- /* harmony import */ var _validation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validation */ "./src/validation.js");
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
- const STATE = {};
99
- const ACCESSORS = {};
100
- const COMPUTED_DEPENDENCIES = {};
101
- const COMPUTED_ARGUMENTS = {};
102
-
103
- const STORAGE = {
104
- GET_TYPE: null,
105
- IS_AVAILABE: null,
106
- UPDATE_STATE: null,
107
- SET_VALUE: null
108
- };
109
-
110
- setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_0__["default"]);
111
-
112
- async function addState (namespace, initialState, isPersistent) {
113
- const storageType = STORAGE.GET_TYPE(isPersistent);
114
- const defaultValues = Object.assign({}, initialState);
115
- const namespacedValues = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.namespacify)(namespace(), initialState);
116
-
117
- if (STORAGE.IS_AVAILABE(storageType)) {
118
- await STORAGE.UPDATE_STATE(namespacedValues, storageType);
119
- }
120
-
121
- const accessors = {};
122
- for (const key in initialState) {
123
- _validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Defining(namespace(key));
124
- accessors[namespace(key)] = setupValue(
125
- namespace(key),
126
- namespacedValues[namespace(key)],
127
- defaultValues[key],
128
- storageType,
129
- );
130
- }
131
-
132
- Object.assign(ACCESSORS, accessors);
133
- return createStore(namespace());
134
- }
135
-
136
- function setupValue (key, value, defaultValue, storageType) {
137
- const isComputedValue = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value);
138
-
139
- if (isComputedValue) {
140
- setupDependencies(key, value);
141
- }
142
-
143
- STATE[key] = {
144
- value: isComputedValue ? value.apply(null, getArguments(key)) : value,
145
- computeFn: value,
146
- listeners: [],
147
- defaultValue,
148
- };
149
-
150
- return createAccessor(key, storageType);
151
- }
152
-
153
- function setupDependencies(computedValueName, computeFn) {
154
- const [, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(computedValueName);
155
- const paramNames = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getParamNames)(computeFn).map((name) => (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.addNamespace)(namespace, name));
156
- COMPUTED_ARGUMENTS[computedValueName] = paramNames;
157
-
158
- paramNames.forEach((param) => {
159
- if (COMPUTED_DEPENDENCIES[param]) {
160
- COMPUTED_DEPENDENCIES[param].push(computedValueName);
161
- } else {
162
- COMPUTED_DEPENDENCIES[param] = [computedValueName];
163
- }
164
- });
165
- }
166
-
167
- function getArguments(computedName) {
168
- const values = getNamespaceValues(computedName);
169
-
170
- return COMPUTED_ARGUMENTS[computedName]
171
- .map((name) => values[(0,_namespace__WEBPACK_IMPORTED_MODULE_2__.splitFullKey)(name)[0]])
172
- .concat(values);
173
- }
174
-
175
- function createAccessor(key, storageType) {
176
- const accessor = () => STATE[key].value;
177
-
178
- Object.assign(accessor, {
179
- valueOf: () => STATE[key].value,
180
- toString: () => STATE[key].value,
181
- set: async (value) => await setValue(key, value, storageType),
182
- onChange: (cb) => STATE[key].listeners.push(cb),
183
- removeListener: (removeCb) =>
184
- (STATE[key].listeners = STATE[key].listeners.filter(
185
- (cb) => cb !== removeCb,
186
- )),
187
- reset: () => setValue(key, STATE[key].defaultValue, storageType),
188
- });
189
-
190
- return new Proxy(accessor, {
191
- get: (target, prop) => {
192
- if (Object.keys(accessor).includes(prop)) {
193
- return target[prop];
194
- }
195
-
196
- return STATE[key].value[prop];
197
- },
198
- });
199
- }
200
-
201
- async function setValue (key, value, storageType) {
202
- if (STORAGE.IS_AVAILABE(storageType)) {
203
- const isAutoUpdate = await STORAGE.SET_VALUE(storageType, key, value);
204
- if (isAutoUpdate) {
205
- return;
206
- }
207
- }
208
-
209
- onStateChange({ [key]: { newValue: value } });
210
- }
211
-
212
- function onStateChange (changes) {
213
- const realChanges = {};
214
-
215
- for (const key in changes) {
216
- const prevValue = STATE[key].value;
217
- const newValue = changes[key].newValue;
218
-
219
- if (prevValue !== newValue) {
220
- STATE[key].value = newValue;
221
- realChanges[key] = { newValue, prevValue };
222
-
223
- updateDependencies(key, realChanges);
224
- }
225
- }
226
-
227
- for (const key in realChanges) {
228
- STATE[key].listeners.forEach(async (cb) => await cb(STATE[key].value, getNamespaceValues(key), realChanges[key]));
229
- }
230
- }
231
-
232
- function updateDependencies (key, realChanges) {
233
- const computedDependencies = COMPUTED_DEPENDENCIES[key];
234
- if (computedDependencies) {
235
- computedDependencies.forEach((name) => {
236
- const prevValue = STATE[name].value;
237
- const newValue = STATE[name].computeFn.apply(null, getArguments(name));
238
- if (prevValue !== newValue) {
239
- STATE[name].value = newValue;
240
- realChanges[name] = { newValue, prevValue };
241
- updateDependencies(name, realChanges);
242
- }
243
- });
244
- }
245
- }
246
-
247
- function getState(namespace, arg) {
248
- if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arg)) {
249
- return createStore(arg);
250
- }
251
-
252
- if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(arg)) {
253
- return getNamespaceAccessors(namespace(""), arg);
254
- }
255
-
256
- return getNamespaceValues(namespace(""));
257
- }
258
-
259
- function getNamespaceValues(namespace) {
260
- return recreateStructure((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getKeys)((0,_namespace__WEBPACK_IMPORTED_MODULE_2__.getByNamespace)(namespace, STATE), "value"));
261
- }
262
-
263
- function getNamespaceAccessors (namespace, cb) {
264
- const accessors = (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.getByNamespace)(namespace, ACCESSORS);
265
- return cb.call(null, accessors, createStore(namespace()));
266
- }
267
-
268
- async function setState (namespace, changes) {
269
- const noKeys = !Object.keys(changes).length;
270
-
271
- if (noKeys) {
272
- resetAllState();
273
- } else {
274
- for (const [k,v] of Object.entries(changes)) {
275
- _validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Setting(namespace(k));
276
- await ACCESSORS[namespace(k)].set(v);
277
- };
278
- }
279
-
280
- return createStore(namespace());
281
- }
282
-
283
- function resetAllState (namespace) {
284
- Object.entries(ACCESSORS)
285
- .filter(([k]) => k.startsWith(namespace()))
286
- .forEach((k, { reset }) => reset());
287
-
288
- return createStore(namespace());
289
- }
290
-
291
- function addStateLitener (namespace, observables, cb) {
292
- observables.forEach((key) => ACCESSORS[namespace(key)].onChange(cb));
293
-
294
- return createStore(namespace());
295
- }
296
-
297
- function removeStateListener(namespace, observables, cb) {
298
- observables.forEach((key) =>
299
- ACCESSORS[namespace(key)].removeListener(cb),
300
- );
301
-
302
- return createStore(namespace());
303
- }
304
-
305
- function recreateStructure (value) {
306
- let newValue = value;
307
-
308
- if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) {
309
- newValue = [];
310
- value.forEach((v) => newValue.push(recreateStructure(v)));
311
- return newValue;
312
- }
313
-
314
- if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isObject)(value)) {
315
- newValue = {};
316
- for (let key in value) {
317
- newValue[key] = recreateStructure(value[key]);
318
- }
319
- return newValue;
320
- }
321
-
322
- return newValue;
323
- }
324
-
325
- function main () {
326
- const arg1 = arguments[1];
327
-
328
- if (!arg1 || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(arg1) || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arg1)) {
329
- return getState.apply(null, arguments);
330
- }
331
-
332
- if (Array.isArray(arg1)) {
333
- return addStateLitener.apply(null, arguments);
334
- }
335
-
336
- if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isObject)(arg1)) {
337
- return setState.apply(null, arguments);
338
- }
339
- }
340
-
341
- function setStorageUtils(storageUtils) {
342
- Object.assign(STORAGE, storageUtils);
343
- }
344
-
345
- function createStore (_namespace) {
346
- const namespace = (key) => (0,_namespace__WEBPACK_IMPORTED_MODULE_2__.addNamespace)(_namespace, key);
347
-
348
- return Object.assign(main.bind(null, namespace), {
349
- add: (state) => addState(namespace, state, false),
350
- addPersistent: (state) => addState(namespace, state, true),
351
- get: (arg) => getState(namespace, arg),
352
- set: async (changes) => await setState(namespace, changes),
353
- resetAll: () => resetAllState(namespace),
354
- onChange: (keys, cb) => addStateLitener(namespace, keys, cb),
355
- removeListener: (keys, cb) => removeStateListener(namespace, keys, cb),
356
- setStorageUtils,
357
- onStateChange,
358
- });
359
- }
360
-
361
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createStore(""));
121
+ /* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage */ "./src/storage.ts");
122
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
123
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
124
+ /* harmony import */ var _validation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./validation */ "./src/validation.ts");
125
+ /* harmony import */ var _listeners__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./listeners */ "./src/listeners.ts");
126
+
127
+
128
+
129
+
130
+
131
+ const STATE = {};
132
+ const STORAGE = {};
133
+ setStorageUtils(_storage__WEBPACK_IMPORTED_MODULE_0__["default"]);
134
+ async function addState(namespace, initialState, isPersistent) {
135
+ const storageType = STORAGE.GET_TYPE(isPersistent);
136
+ const defaultValues = Object.assign({}, initialState);
137
+ const values = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(initialState, (k, v) => [namespace(k), v]);
138
+ if (STORAGE.IS_AVAILABE(storageType)) {
139
+ await STORAGE.UPDATE_STATE(values, storageType);
140
+ }
141
+ if (!_listeners__WEBPACK_IMPORTED_MODULE_4__.LISTENERS[namespace()]) {
142
+ _listeners__WEBPACK_IMPORTED_MODULE_4__.LISTENERS[namespace()] = [];
143
+ }
144
+ for (const key in initialState) {
145
+ const fullKey = namespace(key);
146
+ _validation__WEBPACK_IMPORTED_MODULE_3__.isValid.Defining(fullKey);
147
+ STATE[fullKey] = setupValue(key, namespace, values[fullKey], defaultValues[key], storageType);
148
+ }
149
+ return createStore(namespace());
150
+ }
151
+ function setupValue(key, namespace, value, defaultValue, storageType) {
152
+ const fullKey = namespace(key);
153
+ const isComputedValue = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value);
154
+ const dependencies = isComputedValue
155
+ ? (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.getParamNames)(value)
156
+ : [];
157
+ dependencies.forEach((dependency) => {
158
+ const fullDependencyKey = namespace(dependency);
159
+ if (!STATE[fullDependencyKey]) {
160
+ STATE[fullDependencyKey] = {
161
+ dependants: [],
162
+ dependencies: [],
163
+ namespace,
164
+ storageType,
165
+ };
166
+ }
167
+ STATE[fullDependencyKey].dependants?.push(fullKey);
168
+ });
169
+ return {
170
+ key,
171
+ fullKey,
172
+ value: isComputedValue
173
+ ? value.apply(null, getArguments(dependencies, namespace))
174
+ : value,
175
+ computeFn: isComputedValue && value,
176
+ dependencies,
177
+ dependants: [],
178
+ listeners: [],
179
+ defaultValue,
180
+ storageType,
181
+ namespace,
182
+ };
183
+ }
184
+ function getNamespaceState(namespace) {
185
+ return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(STATE, (k, { key }) => k === namespace(key));
186
+ }
187
+ function getValues(namespace) {
188
+ return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(getNamespaceState(namespace), (k, { key, value }) => [
189
+ key,
190
+ value,
191
+ ]);
192
+ }
193
+ function getArguments(dependencies, namespace) {
194
+ const values = getValues(namespace);
195
+ return dependencies.map((name) => values[name]);
196
+ }
197
+ async function onStateChange(changes) {
198
+ const realChanges = {};
199
+ for (const key in changes) {
200
+ const prevValue = STATE[key].value;
201
+ const newValue = changes[key].newValue;
202
+ if (prevValue !== newValue) {
203
+ realChanges[key] = { newValue, prevValue };
204
+ STATE[key].value = newValue;
205
+ }
206
+ else {
207
+ realChanges[key] = { isSame: true };
208
+ }
209
+ updateDependencies(key, changes, realChanges);
210
+ }
211
+ await (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.runStateChangeListeners)((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(realChanges, (k, v) => !v.isSame));
212
+ }
213
+ function updateDependencies(key, changes, realChanges) {
214
+ STATE[key].dependants?.forEach((name) => {
215
+ const { dependencies, namespace } = STATE[name];
216
+ if (!isEveryDependencyReady(dependencies, namespace, Object.keys(changes), Object.keys(realChanges)) ||
217
+ realChanges[name]) {
218
+ return;
219
+ }
220
+ const prevValue = STATE[name].value;
221
+ const newValue = STATE[name].computeFn?.apply(null, getArguments(dependencies, namespace));
222
+ if (prevValue !== newValue) {
223
+ realChanges[name] = { newValue, prevValue };
224
+ STATE[name].value = newValue;
225
+ updateDependencies(name, changes, realChanges);
226
+ }
227
+ });
228
+ }
229
+ function isEveryDependencyReady(dependencies, namespace, changesKeys, realChangesKeys) {
230
+ return dependencies.every((name) => {
231
+ const fullKey = namespace(name);
232
+ return ((changesKeys.includes(fullKey) && realChangesKeys.includes(fullKey)) ||
233
+ !changesKeys.includes(fullKey));
234
+ });
235
+ }
236
+ function getState(namespace, arg) {
237
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arg)) {
238
+ return createStore(arg);
239
+ }
240
+ return (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.recreateStructure)(getValues(namespace));
241
+ }
242
+ async function setState(namespace, changes) {
243
+ const storageChanges = {};
244
+ (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.forEach)(changes, (k, v) => {
245
+ const fullKey = namespace(k);
246
+ const { storageType, computeFn } = STATE[fullKey];
247
+ if (computeFn) {
248
+ return;
249
+ }
250
+ if (!storageChanges[storageType]) {
251
+ storageChanges[storageType] = {};
252
+ }
253
+ storageChanges[storageType][fullKey] = v;
254
+ });
255
+ for (let [storageType, changes] of Object.entries(storageChanges)) {
256
+ await setValues(storageType, changes);
257
+ }
258
+ return createStore(namespace());
259
+ }
260
+ async function setValues(storageType, changes) {
261
+ if (STORAGE.IS_AVAILABE(storageType)) {
262
+ const isAutoUpdate = await STORAGE.SET_VALUES(storageType, changes);
263
+ if (isAutoUpdate) {
264
+ return;
265
+ }
266
+ }
267
+ onStateChange((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(changes, (k, newValue) => [k, { newValue }]));
268
+ }
269
+ async function resetState(namespace, keys) {
270
+ const namespaceState = getNamespaceState(namespace);
271
+ await setState(namespace, (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.map)(keys
272
+ ? (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.filter)(namespaceState, (k, { key }) => keys.includes(key))
273
+ : namespaceState, (k, { key, defaultValue }) => [key, defaultValue]));
274
+ return createStore(namespace());
275
+ }
276
+ function main(namespace) {
277
+ if (!arguments[1] || (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(arguments[1])) {
278
+ return getState.apply(null, arguments);
279
+ }
280
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isArray)(arguments[1])) {
281
+ return _listeners__WEBPACK_IMPORTED_MODULE_4__.addStateListener.apply(null, arguments);
282
+ }
283
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isObject)(arguments[1])) {
284
+ return setState.apply(null, arguments);
285
+ }
286
+ }
287
+ function setStorageUtils(storageUtils) {
288
+ Object.assign(STORAGE, storageUtils);
289
+ }
290
+ function addNamespace(namespace, str) {
291
+ return `${namespace}${((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(str) && _constants__WEBPACK_IMPORTED_MODULE_2__.NAMESPACE_DELIMITER) || ""}${str || ""}`;
292
+ }
293
+ function createStore(_namespace) {
294
+ const namespace = ((key) => addNamespace(_namespace, key));
295
+ return Object.assign(main.bind(null, namespace), {
296
+ add: (state) => addState(namespace, state, false),
297
+ addPersistent: (state) => addState(namespace, state, true),
298
+ get: (newNamespace) => getState(namespace, newNamespace),
299
+ set: async (changes) => await setState(namespace, changes),
300
+ reset: (keys) => resetState(namespace, keys),
301
+ onChange: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.addStateListener)(namespace, keys, cb),
302
+ removeListener: (keys, cb) => (0,_listeners__WEBPACK_IMPORTED_MODULE_4__.removeStateListener)(namespace, keys, cb),
303
+ setStorageUtils,
304
+ onStateChange,
305
+ });
306
+ }
307
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (createStore(""));
362
308
 
363
309
 
364
310
  /***/ },
365
311
 
366
- /***/ "./src/namespace.js"
312
+ /***/ "./src/listeners.ts"
367
313
  /*!**************************!*\
368
- !*** ./src/namespace.js ***!
314
+ !*** ./src/listeners.ts ***!
369
315
  \**************************/
370
316
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
371
317
 
372
318
  __webpack_require__.r(__webpack_exports__);
373
319
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
374
- /* harmony export */ addNamespace: () => (/* binding */ addNamespace),
375
- /* harmony export */ getByNamespace: () => (/* binding */ getByNamespace),
376
- /* harmony export */ namespacify: () => (/* binding */ namespacify),
377
- /* harmony export */ splitFullKey: () => (/* binding */ splitFullKey)
320
+ /* harmony export */ LISTENERS: () => (/* binding */ LISTENERS),
321
+ /* harmony export */ addStateListener: () => (/* binding */ addStateListener),
322
+ /* harmony export */ removeStateListener: () => (/* binding */ removeStateListener),
323
+ /* harmony export */ runStateChangeListeners: () => (/* binding */ runStateChangeListeners)
378
324
  /* harmony export */ });
379
- /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ "./src/helpers.js");
380
-
381
-
382
- const NAMESPACE_DELIMITER = "::";
383
-
384
- function addNamespace(namespace, str) {
385
- return `${namespace}${(0,_helpers__WEBPACK_IMPORTED_MODULE_0__.isString)(str) && NAMESPACE_DELIMITER || ""}${str || ""}`;
386
- }
387
-
388
- function splitFullKey (str) {
389
- const segments = str.split(NAMESPACE_DELIMITER);
390
-
391
- return [
392
- segments.slice(-1)[0],
393
- segments.slice(0, -1).join(NAMESPACE_DELIMITER),
394
- ];
395
- }
396
-
397
- function getByNamespace(str, obj) {
398
- const namespace = splitFullKey(str)[1] + NAMESPACE_DELIMITER;
399
-
400
- return Object.fromEntries(
401
- Object.entries(obj)
402
- .filter(([k, v]) => k.startsWith(namespace))
403
- .map(([k, v]) => [k.slice(namespace.length), v]),
404
- );
405
- }
406
-
407
- function namespacify (namespace, obj) {
408
- return Object.fromEntries(
409
- Object.entries(obj)
410
- .map(([k,v]) => [addNamespace(namespace, k), v]
411
- ));
412
- }
325
+ /* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.ts");
326
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
327
+ /* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ "./src/helpers.ts");
328
+
329
+
330
+
331
+ const LISTENERS = {};
332
+ async function runStateChangeListeners(realChanges) {
333
+ if (Object.keys(realChanges).length) {
334
+ const { namespace } = ___WEBPACK_IMPORTED_MODULE_0__.STATE[Object.keys(realChanges)[0]];
335
+ const stateValues = (0,___WEBPACK_IMPORTED_MODULE_0__.getValues)(namespace);
336
+ for (let [changeKey, change] of Object.entries(realChanges)) {
337
+ const { listeners, key } = ___WEBPACK_IMPORTED_MODULE_0__.STATE[changeKey];
338
+ for (const cb of listeners) {
339
+ await cb([key], stateValues, change);
340
+ }
341
+ }
342
+ const readableKeys = (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(realChanges, (k) => k.slice(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER.length));
343
+ for (const cb of LISTENERS[namespace()]) {
344
+ await cb(readableKeys, stateValues, (0,_helpers__WEBPACK_IMPORTED_MODULE_2__.map)(realChanges, (k, v) => [
345
+ k.slice(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER.length),
346
+ v,
347
+ ]));
348
+ }
349
+ }
350
+ }
351
+ function addStateListener(namespace, observables, cb) {
352
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables)) {
353
+ LISTENERS[namespace()].push(observables);
354
+ return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
355
+ }
356
+ observables.forEach((key) => ___WEBPACK_IMPORTED_MODULE_0__.STATE[namespace(key)].listeners?.push(cb));
357
+ return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
358
+ }
359
+ function removeStateListener(namespace, observables, removeCb) {
360
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isFunction)(observables)) {
361
+ const removeIdx = LISTENERS[namespace()].findIndex((cb) => cb === observables);
362
+ LISTENERS[namespace()].splice(removeIdx, 1);
363
+ return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
364
+ }
365
+ observables.forEach((key) => {
366
+ const listeners = ___WEBPACK_IMPORTED_MODULE_0__.STATE[namespace(key)].listeners;
367
+ const removeIdx = listeners?.findIndex((cb) => cb === removeCb);
368
+ listeners?.splice(removeIdx, 1);
369
+ });
370
+ return (0,___WEBPACK_IMPORTED_MODULE_0__.createStore)(namespace());
371
+ }
413
372
 
414
373
 
415
374
  /***/ },
416
375
 
417
- /***/ "./src/storage.js"
376
+ /***/ "./src/storage.ts"
418
377
  /*!************************!*\
419
- !*** ./src/storage.js ***!
378
+ !*** ./src/storage.ts ***!
420
379
  \************************/
421
380
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
422
381
 
@@ -424,44 +383,41 @@ __webpack_require__.r(__webpack_exports__);
424
383
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
425
384
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
426
385
  /* harmony export */ });
427
- function updateFromLocalStorage(state) {
428
- const stored = {};
429
- for (const key in state) {
430
- const value = localStorage.getItem(key);
431
- if (value !== null) {
432
- stored[key] = value;
433
- }
434
- }
435
-
436
- return Object.assign(state, stored);
437
- }
438
-
439
- function getStorageType(isPersistent) {
440
- return isPersistent && "localStorage";
441
- }
442
-
443
- function isStorageAvailable(storageType) {
444
- return storageType;
445
- }
446
-
447
- async function setStorageValue(storageType, key, value) {
448
- await window.localStorage.setItem(key, value);
449
- return false;
450
- }
451
-
452
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
453
- GET_TYPE: getStorageType,
454
- IS_AVAILABE: isStorageAvailable,
455
- UPDATE_STATE: updateFromLocalStorage,
456
- SET_VALUE: setStorageValue,
457
- });
386
+ async function updateFromLocalStorage(state) {
387
+ const stored = {};
388
+ for (const key in state) {
389
+ const value = localStorage.getItem(key);
390
+ if (value !== null) {
391
+ stored[key] = value;
392
+ }
393
+ }
394
+ return Object.assign(state, stored);
395
+ }
396
+ function getStorageType(isPersistent) {
397
+ return isPersistent ? "localStorage" : "";
398
+ }
399
+ function isStorageAvailable(storageType) {
400
+ return !!storageType;
401
+ }
402
+ async function setStorageValue(storageType, changes) {
403
+ for (let [k, v] of Object.entries(changes)) {
404
+ localStorage.setItem(k, v);
405
+ }
406
+ return false;
407
+ }
408
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
409
+ GET_TYPE: getStorageType,
410
+ IS_AVAILABE: isStorageAvailable,
411
+ UPDATE_STATE: updateFromLocalStorage,
412
+ SET_VALUES: setStorageValue,
413
+ });
458
414
 
459
415
 
460
416
  /***/ },
461
417
 
462
- /***/ "./src/validation.js"
418
+ /***/ "./src/validation.ts"
463
419
  /*!***************************!*\
464
- !*** ./src/validation.js ***!
420
+ !*** ./src/validation.ts ***!
465
421
  \***************************/
466
422
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
467
423
 
@@ -469,36 +425,30 @@ __webpack_require__.r(__webpack_exports__);
469
425
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
470
426
  /* harmony export */ isValid: () => (/* binding */ isValid)
471
427
  /* harmony export */ });
472
- /* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.js");
473
- /* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespace */ "./src/namespace.js");
474
-
475
-
476
-
477
-
478
- const isValid = {
479
- Setting: (fullKey) => {
480
- if (!___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
481
- const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
482
- throw new Error(
483
- `Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`,
484
- );
485
- }
486
-
487
- return true;
488
- },
489
-
490
- Defining: (fullKey) => {
491
- if (___WEBPACK_IMPORTED_MODULE_0__.ACCESSORS[fullKey]) {
492
- const [key, namespace] = (0,_namespace__WEBPACK_IMPORTED_MODULE_1__.splitFullKey)(fullKey);
493
- throw new Error(
494
- `Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`,
495
- );
496
- }
497
-
498
- return true;
499
- }
500
-
501
- };
428
+ /* harmony import */ var ___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! . */ "./src/index.ts");
429
+ /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
430
+
431
+
432
+ function splitFullKey(fullKey) {
433
+ const segments = fullKey.split(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER);
434
+ return [segments.slice(-1)[0], segments.join(_constants__WEBPACK_IMPORTED_MODULE_1__.NAMESPACE_DELIMITER)];
435
+ }
436
+ const isValid = {
437
+ Setting: (fullKey) => {
438
+ if (!___WEBPACK_IMPORTED_MODULE_0__.STATE[fullKey]) {
439
+ const [key, namespace] = splitFullKey(fullKey);
440
+ throw new Error(`Setting "${key}" key in "${namespace}" namespace. DOES NOT EXIST`);
441
+ }
442
+ return true;
443
+ },
444
+ Defining: (fullKey) => {
445
+ if (___WEBPACK_IMPORTED_MODULE_0__.STATE[fullKey]) {
446
+ const [key, namespace] = splitFullKey(fullKey);
447
+ throw new Error(`Redefining "${key}" key in "${namespace}" namespace. ALREADY DEFINED`);
448
+ }
449
+ return true;
450
+ },
451
+ };
502
452
 
503
453
 
504
454
  /***/ }
@@ -584,7 +534,7 @@ const isValid = {
584
534
  /******/ // startup
585
535
  /******/ // Load entry module and return exports
586
536
  /******/ // This entry module is referenced by other modules so it can't be inlined
587
- /******/ let __webpack_exports__ = __webpack_require__("./src/index.js");
537
+ /******/ let __webpack_exports__ = __webpack_require__("./src/index.ts");
588
538
  /******/ __webpack_exports__ = __webpack_exports__["default"];
589
539
  /******/
590
540
  /******/ return __webpack_exports__;