@hanzogui/use-store 3.0.5 → 4.3.1
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/cjs/comparators.cjs +18 -14
- package/dist/cjs/comparators.native.js +21 -17
- package/dist/cjs/comparators.native.js.map +1 -1
- package/dist/cjs/configureUseStore.cjs +12 -10
- package/dist/cjs/configureUseStore.native.js +12 -10
- package/dist/cjs/configureUseStore.native.js.map +1 -1
- package/dist/cjs/constants.cjs +17 -15
- package/dist/cjs/constants.native.js +17 -15
- package/dist/cjs/constants.native.js.map +1 -1
- package/dist/cjs/decorators.cjs +14 -11
- package/dist/cjs/decorators.native.js +14 -11
- package/dist/cjs/decorators.native.js.map +1 -1
- package/dist/cjs/helpers.cjs +28 -21
- package/dist/cjs/helpers.native.js +29 -23
- package/dist/cjs/helpers.native.js.map +1 -1
- package/dist/cjs/index.cjs +13 -11
- package/dist/cjs/index.native.js +30 -19
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/interfaces.cjs +7 -5
- package/dist/cjs/interfaces.native.js +7 -5
- package/dist/cjs/interfaces.native.js.map +1 -1
- package/dist/cjs/observe.cjs +105 -59
- package/dist/cjs/observe.native.js +159 -111
- package/dist/cjs/observe.native.js.map +1 -1
- package/dist/cjs/useStore.cjs +388 -201
- package/dist/cjs/useStore.native.js +562 -360
- package/dist/cjs/useStore.native.js.map +1 -1
- package/dist/cjs/useStoreDebug.cjs +42 -31
- package/dist/cjs/useStoreDebug.native.js +42 -36
- package/dist/cjs/useStoreDebug.native.js.map +1 -1
- package/dist/esm/comparators.mjs +6 -4
- package/dist/esm/comparators.mjs.map +1 -1
- package/dist/esm/comparators.native.js +9 -7
- package/dist/esm/comparators.native.js.map +1 -1
- package/dist/esm/constants.mjs +5 -5
- package/dist/esm/constants.mjs.map +1 -1
- package/dist/esm/constants.native.js +5 -5
- package/dist/esm/constants.native.js.map +1 -1
- package/dist/esm/decorators.mjs +2 -1
- package/dist/esm/decorators.mjs.map +1 -1
- package/dist/esm/decorators.native.js +2 -1
- package/dist/esm/decorators.native.js.map +1 -1
- package/dist/esm/helpers.mjs +16 -11
- package/dist/esm/helpers.mjs.map +1 -1
- package/dist/esm/helpers.native.js +17 -13
- package/dist/esm/helpers.native.js.map +1 -1
- package/dist/esm/index.native.js +17 -8
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/observe.mjs +77 -33
- package/dist/esm/observe.mjs.map +1 -1
- package/dist/esm/observe.native.js +128 -82
- package/dist/esm/observe.native.js.map +1 -1
- package/dist/esm/useStore.mjs +358 -173
- package/dist/esm/useStore.mjs.map +1 -1
- package/dist/esm/useStore.native.js +532 -332
- package/dist/esm/useStore.native.js.map +1 -1
- package/dist/esm/useStoreDebug.mjs +18 -9
- package/dist/esm/useStoreDebug.mjs.map +1 -1
- package/dist/esm/useStoreDebug.native.js +14 -10
- package/dist/esm/useStoreDebug.native.js.map +1 -1
- package/package.json +3 -3
- package/src/useStore.tsx +1 -1
package/dist/esm/useStore.mjs
CHANGED
|
@@ -11,26 +11,30 @@ function useStore(StoreKlass, props, options = defaultOptions) {
|
|
|
11
11
|
}
|
|
12
12
|
function useStoreDebug(StoreKlass, props) {
|
|
13
13
|
return useStore(StoreKlass, props, {
|
|
14
|
-
debug:
|
|
14
|
+
debug: true
|
|
15
15
|
});
|
|
16
16
|
}
|
|
17
17
|
function createStore(StoreKlass, props, options) {
|
|
18
18
|
return getOrCreateStoreInfo(StoreKlass, props, options)?.store;
|
|
19
19
|
}
|
|
20
20
|
function useGlobalStore(instance, debug) {
|
|
21
|
-
const store = instance[UNWRAP_PROXY]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (!info)
|
|
21
|
+
const store = instance[UNWRAP_PROXY];
|
|
22
|
+
const uid = getStoreUid(store.constructor, store.props);
|
|
23
|
+
const info = cache.get(uid);
|
|
24
|
+
if (!info) {
|
|
25
|
+
throw new Error(`This store not created using createStore()`);
|
|
26
|
+
}
|
|
25
27
|
return useStoreFromInfo(info, void 0, {
|
|
26
28
|
debug
|
|
27
29
|
});
|
|
28
30
|
}
|
|
29
31
|
function useGlobalStoreSelector(instance, selector, debug) {
|
|
30
|
-
const store = instance[UNWRAP_PROXY]
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (!info)
|
|
32
|
+
const store = instance[UNWRAP_PROXY];
|
|
33
|
+
const uid = getStoreUid(store.constructor, store.props);
|
|
34
|
+
const info = cache.get(uid);
|
|
35
|
+
if (!info) {
|
|
36
|
+
throw new Error(`This store not created using createStore()`);
|
|
37
|
+
}
|
|
34
38
|
return useStoreFromInfo(info, selector, {
|
|
35
39
|
debug
|
|
36
40
|
});
|
|
@@ -39,9 +43,11 @@ function createUseStore(StoreKlass) {
|
|
|
39
43
|
return (props, options) => useStore(StoreKlass, props, options);
|
|
40
44
|
}
|
|
41
45
|
function createUseStoreSelector(StoreKlass, selector) {
|
|
42
|
-
return props =>
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
return props => {
|
|
47
|
+
return useStore(StoreKlass, props, {
|
|
48
|
+
selector
|
|
49
|
+
});
|
|
50
|
+
};
|
|
45
51
|
}
|
|
46
52
|
function useStoreSelector(StoreKlass, selector, props) {
|
|
47
53
|
return useStore(StoreKlass, props, {
|
|
@@ -50,7 +56,8 @@ function useStoreSelector(StoreKlass, selector, props) {
|
|
|
50
56
|
}
|
|
51
57
|
const storeAccessTrackers = /* @__PURE__ */new Set();
|
|
52
58
|
function trackStoresAccess(cb) {
|
|
53
|
-
|
|
59
|
+
storeAccessTrackers.add(cb);
|
|
60
|
+
return () => {
|
|
54
61
|
storeAccessTrackers.delete(cb);
|
|
55
62
|
};
|
|
56
63
|
}
|
|
@@ -59,113 +66,155 @@ function getStore(StoreKlass, props) {
|
|
|
59
66
|
}
|
|
60
67
|
function getOrCreateStore(StoreKlass, props) {
|
|
61
68
|
return getOrCreateStoreInfo(StoreKlass, props, {
|
|
62
|
-
refuseCreation:
|
|
69
|
+
refuseCreation: false
|
|
63
70
|
})?.store;
|
|
64
71
|
}
|
|
65
72
|
function getStoreInfo(StoreKlass, props) {
|
|
66
73
|
return getOrCreateStoreInfo(StoreKlass, props, {
|
|
67
|
-
refuseCreation:
|
|
74
|
+
refuseCreation: true
|
|
68
75
|
});
|
|
69
76
|
}
|
|
70
77
|
const onCreateListeners = /* @__PURE__ */new Set();
|
|
71
78
|
function onCreateStore(cb) {
|
|
72
|
-
|
|
79
|
+
onCreateListeners.add(cb);
|
|
80
|
+
return () => {
|
|
73
81
|
onCreateListeners.delete(cb);
|
|
74
82
|
};
|
|
75
83
|
}
|
|
76
84
|
function getOrCreateStoreInfo(StoreKlass, props, options, propsKeyCalculated) {
|
|
77
|
-
if (!StoreKlass)
|
|
85
|
+
if (!StoreKlass) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
78
88
|
const uid = getStoreUid(StoreKlass, propsKeyCalculated ?? props);
|
|
79
|
-
if (!options?.avoidCache && cache.has(uid))
|
|
80
|
-
|
|
89
|
+
if (!options?.avoidCache && cache.has(uid)) {
|
|
90
|
+
return cache.get(uid);
|
|
91
|
+
}
|
|
92
|
+
if (options?.refuseCreation) {
|
|
93
|
+
throw new Error(`No store exists (${StoreKlass.name}) with props: ${props}`);
|
|
94
|
+
}
|
|
81
95
|
const storeInstance = new StoreKlass(props);
|
|
82
96
|
storeInstance.props = props;
|
|
83
|
-
const getters = {}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
97
|
+
const getters = {};
|
|
98
|
+
const actions = {};
|
|
99
|
+
const stateKeys = /* @__PURE__ */new Set();
|
|
100
|
+
const descriptors = getStoreDescriptors(storeInstance);
|
|
87
101
|
for (const key in descriptors) {
|
|
88
102
|
const descriptor = descriptors[key];
|
|
89
|
-
typeof descriptor.value
|
|
103
|
+
if (typeof descriptor.value === "function") {
|
|
104
|
+
actions[key] = descriptor.value;
|
|
105
|
+
} else if (typeof descriptor.get === "function") {
|
|
106
|
+
getters[key] = descriptor.get;
|
|
107
|
+
} else {
|
|
108
|
+
if (key !== "props" && key[0] !== "_") {
|
|
109
|
+
stateKeys.add(key);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
90
112
|
}
|
|
91
|
-
const keyComparators = storeInstance
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
const keyComparators = storeInstance["_comparators"];
|
|
114
|
+
const listeners = /* @__PURE__ */new Set();
|
|
115
|
+
const storeInfo = {
|
|
116
|
+
uid,
|
|
117
|
+
keyComparators,
|
|
118
|
+
storeInstance,
|
|
119
|
+
getters,
|
|
120
|
+
stateKeys,
|
|
121
|
+
props,
|
|
122
|
+
actions,
|
|
123
|
+
debug: options?.debug,
|
|
124
|
+
disableTracking: false,
|
|
125
|
+
gettersState: {
|
|
126
|
+
getCache: /* @__PURE__ */new Map(),
|
|
127
|
+
depsToGetter: /* @__PURE__ */new Map(),
|
|
128
|
+
curGetKeys: /* @__PURE__ */new Set(),
|
|
129
|
+
isGetting: false
|
|
130
|
+
},
|
|
131
|
+
listeners,
|
|
132
|
+
trackers: /* @__PURE__ */new Set(),
|
|
133
|
+
version: 0,
|
|
134
|
+
subscribe: onChanged => {
|
|
135
|
+
listeners.add(onChanged);
|
|
136
|
+
return () => {
|
|
113
137
|
listeners.delete(onChanged);
|
|
114
|
-
}
|
|
115
|
-
triggerUpdate: () => {
|
|
116
|
-
storeInfo.version = (storeInfo.version + 1) % Number.MAX_SAFE_INTEGER;
|
|
117
|
-
for (const cb of listeners) cb();
|
|
118
|
-
}
|
|
138
|
+
};
|
|
119
139
|
},
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
140
|
+
triggerUpdate: () => {
|
|
141
|
+
storeInfo.version = (storeInfo.version + 1) % Number.MAX_SAFE_INTEGER;
|
|
142
|
+
for (const cb of listeners) {
|
|
143
|
+
cb();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const store = createProxiedStore(
|
|
148
|
+
// we assign store right after and proxiedStore never accesses it until later on
|
|
149
|
+
storeInfo);
|
|
150
|
+
if (process.env.NODE_ENV === "development") {
|
|
151
|
+
allStores[StoreKlass.name + uid] = store;
|
|
152
|
+
}
|
|
153
|
+
store.mount?.();
|
|
154
|
+
storeInfo.store = store;
|
|
124
155
|
const result = storeInfo;
|
|
125
|
-
|
|
156
|
+
cache.set(uid, result);
|
|
157
|
+
onCreateListeners.forEach(cb => cb(result));
|
|
158
|
+
return result;
|
|
126
159
|
}
|
|
127
160
|
const allStores = {};
|
|
128
|
-
process.env.NODE_ENV === "development"
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
return
|
|
135
|
-
}
|
|
136
|
-
|
|
161
|
+
if (process.env.NODE_ENV === "development") {
|
|
162
|
+
globalThis["Store"] ||= allStores;
|
|
163
|
+
}
|
|
164
|
+
const emptyObj = {};
|
|
165
|
+
const selectKeys = (obj, keys) => {
|
|
166
|
+
if (!keys.length) {
|
|
167
|
+
return emptyObj;
|
|
168
|
+
}
|
|
169
|
+
const res = {};
|
|
170
|
+
for (const key of keys) {
|
|
171
|
+
res[key] = obj[key];
|
|
172
|
+
}
|
|
173
|
+
return res;
|
|
174
|
+
};
|
|
175
|
+
let isInReaction = false;
|
|
137
176
|
const setIsInReaction = val => {
|
|
138
177
|
isInReaction = val;
|
|
139
178
|
};
|
|
140
179
|
function useStoreFromInfo(info, userSelector, options) {
|
|
141
|
-
const store = info?.store
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
180
|
+
const store = info?.store;
|
|
181
|
+
const internal = React.useRef(void 0);
|
|
182
|
+
const component = useCurrentComponent();
|
|
183
|
+
if (!internal.current) {
|
|
184
|
+
internal.current = {
|
|
185
|
+
component,
|
|
186
|
+
tracked: /* @__PURE__ */new Set(),
|
|
187
|
+
last: null,
|
|
188
|
+
lastKeys: null
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const curInternal = internal.current;
|
|
192
|
+
const shouldPrintDebug = options?.debug;
|
|
193
|
+
const getSnapshot = React.useCallback(() => {
|
|
194
|
+
if (!info || !store) return;
|
|
195
|
+
const curInternal2 = internal.current;
|
|
196
|
+
const isTracking = curInternal2.tracked.size;
|
|
197
|
+
const keys = [...(!isTracking ? info.stateKeys : curInternal2.tracked)];
|
|
198
|
+
const nextKeys = `${info.version}${keys.join("")}${userSelector || ""}`;
|
|
199
|
+
const lastKeys = curInternal2.lastKeys;
|
|
200
|
+
if (nextKeys === curInternal2.lastKeys) {
|
|
201
|
+
return curInternal2.last;
|
|
202
|
+
}
|
|
203
|
+
curInternal2.lastKeys = nextKeys;
|
|
204
|
+
let snap;
|
|
205
|
+
info.disableTracking = true;
|
|
206
|
+
const last = curInternal2.last;
|
|
207
|
+
if (userSelector) {
|
|
208
|
+
snap = userSelector(store);
|
|
209
|
+
} else {
|
|
210
|
+
snap = selectKeys(store, keys);
|
|
211
|
+
}
|
|
212
|
+
info.disableTracking = false;
|
|
213
|
+
const isUnchanged = !userSelector && !isTracking && last || typeof last !== "undefined" && isEqualSubsetShallow(last, snap, {
|
|
214
|
+
keyComparators: info.keyComparators
|
|
215
|
+
});
|
|
216
|
+
if (shouldPrintDebug) {
|
|
217
|
+
console.info("\u{1F311} getSnapshot", {
|
|
169
218
|
storeState: selectKeys(store, Object.keys(store)),
|
|
170
219
|
userSelector,
|
|
171
220
|
info,
|
|
@@ -177,15 +226,38 @@ function useStoreFromInfo(info, userSelector, options) {
|
|
|
177
226
|
curInternal: curInternal2,
|
|
178
227
|
nextKeys,
|
|
179
228
|
lastKeys
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
if (isUnchanged) {
|
|
232
|
+
return last;
|
|
233
|
+
}
|
|
234
|
+
curInternal2.last = snap;
|
|
235
|
+
return snap;
|
|
236
|
+
}, [store]);
|
|
237
|
+
const state = React.useSyncExternalStore(info?.subscribe || idFn, getSnapshot, getSnapshot);
|
|
238
|
+
if (!info || !store || !state) {
|
|
239
|
+
return state;
|
|
240
|
+
}
|
|
241
|
+
if (userSelector) {
|
|
242
|
+
return state;
|
|
243
|
+
}
|
|
244
|
+
return new Proxy(store, {
|
|
184
245
|
get(target, key) {
|
|
185
246
|
const curVal = Reflect.get(target, key);
|
|
186
|
-
if (isInReaction)
|
|
247
|
+
if (isInReaction) {
|
|
248
|
+
return curVal;
|
|
249
|
+
}
|
|
187
250
|
const keyString = key;
|
|
188
|
-
|
|
251
|
+
if (info.stateKeys.has(keyString) || keyString in info.getters) {
|
|
252
|
+
if (shouldPrintDebug) {
|
|
253
|
+
console.info("\u{1F440} tracking", keyString);
|
|
254
|
+
}
|
|
255
|
+
curInternal.tracked.add(keyString);
|
|
256
|
+
}
|
|
257
|
+
if (Reflect.has(state, key)) {
|
|
258
|
+
return Reflect.get(state, key);
|
|
259
|
+
}
|
|
260
|
+
return curVal;
|
|
189
261
|
}
|
|
190
262
|
});
|
|
191
263
|
}
|
|
@@ -193,31 +265,47 @@ let setters = /* @__PURE__ */new Set();
|
|
|
193
265
|
const logStack = /* @__PURE__ */new Set();
|
|
194
266
|
function createProxiedStore(storeInfo) {
|
|
195
267
|
const {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
let didSet =
|
|
268
|
+
actions,
|
|
269
|
+
storeInstance,
|
|
270
|
+
getters,
|
|
271
|
+
gettersState
|
|
272
|
+
} = storeInfo;
|
|
273
|
+
const {
|
|
274
|
+
getCache,
|
|
275
|
+
curGetKeys,
|
|
276
|
+
depsToGetter
|
|
277
|
+
} = gettersState;
|
|
278
|
+
const constr = storeInstance.constructor;
|
|
279
|
+
const shouldDebug2 = storeInfo.debug ?? DebugStores.has(constr);
|
|
280
|
+
let didSet = false;
|
|
209
281
|
const wrappedActions = {};
|
|
210
282
|
for (const key in actions) {
|
|
211
|
-
if (key === "subscribe")
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
283
|
+
if (key === "subscribe") {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const actionFn = actions[key];
|
|
287
|
+
const isGetFn = key.startsWith("get");
|
|
288
|
+
wrappedActions[key] = function useStoreAction(...args) {
|
|
215
289
|
let res;
|
|
216
|
-
|
|
217
|
-
|
|
290
|
+
if (isGetFn || gettersState.isGetting) {
|
|
291
|
+
return Reflect.apply(actionFn, proxiedStore, args);
|
|
292
|
+
}
|
|
293
|
+
if (process.env.NODE_ENV === "development" && shouldDebug2) {
|
|
294
|
+
console.info("(debug) startAction", key);
|
|
295
|
+
}
|
|
296
|
+
res = Reflect.apply(actionFn, proxiedStore, args);
|
|
297
|
+
if (res instanceof Promise) {
|
|
298
|
+
return res.then(finishAction);
|
|
299
|
+
}
|
|
300
|
+
finishAction();
|
|
301
|
+
return res;
|
|
302
|
+
};
|
|
303
|
+
if (process.env.NODE_ENV === "development") {
|
|
218
304
|
let hashCode = function (str) {
|
|
219
305
|
let hash = 0;
|
|
220
|
-
for (let i = 0; i < str.length; i++)
|
|
306
|
+
for (let i = 0; i < str.length; i++) {
|
|
307
|
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
308
|
+
}
|
|
221
309
|
return hash;
|
|
222
310
|
},
|
|
223
311
|
strColor = function (str) {
|
|
@@ -228,29 +316,41 @@ function createProxiedStore(storeInfo) {
|
|
|
228
316
|
wrappedActions[key] = new Proxy(ogAction, {
|
|
229
317
|
apply(target, thisArg, args) {
|
|
230
318
|
const isDebugging = shouldDebug2 || storeInfo.debug;
|
|
231
|
-
|
|
319
|
+
const shouldLog = process.env.LOG_LEVEL !== "0" && (isDebugging || configureOpts.logLevel !== "error");
|
|
320
|
+
if (!shouldLog) {
|
|
321
|
+
return Reflect.apply(target, thisArg, args);
|
|
322
|
+
}
|
|
232
323
|
setters = /* @__PURE__ */new Set();
|
|
233
|
-
const curSetters = setters
|
|
234
|
-
|
|
235
|
-
|
|
324
|
+
const curSetters = setters;
|
|
325
|
+
const isTopLevelLogger = logStack.size == 0;
|
|
326
|
+
const logs = /* @__PURE__ */new Set();
|
|
236
327
|
logStack.add(logs);
|
|
237
328
|
let res;
|
|
238
329
|
const id = counter++;
|
|
239
330
|
try {
|
|
240
331
|
res = Reflect.apply(target, thisArg, args);
|
|
241
332
|
} catch (err) {
|
|
242
|
-
|
|
333
|
+
console.error("Error", err);
|
|
334
|
+
throw err;
|
|
243
335
|
} finally {
|
|
244
336
|
logStack.add("end");
|
|
245
|
-
const name = constr.name
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
337
|
+
const name = constr.name;
|
|
338
|
+
const color = strColor(name);
|
|
339
|
+
const simpleArgs = args.map(simpleStr);
|
|
340
|
+
logs.add([`%c \u{1F311} ${id} ${name.padStart(isTopLevelLogger ? 8 : 4)}%c.${key}(${simpleArgs.join(", ")})${isTopLevelLogger && logStack.size > 1 ? ` (+${logStack.size - 1})` : ""}`, `color: ${color};`, "color: black;"]);
|
|
341
|
+
if (curSetters.size) {
|
|
342
|
+
curSetters.forEach(({
|
|
343
|
+
key: key2,
|
|
344
|
+
value
|
|
345
|
+
}) => {
|
|
346
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
347
|
+
logs.add([` SET ${key2} ${value}`, value]);
|
|
348
|
+
} else {
|
|
349
|
+
logs.add([` SET ${key2}`, value]);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
if (isTopLevelLogger) {
|
|
254
354
|
let error = null;
|
|
255
355
|
try {
|
|
256
356
|
for (const item of logStack) {
|
|
@@ -260,15 +360,33 @@ function createProxiedStore(storeInfo) {
|
|
|
260
360
|
}
|
|
261
361
|
const [head, ...rest] = item;
|
|
262
362
|
if (head) {
|
|
263
|
-
console.groupCollapsed(...head)
|
|
264
|
-
|
|
265
|
-
|
|
363
|
+
console.groupCollapsed(...head);
|
|
364
|
+
console.groupCollapsed("...");
|
|
365
|
+
console.info("args", args);
|
|
366
|
+
console.info("response", res);
|
|
367
|
+
console.groupCollapsed("trace");
|
|
368
|
+
console.trace();
|
|
369
|
+
console.groupEnd();
|
|
370
|
+
console.groupEnd();
|
|
371
|
+
for (const [name2, ...log] of rest) {
|
|
372
|
+
console.groupCollapsed(name2);
|
|
373
|
+
console.info(...log);
|
|
374
|
+
console.groupEnd();
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
console.info("Weird log", head, ...rest);
|
|
378
|
+
}
|
|
266
379
|
}
|
|
267
380
|
} catch (err) {
|
|
268
381
|
error = err;
|
|
269
382
|
}
|
|
270
|
-
for (const _ of logStack)
|
|
271
|
-
|
|
383
|
+
for (const _ of logStack) {
|
|
384
|
+
console.groupEnd();
|
|
385
|
+
}
|
|
386
|
+
if (error) {
|
|
387
|
+
console.error(`error loggin`, error);
|
|
388
|
+
}
|
|
389
|
+
logStack.clear();
|
|
272
390
|
}
|
|
273
391
|
return res;
|
|
274
392
|
}
|
|
@@ -277,66 +395,133 @@ function createProxiedStore(storeInfo) {
|
|
|
277
395
|
}
|
|
278
396
|
}
|
|
279
397
|
}
|
|
280
|
-
const finishAction = val =>
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
398
|
+
const finishAction = val => {
|
|
399
|
+
if (process.env.NODE_ENV === "development" && shouldDebug2) {
|
|
400
|
+
console.info("(debug) finishAction", {
|
|
401
|
+
didSet
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
if (didSet) {
|
|
405
|
+
storeInfo.triggerUpdate();
|
|
406
|
+
didSet = false;
|
|
407
|
+
}
|
|
408
|
+
return val;
|
|
409
|
+
};
|
|
410
|
+
let isTriggering = false;
|
|
284
411
|
const proxiedStore = new Proxy(storeInstance, {
|
|
285
412
|
// GET
|
|
286
413
|
get(_, key) {
|
|
287
|
-
if (key in wrappedActions)
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if (key
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
414
|
+
if (key in wrappedActions) {
|
|
415
|
+
return wrappedActions[key];
|
|
416
|
+
}
|
|
417
|
+
if (key in passThroughKeys) {
|
|
418
|
+
return Reflect.get(storeInstance, key);
|
|
419
|
+
}
|
|
420
|
+
if (key === UNWRAP_PROXY) {
|
|
421
|
+
return storeInstance;
|
|
422
|
+
}
|
|
423
|
+
if (key === UNWRAP_STORE_INFO) {
|
|
424
|
+
return storeInfo;
|
|
425
|
+
}
|
|
426
|
+
if (storeAccessTrackers.size) {
|
|
427
|
+
storeAccessTrackers.forEach(cb => cb(storeInfo));
|
|
428
|
+
}
|
|
429
|
+
if (typeof key !== "string") {
|
|
430
|
+
return Reflect.get(storeInstance, key);
|
|
431
|
+
}
|
|
432
|
+
if (!storeInfo.disableTracking) {
|
|
433
|
+
if (gettersState.isGetting) {
|
|
434
|
+
gettersState.curGetKeys.add(key);
|
|
435
|
+
} else {}
|
|
436
|
+
}
|
|
437
|
+
if (key in getters) {
|
|
438
|
+
if (getCache.has(key)) {
|
|
439
|
+
return getCache.get(key);
|
|
440
|
+
}
|
|
294
441
|
curGetKeys.clear();
|
|
295
442
|
const isSubGetter = gettersState.isGetting;
|
|
296
|
-
gettersState.isGetting =
|
|
443
|
+
gettersState.isGetting = true;
|
|
297
444
|
const res = getters[key].call(proxiedStore);
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
445
|
+
if (!isSubGetter) {
|
|
446
|
+
gettersState.isGetting = false;
|
|
447
|
+
}
|
|
448
|
+
for (const gk of curGetKeys) {
|
|
449
|
+
if (!depsToGetter.has(gk)) {
|
|
450
|
+
depsToGetter.set(gk, /* @__PURE__ */new Set());
|
|
451
|
+
}
|
|
452
|
+
const cur = depsToGetter.get(gk);
|
|
453
|
+
cur.add(key);
|
|
454
|
+
}
|
|
455
|
+
getCache.set(key, res);
|
|
456
|
+
return res;
|
|
301
457
|
}
|
|
302
458
|
return Reflect.get(storeInstance, key);
|
|
303
459
|
},
|
|
304
460
|
// SET
|
|
305
461
|
set(target, key, value, receiver) {
|
|
306
|
-
const cur = Reflect.get(target, key)
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
key
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
462
|
+
const cur = Reflect.get(target, key);
|
|
463
|
+
const res = Reflect.set(target, key, value, receiver);
|
|
464
|
+
if (res && cur !== value) {
|
|
465
|
+
if (typeof key === "string") {
|
|
466
|
+
clearGetterCache(key);
|
|
467
|
+
if (shouldDebug2) {
|
|
468
|
+
setters.add({
|
|
469
|
+
key,
|
|
470
|
+
value
|
|
471
|
+
});
|
|
472
|
+
if (getShouldDebug(storeInfo)) {
|
|
473
|
+
console.info("(debug) SET", res, key, value);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (process.env.NODE_ENV === "development" && shouldDebug2) {
|
|
477
|
+
console.info("SET...", {
|
|
478
|
+
key,
|
|
479
|
+
value
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (!isTriggering) {
|
|
484
|
+
isTriggering = true;
|
|
485
|
+
waitForEventLoop(() => {
|
|
486
|
+
storeInfo.triggerUpdate();
|
|
487
|
+
isTriggering = false;
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return res;
|
|
317
492
|
}
|
|
318
493
|
});
|
|
319
494
|
function clearGetterCache(setKey) {
|
|
320
495
|
const parentGetters = depsToGetter.get(setKey);
|
|
321
|
-
|
|
496
|
+
getCache.delete(setKey);
|
|
497
|
+
if (!parentGetters) {
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
for (const gk of parentGetters) {
|
|
501
|
+
getCache.delete(gk);
|
|
502
|
+
if (depsToGetter.has(gk)) {
|
|
503
|
+
clearGetterCache(gk);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
322
506
|
}
|
|
323
507
|
return proxiedStore;
|
|
324
508
|
}
|
|
325
|
-
const waitForEventLoop = process.env.NODE_ENV === "test" ? cb => cb() : queueMicrotask;
|
|
509
|
+
const waitForEventLoop = process.env.NODE_ENV === "test" || false ? cb => cb() : queueMicrotask;
|
|
326
510
|
let counter = 0;
|
|
327
511
|
const passThroughKeys = {
|
|
328
|
-
subscribe:
|
|
329
|
-
_version:
|
|
330
|
-
_trackers:
|
|
331
|
-
$$typeof:
|
|
332
|
-
_listeners:
|
|
333
|
-
_enableTracking:
|
|
512
|
+
subscribe: true,
|
|
513
|
+
_version: true,
|
|
514
|
+
_trackers: true,
|
|
515
|
+
$$typeof: true,
|
|
516
|
+
_listeners: true,
|
|
517
|
+
_enableTracking: true
|
|
334
518
|
};
|
|
335
519
|
function getShouldDebug(storeInfo) {
|
|
336
520
|
const info = {
|
|
337
521
|
storeInstance: storeInfo.store
|
|
338
522
|
};
|
|
339
|
-
|
|
523
|
+
const trackers = storeInfo.trackers;
|
|
524
|
+
return [...trackers].some(tracker => tracker.component && shouldDebug(tracker.component, info));
|
|
340
525
|
}
|
|
341
526
|
export { allStores, createStore, createUseStore, createUseStoreSelector, getOrCreateStore, getStore, getStoreInfo, onCreateStore, setIsInReaction, trackStoresAccess, useGlobalStore, useGlobalStoreSelector, useStore, useStoreDebug, useStoreSelector };
|
|
342
527
|
//# sourceMappingURL=useStore.mjs.map
|