Skip to content

Commit da7cf80

Browse files
authored
fix: support Nuxt 5 and Nitro 3 runtimes (#311)
1 parent 0199241 commit da7cf80

30 files changed

Lines changed: 8258 additions & 4255 deletions

devtools/lib/robots/state.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ export async function refreshProductionData() {
5353
// Try full debug endpoint first (requires debug: true in production)
5454
const remoteDebug: ProductionDebugResponse | null = await appFetch.value('/__robots__/debug-production.json', {
5555
query: { url: productionUrl.value, mode: 'debug' },
56-
}).catch(() => null)
56+
}).catch(() => {
57+
// Production sites may disable the debug route; the public endpoint below is the fallback.
58+
return null
59+
})
5760
if (remoteDebug && !remoteDebug.error && remoteDebug.hasRemoteDebug) {
5861
productionData.value = remoteDebug
5962
productionLoading.value = false

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
"dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxt-module-build build && nuxt prepare playground && pnpm run client:build",
5656
"release": "pnpm build && bumpp -x \"npx changelogen --output=CHANGELOG.md\"",
5757
"prepack": "pnpm run build",
58-
"test": "pnpm run prepare:fixtures && vitest",
58+
"test": "pnpm run prepare:fixtures && vitest && pnpm run test:attw && pnpm run test:nuxt5",
59+
"test:nuxt5": "pnpm pack --out test/fixtures/nuxt5/module.tgz && pnpm --dir test/fixtures/nuxt5 install --frozen-lockfile && pnpm --dir test/fixtures/nuxt5 test",
5960
"typecheck": "nuxt typecheck",
6061
"test:attw": "attw --pack"
6162
},
@@ -75,6 +76,7 @@
7576
"h3": "catalog:",
7677
"nuxt-site-config": "catalog:",
7778
"nuxtseo-shared": "catalog:",
79+
"ofetch": "catalog:",
7880
"pathe": "catalog:",
7981
"pkg-types": "catalog:",
8082
"ufo": "catalog:"

pnpm-lock.yaml

Lines changed: 3877 additions & 4152 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ minimumReleaseAgeExclude:
1414
- '@vue/server-renderer@3.5.38'
1515
- '@vue/shared@3.5.38'
1616
- vue@3.5.38
17-
- nuxt-site-config-kit@4.1.1
18-
- nuxt-site-config@4.1.1
19-
- site-config-stack@4.1.1
17+
- nuxt-site-config-kit@4.1.4
18+
- nuxt-site-config@4.1.4
19+
- site-config-stack@4.1.4
2020
- '@nuxt/kit@4.5.0'
2121
- '@nuxt/nitro-server@4.5.0'
2222
- '@nuxt/schema@4.5.0'
@@ -59,9 +59,10 @@ catalog:
5959
h3: ^1.15.11
6060
happy-dom: ^20.10.6
6161
nuxt: ^4.5.0
62-
nuxt-site-config: ^4.1.1
62+
nuxt-site-config: ^4.1.4
6363
nuxtseo-layer-devtools: ^5.3.2
64-
nuxtseo-shared: ^5.3.6
64+
nuxtseo-shared: ^5.3.8
65+
ofetch: ^1.5.1
6566
pathe: ^2.0.3
6667
pkg-types: ^2.3.1
6768
radix3: ^1.1.2

src/module.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import {
1313
defineNuxtModule,
1414
extendRouteRules,
1515
hasNuxtModule,
16+
resolveModule,
1617
} from '@nuxt/kit'
1718
import { installNuxtSiteConfig, updateSiteConfig } from 'nuxt-site-config/kit'
18-
import { useModuleLogger } from 'nuxtseo-shared/kit'
19+
import { setupNitroRuntimeCompatibility, useModuleLogger } from 'nuxtseo-shared/kit'
1920
import { relative } from 'pathe'
2021
import { readPackageJSON } from 'pkg-types'
2122
import { withoutTrailingSlash, withTrailingSlash } from 'ufo'
@@ -40,6 +41,7 @@ export type {
4041
HookRobotsTxtContext,
4142
PatternMapValue,
4243
RobotsContext,
44+
RobotsRouteRuleConfig,
4345
RobotsValue,
4446
} from './runtime/types'
4547

@@ -254,6 +256,8 @@ export default defineNuxtModule<ModuleOptions>({
254256
nuxt.options.nitro.alias['#internal/nuxt-robots'] = resolve('./runtime/server/mock-composables')
255257
return
256258
}
259+
const nitroCompatibility = setupNitroRuntimeCompatibility(nuxt)
260+
nuxt.options.nitro.alias!.ofetch ||= resolveModule('ofetch', { url: new URL(import.meta.url) })
257261

258262
// Allow `definePageMeta({ robots: false })` to set per-page robots rules
259263
nuxt.options.experimental.extraPageMetaExtractionKeys = nuxt.options.experimental.extraPageMetaExtractionKeys || []
@@ -535,7 +539,7 @@ export default defineNuxtModule<ModuleOptions>({
535539
nuxt.options.runtimeConfig.public['nuxt-robots'] = robotsRuntimeConfig as any
536540
})
537541

538-
registerTypeTemplates({ nuxt, config })
542+
registerTypeTemplates({ nitroCompatibility })
539543

540544
// only prerender for `nuxi generate`
541545
const isFirebase = nitroPreset === 'firebase'

src/runtime/server/composables/getBotDetection.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { H3Event } from 'h3'
1+
import type { H3Event } from '#nuxtseo/h3'
22
import { getBotDetection as getBotDetectionFromHeaders, getBotInfo as getBotInfoFromHeaders, isBot as isBotFromHeaders } from '@nuxtjs/robots/util'
3-
import { getHeaders } from 'h3'
4-
import { useNitroApp } from 'nitropack/runtime'
3+
import { getHeaders } from '#nuxtseo/h3'
4+
import { useNitroApp } from '#nuxtseo/nitro'
55

66
// Re-export the interface from util
77
export type { BotDetectionContext } from '@nuxtjs/robots/util'

src/runtime/server/composables/getPathRobotConfig.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import type { H3Event } from 'h3'
2-
import type { RobotsContext } from '../../types'
1+
import type { H3Event } from '#nuxtseo/h3'
2+
import type { RobotsContext, RobotsValue } from '../../types'
33
import { matchPathToRule, normaliseRobotsRouteRule } from '@nuxtjs/robots/util'
4-
import { getRequestHeader } from 'h3'
5-
import { useNitroApp, useRuntimeConfig } from 'nitropack/runtime'
64
import { createNitroRouteRuleMatcher } from 'nuxtseo-shared/server'
75
import { withoutTrailingSlash } from 'ufo'
6+
import { getRequestHeader } from '#nuxtseo/h3'
7+
import { useNitroApp, useRuntimeConfig } from '#nuxtseo/nitro'
88
import { getSiteRobotConfig } from './getSiteRobotConfig'
99
import { useRuntimeConfigNuxtRobots } from './useRuntimeConfigNuxtRobots'
1010

11+
interface RobotsRouteRules {
12+
robots?: RobotsValue | { indexable: boolean, rule: string }
13+
ssr?: boolean
14+
}
15+
1116
export function getPathRobotConfig(e: H3Event, options?: { userAgent?: string, skipSiteIndexable?: boolean, path?: string }): RobotsContext {
1217
const runtimeConfig = useRuntimeConfig(e)
1318
// has already been resolved
@@ -109,7 +114,7 @@ export function getPathRobotConfig(e: H3Event, options?: { userAgent?: string, s
109114
}
110115

111116
// 4. nitro route rules
112-
nitroApp._robotsRuleMatcher = nitroApp._robotsRuleMatcher || createNitroRouteRuleMatcher(runtimeConfig)
117+
nitroApp._robotsRuleMatcher = nitroApp._robotsRuleMatcher || createNitroRouteRuleMatcher<RobotsRouteRules>(runtimeConfig)
113118
let robotRouteRules = nitroApp._robotsRuleMatcher(path)
114119
let routeRulesPath = path
115120
// if we're using i18n we need to strip leading prefixes so the rule will match

src/runtime/server/composables/getSiteRobotConfig.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { H3Event } from 'h3'
1+
import type { H3Event } from '#nuxtseo/h3'
22
import type { ParsedRobotsTxt } from '../../types'
3-
import { getQuery } from 'h3'
3+
import { getQuery } from '#nuxtseo/h3'
44
import { getSiteConfig } from '#site-config/server/composables'
55
import { getSiteIndexable } from '#site-config/server/composables/getSiteIndexable'
66
import { useRuntimeConfigNuxtRobots } from './useRuntimeConfigNuxtRobots'

src/runtime/server/composables/useRuntimeConfigNuxtRobots.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { H3Event } from 'h3'
1+
import type { H3Event } from '#nuxtseo/h3'
22
import type { NuxtRobotsRuntimeConfig } from '../../types'
3-
import { useRuntimeConfig } from 'nitropack/runtime'
3+
import { useRuntimeConfig } from '#nuxtseo/nitro'
44

55
export function useRuntimeConfigNuxtRobots(event?: H3Event): NuxtRobotsRuntimeConfig {
66
return useRuntimeConfig(event)['nuxt-robots'] as NuxtRobotsRuntimeConfig

src/runtime/server/middleware/injectContext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineEventHandler, getQuery, setHeader } from 'h3'
1+
import { defineEventHandler, getQuery, setHeader } from '#nuxtseo/h3'
22
import { getPathRobotConfig } from '../composables/getPathRobotConfig'
33
import { useRuntimeConfigNuxtRobots } from '../composables/useRuntimeConfigNuxtRobots'
44

0 commit comments

Comments
 (0)