sequenceserver 1.1.0.beta → 1.1.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -7
  3. data/README.md +9 -11
  4. data/Rakefile +2 -15
  5. data/lib/sequenceserver/database.rb +7 -1
  6. data/lib/sequenceserver/routes.rb +5 -2
  7. data/lib/sequenceserver/version.rb +1 -1
  8. data/lib/sequenceserver.rb +3 -1
  9. data/package.json +2 -3
  10. data/public/config.js +0 -7
  11. data/public/css/sequenceserver.css +8 -17
  12. data/public/css/sequenceserver.min.css +2 -2
  13. data/public/js/report.js +62 -45
  14. data/public/js/search.js +24 -17
  15. data/public/js/sequenceserver.js +23 -60
  16. data/public/sequenceserver-report.min.js +17 -0
  17. data/public/sequenceserver-search.min.js +11 -0
  18. data/sequenceserver.gemspec +5 -5
  19. data/spec/capybara_spec.rb +3 -3
  20. data/spec/sequence_spec.rb +2 -2
  21. data/views/layout.erb +1 -13
  22. data/views/report.erb +13 -0
  23. data/views/search.erb +45 -0
  24. metadata +26 -92
  25. data/public/css/sequenceserver.min.css.gz +0 -0
  26. data/public/sequenceserver.min.js +0 -26
  27. data/public/sequenceserver.min.js.gz +0 -0
  28. data/public/vendor/npm/object-assign@2.1.1/.jspm-hash +0 -1
  29. data/public/vendor/npm/object-assign@2.1.1/.jspm.json +0 -72
  30. data/public/vendor/npm/object-assign@2.1.1/index.js +0 -27
  31. data/public/vendor/npm/object-assign@2.1.1/package.json +0 -38
  32. data/public/vendor/npm/object-assign@2.1.1.js +0 -1
  33. data/public/vendor/npm/qs@2.4.1/.jshintignore +0 -1
  34. data/public/vendor/npm/qs@2.4.1/.jshintrc +0 -10
  35. data/public/vendor/npm/qs@2.4.1/.jspm-hash +0 -1
  36. data/public/vendor/npm/qs@2.4.1/.jspm.json +0 -61
  37. data/public/vendor/npm/qs@2.4.1/.npmignore +0 -18
  38. data/public/vendor/npm/qs@2.4.1/.travis.yml +0 -6
  39. data/public/vendor/npm/qs@2.4.1/CHANGELOG.md +0 -68
  40. data/public/vendor/npm/qs@2.4.1/CONTRIBUTING.md +0 -1
  41. data/public/vendor/npm/qs@2.4.1/LICENSE +0 -28
  42. data/public/vendor/npm/qs@2.4.1/Makefile +0 -8
  43. data/public/vendor/npm/qs@2.4.1/README.md +0 -233
  44. data/public/vendor/npm/qs@2.4.1/index.js +0 -2
  45. data/public/vendor/npm/qs@2.4.1/lib/index.js +0 -8
  46. data/public/vendor/npm/qs@2.4.1/lib/parse.js +0 -100
  47. data/public/vendor/npm/qs@2.4.1/lib/stringify.js +0 -67
  48. data/public/vendor/npm/qs@2.4.1/lib/utils.js +0 -132
  49. data/public/vendor/npm/qs@2.4.1/lib.js +0 -2
  50. data/public/vendor/npm/qs@2.4.1/package.json +0 -29
  51. data/public/vendor/npm/qs@2.4.1/test/parse.js +0 -359
  52. data/public/vendor/npm/qs@2.4.1.js +0 -1
  53. data/public/vendor/npm/react-router@0.13.3/.jspm-hash +0 -1
  54. data/public/vendor/npm/react-router@0.13.3/.jspm.json +0 -70
  55. data/public/vendor/npm/react-router@0.13.3/README.md +0 -140
  56. data/public/vendor/npm/react-router@0.13.3/lib/Cancellation.js +0 -9
  57. data/public/vendor/npm/react-router@0.13.3/lib/History.js +0 -31
  58. data/public/vendor/npm/react-router@0.13.3/lib/Match.js +0 -80
  59. data/public/vendor/npm/react-router@0.13.3/lib/Navigation.js +0 -22
  60. data/public/vendor/npm/react-router@0.13.3/lib/PathUtils.js +0 -154
  61. data/public/vendor/npm/react-router@0.13.3/lib/PropTypes.js +0 -15
  62. data/public/vendor/npm/react-router@0.13.3/lib/Redirect.js +0 -12
  63. data/public/vendor/npm/react-router@0.13.3/lib/Route.js +0 -133
  64. data/public/vendor/npm/react-router@0.13.3/lib/ScrollHistory.js +0 -53
  65. data/public/vendor/npm/react-router@0.13.3/lib/State.js +0 -25
  66. data/public/vendor/npm/react-router@0.13.3/lib/TestUtils.js +0 -102
  67. data/public/vendor/npm/react-router@0.13.3/lib/Transition.js +0 -58
  68. data/public/vendor/npm/react-router@0.13.3/lib/actions/LocationActions.js +0 -25
  69. data/public/vendor/npm/react-router@0.13.3/lib/behaviors/ImitateBrowserBehavior.js +0 -19
  70. data/public/vendor/npm/react-router@0.13.3/lib/behaviors/ScrollToTopBehavior.js +0 -15
  71. data/public/vendor/npm/react-router@0.13.3/lib/components/ActiveHandler.js +0 -111
  72. data/public/vendor/npm/react-router@0.13.3/lib/components/ContextWrapper.js +0 -39
  73. data/public/vendor/npm/react-router@0.13.3/lib/components/DefaultRoute.js +0 -41
  74. data/public/vendor/npm/react-router@0.13.3/lib/components/Link.js +0 -119
  75. data/public/vendor/npm/react-router@0.13.3/lib/components/NotFoundRoute.js +0 -41
  76. data/public/vendor/npm/react-router@0.13.3/lib/components/Redirect.js +0 -40
  77. data/public/vendor/npm/react-router@0.13.3/lib/components/Route.js +0 -67
  78. data/public/vendor/npm/react-router@0.13.3/lib/components/RouteHandler.js +0 -111
  79. data/public/vendor/npm/react-router@0.13.3/lib/createRouter.js +0 -329
  80. data/public/vendor/npm/react-router@0.13.3/lib/createRoutesFromReactChildren.js +0 -59
  81. data/public/vendor/npm/react-router@0.13.3/lib/getWindowScrollPosition.js +0 -19
  82. data/public/vendor/npm/react-router@0.13.3/lib/index.js +0 -26
  83. data/public/vendor/npm/react-router@0.13.3/lib/isReactChildren.js +0 -14
  84. data/public/vendor/npm/react-router@0.13.3/lib/locations/HashLocation.js +0 -79
  85. data/public/vendor/npm/react-router@0.13.3/lib/locations/HistoryLocation.js +0 -64
  86. data/public/vendor/npm/react-router@0.13.3/lib/locations/RefreshLocation.js +0 -18
  87. data/public/vendor/npm/react-router@0.13.3/lib/locations/StaticLocation.js +0 -50
  88. data/public/vendor/npm/react-router@0.13.3/lib/locations/TestLocation.js +0 -104
  89. data/public/vendor/npm/react-router@0.13.3/lib/runRouter.js +0 -16
  90. data/public/vendor/npm/react-router@0.13.3/lib/supportsHistory.js +0 -17
  91. data/public/vendor/npm/react-router@0.13.3/lib.js +0 -2
  92. data/public/vendor/npm/react-router@0.13.3/package.json +0 -36
  93. data/public/vendor/npm/react-router@0.13.3/umd/ReactRouter.js +0 -3388
  94. data/public/vendor/npm/react-router@0.13.3/umd/ReactRouter.min.js +0 -8
@@ -1,3388 +0,0 @@
1
- /* */
2
- "format cjs";
3
- (function webpackUniversalModuleDefinition(root, factory) {
4
- if(typeof exports === 'object' && typeof module === 'object')
5
- module.exports = factory(require("react"));
6
- else if(typeof define === 'function' && define.amd)
7
- define(["react"], factory);
8
- else if(typeof exports === 'object')
9
- exports["ReactRouter"] = factory(require("react"));
10
- else
11
- root["ReactRouter"] = factory(root["React"]);
12
- })(this, function(__WEBPACK_EXTERNAL_MODULE_21__) {
13
- return /******/ (function(modules) { // webpackBootstrap
14
- /******/ // The module cache
15
- /******/ var installedModules = {};
16
- /******/
17
- /******/ // The require function
18
- /******/ function __webpack_require__(moduleId) {
19
- /******/
20
- /******/ // Check if module is in cache
21
- /******/ if(installedModules[moduleId])
22
- /******/ return installedModules[moduleId].exports;
23
- /******/
24
- /******/ // Create a new module (and put it into the cache)
25
- /******/ var module = installedModules[moduleId] = {
26
- /******/ exports: {},
27
- /******/ id: moduleId,
28
- /******/ loaded: false
29
- /******/ };
30
- /******/
31
- /******/ // Execute the module function
32
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
33
- /******/
34
- /******/ // Flag the module as loaded
35
- /******/ module.loaded = true;
36
- /******/
37
- /******/ // Return the exports of the module
38
- /******/ return module.exports;
39
- /******/ }
40
- /******/
41
- /******/
42
- /******/ // expose the modules object (__webpack_modules__)
43
- /******/ __webpack_require__.m = modules;
44
- /******/
45
- /******/ // expose the module cache
46
- /******/ __webpack_require__.c = installedModules;
47
- /******/
48
- /******/ // __webpack_public_path__
49
- /******/ __webpack_require__.p = "";
50
- /******/
51
- /******/ // Load entry module and return exports
52
- /******/ return __webpack_require__(0);
53
- /******/ })
54
- /************************************************************************/
55
- /******/ ([
56
- /* 0 */
57
- /***/ function(module, exports, __webpack_require__) {
58
-
59
- 'use strict';
60
-
61
- exports.DefaultRoute = __webpack_require__(1);
62
- exports.Link = __webpack_require__(2);
63
- exports.NotFoundRoute = __webpack_require__(3);
64
- exports.Redirect = __webpack_require__(4);
65
- exports.Route = __webpack_require__(5);
66
- exports.ActiveHandler = __webpack_require__(6);
67
- exports.RouteHandler = exports.ActiveHandler;
68
-
69
- exports.HashLocation = __webpack_require__(7);
70
- exports.HistoryLocation = __webpack_require__(8);
71
- exports.RefreshLocation = __webpack_require__(9);
72
- exports.StaticLocation = __webpack_require__(10);
73
- exports.TestLocation = __webpack_require__(11);
74
-
75
- exports.ImitateBrowserBehavior = __webpack_require__(12);
76
- exports.ScrollToTopBehavior = __webpack_require__(13);
77
-
78
- exports.History = __webpack_require__(14);
79
- exports.Navigation = __webpack_require__(15);
80
- exports.State = __webpack_require__(16);
81
-
82
- exports.createRoute = __webpack_require__(17).createRoute;
83
- exports.createDefaultRoute = __webpack_require__(17).createDefaultRoute;
84
- exports.createNotFoundRoute = __webpack_require__(17).createNotFoundRoute;
85
- exports.createRedirect = __webpack_require__(17).createRedirect;
86
- exports.createRoutesFromReactChildren = __webpack_require__(18);
87
-
88
- exports.create = __webpack_require__(19);
89
- exports.run = __webpack_require__(20);
90
-
91
- /***/ },
92
- /* 1 */
93
- /***/ function(module, exports, __webpack_require__) {
94
-
95
- 'use strict';
96
-
97
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
98
-
99
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
100
-
101
- var PropTypes = __webpack_require__(22);
102
- var RouteHandler = __webpack_require__(6);
103
- var Route = __webpack_require__(5);
104
-
105
- /**
106
- * A <DefaultRoute> component is a special kind of <Route> that
107
- * renders when its parent matches but none of its siblings do.
108
- * Only one such route may be used at any given level in the
109
- * route hierarchy.
110
- */
111
-
112
- var DefaultRoute = (function (_Route) {
113
- function DefaultRoute() {
114
- _classCallCheck(this, DefaultRoute);
115
-
116
- if (_Route != null) {
117
- _Route.apply(this, arguments);
118
- }
119
- }
120
-
121
- _inherits(DefaultRoute, _Route);
122
-
123
- return DefaultRoute;
124
- })(Route);
125
-
126
- // TODO: Include these in the above class definition
127
- // once we can use ES7 property initializers.
128
- // https://github.com/babel/babel/issues/619
129
-
130
- DefaultRoute.propTypes = {
131
- name: PropTypes.string,
132
- path: PropTypes.falsy,
133
- children: PropTypes.falsy,
134
- handler: PropTypes.func.isRequired
135
- };
136
-
137
- DefaultRoute.defaultProps = {
138
- handler: RouteHandler
139
- };
140
-
141
- module.exports = DefaultRoute;
142
-
143
- /***/ },
144
- /* 2 */
145
- /***/ function(module, exports, __webpack_require__) {
146
-
147
- 'use strict';
148
-
149
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
150
-
151
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
152
-
153
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
154
-
155
- var React = __webpack_require__(21);
156
- var assign = __webpack_require__(33);
157
- var PropTypes = __webpack_require__(22);
158
-
159
- function isLeftClickEvent(event) {
160
- return event.button === 0;
161
- }
162
-
163
- function isModifiedEvent(event) {
164
- return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
165
- }
166
-
167
- /**
168
- * <Link> components are used to create an <a> element that links to a route.
169
- * When that route is active, the link gets an "active" class name (or the
170
- * value of its `activeClassName` prop).
171
- *
172
- * For example, assuming you have the following route:
173
- *
174
- * <Route name="showPost" path="/posts/:postID" handler={Post}/>
175
- *
176
- * You could use the following component to link to that route:
177
- *
178
- * <Link to="showPost" params={{ postID: "123" }} />
179
- *
180
- * In addition to params, links may pass along query string parameters
181
- * using the `query` prop.
182
- *
183
- * <Link to="showPost" params={{ postID: "123" }} query={{ show:true }}/>
184
- */
185
-
186
- var Link = (function (_React$Component) {
187
- function Link() {
188
- _classCallCheck(this, Link);
189
-
190
- if (_React$Component != null) {
191
- _React$Component.apply(this, arguments);
192
- }
193
- }
194
-
195
- _inherits(Link, _React$Component);
196
-
197
- _createClass(Link, [{
198
- key: 'handleClick',
199
- value: function handleClick(event) {
200
- var allowTransition = true;
201
- var clickResult;
202
-
203
- if (this.props.onClick) clickResult = this.props.onClick(event);
204
-
205
- if (isModifiedEvent(event) || !isLeftClickEvent(event)) {
206
- return;
207
- }if (clickResult === false || event.defaultPrevented === true) allowTransition = false;
208
-
209
- event.preventDefault();
210
-
211
- if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query);
212
- }
213
- }, {
214
- key: 'getHref',
215
-
216
- /**
217
- * Returns the value of the "href" attribute to use on the DOM element.
218
- */
219
- value: function getHref() {
220
- return this.context.router.makeHref(this.props.to, this.props.params, this.props.query);
221
- }
222
- }, {
223
- key: 'getClassName',
224
-
225
- /**
226
- * Returns the value of the "class" attribute to use on the DOM element, which contains
227
- * the value of the activeClassName property when this <Link> is active.
228
- */
229
- value: function getClassName() {
230
- var className = this.props.className;
231
-
232
- if (this.getActiveState()) className += ' ' + this.props.activeClassName;
233
-
234
- return className;
235
- }
236
- }, {
237
- key: 'getActiveState',
238
- value: function getActiveState() {
239
- return this.context.router.isActive(this.props.to, this.props.params, this.props.query);
240
- }
241
- }, {
242
- key: 'render',
243
- value: function render() {
244
- var props = assign({}, this.props, {
245
- href: this.getHref(),
246
- className: this.getClassName(),
247
- onClick: this.handleClick.bind(this)
248
- });
249
-
250
- if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle;
251
-
252
- return React.DOM.a(props, this.props.children);
253
- }
254
- }]);
255
-
256
- return Link;
257
- })(React.Component);
258
-
259
- // TODO: Include these in the above class definition
260
- // once we can use ES7 property initializers.
261
- // https://github.com/babel/babel/issues/619
262
-
263
- Link.contextTypes = {
264
- router: PropTypes.router.isRequired
265
- };
266
-
267
- Link.propTypes = {
268
- activeClassName: PropTypes.string.isRequired,
269
- to: PropTypes.oneOfType([PropTypes.string, PropTypes.route]).isRequired,
270
- params: PropTypes.object,
271
- query: PropTypes.object,
272
- activeStyle: PropTypes.object,
273
- onClick: PropTypes.func
274
- };
275
-
276
- Link.defaultProps = {
277
- activeClassName: 'active',
278
- className: ''
279
- };
280
-
281
- module.exports = Link;
282
-
283
- /***/ },
284
- /* 3 */
285
- /***/ function(module, exports, __webpack_require__) {
286
-
287
- 'use strict';
288
-
289
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
290
-
291
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
292
-
293
- var PropTypes = __webpack_require__(22);
294
- var RouteHandler = __webpack_require__(6);
295
- var Route = __webpack_require__(5);
296
-
297
- /**
298
- * A <NotFoundRoute> is a special kind of <Route> that
299
- * renders when the beginning of its parent's path matches
300
- * but none of its siblings do, including any <DefaultRoute>.
301
- * Only one such route may be used at any given level in the
302
- * route hierarchy.
303
- */
304
-
305
- var NotFoundRoute = (function (_Route) {
306
- function NotFoundRoute() {
307
- _classCallCheck(this, NotFoundRoute);
308
-
309
- if (_Route != null) {
310
- _Route.apply(this, arguments);
311
- }
312
- }
313
-
314
- _inherits(NotFoundRoute, _Route);
315
-
316
- return NotFoundRoute;
317
- })(Route);
318
-
319
- // TODO: Include these in the above class definition
320
- // once we can use ES7 property initializers.
321
- // https://github.com/babel/babel/issues/619
322
-
323
- NotFoundRoute.propTypes = {
324
- name: PropTypes.string,
325
- path: PropTypes.falsy,
326
- children: PropTypes.falsy,
327
- handler: PropTypes.func.isRequired
328
- };
329
-
330
- NotFoundRoute.defaultProps = {
331
- handler: RouteHandler
332
- };
333
-
334
- module.exports = NotFoundRoute;
335
-
336
- /***/ },
337
- /* 4 */
338
- /***/ function(module, exports, __webpack_require__) {
339
-
340
- 'use strict';
341
-
342
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
343
-
344
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
345
-
346
- var PropTypes = __webpack_require__(22);
347
- var Route = __webpack_require__(5);
348
-
349
- /**
350
- * A <Redirect> component is a special kind of <Route> that always
351
- * redirects to another route when it matches.
352
- */
353
-
354
- var Redirect = (function (_Route) {
355
- function Redirect() {
356
- _classCallCheck(this, Redirect);
357
-
358
- if (_Route != null) {
359
- _Route.apply(this, arguments);
360
- }
361
- }
362
-
363
- _inherits(Redirect, _Route);
364
-
365
- return Redirect;
366
- })(Route);
367
-
368
- // TODO: Include these in the above class definition
369
- // once we can use ES7 property initializers.
370
- // https://github.com/babel/babel/issues/619
371
-
372
- Redirect.propTypes = {
373
- path: PropTypes.string,
374
- from: PropTypes.string, // Alias for path.
375
- to: PropTypes.string,
376
- handler: PropTypes.falsy
377
- };
378
-
379
- // Redirects should not have a default handler
380
- Redirect.defaultProps = {};
381
-
382
- module.exports = Redirect;
383
-
384
- /***/ },
385
- /* 5 */
386
- /***/ function(module, exports, __webpack_require__) {
387
-
388
- 'use strict';
389
-
390
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
391
-
392
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
393
-
394
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
395
-
396
- var React = __webpack_require__(21);
397
- var invariant = __webpack_require__(34);
398
- var PropTypes = __webpack_require__(22);
399
- var RouteHandler = __webpack_require__(6);
400
-
401
- /**
402
- * <Route> components specify components that are rendered to the page when the
403
- * URL matches a given pattern.
404
- *
405
- * Routes are arranged in a nested tree structure. When a new URL is requested,
406
- * the tree is searched depth-first to find a route whose path matches the URL.
407
- * When one is found, all routes in the tree that lead to it are considered
408
- * "active" and their components are rendered into the DOM, nested in the same
409
- * order as they are in the tree.
410
- *
411
- * The preferred way to configure a router is using JSX. The XML-like syntax is
412
- * a great way to visualize how routes are laid out in an application.
413
- *
414
- * var routes = [
415
- * <Route handler={App}>
416
- * <Route name="login" handler={Login}/>
417
- * <Route name="logout" handler={Logout}/>
418
- * <Route name="about" handler={About}/>
419
- * </Route>
420
- * ];
421
- *
422
- * Router.run(routes, function (Handler) {
423
- * React.render(<Handler/>, document.body);
424
- * });
425
- *
426
- * Handlers for Route components that contain children can render their active
427
- * child route using a <RouteHandler> element.
428
- *
429
- * var App = React.createClass({
430
- * render: function () {
431
- * return (
432
- * <div class="application">
433
- * <RouteHandler/>
434
- * </div>
435
- * );
436
- * }
437
- * });
438
- *
439
- * If no handler is provided for the route, it will render a matched child route.
440
- */
441
-
442
- var Route = (function (_React$Component) {
443
- function Route() {
444
- _classCallCheck(this, Route);
445
-
446
- if (_React$Component != null) {
447
- _React$Component.apply(this, arguments);
448
- }
449
- }
450
-
451
- _inherits(Route, _React$Component);
452
-
453
- _createClass(Route, [{
454
- key: 'render',
455
- value: function render() {
456
- invariant(false, '%s elements are for router configuration only and should not be rendered', this.constructor.name);
457
- }
458
- }]);
459
-
460
- return Route;
461
- })(React.Component);
462
-
463
- // TODO: Include these in the above class definition
464
- // once we can use ES7 property initializers.
465
- // https://github.com/babel/babel/issues/619
466
-
467
- Route.propTypes = {
468
- name: PropTypes.string,
469
- path: PropTypes.string,
470
- handler: PropTypes.func,
471
- ignoreScrollBehavior: PropTypes.bool
472
- };
473
-
474
- Route.defaultProps = {
475
- handler: RouteHandler
476
- };
477
-
478
- module.exports = Route;
479
-
480
- /***/ },
481
- /* 6 */
482
- /***/ function(module, exports, __webpack_require__) {
483
-
484
- 'use strict';
485
-
486
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
487
-
488
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
489
-
490
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
491
-
492
- var React = __webpack_require__(21);
493
- var ContextWrapper = __webpack_require__(23);
494
- var assign = __webpack_require__(33);
495
- var PropTypes = __webpack_require__(22);
496
-
497
- var REF_NAME = '__routeHandler__';
498
-
499
- /**
500
- * A <RouteHandler> component renders the active child route handler
501
- * when routes are nested.
502
- */
503
-
504
- var RouteHandler = (function (_React$Component) {
505
- function RouteHandler() {
506
- _classCallCheck(this, RouteHandler);
507
-
508
- if (_React$Component != null) {
509
- _React$Component.apply(this, arguments);
510
- }
511
- }
512
-
513
- _inherits(RouteHandler, _React$Component);
514
-
515
- _createClass(RouteHandler, [{
516
- key: 'getChildContext',
517
- value: function getChildContext() {
518
- return {
519
- routeDepth: this.context.routeDepth + 1
520
- };
521
- }
522
- }, {
523
- key: 'componentDidMount',
524
- value: function componentDidMount() {
525
- this._updateRouteComponent(this.refs[REF_NAME]);
526
- }
527
- }, {
528
- key: 'componentDidUpdate',
529
- value: function componentDidUpdate() {
530
- this._updateRouteComponent(this.refs[REF_NAME]);
531
- }
532
- }, {
533
- key: 'componentWillUnmount',
534
- value: function componentWillUnmount() {
535
- this._updateRouteComponent(null);
536
- }
537
- }, {
538
- key: '_updateRouteComponent',
539
- value: function _updateRouteComponent(component) {
540
- this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component);
541
- }
542
- }, {
543
- key: 'getRouteDepth',
544
- value: function getRouteDepth() {
545
- return this.context.routeDepth;
546
- }
547
- }, {
548
- key: 'createChildRouteHandler',
549
- value: function createChildRouteHandler(props) {
550
- var route = this.context.router.getRouteAtDepth(this.getRouteDepth());
551
-
552
- if (route == null) {
553
- return null;
554
- }var childProps = assign({}, props || this.props, {
555
- ref: REF_NAME,
556
- params: this.context.router.getCurrentParams(),
557
- query: this.context.router.getCurrentQuery()
558
- });
559
-
560
- return React.createElement(route.handler, childProps);
561
- }
562
- }, {
563
- key: 'render',
564
- value: function render() {
565
- var handler = this.createChildRouteHandler();
566
- // <script/> for things like <CSSTransitionGroup/> that don't like null
567
- return handler ? React.createElement(
568
- ContextWrapper,
569
- null,
570
- handler
571
- ) : React.createElement('script', null);
572
- }
573
- }]);
574
-
575
- return RouteHandler;
576
- })(React.Component);
577
-
578
- // TODO: Include these in the above class definition
579
- // once we can use ES7 property initializers.
580
- // https://github.com/babel/babel/issues/619
581
-
582
- RouteHandler.contextTypes = {
583
- routeDepth: PropTypes.number.isRequired,
584
- router: PropTypes.router.isRequired
585
- };
586
-
587
- RouteHandler.childContextTypes = {
588
- routeDepth: PropTypes.number.isRequired
589
- };
590
-
591
- module.exports = RouteHandler;
592
-
593
- /***/ },
594
- /* 7 */
595
- /***/ function(module, exports, __webpack_require__) {
596
-
597
- 'use strict';
598
-
599
- var LocationActions = __webpack_require__(24);
600
- var History = __webpack_require__(14);
601
-
602
- var _listeners = [];
603
- var _isListening = false;
604
- var _actionType;
605
-
606
- function notifyChange(type) {
607
- if (type === LocationActions.PUSH) History.length += 1;
608
-
609
- var change = {
610
- path: HashLocation.getCurrentPath(),
611
- type: type
612
- };
613
-
614
- _listeners.forEach(function (listener) {
615
- listener.call(HashLocation, change);
616
- });
617
- }
618
-
619
- function ensureSlash() {
620
- var path = HashLocation.getCurrentPath();
621
-
622
- if (path.charAt(0) === '/') {
623
- return true;
624
- }HashLocation.replace('/' + path);
625
-
626
- return false;
627
- }
628
-
629
- function onHashChange() {
630
- if (ensureSlash()) {
631
- // If we don't have an _actionType then all we know is the hash
632
- // changed. It was probably caused by the user clicking the Back
633
- // button, but may have also been the Forward button or manual
634
- // manipulation. So just guess 'pop'.
635
- var curActionType = _actionType;
636
- _actionType = null;
637
- notifyChange(curActionType || LocationActions.POP);
638
- }
639
- }
640
-
641
- /**
642
- * A Location that uses `window.location.hash`.
643
- */
644
- var HashLocation = {
645
-
646
- addChangeListener: function addChangeListener(listener) {
647
- _listeners.push(listener);
648
-
649
- // Do this BEFORE listening for hashchange.
650
- ensureSlash();
651
-
652
- if (!_isListening) {
653
- if (window.addEventListener) {
654
- window.addEventListener('hashchange', onHashChange, false);
655
- } else {
656
- window.attachEvent('onhashchange', onHashChange);
657
- }
658
-
659
- _isListening = true;
660
- }
661
- },
662
-
663
- removeChangeListener: function removeChangeListener(listener) {
664
- _listeners = _listeners.filter(function (l) {
665
- return l !== listener;
666
- });
667
-
668
- if (_listeners.length === 0) {
669
- if (window.removeEventListener) {
670
- window.removeEventListener('hashchange', onHashChange, false);
671
- } else {
672
- window.removeEvent('onhashchange', onHashChange);
673
- }
674
-
675
- _isListening = false;
676
- }
677
- },
678
-
679
- push: function push(path) {
680
- _actionType = LocationActions.PUSH;
681
- window.location.hash = path;
682
- },
683
-
684
- replace: function replace(path) {
685
- _actionType = LocationActions.REPLACE;
686
- window.location.replace(window.location.pathname + window.location.search + '#' + path);
687
- },
688
-
689
- pop: function pop() {
690
- _actionType = LocationActions.POP;
691
- History.back();
692
- },
693
-
694
- getCurrentPath: function getCurrentPath() {
695
- return decodeURI(
696
- // We can't use window.location.hash here because it's not
697
- // consistent across browsers - Firefox will pre-decode it!
698
- window.location.href.split('#')[1] || '');
699
- },
700
-
701
- toString: function toString() {
702
- return '<HashLocation>';
703
- }
704
-
705
- };
706
-
707
- module.exports = HashLocation;
708
-
709
- /***/ },
710
- /* 8 */
711
- /***/ function(module, exports, __webpack_require__) {
712
-
713
- 'use strict';
714
-
715
- var LocationActions = __webpack_require__(24);
716
- var History = __webpack_require__(14);
717
-
718
- var _listeners = [];
719
- var _isListening = false;
720
-
721
- function notifyChange(type) {
722
- var change = {
723
- path: HistoryLocation.getCurrentPath(),
724
- type: type
725
- };
726
-
727
- _listeners.forEach(function (listener) {
728
- listener.call(HistoryLocation, change);
729
- });
730
- }
731
-
732
- function onPopState(event) {
733
- if (event.state === undefined) {
734
- return;
735
- } // Ignore extraneous popstate events in WebKit.
736
-
737
- notifyChange(LocationActions.POP);
738
- }
739
-
740
- /**
741
- * A Location that uses HTML5 history.
742
- */
743
- var HistoryLocation = {
744
-
745
- addChangeListener: function addChangeListener(listener) {
746
- _listeners.push(listener);
747
-
748
- if (!_isListening) {
749
- if (window.addEventListener) {
750
- window.addEventListener('popstate', onPopState, false);
751
- } else {
752
- window.attachEvent('onpopstate', onPopState);
753
- }
754
-
755
- _isListening = true;
756
- }
757
- },
758
-
759
- removeChangeListener: function removeChangeListener(listener) {
760
- _listeners = _listeners.filter(function (l) {
761
- return l !== listener;
762
- });
763
-
764
- if (_listeners.length === 0) {
765
- if (window.addEventListener) {
766
- window.removeEventListener('popstate', onPopState, false);
767
- } else {
768
- window.removeEvent('onpopstate', onPopState);
769
- }
770
-
771
- _isListening = false;
772
- }
773
- },
774
-
775
- push: function push(path) {
776
- window.history.pushState({ path: path }, '', path);
777
- History.length += 1;
778
- notifyChange(LocationActions.PUSH);
779
- },
780
-
781
- replace: function replace(path) {
782
- window.history.replaceState({ path: path }, '', path);
783
- notifyChange(LocationActions.REPLACE);
784
- },
785
-
786
- pop: History.back,
787
-
788
- getCurrentPath: function getCurrentPath() {
789
- return decodeURI(window.location.pathname + window.location.search);
790
- },
791
-
792
- toString: function toString() {
793
- return '<HistoryLocation>';
794
- }
795
-
796
- };
797
-
798
- module.exports = HistoryLocation;
799
-
800
- /***/ },
801
- /* 9 */
802
- /***/ function(module, exports, __webpack_require__) {
803
-
804
- 'use strict';
805
-
806
- var HistoryLocation = __webpack_require__(8);
807
- var History = __webpack_require__(14);
808
-
809
- /**
810
- * A Location that uses full page refreshes. This is used as
811
- * the fallback for HistoryLocation in browsers that do not
812
- * support the HTML5 history API.
813
- */
814
- var RefreshLocation = {
815
-
816
- push: function push(path) {
817
- window.location = path;
818
- },
819
-
820
- replace: function replace(path) {
821
- window.location.replace(path);
822
- },
823
-
824
- pop: History.back,
825
-
826
- getCurrentPath: HistoryLocation.getCurrentPath,
827
-
828
- toString: function toString() {
829
- return '<RefreshLocation>';
830
- }
831
-
832
- };
833
-
834
- module.exports = RefreshLocation;
835
-
836
- /***/ },
837
- /* 10 */
838
- /***/ function(module, exports, __webpack_require__) {
839
-
840
- 'use strict';
841
-
842
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
843
-
844
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
845
-
846
- var invariant = __webpack_require__(34);
847
-
848
- function throwCannotModify() {
849
- invariant(false, 'You cannot modify a static location');
850
- }
851
-
852
- /**
853
- * A location that only ever contains a single path. Useful in
854
- * stateless environments like servers where there is no path history,
855
- * only the path that was used in the request.
856
- */
857
-
858
- var StaticLocation = (function () {
859
- function StaticLocation(path) {
860
- _classCallCheck(this, StaticLocation);
861
-
862
- this.path = path;
863
- }
864
-
865
- _createClass(StaticLocation, [{
866
- key: 'getCurrentPath',
867
- value: function getCurrentPath() {
868
- return this.path;
869
- }
870
- }, {
871
- key: 'toString',
872
- value: function toString() {
873
- return '<StaticLocation path="' + this.path + '">';
874
- }
875
- }]);
876
-
877
- return StaticLocation;
878
- })();
879
-
880
- // TODO: Include these in the above class definition
881
- // once we can use ES7 property initializers.
882
- // https://github.com/babel/babel/issues/619
883
-
884
- StaticLocation.prototype.push = throwCannotModify;
885
- StaticLocation.prototype.replace = throwCannotModify;
886
- StaticLocation.prototype.pop = throwCannotModify;
887
-
888
- module.exports = StaticLocation;
889
-
890
- /***/ },
891
- /* 11 */
892
- /***/ function(module, exports, __webpack_require__) {
893
-
894
- 'use strict';
895
-
896
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
897
-
898
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
899
-
900
- var invariant = __webpack_require__(34);
901
- var LocationActions = __webpack_require__(24);
902
- var History = __webpack_require__(14);
903
-
904
- /**
905
- * A location that is convenient for testing and does not require a DOM.
906
- */
907
-
908
- var TestLocation = (function () {
909
- function TestLocation(history) {
910
- _classCallCheck(this, TestLocation);
911
-
912
- this.history = history || [];
913
- this.listeners = [];
914
- this._updateHistoryLength();
915
- }
916
-
917
- _createClass(TestLocation, [{
918
- key: 'needsDOM',
919
- get: function () {
920
- return false;
921
- }
922
- }, {
923
- key: '_updateHistoryLength',
924
- value: function _updateHistoryLength() {
925
- History.length = this.history.length;
926
- }
927
- }, {
928
- key: '_notifyChange',
929
- value: function _notifyChange(type) {
930
- var change = {
931
- path: this.getCurrentPath(),
932
- type: type
933
- };
934
-
935
- for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change);
936
- }
937
- }, {
938
- key: 'addChangeListener',
939
- value: function addChangeListener(listener) {
940
- this.listeners.push(listener);
941
- }
942
- }, {
943
- key: 'removeChangeListener',
944
- value: function removeChangeListener(listener) {
945
- this.listeners = this.listeners.filter(function (l) {
946
- return l !== listener;
947
- });
948
- }
949
- }, {
950
- key: 'push',
951
- value: function push(path) {
952
- this.history.push(path);
953
- this._updateHistoryLength();
954
- this._notifyChange(LocationActions.PUSH);
955
- }
956
- }, {
957
- key: 'replace',
958
- value: function replace(path) {
959
- invariant(this.history.length, 'You cannot replace the current path with no history');
960
-
961
- this.history[this.history.length - 1] = path;
962
-
963
- this._notifyChange(LocationActions.REPLACE);
964
- }
965
- }, {
966
- key: 'pop',
967
- value: function pop() {
968
- this.history.pop();
969
- this._updateHistoryLength();
970
- this._notifyChange(LocationActions.POP);
971
- }
972
- }, {
973
- key: 'getCurrentPath',
974
- value: function getCurrentPath() {
975
- return this.history[this.history.length - 1];
976
- }
977
- }, {
978
- key: 'toString',
979
- value: function toString() {
980
- return '<TestLocation>';
981
- }
982
- }]);
983
-
984
- return TestLocation;
985
- })();
986
-
987
- module.exports = TestLocation;
988
-
989
- /***/ },
990
- /* 12 */
991
- /***/ function(module, exports, __webpack_require__) {
992
-
993
- 'use strict';
994
-
995
- var LocationActions = __webpack_require__(24);
996
-
997
- /**
998
- * A scroll behavior that attempts to imitate the default behavior
999
- * of modern browsers.
1000
- */
1001
- var ImitateBrowserBehavior = {
1002
-
1003
- updateScrollPosition: function updateScrollPosition(position, actionType) {
1004
- switch (actionType) {
1005
- case LocationActions.PUSH:
1006
- case LocationActions.REPLACE:
1007
- window.scrollTo(0, 0);
1008
- break;
1009
- case LocationActions.POP:
1010
- if (position) {
1011
- window.scrollTo(position.x, position.y);
1012
- } else {
1013
- window.scrollTo(0, 0);
1014
- }
1015
- break;
1016
- }
1017
- }
1018
-
1019
- };
1020
-
1021
- module.exports = ImitateBrowserBehavior;
1022
-
1023
- /***/ },
1024
- /* 13 */
1025
- /***/ function(module, exports, __webpack_require__) {
1026
-
1027
- /**
1028
- * A scroll behavior that always scrolls to the top of the page
1029
- * after a transition.
1030
- */
1031
- "use strict";
1032
-
1033
- var ScrollToTopBehavior = {
1034
-
1035
- updateScrollPosition: function updateScrollPosition() {
1036
- window.scrollTo(0, 0);
1037
- }
1038
-
1039
- };
1040
-
1041
- module.exports = ScrollToTopBehavior;
1042
-
1043
- /***/ },
1044
- /* 14 */
1045
- /***/ function(module, exports, __webpack_require__) {
1046
-
1047
- 'use strict';
1048
-
1049
- var invariant = __webpack_require__(34);
1050
- var canUseDOM = __webpack_require__(35).canUseDOM;
1051
-
1052
- var History = {
1053
-
1054
- /**
1055
- * The current number of entries in the history.
1056
- *
1057
- * Note: This property is read-only.
1058
- */
1059
- length: 1,
1060
-
1061
- /**
1062
- * Sends the browser back one entry in the history.
1063
- */
1064
- back: function back() {
1065
- invariant(canUseDOM, 'Cannot use History.back without a DOM');
1066
-
1067
- // Do this first so that History.length will
1068
- // be accurate in location change listeners.
1069
- History.length -= 1;
1070
-
1071
- window.history.back();
1072
- }
1073
-
1074
- };
1075
-
1076
- module.exports = History;
1077
-
1078
- /***/ },
1079
- /* 15 */
1080
- /***/ function(module, exports, __webpack_require__) {
1081
-
1082
- 'use strict';
1083
-
1084
- var PropTypes = __webpack_require__(22);
1085
-
1086
- /**
1087
- * A mixin for components that modify the URL.
1088
- *
1089
- * Example:
1090
- *
1091
- * var MyLink = React.createClass({
1092
- * mixins: [ Router.Navigation ],
1093
- * handleClick(event) {
1094
- * event.preventDefault();
1095
- * this.transitionTo('aRoute', { the: 'params' }, { the: 'query' });
1096
- * },
1097
- * render() {
1098
- * return (
1099
- * <a onClick={this.handleClick}>Click me!</a>
1100
- * );
1101
- * }
1102
- * });
1103
- */
1104
- var Navigation = {
1105
-
1106
- contextTypes: {
1107
- router: PropTypes.router.isRequired
1108
- },
1109
-
1110
- /**
1111
- * Returns an absolute URL path created from the given route
1112
- * name, URL parameters, and query values.
1113
- */
1114
- makePath: function makePath(to, params, query) {
1115
- return this.context.router.makePath(to, params, query);
1116
- },
1117
-
1118
- /**
1119
- * Returns a string that may safely be used as the href of a
1120
- * link to the route with the given name.
1121
- */
1122
- makeHref: function makeHref(to, params, query) {
1123
- return this.context.router.makeHref(to, params, query);
1124
- },
1125
-
1126
- /**
1127
- * Transitions to the URL specified in the arguments by pushing
1128
- * a new URL onto the history stack.
1129
- */
1130
- transitionTo: function transitionTo(to, params, query) {
1131
- this.context.router.transitionTo(to, params, query);
1132
- },
1133
-
1134
- /**
1135
- * Transitions to the URL specified in the arguments by replacing
1136
- * the current URL in the history stack.
1137
- */
1138
- replaceWith: function replaceWith(to, params, query) {
1139
- this.context.router.replaceWith(to, params, query);
1140
- },
1141
-
1142
- /**
1143
- * Transitions to the previous URL.
1144
- */
1145
- goBack: function goBack() {
1146
- return this.context.router.goBack();
1147
- }
1148
-
1149
- };
1150
-
1151
- module.exports = Navigation;
1152
-
1153
- /***/ },
1154
- /* 16 */
1155
- /***/ function(module, exports, __webpack_require__) {
1156
-
1157
- 'use strict';
1158
-
1159
- var PropTypes = __webpack_require__(22);
1160
-
1161
- /**
1162
- * A mixin for components that need to know the path, routes, URL
1163
- * params and query that are currently active.
1164
- *
1165
- * Example:
1166
- *
1167
- * var AboutLink = React.createClass({
1168
- * mixins: [ Router.State ],
1169
- * render() {
1170
- * var className = this.props.className;
1171
- *
1172
- * if (this.isActive('about'))
1173
- * className += ' is-active';
1174
- *
1175
- * return React.DOM.a({ className: className }, this.props.children);
1176
- * }
1177
- * });
1178
- */
1179
- var State = {
1180
-
1181
- contextTypes: {
1182
- router: PropTypes.router.isRequired
1183
- },
1184
-
1185
- /**
1186
- * Returns the current URL path.
1187
- */
1188
- getPath: function getPath() {
1189
- return this.context.router.getCurrentPath();
1190
- },
1191
-
1192
- /**
1193
- * Returns the current URL path without the query string.
1194
- */
1195
- getPathname: function getPathname() {
1196
- return this.context.router.getCurrentPathname();
1197
- },
1198
-
1199
- /**
1200
- * Returns an object of the URL params that are currently active.
1201
- */
1202
- getParams: function getParams() {
1203
- return this.context.router.getCurrentParams();
1204
- },
1205
-
1206
- /**
1207
- * Returns an object of the query params that are currently active.
1208
- */
1209
- getQuery: function getQuery() {
1210
- return this.context.router.getCurrentQuery();
1211
- },
1212
-
1213
- /**
1214
- * Returns an array of the routes that are currently active.
1215
- */
1216
- getRoutes: function getRoutes() {
1217
- return this.context.router.getCurrentRoutes();
1218
- },
1219
-
1220
- /**
1221
- * A helper method to determine if a given route, params, and query
1222
- * are active.
1223
- */
1224
- isActive: function isActive(to, params, query) {
1225
- return this.context.router.isActive(to, params, query);
1226
- }
1227
-
1228
- };
1229
-
1230
- module.exports = State;
1231
-
1232
- /***/ },
1233
- /* 17 */
1234
- /***/ function(module, exports, __webpack_require__) {
1235
-
1236
- 'use strict';
1237
-
1238
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
1239
-
1240
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
1241
-
1242
- var assign = __webpack_require__(33);
1243
- var invariant = __webpack_require__(34);
1244
- var warning = __webpack_require__(36);
1245
- var PathUtils = __webpack_require__(25);
1246
-
1247
- var _currentRoute;
1248
-
1249
- var Route = (function () {
1250
- function Route(name, path, ignoreScrollBehavior, isDefault, isNotFound, onEnter, onLeave, handler) {
1251
- _classCallCheck(this, Route);
1252
-
1253
- this.name = name;
1254
- this.path = path;
1255
- this.paramNames = PathUtils.extractParamNames(this.path);
1256
- this.ignoreScrollBehavior = !!ignoreScrollBehavior;
1257
- this.isDefault = !!isDefault;
1258
- this.isNotFound = !!isNotFound;
1259
- this.onEnter = onEnter;
1260
- this.onLeave = onLeave;
1261
- this.handler = handler;
1262
- }
1263
-
1264
- _createClass(Route, [{
1265
- key: 'appendChild',
1266
-
1267
- /**
1268
- * Appends the given route to this route's child routes.
1269
- */
1270
- value: function appendChild(route) {
1271
- invariant(route instanceof Route, 'route.appendChild must use a valid Route');
1272
-
1273
- if (!this.childRoutes) this.childRoutes = [];
1274
-
1275
- this.childRoutes.push(route);
1276
- }
1277
- }, {
1278
- key: 'toString',
1279
- value: function toString() {
1280
- var string = '<Route';
1281
-
1282
- if (this.name) string += ' name="' + this.name + '"';
1283
-
1284
- string += ' path="' + this.path + '">';
1285
-
1286
- return string;
1287
- }
1288
- }], [{
1289
- key: 'createRoute',
1290
-
1291
- /**
1292
- * Creates and returns a new route. Options may be a URL pathname string
1293
- * with placeholders for named params or an object with any of the following
1294
- * properties:
1295
- *
1296
- * - name The name of the route. This is used to lookup a
1297
- * route relative to its parent route and should be
1298
- * unique among all child routes of the same parent
1299
- * - path A URL pathname string with optional placeholders
1300
- * that specify the names of params to extract from
1301
- * the URL when the path matches. Defaults to `/${name}`
1302
- * when there is a name given, or the path of the parent
1303
- * route, or /
1304
- * - ignoreScrollBehavior True to make this route (and all descendants) ignore
1305
- * the scroll behavior of the router
1306
- * - isDefault True to make this route the default route among all
1307
- * its siblings
1308
- * - isNotFound True to make this route the "not found" route among
1309
- * all its siblings
1310
- * - onEnter A transition hook that will be called when the
1311
- * router is going to enter this route
1312
- * - onLeave A transition hook that will be called when the
1313
- * router is going to leave this route
1314
- * - handler A React component that will be rendered when
1315
- * this route is active
1316
- * - parentRoute The parent route to use for this route. This option
1317
- * is automatically supplied when creating routes inside
1318
- * the callback to another invocation of createRoute. You
1319
- * only ever need to use this when declaring routes
1320
- * independently of one another to manually piece together
1321
- * the route hierarchy
1322
- *
1323
- * The callback may be used to structure your route hierarchy. Any call to
1324
- * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect
1325
- * inside the callback automatically uses this route as its parent.
1326
- */
1327
- value: function createRoute(options, callback) {
1328
- options = options || {};
1329
-
1330
- if (typeof options === 'string') options = { path: options };
1331
-
1332
- var parentRoute = _currentRoute;
1333
-
1334
- if (parentRoute) {
1335
- warning(options.parentRoute == null || options.parentRoute === parentRoute, 'You should not use parentRoute with createRoute inside another route\'s child callback; it is ignored');
1336
- } else {
1337
- parentRoute = options.parentRoute;
1338
- }
1339
-
1340
- var name = options.name;
1341
- var path = options.path || name;
1342
-
1343
- if (path && !(options.isDefault || options.isNotFound)) {
1344
- if (PathUtils.isAbsolute(path)) {
1345
- if (parentRoute) {
1346
- invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, 'You cannot nest path "%s" inside "%s"; the parent requires URL parameters', path, parentRoute.path);
1347
- }
1348
- } else if (parentRoute) {
1349
- // Relative paths extend their parent.
1350
- path = PathUtils.join(parentRoute.path, path);
1351
- } else {
1352
- path = '/' + path;
1353
- }
1354
- } else {
1355
- path = parentRoute ? parentRoute.path : '/';
1356
- }
1357
-
1358
- if (options.isNotFound && !/\*$/.test(path)) path += '*'; // Auto-append * to the path of not found routes.
1359
-
1360
- var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler);
1361
-
1362
- if (parentRoute) {
1363
- if (route.isDefault) {
1364
- invariant(parentRoute.defaultRoute == null, '%s may not have more than one default route', parentRoute);
1365
-
1366
- parentRoute.defaultRoute = route;
1367
- } else if (route.isNotFound) {
1368
- invariant(parentRoute.notFoundRoute == null, '%s may not have more than one not found route', parentRoute);
1369
-
1370
- parentRoute.notFoundRoute = route;
1371
- }
1372
-
1373
- parentRoute.appendChild(route);
1374
- }
1375
-
1376
- // Any routes created in the callback
1377
- // use this route as their parent.
1378
- if (typeof callback === 'function') {
1379
- var currentRoute = _currentRoute;
1380
- _currentRoute = route;
1381
- callback.call(route, route);
1382
- _currentRoute = currentRoute;
1383
- }
1384
-
1385
- return route;
1386
- }
1387
- }, {
1388
- key: 'createDefaultRoute',
1389
-
1390
- /**
1391
- * Creates and returns a route that is rendered when its parent matches
1392
- * the current URL.
1393
- */
1394
- value: function createDefaultRoute(options) {
1395
- return Route.createRoute(assign({}, options, { isDefault: true }));
1396
- }
1397
- }, {
1398
- key: 'createNotFoundRoute',
1399
-
1400
- /**
1401
- * Creates and returns a route that is rendered when its parent matches
1402
- * the current URL but none of its siblings do.
1403
- */
1404
- value: function createNotFoundRoute(options) {
1405
- return Route.createRoute(assign({}, options, { isNotFound: true }));
1406
- }
1407
- }, {
1408
- key: 'createRedirect',
1409
-
1410
- /**
1411
- * Creates and returns a route that automatically redirects the transition
1412
- * to another route. In addition to the normal options to createRoute, this
1413
- * function accepts the following options:
1414
- *
1415
- * - from An alias for the `path` option. Defaults to *
1416
- * - to The path/route/route name to redirect to
1417
- * - params The params to use in the redirect URL. Defaults
1418
- * to using the current params
1419
- * - query The query to use in the redirect URL. Defaults
1420
- * to using the current query
1421
- */
1422
- value: function createRedirect(options) {
1423
- return Route.createRoute(assign({}, options, {
1424
- path: options.path || options.from || '*',
1425
- onEnter: function onEnter(transition, params, query) {
1426
- transition.redirect(options.to, options.params || params, options.query || query);
1427
- }
1428
- }));
1429
- }
1430
- }]);
1431
-
1432
- return Route;
1433
- })();
1434
-
1435
- module.exports = Route;
1436
-
1437
- /***/ },
1438
- /* 18 */
1439
- /***/ function(module, exports, __webpack_require__) {
1440
-
1441
- /* jshint -W084 */
1442
- 'use strict';
1443
-
1444
- var React = __webpack_require__(21);
1445
- var assign = __webpack_require__(33);
1446
- var warning = __webpack_require__(36);
1447
- var DefaultRoute = __webpack_require__(1);
1448
- var NotFoundRoute = __webpack_require__(3);
1449
- var Redirect = __webpack_require__(4);
1450
- var Route = __webpack_require__(17);
1451
-
1452
- function checkPropTypes(componentName, propTypes, props) {
1453
- componentName = componentName || 'UnknownComponent';
1454
-
1455
- for (var propName in propTypes) {
1456
- if (propTypes.hasOwnProperty(propName)) {
1457
- var error = propTypes[propName](props, propName, componentName);
1458
-
1459
- if (error instanceof Error) warning(false, error.message);
1460
- }
1461
- }
1462
- }
1463
-
1464
- function createRouteOptions(props) {
1465
- var options = assign({}, props);
1466
- var handler = options.handler;
1467
-
1468
- if (handler) {
1469
- options.onEnter = handler.willTransitionTo;
1470
- options.onLeave = handler.willTransitionFrom;
1471
- }
1472
-
1473
- return options;
1474
- }
1475
-
1476
- function createRouteFromReactElement(element) {
1477
- if (!React.isValidElement(element)) {
1478
- return;
1479
- }var type = element.type;
1480
- var props = assign({}, type.defaultProps, element.props);
1481
-
1482
- if (type.propTypes) checkPropTypes(type.displayName, type.propTypes, props);
1483
-
1484
- if (type === DefaultRoute) {
1485
- return Route.createDefaultRoute(createRouteOptions(props));
1486
- }if (type === NotFoundRoute) {
1487
- return Route.createNotFoundRoute(createRouteOptions(props));
1488
- }if (type === Redirect) {
1489
- return Route.createRedirect(createRouteOptions(props));
1490
- }return Route.createRoute(createRouteOptions(props), function () {
1491
- if (props.children) createRoutesFromReactChildren(props.children);
1492
- });
1493
- }
1494
-
1495
- /**
1496
- * Creates and returns an array of routes created from the given
1497
- * ReactChildren, all of which should be one of <Route>, <DefaultRoute>,
1498
- * <NotFoundRoute>, or <Redirect>, e.g.:
1499
- *
1500
- * var { createRoutesFromReactChildren, Route, Redirect } = require('react-router');
1501
- *
1502
- * var routes = createRoutesFromReactChildren(
1503
- * <Route path="/" handler={App}>
1504
- * <Route name="user" path="/user/:userId" handler={User}>
1505
- * <Route name="task" path="tasks/:taskId" handler={Task}/>
1506
- * <Redirect from="todos/:taskId" to="task"/>
1507
- * </Route>
1508
- * </Route>
1509
- * );
1510
- */
1511
- function createRoutesFromReactChildren(children) {
1512
- var routes = [];
1513
-
1514
- React.Children.forEach(children, function (child) {
1515
- if (child = createRouteFromReactElement(child)) routes.push(child);
1516
- });
1517
-
1518
- return routes;
1519
- }
1520
-
1521
- module.exports = createRoutesFromReactChildren;
1522
-
1523
- /***/ },
1524
- /* 19 */
1525
- /***/ function(module, exports, __webpack_require__) {
1526
-
1527
- /* jshint -W058 */
1528
- 'use strict';
1529
-
1530
- var React = __webpack_require__(21);
1531
- var warning = __webpack_require__(36);
1532
- var invariant = __webpack_require__(34);
1533
- var canUseDOM = __webpack_require__(35).canUseDOM;
1534
- var LocationActions = __webpack_require__(24);
1535
- var ImitateBrowserBehavior = __webpack_require__(12);
1536
- var HashLocation = __webpack_require__(7);
1537
- var HistoryLocation = __webpack_require__(8);
1538
- var RefreshLocation = __webpack_require__(9);
1539
- var StaticLocation = __webpack_require__(10);
1540
- var ScrollHistory = __webpack_require__(26);
1541
- var createRoutesFromReactChildren = __webpack_require__(18);
1542
- var isReactChildren = __webpack_require__(27);
1543
- var Transition = __webpack_require__(28);
1544
- var PropTypes = __webpack_require__(22);
1545
- var Redirect = __webpack_require__(29);
1546
- var History = __webpack_require__(14);
1547
- var Cancellation = __webpack_require__(30);
1548
- var Match = __webpack_require__(31);
1549
- var Route = __webpack_require__(17);
1550
- var supportsHistory = __webpack_require__(32);
1551
- var PathUtils = __webpack_require__(25);
1552
-
1553
- /**
1554
- * The default location for new routers.
1555
- */
1556
- var DEFAULT_LOCATION = canUseDOM ? HashLocation : '/';
1557
-
1558
- /**
1559
- * The default scroll behavior for new routers.
1560
- */
1561
- var DEFAULT_SCROLL_BEHAVIOR = canUseDOM ? ImitateBrowserBehavior : null;
1562
-
1563
- function hasProperties(object, properties) {
1564
- for (var propertyName in properties) if (properties.hasOwnProperty(propertyName) && object[propertyName] !== properties[propertyName]) {
1565
- return false;
1566
- }return true;
1567
- }
1568
-
1569
- function hasMatch(routes, route, prevParams, nextParams, prevQuery, nextQuery) {
1570
- return routes.some(function (r) {
1571
- if (r !== route) return false;
1572
-
1573
- var paramNames = route.paramNames;
1574
- var paramName;
1575
-
1576
- // Ensure that all params the route cares about did not change.
1577
- for (var i = 0, len = paramNames.length; i < len; ++i) {
1578
- paramName = paramNames[i];
1579
-
1580
- if (nextParams[paramName] !== prevParams[paramName]) return false;
1581
- }
1582
-
1583
- // Ensure the query hasn't changed.
1584
- return hasProperties(prevQuery, nextQuery) && hasProperties(nextQuery, prevQuery);
1585
- });
1586
- }
1587
-
1588
- function addRoutesToNamedRoutes(routes, namedRoutes) {
1589
- var route;
1590
- for (var i = 0, len = routes.length; i < len; ++i) {
1591
- route = routes[i];
1592
-
1593
- if (route.name) {
1594
- invariant(namedRoutes[route.name] == null, 'You may not have more than one route named "%s"', route.name);
1595
-
1596
- namedRoutes[route.name] = route;
1597
- }
1598
-
1599
- if (route.childRoutes) addRoutesToNamedRoutes(route.childRoutes, namedRoutes);
1600
- }
1601
- }
1602
-
1603
- function routeIsActive(activeRoutes, routeName) {
1604
- return activeRoutes.some(function (route) {
1605
- return route.name === routeName;
1606
- });
1607
- }
1608
-
1609
- function paramsAreActive(activeParams, params) {
1610
- for (var property in params) if (String(activeParams[property]) !== String(params[property])) {
1611
- return false;
1612
- }return true;
1613
- }
1614
-
1615
- function queryIsActive(activeQuery, query) {
1616
- for (var property in query) if (String(activeQuery[property]) !== String(query[property])) {
1617
- return false;
1618
- }return true;
1619
- }
1620
-
1621
- /**
1622
- * Creates and returns a new router using the given options. A router
1623
- * is a ReactComponent class that knows how to react to changes in the
1624
- * URL and keep the contents of the page in sync.
1625
- *
1626
- * Options may be any of the following:
1627
- *
1628
- * - routes (required) The route config
1629
- * - location The location to use. Defaults to HashLocation when
1630
- * the DOM is available, "/" otherwise
1631
- * - scrollBehavior The scroll behavior to use. Defaults to ImitateBrowserBehavior
1632
- * when the DOM is available, null otherwise
1633
- * - onError A function that is used to handle errors
1634
- * - onAbort A function that is used to handle aborted transitions
1635
- *
1636
- * When rendering in a server-side environment, the location should simply
1637
- * be the URL path that was used in the request, including the query string.
1638
- */
1639
- function createRouter(options) {
1640
- options = options || {};
1641
-
1642
- if (isReactChildren(options)) options = { routes: options };
1643
-
1644
- var mountedComponents = [];
1645
- var location = options.location || DEFAULT_LOCATION;
1646
- var scrollBehavior = options.scrollBehavior || DEFAULT_SCROLL_BEHAVIOR;
1647
- var state = {};
1648
- var nextState = {};
1649
- var pendingTransition = null;
1650
- var dispatchHandler = null;
1651
-
1652
- if (typeof location === 'string') location = new StaticLocation(location);
1653
-
1654
- if (location instanceof StaticLocation) {
1655
- warning(!canUseDOM || ("production") === 'test', 'You should not use a static location in a DOM environment because ' + 'the router will not be kept in sync with the current URL');
1656
- } else {
1657
- invariant(canUseDOM || location.needsDOM === false, 'You cannot use %s without a DOM', location);
1658
- }
1659
-
1660
- // Automatically fall back to full page refreshes in
1661
- // browsers that don't support the HTML history API.
1662
- if (location === HistoryLocation && !supportsHistory()) location = RefreshLocation;
1663
-
1664
- var Router = React.createClass({
1665
-
1666
- displayName: 'Router',
1667
-
1668
- statics: {
1669
-
1670
- isRunning: false,
1671
-
1672
- cancelPendingTransition: function cancelPendingTransition() {
1673
- if (pendingTransition) {
1674
- pendingTransition.cancel();
1675
- pendingTransition = null;
1676
- }
1677
- },
1678
-
1679
- clearAllRoutes: function clearAllRoutes() {
1680
- Router.cancelPendingTransition();
1681
- Router.namedRoutes = {};
1682
- Router.routes = [];
1683
- },
1684
-
1685
- /**
1686
- * Adds routes to this router from the given children object (see ReactChildren).
1687
- */
1688
- addRoutes: function addRoutes(routes) {
1689
- if (isReactChildren(routes)) routes = createRoutesFromReactChildren(routes);
1690
-
1691
- addRoutesToNamedRoutes(routes, Router.namedRoutes);
1692
-
1693
- Router.routes.push.apply(Router.routes, routes);
1694
- },
1695
-
1696
- /**
1697
- * Replaces routes of this router from the given children object (see ReactChildren).
1698
- */
1699
- replaceRoutes: function replaceRoutes(routes) {
1700
- Router.clearAllRoutes();
1701
- Router.addRoutes(routes);
1702
- Router.refresh();
1703
- },
1704
-
1705
- /**
1706
- * Performs a match of the given path against this router and returns an object
1707
- * with the { routes, params, pathname, query } that match. Returns null if no
1708
- * match can be made.
1709
- */
1710
- match: function match(path) {
1711
- return Match.findMatch(Router.routes, path);
1712
- },
1713
-
1714
- /**
1715
- * Returns an absolute URL path created from the given route
1716
- * name, URL parameters, and query.
1717
- */
1718
- makePath: function makePath(to, params, query) {
1719
- var path;
1720
- if (PathUtils.isAbsolute(to)) {
1721
- path = to;
1722
- } else {
1723
- var route = to instanceof Route ? to : Router.namedRoutes[to];
1724
-
1725
- invariant(route instanceof Route, 'Cannot find a route named "%s"', to);
1726
-
1727
- path = route.path;
1728
- }
1729
-
1730
- return PathUtils.withQuery(PathUtils.injectParams(path, params), query);
1731
- },
1732
-
1733
- /**
1734
- * Returns a string that may safely be used as the href of a link
1735
- * to the route with the given name, URL parameters, and query.
1736
- */
1737
- makeHref: function makeHref(to, params, query) {
1738
- var path = Router.makePath(to, params, query);
1739
- return location === HashLocation ? '#' + path : path;
1740
- },
1741
-
1742
- /**
1743
- * Transitions to the URL specified in the arguments by pushing
1744
- * a new URL onto the history stack.
1745
- */
1746
- transitionTo: function transitionTo(to, params, query) {
1747
- var path = Router.makePath(to, params, query);
1748
-
1749
- if (pendingTransition) {
1750
- // Replace so pending location does not stay in history.
1751
- location.replace(path);
1752
- } else {
1753
- location.push(path);
1754
- }
1755
- },
1756
-
1757
- /**
1758
- * Transitions to the URL specified in the arguments by replacing
1759
- * the current URL in the history stack.
1760
- */
1761
- replaceWith: function replaceWith(to, params, query) {
1762
- location.replace(Router.makePath(to, params, query));
1763
- },
1764
-
1765
- /**
1766
- * Transitions to the previous URL if one is available. Returns true if the
1767
- * router was able to go back, false otherwise.
1768
- *
1769
- * Note: The router only tracks history entries in your application, not the
1770
- * current browser session, so you can safely call this function without guarding
1771
- * against sending the user back to some other site. However, when using
1772
- * RefreshLocation (which is the fallback for HistoryLocation in browsers that
1773
- * don't support HTML5 history) this method will *always* send the client back
1774
- * because we cannot reliably track history length.
1775
- */
1776
- goBack: function goBack() {
1777
- if (History.length > 1 || location === RefreshLocation) {
1778
- location.pop();
1779
- return true;
1780
- }
1781
-
1782
- warning(false, 'goBack() was ignored because there is no router history');
1783
-
1784
- return false;
1785
- },
1786
-
1787
- handleAbort: options.onAbort || function (abortReason) {
1788
- if (location instanceof StaticLocation) throw new Error('Unhandled aborted transition! Reason: ' + abortReason);
1789
-
1790
- if (abortReason instanceof Cancellation) {
1791
- return;
1792
- } else if (abortReason instanceof Redirect) {
1793
- location.replace(Router.makePath(abortReason.to, abortReason.params, abortReason.query));
1794
- } else {
1795
- location.pop();
1796
- }
1797
- },
1798
-
1799
- handleError: options.onError || function (error) {
1800
- // Throw so we don't silently swallow async errors.
1801
- throw error; // This error probably originated in a transition hook.
1802
- },
1803
-
1804
- handleLocationChange: function handleLocationChange(change) {
1805
- Router.dispatch(change.path, change.type);
1806
- },
1807
-
1808
- /**
1809
- * Performs a transition to the given path and calls callback(error, abortReason)
1810
- * when the transition is finished. If both arguments are null the router's state
1811
- * was updated. Otherwise the transition did not complete.
1812
- *
1813
- * In a transition, a router first determines which routes are involved by beginning
1814
- * with the current route, up the route tree to the first parent route that is shared
1815
- * with the destination route, and back down the tree to the destination route. The
1816
- * willTransitionFrom hook is invoked on all route handlers we're transitioning away
1817
- * from, in reverse nesting order. Likewise, the willTransitionTo hook is invoked on
1818
- * all route handlers we're transitioning to.
1819
- *
1820
- * Both willTransitionFrom and willTransitionTo hooks may either abort or redirect the
1821
- * transition. To resolve asynchronously, they may use the callback argument. If no
1822
- * hooks wait, the transition is fully synchronous.
1823
- */
1824
- dispatch: function dispatch(path, action) {
1825
- Router.cancelPendingTransition();
1826
-
1827
- var prevPath = state.path;
1828
- var isRefreshing = action == null;
1829
-
1830
- if (prevPath === path && !isRefreshing) {
1831
- return;
1832
- } // Nothing to do!
1833
-
1834
- // Record the scroll position as early as possible to
1835
- // get it before browsers try update it automatically.
1836
- if (prevPath && action === LocationActions.PUSH) Router.recordScrollPosition(prevPath);
1837
-
1838
- var match = Router.match(path);
1839
-
1840
- warning(match != null, 'No route matches path "%s". Make sure you have <Route path="%s"> somewhere in your routes', path, path);
1841
-
1842
- if (match == null) match = {};
1843
-
1844
- var prevRoutes = state.routes || [];
1845
- var prevParams = state.params || {};
1846
- var prevQuery = state.query || {};
1847
-
1848
- var nextRoutes = match.routes || [];
1849
- var nextParams = match.params || {};
1850
- var nextQuery = match.query || {};
1851
-
1852
- var fromRoutes, toRoutes;
1853
- if (prevRoutes.length) {
1854
- fromRoutes = prevRoutes.filter(function (route) {
1855
- return !hasMatch(nextRoutes, route, prevParams, nextParams, prevQuery, nextQuery);
1856
- });
1857
-
1858
- toRoutes = nextRoutes.filter(function (route) {
1859
- return !hasMatch(prevRoutes, route, prevParams, nextParams, prevQuery, nextQuery);
1860
- });
1861
- } else {
1862
- fromRoutes = [];
1863
- toRoutes = nextRoutes;
1864
- }
1865
-
1866
- var transition = new Transition(path, Router.replaceWith.bind(Router, path));
1867
- pendingTransition = transition;
1868
-
1869
- var fromComponents = mountedComponents.slice(prevRoutes.length - fromRoutes.length);
1870
-
1871
- Transition.from(transition, fromRoutes, fromComponents, function (error) {
1872
- if (error || transition.abortReason) return dispatchHandler.call(Router, error, transition); // No need to continue.
1873
-
1874
- Transition.to(transition, toRoutes, nextParams, nextQuery, function (error) {
1875
- dispatchHandler.call(Router, error, transition, {
1876
- path: path,
1877
- action: action,
1878
- pathname: match.pathname,
1879
- routes: nextRoutes,
1880
- params: nextParams,
1881
- query: nextQuery
1882
- });
1883
- });
1884
- });
1885
- },
1886
-
1887
- /**
1888
- * Starts this router and calls callback(router, state) when the route changes.
1889
- *
1890
- * If the router's location is static (i.e. a URL path in a server environment)
1891
- * the callback is called only once. Otherwise, the location should be one of the
1892
- * Router.*Location objects (e.g. Router.HashLocation or Router.HistoryLocation).
1893
- */
1894
- run: function run(callback) {
1895
- invariant(!Router.isRunning, 'Router is already running');
1896
-
1897
- dispatchHandler = function (error, transition, newState) {
1898
- if (error) Router.handleError(error);
1899
-
1900
- if (pendingTransition !== transition) return;
1901
-
1902
- pendingTransition = null;
1903
-
1904
- if (transition.abortReason) {
1905
- Router.handleAbort(transition.abortReason);
1906
- } else {
1907
- callback.call(Router, Router, nextState = newState);
1908
- }
1909
- };
1910
-
1911
- if (!(location instanceof StaticLocation)) {
1912
- if (location.addChangeListener) location.addChangeListener(Router.handleLocationChange);
1913
-
1914
- Router.isRunning = true;
1915
- }
1916
-
1917
- // Bootstrap using the current path.
1918
- Router.refresh();
1919
- },
1920
-
1921
- refresh: function refresh() {
1922
- Router.dispatch(location.getCurrentPath(), null);
1923
- },
1924
-
1925
- stop: function stop() {
1926
- Router.cancelPendingTransition();
1927
-
1928
- if (location.removeChangeListener) location.removeChangeListener(Router.handleLocationChange);
1929
-
1930
- Router.isRunning = false;
1931
- },
1932
-
1933
- getLocation: function getLocation() {
1934
- return location;
1935
- },
1936
-
1937
- getScrollBehavior: function getScrollBehavior() {
1938
- return scrollBehavior;
1939
- },
1940
-
1941
- getRouteAtDepth: function getRouteAtDepth(routeDepth) {
1942
- var routes = state.routes;
1943
- return routes && routes[routeDepth];
1944
- },
1945
-
1946
- setRouteComponentAtDepth: function setRouteComponentAtDepth(routeDepth, component) {
1947
- mountedComponents[routeDepth] = component;
1948
- },
1949
-
1950
- /**
1951
- * Returns the current URL path + query string.
1952
- */
1953
- getCurrentPath: function getCurrentPath() {
1954
- return state.path;
1955
- },
1956
-
1957
- /**
1958
- * Returns the current URL path without the query string.
1959
- */
1960
- getCurrentPathname: function getCurrentPathname() {
1961
- return state.pathname;
1962
- },
1963
-
1964
- /**
1965
- * Returns an object of the currently active URL parameters.
1966
- */
1967
- getCurrentParams: function getCurrentParams() {
1968
- return state.params;
1969
- },
1970
-
1971
- /**
1972
- * Returns an object of the currently active query parameters.
1973
- */
1974
- getCurrentQuery: function getCurrentQuery() {
1975
- return state.query;
1976
- },
1977
-
1978
- /**
1979
- * Returns an array of the currently active routes.
1980
- */
1981
- getCurrentRoutes: function getCurrentRoutes() {
1982
- return state.routes;
1983
- },
1984
-
1985
- /**
1986
- * Returns true if the given route, params, and query are active.
1987
- */
1988
- isActive: function isActive(to, params, query) {
1989
- if (PathUtils.isAbsolute(to)) {
1990
- return to === state.path;
1991
- }return routeIsActive(state.routes, to) && paramsAreActive(state.params, params) && (query == null || queryIsActive(state.query, query));
1992
- }
1993
-
1994
- },
1995
-
1996
- mixins: [ScrollHistory],
1997
-
1998
- propTypes: {
1999
- children: PropTypes.falsy
2000
- },
2001
-
2002
- childContextTypes: {
2003
- routeDepth: PropTypes.number.isRequired,
2004
- router: PropTypes.router.isRequired
2005
- },
2006
-
2007
- getChildContext: function getChildContext() {
2008
- return {
2009
- routeDepth: 1,
2010
- router: Router
2011
- };
2012
- },
2013
-
2014
- getInitialState: function getInitialState() {
2015
- return state = nextState;
2016
- },
2017
-
2018
- componentWillReceiveProps: function componentWillReceiveProps() {
2019
- this.setState(state = nextState);
2020
- },
2021
-
2022
- componentWillUnmount: function componentWillUnmount() {
2023
- Router.stop();
2024
- },
2025
-
2026
- render: function render() {
2027
- var route = Router.getRouteAtDepth(0);
2028
- return route ? React.createElement(route.handler, this.props) : null;
2029
- }
2030
-
2031
- });
2032
-
2033
- Router.clearAllRoutes();
2034
-
2035
- if (options.routes) Router.addRoutes(options.routes);
2036
-
2037
- return Router;
2038
- }
2039
-
2040
- module.exports = createRouter;
2041
-
2042
- /***/ },
2043
- /* 20 */
2044
- /***/ function(module, exports, __webpack_require__) {
2045
-
2046
- 'use strict';
2047
-
2048
- var createRouter = __webpack_require__(19);
2049
-
2050
- /**
2051
- * A high-level convenience method that creates, configures, and
2052
- * runs a router in one shot. The method signature is:
2053
- *
2054
- * Router.run(routes[, location ], callback);
2055
- *
2056
- * Using `window.location.hash` to manage the URL, you could do:
2057
- *
2058
- * Router.run(routes, function (Handler) {
2059
- * React.render(<Handler/>, document.body);
2060
- * });
2061
- *
2062
- * Using HTML5 history and a custom "cursor" prop:
2063
- *
2064
- * Router.run(routes, Router.HistoryLocation, function (Handler) {
2065
- * React.render(<Handler cursor={cursor}/>, document.body);
2066
- * });
2067
- *
2068
- * Returns the newly created router.
2069
- *
2070
- * Note: If you need to specify further options for your router such
2071
- * as error/abort handling or custom scroll behavior, use Router.create
2072
- * instead.
2073
- *
2074
- * var router = Router.create(options);
2075
- * router.run(function (Handler) {
2076
- * // ...
2077
- * });
2078
- */
2079
- function runRouter(routes, location, callback) {
2080
- if (typeof location === 'function') {
2081
- callback = location;
2082
- location = null;
2083
- }
2084
-
2085
- var router = createRouter({
2086
- routes: routes,
2087
- location: location
2088
- });
2089
-
2090
- router.run(callback);
2091
-
2092
- return router;
2093
- }
2094
-
2095
- module.exports = runRouter;
2096
-
2097
- /***/ },
2098
- /* 21 */
2099
- /***/ function(module, exports, __webpack_require__) {
2100
-
2101
- module.exports = __WEBPACK_EXTERNAL_MODULE_21__;
2102
-
2103
- /***/ },
2104
- /* 22 */
2105
- /***/ function(module, exports, __webpack_require__) {
2106
-
2107
- 'use strict';
2108
-
2109
- var assign = __webpack_require__(33);
2110
- var ReactPropTypes = __webpack_require__(21).PropTypes;
2111
- var Route = __webpack_require__(17);
2112
-
2113
- var PropTypes = assign({}, ReactPropTypes, {
2114
-
2115
- /**
2116
- * Indicates that a prop should be falsy.
2117
- */
2118
- falsy: function falsy(props, propName, componentName) {
2119
- if (props[propName]) {
2120
- return new Error('<' + componentName + '> should not have a "' + propName + '" prop');
2121
- }
2122
- },
2123
-
2124
- /**
2125
- * Indicates that a prop should be a Route object.
2126
- */
2127
- route: ReactPropTypes.instanceOf(Route),
2128
-
2129
- /**
2130
- * Indicates that a prop should be a Router object.
2131
- */
2132
- //router: ReactPropTypes.instanceOf(Router) // TODO
2133
- router: ReactPropTypes.func
2134
-
2135
- });
2136
-
2137
- module.exports = PropTypes;
2138
-
2139
- /***/ },
2140
- /* 23 */
2141
- /***/ function(module, exports, __webpack_require__) {
2142
-
2143
- 'use strict';
2144
-
2145
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
2146
-
2147
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
2148
-
2149
- var _inherits = function (subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };
2150
-
2151
- /**
2152
- * This component is necessary to get around a context warning
2153
- * present in React 0.13.0. It sovles this by providing a separation
2154
- * between the "owner" and "parent" contexts.
2155
- */
2156
-
2157
- var React = __webpack_require__(21);
2158
-
2159
- var ContextWrapper = (function (_React$Component) {
2160
- function ContextWrapper() {
2161
- _classCallCheck(this, ContextWrapper);
2162
-
2163
- if (_React$Component != null) {
2164
- _React$Component.apply(this, arguments);
2165
- }
2166
- }
2167
-
2168
- _inherits(ContextWrapper, _React$Component);
2169
-
2170
- _createClass(ContextWrapper, [{
2171
- key: 'render',
2172
- value: function render() {
2173
- return this.props.children;
2174
- }
2175
- }]);
2176
-
2177
- return ContextWrapper;
2178
- })(React.Component);
2179
-
2180
- module.exports = ContextWrapper;
2181
-
2182
- /***/ },
2183
- /* 24 */
2184
- /***/ function(module, exports, __webpack_require__) {
2185
-
2186
- /**
2187
- * Actions that modify the URL.
2188
- */
2189
- 'use strict';
2190
-
2191
- var LocationActions = {
2192
-
2193
- /**
2194
- * Indicates a new location is being pushed to the history stack.
2195
- */
2196
- PUSH: 'push',
2197
-
2198
- /**
2199
- * Indicates the current location should be replaced.
2200
- */
2201
- REPLACE: 'replace',
2202
-
2203
- /**
2204
- * Indicates the most recent entry should be removed from the history stack.
2205
- */
2206
- POP: 'pop'
2207
-
2208
- };
2209
-
2210
- module.exports = LocationActions;
2211
-
2212
- /***/ },
2213
- /* 25 */
2214
- /***/ function(module, exports, __webpack_require__) {
2215
-
2216
- 'use strict';
2217
-
2218
- var invariant = __webpack_require__(34);
2219
- var assign = __webpack_require__(38);
2220
- var qs = __webpack_require__(39);
2221
-
2222
- var paramCompileMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\[\]\\+|{}^$]/g;
2223
- var paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g;
2224
- var paramInjectTrailingSlashMatcher = /\/\/\?|\/\?\/|\/\?/g;
2225
- var queryMatcher = /\?(.*)$/;
2226
-
2227
- var _compiledPatterns = {};
2228
-
2229
- function compilePattern(pattern) {
2230
- if (!(pattern in _compiledPatterns)) {
2231
- var paramNames = [];
2232
- var source = pattern.replace(paramCompileMatcher, function (match, paramName) {
2233
- if (paramName) {
2234
- paramNames.push(paramName);
2235
- return '([^/?#]+)';
2236
- } else if (match === '*') {
2237
- paramNames.push('splat');
2238
- return '(.*?)';
2239
- } else {
2240
- return '\\' + match;
2241
- }
2242
- });
2243
-
2244
- _compiledPatterns[pattern] = {
2245
- matcher: new RegExp('^' + source + '$', 'i'),
2246
- paramNames: paramNames
2247
- };
2248
- }
2249
-
2250
- return _compiledPatterns[pattern];
2251
- }
2252
-
2253
- var PathUtils = {
2254
-
2255
- /**
2256
- * Returns true if the given path is absolute.
2257
- */
2258
- isAbsolute: function isAbsolute(path) {
2259
- return path.charAt(0) === '/';
2260
- },
2261
-
2262
- /**
2263
- * Joins two URL paths together.
2264
- */
2265
- join: function join(a, b) {
2266
- return a.replace(/\/*$/, '/') + b;
2267
- },
2268
-
2269
- /**
2270
- * Returns an array of the names of all parameters in the given pattern.
2271
- */
2272
- extractParamNames: function extractParamNames(pattern) {
2273
- return compilePattern(pattern).paramNames;
2274
- },
2275
-
2276
- /**
2277
- * Extracts the portions of the given URL path that match the given pattern
2278
- * and returns an object of param name => value pairs. Returns null if the
2279
- * pattern does not match the given path.
2280
- */
2281
- extractParams: function extractParams(pattern, path) {
2282
- var _compilePattern = compilePattern(pattern);
2283
-
2284
- var matcher = _compilePattern.matcher;
2285
- var paramNames = _compilePattern.paramNames;
2286
-
2287
- var match = path.match(matcher);
2288
-
2289
- if (!match) {
2290
- return null;
2291
- }var params = {};
2292
-
2293
- paramNames.forEach(function (paramName, index) {
2294
- params[paramName] = match[index + 1];
2295
- });
2296
-
2297
- return params;
2298
- },
2299
-
2300
- /**
2301
- * Returns a version of the given route path with params interpolated. Throws
2302
- * if there is a dynamic segment of the route path for which there is no param.
2303
- */
2304
- injectParams: function injectParams(pattern, params) {
2305
- params = params || {};
2306
-
2307
- var splatIndex = 0;
2308
-
2309
- return pattern.replace(paramInjectMatcher, function (match, paramName) {
2310
- paramName = paramName || 'splat';
2311
-
2312
- // If param is optional don't check for existence
2313
- if (paramName.slice(-1) === '?') {
2314
- paramName = paramName.slice(0, -1);
2315
-
2316
- if (params[paramName] == null) return '';
2317
- } else {
2318
- invariant(params[paramName] != null, 'Missing "%s" parameter for path "%s"', paramName, pattern);
2319
- }
2320
-
2321
- var segment;
2322
- if (paramName === 'splat' && Array.isArray(params[paramName])) {
2323
- segment = params[paramName][splatIndex++];
2324
-
2325
- invariant(segment != null, 'Missing splat # %s for path "%s"', splatIndex, pattern);
2326
- } else {
2327
- segment = params[paramName];
2328
- }
2329
-
2330
- return segment;
2331
- }).replace(paramInjectTrailingSlashMatcher, '/');
2332
- },
2333
-
2334
- /**
2335
- * Returns an object that is the result of parsing any query string contained
2336
- * in the given path, null if the path contains no query string.
2337
- */
2338
- extractQuery: function extractQuery(path) {
2339
- var match = path.match(queryMatcher);
2340
- return match && qs.parse(match[1]);
2341
- },
2342
-
2343
- /**
2344
- * Returns a version of the given path without the query string.
2345
- */
2346
- withoutQuery: function withoutQuery(path) {
2347
- return path.replace(queryMatcher, '');
2348
- },
2349
-
2350
- /**
2351
- * Returns a version of the given path with the parameters in the given
2352
- * query merged into the query string.
2353
- */
2354
- withQuery: function withQuery(path, query) {
2355
- var existingQuery = PathUtils.extractQuery(path);
2356
-
2357
- if (existingQuery) query = query ? assign(existingQuery, query) : existingQuery;
2358
-
2359
- var queryString = qs.stringify(query, { arrayFormat: 'brackets' });
2360
-
2361
- if (queryString) {
2362
- return PathUtils.withoutQuery(path) + '?' + queryString;
2363
- }return PathUtils.withoutQuery(path);
2364
- }
2365
-
2366
- };
2367
-
2368
- module.exports = PathUtils;
2369
-
2370
- /***/ },
2371
- /* 26 */
2372
- /***/ function(module, exports, __webpack_require__) {
2373
-
2374
- 'use strict';
2375
-
2376
- var invariant = __webpack_require__(34);
2377
- var canUseDOM = __webpack_require__(35).canUseDOM;
2378
- var getWindowScrollPosition = __webpack_require__(37);
2379
-
2380
- function shouldUpdateScroll(state, prevState) {
2381
- if (!prevState) {
2382
- return true;
2383
- } // Don't update scroll position when only the query has changed.
2384
- if (state.pathname === prevState.pathname) {
2385
- return false;
2386
- }var routes = state.routes;
2387
- var prevRoutes = prevState.routes;
2388
-
2389
- var sharedAncestorRoutes = routes.filter(function (route) {
2390
- return prevRoutes.indexOf(route) !== -1;
2391
- });
2392
-
2393
- return !sharedAncestorRoutes.some(function (route) {
2394
- return route.ignoreScrollBehavior;
2395
- });
2396
- }
2397
-
2398
- /**
2399
- * Provides the router with the ability to manage window scroll position
2400
- * according to its scroll behavior.
2401
- */
2402
- var ScrollHistory = {
2403
-
2404
- statics: {
2405
-
2406
- /**
2407
- * Records curent scroll position as the last known position for the given URL path.
2408
- */
2409
- recordScrollPosition: function recordScrollPosition(path) {
2410
- if (!this.scrollHistory) this.scrollHistory = {};
2411
-
2412
- this.scrollHistory[path] = getWindowScrollPosition();
2413
- },
2414
-
2415
- /**
2416
- * Returns the last known scroll position for the given URL path.
2417
- */
2418
- getScrollPosition: function getScrollPosition(path) {
2419
- if (!this.scrollHistory) this.scrollHistory = {};
2420
-
2421
- return this.scrollHistory[path] || null;
2422
- }
2423
-
2424
- },
2425
-
2426
- componentWillMount: function componentWillMount() {
2427
- invariant(this.constructor.getScrollBehavior() == null || canUseDOM, 'Cannot use scroll behavior without a DOM');
2428
- },
2429
-
2430
- componentDidMount: function componentDidMount() {
2431
- this._updateScroll();
2432
- },
2433
-
2434
- componentDidUpdate: function componentDidUpdate(prevProps, prevState) {
2435
- this._updateScroll(prevState);
2436
- },
2437
-
2438
- _updateScroll: function _updateScroll(prevState) {
2439
- if (!shouldUpdateScroll(this.state, prevState)) {
2440
- return;
2441
- }var scrollBehavior = this.constructor.getScrollBehavior();
2442
-
2443
- if (scrollBehavior) scrollBehavior.updateScrollPosition(this.constructor.getScrollPosition(this.state.path), this.state.action);
2444
- }
2445
-
2446
- };
2447
-
2448
- module.exports = ScrollHistory;
2449
-
2450
- /***/ },
2451
- /* 27 */
2452
- /***/ function(module, exports, __webpack_require__) {
2453
-
2454
- 'use strict';
2455
-
2456
- var React = __webpack_require__(21);
2457
-
2458
- function isValidChild(object) {
2459
- return object == null || React.isValidElement(object);
2460
- }
2461
-
2462
- function isReactChildren(object) {
2463
- return isValidChild(object) || Array.isArray(object) && object.every(isValidChild);
2464
- }
2465
-
2466
- module.exports = isReactChildren;
2467
-
2468
- /***/ },
2469
- /* 28 */
2470
- /***/ function(module, exports, __webpack_require__) {
2471
-
2472
- /* jshint -W058 */
2473
-
2474
- 'use strict';
2475
-
2476
- var Cancellation = __webpack_require__(30);
2477
- var Redirect = __webpack_require__(29);
2478
-
2479
- /**
2480
- * Encapsulates a transition to a given path.
2481
- *
2482
- * The willTransitionTo and willTransitionFrom handlers receive
2483
- * an instance of this class as their first argument.
2484
- */
2485
- function Transition(path, retry) {
2486
- this.path = path;
2487
- this.abortReason = null;
2488
- // TODO: Change this to router.retryTransition(transition)
2489
- this.retry = retry.bind(this);
2490
- }
2491
-
2492
- Transition.prototype.abort = function (reason) {
2493
- if (this.abortReason == null) this.abortReason = reason || 'ABORT';
2494
- };
2495
-
2496
- Transition.prototype.redirect = function (to, params, query) {
2497
- this.abort(new Redirect(to, params, query));
2498
- };
2499
-
2500
- Transition.prototype.cancel = function () {
2501
- this.abort(new Cancellation());
2502
- };
2503
-
2504
- Transition.from = function (transition, routes, components, callback) {
2505
- routes.reduce(function (callback, route, index) {
2506
- return function (error) {
2507
- if (error || transition.abortReason) {
2508
- callback(error);
2509
- } else if (route.onLeave) {
2510
- try {
2511
- route.onLeave(transition, components[index], callback);
2512
-
2513
- // If there is no callback in the argument list, call it automatically.
2514
- if (route.onLeave.length < 3) callback();
2515
- } catch (e) {
2516
- callback(e);
2517
- }
2518
- } else {
2519
- callback();
2520
- }
2521
- };
2522
- }, callback)();
2523
- };
2524
-
2525
- Transition.to = function (transition, routes, params, query, callback) {
2526
- routes.reduceRight(function (callback, route) {
2527
- return function (error) {
2528
- if (error || transition.abortReason) {
2529
- callback(error);
2530
- } else if (route.onEnter) {
2531
- try {
2532
- route.onEnter(transition, params, query, callback);
2533
-
2534
- // If there is no callback in the argument list, call it automatically.
2535
- if (route.onEnter.length < 4) callback();
2536
- } catch (e) {
2537
- callback(e);
2538
- }
2539
- } else {
2540
- callback();
2541
- }
2542
- };
2543
- }, callback)();
2544
- };
2545
-
2546
- module.exports = Transition;
2547
-
2548
- /***/ },
2549
- /* 29 */
2550
- /***/ function(module, exports, __webpack_require__) {
2551
-
2552
- /**
2553
- * Encapsulates a redirect to the given route.
2554
- */
2555
- "use strict";
2556
-
2557
- function Redirect(to, params, query) {
2558
- this.to = to;
2559
- this.params = params;
2560
- this.query = query;
2561
- }
2562
-
2563
- module.exports = Redirect;
2564
-
2565
- /***/ },
2566
- /* 30 */
2567
- /***/ function(module, exports, __webpack_require__) {
2568
-
2569
- /**
2570
- * Represents a cancellation caused by navigating away
2571
- * before the previous transition has fully resolved.
2572
- */
2573
- "use strict";
2574
-
2575
- function Cancellation() {}
2576
-
2577
- module.exports = Cancellation;
2578
-
2579
- /***/ },
2580
- /* 31 */
2581
- /***/ function(module, exports, __webpack_require__) {
2582
-
2583
- 'use strict';
2584
-
2585
- var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } };
2586
-
2587
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
2588
-
2589
- /* jshint -W084 */
2590
- var PathUtils = __webpack_require__(25);
2591
-
2592
- function deepSearch(route, pathname, query) {
2593
- // Check the subtree first to find the most deeply-nested match.
2594
- var childRoutes = route.childRoutes;
2595
- if (childRoutes) {
2596
- var match, childRoute;
2597
- for (var i = 0, len = childRoutes.length; i < len; ++i) {
2598
- childRoute = childRoutes[i];
2599
-
2600
- if (childRoute.isDefault || childRoute.isNotFound) continue; // Check these in order later.
2601
-
2602
- if (match = deepSearch(childRoute, pathname, query)) {
2603
- // A route in the subtree matched! Add this route and we're done.
2604
- match.routes.unshift(route);
2605
- return match;
2606
- }
2607
- }
2608
- }
2609
-
2610
- // No child routes matched; try the default route.
2611
- var defaultRoute = route.defaultRoute;
2612
- if (defaultRoute && (params = PathUtils.extractParams(defaultRoute.path, pathname))) {
2613
- return new Match(pathname, params, query, [route, defaultRoute]);
2614
- } // Does the "not found" route match?
2615
- var notFoundRoute = route.notFoundRoute;
2616
- if (notFoundRoute && (params = PathUtils.extractParams(notFoundRoute.path, pathname))) {
2617
- return new Match(pathname, params, query, [route, notFoundRoute]);
2618
- } // Last attempt: check this route.
2619
- var params = PathUtils.extractParams(route.path, pathname);
2620
- if (params) {
2621
- return new Match(pathname, params, query, [route]);
2622
- }return null;
2623
- }
2624
-
2625
- var Match = (function () {
2626
- function Match(pathname, params, query, routes) {
2627
- _classCallCheck(this, Match);
2628
-
2629
- this.pathname = pathname;
2630
- this.params = params;
2631
- this.query = query;
2632
- this.routes = routes;
2633
- }
2634
-
2635
- _createClass(Match, null, [{
2636
- key: 'findMatch',
2637
-
2638
- /**
2639
- * Attempts to match depth-first a route in the given route's
2640
- * subtree against the given path and returns the match if it
2641
- * succeeds, null if no match can be made.
2642
- */
2643
- value: function findMatch(routes, path) {
2644
- var pathname = PathUtils.withoutQuery(path);
2645
- var query = PathUtils.extractQuery(path);
2646
- var match = null;
2647
-
2648
- for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query);
2649
-
2650
- return match;
2651
- }
2652
- }]);
2653
-
2654
- return Match;
2655
- })();
2656
-
2657
- module.exports = Match;
2658
-
2659
- /***/ },
2660
- /* 32 */
2661
- /***/ function(module, exports, __webpack_require__) {
2662
-
2663
- 'use strict';
2664
-
2665
- function supportsHistory() {
2666
- /*! taken from modernizr
2667
- * https://github.com/Modernizr/Modernizr/blob/master/LICENSE
2668
- * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
2669
- * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586
2670
- */
2671
- var ua = navigator.userAgent;
2672
- 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) {
2673
- return false;
2674
- }
2675
- return window.history && 'pushState' in window.history;
2676
- }
2677
-
2678
- module.exports = supportsHistory;
2679
-
2680
- /***/ },
2681
- /* 33 */
2682
- /***/ function(module, exports, __webpack_require__) {
2683
-
2684
- /**
2685
- * Copyright 2014-2015, Facebook, Inc.
2686
- * All rights reserved.
2687
- *
2688
- * This source code is licensed under the BSD-style license found in the
2689
- * LICENSE file in the root directory of this source tree. An additional grant
2690
- * of patent rights can be found in the PATENTS file in the same directory.
2691
- *
2692
- * @providesModule Object.assign
2693
- */
2694
-
2695
- // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign
2696
-
2697
- 'use strict';
2698
-
2699
- function assign(target, sources) {
2700
- if (target == null) {
2701
- throw new TypeError('Object.assign target cannot be null or undefined');
2702
- }
2703
-
2704
- var to = Object(target);
2705
- var hasOwnProperty = Object.prototype.hasOwnProperty;
2706
-
2707
- for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {
2708
- var nextSource = arguments[nextIndex];
2709
- if (nextSource == null) {
2710
- continue;
2711
- }
2712
-
2713
- var from = Object(nextSource);
2714
-
2715
- // We don't currently support accessors nor proxies. Therefore this
2716
- // copy cannot throw. If we ever supported this then we must handle
2717
- // exceptions and side-effects. We don't support symbols so they won't
2718
- // be transferred.
2719
-
2720
- for (var key in from) {
2721
- if (hasOwnProperty.call(from, key)) {
2722
- to[key] = from[key];
2723
- }
2724
- }
2725
- }
2726
-
2727
- return to;
2728
- }
2729
-
2730
- module.exports = assign;
2731
-
2732
- /***/ },
2733
- /* 34 */
2734
- /***/ function(module, exports, __webpack_require__) {
2735
-
2736
- /**
2737
- * Copyright 2013-2015, Facebook, Inc.
2738
- * All rights reserved.
2739
- *
2740
- * This source code is licensed under the BSD-style license found in the
2741
- * LICENSE file in the root directory of this source tree. An additional grant
2742
- * of patent rights can be found in the PATENTS file in the same directory.
2743
- *
2744
- * @providesModule invariant
2745
- */
2746
-
2747
- "use strict";
2748
-
2749
- /**
2750
- * Use invariant() to assert state which your program assumes to be true.
2751
- *
2752
- * Provide sprintf-style format (only %s is supported) and arguments
2753
- * to provide information about what broke and what you were
2754
- * expecting.
2755
- *
2756
- * The invariant message will be stripped in production, but the invariant
2757
- * will remain to ensure logic does not differ in production.
2758
- */
2759
-
2760
- var invariant = function invariant(condition, format, a, b, c, d, e, f) {
2761
- if (false) {
2762
- if (format === undefined) {
2763
- throw new Error("invariant requires an error message argument");
2764
- }
2765
- }
2766
-
2767
- if (!condition) {
2768
- var error;
2769
- if (format === undefined) {
2770
- error = new Error("Minified exception occurred; use the non-minified dev environment " + "for the full error message and additional helpful warnings.");
2771
- } else {
2772
- var args = [a, b, c, d, e, f];
2773
- var argIndex = 0;
2774
- error = new Error("Invariant Violation: " + format.replace(/%s/g, function () {
2775
- return args[argIndex++];
2776
- }));
2777
- }
2778
-
2779
- error.framesToPop = 1; // we don't care about invariant's own frame
2780
- throw error;
2781
- }
2782
- };
2783
-
2784
- module.exports = invariant;
2785
-
2786
- /***/ },
2787
- /* 35 */
2788
- /***/ function(module, exports, __webpack_require__) {
2789
-
2790
- /**
2791
- * Copyright 2013-2015, Facebook, Inc.
2792
- * All rights reserved.
2793
- *
2794
- * This source code is licensed under the BSD-style license found in the
2795
- * LICENSE file in the root directory of this source tree. An additional grant
2796
- * of patent rights can be found in the PATENTS file in the same directory.
2797
- *
2798
- * @providesModule ExecutionEnvironment
2799
- */
2800
-
2801
- /*jslint evil: true */
2802
-
2803
- 'use strict';
2804
-
2805
- var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
2806
-
2807
- /**
2808
- * Simple, lightweight module assisting with the detection and context of
2809
- * Worker. Helps avoid circular dependencies and allows code to reason about
2810
- * whether or not they are in a Worker, even if they never include the main
2811
- * `ReactWorker` dependency.
2812
- */
2813
- var ExecutionEnvironment = {
2814
-
2815
- canUseDOM: canUseDOM,
2816
-
2817
- canUseWorkers: typeof Worker !== 'undefined',
2818
-
2819
- canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),
2820
-
2821
- canUseViewport: canUseDOM && !!window.screen,
2822
-
2823
- isInWorker: !canUseDOM // For now, this is true - might change in the future.
2824
-
2825
- };
2826
-
2827
- module.exports = ExecutionEnvironment;
2828
-
2829
- /***/ },
2830
- /* 36 */
2831
- /***/ function(module, exports, __webpack_require__) {
2832
-
2833
- /**
2834
- * Copyright 2014-2015, Facebook, Inc.
2835
- * All rights reserved.
2836
- *
2837
- * This source code is licensed under the BSD-style license found in the
2838
- * LICENSE file in the root directory of this source tree. An additional grant
2839
- * of patent rights can be found in the PATENTS file in the same directory.
2840
- *
2841
- * @providesModule warning
2842
- */
2843
-
2844
- "use strict";
2845
-
2846
- var emptyFunction = __webpack_require__(40);
2847
-
2848
- /**
2849
- * Similar to invariant but only logs a warning if the condition is not met.
2850
- * This can be used to log issues in development environments in critical
2851
- * paths. Removing the logging code for production environments will keep the
2852
- * same logic and follow the same code paths.
2853
- */
2854
-
2855
- var warning = emptyFunction;
2856
-
2857
- if (false) {
2858
- warning = function (condition, format) {
2859
- for (var args = [], $__0 = 2, $__1 = arguments.length; $__0 < $__1; $__0++) args.push(arguments[$__0]);
2860
- if (format === undefined) {
2861
- throw new Error("`warning(condition, format, ...args)` requires a warning " + "message argument");
2862
- }
2863
-
2864
- if (format.length < 10 || /^[s\W]*$/.test(format)) {
2865
- throw new Error("The warning format should be able to uniquely identify this " + "warning. Please, use a more descriptive format than: " + format);
2866
- }
2867
-
2868
- if (format.indexOf("Failed Composite propType: ") === 0) {
2869
- return; // Ignore CompositeComponent proptype check.
2870
- }
2871
-
2872
- if (!condition) {
2873
- var argIndex = 0;
2874
- var message = "Warning: " + format.replace(/%s/g, function () {
2875
- return args[argIndex++];
2876
- });
2877
- console.warn(message);
2878
- try {
2879
- // --- Welcome to debugging React ---
2880
- // This error was thrown as a convenience so that you can use this stack
2881
- // to find the callsite that caused this warning to fire.
2882
- throw new Error(message);
2883
- } catch (x) {}
2884
- }
2885
- };
2886
- }
2887
-
2888
- module.exports = warning;
2889
-
2890
- /***/ },
2891
- /* 37 */
2892
- /***/ function(module, exports, __webpack_require__) {
2893
-
2894
- 'use strict';
2895
-
2896
- var invariant = __webpack_require__(34);
2897
- var canUseDOM = __webpack_require__(35).canUseDOM;
2898
-
2899
- /**
2900
- * Returns the current scroll position of the window as { x, y }.
2901
- */
2902
- function getWindowScrollPosition() {
2903
- invariant(canUseDOM, 'Cannot get current scroll position without a DOM');
2904
-
2905
- return {
2906
- x: window.pageXOffset || document.documentElement.scrollLeft,
2907
- y: window.pageYOffset || document.documentElement.scrollTop
2908
- };
2909
- }
2910
-
2911
- module.exports = getWindowScrollPosition;
2912
-
2913
- /***/ },
2914
- /* 38 */
2915
- /***/ function(module, exports, __webpack_require__) {
2916
-
2917
- 'use strict';
2918
-
2919
- function ToObject(val) {
2920
- if (val == null) {
2921
- throw new TypeError('Object.assign cannot be called with null or undefined');
2922
- }
2923
-
2924
- return Object(val);
2925
- }
2926
-
2927
- module.exports = Object.assign || function (target, source) {
2928
- var from;
2929
- var keys;
2930
- var to = ToObject(target);
2931
-
2932
- for (var s = 1; s < arguments.length; s++) {
2933
- from = arguments[s];
2934
- keys = Object.keys(Object(from));
2935
-
2936
- for (var i = 0; i < keys.length; i++) {
2937
- to[keys[i]] = from[keys[i]];
2938
- }
2939
- }
2940
-
2941
- return to;
2942
- };
2943
-
2944
- /***/ },
2945
- /* 39 */
2946
- /***/ function(module, exports, __webpack_require__) {
2947
-
2948
- 'use strict';
2949
-
2950
- module.exports = __webpack_require__(41);
2951
-
2952
- /***/ },
2953
- /* 40 */
2954
- /***/ function(module, exports, __webpack_require__) {
2955
-
2956
- /**
2957
- * Copyright 2013-2015, Facebook, Inc.
2958
- * All rights reserved.
2959
- *
2960
- * This source code is licensed under the BSD-style license found in the
2961
- * LICENSE file in the root directory of this source tree. An additional grant
2962
- * of patent rights can be found in the PATENTS file in the same directory.
2963
- *
2964
- * @providesModule emptyFunction
2965
- */
2966
-
2967
- "use strict";
2968
-
2969
- function makeEmptyFunction(arg) {
2970
- return function () {
2971
- return arg;
2972
- };
2973
- }
2974
-
2975
- /**
2976
- * This function accepts and discards inputs; it has no side effects. This is
2977
- * primarily useful idiomatically for overridable function endpoints which
2978
- * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
2979
- */
2980
- function emptyFunction() {}
2981
-
2982
- emptyFunction.thatReturns = makeEmptyFunction;
2983
- emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
2984
- emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
2985
- emptyFunction.thatReturnsNull = makeEmptyFunction(null);
2986
- emptyFunction.thatReturnsThis = function () {
2987
- return this;
2988
- };
2989
- emptyFunction.thatReturnsArgument = function (arg) {
2990
- return arg;
2991
- };
2992
-
2993
- module.exports = emptyFunction;
2994
-
2995
- /***/ },
2996
- /* 41 */
2997
- /***/ function(module, exports, __webpack_require__) {
2998
-
2999
- // Load modules
3000
-
3001
- 'use strict';
3002
-
3003
- var Stringify = __webpack_require__(42);
3004
- var Parse = __webpack_require__(43);
3005
-
3006
- // Declare internals
3007
-
3008
- var internals = {};
3009
-
3010
- module.exports = {
3011
- stringify: Stringify,
3012
- parse: Parse
3013
- };
3014
-
3015
- /***/ },
3016
- /* 42 */
3017
- /***/ function(module, exports, __webpack_require__) {
3018
-
3019
- // Load modules
3020
-
3021
- 'use strict';
3022
-
3023
- var Utils = __webpack_require__(44);
3024
-
3025
- // Declare internals
3026
-
3027
- var internals = {
3028
- delimiter: '&',
3029
- arrayPrefixGenerators: {
3030
- brackets: function brackets(prefix, key) {
3031
- return prefix + '[]';
3032
- },
3033
- indices: function indices(prefix, key) {
3034
- return prefix + '[' + key + ']';
3035
- },
3036
- repeat: function repeat(prefix, key) {
3037
- return prefix;
3038
- }
3039
- }
3040
- };
3041
-
3042
- internals.stringify = function (obj, prefix, generateArrayPrefix) {
3043
-
3044
- if (Utils.isBuffer(obj)) {
3045
- obj = obj.toString();
3046
- } else if (obj instanceof Date) {
3047
- obj = obj.toISOString();
3048
- } else if (obj === null) {
3049
- obj = '';
3050
- }
3051
-
3052
- if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
3053
-
3054
- return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)];
3055
- }
3056
-
3057
- var values = [];
3058
-
3059
- if (typeof obj === 'undefined') {
3060
- return values;
3061
- }
3062
-
3063
- var objKeys = Object.keys(obj);
3064
- for (var i = 0, il = objKeys.length; i < il; ++i) {
3065
- var key = objKeys[i];
3066
- if (Array.isArray(obj)) {
3067
- values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix));
3068
- } else {
3069
- values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix));
3070
- }
3071
- }
3072
-
3073
- return values;
3074
- };
3075
-
3076
- module.exports = function (obj, options) {
3077
-
3078
- options = options || {};
3079
- var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
3080
-
3081
- var keys = [];
3082
-
3083
- if (typeof obj !== 'object' || obj === null) {
3084
-
3085
- return '';
3086
- }
3087
-
3088
- var arrayFormat;
3089
- if (options.arrayFormat in internals.arrayPrefixGenerators) {
3090
- arrayFormat = options.arrayFormat;
3091
- } else if ('indices' in options) {
3092
- arrayFormat = options.indices ? 'indices' : 'repeat';
3093
- } else {
3094
- arrayFormat = 'indices';
3095
- }
3096
-
3097
- var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
3098
-
3099
- var objKeys = Object.keys(obj);
3100
- for (var i = 0, il = objKeys.length; i < il; ++i) {
3101
- var key = objKeys[i];
3102
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix));
3103
- }
3104
-
3105
- return keys.join(delimiter);
3106
- };
3107
-
3108
- /***/ },
3109
- /* 43 */
3110
- /***/ function(module, exports, __webpack_require__) {
3111
-
3112
- // Load modules
3113
-
3114
- 'use strict';
3115
-
3116
- var Utils = __webpack_require__(44);
3117
-
3118
- // Declare internals
3119
-
3120
- var internals = {
3121
- delimiter: '&',
3122
- depth: 5,
3123
- arrayLimit: 20,
3124
- parameterLimit: 1000
3125
- };
3126
-
3127
- internals.parseValues = function (str, options) {
3128
-
3129
- var obj = {};
3130
- var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
3131
-
3132
- for (var i = 0, il = parts.length; i < il; ++i) {
3133
- var part = parts[i];
3134
- var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
3135
-
3136
- if (pos === -1) {
3137
- obj[Utils.decode(part)] = '';
3138
- } else {
3139
- var key = Utils.decode(part.slice(0, pos));
3140
- var val = Utils.decode(part.slice(pos + 1));
3141
-
3142
- if (Object.prototype.hasOwnProperty(key)) {
3143
- continue;
3144
- }
3145
-
3146
- if (!obj.hasOwnProperty(key)) {
3147
- obj[key] = val;
3148
- } else {
3149
- obj[key] = [].concat(obj[key]).concat(val);
3150
- }
3151
- }
3152
- }
3153
-
3154
- return obj;
3155
- };
3156
-
3157
- internals.parseObject = function (chain, val, options) {
3158
-
3159
- if (!chain.length) {
3160
- return val;
3161
- }
3162
-
3163
- var root = chain.shift();
3164
-
3165
- var obj = {};
3166
- if (root === '[]') {
3167
- obj = [];
3168
- obj = obj.concat(internals.parseObject(chain, val, options));
3169
- } else {
3170
- var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
3171
- var index = parseInt(cleanRoot, 10);
3172
- var indexString = '' + index;
3173
- if (!isNaN(index) && root !== cleanRoot && indexString === cleanRoot && index >= 0 && index <= options.arrayLimit) {
3174
-
3175
- obj = [];
3176
- obj[index] = internals.parseObject(chain, val, options);
3177
- } else {
3178
- obj[cleanRoot] = internals.parseObject(chain, val, options);
3179
- }
3180
- }
3181
-
3182
- return obj;
3183
- };
3184
-
3185
- internals.parseKeys = function (key, val, options) {
3186
-
3187
- if (!key) {
3188
- return;
3189
- }
3190
-
3191
- // The regex chunks
3192
-
3193
- var parent = /^([^\[\]]*)/;
3194
- var child = /(\[[^\[\]]*\])/g;
3195
-
3196
- // Get the parent
3197
-
3198
- var segment = parent.exec(key);
3199
-
3200
- // Don't allow them to overwrite object prototype properties
3201
-
3202
- if (Object.prototype.hasOwnProperty(segment[1])) {
3203
- return;
3204
- }
3205
-
3206
- // Stash the parent if it exists
3207
-
3208
- var keys = [];
3209
- if (segment[1]) {
3210
- keys.push(segment[1]);
3211
- }
3212
-
3213
- // Loop through children appending to the array until we hit depth
3214
-
3215
- var i = 0;
3216
- while ((segment = child.exec(key)) !== null && i < options.depth) {
3217
-
3218
- ++i;
3219
- if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
3220
- keys.push(segment[1]);
3221
- }
3222
- }
3223
-
3224
- // If there's a remainder, just add whatever is left
3225
-
3226
- if (segment) {
3227
- keys.push('[' + key.slice(segment.index) + ']');
3228
- }
3229
-
3230
- return internals.parseObject(keys, val, options);
3231
- };
3232
-
3233
- module.exports = function (str, options) {
3234
-
3235
- if (str === '' || str === null || typeof str === 'undefined') {
3236
-
3237
- return {};
3238
- }
3239
-
3240
- options = options || {};
3241
- options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;
3242
- options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;
3243
- options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;
3244
- options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;
3245
-
3246
- var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;
3247
- var obj = {};
3248
-
3249
- // Iterate over the keys and setup the new object
3250
-
3251
- var keys = Object.keys(tempObj);
3252
- for (var i = 0, il = keys.length; i < il; ++i) {
3253
- var key = keys[i];
3254
- var newObj = internals.parseKeys(key, tempObj[key], options);
3255
- obj = Utils.merge(obj, newObj);
3256
- }
3257
-
3258
- return Utils.compact(obj);
3259
- };
3260
-
3261
- /***/ },
3262
- /* 44 */
3263
- /***/ function(module, exports, __webpack_require__) {
3264
-
3265
- // Load modules
3266
-
3267
- // Declare internals
3268
-
3269
- 'use strict';
3270
-
3271
- var internals = {};
3272
-
3273
- exports.arrayToObject = function (source) {
3274
-
3275
- var obj = {};
3276
- for (var i = 0, il = source.length; i < il; ++i) {
3277
- if (typeof source[i] !== 'undefined') {
3278
-
3279
- obj[i] = source[i];
3280
- }
3281
- }
3282
-
3283
- return obj;
3284
- };
3285
-
3286
- exports.merge = function (target, source) {
3287
-
3288
- if (!source) {
3289
- return target;
3290
- }
3291
-
3292
- if (typeof source !== 'object') {
3293
- if (Array.isArray(target)) {
3294
- target.push(source);
3295
- } else {
3296
- target[source] = true;
3297
- }
3298
-
3299
- return target;
3300
- }
3301
-
3302
- if (typeof target !== 'object') {
3303
- target = [target].concat(source);
3304
- return target;
3305
- }
3306
-
3307
- if (Array.isArray(target) && !Array.isArray(source)) {
3308
-
3309
- target = exports.arrayToObject(target);
3310
- }
3311
-
3312
- var keys = Object.keys(source);
3313
- for (var k = 0, kl = keys.length; k < kl; ++k) {
3314
- var key = keys[k];
3315
- var value = source[key];
3316
-
3317
- if (!target[key]) {
3318
- target[key] = value;
3319
- } else {
3320
- target[key] = exports.merge(target[key], value);
3321
- }
3322
- }
3323
-
3324
- return target;
3325
- };
3326
-
3327
- exports.decode = function (str) {
3328
-
3329
- try {
3330
- return decodeURIComponent(str.replace(/\+/g, ' '));
3331
- } catch (e) {
3332
- return str;
3333
- }
3334
- };
3335
-
3336
- exports.compact = function (obj, refs) {
3337
-
3338
- if (typeof obj !== 'object' || obj === null) {
3339
-
3340
- return obj;
3341
- }
3342
-
3343
- refs = refs || [];
3344
- var lookup = refs.indexOf(obj);
3345
- if (lookup !== -1) {
3346
- return refs[lookup];
3347
- }
3348
-
3349
- refs.push(obj);
3350
-
3351
- if (Array.isArray(obj)) {
3352
- var compacted = [];
3353
-
3354
- for (var i = 0, il = obj.length; i < il; ++i) {
3355
- if (typeof obj[i] !== 'undefined') {
3356
- compacted.push(obj[i]);
3357
- }
3358
- }
3359
-
3360
- return compacted;
3361
- }
3362
-
3363
- var keys = Object.keys(obj);
3364
- for (i = 0, il = keys.length; i < il; ++i) {
3365
- var key = keys[i];
3366
- obj[key] = exports.compact(obj[key], refs);
3367
- }
3368
-
3369
- return obj;
3370
- };
3371
-
3372
- exports.isRegExp = function (obj) {
3373
- return Object.prototype.toString.call(obj) === '[object RegExp]';
3374
- };
3375
-
3376
- exports.isBuffer = function (obj) {
3377
-
3378
- if (obj === null || typeof obj === 'undefined') {
3379
-
3380
- return false;
3381
- }
3382
-
3383
- return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
3384
- };
3385
-
3386
- /***/ }
3387
- /******/ ])
3388
- });