diff --git a/src/runtime/image.ts b/src/runtime/image.ts index 4bd0ba6db..18ed63740 100644 --- a/src/runtime/image.ts +++ b/src/runtime/image.ts @@ -91,6 +91,24 @@ function resolveImage(ctx: ImageCTX, input: string, options: ImageOptions): Reso } const _options = defu(options, preset, defaults as Partial) + + // 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 + 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 + _options.modifiers.quality = (finalFormat && qualityMap[finalFormat]) || qualityMap.default + } + const resolvedOptions = { ..._options, modifiers: { diff --git a/src/runtime/utils/props.ts b/src/runtime/utils/props.ts index dee657590..bfaed2f06 100644 --- a/src/runtime/utils/props.ts +++ b/src/runtime/utils/props.ts @@ -54,7 +54,7 @@ export const useImageProps = (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 diff --git a/src/types/image.ts b/src/types/image.ts index ae0f06ffc..777a5da8d 100644 --- a/src/types/image.ts +++ b/src/types/image.ts @@ -24,7 +24,9 @@ export interface ImageOptions> - & ('modifiers' extends keyof ConfiguredImageProviders[Provider] ? ConfiguredImageProviders[Provider]['modifiers'] : Record) + & ('modifiers' extends keyof ConfiguredImageProviders[Provider] + ? ConfiguredImageProviders[Provider]['modifiers'] + : Record) sizes?: string | Record } @@ -61,7 +63,7 @@ export interface CreateImageOptions { domains: string[] densities: number[] format: string[] - quality?: number + quality?: number | Record runtimeConfig: RuntimeConfig } diff --git a/test/unit/bundle.test.ts b/test/unit/bundle.test.ts index c1fe86f7c..6959538f7 100644 --- a/test/unit/bundle.test.ts +++ b/test/unit/bundle.test.ts @@ -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"`) }) })