UNPKG

@drivy/cobalt

Version:

Opinionated design system for Drivy's projects.

92 lines (89 loc) 2.73 kB
import typer from 'media-typer'; const MIME_SUBTYPE_TO_EXTENSION = { gif: "gif", jpeg: "jpg", pdf: "pdf", png: "png", zip: "zip", csv: "csv", }; const getFileSignature = (blob) => { return 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) => { return new Promise((resolve, reject) => { getFileSignature(file).then((signature) => { resolve(getMimetypeFromSignature(signature)); }, (error) => { reject(error); }); }); }; const getFileExtensionFromFileName = (fileName) => { const fileTypeFromFileNameRegExp = new RegExp(`(\\.)(.+)$`, "i"); const fromName = fileTypeFromFileNameRegExp.exec(fileName); if (fromName && fromName.length > 1 && fromName[2]) { return fromName[2]; } return null; }; const getFileExtensionFromMimeType = (mimeType) => { try { const type = typer.parse(mimeType).subtype; return MIME_SUBTYPE_TO_EXTENSION[type] || null; } catch (_e) { return null; } }; // If this function // - return falsy => the file is correct, file process will abort // - return true => the file is valid to continue the file process 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