text: 'use strict';
  
  exports.__esModule = true;
  
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  
  var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
  
  var _invariant = require('invariant');
  
  var _invariant2 = _interopRequireDefault(_invariant);
  
  var _react = require('react');
  
  var _react2 = _interopRequireDefault(_react);
  
  var _propTypes = require('prop-types');
  
  var _propTypes2 = _interopRequireDefault(_propTypes);
  
  var _createReactClass = require('create-react-class');
  
  var _createReactClass2 = _interopRequireDefault(_createReactClass);
  
  var _deprecateObjectProperties = require('./deprecateObjectProperties');
  
  var _deprecateObjectProperties2 = _interopRequireDefault(_deprecateObjectProperties);
  
  var _getRouteParams = require('./getRouteParams');
  
  var _getRouteParams2 = _interopRequireDefault(_getRouteParams);
  
  var _RouteUtils = require('./RouteUtils');
  
  var _routerWarning = require('./routerWarning');
  
  var _routerWarning2 = _interopRequireDefault(_routerWarning);
  
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  var array = _propTypes2.default.array,
      func = _propTypes2.default.func,
      object = _propTypes2.default.object;
  
  /**
   * A <RouterContext> renders the component tree for a given router state
   * and sets the history object and the current location in context.
   */
  
  var RouterContext = (0, _createReactClass2.default)({
    displayName: 'RouterContext',
  
  
    propTypes: {
      history: object,
      router: object.isRequired,
      location: object.isRequired,
      routes: array.isRequired,
      params: object.isRequired,
      components: array.isRequired,
      createElement: func.isRequired
    },
  
    getDefaultProps: function getDefaultProps() {
      return {
        createElement: _react2.default.createElement
      };
    },
  
  
    childContextTypes: {
      history: object,
      location: object.isRequired,
      router: object.isRequired
    },
  
    getChildContext: function getChildContext() {
      var _props = this.props,
          router = _props.router,
          history = _props.history,
          location = _props.location;
  
      if (!router) {
        process.env.NODE_ENV !== 'production' ? (0, _routerWarning2.default)(false, '`<RouterContext>` expects a `router` rather than a `history`') : void 0;
  
        router = _extends({}, history, {
          setRouteLeaveHook: history.listenBeforeLeavingRoute
        });
        delete router.listenBeforeLeavingRoute;
      }
  
      if (process.env.NODE_ENV !== 'production') {
        location = (0, _deprecateObjectProperties2.default)(location, '`context.location` is deprecated, please use a route component\'s `props.location` instead. http://tiny.cc/router-accessinglocation');
      }
  
      return { history: history, location: location, router: router };
    },
    createElement: function createElement(component, props) {
      return component == null ? null : this.props.createElement(component, props);
    },
    render: function render() {
      var _this = this;
  
      var _props2 = this.props,
          history = _props2.history,
          location = _props2.location,
          routes = _props2.routes,
          params = _props2.params,
          components = _props2.components;
  
      var element = null;
  
      if (components) {
        element = components.reduceRight(function (element, components, index) {
          if (components == null) return element; // Don't create new children; use the grandchildren.
  
          var route = routes[index];
          var routeParams = (0, _getRouteParams2.default)(route, params);
          var props = {
            history: history,
            location: location,
            params: params,
            route: route,
            routeParams: routeParams,
            routes: routes
          };
  
          if ((0, _RouteUtils.isReactChildren)(element)) {
            props.children = element;
          } else if (element) {
            for (var prop in element) {
              if (Object.prototype.hasOwnProperty.call(element, prop)) props[prop] = element[prop];
            }
          }
  
          if ((typeof components === 'undefined' ? 'undefined' : _typeof(components)) === 'object') {
            var elements = {};
  
            for (var key in components) {
              if (Object.prototype.hasOwnProperty.call(components, key)) {
                // Pass through the key as a prop to createElement to allow
                // custom createElement functions to know which named component
                // they're rendering, for e.g. matching up to fetched data.
                elements[key] = _this.createElement(components[key], _extends({
                  key: key }, props));
              }
            }
  
            return elements;
          }
  
          return _this.createElement(components, props);
        }, element);
      }
  
      !(element === null || element === false || _react2.default.isValidElement(element)) ? process.env.NODE_ENV !== 'production' ? (0, _invariant2.default)(false, 'The root route must render a single element') : (0, _invariant2.default)(false) : void 0;
  
      return element;
    }
  });
  
  exports.default = RouterContext;
  module.exports = exports['default'];