import { Route } from 'vue-router' import { IMiddleware } from './middleware' const dynamicMiddleware = require.context( // 其组件目录的相对路径 './middleware', // 是否查询其子目录 false, // 匹配基础组件文件名的正则表达式 /\w+\.ts$/, ) const middlewareMap: { [key: string]: IMiddleware } = {} dynamicMiddleware.keys().map((fileName) => { // eslint-disable-next-line @typescript-eslint/naming-convention const MiddlewareFactory = dynamicMiddleware(fileName)?.default const instance: IMiddleware = new MiddlewareFactory() if (instance.name && typeof instance.resolve !== 'function') { // eslint-disable-next-line no-console console.error(`middleware should have 'name' property and 'resolve(from, to, next)' method.`) return } if (instance.name in middlewareMap) { // eslint-disable-next-line no-console console.error(`duplicate middleware name: '${instance.name}'`) } middlewareMap[instance.name] = instance }) /** * 运行中间件 * @param middleware * @param from * @param to * @param next */ export async function runMiddleware( middleware: string[], from: Route, to: Route, next: (param: unknown) => void, ): Promise { for (const middlewareName of middleware) { const instance = middlewareMap[middlewareName] if (!instance) { // eslint-disable-next-line no-console console.warn(`can not found middleware: '${middlewareName}'`) continue } await instance.resolve(from, to, next) } return }