UNPKG

smart-dropzone-react

Version:

🚀 A production-ready React dropzone component with smart defaults, drag & drop reordering, chunked uploads, resume functionality, and comprehensive provider support (Cloudinary, AWS S3, Supabase)

1 lines • 12.9 kB
{"version":3,"sources":["../src/core/performance-monitor.ts"],"names":["_PerformanceMonitor","__publicField","duration","fileId","success","startTime","type","metadata","renderEvents","e","successEvents","errorEvents","avgRenderTime","sum","avgUploadTime","uploadSpeed","errorRate","successRate","memory","firstRender","firstUpload","PerformanceMonitor","PerformanceOptimizer","func","wait","timeout","args","limit","inThrottle","keyGenerator","cache","key","result","operation","options","maxAttempts","delay","lastError","i","error","resolve"],"mappings":"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","file":"chunk-GUDLRPF5.cjs","sourcesContent":["export interface PerformanceMetrics {\r\n bundleSize: {\r\n raw: number;\r\n gzipped: number;\r\n minified: number;\r\n };\r\n runtime: {\r\n renderTime: number;\r\n uploadSpeed: number;\r\n memoryUsage: number;\r\n cpuUsage: number;\r\n };\r\n userExperience: {\r\n timeToInteractive: number;\r\n firstUploadTime: number;\r\n errorRate: number;\r\n successRate: number;\r\n };\r\n}\r\n\r\nexport class PerformanceMonitor {\r\n private static instance: PerformanceMonitor;\r\n private events: Array<{\r\n type: \"render\" | \"upload\" | \"validation\" | \"error\" | \"success\";\r\n timestamp: number;\r\n duration?: number;\r\n metadata?: Record<string, any>;\r\n }> = [];\r\n private startTime: number = performance.now();\r\n private renderStartTime: number = 0;\r\n private uploadStartTimes: Map<string, number> = new Map();\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): PerformanceMonitor {\r\n if (!PerformanceMonitor.instance) {\r\n PerformanceMonitor.instance = new PerformanceMonitor();\r\n }\r\n return PerformanceMonitor.instance;\r\n }\r\n\r\n startRender(): void {\r\n this.renderStartTime = performance.now();\r\n }\r\n\r\n endRender(): number {\r\n const duration = performance.now() - this.renderStartTime;\r\n this.events.push({\r\n type: \"render\",\r\n timestamp: Date.now(),\r\n duration,\r\n });\r\n return duration;\r\n }\r\n\r\n startUpload(fileId: string): void {\r\n this.uploadStartTimes.set(fileId, performance.now());\r\n }\r\n\r\n endUpload(fileId: string, success: boolean): number {\r\n const startTime = this.uploadStartTimes.get(fileId);\r\n if (!startTime) return 0;\r\n\r\n const duration = performance.now() - startTime;\r\n this.uploadStartTimes.delete(fileId);\r\n\r\n this.events.push({\r\n type: success ? \"success\" : \"error\",\r\n timestamp: Date.now(),\r\n duration,\r\n metadata: { fileId, success },\r\n });\r\n\r\n return duration;\r\n }\r\n\r\n recordEvent(\r\n type: \"render\" | \"upload\" | \"validation\" | \"error\" | \"success\",\r\n metadata?: Record<string, any>\r\n ): void {\r\n this.events.push({\r\n type,\r\n timestamp: Date.now(),\r\n metadata,\r\n });\r\n }\r\n\r\n getMetrics(): PerformanceMetrics {\r\n const renderEvents = this.events.filter((e) => e.type === \"render\");\r\n const successEvents = this.events.filter((e) => e.type === \"success\");\r\n const errorEvents = this.events.filter((e) => e.type === \"error\");\r\n\r\n const avgRenderTime =\r\n renderEvents.length > 0\r\n ? renderEvents.reduce((sum, e) => sum + (e.duration || 0), 0) /\r\n renderEvents.length\r\n : 0;\r\n\r\n const avgUploadTime =\r\n successEvents.length > 0\r\n ? successEvents.reduce((sum, e) => sum + (e.duration || 0), 0) /\r\n successEvents.length\r\n : 0;\r\n\r\n const uploadSpeed = avgUploadTime > 0 ? 1000 / avgUploadTime : 0; // files per second\r\n const errorRate =\r\n this.events.length > 0 ? errorEvents.length / this.events.length : 0;\r\n const successRate =\r\n this.events.length > 0 ? successEvents.length / this.events.length : 0;\r\n\r\n return {\r\n bundleSize: {\r\n raw: this.getBundleSize(),\r\n gzipped: this.getBundleSize() * 0.3, // Approximate gzip ratio\r\n minified: this.getBundleSize() * 0.7, // Approximate minification ratio\r\n },\r\n runtime: {\r\n renderTime: avgRenderTime,\r\n uploadSpeed,\r\n memoryUsage: this.getMemoryUsage(),\r\n cpuUsage: this.getCpuUsage(),\r\n },\r\n userExperience: {\r\n timeToInteractive: this.getTimeToInteractive(),\r\n firstUploadTime: this.getFirstUploadTime(),\r\n errorRate,\r\n successRate,\r\n },\r\n };\r\n }\r\n\r\n private getBundleSize(): number {\r\n // This would be calculated during build time\r\n // For now, return an estimated size based on typical React component\r\n return 40 * 1024; // 40KB estimated\r\n }\r\n\r\n private getMemoryUsage(): number {\r\n if (\"memory\" in performance) {\r\n const memory = (performance as any).memory;\r\n return memory.usedJSHeapSize / memory.jsHeapSizeLimit;\r\n }\r\n return 0;\r\n }\r\n\r\n private getCpuUsage(): number {\r\n // CPU usage is difficult to measure in browsers\r\n // This is a simplified approximation\r\n return 0;\r\n }\r\n\r\n private getTimeToInteractive(): number {\r\n const firstRender = this.events.find((e) => e.type === \"render\");\r\n return firstRender ? firstRender.timestamp - this.startTime : 0;\r\n }\r\n\r\n private getFirstUploadTime(): number {\r\n const firstUpload = this.events.find((e) => e.type === \"success\");\r\n return firstUpload ? firstUpload.timestamp - this.startTime : 0;\r\n }\r\n\r\n reset(): void {\r\n this.events = [];\r\n this.startTime = performance.now();\r\n this.uploadStartTimes.clear();\r\n }\r\n\r\n exportData(): Array<{\r\n type: \"render\" | \"upload\" | \"validation\" | \"error\" | \"success\";\r\n timestamp: number;\r\n duration?: number;\r\n metadata?: Record<string, any>;\r\n }> {\r\n return [...this.events];\r\n }\r\n}\r\n\r\n// Performance optimization utilities\r\nexport class PerformanceOptimizer {\r\n static debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n ): (...args: Parameters<T>) => void {\r\n let timeout: NodeJS.Timeout;\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n };\r\n }\r\n\r\n static throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n limit: number\r\n ): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n func(...args);\r\n inThrottle = true;\r\n setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n }\r\n\r\n static memoize<T extends (...args: any[]) => any>(\r\n func: T,\r\n keyGenerator?: (...args: Parameters<T>) => string\r\n ): T {\r\n const cache = new Map<string, ReturnType<T>>();\r\n\r\n return ((...args: Parameters<T>) => {\r\n const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);\r\n\r\n if (cache.has(key)) {\r\n return cache.get(key);\r\n }\r\n\r\n const result = func(...args);\r\n cache.set(key, result);\r\n return result;\r\n }) as T;\r\n }\r\n\r\n static async retry<T>(\r\n operation: () => Promise<T>,\r\n options: { maxAttempts?: number; delay?: number } = {}\r\n ): Promise<T> {\r\n const { maxAttempts = 3, delay = 1000 } = options;\r\n let lastError: Error;\r\n\r\n for (let i = 0; i < maxAttempts; i++) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error as Error;\r\n if (i < maxAttempts - 1) {\r\n await new Promise((resolve) =>\r\n setTimeout(resolve, delay * Math.pow(2, i))\r\n );\r\n }\r\n }\r\n }\r\n\r\n throw lastError!;\r\n }\r\n}\r\n"]}