Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
18 changes: 18 additions & 0 deletions src/runtime/image.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,24 @@ function resolveImage(ctx: ImageCTX, input: string, options: ImageOptions): Reso
}

const _options = defu(options, preset, defaults as Partial<ImageOptions>)

// Determine the final format (might come from modifiers, defaults, or global config)
const finalFormat = (_options.modifiers?.format as string | undefined) || ctx.options.format?.[0]

if (!_options.modifiers?.quality && typeof ctx.options.quality === 'object') {
const qualityMap = ctx.options.quality as Record<string, number>
const mappedQuality = (finalFormat && qualityMap[finalFormat]) ?? qualityMap.default ?? Object.values(qualityMap)[0]
if (typeof mappedQuality === 'number') {
_options.modifiers = { ..._options.modifiers, quality: mappedQuality }
}
}

// Resolve quality: if it's an object (quality map), resolve to number based on format
if (_options.modifiers?.quality && typeof _options.modifiers.quality === 'object') {
const qualityMap = _options.modifiers.quality as Record<string, number>
_options.modifiers.quality = (finalFormat && qualityMap[finalFormat]) || qualityMap.default
}

const resolvedOptions = {
..._options,
modifiers: {
Expand Down
2 changes: 1 addition & 1 deletion src/runtime/utils/props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export const useImageProps = <Provider extends keyof ConfiguredImageProviders>(p
width: props.width,
height: props.height,
format: props.format,
quality: props.quality || $img.options.quality,
quality: props.quality ?? (typeof $img.options.quality === 'object' ? undefined : $img.options.quality),
background: props.background,
fit: props.fit,
} satisfies Partial<ImageModifiers>
Expand Down
6 changes: 4 additions & 2 deletions src/types/image.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ export interface ImageOptions<Provider extends keyof ConfiguredImageProviders =
preset?: string
densities?: string
modifiers?: Partial<Omit<ImageModifiers, 'format' | 'quality' | 'background' | 'fit'>>
& ('modifiers' extends keyof ConfiguredImageProviders[Provider] ? ConfiguredImageProviders[Provider]['modifiers'] : Record<string, unknown>)
& ('modifiers' extends keyof ConfiguredImageProviders[Provider]
? ConfiguredImageProviders[Provider]['modifiers']
: Record<string, unknown>)
sizes?: string | Record<string, any>
}

Expand Down Expand Up @@ -61,7 +63,7 @@ export interface CreateImageOptions {
domains: string[]
densities: number[]
format: string[]
quality?: number
quality?: number | Record<string, number>
runtimeConfig: RuntimeConfig
}

Expand Down
2 changes: 1 addition & 1 deletion test/unit/bundle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ describe.skipIf(process.env.ECOSYSTEM_CI || isWindows)('nuxt image bundle size',
}),
])

expect(roundToKilobytes(withImage.totalBytes - withoutImage.totalBytes)).toMatchInlineSnapshot(`"12.8k"`)
expect(roundToKilobytes(withImage.totalBytes - withoutImage.totalBytes)).toMatchInlineSnapshot(`"13.2k"`)
})
})

Expand Down
Loading