From c738f161070491444d9973e8c6589879373d44c9 Mon Sep 17 00:00:00 2001 From: ashim-hq Date: Mon, 20 Apr 2026 22:13:53 +0800 Subject: [PATCH] fix: support AVIF compress and fix hardcoded content type --- apps/api/src/lib/output-format.ts | 1 + apps/api/src/routes/tools/compress.ts | 4 +++- packages/image-engine/src/engine.ts | 1 + packages/image-engine/src/operations/compress.ts | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/api/src/lib/output-format.ts b/apps/api/src/lib/output-format.ts index 2132cb8f..940b7802 100644 --- a/apps/api/src/lib/output-format.ts +++ b/apps/api/src/lib/output-format.ts @@ -17,6 +17,7 @@ const FORMAT_MAP: Record< gif: { format: "gif", extension: "gif", contentType: "image/gif" }, tiff: { format: "tiff", extension: "tiff", contentType: "image/tiff" }, avif: { format: "avif", extension: "avif", contentType: "image/avif" }, + heif: { format: "avif", extension: "avif", contentType: "image/avif" }, }; const DEFAULT_QUALITY = 95; diff --git a/apps/api/src/routes/tools/compress.ts b/apps/api/src/routes/tools/compress.ts index e31eb961..50046bf7 100644 --- a/apps/api/src/routes/tools/compress.ts +++ b/apps/api/src/routes/tools/compress.ts @@ -2,6 +2,7 @@ import { compress } from "@ashim/image-engine"; import type { FastifyInstance } from "fastify"; import sharp from "sharp"; import { z } from "zod"; +import { resolveOutputFormat } from "../../lib/output-format.js"; import { createToolRoute } from "../tool-factory.js"; const settingsSchema = z.object({ @@ -16,6 +17,7 @@ export function registerCompress(app: FastifyInstance) { settingsSchema, process: async (inputBuffer, settings, filename) => { const image = sharp(inputBuffer); + const outputFormat = await resolveOutputFormat(inputBuffer, filename); const compressOptions: { quality?: number; @@ -31,7 +33,7 @@ export function registerCompress(app: FastifyInstance) { const result = await compress(image, compressOptions); const buffer = await result.toBuffer(); - return { buffer, filename, contentType: "image/jpeg" }; + return { buffer, filename, contentType: outputFormat.contentType }; }, }); } diff --git a/packages/image-engine/src/engine.ts b/packages/image-engine/src/engine.ts index 42f2aac0..77f922d9 100644 --- a/packages/image-engine/src/engine.ts +++ b/packages/image-engine/src/engine.ts @@ -70,6 +70,7 @@ const FORMAT_MAP: Record = { png: "png", webp: "webp", avif: "avif", + heif: "avif", tiff: "tiff", gif: "gif", }; diff --git a/packages/image-engine/src/operations/compress.ts b/packages/image-engine/src/operations/compress.ts index e999fe8f..01d9fa37 100644 --- a/packages/image-engine/src/operations/compress.ts +++ b/packages/image-engine/src/operations/compress.ts @@ -6,6 +6,7 @@ const FORMAT_MAP: Record = { png: "png", webp: "webp", avif: "avif", + heif: "avif", tiff: "tiff", gif: "gif", };