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.
Files changed (201) hide show
  1. package/README.md +12 -17
  2. package/dist/blogrolls/defaults.cjs +1 -3
  3. package/dist/blogrolls/defaults.js +1 -2
  4. package/dist/blogrolls/extractors.cjs +6 -9
  5. package/dist/blogrolls/extractors.js +6 -9
  6. package/dist/blogrolls/index.cjs +6 -9
  7. package/dist/blogrolls/index.d.cts +1 -1
  8. package/dist/blogrolls/index.d.ts +1 -1
  9. package/dist/blogrolls/index.js +1 -4
  10. package/dist/blogrolls.cjs +4 -5
  11. package/dist/blogrolls.js +1 -2
  12. package/dist/common/discover/index.cjs +60 -21
  13. package/dist/common/discover/index.js +58 -19
  14. package/dist/common/discover/utils.cjs +30 -9
  15. package/dist/common/discover/utils.js +28 -8
  16. package/dist/common/locales.cjs +127 -8
  17. package/dist/common/locales.js +116 -2
  18. package/dist/common/types.cjs +10 -0
  19. package/dist/common/types.d.cts +23 -5
  20. package/dist/common/types.d.ts +23 -5
  21. package/dist/common/types.js +10 -0
  22. package/dist/common/uris/feed/index.cjs +12 -0
  23. package/dist/common/uris/feed/index.d.cts +6 -0
  24. package/dist/common/uris/feed/index.d.ts +6 -0
  25. package/dist/common/uris/feed/index.js +12 -0
  26. package/dist/common/uris/feed/types.d.cts +9 -0
  27. package/dist/common/uris/feed/types.d.ts +9 -0
  28. package/dist/common/uris/guess/index.cjs +2 -4
  29. package/dist/common/uris/guess/index.d.cts +2 -1
  30. package/dist/common/uris/guess/index.d.ts +2 -1
  31. package/dist/common/uris/guess/index.js +1 -3
  32. package/dist/common/uris/guess/types.d.cts +3 -1
  33. package/dist/common/uris/guess/types.d.ts +3 -1
  34. package/dist/common/uris/guess/utils.cjs +5 -4
  35. package/dist/common/uris/guess/utils.d.cts +3 -1
  36. package/dist/common/uris/guess/utils.d.ts +3 -1
  37. package/dist/common/uris/guess/utils.js +5 -3
  38. package/dist/common/uris/headers/index.cjs +2 -4
  39. package/dist/common/uris/headers/index.js +1 -3
  40. package/dist/common/uris/html/handlers.cjs +2 -4
  41. package/dist/common/uris/html/handlers.js +1 -3
  42. package/dist/common/uris/html/index.cjs +2 -4
  43. package/dist/common/uris/html/index.js +1 -3
  44. package/dist/common/uris/index.cjs +23 -17
  45. package/dist/common/uris/index.js +19 -13
  46. package/dist/common/uris/platform/index.cjs +3 -5
  47. package/dist/common/uris/platform/index.d.cts +7 -0
  48. package/dist/common/uris/platform/index.d.ts +7 -0
  49. package/dist/common/uris/platform/index.js +3 -4
  50. package/dist/common/uris/platform/types.d.cts +4 -2
  51. package/dist/common/uris/platform/types.d.ts +4 -2
  52. package/dist/common/utils.cjs +25 -8
  53. package/dist/common/utils.d.cts +2 -2
  54. package/dist/common/utils.d.ts +2 -2
  55. package/dist/common/utils.js +23 -7
  56. package/dist/favicons/defaults.cjs +60 -0
  57. package/dist/favicons/defaults.d.cts +18 -0
  58. package/dist/favicons/defaults.d.ts +18 -0
  59. package/dist/favicons/defaults.js +53 -0
  60. package/dist/favicons/extractors.cjs +13 -0
  61. package/dist/favicons/extractors.d.cts +7 -0
  62. package/dist/favicons/extractors.d.ts +7 -0
  63. package/dist/favicons/extractors.js +13 -0
  64. package/dist/favicons/index.cjs +29 -0
  65. package/dist/favicons/index.d.cts +7 -0
  66. package/dist/favicons/index.d.ts +7 -0
  67. package/dist/favicons/index.js +29 -0
  68. package/dist/favicons/platform/handlers/bluesky.cjs +27 -0
  69. package/dist/favicons/platform/handlers/bluesky.js +27 -0
  70. package/dist/favicons/platform/handlers/codeberg.cjs +18 -0
  71. package/dist/favicons/platform/handlers/codeberg.js +18 -0
  72. package/dist/favicons/platform/handlers/deviantart.cjs +29 -0
  73. package/dist/favicons/platform/handlers/deviantart.js +29 -0
  74. package/dist/favicons/platform/handlers/github.cjs +18 -0
  75. package/dist/favicons/platform/handlers/github.js +18 -0
  76. package/dist/favicons/platform/handlers/githubGist.cjs +18 -0
  77. package/dist/favicons/platform/handlers/githubGist.js +18 -0
  78. package/dist/favicons/platform/handlers/lobsters.cjs +21 -0
  79. package/dist/favicons/platform/handlers/lobsters.js +21 -0
  80. package/dist/favicons/platform/handlers/mastodon.cjs +36 -0
  81. package/dist/favicons/platform/handlers/mastodon.js +34 -0
  82. package/dist/favicons/platform/handlers/reddit.cjs +41 -0
  83. package/dist/favicons/platform/handlers/reddit.js +41 -0
  84. package/dist/favicons/platform/handlers/sourceforge.cjs +21 -0
  85. package/dist/favicons/platform/handlers/sourceforge.js +21 -0
  86. package/dist/favicons/platform/handlers/tumblr.cjs +16 -0
  87. package/dist/favicons/platform/handlers/tumblr.js +16 -0
  88. package/dist/favicons/types.d.cts +4 -0
  89. package/dist/favicons/types.d.ts +4 -0
  90. package/dist/favicons.cjs +12 -0
  91. package/dist/favicons.d.cts +4 -0
  92. package/dist/favicons.d.ts +4 -0
  93. package/dist/favicons.js +3 -0
  94. package/dist/feeds/defaults.cjs +66 -37
  95. package/dist/feeds/defaults.d.cts +2 -2
  96. package/dist/feeds/defaults.d.ts +2 -2
  97. package/dist/feeds/defaults.js +52 -23
  98. package/dist/feeds/extractors.cjs +1 -3
  99. package/dist/feeds/extractors.js +1 -3
  100. package/dist/feeds/index.cjs +6 -8
  101. package/dist/feeds/index.d.cts +1 -1
  102. package/dist/feeds/index.d.ts +1 -1
  103. package/dist/feeds/index.js +1 -3
  104. package/dist/feeds/platform/handlers/behance.cjs +10 -6
  105. package/dist/feeds/platform/handlers/behance.js +10 -6
  106. package/dist/feeds/platform/handlers/blogspot.cjs +19 -8
  107. package/dist/feeds/platform/handlers/blogspot.js +19 -7
  108. package/dist/feeds/platform/handlers/bluesky.cjs +7 -6
  109. package/dist/feeds/platform/handlers/bluesky.js +7 -6
  110. package/dist/feeds/platform/handlers/codeberg.cjs +69 -0
  111. package/dist/feeds/platform/handlers/codeberg.js +67 -0
  112. package/dist/feeds/platform/handlers/csdn.cjs +19 -0
  113. package/dist/feeds/platform/handlers/csdn.js +19 -0
  114. package/dist/feeds/platform/handlers/dailymotion.cjs +10 -6
  115. package/dist/feeds/platform/handlers/dailymotion.js +10 -6
  116. package/dist/feeds/platform/handlers/deviantart.cjs +20 -8
  117. package/dist/feeds/platform/handlers/deviantart.js +18 -8
  118. package/dist/feeds/platform/handlers/devto.cjs +10 -6
  119. package/dist/feeds/platform/handlers/devto.js +10 -6
  120. package/dist/feeds/platform/handlers/douban.cjs +54 -0
  121. package/dist/feeds/platform/handlers/douban.js +54 -0
  122. package/dist/feeds/platform/handlers/github.cjs +37 -16
  123. package/dist/feeds/platform/handlers/github.js +35 -16
  124. package/dist/feeds/platform/handlers/githubGist.cjs +17 -17
  125. package/dist/feeds/platform/handlers/githubGist.js +15 -17
  126. package/dist/feeds/platform/handlers/gitlab.cjs +18 -8
  127. package/dist/feeds/platform/handlers/gitlab.js +18 -8
  128. package/dist/feeds/platform/handlers/goodreads.cjs +39 -0
  129. package/dist/feeds/platform/handlers/goodreads.js +39 -0
  130. package/dist/feeds/platform/handlers/hashnode.cjs +16 -0
  131. package/dist/feeds/platform/handlers/hashnode.js +16 -0
  132. package/dist/feeds/platform/handlers/hatenablog.cjs +53 -0
  133. package/dist/feeds/platform/handlers/hatenablog.js +53 -0
  134. package/dist/feeds/platform/handlers/itchio.cjs +88 -0
  135. package/dist/feeds/platform/handlers/itchio.js +88 -0
  136. package/dist/feeds/platform/handlers/kickstarter.cjs +10 -6
  137. package/dist/feeds/platform/handlers/kickstarter.js +10 -6
  138. package/dist/feeds/platform/handlers/letterboxd.cjs +42 -0
  139. package/dist/feeds/platform/handlers/letterboxd.js +42 -0
  140. package/dist/feeds/platform/handlers/lobsters.cjs +35 -12
  141. package/dist/feeds/platform/handlers/lobsters.js +34 -12
  142. package/dist/feeds/platform/handlers/mastodon.cjs +40 -0
  143. package/dist/feeds/platform/handlers/mastodon.js +40 -0
  144. package/dist/feeds/platform/handlers/medium.cjs +26 -10
  145. package/dist/feeds/platform/handlers/medium.js +26 -10
  146. package/dist/feeds/platform/handlers/paragraph.cjs +21 -0
  147. package/dist/feeds/platform/handlers/paragraph.js +21 -0
  148. package/dist/feeds/platform/handlers/pinterest.cjs +6 -10
  149. package/dist/feeds/platform/handlers/pinterest.js +6 -10
  150. package/dist/feeds/platform/handlers/producthunt.cjs +14 -7
  151. package/dist/feeds/platform/handlers/producthunt.js +14 -7
  152. package/dist/feeds/platform/handlers/reddit.cjs +35 -12
  153. package/dist/feeds/platform/handlers/reddit.js +34 -12
  154. package/dist/feeds/platform/handlers/soundcloud.cjs +6 -5
  155. package/dist/feeds/platform/handlers/soundcloud.js +6 -5
  156. package/dist/feeds/platform/handlers/sourceforge.cjs +20 -0
  157. package/dist/feeds/platform/handlers/sourceforge.js +19 -0
  158. package/dist/feeds/platform/handlers/stackExchange.cjs +37 -0
  159. package/dist/feeds/platform/handlers/stackExchange.js +37 -0
  160. package/dist/feeds/platform/handlers/steam.cjs +26 -0
  161. package/dist/feeds/platform/handlers/steam.js +26 -0
  162. package/dist/feeds/platform/handlers/substack.cjs +6 -5
  163. package/dist/feeds/platform/handlers/substack.js +6 -5
  164. package/dist/feeds/platform/handlers/tumblr.cjs +13 -7
  165. package/dist/feeds/platform/handlers/tumblr.js +12 -7
  166. package/dist/feeds/platform/handlers/v2ex.cjs +33 -0
  167. package/dist/feeds/platform/handlers/v2ex.js +33 -0
  168. package/dist/feeds/platform/handlers/vimeo.cjs +68 -0
  169. package/dist/feeds/platform/handlers/vimeo.js +68 -0
  170. package/dist/feeds/platform/handlers/wordpress.cjs +46 -12
  171. package/dist/feeds/platform/handlers/wordpress.js +46 -12
  172. package/dist/feeds/platform/handlers/wpengine.cjs +10 -0
  173. package/dist/feeds/platform/handlers/wpengine.js +11 -0
  174. package/dist/feeds/platform/handlers/ximalaya.cjs +19 -0
  175. package/dist/feeds/platform/handlers/ximalaya.js +19 -0
  176. package/dist/feeds/platform/handlers/youtube.cjs +35 -13
  177. package/dist/feeds/platform/handlers/youtube.js +35 -13
  178. package/dist/feeds.cjs +4 -5
  179. package/dist/feeds.js +1 -2
  180. package/dist/hubs/discover/index.cjs +7 -9
  181. package/dist/hubs/discover/index.js +1 -3
  182. package/dist/hubs/discover/utils.cjs +1 -3
  183. package/dist/hubs/discover/utils.js +1 -2
  184. package/dist/hubs/feed/index.cjs +1 -3
  185. package/dist/hubs/feed/index.js +1 -3
  186. package/dist/hubs/headers/index.cjs +3 -5
  187. package/dist/hubs/headers/index.js +1 -3
  188. package/dist/hubs/html/index.cjs +3 -5
  189. package/dist/hubs/html/index.js +1 -3
  190. package/dist/hubs.js +1 -1
  191. package/dist/index.cjs +8 -7
  192. package/dist/index.d.cts +3 -2
  193. package/dist/index.d.ts +3 -2
  194. package/dist/index.js +2 -2
  195. package/dist/methods.cjs +13 -10
  196. package/dist/methods.d.cts +3 -1
  197. package/dist/methods.d.ts +3 -1
  198. package/dist/methods.js +3 -2
  199. package/dist/utils.cjs +3 -4
  200. package/dist/utils.js +1 -2
  201. package/package.json +15 -5
@@ -1,5 +1,4 @@
1
- const require_utils = require('../../utils.cjs');
2
-
1
+ const require_utils = require("../../utils.cjs");
3
2
  //#region src/common/uris/html/handlers.ts
4
3
  const handleOpenTag = (context, name, attribs, _isImplied) => {
5
4
  if (name === "link" && attribs.href) {
@@ -42,6 +41,5 @@ const createHtmlUrisHandlers = (context) => {
42
41
  }
43
42
  };
44
43
  };
45
-
46
44
  //#endregion
47
- exports.createHtmlUrisHandlers = createHtmlUrisHandlers;
45
+ exports.createHtmlUrisHandlers = createHtmlUrisHandlers;
@@ -1,5 +1,4 @@
1
1
  import { endsWithAnyOf, includesAnyOf, matchesAnyOfLinkSelectors } from "../../utils.js";
2
-
3
2
  //#region src/common/uris/html/handlers.ts
4
3
  const handleOpenTag = (context, name, attribs, _isImplied) => {
5
4
  if (name === "link" && attribs.href) {
@@ -42,6 +41,5 @@ const createHtmlUrisHandlers = (context) => {
42
41
  }
43
42
  };
44
43
  };
45
-
46
44
  //#endregion
47
- export { createHtmlUrisHandlers };
45
+ export { createHtmlUrisHandlers };
@@ -1,6 +1,5 @@
1
- const require_handlers = require('./handlers.cjs');
1
+ const require_handlers = require("./handlers.cjs");
2
2
  let htmlparser2 = require("htmlparser2");
3
-
4
3
  //#region src/common/uris/html/index.ts
5
4
  const discoverUrisFromHtml = (html, options) => {
6
5
  const context = {
@@ -16,6 +15,5 @@ const discoverUrisFromHtml = (html, options) => {
16
15
  parser.end();
17
16
  return Array.from(context.discoveredUris);
18
17
  };
19
-
20
18
  //#endregion
21
- exports.discoverUrisFromHtml = discoverUrisFromHtml;
19
+ exports.discoverUrisFromHtml = discoverUrisFromHtml;
@@ -1,6 +1,5 @@
1
1
  import { createHtmlUrisHandlers } from "./handlers.js";
2
2
  import { Parser } from "htmlparser2";
3
-
4
3
  //#region src/common/uris/html/index.ts
5
4
  const discoverUrisFromHtml = (html, options) => {
6
5
  const context = {
@@ -16,6 +15,5 @@ const discoverUrisFromHtml = (html, options) => {
16
15
  parser.end();
17
16
  return Array.from(context.discoveredUris);
18
17
  };
19
-
20
18
  //#endregion
21
- export { discoverUrisFromHtml };
19
+ export { discoverUrisFromHtml };
@@ -1,26 +1,32 @@
1
- const require_index = require('./guess/index.cjs');
2
- const require_index$1 = require('./headers/index.cjs');
3
- const require_index$2 = require('./html/index.cjs');
4
- const require_index$3 = require('./platform/index.cjs');
5
-
1
+ const require_index = require("./feed/index.cjs");
2
+ const require_index$1 = require("./guess/index.cjs");
3
+ const require_index$2 = require("./headers/index.cjs");
4
+ const require_index$3 = require("./html/index.cjs");
5
+ const require_index$4 = require("./platform/index.cjs");
6
6
  //#region src/common/uris/index.ts
7
- const discoverUris = (config, stopOnFirstMethod = false) => {
8
- const uris = /* @__PURE__ */ new Set();
7
+ const discoverUris = async (config, fetchFn) => {
8
+ const result = {};
9
9
  if (config.platform) {
10
- for (const uri of require_index$3.discoverUrisFromPlatform(config.platform.html, config.platform.options)) uris.add(uri);
11
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
10
+ const uris = await require_index$4.discoverUrisFromPlatform(config.platform.content, config.platform.headers, config.platform.options, fetchFn);
11
+ if (uris.length > 0) result.platform = uris;
12
+ }
13
+ if (config.feed) {
14
+ const uris = require_index.discoverUrisFromFeed(config.feed.content, config.feed.options);
15
+ if (uris.length > 0) result.feed = uris.map((uri) => ({ uri }));
12
16
  }
13
17
  if (config.html) {
14
- for (const uri of require_index$2.discoverUrisFromHtml(config.html.html, config.html.options)) uris.add(uri);
15
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
18
+ const uris = require_index$3.discoverUrisFromHtml(config.html.html, config.html.options);
19
+ if (uris.length > 0) result.html = uris.map((uri) => ({ uri }));
16
20
  }
17
21
  if (config.headers) {
18
- for (const uri of require_index$1.discoverUrisFromHeaders(config.headers.headers, config.headers.options)) uris.add(uri);
19
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
22
+ const uris = require_index$2.discoverUrisFromHeaders(config.headers.headers, config.headers.options);
23
+ if (uris.length > 0) result.headers = uris.map((uri) => ({ uri }));
24
+ }
25
+ if (config.guess) {
26
+ const uris = require_index$1.discoverUrisFromGuess(config.guess.options);
27
+ if (uris.length > 0) result.guess = uris.map((uri) => ({ uri }));
20
28
  }
21
- if (config.guess) for (const uri of require_index.discoverUrisFromGuess(config.guess.options)) uris.add(uri);
22
- return Array.from(uris);
29
+ return result;
23
30
  };
24
-
25
31
  //#endregion
26
- exports.discoverUris = discoverUris;
32
+ exports.discoverUris = discoverUris;
@@ -1,26 +1,32 @@
1
+ import { discoverUrisFromFeed } from "./feed/index.js";
1
2
  import { discoverUrisFromGuess } from "./guess/index.js";
2
3
  import { discoverUrisFromHeaders } from "./headers/index.js";
3
4
  import { discoverUrisFromHtml } from "./html/index.js";
4
5
  import { discoverUrisFromPlatform } from "./platform/index.js";
5
-
6
6
  //#region src/common/uris/index.ts
7
- const discoverUris = (config, stopOnFirstMethod = false) => {
8
- const uris = /* @__PURE__ */ new Set();
7
+ const discoverUris = async (config, fetchFn) => {
8
+ const result = {};
9
9
  if (config.platform) {
10
- for (const uri of discoverUrisFromPlatform(config.platform.html, config.platform.options)) uris.add(uri);
11
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
10
+ const uris = await discoverUrisFromPlatform(config.platform.content, config.platform.headers, config.platform.options, fetchFn);
11
+ if (uris.length > 0) result.platform = uris;
12
+ }
13
+ if (config.feed) {
14
+ const uris = discoverUrisFromFeed(config.feed.content, config.feed.options);
15
+ if (uris.length > 0) result.feed = uris.map((uri) => ({ uri }));
12
16
  }
13
17
  if (config.html) {
14
- for (const uri of discoverUrisFromHtml(config.html.html, config.html.options)) uris.add(uri);
15
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
18
+ const uris = discoverUrisFromHtml(config.html.html, config.html.options);
19
+ if (uris.length > 0) result.html = uris.map((uri) => ({ uri }));
16
20
  }
17
21
  if (config.headers) {
18
- for (const uri of discoverUrisFromHeaders(config.headers.headers, config.headers.options)) uris.add(uri);
19
- if (stopOnFirstMethod && uris.size > 0) return Array.from(uris);
22
+ const uris = discoverUrisFromHeaders(config.headers.headers, config.headers.options);
23
+ if (uris.length > 0) result.headers = uris.map((uri) => ({ uri }));
24
+ }
25
+ if (config.guess) {
26
+ const uris = discoverUrisFromGuess(config.guess.options);
27
+ if (uris.length > 0) result.guess = uris.map((uri) => ({ uri }));
20
28
  }
21
- if (config.guess) for (const uri of discoverUrisFromGuess(config.guess.options)) uris.add(uri);
22
- return Array.from(uris);
29
+ return result;
23
30
  };
24
-
25
31
  //#endregion
26
- export { discoverUris };
32
+ export { discoverUris };
@@ -1,12 +1,10 @@
1
-
2
1
  //#region src/common/uris/platform/index.ts
3
- const discoverUrisFromPlatform = (html, options) => {
2
+ const discoverUrisFromPlatform = async (content, headers, options, fetchFn) => {
4
3
  const { baseUrl, handlers } = options;
5
4
  for (const handler of handlers) try {
6
- if (handler.match(baseUrl)) return handler.resolve(baseUrl, html);
5
+ if (handler.match(baseUrl, content, headers)) return await handler.resolve(baseUrl, content, headers, fetchFn);
7
6
  } catch {}
8
7
  return [];
9
8
  };
10
-
11
9
  //#endregion
12
- exports.discoverUrisFromPlatform = discoverUrisFromPlatform;
10
+ exports.discoverUrisFromPlatform = discoverUrisFromPlatform;
@@ -0,0 +1,7 @@
1
+ import { PlatformMethodOptions } from "./types.cjs";
2
+ import { DiscoverFetchFn, DiscoverUriEntry } from "../../types.cjs";
3
+
4
+ //#region src/common/uris/platform/index.d.ts
5
+ declare const discoverUrisFromPlatform: (content: string | undefined, headers: Headers | undefined, options: PlatformMethodOptions, fetchFn?: DiscoverFetchFn) => Promise<Array<DiscoverUriEntry>>;
6
+ //#endregion
7
+ export { discoverUrisFromPlatform };
@@ -0,0 +1,7 @@
1
+ import { PlatformMethodOptions } from "./types.js";
2
+ import { DiscoverFetchFn, DiscoverUriEntry } from "../../types.js";
3
+
4
+ //#region src/common/uris/platform/index.d.ts
5
+ declare const discoverUrisFromPlatform: (content: string | undefined, headers: Headers | undefined, options: PlatformMethodOptions, fetchFn?: DiscoverFetchFn) => Promise<Array<DiscoverUriEntry>>;
6
+ //#endregion
7
+ export { discoverUrisFromPlatform };
@@ -1,11 +1,10 @@
1
1
  //#region src/common/uris/platform/index.ts
2
- const discoverUrisFromPlatform = (html, options) => {
2
+ const discoverUrisFromPlatform = async (content, headers, options, fetchFn) => {
3
3
  const { baseUrl, handlers } = options;
4
4
  for (const handler of handlers) try {
5
- if (handler.match(baseUrl)) return handler.resolve(baseUrl, html);
5
+ if (handler.match(baseUrl, content, headers)) return await handler.resolve(baseUrl, content, headers, fetchFn);
6
6
  } catch {}
7
7
  return [];
8
8
  };
9
-
10
9
  //#endregion
11
- export { discoverUrisFromPlatform };
10
+ export { discoverUrisFromPlatform };
@@ -1,7 +1,9 @@
1
+ import { DiscoverFetchFn, DiscoverUriEntry } from "../../types.cjs";
2
+
1
3
  //#region src/common/uris/platform/types.d.ts
2
4
  type PlatformHandler = {
3
- match: (url: string) => boolean;
4
- resolve: (url: string, content?: string) => Array<string>;
5
+ match: (url: string, content?: string, headers?: Headers) => boolean;
6
+ resolve: (url: string, content?: string, headers?: Headers, fetchFn?: DiscoverFetchFn) => Array<DiscoverUriEntry> | Promise<Array<DiscoverUriEntry>>;
5
7
  };
6
8
  type PlatformMethodOptions = {
7
9
  baseUrl: string;
@@ -1,7 +1,9 @@
1
+ import { DiscoverFetchFn, DiscoverUriEntry } from "../../types.js";
2
+
1
3
  //#region src/common/uris/platform/types.d.ts
2
4
  type PlatformHandler = {
3
- match: (url: string) => boolean;
4
- resolve: (url: string, content?: string) => Array<string>;
5
+ match: (url: string, content?: string, headers?: Headers) => boolean;
6
+ resolve: (url: string, content?: string, headers?: Headers, fetchFn?: DiscoverFetchFn) => Array<DiscoverUriEntry> | Promise<Array<DiscoverUriEntry>>;
5
7
  };
6
8
  type PlatformMethodOptions = {
7
9
  baseUrl: string;
@@ -1,17 +1,29 @@
1
-
1
+ const require_locales = require("./locales.cjs");
2
2
  //#region src/common/utils.ts
3
+ const composeHint = (key) => ({
4
+ key,
5
+ label: require_locales.hints[key]
6
+ });
3
7
  const normalizeMimeType = (type) => {
4
8
  return type.split(";")[0].trim().toLowerCase();
5
9
  };
6
- const isSubdomainOf = (url, domain) => {
7
- return new URL(url).hostname.toLowerCase().endsWith(`.${domain}`);
10
+ const isSubdomainOf = (url, domains) => {
11
+ try {
12
+ const hostname = new URL(url).hostname.toLowerCase();
13
+ return (Array.isArray(domains) ? domains : [domains]).some((domain) => hostname.endsWith(`.${domain}`));
14
+ } catch {}
15
+ return false;
8
16
  };
9
17
  const isHostOf = (url, hosts) => {
10
- return isAnyOf(new URL(url).hostname, hosts);
18
+ try {
19
+ const list = Array.isArray(hosts) ? hosts : [hosts];
20
+ return isAnyOf(new URL(url).hostname, list);
21
+ } catch {}
22
+ return false;
11
23
  };
12
24
  const includesAnyOf = (value, patterns, parser) => {
13
25
  const parsedValue = parser ? parser(value) : value?.toLowerCase();
14
- return patterns.map((pattern) => pattern.toLowerCase()).some((pattern) => parsedValue?.includes(pattern));
26
+ return patterns.map((pattern) => pattern.toLowerCase()).some((pattern) => pattern && parsedValue?.includes(pattern));
15
27
  };
16
28
  const isAnyOf = (value, patterns, parser) => {
17
29
  const parsedValue = parser ? parser(value) : value?.toLowerCase()?.trim();
@@ -22,13 +34,16 @@ const anyWordMatchesAnyOf = (value, patterns) => {
22
34
  };
23
35
  const endsWithAnyOf = (value, patterns) => {
24
36
  const lowerValue = value.toLowerCase();
25
- return patterns.some((pattern) => lowerValue.endsWith(pattern.toLowerCase()));
37
+ return patterns.some((pattern) => pattern && lowerValue.endsWith(pattern.toLowerCase()));
26
38
  };
27
39
  const isOfAllowedMimeType = (type, allowedTypes) => {
28
40
  if (allowedTypes.length === 0) return true;
29
41
  if (!type) return false;
30
42
  return isAnyOf(type, allowedTypes, normalizeMimeType);
31
43
  };
44
+ const omitEmpty = (array) => {
45
+ return array.filter((item) => item != null && item !== "");
46
+ };
32
47
  const normalizeUrl = (url, baseUrl) => {
33
48
  return baseUrl ? new URL(url, baseUrl).href : url;
34
49
  };
@@ -40,6 +55,7 @@ const matchesAnyOfLinkSelectors = (rel, type, selectors) => {
40
55
  });
41
56
  };
42
57
  const processConcurrently = async (items, processFn, options) => {
58
+ if (options.concurrency < 1) return;
43
59
  const active = /* @__PURE__ */ new Set();
44
60
  let index = 0;
45
61
  while (index < items.length || active.size > 0) {
@@ -54,9 +70,9 @@ const processConcurrently = async (items, processFn, options) => {
54
70
  if (active.size > 0) await Promise.race(active);
55
71
  }
56
72
  };
57
-
58
73
  //#endregion
59
74
  exports.anyWordMatchesAnyOf = anyWordMatchesAnyOf;
75
+ exports.composeHint = composeHint;
60
76
  exports.endsWithAnyOf = endsWithAnyOf;
61
77
  exports.includesAnyOf = includesAnyOf;
62
78
  exports.isAnyOf = isAnyOf;
@@ -64,4 +80,5 @@ exports.isHostOf = isHostOf;
64
80
  exports.isSubdomainOf = isSubdomainOf;
65
81
  exports.matchesAnyOfLinkSelectors = matchesAnyOfLinkSelectors;
66
82
  exports.normalizeUrl = normalizeUrl;
67
- exports.processConcurrently = processConcurrently;
83
+ exports.omitEmpty = omitEmpty;
84
+ exports.processConcurrently = processConcurrently;
@@ -1,6 +1,6 @@
1
1
  //#region src/common/utils.d.ts
2
- declare const isSubdomainOf: (url: string, domain: string) => boolean;
3
- declare const isHostOf: (url: string, hosts: Array<string>) => boolean;
2
+ declare const isSubdomainOf: (url: string, domains: string | Array<string>) => boolean;
3
+ declare const isHostOf: (url: string, hosts: string | Array<string>) => boolean;
4
4
  declare const includesAnyOf: (value: string, patterns: Array<string>, parser?: (value: string) => string) => boolean;
5
5
  declare const isAnyOf: (value: string, patterns: Array<string>, parser?: (value: string) => string) => boolean;
6
6
  declare const anyWordMatchesAnyOf: (value: string, patterns: Array<string>) => boolean;
@@ -1,6 +1,6 @@
1
1
  //#region src/common/utils.d.ts
2
- declare const isSubdomainOf: (url: string, domain: string) => boolean;
3
- declare const isHostOf: (url: string, hosts: Array<string>) => boolean;
2
+ declare const isSubdomainOf: (url: string, domains: string | Array<string>) => boolean;
3
+ declare const isHostOf: (url: string, hosts: string | Array<string>) => boolean;
4
4
  declare const includesAnyOf: (value: string, patterns: Array<string>, parser?: (value: string) => string) => boolean;
5
5
  declare const isAnyOf: (value: string, patterns: Array<string>, parser?: (value: string) => string) => boolean;
6
6
  declare const anyWordMatchesAnyOf: (value: string, patterns: Array<string>) => boolean;
@@ -1,16 +1,29 @@
1
+ import { hints } from "./locales.js";
1
2
  //#region src/common/utils.ts
3
+ const composeHint = (key) => ({
4
+ key,
5
+ label: hints[key]
6
+ });
2
7
  const normalizeMimeType = (type) => {
3
8
  return type.split(";")[0].trim().toLowerCase();
4
9
  };
5
- const isSubdomainOf = (url, domain) => {
6
- return new URL(url).hostname.toLowerCase().endsWith(`.${domain}`);
10
+ const isSubdomainOf = (url, domains) => {
11
+ try {
12
+ const hostname = new URL(url).hostname.toLowerCase();
13
+ return (Array.isArray(domains) ? domains : [domains]).some((domain) => hostname.endsWith(`.${domain}`));
14
+ } catch {}
15
+ return false;
7
16
  };
8
17
  const isHostOf = (url, hosts) => {
9
- return isAnyOf(new URL(url).hostname, hosts);
18
+ try {
19
+ const list = Array.isArray(hosts) ? hosts : [hosts];
20
+ return isAnyOf(new URL(url).hostname, list);
21
+ } catch {}
22
+ return false;
10
23
  };
11
24
  const includesAnyOf = (value, patterns, parser) => {
12
25
  const parsedValue = parser ? parser(value) : value?.toLowerCase();
13
- return patterns.map((pattern) => pattern.toLowerCase()).some((pattern) => parsedValue?.includes(pattern));
26
+ return patterns.map((pattern) => pattern.toLowerCase()).some((pattern) => pattern && parsedValue?.includes(pattern));
14
27
  };
15
28
  const isAnyOf = (value, patterns, parser) => {
16
29
  const parsedValue = parser ? parser(value) : value?.toLowerCase()?.trim();
@@ -21,13 +34,16 @@ const anyWordMatchesAnyOf = (value, patterns) => {
21
34
  };
22
35
  const endsWithAnyOf = (value, patterns) => {
23
36
  const lowerValue = value.toLowerCase();
24
- return patterns.some((pattern) => lowerValue.endsWith(pattern.toLowerCase()));
37
+ return patterns.some((pattern) => pattern && lowerValue.endsWith(pattern.toLowerCase()));
25
38
  };
26
39
  const isOfAllowedMimeType = (type, allowedTypes) => {
27
40
  if (allowedTypes.length === 0) return true;
28
41
  if (!type) return false;
29
42
  return isAnyOf(type, allowedTypes, normalizeMimeType);
30
43
  };
44
+ const omitEmpty = (array) => {
45
+ return array.filter((item) => item != null && item !== "");
46
+ };
31
47
  const normalizeUrl = (url, baseUrl) => {
32
48
  return baseUrl ? new URL(url, baseUrl).href : url;
33
49
  };
@@ -39,6 +55,7 @@ const matchesAnyOfLinkSelectors = (rel, type, selectors) => {
39
55
  });
40
56
  };
41
57
  const processConcurrently = async (items, processFn, options) => {
58
+ if (options.concurrency < 1) return;
42
59
  const active = /* @__PURE__ */ new Set();
43
60
  let index = 0;
44
61
  while (index < items.length || active.size > 0) {
@@ -53,6 +70,5 @@ const processConcurrently = async (items, processFn, options) => {
53
70
  if (active.size > 0) await Promise.race(active);
54
71
  }
55
72
  };
56
-
57
73
  //#endregion
58
- export { anyWordMatchesAnyOf, endsWithAnyOf, includesAnyOf, isAnyOf, isHostOf, isSubdomainOf, matchesAnyOfLinkSelectors, normalizeUrl, processConcurrently };
74
+ export { anyWordMatchesAnyOf, composeHint, endsWithAnyOf, includesAnyOf, isAnyOf, isHostOf, isSubdomainOf, matchesAnyOfLinkSelectors, normalizeUrl, omitEmpty, processConcurrently };
@@ -0,0 +1,60 @@
1
+ const require_utils = require("../common/utils.cjs");
2
+ const require_bluesky = require("./platform/handlers/bluesky.cjs");
3
+ const require_codeberg = require("./platform/handlers/codeberg.cjs");
4
+ const require_deviantart = require("./platform/handlers/deviantart.cjs");
5
+ const require_github = require("./platform/handlers/github.cjs");
6
+ const require_githubGist = require("./platform/handlers/githubGist.cjs");
7
+ const require_lobsters = require("./platform/handlers/lobsters.cjs");
8
+ const require_mastodon = require("./platform/handlers/mastodon.cjs");
9
+ const require_reddit = require("./platform/handlers/reddit.cjs");
10
+ const require_sourceforge = require("./platform/handlers/sourceforge.cjs");
11
+ const require_tumblr = require("./platform/handlers/tumblr.cjs");
12
+ //#region src/favicons/defaults.ts
13
+ const defaultIconRels = [
14
+ "icon",
15
+ "shortcut",
16
+ "apple-touch-icon",
17
+ "apple-touch-icon-precomposed"
18
+ ];
19
+ const defaultGuessPaths = [
20
+ "/favicon.ico",
21
+ "/apple-touch-icon.png",
22
+ "/apple-touch-icon-precomposed.png",
23
+ "/favicon.png",
24
+ "/favicon.svg"
25
+ ];
26
+ const linkSelectors = defaultIconRels.map((rel) => ({ rel }));
27
+ const defaultFeedOptions = { extractUrls: ({ format, feed }) => {
28
+ if (format === "atom") return require_utils.omitEmpty([feed.icon]);
29
+ if (format === "json") return require_utils.omitEmpty([feed.favicon, feed.icon]);
30
+ return [];
31
+ } };
32
+ const defaultHtmlOptions = {
33
+ linkSelectors,
34
+ anchorUris: [],
35
+ anchorIgnoredUris: [],
36
+ anchorLabels: []
37
+ };
38
+ const defaultHeadersOptions = { linkSelectors };
39
+ const defaultGuessOptions = { uris: defaultGuessPaths };
40
+ const defaultPlatformOptions = { handlers: [
41
+ require_github.githubHandler,
42
+ require_githubGist.githubGistHandler,
43
+ require_mastodon.mastodonHandler,
44
+ require_bluesky.blueskyHandler,
45
+ require_reddit.redditHandler,
46
+ require_tumblr.tumblrHandler,
47
+ require_codeberg.codebergHandler,
48
+ require_lobsters.lobstersHandler,
49
+ require_sourceforge.sourceforgeHandler,
50
+ require_deviantart.deviantartHandler
51
+ ] };
52
+ //#endregion
53
+ exports.defaultFeedOptions = defaultFeedOptions;
54
+ exports.defaultGuessOptions = defaultGuessOptions;
55
+ exports.defaultGuessPaths = defaultGuessPaths;
56
+ exports.defaultHeadersOptions = defaultHeadersOptions;
57
+ exports.defaultHtmlOptions = defaultHtmlOptions;
58
+ exports.defaultIconRels = defaultIconRels;
59
+ exports.defaultPlatformOptions = defaultPlatformOptions;
60
+ exports.linkSelectors = linkSelectors;
@@ -0,0 +1,18 @@
1
+ import { FeedMethodOptions } from "../common/uris/feed/types.cjs";
2
+ import { GuessMethodOptions } from "../common/uris/guess/types.cjs";
3
+ import { HeadersMethodOptions } from "../common/uris/headers/types.cjs";
4
+ import { HtmlMethodOptions } from "../common/uris/html/types.cjs";
5
+ import { PlatformMethodOptions } from "../common/uris/platform/types.cjs";
6
+ import { LinkSelector } from "../common/types.cjs";
7
+
8
+ //#region src/favicons/defaults.d.ts
9
+ declare const defaultIconRels: string[];
10
+ declare const defaultGuessPaths: string[];
11
+ declare const linkSelectors: Array<LinkSelector>;
12
+ declare const defaultFeedOptions: FeedMethodOptions;
13
+ declare const defaultHtmlOptions: Omit<HtmlMethodOptions, 'baseUrl'>;
14
+ declare const defaultHeadersOptions: Omit<HeadersMethodOptions, 'baseUrl'>;
15
+ declare const defaultGuessOptions: Omit<GuessMethodOptions, 'baseUrl'>;
16
+ declare const defaultPlatformOptions: Omit<PlatformMethodOptions, 'baseUrl'>;
17
+ //#endregion
18
+ export { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
@@ -0,0 +1,18 @@
1
+ import { FeedMethodOptions } from "../common/uris/feed/types.js";
2
+ import { GuessMethodOptions } from "../common/uris/guess/types.js";
3
+ import { HeadersMethodOptions } from "../common/uris/headers/types.js";
4
+ import { HtmlMethodOptions } from "../common/uris/html/types.js";
5
+ import { PlatformMethodOptions } from "../common/uris/platform/types.js";
6
+ import { LinkSelector } from "../common/types.js";
7
+
8
+ //#region src/favicons/defaults.d.ts
9
+ declare const defaultIconRels: string[];
10
+ declare const defaultGuessPaths: string[];
11
+ declare const linkSelectors: Array<LinkSelector>;
12
+ declare const defaultFeedOptions: FeedMethodOptions;
13
+ declare const defaultHtmlOptions: Omit<HtmlMethodOptions, 'baseUrl'>;
14
+ declare const defaultHeadersOptions: Omit<HeadersMethodOptions, 'baseUrl'>;
15
+ declare const defaultGuessOptions: Omit<GuessMethodOptions, 'baseUrl'>;
16
+ declare const defaultPlatformOptions: Omit<PlatformMethodOptions, 'baseUrl'>;
17
+ //#endregion
18
+ export { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
@@ -0,0 +1,53 @@
1
+ import { omitEmpty } from "../common/utils.js";
2
+ import { blueskyHandler } from "./platform/handlers/bluesky.js";
3
+ import { codebergHandler } from "./platform/handlers/codeberg.js";
4
+ import { deviantartHandler } from "./platform/handlers/deviantart.js";
5
+ import { githubHandler } from "./platform/handlers/github.js";
6
+ import { githubGistHandler } from "./platform/handlers/githubGist.js";
7
+ import { lobstersHandler } from "./platform/handlers/lobsters.js";
8
+ import { mastodonHandler } from "./platform/handlers/mastodon.js";
9
+ import { redditHandler } from "./platform/handlers/reddit.js";
10
+ import { sourceforgeHandler } from "./platform/handlers/sourceforge.js";
11
+ import { tumblrHandler } from "./platform/handlers/tumblr.js";
12
+ //#region src/favicons/defaults.ts
13
+ const defaultIconRels = [
14
+ "icon",
15
+ "shortcut",
16
+ "apple-touch-icon",
17
+ "apple-touch-icon-precomposed"
18
+ ];
19
+ const defaultGuessPaths = [
20
+ "/favicon.ico",
21
+ "/apple-touch-icon.png",
22
+ "/apple-touch-icon-precomposed.png",
23
+ "/favicon.png",
24
+ "/favicon.svg"
25
+ ];
26
+ const linkSelectors = defaultIconRels.map((rel) => ({ rel }));
27
+ const defaultFeedOptions = { extractUrls: ({ format, feed }) => {
28
+ if (format === "atom") return omitEmpty([feed.icon]);
29
+ if (format === "json") return omitEmpty([feed.favicon, feed.icon]);
30
+ return [];
31
+ } };
32
+ const defaultHtmlOptions = {
33
+ linkSelectors,
34
+ anchorUris: [],
35
+ anchorIgnoredUris: [],
36
+ anchorLabels: []
37
+ };
38
+ const defaultHeadersOptions = { linkSelectors };
39
+ const defaultGuessOptions = { uris: defaultGuessPaths };
40
+ const defaultPlatformOptions = { handlers: [
41
+ githubHandler,
42
+ githubGistHandler,
43
+ mastodonHandler,
44
+ blueskyHandler,
45
+ redditHandler,
46
+ tumblrHandler,
47
+ codebergHandler,
48
+ lobstersHandler,
49
+ sourceforgeHandler,
50
+ deviantartHandler
51
+ ] };
52
+ //#endregion
53
+ export { defaultFeedOptions, defaultGuessOptions, defaultGuessPaths, defaultHeadersOptions, defaultHtmlOptions, defaultIconRels, defaultPlatformOptions, linkSelectors };
@@ -0,0 +1,13 @@
1
+ //#region src/favicons/extractors.ts
2
+ const defaultExtractor = async ({ url, status }) => {
3
+ if (status !== void 0 && status >= 200 && status < 400) return {
4
+ url,
5
+ isValid: true
6
+ };
7
+ return {
8
+ url,
9
+ isValid: false
10
+ };
11
+ };
12
+ //#endregion
13
+ exports.defaultExtractor = defaultExtractor;
@@ -0,0 +1,7 @@
1
+ import { DiscoverExtractFn } from "../common/types.cjs";
2
+ import { FaviconResult } from "./types.cjs";
3
+
4
+ //#region src/favicons/extractors.d.ts
5
+ declare const defaultExtractor: DiscoverExtractFn<FaviconResult>;
6
+ //#endregion
7
+ export { defaultExtractor };
@@ -0,0 +1,7 @@
1
+ import { DiscoverExtractFn } from "../common/types.js";
2
+ import { FaviconResult } from "./types.js";
3
+
4
+ //#region src/favicons/extractors.d.ts
5
+ declare const defaultExtractor: DiscoverExtractFn<FaviconResult>;
6
+ //#endregion
7
+ export { defaultExtractor };
@@ -0,0 +1,13 @@
1
+ //#region src/favicons/extractors.ts
2
+ const defaultExtractor = async ({ url, status }) => {
3
+ if (status !== void 0 && status >= 200 && status < 400) return {
4
+ url,
5
+ isValid: true
6
+ };
7
+ return {
8
+ url,
9
+ isValid: false
10
+ };
11
+ };
12
+ //#endregion
13
+ export { defaultExtractor };
@@ -0,0 +1,29 @@
1
+ const require_utils = require("../common/utils.cjs");
2
+ const require_utils$1 = require("../common/discover/utils.cjs");
3
+ const require_index = require("../common/discover/index.cjs");
4
+ const require_defaults = require("./defaults.cjs");
5
+ const require_extractors = require("./extractors.cjs");
6
+ //#region src/favicons/index.ts
7
+ const discoverFavicons = async (input, options = {}) => {
8
+ return require_index.discover(input, {
9
+ ...options,
10
+ methods: options.methods ?? [
11
+ "platform",
12
+ "feed",
13
+ "html",
14
+ "headers",
15
+ "guess"
16
+ ],
17
+ fetchFn: options.fetchFn ?? require_utils$1.defaultFetchFn,
18
+ extractFn: options.extractFn ?? require_extractors.defaultExtractor,
19
+ normalizeUrlFn: options.normalizeUrlFn ?? require_utils.normalizeUrl
20
+ }, {
21
+ platform: require_defaults.defaultPlatformOptions,
22
+ feed: require_defaults.defaultFeedOptions,
23
+ html: require_defaults.defaultHtmlOptions,
24
+ headers: require_defaults.defaultHeadersOptions,
25
+ guess: require_defaults.defaultGuessOptions
26
+ });
27
+ };
28
+ //#endregion
29
+ exports.discoverFavicons = discoverFavicons;
@@ -0,0 +1,7 @@
1
+ import { DiscoverInput, DiscoverOptions, DiscoverResult } from "../common/types.cjs";
2
+ import { FaviconResult } from "./types.cjs";
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 };