import {RoutesRule, Router, routesMapRule} from '../options/base'; import {H5Config} from '../options/config'; import {warn} from './warn' import {getRoutePath} from './utils' export function createRouteMap( router: Router, routes: RoutesRule[], ): routesMapRule|never { const routesMap:routesMapRule = { finallyPathList: [], finallyPathMap: Object.create(null), aliasPathMap: Object.create(null), pathMap: Object.create(null), vueRouteMap: Object.create(null), nameMap: Object.create(null) } routes.forEach(route => { const { finallyPath, aliasPath, path} = getRoutePath(route, router); if (path == null) { throw new Error(`请提供一个完整的路由对象,包括以绝对路径开始的 ‘path’ 字符串 ${JSON.stringify(route)}`); } if (finallyPath instanceof Array) { if (!(router.options.h5 as H5Config).vueRouterDev && router.options.platform === 'h5') { throw new Error(`非 vueRouterDev 模式下,route.alias 目前无法提供数组类型! ${JSON.stringify(route)}`); } } const strFinallyPath = (finallyPath as string); const strAliasPath = (aliasPath as string); if (router.options.platform !== 'h5') { if (strFinallyPath.indexOf('/') !== 0 && path !== '*') { warn(`当前路由对象下,route:${JSON.stringify(route)} 是否缺少了前缀 ‘/’`, router, true); } } if (!routesMap.finallyPathMap[strFinallyPath]) { routesMap.finallyPathMap[strFinallyPath] = route; routesMap.aliasPathMap[strAliasPath] = route; routesMap.pathMap[path] = route; routesMap.finallyPathList.push(strFinallyPath); if (route.name != null) { routesMap.nameMap[route.name] = route; } } }) return routesMap; }