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}