summaryrefslogtreecommitdiff
path: root/packages/integrations/image/src/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/image/src/utils.ts')
-rw-r--r--packages/integrations/image/src/utils.ts62
1 files changed, 62 insertions, 0 deletions
diff --git a/packages/integrations/image/src/utils.ts b/packages/integrations/image/src/utils.ts
new file mode 100644
index 000000000..48249aff1
--- /dev/null
+++ b/packages/integrations/image/src/utils.ts
@@ -0,0 +1,62 @@
+import fs from 'fs';
+import path from 'path';
+import type { OutputFormat, TransformOptions } from './types';
+
+ export function isOutputFormat(value: string): value is OutputFormat {
+ return ['avif', 'jpeg', 'png', 'webp'].includes(value);
+}
+
+export function isAspectRatioString(value: string): value is `${number}:${number}` {
+ return /^\d*:\d*$/.test(value);
+}
+
+export function ensureDir(dir: string) {
+ fs.mkdirSync(dir, { recursive: true });
+}
+
+export function isRemoteImage(src: string) {
+ return /^http(s?):\/\//.test(src);
+}
+
+export async function loadLocalImage(src: string) {
+ try {
+ return await fs.promises.readFile(src);
+ } catch {
+ return undefined;
+ }
+}
+
+export async function loadRemoteImage(src: string) {
+ try {
+ const res = await fetch(src);
+
+ if (!res.ok) {
+ return undefined;
+ }
+
+ return Buffer.from(await res.arrayBuffer());
+ } catch {
+ return undefined;
+ }
+}
+
+export async function loadImage(src: string) {
+ return isRemoteImage(src)
+ ? await loadRemoteImage(src)
+ : await loadLocalImage(src);
+}
+
+export function propsToFilename({ src, width, height, format }: TransformOptions) {
+ const ext = path.extname(src);
+ let filename = src.replace(ext, '');
+
+ if (width && height) {
+ return `${filename}_${width}x${height}.${format}`;
+ } else if (width) {
+ return `${filename}_${width}w.${format}`;
+ } else if (height) {
+ return `${filename}_${height}h.${format}`;
+ }
+
+ return format ? src.replace(ext, format) : src;
+}