From 5cd2ca5a6f1e7726ef9b9363548008b2321a5a9f Mon Sep 17 00:00:00 2001 From: Carlos Espa Date: Sun, 26 Jan 2025 22:46:00 +0100 Subject: [PATCH] feat: allow sharp format options --- .changeset/warm-flowers-smell.md | 5 +++++ packages/astro/src/assets/services/sharp.ts | 24 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 .changeset/warm-flowers-smell.md diff --git a/.changeset/warm-flowers-smell.md b/.changeset/warm-flowers-smell.md new file mode 100644 index 000000000000..2c35b984915c --- /dev/null +++ b/.changeset/warm-flowers-smell.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +allow sharp format options diff --git a/packages/astro/src/assets/services/sharp.ts b/packages/astro/src/assets/services/sharp.ts index bbae39eb093a..a73927cba4ae 100644 --- a/packages/astro/src/assets/services/sharp.ts +++ b/packages/astro/src/assets/services/sharp.ts @@ -1,4 +1,12 @@ -import type { FitEnum, FormatEnum, SharpOptions } from 'sharp'; +import type { + AvifOptions, + FitEnum, + FormatEnum, + JpegOptions, + PngOptions, + SharpOptions, + WebpOptions, +} from 'sharp'; import { AstroError, AstroErrorData } from '../../core/errors/index.js'; import type { ImageFit, ImageOutputFormat, ImageQualityPreset } from '../types.js'; import { @@ -8,11 +16,20 @@ import { parseQuality, } from './service.js'; +export interface SharpFormatOptions { + jpeg?: JpegOptions; + jpg?: JpegOptions; + avif?: AvifOptions; + png?: PngOptions; + webp?: WebpOptions; +} + export interface SharpImageServiceConfig { /** * The `limitInputPixels` option passed to Sharp. See https://sharp.pixelplumbing.com/api-constructor for more information */ limitInputPixels?: SharpOptions['limitInputPixels']; + formatConfig?: SharpFormatOptions; } let sharp: typeof import('sharp'); @@ -108,7 +125,10 @@ const sharpService: LocalImageService = { } } - result.toFormat(transform.format as keyof FormatEnum, { quality: quality }); + result.toFormat(transform.format as keyof FormatEnum, { + quality: quality, + ...config.service.config.formatConfig?.[transform.format as keyof SharpFormatOptions], + }); } const { data, info } = await result.toBuffer({ resolveWithObject: true });