feedscout 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -17
- package/dist/blogrolls/defaults.cjs +1 -3
- package/dist/blogrolls/defaults.js +1 -2
- package/dist/blogrolls/extractors.cjs +6 -9
- package/dist/blogrolls/extractors.js +6 -9
- package/dist/blogrolls/index.cjs +6 -9
- package/dist/blogrolls/index.d.cts +1 -1
- package/dist/blogrolls/index.d.ts +1 -1
- package/dist/blogrolls/index.js +1 -4
- package/dist/blogrolls.cjs +4 -5
- package/dist/blogrolls.js +1 -2
- package/dist/common/discover/index.cjs +60 -21
- package/dist/common/discover/index.js +58 -19
- package/dist/common/discover/utils.cjs +30 -9
- package/dist/common/discover/utils.js +28 -8
- package/dist/common/locales.cjs +127 -8
- package/dist/common/locales.js +116 -2
- package/dist/common/types.cjs +10 -0
- package/dist/common/types.d.cts +23 -5
- package/dist/common/types.d.ts +23 -5
- package/dist/common/types.js +10 -0
- package/dist/common/uris/feed/index.cjs +12 -0
- package/dist/common/uris/feed/index.d.cts +6 -0
- package/dist/common/uris/feed/index.d.ts +6 -0
- package/dist/common/uris/feed/index.js +12 -0
- package/dist/common/uris/feed/types.d.cts +9 -0
- package/dist/common/uris/feed/types.d.ts +9 -0
- package/dist/common/uris/guess/index.cjs +2 -4
- package/dist/common/uris/guess/index.d.cts +2 -1
- package/dist/common/uris/guess/index.d.ts +2 -1
- package/dist/common/uris/guess/index.js +1 -3
- package/dist/common/uris/guess/types.d.cts +3 -1
- package/dist/common/uris/guess/types.d.ts +3 -1
- package/dist/common/uris/guess/utils.cjs +5 -4
- package/dist/common/uris/guess/utils.d.cts +3 -1
- package/dist/common/uris/guess/utils.d.ts +3 -1
- package/dist/common/uris/guess/utils.js +5 -3
- package/dist/common/uris/headers/index.cjs +2 -4
- package/dist/common/uris/headers/index.js +1 -3
- package/dist/common/uris/html/handlers.cjs +2 -4
- package/dist/common/uris/html/handlers.js +1 -3
- package/dist/common/uris/html/index.cjs +2 -4
- package/dist/common/uris/html/index.js +1 -3
- package/dist/common/uris/index.cjs +23 -17
- package/dist/common/uris/index.js +19 -13
- package/dist/common/uris/platform/index.cjs +3 -5
- package/dist/common/uris/platform/index.d.cts +7 -0
- package/dist/common/uris/platform/index.d.ts +7 -0
- package/dist/common/uris/platform/index.js +3 -4
- package/dist/common/uris/platform/types.d.cts +4 -2
- package/dist/common/uris/platform/types.d.ts +4 -2
- package/dist/common/utils.cjs +25 -8
- package/dist/common/utils.d.cts +2 -2
- package/dist/common/utils.d.ts +2 -2
- package/dist/common/utils.js +23 -7
- package/dist/favicons/defaults.cjs +60 -0
- package/dist/favicons/defaults.d.cts +18 -0
- package/dist/favicons/defaults.d.ts +18 -0
- package/dist/favicons/defaults.js +53 -0
- package/dist/favicons/extractors.cjs +13 -0
- package/dist/favicons/extractors.d.cts +7 -0
- package/dist/favicons/extractors.d.ts +7 -0
- package/dist/favicons/extractors.js +13 -0
- package/dist/favicons/index.cjs +29 -0
- package/dist/favicons/index.d.cts +7 -0
- package/dist/favicons/index.d.ts +7 -0
- package/dist/favicons/index.js +29 -0
- package/dist/favicons/platform/handlers/bluesky.cjs +27 -0
- package/dist/favicons/platform/handlers/bluesky.js +27 -0
- package/dist/favicons/platform/handlers/codeberg.cjs +18 -0
- package/dist/favicons/platform/handlers/codeberg.js +18 -0
- package/dist/favicons/platform/handlers/deviantart.cjs +29 -0
- package/dist/favicons/platform/handlers/deviantart.js +29 -0
- package/dist/favicons/platform/handlers/github.cjs +18 -0
- package/dist/favicons/platform/handlers/github.js +18 -0
- package/dist/favicons/platform/handlers/githubGist.cjs +18 -0
- package/dist/favicons/platform/handlers/githubGist.js +18 -0
- package/dist/favicons/platform/handlers/lobsters.cjs +21 -0
- package/dist/favicons/platform/handlers/lobsters.js +21 -0
- package/dist/favicons/platform/handlers/mastodon.cjs +36 -0
- package/dist/favicons/platform/handlers/mastodon.js +34 -0
- package/dist/favicons/platform/handlers/reddit.cjs +41 -0
- package/dist/favicons/platform/handlers/reddit.js +41 -0
- package/dist/favicons/platform/handlers/sourceforge.cjs +21 -0
- package/dist/favicons/platform/handlers/sourceforge.js +21 -0
- package/dist/favicons/platform/handlers/tumblr.cjs +16 -0
- package/dist/favicons/platform/handlers/tumblr.js +16 -0
- package/dist/favicons/types.d.cts +4 -0
- package/dist/favicons/types.d.ts +4 -0
- package/dist/favicons.cjs +12 -0
- package/dist/favicons.d.cts +4 -0
- package/dist/favicons.d.ts +4 -0
- package/dist/favicons.js +3 -0
- package/dist/feeds/defaults.cjs +66 -37
- package/dist/feeds/defaults.d.cts +2 -2
- package/dist/feeds/defaults.d.ts +2 -2
- package/dist/feeds/defaults.js +52 -23
- package/dist/feeds/extractors.cjs +1 -3
- package/dist/feeds/extractors.js +1 -3
- package/dist/feeds/index.cjs +6 -8
- package/dist/feeds/index.d.cts +1 -1
- package/dist/feeds/index.d.ts +1 -1
- package/dist/feeds/index.js +1 -3
- package/dist/feeds/platform/handlers/behance.cjs +10 -6
- package/dist/feeds/platform/handlers/behance.js +10 -6
- package/dist/feeds/platform/handlers/blogspot.cjs +19 -8
- package/dist/feeds/platform/handlers/blogspot.js +19 -7
- package/dist/feeds/platform/handlers/bluesky.cjs +7 -6
- package/dist/feeds/platform/handlers/bluesky.js +7 -6
- package/dist/feeds/platform/handlers/codeberg.cjs +69 -0
- package/dist/feeds/platform/handlers/codeberg.js +67 -0
- package/dist/feeds/platform/handlers/csdn.cjs +19 -0
- package/dist/feeds/platform/handlers/csdn.js +19 -0
- package/dist/feeds/platform/handlers/dailymotion.cjs +10 -6
- package/dist/feeds/platform/handlers/dailymotion.js +10 -6
- package/dist/feeds/platform/handlers/deviantart.cjs +20 -8
- package/dist/feeds/platform/handlers/deviantart.js +18 -8
- package/dist/feeds/platform/handlers/devto.cjs +10 -6
- package/dist/feeds/platform/handlers/devto.js +10 -6
- package/dist/feeds/platform/handlers/douban.cjs +54 -0
- package/dist/feeds/platform/handlers/douban.js +54 -0
- package/dist/feeds/platform/handlers/github.cjs +37 -16
- package/dist/feeds/platform/handlers/github.js +35 -16
- package/dist/feeds/platform/handlers/githubGist.cjs +17 -17
- package/dist/feeds/platform/handlers/githubGist.js +15 -17
- package/dist/feeds/platform/handlers/gitlab.cjs +18 -8
- package/dist/feeds/platform/handlers/gitlab.js +18 -8
- package/dist/feeds/platform/handlers/goodreads.cjs +39 -0
- package/dist/feeds/platform/handlers/goodreads.js +39 -0
- package/dist/feeds/platform/handlers/hashnode.cjs +16 -0
- package/dist/feeds/platform/handlers/hashnode.js +16 -0
- package/dist/feeds/platform/handlers/hatenablog.cjs +53 -0
- package/dist/feeds/platform/handlers/hatenablog.js +53 -0
- package/dist/feeds/platform/handlers/itchio.cjs +88 -0
- package/dist/feeds/platform/handlers/itchio.js +88 -0
- package/dist/feeds/platform/handlers/kickstarter.cjs +10 -6
- package/dist/feeds/platform/handlers/kickstarter.js +10 -6
- package/dist/feeds/platform/handlers/letterboxd.cjs +42 -0
- package/dist/feeds/platform/handlers/letterboxd.js +42 -0
- package/dist/feeds/platform/handlers/lobsters.cjs +35 -12
- package/dist/feeds/platform/handlers/lobsters.js +34 -12
- package/dist/feeds/platform/handlers/mastodon.cjs +40 -0
- package/dist/feeds/platform/handlers/mastodon.js +40 -0
- package/dist/feeds/platform/handlers/medium.cjs +26 -10
- package/dist/feeds/platform/handlers/medium.js +26 -10
- package/dist/feeds/platform/handlers/paragraph.cjs +21 -0
- package/dist/feeds/platform/handlers/paragraph.js +21 -0
- package/dist/feeds/platform/handlers/pinterest.cjs +6 -10
- package/dist/feeds/platform/handlers/pinterest.js +6 -10
- package/dist/feeds/platform/handlers/producthunt.cjs +14 -7
- package/dist/feeds/platform/handlers/producthunt.js +14 -7
- package/dist/feeds/platform/handlers/reddit.cjs +35 -12
- package/dist/feeds/platform/handlers/reddit.js +34 -12
- package/dist/feeds/platform/handlers/soundcloud.cjs +6 -5
- package/dist/feeds/platform/handlers/soundcloud.js +6 -5
- package/dist/feeds/platform/handlers/sourceforge.cjs +20 -0
- package/dist/feeds/platform/handlers/sourceforge.js +19 -0
- package/dist/feeds/platform/handlers/stackExchange.cjs +37 -0
- package/dist/feeds/platform/handlers/stackExchange.js +37 -0
- package/dist/feeds/platform/handlers/steam.cjs +26 -0
- package/dist/feeds/platform/handlers/steam.js +26 -0
- package/dist/feeds/platform/handlers/substack.cjs +6 -5
- package/dist/feeds/platform/handlers/substack.js +6 -5
- package/dist/feeds/platform/handlers/tumblr.cjs +13 -7
- package/dist/feeds/platform/handlers/tumblr.js +12 -7
- package/dist/feeds/platform/handlers/v2ex.cjs +33 -0
- package/dist/feeds/platform/handlers/v2ex.js +33 -0
- package/dist/feeds/platform/handlers/vimeo.cjs +68 -0
- package/dist/feeds/platform/handlers/vimeo.js +68 -0
- package/dist/feeds/platform/handlers/wordpress.cjs +46 -12
- package/dist/feeds/platform/handlers/wordpress.js +46 -12
- package/dist/feeds/platform/handlers/wpengine.cjs +10 -0
- package/dist/feeds/platform/handlers/wpengine.js +11 -0
- package/dist/feeds/platform/handlers/ximalaya.cjs +19 -0
- package/dist/feeds/platform/handlers/ximalaya.js +19 -0
- package/dist/feeds/platform/handlers/youtube.cjs +35 -13
- package/dist/feeds/platform/handlers/youtube.js +35 -13
- package/dist/feeds.cjs +4 -5
- package/dist/feeds.js +1 -2
- package/dist/hubs/discover/index.cjs +7 -9
- package/dist/hubs/discover/index.js +1 -3
- package/dist/hubs/discover/utils.cjs +1 -3
- package/dist/hubs/discover/utils.js +1 -2
- package/dist/hubs/feed/index.cjs +1 -3
- package/dist/hubs/feed/index.js +1 -3
- package/dist/hubs/headers/index.cjs +3 -5
- package/dist/hubs/headers/index.js +1 -3
- package/dist/hubs/html/index.cjs +3 -5
- package/dist/hubs/html/index.js +1 -3
- package/dist/hubs.js +1 -1
- package/dist/index.cjs +8 -7
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -2
- package/dist/methods.cjs +13 -10
- package/dist/methods.d.cts +3 -1
- package/dist/methods.d.ts +3 -1
- package/dist/methods.js +3 -2
- package/dist/utils.cjs +3 -4
- package/dist/utils.js +1 -2
- package/package.json +15 -5
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DiscoverInput, DiscoverOptions, DiscoverResult } from "../common/types.js";
|
|
2
|
+
import { FaviconResult } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/favicons/index.d.ts
|
|
5
|
+
declare const discoverFavicons: <TValid extends FaviconResult = FaviconResult>(input: DiscoverInput, options?: DiscoverOptions<TValid>) => Promise<Array<DiscoverResult<TValid>>>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { discoverFavicons };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { normalizeUrl } from "../common/utils.js";
|
|
2
|
+
import { defaultFetchFn } from "../common/discover/utils.js";
|
|
3
|
+
import { discover } from "../common/discover/index.js";
|
|
4
|
+
import { defaultFeedOptions, defaultGuessOptions, defaultHeadersOptions, defaultHtmlOptions, defaultPlatformOptions } from "./defaults.js";
|
|
5
|
+
import { defaultExtractor } from "./extractors.js";
|
|
6
|
+
//#region src/favicons/index.ts
|
|
7
|
+
const discoverFavicons = async (input, options = {}) => {
|
|
8
|
+
return discover(input, {
|
|
9
|
+
...options,
|
|
10
|
+
methods: options.methods ?? [
|
|
11
|
+
"platform",
|
|
12
|
+
"feed",
|
|
13
|
+
"html",
|
|
14
|
+
"headers",
|
|
15
|
+
"guess"
|
|
16
|
+
],
|
|
17
|
+
fetchFn: options.fetchFn ?? defaultFetchFn,
|
|
18
|
+
extractFn: options.extractFn ?? defaultExtractor,
|
|
19
|
+
normalizeUrlFn: options.normalizeUrlFn ?? normalizeUrl
|
|
20
|
+
}, {
|
|
21
|
+
platform: defaultPlatformOptions,
|
|
22
|
+
feed: defaultFeedOptions,
|
|
23
|
+
html: defaultHtmlOptions,
|
|
24
|
+
headers: defaultHeadersOptions,
|
|
25
|
+
guess: defaultGuessOptions
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { discoverFavicons };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
//#region src/favicons/platform/handlers/bluesky.ts
|
|
3
|
+
const hosts = ["bsky.app", "www.bsky.app"];
|
|
4
|
+
const isProfilePath = (pathname) => {
|
|
5
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
6
|
+
return segments.length >= 2 && segments[0] === "profile";
|
|
7
|
+
};
|
|
8
|
+
const blueskyHandler = {
|
|
9
|
+
match: (url) => {
|
|
10
|
+
try {
|
|
11
|
+
return require_utils.isHostOf(url, hosts) && isProfilePath(new URL(url).pathname);
|
|
12
|
+
} catch {}
|
|
13
|
+
return false;
|
|
14
|
+
},
|
|
15
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
16
|
+
if (!fetchFn) return [];
|
|
17
|
+
try {
|
|
18
|
+
const { pathname } = new URL(url);
|
|
19
|
+
const response = await fetchFn(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${pathname.split("/").filter(Boolean)[1]}`);
|
|
20
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
21
|
+
if (typeof data.avatar === "string" && data.avatar.length > 0) return [{ uri: data.avatar }];
|
|
22
|
+
} catch {}
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
exports.blueskyHandler = blueskyHandler;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isHostOf } from "../../../common/utils.js";
|
|
2
|
+
//#region src/favicons/platform/handlers/bluesky.ts
|
|
3
|
+
const hosts = ["bsky.app", "www.bsky.app"];
|
|
4
|
+
const isProfilePath = (pathname) => {
|
|
5
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
6
|
+
return segments.length >= 2 && segments[0] === "profile";
|
|
7
|
+
};
|
|
8
|
+
const blueskyHandler = {
|
|
9
|
+
match: (url) => {
|
|
10
|
+
try {
|
|
11
|
+
return isHostOf(url, hosts) && isProfilePath(new URL(url).pathname);
|
|
12
|
+
} catch {}
|
|
13
|
+
return false;
|
|
14
|
+
},
|
|
15
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
16
|
+
if (!fetchFn) return [];
|
|
17
|
+
try {
|
|
18
|
+
const { pathname } = new URL(url);
|
|
19
|
+
const response = await fetchFn(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${pathname.split("/").filter(Boolean)[1]}`);
|
|
20
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
21
|
+
if (typeof data.avatar === "string" && data.avatar.length > 0) return [{ uri: data.avatar }];
|
|
22
|
+
} catch {}
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { blueskyHandler };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_codeberg = require("../../../feeds/platform/handlers/codeberg.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/codeberg.ts
|
|
4
|
+
const codebergHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return require_utils.isHostOf(url, require_codeberg.hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { origin, pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const username = segments[0];
|
|
13
|
+
if (require_utils.isAnyOf(username, require_codeberg.excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `${origin}/user/avatar/${username}/512` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.codebergHandler = codebergHandler;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isAnyOf, isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { excludedPaths, hosts } from "../../../feeds/platform/handlers/codeberg.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/codeberg.ts
|
|
4
|
+
const codebergHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return isHostOf(url, hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { origin, pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const username = segments[0];
|
|
13
|
+
if (isAnyOf(username, excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `${origin}/user/avatar/${username}/512` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { codebergHandler };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_deviantart = require("../../../feeds/platform/handlers/deviantart.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/deviantart.ts
|
|
4
|
+
const deviantartHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
try {
|
|
7
|
+
const { pathname } = new URL(url);
|
|
8
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
9
|
+
if (!require_utils.isHostOf(url, require_deviantart.hosts) || segments.length === 0) return false;
|
|
10
|
+
if (segments[0] === "tag") return false;
|
|
11
|
+
return !require_utils.isAnyOf(segments[0], require_deviantart.excludedPaths);
|
|
12
|
+
} catch {}
|
|
13
|
+
return false;
|
|
14
|
+
},
|
|
15
|
+
resolve: (url) => {
|
|
16
|
+
const { pathname } = new URL(url);
|
|
17
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
18
|
+
if (segments.length === 0 || segments[0] === "tag") return [];
|
|
19
|
+
const username = segments[0].toLowerCase();
|
|
20
|
+
if (require_utils.isAnyOf(username, require_deviantart.excludedPaths) || username.length < 2) return [];
|
|
21
|
+
return [
|
|
22
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.jpg`,
|
|
23
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.gif`,
|
|
24
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.png`
|
|
25
|
+
].map((value) => ({ uri: value }));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.deviantartHandler = deviantartHandler;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isAnyOf, isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { excludedPaths, hosts } from "../../../feeds/platform/handlers/deviantart.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/deviantart.ts
|
|
4
|
+
const deviantartHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
try {
|
|
7
|
+
const { pathname } = new URL(url);
|
|
8
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
9
|
+
if (!isHostOf(url, hosts) || segments.length === 0) return false;
|
|
10
|
+
if (segments[0] === "tag") return false;
|
|
11
|
+
return !isAnyOf(segments[0], excludedPaths);
|
|
12
|
+
} catch {}
|
|
13
|
+
return false;
|
|
14
|
+
},
|
|
15
|
+
resolve: (url) => {
|
|
16
|
+
const { pathname } = new URL(url);
|
|
17
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
18
|
+
if (segments.length === 0 || segments[0] === "tag") return [];
|
|
19
|
+
const username = segments[0].toLowerCase();
|
|
20
|
+
if (isAnyOf(username, excludedPaths) || username.length < 2) return [];
|
|
21
|
+
return [
|
|
22
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.jpg`,
|
|
23
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.gif`,
|
|
24
|
+
`https://a.deviantart.net/avatars-big/${username[0]}/${username[1]}/${username}.png`
|
|
25
|
+
].map((value) => ({ uri: value }));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { deviantartHandler };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_github = require("../../../feeds/platform/handlers/github.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/github.ts
|
|
4
|
+
const githubHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return require_utils.isHostOf(url, require_github.hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const user = segments[0];
|
|
13
|
+
if (require_utils.isAnyOf(user, require_github.excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `https://github.com/${user}.png` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.githubHandler = githubHandler;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isAnyOf, isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { excludedPaths, hosts } from "../../../feeds/platform/handlers/github.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/github.ts
|
|
4
|
+
const githubHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return isHostOf(url, hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const user = segments[0];
|
|
13
|
+
if (isAnyOf(user, excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `https://github.com/${user}.png` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { githubHandler };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_githubGist = require("../../../feeds/platform/handlers/githubGist.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/githubGist.ts
|
|
4
|
+
const githubGistHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return require_utils.isHostOf(url, require_githubGist.hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const user = segments[0];
|
|
13
|
+
if (require_utils.isAnyOf(user, require_githubGist.excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `https://github.com/${user}.png` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.githubGistHandler = githubGistHandler;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isAnyOf, isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { excludedPaths, hosts } from "../../../feeds/platform/handlers/githubGist.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/githubGist.ts
|
|
4
|
+
const githubGistHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return isHostOf(url, hosts);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { pathname } = new URL(url);
|
|
10
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
11
|
+
if (segments.length === 0) return [];
|
|
12
|
+
const user = segments[0];
|
|
13
|
+
if (isAnyOf(user, excludedPaths)) return [];
|
|
14
|
+
return [{ uri: `https://github.com/${user}.png` }];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { githubGistHandler };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_lobsters = require("../../../feeds/platform/handlers/lobsters.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/lobsters.ts
|
|
4
|
+
const userPathRegex = /^\/~([a-zA-Z0-9_-]+)/;
|
|
5
|
+
const lobstersHandler = {
|
|
6
|
+
match: (url) => {
|
|
7
|
+
try {
|
|
8
|
+
const { pathname } = new URL(url);
|
|
9
|
+
return require_utils.isHostOf(url, require_lobsters.hosts) && userPathRegex.test(pathname);
|
|
10
|
+
} catch {}
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
resolve: (url) => {
|
|
14
|
+
const { pathname } = new URL(url);
|
|
15
|
+
const match = pathname.match(userPathRegex);
|
|
16
|
+
if (!match?.[1]) return [];
|
|
17
|
+
return [{ uri: `https://lobste.rs/avatars/${match[1]}-100.png` }];
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.lobstersHandler = lobstersHandler;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { hosts } from "../../../feeds/platform/handlers/lobsters.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/lobsters.ts
|
|
4
|
+
const userPathRegex = /^\/~([a-zA-Z0-9_-]+)/;
|
|
5
|
+
const lobstersHandler = {
|
|
6
|
+
match: (url) => {
|
|
7
|
+
try {
|
|
8
|
+
const { pathname } = new URL(url);
|
|
9
|
+
return isHostOf(url, hosts) && userPathRegex.test(pathname);
|
|
10
|
+
} catch {}
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
resolve: (url) => {
|
|
14
|
+
const { pathname } = new URL(url);
|
|
15
|
+
const match = pathname.match(userPathRegex);
|
|
16
|
+
if (!match?.[1]) return [];
|
|
17
|
+
return [{ uri: `https://lobste.rs/avatars/${match[1]}-100.png` }];
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { lobstersHandler };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/favicons/platform/handlers/mastodon.ts
|
|
2
|
+
const isProfilePath = (pathname) => {
|
|
3
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
4
|
+
return segments.length === 1 && segments[0].startsWith("@");
|
|
5
|
+
};
|
|
6
|
+
const isMastodonHtml = (content) => {
|
|
7
|
+
return /<meta[^>]+name=["']generator["'][^>]+content=["']Mastodon/i.test(content);
|
|
8
|
+
};
|
|
9
|
+
const isMastodonHeaders = (headers) => {
|
|
10
|
+
return /mastodon/i.test(headers.get("server") ?? "");
|
|
11
|
+
};
|
|
12
|
+
const mastodonHandler = {
|
|
13
|
+
match: (url, content, headers) => {
|
|
14
|
+
try {
|
|
15
|
+
const { pathname } = new URL(url);
|
|
16
|
+
if (!isProfilePath(pathname)) return false;
|
|
17
|
+
if (content && isMastodonHtml(content)) return true;
|
|
18
|
+
if (headers && isMastodonHeaders(headers)) return true;
|
|
19
|
+
} catch {}
|
|
20
|
+
return false;
|
|
21
|
+
},
|
|
22
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
23
|
+
if (!fetchFn) return [];
|
|
24
|
+
try {
|
|
25
|
+
const { hostname, pathname } = new URL(url);
|
|
26
|
+
const response = await fetchFn(`https://${hostname}/api/v1/accounts/lookup?acct=${pathname.split("/").filter(Boolean)[0].replace("@", "")}`);
|
|
27
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
28
|
+
if (typeof data.avatar === "string" && data.avatar.length > 0) return [{ uri: data.avatar }];
|
|
29
|
+
} catch {}
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
exports.isMastodonHeaders = isMastodonHeaders;
|
|
35
|
+
exports.isMastodonHtml = isMastodonHtml;
|
|
36
|
+
exports.mastodonHandler = mastodonHandler;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/favicons/platform/handlers/mastodon.ts
|
|
2
|
+
const isProfilePath = (pathname) => {
|
|
3
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
4
|
+
return segments.length === 1 && segments[0].startsWith("@");
|
|
5
|
+
};
|
|
6
|
+
const isMastodonHtml = (content) => {
|
|
7
|
+
return /<meta[^>]+name=["']generator["'][^>]+content=["']Mastodon/i.test(content);
|
|
8
|
+
};
|
|
9
|
+
const isMastodonHeaders = (headers) => {
|
|
10
|
+
return /mastodon/i.test(headers.get("server") ?? "");
|
|
11
|
+
};
|
|
12
|
+
const mastodonHandler = {
|
|
13
|
+
match: (url, content, headers) => {
|
|
14
|
+
try {
|
|
15
|
+
const { pathname } = new URL(url);
|
|
16
|
+
if (!isProfilePath(pathname)) return false;
|
|
17
|
+
if (content && isMastodonHtml(content)) return true;
|
|
18
|
+
if (headers && isMastodonHeaders(headers)) return true;
|
|
19
|
+
} catch {}
|
|
20
|
+
return false;
|
|
21
|
+
},
|
|
22
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
23
|
+
if (!fetchFn) return [];
|
|
24
|
+
try {
|
|
25
|
+
const { hostname, pathname } = new URL(url);
|
|
26
|
+
const response = await fetchFn(`https://${hostname}/api/v1/accounts/lookup?acct=${pathname.split("/").filter(Boolean)[0].replace("@", "")}`);
|
|
27
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
28
|
+
if (typeof data.avatar === "string" && data.avatar.length > 0) return [{ uri: data.avatar }];
|
|
29
|
+
} catch {}
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
export { isMastodonHeaders, isMastodonHtml, mastodonHandler };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_reddit = require("../../../feeds/platform/handlers/reddit.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/reddit.ts
|
|
4
|
+
const isSubredditPath = (pathname) => {
|
|
5
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
6
|
+
return segments.length >= 2 && segments[0] === "r";
|
|
7
|
+
};
|
|
8
|
+
const isUserPath = (pathname) => {
|
|
9
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
10
|
+
return segments.length >= 2 && (segments[0] === "u" || segments[0] === "user");
|
|
11
|
+
};
|
|
12
|
+
const redditHandler = {
|
|
13
|
+
match: (url) => {
|
|
14
|
+
try {
|
|
15
|
+
const { pathname } = new URL(url);
|
|
16
|
+
return require_utils.isHostOf(url, require_reddit.hosts) && (isSubredditPath(pathname) || isUserPath(pathname));
|
|
17
|
+
} catch {}
|
|
18
|
+
return false;
|
|
19
|
+
},
|
|
20
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
21
|
+
if (!fetchFn) return [];
|
|
22
|
+
try {
|
|
23
|
+
const { pathname } = new URL(url);
|
|
24
|
+
if (isSubredditPath(pathname)) {
|
|
25
|
+
const response = await fetchFn(`https://www.reddit.com/r/${pathname.split("/").filter(Boolean)[1]}/about.json`);
|
|
26
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
27
|
+
const icon = data?.data?.community_icon?.split("?")[0] || data?.data?.icon_img;
|
|
28
|
+
if (typeof icon === "string" && icon.length > 0) return [{ uri: icon }];
|
|
29
|
+
}
|
|
30
|
+
if (isUserPath(pathname)) {
|
|
31
|
+
const response = await fetchFn(`https://www.reddit.com/user/${pathname.split("/").filter(Boolean)[1]}/about.json`);
|
|
32
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
33
|
+
const icon = data?.data?.icon_img || data?.data?.snoovatar_img;
|
|
34
|
+
if (typeof icon === "string" && icon.length > 0) return [{ uri: icon }];
|
|
35
|
+
}
|
|
36
|
+
} catch {}
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
exports.redditHandler = redditHandler;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { hosts } from "../../../feeds/platform/handlers/reddit.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/reddit.ts
|
|
4
|
+
const isSubredditPath = (pathname) => {
|
|
5
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
6
|
+
return segments.length >= 2 && segments[0] === "r";
|
|
7
|
+
};
|
|
8
|
+
const isUserPath = (pathname) => {
|
|
9
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
10
|
+
return segments.length >= 2 && (segments[0] === "u" || segments[0] === "user");
|
|
11
|
+
};
|
|
12
|
+
const redditHandler = {
|
|
13
|
+
match: (url) => {
|
|
14
|
+
try {
|
|
15
|
+
const { pathname } = new URL(url);
|
|
16
|
+
return isHostOf(url, hosts) && (isSubredditPath(pathname) || isUserPath(pathname));
|
|
17
|
+
} catch {}
|
|
18
|
+
return false;
|
|
19
|
+
},
|
|
20
|
+
resolve: async (url, _content, _headers, fetchFn) => {
|
|
21
|
+
if (!fetchFn) return [];
|
|
22
|
+
try {
|
|
23
|
+
const { pathname } = new URL(url);
|
|
24
|
+
if (isSubredditPath(pathname)) {
|
|
25
|
+
const response = await fetchFn(`https://www.reddit.com/r/${pathname.split("/").filter(Boolean)[1]}/about.json`);
|
|
26
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
27
|
+
const icon = data?.data?.community_icon?.split("?")[0] || data?.data?.icon_img;
|
|
28
|
+
if (typeof icon === "string" && icon.length > 0) return [{ uri: icon }];
|
|
29
|
+
}
|
|
30
|
+
if (isUserPath(pathname)) {
|
|
31
|
+
const response = await fetchFn(`https://www.reddit.com/user/${pathname.split("/").filter(Boolean)[1]}/about.json`);
|
|
32
|
+
const data = JSON.parse(typeof response.body === "string" ? response.body : "");
|
|
33
|
+
const icon = data?.data?.icon_img || data?.data?.snoovatar_img;
|
|
34
|
+
if (typeof icon === "string" && icon.length > 0) return [{ uri: icon }];
|
|
35
|
+
}
|
|
36
|
+
} catch {}
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
export { redditHandler };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_sourceforge = require("../../../feeds/platform/handlers/sourceforge.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/sourceforge.ts
|
|
4
|
+
const sourceforgeHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
try {
|
|
7
|
+
const { pathname } = new URL(url);
|
|
8
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
9
|
+
return require_utils.isHostOf(url, require_sourceforge.hosts) && segments[0] === "projects" && !!segments[1];
|
|
10
|
+
} catch {}
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
resolve: (url) => {
|
|
14
|
+
const { pathname } = new URL(url);
|
|
15
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
16
|
+
if (segments[0] !== "projects" || !segments[1]) return [];
|
|
17
|
+
return [{ uri: `https://a.fsdn.com/allura/p/${segments[1]}/icon` }];
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.sourceforgeHandler = sourceforgeHandler;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isHostOf } from "../../../common/utils.js";
|
|
2
|
+
import { hosts } from "../../../feeds/platform/handlers/sourceforge.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/sourceforge.ts
|
|
4
|
+
const sourceforgeHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
try {
|
|
7
|
+
const { pathname } = new URL(url);
|
|
8
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
9
|
+
return isHostOf(url, hosts) && segments[0] === "projects" && !!segments[1];
|
|
10
|
+
} catch {}
|
|
11
|
+
return false;
|
|
12
|
+
},
|
|
13
|
+
resolve: (url) => {
|
|
14
|
+
const { pathname } = new URL(url);
|
|
15
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
16
|
+
if (segments[0] !== "projects" || !segments[1]) return [];
|
|
17
|
+
return [{ uri: `https://a.fsdn.com/allura/p/${segments[1]}/icon` }];
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { sourceforgeHandler };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const require_utils = require("../../../common/utils.cjs");
|
|
2
|
+
const require_tumblr = require("../../../feeds/platform/handlers/tumblr.cjs");
|
|
3
|
+
//#region src/favicons/platform/handlers/tumblr.ts
|
|
4
|
+
const tumblrHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return require_utils.isSubdomainOf(url, require_tumblr.domains);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { hostname } = new URL(url);
|
|
10
|
+
const blog = hostname.split(".")[0];
|
|
11
|
+
if (!blog || blog === "www") return [];
|
|
12
|
+
return [{ uri: `https://api.tumblr.com/v2/blog/${blog}/avatar/512` }];
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
exports.tumblrHandler = tumblrHandler;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { isSubdomainOf } from "../../../common/utils.js";
|
|
2
|
+
import { domains } from "../../../feeds/platform/handlers/tumblr.js";
|
|
3
|
+
//#region src/favicons/platform/handlers/tumblr.ts
|
|
4
|
+
const tumblrHandler = {
|
|
5
|
+
match: (url) => {
|
|
6
|
+
return isSubdomainOf(url, domains);
|
|
7
|
+
},
|
|
8
|
+
resolve: (url) => {
|
|
9
|
+
const { hostname } = new URL(url);
|
|
10
|
+
const blog = hostname.split(".")[0];
|
|
11
|
+
if (!blog || blog === "www") return [];
|
|
12
|
+
return [{ uri: `https://api.tumblr.com/v2/blog/${blog}/avatar/512` }];
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { tumblrHandler };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_defaults = require("./favicons/defaults.cjs");
|
|
3
|
+
const require_extractors = require("./favicons/extractors.cjs");
|
|
4
|
+
exports.defaultExtractor = require_extractors.defaultExtractor;
|
|
5
|
+
exports.defaultFeedOptions = require_defaults.defaultFeedOptions;
|
|
6
|
+
exports.defaultGuessOptions = require_defaults.defaultGuessOptions;
|
|
7
|
+
exports.defaultGuessPaths = require_defaults.defaultGuessPaths;
|
|
8
|
+
exports.defaultHeadersOptions = require_defaults.defaultHeadersOptions;
|
|
9
|
+
exports.defaultHtmlOptions = require_defaults.defaultHtmlOptions;
|
|
10
|
+
exports.defaultIconRels = require_defaults.defaultIconRels;
|
|
11
|
+
exports.defaultPlatformOptions = require_defaults.defaultPlatformOptions;
|
|
12
|
+
exports.linkSelectors = require_defaults.linkSelectors;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors } from "./favicons/defaults.cjs";
|
|
2
|
+
import { FaviconResult } from "./favicons/types.cjs";
|
|
3
|
+
import { defaultExtractor } from "./favicons/extractors.cjs";
|
|
4
|
+
export { FaviconResult, defaultExtractor, defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors } from "./favicons/defaults.js";
|
|
2
|
+
import { FaviconResult } from "./favicons/types.js";
|
|
3
|
+
import { defaultExtractor } from "./favicons/extractors.js";
|
|
4
|
+
export { FaviconResult, defaultExtractor, defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
|
package/dist/favicons.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors } from "./favicons/defaults.js";
|
|
2
|
+
import { defaultExtractor } from "./favicons/extractors.js";
|
|
3
|
+
export { defaultExtractor, defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
|