From 896dd04cd77570f784180a95f9bba6f37cc878bc Mon Sep 17 00:00:00 2001 From: Nathan Rajlich Date: Wed, 16 Nov 2022 09:33:17 -0800 Subject: [PATCH] [fs-detectors] Don't add "api/*" 404 route when only a middleware is present (#8920) This route should not be added when there are no explicit builds under the "api" directory. Fixes https://github.com/sveltejs/kit/issues/6777. --- packages/cli/test/unit/commands/build.test.ts | 21 +++++++++++------- packages/fs-detectors/src/detect-builders.ts | 5 ++++- .../unit.builds-and-routes-detector.test.ts | 22 ++++++++++++++----- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/cli/test/unit/commands/build.test.ts b/packages/cli/test/unit/commands/build.test.ts index a68d08da596..9669856264a 100644 --- a/packages/cli/test/unit/commands/build.test.ts +++ b/packages/cli/test/unit/commands/build.test.ts @@ -485,9 +485,12 @@ describe('build', () => { expect(config).toMatchObject({ version: 3, routes: [ - { src: '^/.*$', middlewarePath: 'middleware', continue: true }, - { handle: 'filesystem' }, - { src: '^/api(/.*)?$', status: 404 }, + { + src: '^/.*$', + middlewarePath: 'middleware', + override: true, + continue: true, + }, { handle: 'error' }, { status: 404, src: '^(?!/api).*$', dest: '/404.html' }, ], @@ -546,9 +549,12 @@ describe('build', () => { expect(config).toMatchObject({ version: 3, routes: [ - { src: '^/.*$', middlewarePath: 'middleware', continue: true }, - { handle: 'filesystem' }, - { src: '^/api(/.*)?$', status: 404 }, + { + src: '^/.*$', + middlewarePath: 'middleware', + override: true, + continue: true, + }, { handle: 'error' }, { status: 404, src: '^(?!/api).*$', dest: '/404.html' }, ], @@ -610,10 +616,9 @@ describe('build', () => { { src: '^\\/about(?:\\/((?:[^\\/#\\?]+?)(?:\\/(?:[^\\/#\\?]+?))*))?[\\/#\\?]?$|^\\/dashboard(?:\\/((?:[^\\/#\\?]+?)(?:\\/(?:[^\\/#\\?]+?))*))?[\\/#\\?]?$', middlewarePath: 'middleware', + override: true, continue: true, }, - { handle: 'filesystem' }, - { src: '^/api(/.*)?$', status: 404 }, { handle: 'error' }, { status: 404, src: '^(?!/api).*$', dest: '/404.html' }, ], diff --git a/packages/fs-detectors/src/detect-builders.ts b/packages/fs-detectors/src/detect-builders.ts index 4d9b42ca585..d7db5a3199f 100644 --- a/packages/fs-detectors/src/detect-builders.ts +++ b/packages/fs-detectors/src/detect-builders.ts @@ -1022,7 +1022,10 @@ function getRouteResult( rewriteRoutes.push(...dynamicRoutes); - if (typeof ignoreRuntimes === 'undefined') { + const hasApiBuild = apiBuilders.find(builder => { + return builder.src?.startsWith('api/'); + }); + if (typeof ignoreRuntimes === 'undefined' && hasApiBuild) { // This route is only necessary to hide the directory listing // to avoid enumerating serverless function names. // But it causes issues in `vc dev` for frameworks that handle diff --git a/packages/fs-detectors/test/unit.builds-and-routes-detector.test.ts b/packages/fs-detectors/test/unit.builds-and-routes-detector.test.ts index 328270998d0..c84bb1f5b9c 100644 --- a/packages/fs-detectors/test/unit.builds-and-routes-detector.test.ts +++ b/packages/fs-detectors/test/unit.builds-and-routes-detector.test.ts @@ -2235,9 +2235,14 @@ describe('Test `detectBuilders` with `featHandleMiss=true`', () => { it('no package.json + no build + root-level "middleware.js"', async () => { const files = ['middleware.js', 'index.html', 'web/middleware.js']; - const { builders, errors } = await detectBuilders(files, null, { - featHandleMiss, - }); + const { builders, rewriteRoutes, errors } = await detectBuilders( + files, + null, + { + featHandleMiss, + } + ); + expect(rewriteRoutes).toHaveLength(0); expect(builders![0].use).toBe('@vercel/node'); expect(builders![0].src).toBe('middleware.js'); expect(builders![0].config?.middleware).toEqual(true); @@ -2249,9 +2254,14 @@ describe('Test `detectBuilders` with `featHandleMiss=true`', () => { it('no package.json + no build + root-level "middleware.ts"', async () => { const files = ['middleware.ts', 'index.html', 'web/middleware.js']; - const { builders, errors } = await detectBuilders(files, null, { - featHandleMiss, - }); + const { builders, rewriteRoutes, errors } = await detectBuilders( + files, + null, + { + featHandleMiss, + } + ); + expect(rewriteRoutes).toHaveLength(0); expect(builders![0].use).toBe('@vercel/node'); expect(builders![0].src).toBe('middleware.ts'); expect(builders![0].config?.middleware).toEqual(true);