From 7069d10a47dc0bf67cc46c67d236f3e7ba7040b4 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 15:29:34 +0000 Subject: [PATCH 01/21] chore: disable trailing slash rule --- vercel.json | 1 - 1 file changed, 1 deletion(-) diff --git a/vercel.json b/vercel.json index cb99d8f75..b4b2a9a97 100644 --- a/vercel.json +++ b/vercel.json @@ -1,6 +1,5 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "trailingSlash": false, "redirects": [ { "source": "/(.*)", From 0a484dd02ed2d656fd96fed5ee2f3dc0b075f154 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 18:04:19 +0000 Subject: [PATCH 02/21] chore: enable trailing slash in nuxt config --- nuxt.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index e64c2a9ad..a23651cfb 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -86,6 +86,7 @@ export default defineNuxtConfig({ url: 'https://npmx.dev', name: 'npmx', description: 'A fast, modern browser for the npm registry', + trailingSlash: true, }, router: { From f471f07835ebf342a0dccc566b36e5ca9a8944cb Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 18:27:47 +0000 Subject: [PATCH 03/21] chore: enable trailing slash via middleware --- app/middleware/trailing-slash.global.ts | 6 ++---- nuxt.config.ts | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/middleware/trailing-slash.global.ts b/app/middleware/trailing-slash.global.ts index f0386e923..dee8aa6a5 100644 --- a/app/middleware/trailing-slash.global.ts +++ b/app/middleware/trailing-slash.global.ts @@ -8,12 +8,10 @@ * - /docs/getting-started/?query=value → /docs/getting-started?query=value */ export default defineNuxtRouteMiddleware(to => { - if (!import.meta.dev) return - - if (to.path !== '/' && to.path.endsWith('/')) { + if (to.path !== '' && !to.path.endsWith('/')) { return navigateTo( { - path: to.path.slice(0, -1), + path: to.path + '/', query: to.query, hash: to.hash, }, diff --git a/nuxt.config.ts b/nuxt.config.ts index a23651cfb..e64c2a9ad 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -86,7 +86,6 @@ export default defineNuxtConfig({ url: 'https://npmx.dev', name: 'npmx', description: 'A fast, modern browser for the npm registry', - trailingSlash: true, }, router: { From 28c6ff0ef4d02c556e5a8705248ae5b7ea8cb495 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 20:02:37 +0000 Subject: [PATCH 04/21] chore: improve trailing slash middleware --- app/middleware/trailing-slash.global.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/middleware/trailing-slash.global.ts b/app/middleware/trailing-slash.global.ts index dee8aa6a5..c666ea078 100644 --- a/app/middleware/trailing-slash.global.ts +++ b/app/middleware/trailing-slash.global.ts @@ -8,6 +8,13 @@ * - /docs/getting-started/?query=value → /docs/getting-started?query=value */ export default defineNuxtRouteMiddleware(to => { + if (import.meta.server) { + const event = useRequestEvent() + const url = event?.node.req.originalUrl || event?.node.req.url || '' + + if (url.includes('_payload')) return + } + if (to.path !== '' && !to.path.endsWith('/')) { return navigateTo( { From 63f5f8244e9e84004d04e532df9c9b712fd184f0 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 20:27:11 +0000 Subject: [PATCH 05/21] chore: improve version loading logic --- app/composables/npm/useResolvedVersion.ts | 24 +++++++++++------------ app/pages/package/[[org]]/[name].vue | 15 +++----------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/app/composables/npm/useResolvedVersion.ts b/app/composables/npm/useResolvedVersion.ts index 992ce62b7..98ee900c4 100644 --- a/app/composables/npm/useResolvedVersion.ts +++ b/app/composables/npm/useResolvedVersion.ts @@ -1,18 +1,18 @@ import type { ResolvedPackageVersion } from 'fast-npm-meta' -export function useResolvedVersion( +export async function useResolvedVersion( packageName: MaybeRefOrGetter, requestedVersion: MaybeRefOrGetter, ) { - return useFetch( - () => { - const version = toValue(requestedVersion) - return version - ? `https://npm.antfu.dev/${toValue(packageName)}@${version}` - : `https://npm.antfu.dev/${toValue(packageName)}` - }, - { - transform: (data: ResolvedPackageVersion) => data.version, - }, - ) + const versionData = useState('versionData') + + await callOnce(async () => { + const version = toValue(requestedVersion) + const name = toValue(packageName) + const url = version + ? `https://npm.antfu.dev/${name}@${version}` + : `https://npm.antfu.dev/${name}` + versionData.value = await $fetch(url).then(data => data.version) + }) + return versionData } diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index 1ded55a34..943aaa48f 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -194,18 +194,9 @@ const { data: skillsData } = useLazyFetch( const { data: packageAnalysis } = usePackageAnalysis(packageName, requestedVersion) const { data: moduleReplacement } = useModuleReplacement(packageName) -const { - data: resolvedVersion, - status: versionStatus, - error: versionError, -} = await useResolvedVersion(packageName, requestedVersion) - -if ( - versionStatus.value === 'error' && - versionError.value?.statusCode && - versionError.value.statusCode >= 400 && - versionError.value.statusCode < 500 -) { +const resolvedVersion = await useResolvedVersion(packageName, requestedVersion) + +if (resolvedVersion.value === null) { throw createError({ statusCode: 404, statusMessage: $t('package.not_found'), From 268874776b1bc0c1ea87f649882a7e9e0679cfcb Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 21:00:14 +0000 Subject: [PATCH 06/21] chore: disable fallback for packages --- nuxt.config.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index e64c2a9ad..378fbcb91 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -133,14 +133,14 @@ export default defineNuxtConfig({ }, }, // pages - '/package/:name': getISRConfig(60, { fallback: 'html' }), - '/package/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:name/v/:version': getISRConfig(60, { fallback: 'html' }), - '/package/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:org/:name': getISRConfig(60, { fallback: 'html' }), - '/package/:org/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:org/:name/v/:version': getISRConfig(60, { fallback: 'html' }), - '/package/:org/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:name': getISRConfig(60), + '/package/:name/_payload.json': getISRConfig(60), + '/package/:name/v/:version': getISRConfig(60), + '/package/:name/v/:version/_payload.json': getISRConfig(60), + '/package/:org/:name': getISRConfig(60), + '/package/:org/:name/_payload.json': getISRConfig(60), + '/package/:org/:name/v/:version': getISRConfig(60), + '/package/:org/:name/v/:version/_payload.json': getISRConfig(60), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From b219252d1244eba7a8c65883111a714509520b17 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 21:34:48 +0000 Subject: [PATCH 07/21] chore: rewrite version resolver --- app/composables/npm/useResolvedVersion.ts | 26 ++++++++++++----------- app/pages/package/[[org]]/[name].vue | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/composables/npm/useResolvedVersion.ts b/app/composables/npm/useResolvedVersion.ts index 98ee900c4..fda018525 100644 --- a/app/composables/npm/useResolvedVersion.ts +++ b/app/composables/npm/useResolvedVersion.ts @@ -1,18 +1,20 @@ import type { ResolvedPackageVersion } from 'fast-npm-meta' -export async function useResolvedVersion( +export function useResolvedVersion( packageName: MaybeRefOrGetter, requestedVersion: MaybeRefOrGetter, ) { - const versionData = useState('versionData') - - await callOnce(async () => { - const version = toValue(requestedVersion) - const name = toValue(packageName) - const url = version - ? `https://npm.antfu.dev/${name}@${version}` - : `https://npm.antfu.dev/${name}` - versionData.value = await $fetch(url).then(data => data.version) - }) - return versionData + return useAsyncData( + () => `resolved-version:${toValue(packageName)}:${toValue(requestedVersion) ?? 'latest'}`, + async () => { + const version = toValue(requestedVersion) + const name = toValue(packageName) + const url = version + ? `https://npm.antfu.dev/${name}@${version}` + : `https://npm.antfu.dev/${name}` + const data = await $fetch(url) + return data.version + }, + { default: () => null }, + ) } diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index 943aaa48f..9a253d08d 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -194,7 +194,7 @@ const { data: skillsData } = useLazyFetch( const { data: packageAnalysis } = usePackageAnalysis(packageName, requestedVersion) const { data: moduleReplacement } = useModuleReplacement(packageName) -const resolvedVersion = await useResolvedVersion(packageName, requestedVersion) +const { data: resolvedVersion } = await useResolvedVersion(packageName, requestedVersion) if (resolvedVersion.value === null) { throw createError({ From 9adacac4c0df130d0fafe3e3da8ddccfee2eac13 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Sun, 22 Feb 2026 21:35:19 +0000 Subject: [PATCH 08/21] chore: disable extra caching for payload routes --- nuxt.config.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 378fbcb91..a381f5b27 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -134,13 +134,9 @@ export default defineNuxtConfig({ }, // pages '/package/:name': getISRConfig(60), - '/package/:name/_payload.json': getISRConfig(60), '/package/:name/v/:version': getISRConfig(60), - '/package/:name/v/:version/_payload.json': getISRConfig(60), '/package/:org/:name': getISRConfig(60), - '/package/:org/:name/_payload.json': getISRConfig(60), '/package/:org/:name/v/:version': getISRConfig(60), - '/package/:org/:name/v/:version/_payload.json': getISRConfig(60), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From a6a922dfa6f9cc6e008083283a15bbf48c8e1473 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 15:00:27 +0000 Subject: [PATCH 09/21] fix: disable trailing slash middleware --- app/middleware/trailing-slash.global.ts | 33 +++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/app/middleware/trailing-slash.global.ts b/app/middleware/trailing-slash.global.ts index c666ea078..595dee052 100644 --- a/app/middleware/trailing-slash.global.ts +++ b/app/middleware/trailing-slash.global.ts @@ -7,22 +7,23 @@ * - /package/vue/ → /package/vue * - /docs/getting-started/?query=value → /docs/getting-started?query=value */ -export default defineNuxtRouteMiddleware(to => { - if (import.meta.server) { - const event = useRequestEvent() - const url = event?.node.req.originalUrl || event?.node.req.url || '' +export default defineNuxtRouteMiddleware(() => { + // if (import.meta.server) { + // const event = useRequestEvent() + // const url = event?.node.req.originalUrl || event?.node.req.url || '' - if (url.includes('_payload')) return - } + // if (url.includes('_payload')) return + // } - if (to.path !== '' && !to.path.endsWith('/')) { - return navigateTo( - { - path: to.path + '/', - query: to.query, - hash: to.hash, - }, - { replace: true }, - ) - } + // if (to.path !== '' && !to.path.endsWith('/')) { + // return navigateTo( + // { + // path: to.path + '/', + // query: to.query, + // hash: to.hash, + // }, + // { replace: true }, + // ) + // } + return }) From 65ced9493a810c7d6dfddf9dae7051a8b42ba63b Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 15:12:14 +0000 Subject: [PATCH 10/21] fix: disable isr rules for package pages --- app/middleware/trailing-slash.global.ts | 30 ++++++++++--------------- nuxt.config.ts | 5 ----- vercel.json | 3 ++- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/app/middleware/trailing-slash.global.ts b/app/middleware/trailing-slash.global.ts index 595dee052..f0386e923 100644 --- a/app/middleware/trailing-slash.global.ts +++ b/app/middleware/trailing-slash.global.ts @@ -7,23 +7,17 @@ * - /package/vue/ → /package/vue * - /docs/getting-started/?query=value → /docs/getting-started?query=value */ -export default defineNuxtRouteMiddleware(() => { - // if (import.meta.server) { - // const event = useRequestEvent() - // const url = event?.node.req.originalUrl || event?.node.req.url || '' +export default defineNuxtRouteMiddleware(to => { + if (!import.meta.dev) return - // if (url.includes('_payload')) return - // } - - // if (to.path !== '' && !to.path.endsWith('/')) { - // return navigateTo( - // { - // path: to.path + '/', - // query: to.query, - // hash: to.hash, - // }, - // { replace: true }, - // ) - // } - return + if (to.path !== '/' && to.path.endsWith('/')) { + return navigateTo( + { + path: to.path.slice(0, -1), + query: to.query, + hash: to.hash, + }, + { replace: true }, + ) + } }) diff --git a/nuxt.config.ts b/nuxt.config.ts index a381f5b27..c3e67bb26 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -132,11 +132,6 @@ export default defineNuxtConfig({ allowQuery: ['q'], }, }, - // pages - '/package/:name': getISRConfig(60), - '/package/:name/v/:version': getISRConfig(60), - '/package/:org/:name': getISRConfig(60), - '/package/:org/:name/v/:version': getISRConfig(60), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, diff --git a/vercel.json b/vercel.json index b4b2a9a97..a72838625 100644 --- a/vercel.json +++ b/vercel.json @@ -1,5 +1,6 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", + "trailingSlash": false, "redirects": [ { "source": "/(.*)", @@ -9,7 +10,7 @@ "value": "chat.npmx.dev" } ], - "destination": "https://npmx.dev/recharging" + "destination": "https://discord.gg/x9KE5U2q8w" }, { "source": "/(.*)", From 0dd72f38a4be9f89a6bf60647573847e3c08fcb3 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 15:23:58 +0000 Subject: [PATCH 11/21] fix: check single rule for all package pages --- nuxt.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index c3e67bb26..da665e942 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -132,6 +132,8 @@ export default defineNuxtConfig({ allowQuery: ['q'], }, }, + // pages + '/package/**': getISRConfig(60), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From b28d4766c3aa404aaa1fad468d68a8ac2babbfb9 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 15:33:39 +0000 Subject: [PATCH 12/21] fix: restore recharging path --- vercel.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vercel.json b/vercel.json index a72838625..cb99d8f75 100644 --- a/vercel.json +++ b/vercel.json @@ -10,7 +10,7 @@ "value": "chat.npmx.dev" } ], - "destination": "https://discord.gg/x9KE5U2q8w" + "destination": "https://npmx.dev/recharging" }, { "source": "/(.*)", From f6df068a73bbc3de34e2e5981efeb752079a92f9 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 18:49:03 +0000 Subject: [PATCH 13/21] fix: add global fallback for package pages --- nuxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index da665e942..43027afdd 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -133,7 +133,7 @@ export default defineNuxtConfig({ }, }, // pages - '/package/**': getISRConfig(60), + '/package/**': getISRConfig(60, { fallback: 'html' }), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From 3e9476e5424a83de78178d9d1ab2b1025a0d048a Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 20:28:37 +0000 Subject: [PATCH 14/21] fix: check payload fallback --- nuxt.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index 43027afdd..062852db4 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -134,6 +134,7 @@ export default defineNuxtConfig({ }, // pages '/package/**': getISRConfig(60, { fallback: 'html' }), + '/package/**/_payload.json': getISRConfig(60, { fallback: 'json' }), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From 2f6763bb54929b05aec2c319c9d62137effff52b Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 20:32:02 +0000 Subject: [PATCH 15/21] fix: check payload fallback with exact rule --- nuxt.config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 062852db4..2719aea96 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -134,7 +134,10 @@ export default defineNuxtConfig({ }, // pages '/package/**': getISRConfig(60, { fallback: 'html' }), - '/package/**/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:org/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:org/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From 75d3d8d51f7dd4cb86b8c5afeabf0cda727d8cef Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 20:40:57 +0000 Subject: [PATCH 16/21] fix: return null as payload fallback --- modules/isr-fallback.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/isr-fallback.ts b/modules/isr-fallback.ts index 097bfe467..69cc20edd 100644 --- a/modules/isr-fallback.ts +++ b/modules/isr-fallback.ts @@ -31,7 +31,7 @@ export default defineNuxtModule({ const outputPath = resolve(nitro.options.output.serverDir, '..', path, htmlFallback) mkdirSync(resolve(nitro.options.output.serverDir, '..', path), { recursive: true }) writeFileSync(outputPath, spaTemplate) - writeFileSync(outputPath.replace(htmlFallback, jsonFallback), '{}') + writeFileSync(outputPath.replace(htmlFallback, jsonFallback), 'null') } }) }) From 0f52cb21f10fe4878ea8056dfbb0f119ceaff5d6 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 20:51:05 +0000 Subject: [PATCH 17/21] fix: return 400 error for initial payload --- modules/isr-fallback.ts | 2 +- nuxt.config.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/isr-fallback.ts b/modules/isr-fallback.ts index 69cc20edd..097bfe467 100644 --- a/modules/isr-fallback.ts +++ b/modules/isr-fallback.ts @@ -31,7 +31,7 @@ export default defineNuxtModule({ const outputPath = resolve(nitro.options.output.serverDir, '..', path, htmlFallback) mkdirSync(resolve(nitro.options.output.serverDir, '..', path), { recursive: true }) writeFileSync(outputPath, spaTemplate) - writeFileSync(outputPath.replace(htmlFallback, jsonFallback), 'null') + writeFileSync(outputPath.replace(htmlFallback, jsonFallback), '{}') } }) }) diff --git a/nuxt.config.ts b/nuxt.config.ts index 2719aea96..f6bd9e84f 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -364,6 +364,7 @@ function getISRConfig(expirationSeconds: number, options: ISRConfigOptions = {}) fallback: options.fallback === 'html' ? 'spa.prerender-fallback.html' : 'payload-fallback.json', initialHeaders: options.fallback === 'json' ? { 'content-type': 'application/json' } : {}, + initialStatus: options.fallback === 'json' ? 400 : undefined, } as { expiration: number }, } } From acdfd3ac81a88efb4611f3f84c9b429f3634be6c Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 20:55:02 +0000 Subject: [PATCH 18/21] fix: return 404 error for initial payload --- nuxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index f6bd9e84f..85e32ef55 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -364,7 +364,7 @@ function getISRConfig(expirationSeconds: number, options: ISRConfigOptions = {}) fallback: options.fallback === 'html' ? 'spa.prerender-fallback.html' : 'payload-fallback.json', initialHeaders: options.fallback === 'json' ? { 'content-type': 'application/json' } : {}, - initialStatus: options.fallback === 'json' ? 400 : undefined, + initialStatus: options.fallback === 'json' ? 404 : undefined, } as { expiration: number }, } } From 8e061313ea06282db45cc7f217193984a9aa4df2 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 22:38:26 +0000 Subject: [PATCH 19/21] fix: disable fallback for package payloads --- nuxt.config.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 85e32ef55..0af6f0d61 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -134,10 +134,10 @@ export default defineNuxtConfig({ }, // pages '/package/**': getISRConfig(60, { fallback: 'html' }), - '/package/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:org/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), - '/package/:org/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:name/_payload.json': { isr: 60 }, + '/package/:name/v/:version/_payload.json': { isr: 60 }, + '/package/:org/:name/_payload.json': { isr: 60 }, + '/package/:org/:name/v/:version/_payload.json': { isr: 60 }, // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, @@ -364,7 +364,6 @@ function getISRConfig(expirationSeconds: number, options: ISRConfigOptions = {}) fallback: options.fallback === 'html' ? 'spa.prerender-fallback.html' : 'payload-fallback.json', initialHeaders: options.fallback === 'json' ? { 'content-type': 'application/json' } : {}, - initialStatus: options.fallback === 'json' ? 404 : undefined, } as { expiration: number }, } } From 97d31e368479568115079ee0db9c93d0d88b3bc7 Mon Sep 17 00:00:00 2001 From: Vordgi Date: Mon, 23 Feb 2026 23:08:04 +0000 Subject: [PATCH 20/21] fix: disable fallback for package payloads --- nuxt.config.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 0af6f0d61..da665e942 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -133,11 +133,7 @@ export default defineNuxtConfig({ }, }, // pages - '/package/**': getISRConfig(60, { fallback: 'html' }), - '/package/:name/_payload.json': { isr: 60 }, - '/package/:name/v/:version/_payload.json': { isr: 60 }, - '/package/:org/:name/_payload.json': { isr: 60 }, - '/package/:org/:name/v/:version/_payload.json': { isr: 60 }, + '/package/**': getISRConfig(60), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, From 6d53ce09b85cc9b64bafd76843a58549d2270eea Mon Sep 17 00:00:00 2001 From: Vordgi Date: Tue, 24 Feb 2026 09:50:45 +0000 Subject: [PATCH 21/21] fix: restore fallbacks for package pages --- nuxt.config.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index da665e942..2719aea96 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -133,7 +133,11 @@ export default defineNuxtConfig({ }, }, // pages - '/package/**': getISRConfig(60), + '/package/**': getISRConfig(60, { fallback: 'html' }), + '/package/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:org/:name/_payload.json': getISRConfig(60, { fallback: 'json' }), + '/package/:org/:name/v/:version/_payload.json': getISRConfig(60, { fallback: 'json' }), // infinite cache (versioned - doesn't change) '/package-code/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } }, '/package-docs/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },