diff --git a/src/index.ts b/src/index.ts index f094bc1..5a82066 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,61 @@ -import { Route, NavigationGuardNext } from 'vue-router' +import { store } from '@/store' +import { + NavigationGuard, + NavigationGuardNext, + RouteLocationNormalized, +} from 'vue-router' -export default (datas?: any) => async (to: Route, from: Route, next: NavigationGuardNext) => { +// TODO: refactor +declare interface RouterMiddlewareContext { + store: typeof store +} - if (to.meta?.middleware?.length) { - const arr = to.meta.middleware - for (let index = 0; index < arr.length; index++) { - const method: Function = arr[index]; - const result = method({...datas, to, from, next}) - if (result === false) { - break +type RouterGuardCb = { + to: RouteLocationNormalized + from: RouteLocationNormalized + next: NavigationGuardNext +} + +type DefineRouterMiddleware = ( + ctx: Partial & RouterGuardCb +) => ReturnType | false + + +/** + * function helper for define types + * @example + * defineRouterMiddleware(({ from, to, store }) => { + * // code + * }) +**/ +export const defineRouterMiddleware = ( + m: DefineRouterMiddleware +): DefineRouterMiddleware => m + +declare module 'vue-router' { + interface RouteMeta { + middleware?: DefineRouterMiddleware[] + } +} + +export const routerMiddleware = + (ctx: Partial = {}) => + async ( + to: RouteLocationNormalized, + from: RouteLocationNormalized, + next: NavigationGuardNext + ) => { + if (to.meta?.middleware?.length) { + const arr = to.meta.middleware + for (let index = 0; index < arr.length; index++) { + const method = arr[index] + const result = method({ ...ctx, to, from, next }) + if (result === false) { + break + } } + return } - return - } - return next() -} \ No newline at end of file + return next() + }