@wordpress/data 9.9.0 → 9.10.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/CHANGELOG.md +6 -0
- package/build/components/async-mode-provider/context.js +2 -3
- package/build/components/async-mode-provider/context.js.map +1 -1
- package/build/components/async-mode-provider/index.js +0 -5
- package/build/components/async-mode-provider/index.js.map +1 -1
- package/build/components/async-mode-provider/use-async-mode.js +1 -3
- package/build/components/async-mode-provider/use-async-mode.js.map +1 -1
- package/build/components/registry-provider/context.js +3 -6
- package/build/components/registry-provider/context.js.map +1 -1
- package/build/components/registry-provider/index.js +0 -5
- package/build/components/registry-provider/index.js.map +1 -1
- package/build/components/registry-provider/use-registry.js +0 -3
- package/build/components/registry-provider/use-registry.js.map +1 -1
- package/build/components/use-dispatch/index.js +0 -3
- package/build/components/use-dispatch/index.js.map +1 -1
- package/build/components/use-dispatch/use-dispatch-with-map.js +0 -7
- package/build/components/use-dispatch/use-dispatch-with-map.js.map +1 -1
- package/build/components/use-dispatch/use-dispatch.js +0 -5
- package/build/components/use-dispatch/use-dispatch.js.map +1 -1
- package/build/components/use-select/index.js +35 -53
- package/build/components/use-select/index.js.map +1 -1
- package/build/components/with-dispatch/index.js +2 -7
- package/build/components/with-dispatch/index.js.map +1 -1
- package/build/components/with-registry/index.js +2 -5
- package/build/components/with-registry/index.js.map +1 -1
- package/build/components/with-select/index.js +2 -8
- package/build/components/with-select/index.js.map +1 -1
- package/build/controls.js +4 -10
- package/build/controls.js.map +1 -1
- package/build/default-registry.js +0 -3
- package/build/default-registry.js.map +1 -1
- package/build/dispatch.js +0 -3
- package/build/dispatch.js.map +1 -1
- package/build/factory.js +2 -5
- package/build/factory.js.map +1 -1
- package/build/index.js +7 -28
- package/build/index.js.map +1 -1
- package/build/lock-unlock.js +1 -2
- package/build/lock-unlock.js.map +1 -1
- package/build/plugins/index.js +0 -2
- package/build/plugins/index.js.map +1 -1
- package/build/plugins/persistence/index.js +13 -37
- package/build/plugins/persistence/index.js.map +1 -1
- package/build/plugins/persistence/storage/default.js +1 -5
- package/build/plugins/persistence/storage/default.js.map +1 -1
- package/build/plugins/persistence/storage/object.js +0 -5
- package/build/plugins/persistence/storage/object.js.map +1 -1
- package/build/promise-middleware.js +0 -5
- package/build/promise-middleware.js.map +1 -1
- package/build/redux-store/index.js +36 -117
- package/build/redux-store/index.js.map +1 -1
- package/build/redux-store/metadata/actions.js +8 -17
- package/build/redux-store/metadata/actions.js.map +1 -1
- package/build/redux-store/metadata/equivalent-key-map.d.js.map +1 -1
- package/build/redux-store/metadata/reducer.js +1 -23
- package/build/redux-store/metadata/reducer.js.map +1 -1
- package/build/redux-store/metadata/selectors.js +8 -22
- package/build/redux-store/metadata/selectors.js.map +1 -1
- package/build/redux-store/metadata/utils.js +6 -14
- package/build/redux-store/metadata/utils.js.map +1 -1
- package/build/redux-store/thunk-middleware.js +0 -2
- package/build/redux-store/thunk-middleware.js.map +1 -1
- package/build/registry.js +29 -73
- package/build/registry.js.map +1 -1
- package/build/resolvers-cache-middleware.js +2 -8
- package/build/resolvers-cache-middleware.js.map +1 -1
- package/build/select.js +0 -3
- package/build/select.js.map +1 -1
- package/build/store/index.js +0 -7
- package/build/store/index.js.map +1 -1
- package/build/types.js.map +1 -1
- package/build/utils/emitter.js +2 -11
- package/build/utils/emitter.js.map +1 -1
- package/build-module/components/async-mode-provider/context.js +1 -1
- package/build-module/components/async-mode-provider/context.js.map +1 -1
- package/build-module/components/async-mode-provider/index.js.map +1 -1
- package/build-module/components/async-mode-provider/use-async-mode.js +1 -1
- package/build-module/components/async-mode-provider/use-async-mode.js.map +1 -1
- package/build-module/components/registry-provider/context.js +3 -3
- package/build-module/components/registry-provider/context.js.map +1 -1
- package/build-module/components/registry-provider/index.js.map +1 -1
- package/build-module/components/registry-provider/use-registry.js +2 -2
- package/build-module/components/registry-provider/use-registry.js.map +1 -1
- package/build-module/components/use-dispatch/index.js.map +1 -1
- package/build-module/components/use-dispatch/use-dispatch-with-map.js +2 -4
- package/build-module/components/use-dispatch/use-dispatch-with-map.js.map +1 -1
- package/build-module/components/use-dispatch/use-dispatch.js +1 -3
- package/build-module/components/use-dispatch/use-dispatch.js.map +1 -1
- package/build-module/components/use-select/index.js +35 -46
- package/build-module/components/use-select/index.js.map +1 -1
- package/build-module/components/with-dispatch/index.js +4 -6
- package/build-module/components/with-dispatch/index.js.map +1 -1
- package/build-module/components/with-registry/index.js +4 -4
- package/build-module/components/with-registry/index.js.map +1 -1
- package/build-module/components/with-select/index.js +4 -6
- package/build-module/components/with-select/index.js.map +1 -1
- package/build-module/controls.js +4 -8
- package/build-module/controls.js.map +1 -1
- package/build-module/default-registry.js.map +1 -1
- package/build-module/dispatch.js +2 -1
- package/build-module/dispatch.js.map +1 -1
- package/build-module/factory.js +2 -3
- package/build-module/factory.js.map +1 -1
- package/build-module/index.js +11 -10
- package/build-module/index.js.map +1 -1
- package/build-module/lock-unlock.js.map +1 -1
- package/build-module/plugins/index.js.map +1 -1
- package/build-module/plugins/persistence/index.js +15 -30
- package/build-module/plugins/persistence/index.js.map +1 -1
- package/build-module/plugins/persistence/storage/default.js +0 -2
- package/build-module/plugins/persistence/storage/default.js.map +1 -1
- package/build-module/plugins/persistence/storage/object.js +0 -5
- package/build-module/plugins/persistence/storage/object.js.map +1 -1
- package/build-module/promise-middleware.js +1 -3
- package/build-module/promise-middleware.js.map +1 -1
- package/build-module/redux-store/index.js +38 -101
- package/build-module/redux-store/index.js.map +1 -1
- package/build-module/redux-store/metadata/actions.js +8 -8
- package/build-module/redux-store/metadata/actions.js.map +1 -1
- package/build-module/redux-store/metadata/equivalent-key-map.d.js.map +1 -1
- package/build-module/redux-store/metadata/reducer.js +1 -21
- package/build-module/redux-store/metadata/reducer.js.map +1 -1
- package/build-module/redux-store/metadata/selectors.js +9 -13
- package/build-module/redux-store/metadata/selectors.js.map +1 -1
- package/build-module/redux-store/metadata/utils.js +6 -11
- package/build-module/redux-store/metadata/utils.js.map +1 -1
- package/build-module/redux-store/thunk-middleware.js +0 -1
- package/build-module/redux-store/thunk-middleware.js.map +1 -1
- package/build-module/registry.js +30 -67
- package/build-module/registry.js.map +1 -1
- package/build-module/resolvers-cache-middleware.js +3 -6
- package/build-module/resolvers-cache-middleware.js.map +1 -1
- package/build-module/select.js +2 -1
- package/build-module/select.js.map +1 -1
- package/build-module/store/index.js +0 -7
- package/build-module/store/index.js.map +1 -1
- package/build-module/types.js.map +1 -1
- package/build-module/utils/emitter.js +2 -10
- package/build-module/utils/emitter.js.map +1 -1
- package/build-types/components/use-select/index.d.ts.map +1 -1
- package/build-types/index.d.ts +1 -1
- package/build-types/index.d.ts.map +1 -1
- package/build-types/plugins/persistence/index.d.ts.map +1 -1
- package/build-types/store/index.d.ts +1 -1
- package/package.json +9 -9
- package/src/components/use-select/index.js +14 -0
- package/src/plugins/persistence/index.js +0 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,42 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = createReduxStore;
|
|
9
|
-
|
|
10
8
|
var _redux = require("redux");
|
|
11
|
-
|
|
12
9
|
var _turboCombineReducers = _interopRequireDefault(require("turbo-combine-reducers"));
|
|
13
|
-
|
|
14
10
|
var _equivalentKeyMap = _interopRequireDefault(require("equivalent-key-map"));
|
|
15
|
-
|
|
16
11
|
var _reduxRoutine = _interopRequireDefault(require("@wordpress/redux-routine"));
|
|
17
|
-
|
|
18
12
|
var _compose = require("@wordpress/compose");
|
|
19
|
-
|
|
20
13
|
var _controls = require("../controls");
|
|
21
|
-
|
|
22
14
|
var _lockUnlock = require("../lock-unlock");
|
|
23
|
-
|
|
24
15
|
var _promiseMiddleware = _interopRequireDefault(require("../promise-middleware"));
|
|
25
|
-
|
|
26
16
|
var _resolversCacheMiddleware = _interopRequireDefault(require("../resolvers-cache-middleware"));
|
|
27
|
-
|
|
28
17
|
var _thunkMiddleware = _interopRequireDefault(require("./thunk-middleware"));
|
|
29
|
-
|
|
30
18
|
var _reducer = _interopRequireDefault(require("./metadata/reducer"));
|
|
31
|
-
|
|
32
19
|
var metadataSelectors = _interopRequireWildcard(require("./metadata/selectors"));
|
|
33
|
-
|
|
34
20
|
var metadataActions = _interopRequireWildcard(require("./metadata/actions"));
|
|
35
|
-
|
|
36
21
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
37
|
-
|
|
38
22
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
39
|
-
|
|
40
23
|
/**
|
|
41
24
|
* External dependencies
|
|
42
25
|
*/
|
|
@@ -50,31 +33,28 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
50
33
|
*/
|
|
51
34
|
|
|
52
35
|
/** @typedef {import('../types').DataRegistry} DataRegistry */
|
|
53
|
-
|
|
54
36
|
/** @typedef {import('../types').ListenerFunction} ListenerFunction */
|
|
55
|
-
|
|
56
37
|
/**
|
|
57
38
|
* @typedef {import('../types').StoreDescriptor<C>} StoreDescriptor
|
|
58
39
|
* @template {import('../types').AnyConfig} C
|
|
59
40
|
*/
|
|
60
|
-
|
|
61
41
|
/**
|
|
62
42
|
* @typedef {import('../types').ReduxStoreConfig<State,Actions,Selectors>} ReduxStoreConfig
|
|
63
43
|
* @template State
|
|
64
44
|
* @template {Record<string,import('../../types').ActionCreator>} Actions
|
|
65
45
|
* @template Selectors
|
|
66
46
|
*/
|
|
47
|
+
|
|
67
48
|
const trimUndefinedValues = array => {
|
|
68
49
|
const result = [...array];
|
|
69
|
-
|
|
70
50
|
for (let i = result.length - 1; i >= 0; i--) {
|
|
71
51
|
if (result[i] === undefined) {
|
|
72
52
|
result.splice(i, 1);
|
|
73
53
|
}
|
|
74
54
|
}
|
|
75
|
-
|
|
76
55
|
return result;
|
|
77
56
|
};
|
|
57
|
+
|
|
78
58
|
/**
|
|
79
59
|
* Creates a new object with the same keys, but with `callback()` called as
|
|
80
60
|
* a transformer function on each of the values.
|
|
@@ -83,65 +63,54 @@ const trimUndefinedValues = array => {
|
|
|
83
63
|
* @param {Function} callback The function to transform each object value.
|
|
84
64
|
* @return {Array} Transformed object.
|
|
85
65
|
*/
|
|
66
|
+
const mapValues = (obj, callback) => Object.fromEntries(Object.entries(obj !== null && obj !== void 0 ? obj : {}).map(([key, value]) => [key, callback(value, key)]));
|
|
86
67
|
|
|
87
|
-
|
|
88
|
-
const mapValues = (obj, callback) => Object.fromEntries(Object.entries(obj !== null && obj !== void 0 ? obj : {}).map(([key, value]) => [key, callback(value, key)])); // Convert Map objects to plain objects
|
|
89
|
-
|
|
90
|
-
|
|
68
|
+
// Convert Map objects to plain objects
|
|
91
69
|
const mapToObject = (key, state) => {
|
|
92
70
|
if (state instanceof Map) {
|
|
93
71
|
return Object.fromEntries(state);
|
|
94
72
|
}
|
|
95
|
-
|
|
96
73
|
return state;
|
|
97
74
|
};
|
|
75
|
+
|
|
98
76
|
/**
|
|
99
77
|
* Create a cache to track whether resolvers started running or not.
|
|
100
78
|
*
|
|
101
79
|
* @return {Object} Resolvers Cache.
|
|
102
80
|
*/
|
|
103
|
-
|
|
104
|
-
|
|
105
81
|
function createResolversCache() {
|
|
106
82
|
const cache = {};
|
|
107
83
|
return {
|
|
108
84
|
isRunning(selectorName, args) {
|
|
109
85
|
return cache[selectorName] && cache[selectorName].get(trimUndefinedValues(args));
|
|
110
86
|
},
|
|
111
|
-
|
|
112
87
|
clear(selectorName, args) {
|
|
113
88
|
if (cache[selectorName]) {
|
|
114
89
|
cache[selectorName].delete(trimUndefinedValues(args));
|
|
115
90
|
}
|
|
116
91
|
},
|
|
117
|
-
|
|
118
92
|
markAsRunning(selectorName, args) {
|
|
119
93
|
if (!cache[selectorName]) {
|
|
120
94
|
cache[selectorName] = new _equivalentKeyMap.default();
|
|
121
95
|
}
|
|
122
|
-
|
|
123
96
|
cache[selectorName].set(trimUndefinedValues(args), true);
|
|
124
97
|
}
|
|
125
|
-
|
|
126
98
|
};
|
|
127
99
|
}
|
|
128
|
-
|
|
129
100
|
function createBindingCache(bind) {
|
|
130
101
|
const cache = new WeakMap();
|
|
131
102
|
return {
|
|
132
103
|
get(item, itemName) {
|
|
133
104
|
let boundItem = cache.get(item);
|
|
134
|
-
|
|
135
105
|
if (!boundItem) {
|
|
136
106
|
boundItem = bind(item, itemName);
|
|
137
107
|
cache.set(item, boundItem);
|
|
138
108
|
}
|
|
139
|
-
|
|
140
109
|
return boundItem;
|
|
141
110
|
}
|
|
142
|
-
|
|
143
111
|
};
|
|
144
112
|
}
|
|
113
|
+
|
|
145
114
|
/**
|
|
146
115
|
* Creates a data store descriptor for the provided Redux store configuration containing
|
|
147
116
|
* properties describing reducer, actions, selectors, controls and resolvers.
|
|
@@ -168,8 +137,6 @@ function createBindingCache(bind) {
|
|
|
168
137
|
*
|
|
169
138
|
* @return {StoreDescriptor<ReduxStoreConfig<State,Actions,Selectors>>} Store Object.
|
|
170
139
|
*/
|
|
171
|
-
|
|
172
|
-
|
|
173
140
|
function createReduxStore(key, options) {
|
|
174
141
|
const privateActions = {};
|
|
175
142
|
const privateSelectors = {};
|
|
@@ -202,31 +169,26 @@ function createReduxStore(key, options) {
|
|
|
202
169
|
const reducer = options.reducer;
|
|
203
170
|
const thunkArgs = {
|
|
204
171
|
registry,
|
|
205
|
-
|
|
206
172
|
get dispatch() {
|
|
207
173
|
return thunkActions;
|
|
208
174
|
},
|
|
209
|
-
|
|
210
175
|
get select() {
|
|
211
176
|
return thunkSelectors;
|
|
212
177
|
},
|
|
213
|
-
|
|
214
178
|
get resolveSelect() {
|
|
215
179
|
return getResolveSelectors();
|
|
216
180
|
}
|
|
217
|
-
|
|
218
181
|
};
|
|
219
|
-
const store = instantiateReduxStore(key, options, registry, thunkArgs);
|
|
182
|
+
const store = instantiateReduxStore(key, options, registry, thunkArgs);
|
|
183
|
+
// Expose the private registration functions on the store
|
|
220
184
|
// so they can be copied to a sub registry in registry.js.
|
|
221
|
-
|
|
222
185
|
(0, _lockUnlock.lock)(store, privateRegistrationFunctions);
|
|
223
186
|
const resolversCache = createResolversCache();
|
|
224
|
-
|
|
225
187
|
function bindAction(action) {
|
|
226
188
|
return (...args) => Promise.resolve(store.dispatch(action(...args)));
|
|
227
189
|
}
|
|
228
|
-
|
|
229
|
-
|
|
190
|
+
const actions = {
|
|
191
|
+
...mapValues(metadataActions, bindAction),
|
|
230
192
|
...mapValues(options.actions, bindAction)
|
|
231
193
|
};
|
|
232
194
|
const boundPrivateActions = createBindingCache(bindAction);
|
|
@@ -241,49 +203,40 @@ function createReduxStore(key, options) {
|
|
|
241
203
|
});
|
|
242
204
|
(0, _lockUnlock.lock)(actions, allActions);
|
|
243
205
|
const resolvers = options.resolvers ? mapResolvers(options.resolvers) : {};
|
|
244
|
-
|
|
245
206
|
function bindSelector(selector, selectorName) {
|
|
246
207
|
if (selector.isRegistrySelector) {
|
|
247
208
|
selector.registry = registry;
|
|
248
209
|
}
|
|
249
|
-
|
|
250
210
|
const boundSelector = (...args) => {
|
|
251
211
|
const state = store.__unstableOriginalGetState();
|
|
252
|
-
|
|
253
212
|
return selector(state.root, ...args);
|
|
254
213
|
};
|
|
255
|
-
|
|
256
214
|
const resolver = resolvers[selectorName];
|
|
257
|
-
|
|
258
215
|
if (!resolver) {
|
|
259
216
|
boundSelector.hasResolver = false;
|
|
260
217
|
return boundSelector;
|
|
261
218
|
}
|
|
262
|
-
|
|
263
219
|
return mapSelectorWithResolver(boundSelector, selectorName, resolver, store, resolversCache);
|
|
264
220
|
}
|
|
265
|
-
|
|
266
221
|
function bindMetadataSelector(selector) {
|
|
267
222
|
const boundSelector = (...args) => {
|
|
268
223
|
const state = store.__unstableOriginalGetState();
|
|
269
|
-
|
|
270
224
|
return selector(state.metadata, ...args);
|
|
271
225
|
};
|
|
272
|
-
|
|
273
226
|
boundSelector.hasResolver = false;
|
|
274
227
|
return boundSelector;
|
|
275
228
|
}
|
|
276
|
-
|
|
277
|
-
|
|
229
|
+
const selectors = {
|
|
230
|
+
...mapValues(metadataSelectors, bindMetadataSelector),
|
|
278
231
|
...mapValues(options.selectors, bindSelector)
|
|
279
232
|
};
|
|
280
|
-
const boundPrivateSelectors = createBindingCache(bindSelector);
|
|
281
|
-
// instantiation, so that registry selectors are bound to the registry.
|
|
233
|
+
const boundPrivateSelectors = createBindingCache(bindSelector);
|
|
282
234
|
|
|
235
|
+
// Pre-bind the private selectors that have been registered by the time of
|
|
236
|
+
// instantiation, so that registry selectors are bound to the registry.
|
|
283
237
|
for (const [selectorName, selector] of Object.entries(privateSelectors)) {
|
|
284
238
|
boundPrivateSelectors.get(selector, selectorName);
|
|
285
239
|
}
|
|
286
|
-
|
|
287
240
|
const allSelectors = new Proxy(() => {}, {
|
|
288
241
|
get: (target, prop) => {
|
|
289
242
|
const privateSelector = privateSelectors[prop];
|
|
@@ -296,45 +249,37 @@ function createReduxStore(key, options) {
|
|
|
296
249
|
(0, _lockUnlock.lock)(selectors, allSelectors);
|
|
297
250
|
const resolveSelectors = mapResolveSelectors(selectors, store);
|
|
298
251
|
const suspendSelectors = mapSuspendSelectors(selectors, store);
|
|
299
|
-
|
|
300
252
|
const getSelectors = () => selectors;
|
|
301
|
-
|
|
302
253
|
const getActions = () => actions;
|
|
303
|
-
|
|
304
254
|
const getResolveSelectors = () => resolveSelectors;
|
|
255
|
+
const getSuspendSelectors = () => suspendSelectors;
|
|
305
256
|
|
|
306
|
-
|
|
257
|
+
// We have some modules monkey-patching the store object
|
|
307
258
|
// It's wrong to do so but until we refactor all of our effects to controls
|
|
308
259
|
// We need to keep the same "store" instance here.
|
|
309
|
-
|
|
310
|
-
|
|
311
260
|
store.__unstableOriginalGetState = store.getState;
|
|
261
|
+
store.getState = () => store.__unstableOriginalGetState().root;
|
|
312
262
|
|
|
313
|
-
|
|
263
|
+
// Customize subscribe behavior to call listeners only on effective change,
|
|
314
264
|
// not on every dispatch.
|
|
315
|
-
|
|
316
|
-
|
|
317
265
|
const subscribe = store && (listener => {
|
|
318
266
|
listeners.add(listener);
|
|
319
267
|
return () => listeners.delete(listener);
|
|
320
268
|
});
|
|
321
|
-
|
|
322
269
|
let lastState = store.__unstableOriginalGetState();
|
|
323
|
-
|
|
324
270
|
store.subscribe(() => {
|
|
325
271
|
const state = store.__unstableOriginalGetState();
|
|
326
|
-
|
|
327
272
|
const hasChanged = state !== lastState;
|
|
328
273
|
lastState = state;
|
|
329
|
-
|
|
330
274
|
if (hasChanged) {
|
|
331
275
|
for (const listener of listeners) {
|
|
332
276
|
listener();
|
|
333
277
|
}
|
|
334
278
|
}
|
|
335
|
-
});
|
|
336
|
-
// Once we remove the use function.
|
|
279
|
+
});
|
|
337
280
|
|
|
281
|
+
// This can be simplified to just { subscribe, getSelectors, getActions }
|
|
282
|
+
// Once we remove the use function.
|
|
338
283
|
return {
|
|
339
284
|
reducer,
|
|
340
285
|
store,
|
|
@@ -348,13 +293,15 @@ function createReduxStore(key, options) {
|
|
|
348
293
|
subscribe
|
|
349
294
|
};
|
|
350
295
|
}
|
|
351
|
-
};
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// Expose the private registration functions on the store
|
|
352
299
|
// descriptor. That's a natural choice since that's where the
|
|
353
300
|
// public actions and selectors are stored .
|
|
354
|
-
|
|
355
301
|
(0, _lockUnlock.lock)(storeDescriptor, privateRegistrationFunctions);
|
|
356
302
|
return storeDescriptor;
|
|
357
303
|
}
|
|
304
|
+
|
|
358
305
|
/**
|
|
359
306
|
* Creates a redux store for a namespace.
|
|
360
307
|
*
|
|
@@ -366,16 +313,14 @@ function createReduxStore(key, options) {
|
|
|
366
313
|
* @param {Object} thunkArgs Argument object for the thunk middleware.
|
|
367
314
|
* @return {Object} Newly created redux store.
|
|
368
315
|
*/
|
|
369
|
-
|
|
370
|
-
|
|
371
316
|
function instantiateReduxStore(key, options, registry, thunkArgs) {
|
|
372
|
-
const controls = {
|
|
317
|
+
const controls = {
|
|
318
|
+
...options.controls,
|
|
373
319
|
..._controls.builtinControls
|
|
374
320
|
};
|
|
375
321
|
const normalizedControls = mapValues(controls, control => control.isRegistryControl ? control(registry) : control);
|
|
376
322
|
const middlewares = [(0, _resolversCacheMiddleware.default)(registry, key), _promiseMiddleware.default, (0, _reduxRoutine.default)(normalizedControls), (0, _thunkMiddleware.default)(thunkArgs)];
|
|
377
323
|
const enhancers = [(0, _redux.applyMiddleware)(...middlewares)];
|
|
378
|
-
|
|
379
324
|
if (typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__) {
|
|
380
325
|
enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__({
|
|
381
326
|
name: key,
|
|
@@ -385,7 +330,6 @@ function instantiateReduxStore(key, options, registry, thunkArgs) {
|
|
|
385
330
|
}
|
|
386
331
|
}));
|
|
387
332
|
}
|
|
388
|
-
|
|
389
333
|
const {
|
|
390
334
|
reducer,
|
|
391
335
|
initialState
|
|
@@ -398,6 +342,7 @@ function instantiateReduxStore(key, options, registry, thunkArgs) {
|
|
|
398
342
|
root: initialState
|
|
399
343
|
}, (0, _compose.compose)(enhancers));
|
|
400
344
|
}
|
|
345
|
+
|
|
401
346
|
/**
|
|
402
347
|
* Maps selectors to functions that return a resolution promise for them
|
|
403
348
|
*
|
|
@@ -406,8 +351,6 @@ function instantiateReduxStore(key, options, registry, thunkArgs) {
|
|
|
406
351
|
*
|
|
407
352
|
* @return {Object} Selectors mapped to their resolution functions.
|
|
408
353
|
*/
|
|
409
|
-
|
|
410
|
-
|
|
411
354
|
function mapResolveSelectors(selectors, store) {
|
|
412
355
|
const {
|
|
413
356
|
getIsResolving,
|
|
@@ -427,14 +370,11 @@ function mapResolveSelectors(selectors, store) {
|
|
|
427
370
|
if (!selector.hasResolver) {
|
|
428
371
|
return async (...args) => selector.apply(null, args);
|
|
429
372
|
}
|
|
430
|
-
|
|
431
373
|
return (...args) => {
|
|
432
374
|
return new Promise((resolve, reject) => {
|
|
433
375
|
const hasFinished = () => selectors.hasFinishedResolution(selectorName, args);
|
|
434
|
-
|
|
435
376
|
const finalize = result => {
|
|
436
377
|
const hasFailed = selectors.hasResolutionFailed(selectorName, args);
|
|
437
|
-
|
|
438
378
|
if (hasFailed) {
|
|
439
379
|
const error = selectors.getResolutionError(selectorName, args);
|
|
440
380
|
reject(error);
|
|
@@ -442,16 +382,12 @@ function mapResolveSelectors(selectors, store) {
|
|
|
442
382
|
resolve(result);
|
|
443
383
|
}
|
|
444
384
|
};
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
385
|
+
const getResult = () => selector.apply(null, args);
|
|
386
|
+
// Trigger the selector (to trigger the resolver)
|
|
449
387
|
const result = getResult();
|
|
450
|
-
|
|
451
388
|
if (hasFinished()) {
|
|
452
389
|
return finalize(result);
|
|
453
390
|
}
|
|
454
|
-
|
|
455
391
|
const unsubscribe = store.subscribe(() => {
|
|
456
392
|
if (hasFinished()) {
|
|
457
393
|
unsubscribe();
|
|
@@ -462,6 +398,7 @@ function mapResolveSelectors(selectors, store) {
|
|
|
462
398
|
};
|
|
463
399
|
});
|
|
464
400
|
}
|
|
401
|
+
|
|
465
402
|
/**
|
|
466
403
|
* Maps selectors to functions that throw a suspense promise if not yet resolved.
|
|
467
404
|
*
|
|
@@ -470,26 +407,20 @@ function mapResolveSelectors(selectors, store) {
|
|
|
470
407
|
*
|
|
471
408
|
* @return {Object} Selectors mapped to their suspense functions.
|
|
472
409
|
*/
|
|
473
|
-
|
|
474
|
-
|
|
475
410
|
function mapSuspendSelectors(selectors, store) {
|
|
476
411
|
return mapValues(selectors, (selector, selectorName) => {
|
|
477
412
|
// Selector without a resolver doesn't have any extra suspense behavior.
|
|
478
413
|
if (!selector.hasResolver) {
|
|
479
414
|
return selector;
|
|
480
415
|
}
|
|
481
|
-
|
|
482
416
|
return (...args) => {
|
|
483
417
|
const result = selector.apply(null, args);
|
|
484
|
-
|
|
485
418
|
if (selectors.hasFinishedResolution(selectorName, args)) {
|
|
486
419
|
if (selectors.hasResolutionFailed(selectorName, args)) {
|
|
487
420
|
throw selectors.getResolutionError(selectorName, args);
|
|
488
421
|
}
|
|
489
|
-
|
|
490
422
|
return result;
|
|
491
423
|
}
|
|
492
|
-
|
|
493
424
|
throw new Promise(resolve => {
|
|
494
425
|
const unsubscribe = store.subscribe(() => {
|
|
495
426
|
if (selectors.hasFinishedResolution(selectorName, args)) {
|
|
@@ -501,27 +432,26 @@ function mapSuspendSelectors(selectors, store) {
|
|
|
501
432
|
};
|
|
502
433
|
});
|
|
503
434
|
}
|
|
435
|
+
|
|
504
436
|
/**
|
|
505
437
|
* Convert resolvers to a normalized form, an object with `fulfill` method and
|
|
506
438
|
* optional methods like `isFulfilled`.
|
|
507
439
|
*
|
|
508
440
|
* @param {Object} resolvers Resolver to convert
|
|
509
441
|
*/
|
|
510
|
-
|
|
511
|
-
|
|
512
442
|
function mapResolvers(resolvers) {
|
|
513
443
|
return mapValues(resolvers, resolver => {
|
|
514
444
|
if (resolver.fulfill) {
|
|
515
445
|
return resolver;
|
|
516
446
|
}
|
|
517
|
-
|
|
518
|
-
|
|
447
|
+
return {
|
|
448
|
+
...resolver,
|
|
519
449
|
// Copy the enumerable properties of the resolver function.
|
|
520
450
|
fulfill: resolver // Add the fulfill method.
|
|
521
|
-
|
|
522
451
|
};
|
|
523
452
|
});
|
|
524
453
|
}
|
|
454
|
+
|
|
525
455
|
/**
|
|
526
456
|
* Returns a selector with a matched resolver.
|
|
527
457
|
* Resolvers are side effects invoked once per argument set of a given selector call,
|
|
@@ -533,48 +463,37 @@ function mapResolvers(resolvers) {
|
|
|
533
463
|
* @param {Object} store The redux store to which the resolvers should be mapped.
|
|
534
464
|
* @param {Object} resolversCache Resolvers Cache.
|
|
535
465
|
*/
|
|
536
|
-
|
|
537
|
-
|
|
538
466
|
function mapSelectorWithResolver(selector, selectorName, resolver, store, resolversCache) {
|
|
539
467
|
function fulfillSelector(args) {
|
|
540
468
|
const state = store.getState();
|
|
541
|
-
|
|
542
469
|
if (resolversCache.isRunning(selectorName, args) || typeof resolver.isFulfilled === 'function' && resolver.isFulfilled(state, ...args)) {
|
|
543
470
|
return;
|
|
544
471
|
}
|
|
545
|
-
|
|
546
472
|
const {
|
|
547
473
|
metadata
|
|
548
474
|
} = store.__unstableOriginalGetState();
|
|
549
|
-
|
|
550
475
|
if (metadataSelectors.hasStartedResolution(metadata, selectorName, args)) {
|
|
551
476
|
return;
|
|
552
477
|
}
|
|
553
|
-
|
|
554
478
|
resolversCache.markAsRunning(selectorName, args);
|
|
555
479
|
setTimeout(async () => {
|
|
556
480
|
resolversCache.clear(selectorName, args);
|
|
557
481
|
store.dispatch(metadataActions.startResolution(selectorName, args));
|
|
558
|
-
|
|
559
482
|
try {
|
|
560
483
|
const action = resolver.fulfill(...args);
|
|
561
|
-
|
|
562
484
|
if (action) {
|
|
563
485
|
await store.dispatch(action);
|
|
564
486
|
}
|
|
565
|
-
|
|
566
487
|
store.dispatch(metadataActions.finishResolution(selectorName, args));
|
|
567
488
|
} catch (error) {
|
|
568
489
|
store.dispatch(metadataActions.failResolution(selectorName, args, error));
|
|
569
490
|
}
|
|
570
491
|
}, 0);
|
|
571
492
|
}
|
|
572
|
-
|
|
573
493
|
const selectorResolver = (...args) => {
|
|
574
494
|
fulfillSelector(args);
|
|
575
495
|
return selector(...args);
|
|
576
496
|
};
|
|
577
|
-
|
|
578
497
|
selectorResolver.hasResolver = true;
|
|
579
498
|
return selectorResolver;
|
|
580
499
|
}
|