Route GIF files
This commit is contained in:
parent
c46bb51248
commit
de0dfda3a7
|
@ -17,6 +17,22 @@
|
||||||
|
|
||||||
/** @type {SupportedFileType[]} */
|
/** @type {SupportedFileType[]} */
|
||||||
export const SUPPORTED_FILE_TYPES = [
|
export const SUPPORTED_FILE_TYPES = [
|
||||||
|
{
|
||||||
|
name: "GIF",
|
||||||
|
extensions: [".gif", "image/gif"],
|
||||||
|
mimeType: "image/gif",
|
||||||
|
route: "/gif",
|
||||||
|
mimeSniffPatterns: [
|
||||||
|
{
|
||||||
|
bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61],
|
||||||
|
mask: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61],
|
||||||
|
mask: [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "PNG",
|
name: "PNG",
|
||||||
extensions: [".png", ".apng"],
|
extensions: [".png", ".apng"],
|
||||||
|
|
|
@ -17,13 +17,24 @@ const inputEl = /** @type {HTMLInputElement} */ (
|
||||||
);
|
);
|
||||||
const inputContainerEl = crel("p", {}, inputEl);
|
const inputContainerEl = crel("p", {}, inputEl);
|
||||||
|
|
||||||
const supportedFileTypeNameString = SUPPORTED_FILE_TYPES
|
const supportedFileTypeNameString = (() => {
|
||||||
|
switch (SUPPORTED_FILE_TYPES.length) {
|
||||||
|
case 0:
|
||||||
|
return "no";
|
||||||
|
case 2:
|
||||||
|
return `${SUPPORTED_FILE_TYPES[0].name} and ${
|
||||||
|
SUPPORTED_FILE_TYPES[1].name
|
||||||
|
}`;
|
||||||
|
default:
|
||||||
|
return SUPPORTED_FILE_TYPES
|
||||||
.map((t, index, array) => (
|
.map((t, index, array) => (
|
||||||
(array.length > 1 && (index === array.length - 1))
|
(array.length > 1 && (index === array.length - 1))
|
||||||
? `and ${t.name}`
|
? `and ${t.name}`
|
||||||
: t.name
|
: t.name
|
||||||
))
|
))
|
||||||
.join(", ");
|
.join(", ");
|
||||||
|
}
|
||||||
|
})();
|
||||||
const labelParagraphEl = crel(
|
const labelParagraphEl = crel(
|
||||||
"p",
|
"p",
|
||||||
{},
|
{},
|
||||||
|
|
|
@ -2,13 +2,30 @@ import { assertEquals } from "assert";
|
||||||
import routeFile from "../../public/index/routeFile.js";
|
import routeFile from "../../public/index/routeFile.js";
|
||||||
|
|
||||||
Deno.test("routes files correctly", async () => {
|
Deno.test("routes files correctly", async () => {
|
||||||
const PNG_SIGNATURE = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);
|
const PNG_SIGNATURE = new Uint8Array([
|
||||||
|
0x89,
|
||||||
|
0x50,
|
||||||
|
0x4E,
|
||||||
|
0x47,
|
||||||
|
0x0D,
|
||||||
|
0x0A,
|
||||||
|
0x1A,
|
||||||
|
0x0A,
|
||||||
|
]);
|
||||||
|
const GIF87_SIGNATURE = new Uint8Array([0x47, 0x49, 0x46, 0x38, 0x37, 0x61]);
|
||||||
|
const GIF89_SIGNATURE = new Uint8Array([0x47, 0x49, 0x46, 0x38, 0x39, 0x61]);
|
||||||
|
|
||||||
const testCases = new Map<File, null | string>([
|
const testCases = new Map<File, null | string>([
|
||||||
// No matching type
|
// No matching type
|
||||||
[new File([], "foo"), null],
|
[new File([], "foo"), null],
|
||||||
[new File([], "foo.txt"), null],
|
[new File([], "foo.txt"), null],
|
||||||
[new File([], "foo.txt", { type: "text/plain" }), null],
|
[new File([], "foo.txt", { type: "text/plain" }), null],
|
||||||
|
// GIF
|
||||||
|
[new File([], "foo", { type: "image/gif" }), "/gif"],
|
||||||
|
[new File([], "foo.gif"), "/gif"],
|
||||||
|
[new File([], "foo.gif", { type: "text/plain" }), "/gif"],
|
||||||
|
[new File([GIF87_SIGNATURE], "foo"), "/gif"],
|
||||||
|
[new File([GIF89_SIGNATURE], "foo"), "/gif"],
|
||||||
// PNG
|
// PNG
|
||||||
[new File([], "foo", { type: "image/png" }), "/png"],
|
[new File([], "foo", { type: "image/png" }), "/png"],
|
||||||
[new File([], "foo.png"), "/png"],
|
[new File([], "foo.png"), "/png"],
|
||||||
|
|
Loading…
Reference in New Issue