Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 56 additions & 13 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -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 {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this approach is not true. Because this line restricts the developer from being sent custom data to the middleware.

Copy link
Author

@reslear reslear Jun 17, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

of course, need like declare module 'name'
for example vue router meta

declare module 'vue-router' {
  interface RouteMeta {
    // is optional
    isAdmin?: boolean
    // must be declared by every route
    requiresAuth: boolean
  }
}

but i don't understand how it works, need investigate, maybe you help?

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<RouterMiddlewareContext> & RouterGuardCb
) => ReturnType<NavigationGuard> | 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<RouterMiddlewareContext> = {}) =>
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()
}
return next()
}