diff --git a/packages/next/src/server/serve-static.ts b/packages/next/src/server/serve-static.ts index e1458730df..4c35706417 100644 --- a/packages/next/src/server/serve-static.ts +++ b/packages/next/src/server/serve-static.ts @@ -5,6 +5,7 @@ import send from 'next/dist/compiled/send' // Although "mime" has already add avif in version 2.4.7, "send" is still using mime@1.6.0 send.mime.define({ 'image/avif': ['avif'], + 'image/x-icns': ['icns'], }) export function serveStatic( diff --git a/test/integration/image-optimizer/app/public/test.icns b/test/integration/image-optimizer/app/public/test.icns new file mode 100644 index 0000000000..69b298b8ff Binary files /dev/null and b/test/integration/image-optimizer/app/public/test.icns differ diff --git a/test/integration/image-optimizer/app/public/test.pic b/test/integration/image-optimizer/app/public/test.pic new file mode 100644 index 0000000000..0381913632 Binary files /dev/null and b/test/integration/image-optimizer/app/public/test.pic differ diff --git a/test/integration/image-optimizer/test/util.ts b/test/integration/image-optimizer/test/util.ts index ef5ed4c8da..4a69b6f658 100644 --- a/test/integration/image-optimizer/test/util.ts +++ b/test/integration/image-optimizer/test/util.ts @@ -174,6 +174,43 @@ export function runTests(ctx) { expect(res.status).toBe(200) }) + it('should maintain icns', async () => { + const query = { w: ctx.w, q: 90, url: '/test.icns' } + const res = await fetchViaHTTP(ctx.appPort, '/_next/image', query, {}) + expect(res.status).toBe(200) + expect(res.headers.get('Content-Type')).toContain('image/x-icns') + expect(res.headers.get('Cache-Control')).toBe( + `public, max-age=${isDev ? 0 : minimumCacheTTL}, must-revalidate` + ) + expect(res.headers.get('Vary')).toBe('Accept') + expect(res.headers.get('etag')).toBeTruthy() + expect(res.headers.get('Content-Disposition')).toBe( + `${contentDispositionType}; filename="test.icns"` + ) + await expectWidth(res, 256) + }) + + it('should maintain pic/pct', async () => { + const query = { w: ctx.w, q: 90, url: '/test.pic' } + const res = await fetchViaHTTP(ctx.appPort, '/_next/image', query, {}) + expect(res.status).toBe(200) + expect(res.headers.get('Content-Type')).toContain('image/x-pict') + expect(res.headers.get('Cache-Control')).toBe( + `public, max-age=${isDev ? 0 : minimumCacheTTL}, must-revalidate` + ) + expect(res.headers.get('Vary')).toBe('Accept') + expect(res.headers.get('etag')).toBeTruthy() + expect(res.headers.get('Content-Disposition')).toBe( + `${contentDispositionType}; filename="test.pic"` + ) + const actual = await res.text() + const expected = await fs.readFile( + join(ctx.appDir, 'public', 'test.pic'), + 'utf8' + ) + expect(actual).toMatch(expected) + }) + it('should maintain animated gif', async () => { const query = { w: ctx.w, q: 90, url: '/animated.gif' } const res = await fetchViaHTTP(ctx.appPort, '/_next/image', query, {})