text: import { createElement } from 'react';
  import dynamic from 'dva/dynamic';
  import pathToRegexp from 'path-to-regexp';
  import { getMenuData } from './bec_menu';
  
  let routerDataCache;
  
  const modelNotExisted = (app, model) => (
    // eslint-disable-next-line
    !app._models.some(({ namespace }) => {
      return namespace === model.substring(model.lastIndexOf('/') + 1);
    })
  );
  
  // wrapper of dynamic
  const dynamicWrapper = (app, models, component) => {
    // () => require('module')
    // transformed by babel-plugin-dynamic-import-node-sync
    if (component.toString().indexOf('.then(') < 0) {
      models.forEach((model) => {
        if (modelNotExisted(app, model)) {
          // eslint-disable-next-line
          app.model(require(`../models/${model}`).default);
        }
      });
      return (props) => {
        if (!routerDataCache) {
          routerDataCache = getRouterData(app);
        }
        return createElement(component().default, {
          ...props,
          routerData: routerDataCache,
        });
      };
    }
    // () => import('module')
    return dynamic({
      app,
      models: () => models.filter(
        model => modelNotExisted(app, model)).map(m => import(`../models/${m}.js`)
      ),
      // add routerData prop
      component: () => {
        if (!routerDataCache) {
          routerDataCache = getRouterData(app);
        }
        return component().then((raw) => {
          const Component = raw.default || raw;
          return props => createElement(Component, {
            ...props,
            routerData: routerDataCache,
          });
        });
      },
    });
  };
  
  function getFlatMenuData(menus) {
    let keys = {};
    menus.forEach((item) => {
      if (item.children) {
        keys[item.path] = { ...item };
        keys = { ...keys, ...getFlatMenuData(item.children) };
      } else {
        keys[item.path] = { ...item };
      }
    });
    return keys;
  }
  
  export const getRouterData = (app) => {
    const routerConfig = {
      '/': {
        component: dynamicWrapper(app, ['account', 'login'], () => import('../layouts/BecLayout')),
      },
      '/dashboard/workspace': {
        component: dynamicWrapper(app, ['project', 'activities', 'chart'], () => import('../routes/Dashboard/Workspace')),
      },
      '/dashboard/analysis': {
        component: dynamicWrapper(app, ['chart'], () => import('../routes/Dashboard/Analysis')),
      },
      '/dashboard/monitor': {
        component: dynamicWrapper(app, ['monitor'], () => import('../routes/Dashboard/Monitor')),
      },
      '/dashboard/workplace': {
        component: dynamicWrapper(app, ['project', 'activities', 'chart'], () => import('../routes/Dashboard/Workplace')),
        // hideInBreadcrumb: true,
        // name: '工作台',
        // authority: 'admin',
      },
      '/form/basic-form': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/BasicForm')),
      },
      '/form/step-form': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm')),
      },
      '/form/step-form/info': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step1')),
      },
      '/form/step-form/confirm': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step2')),
      },
      '/form/step-form/result': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step3')),
      },
      '/form/advanced-form': {
        component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/AdvancedForm')),
      },
      '/list/table-list': {
        component: dynamicWrapper(app, ['rule'], () => import('../routes/List/TableList')),
      },
      '/list/basic-list': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/BasicList')),
      },
      '/list/card-list': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/CardList')),
      },
      '/list/search': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/List')),
      },
      '/list/search/projects': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/Projects')),
      },
      '/list/search/applications': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/Applications')),
      },
      '/list/search/articles': {
        component: dynamicWrapper(app, ['list'], () => import('../routes/List/Articles')),
      },
      '/profile/basic': {
        component: dynamicWrapper(app, ['profile'], () => import('../routes/Profile/BasicProfile')),
      },
      '/profile/advanced': {
        component: dynamicWrapper(app, ['profile'], () => import('../routes/Profile/AdvancedProfile')),
      },
      '/result/success': {
        component: dynamicWrapper(app, [], () => import('../routes/Result/Success')),
      },
      '/result/fail': {
        component: dynamicWrapper(app, [], () => import('../routes/Result/Error')),
      },
      '/exception/403': {
        component: dynamicWrapper(app, [], () => import('../routes/Exception/403')),
      },
      '/exception/404': {
        component: dynamicWrapper(app, [], () => import('../routes/Exception/404')),
      },
      '/exception/500': {
        component: dynamicWrapper(app, [], () => import('../routes/Exception/500')),
      },
      '/exception/trigger': {
        component: dynamicWrapper(app, ['error'], () => import('../routes/Exception/triggerException')),
      },
      '/user': {
        component: dynamicWrapper(app, [], () => import('../layouts/UserLayout')),
      },
      '/user/login': {
        component: dynamicWrapper(app, ['login'], () => import('../routes/User/Login')),
      },
      '/user/register': {
        component: dynamicWrapper(app, ['register'], () => import('../routes/User/Register')),
      },
      '/user/register-result': {
        component: dynamicWrapper(app, [], () => import('../routes/User/RegisterResult')),
      },
      // '/user/:id': {
      //   component: dynamicWrapper(app, [], () => import('../routes/User/SomeComponent')),
      // },
      '/account': {
        component: dynamicWrapper(app, [], () => import('../layouts/AccountLayout')),
      },
      '/account/login': {
        component: dynamicWrapper(app, ['login'], () => import('../routes/Account/Login')),
      },
      '/account/signup': {
        component: dynamicWrapper(app, ['signup'], () => import('../routes/Account/Signup')),
      },
      '/account/signup-result': {
        component: dynamicWrapper(app, [], () => import('../routes/Account/SignupResult')),
      },
      '/account/forgetpassword': {
        component: dynamicWrapper(app, ['forgetpassword'], () => import('../routes/Account/ForgetPassword')),
      },
      '/account/forgetpassword/info': {
        component: dynamicWrapper(app, ['forgetpassword'], () => import('../routes/Account/ForgetPassword/Step1')),
      },
      '/account/forgetpassword/confirm': {
        component: dynamicWrapper(app, ['forgetpassword'], () => import('../routes/Account/ForgetPassword/Step2')),
      },
      '/account/forgetpassword/result': {
        component: dynamicWrapper(app, ['forgetpassword'], () => import('../routes/Account/ForgetPassword/Step3')),
      },
      '/personal/setting': {
        component: dynamicWrapper(app, ['account'], () => import('../routes/Personal/Setting')),
      },
      '/apps/bec/request_password_reset': {
        component: dynamicWrapper(app, ['forgetpassword'], () => import('../routes/Account/ForgetPassword/ReceivePasswordReset')),
      },
      '/account/verify-result': {
        component: dynamicWrapper(app, [], () => import('../routes/Account/VerifyEmail')),
      },
      '/apps/bec/verify_email': {
        component: dynamicWrapper(app, ['account'], () => import('../routes/Account/VerifyEmail')),
      },
      '/system/user': {
        component: dynamicWrapper(app, ['user'], () => import('../routes/System/User')),
      },
      '/humanresources/employee': {
        component: dynamicWrapper(app, [], () => import('../routes/HumanResources/Employee')),
      },
      '/analysis/analysissetting': {
        component: dynamicWrapper(app, ['analysis'], () => import('../routes/Analysis/AnalysisSetting')),
      },
      '/basic/city': {
        component: dynamicWrapper(app, ['city'], () => import('../routes/Basic/City/City')),
      },
      '/basic/region': {
        component: dynamicWrapper(app, ['region'], () => import('../routes/Basic/Region/Region')),
      },
      '/basic/district': {
        component: dynamicWrapper(app, ['district'], () => import('../routes/Basic/District/District')),
      },
      '/basic/shop': {
        component: dynamicWrapper(app, ['shop'], () => import('../routes/Basic/Shop/Shop')),
      },
      '/basic/brand': {
        component: dynamicWrapper(app, ['brand'], () => import('../routes/Basic/Brand/Brand')),
      },
    };
    // Get name from ./menu.js or just set it in the router data.
    const menuData = getFlatMenuData(getMenuData());
  
    // Route configuration data
    // eg. {name,authority ...routerConfig }
    const routerData = {};
    // The route matches the menu
    Object.keys(routerConfig).forEach((path) => {
      // Regular match item name
      // eg.  router /user/:id === /user/chen
      const pathRegexp = pathToRegexp(path);
      const menuKey = Object.keys(menuData).find(key => pathRegexp.test(`/${key}`));
      let menuItem = {};
      // If menuKey is not empty
      if (menuKey) {
        menuItem = menuData[menuKey];
      }
      let router = routerConfig[path];
      // If you need to configure complex parameter routing,
      // https://github.com/ant-design/ant-design-pro-site/blob/master/docs/router-and-nav.md#%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E8%B7%AF%E7%94%B1%E8%8F%9C%E5%8D%95
      // eg . /list/:type/user/info/:id
      router = {
        ...router,
        name: router.name || menuItem.name,
        authority: router.authority || menuItem.authority,
      };
      routerData[path] = router;
    });
    return routerData;
  };
  