@jrmc/adonis-attachment
Version:
Turn any field on your Lucid model to an attachment data type
41 lines (40 loc) • 1.14 kB
JavaScript
import path from 'node:path';
import fs from 'node:fs/promises';
import { fileTypeFromBuffer, fileTypeFromFile } from 'file-type';
import mime from 'mime-types';
function getFileExtension(filename) {
if (!filename) {
return '';
}
const ext = path.extname(filename).slice(1);
return ext && /^[a-zA-Z0-9]+$/.test(ext) ? ext : '';
}
function metaByFileName(filename) {
return {
ext: getFileExtension(filename),
mime: mime.lookup(filename) || '',
};
}
export async function metaFormBuffer(input) {
const fileType = await fileTypeFromBuffer(input);
return {
extname: fileType?.ext || '',
mimeType: fileType?.mime || '',
size: input.length,
};
}
export async function metaFormFile(input, filename) {
let fileType;
let size = 0;
fileType = metaByFileName(filename);
if (fileType.ext === '' || fileType.mime === '') {
fileType = await fileTypeFromFile(input);
}
const stats = await fs.stat(input);
size = stats.size;
return {
extname: fileType?.ext || '',
mimeType: fileType?.mime || '',
size,
};
}