diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index f2d134ec840..70d6c0dbb2e 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -130,11 +130,17 @@ export async function buildClient (ctx: ViteBuildContext) { next() } }) + const viteMiddleware = defineEventHandler(async (event) => { // Workaround: vite devmiddleware modifies req.url const originalURL = event.node.req.url! - // @ts-expect-error _skip_transform is a private property - event.node.req._skip_transform = !originalURL.startsWith(clientConfig.base!) + + const viteRoutes = viteServer.middlewares.stack.map(m => m.route).filter(r => r.length > 1) + if (!originalURL.startsWith(clientConfig.base!) && !viteRoutes.some(route => originalURL.startsWith(route))) { + // @ts-expect-error _skip_transform is a private property + event.node.req._skip_transform = true + } + await new Promise((resolve, reject) => { viteServer.middlewares.handle(event.node.req, event.node.res, (err: Error) => { event.node.req.url = originalURL diff --git a/test/basic.test.ts b/test/basic.test.ts index 2f2e0706c5d..8c812130dc1 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -894,6 +894,16 @@ describe('component islands', () => { }) }) +describe.runIf(process.env.NUXT_TEST_DEV && !process.env.TEST_WITH_WEBPACK)('vite plugins', () => { + it('does not override vite plugins', async () => { + expect(await $fetch('/vite-plugin-without-path')).toBe('vite-plugin without path') + expect(await $fetch('/__nuxt-test')).toBe('vite-plugin with __nuxt prefix') + }) + it('does not allow direct access to nuxt source folder', async () => { + expect(await $fetch('/app.config')).toContain('404') + }) +}) + describe.skipIf(process.env.NUXT_TEST_DEV || isWindows)('payload rendering', () => { it('renders a payload', async () => { const payload = await $fetch('/random/a/_payload.js', { responseType: 'text' }) diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index 70e64e90497..7a89abf5607 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -100,6 +100,28 @@ export default defineNuxtConfig({ export: 'namedExport', filePath: '~/other-components-folder/named-export' }) + }, + 'vite:extendConfig' (config) { + config.plugins!.push({ + name: 'nuxt:server', + configureServer (server) { + server.middlewares.use((req, res, next) => { + if (req.url === '/vite-plugin-without-path') { + res.end('vite-plugin without path') + return + } + next() + }) + + server.middlewares.use((req, res, next) => { + if (req.url === '/__nuxt-test') { + res.end('vite-plugin with __nuxt prefix') + return + } + next() + }) + } + }) } }, experimental: {