import type { ResponseType } from 'axios'; import { z } from 'zod'; import { getUri } from '../../../operators/getUri.js'; import { healthcheck } from '../../../operators/healthCheck.js'; import type { ThreekitAxiosContext } from '../../../operators/HttpContext.js'; import { request } from '../../../operators/request.js'; import type { Caching, RequestResponseReturnType } from '../../../shared.js'; import { getDefaultResponseType, type RequestResponseType } from '../../../shared.js'; import type { ThreekitAuthProps } from '../../../ThreekitAuthProps.js'; import { createLocalAxios } from '../utils/createLocalAxios.js'; export enum Image2TransformExtension { JPG = 'jpg', WebP = 'webp', PNG = 'png', GIF = 'gif', TIFF = 'tiff' } export enum Image2Fit { Contain = 'contain', Cover = 'cover', Fill = 'fill', Inside = 'inside', Outside = 'outside' } // Define the Joi schema equivalent to your Zod schema export const Image2TransformProps = z.object({ sourceUrl: z.string(), trim: z.boolean().optional(), // trims to just the content, uses bgColor padding: z.number().int().optional(), // adds padding around the image backgroundColor: z.string().optional(), // color hex string, alpha optional cropX: z.number().int().optional(), cropY: z.number().int().optional(), cropWidth: z.number().int().optional(), cropHeight: z.number().int().optional(), resizeWidth: z.number().int().positive().optional(), resizeHeight: z.number().int().positive().optional(), resizeFit: z.nativeEnum(Image2Fit).optional(), gamma: z.number().optional(), brightness: z.number().optional(), saturation: z.number().optional(), hue: z.number().optional(), // degrees tintColor: z.string().optional(), // color hex string grayscale: z.boolean().optional(), sharpen: z.number().optional(), blur: z.number().optional(), threshold: z.number().optional(), // 0-255 flip: z.boolean().optional(), flop: z.boolean().optional(), format: z.nativeEnum(Image2TransformExtension).optional(), quality: z.number().int().optional(), // between 0 and 100 debugParseResponse: z.boolean().optional(), orgId: z.string().optional(), environment: z.string().optional() }); export type Image2TransformProps = z.infer; const DEBUG = false; const API_ROUTE = `api/image`; const API_HOST = DEBUG ? 'localhost:4006' : 'image.alpha.3kit.com'; const API_PROTOCOL = DEBUG ? 'http://' : 'https://'; export class Image2 { context: ThreekitAxiosContext; constructor(auth: ThreekitAuthProps) { this.context = { axios: createLocalAxios({ protocol: API_PROTOCOL, host: API_HOST }), auth, urlPrefix: API_ROUTE }; } healthcheck() { return healthcheck(this.context); } transformUrl(requestProps: Image2TransformProps, caching: Caching = {}) { return getUri(this.context, { url: 'transform', params: { ...requestProps, ...caching } }); } transform( requestProps: Image2TransformProps, caching: Caching = {}, responseType = getDefaultResponseType() ) { return request>(this.context, { url: 'transform', params: { ...requestProps, ...caching }, responseType: responseType as ResponseType }); } }