2025-06-17 07:10:41 +02:00

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");
});
});