Static site hosting via tangled
1export function getContentTypeForExtension(extension, fallback = "text/plain") {
2 switch (extension) {
3 case ".html":
4 return "text/html";
5 case ".css":
6 return "text/css";
7 case ".js":
8 return "application/javascript";
9 case ".json":
10 return "application/json";
11 case ".svg":
12 return "image/svg+xml";
13 case ".png":
14 return "image/png";
15 case ".jpg":
16 return "image/jpeg";
17 case ".gif":
18 return "image/gif";
19 case ".webp":
20 return "image/webp";
21 case ".ico":
22 return "image/x-icon";
23 case ".txt":
24 return "text/plain";
25 case ".md":
26 return "text/markdown";
27 case ".xml":
28 return "application/xml";
29 case ".pdf":
30 return "application/pdf";
31 case ".zip":
32 return "application/zip";
33 case ".7z":
34 return "application/x-7z-compressed";
35 case ".tar":
36 return "application/x-tar";
37 case ".gz":
38 return "application/gzip";
39 case ".bz2":
40 return "application/x-bzip2";
41 case ".mp3":
42 return "audio/mpeg";
43 case ".mp4":
44 return "video/mp4";
45 case ".webm":
46 return "video/webm";
47 case ".ogg":
48 return "audio/ogg";
49 case ".wav":
50 return "audio/wav";
51 case ".flac":
52 return "audio/flac";
53 case ".aac":
54 return "audio/aac";
55 case ".m4a":
56 return "audio/mp4";
57 case ".m4v":
58 return "video/mp4";
59 }
60 return fallback;
61}
62
63export function trimLeadingSlash(path) {
64 if (path.startsWith("/")) {
65 return path.slice(1);
66 }
67 return path;
68}