import { StorageAdapter } from './storage-adapter.interface'; export type UrlMode = 'public' | 'signed'; export interface AzureStorageConfig { account: string; accountKey: string; container: string; /** Override the blob endpoint (e.g. Azurite). Defaults to https://{account}.blob.core.windows.net */ endpoint?: string; } export interface S3StorageConfig { region: string; bucket: string; accessKeyId: string; secretAccessKey: string; endpoint?: string; forcePathStyle?: boolean; /** Public URL prefix for urlMode:'public'. Defaults to the virtual-hosted bucket URL. */ publicBaseUrl?: string; } export interface LocalStorageConfig { basePath: string; /** Base URL that public/signed local URLs are built on. Defaults to '' (relative). */ publicBaseUrl?: string; /** Secret for signing local upload/download tokens. Auto-generated if omitted. */ signingSecret?: string; } export interface StorageConfig { driver: 'azure' | 's3' | 'local' | StorageAdapter; azure?: AzureStorageConfig; s3?: S3StorageConfig; local?: LocalStorageConfig; } export interface ValidationConfig { /** Bytes, or a human string like '5mb', '500kb'. */ maxFileSize?: number | string; /** Allowlist of exact MIME types or wildcards like 'image/*'. Empty/omitted = allow any. */ allow?: string[]; /** Sniff real content via magic bytes (default true). */ magicBytes?: boolean; /** * MIME types that legitimately have no magic signature (text formats). Under magicBytes, * an undetectable buffer is only accepted when the client MIME is in this set. */ signaturelessTypes?: string[]; } export interface PresignConfig { /** Signed URL lifetime in seconds (default 3600). */ expiresIn?: number; } export interface KeyStrategyInput { originalName: string; ext: string; mime: string; category?: string; } export interface UploadOptions { storage: StorageConfig; validation?: ValidationConfig; presign?: PresignConfig; /** 'signed' (default, private storage) or 'public' (permanent public URLs, legacy behaviour). */ urlMode?: UrlMode; /** Prefix for not-yet-confirmed presigned uploads (default 'staging/'). */ stagingPrefix?: string; /** Documented lifecycle TTL for staging objects (default 24). */ stagingTtlHours?: number; /** Custom storage-key generator. Default: `${uuid}.${ext}`. */ keyStrategy?: (input: KeyStrategyInput) => string; }