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