From 9d4746e83fa7f5b2e4c0ae9868bb7a86523c8ead Mon Sep 17 00:00:00 2001 From: harlan Date: Mon, 4 Mar 2024 21:22:12 +1100 Subject: [PATCH] fix: support `/api` vue pages Fixes #232 --- .playground/nuxt.config.ts | 4 ++++ .playground/pages/api/foo.vue | 3 +++ .playground/server/api/prerendered.ts | 5 +++++ src/module.ts | 9 +++++++-- src/util/i18n.ts | 2 +- src/util/nuxtSitemap.ts | 4 +++- 6 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 .playground/pages/api/foo.vue create mode 100644 .playground/server/api/prerendered.ts diff --git a/.playground/nuxt.config.ts b/.playground/nuxt.config.ts index 1336c7b..6363b58 100644 --- a/.playground/nuxt.config.ts +++ b/.playground/nuxt.config.ts @@ -63,6 +63,7 @@ export default defineNuxtConfig({ '/should-be-in-sitemap', '/foo.bar/', '/test.doc', + '/api/prerendered', ], failOnError: false, }, @@ -141,6 +142,9 @@ export default defineNuxtConfig({ }, }, routeRules: { + '/api/prerendered': { + prerender: true, + }, '/secret': { index: false, }, diff --git a/.playground/pages/api/foo.vue b/.playground/pages/api/foo.vue new file mode 100644 index 0000000..bc429ea --- /dev/null +++ b/.playground/pages/api/foo.vue @@ -0,0 +1,3 @@ + diff --git a/.playground/server/api/prerendered.ts b/.playground/server/api/prerendered.ts new file mode 100644 index 0000000..836451b --- /dev/null +++ b/.playground/server/api/prerendered.ts @@ -0,0 +1,5 @@ +import { defineEventHandler } from 'h3' + +export default defineEventHandler(async () => { + return { foo: 'bar' } +}) diff --git a/src/module.ts b/src/module.ts index 076852f..bf588d7 100644 --- a/src/module.ts +++ b/src/module.ts @@ -80,7 +80,7 @@ export default defineNuxtModule({ defaults: {}, // index sitemap options filtering include: [], - exclude: ['/_nuxt/**', '/api/**'], + exclude: ['/_nuxt/**', '/_**'], // sources sources: [], excludeAppSources: [], @@ -516,7 +516,12 @@ declare module 'vue-router' { const prerenderUrlsFinal = [ ...prerenderUrls, ...((await nitroPromise)._prerenderedRoutes || []) - .filter(r => (!r.fileName || r.fileName.endsWith('.html')) && !r.route.endsWith('.html') && !r.route.startsWith('/api/')) + .filter((r) => { + // make sure it's not excluded + // search for just noindex in a robots meta tag + const isRobotsBlocking = r.contents?.match(/]+name="robots"[^>]+content="[^"]*noindex[^"]*"[^>]*>/) + return r.contentType === 'text/html' && !isRobotsBlocking + }) .map(r => r._sitemap), ] const pageSource = convertNuxtPagesToSitemapEntries(await pagesPromise, { diff --git a/src/util/i18n.ts b/src/util/i18n.ts index 97deafa..05e9a15 100644 --- a/src/util/i18n.ts +++ b/src/util/i18n.ts @@ -13,7 +13,7 @@ export interface StrategyProps { export function splitPathForI18nLocales(path: FilterInput, autoI18n: AutoI18nConfig) { const locales = autoI18n.strategy === 'prefix_except_default' ? autoI18n.locales.filter(l => l.code !== autoI18n.defaultLocale) : autoI18n.locales - if (typeof path !== 'string' || path.startsWith('/api') || path.startsWith('/_nuxt')) + if (typeof path !== 'string' || path.startsWith('/_')) return path const match = splitForLocales(path, locales.map(l => l.code)) const locale = match[0] diff --git a/src/util/nuxtSitemap.ts b/src/util/nuxtSitemap.ts index d9a25a8..2b81f70 100644 --- a/src/util/nuxtSitemap.ts +++ b/src/util/nuxtSitemap.ts @@ -155,6 +155,7 @@ export function convertNuxtPagesToSitemapEntries(pages: NuxtPage[], config: Nuxt } export function generateExtraRoutesFromNuxtConfig(nuxt: Nuxt = useNuxt()) { + const filterForValidPage = p => p && !extname(p) && !p.startsWith('/api/') && !p.startsWith('/_') const routeRules = Object.entries(nuxt.options.routeRules || {}) .filter(([k, v]) => { // make sure key doesn't use a wildcard and its not for a file @@ -166,8 +167,9 @@ export function generateExtraRoutesFromNuxtConfig(nuxt: Nuxt = useNuxt()) { return !v.redirect }) .map(([k]) => k) + .filter(filterForValidPage) // don't support files const prerenderUrls = (nuxt.options.nitro.prerender?.routes || []) - .filter(p => p && !extname(p) && !p.startsWith('/api/')) as string[] + .filter(filterForValidPage) as string[] return { routeRules, prerenderUrls } }