From eab180144d59658ab581d7e39421c623fb4076d9 Mon Sep 17 00:00:00 2001 From: Leon338 Date: Fri, 21 Nov 2025 00:01:45 +0100 Subject: [PATCH 1/3] feat: allow per-format quality settings --- src/runtime/image.ts | 10 ++++++++++ src/types/image.ts | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/runtime/image.ts b/src/runtime/image.ts index 4bd0ba6db..07b9fe344 100644 --- a/src/runtime/image.ts +++ b/src/runtime/image.ts @@ -91,6 +91,16 @@ 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]; + + // 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/types/image.ts b/src/types/image.ts index ae0f06ffc..86a9836b9 100644 --- a/src/types/image.ts +++ b/src/types/image.ts @@ -61,7 +61,7 @@ export interface CreateImageOptions { domains: string[] densities: number[] format: string[] - quality?: number + quality?: number | Record runtimeConfig: RuntimeConfig } From 1652f5a9f2737bb7e966bd84fda73a4dc0ed1766 Mon Sep 17 00:00:00 2001 From: Leon338 Date: Fri, 21 Nov 2025 02:01:46 +0100 Subject: [PATCH 2/3] Fix lint & types --- src/runtime/image.ts | 16 ++++++++++++---- src/runtime/utils/props.ts | 2 +- src/types/image.ts | 4 +++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/runtime/image.ts b/src/runtime/image.ts index 07b9fe344..18ed63740 100644 --- a/src/runtime/image.ts +++ b/src/runtime/image.ts @@ -93,12 +93,20 @@ 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]; + 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; + 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 = { 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 86a9836b9..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 } From a63a4bf6fb1263123cc65a3dc47727fe7308b29b Mon Sep 17 00:00:00 2001 From: Leon338 Date: Fri, 21 Nov 2025 02:17:03 +0100 Subject: [PATCH 3/3] increased nuxt image bundle size --- test/unit/bundle.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"`) }) })