UNPKG

@drivy/cobalt

Version:

Opinionated design system for Drivy's projects.

75 lines (74 loc) 2.42 kB
import media_typer from "media-typer"; const MIME_SUBTYPE_TO_EXTENSION = { gif: "gif", jpeg: "jpg", pdf: "pdf", png: "png", zip: "zip", csv: "csv" }; const getFileSignature = (blob)=>new Promise((resolve, reject)=>{ try { const fileReader = new FileReader(); fileReader.onloadend = (_e)=>{ let header = ""; const result = fileReader.result; const arr = new Uint8Array(result); for(let i = 0; i < arr.length; i++)header += arr[i].toString(16); resolve(header); }; fileReader.readAsArrayBuffer(blob.slice(0, 4)); } catch (e) { reject(e); } }); const getMimetypeFromSignature = (signature)=>{ switch(signature.toUpperCase()){ case "89504E47": return "image/png"; case "47494638": return "image/gif"; case "25504446": return "application/pdf"; case "FFD8FFDB": case "FFD8FFEE": case "FFD8FFE0": case "FFD8FFE1": case "FFD8FFE2": case "FFD8FFE3": case "FFD8FFE8": return "image/jpeg"; case "504B0304": return "application/zip"; default: return null; } }; const getMimeType = (file)=>new Promise((resolve, reject)=>{ getFileSignature(file).then((signature)=>{ resolve(getMimetypeFromSignature(signature)); }, (error)=>{ reject(error); }); }); const getFileExtensionFromFileName = (fileName)=>{ const fileTypeFromFileNameRegExp = /(\.)(.+)$/i; const fromName = fileTypeFromFileNameRegExp.exec(fileName); if (fromName && fromName.length > 1 && fromName[2]) return fromName[2]; return null; }; const getFileExtensionFromMimeType = (mimeType)=>{ try { const type = media_typer.parse(mimeType).subtype; return MIME_SUBTYPE_TO_EXTENSION[type] || null; } catch (_e) { return null; } }; const validateFile = async (file, fileTypeValidator)=>{ const mimeType = await getMimeType(file); const extension = mimeType && getFileExtensionFromMimeType(mimeType) || getFileExtensionFromMimeType(file.type) || getFileExtensionFromFileName(file.name); return fileTypeValidator(file, extension); }; export { validateFile }; //# sourceMappingURL=validateFile.js.map