From 76a08e3ccdf26f72bbea69ffb7032016298d49e5 Mon Sep 17 00:00:00 2001 From: Mehdi HosseinZade Date: Tue, 7 Feb 2023 02:54:56 +0330 Subject: [PATCH] feat(kit): add `addRouteMiddleware` method (#18553) --- docs/3.api/4.advanced/2.kit.md | 1 + packages/kit/src/pages.ts | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/docs/3.api/4.advanced/2.kit.md b/docs/3.api/4.advanced/2.kit.md index bd90611880..6eb63473e1 100644 --- a/docs/3.api/4.advanced/2.kit.md +++ b/docs/3.api/4.advanced/2.kit.md @@ -62,6 +62,7 @@ description: Nuxt Kit provides composable utilities to help interacting with Nux - `extendPages (callback: pages => void)` - `extendRouteRules (route: string, rule: NitroRouteConfig, options: ExtendRouteRulesOptions)` +- `addRouteMiddleware (input: NuxtMiddleware | NuxtMiddleware[], options: AddRouteMiddlewareOptions)` ### Plugins diff --git a/packages/kit/src/pages.ts b/packages/kit/src/pages.ts index 1bf33f4ef9..685c3b83b5 100644 --- a/packages/kit/src/pages.ts +++ b/packages/kit/src/pages.ts @@ -1,4 +1,4 @@ -import type { NuxtHooks } from '@nuxt/schema' +import type { NuxtHooks, NuxtMiddleware } from '@nuxt/schema' import type { NitroRouteConfig } from 'nitropack' import { defu } from 'defu' import { useNuxt } from './context' @@ -34,3 +34,31 @@ export function extendRouteRules (route: string, rule: NitroRouteConfig, options : defu(opts.routeRules[route], rule) } } + +export interface AddRouteMiddlewareOptions { + /** + * Override existing middleware with the same name, if it exists + * + * @default false + */ + override?: boolean +} + +export function addRouteMiddleware (input: NuxtMiddleware | NuxtMiddleware[], options: AddRouteMiddlewareOptions = {}) { + const nuxt = useNuxt() + const middlewares = Array.isArray(input) ? input : [input] + nuxt.hook('app:resolve', (app) => { + for (const middleware of middlewares) { + const find = app.middleware.findIndex(item => item.name === middleware.name) + if (find >= 0) { + if (options.override === true) { + app.middleware[find] = middleware + } else { + console.warn(`'${middleware.name}' middleware already exists at '${app.middleware[find].path}'. You can set \`override: true\` to replace it.`) + } + } else { + app.middleware.push(middleware) + } + } + }) +}