1
|
(function (global, factory) {
|
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('redux'), require('react-dom')) :
|
3
|
typeof define === 'function' && define.amd ? define(['exports', 'react', 'redux', 'react-dom'], factory) :
|
4
|
(global = global || self, factory(global.ReactRedux = {}, global.React, global.Redux, global.ReactDOM));
|
5
|
}(this, function (exports, React, redux, reactDom) { 'use strict';
|
6
|
|
7
|
var React__default = 'default' in React ? React['default'] : React;
|
8
|
|
9
|
function unwrapExports (x) {
|
10
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
11
|
}
|
12
|
|
13
|
function createCommonjsModule(fn, module) {
|
14
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
15
|
}
|
16
|
|
17
|
var reactIs_development = createCommonjsModule(function (module, exports) {
|
18
|
|
19
|
|
20
|
|
21
|
{
|
22
|
(function() {
|
23
|
|
24
|
Object.defineProperty(exports, '__esModule', { value: true });
|
25
|
|
26
|
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
27
|
// nor polyfill, then a plain number is used for performance.
|
28
|
var hasSymbol = typeof Symbol === 'function' && Symbol.for;
|
29
|
|
30
|
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
|
31
|
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
|
32
|
var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
|
33
|
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
|
34
|
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
|
35
|
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
|
36
|
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace;
|
37
|
// TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
|
38
|
// (unstable) APIs that have been removed. Can we remove the symbols?
|
39
|
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
|
40
|
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
|
41
|
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
|
42
|
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
|
43
|
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
|
44
|
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
|
45
|
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
|
46
|
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
|
47
|
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
|
48
|
|
49
|
function isValidElementType(type) {
|
50
|
return typeof type === 'string' || typeof type === 'function' ||
|
51
|
// Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
|
52
|
type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE);
|
53
|
}
|
54
|
|
55
|
/**
|
56
|
* Forked from fbjs/warning:
|
57
|
* https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
|
58
|
*
|
59
|
* Only change is we use console.warn instead of console.error,
|
60
|
* and do nothing when 'console' is not supported.
|
61
|
* This really simplifies the code.
|
62
|
* ---
|
63
|
* Similar to invariant but only logs a warning if the condition is not met.
|
64
|
* This can be used to log issues in development environments in critical
|
65
|
* paths. Removing the logging code for production environments will keep the
|
66
|
* same logic and follow the same code paths.
|
67
|
*/
|
68
|
|
69
|
var lowPriorityWarning = function () {};
|
70
|
|
71
|
{
|
72
|
var printWarning = function (format) {
|
73
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
74
|
args[_key - 1] = arguments[_key];
|
75
|
}
|
76
|
|
77
|
var argIndex = 0;
|
78
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
79
|
return args[argIndex++];
|
80
|
});
|
81
|
if (typeof console !== 'undefined') {
|
82
|
console.warn(message);
|
83
|
}
|
84
|
try {
|
85
|
// --- Welcome to debugging React ---
|
86
|
// This error was thrown as a convenience so that you can use this stack
|
87
|
// to find the callsite that caused this warning to fire.
|
88
|
throw new Error(message);
|
89
|
} catch (x) {}
|
90
|
};
|
91
|
|
92
|
lowPriorityWarning = function (condition, format) {
|
93
|
if (format === undefined) {
|
94
|
throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
|
95
|
}
|
96
|
if (!condition) {
|
97
|
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
98
|
args[_key2 - 2] = arguments[_key2];
|
99
|
}
|
100
|
|
101
|
printWarning.apply(undefined, [format].concat(args));
|
102
|
}
|
103
|
};
|
104
|
}
|
105
|
|
106
|
var lowPriorityWarning$1 = lowPriorityWarning;
|
107
|
|
108
|
function typeOf(object) {
|
109
|
if (typeof object === 'object' && object !== null) {
|
110
|
var $$typeof = object.$$typeof;
|
111
|
switch ($$typeof) {
|
112
|
case REACT_ELEMENT_TYPE:
|
113
|
var type = object.type;
|
114
|
|
115
|
switch (type) {
|
116
|
case REACT_ASYNC_MODE_TYPE:
|
117
|
case REACT_CONCURRENT_MODE_TYPE:
|
118
|
case REACT_FRAGMENT_TYPE:
|
119
|
case REACT_PROFILER_TYPE:
|
120
|
case REACT_STRICT_MODE_TYPE:
|
121
|
case REACT_SUSPENSE_TYPE:
|
122
|
return type;
|
123
|
default:
|
124
|
var $$typeofType = type && type.$$typeof;
|
125
|
|
126
|
switch ($$typeofType) {
|
127
|
case REACT_CONTEXT_TYPE:
|
128
|
case REACT_FORWARD_REF_TYPE:
|
129
|
case REACT_PROVIDER_TYPE:
|
130
|
return $$typeofType;
|
131
|
default:
|
132
|
return $$typeof;
|
133
|
}
|
134
|
}
|
135
|
case REACT_LAZY_TYPE:
|
136
|
case REACT_MEMO_TYPE:
|
137
|
case REACT_PORTAL_TYPE:
|
138
|
return $$typeof;
|
139
|
}
|
140
|
}
|
141
|
|
142
|
return undefined;
|
143
|
}
|
144
|
|
145
|
// AsyncMode is deprecated along with isAsyncMode
|
146
|
var AsyncMode = REACT_ASYNC_MODE_TYPE;
|
147
|
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
|
148
|
var ContextConsumer = REACT_CONTEXT_TYPE;
|
149
|
var ContextProvider = REACT_PROVIDER_TYPE;
|
150
|
var Element = REACT_ELEMENT_TYPE;
|
151
|
var ForwardRef = REACT_FORWARD_REF_TYPE;
|
152
|
var Fragment = REACT_FRAGMENT_TYPE;
|
153
|
var Lazy = REACT_LAZY_TYPE;
|
154
|
var Memo = REACT_MEMO_TYPE;
|
155
|
var Portal = REACT_PORTAL_TYPE;
|
156
|
var Profiler = REACT_PROFILER_TYPE;
|
157
|
var StrictMode = REACT_STRICT_MODE_TYPE;
|
158
|
var Suspense = REACT_SUSPENSE_TYPE;
|
159
|
|
160
|
var hasWarnedAboutDeprecatedIsAsyncMode = false;
|
161
|
|
162
|
// AsyncMode should be deprecated
|
163
|
function isAsyncMode(object) {
|
164
|
{
|
165
|
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
|
166
|
hasWarnedAboutDeprecatedIsAsyncMode = true;
|
167
|
lowPriorityWarning$1(false, 'The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
|
168
|
}
|
169
|
}
|
170
|
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
|
171
|
}
|
172
|
function isConcurrentMode(object) {
|
173
|
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
|
174
|
}
|
175
|
function isContextConsumer(object) {
|
176
|
return typeOf(object) === REACT_CONTEXT_TYPE;
|
177
|
}
|
178
|
function isContextProvider(object) {
|
179
|
return typeOf(object) === REACT_PROVIDER_TYPE;
|
180
|
}
|
181
|
function isElement(object) {
|
182
|
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
183
|
}
|
184
|
function isForwardRef(object) {
|
185
|
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
186
|
}
|
187
|
function isFragment(object) {
|
188
|
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
189
|
}
|
190
|
function isLazy(object) {
|
191
|
return typeOf(object) === REACT_LAZY_TYPE;
|
192
|
}
|
193
|
function isMemo(object) {
|
194
|
return typeOf(object) === REACT_MEMO_TYPE;
|
195
|
}
|
196
|
function isPortal(object) {
|
197
|
return typeOf(object) === REACT_PORTAL_TYPE;
|
198
|
}
|
199
|
function isProfiler(object) {
|
200
|
return typeOf(object) === REACT_PROFILER_TYPE;
|
201
|
}
|
202
|
function isStrictMode(object) {
|
203
|
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
204
|
}
|
205
|
function isSuspense(object) {
|
206
|
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
207
|
}
|
208
|
|
209
|
exports.typeOf = typeOf;
|
210
|
exports.AsyncMode = AsyncMode;
|
211
|
exports.ConcurrentMode = ConcurrentMode;
|
212
|
exports.ContextConsumer = ContextConsumer;
|
213
|
exports.ContextProvider = ContextProvider;
|
214
|
exports.Element = Element;
|
215
|
exports.ForwardRef = ForwardRef;
|
216
|
exports.Fragment = Fragment;
|
217
|
exports.Lazy = Lazy;
|
218
|
exports.Memo = Memo;
|
219
|
exports.Portal = Portal;
|
220
|
exports.Profiler = Profiler;
|
221
|
exports.StrictMode = StrictMode;
|
222
|
exports.Suspense = Suspense;
|
223
|
exports.isValidElementType = isValidElementType;
|
224
|
exports.isAsyncMode = isAsyncMode;
|
225
|
exports.isConcurrentMode = isConcurrentMode;
|
226
|
exports.isContextConsumer = isContextConsumer;
|
227
|
exports.isContextProvider = isContextProvider;
|
228
|
exports.isElement = isElement;
|
229
|
exports.isForwardRef = isForwardRef;
|
230
|
exports.isFragment = isFragment;
|
231
|
exports.isLazy = isLazy;
|
232
|
exports.isMemo = isMemo;
|
233
|
exports.isPortal = isPortal;
|
234
|
exports.isProfiler = isProfiler;
|
235
|
exports.isStrictMode = isStrictMode;
|
236
|
exports.isSuspense = isSuspense;
|
237
|
})();
|
238
|
}
|
239
|
});
|
240
|
|
241
|
unwrapExports(reactIs_development);
|
242
|
var reactIs_development_1 = reactIs_development.typeOf;
|
243
|
var reactIs_development_2 = reactIs_development.AsyncMode;
|
244
|
var reactIs_development_3 = reactIs_development.ConcurrentMode;
|
245
|
var reactIs_development_4 = reactIs_development.ContextConsumer;
|
246
|
var reactIs_development_5 = reactIs_development.ContextProvider;
|
247
|
var reactIs_development_6 = reactIs_development.Element;
|
248
|
var reactIs_development_7 = reactIs_development.ForwardRef;
|
249
|
var reactIs_development_8 = reactIs_development.Fragment;
|
250
|
var reactIs_development_9 = reactIs_development.Lazy;
|
251
|
var reactIs_development_10 = reactIs_development.Memo;
|
252
|
var reactIs_development_11 = reactIs_development.Portal;
|
253
|
var reactIs_development_12 = reactIs_development.Profiler;
|
254
|
var reactIs_development_13 = reactIs_development.StrictMode;
|
255
|
var reactIs_development_14 = reactIs_development.Suspense;
|
256
|
var reactIs_development_15 = reactIs_development.isValidElementType;
|
257
|
var reactIs_development_16 = reactIs_development.isAsyncMode;
|
258
|
var reactIs_development_17 = reactIs_development.isConcurrentMode;
|
259
|
var reactIs_development_18 = reactIs_development.isContextConsumer;
|
260
|
var reactIs_development_19 = reactIs_development.isContextProvider;
|
261
|
var reactIs_development_20 = reactIs_development.isElement;
|
262
|
var reactIs_development_21 = reactIs_development.isForwardRef;
|
263
|
var reactIs_development_22 = reactIs_development.isFragment;
|
264
|
var reactIs_development_23 = reactIs_development.isLazy;
|
265
|
var reactIs_development_24 = reactIs_development.isMemo;
|
266
|
var reactIs_development_25 = reactIs_development.isPortal;
|
267
|
var reactIs_development_26 = reactIs_development.isProfiler;
|
268
|
var reactIs_development_27 = reactIs_development.isStrictMode;
|
269
|
var reactIs_development_28 = reactIs_development.isSuspense;
|
270
|
|
271
|
var reactIs = createCommonjsModule(function (module) {
|
272
|
|
273
|
{
|
274
|
module.exports = reactIs_development;
|
275
|
}
|
276
|
});
|
277
|
var reactIs_1 = reactIs.isValidElementType;
|
278
|
var reactIs_2 = reactIs.isContextConsumer;
|
279
|
|
280
|
/*
|
281
|
object-assign
|
282
|
(c) Sindre Sorhus
|
283
|
@license MIT
|
284
|
*/
|
285
|
/* eslint-disable no-unused-vars */
|
286
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
287
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
288
|
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
289
|
|
290
|
function toObject(val) {
|
291
|
if (val === null || val === undefined) {
|
292
|
throw new TypeError('Object.assign cannot be called with null or undefined');
|
293
|
}
|
294
|
|
295
|
return Object(val);
|
296
|
}
|
297
|
|
298
|
function shouldUseNative() {
|
299
|
try {
|
300
|
if (!Object.assign) {
|
301
|
return false;
|
302
|
}
|
303
|
|
304
|
// Detect buggy property enumeration order in older V8 versions.
|
305
|
|
306
|
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
307
|
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
308
|
test1[5] = 'de';
|
309
|
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
310
|
return false;
|
311
|
}
|
312
|
|
313
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
314
|
var test2 = {};
|
315
|
for (var i = 0; i < 10; i++) {
|
316
|
test2['_' + String.fromCharCode(i)] = i;
|
317
|
}
|
318
|
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
319
|
return test2[n];
|
320
|
});
|
321
|
if (order2.join('') !== '0123456789') {
|
322
|
return false;
|
323
|
}
|
324
|
|
325
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
326
|
var test3 = {};
|
327
|
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
328
|
test3[letter] = letter;
|
329
|
});
|
330
|
if (Object.keys(Object.assign({}, test3)).join('') !==
|
331
|
'abcdefghijklmnopqrst') {
|
332
|
return false;
|
333
|
}
|
334
|
|
335
|
return true;
|
336
|
} catch (err) {
|
337
|
// We don't expect any of the above to throw, but better to be safe.
|
338
|
return false;
|
339
|
}
|
340
|
}
|
341
|
|
342
|
var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
|
343
|
var from;
|
344
|
var to = toObject(target);
|
345
|
var symbols;
|
346
|
|
347
|
for (var s = 1; s < arguments.length; s++) {
|
348
|
from = Object(arguments[s]);
|
349
|
|
350
|
for (var key in from) {
|
351
|
if (hasOwnProperty.call(from, key)) {
|
352
|
to[key] = from[key];
|
353
|
}
|
354
|
}
|
355
|
|
356
|
if (getOwnPropertySymbols) {
|
357
|
symbols = getOwnPropertySymbols(from);
|
358
|
for (var i = 0; i < symbols.length; i++) {
|
359
|
if (propIsEnumerable.call(from, symbols[i])) {
|
360
|
to[symbols[i]] = from[symbols[i]];
|
361
|
}
|
362
|
}
|
363
|
}
|
364
|
}
|
365
|
|
366
|
return to;
|
367
|
};
|
368
|
|
369
|
/**
|
370
|
* Copyright (c) 2013-present, Facebook, Inc.
|
371
|
*
|
372
|
* This source code is licensed under the MIT license found in the
|
373
|
* LICENSE file in the root directory of this source tree.
|
374
|
*/
|
375
|
|
376
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
377
|
|
378
|
var ReactPropTypesSecret_1 = ReactPropTypesSecret;
|
379
|
|
380
|
var printWarning = function() {};
|
381
|
|
382
|
{
|
383
|
var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;
|
384
|
var loggedTypeFailures = {};
|
385
|
var has = Function.call.bind(Object.prototype.hasOwnProperty);
|
386
|
|
387
|
printWarning = function(text) {
|
388
|
var message = 'Warning: ' + text;
|
389
|
if (typeof console !== 'undefined') {
|
390
|
console.error(message);
|
391
|
}
|
392
|
try {
|
393
|
// --- Welcome to debugging React ---
|
394
|
// This error was thrown as a convenience so that you can use this stack
|
395
|
// to find the callsite that caused this warning to fire.
|
396
|
throw new Error(message);
|
397
|
} catch (x) {}
|
398
|
};
|
399
|
}
|
400
|
|
401
|
/**
|
402
|
* Assert that the values match with the type specs.
|
403
|
* Error messages are memorized and will only be shown once.
|
404
|
*
|
405
|
* @param {object} typeSpecs Map of name to a ReactPropType
|
406
|
* @param {object} values Runtime values that need to be type-checked
|
407
|
* @param {string} location e.g. "prop", "context", "child context"
|
408
|
* @param {string} componentName Name of the component for error messages.
|
409
|
* @param {?Function} getStack Returns the component stack.
|
410
|
* @private
|
411
|
*/
|
412
|
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
|
413
|
{
|
414
|
for (var typeSpecName in typeSpecs) {
|
415
|
if (has(typeSpecs, typeSpecName)) {
|
416
|
var error;
|
417
|
// Prop type validation may throw. In case they do, we don't want to
|
418
|
// fail the render phase where it didn't fail before. So we log it.
|
419
|
// After these have been cleaned up, we'll let them throw.
|
420
|
try {
|
421
|
// This is intentionally an invariant that gets caught. It's the same
|
422
|
// behavior as without this statement except with a better message.
|
423
|
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
424
|
var err = Error(
|
425
|
(componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
|
426
|
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
|
427
|
);
|
428
|
err.name = 'Invariant Violation';
|
429
|
throw err;
|
430
|
}
|
431
|
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);
|
432
|
} catch (ex) {
|
433
|
error = ex;
|
434
|
}
|
435
|
if (error && !(error instanceof Error)) {
|
436
|
printWarning(
|
437
|
(componentName || 'React class') + ': type specification of ' +
|
438
|
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
|
439
|
'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
|
440
|
'You may have forgotten to pass an argument to the type checker ' +
|
441
|
'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
|
442
|
'shape all require an argument).'
|
443
|
);
|
444
|
}
|
445
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
446
|
// Only monitor this failure once because there tends to be a lot of the
|
447
|
// same error.
|
448
|
loggedTypeFailures[error.message] = true;
|
449
|
|
450
|
var stack = getStack ? getStack() : '';
|
451
|
|
452
|
printWarning(
|
453
|
'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
|
454
|
);
|
455
|
}
|
456
|
}
|
457
|
}
|
458
|
}
|
459
|
}
|
460
|
|
461
|
/**
|
462
|
* Resets warning cache when testing.
|
463
|
*
|
464
|
* @private
|
465
|
*/
|
466
|
checkPropTypes.resetWarningCache = function() {
|
467
|
{
|
468
|
loggedTypeFailures = {};
|
469
|
}
|
470
|
};
|
471
|
|
472
|
var checkPropTypes_1 = checkPropTypes;
|
473
|
|
474
|
var has$1 = Function.call.bind(Object.prototype.hasOwnProperty);
|
475
|
var printWarning$1 = function() {};
|
476
|
|
477
|
{
|
478
|
printWarning$1 = function(text) {
|
479
|
var message = 'Warning: ' + text;
|
480
|
if (typeof console !== 'undefined') {
|
481
|
console.error(message);
|
482
|
}
|
483
|
try {
|
484
|
// --- Welcome to debugging React ---
|
485
|
// This error was thrown as a convenience so that you can use this stack
|
486
|
// to find the callsite that caused this warning to fire.
|
487
|
throw new Error(message);
|
488
|
} catch (x) {}
|
489
|
};
|
490
|
}
|
491
|
|
492
|
function emptyFunctionThatReturnsNull() {
|
493
|
return null;
|
494
|
}
|
495
|
|
496
|
var factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {
|
497
|
/* global Symbol */
|
498
|
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
499
|
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
500
|
|
501
|
/**
|
502
|
* Returns the iterator method function contained on the iterable object.
|
503
|
*
|
504
|
* Be sure to invoke the function with the iterable as context:
|
505
|
*
|
506
|
* var iteratorFn = getIteratorFn(myIterable);
|
507
|
* if (iteratorFn) {
|
508
|
* var iterator = iteratorFn.call(myIterable);
|
509
|
* ...
|
510
|
* }
|
511
|
*
|
512
|
* @param {?object} maybeIterable
|
513
|
* @return {?function}
|
514
|
*/
|
515
|
function getIteratorFn(maybeIterable) {
|
516
|
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
517
|
if (typeof iteratorFn === 'function') {
|
518
|
return iteratorFn;
|
519
|
}
|
520
|
}
|
521
|
|
522
|
/**
|
523
|
* Collection of methods that allow declaration and validation of props that are
|
524
|
* supplied to React components. Example usage:
|
525
|
*
|
526
|
* var Props = require('ReactPropTypes');
|
527
|
* var MyArticle = React.createClass({
|
528
|
* propTypes: {
|
529
|
* // An optional string prop named "description".
|
530
|
* description: Props.string,
|
531
|
*
|
532
|
* // A required enum prop named "category".
|
533
|
* category: Props.oneOf(['News','Photos']).isRequired,
|
534
|
*
|
535
|
* // A prop named "dialog" that requires an instance of Dialog.
|
536
|
* dialog: Props.instanceOf(Dialog).isRequired
|
537
|
* },
|
538
|
* render: function() { ... }
|
539
|
* });
|
540
|
*
|
541
|
* A more formal specification of how these methods are used:
|
542
|
*
|
543
|
* type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
|
544
|
* decl := ReactPropTypes.{type}(.isRequired)?
|
545
|
*
|
546
|
* Each and every declaration produces a function with the same signature. This
|
547
|
* allows the creation of custom validation functions. For example:
|
548
|
*
|
549
|
* var MyLink = React.createClass({
|
550
|
* propTypes: {
|
551
|
* // An optional string or URI prop named "href".
|
552
|
* href: function(props, propName, componentName) {
|
553
|
* var propValue = props[propName];
|
554
|
* if (propValue != null && typeof propValue !== 'string' &&
|
555
|
* !(propValue instanceof URI)) {
|
556
|
* return new Error(
|
557
|
* 'Expected a string or an URI for ' + propName + ' in ' +
|
558
|
* componentName
|
559
|
* );
|
560
|
* }
|
561
|
* }
|
562
|
* },
|
563
|
* render: function() {...}
|
564
|
* });
|
565
|
*
|
566
|
* @internal
|
567
|
*/
|
568
|
|
569
|
var ANONYMOUS = '<<anonymous>>';
|
570
|
|
571
|
// Important!
|
572
|
// Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
|
573
|
var ReactPropTypes = {
|
574
|
array: createPrimitiveTypeChecker('array'),
|
575
|
bool: createPrimitiveTypeChecker('boolean'),
|
576
|
func: createPrimitiveTypeChecker('function'),
|
577
|
number: createPrimitiveTypeChecker('number'),
|
578
|
object: createPrimitiveTypeChecker('object'),
|
579
|
string: createPrimitiveTypeChecker('string'),
|
580
|
symbol: createPrimitiveTypeChecker('symbol'),
|
581
|
|
582
|
any: createAnyTypeChecker(),
|
583
|
arrayOf: createArrayOfTypeChecker,
|
584
|
element: createElementTypeChecker(),
|
585
|
elementType: createElementTypeTypeChecker(),
|
586
|
instanceOf: createInstanceTypeChecker,
|
587
|
node: createNodeChecker(),
|
588
|
objectOf: createObjectOfTypeChecker,
|
589
|
oneOf: createEnumTypeChecker,
|
590
|
oneOfType: createUnionTypeChecker,
|
591
|
shape: createShapeTypeChecker,
|
592
|
exact: createStrictShapeTypeChecker,
|
593
|
};
|
594
|
|
595
|
/**
|
596
|
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
597
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
598
|
*/
|
599
|
/*eslint-disable no-self-compare*/
|
600
|
function is(x, y) {
|
601
|
// SameValue algorithm
|
602
|
if (x === y) {
|
603
|
// Steps 1-5, 7-10
|
604
|
// Steps 6.b-6.e: +0 != -0
|
605
|
return x !== 0 || 1 / x === 1 / y;
|
606
|
} else {
|
607
|
// Step 6.a: NaN == NaN
|
608
|
return x !== x && y !== y;
|
609
|
}
|
610
|
}
|
611
|
/*eslint-enable no-self-compare*/
|
612
|
|
613
|
/**
|
614
|
* We use an Error-like object for backward compatibility as people may call
|
615
|
* PropTypes directly and inspect their output. However, we don't use real
|
616
|
* Errors anymore. We don't inspect their stack anyway, and creating them
|
617
|
* is prohibitively expensive if they are created too often, such as what
|
618
|
* happens in oneOfType() for any type before the one that matched.
|
619
|
*/
|
620
|
function PropTypeError(message) {
|
621
|
this.message = message;
|
622
|
this.stack = '';
|
623
|
}
|
624
|
// Make `instanceof Error` still work for returned errors.
|
625
|
PropTypeError.prototype = Error.prototype;
|
626
|
|
627
|
function createChainableTypeChecker(validate) {
|
628
|
{
|
629
|
var manualPropTypeCallCache = {};
|
630
|
var manualPropTypeWarningCount = 0;
|
631
|
}
|
632
|
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
633
|
componentName = componentName || ANONYMOUS;
|
634
|
propFullName = propFullName || propName;
|
635
|
|
636
|
if (secret !== ReactPropTypesSecret_1) {
|
637
|
if (throwOnDirectAccess) {
|
638
|
// New behavior only for users of `prop-types` package
|
639
|
var err = new Error(
|
640
|
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
641
|
'Use `PropTypes.checkPropTypes()` to call them. ' +
|
642
|
'Read more at http://fb.me/use-check-prop-types'
|
643
|
);
|
644
|
err.name = 'Invariant Violation';
|
645
|
throw err;
|
646
|
} else if ( typeof console !== 'undefined') {
|
647
|
// Old behavior for people using React.PropTypes
|
648
|
var cacheKey = componentName + ':' + propName;
|
649
|
if (
|
650
|
!manualPropTypeCallCache[cacheKey] &&
|
651
|
// Avoid spamming the console because they are often not actionable except for lib authors
|
652
|
manualPropTypeWarningCount < 3
|
653
|
) {
|
654
|
printWarning$1(
|
655
|
'You are manually calling a React.PropTypes validation ' +
|
656
|
'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +
|
657
|
'and will throw in the standalone `prop-types` package. ' +
|
658
|
'You may be seeing this warning due to a third-party PropTypes ' +
|
659
|
'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
|
660
|
);
|
661
|
manualPropTypeCallCache[cacheKey] = true;
|
662
|
manualPropTypeWarningCount++;
|
663
|
}
|
664
|
}
|
665
|
}
|
666
|
if (props[propName] == null) {
|
667
|
if (isRequired) {
|
668
|
if (props[propName] === null) {
|
669
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
670
|
}
|
671
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
672
|
}
|
673
|
return null;
|
674
|
} else {
|
675
|
return validate(props, propName, componentName, location, propFullName);
|
676
|
}
|
677
|
}
|
678
|
|
679
|
var chainedCheckType = checkType.bind(null, false);
|
680
|
chainedCheckType.isRequired = checkType.bind(null, true);
|
681
|
|
682
|
return chainedCheckType;
|
683
|
}
|
684
|
|
685
|
function createPrimitiveTypeChecker(expectedType) {
|
686
|
function validate(props, propName, componentName, location, propFullName, secret) {
|
687
|
var propValue = props[propName];
|
688
|
var propType = getPropType(propValue);
|
689
|
if (propType !== expectedType) {
|
690
|
// `propValue` being instance of, say, date/regexp, pass the 'object'
|
691
|
// check, but we can offer a more precise error message here rather than
|
692
|
// 'of type `object`'.
|
693
|
var preciseType = getPreciseType(propValue);
|
694
|
|
695
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
|
696
|
}
|
697
|
return null;
|
698
|
}
|
699
|
return createChainableTypeChecker(validate);
|
700
|
}
|
701
|
|
702
|
function createAnyTypeChecker() {
|
703
|
return createChainableTypeChecker(emptyFunctionThatReturnsNull);
|
704
|
}
|
705
|
|
706
|
function createArrayOfTypeChecker(typeChecker) {
|
707
|
function validate(props, propName, componentName, location, propFullName) {
|
708
|
if (typeof typeChecker !== 'function') {
|
709
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
710
|
}
|
711
|
var propValue = props[propName];
|
712
|
if (!Array.isArray(propValue)) {
|
713
|
var propType = getPropType(propValue);
|
714
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
|
715
|
}
|
716
|
for (var i = 0; i < propValue.length; i++) {
|
717
|
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret_1);
|
718
|
if (error instanceof Error) {
|
719
|
return error;
|
720
|
}
|
721
|
}
|
722
|
return null;
|
723
|
}
|
724
|
return createChainableTypeChecker(validate);
|
725
|
}
|
726
|
|
727
|
function createElementTypeChecker() {
|
728
|
function validate(props, propName, componentName, location, propFullName) {
|
729
|
var propValue = props[propName];
|
730
|
if (!isValidElement(propValue)) {
|
731
|
var propType = getPropType(propValue);
|
732
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
|
733
|
}
|
734
|
return null;
|
735
|
}
|
736
|
return createChainableTypeChecker(validate);
|
737
|
}
|
738
|
|
739
|
function createElementTypeTypeChecker() {
|
740
|
function validate(props, propName, componentName, location, propFullName) {
|
741
|
var propValue = props[propName];
|
742
|
if (!reactIs.isValidElementType(propValue)) {
|
743
|
var propType = getPropType(propValue);
|
744
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
|
745
|
}
|
746
|
return null;
|
747
|
}
|
748
|
return createChainableTypeChecker(validate);
|
749
|
}
|
750
|
|
751
|
function createInstanceTypeChecker(expectedClass) {
|
752
|
function validate(props, propName, componentName, location, propFullName) {
|
753
|
if (!(props[propName] instanceof expectedClass)) {
|
754
|
var expectedClassName = expectedClass.name || ANONYMOUS;
|
755
|
var actualClassName = getClassName(props[propName]);
|
756
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
|
757
|
}
|
758
|
return null;
|
759
|
}
|
760
|
return createChainableTypeChecker(validate);
|
761
|
}
|
762
|
|
763
|
function createEnumTypeChecker(expectedValues) {
|
764
|
if (!Array.isArray(expectedValues)) {
|
765
|
{
|
766
|
if (arguments.length > 1) {
|
767
|
printWarning$1(
|
768
|
'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
|
769
|
'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
|
770
|
);
|
771
|
} else {
|
772
|
printWarning$1('Invalid argument supplied to oneOf, expected an array.');
|
773
|
}
|
774
|
}
|
775
|
return emptyFunctionThatReturnsNull;
|
776
|
}
|
777
|
|
778
|
function validate(props, propName, componentName, location, propFullName) {
|
779
|
var propValue = props[propName];
|
780
|
for (var i = 0; i < expectedValues.length; i++) {
|
781
|
if (is(propValue, expectedValues[i])) {
|
782
|
return null;
|
783
|
}
|
784
|
}
|
785
|
|
786
|
var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
|
787
|
var type = getPreciseType(value);
|
788
|
if (type === 'symbol') {
|
789
|
return String(value);
|
790
|
}
|
791
|
return value;
|
792
|
});
|
793
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
794
|
}
|
795
|
return createChainableTypeChecker(validate);
|
796
|
}
|
797
|
|
798
|
function createObjectOfTypeChecker(typeChecker) {
|
799
|
function validate(props, propName, componentName, location, propFullName) {
|
800
|
if (typeof typeChecker !== 'function') {
|
801
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
|
802
|
}
|
803
|
var propValue = props[propName];
|
804
|
var propType = getPropType(propValue);
|
805
|
if (propType !== 'object') {
|
806
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
|
807
|
}
|
808
|
for (var key in propValue) {
|
809
|
if (has$1(propValue, key)) {
|
810
|
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
811
|
if (error instanceof Error) {
|
812
|
return error;
|
813
|
}
|
814
|
}
|
815
|
}
|
816
|
return null;
|
817
|
}
|
818
|
return createChainableTypeChecker(validate);
|
819
|
}
|
820
|
|
821
|
function createUnionTypeChecker(arrayOfTypeCheckers) {
|
822
|
if (!Array.isArray(arrayOfTypeCheckers)) {
|
823
|
printWarning$1('Invalid argument supplied to oneOfType, expected an instance of array.') ;
|
824
|
return emptyFunctionThatReturnsNull;
|
825
|
}
|
826
|
|
827
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
828
|
var checker = arrayOfTypeCheckers[i];
|
829
|
if (typeof checker !== 'function') {
|
830
|
printWarning$1(
|
831
|
'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
|
832
|
'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
|
833
|
);
|
834
|
return emptyFunctionThatReturnsNull;
|
835
|
}
|
836
|
}
|
837
|
|
838
|
function validate(props, propName, componentName, location, propFullName) {
|
839
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
840
|
var checker = arrayOfTypeCheckers[i];
|
841
|
if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret_1) == null) {
|
842
|
return null;
|
843
|
}
|
844
|
}
|
845
|
|
846
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
|
847
|
}
|
848
|
return createChainableTypeChecker(validate);
|
849
|
}
|
850
|
|
851
|
function createNodeChecker() {
|
852
|
function validate(props, propName, componentName, location, propFullName) {
|
853
|
if (!isNode(props[propName])) {
|
854
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
|
855
|
}
|
856
|
return null;
|
857
|
}
|
858
|
return createChainableTypeChecker(validate);
|
859
|
}
|
860
|
|
861
|
function createShapeTypeChecker(shapeTypes) {
|
862
|
function validate(props, propName, componentName, location, propFullName) {
|
863
|
var propValue = props[propName];
|
864
|
var propType = getPropType(propValue);
|
865
|
if (propType !== 'object') {
|
866
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
867
|
}
|
868
|
for (var key in shapeTypes) {
|
869
|
var checker = shapeTypes[key];
|
870
|
if (!checker) {
|
871
|
continue;
|
872
|
}
|
873
|
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
874
|
if (error) {
|
875
|
return error;
|
876
|
}
|
877
|
}
|
878
|
return null;
|
879
|
}
|
880
|
return createChainableTypeChecker(validate);
|
881
|
}
|
882
|
|
883
|
function createStrictShapeTypeChecker(shapeTypes) {
|
884
|
function validate(props, propName, componentName, location, propFullName) {
|
885
|
var propValue = props[propName];
|
886
|
var propType = getPropType(propValue);
|
887
|
if (propType !== 'object') {
|
888
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
889
|
}
|
890
|
// We need to check all keys in case some are required but missing from
|
891
|
// props.
|
892
|
var allKeys = objectAssign({}, props[propName], shapeTypes);
|
893
|
for (var key in allKeys) {
|
894
|
var checker = shapeTypes[key];
|
895
|
if (!checker) {
|
896
|
return new PropTypeError(
|
897
|
'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
|
898
|
'\nBad object: ' + JSON.stringify(props[propName], null, ' ') +
|
899
|
'\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')
|
900
|
);
|
901
|
}
|
902
|
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
903
|
if (error) {
|
904
|
return error;
|
905
|
}
|
906
|
}
|
907
|
return null;
|
908
|
}
|
909
|
|
910
|
return createChainableTypeChecker(validate);
|
911
|
}
|
912
|
|
913
|
function isNode(propValue) {
|
914
|
switch (typeof propValue) {
|
915
|
case 'number':
|
916
|
case 'string':
|
917
|
case 'undefined':
|
918
|
return true;
|
919
|
case 'boolean':
|
920
|
return !propValue;
|
921
|
case 'object':
|
922
|
if (Array.isArray(propValue)) {
|
923
|
return propValue.every(isNode);
|
924
|
}
|
925
|
if (propValue === null || isValidElement(propValue)) {
|
926
|
return true;
|
927
|
}
|
928
|
|
929
|
var iteratorFn = getIteratorFn(propValue);
|
930
|
if (iteratorFn) {
|
931
|
var iterator = iteratorFn.call(propValue);
|
932
|
var step;
|
933
|
if (iteratorFn !== propValue.entries) {
|
934
|
while (!(step = iterator.next()).done) {
|
935
|
if (!isNode(step.value)) {
|
936
|
return false;
|
937
|
}
|
938
|
}
|
939
|
} else {
|
940
|
// Iterator will provide entry [k,v] tuples rather than values.
|
941
|
while (!(step = iterator.next()).done) {
|
942
|
var entry = step.value;
|
943
|
if (entry) {
|
944
|
if (!isNode(entry[1])) {
|
945
|
return false;
|
946
|
}
|
947
|
}
|
948
|
}
|
949
|
}
|
950
|
} else {
|
951
|
return false;
|
952
|
}
|
953
|
|
954
|
return true;
|
955
|
default:
|
956
|
return false;
|
957
|
}
|
958
|
}
|
959
|
|
960
|
function isSymbol(propType, propValue) {
|
961
|
// Native Symbol.
|
962
|
if (propType === 'symbol') {
|
963
|
return true;
|
964
|
}
|
965
|
|
966
|
// falsy value can't be a Symbol
|
967
|
if (!propValue) {
|
968
|
return false;
|
969
|
}
|
970
|
|
971
|
// 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
|
972
|
if (propValue['@@toStringTag'] === 'Symbol') {
|
973
|
return true;
|
974
|
}
|
975
|
|
976
|
// Fallback for non-spec compliant Symbols which are polyfilled.
|
977
|
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
|
978
|
return true;
|
979
|
}
|
980
|
|
981
|
return false;
|
982
|
}
|
983
|
|
984
|
// Equivalent of `typeof` but with special handling for array and regexp.
|
985
|
function getPropType(propValue) {
|
986
|
var propType = typeof propValue;
|
987
|
if (Array.isArray(propValue)) {
|
988
|
return 'array';
|
989
|
}
|
990
|
if (propValue instanceof RegExp) {
|
991
|
// Old webkits (at least until Android 4.0) return 'function' rather than
|
992
|
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
993
|
// passes PropTypes.object.
|
994
|
return 'object';
|
995
|
}
|
996
|
if (isSymbol(propType, propValue)) {
|
997
|
return 'symbol';
|
998
|
}
|
999
|
return propType;
|
1000
|
}
|
1001
|
|
1002
|
// This handles more types than `getPropType`. Only used for error messages.
|
1003
|
// See `createPrimitiveTypeChecker`.
|
1004
|
function getPreciseType(propValue) {
|
1005
|
if (typeof propValue === 'undefined' || propValue === null) {
|
1006
|
return '' + propValue;
|
1007
|
}
|
1008
|
var propType = getPropType(propValue);
|
1009
|
if (propType === 'object') {
|
1010
|
if (propValue instanceof Date) {
|
1011
|
return 'date';
|
1012
|
} else if (propValue instanceof RegExp) {
|
1013
|
return 'regexp';
|
1014
|
}
|
1015
|
}
|
1016
|
return propType;
|
1017
|
}
|
1018
|
|
1019
|
// Returns a string that is postfixed to a warning about an invalid type.
|
1020
|
// For example, "undefined" or "of type array"
|
1021
|
function getPostfixForTypeWarning(value) {
|
1022
|
var type = getPreciseType(value);
|
1023
|
switch (type) {
|
1024
|
case 'array':
|
1025
|
case 'object':
|
1026
|
return 'an ' + type;
|
1027
|
case 'boolean':
|
1028
|
case 'date':
|
1029
|
case 'regexp':
|
1030
|
return 'a ' + type;
|
1031
|
default:
|
1032
|
return type;
|
1033
|
}
|
1034
|
}
|
1035
|
|
1036
|
// Returns class name of the object, if any.
|
1037
|
function getClassName(propValue) {
|
1038
|
if (!propValue.constructor || !propValue.constructor.name) {
|
1039
|
return ANONYMOUS;
|
1040
|
}
|
1041
|
return propValue.constructor.name;
|
1042
|
}
|
1043
|
|
1044
|
ReactPropTypes.checkPropTypes = checkPropTypes_1;
|
1045
|
ReactPropTypes.resetWarningCache = checkPropTypes_1.resetWarningCache;
|
1046
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
1047
|
|
1048
|
return ReactPropTypes;
|
1049
|
};
|
1050
|
|
1051
|
var propTypes = createCommonjsModule(function (module) {
|
1052
|
/**
|
1053
|
* Copyright (c) 2013-present, Facebook, Inc.
|
1054
|
*
|
1055
|
* This source code is licensed under the MIT license found in the
|
1056
|
* LICENSE file in the root directory of this source tree.
|
1057
|
*/
|
1058
|
|
1059
|
{
|
1060
|
var ReactIs = reactIs;
|
1061
|
|
1062
|
// By explicitly using `prop-types` you are opting into new development behavior.
|
1063
|
// http://fb.me/prop-types-in-prod
|
1064
|
var throwOnDirectAccess = true;
|
1065
|
module.exports = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess);
|
1066
|
}
|
1067
|
});
|
1068
|
|
1069
|
var ReactReduxContext =
|
1070
|
/*#__PURE__*/
|
1071
|
React__default.createContext(null);
|
1072
|
|
1073
|
{
|
1074
|
ReactReduxContext.displayName = 'ReactRedux';
|
1075
|
}
|
1076
|
|
1077
|
// Default to a dummy "batch" implementation that just runs the callback
|
1078
|
function defaultNoopBatch(callback) {
|
1079
|
callback();
|
1080
|
}
|
1081
|
|
1082
|
var batch = defaultNoopBatch; // Allow injecting another batching function later
|
1083
|
|
1084
|
var setBatch = function setBatch(newBatch) {
|
1085
|
return batch = newBatch;
|
1086
|
}; // Supply a getter just to skip dealing with ESM bindings
|
1087
|
|
1088
|
var getBatch = function getBatch() {
|
1089
|
return batch;
|
1090
|
};
|
1091
|
|
1092
|
// well as nesting subscriptions of descendant components, so that we can ensure the
|
1093
|
// ancestor components re-render before descendants
|
1094
|
|
1095
|
var nullListeners = {
|
1096
|
notify: function notify() {}
|
1097
|
};
|
1098
|
|
1099
|
function createListenerCollection() {
|
1100
|
var batch = getBatch();
|
1101
|
var first = null;
|
1102
|
var last = null;
|
1103
|
return {
|
1104
|
clear: function clear() {
|
1105
|
first = null;
|
1106
|
last = null;
|
1107
|
},
|
1108
|
notify: function notify() {
|
1109
|
batch(function () {
|
1110
|
var listener = first;
|
1111
|
|
1112
|
while (listener) {
|
1113
|
listener.callback();
|
1114
|
listener = listener.next;
|
1115
|
}
|
1116
|
});
|
1117
|
},
|
1118
|
get: function get() {
|
1119
|
var listeners = [];
|
1120
|
var listener = first;
|
1121
|
|
1122
|
while (listener) {
|
1123
|
listeners.push(listener);
|
1124
|
listener = listener.next;
|
1125
|
}
|
1126
|
|
1127
|
return listeners;
|
1128
|
},
|
1129
|
subscribe: function subscribe(callback) {
|
1130
|
var isSubscribed = true;
|
1131
|
var listener = last = {
|
1132
|
callback: callback,
|
1133
|
next: null,
|
1134
|
prev: last
|
1135
|
};
|
1136
|
|
1137
|
if (listener.prev) {
|
1138
|
listener.prev.next = listener;
|
1139
|
} else {
|
1140
|
first = listener;
|
1141
|
}
|
1142
|
|
1143
|
return function unsubscribe() {
|
1144
|
if (!isSubscribed || first === null) return;
|
1145
|
isSubscribed = false;
|
1146
|
|
1147
|
if (listener.next) {
|
1148
|
listener.next.prev = listener.prev;
|
1149
|
} else {
|
1150
|
last = listener.prev;
|
1151
|
}
|
1152
|
|
1153
|
if (listener.prev) {
|
1154
|
listener.prev.next = listener.next;
|
1155
|
} else {
|
1156
|
first = listener.next;
|
1157
|
}
|
1158
|
};
|
1159
|
}
|
1160
|
};
|
1161
|
}
|
1162
|
|
1163
|
var Subscription =
|
1164
|
/*#__PURE__*/
|
1165
|
function () {
|
1166
|
function Subscription(store, parentSub) {
|
1167
|
this.store = store;
|
1168
|
this.parentSub = parentSub;
|
1169
|
this.unsubscribe = null;
|
1170
|
this.listeners = nullListeners;
|
1171
|
this.handleChangeWrapper = this.handleChangeWrapper.bind(this);
|
1172
|
}
|
1173
|
|
1174
|
var _proto = Subscription.prototype;
|
1175
|
|
1176
|
_proto.addNestedSub = function addNestedSub(listener) {
|
1177
|
this.trySubscribe();
|
1178
|
return this.listeners.subscribe(listener);
|
1179
|
};
|
1180
|
|
1181
|
_proto.notifyNestedSubs = function notifyNestedSubs() {
|
1182
|
this.listeners.notify();
|
1183
|
};
|
1184
|
|
1185
|
_proto.handleChangeWrapper = function handleChangeWrapper() {
|
1186
|
if (this.onStateChange) {
|
1187
|
this.onStateChange();
|
1188
|
}
|
1189
|
};
|
1190
|
|
1191
|
_proto.isSubscribed = function isSubscribed() {
|
1192
|
return Boolean(this.unsubscribe);
|
1193
|
};
|
1194
|
|
1195
|
_proto.trySubscribe = function trySubscribe() {
|
1196
|
if (!this.unsubscribe) {
|
1197
|
this.unsubscribe = this.parentSub ? this.parentSub.addNestedSub(this.handleChangeWrapper) : this.store.subscribe(this.handleChangeWrapper);
|
1198
|
this.listeners = createListenerCollection();
|
1199
|
}
|
1200
|
};
|
1201
|
|
1202
|
_proto.tryUnsubscribe = function tryUnsubscribe() {
|
1203
|
if (this.unsubscribe) {
|
1204
|
this.unsubscribe();
|
1205
|
this.unsubscribe = null;
|
1206
|
this.listeners.clear();
|
1207
|
this.listeners = nullListeners;
|
1208
|
}
|
1209
|
};
|
1210
|
|
1211
|
return Subscription;
|
1212
|
}();
|
1213
|
|
1214
|
function Provider(_ref) {
|
1215
|
var store = _ref.store,
|
1216
|
context = _ref.context,
|
1217
|
children = _ref.children;
|
1218
|
var contextValue = React.useMemo(function () {
|
1219
|
var subscription = new Subscription(store);
|
1220
|
subscription.onStateChange = subscription.notifyNestedSubs;
|
1221
|
return {
|
1222
|
store: store,
|
1223
|
subscription: subscription
|
1224
|
};
|
1225
|
}, [store]);
|
1226
|
var previousState = React.useMemo(function () {
|
1227
|
return store.getState();
|
1228
|
}, [store]);
|
1229
|
React.useEffect(function () {
|
1230
|
var subscription = contextValue.subscription;
|
1231
|
subscription.trySubscribe();
|
1232
|
|
1233
|
if (previousState !== store.getState()) {
|
1234
|
subscription.notifyNestedSubs();
|
1235
|
}
|
1236
|
|
1237
|
return function () {
|
1238
|
subscription.tryUnsubscribe();
|
1239
|
subscription.onStateChange = null;
|
1240
|
};
|
1241
|
}, [contextValue, previousState]);
|
1242
|
var Context = context || ReactReduxContext;
|
1243
|
return React__default.createElement(Context.Provider, {
|
1244
|
value: contextValue
|
1245
|
}, children);
|
1246
|
}
|
1247
|
|
1248
|
{
|
1249
|
Provider.propTypes = {
|
1250
|
store: propTypes.shape({
|
1251
|
subscribe: propTypes.func.isRequired,
|
1252
|
dispatch: propTypes.func.isRequired,
|
1253
|
getState: propTypes.func.isRequired
|
1254
|
}),
|
1255
|
context: propTypes.object,
|
1256
|
children: propTypes.any
|
1257
|
};
|
1258
|
}
|
1259
|
|
1260
|
function _extends() {
|
1261
|
_extends = Object.assign || function (target) {
|
1262
|
for (var i = 1; i < arguments.length; i++) {
|
1263
|
var source = arguments[i];
|
1264
|
|
1265
|
for (var key in source) {
|
1266
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
1267
|
target[key] = source[key];
|
1268
|
}
|
1269
|
}
|
1270
|
}
|
1271
|
|
1272
|
return target;
|
1273
|
};
|
1274
|
|
1275
|
return _extends.apply(this, arguments);
|
1276
|
}
|
1277
|
|
1278
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
1279
|
if (source == null) return {};
|
1280
|
var target = {};
|
1281
|
var sourceKeys = Object.keys(source);
|
1282
|
var key, i;
|
1283
|
|
1284
|
for (i = 0; i < sourceKeys.length; i++) {
|
1285
|
key = sourceKeys[i];
|
1286
|
if (excluded.indexOf(key) >= 0) continue;
|
1287
|
target[key] = source[key];
|
1288
|
}
|
1289
|
|
1290
|
return target;
|
1291
|
}
|
1292
|
|
1293
|
/**
|
1294
|
* Copyright 2015, Yahoo! Inc.
|
1295
|
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
1296
|
*/
|
1297
|
|
1298
|
var REACT_STATICS = {
|
1299
|
childContextTypes: true,
|
1300
|
contextType: true,
|
1301
|
contextTypes: true,
|
1302
|
defaultProps: true,
|
1303
|
displayName: true,
|
1304
|
getDefaultProps: true,
|
1305
|
getDerivedStateFromError: true,
|
1306
|
getDerivedStateFromProps: true,
|
1307
|
mixins: true,
|
1308
|
propTypes: true,
|
1309
|
type: true
|
1310
|
};
|
1311
|
|
1312
|
var KNOWN_STATICS = {
|
1313
|
name: true,
|
1314
|
length: true,
|
1315
|
prototype: true,
|
1316
|
caller: true,
|
1317
|
callee: true,
|
1318
|
arguments: true,
|
1319
|
arity: true
|
1320
|
};
|
1321
|
|
1322
|
var FORWARD_REF_STATICS = {
|
1323
|
'$$typeof': true,
|
1324
|
render: true,
|
1325
|
defaultProps: true,
|
1326
|
displayName: true,
|
1327
|
propTypes: true
|
1328
|
};
|
1329
|
|
1330
|
var MEMO_STATICS = {
|
1331
|
'$$typeof': true,
|
1332
|
compare: true,
|
1333
|
defaultProps: true,
|
1334
|
displayName: true,
|
1335
|
propTypes: true,
|
1336
|
type: true
|
1337
|
};
|
1338
|
|
1339
|
var TYPE_STATICS = {};
|
1340
|
TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;
|
1341
|
|
1342
|
function getStatics(component) {
|
1343
|
if (reactIs.isMemo(component)) {
|
1344
|
return MEMO_STATICS;
|
1345
|
}
|
1346
|
return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;
|
1347
|
}
|
1348
|
|
1349
|
var defineProperty = Object.defineProperty;
|
1350
|
var getOwnPropertyNames = Object.getOwnPropertyNames;
|
1351
|
var getOwnPropertySymbols$1 = Object.getOwnPropertySymbols;
|
1352
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
1353
|
var getPrototypeOf = Object.getPrototypeOf;
|
1354
|
var objectPrototype = Object.prototype;
|
1355
|
|
1356
|
function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
|
1357
|
if (typeof sourceComponent !== 'string') {
|
1358
|
// don't hoist over string (html) components
|
1359
|
|
1360
|
if (objectPrototype) {
|
1361
|
var inheritedComponent = getPrototypeOf(sourceComponent);
|
1362
|
if (inheritedComponent && inheritedComponent !== objectPrototype) {
|
1363
|
hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
|
1364
|
}
|
1365
|
}
|
1366
|
|
1367
|
var keys = getOwnPropertyNames(sourceComponent);
|
1368
|
|
1369
|
if (getOwnPropertySymbols$1) {
|
1370
|
keys = keys.concat(getOwnPropertySymbols$1(sourceComponent));
|
1371
|
}
|
1372
|
|
1373
|
var targetStatics = getStatics(targetComponent);
|
1374
|
var sourceStatics = getStatics(sourceComponent);
|
1375
|
|
1376
|
for (var i = 0; i < keys.length; ++i) {
|
1377
|
var key = keys[i];
|
1378
|
if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
|
1379
|
var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
|
1380
|
try {
|
1381
|
// Avoid failures from read-only properties
|
1382
|
defineProperty(targetComponent, key, descriptor);
|
1383
|
} catch (e) {}
|
1384
|
}
|
1385
|
}
|
1386
|
|
1387
|
return targetComponent;
|
1388
|
}
|
1389
|
|
1390
|
return targetComponent;
|
1391
|
}
|
1392
|
|
1393
|
var hoistNonReactStatics_cjs = hoistNonReactStatics;
|
1394
|
|
1395
|
// To get around it, we can conditionally useEffect on the server (no-op) and
|
1396
|
// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store
|
1397
|
// subscription callback always has the selector from the latest render commit
|
1398
|
// available, otherwise a store update may happen between render and the effect,
|
1399
|
// which may cause missed updates; we also must ensure the store subscription
|
1400
|
// is created synchronously, otherwise a store update may occur before the
|
1401
|
// subscription is created and an inconsistent state may be observed
|
1402
|
|
1403
|
var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
1404
|
|
1405
|
var EMPTY_ARRAY = [];
|
1406
|
var NO_SUBSCRIPTION_ARRAY = [null, null];
|
1407
|
|
1408
|
var stringifyComponent = function stringifyComponent(Comp) {
|
1409
|
try {
|
1410
|
return JSON.stringify(Comp);
|
1411
|
} catch (err) {
|
1412
|
return String(Comp);
|
1413
|
}
|
1414
|
};
|
1415
|
|
1416
|
function storeStateUpdatesReducer(state, action) {
|
1417
|
var updateCount = state[1];
|
1418
|
return [action.payload, updateCount + 1];
|
1419
|
}
|
1420
|
|
1421
|
function useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {
|
1422
|
useIsomorphicLayoutEffect(function () {
|
1423
|
return effectFunc.apply(void 0, effectArgs);
|
1424
|
}, dependencies);
|
1425
|
}
|
1426
|
|
1427
|
function captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {
|
1428
|
// We want to capture the wrapper props and child props we used for later comparisons
|
1429
|
lastWrapperProps.current = wrapperProps;
|
1430
|
lastChildProps.current = actualChildProps;
|
1431
|
renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update
|
1432
|
|
1433
|
if (childPropsFromStoreUpdate.current) {
|
1434
|
childPropsFromStoreUpdate.current = null;
|
1435
|
notifyNestedSubs();
|
1436
|
}
|
1437
|
}
|
1438
|
|
1439
|
function subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {
|
1440
|
// If we're not subscribed to the store, nothing to do here
|
1441
|
if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts
|
1442
|
|
1443
|
var didUnsubscribe = false;
|
1444
|
var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component
|
1445
|
|
1446
|
var checkForUpdates = function checkForUpdates() {
|
1447
|
if (didUnsubscribe) {
|
1448
|
// Don't run stale listeners.
|
1449
|
// Redux doesn't guarantee unsubscriptions happen until next dispatch.
|
1450
|
return;
|
1451
|
}
|
1452
|
|
1453
|
var latestStoreState = store.getState();
|
1454
|
var newChildProps, error;
|
1455
|
|
1456
|
try {
|
1457
|
// Actually run the selector with the most recent store state and wrapper props
|
1458
|
// to determine what the child props should be
|
1459
|
newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);
|
1460
|
} catch (e) {
|
1461
|
error = e;
|
1462
|
lastThrownError = e;
|
1463
|
}
|
1464
|
|
1465
|
if (!error) {
|
1466
|
lastThrownError = null;
|
1467
|
} // If the child props haven't changed, nothing to do here - cascade the subscription update
|
1468
|
|
1469
|
|
1470
|
if (newChildProps === lastChildProps.current) {
|
1471
|
if (!renderIsScheduled.current) {
|
1472
|
notifyNestedSubs();
|
1473
|
}
|
1474
|
} else {
|
1475
|
// Save references to the new child props. Note that we track the "child props from store update"
|
1476
|
// as a ref instead of a useState/useReducer because we need a way to determine if that value has
|
1477
|
// been processed. If this went into useState/useReducer, we couldn't clear out the value without
|
1478
|
// forcing another re-render, which we don't want.
|
1479
|
lastChildProps.current = newChildProps;
|
1480
|
childPropsFromStoreUpdate.current = newChildProps;
|
1481
|
renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render
|
1482
|
|
1483
|
forceComponentUpdateDispatch({
|
1484
|
type: 'STORE_UPDATED',
|
1485
|
payload: {
|
1486
|
error: error
|
1487
|
}
|
1488
|
});
|
1489
|
}
|
1490
|
}; // Actually subscribe to the nearest connected ancestor (or store)
|
1491
|
|
1492
|
|
1493
|
subscription.onStateChange = checkForUpdates;
|
1494
|
subscription.trySubscribe(); // Pull data from the store after first render in case the store has
|
1495
|
// changed since we began.
|
1496
|
|
1497
|
checkForUpdates();
|
1498
|
|
1499
|
var unsubscribeWrapper = function unsubscribeWrapper() {
|
1500
|
didUnsubscribe = true;
|
1501
|
subscription.tryUnsubscribe();
|
1502
|
subscription.onStateChange = null;
|
1503
|
|
1504
|
if (lastThrownError) {
|
1505
|
// It's possible that we caught an error due to a bad mapState function, but the
|
1506
|
// parent re-rendered without this component and we're about to unmount.
|
1507
|
// This shouldn't happen as long as we do top-down subscriptions correctly, but
|
1508
|
// if we ever do those wrong, this throw will surface the error in our tests.
|
1509
|
// In that case, throw the error from here so it doesn't get lost.
|
1510
|
throw lastThrownError;
|
1511
|
}
|
1512
|
};
|
1513
|
|
1514
|
return unsubscribeWrapper;
|
1515
|
}
|
1516
|
|
1517
|
var initStateUpdates = function initStateUpdates() {
|
1518
|
return [null, 0];
|
1519
|
};
|
1520
|
|
1521
|
function connectAdvanced(
|
1522
|
/*
|
1523
|
selectorFactory is a func that is responsible for returning the selector function used to
|
1524
|
compute new props from state, props, and dispatch. For example:
|
1525
|
export default connectAdvanced((dispatch, options) => (state, props) => ({
|
1526
|
thing: state.things[props.thingId],
|
1527
|
saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),
|
1528
|
}))(YourComponent)
|
1529
|
Access to dispatch is provided to the factory so selectorFactories can bind actionCreators
|
1530
|
outside of their selector as an optimization. Options passed to connectAdvanced are passed to
|
1531
|
the selectorFactory, along with displayName and WrappedComponent, as the second argument.
|
1532
|
Note that selectorFactory is responsible for all caching/memoization of inbound and outbound
|
1533
|
props. Do not use connectAdvanced directly without memoizing results between calls to your
|
1534
|
selector, otherwise the Connect component will re-render on every state or props change.
|
1535
|
*/
|
1536
|
selectorFactory, // options object:
|
1537
|
_ref) {
|
1538
|
if (_ref === void 0) {
|
1539
|
_ref = {};
|
1540
|
}
|
1541
|
|
1542
|
var _ref2 = _ref,
|
1543
|
_ref2$getDisplayName = _ref2.getDisplayName,
|
1544
|
getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {
|
1545
|
return "ConnectAdvanced(" + name + ")";
|
1546
|
} : _ref2$getDisplayName,
|
1547
|
_ref2$methodName = _ref2.methodName,
|
1548
|
methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,
|
1549
|
_ref2$renderCountProp = _ref2.renderCountProp,
|
1550
|
renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,
|
1551
|
_ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,
|
1552
|
shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,
|
1553
|
_ref2$storeKey = _ref2.storeKey,
|
1554
|
storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,
|
1555
|
_ref2$withRef = _ref2.withRef,
|
1556
|
withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,
|
1557
|
_ref2$forwardRef = _ref2.forwardRef,
|
1558
|
forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,
|
1559
|
_ref2$context = _ref2.context,
|
1560
|
context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,
|
1561
|
connectOptions = _objectWithoutPropertiesLoose(_ref2, ["getDisplayName", "methodName", "renderCountProp", "shouldHandleStateChanges", "storeKey", "withRef", "forwardRef", "context"]);
|
1562
|
|
1563
|
{
|
1564
|
if (renderCountProp !== undefined) {
|
1565
|
throw new Error("renderCountProp is removed. render counting is built into the latest React Dev Tools profiling extension");
|
1566
|
}
|
1567
|
|
1568
|
if (withRef) {
|
1569
|
throw new Error('withRef is removed. To access the wrapped instance, use a ref on the connected component');
|
1570
|
}
|
1571
|
|
1572
|
var customStoreWarningMessage = 'To use a custom Redux store for specific components, create a custom React context with ' + "React.createContext(), and pass the context object to React Redux's Provider and specific components" + ' like: <Provider context={MyContext}><ConnectedComponent context={MyContext} /></Provider>. ' + 'You may also pass a {context : MyContext} option to connect';
|
1573
|
|
1574
|
if (storeKey !== 'store') {
|
1575
|
throw new Error('storeKey has been removed and does not do anything. ' + customStoreWarningMessage);
|
1576
|
}
|
1577
|
}
|
1578
|
|
1579
|
var Context = context;
|
1580
|
return function wrapWithConnect(WrappedComponent) {
|
1581
|
if ( !reactIs_1(WrappedComponent)) {
|
1582
|
throw new Error("You must pass a component to the function returned by " + (methodName + ". Instead received " + stringifyComponent(WrappedComponent)));
|
1583
|
}
|
1584
|
|
1585
|
var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';
|
1586
|
var displayName = getDisplayName(wrappedComponentName);
|
1587
|
|
1588
|
var selectorFactoryOptions = _extends({}, connectOptions, {
|
1589
|
getDisplayName: getDisplayName,
|
1590
|
methodName: methodName,
|
1591
|
renderCountProp: renderCountProp,
|
1592
|
shouldHandleStateChanges: shouldHandleStateChanges,
|
1593
|
storeKey: storeKey,
|
1594
|
displayName: displayName,
|
1595
|
wrappedComponentName: wrappedComponentName,
|
1596
|
WrappedComponent: WrappedComponent
|
1597
|
});
|
1598
|
|
1599
|
var pure = connectOptions.pure;
|
1600
|
|
1601
|
function createChildSelector(store) {
|
1602
|
return selectorFactory(store.dispatch, selectorFactoryOptions);
|
1603
|
} // If we aren't running in "pure" mode, we don't want to memoize values.
|
1604
|
// To avoid conditionally calling hooks, we fall back to a tiny wrapper
|
1605
|
// that just executes the given callback immediately.
|
1606
|
|
1607
|
|
1608
|
var usePureOnlyMemo = pure ? React.useMemo : function (callback) {
|
1609
|
return callback();
|
1610
|
};
|
1611
|
|
1612
|
function ConnectFunction(props) {
|
1613
|
var _useMemo = React.useMemo(function () {
|
1614
|
// Distinguish between actual "data" props that were passed to the wrapper component,
|
1615
|
// and values needed to control behavior (forwarded refs, alternate context instances).
|
1616
|
// To maintain the wrapperProps object reference, memoize this destructuring.
|
1617
|
var forwardedRef = props.forwardedRef,
|
1618
|
wrapperProps = _objectWithoutPropertiesLoose(props, ["forwardedRef"]);
|
1619
|
|
1620
|
return [props.context, forwardedRef, wrapperProps];
|
1621
|
}, [props]),
|
1622
|
propsContext = _useMemo[0],
|
1623
|
forwardedRef = _useMemo[1],
|
1624
|
wrapperProps = _useMemo[2];
|
1625
|
|
1626
|
var ContextToUse = React.useMemo(function () {
|
1627
|
// Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.
|
1628
|
// Memoize the check that determines which context instance we should use.
|
1629
|
return propsContext && propsContext.Consumer && reactIs_2(React__default.createElement(propsContext.Consumer, null)) ? propsContext : Context;
|
1630
|
}, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available
|
1631
|
|
1632
|
var contextValue = React.useContext(ContextToUse); // The store _must_ exist as either a prop or in context.
|
1633
|
// We'll check to see if it _looks_ like a Redux store first.
|
1634
|
// This allows us to pass through a `store` prop that is just a plain value.
|
1635
|
|
1636
|
var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);
|
1637
|
var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);
|
1638
|
|
1639
|
if ( !didStoreComeFromProps && !didStoreComeFromContext) {
|
1640
|
throw new Error("Could not find \"store\" in the context of " + ("\"" + displayName + "\". Either wrap the root component in a <Provider>, ") + "or pass a custom React context provider to <Provider> and the corresponding " + ("React context consumer to " + displayName + " in connect options."));
|
1641
|
} // Based on the previous check, one of these must be true
|
1642
|
|
1643
|
|
1644
|
var store = didStoreComeFromProps ? props.store : contextValue.store;
|
1645
|
var childPropsSelector = React.useMemo(function () {
|
1646
|
// The child props selector needs the store reference as an input.
|
1647
|
// Re-create this selector whenever the store changes.
|
1648
|
return createChildSelector(store);
|
1649
|
}, [store]);
|
1650
|
|
1651
|
var _useMemo2 = React.useMemo(function () {
|
1652
|
if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component
|
1653
|
// connected to the store via props shouldn't use subscription from context, or vice versa.
|
1654
|
|
1655
|
var subscription = new Subscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in
|
1656
|
// the middle of the notification loop, where `subscription` will then be null. This can
|
1657
|
// probably be avoided if Subscription's listeners logic is changed to not call listeners
|
1658
|
// that have been unsubscribed in the middle of the notification loop.
|
1659
|
|
1660
|
var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);
|
1661
|
return [subscription, notifyNestedSubs];
|
1662
|
}, [store, didStoreComeFromProps, contextValue]),
|
1663
|
subscription = _useMemo2[0],
|
1664
|
notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,
|
1665
|
// and memoize that value to avoid unnecessary context updates.
|
1666
|
|
1667
|
|
1668
|
var overriddenContextValue = React.useMemo(function () {
|
1669
|
if (didStoreComeFromProps) {
|
1670
|
// This component is directly subscribed to a store from props.
|
1671
|
// We don't want descendants reading from this store - pass down whatever
|
1672
|
// the existing context value is from the nearest connected ancestor.
|
1673
|
return contextValue;
|
1674
|
} // Otherwise, put this component's subscription instance into context, so that
|
1675
|
// connected descendants won't update until after this component is done
|
1676
|
|
1677
|
|
1678
|
return _extends({}, contextValue, {
|
1679
|
subscription: subscription
|
1680
|
});
|
1681
|
}, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update
|
1682
|
// causes a change to the calculated child component props (or we caught an error in mapState)
|
1683
|
|
1684
|
var _useReducer = React.useReducer(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),
|
1685
|
_useReducer$ = _useReducer[0],
|
1686
|
previousStateUpdateResult = _useReducer$[0],
|
1687
|
forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards
|
1688
|
|
1689
|
|
1690
|
if (previousStateUpdateResult && previousStateUpdateResult.error) {
|
1691
|
throw previousStateUpdateResult.error;
|
1692
|
} // Set up refs to coordinate values between the subscription effect and the render logic
|
1693
|
|
1694
|
|
1695
|
var lastChildProps = React.useRef();
|
1696
|
var lastWrapperProps = React.useRef(wrapperProps);
|
1697
|
var childPropsFromStoreUpdate = React.useRef();
|
1698
|
var renderIsScheduled = React.useRef(false);
|
1699
|
var actualChildProps = usePureOnlyMemo(function () {
|
1700
|
// Tricky logic here:
|
1701
|
// - This render may have been triggered by a Redux store update that produced new child props
|
1702
|
// - However, we may have gotten new wrapper props after that
|
1703
|
// If we have new child props, and the same wrapper props, we know we should use the new child props as-is.
|
1704
|
// But, if we have new wrapper props, those might change the child props, so we have to recalculate things.
|
1705
|
// So, we'll use the child props from store update only if the wrapper props are the same as last time.
|
1706
|
if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {
|
1707
|
return childPropsFromStoreUpdate.current;
|
1708
|
} // TODO We're reading the store directly in render() here. Bad idea?
|
1709
|
// This will likely cause Bad Things (TM) to happen in Concurrent Mode.
|
1710
|
// Note that we do this because on renders _not_ caused by store updates, we need the latest store state
|
1711
|
// to determine what the child props should be.
|
1712
|
|
1713
|
|
1714
|
return childPropsSelector(store.getState(), wrapperProps);
|
1715
|
}, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns
|
1716
|
// about useLayoutEffect in SSR, so we try to detect environment and fall back to
|
1717
|
// just useEffect instead to avoid the warning, since neither will run anyway.
|
1718
|
|
1719
|
useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes
|
1720
|
|
1721
|
useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that's done, we can finally try to actually render the child component.
|
1722
|
// We memoize the elements for the rendered child component as an optimization.
|
1723
|
|
1724
|
var renderedWrappedComponent = React.useMemo(function () {
|
1725
|
return React__default.createElement(WrappedComponent, _extends({}, actualChildProps, {
|
1726
|
ref: forwardedRef
|
1727
|
}));
|
1728
|
}, [forwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering
|
1729
|
// that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.
|
1730
|
|
1731
|
var renderedChild = React.useMemo(function () {
|
1732
|
if (shouldHandleStateChanges) {
|
1733
|
// If this component is subscribed to store updates, we need to pass its own
|
1734
|
// subscription instance down to our descendants. That means rendering the same
|
1735
|
// Context instance, and putting a different value into the context.
|
1736
|
return React__default.createElement(ContextToUse.Provider, {
|
1737
|
value: overriddenContextValue
|
1738
|
}, renderedWrappedComponent);
|
1739
|
}
|
1740
|
|
1741
|
return renderedWrappedComponent;
|
1742
|
}, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);
|
1743
|
return renderedChild;
|
1744
|
} // If we're in "pure" mode, ensure our wrapper component only re-renders when incoming props have changed.
|
1745
|
|
1746
|
|
1747
|
var Connect = pure ? React__default.memo(ConnectFunction) : ConnectFunction;
|
1748
|
Connect.WrappedComponent = WrappedComponent;
|
1749
|
Connect.displayName = displayName;
|
1750
|
|
1751
|
if (forwardRef) {
|
1752
|
var forwarded = React__default.forwardRef(function forwardConnectRef(props, ref) {
|
1753
|
return React__default.createElement(Connect, _extends({}, props, {
|
1754
|
forwardedRef: ref
|
1755
|
}));
|
1756
|
});
|
1757
|
forwarded.displayName = displayName;
|
1758
|
forwarded.WrappedComponent = WrappedComponent;
|
1759
|
return hoistNonReactStatics_cjs(forwarded, WrappedComponent);
|
1760
|
}
|
1761
|
|
1762
|
return hoistNonReactStatics_cjs(Connect, WrappedComponent);
|
1763
|
};
|
1764
|
}
|
1765
|
|
1766
|
function is(x, y) {
|
1767
|
if (x === y) {
|
1768
|
return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
1769
|
} else {
|
1770
|
return x !== x && y !== y;
|
1771
|
}
|
1772
|
}
|
1773
|
|
1774
|
function shallowEqual(objA, objB) {
|
1775
|
if (is(objA, objB)) return true;
|
1776
|
|
1777
|
if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
|
1778
|
return false;
|
1779
|
}
|
1780
|
|
1781
|
var keysA = Object.keys(objA);
|
1782
|
var keysB = Object.keys(objB);
|
1783
|
if (keysA.length !== keysB.length) return false;
|
1784
|
|
1785
|
for (var i = 0; i < keysA.length; i++) {
|
1786
|
if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
|
1787
|
return false;
|
1788
|
}
|
1789
|
}
|
1790
|
|
1791
|
return true;
|
1792
|
}
|
1793
|
|
1794
|
/**
|
1795
|
* @param {any} obj The object to inspect.
|
1796
|
* @returns {boolean} True if the argument appears to be a plain object.
|
1797
|
*/
|
1798
|
function isPlainObject(obj) {
|
1799
|
if (typeof obj !== 'object' || obj === null) return false;
|
1800
|
var proto = Object.getPrototypeOf(obj);
|
1801
|
if (proto === null) return true;
|
1802
|
var baseProto = proto;
|
1803
|
|
1804
|
while (Object.getPrototypeOf(baseProto) !== null) {
|
1805
|
baseProto = Object.getPrototypeOf(baseProto);
|
1806
|
}
|
1807
|
|
1808
|
return proto === baseProto;
|
1809
|
}
|
1810
|
|
1811
|
/**
|
1812
|
* Prints a warning in the console if it exists.
|
1813
|
*
|
1814
|
* @param {String} message The warning message.
|
1815
|
* @returns {void}
|
1816
|
*/
|
1817
|
function warning(message) {
|
1818
|
/* eslint-disable no-console */
|
1819
|
if (typeof console !== 'undefined' && typeof console.error === 'function') {
|
1820
|
console.error(message);
|
1821
|
}
|
1822
|
/* eslint-enable no-console */
|
1823
|
|
1824
|
|
1825
|
try {
|
1826
|
// This error was thrown as a convenience so that if you enable
|
1827
|
// "break on all exceptions" in your console,
|
1828
|
// it would pause the execution at this line.
|
1829
|
throw new Error(message);
|
1830
|
/* eslint-disable no-empty */
|
1831
|
} catch (e) {}
|
1832
|
/* eslint-enable no-empty */
|
1833
|
|
1834
|
}
|
1835
|
|
1836
|
function verifyPlainObject(value, displayName, methodName) {
|
1837
|
if (!isPlainObject(value)) {
|
1838
|
warning(methodName + "() in " + displayName + " must return a plain object. Instead received " + value + ".");
|
1839
|
}
|
1840
|
}
|
1841
|
|
1842
|
function wrapMapToPropsConstant(getConstant) {
|
1843
|
return function initConstantSelector(dispatch, options) {
|
1844
|
var constant = getConstant(dispatch, options);
|
1845
|
|
1846
|
function constantSelector() {
|
1847
|
return constant;
|
1848
|
}
|
1849
|
|
1850
|
constantSelector.dependsOnOwnProps = false;
|
1851
|
return constantSelector;
|
1852
|
};
|
1853
|
} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args
|
1854
|
// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine
|
1855
|
// whether mapToProps needs to be invoked when props have changed.
|
1856
|
//
|
1857
|
// A length of one signals that mapToProps does not depend on props from the parent component.
|
1858
|
// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and
|
1859
|
// therefore not reporting its length accurately..
|
1860
|
|
1861
|
function getDependsOnOwnProps(mapToProps) {
|
1862
|
return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;
|
1863
|
} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,
|
1864
|
// this function wraps mapToProps in a proxy function which does several things:
|
1865
|
//
|
1866
|
// * Detects whether the mapToProps function being called depends on props, which
|
1867
|
// is used by selectorFactory to decide if it should reinvoke on props changes.
|
1868
|
//
|
1869
|
// * On first call, handles mapToProps if returns another function, and treats that
|
1870
|
// new function as the true mapToProps for subsequent calls.
|
1871
|
//
|
1872
|
// * On first call, verifies the first result is a plain object, in order to warn
|
1873
|
// the developer that their mapToProps function is not returning a valid result.
|
1874
|
//
|
1875
|
|
1876
|
function wrapMapToPropsFunc(mapToProps, methodName) {
|
1877
|
return function initProxySelector(dispatch, _ref) {
|
1878
|
var displayName = _ref.displayName;
|
1879
|
|
1880
|
var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {
|
1881
|
return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);
|
1882
|
}; // allow detectFactoryAndVerify to get ownProps
|
1883
|
|
1884
|
|
1885
|
proxy.dependsOnOwnProps = true;
|
1886
|
|
1887
|
proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {
|
1888
|
proxy.mapToProps = mapToProps;
|
1889
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);
|
1890
|
var props = proxy(stateOrDispatch, ownProps);
|
1891
|
|
1892
|
if (typeof props === 'function') {
|
1893
|
proxy.mapToProps = props;
|
1894
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(props);
|
1895
|
props = proxy(stateOrDispatch, ownProps);
|
1896
|
}
|
1897
|
|
1898
|
verifyPlainObject(props, displayName, methodName);
|
1899
|
return props;
|
1900
|
};
|
1901
|
|
1902
|
return proxy;
|
1903
|
};
|
1904
|
}
|
1905
|
|
1906
|
function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {
|
1907
|
return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;
|
1908
|
}
|
1909
|
function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {
|
1910
|
return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {
|
1911
|
return {
|
1912
|
dispatch: dispatch
|
1913
|
};
|
1914
|
}) : undefined;
|
1915
|
}
|
1916
|
function whenMapDispatchToPropsIsObject(mapDispatchToProps) {
|
1917
|
return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {
|
1918
|
return redux.bindActionCreators(mapDispatchToProps, dispatch);
|
1919
|
}) : undefined;
|
1920
|
}
|
1921
|
var defaultMapDispatchToPropsFactories = [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject];
|
1922
|
|
1923
|
function whenMapStateToPropsIsFunction(mapStateToProps) {
|
1924
|
return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;
|
1925
|
}
|
1926
|
function whenMapStateToPropsIsMissing(mapStateToProps) {
|
1927
|
return !mapStateToProps ? wrapMapToPropsConstant(function () {
|
1928
|
return {};
|
1929
|
}) : undefined;
|
1930
|
}
|
1931
|
var defaultMapStateToPropsFactories = [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing];
|
1932
|
|
1933
|
function defaultMergeProps(stateProps, dispatchProps, ownProps) {
|
1934
|
return _extends({}, ownProps, {}, stateProps, {}, dispatchProps);
|
1935
|
}
|
1936
|
function wrapMergePropsFunc(mergeProps) {
|
1937
|
return function initMergePropsProxy(dispatch, _ref) {
|
1938
|
var displayName = _ref.displayName,
|
1939
|
pure = _ref.pure,
|
1940
|
areMergedPropsEqual = _ref.areMergedPropsEqual;
|
1941
|
var hasRunOnce = false;
|
1942
|
var mergedProps;
|
1943
|
return function mergePropsProxy(stateProps, dispatchProps, ownProps) {
|
1944
|
var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
1945
|
|
1946
|
if (hasRunOnce) {
|
1947
|
if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;
|
1948
|
} else {
|
1949
|
hasRunOnce = true;
|
1950
|
mergedProps = nextMergedProps;
|
1951
|
verifyPlainObject(mergedProps, displayName, 'mergeProps');
|
1952
|
}
|
1953
|
|
1954
|
return mergedProps;
|
1955
|
};
|
1956
|
};
|
1957
|
}
|
1958
|
function whenMergePropsIsFunction(mergeProps) {
|
1959
|
return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;
|
1960
|
}
|
1961
|
function whenMergePropsIsOmitted(mergeProps) {
|
1962
|
return !mergeProps ? function () {
|
1963
|
return defaultMergeProps;
|
1964
|
} : undefined;
|
1965
|
}
|
1966
|
var defaultMergePropsFactories = [whenMergePropsIsFunction, whenMergePropsIsOmitted];
|
1967
|
|
1968
|
function verify(selector, methodName, displayName) {
|
1969
|
if (!selector) {
|
1970
|
throw new Error("Unexpected value for " + methodName + " in " + displayName + ".");
|
1971
|
} else if (methodName === 'mapStateToProps' || methodName === 'mapDispatchToProps') {
|
1972
|
if (!Object.prototype.hasOwnProperty.call(selector, 'dependsOnOwnProps')) {
|
1973
|
warning("The selector for " + methodName + " of " + displayName + " did not specify a value for dependsOnOwnProps.");
|
1974
|
}
|
1975
|
}
|
1976
|
}
|
1977
|
|
1978
|
function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, displayName) {
|
1979
|
verify(mapStateToProps, 'mapStateToProps', displayName);
|
1980
|
verify(mapDispatchToProps, 'mapDispatchToProps', displayName);
|
1981
|
verify(mergeProps, 'mergeProps', displayName);
|
1982
|
}
|
1983
|
|
1984
|
function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {
|
1985
|
return function impureFinalPropsSelector(state, ownProps) {
|
1986
|
return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);
|
1987
|
};
|
1988
|
}
|
1989
|
function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {
|
1990
|
var areStatesEqual = _ref.areStatesEqual,
|
1991
|
areOwnPropsEqual = _ref.areOwnPropsEqual,
|
1992
|
areStatePropsEqual = _ref.areStatePropsEqual;
|
1993
|
var hasRunAtLeastOnce = false;
|
1994
|
var state;
|
1995
|
var ownProps;
|
1996
|
var stateProps;
|
1997
|
var dispatchProps;
|
1998
|
var mergedProps;
|
1999
|
|
2000
|
function handleFirstCall(firstState, firstOwnProps) {
|
2001
|
state = firstState;
|
2002
|
ownProps = firstOwnProps;
|
2003
|
stateProps = mapStateToProps(state, ownProps);
|
2004
|
dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
2005
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
2006
|
hasRunAtLeastOnce = true;
|
2007
|
return mergedProps;
|
2008
|
}
|
2009
|
|
2010
|
function handleNewPropsAndNewState() {
|
2011
|
stateProps = mapStateToProps(state, ownProps);
|
2012
|
if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
2013
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
2014
|
return mergedProps;
|
2015
|
}
|
2016
|
|
2017
|
function handleNewProps() {
|
2018
|
if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);
|
2019
|
if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
|
2020
|
mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
2021
|
return mergedProps;
|
2022
|
}
|
2023
|
|
2024
|
function handleNewState() {
|
2025
|
var nextStateProps = mapStateToProps(state, ownProps);
|
2026
|
var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);
|
2027
|
stateProps = nextStateProps;
|
2028
|
if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
|
2029
|
return mergedProps;
|
2030
|
}
|
2031
|
|
2032
|
function handleSubsequentCalls(nextState, nextOwnProps) {
|
2033
|
var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);
|
2034
|
var stateChanged = !areStatesEqual(nextState, state);
|
2035
|
state = nextState;
|
2036
|
ownProps = nextOwnProps;
|
2037
|
if (propsChanged && stateChanged) return handleNewPropsAndNewState();
|
2038
|
if (propsChanged) return handleNewProps();
|
2039
|
if (stateChanged) return handleNewState();
|
2040
|
return mergedProps;
|
2041
|
}
|
2042
|
|
2043
|
return function pureFinalPropsSelector(nextState, nextOwnProps) {
|
2044
|
return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);
|
2045
|
};
|
2046
|
} // TODO: Add more comments
|
2047
|
// If pure is true, the selector returned by selectorFactory will memoize its results,
|
2048
|
// allowing connectAdvanced's shouldComponentUpdate to return false if final
|
2049
|
// props have not changed. If false, the selector will always return a new
|
2050
|
// object and shouldComponentUpdate will always return true.
|
2051
|
|
2052
|
function finalPropsSelectorFactory(dispatch, _ref2) {
|
2053
|
var initMapStateToProps = _ref2.initMapStateToProps,
|
2054
|
initMapDispatchToProps = _ref2.initMapDispatchToProps,
|
2055
|
initMergeProps = _ref2.initMergeProps,
|
2056
|
options = _objectWithoutPropertiesLoose(_ref2, ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"]);
|
2057
|
|
2058
|
var mapStateToProps = initMapStateToProps(dispatch, options);
|
2059
|
var mapDispatchToProps = initMapDispatchToProps(dispatch, options);
|
2060
|
var mergeProps = initMergeProps(dispatch, options);
|
2061
|
|
2062
|
{
|
2063
|
verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);
|
2064
|
}
|
2065
|
|
2066
|
var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;
|
2067
|
return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
|
2068
|
}
|
2069
|
|
2070
|
/*
|
2071
|
connect is a facade over connectAdvanced. It turns its args into a compatible
|
2072
|
selectorFactory, which has the signature:
|
2073
|
|
2074
|
(dispatch, options) => (nextState, nextOwnProps) => nextFinalProps
|
2075
|
|
2076
|
connect passes its args to connectAdvanced as options, which will in turn pass them to
|
2077
|
selectorFactory each time a Connect component instance is instantiated or hot reloaded.
|
2078
|
|
2079
|
selectorFactory returns a final props selector from its mapStateToProps,
|
2080
|
mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,
|
2081
|
mergePropsFactories, and pure args.
|
2082
|
|
2083
|
The resulting final props selector is called by the Connect component instance whenever
|
2084
|
it receives new props or store state.
|
2085
|
*/
|
2086
|
|
2087
|
function match(arg, factories, name) {
|
2088
|
for (var i = factories.length - 1; i >= 0; i--) {
|
2089
|
var result = factories[i](arg);
|
2090
|
if (result) return result;
|
2091
|
}
|
2092
|
|
2093
|
return function (dispatch, options) {
|
2094
|
throw new Error("Invalid value of type " + typeof arg + " for " + name + " argument when connecting component " + options.wrappedComponentName + ".");
|
2095
|
};
|
2096
|
}
|
2097
|
|
2098
|
function strictEqual(a, b) {
|
2099
|
return a === b;
|
2100
|
} // createConnect with default args builds the 'official' connect behavior. Calling it with
|
2101
|
// different options opens up some testing and extensibility scenarios
|
2102
|
|
2103
|
|
2104
|
function createConnect(_temp) {
|
2105
|
var _ref = _temp === void 0 ? {} : _temp,
|
2106
|
_ref$connectHOC = _ref.connectHOC,
|
2107
|
connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,
|
2108
|
_ref$mapStateToPropsF = _ref.mapStateToPropsFactories,
|
2109
|
mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? defaultMapStateToPropsFactories : _ref$mapStateToPropsF,
|
2110
|
_ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,
|
2111
|
mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? defaultMapDispatchToPropsFactories : _ref$mapDispatchToPro,
|
2112
|
_ref$mergePropsFactor = _ref.mergePropsFactories,
|
2113
|
mergePropsFactories = _ref$mergePropsFactor === void 0 ? defaultMergePropsFactories : _ref$mergePropsFactor,
|
2114
|
_ref$selectorFactory = _ref.selectorFactory,
|
2115
|
selectorFactory = _ref$selectorFactory === void 0 ? finalPropsSelectorFactory : _ref$selectorFactory;
|
2116
|
|
2117
|
return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {
|
2118
|
if (_ref2 === void 0) {
|
2119
|
_ref2 = {};
|
2120
|
}
|
2121
|
|
2122
|
var _ref3 = _ref2,
|
2123
|
_ref3$pure = _ref3.pure,
|
2124
|
pure = _ref3$pure === void 0 ? true : _ref3$pure,
|
2125
|
_ref3$areStatesEqual = _ref3.areStatesEqual,
|
2126
|
areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,
|
2127
|
_ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,
|
2128
|
areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,
|
2129
|
_ref3$areStatePropsEq = _ref3.areStatePropsEqual,
|
2130
|
areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,
|
2131
|
_ref3$areMergedPropsE = _ref3.areMergedPropsEqual,
|
2132
|
areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,
|
2133
|
extraOptions = _objectWithoutPropertiesLoose(_ref3, ["pure", "areStatesEqual", "areOwnPropsEqual", "areStatePropsEqual", "areMergedPropsEqual"]);
|
2134
|
|
2135
|
var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');
|
2136
|
var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');
|
2137
|
var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');
|
2138
|
return connectHOC(selectorFactory, _extends({
|
2139
|
// used in error messages
|
2140
|
methodName: 'connect',
|
2141
|
// used to compute Connect's displayName from the wrapped component's displayName.
|
2142
|
getDisplayName: function getDisplayName(name) {
|
2143
|
return "Connect(" + name + ")";
|
2144
|
},
|
2145
|
// if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes
|
2146
|
shouldHandleStateChanges: Boolean(mapStateToProps),
|
2147
|
// passed through to selectorFactory
|
2148
|
initMapStateToProps: initMapStateToProps,
|
2149
|
initMapDispatchToProps: initMapDispatchToProps,
|
2150
|
initMergeProps: initMergeProps,
|
2151
|
pure: pure,
|
2152
|
areStatesEqual: areStatesEqual,
|
2153
|
areOwnPropsEqual: areOwnPropsEqual,
|
2154
|
areStatePropsEqual: areStatePropsEqual,
|
2155
|
areMergedPropsEqual: areMergedPropsEqual
|
2156
|
}, extraOptions));
|
2157
|
};
|
2158
|
}
|
2159
|
var connect = /*#__PURE__*/
|
2160
|
createConnect();
|
2161
|
|
2162
|
/**
|
2163
|
* A hook to access the value of the `ReactReduxContext`. This is a low-level
|
2164
|
* hook that you should usually not need to call directly.
|
2165
|
*
|
2166
|
* @returns {any} the value of the `ReactReduxContext`
|
2167
|
*
|
2168
|
* @example
|
2169
|
*
|
2170
|
* import React from 'react'
|
2171
|
* import { useReduxContext } from 'react-redux'
|
2172
|
*
|
2173
|
* export const CounterComponent = ({ value }) => {
|
2174
|
* const { store } = useReduxContext()
|
2175
|
* return <div>{store.getState()}</div>
|
2176
|
* }
|
2177
|
*/
|
2178
|
|
2179
|
function useReduxContext() {
|
2180
|
var contextValue = React.useContext(ReactReduxContext);
|
2181
|
|
2182
|
if ( !contextValue) {
|
2183
|
throw new Error('could not find react-redux context value; please ensure the component is wrapped in a <Provider>');
|
2184
|
}
|
2185
|
|
2186
|
return contextValue;
|
2187
|
}
|
2188
|
|
2189
|
/**
|
2190
|
* Hook factory, which creates a `useStore` hook bound to a given context.
|
2191
|
*
|
2192
|
* @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.
|
2193
|
* @returns {Function} A `useStore` hook bound to the specified context.
|
2194
|
*/
|
2195
|
|
2196
|
function createStoreHook(context) {
|
2197
|
if (context === void 0) {
|
2198
|
context = ReactReduxContext;
|
2199
|
}
|
2200
|
|
2201
|
var useReduxContext$1 = context === ReactReduxContext ? useReduxContext : function () {
|
2202
|
return React.useContext(context);
|
2203
|
};
|
2204
|
return function useStore() {
|
2205
|
var _useReduxContext = useReduxContext$1(),
|
2206
|
store = _useReduxContext.store;
|
2207
|
|
2208
|
return store;
|
2209
|
};
|
2210
|
}
|
2211
|
/**
|
2212
|
* A hook to access the redux store.
|
2213
|
*
|
2214
|
* @returns {any} the redux store
|
2215
|
*
|
2216
|
* @example
|
2217
|
*
|
2218
|
* import React from 'react'
|
2219
|
* import { useStore } from 'react-redux'
|
2220
|
*
|
2221
|
* export const ExampleComponent = () => {
|
2222
|
* const store = useStore()
|
2223
|
* return <div>{store.getState()}</div>
|
2224
|
* }
|
2225
|
*/
|
2226
|
|
2227
|
var useStore =
|
2228
|
/*#__PURE__*/
|
2229
|
createStoreHook();
|
2230
|
|
2231
|
/**
|
2232
|
* Hook factory, which creates a `useDispatch` hook bound to a given context.
|
2233
|
*
|
2234
|
* @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.
|
2235
|
* @returns {Function} A `useDispatch` hook bound to the specified context.
|
2236
|
*/
|
2237
|
|
2238
|
function createDispatchHook(context) {
|
2239
|
if (context === void 0) {
|
2240
|
context = ReactReduxContext;
|
2241
|
}
|
2242
|
|
2243
|
var useStore$1 = context === ReactReduxContext ? useStore : createStoreHook(context);
|
2244
|
return function useDispatch() {
|
2245
|
var store = useStore$1();
|
2246
|
return store.dispatch;
|
2247
|
};
|
2248
|
}
|
2249
|
/**
|
2250
|
* A hook to access the redux `dispatch` function.
|
2251
|
*
|
2252
|
* @returns {any|function} redux store's `dispatch` function
|
2253
|
*
|
2254
|
* @example
|
2255
|
*
|
2256
|
* import React, { useCallback } from 'react'
|
2257
|
* import { useDispatch } from 'react-redux'
|
2258
|
*
|
2259
|
* export const CounterComponent = ({ value }) => {
|
2260
|
* const dispatch = useDispatch()
|
2261
|
* const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), [])
|
2262
|
* return (
|
2263
|
* <div>
|
2264
|
* <span>{value}</span>
|
2265
|
* <button onClick={increaseCounter}>Increase counter</button>
|
2266
|
* </div>
|
2267
|
* )
|
2268
|
* }
|
2269
|
*/
|
2270
|
|
2271
|
var useDispatch =
|
2272
|
/*#__PURE__*/
|
2273
|
createDispatchHook();
|
2274
|
|
2275
|
var refEquality = function refEquality(a, b) {
|
2276
|
return a === b;
|
2277
|
};
|
2278
|
|
2279
|
function useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub) {
|
2280
|
var _useReducer = React.useReducer(function (s) {
|
2281
|
return s + 1;
|
2282
|
}, 0),
|
2283
|
forceRender = _useReducer[1];
|
2284
|
|
2285
|
var subscription = React.useMemo(function () {
|
2286
|
return new Subscription(store, contextSub);
|
2287
|
}, [store, contextSub]);
|
2288
|
var latestSubscriptionCallbackError = React.useRef();
|
2289
|
var latestSelector = React.useRef();
|
2290
|
var latestSelectedState = React.useRef();
|
2291
|
var selectedState;
|
2292
|
|
2293
|
try {
|
2294
|
if (selector !== latestSelector.current || latestSubscriptionCallbackError.current) {
|
2295
|
selectedState = selector(store.getState());
|
2296
|
} else {
|
2297
|
selectedState = latestSelectedState.current;
|
2298
|
}
|
2299
|
} catch (err) {
|
2300
|
if (latestSubscriptionCallbackError.current) {
|
2301
|
err.message += "\nThe error may be correlated with this previous error:\n" + latestSubscriptionCallbackError.current.stack + "\n\n";
|
2302
|
}
|
2303
|
|
2304
|
throw err;
|
2305
|
}
|
2306
|
|
2307
|
useIsomorphicLayoutEffect(function () {
|
2308
|
latestSelector.current = selector;
|
2309
|
latestSelectedState.current = selectedState;
|
2310
|
latestSubscriptionCallbackError.current = undefined;
|
2311
|
});
|
2312
|
useIsomorphicLayoutEffect(function () {
|
2313
|
function checkForUpdates() {
|
2314
|
try {
|
2315
|
var newSelectedState = latestSelector.current(store.getState());
|
2316
|
|
2317
|
if (equalityFn(newSelectedState, latestSelectedState.current)) {
|
2318
|
return;
|
2319
|
}
|
2320
|
|
2321
|
latestSelectedState.current = newSelectedState;
|
2322
|
} catch (err) {
|
2323
|
// we ignore all errors here, since when the component
|
2324
|
// is re-rendered, the selectors are called again, and
|
2325
|
// will throw again, if neither props nor store state
|
2326
|
// changed
|
2327
|
latestSubscriptionCallbackError.current = err;
|
2328
|
}
|
2329
|
|
2330
|
forceRender({});
|
2331
|
}
|
2332
|
|
2333
|
subscription.onStateChange = checkForUpdates;
|
2334
|
subscription.trySubscribe();
|
2335
|
checkForUpdates();
|
2336
|
return function () {
|
2337
|
return subscription.tryUnsubscribe();
|
2338
|
};
|
2339
|
}, [store, subscription]);
|
2340
|
return selectedState;
|
2341
|
}
|
2342
|
/**
|
2343
|
* Hook factory, which creates a `useSelector` hook bound to a given context.
|
2344
|
*
|
2345
|
* @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.
|
2346
|
* @returns {Function} A `useSelector` hook bound to the specified context.
|
2347
|
*/
|
2348
|
|
2349
|
|
2350
|
function createSelectorHook(context) {
|
2351
|
if (context === void 0) {
|
2352
|
context = ReactReduxContext;
|
2353
|
}
|
2354
|
|
2355
|
var useReduxContext$1 = context === ReactReduxContext ? useReduxContext : function () {
|
2356
|
return React.useContext(context);
|
2357
|
};
|
2358
|
return function useSelector(selector, equalityFn) {
|
2359
|
if (equalityFn === void 0) {
|
2360
|
equalityFn = refEquality;
|
2361
|
}
|
2362
|
|
2363
|
if ( !selector) {
|
2364
|
throw new Error("You must pass a selector to useSelectors");
|
2365
|
}
|
2366
|
|
2367
|
var _useReduxContext = useReduxContext$1(),
|
2368
|
store = _useReduxContext.store,
|
2369
|
contextSub = _useReduxContext.subscription;
|
2370
|
|
2371
|
return useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub);
|
2372
|
};
|
2373
|
}
|
2374
|
/**
|
2375
|
* A hook to access the redux store's state. This hook takes a selector function
|
2376
|
* as an argument. The selector is called with the store state.
|
2377
|
*
|
2378
|
* This hook takes an optional equality comparison function as the second parameter
|
2379
|
* that allows you to customize the way the selected state is compared to determine
|
2380
|
* whether the component needs to be re-rendered.
|
2381
|
*
|
2382
|
* @param {Function} selector the selector function
|
2383
|
* @param {Function=} equalityFn the function that will be used to determine equality
|
2384
|
*
|
2385
|
* @returns {any} the selected state
|
2386
|
*
|
2387
|
* @example
|
2388
|
*
|
2389
|
* import React from 'react'
|
2390
|
* import { useSelector } from 'react-redux'
|
2391
|
*
|
2392
|
* export const CounterComponent = () => {
|
2393
|
* const counter = useSelector(state => state.counter)
|
2394
|
* return <div>{counter}</div>
|
2395
|
* }
|
2396
|
*/
|
2397
|
|
2398
|
var useSelector =
|
2399
|
/*#__PURE__*/
|
2400
|
createSelectorHook();
|
2401
|
|
2402
|
setBatch(reactDom.unstable_batchedUpdates);
|
2403
|
|
2404
|
Object.defineProperty(exports, 'batch', {
|
2405
|
enumerable: true,
|
2406
|
get: function () {
|
2407
|
return reactDom.unstable_batchedUpdates;
|
2408
|
}
|
2409
|
});
|
2410
|
exports.Provider = Provider;
|
2411
|
exports.ReactReduxContext = ReactReduxContext;
|
2412
|
exports.connect = connect;
|
2413
|
exports.connectAdvanced = connectAdvanced;
|
2414
|
exports.createDispatchHook = createDispatchHook;
|
2415
|
exports.createSelectorHook = createSelectorHook;
|
2416
|
exports.createStoreHook = createStoreHook;
|
2417
|
exports.shallowEqual = shallowEqual;
|
2418
|
exports.useDispatch = useDispatch;
|
2419
|
exports.useSelector = useSelector;
|
2420
|
exports.useStore = useStore;
|
2421
|
|
2422
|
Object.defineProperty(exports, '__esModule', { value: true });
|
2423
|
|
2424
|
}));
|