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)
2 lines • 6.53 kB
JavaScript
import {a as a$1}from'./chunk-FB7ESX7E.js';import {a,e,k}from'./chunk-74G6TQLM.js';var d=class{static validateFile(s){let i={isValid:true,errors:[],warnings:[]};return s?s instanceof File?((!s.name||s.name.trim().length===0)&&(i.isValid=false,i.errors.push("File name is required")),s.name.length>255&&(i.isValid=false,i.errors.push("File name is too long (maximum 255 characters)")),[/^\.+$/,/[<>:"|?*]/,/\0/,/^\s+$/].some(r=>r.test(s.name))&&(i.isValid=false,i.errors.push("File name contains invalid characters")),(s.size<0||s.size>a.BYTES_PER_TB)&&(i.isValid=false,i.errors.push("File size is invalid")),s.size===0&&i.warnings.push("File appears to be empty"),i):(i.isValid=false,i.errors.push("Invalid file object"),i):(i.isValid=false,i.errors.push("File is required"),i)}static validateFileList(s){let i={isValid:true,errors:[],warnings:[]};return Array.isArray(s)?s.length===0?(i.warnings.push("No files provided"),i):(s.length>e.DEFAULT_MAX_FILES&&(i.isValid=false,i.errors.push(`Too many files (maximum ${e.DEFAULT_MAX_FILES})`)),s.forEach((e,r)=>{let a=this.validateFile(e);a.isValid||(i.isValid=false,a.errors.forEach(n=>{i.errors.push(`File ${r+1}: ${n}`);})),a.warnings.forEach(n=>{i.warnings.push(`File ${r+1}: ${n}`);});}),i):(i.isValid=false,i.errors.push("Files must be an array"),i)}static validateUploadOptions(s){let i={isValid:true,errors:[],warnings:[]};if(!s||typeof s!="object")return i.warnings.push("No upload options provided, using defaults"),i;let e=s;return e.maxFileSize!==void 0&&(typeof e.maxFileSize!="number"||e.maxFileSize<=0?(i.isValid=false,i.errors.push("maxFileSize must be a positive number")):k.validateFileSize(e.maxFileSize)||(i.isValid=false,i.errors.push("maxFileSize exceeds maximum allowed size"))),e.maxFiles!==void 0&&(typeof e.maxFiles!="number"||e.maxFiles<=0||e.maxFiles>100)&&(i.isValid=false,i.errors.push("maxFiles must be a number between 1 and 100")),e.allowedTypes!==void 0&&(Array.isArray(e.allowedTypes)?e.allowedTypes.length===0?i.warnings.push("allowedTypes is empty - all file types will be rejected"):e.allowedTypes.forEach((r,a)=>{typeof r!="string"&&(i.isValid=false,i.errors.push(`allowedTypes[${a}] must be a string`));}):(i.isValid=false,i.errors.push("allowedTypes must be an array"))),i}static validatePreviewOptions(s){let i={isValid:true,errors:[],warnings:[]};if(!s||typeof s!="object")return i;let e=s;if(e.maxWidth!==void 0&&(typeof e.maxWidth!="number"||e.maxWidth<=0?(i.isValid=false,i.errors.push("maxWidth must be a positive number")):k.validateDimensions(e.maxWidth,100)||(i.isValid=false,i.errors.push("maxWidth exceeds maximum allowed dimensions"))),e.maxHeight!==void 0&&(typeof e.maxHeight!="number"||e.maxHeight<=0?(i.isValid=false,i.errors.push("maxHeight must be a positive number")):k.validateDimensions(100,e.maxHeight)||(i.isValid=false,i.errors.push("maxHeight exceeds maximum allowed dimensions"))),e.quality!==void 0&&(k.validateQuality(e.quality)||(i.isValid=false,i.errors.push("quality must be a number between 0 and 1"))),e.format!==void 0){let r=["webp","jpeg","png"];r.includes(e.format)||(i.isValid=false,i.errors.push(`format must be one of: ${r.join(", ")}`));}return i}static validateDragOptions(s){let i={isValid:true,errors:[],warnings:[]};if(!s||typeof s!="object")return i;let e=s;return e.animationDuration!==void 0&&(typeof e.animationDuration!="number"||e.animationDuration<0?(i.isValid=false,i.errors.push("animationDuration must be a non-negative number")):e.animationDuration>5e3&&i.warnings.push("animationDuration is quite long - may affect user experience")),e.dragThreshold!==void 0&&(typeof e.dragThreshold!="number"||e.dragThreshold<0)&&(i.isValid=false,i.errors.push("dragThreshold must be a non-negative number")),e.gridSize!==void 0&&(typeof e.gridSize!="number"||e.gridSize<=0)&&(i.isValid=false,i.errors.push("gridSize must be a positive number")),i}static validateProviderConfig(s){let i={isValid:true,errors:[],warnings:[]};if(!s||typeof s!="object")return i.isValid=false,i.errors.push("Provider configuration is required"),i;let e=s;return !e.apiKey&&!e.accessToken&&!e.credentials&&i.warnings.push("No authentication credentials found in configuration"),["apiKey","cloudName","uploadPreset","folder"].forEach(a=>{e[a]!==void 0&&typeof e[a]!="string"&&(i.isValid=false,i.errors.push(`${a} must be a string`));}),i}static validateArrayOperation(s,i,e){let r={isValid:true,errors:[],warnings:[]};return !Number.isInteger(s)||!Number.isInteger(i)?(r.isValid=false,r.errors.push("Indices must be integers"),r):((s<0||i<0)&&(r.isValid=false,r.errors.push("Indices cannot be negative")),(s>=e||i>=e)&&(r.isValid=false,r.errors.push("Indices exceed array bounds")),s===i&&r.warnings.push("Source and target indices are the same - no operation needed"),r)}static sanitizeString(s,i=1e3){if(typeof s!="string")throw a$1.validationError("Input must be a string");let e=s.replace(/[<>]/g,"").replace(/javascript:/gi,"").replace(/data:/gi,"").trim();return e.length>i&&(e=e.substring(0,i)),e}static validateElement(s){let i={isValid:true,errors:[],warnings:[]};return s?s instanceof HTMLElement?(s.isConnected||i.warnings.push("Element is not connected to the DOM"),i):(i.isValid=false,i.errors.push("Must be a valid HTML element"),i):(i.isValid=false,i.errors.push("Element is required"),i)}static validateAllInputs(s){let i={isValid:true,errors:[],warnings:[]};if(s.files!==void 0){let e=this.validateFileList(s.files);e.isValid||(i.isValid=false,i.errors.push(...e.errors)),i.warnings.push(...e.warnings);}if(s.options!==void 0){let e=this.validateUploadOptions(s.options);e.isValid||(i.isValid=false,i.errors.push(...e.errors)),i.warnings.push(...e.warnings);}if(s.previewOptions!==void 0){let e=this.validatePreviewOptions(s.previewOptions);e.isValid||(i.isValid=false,i.errors.push(...e.errors)),i.warnings.push(...e.warnings);}if(s.dragOptions!==void 0){let e=this.validateDragOptions(s.dragOptions);e.isValid||(i.isValid=false,i.errors.push(...e.errors)),i.warnings.push(...e.warnings);}if(s.providerConfig!==void 0){let e=this.validateProviderConfig(s.providerConfig);e.isValid||(i.isValid=false,i.errors.push(...e.errors)),i.warnings.push(...e.warnings);}return i}};function g(u){return function(s,i,e){let r=e.value;e.value=function(...a){if(a.length>0){let n=u(a[0]);if(!n.isValid)throw a$1.validationError(n.errors.join("; "));n.warnings.length>0;}return r.apply(this,a)};}}var h=d;export{d as a,g as b,h as c};//# sourceMappingURL=chunk-DQ5A5ZMM.js.map
//# sourceMappingURL=chunk-DQ5A5ZMM.js.map