From f6cc2961e280572c15b6af5143d15b38b979759a Mon Sep 17 00:00:00 2001 From: Dirk de Visser Date: Tue, 4 Jul 2023 16:37:23 +0200 Subject: [PATCH] feat(store): export list of supported image content types --- packages/store/index.d.ts | 1 + packages/store/index.js | 1 + packages/store/src/file.d.ts | 2 +- packages/store/src/file.js | 16 +++++++++++++--- packages/store/src/files-jobs.js | 4 ++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/store/index.d.ts b/packages/store/index.d.ts index 1a2dcc45f1..ff00f026f7 100644 --- a/packages/store/index.d.ts +++ b/packages/store/index.d.ts @@ -31,6 +31,7 @@ export { objectStorageGetObjectStream, } from "./src/object-storage.js"; export { + STORE_FILE_IMAGE_TYPES, fileCreateOrUpdate, fileTransformInPlace, fileFormatMetadata, diff --git a/packages/store/index.js b/packages/store/index.js index 7aaa44aa1e..77ce81715e 100644 --- a/packages/store/index.js +++ b/packages/store/index.js @@ -57,6 +57,7 @@ export { } from "./src/object-storage.js"; export { + STORE_FILE_IMAGE_TYPES, fileCreateOrUpdate, fileTransformInPlace, fileFormatMetadata, diff --git a/packages/store/src/file.d.ts b/packages/store/src/file.d.ts index 91008187a7..14adc85a5a 100644 --- a/packages/store/src/file.d.ts +++ b/packages/store/src/file.d.ts @@ -141,7 +141,7 @@ export function fileVerifyAccessToken(options: { signingKey: string; expectedFileId: string; }): void; -export const TRANSFORMED_CONTENT_TYPES: string[]; +export const STORE_FILE_IMAGE_TYPES: string[]; /** * The various options supported by {@link fileTransformInPlace }. * By default transforms SVG input in to PNG. This can't be disabled, skip calling this diff --git a/packages/store/src/file.js b/packages/store/src/file.js index 3eb44f986e..6e467ed3fc 100644 --- a/packages/store/src/file.js +++ b/packages/store/src/file.js @@ -26,13 +26,14 @@ import { import { query } from "./query.js"; import { queueWorkerAddJob } from "./queue-worker.js"; -export const TRANSFORMED_CONTENT_TYPES = [ +export const STORE_FILE_IMAGE_TYPES = [ "image/png", "image/jpeg", "image/jpg", "image/webp", "image/avif", "image/gif", + "image/svg+xml", ]; /** @@ -108,7 +109,10 @@ export async function fileCreateOrUpdate( source = createReadStream(source); } - if (options.fileTransformInPlaceOptions) { + if ( + options.fileTransformInPlaceOptions && + STORE_FILE_IMAGE_TYPES.includes(props.contentType ?? "") + ) { const fileBuffer = Buffer.isBuffer(source) ? source : await streamToBuffer(source); @@ -117,6 +121,12 @@ export async function fileCreateOrUpdate( fileBuffer, options.fileTransformInPlaceOptions, ); + + if (props.contentType === "image/svg+xml") { + // After the transform, svgs are converted as png's + // See Sharp's toBuffer docs for more information. + props.contentType = "image/png"; + } } const upload = new Upload({ @@ -145,7 +155,7 @@ export async function fileCreateOrUpdate( if ( options.schedulePlaceholderImageJob && - TRANSFORMED_CONTENT_TYPES.includes(props.contentType ?? "") + STORE_FILE_IMAGE_TYPES.includes(props.contentType ?? "") ) { await queueWorkerAddJob(sql, { name: "compas.file.generatePlaceholderImage", diff --git a/packages/store/src/files-jobs.js b/packages/store/src/files-jobs.js index f202c6113b..161cb9aa80 100644 --- a/packages/store/src/files-jobs.js +++ b/packages/store/src/files-jobs.js @@ -10,7 +10,7 @@ import sharp from "sharp"; import { fileCreateOrUpdate, fileSyncDeletedWithObjectStorage, - TRANSFORMED_CONTENT_TYPES, + STORE_FILE_IMAGE_TYPES, } from "./file.js"; import { queryFile } from "./generated/database/file.js"; import { objectStorageGetObjectStream } from "./object-storage.js"; @@ -70,7 +70,7 @@ export function jobFileGeneratePlaceholderImage(s3Client, bucketName) { }).execRaw(sql); // @ts-expect-error - if (!TRANSFORMED_CONTENT_TYPES.includes(file?.contentType)) { + if (!STORE_FILE_IMAGE_TYPES.includes(file?.contentType)) { // not supported eventStop(event); return;