diff --git a/packages/next/next-server/server/image-optimizer.ts b/packages/next/next-server/server/image-optimizer.ts index 83314a2af466c3c..c0c2e023d7b01fc 100644 --- a/packages/next/next-server/server/image-optimizer.ts +++ b/packages/next/next-server/server/image-optimizer.ts @@ -30,7 +30,13 @@ export async function imageOptimizer( parsedUrl: UrlWithParsedQuery ) { const { nextConfig, distDir } = server - const { sizes = [], domains = [] } = nextConfig?.images || {} + const { sizes = [], domains = [], loader } = nextConfig?.images || {} + + if (loader !== 'default') { + await server.render404(req, res, parsedUrl) + return { finished: true } + } + const { headers } = req const { url, w, q } = parsedUrl.query const mimeType = mediaType(headers.accept, MIME_TYPES) || '' diff --git a/test/integration/image-optimizer/test/index.test.js b/test/integration/image-optimizer/test/index.test.js index 0ac1960dc091fbb..589480d4847de17 100644 --- a/test/integration/image-optimizer/test/index.test.js +++ b/test/integration/image-optimizer/test/index.test.js @@ -421,4 +421,29 @@ describe('Image Optimizer', () => { runTests({ w: size, isDev: false, domains }) }) + + describe('dev support next.config.js cloudinary loader', () => { + beforeAll(async () => { + const json = JSON.stringify({ + images: { + loader: 'cloudinary', + path: 'https://example.com/act123/', + }, + }) + nextConfig.replace('{ /* replaceme */ }', json) + appPort = await findPort() + app = await launchApp(appDir, appPort) + }) + afterAll(async () => { + await killApp(app) + nextConfig.restore() + await fs.remove(imagesDir) + }) + it('should 404 when loader is not default', async () => { + const query = { w: 320, q: 90, url: '/test.svg' } + const opts = { headers: { accept: 'image/webp' } } + const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) + expect(res.status).toBe(404) + }) + }) })