diff --git a/docs/1.guide/2.routing.md b/docs/1.guide/2.routing.md index c0b3ac80f0..06936e5d67 100644 --- a/docs/1.guide/2.routing.md +++ b/docs/1.guide/2.routing.md @@ -212,6 +212,7 @@ You can define route handler meta at build-time using `defineRouteMeta` macro in ```ts [/api/test.ts] defineRouteMeta({ + openAPIEnabled: false, // defaults to true openAPI: { tags: ["test"], description: "Test route description", @@ -298,6 +299,7 @@ export default defineNitroConfig({ '/blog/**': { cache: { /* cache options*/ } }, '/assets/**': { headers: { 'cache-control': 's-maxage=0' } }, '/api/v1/**': { cors: true, headers: { 'access-control-allow-methods': 'GET' } }, + '/api/v1/admin/**': { openAPIEnabled: false }, '/old-page': { redirect: '/new-page' }, '/old-page/**': { redirect: '/new-page/**' }, '/proxy/example': { proxy: 'https://example.com' }, @@ -314,6 +316,7 @@ export default defineNuxtConfig({ '/blog/**': { cache: { /* cache options*/ } }, '/assets/**': { headers: { 'cache-control': 's-maxage=0' } }, '/api/v1/**': { cors: true, headers: { 'access-control-allow-methods': 'GET' } }, + '/api/v1/admin/**': { openAPIEnabled: false }, '/old-page': { redirect: '/new-page' }, '/old-page/**': { redirect: '/new-page/**' }, '/proxy/example': { proxy: 'https://example.com' }, diff --git a/docs/3.config/0.index.md b/docs/3.config/0.index.md index 984d60b08d..ddf0c2826a 100644 --- a/docs/3.config/0.index.md +++ b/docs/3.config/0.index.md @@ -379,6 +379,7 @@ routeRules: { '/blog/**': { cache: { /* cache options*/ } }, '/assets/**': { headers: { 'cache-control': 's-maxage=0' } }, '/api/v1/**': { cors: true, headers: { 'access-control-allow-methods': 'GET' } }, + '/api/v1/admin/**': { openAPIEnabled: false }, '/old-page': { redirect: '/new-page' }, // uses status code 307 (Temporary Redirect) '/old-page2': { redirect: { to:'/new-page2', statusCode: 301 } }, '/old-page/**': { redirect: '/new-page/**' }, diff --git a/src/runtime/internal/routes/openapi.ts b/src/runtime/internal/routes/openapi.ts index 6d5890ae5a..126ca3253a 100644 --- a/src/runtime/internal/routes/openapi.ts +++ b/src/runtime/internal/routes/openapi.ts @@ -11,6 +11,7 @@ import { joinURL } from "ufo"; import { defu } from "defu"; import { handlersMeta } from "#nitro-internal-virtual/server-handlers-meta"; import { useRuntimeConfig } from "../config"; +import { getRouteRulesForPath } from "../route-rules"; // Served as /_openapi.json export default eventHandler((event) => { @@ -55,6 +56,12 @@ function getHandlersMeta(): { let globals: OpenAPIGlobals = {}; for (const h of handlersMeta) { + const enabledInRouteMeta = h.meta && h.meta.openAPIEnabled; + const enabledInRouteRules = + h.route && getRouteRulesForPath(h.route).openAPIEnabled; + const openAPIEnabled = enabledInRouteMeta ?? enabledInRouteRules; + if (openAPIEnabled === false) continue; + const { route, parameters } = normalizeRoute(h.route || ""); const tags = defaultTags(h.route || ""); const method = (h.method || "get").toLowerCase() as Lowercase; diff --git a/src/types/handler.ts b/src/types/handler.ts index b207f29f70..0805505e47 100644 --- a/src/types/handler.ts +++ b/src/types/handler.ts @@ -9,6 +9,7 @@ export interface NitroRouteMeta { openAPI?: OperationObject & { $global: Pick; }; + openAPIEnabled?: boolean; } export interface NitroEventHandler { diff --git a/src/types/route-rules.ts b/src/types/route-rules.ts index 50771724b6..7d7b2445d9 100644 --- a/src/types/route-rules.ts +++ b/src/types/route-rules.ts @@ -11,6 +11,7 @@ export interface NitroRouteConfig { prerender?: boolean; proxy?: string | ({ to: string } & ProxyOptions); isr?: number /* expiration */ | boolean | VercelISRConfig; + openAPIEnabled?: boolean; // Shortcuts cors?: boolean;