varstor 0.6.61 → 0.6.63

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