@drivy/cobalt
Version:
Opinionated design system for Drivy's projects.
75 lines (74 loc) • 2.42 kB
JavaScript
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