content: 'use strict';
  
  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; };
  
  export { isReactChildren };
  export { createRouteFromReactElement };
  export { createRoutesFromReactChildren };
  export { createRoutes };
  import React from 'react';
  import warning from './warning';
  
  function isValidChild(object) {
    return object == null || React.isValidElement(object);
  }
  
  function isReactChildren(object) {
    return isValidChild(object) || Array.isArray(object) && object.every(isValidChild);
  }
  
  function checkPropTypes(componentName, propTypes, props) {
    componentName = componentName || 'UnknownComponent';
  
    for (var propName in propTypes) {
      if (propTypes.hasOwnProperty(propName)) {
        var error = propTypes[propName](props, propName, componentName);
  
        /* istanbul ignore if: error logging */
        if (error instanceof Error) process.env.NODE_ENV !== 'production' ? warning(false, error.message) : undefined;
      }
    }
  }
  
  function createRoute(defaultProps, props) {
    return _extends({}, defaultProps, props);
  }
  
  function createRouteFromReactElement(element) {
    var type = element.type;
    var route = createRoute(type.defaultProps, element.props);
  
    if (type.propTypes) checkPropTypes(type.displayName || type.name, type.propTypes, route);
  
    if (route.children) {
      var childRoutes = createRoutesFromReactChildren(route.children, route);
  
      if (childRoutes.length) route.childRoutes = childRoutes;
  
      delete route.children;
    }
  
    return route;
  }
  
  /**
   * Creates and returns a routes object from the given ReactChildren. JSX
   * provides a convenient way to visualize how routes in the hierarchy are
   * nested.
   *
   *   import { Route, createRoutesFromReactChildren } from 'react-router'
   *   
   *   const routes = createRoutesFromReactChildren(
   *     <Route component={App}>
   *       <Route path="home" component={Dashboard}/>
   *       <Route path="news" component={NewsFeed}/>
   *     </Route>
   *   )
   *
   * Note: This method is automatically used when you provide <Route> children
   * to a <Router> component.
   */
  
  function createRoutesFromReactChildren(children, parentRoute) {
    var routes = [];
  
    React.Children.forEach(children, function (element) {
      if (React.isValidElement(element)) {
        // Component classes may have a static create* method.
        if (element.type.createRouteFromReactElement) {
          var route = element.type.createRouteFromReactElement(element, parentRoute);
  
          if (route) routes.push(route);
        } else {
          routes.push(createRouteFromReactElement(element));
        }
      }
    });
  
    return routes;
  }
  
  /**
   * Creates and returns an array of routes from the given object which
   * may be a JSX route, a plain object route, or an array of either.
   */
  
  function createRoutes(routes) {
    if (isReactChildren(routes)) {
      routes = createRoutesFromReactChildren(routes);
    } else if (routes && !Array.isArray(routes)) {
      routes = [routes];
    }
  
    return routes;
  }