1
|
(function (global, factory) {
|
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
|
3
|
typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
|
4
|
(global = global || self, factory(global.ReactRouterDOM = {}, global.React));
|
5
|
}(this, function (exports, React) { 'use strict';
|
6
|
|
7
|
var React__default = 'default' in React ? React['default'] : React;
|
8
|
|
9
|
function _inheritsLoose(subClass, superClass) {
|
10
|
subClass.prototype = Object.create(superClass.prototype);
|
11
|
subClass.prototype.constructor = subClass;
|
12
|
subClass.__proto__ = superClass;
|
13
|
}
|
14
|
|
15
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
16
|
|
17
|
function unwrapExports (x) {
|
18
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
19
|
}
|
20
|
|
21
|
function createCommonjsModule(fn, module) {
|
22
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
23
|
}
|
24
|
|
25
|
var reactIs_production_min = createCommonjsModule(function (module, exports) {
|
26
|
Object.defineProperty(exports,"__esModule",{value:!0});
|
27
|
var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?Symbol.for("react.suspense_list"):
|
28
|
60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.fundamental"):60117,w=b?Symbol.for("react.responder"):60118;function x(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case h:return a;default:return u}}case t:case r:case d:return u}}}function y(a){return x(a)===m}exports.typeOf=x;exports.AsyncMode=l;
|
29
|
exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;
|
30
|
exports.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===v||a.$$typeof===w)};exports.isAsyncMode=function(a){return y(a)||x(a)===l};exports.isConcurrentMode=y;exports.isContextConsumer=function(a){return x(a)===k};exports.isContextProvider=function(a){return x(a)===h};
|
31
|
exports.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return x(a)===n};exports.isFragment=function(a){return x(a)===e};exports.isLazy=function(a){return x(a)===t};exports.isMemo=function(a){return x(a)===r};exports.isPortal=function(a){return x(a)===d};exports.isProfiler=function(a){return x(a)===g};exports.isStrictMode=function(a){return x(a)===f};exports.isSuspense=function(a){return x(a)===p};
|
32
|
});
|
33
|
|
34
|
unwrapExports(reactIs_production_min);
|
35
|
var reactIs_production_min_1 = reactIs_production_min.typeOf;
|
36
|
var reactIs_production_min_2 = reactIs_production_min.AsyncMode;
|
37
|
var reactIs_production_min_3 = reactIs_production_min.ConcurrentMode;
|
38
|
var reactIs_production_min_4 = reactIs_production_min.ContextConsumer;
|
39
|
var reactIs_production_min_5 = reactIs_production_min.ContextProvider;
|
40
|
var reactIs_production_min_6 = reactIs_production_min.Element;
|
41
|
var reactIs_production_min_7 = reactIs_production_min.ForwardRef;
|
42
|
var reactIs_production_min_8 = reactIs_production_min.Fragment;
|
43
|
var reactIs_production_min_9 = reactIs_production_min.Lazy;
|
44
|
var reactIs_production_min_10 = reactIs_production_min.Memo;
|
45
|
var reactIs_production_min_11 = reactIs_production_min.Portal;
|
46
|
var reactIs_production_min_12 = reactIs_production_min.Profiler;
|
47
|
var reactIs_production_min_13 = reactIs_production_min.StrictMode;
|
48
|
var reactIs_production_min_14 = reactIs_production_min.Suspense;
|
49
|
var reactIs_production_min_15 = reactIs_production_min.isValidElementType;
|
50
|
var reactIs_production_min_16 = reactIs_production_min.isAsyncMode;
|
51
|
var reactIs_production_min_17 = reactIs_production_min.isConcurrentMode;
|
52
|
var reactIs_production_min_18 = reactIs_production_min.isContextConsumer;
|
53
|
var reactIs_production_min_19 = reactIs_production_min.isContextProvider;
|
54
|
var reactIs_production_min_20 = reactIs_production_min.isElement;
|
55
|
var reactIs_production_min_21 = reactIs_production_min.isForwardRef;
|
56
|
var reactIs_production_min_22 = reactIs_production_min.isFragment;
|
57
|
var reactIs_production_min_23 = reactIs_production_min.isLazy;
|
58
|
var reactIs_production_min_24 = reactIs_production_min.isMemo;
|
59
|
var reactIs_production_min_25 = reactIs_production_min.isPortal;
|
60
|
var reactIs_production_min_26 = reactIs_production_min.isProfiler;
|
61
|
var reactIs_production_min_27 = reactIs_production_min.isStrictMode;
|
62
|
var reactIs_production_min_28 = reactIs_production_min.isSuspense;
|
63
|
|
64
|
var reactIs_development = createCommonjsModule(function (module, exports) {
|
65
|
|
66
|
|
67
|
|
68
|
{
|
69
|
(function() {
|
70
|
|
71
|
Object.defineProperty(exports, '__esModule', { value: true });
|
72
|
|
73
|
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
74
|
// nor polyfill, then a plain number is used for performance.
|
75
|
var hasSymbol = typeof Symbol === 'function' && Symbol.for;
|
76
|
|
77
|
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
|
78
|
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
|
79
|
var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
|
80
|
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
|
81
|
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
|
82
|
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
|
83
|
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace;
|
84
|
// TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
|
85
|
// (unstable) APIs that have been removed. Can we remove the symbols?
|
86
|
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
|
87
|
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
|
88
|
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
|
89
|
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
|
90
|
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
|
91
|
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
|
92
|
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
|
93
|
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
|
94
|
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
|
95
|
|
96
|
function isValidElementType(type) {
|
97
|
return typeof type === 'string' || typeof type === 'function' ||
|
98
|
// Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
|
99
|
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);
|
100
|
}
|
101
|
|
102
|
/**
|
103
|
* Forked from fbjs/warning:
|
104
|
* https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
|
105
|
*
|
106
|
* Only change is we use console.warn instead of console.error,
|
107
|
* and do nothing when 'console' is not supported.
|
108
|
* This really simplifies the code.
|
109
|
* ---
|
110
|
* Similar to invariant but only logs a warning if the condition is not met.
|
111
|
* This can be used to log issues in development environments in critical
|
112
|
* paths. Removing the logging code for production environments will keep the
|
113
|
* same logic and follow the same code paths.
|
114
|
*/
|
115
|
|
116
|
var lowPriorityWarning = function () {};
|
117
|
|
118
|
{
|
119
|
var printWarning = function (format) {
|
120
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
121
|
args[_key - 1] = arguments[_key];
|
122
|
}
|
123
|
|
124
|
var argIndex = 0;
|
125
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
126
|
return args[argIndex++];
|
127
|
});
|
128
|
if (typeof console !== 'undefined') {
|
129
|
console.warn(message);
|
130
|
}
|
131
|
try {
|
132
|
// --- Welcome to debugging React ---
|
133
|
// This error was thrown as a convenience so that you can use this stack
|
134
|
// to find the callsite that caused this warning to fire.
|
135
|
throw new Error(message);
|
136
|
} catch (x) {}
|
137
|
};
|
138
|
|
139
|
lowPriorityWarning = function (condition, format) {
|
140
|
if (format === undefined) {
|
141
|
throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
|
142
|
}
|
143
|
if (!condition) {
|
144
|
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
145
|
args[_key2 - 2] = arguments[_key2];
|
146
|
}
|
147
|
|
148
|
printWarning.apply(undefined, [format].concat(args));
|
149
|
}
|
150
|
};
|
151
|
}
|
152
|
|
153
|
var lowPriorityWarning$1 = lowPriorityWarning;
|
154
|
|
155
|
function typeOf(object) {
|
156
|
if (typeof object === 'object' && object !== null) {
|
157
|
var $$typeof = object.$$typeof;
|
158
|
switch ($$typeof) {
|
159
|
case REACT_ELEMENT_TYPE:
|
160
|
var type = object.type;
|
161
|
|
162
|
switch (type) {
|
163
|
case REACT_ASYNC_MODE_TYPE:
|
164
|
case REACT_CONCURRENT_MODE_TYPE:
|
165
|
case REACT_FRAGMENT_TYPE:
|
166
|
case REACT_PROFILER_TYPE:
|
167
|
case REACT_STRICT_MODE_TYPE:
|
168
|
case REACT_SUSPENSE_TYPE:
|
169
|
return type;
|
170
|
default:
|
171
|
var $$typeofType = type && type.$$typeof;
|
172
|
|
173
|
switch ($$typeofType) {
|
174
|
case REACT_CONTEXT_TYPE:
|
175
|
case REACT_FORWARD_REF_TYPE:
|
176
|
case REACT_PROVIDER_TYPE:
|
177
|
return $$typeofType;
|
178
|
default:
|
179
|
return $$typeof;
|
180
|
}
|
181
|
}
|
182
|
case REACT_LAZY_TYPE:
|
183
|
case REACT_MEMO_TYPE:
|
184
|
case REACT_PORTAL_TYPE:
|
185
|
return $$typeof;
|
186
|
}
|
187
|
}
|
188
|
|
189
|
return undefined;
|
190
|
}
|
191
|
|
192
|
// AsyncMode is deprecated along with isAsyncMode
|
193
|
var AsyncMode = REACT_ASYNC_MODE_TYPE;
|
194
|
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
|
195
|
var ContextConsumer = REACT_CONTEXT_TYPE;
|
196
|
var ContextProvider = REACT_PROVIDER_TYPE;
|
197
|
var Element = REACT_ELEMENT_TYPE;
|
198
|
var ForwardRef = REACT_FORWARD_REF_TYPE;
|
199
|
var Fragment = REACT_FRAGMENT_TYPE;
|
200
|
var Lazy = REACT_LAZY_TYPE;
|
201
|
var Memo = REACT_MEMO_TYPE;
|
202
|
var Portal = REACT_PORTAL_TYPE;
|
203
|
var Profiler = REACT_PROFILER_TYPE;
|
204
|
var StrictMode = REACT_STRICT_MODE_TYPE;
|
205
|
var Suspense = REACT_SUSPENSE_TYPE;
|
206
|
|
207
|
var hasWarnedAboutDeprecatedIsAsyncMode = false;
|
208
|
|
209
|
// AsyncMode should be deprecated
|
210
|
function isAsyncMode(object) {
|
211
|
{
|
212
|
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
|
213
|
hasWarnedAboutDeprecatedIsAsyncMode = true;
|
214
|
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.');
|
215
|
}
|
216
|
}
|
217
|
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
|
218
|
}
|
219
|
function isConcurrentMode(object) {
|
220
|
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
|
221
|
}
|
222
|
function isContextConsumer(object) {
|
223
|
return typeOf(object) === REACT_CONTEXT_TYPE;
|
224
|
}
|
225
|
function isContextProvider(object) {
|
226
|
return typeOf(object) === REACT_PROVIDER_TYPE;
|
227
|
}
|
228
|
function isElement(object) {
|
229
|
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
230
|
}
|
231
|
function isForwardRef(object) {
|
232
|
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
233
|
}
|
234
|
function isFragment(object) {
|
235
|
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
236
|
}
|
237
|
function isLazy(object) {
|
238
|
return typeOf(object) === REACT_LAZY_TYPE;
|
239
|
}
|
240
|
function isMemo(object) {
|
241
|
return typeOf(object) === REACT_MEMO_TYPE;
|
242
|
}
|
243
|
function isPortal(object) {
|
244
|
return typeOf(object) === REACT_PORTAL_TYPE;
|
245
|
}
|
246
|
function isProfiler(object) {
|
247
|
return typeOf(object) === REACT_PROFILER_TYPE;
|
248
|
}
|
249
|
function isStrictMode(object) {
|
250
|
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
251
|
}
|
252
|
function isSuspense(object) {
|
253
|
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
254
|
}
|
255
|
|
256
|
exports.typeOf = typeOf;
|
257
|
exports.AsyncMode = AsyncMode;
|
258
|
exports.ConcurrentMode = ConcurrentMode;
|
259
|
exports.ContextConsumer = ContextConsumer;
|
260
|
exports.ContextProvider = ContextProvider;
|
261
|
exports.Element = Element;
|
262
|
exports.ForwardRef = ForwardRef;
|
263
|
exports.Fragment = Fragment;
|
264
|
exports.Lazy = Lazy;
|
265
|
exports.Memo = Memo;
|
266
|
exports.Portal = Portal;
|
267
|
exports.Profiler = Profiler;
|
268
|
exports.StrictMode = StrictMode;
|
269
|
exports.Suspense = Suspense;
|
270
|
exports.isValidElementType = isValidElementType;
|
271
|
exports.isAsyncMode = isAsyncMode;
|
272
|
exports.isConcurrentMode = isConcurrentMode;
|
273
|
exports.isContextConsumer = isContextConsumer;
|
274
|
exports.isContextProvider = isContextProvider;
|
275
|
exports.isElement = isElement;
|
276
|
exports.isForwardRef = isForwardRef;
|
277
|
exports.isFragment = isFragment;
|
278
|
exports.isLazy = isLazy;
|
279
|
exports.isMemo = isMemo;
|
280
|
exports.isPortal = isPortal;
|
281
|
exports.isProfiler = isProfiler;
|
282
|
exports.isStrictMode = isStrictMode;
|
283
|
exports.isSuspense = isSuspense;
|
284
|
})();
|
285
|
}
|
286
|
});
|
287
|
|
288
|
unwrapExports(reactIs_development);
|
289
|
var reactIs_development_1 = reactIs_development.typeOf;
|
290
|
var reactIs_development_2 = reactIs_development.AsyncMode;
|
291
|
var reactIs_development_3 = reactIs_development.ConcurrentMode;
|
292
|
var reactIs_development_4 = reactIs_development.ContextConsumer;
|
293
|
var reactIs_development_5 = reactIs_development.ContextProvider;
|
294
|
var reactIs_development_6 = reactIs_development.Element;
|
295
|
var reactIs_development_7 = reactIs_development.ForwardRef;
|
296
|
var reactIs_development_8 = reactIs_development.Fragment;
|
297
|
var reactIs_development_9 = reactIs_development.Lazy;
|
298
|
var reactIs_development_10 = reactIs_development.Memo;
|
299
|
var reactIs_development_11 = reactIs_development.Portal;
|
300
|
var reactIs_development_12 = reactIs_development.Profiler;
|
301
|
var reactIs_development_13 = reactIs_development.StrictMode;
|
302
|
var reactIs_development_14 = reactIs_development.Suspense;
|
303
|
var reactIs_development_15 = reactIs_development.isValidElementType;
|
304
|
var reactIs_development_16 = reactIs_development.isAsyncMode;
|
305
|
var reactIs_development_17 = reactIs_development.isConcurrentMode;
|
306
|
var reactIs_development_18 = reactIs_development.isContextConsumer;
|
307
|
var reactIs_development_19 = reactIs_development.isContextProvider;
|
308
|
var reactIs_development_20 = reactIs_development.isElement;
|
309
|
var reactIs_development_21 = reactIs_development.isForwardRef;
|
310
|
var reactIs_development_22 = reactIs_development.isFragment;
|
311
|
var reactIs_development_23 = reactIs_development.isLazy;
|
312
|
var reactIs_development_24 = reactIs_development.isMemo;
|
313
|
var reactIs_development_25 = reactIs_development.isPortal;
|
314
|
var reactIs_development_26 = reactIs_development.isProfiler;
|
315
|
var reactIs_development_27 = reactIs_development.isStrictMode;
|
316
|
var reactIs_development_28 = reactIs_development.isSuspense;
|
317
|
|
318
|
var reactIs = createCommonjsModule(function (module) {
|
319
|
|
320
|
{
|
321
|
module.exports = reactIs_development;
|
322
|
}
|
323
|
});
|
324
|
var reactIs_1 = reactIs.isValidElementType;
|
325
|
|
326
|
/*
|
327
|
object-assign
|
328
|
(c) Sindre Sorhus
|
329
|
@license MIT
|
330
|
*/
|
331
|
/* eslint-disable no-unused-vars */
|
332
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
333
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
334
|
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
335
|
|
336
|
function toObject(val) {
|
337
|
if (val === null || val === undefined) {
|
338
|
throw new TypeError('Object.assign cannot be called with null or undefined');
|
339
|
}
|
340
|
|
341
|
return Object(val);
|
342
|
}
|
343
|
|
344
|
function shouldUseNative() {
|
345
|
try {
|
346
|
if (!Object.assign) {
|
347
|
return false;
|
348
|
}
|
349
|
|
350
|
// Detect buggy property enumeration order in older V8 versions.
|
351
|
|
352
|
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
353
|
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
354
|
test1[5] = 'de';
|
355
|
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
356
|
return false;
|
357
|
}
|
358
|
|
359
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
360
|
var test2 = {};
|
361
|
for (var i = 0; i < 10; i++) {
|
362
|
test2['_' + String.fromCharCode(i)] = i;
|
363
|
}
|
364
|
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
365
|
return test2[n];
|
366
|
});
|
367
|
if (order2.join('') !== '0123456789') {
|
368
|
return false;
|
369
|
}
|
370
|
|
371
|
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
372
|
var test3 = {};
|
373
|
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
374
|
test3[letter] = letter;
|
375
|
});
|
376
|
if (Object.keys(Object.assign({}, test3)).join('') !==
|
377
|
'abcdefghijklmnopqrst') {
|
378
|
return false;
|
379
|
}
|
380
|
|
381
|
return true;
|
382
|
} catch (err) {
|
383
|
// We don't expect any of the above to throw, but better to be safe.
|
384
|
return false;
|
385
|
}
|
386
|
}
|
387
|
|
388
|
var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
|
389
|
var from;
|
390
|
var to = toObject(target);
|
391
|
var symbols;
|
392
|
|
393
|
for (var s = 1; s < arguments.length; s++) {
|
394
|
from = Object(arguments[s]);
|
395
|
|
396
|
for (var key in from) {
|
397
|
if (hasOwnProperty.call(from, key)) {
|
398
|
to[key] = from[key];
|
399
|
}
|
400
|
}
|
401
|
|
402
|
if (getOwnPropertySymbols) {
|
403
|
symbols = getOwnPropertySymbols(from);
|
404
|
for (var i = 0; i < symbols.length; i++) {
|
405
|
if (propIsEnumerable.call(from, symbols[i])) {
|
406
|
to[symbols[i]] = from[symbols[i]];
|
407
|
}
|
408
|
}
|
409
|
}
|
410
|
}
|
411
|
|
412
|
return to;
|
413
|
};
|
414
|
|
415
|
/**
|
416
|
* Copyright (c) 2013-present, Facebook, Inc.
|
417
|
*
|
418
|
* This source code is licensed under the MIT license found in the
|
419
|
* LICENSE file in the root directory of this source tree.
|
420
|
*/
|
421
|
|
422
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
423
|
|
424
|
var ReactPropTypesSecret_1 = ReactPropTypesSecret;
|
425
|
|
426
|
var printWarning = function() {};
|
427
|
|
428
|
{
|
429
|
var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;
|
430
|
var loggedTypeFailures = {};
|
431
|
var has = Function.call.bind(Object.prototype.hasOwnProperty);
|
432
|
|
433
|
printWarning = function(text) {
|
434
|
var message = 'Warning: ' + text;
|
435
|
if (typeof console !== 'undefined') {
|
436
|
console.error(message);
|
437
|
}
|
438
|
try {
|
439
|
// --- Welcome to debugging React ---
|
440
|
// This error was thrown as a convenience so that you can use this stack
|
441
|
// to find the callsite that caused this warning to fire.
|
442
|
throw new Error(message);
|
443
|
} catch (x) {}
|
444
|
};
|
445
|
}
|
446
|
|
447
|
/**
|
448
|
* Assert that the values match with the type specs.
|
449
|
* Error messages are memorized and will only be shown once.
|
450
|
*
|
451
|
* @param {object} typeSpecs Map of name to a ReactPropType
|
452
|
* @param {object} values Runtime values that need to be type-checked
|
453
|
* @param {string} location e.g. "prop", "context", "child context"
|
454
|
* @param {string} componentName Name of the component for error messages.
|
455
|
* @param {?Function} getStack Returns the component stack.
|
456
|
* @private
|
457
|
*/
|
458
|
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
|
459
|
{
|
460
|
for (var typeSpecName in typeSpecs) {
|
461
|
if (has(typeSpecs, typeSpecName)) {
|
462
|
var error;
|
463
|
// Prop type validation may throw. In case they do, we don't want to
|
464
|
// fail the render phase where it didn't fail before. So we log it.
|
465
|
// After these have been cleaned up, we'll let them throw.
|
466
|
try {
|
467
|
// This is intentionally an invariant that gets caught. It's the same
|
468
|
// behavior as without this statement except with a better message.
|
469
|
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
470
|
var err = Error(
|
471
|
(componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
|
472
|
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
|
473
|
);
|
474
|
err.name = 'Invariant Violation';
|
475
|
throw err;
|
476
|
}
|
477
|
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);
|
478
|
} catch (ex) {
|
479
|
error = ex;
|
480
|
}
|
481
|
if (error && !(error instanceof Error)) {
|
482
|
printWarning(
|
483
|
(componentName || 'React class') + ': type specification of ' +
|
484
|
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
|
485
|
'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
|
486
|
'You may have forgotten to pass an argument to the type checker ' +
|
487
|
'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
|
488
|
'shape all require an argument).'
|
489
|
);
|
490
|
}
|
491
|
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
492
|
// Only monitor this failure once because there tends to be a lot of the
|
493
|
// same error.
|
494
|
loggedTypeFailures[error.message] = true;
|
495
|
|
496
|
var stack = getStack ? getStack() : '';
|
497
|
|
498
|
printWarning(
|
499
|
'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
|
500
|
);
|
501
|
}
|
502
|
}
|
503
|
}
|
504
|
}
|
505
|
}
|
506
|
|
507
|
/**
|
508
|
* Resets warning cache when testing.
|
509
|
*
|
510
|
* @private
|
511
|
*/
|
512
|
checkPropTypes.resetWarningCache = function() {
|
513
|
{
|
514
|
loggedTypeFailures = {};
|
515
|
}
|
516
|
};
|
517
|
|
518
|
var checkPropTypes_1 = checkPropTypes;
|
519
|
|
520
|
var has$1 = Function.call.bind(Object.prototype.hasOwnProperty);
|
521
|
var printWarning$1 = function() {};
|
522
|
|
523
|
{
|
524
|
printWarning$1 = function(text) {
|
525
|
var message = 'Warning: ' + text;
|
526
|
if (typeof console !== 'undefined') {
|
527
|
console.error(message);
|
528
|
}
|
529
|
try {
|
530
|
// --- Welcome to debugging React ---
|
531
|
// This error was thrown as a convenience so that you can use this stack
|
532
|
// to find the callsite that caused this warning to fire.
|
533
|
throw new Error(message);
|
534
|
} catch (x) {}
|
535
|
};
|
536
|
}
|
537
|
|
538
|
function emptyFunctionThatReturnsNull() {
|
539
|
return null;
|
540
|
}
|
541
|
|
542
|
var factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {
|
543
|
/* global Symbol */
|
544
|
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
545
|
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
546
|
|
547
|
/**
|
548
|
* Returns the iterator method function contained on the iterable object.
|
549
|
*
|
550
|
* Be sure to invoke the function with the iterable as context:
|
551
|
*
|
552
|
* var iteratorFn = getIteratorFn(myIterable);
|
553
|
* if (iteratorFn) {
|
554
|
* var iterator = iteratorFn.call(myIterable);
|
555
|
* ...
|
556
|
* }
|
557
|
*
|
558
|
* @param {?object} maybeIterable
|
559
|
* @return {?function}
|
560
|
*/
|
561
|
function getIteratorFn(maybeIterable) {
|
562
|
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
563
|
if (typeof iteratorFn === 'function') {
|
564
|
return iteratorFn;
|
565
|
}
|
566
|
}
|
567
|
|
568
|
/**
|
569
|
* Collection of methods that allow declaration and validation of props that are
|
570
|
* supplied to React components. Example usage:
|
571
|
*
|
572
|
* var Props = require('ReactPropTypes');
|
573
|
* var MyArticle = React.createClass({
|
574
|
* propTypes: {
|
575
|
* // An optional string prop named "description".
|
576
|
* description: Props.string,
|
577
|
*
|
578
|
* // A required enum prop named "category".
|
579
|
* category: Props.oneOf(['News','Photos']).isRequired,
|
580
|
*
|
581
|
* // A prop named "dialog" that requires an instance of Dialog.
|
582
|
* dialog: Props.instanceOf(Dialog).isRequired
|
583
|
* },
|
584
|
* render: function() { ... }
|
585
|
* });
|
586
|
*
|
587
|
* A more formal specification of how these methods are used:
|
588
|
*
|
589
|
* type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
|
590
|
* decl := ReactPropTypes.{type}(.isRequired)?
|
591
|
*
|
592
|
* Each and every declaration produces a function with the same signature. This
|
593
|
* allows the creation of custom validation functions. For example:
|
594
|
*
|
595
|
* var MyLink = React.createClass({
|
596
|
* propTypes: {
|
597
|
* // An optional string or URI prop named "href".
|
598
|
* href: function(props, propName, componentName) {
|
599
|
* var propValue = props[propName];
|
600
|
* if (propValue != null && typeof propValue !== 'string' &&
|
601
|
* !(propValue instanceof URI)) {
|
602
|
* return new Error(
|
603
|
* 'Expected a string or an URI for ' + propName + ' in ' +
|
604
|
* componentName
|
605
|
* );
|
606
|
* }
|
607
|
* }
|
608
|
* },
|
609
|
* render: function() {...}
|
610
|
* });
|
611
|
*
|
612
|
* @internal
|
613
|
*/
|
614
|
|
615
|
var ANONYMOUS = '<<anonymous>>';
|
616
|
|
617
|
// Important!
|
618
|
// Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
|
619
|
var ReactPropTypes = {
|
620
|
array: createPrimitiveTypeChecker('array'),
|
621
|
bool: createPrimitiveTypeChecker('boolean'),
|
622
|
func: createPrimitiveTypeChecker('function'),
|
623
|
number: createPrimitiveTypeChecker('number'),
|
624
|
object: createPrimitiveTypeChecker('object'),
|
625
|
string: createPrimitiveTypeChecker('string'),
|
626
|
symbol: createPrimitiveTypeChecker('symbol'),
|
627
|
|
628
|
any: createAnyTypeChecker(),
|
629
|
arrayOf: createArrayOfTypeChecker,
|
630
|
element: createElementTypeChecker(),
|
631
|
elementType: createElementTypeTypeChecker(),
|
632
|
instanceOf: createInstanceTypeChecker,
|
633
|
node: createNodeChecker(),
|
634
|
objectOf: createObjectOfTypeChecker,
|
635
|
oneOf: createEnumTypeChecker,
|
636
|
oneOfType: createUnionTypeChecker,
|
637
|
shape: createShapeTypeChecker,
|
638
|
exact: createStrictShapeTypeChecker,
|
639
|
};
|
640
|
|
641
|
/**
|
642
|
* inlined Object.is polyfill to avoid requiring consumers ship their own
|
643
|
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
644
|
*/
|
645
|
/*eslint-disable no-self-compare*/
|
646
|
function is(x, y) {
|
647
|
// SameValue algorithm
|
648
|
if (x === y) {
|
649
|
// Steps 1-5, 7-10
|
650
|
// Steps 6.b-6.e: +0 != -0
|
651
|
return x !== 0 || 1 / x === 1 / y;
|
652
|
} else {
|
653
|
// Step 6.a: NaN == NaN
|
654
|
return x !== x && y !== y;
|
655
|
}
|
656
|
}
|
657
|
/*eslint-enable no-self-compare*/
|
658
|
|
659
|
/**
|
660
|
* We use an Error-like object for backward compatibility as people may call
|
661
|
* PropTypes directly and inspect their output. However, we don't use real
|
662
|
* Errors anymore. We don't inspect their stack anyway, and creating them
|
663
|
* is prohibitively expensive if they are created too often, such as what
|
664
|
* happens in oneOfType() for any type before the one that matched.
|
665
|
*/
|
666
|
function PropTypeError(message) {
|
667
|
this.message = message;
|
668
|
this.stack = '';
|
669
|
}
|
670
|
// Make `instanceof Error` still work for returned errors.
|
671
|
PropTypeError.prototype = Error.prototype;
|
672
|
|
673
|
function createChainableTypeChecker(validate) {
|
674
|
{
|
675
|
var manualPropTypeCallCache = {};
|
676
|
var manualPropTypeWarningCount = 0;
|
677
|
}
|
678
|
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
679
|
componentName = componentName || ANONYMOUS;
|
680
|
propFullName = propFullName || propName;
|
681
|
|
682
|
if (secret !== ReactPropTypesSecret_1) {
|
683
|
if (throwOnDirectAccess) {
|
684
|
// New behavior only for users of `prop-types` package
|
685
|
var err = new Error(
|
686
|
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
687
|
'Use `PropTypes.checkPropTypes()` to call them. ' +
|
688
|
'Read more at http://fb.me/use-check-prop-types'
|
689
|
);
|
690
|
err.name = 'Invariant Violation';
|
691
|
throw err;
|
692
|
} else if ( typeof console !== 'undefined') {
|
693
|
// Old behavior for people using React.PropTypes
|
694
|
var cacheKey = componentName + ':' + propName;
|
695
|
if (
|
696
|
!manualPropTypeCallCache[cacheKey] &&
|
697
|
// Avoid spamming the console because they are often not actionable except for lib authors
|
698
|
manualPropTypeWarningCount < 3
|
699
|
) {
|
700
|
printWarning$1(
|
701
|
'You are manually calling a React.PropTypes validation ' +
|
702
|
'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +
|
703
|
'and will throw in the standalone `prop-types` package. ' +
|
704
|
'You may be seeing this warning due to a third-party PropTypes ' +
|
705
|
'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
|
706
|
);
|
707
|
manualPropTypeCallCache[cacheKey] = true;
|
708
|
manualPropTypeWarningCount++;
|
709
|
}
|
710
|
}
|
711
|
}
|
712
|
if (props[propName] == null) {
|
713
|
if (isRequired) {
|
714
|
if (props[propName] === null) {
|
715
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
716
|
}
|
717
|
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
718
|
}
|
719
|
return null;
|
720
|
} else {
|
721
|
return validate(props, propName, componentName, location, propFullName);
|
722
|
}
|
723
|
}
|
724
|
|
725
|
var chainedCheckType = checkType.bind(null, false);
|
726
|
chainedCheckType.isRequired = checkType.bind(null, true);
|
727
|
|
728
|
return chainedCheckType;
|
729
|
}
|
730
|
|
731
|
function createPrimitiveTypeChecker(expectedType) {
|
732
|
function validate(props, propName, componentName, location, propFullName, secret) {
|
733
|
var propValue = props[propName];
|
734
|
var propType = getPropType(propValue);
|
735
|
if (propType !== expectedType) {
|
736
|
// `propValue` being instance of, say, date/regexp, pass the 'object'
|
737
|
// check, but we can offer a more precise error message here rather than
|
738
|
// 'of type `object`'.
|
739
|
var preciseType = getPreciseType(propValue);
|
740
|
|
741
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
|
742
|
}
|
743
|
return null;
|
744
|
}
|
745
|
return createChainableTypeChecker(validate);
|
746
|
}
|
747
|
|
748
|
function createAnyTypeChecker() {
|
749
|
return createChainableTypeChecker(emptyFunctionThatReturnsNull);
|
750
|
}
|
751
|
|
752
|
function createArrayOfTypeChecker(typeChecker) {
|
753
|
function validate(props, propName, componentName, location, propFullName) {
|
754
|
if (typeof typeChecker !== 'function') {
|
755
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
756
|
}
|
757
|
var propValue = props[propName];
|
758
|
if (!Array.isArray(propValue)) {
|
759
|
var propType = getPropType(propValue);
|
760
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
|
761
|
}
|
762
|
for (var i = 0; i < propValue.length; i++) {
|
763
|
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret_1);
|
764
|
if (error instanceof Error) {
|
765
|
return error;
|
766
|
}
|
767
|
}
|
768
|
return null;
|
769
|
}
|
770
|
return createChainableTypeChecker(validate);
|
771
|
}
|
772
|
|
773
|
function createElementTypeChecker() {
|
774
|
function validate(props, propName, componentName, location, propFullName) {
|
775
|
var propValue = props[propName];
|
776
|
if (!isValidElement(propValue)) {
|
777
|
var propType = getPropType(propValue);
|
778
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
|
779
|
}
|
780
|
return null;
|
781
|
}
|
782
|
return createChainableTypeChecker(validate);
|
783
|
}
|
784
|
|
785
|
function createElementTypeTypeChecker() {
|
786
|
function validate(props, propName, componentName, location, propFullName) {
|
787
|
var propValue = props[propName];
|
788
|
if (!reactIs.isValidElementType(propValue)) {
|
789
|
var propType = getPropType(propValue);
|
790
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
|
791
|
}
|
792
|
return null;
|
793
|
}
|
794
|
return createChainableTypeChecker(validate);
|
795
|
}
|
796
|
|
797
|
function createInstanceTypeChecker(expectedClass) {
|
798
|
function validate(props, propName, componentName, location, propFullName) {
|
799
|
if (!(props[propName] instanceof expectedClass)) {
|
800
|
var expectedClassName = expectedClass.name || ANONYMOUS;
|
801
|
var actualClassName = getClassName(props[propName]);
|
802
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
|
803
|
}
|
804
|
return null;
|
805
|
}
|
806
|
return createChainableTypeChecker(validate);
|
807
|
}
|
808
|
|
809
|
function createEnumTypeChecker(expectedValues) {
|
810
|
if (!Array.isArray(expectedValues)) {
|
811
|
{
|
812
|
if (arguments.length > 1) {
|
813
|
printWarning$1(
|
814
|
'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
|
815
|
'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
|
816
|
);
|
817
|
} else {
|
818
|
printWarning$1('Invalid argument supplied to oneOf, expected an array.');
|
819
|
}
|
820
|
}
|
821
|
return emptyFunctionThatReturnsNull;
|
822
|
}
|
823
|
|
824
|
function validate(props, propName, componentName, location, propFullName) {
|
825
|
var propValue = props[propName];
|
826
|
for (var i = 0; i < expectedValues.length; i++) {
|
827
|
if (is(propValue, expectedValues[i])) {
|
828
|
return null;
|
829
|
}
|
830
|
}
|
831
|
|
832
|
var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
|
833
|
var type = getPreciseType(value);
|
834
|
if (type === 'symbol') {
|
835
|
return String(value);
|
836
|
}
|
837
|
return value;
|
838
|
});
|
839
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
840
|
}
|
841
|
return createChainableTypeChecker(validate);
|
842
|
}
|
843
|
|
844
|
function createObjectOfTypeChecker(typeChecker) {
|
845
|
function validate(props, propName, componentName, location, propFullName) {
|
846
|
if (typeof typeChecker !== 'function') {
|
847
|
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
|
848
|
}
|
849
|
var propValue = props[propName];
|
850
|
var propType = getPropType(propValue);
|
851
|
if (propType !== 'object') {
|
852
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
|
853
|
}
|
854
|
for (var key in propValue) {
|
855
|
if (has$1(propValue, key)) {
|
856
|
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
857
|
if (error instanceof Error) {
|
858
|
return error;
|
859
|
}
|
860
|
}
|
861
|
}
|
862
|
return null;
|
863
|
}
|
864
|
return createChainableTypeChecker(validate);
|
865
|
}
|
866
|
|
867
|
function createUnionTypeChecker(arrayOfTypeCheckers) {
|
868
|
if (!Array.isArray(arrayOfTypeCheckers)) {
|
869
|
printWarning$1('Invalid argument supplied to oneOfType, expected an instance of array.') ;
|
870
|
return emptyFunctionThatReturnsNull;
|
871
|
}
|
872
|
|
873
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
874
|
var checker = arrayOfTypeCheckers[i];
|
875
|
if (typeof checker !== 'function') {
|
876
|
printWarning$1(
|
877
|
'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
|
878
|
'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
|
879
|
);
|
880
|
return emptyFunctionThatReturnsNull;
|
881
|
}
|
882
|
}
|
883
|
|
884
|
function validate(props, propName, componentName, location, propFullName) {
|
885
|
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
886
|
var checker = arrayOfTypeCheckers[i];
|
887
|
if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret_1) == null) {
|
888
|
return null;
|
889
|
}
|
890
|
}
|
891
|
|
892
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
|
893
|
}
|
894
|
return createChainableTypeChecker(validate);
|
895
|
}
|
896
|
|
897
|
function createNodeChecker() {
|
898
|
function validate(props, propName, componentName, location, propFullName) {
|
899
|
if (!isNode(props[propName])) {
|
900
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
|
901
|
}
|
902
|
return null;
|
903
|
}
|
904
|
return createChainableTypeChecker(validate);
|
905
|
}
|
906
|
|
907
|
function createShapeTypeChecker(shapeTypes) {
|
908
|
function validate(props, propName, componentName, location, propFullName) {
|
909
|
var propValue = props[propName];
|
910
|
var propType = getPropType(propValue);
|
911
|
if (propType !== 'object') {
|
912
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
913
|
}
|
914
|
for (var key in shapeTypes) {
|
915
|
var checker = shapeTypes[key];
|
916
|
if (!checker) {
|
917
|
continue;
|
918
|
}
|
919
|
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
920
|
if (error) {
|
921
|
return error;
|
922
|
}
|
923
|
}
|
924
|
return null;
|
925
|
}
|
926
|
return createChainableTypeChecker(validate);
|
927
|
}
|
928
|
|
929
|
function createStrictShapeTypeChecker(shapeTypes) {
|
930
|
function validate(props, propName, componentName, location, propFullName) {
|
931
|
var propValue = props[propName];
|
932
|
var propType = getPropType(propValue);
|
933
|
if (propType !== 'object') {
|
934
|
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
935
|
}
|
936
|
// We need to check all keys in case some are required but missing from
|
937
|
// props.
|
938
|
var allKeys = objectAssign({}, props[propName], shapeTypes);
|
939
|
for (var key in allKeys) {
|
940
|
var checker = shapeTypes[key];
|
941
|
if (!checker) {
|
942
|
return new PropTypeError(
|
943
|
'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
|
944
|
'\nBad object: ' + JSON.stringify(props[propName], null, ' ') +
|
945
|
'\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')
|
946
|
);
|
947
|
}
|
948
|
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);
|
949
|
if (error) {
|
950
|
return error;
|
951
|
}
|
952
|
}
|
953
|
return null;
|
954
|
}
|
955
|
|
956
|
return createChainableTypeChecker(validate);
|
957
|
}
|
958
|
|
959
|
function isNode(propValue) {
|
960
|
switch (typeof propValue) {
|
961
|
case 'number':
|
962
|
case 'string':
|
963
|
case 'undefined':
|
964
|
return true;
|
965
|
case 'boolean':
|
966
|
return !propValue;
|
967
|
case 'object':
|
968
|
if (Array.isArray(propValue)) {
|
969
|
return propValue.every(isNode);
|
970
|
}
|
971
|
if (propValue === null || isValidElement(propValue)) {
|
972
|
return true;
|
973
|
}
|
974
|
|
975
|
var iteratorFn = getIteratorFn(propValue);
|
976
|
if (iteratorFn) {
|
977
|
var iterator = iteratorFn.call(propValue);
|
978
|
var step;
|
979
|
if (iteratorFn !== propValue.entries) {
|
980
|
while (!(step = iterator.next()).done) {
|
981
|
if (!isNode(step.value)) {
|
982
|
return false;
|
983
|
}
|
984
|
}
|
985
|
} else {
|
986
|
// Iterator will provide entry [k,v] tuples rather than values.
|
987
|
while (!(step = iterator.next()).done) {
|
988
|
var entry = step.value;
|
989
|
if (entry) {
|
990
|
if (!isNode(entry[1])) {
|
991
|
return false;
|
992
|
}
|
993
|
}
|
994
|
}
|
995
|
}
|
996
|
} else {
|
997
|
return false;
|
998
|
}
|
999
|
|
1000
|
return true;
|
1001
|
default:
|
1002
|
return false;
|
1003
|
}
|
1004
|
}
|
1005
|
|
1006
|
function isSymbol(propType, propValue) {
|
1007
|
// Native Symbol.
|
1008
|
if (propType === 'symbol') {
|
1009
|
return true;
|
1010
|
}
|
1011
|
|
1012
|
// falsy value can't be a Symbol
|
1013
|
if (!propValue) {
|
1014
|
return false;
|
1015
|
}
|
1016
|
|
1017
|
// 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
|
1018
|
if (propValue['@@toStringTag'] === 'Symbol') {
|
1019
|
return true;
|
1020
|
}
|
1021
|
|
1022
|
// Fallback for non-spec compliant Symbols which are polyfilled.
|
1023
|
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
|
1024
|
return true;
|
1025
|
}
|
1026
|
|
1027
|
return false;
|
1028
|
}
|
1029
|
|
1030
|
// Equivalent of `typeof` but with special handling for array and regexp.
|
1031
|
function getPropType(propValue) {
|
1032
|
var propType = typeof propValue;
|
1033
|
if (Array.isArray(propValue)) {
|
1034
|
return 'array';
|
1035
|
}
|
1036
|
if (propValue instanceof RegExp) {
|
1037
|
// Old webkits (at least until Android 4.0) return 'function' rather than
|
1038
|
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
1039
|
// passes PropTypes.object.
|
1040
|
return 'object';
|
1041
|
}
|
1042
|
if (isSymbol(propType, propValue)) {
|
1043
|
return 'symbol';
|
1044
|
}
|
1045
|
return propType;
|
1046
|
}
|
1047
|
|
1048
|
// This handles more types than `getPropType`. Only used for error messages.
|
1049
|
// See `createPrimitiveTypeChecker`.
|
1050
|
function getPreciseType(propValue) {
|
1051
|
if (typeof propValue === 'undefined' || propValue === null) {
|
1052
|
return '' + propValue;
|
1053
|
}
|
1054
|
var propType = getPropType(propValue);
|
1055
|
if (propType === 'object') {
|
1056
|
if (propValue instanceof Date) {
|
1057
|
return 'date';
|
1058
|
} else if (propValue instanceof RegExp) {
|
1059
|
return 'regexp';
|
1060
|
}
|
1061
|
}
|
1062
|
return propType;
|
1063
|
}
|
1064
|
|
1065
|
// Returns a string that is postfixed to a warning about an invalid type.
|
1066
|
// For example, "undefined" or "of type array"
|
1067
|
function getPostfixForTypeWarning(value) {
|
1068
|
var type = getPreciseType(value);
|
1069
|
switch (type) {
|
1070
|
case 'array':
|
1071
|
case 'object':
|
1072
|
return 'an ' + type;
|
1073
|
case 'boolean':
|
1074
|
case 'date':
|
1075
|
case 'regexp':
|
1076
|
return 'a ' + type;
|
1077
|
default:
|
1078
|
return type;
|
1079
|
}
|
1080
|
}
|
1081
|
|
1082
|
// Returns class name of the object, if any.
|
1083
|
function getClassName(propValue) {
|
1084
|
if (!propValue.constructor || !propValue.constructor.name) {
|
1085
|
return ANONYMOUS;
|
1086
|
}
|
1087
|
return propValue.constructor.name;
|
1088
|
}
|
1089
|
|
1090
|
ReactPropTypes.checkPropTypes = checkPropTypes_1;
|
1091
|
ReactPropTypes.resetWarningCache = checkPropTypes_1.resetWarningCache;
|
1092
|
ReactPropTypes.PropTypes = ReactPropTypes;
|
1093
|
|
1094
|
return ReactPropTypes;
|
1095
|
};
|
1096
|
|
1097
|
var propTypes = createCommonjsModule(function (module) {
|
1098
|
/**
|
1099
|
* Copyright (c) 2013-present, Facebook, Inc.
|
1100
|
*
|
1101
|
* This source code is licensed under the MIT license found in the
|
1102
|
* LICENSE file in the root directory of this source tree.
|
1103
|
*/
|
1104
|
|
1105
|
{
|
1106
|
var ReactIs = reactIs;
|
1107
|
|
1108
|
// By explicitly using `prop-types` you are opting into new development behavior.
|
1109
|
// http://fb.me/prop-types-in-prod
|
1110
|
var throwOnDirectAccess = true;
|
1111
|
module.exports = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess);
|
1112
|
}
|
1113
|
});
|
1114
|
|
1115
|
function _extends() {
|
1116
|
_extends = Object.assign || function (target) {
|
1117
|
for (var i = 1; i < arguments.length; i++) {
|
1118
|
var source = arguments[i];
|
1119
|
|
1120
|
for (var key in source) {
|
1121
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
1122
|
target[key] = source[key];
|
1123
|
}
|
1124
|
}
|
1125
|
}
|
1126
|
|
1127
|
return target;
|
1128
|
};
|
1129
|
|
1130
|
return _extends.apply(this, arguments);
|
1131
|
}
|
1132
|
|
1133
|
function isAbsolute(pathname) {
|
1134
|
return pathname.charAt(0) === '/';
|
1135
|
}
|
1136
|
|
1137
|
// About 1.5x faster than the two-arg version of Array#splice()
|
1138
|
function spliceOne(list, index) {
|
1139
|
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
|
1140
|
list[i] = list[k];
|
1141
|
}
|
1142
|
|
1143
|
list.pop();
|
1144
|
}
|
1145
|
|
1146
|
// This implementation is based heavily on node's url.parse
|
1147
|
function resolvePathname(to) {
|
1148
|
var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
1149
|
|
1150
|
var toParts = to && to.split('/') || [];
|
1151
|
var fromParts = from && from.split('/') || [];
|
1152
|
|
1153
|
var isToAbs = to && isAbsolute(to);
|
1154
|
var isFromAbs = from && isAbsolute(from);
|
1155
|
var mustEndAbs = isToAbs || isFromAbs;
|
1156
|
|
1157
|
if (to && isAbsolute(to)) {
|
1158
|
// to is absolute
|
1159
|
fromParts = toParts;
|
1160
|
} else if (toParts.length) {
|
1161
|
// to is relative, drop the filename
|
1162
|
fromParts.pop();
|
1163
|
fromParts = fromParts.concat(toParts);
|
1164
|
}
|
1165
|
|
1166
|
if (!fromParts.length) return '/';
|
1167
|
|
1168
|
var hasTrailingSlash = void 0;
|
1169
|
if (fromParts.length) {
|
1170
|
var last = fromParts[fromParts.length - 1];
|
1171
|
hasTrailingSlash = last === '.' || last === '..' || last === '';
|
1172
|
} else {
|
1173
|
hasTrailingSlash = false;
|
1174
|
}
|
1175
|
|
1176
|
var up = 0;
|
1177
|
for (var i = fromParts.length; i >= 0; i--) {
|
1178
|
var part = fromParts[i];
|
1179
|
|
1180
|
if (part === '.') {
|
1181
|
spliceOne(fromParts, i);
|
1182
|
} else if (part === '..') {
|
1183
|
spliceOne(fromParts, i);
|
1184
|
up++;
|
1185
|
} else if (up) {
|
1186
|
spliceOne(fromParts, i);
|
1187
|
up--;
|
1188
|
}
|
1189
|
}
|
1190
|
|
1191
|
if (!mustEndAbs) for (; up--; up) {
|
1192
|
fromParts.unshift('..');
|
1193
|
}if (mustEndAbs && fromParts[0] !== '' && (!fromParts[0] || !isAbsolute(fromParts[0]))) fromParts.unshift('');
|
1194
|
|
1195
|
var result = fromParts.join('/');
|
1196
|
|
1197
|
if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';
|
1198
|
|
1199
|
return result;
|
1200
|
}
|
1201
|
|
1202
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
1203
|
|
1204
|
function valueEqual(a, b) {
|
1205
|
if (a === b) return true;
|
1206
|
|
1207
|
if (a == null || b == null) return false;
|
1208
|
|
1209
|
if (Array.isArray(a)) {
|
1210
|
return Array.isArray(b) && a.length === b.length && a.every(function (item, index) {
|
1211
|
return valueEqual(item, b[index]);
|
1212
|
});
|
1213
|
}
|
1214
|
|
1215
|
var aType = typeof a === 'undefined' ? 'undefined' : _typeof(a);
|
1216
|
var bType = typeof b === 'undefined' ? 'undefined' : _typeof(b);
|
1217
|
|
1218
|
if (aType !== bType) return false;
|
1219
|
|
1220
|
if (aType === 'object') {
|
1221
|
var aValue = a.valueOf();
|
1222
|
var bValue = b.valueOf();
|
1223
|
|
1224
|
if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);
|
1225
|
|
1226
|
var aKeys = Object.keys(a);
|
1227
|
var bKeys = Object.keys(b);
|
1228
|
|
1229
|
if (aKeys.length !== bKeys.length) return false;
|
1230
|
|
1231
|
return aKeys.every(function (key) {
|
1232
|
return valueEqual(a[key], b[key]);
|
1233
|
});
|
1234
|
}
|
1235
|
|
1236
|
return false;
|
1237
|
}
|
1238
|
|
1239
|
function warning(condition, message) {
|
1240
|
{
|
1241
|
if (condition) {
|
1242
|
return;
|
1243
|
}
|
1244
|
|
1245
|
var text = "Warning: " + message;
|
1246
|
|
1247
|
if (typeof console !== 'undefined') {
|
1248
|
console.warn(text);
|
1249
|
}
|
1250
|
|
1251
|
try {
|
1252
|
throw Error(text);
|
1253
|
} catch (x) {}
|
1254
|
}
|
1255
|
}
|
1256
|
|
1257
|
var prefix = 'Invariant failed';
|
1258
|
function invariant(condition, message) {
|
1259
|
if (condition) {
|
1260
|
return;
|
1261
|
}
|
1262
|
|
1263
|
{
|
1264
|
throw new Error(prefix + ": " + (message || ''));
|
1265
|
}
|
1266
|
}
|
1267
|
|
1268
|
function addLeadingSlash(path) {
|
1269
|
return path.charAt(0) === '/' ? path : '/' + path;
|
1270
|
}
|
1271
|
function stripLeadingSlash(path) {
|
1272
|
return path.charAt(0) === '/' ? path.substr(1) : path;
|
1273
|
}
|
1274
|
function hasBasename(path, prefix) {
|
1275
|
return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
|
1276
|
}
|
1277
|
function stripBasename(path, prefix) {
|
1278
|
return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
|
1279
|
}
|
1280
|
function stripTrailingSlash(path) {
|
1281
|
return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;
|
1282
|
}
|
1283
|
function parsePath(path) {
|
1284
|
var pathname = path || '/';
|
1285
|
var search = '';
|
1286
|
var hash = '';
|
1287
|
var hashIndex = pathname.indexOf('#');
|
1288
|
|
1289
|
if (hashIndex !== -1) {
|
1290
|
hash = pathname.substr(hashIndex);
|
1291
|
pathname = pathname.substr(0, hashIndex);
|
1292
|
}
|
1293
|
|
1294
|
var searchIndex = pathname.indexOf('?');
|
1295
|
|
1296
|
if (searchIndex !== -1) {
|
1297
|
search = pathname.substr(searchIndex);
|
1298
|
pathname = pathname.substr(0, searchIndex);
|
1299
|
}
|
1300
|
|
1301
|
return {
|
1302
|
pathname: pathname,
|
1303
|
search: search === '?' ? '' : search,
|
1304
|
hash: hash === '#' ? '' : hash
|
1305
|
};
|
1306
|
}
|
1307
|
function createPath(location) {
|
1308
|
var pathname = location.pathname,
|
1309
|
search = location.search,
|
1310
|
hash = location.hash;
|
1311
|
var path = pathname || '/';
|
1312
|
if (search && search !== '?') path += search.charAt(0) === '?' ? search : "?" + search;
|
1313
|
if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : "#" + hash;
|
1314
|
return path;
|
1315
|
}
|
1316
|
|
1317
|
function createLocation(path, state, key, currentLocation) {
|
1318
|
var location;
|
1319
|
|
1320
|
if (typeof path === 'string') {
|
1321
|
// Two-arg form: push(path, state)
|
1322
|
location = parsePath(path);
|
1323
|
location.state = state;
|
1324
|
} else {
|
1325
|
// One-arg form: push(location)
|
1326
|
location = _extends({}, path);
|
1327
|
if (location.pathname === undefined) location.pathname = '';
|
1328
|
|
1329
|
if (location.search) {
|
1330
|
if (location.search.charAt(0) !== '?') location.search = '?' + location.search;
|
1331
|
} else {
|
1332
|
location.search = '';
|
1333
|
}
|
1334
|
|
1335
|
if (location.hash) {
|
1336
|
if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;
|
1337
|
} else {
|
1338
|
location.hash = '';
|
1339
|
}
|
1340
|
|
1341
|
if (state !== undefined && location.state === undefined) location.state = state;
|
1342
|
}
|
1343
|
|
1344
|
try {
|
1345
|
location.pathname = decodeURI(location.pathname);
|
1346
|
} catch (e) {
|
1347
|
if (e instanceof URIError) {
|
1348
|
throw new URIError('Pathname "' + location.pathname + '" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');
|
1349
|
} else {
|
1350
|
throw e;
|
1351
|
}
|
1352
|
}
|
1353
|
|
1354
|
if (key) location.key = key;
|
1355
|
|
1356
|
if (currentLocation) {
|
1357
|
// Resolve incomplete/relative pathname relative to current location.
|
1358
|
if (!location.pathname) {
|
1359
|
location.pathname = currentLocation.pathname;
|
1360
|
} else if (location.pathname.charAt(0) !== '/') {
|
1361
|
location.pathname = resolvePathname(location.pathname, currentLocation.pathname);
|
1362
|
}
|
1363
|
} else {
|
1364
|
// When there is no prior location and pathname is empty, set it to /
|
1365
|
if (!location.pathname) {
|
1366
|
location.pathname = '/';
|
1367
|
}
|
1368
|
}
|
1369
|
|
1370
|
return location;
|
1371
|
}
|
1372
|
function locationsAreEqual(a, b) {
|
1373
|
return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && valueEqual(a.state, b.state);
|
1374
|
}
|
1375
|
|
1376
|
function createTransitionManager() {
|
1377
|
var prompt = null;
|
1378
|
|
1379
|
function setPrompt(nextPrompt) {
|
1380
|
warning(prompt == null, 'A history supports only one prompt at a time') ;
|
1381
|
prompt = nextPrompt;
|
1382
|
return function () {
|
1383
|
if (prompt === nextPrompt) prompt = null;
|
1384
|
};
|
1385
|
}
|
1386
|
|
1387
|
function confirmTransitionTo(location, action, getUserConfirmation, callback) {
|
1388
|
// TODO: If another transition starts while we're still confirming
|
1389
|
// the previous one, we may end up in a weird state. Figure out the
|
1390
|
// best way to handle this.
|
1391
|
if (prompt != null) {
|
1392
|
var result = typeof prompt === 'function' ? prompt(location, action) : prompt;
|
1393
|
|
1394
|
if (typeof result === 'string') {
|
1395
|
if (typeof getUserConfirmation === 'function') {
|
1396
|
getUserConfirmation(result, callback);
|
1397
|
} else {
|
1398
|
warning(false, 'A history needs a getUserConfirmation function in order to use a prompt message') ;
|
1399
|
callback(true);
|
1400
|
}
|
1401
|
} else {
|
1402
|
// Return false from a transition hook to cancel the transition.
|
1403
|
callback(result !== false);
|
1404
|
}
|
1405
|
} else {
|
1406
|
callback(true);
|
1407
|
}
|
1408
|
}
|
1409
|
|
1410
|
var listeners = [];
|
1411
|
|
1412
|
function appendListener(fn) {
|
1413
|
var isActive = true;
|
1414
|
|
1415
|
function listener() {
|
1416
|
if (isActive) fn.apply(void 0, arguments);
|
1417
|
}
|
1418
|
|
1419
|
listeners.push(listener);
|
1420
|
return function () {
|
1421
|
isActive = false;
|
1422
|
listeners = listeners.filter(function (item) {
|
1423
|
return item !== listener;
|
1424
|
});
|
1425
|
};
|
1426
|
}
|
1427
|
|
1428
|
function notifyListeners() {
|
1429
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
1430
|
args[_key] = arguments[_key];
|
1431
|
}
|
1432
|
|
1433
|
listeners.forEach(function (listener) {
|
1434
|
return listener.apply(void 0, args);
|
1435
|
});
|
1436
|
}
|
1437
|
|
1438
|
return {
|
1439
|
setPrompt: setPrompt,
|
1440
|
confirmTransitionTo: confirmTransitionTo,
|
1441
|
appendListener: appendListener,
|
1442
|
notifyListeners: notifyListeners
|
1443
|
};
|
1444
|
}
|
1445
|
|
1446
|
var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
1447
|
function getConfirmation(message, callback) {
|
1448
|
callback(window.confirm(message)); // eslint-disable-line no-alert
|
1449
|
}
|
1450
|
/**
|
1451
|
* Returns true if the HTML5 history API is supported. Taken from Modernizr.
|
1452
|
*
|
1453
|
* https://github.com/Modernizr/Modernizr/blob/master/LICENSE
|
1454
|
* https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
|
1455
|
* changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586
|
1456
|
*/
|
1457
|
|
1458
|
function supportsHistory() {
|
1459
|
var ua = window.navigator.userAgent;
|
1460
|
if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;
|
1461
|
return window.history && 'pushState' in window.history;
|
1462
|
}
|
1463
|
/**
|
1464
|
* Returns true if browser fires popstate on hash change.
|
1465
|
* IE10 and IE11 do not.
|
1466
|
*/
|
1467
|
|
1468
|
function supportsPopStateOnHashChange() {
|
1469
|
return window.navigator.userAgent.indexOf('Trident') === -1;
|
1470
|
}
|
1471
|
/**
|
1472
|
* Returns false if using go(n) with hash history causes a full page reload.
|
1473
|
*/
|
1474
|
|
1475
|
function supportsGoWithoutReloadUsingHash() {
|
1476
|
return window.navigator.userAgent.indexOf('Firefox') === -1;
|
1477
|
}
|
1478
|
/**
|
1479
|
* Returns true if a given popstate event is an extraneous WebKit event.
|
1480
|
* Accounts for the fact that Chrome on iOS fires real popstate events
|
1481
|
* containing undefined state when pressing the back button.
|
1482
|
*/
|
1483
|
|
1484
|
function isExtraneousPopstateEvent(event) {
|
1485
|
event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;
|
1486
|
}
|
1487
|
|
1488
|
var PopStateEvent = 'popstate';
|
1489
|
var HashChangeEvent = 'hashchange';
|
1490
|
|
1491
|
function getHistoryState() {
|
1492
|
try {
|
1493
|
return window.history.state || {};
|
1494
|
} catch (e) {
|
1495
|
// IE 11 sometimes throws when accessing window.history.state
|
1496
|
// See https://github.com/ReactTraining/history/pull/289
|
1497
|
return {};
|
1498
|
}
|
1499
|
}
|
1500
|
/**
|
1501
|
* Creates a history object that uses the HTML5 history API including
|
1502
|
* pushState, replaceState, and the popstate event.
|
1503
|
*/
|
1504
|
|
1505
|
|
1506
|
function createBrowserHistory(props) {
|
1507
|
if (props === void 0) {
|
1508
|
props = {};
|
1509
|
}
|
1510
|
|
1511
|
!canUseDOM ? invariant(false, 'Browser history needs a DOM') : void 0;
|
1512
|
var globalHistory = window.history;
|
1513
|
var canUseHistory = supportsHistory();
|
1514
|
var needsHashChangeListener = !supportsPopStateOnHashChange();
|
1515
|
var _props = props,
|
1516
|
_props$forceRefresh = _props.forceRefresh,
|
1517
|
forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,
|
1518
|
_props$getUserConfirm = _props.getUserConfirmation,
|
1519
|
getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,
|
1520
|
_props$keyLength = _props.keyLength,
|
1521
|
keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;
|
1522
|
var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';
|
1523
|
|
1524
|
function getDOMLocation(historyState) {
|
1525
|
var _ref = historyState || {},
|
1526
|
key = _ref.key,
|
1527
|
state = _ref.state;
|
1528
|
|
1529
|
var _window$location = window.location,
|
1530
|
pathname = _window$location.pathname,
|
1531
|
search = _window$location.search,
|
1532
|
hash = _window$location.hash;
|
1533
|
var path = pathname + search + hash;
|
1534
|
warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".') ;
|
1535
|
if (basename) path = stripBasename(path, basename);
|
1536
|
return createLocation(path, state, key);
|
1537
|
}
|
1538
|
|
1539
|
function createKey() {
|
1540
|
return Math.random().toString(36).substr(2, keyLength);
|
1541
|
}
|
1542
|
|
1543
|
var transitionManager = createTransitionManager();
|
1544
|
|
1545
|
function setState(nextState) {
|
1546
|
_extends(history, nextState);
|
1547
|
|
1548
|
history.length = globalHistory.length;
|
1549
|
transitionManager.notifyListeners(history.location, history.action);
|
1550
|
}
|
1551
|
|
1552
|
function handlePopState(event) {
|
1553
|
// Ignore extraneous popstate events in WebKit.
|
1554
|
if (isExtraneousPopstateEvent(event)) return;
|
1555
|
handlePop(getDOMLocation(event.state));
|
1556
|
}
|
1557
|
|
1558
|
function handleHashChange() {
|
1559
|
handlePop(getDOMLocation(getHistoryState()));
|
1560
|
}
|
1561
|
|
1562
|
var forceNextPop = false;
|
1563
|
|
1564
|
function handlePop(location) {
|
1565
|
if (forceNextPop) {
|
1566
|
forceNextPop = false;
|
1567
|
setState();
|
1568
|
} else {
|
1569
|
var action = 'POP';
|
1570
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1571
|
if (ok) {
|
1572
|
setState({
|
1573
|
action: action,
|
1574
|
location: location
|
1575
|
});
|
1576
|
} else {
|
1577
|
revertPop(location);
|
1578
|
}
|
1579
|
});
|
1580
|
}
|
1581
|
}
|
1582
|
|
1583
|
function revertPop(fromLocation) {
|
1584
|
var toLocation = history.location; // TODO: We could probably make this more reliable by
|
1585
|
// keeping a list of keys we've seen in sessionStorage.
|
1586
|
// Instead, we just default to 0 for keys we don't know.
|
1587
|
|
1588
|
var toIndex = allKeys.indexOf(toLocation.key);
|
1589
|
if (toIndex === -1) toIndex = 0;
|
1590
|
var fromIndex = allKeys.indexOf(fromLocation.key);
|
1591
|
if (fromIndex === -1) fromIndex = 0;
|
1592
|
var delta = toIndex - fromIndex;
|
1593
|
|
1594
|
if (delta) {
|
1595
|
forceNextPop = true;
|
1596
|
go(delta);
|
1597
|
}
|
1598
|
}
|
1599
|
|
1600
|
var initialLocation = getDOMLocation(getHistoryState());
|
1601
|
var allKeys = [initialLocation.key]; // Public interface
|
1602
|
|
1603
|
function createHref(location) {
|
1604
|
return basename + createPath(location);
|
1605
|
}
|
1606
|
|
1607
|
function push(path, state) {
|
1608
|
warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') ;
|
1609
|
var action = 'PUSH';
|
1610
|
var location = createLocation(path, state, createKey(), history.location);
|
1611
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1612
|
if (!ok) return;
|
1613
|
var href = createHref(location);
|
1614
|
var key = location.key,
|
1615
|
state = location.state;
|
1616
|
|
1617
|
if (canUseHistory) {
|
1618
|
globalHistory.pushState({
|
1619
|
key: key,
|
1620
|
state: state
|
1621
|
}, null, href);
|
1622
|
|
1623
|
if (forceRefresh) {
|
1624
|
window.location.href = href;
|
1625
|
} else {
|
1626
|
var prevIndex = allKeys.indexOf(history.location.key);
|
1627
|
var nextKeys = allKeys.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);
|
1628
|
nextKeys.push(location.key);
|
1629
|
allKeys = nextKeys;
|
1630
|
setState({
|
1631
|
action: action,
|
1632
|
location: location
|
1633
|
});
|
1634
|
}
|
1635
|
} else {
|
1636
|
warning(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') ;
|
1637
|
window.location.href = href;
|
1638
|
}
|
1639
|
});
|
1640
|
}
|
1641
|
|
1642
|
function replace(path, state) {
|
1643
|
warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') ;
|
1644
|
var action = 'REPLACE';
|
1645
|
var location = createLocation(path, state, createKey(), history.location);
|
1646
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1647
|
if (!ok) return;
|
1648
|
var href = createHref(location);
|
1649
|
var key = location.key,
|
1650
|
state = location.state;
|
1651
|
|
1652
|
if (canUseHistory) {
|
1653
|
globalHistory.replaceState({
|
1654
|
key: key,
|
1655
|
state: state
|
1656
|
}, null, href);
|
1657
|
|
1658
|
if (forceRefresh) {
|
1659
|
window.location.replace(href);
|
1660
|
} else {
|
1661
|
var prevIndex = allKeys.indexOf(history.location.key);
|
1662
|
if (prevIndex !== -1) allKeys[prevIndex] = location.key;
|
1663
|
setState({
|
1664
|
action: action,
|
1665
|
location: location
|
1666
|
});
|
1667
|
}
|
1668
|
} else {
|
1669
|
warning(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') ;
|
1670
|
window.location.replace(href);
|
1671
|
}
|
1672
|
});
|
1673
|
}
|
1674
|
|
1675
|
function go(n) {
|
1676
|
globalHistory.go(n);
|
1677
|
}
|
1678
|
|
1679
|
function goBack() {
|
1680
|
go(-1);
|
1681
|
}
|
1682
|
|
1683
|
function goForward() {
|
1684
|
go(1);
|
1685
|
}
|
1686
|
|
1687
|
var listenerCount = 0;
|
1688
|
|
1689
|
function checkDOMListeners(delta) {
|
1690
|
listenerCount += delta;
|
1691
|
|
1692
|
if (listenerCount === 1 && delta === 1) {
|
1693
|
window.addEventListener(PopStateEvent, handlePopState);
|
1694
|
if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);
|
1695
|
} else if (listenerCount === 0) {
|
1696
|
window.removeEventListener(PopStateEvent, handlePopState);
|
1697
|
if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);
|
1698
|
}
|
1699
|
}
|
1700
|
|
1701
|
var isBlocked = false;
|
1702
|
|
1703
|
function block(prompt) {
|
1704
|
if (prompt === void 0) {
|
1705
|
prompt = false;
|
1706
|
}
|
1707
|
|
1708
|
var unblock = transitionManager.setPrompt(prompt);
|
1709
|
|
1710
|
if (!isBlocked) {
|
1711
|
checkDOMListeners(1);
|
1712
|
isBlocked = true;
|
1713
|
}
|
1714
|
|
1715
|
return function () {
|
1716
|
if (isBlocked) {
|
1717
|
isBlocked = false;
|
1718
|
checkDOMListeners(-1);
|
1719
|
}
|
1720
|
|
1721
|
return unblock();
|
1722
|
};
|
1723
|
}
|
1724
|
|
1725
|
function listen(listener) {
|
1726
|
var unlisten = transitionManager.appendListener(listener);
|
1727
|
checkDOMListeners(1);
|
1728
|
return function () {
|
1729
|
checkDOMListeners(-1);
|
1730
|
unlisten();
|
1731
|
};
|
1732
|
}
|
1733
|
|
1734
|
var history = {
|
1735
|
length: globalHistory.length,
|
1736
|
action: 'POP',
|
1737
|
location: initialLocation,
|
1738
|
createHref: createHref,
|
1739
|
push: push,
|
1740
|
replace: replace,
|
1741
|
go: go,
|
1742
|
goBack: goBack,
|
1743
|
goForward: goForward,
|
1744
|
block: block,
|
1745
|
listen: listen
|
1746
|
};
|
1747
|
return history;
|
1748
|
}
|
1749
|
|
1750
|
var HashChangeEvent$1 = 'hashchange';
|
1751
|
var HashPathCoders = {
|
1752
|
hashbang: {
|
1753
|
encodePath: function encodePath(path) {
|
1754
|
return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);
|
1755
|
},
|
1756
|
decodePath: function decodePath(path) {
|
1757
|
return path.charAt(0) === '!' ? path.substr(1) : path;
|
1758
|
}
|
1759
|
},
|
1760
|
noslash: {
|
1761
|
encodePath: stripLeadingSlash,
|
1762
|
decodePath: addLeadingSlash
|
1763
|
},
|
1764
|
slash: {
|
1765
|
encodePath: addLeadingSlash,
|
1766
|
decodePath: addLeadingSlash
|
1767
|
}
|
1768
|
};
|
1769
|
|
1770
|
function getHashPath() {
|
1771
|
// We can't use window.location.hash here because it's not
|
1772
|
// consistent across browsers - Firefox will pre-decode it!
|
1773
|
var href = window.location.href;
|
1774
|
var hashIndex = href.indexOf('#');
|
1775
|
return hashIndex === -1 ? '' : href.substring(hashIndex + 1);
|
1776
|
}
|
1777
|
|
1778
|
function pushHashPath(path) {
|
1779
|
window.location.hash = path;
|
1780
|
}
|
1781
|
|
1782
|
function replaceHashPath(path) {
|
1783
|
var hashIndex = window.location.href.indexOf('#');
|
1784
|
window.location.replace(window.location.href.slice(0, hashIndex >= 0 ? hashIndex : 0) + '#' + path);
|
1785
|
}
|
1786
|
|
1787
|
function createHashHistory(props) {
|
1788
|
if (props === void 0) {
|
1789
|
props = {};
|
1790
|
}
|
1791
|
|
1792
|
!canUseDOM ? invariant(false, 'Hash history needs a DOM') : void 0;
|
1793
|
var globalHistory = window.history;
|
1794
|
var canGoWithoutReload = supportsGoWithoutReloadUsingHash();
|
1795
|
var _props = props,
|
1796
|
_props$getUserConfirm = _props.getUserConfirmation,
|
1797
|
getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,
|
1798
|
_props$hashType = _props.hashType,
|
1799
|
hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;
|
1800
|
var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';
|
1801
|
var _HashPathCoders$hashT = HashPathCoders[hashType],
|
1802
|
encodePath = _HashPathCoders$hashT.encodePath,
|
1803
|
decodePath = _HashPathCoders$hashT.decodePath;
|
1804
|
|
1805
|
function getDOMLocation() {
|
1806
|
var path = decodePath(getHashPath());
|
1807
|
warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path "' + path + '" to begin with "' + basename + '".') ;
|
1808
|
if (basename) path = stripBasename(path, basename);
|
1809
|
return createLocation(path);
|
1810
|
}
|
1811
|
|
1812
|
var transitionManager = createTransitionManager();
|
1813
|
|
1814
|
function setState(nextState) {
|
1815
|
_extends(history, nextState);
|
1816
|
|
1817
|
history.length = globalHistory.length;
|
1818
|
transitionManager.notifyListeners(history.location, history.action);
|
1819
|
}
|
1820
|
|
1821
|
var forceNextPop = false;
|
1822
|
var ignorePath = null;
|
1823
|
|
1824
|
function handleHashChange() {
|
1825
|
var path = getHashPath();
|
1826
|
var encodedPath = encodePath(path);
|
1827
|
|
1828
|
if (path !== encodedPath) {
|
1829
|
// Ensure we always have a properly-encoded hash.
|
1830
|
replaceHashPath(encodedPath);
|
1831
|
} else {
|
1832
|
var location = getDOMLocation();
|
1833
|
var prevLocation = history.location;
|
1834
|
if (!forceNextPop && locationsAreEqual(prevLocation, location)) return; // A hashchange doesn't always == location change.
|
1835
|
|
1836
|
if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.
|
1837
|
|
1838
|
ignorePath = null;
|
1839
|
handlePop(location);
|
1840
|
}
|
1841
|
}
|
1842
|
|
1843
|
function handlePop(location) {
|
1844
|
if (forceNextPop) {
|
1845
|
forceNextPop = false;
|
1846
|
setState();
|
1847
|
} else {
|
1848
|
var action = 'POP';
|
1849
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1850
|
if (ok) {
|
1851
|
setState({
|
1852
|
action: action,
|
1853
|
location: location
|
1854
|
});
|
1855
|
} else {
|
1856
|
revertPop(location);
|
1857
|
}
|
1858
|
});
|
1859
|
}
|
1860
|
}
|
1861
|
|
1862
|
function revertPop(fromLocation) {
|
1863
|
var toLocation = history.location; // TODO: We could probably make this more reliable by
|
1864
|
// keeping a list of paths we've seen in sessionStorage.
|
1865
|
// Instead, we just default to 0 for paths we don't know.
|
1866
|
|
1867
|
var toIndex = allPaths.lastIndexOf(createPath(toLocation));
|
1868
|
if (toIndex === -1) toIndex = 0;
|
1869
|
var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));
|
1870
|
if (fromIndex === -1) fromIndex = 0;
|
1871
|
var delta = toIndex - fromIndex;
|
1872
|
|
1873
|
if (delta) {
|
1874
|
forceNextPop = true;
|
1875
|
go(delta);
|
1876
|
}
|
1877
|
} // Ensure the hash is encoded properly before doing anything else.
|
1878
|
|
1879
|
|
1880
|
var path = getHashPath();
|
1881
|
var encodedPath = encodePath(path);
|
1882
|
if (path !== encodedPath) replaceHashPath(encodedPath);
|
1883
|
var initialLocation = getDOMLocation();
|
1884
|
var allPaths = [createPath(initialLocation)]; // Public interface
|
1885
|
|
1886
|
function createHref(location) {
|
1887
|
return '#' + encodePath(basename + createPath(location));
|
1888
|
}
|
1889
|
|
1890
|
function push(path, state) {
|
1891
|
warning(state === undefined, 'Hash history cannot push state; it is ignored') ;
|
1892
|
var action = 'PUSH';
|
1893
|
var location = createLocation(path, undefined, undefined, history.location);
|
1894
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1895
|
if (!ok) return;
|
1896
|
var path = createPath(location);
|
1897
|
var encodedPath = encodePath(basename + path);
|
1898
|
var hashChanged = getHashPath() !== encodedPath;
|
1899
|
|
1900
|
if (hashChanged) {
|
1901
|
// We cannot tell if a hashchange was caused by a PUSH, so we'd
|
1902
|
// rather setState here and ignore the hashchange. The caveat here
|
1903
|
// is that other hash histories in the page will consider it a POP.
|
1904
|
ignorePath = path;
|
1905
|
pushHashPath(encodedPath);
|
1906
|
var prevIndex = allPaths.lastIndexOf(createPath(history.location));
|
1907
|
var nextPaths = allPaths.slice(0, prevIndex === -1 ? 0 : prevIndex + 1);
|
1908
|
nextPaths.push(path);
|
1909
|
allPaths = nextPaths;
|
1910
|
setState({
|
1911
|
action: action,
|
1912
|
location: location
|
1913
|
});
|
1914
|
} else {
|
1915
|
warning(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') ;
|
1916
|
setState();
|
1917
|
}
|
1918
|
});
|
1919
|
}
|
1920
|
|
1921
|
function replace(path, state) {
|
1922
|
warning(state === undefined, 'Hash history cannot replace state; it is ignored') ;
|
1923
|
var action = 'REPLACE';
|
1924
|
var location = createLocation(path, undefined, undefined, history.location);
|
1925
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
1926
|
if (!ok) return;
|
1927
|
var path = createPath(location);
|
1928
|
var encodedPath = encodePath(basename + path);
|
1929
|
var hashChanged = getHashPath() !== encodedPath;
|
1930
|
|
1931
|
if (hashChanged) {
|
1932
|
// We cannot tell if a hashchange was caused by a REPLACE, so we'd
|
1933
|
// rather setState here and ignore the hashchange. The caveat here
|
1934
|
// is that other hash histories in the page will consider it a POP.
|
1935
|
ignorePath = path;
|
1936
|
replaceHashPath(encodedPath);
|
1937
|
}
|
1938
|
|
1939
|
var prevIndex = allPaths.indexOf(createPath(history.location));
|
1940
|
if (prevIndex !== -1) allPaths[prevIndex] = path;
|
1941
|
setState({
|
1942
|
action: action,
|
1943
|
location: location
|
1944
|
});
|
1945
|
});
|
1946
|
}
|
1947
|
|
1948
|
function go(n) {
|
1949
|
warning(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') ;
|
1950
|
globalHistory.go(n);
|
1951
|
}
|
1952
|
|
1953
|
function goBack() {
|
1954
|
go(-1);
|
1955
|
}
|
1956
|
|
1957
|
function goForward() {
|
1958
|
go(1);
|
1959
|
}
|
1960
|
|
1961
|
var listenerCount = 0;
|
1962
|
|
1963
|
function checkDOMListeners(delta) {
|
1964
|
listenerCount += delta;
|
1965
|
|
1966
|
if (listenerCount === 1 && delta === 1) {
|
1967
|
window.addEventListener(HashChangeEvent$1, handleHashChange);
|
1968
|
} else if (listenerCount === 0) {
|
1969
|
window.removeEventListener(HashChangeEvent$1, handleHashChange);
|
1970
|
}
|
1971
|
}
|
1972
|
|
1973
|
var isBlocked = false;
|
1974
|
|
1975
|
function block(prompt) {
|
1976
|
if (prompt === void 0) {
|
1977
|
prompt = false;
|
1978
|
}
|
1979
|
|
1980
|
var unblock = transitionManager.setPrompt(prompt);
|
1981
|
|
1982
|
if (!isBlocked) {
|
1983
|
checkDOMListeners(1);
|
1984
|
isBlocked = true;
|
1985
|
}
|
1986
|
|
1987
|
return function () {
|
1988
|
if (isBlocked) {
|
1989
|
isBlocked = false;
|
1990
|
checkDOMListeners(-1);
|
1991
|
}
|
1992
|
|
1993
|
return unblock();
|
1994
|
};
|
1995
|
}
|
1996
|
|
1997
|
function listen(listener) {
|
1998
|
var unlisten = transitionManager.appendListener(listener);
|
1999
|
checkDOMListeners(1);
|
2000
|
return function () {
|
2001
|
checkDOMListeners(-1);
|
2002
|
unlisten();
|
2003
|
};
|
2004
|
}
|
2005
|
|
2006
|
var history = {
|
2007
|
length: globalHistory.length,
|
2008
|
action: 'POP',
|
2009
|
location: initialLocation,
|
2010
|
createHref: createHref,
|
2011
|
push: push,
|
2012
|
replace: replace,
|
2013
|
go: go,
|
2014
|
goBack: goBack,
|
2015
|
goForward: goForward,
|
2016
|
block: block,
|
2017
|
listen: listen
|
2018
|
};
|
2019
|
return history;
|
2020
|
}
|
2021
|
|
2022
|
function clamp(n, lowerBound, upperBound) {
|
2023
|
return Math.min(Math.max(n, lowerBound), upperBound);
|
2024
|
}
|
2025
|
/**
|
2026
|
* Creates a history object that stores locations in memory.
|
2027
|
*/
|
2028
|
|
2029
|
|
2030
|
function createMemoryHistory(props) {
|
2031
|
if (props === void 0) {
|
2032
|
props = {};
|
2033
|
}
|
2034
|
|
2035
|
var _props = props,
|
2036
|
getUserConfirmation = _props.getUserConfirmation,
|
2037
|
_props$initialEntries = _props.initialEntries,
|
2038
|
initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,
|
2039
|
_props$initialIndex = _props.initialIndex,
|
2040
|
initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,
|
2041
|
_props$keyLength = _props.keyLength,
|
2042
|
keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;
|
2043
|
var transitionManager = createTransitionManager();
|
2044
|
|
2045
|
function setState(nextState) {
|
2046
|
_extends(history, nextState);
|
2047
|
|
2048
|
history.length = history.entries.length;
|
2049
|
transitionManager.notifyListeners(history.location, history.action);
|
2050
|
}
|
2051
|
|
2052
|
function createKey() {
|
2053
|
return Math.random().toString(36).substr(2, keyLength);
|
2054
|
}
|
2055
|
|
2056
|
var index = clamp(initialIndex, 0, initialEntries.length - 1);
|
2057
|
var entries = initialEntries.map(function (entry) {
|
2058
|
return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());
|
2059
|
}); // Public interface
|
2060
|
|
2061
|
var createHref = createPath;
|
2062
|
|
2063
|
function push(path, state) {
|
2064
|
warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') ;
|
2065
|
var action = 'PUSH';
|
2066
|
var location = createLocation(path, state, createKey(), history.location);
|
2067
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
2068
|
if (!ok) return;
|
2069
|
var prevIndex = history.index;
|
2070
|
var nextIndex = prevIndex + 1;
|
2071
|
var nextEntries = history.entries.slice(0);
|
2072
|
|
2073
|
if (nextEntries.length > nextIndex) {
|
2074
|
nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);
|
2075
|
} else {
|
2076
|
nextEntries.push(location);
|
2077
|
}
|
2078
|
|
2079
|
setState({
|
2080
|
action: action,
|
2081
|
location: location,
|
2082
|
index: nextIndex,
|
2083
|
entries: nextEntries
|
2084
|
});
|
2085
|
});
|
2086
|
}
|
2087
|
|
2088
|
function replace(path, state) {
|
2089
|
warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') ;
|
2090
|
var action = 'REPLACE';
|
2091
|
var location = createLocation(path, state, createKey(), history.location);
|
2092
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
2093
|
if (!ok) return;
|
2094
|
history.entries[history.index] = location;
|
2095
|
setState({
|
2096
|
action: action,
|
2097
|
location: location
|
2098
|
});
|
2099
|
});
|
2100
|
}
|
2101
|
|
2102
|
function go(n) {
|
2103
|
var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);
|
2104
|
var action = 'POP';
|
2105
|
var location = history.entries[nextIndex];
|
2106
|
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {
|
2107
|
if (ok) {
|
2108
|
setState({
|
2109
|
action: action,
|
2110
|
location: location,
|
2111
|
index: nextIndex
|
2112
|
});
|
2113
|
} else {
|
2114
|
// Mimic the behavior of DOM histories by
|
2115
|
// causing a render after a cancelled POP.
|
2116
|
setState();
|
2117
|
}
|
2118
|
});
|
2119
|
}
|
2120
|
|
2121
|
function goBack() {
|
2122
|
go(-1);
|
2123
|
}
|
2124
|
|
2125
|
function goForward() {
|
2126
|
go(1);
|
2127
|
}
|
2128
|
|
2129
|
function canGo(n) {
|
2130
|
var nextIndex = history.index + n;
|
2131
|
return nextIndex >= 0 && nextIndex < history.entries.length;
|
2132
|
}
|
2133
|
|
2134
|
function block(prompt) {
|
2135
|
if (prompt === void 0) {
|
2136
|
prompt = false;
|
2137
|
}
|
2138
|
|
2139
|
return transitionManager.setPrompt(prompt);
|
2140
|
}
|
2141
|
|
2142
|
function listen(listener) {
|
2143
|
return transitionManager.appendListener(listener);
|
2144
|
}
|
2145
|
|
2146
|
var history = {
|
2147
|
length: entries.length,
|
2148
|
action: 'POP',
|
2149
|
location: entries[index],
|
2150
|
index: index,
|
2151
|
entries: entries,
|
2152
|
createHref: createHref,
|
2153
|
push: push,
|
2154
|
replace: replace,
|
2155
|
go: go,
|
2156
|
goBack: goBack,
|
2157
|
goForward: goForward,
|
2158
|
canGo: canGo,
|
2159
|
block: block,
|
2160
|
listen: listen
|
2161
|
};
|
2162
|
return history;
|
2163
|
}
|
2164
|
|
2165
|
function _inheritsLoose$1(subClass, superClass) {
|
2166
|
subClass.prototype = Object.create(superClass.prototype);
|
2167
|
subClass.prototype.constructor = subClass;
|
2168
|
subClass.__proto__ = superClass;
|
2169
|
}
|
2170
|
|
2171
|
var inheritsLoose = _inheritsLoose$1;
|
2172
|
|
2173
|
var key = '__global_unique_id__';
|
2174
|
|
2175
|
var gud = function() {
|
2176
|
return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;
|
2177
|
};
|
2178
|
|
2179
|
var MAX_SIGNED_31_BIT_INT = 1073741823;
|
2180
|
|
2181
|
function objectIs(x, y) {
|
2182
|
if (x === y) {
|
2183
|
return x !== 0 || 1 / x === 1 / y;
|
2184
|
} else {
|
2185
|
return x !== x && y !== y;
|
2186
|
}
|
2187
|
}
|
2188
|
|
2189
|
function createEventEmitter(value) {
|
2190
|
var handlers = [];
|
2191
|
return {
|
2192
|
on: function on(handler) {
|
2193
|
handlers.push(handler);
|
2194
|
},
|
2195
|
off: function off(handler) {
|
2196
|
handlers = handlers.filter(function (h) {
|
2197
|
return h !== handler;
|
2198
|
});
|
2199
|
},
|
2200
|
get: function get() {
|
2201
|
return value;
|
2202
|
},
|
2203
|
set: function set(newValue, changedBits) {
|
2204
|
value = newValue;
|
2205
|
handlers.forEach(function (handler) {
|
2206
|
return handler(value, changedBits);
|
2207
|
});
|
2208
|
}
|
2209
|
};
|
2210
|
}
|
2211
|
|
2212
|
function onlyChild(children) {
|
2213
|
return Array.isArray(children) ? children[0] : children;
|
2214
|
}
|
2215
|
|
2216
|
function createReactContext(defaultValue, calculateChangedBits) {
|
2217
|
var _Provider$childContex, _Consumer$contextType;
|
2218
|
|
2219
|
var contextProp = '__create-react-context-' + gud() + '__';
|
2220
|
|
2221
|
var Provider =
|
2222
|
/*#__PURE__*/
|
2223
|
function (_Component) {
|
2224
|
inheritsLoose(Provider, _Component);
|
2225
|
|
2226
|
function Provider() {
|
2227
|
var _this;
|
2228
|
|
2229
|
_this = _Component.apply(this, arguments) || this;
|
2230
|
_this.emitter = createEventEmitter(_this.props.value);
|
2231
|
return _this;
|
2232
|
}
|
2233
|
|
2234
|
var _proto = Provider.prototype;
|
2235
|
|
2236
|
_proto.getChildContext = function getChildContext() {
|
2237
|
var _ref;
|
2238
|
|
2239
|
return _ref = {}, _ref[contextProp] = this.emitter, _ref;
|
2240
|
};
|
2241
|
|
2242
|
_proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
2243
|
if (this.props.value !== nextProps.value) {
|
2244
|
var oldValue = this.props.value;
|
2245
|
var newValue = nextProps.value;
|
2246
|
var changedBits;
|
2247
|
|
2248
|
if (objectIs(oldValue, newValue)) {
|
2249
|
changedBits = 0;
|
2250
|
} else {
|
2251
|
changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;
|
2252
|
|
2253
|
{
|
2254
|
warning((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: ' + changedBits);
|
2255
|
}
|
2256
|
|
2257
|
changedBits |= 0;
|
2258
|
|
2259
|
if (changedBits !== 0) {
|
2260
|
this.emitter.set(nextProps.value, changedBits);
|
2261
|
}
|
2262
|
}
|
2263
|
}
|
2264
|
};
|
2265
|
|
2266
|
_proto.render = function render() {
|
2267
|
return this.props.children;
|
2268
|
};
|
2269
|
|
2270
|
return Provider;
|
2271
|
}(React.Component);
|
2272
|
|
2273
|
Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = propTypes.object.isRequired, _Provider$childContex);
|
2274
|
|
2275
|
var Consumer =
|
2276
|
/*#__PURE__*/
|
2277
|
function (_Component2) {
|
2278
|
inheritsLoose(Consumer, _Component2);
|
2279
|
|
2280
|
function Consumer() {
|
2281
|
var _this2;
|
2282
|
|
2283
|
_this2 = _Component2.apply(this, arguments) || this;
|
2284
|
_this2.state = {
|
2285
|
value: _this2.getValue()
|
2286
|
};
|
2287
|
|
2288
|
_this2.onUpdate = function (newValue, changedBits) {
|
2289
|
var observedBits = _this2.observedBits | 0;
|
2290
|
|
2291
|
if ((observedBits & changedBits) !== 0) {
|
2292
|
_this2.setState({
|
2293
|
value: _this2.getValue()
|
2294
|
});
|
2295
|
}
|
2296
|
};
|
2297
|
|
2298
|
return _this2;
|
2299
|
}
|
2300
|
|
2301
|
var _proto2 = Consumer.prototype;
|
2302
|
|
2303
|
_proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
2304
|
var observedBits = nextProps.observedBits;
|
2305
|
this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;
|
2306
|
};
|
2307
|
|
2308
|
_proto2.componentDidMount = function componentDidMount() {
|
2309
|
if (this.context[contextProp]) {
|
2310
|
this.context[contextProp].on(this.onUpdate);
|
2311
|
}
|
2312
|
|
2313
|
var observedBits = this.props.observedBits;
|
2314
|
this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;
|
2315
|
};
|
2316
|
|
2317
|
_proto2.componentWillUnmount = function componentWillUnmount() {
|
2318
|
if (this.context[contextProp]) {
|
2319
|
this.context[contextProp].off(this.onUpdate);
|
2320
|
}
|
2321
|
};
|
2322
|
|
2323
|
_proto2.getValue = function getValue() {
|
2324
|
if (this.context[contextProp]) {
|
2325
|
return this.context[contextProp].get();
|
2326
|
} else {
|
2327
|
return defaultValue;
|
2328
|
}
|
2329
|
};
|
2330
|
|
2331
|
_proto2.render = function render() {
|
2332
|
return onlyChild(this.props.children)(this.state.value);
|
2333
|
};
|
2334
|
|
2335
|
return Consumer;
|
2336
|
}(React.Component);
|
2337
|
|
2338
|
Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = propTypes.object, _Consumer$contextType);
|
2339
|
return {
|
2340
|
Provider: Provider,
|
2341
|
Consumer: Consumer
|
2342
|
};
|
2343
|
}
|
2344
|
|
2345
|
var index = React__default.createContext || createReactContext;
|
2346
|
|
2347
|
var isarray = Array.isArray || function (arr) {
|
2348
|
return Object.prototype.toString.call(arr) == '[object Array]';
|
2349
|
};
|
2350
|
|
2351
|
/**
|
2352
|
* Expose `pathToRegexp`.
|
2353
|
*/
|
2354
|
var pathToRegexp_1 = pathToRegexp;
|
2355
|
var parse_1 = parse;
|
2356
|
var compile_1 = compile;
|
2357
|
var tokensToFunction_1 = tokensToFunction;
|
2358
|
var tokensToRegExp_1 = tokensToRegExp;
|
2359
|
|
2360
|
/**
|
2361
|
* The main path matching regexp utility.
|
2362
|
*
|
2363
|
* @type {RegExp}
|
2364
|
*/
|
2365
|
var PATH_REGEXP = new RegExp([
|
2366
|
// Match escaped characters that would otherwise appear in future matches.
|
2367
|
// This allows the user to escape special characters that won't transform.
|
2368
|
'(\\\\.)',
|
2369
|
// Match Express-style parameters and un-named parameters with a prefix
|
2370
|
// and optional suffixes. Matches appear as:
|
2371
|
//
|
2372
|
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
|
2373
|
// "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined]
|
2374
|
// "/*" => ["/", undefined, undefined, undefined, undefined, "*"]
|
2375
|
'([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'
|
2376
|
].join('|'), 'g');
|
2377
|
|
2378
|
/**
|
2379
|
* Parse a string for the raw tokens.
|
2380
|
*
|
2381
|
* @param {string} str
|
2382
|
* @param {Object=} options
|
2383
|
* @return {!Array}
|
2384
|
*/
|
2385
|
function parse (str, options) {
|
2386
|
var tokens = [];
|
2387
|
var key = 0;
|
2388
|
var index = 0;
|
2389
|
var path = '';
|
2390
|
var defaultDelimiter = options && options.delimiter || '/';
|
2391
|
var res;
|
2392
|
|
2393
|
while ((res = PATH_REGEXP.exec(str)) != null) {
|
2394
|
var m = res[0];
|
2395
|
var escaped = res[1];
|
2396
|
var offset = res.index;
|
2397
|
path += str.slice(index, offset);
|
2398
|
index = offset + m.length;
|
2399
|
|
2400
|
// Ignore already escaped sequences.
|
2401
|
if (escaped) {
|
2402
|
path += escaped[1];
|
2403
|
continue
|
2404
|
}
|
2405
|
|
2406
|
var next = str[index];
|
2407
|
var prefix = res[2];
|
2408
|
var name = res[3];
|
2409
|
var capture = res[4];
|
2410
|
var group = res[5];
|
2411
|
var modifier = res[6];
|
2412
|
var asterisk = res[7];
|
2413
|
|
2414
|
// Push the current path onto the tokens.
|
2415
|
if (path) {
|
2416
|
tokens.push(path);
|
2417
|
path = '';
|
2418
|
}
|
2419
|
|
2420
|
var partial = prefix != null && next != null && next !== prefix;
|
2421
|
var repeat = modifier === '+' || modifier === '*';
|
2422
|
var optional = modifier === '?' || modifier === '*';
|
2423
|
var delimiter = res[2] || defaultDelimiter;
|
2424
|
var pattern = capture || group;
|
2425
|
|
2426
|
tokens.push({
|
2427
|
name: name || key++,
|
2428
|
prefix: prefix || '',
|
2429
|
delimiter: delimiter,
|
2430
|
optional: optional,
|
2431
|
repeat: repeat,
|
2432
|
partial: partial,
|
2433
|
asterisk: !!asterisk,
|
2434
|
pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
|
2435
|
});
|
2436
|
}
|
2437
|
|
2438
|
// Match any characters still remaining.
|
2439
|
if (index < str.length) {
|
2440
|
path += str.substr(index);
|
2441
|
}
|
2442
|
|
2443
|
// If the path exists, push it onto the end.
|
2444
|
if (path) {
|
2445
|
tokens.push(path);
|
2446
|
}
|
2447
|
|
2448
|
return tokens
|
2449
|
}
|
2450
|
|
2451
|
/**
|
2452
|
* Compile a string to a template function for the path.
|
2453
|
*
|
2454
|
* @param {string} str
|
2455
|
* @param {Object=} options
|
2456
|
* @return {!function(Object=, Object=)}
|
2457
|
*/
|
2458
|
function compile (str, options) {
|
2459
|
return tokensToFunction(parse(str, options))
|
2460
|
}
|
2461
|
|
2462
|
/**
|
2463
|
* Prettier encoding of URI path segments.
|
2464
|
*
|
2465
|
* @param {string}
|
2466
|
* @return {string}
|
2467
|
*/
|
2468
|
function encodeURIComponentPretty (str) {
|
2469
|
return encodeURI(str).replace(/[\/?#]/g, function (c) {
|
2470
|
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
|
2471
|
})
|
2472
|
}
|
2473
|
|
2474
|
/**
|
2475
|
* Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
|
2476
|
*
|
2477
|
* @param {string}
|
2478
|
* @return {string}
|
2479
|
*/
|
2480
|
function encodeAsterisk (str) {
|
2481
|
return encodeURI(str).replace(/[?#]/g, function (c) {
|
2482
|
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
|
2483
|
})
|
2484
|
}
|
2485
|
|
2486
|
/**
|
2487
|
* Expose a method for transforming tokens into the path function.
|
2488
|
*/
|
2489
|
function tokensToFunction (tokens) {
|
2490
|
// Compile all the tokens into regexps.
|
2491
|
var matches = new Array(tokens.length);
|
2492
|
|
2493
|
// Compile all the patterns before compilation.
|
2494
|
for (var i = 0; i < tokens.length; i++) {
|
2495
|
if (typeof tokens[i] === 'object') {
|
2496
|
matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$');
|
2497
|
}
|
2498
|
}
|
2499
|
|
2500
|
return function (obj, opts) {
|
2501
|
var path = '';
|
2502
|
var data = obj || {};
|
2503
|
var options = opts || {};
|
2504
|
var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;
|
2505
|
|
2506
|
for (var i = 0; i < tokens.length; i++) {
|
2507
|
var token = tokens[i];
|
2508
|
|
2509
|
if (typeof token === 'string') {
|
2510
|
path += token;
|
2511
|
|
2512
|
continue
|
2513
|
}
|
2514
|
|
2515
|
var value = data[token.name];
|
2516
|
var segment;
|
2517
|
|
2518
|
if (value == null) {
|
2519
|
if (token.optional) {
|
2520
|
// Prepend partial segment prefixes.
|
2521
|
if (token.partial) {
|
2522
|
path += token.prefix;
|
2523
|
}
|
2524
|
|
2525
|
continue
|
2526
|
} else {
|
2527
|
throw new TypeError('Expected "' + token.name + '" to be defined')
|
2528
|
}
|
2529
|
}
|
2530
|
|
2531
|
if (isarray(value)) {
|
2532
|
if (!token.repeat) {
|
2533
|
throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`')
|
2534
|
}
|
2535
|
|
2536
|
if (value.length === 0) {
|
2537
|
if (token.optional) {
|
2538
|
continue
|
2539
|
} else {
|
2540
|
throw new TypeError('Expected "' + token.name + '" to not be empty')
|
2541
|
}
|
2542
|
}
|
2543
|
|
2544
|
for (var j = 0; j < value.length; j++) {
|
2545
|
segment = encode(value[j]);
|
2546
|
|
2547
|
if (!matches[i].test(segment)) {
|
2548
|
throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`')
|
2549
|
}
|
2550
|
|
2551
|
path += (j === 0 ? token.prefix : token.delimiter) + segment;
|
2552
|
}
|
2553
|
|
2554
|
continue
|
2555
|
}
|
2556
|
|
2557
|
segment = token.asterisk ? encodeAsterisk(value) : encode(value);
|
2558
|
|
2559
|
if (!matches[i].test(segment)) {
|
2560
|
throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"')
|
2561
|
}
|
2562
|
|
2563
|
path += token.prefix + segment;
|
2564
|
}
|
2565
|
|
2566
|
return path
|
2567
|
}
|
2568
|
}
|
2569
|
|
2570
|
/**
|
2571
|
* Escape a regular expression string.
|
2572
|
*
|
2573
|
* @param {string} str
|
2574
|
* @return {string}
|
2575
|
*/
|
2576
|
function escapeString (str) {
|
2577
|
return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1')
|
2578
|
}
|
2579
|
|
2580
|
/**
|
2581
|
* Escape the capturing group by escaping special characters and meaning.
|
2582
|
*
|
2583
|
* @param {string} group
|
2584
|
* @return {string}
|
2585
|
*/
|
2586
|
function escapeGroup (group) {
|
2587
|
return group.replace(/([=!:$\/()])/g, '\\$1')
|
2588
|
}
|
2589
|
|
2590
|
/**
|
2591
|
* Attach the keys as a property of the regexp.
|
2592
|
*
|
2593
|
* @param {!RegExp} re
|
2594
|
* @param {Array} keys
|
2595
|
* @return {!RegExp}
|
2596
|
*/
|
2597
|
function attachKeys (re, keys) {
|
2598
|
re.keys = keys;
|
2599
|
return re
|
2600
|
}
|
2601
|
|
2602
|
/**
|
2603
|
* Get the flags for a regexp from the options.
|
2604
|
*
|
2605
|
* @param {Object} options
|
2606
|
* @return {string}
|
2607
|
*/
|
2608
|
function flags (options) {
|
2609
|
return options.sensitive ? '' : 'i'
|
2610
|
}
|
2611
|
|
2612
|
/**
|
2613
|
* Pull out keys from a regexp.
|
2614
|
*
|
2615
|
* @param {!RegExp} path
|
2616
|
* @param {!Array} keys
|
2617
|
* @return {!RegExp}
|
2618
|
*/
|
2619
|
function regexpToRegexp (path, keys) {
|
2620
|
// Use a negative lookahead to match only capturing groups.
|
2621
|
var groups = path.source.match(/\((?!\?)/g);
|
2622
|
|
2623
|
if (groups) {
|
2624
|
for (var i = 0; i < groups.length; i++) {
|
2625
|
keys.push({
|
2626
|
name: i,
|
2627
|
prefix: null,
|
2628
|
delimiter: null,
|
2629
|
optional: false,
|
2630
|
repeat: false,
|
2631
|
partial: false,
|
2632
|
asterisk: false,
|
2633
|
pattern: null
|
2634
|
});
|
2635
|
}
|
2636
|
}
|
2637
|
|
2638
|
return attachKeys(path, keys)
|
2639
|
}
|
2640
|
|
2641
|
/**
|
2642
|
* Transform an array into a regexp.
|
2643
|
*
|
2644
|
* @param {!Array} path
|
2645
|
* @param {Array} keys
|
2646
|
* @param {!Object} options
|
2647
|
* @return {!RegExp}
|
2648
|
*/
|
2649
|
function arrayToRegexp (path, keys, options) {
|
2650
|
var parts = [];
|
2651
|
|
2652
|
for (var i = 0; i < path.length; i++) {
|
2653
|
parts.push(pathToRegexp(path[i], keys, options).source);
|
2654
|
}
|
2655
|
|
2656
|
var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));
|
2657
|
|
2658
|
return attachKeys(regexp, keys)
|
2659
|
}
|
2660
|
|
2661
|
/**
|
2662
|
* Create a path regexp from string input.
|
2663
|
*
|
2664
|
* @param {string} path
|
2665
|
* @param {!Array} keys
|
2666
|
* @param {!Object} options
|
2667
|
* @return {!RegExp}
|
2668
|
*/
|
2669
|
function stringToRegexp (path, keys, options) {
|
2670
|
return tokensToRegExp(parse(path, options), keys, options)
|
2671
|
}
|
2672
|
|
2673
|
/**
|
2674
|
* Expose a function for taking tokens and returning a RegExp.
|
2675
|
*
|
2676
|
* @param {!Array} tokens
|
2677
|
* @param {(Array|Object)=} keys
|
2678
|
* @param {Object=} options
|
2679
|
* @return {!RegExp}
|
2680
|
*/
|
2681
|
function tokensToRegExp (tokens, keys, options) {
|
2682
|
if (!isarray(keys)) {
|
2683
|
options = /** @type {!Object} */ (keys || options);
|
2684
|
keys = [];
|
2685
|
}
|
2686
|
|
2687
|
options = options || {};
|
2688
|
|
2689
|
var strict = options.strict;
|
2690
|
var end = options.end !== false;
|
2691
|
var route = '';
|
2692
|
|
2693
|
// Iterate over the tokens and create our regexp string.
|
2694
|
for (var i = 0; i < tokens.length; i++) {
|
2695
|
var token = tokens[i];
|
2696
|
|
2697
|
if (typeof token === 'string') {
|
2698
|
route += escapeString(token);
|
2699
|
} else {
|
2700
|
var prefix = escapeString(token.prefix);
|
2701
|
var capture = '(?:' + token.pattern + ')';
|
2702
|
|
2703
|
keys.push(token);
|
2704
|
|
2705
|
if (token.repeat) {
|
2706
|
capture += '(?:' + prefix + capture + ')*';
|
2707
|
}
|
2708
|
|
2709
|
if (token.optional) {
|
2710
|
if (!token.partial) {
|
2711
|
capture = '(?:' + prefix + '(' + capture + '))?';
|
2712
|
} else {
|
2713
|
capture = prefix + '(' + capture + ')?';
|
2714
|
}
|
2715
|
} else {
|
2716
|
capture = prefix + '(' + capture + ')';
|
2717
|
}
|
2718
|
|
2719
|
route += capture;
|
2720
|
}
|
2721
|
}
|
2722
|
|
2723
|
var delimiter = escapeString(options.delimiter || '/');
|
2724
|
var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;
|
2725
|
|
2726
|
// In non-strict mode we allow a slash at the end of match. If the path to
|
2727
|
// match already ends with a slash, we remove it for consistency. The slash
|
2728
|
// is valid at the end of a path match, not in the middle. This is important
|
2729
|
// in non-ending mode, where "/test/" shouldn't match "/test//route".
|
2730
|
if (!strict) {
|
2731
|
route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';
|
2732
|
}
|
2733
|
|
2734
|
if (end) {
|
2735
|
route += '$';
|
2736
|
} else {
|
2737
|
// In non-ending mode, we need the capturing groups to match as much as
|
2738
|
// possible by using a positive lookahead to the end or next path segment.
|
2739
|
route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';
|
2740
|
}
|
2741
|
|
2742
|
return attachKeys(new RegExp('^' + route, flags(options)), keys)
|
2743
|
}
|
2744
|
|
2745
|
/**
|
2746
|
* Normalize the given path string, returning a regular expression.
|
2747
|
*
|
2748
|
* An empty array can be passed in for the keys, which will hold the
|
2749
|
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
2750
|
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
2751
|
*
|
2752
|
* @param {(string|RegExp|Array)} path
|
2753
|
* @param {(Array|Object)=} keys
|
2754
|
* @param {Object=} options
|
2755
|
* @return {!RegExp}
|
2756
|
*/
|
2757
|
function pathToRegexp (path, keys, options) {
|
2758
|
if (!isarray(keys)) {
|
2759
|
options = /** @type {!Object} */ (keys || options);
|
2760
|
keys = [];
|
2761
|
}
|
2762
|
|
2763
|
options = options || {};
|
2764
|
|
2765
|
if (path instanceof RegExp) {
|
2766
|
return regexpToRegexp(path, /** @type {!Array} */ (keys))
|
2767
|
}
|
2768
|
|
2769
|
if (isarray(path)) {
|
2770
|
return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)
|
2771
|
}
|
2772
|
|
2773
|
return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)
|
2774
|
}
|
2775
|
pathToRegexp_1.parse = parse_1;
|
2776
|
pathToRegexp_1.compile = compile_1;
|
2777
|
pathToRegexp_1.tokensToFunction = tokensToFunction_1;
|
2778
|
pathToRegexp_1.tokensToRegExp = tokensToRegExp_1;
|
2779
|
|
2780
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
2781
|
if (source == null) return {};
|
2782
|
var target = {};
|
2783
|
var sourceKeys = Object.keys(source);
|
2784
|
var key, i;
|
2785
|
|
2786
|
for (i = 0; i < sourceKeys.length; i++) {
|
2787
|
key = sourceKeys[i];
|
2788
|
if (excluded.indexOf(key) >= 0) continue;
|
2789
|
target[key] = source[key];
|
2790
|
}
|
2791
|
|
2792
|
return target;
|
2793
|
}
|
2794
|
|
2795
|
/**
|
2796
|
* Copyright 2015, Yahoo! Inc.
|
2797
|
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
2798
|
*/
|
2799
|
|
2800
|
var REACT_STATICS = {
|
2801
|
childContextTypes: true,
|
2802
|
contextType: true,
|
2803
|
contextTypes: true,
|
2804
|
defaultProps: true,
|
2805
|
displayName: true,
|
2806
|
getDefaultProps: true,
|
2807
|
getDerivedStateFromError: true,
|
2808
|
getDerivedStateFromProps: true,
|
2809
|
mixins: true,
|
2810
|
propTypes: true,
|
2811
|
type: true
|
2812
|
};
|
2813
|
|
2814
|
var KNOWN_STATICS = {
|
2815
|
name: true,
|
2816
|
length: true,
|
2817
|
prototype: true,
|
2818
|
caller: true,
|
2819
|
callee: true,
|
2820
|
arguments: true,
|
2821
|
arity: true
|
2822
|
};
|
2823
|
|
2824
|
var FORWARD_REF_STATICS = {
|
2825
|
'$$typeof': true,
|
2826
|
render: true,
|
2827
|
defaultProps: true,
|
2828
|
displayName: true,
|
2829
|
propTypes: true
|
2830
|
};
|
2831
|
|
2832
|
var MEMO_STATICS = {
|
2833
|
'$$typeof': true,
|
2834
|
compare: true,
|
2835
|
defaultProps: true,
|
2836
|
displayName: true,
|
2837
|
propTypes: true,
|
2838
|
type: true
|
2839
|
};
|
2840
|
|
2841
|
var TYPE_STATICS = {};
|
2842
|
TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;
|
2843
|
|
2844
|
function getStatics(component) {
|
2845
|
if (reactIs.isMemo(component)) {
|
2846
|
return MEMO_STATICS;
|
2847
|
}
|
2848
|
return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;
|
2849
|
}
|
2850
|
|
2851
|
var defineProperty = Object.defineProperty;
|
2852
|
var getOwnPropertyNames = Object.getOwnPropertyNames;
|
2853
|
var getOwnPropertySymbols$1 = Object.getOwnPropertySymbols;
|
2854
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
2855
|
var getPrototypeOf = Object.getPrototypeOf;
|
2856
|
var objectPrototype = Object.prototype;
|
2857
|
|
2858
|
function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
|
2859
|
if (typeof sourceComponent !== 'string') {
|
2860
|
// don't hoist over string (html) components
|
2861
|
|
2862
|
if (objectPrototype) {
|
2863
|
var inheritedComponent = getPrototypeOf(sourceComponent);
|
2864
|
if (inheritedComponent && inheritedComponent !== objectPrototype) {
|
2865
|
hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
|
2866
|
}
|
2867
|
}
|
2868
|
|
2869
|
var keys = getOwnPropertyNames(sourceComponent);
|
2870
|
|
2871
|
if (getOwnPropertySymbols$1) {
|
2872
|
keys = keys.concat(getOwnPropertySymbols$1(sourceComponent));
|
2873
|
}
|
2874
|
|
2875
|
var targetStatics = getStatics(targetComponent);
|
2876
|
var sourceStatics = getStatics(sourceComponent);
|
2877
|
|
2878
|
for (var i = 0; i < keys.length; ++i) {
|
2879
|
var key = keys[i];
|
2880
|
if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
|
2881
|
var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
|
2882
|
try {
|
2883
|
// Avoid failures from read-only properties
|
2884
|
defineProperty(targetComponent, key, descriptor);
|
2885
|
} catch (e) {}
|
2886
|
}
|
2887
|
}
|
2888
|
|
2889
|
return targetComponent;
|
2890
|
}
|
2891
|
|
2892
|
return targetComponent;
|
2893
|
}
|
2894
|
|
2895
|
var hoistNonReactStatics_cjs = hoistNonReactStatics;
|
2896
|
|
2897
|
var createNamedContext = function createNamedContext(name) {
|
2898
|
var context = index();
|
2899
|
context.displayName = name;
|
2900
|
return context;
|
2901
|
};
|
2902
|
|
2903
|
var context =
|
2904
|
/*#__PURE__*/
|
2905
|
createNamedContext("Router");
|
2906
|
/**
|
2907
|
* The public API for putting history on context.
|
2908
|
*/
|
2909
|
|
2910
|
var Router =
|
2911
|
/*#__PURE__*/
|
2912
|
function (_React$Component) {
|
2913
|
_inheritsLoose(Router, _React$Component);
|
2914
|
|
2915
|
Router.computeRootMatch = function computeRootMatch(pathname) {
|
2916
|
return {
|
2917
|
path: "/",
|
2918
|
url: "/",
|
2919
|
params: {},
|
2920
|
isExact: pathname === "/"
|
2921
|
};
|
2922
|
};
|
2923
|
|
2924
|
function Router(props) {
|
2925
|
var _this;
|
2926
|
|
2927
|
_this = _React$Component.call(this, props) || this;
|
2928
|
_this.state = {
|
2929
|
location: props.history.location
|
2930
|
}; // This is a bit of a hack. We have to start listening for location
|
2931
|
// changes here in the constructor in case there are any <Redirect>s
|
2932
|
// on the initial render. If there are, they will replace/push when
|
2933
|
// they mount and since cDM fires in children before parents, we may
|
2934
|
// get a new location before the <Router> is mounted.
|
2935
|
|
2936
|
_this._isMounted = false;
|
2937
|
_this._pendingLocation = null;
|
2938
|
|
2939
|
if (!props.staticContext) {
|
2940
|
_this.unlisten = props.history.listen(function (location) {
|
2941
|
if (_this._isMounted) {
|
2942
|
_this.setState({
|
2943
|
location: location
|
2944
|
});
|
2945
|
} else {
|
2946
|
_this._pendingLocation = location;
|
2947
|
}
|
2948
|
});
|
2949
|
}
|
2950
|
|
2951
|
return _this;
|
2952
|
}
|
2953
|
|
2954
|
var _proto = Router.prototype;
|
2955
|
|
2956
|
_proto.componentDidMount = function componentDidMount() {
|
2957
|
this._isMounted = true;
|
2958
|
|
2959
|
if (this._pendingLocation) {
|
2960
|
this.setState({
|
2961
|
location: this._pendingLocation
|
2962
|
});
|
2963
|
}
|
2964
|
};
|
2965
|
|
2966
|
_proto.componentWillUnmount = function componentWillUnmount() {
|
2967
|
if (this.unlisten) this.unlisten();
|
2968
|
};
|
2969
|
|
2970
|
_proto.render = function render() {
|
2971
|
return React__default.createElement(context.Provider, {
|
2972
|
children: this.props.children || null,
|
2973
|
value: {
|
2974
|
history: this.props.history,
|
2975
|
location: this.state.location,
|
2976
|
match: Router.computeRootMatch(this.state.location.pathname),
|
2977
|
staticContext: this.props.staticContext
|
2978
|
}
|
2979
|
});
|
2980
|
};
|
2981
|
|
2982
|
return Router;
|
2983
|
}(React__default.Component);
|
2984
|
|
2985
|
{
|
2986
|
Router.propTypes = {
|
2987
|
children: propTypes.node,
|
2988
|
history: propTypes.object.isRequired,
|
2989
|
staticContext: propTypes.object
|
2990
|
};
|
2991
|
|
2992
|
Router.prototype.componentDidUpdate = function (prevProps) {
|
2993
|
warning(prevProps.history === this.props.history, "You cannot change <Router history>") ;
|
2994
|
};
|
2995
|
}
|
2996
|
/**
|
2997
|
* The public API for a <Router> that stores location in memory.
|
2998
|
*/
|
2999
|
|
3000
|
|
3001
|
var MemoryRouter =
|
3002
|
/*#__PURE__*/
|
3003
|
function (_React$Component) {
|
3004
|
_inheritsLoose(MemoryRouter, _React$Component);
|
3005
|
|
3006
|
function MemoryRouter() {
|
3007
|
var _this;
|
3008
|
|
3009
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
3010
|
args[_key] = arguments[_key];
|
3011
|
}
|
3012
|
|
3013
|
_this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
|
3014
|
_this.history = createMemoryHistory(_this.props);
|
3015
|
return _this;
|
3016
|
}
|
3017
|
|
3018
|
var _proto = MemoryRouter.prototype;
|
3019
|
|
3020
|
_proto.render = function render() {
|
3021
|
return React__default.createElement(Router, {
|
3022
|
history: this.history,
|
3023
|
children: this.props.children
|
3024
|
});
|
3025
|
};
|
3026
|
|
3027
|
return MemoryRouter;
|
3028
|
}(React__default.Component);
|
3029
|
|
3030
|
{
|
3031
|
MemoryRouter.propTypes = {
|
3032
|
initialEntries: propTypes.array,
|
3033
|
initialIndex: propTypes.number,
|
3034
|
getUserConfirmation: propTypes.func,
|
3035
|
keyLength: propTypes.number,
|
3036
|
children: propTypes.node
|
3037
|
};
|
3038
|
|
3039
|
MemoryRouter.prototype.componentDidMount = function () {
|
3040
|
warning(!this.props.history, "<MemoryRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { MemoryRouter as Router }`.") ;
|
3041
|
};
|
3042
|
}
|
3043
|
|
3044
|
var Lifecycle =
|
3045
|
/*#__PURE__*/
|
3046
|
function (_React$Component) {
|
3047
|
_inheritsLoose(Lifecycle, _React$Component);
|
3048
|
|
3049
|
function Lifecycle() {
|
3050
|
return _React$Component.apply(this, arguments) || this;
|
3051
|
}
|
3052
|
|
3053
|
var _proto = Lifecycle.prototype;
|
3054
|
|
3055
|
_proto.componentDidMount = function componentDidMount() {
|
3056
|
if (this.props.onMount) this.props.onMount.call(this, this);
|
3057
|
};
|
3058
|
|
3059
|
_proto.componentDidUpdate = function componentDidUpdate(prevProps) {
|
3060
|
if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);
|
3061
|
};
|
3062
|
|
3063
|
_proto.componentWillUnmount = function componentWillUnmount() {
|
3064
|
if (this.props.onUnmount) this.props.onUnmount.call(this, this);
|
3065
|
};
|
3066
|
|
3067
|
_proto.render = function render() {
|
3068
|
return null;
|
3069
|
};
|
3070
|
|
3071
|
return Lifecycle;
|
3072
|
}(React__default.Component);
|
3073
|
/**
|
3074
|
* The public API for prompting the user before navigating away from a screen.
|
3075
|
*/
|
3076
|
|
3077
|
|
3078
|
function Prompt(_ref) {
|
3079
|
var message = _ref.message,
|
3080
|
_ref$when = _ref.when,
|
3081
|
when = _ref$when === void 0 ? true : _ref$when;
|
3082
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3083
|
!context ? invariant(false, "You should not use <Prompt> outside a <Router>") : void 0;
|
3084
|
if (!when || context.staticContext) return null;
|
3085
|
var method = context.history.block;
|
3086
|
return React__default.createElement(Lifecycle, {
|
3087
|
onMount: function onMount(self) {
|
3088
|
self.release = method(message);
|
3089
|
},
|
3090
|
onUpdate: function onUpdate(self, prevProps) {
|
3091
|
if (prevProps.message !== message) {
|
3092
|
self.release();
|
3093
|
self.release = method(message);
|
3094
|
}
|
3095
|
},
|
3096
|
onUnmount: function onUnmount(self) {
|
3097
|
self.release();
|
3098
|
},
|
3099
|
message: message
|
3100
|
});
|
3101
|
});
|
3102
|
}
|
3103
|
|
3104
|
{
|
3105
|
var messageType = propTypes.oneOfType([propTypes.func, propTypes.string]);
|
3106
|
Prompt.propTypes = {
|
3107
|
when: propTypes.bool,
|
3108
|
message: messageType.isRequired
|
3109
|
};
|
3110
|
}
|
3111
|
|
3112
|
var cache = {};
|
3113
|
var cacheLimit = 10000;
|
3114
|
var cacheCount = 0;
|
3115
|
|
3116
|
function compilePath(path) {
|
3117
|
if (cache[path]) return cache[path];
|
3118
|
var generator = pathToRegexp_1.compile(path);
|
3119
|
|
3120
|
if (cacheCount < cacheLimit) {
|
3121
|
cache[path] = generator;
|
3122
|
cacheCount++;
|
3123
|
}
|
3124
|
|
3125
|
return generator;
|
3126
|
}
|
3127
|
/**
|
3128
|
* Public API for generating a URL pathname from a path and parameters.
|
3129
|
*/
|
3130
|
|
3131
|
|
3132
|
function generatePath(path, params) {
|
3133
|
if (path === void 0) {
|
3134
|
path = "/";
|
3135
|
}
|
3136
|
|
3137
|
if (params === void 0) {
|
3138
|
params = {};
|
3139
|
}
|
3140
|
|
3141
|
return path === "/" ? path : compilePath(path)(params, {
|
3142
|
pretty: true
|
3143
|
});
|
3144
|
}
|
3145
|
/**
|
3146
|
* The public API for navigating programmatically with a component.
|
3147
|
*/
|
3148
|
|
3149
|
|
3150
|
function Redirect(_ref) {
|
3151
|
var computedMatch = _ref.computedMatch,
|
3152
|
to = _ref.to,
|
3153
|
_ref$push = _ref.push,
|
3154
|
push = _ref$push === void 0 ? false : _ref$push;
|
3155
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3156
|
!context ? invariant(false, "You should not use <Redirect> outside a <Router>") : void 0;
|
3157
|
var history = context.history,
|
3158
|
staticContext = context.staticContext;
|
3159
|
var method = push ? history.push : history.replace;
|
3160
|
var location = createLocation(computedMatch ? typeof to === "string" ? generatePath(to, computedMatch.params) : _extends({}, to, {
|
3161
|
pathname: generatePath(to.pathname, computedMatch.params)
|
3162
|
}) : to); // When rendering in a static context,
|
3163
|
// set the new location immediately.
|
3164
|
|
3165
|
if (staticContext) {
|
3166
|
method(location);
|
3167
|
return null;
|
3168
|
}
|
3169
|
|
3170
|
return React__default.createElement(Lifecycle, {
|
3171
|
onMount: function onMount() {
|
3172
|
method(location);
|
3173
|
},
|
3174
|
onUpdate: function onUpdate(self, prevProps) {
|
3175
|
var prevLocation = createLocation(prevProps.to);
|
3176
|
|
3177
|
if (!locationsAreEqual(prevLocation, _extends({}, location, {
|
3178
|
key: prevLocation.key
|
3179
|
}))) {
|
3180
|
method(location);
|
3181
|
}
|
3182
|
},
|
3183
|
to: to
|
3184
|
});
|
3185
|
});
|
3186
|
}
|
3187
|
|
3188
|
{
|
3189
|
Redirect.propTypes = {
|
3190
|
push: propTypes.bool,
|
3191
|
from: propTypes.string,
|
3192
|
to: propTypes.oneOfType([propTypes.string, propTypes.object]).isRequired
|
3193
|
};
|
3194
|
}
|
3195
|
|
3196
|
var cache$1 = {};
|
3197
|
var cacheLimit$1 = 10000;
|
3198
|
var cacheCount$1 = 0;
|
3199
|
|
3200
|
function compilePath$1(path, options) {
|
3201
|
var cacheKey = "" + options.end + options.strict + options.sensitive;
|
3202
|
var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});
|
3203
|
if (pathCache[path]) return pathCache[path];
|
3204
|
var keys = [];
|
3205
|
var regexp = pathToRegexp_1(path, keys, options);
|
3206
|
var result = {
|
3207
|
regexp: regexp,
|
3208
|
keys: keys
|
3209
|
};
|
3210
|
|
3211
|
if (cacheCount$1 < cacheLimit$1) {
|
3212
|
pathCache[path] = result;
|
3213
|
cacheCount$1++;
|
3214
|
}
|
3215
|
|
3216
|
return result;
|
3217
|
}
|
3218
|
/**
|
3219
|
* Public API for matching a URL pathname to a path.
|
3220
|
*/
|
3221
|
|
3222
|
|
3223
|
function matchPath(pathname, options) {
|
3224
|
if (options === void 0) {
|
3225
|
options = {};
|
3226
|
}
|
3227
|
|
3228
|
if (typeof options === "string" || Array.isArray(options)) {
|
3229
|
options = {
|
3230
|
path: options
|
3231
|
};
|
3232
|
}
|
3233
|
|
3234
|
var _options = options,
|
3235
|
path = _options.path,
|
3236
|
_options$exact = _options.exact,
|
3237
|
exact = _options$exact === void 0 ? false : _options$exact,
|
3238
|
_options$strict = _options.strict,
|
3239
|
strict = _options$strict === void 0 ? false : _options$strict,
|
3240
|
_options$sensitive = _options.sensitive,
|
3241
|
sensitive = _options$sensitive === void 0 ? false : _options$sensitive;
|
3242
|
var paths = [].concat(path);
|
3243
|
return paths.reduce(function (matched, path) {
|
3244
|
if (!path && path !== "") return null;
|
3245
|
if (matched) return matched;
|
3246
|
|
3247
|
var _compilePath = compilePath$1(path, {
|
3248
|
end: exact,
|
3249
|
strict: strict,
|
3250
|
sensitive: sensitive
|
3251
|
}),
|
3252
|
regexp = _compilePath.regexp,
|
3253
|
keys = _compilePath.keys;
|
3254
|
|
3255
|
var match = regexp.exec(pathname);
|
3256
|
if (!match) return null;
|
3257
|
var url = match[0],
|
3258
|
values = match.slice(1);
|
3259
|
var isExact = pathname === url;
|
3260
|
if (exact && !isExact) return null;
|
3261
|
return {
|
3262
|
path: path,
|
3263
|
// the path used to match
|
3264
|
url: path === "/" && url === "" ? "/" : url,
|
3265
|
// the matched portion of the URL
|
3266
|
isExact: isExact,
|
3267
|
// whether or not we matched exactly
|
3268
|
params: keys.reduce(function (memo, key, index) {
|
3269
|
memo[key.name] = values[index];
|
3270
|
return memo;
|
3271
|
}, {})
|
3272
|
};
|
3273
|
}, null);
|
3274
|
}
|
3275
|
|
3276
|
function isEmptyChildren(children) {
|
3277
|
return React__default.Children.count(children) === 0;
|
3278
|
}
|
3279
|
|
3280
|
function evalChildrenDev(children, props, path) {
|
3281
|
var value = children(props);
|
3282
|
warning(value !== undefined, "You returned `undefined` from the `children` function of " + ("<Route" + (path ? " path=\"" + path + "\"" : "") + ">, but you ") + "should have returned a React element or `null`") ;
|
3283
|
return value || null;
|
3284
|
}
|
3285
|
/**
|
3286
|
* The public API for matching a single path and rendering.
|
3287
|
*/
|
3288
|
|
3289
|
|
3290
|
var Route =
|
3291
|
/*#__PURE__*/
|
3292
|
function (_React$Component) {
|
3293
|
_inheritsLoose(Route, _React$Component);
|
3294
|
|
3295
|
function Route() {
|
3296
|
return _React$Component.apply(this, arguments) || this;
|
3297
|
}
|
3298
|
|
3299
|
var _proto = Route.prototype;
|
3300
|
|
3301
|
_proto.render = function render() {
|
3302
|
var _this = this;
|
3303
|
|
3304
|
return React__default.createElement(context.Consumer, null, function (context$1) {
|
3305
|
!context$1 ? invariant(false, "You should not use <Route> outside a <Router>") : void 0;
|
3306
|
var location = _this.props.location || context$1.location;
|
3307
|
var match = _this.props.computedMatch ? _this.props.computedMatch // <Switch> already computed the match for us
|
3308
|
: _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;
|
3309
|
|
3310
|
var props = _extends({}, context$1, {
|
3311
|
location: location,
|
3312
|
match: match
|
3313
|
});
|
3314
|
|
3315
|
var _this$props = _this.props,
|
3316
|
children = _this$props.children,
|
3317
|
component = _this$props.component,
|
3318
|
render = _this$props.render; // Preact uses an empty array as children by
|
3319
|
// default, so use null if that's the case.
|
3320
|
|
3321
|
if (Array.isArray(children) && children.length === 0) {
|
3322
|
children = null;
|
3323
|
}
|
3324
|
|
3325
|
return React__default.createElement(context.Provider, {
|
3326
|
value: props
|
3327
|
}, props.match ? children ? typeof children === "function" ? evalChildrenDev(children, props, _this.props.path) : children : component ? React__default.createElement(component, props) : render ? render(props) : null : typeof children === "function" ? evalChildrenDev(children, props, _this.props.path) : null);
|
3328
|
});
|
3329
|
};
|
3330
|
|
3331
|
return Route;
|
3332
|
}(React__default.Component);
|
3333
|
|
3334
|
{
|
3335
|
Route.propTypes = {
|
3336
|
children: propTypes.oneOfType([propTypes.func, propTypes.node]),
|
3337
|
component: function component(props, propName) {
|
3338
|
if (props[propName] && !reactIs_1(props[propName])) {
|
3339
|
return new Error("Invalid prop 'component' supplied to 'Route': the prop is not a valid React component");
|
3340
|
}
|
3341
|
},
|
3342
|
exact: propTypes.bool,
|
3343
|
location: propTypes.object,
|
3344
|
path: propTypes.oneOfType([propTypes.string, propTypes.arrayOf(propTypes.string)]),
|
3345
|
render: propTypes.func,
|
3346
|
sensitive: propTypes.bool,
|
3347
|
strict: propTypes.bool
|
3348
|
};
|
3349
|
|
3350
|
Route.prototype.componentDidMount = function () {
|
3351
|
warning(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.component), "You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored") ;
|
3352
|
warning(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.render), "You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored") ;
|
3353
|
warning(!(this.props.component && this.props.render), "You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored") ;
|
3354
|
};
|
3355
|
|
3356
|
Route.prototype.componentDidUpdate = function (prevProps) {
|
3357
|
warning(!(this.props.location && !prevProps.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.') ;
|
3358
|
warning(!(!this.props.location && prevProps.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.') ;
|
3359
|
};
|
3360
|
}
|
3361
|
|
3362
|
function addLeadingSlash$1(path) {
|
3363
|
return path.charAt(0) === "/" ? path : "/" + path;
|
3364
|
}
|
3365
|
|
3366
|
function addBasename(basename, location) {
|
3367
|
if (!basename) return location;
|
3368
|
return _extends({}, location, {
|
3369
|
pathname: addLeadingSlash$1(basename) + location.pathname
|
3370
|
});
|
3371
|
}
|
3372
|
|
3373
|
function stripBasename$1(basename, location) {
|
3374
|
if (!basename) return location;
|
3375
|
var base = addLeadingSlash$1(basename);
|
3376
|
if (location.pathname.indexOf(base) !== 0) return location;
|
3377
|
return _extends({}, location, {
|
3378
|
pathname: location.pathname.substr(base.length)
|
3379
|
});
|
3380
|
}
|
3381
|
|
3382
|
function createURL(location) {
|
3383
|
return typeof location === "string" ? location : createPath(location);
|
3384
|
}
|
3385
|
|
3386
|
function staticHandler(methodName) {
|
3387
|
return function () {
|
3388
|
invariant(false, "You cannot %s with <StaticRouter>") ;
|
3389
|
};
|
3390
|
}
|
3391
|
|
3392
|
function noop() {}
|
3393
|
/**
|
3394
|
* The public top-level API for a "static" <Router>, so-called because it
|
3395
|
* can't actually change the current location. Instead, it just records
|
3396
|
* location changes in a context object. Useful mainly in testing and
|
3397
|
* server-rendering scenarios.
|
3398
|
*/
|
3399
|
|
3400
|
|
3401
|
var StaticRouter =
|
3402
|
/*#__PURE__*/
|
3403
|
function (_React$Component) {
|
3404
|
_inheritsLoose(StaticRouter, _React$Component);
|
3405
|
|
3406
|
function StaticRouter() {
|
3407
|
var _this;
|
3408
|
|
3409
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
3410
|
args[_key] = arguments[_key];
|
3411
|
}
|
3412
|
|
3413
|
_this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
|
3414
|
|
3415
|
_this.handlePush = function (location) {
|
3416
|
return _this.navigateTo(location, "PUSH");
|
3417
|
};
|
3418
|
|
3419
|
_this.handleReplace = function (location) {
|
3420
|
return _this.navigateTo(location, "REPLACE");
|
3421
|
};
|
3422
|
|
3423
|
_this.handleListen = function () {
|
3424
|
return noop;
|
3425
|
};
|
3426
|
|
3427
|
_this.handleBlock = function () {
|
3428
|
return noop;
|
3429
|
};
|
3430
|
|
3431
|
return _this;
|
3432
|
}
|
3433
|
|
3434
|
var _proto = StaticRouter.prototype;
|
3435
|
|
3436
|
_proto.navigateTo = function navigateTo(location, action) {
|
3437
|
var _this$props = this.props,
|
3438
|
_this$props$basename = _this$props.basename,
|
3439
|
basename = _this$props$basename === void 0 ? "" : _this$props$basename,
|
3440
|
_this$props$context = _this$props.context,
|
3441
|
context = _this$props$context === void 0 ? {} : _this$props$context;
|
3442
|
context.action = action;
|
3443
|
context.location = addBasename(basename, createLocation(location));
|
3444
|
context.url = createURL(context.location);
|
3445
|
};
|
3446
|
|
3447
|
_proto.render = function render() {
|
3448
|
var _this$props2 = this.props,
|
3449
|
_this$props2$basename = _this$props2.basename,
|
3450
|
basename = _this$props2$basename === void 0 ? "" : _this$props2$basename,
|
3451
|
_this$props2$context = _this$props2.context,
|
3452
|
context = _this$props2$context === void 0 ? {} : _this$props2$context,
|
3453
|
_this$props2$location = _this$props2.location,
|
3454
|
location = _this$props2$location === void 0 ? "/" : _this$props2$location,
|
3455
|
rest = _objectWithoutPropertiesLoose(_this$props2, ["basename", "context", "location"]);
|
3456
|
|
3457
|
var history = {
|
3458
|
createHref: function createHref(path) {
|
3459
|
return addLeadingSlash$1(basename + createURL(path));
|
3460
|
},
|
3461
|
action: "POP",
|
3462
|
location: stripBasename$1(basename, createLocation(location)),
|
3463
|
push: this.handlePush,
|
3464
|
replace: this.handleReplace,
|
3465
|
go: staticHandler(),
|
3466
|
goBack: staticHandler(),
|
3467
|
goForward: staticHandler(),
|
3468
|
listen: this.handleListen,
|
3469
|
block: this.handleBlock
|
3470
|
};
|
3471
|
return React__default.createElement(Router, _extends({}, rest, {
|
3472
|
history: history,
|
3473
|
staticContext: context
|
3474
|
}));
|
3475
|
};
|
3476
|
|
3477
|
return StaticRouter;
|
3478
|
}(React__default.Component);
|
3479
|
|
3480
|
{
|
3481
|
StaticRouter.propTypes = {
|
3482
|
basename: propTypes.string,
|
3483
|
context: propTypes.object,
|
3484
|
location: propTypes.oneOfType([propTypes.string, propTypes.object])
|
3485
|
};
|
3486
|
|
3487
|
StaticRouter.prototype.componentDidMount = function () {
|
3488
|
warning(!this.props.history, "<StaticRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { StaticRouter as Router }`.") ;
|
3489
|
};
|
3490
|
}
|
3491
|
/**
|
3492
|
* The public API for rendering the first <Route> that matches.
|
3493
|
*/
|
3494
|
|
3495
|
|
3496
|
var Switch =
|
3497
|
/*#__PURE__*/
|
3498
|
function (_React$Component) {
|
3499
|
_inheritsLoose(Switch, _React$Component);
|
3500
|
|
3501
|
function Switch() {
|
3502
|
return _React$Component.apply(this, arguments) || this;
|
3503
|
}
|
3504
|
|
3505
|
var _proto = Switch.prototype;
|
3506
|
|
3507
|
_proto.render = function render() {
|
3508
|
var _this = this;
|
3509
|
|
3510
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3511
|
!context ? invariant(false, "You should not use <Switch> outside a <Router>") : void 0;
|
3512
|
var location = _this.props.location || context.location;
|
3513
|
var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()
|
3514
|
// here because toArray adds keys to all child elements and we do not want
|
3515
|
// to trigger an unmount/remount for two <Route>s that render the same
|
3516
|
// component at different URLs.
|
3517
|
|
3518
|
React__default.Children.forEach(_this.props.children, function (child) {
|
3519
|
if (match == null && React__default.isValidElement(child)) {
|
3520
|
element = child;
|
3521
|
var path = child.props.path || child.props.from;
|
3522
|
match = path ? matchPath(location.pathname, _extends({}, child.props, {
|
3523
|
path: path
|
3524
|
})) : context.match;
|
3525
|
}
|
3526
|
});
|
3527
|
return match ? React__default.cloneElement(element, {
|
3528
|
location: location,
|
3529
|
computedMatch: match
|
3530
|
}) : null;
|
3531
|
});
|
3532
|
};
|
3533
|
|
3534
|
return Switch;
|
3535
|
}(React__default.Component);
|
3536
|
|
3537
|
{
|
3538
|
Switch.propTypes = {
|
3539
|
children: propTypes.node,
|
3540
|
location: propTypes.object
|
3541
|
};
|
3542
|
|
3543
|
Switch.prototype.componentDidUpdate = function (prevProps) {
|
3544
|
warning(!(this.props.location && !prevProps.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no "location" prop and then provided one on a subsequent render.') ;
|
3545
|
warning(!(!this.props.location && prevProps.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a "location" prop initially but omitted it on a subsequent render.') ;
|
3546
|
};
|
3547
|
}
|
3548
|
/**
|
3549
|
* A public higher-order component to access the imperative API
|
3550
|
*/
|
3551
|
|
3552
|
|
3553
|
function withRouter(Component) {
|
3554
|
var displayName = "withRouter(" + (Component.displayName || Component.name) + ")";
|
3555
|
|
3556
|
var C = function C(props) {
|
3557
|
var wrappedComponentRef = props.wrappedComponentRef,
|
3558
|
remainingProps = _objectWithoutPropertiesLoose(props, ["wrappedComponentRef"]);
|
3559
|
|
3560
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3561
|
!context ? invariant(false, "You should not use <" + displayName + " /> outside a <Router>") : void 0;
|
3562
|
return React__default.createElement(Component, _extends({}, remainingProps, context, {
|
3563
|
ref: wrappedComponentRef
|
3564
|
}));
|
3565
|
});
|
3566
|
};
|
3567
|
|
3568
|
C.displayName = displayName;
|
3569
|
C.WrappedComponent = Component;
|
3570
|
|
3571
|
{
|
3572
|
C.propTypes = {
|
3573
|
wrappedComponentRef: propTypes.oneOfType([propTypes.string, propTypes.func, propTypes.object])
|
3574
|
};
|
3575
|
}
|
3576
|
|
3577
|
return hoistNonReactStatics_cjs(C, Component);
|
3578
|
}
|
3579
|
|
3580
|
var useContext = React__default.useContext;
|
3581
|
|
3582
|
function useHistory() {
|
3583
|
{
|
3584
|
!(typeof useContext === "function") ? invariant(false, "You must use React >= 16.8 in order to use useHistory()") : void 0;
|
3585
|
}
|
3586
|
|
3587
|
return useContext(context).history;
|
3588
|
}
|
3589
|
|
3590
|
function useLocation() {
|
3591
|
{
|
3592
|
!(typeof useContext === "function") ? invariant(false, "You must use React >= 16.8 in order to use useLocation()") : void 0;
|
3593
|
}
|
3594
|
|
3595
|
return useContext(context).location;
|
3596
|
}
|
3597
|
|
3598
|
function useParams() {
|
3599
|
{
|
3600
|
!(typeof useContext === "function") ? invariant(false, "You must use React >= 16.8 in order to use useParams()") : void 0;
|
3601
|
}
|
3602
|
|
3603
|
var match = useContext(context).match;
|
3604
|
return match ? match.params : {};
|
3605
|
}
|
3606
|
|
3607
|
function useRouteMatch(path) {
|
3608
|
{
|
3609
|
!(typeof useContext === "function") ? invariant(false, "You must use React >= 16.8 in order to use useRouteMatch()") : void 0;
|
3610
|
}
|
3611
|
|
3612
|
return path ? matchPath(useLocation().pathname, path) : useContext(context).match;
|
3613
|
}
|
3614
|
|
3615
|
{
|
3616
|
if (typeof window !== "undefined") {
|
3617
|
var global$1 = window;
|
3618
|
var key$1 = "__react_router_build__";
|
3619
|
var buildNames = {
|
3620
|
cjs: "CommonJS",
|
3621
|
esm: "ES modules",
|
3622
|
umd: "UMD"
|
3623
|
};
|
3624
|
|
3625
|
if (global$1[key$1] && global$1[key$1] !== "esm") {
|
3626
|
var initialBuildName = buildNames[global$1[key$1]];
|
3627
|
var secondaryBuildName = buildNames["esm"]; // TODO: Add link to article that explains in detail how to avoid
|
3628
|
// loading 2 different builds.
|
3629
|
|
3630
|
throw new Error("You are loading the " + secondaryBuildName + " build of React Router " + ("on a page that is already running the " + initialBuildName + " ") + "build, so things won't work right.");
|
3631
|
}
|
3632
|
|
3633
|
global$1[key$1] = "esm";
|
3634
|
}
|
3635
|
}
|
3636
|
|
3637
|
/**
|
3638
|
* The public API for a <Router> that uses HTML5 history.
|
3639
|
*/
|
3640
|
|
3641
|
var BrowserRouter =
|
3642
|
/*#__PURE__*/
|
3643
|
function (_React$Component) {
|
3644
|
_inheritsLoose(BrowserRouter, _React$Component);
|
3645
|
|
3646
|
function BrowserRouter() {
|
3647
|
var _this;
|
3648
|
|
3649
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
3650
|
args[_key] = arguments[_key];
|
3651
|
}
|
3652
|
|
3653
|
_this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
|
3654
|
_this.history = createBrowserHistory(_this.props);
|
3655
|
return _this;
|
3656
|
}
|
3657
|
|
3658
|
var _proto = BrowserRouter.prototype;
|
3659
|
|
3660
|
_proto.render = function render() {
|
3661
|
return React__default.createElement(Router, {
|
3662
|
history: this.history,
|
3663
|
children: this.props.children
|
3664
|
});
|
3665
|
};
|
3666
|
|
3667
|
return BrowserRouter;
|
3668
|
}(React__default.Component);
|
3669
|
|
3670
|
{
|
3671
|
BrowserRouter.propTypes = {
|
3672
|
basename: propTypes.string,
|
3673
|
children: propTypes.node,
|
3674
|
forceRefresh: propTypes.bool,
|
3675
|
getUserConfirmation: propTypes.func,
|
3676
|
keyLength: propTypes.number
|
3677
|
};
|
3678
|
|
3679
|
BrowserRouter.prototype.componentDidMount = function () {
|
3680
|
warning(!this.props.history, "<BrowserRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { BrowserRouter as Router }`.") ;
|
3681
|
};
|
3682
|
}
|
3683
|
|
3684
|
/**
|
3685
|
* The public API for a <Router> that uses window.location.hash.
|
3686
|
*/
|
3687
|
|
3688
|
var HashRouter =
|
3689
|
/*#__PURE__*/
|
3690
|
function (_React$Component) {
|
3691
|
_inheritsLoose(HashRouter, _React$Component);
|
3692
|
|
3693
|
function HashRouter() {
|
3694
|
var _this;
|
3695
|
|
3696
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
3697
|
args[_key] = arguments[_key];
|
3698
|
}
|
3699
|
|
3700
|
_this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
|
3701
|
_this.history = createHashHistory(_this.props);
|
3702
|
return _this;
|
3703
|
}
|
3704
|
|
3705
|
var _proto = HashRouter.prototype;
|
3706
|
|
3707
|
_proto.render = function render() {
|
3708
|
return React__default.createElement(Router, {
|
3709
|
history: this.history,
|
3710
|
children: this.props.children
|
3711
|
});
|
3712
|
};
|
3713
|
|
3714
|
return HashRouter;
|
3715
|
}(React__default.Component);
|
3716
|
|
3717
|
{
|
3718
|
HashRouter.propTypes = {
|
3719
|
basename: propTypes.string,
|
3720
|
children: propTypes.node,
|
3721
|
getUserConfirmation: propTypes.func,
|
3722
|
hashType: propTypes.oneOf(["hashbang", "noslash", "slash"])
|
3723
|
};
|
3724
|
|
3725
|
HashRouter.prototype.componentDidMount = function () {
|
3726
|
warning(!this.props.history, "<HashRouter> ignores the history prop. To use a custom history, " + "use `import { Router }` instead of `import { HashRouter as Router }`.") ;
|
3727
|
};
|
3728
|
}
|
3729
|
|
3730
|
var resolveToLocation = function resolveToLocation(to, currentLocation) {
|
3731
|
return typeof to === "function" ? to(currentLocation) : to;
|
3732
|
};
|
3733
|
var normalizeToLocation = function normalizeToLocation(to, currentLocation) {
|
3734
|
return typeof to === "string" ? createLocation(to, null, null, currentLocation) : to;
|
3735
|
};
|
3736
|
|
3737
|
var forwardRefShim = function forwardRefShim(C) {
|
3738
|
return C;
|
3739
|
};
|
3740
|
|
3741
|
var forwardRef = React__default.forwardRef;
|
3742
|
|
3743
|
if (typeof forwardRef === "undefined") {
|
3744
|
forwardRef = forwardRefShim;
|
3745
|
}
|
3746
|
|
3747
|
function isModifiedEvent(event) {
|
3748
|
return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
|
3749
|
}
|
3750
|
|
3751
|
var LinkAnchor = forwardRef(function (_ref, forwardedRef) {
|
3752
|
var innerRef = _ref.innerRef,
|
3753
|
navigate = _ref.navigate,
|
3754
|
_onClick = _ref.onClick,
|
3755
|
rest = _objectWithoutPropertiesLoose(_ref, ["innerRef", "navigate", "onClick"]);
|
3756
|
|
3757
|
var target = rest.target;
|
3758
|
|
3759
|
var props = _extends({}, rest, {
|
3760
|
onClick: function onClick(event) {
|
3761
|
try {
|
3762
|
if (_onClick) _onClick(event);
|
3763
|
} catch (ex) {
|
3764
|
event.preventDefault();
|
3765
|
throw ex;
|
3766
|
}
|
3767
|
|
3768
|
if (!event.defaultPrevented && // onClick prevented default
|
3769
|
event.button === 0 && ( // ignore everything but left clicks
|
3770
|
!target || target === "_self") && // let browser handle "target=_blank" etc.
|
3771
|
!isModifiedEvent(event) // ignore clicks with modifier keys
|
3772
|
) {
|
3773
|
event.preventDefault();
|
3774
|
navigate();
|
3775
|
}
|
3776
|
}
|
3777
|
}); // React 15 compat
|
3778
|
|
3779
|
|
3780
|
if (forwardRefShim !== forwardRef) {
|
3781
|
props.ref = forwardedRef || innerRef;
|
3782
|
} else {
|
3783
|
props.ref = innerRef;
|
3784
|
}
|
3785
|
|
3786
|
return React__default.createElement("a", props);
|
3787
|
});
|
3788
|
|
3789
|
{
|
3790
|
LinkAnchor.displayName = "LinkAnchor";
|
3791
|
}
|
3792
|
/**
|
3793
|
* The public API for rendering a history-aware <a>.
|
3794
|
*/
|
3795
|
|
3796
|
|
3797
|
var Link = forwardRef(function (_ref2, forwardedRef) {
|
3798
|
var _ref2$component = _ref2.component,
|
3799
|
component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,
|
3800
|
replace = _ref2.replace,
|
3801
|
to = _ref2.to,
|
3802
|
innerRef = _ref2.innerRef,
|
3803
|
rest = _objectWithoutPropertiesLoose(_ref2, ["component", "replace", "to", "innerRef"]);
|
3804
|
|
3805
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3806
|
!context ? invariant(false, "You should not use <Link> outside a <Router>") : void 0;
|
3807
|
var history = context.history;
|
3808
|
var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);
|
3809
|
var href = location ? history.createHref(location) : "";
|
3810
|
|
3811
|
var props = _extends({}, rest, {
|
3812
|
href: href,
|
3813
|
navigate: function navigate() {
|
3814
|
var location = resolveToLocation(to, context.location);
|
3815
|
var method = replace ? history.replace : history.push;
|
3816
|
method(location);
|
3817
|
}
|
3818
|
}); // React 15 compat
|
3819
|
|
3820
|
|
3821
|
if (forwardRefShim !== forwardRef) {
|
3822
|
props.ref = forwardedRef || innerRef;
|
3823
|
} else {
|
3824
|
props.innerRef = innerRef;
|
3825
|
}
|
3826
|
|
3827
|
return React__default.createElement(component, props);
|
3828
|
});
|
3829
|
});
|
3830
|
|
3831
|
{
|
3832
|
var toType = propTypes.oneOfType([propTypes.string, propTypes.object, propTypes.func]);
|
3833
|
var refType = propTypes.oneOfType([propTypes.string, propTypes.func, propTypes.shape({
|
3834
|
current: propTypes.any
|
3835
|
})]);
|
3836
|
Link.displayName = "Link";
|
3837
|
Link.propTypes = {
|
3838
|
innerRef: refType,
|
3839
|
onClick: propTypes.func,
|
3840
|
replace: propTypes.bool,
|
3841
|
target: propTypes.string,
|
3842
|
to: toType.isRequired
|
3843
|
};
|
3844
|
}
|
3845
|
|
3846
|
var forwardRefShim$1 = function forwardRefShim(C) {
|
3847
|
return C;
|
3848
|
};
|
3849
|
|
3850
|
var forwardRef$1 = React__default.forwardRef;
|
3851
|
|
3852
|
if (typeof forwardRef$1 === "undefined") {
|
3853
|
forwardRef$1 = forwardRefShim$1;
|
3854
|
}
|
3855
|
|
3856
|
function joinClassnames() {
|
3857
|
for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {
|
3858
|
classnames[_key] = arguments[_key];
|
3859
|
}
|
3860
|
|
3861
|
return classnames.filter(function (i) {
|
3862
|
return i;
|
3863
|
}).join(" ");
|
3864
|
}
|
3865
|
/**
|
3866
|
* A <Link> wrapper that knows if it's "active" or not.
|
3867
|
*/
|
3868
|
|
3869
|
|
3870
|
var NavLink = forwardRef$1(function (_ref, forwardedRef) {
|
3871
|
var _ref$ariaCurrent = _ref["aria-current"],
|
3872
|
ariaCurrent = _ref$ariaCurrent === void 0 ? "page" : _ref$ariaCurrent,
|
3873
|
_ref$activeClassName = _ref.activeClassName,
|
3874
|
activeClassName = _ref$activeClassName === void 0 ? "active" : _ref$activeClassName,
|
3875
|
activeStyle = _ref.activeStyle,
|
3876
|
classNameProp = _ref.className,
|
3877
|
exact = _ref.exact,
|
3878
|
isActiveProp = _ref.isActive,
|
3879
|
locationProp = _ref.location,
|
3880
|
strict = _ref.strict,
|
3881
|
styleProp = _ref.style,
|
3882
|
to = _ref.to,
|
3883
|
innerRef = _ref.innerRef,
|
3884
|
rest = _objectWithoutPropertiesLoose(_ref, ["aria-current", "activeClassName", "activeStyle", "className", "exact", "isActive", "location", "strict", "style", "to", "innerRef"]);
|
3885
|
|
3886
|
return React__default.createElement(context.Consumer, null, function (context) {
|
3887
|
!context ? invariant(false, "You should not use <NavLink> outside a <Router>") : void 0;
|
3888
|
var currentLocation = locationProp || context.location;
|
3889
|
var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);
|
3890
|
var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202
|
3891
|
|
3892
|
var escapedPath = path && path.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
|
3893
|
var match = escapedPath ? matchPath(currentLocation.pathname, {
|
3894
|
path: escapedPath,
|
3895
|
exact: exact,
|
3896
|
strict: strict
|
3897
|
}) : null;
|
3898
|
var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);
|
3899
|
var className = isActive ? joinClassnames(classNameProp, activeClassName) : classNameProp;
|
3900
|
var style = isActive ? _extends({}, styleProp, {}, activeStyle) : styleProp;
|
3901
|
|
3902
|
var props = _extends({
|
3903
|
"aria-current": isActive && ariaCurrent || null,
|
3904
|
className: className,
|
3905
|
style: style,
|
3906
|
to: toLocation
|
3907
|
}, rest); // React 15 compat
|
3908
|
|
3909
|
|
3910
|
if (forwardRefShim$1 !== forwardRef$1) {
|
3911
|
props.ref = forwardedRef || innerRef;
|
3912
|
} else {
|
3913
|
props.innerRef = innerRef;
|
3914
|
}
|
3915
|
|
3916
|
return React__default.createElement(Link, props);
|
3917
|
});
|
3918
|
});
|
3919
|
|
3920
|
{
|
3921
|
NavLink.displayName = "NavLink";
|
3922
|
var ariaCurrentType = propTypes.oneOf(["page", "step", "location", "date", "time", "true"]);
|
3923
|
NavLink.propTypes = _extends({}, Link.propTypes, {
|
3924
|
"aria-current": ariaCurrentType,
|
3925
|
activeClassName: propTypes.string,
|
3926
|
activeStyle: propTypes.object,
|
3927
|
className: propTypes.string,
|
3928
|
exact: propTypes.bool,
|
3929
|
isActive: propTypes.func,
|
3930
|
location: propTypes.object,
|
3931
|
strict: propTypes.bool,
|
3932
|
style: propTypes.object
|
3933
|
});
|
3934
|
}
|
3935
|
|
3936
|
exports.BrowserRouter = BrowserRouter;
|
3937
|
exports.HashRouter = HashRouter;
|
3938
|
exports.Link = Link;
|
3939
|
exports.MemoryRouter = MemoryRouter;
|
3940
|
exports.NavLink = NavLink;
|
3941
|
exports.Prompt = Prompt;
|
3942
|
exports.Redirect = Redirect;
|
3943
|
exports.Route = Route;
|
3944
|
exports.Router = Router;
|
3945
|
exports.StaticRouter = StaticRouter;
|
3946
|
exports.Switch = Switch;
|
3947
|
exports.__RouterContext = context;
|
3948
|
exports.generatePath = generatePath;
|
3949
|
exports.matchPath = matchPath;
|
3950
|
exports.useHistory = useHistory;
|
3951
|
exports.useLocation = useLocation;
|
3952
|
exports.useParams = useParams;
|
3953
|
exports.useRouteMatch = useRouteMatch;
|
3954
|
exports.withRouter = withRouter;
|
3955
|
|
3956
|
Object.defineProperty(exports, '__esModule', { value: true });
|
3957
|
|
3958
|
}));
|
3959
|
//# sourceMappingURL=react-router-dom.js.map
|