UNPKG

react-dropzone-esm

Version:
218 lines (214 loc) 7.38 kB
'use strict'; var attrAccept = require('./attr-accept.js'); var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); const accepts = typeof attrAccept.default === "function" ? attrAccept.default : attrAccept.default.default; const FILE_INVALID_TYPE = "file-invalid-type"; const FILE_TOO_LARGE = "file-too-large"; const FILE_TOO_SMALL = "file-too-small"; const TOO_MANY_FILES = "too-many-files"; const ErrorCode = { FileInvalidType: FILE_INVALID_TYPE, FileTooLarge: FILE_TOO_LARGE, FileTooSmall: FILE_TOO_SMALL, TooManyFiles: TOO_MANY_FILES }; const getInvalidTypeRejectionErr = (accept = "") => { const acceptArr = accept.split(","); const msg = acceptArr.length > 1 ? `one of ${acceptArr.join(", ")}` : acceptArr[0]; return { code: FILE_INVALID_TYPE, message: `File type must be ${msg}` }; }; const getTooLargeRejectionErr = (maxSize) => { return { code: FILE_TOO_LARGE, message: `File is larger than ${maxSize} ${maxSize === 1 ? "byte" : "bytes"}` }; }; const getTooSmallRejectionErr = (minSize) => { return { code: FILE_TOO_SMALL, message: `File is smaller than ${minSize} ${minSize === 1 ? "byte" : "bytes"}` }; }; const TOO_MANY_FILES_REJECTION = { code: TOO_MANY_FILES, message: "Too many files" }; function fileAccepted(file, accept) { const isAcceptable = file.type === "application/x-moz-file" || accepts(file, accept); return [ isAcceptable, isAcceptable ? null : getInvalidTypeRejectionErr(accept) ]; } function fileMatchSize(file, minSize, maxSize) { if (isDefined(file.size)) { if (isDefined(minSize) && isDefined(maxSize)) { if (file.size > maxSize) return [false, getTooLargeRejectionErr(maxSize)]; if (file.size < minSize) return [false, getTooSmallRejectionErr(minSize)]; } else if (isDefined(minSize) && file.size < minSize) return [false, getTooSmallRejectionErr(minSize)]; else if (isDefined(maxSize) && file.size > maxSize) return [false, getTooLargeRejectionErr(maxSize)]; } return [true, null]; } function isDefined(value) { return value !== void 0 && value !== null; } function allFilesAccepted({ files, accept, minSize, maxSize, multiple, maxFiles, validator }) { if (!multiple && files.length > 1 || multiple && maxFiles >= 1 && files.length > maxFiles) { return false; } return files.every((file) => { const [accepted] = fileAccepted(file, accept); const [sizeMatch] = fileMatchSize(file, minSize, maxSize); const customErrors = validator ? validator(file) : null; return accepted && sizeMatch && !customErrors; }); } function isPropagationStopped(event) { if (typeof event.isPropagationStopped === "function") { return event.isPropagationStopped(); } else if (typeof event.cancelBubble !== "undefined") { return event.cancelBubble; } return false; } function isEvtWithFiles(event) { if (!event.dataTransfer) { return !!event.target && !!event.target.files; } return Array.prototype.some.call( event.dataTransfer.types, (type) => type === "Files" || type === "application/x-moz-file" ); } function onDocumentDragOver(event) { event.preventDefault(); } function isIe(userAgent) { return userAgent.indexOf("MSIE") !== -1 || userAgent.indexOf("Trident/") !== -1; } function isEdge(userAgent) { return userAgent.indexOf("Edge/") !== -1; } function isIeOrEdge(userAgent = window.navigator.userAgent) { return isIe(userAgent) || isEdge(userAgent); } function composeEventHandlers(...fns) { return (event, ...args) => fns.some((fn) => { if (!isPropagationStopped(event) && fn) { fn(event, ...args); } return isPropagationStopped(event); }); } function canUseFileSystemAccessAPI() { return "showOpenFilePicker" in window; } function pickerOptionsFromAccept(accept) { if (isDefined(accept)) { const acceptForPicker = Object.entries(accept).filter(([mimeType, ext]) => { let ok = true; if (!isMIMEType(mimeType)) { console.warn( `Skipped "${mimeType}" because it is not a valid MIME type. Check https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types for a list of valid MIME types.` ); ok = false; } if (!Array.isArray(ext) || !ext.every(isExt)) { console.warn( `Skipped "${mimeType}" because an invalid file extension was provided.` ); ok = false; } return ok; }).reduce( (agg, [mimeType, ext]) => __spreadProps(__spreadValues({}, agg), { [mimeType]: ext }), {} ); return [ { // description is required due to https://crbug.com/1264708 description: "Files", accept: acceptForPicker } ]; } return accept; } function acceptPropAsAcceptAttr(accept) { if (isDefined(accept)) { return Object.entries(accept).reduce((a, [mimeType, ext]) => [...a, mimeType, ...ext], []).filter((v) => isMIMEType(v) || isExt(v)).join(","); } return void 0; } function isAbort(v) { return v instanceof DOMException && (v.name === "AbortError" || v.code === v.ABORT_ERR); } function isSecurityError(v) { return v instanceof DOMException && (v.name === "SecurityError" || v.code === v.SECURITY_ERR); } function isMIMEType(v) { return v === "audio/*" || v === "video/*" || v === "image/*" || v === "text/*" || v === "application/*" || /\w+\/[-+.\w]+/g.test(v); } function isExt(v) { return /^.*\.[\w]+$/.test(v); } exports.ErrorCode = ErrorCode; exports.FILE_INVALID_TYPE = FILE_INVALID_TYPE; exports.FILE_TOO_LARGE = FILE_TOO_LARGE; exports.FILE_TOO_SMALL = FILE_TOO_SMALL; exports.TOO_MANY_FILES = TOO_MANY_FILES; exports.TOO_MANY_FILES_REJECTION = TOO_MANY_FILES_REJECTION; exports.acceptPropAsAcceptAttr = acceptPropAsAcceptAttr; exports.allFilesAccepted = allFilesAccepted; exports.canUseFileSystemAccessAPI = canUseFileSystemAccessAPI; exports.composeEventHandlers = composeEventHandlers; exports.fileAccepted = fileAccepted; exports.fileMatchSize = fileMatchSize; exports.getInvalidTypeRejectionErr = getInvalidTypeRejectionErr; exports.getTooLargeRejectionErr = getTooLargeRejectionErr; exports.getTooSmallRejectionErr = getTooSmallRejectionErr; exports.isAbort = isAbort; exports.isEvtWithFiles = isEvtWithFiles; exports.isExt = isExt; exports.isIeOrEdge = isIeOrEdge; exports.isMIMEType = isMIMEType; exports.isPropagationStopped = isPropagationStopped; exports.isSecurityError = isSecurityError; exports.onDocumentDragOver = onDocumentDragOver; exports.pickerOptionsFromAccept = pickerOptionsFromAccept;