validateRouteConfigMap.js 1.4 KB
import invariant from '../utils/invariant';

/**
 * Make sure the config passed e.g. to StackRouter, TabRouter has
 * the correct format, and throw a clear error if it doesn't.
 */
function validateRouteConfigMap(routeConfigs) {
  const routeNames = Object.keys(routeConfigs);
  invariant(routeNames.length > 0, 'Please specify at least one route when configuring a navigator.');

  routeNames.forEach(routeName => {
    const routeConfig = routeConfigs[routeName];

    if (!routeConfig.screen && !routeConfig.getScreen) {
      throw new Error(`Route '${routeName}' should declare a screen. ` + 'For example:\n\n' + "import MyScreen from './MyScreen';\n" + '...\n' + `${routeName}: {\n` + '  screen: MyScreen,\n' + '}');
    } else if (routeConfig.screen && routeConfig.getScreen) {
      throw new Error(`Route '${routeName}' should declare a screen or ` + 'a getScreen, not both.');
    }

    if (routeConfig.screen && typeof routeConfig.screen !== 'function' && typeof routeConfig.screen !== 'string') {
      throw new Error(`The component for route '${routeName}' must be a ` + 'React component. For example:\n\n' + "import MyScreen from './MyScreen';\n" + '...\n' + `${routeName}: {\n` + '  screen: MyScreen,\n' + '}\n\n' + 'You can also use a navigator:\n\n' + "import MyNavigator from './MyNavigator';\n" + '...\n' + `${routeName}: {\n` + '  screen: MyNavigator,\n' + '}');
    }
  });
}

export default validateRouteConfigMap;