Skip to content

Commit

Permalink
fix: missing/duplicate content types and extension detection
Browse files Browse the repository at this point in the history
  • Loading branch information
loune committed Dec 27, 2023
1 parent dd64ad7 commit dbd54e4
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 55 deletions.
14 changes: 14 additions & 0 deletions src/contentType.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,17 @@ test('content type xml', async () => {

expect(type).toEqual('application/xml');
});

test('content type js', async () => {
const filename = `test-custom-${Date.now()}.js`;
const type = await getFileMimeType(filename);

expect(type).toEqual('text/javascript');
});

test('content type with relative path', async () => {
const filename = `../../test-custom-${Date.now()}.mid`;
const type = await getFileMimeType(filename);

expect(type).toEqual('audio/midi');
});
110 changes: 55 additions & 55 deletions src/contentType.ts
Original file line number Diff line number Diff line change
@@ -1,80 +1,80 @@
import fs from 'fs';

const standardContentTypeExtMap = new Map<string, string[]>([
['audio/aac', ['aac']],
['application/x-abiword', ['abw']],
['application/x-freearc', ['arc']],
['image/avif', ['avif']],
['video/x-msvideo', ['avi']],
['application/vnd.amazon.ebook', ['azw']],
['application/octet-stream', ['bin']],
['image/bmp', ['bmp']],
['application/x-bzip', ['bz']],
['application/x-bzip2', ['bz2']],
['application/x-cdf', ['cda']],
['application/x-csh', ['csh']],
['text/css', ['css']],
['text/csv', ['csv']],
['application/msword', ['doc']],
['application/vnd.openxmlformats-officedocument.wordprocessingml.document', ['docx']],
['application/vnd.ms-fontobject', ['eot']],
// keep this list sorted to avoid duplicates
['application/epub+zip', ['epub']],
['application/gzip', ['gz']],
['image/gif', ['gif']],
['text/html', ['htm', 'html']],
['image/vnd.microsoft.icon', ['ico']],
['text/calendar', ['ics']],
['application/java-archive', ['jar']],
['image/jpeg', ['jpeg', 'jpg']],
['text/javascript', ['js']],
['application/json', ['json']],
['application/ld+json', ['jsonld']],
['audio/midi', ['mid, .midi']],
['audio/x-midi', ['mid, .midi']],
['text/javascript', ['mjs']],
['audio/mpeg', ['mp3']],
['video/mp4', ['mp4']],
['video/mpeg', ['mpeg']],
['application/msword', ['doc']],
['application/octet-stream', ['bin']],
['application/ogg', ['ogx']],
['application/pdf', ['pdf']],
['application/rtf', ['rtf']],
['application/vnd.amazon.ebook', ['azw']],
['application/vnd.apple.installer+xml', ['mpkg']],
['application/vnd.mozilla.xul+xml', ['xul']],
['application/vnd.ms-excel', ['xls']],
['application/vnd.ms-fontobject', ['eot']],
['application/vnd.ms-powerpoint', ['ppt']],
['application/vnd.oasis.opendocument.presentation', ['odp']],
['application/vnd.oasis.opendocument.spreadsheet', ['ods']],
['application/vnd.oasis.opendocument.text', ['odt']],
['audio/ogg', ['oga']],
['video/ogg', ['ogv']],
['application/ogg', ['ogx']],
['audio/opus', ['opus']],
['font/otf', ['otf']],
['image/png', ['png']],
['application/pdf', ['pdf']],
['application/x-httpd-php', ['php']],
['application/vnd.ms-powerpoint', ['ppt']],
['application/vnd.openxmlformats-officedocument.presentationml.presentation', ['pptx']],
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ['xlsx']],
['application/vnd.openxmlformats-officedocument.wordprocessingml.document', ['docx']],
['application/vnd.rar', ['rar']],
['application/rtf', ['rtf']],
['application/vnd.visio', ['vsd']],
['application/x-7z-compressed', ['7z']],
['application/x-abiword', ['abw']],
['application/x-bzip', ['bz']],
['application/x-bzip2', ['bz2']],
['application/x-cdf', ['cda']],
['application/x-csh', ['csh']],
['application/x-freearc', ['arc']],
['application/x-httpd-php', ['php']],
['application/x-sh', ['sh']],
['image/svg+xml', ['svg']],
['application/x-tar', ['tar']],
['image/tiff', ['tif, .tiff']],
['video/mp2t', ['ts']],
['font/ttf', ['ttf']],
['text/plain', ['txt']],
['application/vnd.visio', ['vsd']],
['application/xhtml+xml', ['xhtml']],
['application/xml', ['xml']],
['application/zip', ['zip']],
['audio/aac', ['aac']],
['audio/midi', ['mid', 'midi']],
['audio/mpeg', ['mp3']],
['audio/ogg', ['oga']],
['audio/opus', ['opus']],
['audio/wav', ['wav']],
['audio/webm', ['weba']],
['video/webm', ['webm']],
['image/webp', ['webp']],
['audio/x-midi', ['mid', 'midi']],
['font/otf', ['otf']],
['font/ttf', ['ttf']],
['font/woff', ['woff']],
['font/woff2', ['woff2']],
['application/xhtml+xml', ['xhtml']],
['application/vnd.ms-excel', ['xls']],
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ['xlsx']],
['application/xml', ['xml']],
['image/avif', ['avif']],
['image/bmp', ['bmp']],
['image/gif', ['gif']],
['image/jpeg', ['jpeg', 'jpg']],
['image/png', ['png']],
['image/svg+xml', ['svg']],
['image/tiff', ['tif', 'tiff']],
['image/vnd.microsoft.icon', ['ico']],
['image/webp', ['webp']],
['text/calendar', ['ics']],
['text/css', ['css']],
['text/csv', ['csv']],
['text/html', ['htm', 'html']],
['text/javascript', ['js', 'mjs']],
['text/plain', ['txt']],
['text/xml', ['xml']],
['application/vnd.mozilla.xul+xml', ['xul']],
['application/zip', ['zip']],
['video/3gpp', ['3gp']],
['video/3gpp2', ['3g2']],
['application/x-7z-compressed', ['7z']],
['video/mp2t', ['ts']],
['video/mp4', ['mp4']],
['video/mpeg', ['mpeg']],
['video/ogg', ['ogv']],
['video/webm', ['webm']],
['video/x-msvideo', ['avi']],
]);

function reverseMap(contentTypeExtMap: Map<string, string[]> | Record<string, string[]>): Map<string, string[]> {
Expand Down Expand Up @@ -123,7 +123,7 @@ export default async function getFileMimeType(
filename: string,
customMimeTypes?: Record<string, string[]> | undefined
): Promise<string | undefined> {
const [, extension] = filename.split('.');
const extension = filename.substring(filename.lastIndexOf('.') + 1);

let type: string | undefined;
if (extension) {
Expand Down

0 comments on commit dbd54e4

Please sign in to comment.