img-upload-kit 1.1.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +89 -74
- package/MIGRATION.md +192 -0
- package/README.md +243 -259
- package/dist/bin.js +1186 -0
- package/dist/bin.js.map +1 -0
- package/dist/blur.cjs +40 -412
- package/dist/blur.cjs.map +1 -1
- package/dist/blur.d.cts +5 -5
- package/dist/blur.d.ts +5 -5
- package/dist/blur.js +39 -393
- package/dist/blur.js.map +1 -1
- package/dist/blurDataUtils-DveBRtqE.d.cts +43 -0
- package/dist/blurDataUtils-yx9Q6HlU.d.ts +43 -0
- package/dist/blurService-D5TpMNji.d.ts +83 -0
- package/dist/blurService-DacwylJx.d.cts +83 -0
- package/dist/chunk-25GYKQ6J.js +158 -0
- package/dist/chunk-25GYKQ6J.js.map +1 -0
- package/dist/chunk-34L4TEE3.cjs +226 -0
- package/dist/chunk-34L4TEE3.cjs.map +1 -0
- package/dist/chunk-DFCSN3X7.cjs +158 -0
- package/dist/chunk-DFCSN3X7.cjs.map +1 -0
- package/dist/chunk-EWVIL57J.js +294 -0
- package/dist/chunk-EWVIL57J.js.map +1 -0
- package/dist/chunk-FP5YIWG5.cjs +135 -0
- package/dist/chunk-FP5YIWG5.cjs.map +1 -0
- package/dist/chunk-HILELQGS.js +226 -0
- package/dist/chunk-HILELQGS.js.map +1 -0
- package/dist/chunk-IDLLCVGB.js +2370 -0
- package/dist/chunk-IDLLCVGB.js.map +1 -0
- package/dist/chunk-J6A44Y3W.js +514 -0
- package/dist/chunk-J6A44Y3W.js.map +1 -0
- package/dist/chunk-LOSVFO56.cjs +145 -0
- package/dist/chunk-LOSVFO56.cjs.map +1 -0
- package/dist/chunk-MBQJ6NVJ.cjs +294 -0
- package/dist/chunk-MBQJ6NVJ.cjs.map +1 -0
- package/dist/chunk-MHGQEBPW.js +145 -0
- package/dist/chunk-MHGQEBPW.js.map +1 -0
- package/dist/chunk-QHU7FUO4.cjs +37 -0
- package/dist/chunk-QHU7FUO4.cjs.map +1 -0
- package/dist/chunk-S2IFAWJK.js +37 -0
- package/dist/chunk-S2IFAWJK.js.map +1 -0
- package/dist/chunk-TA5Y64JM.cjs +2370 -0
- package/dist/chunk-TA5Y64JM.cjs.map +1 -0
- package/dist/chunk-VYVZVUNI.js +135 -0
- package/dist/chunk-VYVZVUNI.js.map +1 -0
- package/dist/chunk-XKQMCY5Z.cjs +514 -0
- package/dist/chunk-XKQMCY5Z.cjs.map +1 -0
- package/dist/cli.cjs +273 -76
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +269 -73
- package/dist/cli.js.map +1 -1
- package/dist/headless.cjs +8 -1880
- package/dist/headless.cjs.map +1 -1
- package/dist/headless.d.cts +3 -1
- package/dist/headless.d.ts +3 -1
- package/dist/headless.js +25 -1886
- package/dist/headless.js.map +1 -1
- package/dist/index-BIdnqtW8.d.ts +234 -0
- package/dist/index-Brk_uHs6.d.cts +234 -0
- package/dist/{index-FVXXKf2v.d.ts → index-CPMlaQsC.d.ts} +76 -153
- package/dist/{index-FVXXKf2v.d.cts → index-DHINe-rA.d.cts} +76 -153
- package/dist/index.cjs +64 -532
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +63 -504
- package/dist/index.js.map +1 -1
- package/dist/{memoryAdapter-CBu7_3Pp.d.ts → memoryAdapter-Ck0ccZbF.d.cts} +3 -2
- package/dist/{memoryAdapter-BJjyLR-1.d.cts → memoryAdapter-DxEKaG0b.d.ts} +3 -2
- package/dist/placeholders-C4ftwaII.d.ts +5 -0
- package/dist/placeholders-x_3rt65M.d.cts +5 -0
- package/dist/react.cjs +1952 -3257
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +188 -50
- package/dist/react.d.ts +188 -50
- package/dist/react.js +1763 -3013
- package/dist/react.js.map +1 -1
- package/dist/server-handler.cjs +14 -0
- package/dist/server-handler.cjs.map +1 -0
- package/dist/server-handler.d.cts +3 -0
- package/dist/server-handler.d.ts +3 -0
- package/dist/server-handler.js +14 -0
- package/dist/server-handler.js.map +1 -0
- package/dist/server.cjs +1096 -532
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +77 -154
- package/dist/server.d.ts +77 -154
- package/dist/server.js +1050 -448
- package/dist/server.js.map +1 -1
- package/dist/storage.cjs +239 -232
- package/dist/storage.cjs.map +1 -1
- package/dist/storage.d.cts +21 -5
- package/dist/storage.d.ts +21 -5
- package/dist/storage.js +227 -207
- package/dist/storage.js.map +1 -1
- package/dist/styles/animated-image.css +112 -0
- package/dist/styles/dropzone-and-tiles.css +247 -0
- package/dist/styles/modals-and-dock.css +248 -0
- package/dist/styles/primitives.css +197 -0
- package/dist/styles/quality-and-inputs.css +184 -0
- package/dist/styles/tokens.css +123 -0
- package/dist/styles.css +235 -220
- package/dist/types-BrP-o9nd.d.cts +85 -0
- package/dist/types-sZ3KoFQY.d.ts +85 -0
- package/dist/types-yShGNQnW.d.cts +61 -0
- package/dist/types-yShGNQnW.d.ts +61 -0
- package/dist/{types-CiLY0DwB.d.cts → upload-C5Trd6Dh.d.cts} +27 -53
- package/dist/{types-CiLY0DwB.d.ts → upload-C5Trd6Dh.d.ts} +27 -53
- package/package.json +92 -32
- package/dist/blurService-DqsnfPTd.d.cts +0 -172
- package/dist/blurService-DqsnfPTd.d.ts +0 -172
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/handler.ts","../src/server/optimization/types.ts","../src/types/presets.ts","../src/server/optimization/imageOptimizer.ts","../src/utils/color.ts","../src/server/optimization/colorHistogram.ts","../src/server/optimization/edgeColorExtractor.ts","../src/server/optimization/blurGenerator.ts","../src/server/semaphore.ts","../src/server/uploader/bufferProcessor.ts","../src/utils/validators.ts","../src/server/uploader/pathGenerator.ts","../src/server/uploader/uploadRetry.ts","../src/server/uploader/createImageUploader.ts"],"names":["sharp","r","g","b","encodeBlurHash","lqip","crypto","fullPath","fs","path"],"mappings":"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","file":"server.cjs","sourcesContent":["import type { ExplicitOutputFormat, ImageDimensions } from '../types';\nimport type { ImageUploader } from './uploadService';\n\nexport interface UploadHttpHandlerOptions<TPreset extends string = string> {\n uploader: ImageUploader<TPreset>;\n /**\n * Optional authorization check. Return `false` or throw to reject with 401.\n */\n authorize?: (request: Request) => boolean | Promise<boolean>;\n /**\n * Optional whitelist of allowed preset names.\n */\n allowedPresets?: string[];\n /**\n * Allow clients to override `bucket` via FormData. Defaults to `false` for security.\n */\n allowClientBucketOverride?: boolean;\n}\n\nexport class UploadValidationError extends Error {\n readonly status = 400;\n constructor(message: string) {\n super(message);\n this.name = 'UploadValidationError';\n }\n}\n\nconst VALIDATION_ERROR_SUBSTRINGS = [\n 'exceeds maximum',\n 'file size',\n 'too large',\n 'is not allowed',\n 'not allowed',\n 'unsupported image format',\n 'unsupported format',\n 'invalid format',\n 'invalid image',\n 'not a valid image',\n 'file type',\n 'invalid preset',\n 'no file provided',\n 'file is empty',\n];\n\nexport function isClientValidationError(error: unknown): boolean {\n if (!error) return false;\n if (error instanceof UploadValidationError) return true;\n if (\n typeof error === 'object' &&\n error !== null &&\n 'status' in error &&\n (error as { status: unknown }).status === 400\n ) {\n return true;\n }\n if (\n error instanceof Error &&\n (error.name === 'UploadValidationError' ||\n error.name === 'ValidationError')\n ) {\n return true;\n }\n\n const msg =\n error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n\n return VALIDATION_ERROR_SUBSTRINGS.some((sub) => msg.includes(sub));\n}\n\nfunction jsonResponse(body: unknown, status: number = 200): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n\nfunction parseJsonRecord(raw: string | null): Record<string, string> | undefined {\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const clean: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed)) {\n if (v !== undefined && v !== null) {\n clean[k] = String(v);\n }\n }\n return Object.keys(clean).length > 0 ? clean : undefined;\n }\n } catch {\n // Ignore malformed metadata JSON\n }\n return undefined;\n}\n\n/**\n * Standard Web Fetch (`Request` -> `Response`) upload & delete route handlers.\n * Works across Next.js App Router, Remix, React Router, SvelteKit, Astro, Hono, and Node Fetch servers.\n */\nexport function createUploadHttpHandler<TPreset extends string = string>(\n options: UploadHttpHandlerOptions<TPreset>,\n) {\n const {\n uploader,\n authorize,\n allowedPresets,\n allowClientBucketOverride = false,\n } = options;\n\n async function POST(request: Request): Promise<Response> {\n try {\n if (authorize) {\n const allowed = await authorize(request);\n if (!allowed) {\n return jsonResponse({ error: 'Unauthorized' }, 401);\n }\n }\n\n const formData = await request.formData();\n const file = formData.get('file') as File | null;\n if (\n !file ||\n typeof file === 'string' ||\n (typeof file.size === 'number' && file.size === 0 && !file.name)\n ) {\n return jsonResponse({ error: 'No file provided' }, 400);\n }\n if (typeof file.size === 'number' && file.size === 0) {\n return jsonResponse({ error: 'File is empty' }, 400);\n }\n\n const preset = (formData.get('preset') as TPreset | null) || undefined;\n if (preset) {\n if (\n allowedPresets &&\n allowedPresets.length > 0 &&\n !allowedPresets.includes(preset)\n ) {\n return jsonResponse(\n {\n error: `Invalid preset \"${preset}\". Allowed presets: ${allowedPresets.join(', ')}`,\n },\n 400,\n );\n }\n if (\n typeof uploader.resolvePreset === 'function' &&\n !uploader.resolvePreset(preset)\n ) {\n return jsonResponse(\n {\n error: `Invalid preset \"${preset}\".`,\n },\n 400,\n );\n }\n }\n\n const folder = (formData.get('folder') as string | null) || undefined;\n const bucket = allowClientBucketOverride\n ? (formData.get('bucket') as string | null) || undefined\n : undefined;\n const altText = (formData.get('altText') as string | null) || undefined;\n const customFilename =\n (formData.get('customFilename') as string | null) || undefined;\n\n const outputFormatRaw = formData.get('outputFormat') as string | null;\n if (\n outputFormatRaw &&\n !['jpeg', 'png', 'webp', 'avif'].includes(outputFormatRaw)\n ) {\n return jsonResponse(\n {\n error: `Invalid output format \"${outputFormatRaw}\". Allowed formats: jpeg, png, webp, avif`,\n },\n 400,\n );\n }\n const outputFormat =\n (outputFormatRaw as ExplicitOutputFormat) || undefined;\n\n const qualityRaw = formData.get('quality') as string | null;\n const quality =\n qualityRaw !== null\n ? Math.max(1, Math.min(100, parseInt(qualityRaw, 10) || 85))\n : undefined;\n\n const maxWidthRaw = formData.get('maxWidth') as string | null;\n const maxHeightRaw = formData.get('maxHeight') as string | null;\n let maxDimensions: ImageDimensions | undefined;\n if (maxWidthRaw && maxHeightRaw) {\n const w = parseInt(maxWidthRaw, 10);\n const h = parseInt(maxHeightRaw, 10);\n if (w > 0 && h > 0) {\n maxDimensions = { width: w, height: h };\n }\n }\n\n const metadata = parseJsonRecord(\n formData.get('metadata') as string | null,\n );\n\n const result = await uploader.uploadImage(file, {\n preset,\n folder,\n bucket,\n altText,\n customFilename,\n outputFormat,\n quality,\n maxDimensions,\n metadata,\n });\n\n return jsonResponse(result, 200);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Internal server error';\n const status = isClientValidationError(error) ? 400 : 500;\n return jsonResponse({ error: errorMessage }, status);\n }\n }\n\n async function DELETE(request: Request): Promise<Response> {\n try {\n if (authorize) {\n const allowed = await authorize(request);\n if (!allowed) {\n return jsonResponse({ error: 'Unauthorized' }, 401);\n }\n }\n\n const { searchParams } = new URL(request.url);\n const url = searchParams.get('url');\n if (url) {\n const deleted = await uploader.deleteByUrl(url);\n return jsonResponse({ success: deleted }, deleted ? 200 : 400);\n }\n\n const storagePath = searchParams.get('path');\n const bucket = allowClientBucketOverride\n ? searchParams.get('bucket') || undefined\n : undefined;\n\n if (!storagePath) {\n return jsonResponse(\n { error: 'Missing required \"path\" or \"url\" query parameter' },\n 400,\n );\n }\n\n await uploader.deleteImage(storagePath, bucket);\n return jsonResponse({ success: true }, 200);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Internal server error';\n return jsonResponse({ error: errorMessage }, 500);\n }\n }\n\n return { POST, DELETE };\n}\n","import type {\n ExplicitOutputFormat,\n ImageDimensions,\n ImageOutputFormat,\n} from '../../types';\n\nexport interface OptimizedImageResult {\n buffer: Buffer;\n width: number;\n height: number;\n format: ImageOutputFormat;\n size: number;\n}\n\nexport interface BlurHashResult {\n dataURL: string;\n color: string;\n blurHash?: string;\n}\n\nexport interface OptimizeImageOptions {\n /** Max bounding box dimensions (fit: 'inside', withoutEnlargement: true). Defaults to 1920x1080. */\n maxDimensions?: ImageDimensions;\n /** Explicit output format; omit for smart size-guarded AVIF/WebP selection */\n outputFormat?: ExplicitOutputFormat;\n /** 1–100 compression quality. Defaults to smart photo/graphic heuristic (85–88). */\n quality?: number;\n}\n\nexport interface GenerateBlurOptions {\n width?: number;\n fallbackWidth?: number;\n quality?: number;\n maxDataUrlChars?: number;\n includeBlurHash?: boolean;\n}\n\nexport type ColorSamplingMode = 'balanced' | 'edge';\nexport type EdgeKey = 'top' | 'right' | 'bottom' | 'left';\nexport type EdgeColorSet = Record<EdgeKey, string>;\n\nexport const PRIMARY_AVIF_EFFORT = 6;\nexport const RETRY_AVIF_EFFORT = 5;\n\nexport const BLUR_PLACEHOLDER_WIDTH = 128;\nexport const BLUR_PLACEHOLDER_FALLBACK_WIDTH = 96;\nexport const BLUR_PLACEHOLDER_QUALITY = 80;\nexport const BLUR_PLACEHOLDER_MAX_CHARS = 8000;\n\nexport const EDGE_COLOR_FALLBACK = '#6B7280';\nexport const EDGE_WHITE_FALLBACK = '#F9FAFB';\nexport const WHITE_DOMINANCE_RATIO = 1.35;\n","import type {\n ExplicitOutputFormat,\n ImageDimensions,\n QualityLevel,\n} from './quality';\n\n/**\n * Universal visual role presets (project-agnostic).\n * Consumers can define their own presets via `defineUploadPresets` / `createImageUploader({ presets })`\n * or augment `UploadKitRegister` for global type-safety.\n */\nexport type StandardPresetName =\n | 'thumbnail'\n | 'avatar'\n | 'card'\n | 'cover'\n | 'hero'\n | 'logo'\n | 'original';\n\n/**\n * Module augmentation hook for global preset autocomplete across a project:\n * ```ts\n * declare module 'img-upload-kit' {\n * interface UploadKitRegister {\n * presets: 'product-main' | 'product-thumb' | 'user-avatar';\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface UploadKitRegister {}\n\nexport type UploadPresetName = UploadKitRegister extends {\n presets: infer TCustom extends string;\n}\n ? TCustom\n : StandardPresetName | (string & {});\n\nexport interface UploadPresetConfig {\n /** Target storage bucket for this preset */\n bucket?: string;\n /** Default folder prefix within the bucket (e.g. 'avatars' or 'products/thumbnails') */\n folder?: string;\n /** Maximum bounding box dimensions (aspect ratio preserved, never enlarged) */\n maxDimensions?: ImageDimensions;\n /** Maximum allowed source file size in MB */\n maxSizeMB?: number;\n /** Allowed source MIME types */\n allowedFormats?: string[];\n /** Force a specific output format; omit for smart size-guarded AVIF/WebP optimization */\n outputFormat?: ExplicitOutputFormat;\n /** Default compression quality (1–100) */\n quality?: number;\n /** Recommended UI quality tab for React `<QualitySelector />` */\n recommendedQualityLevel?: QualityLevel;\n /** Optional guidance note shown in `<QualitySelector />` */\n recommendationNote?: { en: string; ar?: string };\n /** Generate compact BlurHash string alongside WebP LQIP data URL */\n includeBlurHash?: boolean;\n /** Optional local directory to mirror uploaded files into */\n mirrorDir?: string;\n /** Optional public URL prefix when `mirrorDir` is used */\n publicUrlBase?: string;\n}\n\nexport const DEFAULT_ALLOWED_FORMATS: string[] = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/avif',\n 'image/svg+xml',\n];\n\nexport const RASTER_ALLOWED_FORMATS: string[] = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/avif',\n];\n\nexport const DEFAULT_IMAGE_DIMENSIONS: ImageDimensions = {\n width: 1920,\n height: 1080,\n};\n\nexport const STANDARD_PRESETS: Record<StandardPresetName, UploadPresetConfig> = {\n thumbnail: {\n folder: 'thumbnails',\n maxDimensions: { width: 600, height: 600 },\n maxSizeMB: 5,\n quality: 78,\n recommendedQualityLevel: 'medium',\n allowedFormats: RASTER_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Thumbnails display at compact sizes — Medium quality keeps pages fast',\n ar: 'المصغرات تعرض بأحجام صغيرة — الجودة المتوسطة تحافظ على سرعة الصفحة',\n },\n },\n avatar: {\n folder: 'avatars',\n maxDimensions: { width: 512, height: 512 },\n maxSizeMB: 5,\n quality: 80,\n recommendedQualityLevel: 'medium',\n allowedFormats: RASTER_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Avatars display small — Medium quality balances sharpness and speed',\n ar: 'الصور الشخصية صغيرة — الجودة المتوسطة توازن بين الوضوح والسرعة',\n },\n },\n card: {\n folder: 'cards',\n maxDimensions: { width: 1200, height: 900 },\n maxSizeMB: 8,\n quality: 85,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n cover: {\n folder: 'covers',\n maxDimensions: { width: 1920, height: 1080 },\n maxSizeMB: 10,\n quality: 88,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n hero: {\n folder: 'hero',\n maxDimensions: { width: 2560, height: 1440 },\n maxSizeMB: 15,\n quality: 92,\n recommendedQualityLevel: 'maximum',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Full-width hero visuals benefit from Maximum quality to preserve fine detail',\n ar: 'الصور الرئيسية بعرض كامل تستفيد من الجودة القصوى للحفاظ على التفاصيل الدقيقة',\n },\n },\n logo: {\n folder: 'logos',\n maxDimensions: { width: 800, height: 800 },\n maxSizeMB: 5,\n quality: 90,\n recommendedQualityLevel: 'high',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n recommendationNote: {\n en: 'Prefer SVG for vector logos — High quality preserves crisp edges on raster logos',\n ar: 'يفضل SVG للشعارات المتجهة — الجودة العالية تحافظ على حواف واضحة',\n },\n },\n original: {\n folder: 'originals',\n maxDimensions: { width: 4096, height: 4096 },\n maxSizeMB: 25,\n quality: 95,\n recommendedQualityLevel: 'maximum',\n allowedFormats: DEFAULT_ALLOWED_FORMATS,\n },\n};\n\n/**\n * Type-safe helper to define project-specific upload presets with full key inference.\n */\nexport function defineUploadPresets<\n T extends Record<string, UploadPresetConfig>,\n>(presets: T): T {\n return presets;\n}\n","import sharp from 'sharp';\nimport { DEFAULT_IMAGE_DIMENSIONS } from '../../types';\nimport {\n type OptimizedImageResult,\n type OptimizeImageOptions,\n PRIMARY_AVIF_EFFORT,\n RETRY_AVIF_EFFORT,\n} from './types';\n\nexport async function optimizeImage(\n buffer: Buffer,\n options: OptimizeImageOptions = {},\n): Promise<OptimizedImageResult> {\n const maxDimensions = options.maxDimensions || DEFAULT_IMAGE_DIMENSIONS;\n const { outputFormat, quality } = options;\n\n let pipeline = sharp(buffer, {\n failOnError: false,\n limitInputPixels: 268402689,\n }).rotate();\n\n const metadata = await pipeline.metadata();\n const originalFormat = metadata.format;\n\n if (originalFormat === 'svg') {\n let width = metadata.width;\n let height = metadata.height;\n\n if (!width || !height) {\n const svgText = buffer.toString('utf8');\n const viewBoxMatch = svgText.match(\n /viewBox\\s*=\\s*[\"']\\s*([\\d.-]+)\\s+([\\d.-]+)\\s+([\\d.-]+)\\s+([\\d.-]+)\\s*[\"']/i,\n );\n if (viewBoxMatch) {\n width = Math.round(parseFloat(viewBoxMatch[3]));\n height = Math.round(parseFloat(viewBoxMatch[4]));\n }\n }\n\n return {\n buffer,\n width: width || maxDimensions.width || 600,\n height: height || maxDimensions.height || 600,\n format: 'svg',\n size: buffer.length,\n };\n }\n\n const isPhoto =\n originalFormat === 'jpeg' ||\n Boolean(metadata.density && metadata.density > 150);\n\n let baseQuality = quality ?? (isPhoto ? 85 : 88);\n baseQuality = Math.max(1, Math.min(100, baseQuality));\n\n pipeline = pipeline.resize(maxDimensions.width, maxDimensions.height, {\n fit: 'inside',\n withoutEnlargement: true,\n kernel: 'lanczos3',\n });\n\n if (\n outputFormat === 'jpeg' ||\n outputFormat === 'png' ||\n outputFormat === 'webp'\n ) {\n let cloned = pipeline.clone();\n if (outputFormat === 'jpeg') {\n cloned = cloned.jpeg({ quality: baseQuality, mozjpeg: true });\n } else if (outputFormat === 'png') {\n cloned = cloned.png();\n } else if (outputFormat === 'webp') {\n cloned = cloned.webp({ quality: baseQuality, effort: 4 });\n }\n\n const outputBuffer = await cloned.toBuffer({ resolveWithObject: true });\n\n return {\n buffer: outputBuffer.data,\n width: outputBuffer.info.width || maxDimensions.width,\n height: outputBuffer.info.height || maxDimensions.height,\n format: outputFormat,\n size: outputBuffer.info.size,\n };\n }\n\n const avifBuffer = await pipeline\n .clone()\n .avif({\n quality: baseQuality,\n effort: PRIMARY_AVIF_EFFORT,\n chromaSubsampling: '4:2:0',\n bitdepth: 8,\n })\n .toBuffer({ resolveWithObject: true });\n\n // Size-guard against bloating previously low-Q JPEGs when re-encoded at high-Q AVIF\n const avifSize = avifBuffer.info.size;\n const originalSize = buffer.length;\n\n if (avifSize <= originalSize || outputFormat === 'avif') {\n const finalMetadata = await sharp(avifBuffer.data).metadata();\n return {\n buffer: avifBuffer.data,\n width: finalMetadata.width ?? maxDimensions.width,\n height: finalMetadata.height ?? maxDimensions.height,\n format: 'avif',\n size: avifSize,\n };\n }\n\n const scaledQuality = Math.max(\n 40,\n Math.round(baseQuality * Math.sqrt(originalSize / avifSize)),\n );\n\n const avifRetry = await pipeline\n .clone()\n .avif({\n quality: scaledQuality,\n effort: RETRY_AVIF_EFFORT,\n chromaSubsampling: '4:2:0',\n bitdepth: 8,\n })\n .toBuffer({ resolveWithObject: true });\n\n if (avifRetry.info.size <= originalSize) {\n const retryMeta = await sharp(avifRetry.data).metadata();\n return {\n buffer: avifRetry.data,\n width: retryMeta.width ?? maxDimensions.width,\n height: retryMeta.height ?? maxDimensions.height,\n format: 'avif',\n size: avifRetry.info.size,\n };\n }\n\n const wasDimensionCapped =\n (metadata.width ?? 0) > maxDimensions.width ||\n (metadata.height ?? 0) > maxDimensions.height;\n\n if (!wasDimensionCapped) {\n const PASSTHROUGH_FORMATS = new Set(['jpeg', 'png', 'webp', 'avif']);\n const srcFmt = PASSTHROUGH_FORMATS.has(originalFormat ?? '')\n ? (originalFormat as 'jpeg' | 'png' | 'webp' | 'avif')\n : 'jpeg';\n return {\n buffer,\n width: metadata.width ?? maxDimensions.width,\n height: metadata.height ?? maxDimensions.height,\n format: srcFmt,\n size: originalSize,\n };\n }\n\n const webpBuffer = await pipeline\n .clone()\n .webp({ quality: baseQuality, effort: 6, smartSubsample: true })\n .toBuffer({ resolveWithObject: true });\n\n const useWebP = webpBuffer.info.size <= avifRetry.info.size;\n const winner = useWebP\n ? { buf: webpBuffer.data, fmt: 'webp' as const, sz: webpBuffer.info.size }\n : { buf: avifRetry.data, fmt: 'avif' as const, sz: avifRetry.info.size };\n\n const winnerMeta = await sharp(winner.buf).metadata();\n return {\n buffer: winner.buf,\n width: winnerMeta.width ?? maxDimensions.width,\n height: winnerMeta.height ?? maxDimensions.height,\n format: winner.fmt,\n size: winner.sz,\n };\n}\n","export const DEFAULT_BLUR_COLOR = '#F5F5F5';\n\nexport function normalizeColorInput(value?: string | null): string | null {\n if (!value) return null;\n let next = value.trim();\n if (!next) return null;\n if (!next.startsWith('#')) {\n next = `#${next}`;\n }\n const threeHex = /^#([0-9a-fA-F]{3})$/;\n const sixHex = /^#([0-9a-fA-F]{6})$/;\n if (threeHex.test(next)) {\n const [, triplet] = next.match(threeHex) ?? [];\n if (triplet) {\n next = `#${triplet\n .split('')\n .map((char) => char + char)\n .join('')}`;\n }\n } else if (!sixHex.test(next)) {\n return null;\n }\n return next.toUpperCase();\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const normalized = hex.replace('#', '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((char) => char + char)\n .join('')\n : normalized;\n const padded = expanded.padEnd(6, '0').slice(0, 6);\n const value = Number.parseInt(padded, 16);\n if (Number.isNaN(value)) {\n return { r: 245, g: 245, b: 245 };\n }\n return {\n r: (value >> 16) & 255,\n g: (value >> 8) & 255,\n b: value & 255,\n };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n const value = (clamp(r) << 16) | (clamp(g) << 8) | clamp(b);\n return `#${value.toString(16).padStart(6, '0').toUpperCase()}`;\n}\n\nfunction encodeBase64Ascii(str: string): string {\n if (typeof btoa === 'function') {\n return btoa(str);\n }\n return Buffer.from(str, 'utf8').toString('base64');\n}\n\nexport function generateColorSvgDataURL(color: string = DEFAULT_BLUR_COLOR): string {\n const safeColor = normalizeColorInput(color) || DEFAULT_BLUR_COLOR;\n const svg = `<svg width=\"100\" height=\"100\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"100%\" height=\"100%\" fill=\"${safeColor}\"/></svg>`;\n return `data:image/svg+xml;base64,${encodeBase64Ascii(svg)}`;\n}\n","import sharp from 'sharp';\nimport { rgbToHex } from '../../utils/color';\nimport {\n type ColorSamplingMode,\n EDGE_COLOR_FALLBACK,\n EDGE_WHITE_FALLBACK,\n WHITE_DOMINANCE_RATIO,\n} from './types';\n\nexport async function extractEnhancedColorFromBuffer(\n buffer: Buffer,\n mode: ColorSamplingMode = 'balanced',\n): Promise<string> {\n try {\n const metadata = await sharp(buffer).metadata();\n const maxSize = 400;\n const needsResize =\n metadata.width &&\n metadata.height &&\n (metadata.width > maxSize || metadata.height > maxSize);\n\n if (needsResize) {\n const resized = await sharp(buffer)\n .resize(maxSize, maxSize, {\n fit: 'inside',\n kernel: 'lanczos3',\n withoutEnlargement: true,\n })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n\n return extractDominantColorHistogramAdvanced(\n resized.data,\n resized.info.width,\n resized.info.height,\n mode,\n );\n }\n\n const raw = await sharp(buffer)\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n\n return extractDominantColorHistogramAdvanced(\n raw.data,\n raw.info.width,\n raw.info.height,\n mode,\n );\n } catch {\n const stats = await sharp(buffer)\n .resize(64, 64, { fit: 'cover', kernel: 'lanczos3' })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n return extractDominantColorHistogram(stats.data);\n }\n}\n\nfunction extractDominantColorHistogramAdvanced(\n data: Buffer,\n width: number,\n height: number,\n mode: ColorSamplingMode,\n): string {\n const colorMap = new Map<string, number>();\n const bucketSize = 16;\n\n const centerWeight = 1.5;\n const centerX = width / 2 || 1;\n const centerY = height / 2 || 1;\n let whiteWeight = 0;\n\n for (let i = 0; i < data.length; i += 4) {\n const alpha = data[i + 3];\n if (alpha !== undefined && alpha < 8) continue;\n\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const brightness = (r + g + b) / 3;\n if (brightness < 10) continue;\n\n const pixelIndex = i / 4;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n const dx = (x - centerX) / centerX;\n const dy = (y - centerY) / centerY;\n const distanceFromCenter = Math.sqrt(dx * dx + dy * dy);\n let weight = 1.0;\n\n if (mode === 'edge') {\n const edgeThicknessX = Math.max(1, Math.floor(width * 0.12));\n const edgeThicknessY = Math.max(1, Math.floor(height * 0.12));\n\n const onLeftEdge = x < edgeThicknessX;\n const onRightEdge = x >= width - edgeThicknessX;\n const onTopEdge = y < edgeThicknessY;\n const onBottomEdge = y >= height - edgeThicknessY;\n\n if (!(onLeftEdge || onRightEdge || onTopEdge || onBottomEdge)) {\n continue;\n }\n\n const distanceToNearestEdge = Math.min(\n x,\n y,\n width - 1 - x,\n height - 1 - y,\n );\n const maxEdgeDistance = Math.max(edgeThicknessX, edgeThicknessY) || 1;\n const edgeFactor = 1 - distanceToNearestEdge / maxEdgeDistance;\n weight = 1 + edgeFactor * 3;\n } else {\n weight = distanceFromCenter < 0.5 ? centerWeight : 1.0;\n }\n\n const isNearWhite = r >= 245 && g >= 245 && b >= 245;\n if (isNearWhite) {\n whiteWeight += weight;\n continue;\n }\n\n const bucketR = Math.floor(r / bucketSize) * bucketSize;\n const bucketG = Math.floor(g / bucketSize) * bucketSize;\n const bucketB = Math.floor(b / bucketSize) * bucketSize;\n\n const key = `${bucketR},${bucketG},${bucketB}`;\n colorMap.set(key, (colorMap.get(key) || 0) + weight);\n }\n\n if (!colorMap.size) {\n return whiteWeight > 0 ? EDGE_WHITE_FALLBACK : EDGE_COLOR_FALLBACK;\n }\n\n let maxCount = 0;\n let dominantColor = '64,64,80';\n let totalColorWeight = 0;\n\n colorMap.forEach((count, color) => {\n totalColorWeight += count;\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n });\n\n const whiteDominates =\n whiteWeight > 0 && whiteWeight >= totalColorWeight * WHITE_DOMINANCE_RATIO;\n if (whiteDominates) {\n return EDGE_WHITE_FALLBACK;\n }\n\n const [r, g, b] = dominantColor.split(',').map(Number);\n return rgbToHex(r, g, b);\n}\n\nfunction extractDominantColorHistogram(data: Buffer): string {\n const colorMap = new Map<string, number>();\n const bucketSize = 16;\n let whiteWeight = 0;\n\n for (let i = 0; i < data.length; i += 4) {\n const alpha = data[i + 3];\n if (alpha !== undefined && alpha < 8) continue;\n\n const r = Math.floor(data[i] / bucketSize) * bucketSize;\n const g = Math.floor(data[i + 1] / bucketSize) * bucketSize;\n const b = Math.floor(data[i + 2] / bucketSize) * bucketSize;\n\n if (r >= 240 && g >= 240 && b >= 240) {\n whiteWeight += 1;\n continue;\n }\n\n const key = `${r},${g},${b}`;\n colorMap.set(key, (colorMap.get(key) || 0) + 1);\n }\n\n if (!colorMap.size) {\n return whiteWeight > 0 ? EDGE_WHITE_FALLBACK : EDGE_COLOR_FALLBACK;\n }\n\n let maxCount = 0;\n let dominantColor = '64,64,80';\n let totalColorWeight = 0;\n\n colorMap.forEach((count, color) => {\n totalColorWeight += count;\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n });\n\n const whiteDominates =\n whiteWeight > 0 && whiteWeight >= totalColorWeight * WHITE_DOMINANCE_RATIO;\n if (whiteDominates) {\n return EDGE_WHITE_FALLBACK;\n }\n\n const [r, g, b] = dominantColor.split(',').map(Number);\n return rgbToHex(r, g, b);\n}\n","import sharp from 'sharp';\nimport { hexToRgb, rgbToHex } from '../../utils/color';\nimport { extractEnhancedColorFromBuffer } from './colorHistogram';\nimport {\n EDGE_COLOR_FALLBACK,\n EDGE_WHITE_FALLBACK,\n type EdgeColorSet,\n type EdgeKey,\n WHITE_DOMINANCE_RATIO,\n} from './types';\n\nexport async function extractEdgeColorsFromBuffer(\n buffer: Buffer,\n): Promise<EdgeColorSet> {\n try {\n const sample = await sharp(buffer)\n .resize(400, 400, {\n fit: 'inside',\n kernel: 'lanczos3',\n withoutEnlargement: true,\n })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n\n return computeEdgeColorSet(\n sample.data,\n sample.info.width,\n sample.info.height,\n );\n } catch {\n try {\n const fallback = await extractEnhancedColorFromBuffer(buffer, 'edge');\n return {\n top: fallback,\n right: fallback,\n bottom: fallback,\n left: fallback,\n };\n } catch {\n return {\n top: EDGE_COLOR_FALLBACK,\n right: EDGE_COLOR_FALLBACK,\n bottom: EDGE_COLOR_FALLBACK,\n left: EDGE_COLOR_FALLBACK,\n };\n }\n }\n}\n\nfunction computeEdgeColorSet(\n data: Buffer,\n width: number,\n height: number,\n): EdgeColorSet {\n const thicknessX = Math.max(2, Math.floor(width * 0.12));\n const thicknessY = Math.max(2, Math.floor(height * 0.12));\n const bucketSize = 16;\n\n const edgeMaps: Record<EdgeKey, Map<string, number>> = {\n top: new Map(),\n right: new Map(),\n bottom: new Map(),\n left: new Map(),\n };\n\n const whiteEdgeStrength: Record<EdgeKey, number> = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n };\n\n const accumulateEdgeSample = (\n edge: EdgeKey,\n weight: number,\n key: string,\n isWhiteSample: boolean,\n ) => {\n if (weight <= 0) return;\n if (isWhiteSample) {\n whiteEdgeStrength[edge] += weight;\n return;\n }\n edgeMaps[edge].set(key, (edgeMaps[edge].get(key) || 0) + weight);\n };\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const alpha = data[i + 3];\n\n if (alpha !== undefined && alpha < 8) continue;\n\n const brightness = (r + g + b) / 3;\n if (brightness < 12) continue;\n\n const isNearWhite = r >= 245 && g >= 245 && b >= 245;\n\n const pixelIndex = i / 4;\n const x = pixelIndex % width;\n const y = Math.floor(pixelIndex / width);\n\n const bucketR = Math.floor(r / bucketSize) * bucketSize;\n const bucketG = Math.floor(g / bucketSize) * bucketSize;\n const bucketB = Math.floor(b / bucketSize) * bucketSize;\n const key = `${bucketR},${bucketG},${bucketB}`;\n\n const topWeight = y < thicknessY ? 1 + (thicknessY - y) / thicknessY : 0;\n if (topWeight > 0) {\n accumulateEdgeSample('top', topWeight, key, isNearWhite);\n }\n\n const bottomWeight =\n y >= height - thicknessY\n ? 1 + (y - (height - thicknessY)) / thicknessY\n : 0;\n if (bottomWeight > 0) {\n accumulateEdgeSample('bottom', bottomWeight, key, isNearWhite);\n }\n\n const leftWeight = x < thicknessX ? 1 + (thicknessX - x) / thicknessX : 0;\n if (leftWeight > 0) {\n accumulateEdgeSample('left', leftWeight, key, isNearWhite);\n }\n\n const rightWeight =\n x >= width - thicknessX\n ? 1 + (x - (width - thicknessX)) / thicknessX\n : 0;\n if (rightWeight > 0) {\n accumulateEdgeSample('right', rightWeight, key, isNearWhite);\n }\n }\n\n return {\n top: resolveEdgeColor(edgeMaps.top, whiteEdgeStrength.top),\n right: resolveEdgeColor(edgeMaps.right, whiteEdgeStrength.right),\n bottom: resolveEdgeColor(edgeMaps.bottom, whiteEdgeStrength.bottom),\n left: resolveEdgeColor(edgeMaps.left, whiteEdgeStrength.left),\n };\n}\n\nfunction resolveEdgeColor(\n map: Map<string, number>,\n whiteStrength: number,\n): string {\n if (!map.size) {\n return whiteStrength > 0 ? EDGE_WHITE_FALLBACK : EDGE_COLOR_FALLBACK;\n }\n\n let dominantColor = '';\n let maxCount = 0;\n let totalColorWeight = 0;\n\n map.forEach((count, color) => {\n totalColorWeight += count;\n if (count > maxCount) {\n maxCount = count;\n dominantColor = color;\n }\n });\n\n if (!dominantColor) {\n return whiteStrength > 0 ? EDGE_WHITE_FALLBACK : EDGE_COLOR_FALLBACK;\n }\n\n const whiteDominates =\n whiteStrength > 0 &&\n (totalColorWeight === 0 ||\n whiteStrength >= totalColorWeight * WHITE_DOMINANCE_RATIO);\n\n if (whiteDominates) {\n return EDGE_WHITE_FALLBACK;\n }\n\n if (dominantColor.startsWith('#')) {\n return dominantColor.toUpperCase();\n }\n\n const [r, g, b] = dominantColor.split(',').map(Number);\n return rgbToHex(r, g, b);\n}\n\nexport function blendEdgeColors(edgeColors: EdgeColorSet): string {\n const colors = Object.values(edgeColors);\n if (!colors.length) {\n return EDGE_COLOR_FALLBACK;\n }\n\n const totals = colors.reduce(\n (acc, hex) => {\n const { r, g, b } = hexToRgb(hex || EDGE_COLOR_FALLBACK);\n acc.r += r;\n acc.g += g;\n acc.b += b;\n return acc;\n },\n { r: 0, g: 0, b: 0 },\n );\n\n const count = colors.length;\n return rgbToHex(totals.r / count, totals.g / count, totals.b / count);\n}\n","import { encode as encodeBlurHash } from 'blurhash';\nimport lqip from 'lqip-modern';\nimport sharp from 'sharp';\nimport {\n blendEdgeColors,\n extractEdgeColorsFromBuffer,\n} from './edgeColorExtractor';\nimport {\n BLUR_PLACEHOLDER_FALLBACK_WIDTH,\n BLUR_PLACEHOLDER_MAX_CHARS,\n BLUR_PLACEHOLDER_QUALITY,\n BLUR_PLACEHOLDER_WIDTH,\n type BlurHashResult,\n type GenerateBlurOptions,\n} from './types';\n\nexport async function encodeBlurHashString(\n buffer: Buffer,\n componentX: number = 4,\n componentY: number = 3,\n): Promise<string> {\n const { data, info } = await sharp(buffer)\n .resize(32, 32, { fit: 'inside' })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n\n const clampedX = Math.max(1, Math.min(Math.round(componentX), info.width, 9));\n const clampedY = Math.max(1, Math.min(Math.round(componentY), info.height, 9));\n\n return encodeBlurHash(\n new Uint8ClampedArray(data),\n info.width,\n info.height,\n clampedX,\n clampedY,\n );\n}\n\nexport async function generateBlurPlaceholder(\n buffer: Buffer,\n options: GenerateBlurOptions = {},\n): Promise<BlurHashResult> {\n const targetWidth = options.width ?? BLUR_PLACEHOLDER_WIDTH;\n const fallbackWidth =\n options.fallbackWidth ?? BLUR_PLACEHOLDER_FALLBACK_WIDTH;\n const quality = options.quality ?? BLUR_PLACEHOLDER_QUALITY;\n const maxChars = options.maxDataUrlChars ?? BLUR_PLACEHOLDER_MAX_CHARS;\n\n try {\n let processBuffer = buffer;\n const isSvg = /<svg[\\s>]/i.test(buffer.toString('utf8', 0, 1024));\n if (isSvg) {\n const normalizedSvg = buffer\n .toString('utf8')\n .replace(/<svg\\b/gi, '<svg')\n .replace(/<\\/svg\\s*>/gi, '</svg>');\n processBuffer = await sharp(Buffer.from(normalizedSvg, 'utf8'))\n .resize(targetWidth, targetWidth, { fit: 'inside' })\n .png()\n .toBuffer();\n }\n\n const buildPlaceholder = (width: number, q: number) =>\n lqip(processBuffer, {\n outputFormat: 'webp',\n resize: width,\n outputOptions: { quality: q, effort: 6, smartSubsample: true },\n });\n\n let result = await buildPlaceholder(targetWidth, quality);\n if (result.metadata.dataURIBase64.length > maxChars) {\n result = await buildPlaceholder(fallbackWidth, quality);\n }\n\n const dataURL = result.metadata.dataURIBase64;\n const edgeColors = await extractEdgeColorsFromBuffer(processBuffer);\n const color = blendEdgeColors(edgeColors);\n\n let blurHash: string | undefined;\n if (options.includeBlurHash) {\n try {\n blurHash = await encodeBlurHashString(processBuffer);\n } catch {\n blurHash = undefined;\n }\n }\n\n return {\n dataURL,\n color,\n ...(blurHash && { blurHash }),\n };\n } catch {\n return generateFallbackBlur(buffer, options.includeBlurHash);\n }\n}\n\nexport const generateBlurHash = generateBlurPlaceholder;\n\nasync function generateFallbackBlur(\n buffer: Buffer,\n includeBlurHash?: boolean,\n): Promise<BlurHashResult> {\n const tinyBuffer = await sharp(buffer)\n .resize(64, 64, { fit: 'cover', kernel: 'lanczos3' })\n .blur(1.0)\n .webp({\n quality: 75,\n effort: 6,\n smartSubsample: false,\n })\n .toBuffer();\n\n const dataURL = `data:image/webp;base64,${tinyBuffer.toString('base64')}`;\n const edgeColors = await extractEdgeColorsFromBuffer(buffer);\n const color = blendEdgeColors(edgeColors);\n\n let blurHash: string | undefined;\n if (includeBlurHash) {\n try {\n blurHash = await encodeBlurHashString(tinyBuffer);\n } catch {\n blurHash = undefined;\n }\n }\n\n return { dataURL, color, ...(blurHash && { blurHash }) };\n}\n","export class AsyncSemaphore {\n private activeCount = 0;\n private readonly queue: Array<() => void> = [];\n\n constructor(private readonly concurrency: number) {\n if (concurrency < 1) {\n throw new Error('AsyncSemaphore concurrency must be >= 1');\n }\n }\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n await this.acquire();\n\n try {\n return await task();\n } finally {\n this.release();\n }\n }\n\n private acquire(): Promise<void> {\n if (this.activeCount < this.concurrency) {\n this.activeCount += 1;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.queue.push(() => {\n this.activeCount += 1;\n resolve();\n });\n });\n }\n\n private release(): void {\n this.activeCount = Math.max(0, this.activeCount - 1);\n const next = this.queue.shift();\n next?.();\n }\n}\n\nexport async function withTimeout<T>(\n task: Promise<T>,\n timeoutMs: number,\n label: string,\n): Promise<T> {\n let timeoutHandle: NodeJS.Timeout | null = null;\n\n try {\n return await Promise.race([\n task,\n new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(`${label} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n }\n}\n","import crypto from 'node:crypto';\nimport { generateBlurPlaceholder, optimizeImage } from '../optimization';\nimport { withTimeout } from '../semaphore';\nimport type {\n ProcessedImageBufferResult,\n ProcessImageBufferOptions,\n} from './types';\n\nexport async function processImageBuffer(\n originalBuffer: Buffer,\n options: ProcessImageBufferOptions = {},\n): Promise<ProcessedImageBufferResult> {\n const optTimeout = options.optimizationTimeoutMs ?? 60000;\n const blurTimeout = options.blurTimeoutMs ?? 30000;\n\n const contentHash = crypto\n .createHash('sha256')\n .update(originalBuffer)\n .digest('hex');\n\n const optimized = await withTimeout(\n optimizeImage(originalBuffer, {\n maxDimensions: options.maxDimensions,\n outputFormat: options.outputFormat,\n quality: options.quality,\n }),\n optTimeout,\n 'Image optimization',\n );\n\n if (!optimized || !optimized.buffer) {\n throw new Error('Image optimization returned invalid result');\n }\n\n if (!optimized.width || !optimized.height) {\n throw new Error(\n `Image dimensions missing: width=${optimized.width}, height=${optimized.height}`,\n );\n }\n\n const blurData = await withTimeout(\n generateBlurPlaceholder(optimized.buffer, {\n includeBlurHash: options.includeBlurHash,\n }),\n blurTimeout,\n 'Blur generation',\n );\n\n return {\n optimized,\n blurData,\n contentHash,\n originalSize: originalBuffer.length,\n };\n}\n","import type { UploadLocale } from '../types';\n\nexport interface FileLike {\n name?: string;\n size: number;\n type: string;\n}\n\nexport function validateImageFileStrict(\n file: FileLike,\n maxSizeMB: number,\n allowedFormats: string[],\n): { valid: boolean; error?: string } {\n const maxBytes = maxSizeMB * 1024 * 1024;\n if (file.size > maxBytes) {\n return {\n valid: false,\n error: `File size (${(file.size / 1024 / 1024).toFixed(2)}MB) exceeds maximum of ${maxSizeMB}MB`,\n };\n }\n\n if (allowedFormats.length > 0 && !allowedFormats.includes(file.type)) {\n return {\n valid: false,\n error: `File type ${file.type || 'unknown'} is not allowed. Allowed: ${allowedFormats.join(', ')}`,\n };\n }\n\n return { valid: true };\n}\n\nexport function validateImageFile(\n file: FileLike,\n maxSizeMB: number,\n locale: UploadLocale = 'en',\n allowedFormats?: string[],\n): string | null {\n if (!file.type || !file.type.startsWith('image/')) {\n return locale === 'ar'\n ? 'يرجى اختيار ملف صورة صالح'\n : 'Please select a valid image file';\n }\n\n if (allowedFormats && allowedFormats.length > 0 && !allowedFormats.includes(file.type)) {\n return locale === 'ar'\n ? `صيغة الملف غير مدعومة (${file.type})`\n : `Unsupported image format (${file.type})`;\n }\n\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n return locale === 'ar'\n ? `يجب ألا يتجاوز حجم الملف ${maxSizeMB}MB`\n : `File size must be less than ${maxSizeMB}MB`;\n }\n\n return null;\n}\n\nexport function validateImageFileWithName(\n file: FileLike & { name: string },\n maxSizeMB: number,\n locale: UploadLocale = 'en',\n): string | null {\n if (!file.type || !file.type.startsWith('image/')) {\n return locale === 'ar'\n ? `${file.name}: ليس ملف صورة صالحاً`\n : `${file.name}: Not a valid image file`;\n }\n\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n return locale === 'ar'\n ? `${file.name}: يجب ألا يتجاوز حجم الملف ${maxSizeMB}MB`\n : `${file.name}: File size must be less than ${maxSizeMB}MB`;\n }\n\n return null;\n}\n\nexport function validateMultipleFiles(\n files: Array<FileLike & { name: string }>,\n maxSizeMB: number,\n currentCount: number,\n maxImages: number,\n locale: UploadLocale = 'en',\n): string | null {\n if (currentCount + files.length > maxImages) {\n return locale === 'ar'\n ? `يمكن رفع ${maxImages} صورة فقط. المتبقي: ${maxImages - currentCount}.`\n : `Can only upload ${maxImages} images. ${maxImages - currentCount} remaining.`;\n }\n\n const oversizedFiles: string[] = [];\n for (const file of files) {\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > maxSizeMB) {\n oversizedFiles.push(file.name);\n }\n }\n\n if (oversizedFiles.length > 0) {\n if (locale === 'ar') {\n return `الملفات التالية أكبر من الحد المسموح (${maxSizeMB}MB): ${oversizedFiles.join(', ')}`;\n }\n return `The following file${\n oversizedFiles.length > 1 ? 's are' : ' is'\n } too large (max ${maxSizeMB}MB): ${oversizedFiles.join(', ')}`;\n }\n\n return null;\n}\n","import crypto from 'node:crypto';\nimport type { ImageOutputFormat } from '../../types';\nimport type {\n GeneratedStorageTarget,\n StoragePathContext,\n StoragePathGenerator,\n} from './types';\n\nexport function formatToExtension(format: ImageOutputFormat): string {\n switch (format) {\n case 'svg':\n return 'svg';\n case 'png':\n return 'png';\n case 'webp':\n return 'webp';\n case 'jpeg':\n return 'jpg';\n default:\n return 'avif';\n }\n}\n\nexport function sanitizeSegment(value: string): string {\n return value\n .replace(/\\\\/g, '/')\n .split('/')\n .map((part) => part.trim().replace(/[^a-zA-Z0-9._-]/g, '-'))\n .filter((part) => part && part !== '.' && part !== '..')\n .join('/');\n}\n\nexport function createDefaultPathGenerator(): StoragePathGenerator {\n let imageCounter = 0;\n\n return (ctx: StoragePathContext): GeneratedStorageTarget => {\n const cleanFolder = ctx.folder ? sanitizeSegment(ctx.folder) : '';\n\n if (ctx.customFilename?.trim()) {\n let cleanName = ctx.customFilename.replace(/^.*[\\\\/]/, '').trim();\n if (!cleanName.includes('.')) {\n cleanName = `${cleanName}.${ctx.extension}`;\n }\n cleanName = cleanName.replace(/[^a-zA-Z0-9._-]/g, '-');\n const fullPath = cleanFolder ? `${cleanFolder}/${cleanName}` : cleanName;\n return {\n bucket: ctx.bucket,\n path: fullPath,\n filename: cleanName,\n };\n }\n\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n imageCounter = (imageCounter + 1) % 10000;\n const seq = String(imageCounter).padStart(4, '0');\n const timestamp = Date.now();\n const randomSuffix = crypto.randomUUID().split('-')[0];\n\n const prefix = sanitizeSegment(\n ctx.preset || cleanFolder.split('/')[0] || 'img',\n );\n const filename = `${prefix}-${year}${month}${day}-${seq}-${timestamp}-${randomSuffix}.${ctx.extension}`;\n const fullPath = cleanFolder\n ? `${cleanFolder}/${year}/${month}/${filename}`\n : `${year}/${month}/${filename}`;\n\n return {\n bucket: ctx.bucket,\n path: fullPath,\n filename,\n };\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type {\n StorageAdapter,\n StorageUploadResult,\n} from '../../storage/types';\nimport type {\n GeneratedStorageTarget,\n StoragePathContext,\n StoragePathGenerator,\n} from './types';\n\nexport interface UploadWithCollisionRetryParams {\n storage: StorageAdapter;\n buildPath: StoragePathGenerator;\n pathContext: StoragePathContext;\n data: Buffer | Uint8Array;\n contentType: string;\n maxRetries?: number;\n}\n\nexport interface UploadWithCollisionRetryResult {\n uploadResult: StorageUploadResult;\n storageTarget: GeneratedStorageTarget;\n}\n\n/**\n * Determines whether a storage error represents a filename or object collision.\n * Matches `already exists` or `EEXIST`, while strictly excluding `does not exist`\n * (e.g. non-existent buckets, directories, or missing keys).\n */\nexport function isCollisionError(e: unknown): boolean {\n if (!e) return false;\n\n const code =\n typeof e === 'object' && e !== null && 'code' in e\n ? String((e as { code: unknown }).code).toUpperCase()\n : '';\n\n if (code === 'EEXIST') {\n return true;\n }\n if (code === 'ENOENT') {\n return false;\n }\n\n const msg =\n e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();\n\n // Strictly exclude non-existence errors (missing bucket, directory, key)\n if (\n msg.includes('does not exist') ||\n msg.includes(\"doesn't exist\") ||\n msg.includes('not exist') ||\n msg.includes('enoent')\n ) {\n return false;\n }\n\n // Match genuine collision indicators\n return (\n msg.includes('already exists') ||\n msg.includes('already_exists') ||\n msg.includes('eexist') ||\n msg.includes('file exists')\n );\n}\n\n/**\n * Uploads optimized image bytes to the storage backend with automatic filename\n * collision retries (or immediate `upsert: true` fallback when `customFilename` is set).\n */\nexport async function uploadWithCollisionRetry(\n params: UploadWithCollisionRetryParams,\n): Promise<UploadWithCollisionRetryResult> {\n const {\n storage,\n buildPath,\n pathContext,\n data,\n contentType,\n maxRetries = 3,\n } = params;\n\n let storageTarget = buildPath(pathContext);\n let uploadResult: StorageUploadResult | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n uploadResult = await storage.upload({\n bucket: storageTarget.bucket,\n path: storageTarget.path,\n data,\n contentType,\n upsert: Boolean(pathContext.customFilename),\n contentHash: pathContext.contentHash,\n metadata: pathContext.metadata,\n });\n break;\n } catch (e) {\n if (isCollisionError(e)) {\n if (pathContext.customFilename) {\n uploadResult = await storage.upload({\n bucket: storageTarget.bucket,\n path: storageTarget.path,\n data,\n contentType,\n upsert: true,\n contentHash: pathContext.contentHash,\n metadata: pathContext.metadata,\n });\n break;\n }\n storageTarget = buildPath({\n ...pathContext,\n customFilename: undefined,\n });\n continue;\n }\n throw e;\n }\n }\n\n if (!uploadResult) {\n throw new Error('Failed to upload image after multiple retries');\n }\n\n return { uploadResult, storageTarget };\n}\n\nexport interface MirrorBufferLocallyOptions {\n buffer: Buffer | Uint8Array;\n filename: string;\n fallbackUrl: string;\n mirrorDir?: string;\n publicUrlBase?: string;\n}\n\n/**\n * Mirrors an uploaded image buffer to a local directory when `mirrorDir` is configured.\n * Safely swallows read-only filesystem errors on serverless runtimes and resolves\n * `publicUrlBase` when local mirroring succeeds.\n */\nexport function mirrorBufferLocally(\n options: MirrorBufferLocallyOptions,\n): string {\n const { buffer, filename, fallbackUrl, mirrorDir, publicUrlBase } = options;\n if (!mirrorDir) {\n return fallbackUrl;\n }\n\n try {\n if (!fs.existsSync(mirrorDir)) {\n fs.mkdirSync(mirrorDir, { recursive: true });\n }\n fs.writeFileSync(path.join(mirrorDir, filename), buffer);\n if (publicUrlBase) {\n return `${publicUrlBase.replace(/\\/+$/, '')}/${filename}`;\n }\n } catch {\n // Safely ignored on read-only serverless filesystems\n }\n\n return fallbackUrl;\n}\n","import type {\n ImageUploadOptions,\n ImageUploadRecord,\n UploadedImageData,\n UploadPresetConfig,\n} from '../../types';\nimport {\n DEFAULT_ALLOWED_FORMATS,\n DEFAULT_IMAGE_DIMENSIONS,\n STANDARD_PRESETS,\n} from '../../types';\nimport { validateImageFileStrict } from '../../utils/validators';\nimport { UploadValidationError } from '../handler';\nimport { AsyncSemaphore } from '../semaphore';\nimport { processImageBuffer } from './bufferProcessor';\nimport {\n createDefaultPathGenerator,\n formatToExtension,\n} from './pathGenerator';\nimport type {\n ImageUploader,\n ImageUploaderOptions,\n InferredPresetKey,\n ProcessedImageBufferResult,\n ProcessImageBufferOptions,\n} from './types';\nimport { mirrorBufferLocally, uploadWithCollisionRetry } from './uploadRetry';\n\nexport function createImageUploader<\n TPresets extends Record<string, UploadPresetConfig> = Record<\n string,\n UploadPresetConfig\n >,\n>(\n options: ImageUploaderOptions<TPresets>,\n): ImageUploader<InferredPresetKey<TPresets>> {\n const {\n storage,\n defaultBucket = 'images',\n defaultFolder = '',\n defaultMaxSizeMB = 10,\n defaultAllowedFormats = DEFAULT_ALLOWED_FORMATS,\n defaultMaxDimensions = DEFAULT_IMAGE_DIMENSIONS,\n presets: customPresets,\n includeStandardPresets = true,\n pathGenerator,\n onUploadRecord,\n awaitRecordHook = false,\n concurrency = 2,\n optimizationTimeoutMs = 60000,\n blurTimeoutMs = 30000,\n includeBlurHash: defaultIncludeBlurHash = false,\n } = options;\n\n const mergedPresets: Record<string, UploadPresetConfig> = {\n ...(includeStandardPresets ? STANDARD_PRESETS : {}),\n ...(customPresets || {}),\n };\n\n const semaphore = new AsyncSemaphore(concurrency);\n const buildPath = pathGenerator || createDefaultPathGenerator();\n\n const resolvePreset = (\n presetName?: string,\n ): UploadPresetConfig | undefined =>\n presetName ? mergedPresets[presetName] : undefined;\n\n return {\n resolvePreset,\n\n async processBuffer(\n buffer: Buffer,\n procOptions: ProcessImageBufferOptions = {},\n ): Promise<ProcessedImageBufferResult> {\n return semaphore.run(() =>\n processImageBuffer(buffer, {\n maxDimensions: defaultMaxDimensions,\n optimizationTimeoutMs,\n blurTimeoutMs,\n includeBlurHash: defaultIncludeBlurHash,\n ...procOptions,\n }),\n );\n },\n\n async uploadImage(\n input,\n uploadOptions: ImageUploadOptions<InferredPresetKey<TPresets>> = {},\n ): Promise<UploadedImageData> {\n const presetConfig = resolvePreset(uploadOptions.preset);\n\n const bucket =\n uploadOptions.bucket || presetConfig?.bucket || defaultBucket;\n const folder =\n uploadOptions.folder ?? presetConfig?.folder ?? defaultFolder;\n const maxSizeMB =\n uploadOptions.maxSizeMB ??\n presetConfig?.maxSizeMB ??\n defaultMaxSizeMB;\n const allowedFormats =\n uploadOptions.allowedFormats ??\n presetConfig?.allowedFormats ??\n defaultAllowedFormats;\n const maxDimensions =\n uploadOptions.maxDimensions ??\n presetConfig?.maxDimensions ??\n defaultMaxDimensions;\n const outputFormat =\n uploadOptions.outputFormat ?? presetConfig?.outputFormat;\n const quality = uploadOptions.quality ?? presetConfig?.quality;\n const includeBlurHash =\n uploadOptions.includeBlurHash ??\n presetConfig?.includeBlurHash ??\n defaultIncludeBlurHash;\n\n const isWebFile = typeof (input as File).arrayBuffer === 'function';\n const fileType = input.type;\n const originalName = input.name;\n const fileSize = isWebFile\n ? (input as File).size\n : ((input as { size?: number; buffer: Buffer }).size ??\n (input as { buffer: Buffer }).buffer.length);\n\n const validation = validateImageFileStrict(\n { size: fileSize, type: fileType },\n maxSizeMB,\n allowedFormats,\n );\n if (!validation.valid) {\n throw new UploadValidationError(validation.error!);\n }\n\n try {\n const originalBuffer = isWebFile\n ? Buffer.from(await (input as File).arrayBuffer())\n : (input as { buffer: Buffer }).buffer;\n\n const { optimized, blurData, contentHash, originalSize } =\n await semaphore.run(() =>\n processImageBuffer(originalBuffer, {\n maxDimensions,\n outputFormat,\n quality,\n includeBlurHash,\n optimizationTimeoutMs,\n blurTimeoutMs,\n }),\n );\n\n const mainFormat = optimized.format;\n const extension = formatToExtension(mainFormat);\n const mainContentType =\n mainFormat === 'svg' ? 'image/svg+xml' : `image/${mainFormat}`;\n\n const { uploadResult, storageTarget } = await uploadWithCollisionRetry({\n storage,\n buildPath,\n pathContext: {\n bucket,\n folder,\n preset: uploadOptions.preset,\n format: mainFormat,\n extension,\n customFilename: uploadOptions.customFilename,\n contentHash,\n originalName,\n metadata: uploadOptions.metadata,\n },\n data: optimized.buffer,\n contentType: mainContentType,\n });\n\n const resolvedUrl = mirrorBufferLocally({\n buffer: optimized.buffer,\n filename: storageTarget.filename,\n fallbackUrl: uploadResult.url,\n mirrorDir: presetConfig?.mirrorDir,\n publicUrlBase: presetConfig?.publicUrlBase,\n });\n\n const resolvedQuality = quality ?? 85;\n const result: UploadedImageData = {\n url: resolvedUrl,\n blurDataUrl: blurData.dataURL,\n blurColor: blurData.color,\n ...(blurData.blurHash && { blurHash: blurData.blurHash }),\n altText: uploadOptions.altText || '',\n width: optimized.width,\n height: optimized.height,\n format: optimized.format,\n size: optimized.size,\n originalSize,\n contentHash,\n storagePath: uploadResult.path,\n bucket: storageTarget.bucket,\n ...(uploadOptions.preset && { preset: uploadOptions.preset }),\n ...(folder && { folder }),\n ...(uploadOptions.metadata && { metadata: uploadOptions.metadata }),\n uploadedAt: new Date().toISOString(),\n };\n\n if (onUploadRecord) {\n const record: ImageUploadRecord = {\n ...result,\n quality: resolvedQuality,\n };\n\n if (awaitRecordHook) {\n await onUploadRecord(record);\n } else {\n Promise.resolve(onUploadRecord(record)).catch(() => {\n // Non-blocking best-effort persistence\n });\n }\n }\n\n return result;\n } catch (error) {\n if (error instanceof UploadValidationError) {\n throw error;\n }\n throw new Error(\n `Image upload failed: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n }\n },\n\n async deleteImage(targetPath: string, bucket?: string): Promise<void> {\n try {\n await storage.delete(bucket || defaultBucket, targetPath);\n } catch (error) {\n throw new Error(\n `Image deletion failed: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n }\n },\n\n async deleteByUrl(url: string): Promise<boolean> {\n if (storage.deleteByUrl) {\n return storage.deleteByUrl(url);\n }\n return false;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["e:\\Personal-Projects\\image-upload-kit\\dist\\server.cjs"],"names":[],"mappings":"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AAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,iBAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,kBAAA;AACA,EAAA;AACA,kBAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,0BAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,0BAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,sBAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,oBAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,sBAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,0CAAA;AACA,MAAA;AACA,MAAA;AACA,0CAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"E:\\Personal-Projects\\image-upload-kit\\dist\\server.cjs","sourcesContent":[null]}
|
package/dist/server.d.cts
CHANGED
|
@@ -1,44 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
width: number;
|
|
6
|
-
height: number;
|
|
7
|
-
format: ImageOutputFormat;
|
|
8
|
-
size: number;
|
|
9
|
-
}
|
|
10
|
-
interface BlurHashResult {
|
|
11
|
-
dataURL: string;
|
|
12
|
-
color: string;
|
|
13
|
-
blurHash?: string;
|
|
14
|
-
}
|
|
15
|
-
interface OptimizeImageOptions {
|
|
16
|
-
/** Max bounding box dimensions (fit: 'inside', withoutEnlargement: true). Defaults to 1920x1080. */
|
|
17
|
-
maxDimensions?: ImageDimensions;
|
|
18
|
-
/** Explicit output format; omit for smart size-guarded AVIF/WebP selection */
|
|
19
|
-
outputFormat?: ExplicitOutputFormat;
|
|
20
|
-
/** 1–100 compression quality. Defaults to smart photo/graphic heuristic (85–88). */
|
|
21
|
-
quality?: number;
|
|
22
|
-
}
|
|
23
|
-
interface GenerateBlurOptions {
|
|
24
|
-
width?: number;
|
|
25
|
-
fallbackWidth?: number;
|
|
26
|
-
quality?: number;
|
|
27
|
-
maxDataUrlChars?: number;
|
|
28
|
-
includeBlurHash?: boolean;
|
|
29
|
-
}
|
|
30
|
-
type ColorSamplingMode = 'balanced' | 'edge';
|
|
31
|
-
type EdgeKey = 'top' | 'right' | 'bottom' | 'left';
|
|
32
|
-
type EdgeColorSet = Record<EdgeKey, string>;
|
|
33
|
-
declare const PRIMARY_AVIF_EFFORT = 6;
|
|
34
|
-
declare const RETRY_AVIF_EFFORT = 5;
|
|
35
|
-
declare const BLUR_PLACEHOLDER_WIDTH = 128;
|
|
36
|
-
declare const BLUR_PLACEHOLDER_FALLBACK_WIDTH = 96;
|
|
37
|
-
declare const BLUR_PLACEHOLDER_QUALITY = 80;
|
|
38
|
-
declare const BLUR_PLACEHOLDER_MAX_CHARS = 8000;
|
|
39
|
-
declare const EDGE_COLOR_FALLBACK = "#6B7280";
|
|
40
|
-
declare const EDGE_WHITE_FALLBACK = "#F9FAFB";
|
|
41
|
-
declare const WHITE_DOMINANCE_RATIO = 1.35;
|
|
1
|
+
import { O as OptimizeImageOptions, a as OptimizedImageResult, G as GenerateBlurOptions, B as BlurHashResult, E as EdgeColorSet, C as ColorSamplingMode, P as ProcessImageBufferOptions, b as ProcessedImageBufferResult, I as ImageUploaderOptions, c as ImageUploader, d as InferredPresetKey, S as StoragePathGenerator, e as StoragePathContext, f as GeneratedStorageTarget } from './index-Brk_uHs6.cjs';
|
|
2
|
+
export { A as AllowClientOverrides, g as AuthorizeContext, h as BLUR_PLACEHOLDER_FALLBACK_WIDTH, i as BLUR_PLACEHOLDER_MAX_CHARS, j as BLUR_PLACEHOLDER_QUALITY, k as BLUR_PLACEHOLDER_WIDTH, D as DEFAULT_LIMIT_INPUT_PIXELS, l as EDGE_COLOR_FALLBACK, m as EDGE_WHITE_FALLBACK, n as EdgeKey, o as PRIMARY_AVIF_EFFORT, R as RETRY_AVIF_EFFORT, U as UploadErrorContext, p as UploadHttpHandlerOptions, q as UploadValidationError, W as WHITE_DOMINANCE_RATIO, r as createUploadHandler, s as createUploadHttpHandler, t as isClientValidationError } from './index-Brk_uHs6.cjs';
|
|
3
|
+
import { k as UploadPresetConfig, c as ImageOutputFormat, e as ImageVariant } from './upload-C5Trd6Dh.cjs';
|
|
4
|
+
import { S as StorageAdapter, h as StorageUploadResult } from './types-BrP-o9nd.cjs';
|
|
42
5
|
|
|
43
6
|
declare function optimizeImage(buffer: Buffer, options?: OptimizeImageOptions): Promise<OptimizedImageResult>;
|
|
44
7
|
|
|
@@ -47,90 +10,11 @@ declare function generateBlurPlaceholder(buffer: Buffer, options?: GenerateBlurO
|
|
|
47
10
|
declare const generateBlurHash: typeof generateBlurPlaceholder;
|
|
48
11
|
|
|
49
12
|
declare function extractEdgeColorsFromBuffer(buffer: Buffer): Promise<EdgeColorSet>;
|
|
13
|
+
declare function computeEdgeColorSet(data: Buffer, width: number, height: number): EdgeColorSet;
|
|
50
14
|
declare function blendEdgeColors(edgeColors: EdgeColorSet): string;
|
|
51
15
|
|
|
52
16
|
declare function extractEnhancedColorFromBuffer(buffer: Buffer, mode?: ColorSamplingMode): Promise<string>;
|
|
53
17
|
|
|
54
|
-
interface ProcessedImageBufferResult {
|
|
55
|
-
optimized: OptimizedImageResult;
|
|
56
|
-
blurData: BlurHashResult;
|
|
57
|
-
contentHash: string;
|
|
58
|
-
originalSize: number;
|
|
59
|
-
}
|
|
60
|
-
interface ProcessImageBufferOptions {
|
|
61
|
-
maxDimensions?: ImageDimensions;
|
|
62
|
-
outputFormat?: ExplicitOutputFormat;
|
|
63
|
-
quality?: number;
|
|
64
|
-
includeBlurHash?: boolean;
|
|
65
|
-
optimizationTimeoutMs?: number;
|
|
66
|
-
blurTimeoutMs?: number;
|
|
67
|
-
}
|
|
68
|
-
interface StoragePathContext {
|
|
69
|
-
bucket: string;
|
|
70
|
-
folder?: string;
|
|
71
|
-
preset?: string;
|
|
72
|
-
format: ImageOutputFormat;
|
|
73
|
-
extension: string;
|
|
74
|
-
customFilename?: string;
|
|
75
|
-
contentHash: string;
|
|
76
|
-
originalName?: string;
|
|
77
|
-
metadata?: Record<string, string>;
|
|
78
|
-
}
|
|
79
|
-
interface GeneratedStorageTarget {
|
|
80
|
-
bucket: string;
|
|
81
|
-
path: string;
|
|
82
|
-
filename: string;
|
|
83
|
-
}
|
|
84
|
-
type StoragePathGenerator = (context: StoragePathContext) => GeneratedStorageTarget;
|
|
85
|
-
interface ImageUploaderOptions<TPresets extends Record<string, UploadPresetConfig> = Record<StandardPresetName, UploadPresetConfig>> {
|
|
86
|
-
/** Pluggable storage backend (Supabase, S3, R2, Local FS, Memory, or custom) */
|
|
87
|
-
storage: StorageAdapter;
|
|
88
|
-
/** Default bucket name when neither `options.bucket` nor `preset.bucket` is provided (defaults to `'images'`) */
|
|
89
|
-
defaultBucket?: string;
|
|
90
|
-
/** Default folder prefix within the bucket (defaults to `''` or preset folder) */
|
|
91
|
-
defaultFolder?: string;
|
|
92
|
-
/** Default max input size in MB (defaults to `10`) */
|
|
93
|
-
defaultMaxSizeMB?: number;
|
|
94
|
-
/** Default allowed MIME formats */
|
|
95
|
-
defaultAllowedFormats?: string[];
|
|
96
|
-
/** Default max bounding box dimensions (defaults to `1920x1080`) */
|
|
97
|
-
defaultMaxDimensions?: ImageDimensions;
|
|
98
|
-
/**
|
|
99
|
-
* Project-specific named presets (merged over universal `STANDARD_PRESETS` unless `includeStandardPresets: false`).
|
|
100
|
-
* Preset names are automatically inferred in `uploader.uploadImage(file, { preset })`.
|
|
101
|
-
*/
|
|
102
|
-
presets?: TPresets;
|
|
103
|
-
/** Include universal visual role presets (`thumbnail`, `avatar`, `card`, `cover`, `hero`, `logo`, `original`). Defaults to `true`. */
|
|
104
|
-
includeStandardPresets?: boolean;
|
|
105
|
-
/** Custom storage path generator for full control over bucket/folder/filename layout */
|
|
106
|
-
pathGenerator?: StoragePathGenerator;
|
|
107
|
-
/** Optional database/analytics hook invoked after each successful upload */
|
|
108
|
-
onUploadRecord?: UploadRecordHook;
|
|
109
|
-
/** Wait for `onUploadRecord` before returning (defaults to `false` best-effort) */
|
|
110
|
-
awaitRecordHook?: boolean;
|
|
111
|
-
/** Max concurrent Sharp + LQIP image processing pipelines (defaults to `2`) */
|
|
112
|
-
concurrency?: number;
|
|
113
|
-
/** Timeout per Sharp optimization job in ms (defaults to `60000`) */
|
|
114
|
-
optimizationTimeoutMs?: number;
|
|
115
|
-
/** Timeout per LQIP/blur generation job in ms (defaults to `30000`) */
|
|
116
|
-
blurTimeoutMs?: number;
|
|
117
|
-
/** Generate compact BlurHash strings by default on every upload */
|
|
118
|
-
includeBlurHash?: boolean;
|
|
119
|
-
}
|
|
120
|
-
type InferredPresetKey<TPresets extends Record<string, UploadPresetConfig>, TIncludeStandard extends boolean = true> = (keyof TPresets & string) | (TIncludeStandard extends false ? never : StandardPresetName) | (string & {});
|
|
121
|
-
interface ImageUploader<TPreset extends string = string> {
|
|
122
|
-
uploadImage(file: File | {
|
|
123
|
-
buffer: Buffer;
|
|
124
|
-
name?: string;
|
|
125
|
-
type: string;
|
|
126
|
-
size?: number;
|
|
127
|
-
}, options?: ImageUploadOptions<TPreset>): Promise<UploadedImageData>;
|
|
128
|
-
processBuffer(buffer: Buffer, options?: ProcessImageBufferOptions): Promise<ProcessedImageBufferResult>;
|
|
129
|
-
deleteImage(path: string, bucket?: string): Promise<void>;
|
|
130
|
-
deleteByUrl(url: string): Promise<boolean>;
|
|
131
|
-
resolvePreset(presetName?: string): UploadPresetConfig | undefined;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
18
|
declare function processImageBuffer(originalBuffer: Buffer, options?: ProcessImageBufferOptions): Promise<ProcessedImageBufferResult>;
|
|
135
19
|
|
|
136
20
|
declare function createImageUploader<TPresets extends Record<string, UploadPresetConfig> = Record<string, UploadPresetConfig>>(options: ImageUploaderOptions<TPresets>): ImageUploader<InferredPresetKey<TPresets>>;
|
|
@@ -153,67 +37,106 @@ interface UploadWithCollisionRetryResult {
|
|
|
153
37
|
}
|
|
154
38
|
/**
|
|
155
39
|
* Determines whether a storage error represents a filename or object collision.
|
|
156
|
-
* Matches `already exists
|
|
157
|
-
* (e.g. non-existent buckets, directories, or missing keys).
|
|
40
|
+
* Matches `already exists`, `EEXIST`, or HTTP 412 Precondition Failed, while strictly
|
|
41
|
+
* excluding `does not exist` (e.g. non-existent buckets, directories, or missing keys).
|
|
158
42
|
*/
|
|
159
43
|
declare function isCollisionError(e: unknown): boolean;
|
|
160
44
|
/**
|
|
161
45
|
* Uploads optimized image bytes to the storage backend with automatic filename
|
|
162
|
-
* collision retries
|
|
46
|
+
* collision retries. Server-side `customFilename` uses `upsert: true`, while
|
|
47
|
+
* client-supplied `customFilename` (`isClientFilename: true`) never upserts and
|
|
48
|
+
* appends a unique suffix on collision.
|
|
163
49
|
*/
|
|
164
50
|
declare function uploadWithCollisionRetry(params: UploadWithCollisionRetryParams): Promise<UploadWithCollisionRetryResult>;
|
|
165
51
|
interface MirrorBufferLocallyOptions {
|
|
166
52
|
buffer: Buffer | Uint8Array;
|
|
167
53
|
filename: string;
|
|
54
|
+
storagePath?: string;
|
|
168
55
|
fallbackUrl: string;
|
|
169
56
|
mirrorDir?: string;
|
|
170
57
|
publicUrlBase?: string;
|
|
171
58
|
}
|
|
172
59
|
/**
|
|
173
60
|
* Mirrors an uploaded image buffer to a local directory when `mirrorDir` is configured.
|
|
174
|
-
*
|
|
175
|
-
* `publicUrlBase` when local mirroring succeeds.
|
|
61
|
+
* Uses non-blocking `fs/promises` I/O, safely swallows read-only filesystem errors on
|
|
62
|
+
* serverless runtimes, and resolves `publicUrlBase` when local mirroring succeeds.
|
|
176
63
|
*/
|
|
177
|
-
declare function mirrorBufferLocally(options: MirrorBufferLocallyOptions): string
|
|
64
|
+
declare function mirrorBufferLocally(options: MirrorBufferLocallyOptions): Promise<string>;
|
|
178
65
|
|
|
179
|
-
interface
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
66
|
+
interface GenerateImageVariantsParams {
|
|
67
|
+
sourceBuffer: Buffer;
|
|
68
|
+
format: ImageOutputFormat;
|
|
69
|
+
quality?: number;
|
|
70
|
+
effort?: number;
|
|
71
|
+
limitInputPixels?: number;
|
|
72
|
+
mainWidth: number;
|
|
73
|
+
mainHeight: number;
|
|
74
|
+
mainUrl: string;
|
|
75
|
+
baseStoragePath: string;
|
|
76
|
+
baseFilename: string;
|
|
77
|
+
bucket: string;
|
|
78
|
+
storage: StorageAdapter;
|
|
79
|
+
variantWidths?: number[];
|
|
80
|
+
upsert?: boolean;
|
|
81
|
+
contentHash?: string;
|
|
82
|
+
metadata?: Record<string, string>;
|
|
83
|
+
mirrorDir?: string;
|
|
84
|
+
publicUrlBase?: string;
|
|
193
85
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
86
|
+
interface GeneratedVariantsResult {
|
|
87
|
+
variants: ImageVariant[];
|
|
88
|
+
srcSet?: string;
|
|
89
|
+
}
|
|
90
|
+
declare function buildVariantStoragePath(basePath: string, width: number): string;
|
|
91
|
+
declare function generateImageVariants(params: GenerateImageVariantsParams): Promise<GeneratedVariantsResult>;
|
|
92
|
+
|
|
93
|
+
type SniffedImageFormat = 'jpeg' | 'png' | 'gif' | 'webp' | 'avif' | 'heif' | 'tiff' | 'bmp' | 'ico' | 'svg';
|
|
94
|
+
interface SniffedFormatResult {
|
|
95
|
+
format: SniffedImageFormat;
|
|
96
|
+
mime: string;
|
|
197
97
|
}
|
|
198
|
-
declare function isClientValidationError(error: unknown): boolean;
|
|
199
98
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
99
|
+
* Inspects magic bytes of a buffer to determine its true image format,
|
|
100
|
+
* independent of any client-supplied MIME type or file extension.
|
|
202
101
|
*/
|
|
203
|
-
declare function
|
|
204
|
-
|
|
205
|
-
DELETE: (request: Request) => Promise<Response>;
|
|
206
|
-
};
|
|
102
|
+
declare function sniffImageFormat(input: Buffer | Uint8Array): SniffedFormatResult | null;
|
|
103
|
+
declare function assertMagicBytesAllowed(buffer: Buffer | Uint8Array, allowedFormats: string[], allowSvg?: boolean): SniffedFormatResult;
|
|
207
104
|
|
|
105
|
+
declare const DEFAULT_MAX_SVG_BYTES: number;
|
|
106
|
+
interface SanitizeSvgOptions {
|
|
107
|
+
maxBytes?: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Dependency-free SVG sanitizer.
|
|
111
|
+
* Strips `<script>`, `<foreignObject>`, `<iframe|embed|object>`, `<!DOCTYPE>`/`<!ENTITY>`,
|
|
112
|
+
* custom XML entities, `on*` event attributes, and non-fragment / non-raster-data `href`s.
|
|
113
|
+
*/
|
|
114
|
+
declare function sanitizeSvg(input: Buffer | string, options?: SanitizeSvgOptions): Buffer;
|
|
115
|
+
|
|
116
|
+
declare class SemaphoreQueueFullError extends Error {
|
|
117
|
+
readonly status = 503;
|
|
118
|
+
constructor(message?: string);
|
|
119
|
+
}
|
|
120
|
+
interface SemaphoreOptions {
|
|
121
|
+
maxQueue?: number;
|
|
122
|
+
}
|
|
123
|
+
interface SemaphoreRunOptions {
|
|
124
|
+
signal?: AbortSignal;
|
|
125
|
+
timeoutMs?: number;
|
|
126
|
+
label?: string;
|
|
127
|
+
}
|
|
208
128
|
declare class AsyncSemaphore {
|
|
209
129
|
private readonly concurrency;
|
|
210
130
|
private activeCount;
|
|
131
|
+
private readonly maxQueue?;
|
|
211
132
|
private readonly queue;
|
|
212
|
-
constructor(concurrency: number);
|
|
213
|
-
|
|
133
|
+
constructor(concurrency: number, options?: SemaphoreOptions | number);
|
|
134
|
+
get active(): number;
|
|
135
|
+
get pending(): number;
|
|
136
|
+
run<T>(task: () => Promise<T>, options?: SemaphoreRunOptions): Promise<T>;
|
|
214
137
|
private acquire;
|
|
215
138
|
private release;
|
|
216
139
|
}
|
|
217
140
|
declare function withTimeout<T>(task: Promise<T>, timeoutMs: number, label: string): Promise<T>;
|
|
218
141
|
|
|
219
|
-
export { AsyncSemaphore,
|
|
142
|
+
export { AsyncSemaphore, BlurHashResult, ColorSamplingMode, DEFAULT_MAX_SVG_BYTES, EdgeColorSet, GenerateBlurOptions, type GenerateImageVariantsParams, GeneratedStorageTarget, type GeneratedVariantsResult, ImageUploader, ImageUploaderOptions, InferredPresetKey, type MirrorBufferLocallyOptions, OptimizeImageOptions, OptimizedImageResult, ProcessImageBufferOptions, ProcessedImageBufferResult, type SanitizeSvgOptions, type SemaphoreOptions, SemaphoreQueueFullError, type SemaphoreRunOptions, type SniffedFormatResult, type SniffedImageFormat, StoragePathContext, StoragePathGenerator, type UploadWithCollisionRetryParams, type UploadWithCollisionRetryResult, assertMagicBytesAllowed, blendEdgeColors, buildVariantStoragePath, computeEdgeColorSet, createDefaultPathGenerator, createImageUploader, encodeBlurHashString, extractEdgeColorsFromBuffer, extractEnhancedColorFromBuffer, formatToExtension, generateBlurHash, generateBlurPlaceholder, generateImageVariants, isCollisionError, mirrorBufferLocally, optimizeImage, processImageBuffer, sanitizeSegment, sanitizeSvg, sniffImageFormat, uploadWithCollisionRetry, withTimeout };
|