Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix(next/image): use image-size as format detector
  • Loading branch information
styfle committed Aug 11, 2025
commit 6576968141f007e771b1925cfc0d3edd0148e39e
1 change: 1 addition & 0 deletions packages/next/src/compiled/image-detector/detector.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 14 additions & 5 deletions packages/next/src/server/image-optimizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type { IncomingMessage, ServerResponse } from 'http'
import { mediaType } from 'next/dist/compiled/@hapi/accept'
import contentDisposition from 'next/dist/compiled/content-disposition'
import imageSizeOf from 'next/dist/compiled/image-size'
import imageDetector from 'next/dist/compiled/image-detector'
import isAnimated from 'next/dist/compiled/is-animated'
import { join } from 'path'
import nodeUrl, { type UrlWithParsedQuery } from 'url'
Expand Down Expand Up @@ -232,11 +233,19 @@ export async function detectContentType(
return JP2
}

const sharp = getSharp(null)
const meta = await sharp(buffer)
.metadata()
.catch((_) => null)
switch (meta?.format) {
let format: import('sharp').Metadata['format'] | undefined
format = imageDetector.detector(buffer)

console.log('found format', format)
if (!format) {
const sharp = getSharp(null)
const meta = await sharp(buffer)
.metadata()
.catch((_) => null)
format = meta?.format
}

switch (format) {
case 'avif':
return AVIF
case 'webp':
Expand Down
10 changes: 10 additions & 0 deletions packages/next/taskfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,15 @@ export async function ncc_image_size(task, opts) {
.target('src/compiled/image-size')
}

// eslint-disable-next-line camelcase
externals['image-detector'] = 'next/dist/compiled/image-detector'
export async function ncc_image_detector(task, opts) {
await task
.source(relative(__dirname, require.resolve('image-size/dist/detector.js')))
.ncc({ packageName: 'image-size', externals })
.target('src/compiled/image-detector')
}

// eslint-disable-next-line camelcase
externals['@hapi/accept'] = 'next/dist/compiled/@hapi/accept'
export async function ncc_hapi_accept(task, opts) {
Expand Down Expand Up @@ -2281,6 +2290,7 @@ export async function ncc(task, opts) {
'ncc_p_queue',
'ncc_raw_body',
'ncc_image_size',
'ncc_image_detector',
'ncc_hapi_accept',
'ncc_commander',
'ncc_node_anser',
Expand Down
4 changes: 4 additions & 0 deletions packages/next/types/$$compiled.internal.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,10 @@ declare module 'next/dist/compiled/image-size' {
export = m
}

declare module 'next/dist/compiled/image-detector' {
export function detector(arr: Uint8Array): import('sharp').Metadata['format']
}

declare module 'next/dist/compiled/@hapi/accept' {
import m from '@hapi/accept'
export = m
Expand Down
Loading