Extracts all relevant favicons, Apple touch icons, Android web app icons, and manifest-defined icons from a given URL.
Designed to be edge-compatible (Cloudflare Workers safe) and fully testable in Node.js.
<link>
and <meta>
tags for favicon/icon references<link rel="manifest">
to extract additional iconsnpm install @iocium/favicon-extractor
import { FaviconExtractor } from "@iocium/favicon-extractor";
const extractor = new FaviconExtractor();
const icons = await extractor.fetchAndExtract("https://example.com");
console.log(icons);
const grouped = extractor.groupIcons(icons);
/*
{
standardIcons: [...],
appleTouchIcons: [...],
androidIcons: [...]
}
*/
const withMimeTypes = extractor.addMimeTypes(icons);
/*
[
{ url: "...", type: "...", size: "...", mimeType: "image/png" },
...
]
*/
const largestIcons = extractor.getLargestIconsByMimeType(icons);
Each returned icon is the highest resolution found for that MIME type.
// If you already have raw relative icon paths:
extractor["icons"] = ["/favicon.ico", "images/logo-192.png"];
const absoluteUrls = extractor["normalizeIcons"]("https://example.com");
console.log(absoluteUrls);
// โ ["https://example.com/favicon.ico", "https://example.com/images/logo-192.png"]
npm run test
npm run test:coverage
Open the full report:
open coverage/lcov-report/index.html
Thresholds: 90% branches / 100% lines / 100% statements
This library is compatible with Cloudflare Workers thanks to:
HTMLRewriter
support with test mocksMIT
Pull requests and improvements welcome!
Feel free to file an issue if you need support for additional icon types or HTML quirks.