305 lines
12 KiB
JavaScript
305 lines
12 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const fs = __importStar(require("fs"));
|
|
const index_1 = require("./index");
|
|
const getBytes = (filename) => {
|
|
const file = require.resolve(`./testfiles/${filename}`);
|
|
const buffer = fs.readFileSync(file);
|
|
return Array.prototype.slice.call(buffer, 0);
|
|
};
|
|
describe("Tests the public API", () => {
|
|
it("detects woff", () => {
|
|
const bytes = getBytes("font.woff");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result).toStrictEqual({
|
|
typename: "woff",
|
|
mime: "font/woff",
|
|
extension: "woff",
|
|
});
|
|
});
|
|
it("detects woff2", () => {
|
|
const bytes = getBytes("inter.woff2");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result).toStrictEqual({
|
|
typename: "woff2",
|
|
mime: "font/woff2",
|
|
extension: "woff2",
|
|
});
|
|
});
|
|
it("detects tar with offset", () => {
|
|
const bytes = getBytes("a.tar");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("tar");
|
|
});
|
|
it("detects apng", () => {
|
|
const bytes = getBytes("a.apng");
|
|
const result = index_1.filetypeinfo(bytes);
|
|
expect(result).toHaveLength(2);
|
|
const [png, apng] = result;
|
|
expect(png.typename).toBe("png");
|
|
expect(png.mime).toBe("image/png");
|
|
expect(apng.typename).toBe("apng");
|
|
expect(apng.mime).toBe("image/apng");
|
|
});
|
|
it("detects mp4", () => {
|
|
const bytes = getBytes("a.mp4");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("mp4");
|
|
expect(result.mime).toBe("video/mp4");
|
|
});
|
|
describe("detects ogg containers", () => {
|
|
it("detects ogv", () => {
|
|
const bytes = getBytes("a.ogv");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("ogv");
|
|
expect(result.mime).toBe("video/ogg");
|
|
});
|
|
it("detects ogm", () => {
|
|
const bytes = getBytes("a.ogm");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("ogm");
|
|
expect(result.mime).toBe("video/ogg");
|
|
});
|
|
it("detects oga", () => {
|
|
const bytes = getBytes("a.oga");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("oga");
|
|
expect(result.mime).toBe("audio/ogg");
|
|
});
|
|
it("detects spx", () => {
|
|
const bytes = getBytes("a.spx");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("spx");
|
|
expect(result.mime).toBe("audio/ogg");
|
|
});
|
|
it("detects ogg", () => {
|
|
const bytes = getBytes("a.ogg");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("ogg");
|
|
expect(result.mime).toBe("audio/ogg");
|
|
});
|
|
it("detects ogx", () => {
|
|
const bytes = getBytes("a.ogx");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("ogx");
|
|
expect(result.mime).toBe("application/ogg");
|
|
});
|
|
});
|
|
describe("detects mov", () => {
|
|
it("detects mov (moov)", () => {
|
|
const bytes = getBytes("a.moov.mov");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("mov");
|
|
expect(result.extension).toBe("mov");
|
|
expect(result.mime).toBe("video/quicktime");
|
|
});
|
|
it("detects mov (mdat)", () => {
|
|
const bytes = getBytes("a.mdat.mov");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("mov");
|
|
expect(result.extension).toBe("mov");
|
|
expect(result.mime).toBe("video/quicktime");
|
|
});
|
|
it("detects mov (ftypqt)", () => {
|
|
const bytes = getBytes("a.ftypqt.mov");
|
|
const [result] = index_1.filetypeinfo(bytes);
|
|
expect(result).toBeDefined();
|
|
expect(result.typename).toBe("mov");
|
|
expect(result.extension).toBe("mov");
|
|
expect(result.mime).toBe("video/quicktime");
|
|
});
|
|
});
|
|
it("filetypeinfo", () => {
|
|
const bytes = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypeinfo(bytes);
|
|
expect(result).toHaveLength(2);
|
|
expect(result[0]).toHaveProperty("typename");
|
|
});
|
|
it("filetypename", () => {
|
|
const bytes = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypename(bytes);
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toEqual(["png", "apng"]);
|
|
});
|
|
it("filetypename failure", () => {
|
|
const bytes = [0x89, 0x00, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypename(bytes);
|
|
expect(result).toHaveLength(0);
|
|
expect(result).toEqual([]);
|
|
});
|
|
it("filetypemime", () => {
|
|
const bytes = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypemime(bytes);
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toEqual(["image/png", "image/apng"]);
|
|
});
|
|
it("filetypemime not found", () => {
|
|
const bytes = [0x89, 0x50, 0x00, 0x47, 0x00, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypemime(bytes);
|
|
expect(result).toHaveLength(0);
|
|
expect(result).toEqual([]);
|
|
});
|
|
it("filetypeextension", () => {
|
|
const bytes = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypeextension(bytes);
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toEqual(["png", "apng"]);
|
|
});
|
|
it("filetypeextension not found", () => {
|
|
const bytes = [0x89, 0x50, 0x4e, 0x47, 0x00, 0x0a, 0x1a, 0x0a];
|
|
const result = index_1.filetypeextension(bytes);
|
|
expect(result).toHaveLength(0);
|
|
expect(result).toEqual([]);
|
|
});
|
|
it("detects utf8", () => {
|
|
const file = getBytes("a.utf8");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("text/plain; charset=UTF-8");
|
|
});
|
|
it("detects utf16le", () => {
|
|
const file = getBytes("a.utf16le");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("text/plain; charset=UTF-16LE");
|
|
});
|
|
it("detects utf16be", () => {
|
|
const file = getBytes("a.utf16be");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("text/plain; charset=UTF-16BE");
|
|
});
|
|
it("detects json object", () => {
|
|
const fileObj = getBytes("a.json");
|
|
const fileArray = getBytes("a_array.json");
|
|
const result = index_1.filetypemime(fileObj);
|
|
const result2 = index_1.filetypemime(fileArray);
|
|
expect(result).toContain("application/json");
|
|
expect(result2).toContain("application/json");
|
|
});
|
|
it("detects srt", () => {
|
|
const file = getBytes("a.srt");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("application/x-subrip");
|
|
});
|
|
it("detects vtt", () => {
|
|
const file = getBytes("a.vtt");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("text/vtt");
|
|
});
|
|
it("detects jpeg (photoshop)", () => {
|
|
// File created with Adobe Photoshop 2024 via "Save As" menu
|
|
const file = getBytes("photoshop.jpg");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("image/jpeg");
|
|
});
|
|
it("detects jpeg (photoshop export)", () => {
|
|
// File created with Adobe Photoshop 2024 via "Export As" menu
|
|
const file = getBytes("photoshop-export.jpg");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("image/jpeg");
|
|
});
|
|
it("detects jpeg (png2jpg)", () => {
|
|
// File created using https://png2jpg.com
|
|
const file = getBytes("png2jpg.jpg");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("image/jpeg");
|
|
});
|
|
describe("add new custom types", () => {
|
|
beforeAll(() => {
|
|
index_1.register('customNoInfo', ["0xde", "0xad", "0xbe", "0xef"]);
|
|
index_1.register('customMime', ["0x12", "0x34", "0x56", "0x78"], {
|
|
mime: 'application/vnd-custom',
|
|
extension: '.cust'
|
|
});
|
|
index_1.register('customOffset', ["0xab", "0xcb"], {
|
|
mime: 'application/vnd-custom-offset',
|
|
extension: '.custoff'
|
|
}, 2);
|
|
});
|
|
it("detects customNoInfo file", () => {
|
|
const bytes = [0xde, 0xad, 0xbe, 0xef, 0x00];
|
|
const result = index_1.filetypeinfo(bytes);
|
|
expect(result).toEqual(expect.arrayContaining([
|
|
expect.objectContaining({
|
|
"typename": "customNoInfo",
|
|
})
|
|
]));
|
|
});
|
|
it("detects customMime file", () => {
|
|
const bytes = [0x12, 0x34, 0x56, 0x78];
|
|
const result = index_1.filetypeinfo(bytes);
|
|
expect(result).toEqual(expect.arrayContaining([
|
|
expect.objectContaining({
|
|
"typename": "customMime",
|
|
"mime": "application/vnd-custom",
|
|
"extension": ".cust"
|
|
})
|
|
]));
|
|
});
|
|
it("detects customOffset file", () => {
|
|
const bytes = [0x12, 0x34, 0xab, 0xcb];
|
|
const result = index_1.filetypeinfo(bytes);
|
|
expect(result).toEqual(expect.arrayContaining([
|
|
expect.objectContaining({
|
|
"typename": "customOffset",
|
|
"mime": "application/vnd-custom-offset",
|
|
"extension": ".custoff"
|
|
})
|
|
]));
|
|
});
|
|
});
|
|
it("detects pdf (Libreoffice export)", () => {
|
|
// File created using libreoffice writter export to pdf
|
|
const file = getBytes("a.pdf");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("application/pdf");
|
|
});
|
|
it("detects poscript (pdf2ps)", () => {
|
|
// File created using pdf2ps from https://www.ghostscript.com
|
|
const file = getBytes("a.ps");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("application/postscript");
|
|
});
|
|
it("detects svg", () => {
|
|
// File created using https://png2jpg.com
|
|
const file = getBytes("a.svg");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("image/svg+xml");
|
|
});
|
|
it("detects avif", () => {
|
|
// File created using avifenc on a.apng
|
|
const file = getBytes("a.avif");
|
|
const result = index_1.filetypemime(file);
|
|
expect(result).toContain("image/avif");
|
|
});
|
|
});
|