recker 1.0.43 → 1.0.44

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 (459) hide show
  1. package/README.md +47 -0
  2. package/dist/bin/recker-linux-x64 +0 -0
  3. package/dist/bin/recker-macos-x64 +0 -0
  4. package/dist/bin/recker-win-x64.exe +0 -0
  5. package/dist/bin/rek.cjs +85152 -100207
  6. package/dist/browser/ai/adaptive-timeout.d.ts +50 -0
  7. package/dist/browser/ai/adaptive-timeout.js +208 -0
  8. package/dist/browser/ai/client.d.ts +22 -0
  9. package/dist/browser/ai/client.js +294 -0
  10. package/dist/browser/ai/index.d.ts +14 -0
  11. package/dist/browser/ai/index.js +11 -0
  12. package/dist/browser/ai/providers/anthropic.d.ts +63 -0
  13. package/dist/browser/ai/providers/anthropic.js +370 -0
  14. package/dist/browser/ai/providers/base.d.ts +48 -0
  15. package/dist/browser/ai/providers/base.js +150 -0
  16. package/dist/browser/ai/providers/google.d.ts +59 -0
  17. package/dist/browser/ai/providers/google.js +305 -0
  18. package/dist/browser/ai/providers/ollama.d.ts +44 -0
  19. package/dist/browser/ai/providers/ollama.js +240 -0
  20. package/dist/browser/ai/providers/openai.d.ts +64 -0
  21. package/dist/browser/ai/providers/openai.js +298 -0
  22. package/dist/browser/ai/rate-limiter.d.ts +43 -0
  23. package/dist/browser/ai/rate-limiter.js +215 -0
  24. package/dist/browser/ai/vector/index.d.ts +2 -0
  25. package/dist/browser/ai/vector/index.js +2 -0
  26. package/dist/browser/ai/vector/similarity.d.ts +2 -0
  27. package/dist/browser/ai/vector/similarity.js +27 -0
  28. package/dist/browser/ai/vector/store.d.ts +27 -0
  29. package/dist/browser/ai/vector/store.js +82 -0
  30. package/dist/browser/browser/cache.d.ts +2 -40
  31. package/dist/browser/browser/cache.js +2 -199
  32. package/dist/browser/browser/index.d.ts +8 -0
  33. package/dist/browser/browser/index.js +8 -0
  34. package/dist/browser/browser/recker.d.ts +8 -1
  35. package/dist/browser/browser/recker.js +8 -2
  36. package/dist/browser/cache/indexed-db.d.ts +10 -0
  37. package/dist/browser/cache/indexed-db.js +88 -0
  38. package/dist/browser/cache/service-worker-cache.d.ts +18 -0
  39. package/dist/browser/cache/service-worker-cache.js +103 -0
  40. package/dist/browser/cache.d.ts +2 -40
  41. package/dist/browser/cache.js +2 -199
  42. package/dist/browser/constants/user-agents.d.ts +7 -0
  43. package/dist/browser/constants/user-agents.js +7 -0
  44. package/dist/browser/core/client.d.ts +2 -0
  45. package/dist/browser/core/client.js +19 -1
  46. package/dist/browser/index.d.ts +8 -0
  47. package/dist/browser/index.js +8 -0
  48. package/dist/browser/plugins/har-recorder.d.ts +40 -0
  49. package/dist/browser/plugins/har-recorder.js +120 -0
  50. package/dist/browser/plugins/network-simulation.d.ts +7 -0
  51. package/dist/browser/plugins/network-simulation.js +13 -0
  52. package/dist/browser/presets/android.d.ts +2 -0
  53. package/dist/browser/presets/android.js +16 -0
  54. package/dist/browser/presets/anthropic.d.ts +8 -0
  55. package/dist/browser/presets/anthropic.js +27 -0
  56. package/dist/browser/presets/aws.d.ts +19 -0
  57. package/dist/browser/presets/aws.js +68 -0
  58. package/dist/browser/presets/azure-openai.d.ts +10 -0
  59. package/dist/browser/presets/azure-openai.js +35 -0
  60. package/dist/browser/presets/azure.d.ts +41 -0
  61. package/dist/browser/presets/azure.js +104 -0
  62. package/dist/browser/presets/chaturbate.d.ts +2 -0
  63. package/dist/browser/presets/chaturbate.js +17 -0
  64. package/dist/browser/presets/cloudflare.d.ts +12 -0
  65. package/dist/browser/presets/cloudflare.js +39 -0
  66. package/dist/browser/presets/cohere.d.ts +7 -0
  67. package/dist/browser/presets/cohere.js +22 -0
  68. package/dist/browser/presets/deepseek.d.ts +7 -0
  69. package/dist/browser/presets/deepseek.js +22 -0
  70. package/dist/browser/presets/digitalocean.d.ts +5 -0
  71. package/dist/browser/presets/digitalocean.js +16 -0
  72. package/dist/browser/presets/discord.d.ts +6 -0
  73. package/dist/browser/presets/discord.js +17 -0
  74. package/dist/browser/presets/elevenlabs.d.ts +6 -0
  75. package/dist/browser/presets/elevenlabs.js +20 -0
  76. package/dist/browser/presets/enhancers.d.ts +20 -0
  77. package/dist/browser/presets/enhancers.js +85 -0
  78. package/dist/browser/presets/fireworks.d.ts +7 -0
  79. package/dist/browser/presets/fireworks.js +22 -0
  80. package/dist/browser/presets/gcp.d.ts +34 -0
  81. package/dist/browser/presets/gcp.js +91 -0
  82. package/dist/browser/presets/gemini.d.ts +7 -0
  83. package/dist/browser/presets/gemini.js +23 -0
  84. package/dist/browser/presets/github.d.ts +6 -0
  85. package/dist/browser/presets/github.js +17 -0
  86. package/dist/browser/presets/gitlab.d.ts +6 -0
  87. package/dist/browser/presets/gitlab.js +16 -0
  88. package/dist/browser/presets/groq.d.ts +7 -0
  89. package/dist/browser/presets/groq.js +22 -0
  90. package/dist/browser/presets/hubspot.d.ts +9 -0
  91. package/dist/browser/presets/hubspot.js +28 -0
  92. package/dist/browser/presets/huggingface.d.ts +7 -0
  93. package/dist/browser/presets/huggingface.js +23 -0
  94. package/dist/browser/presets/index.d.ts +47 -0
  95. package/dist/browser/presets/index.js +47 -0
  96. package/dist/browser/presets/ios.d.ts +2 -0
  97. package/dist/browser/presets/ios.js +13 -0
  98. package/dist/browser/presets/linear.d.ts +5 -0
  99. package/dist/browser/presets/linear.js +16 -0
  100. package/dist/browser/presets/mailgun.d.ts +7 -0
  101. package/dist/browser/presets/mailgun.js +20 -0
  102. package/dist/browser/presets/meta.d.ts +10 -0
  103. package/dist/browser/presets/meta.js +33 -0
  104. package/dist/browser/presets/mistral.d.ts +7 -0
  105. package/dist/browser/presets/mistral.js +22 -0
  106. package/dist/browser/presets/notion.d.ts +6 -0
  107. package/dist/browser/presets/notion.js +17 -0
  108. package/dist/browser/presets/openai.d.ts +9 -0
  109. package/dist/browser/presets/openai.js +30 -0
  110. package/dist/browser/presets/oracle.d.ts +19 -0
  111. package/dist/browser/presets/oracle.js +117 -0
  112. package/dist/browser/presets/perplexity.d.ts +7 -0
  113. package/dist/browser/presets/perplexity.js +22 -0
  114. package/dist/browser/presets/pinecone.d.ts +8 -0
  115. package/dist/browser/presets/pinecone.js +42 -0
  116. package/dist/browser/presets/registry.d.ts +23 -0
  117. package/dist/browser/presets/registry.js +519 -0
  118. package/dist/browser/presets/replicate.d.ts +7 -0
  119. package/dist/browser/presets/replicate.js +23 -0
  120. package/dist/browser/presets/sendgrid.d.ts +6 -0
  121. package/dist/browser/presets/sendgrid.js +20 -0
  122. package/dist/browser/presets/sentry.d.ts +11 -0
  123. package/dist/browser/presets/sentry.js +48 -0
  124. package/dist/browser/presets/sinch.d.ts +9 -0
  125. package/dist/browser/presets/sinch.js +39 -0
  126. package/dist/browser/presets/slack.d.ts +5 -0
  127. package/dist/browser/presets/slack.js +16 -0
  128. package/dist/browser/presets/square.d.ts +10 -0
  129. package/dist/browser/presets/square.js +33 -0
  130. package/dist/browser/presets/stripe.d.ts +7 -0
  131. package/dist/browser/presets/stripe.js +23 -0
  132. package/dist/browser/presets/supabase.d.ts +6 -0
  133. package/dist/browser/presets/supabase.js +18 -0
  134. package/dist/browser/presets/tiktok.d.ts +10 -0
  135. package/dist/browser/presets/tiktok.js +38 -0
  136. package/dist/browser/presets/together.d.ts +7 -0
  137. package/dist/browser/presets/together.js +22 -0
  138. package/dist/browser/presets/twilio.d.ts +6 -0
  139. package/dist/browser/presets/twilio.js +17 -0
  140. package/dist/browser/presets/vercel.d.ts +6 -0
  141. package/dist/browser/presets/vercel.js +23 -0
  142. package/dist/browser/presets/vultr.d.ts +5 -0
  143. package/dist/browser/presets/vultr.js +16 -0
  144. package/dist/browser/presets/xai.d.ts +8 -0
  145. package/dist/browser/presets/xai.js +23 -0
  146. package/dist/browser/presets/youtube.d.ts +5 -0
  147. package/dist/browser/presets/youtube.js +20 -0
  148. package/dist/browser/recker.d.ts +8 -1
  149. package/dist/browser/recker.js +8 -2
  150. package/dist/browser/scrape/document.d.ts +5 -4
  151. package/dist/browser/scrape/document.js +89 -76
  152. package/dist/browser/scrape/element.d.ts +10 -8
  153. package/dist/browser/scrape/element.js +295 -81
  154. package/dist/browser/scrape/extractors.d.ts +11 -11
  155. package/dist/browser/scrape/extractors.js +145 -113
  156. package/dist/browser/scrape/parser/back.d.ts +1 -0
  157. package/dist/browser/scrape/parser/back.js +3 -0
  158. package/dist/browser/scrape/parser/index.d.ts +20 -0
  159. package/dist/browser/scrape/parser/index.js +19 -0
  160. package/dist/browser/scrape/parser/matcher.d.ts +30 -0
  161. package/dist/browser/scrape/parser/matcher.js +99 -0
  162. package/dist/browser/scrape/parser/nodes/comment.d.ts +12 -0
  163. package/dist/browser/scrape/parser/nodes/comment.js +21 -0
  164. package/dist/browser/scrape/parser/nodes/html.d.ts +110 -0
  165. package/dist/browser/scrape/parser/nodes/html.js +978 -0
  166. package/dist/browser/scrape/parser/nodes/node.d.ts +18 -0
  167. package/dist/browser/scrape/parser/nodes/node.js +31 -0
  168. package/dist/browser/scrape/parser/nodes/text.d.ts +14 -0
  169. package/dist/browser/scrape/parser/nodes/text.js +30 -0
  170. package/dist/browser/scrape/parser/nodes/type.d.ts +6 -0
  171. package/dist/browser/scrape/parser/nodes/type.js +7 -0
  172. package/dist/browser/scrape/parser/parse.d.ts +1 -0
  173. package/dist/browser/scrape/parser/parse.js +1 -0
  174. package/dist/browser/scrape/parser/valid.d.ts +2 -0
  175. package/dist/browser/scrape/parser/valid.js +5 -0
  176. package/dist/browser/scrape/parser/void-tag.d.ts +7 -0
  177. package/dist/browser/scrape/parser/void-tag.js +43 -0
  178. package/dist/browser/scrape/types.d.ts +7 -0
  179. package/dist/browser/seo/analyzer.d.ts +59 -0
  180. package/dist/browser/seo/analyzer.js +1399 -0
  181. package/dist/browser/seo/keywords.d.ts +16 -0
  182. package/dist/browser/seo/keywords.js +55 -0
  183. package/dist/browser/seo/rules/accessibility.d.ts +2 -0
  184. package/dist/browser/seo/rules/accessibility.js +733 -0
  185. package/dist/browser/seo/rules/ai-search.d.ts +2 -0
  186. package/dist/browser/seo/rules/ai-search.js +436 -0
  187. package/dist/browser/seo/rules/analytics.d.ts +2 -0
  188. package/dist/browser/seo/rules/analytics.js +306 -0
  189. package/dist/browser/seo/rules/best-practices.d.ts +2 -0
  190. package/dist/browser/seo/rules/best-practices.js +195 -0
  191. package/dist/browser/seo/rules/canonical.d.ts +12 -0
  192. package/dist/browser/seo/rules/canonical.js +270 -0
  193. package/dist/browser/seo/rules/content.d.ts +2 -0
  194. package/dist/browser/seo/rules/content.js +522 -0
  195. package/dist/browser/seo/rules/crawl.d.ts +2 -0
  196. package/dist/browser/seo/rules/crawl.js +435 -0
  197. package/dist/browser/seo/rules/cwv.d.ts +2 -0
  198. package/dist/browser/seo/rules/cwv.js +248 -0
  199. package/dist/browser/seo/rules/ecommerce.d.ts +2 -0
  200. package/dist/browser/seo/rules/ecommerce.js +312 -0
  201. package/dist/browser/seo/rules/i18n.d.ts +2 -0
  202. package/dist/browser/seo/rules/i18n.js +288 -0
  203. package/dist/browser/seo/rules/images.d.ts +2 -0
  204. package/dist/browser/seo/rules/images.js +255 -0
  205. package/dist/browser/seo/rules/index.d.ts +52 -0
  206. package/dist/browser/seo/rules/index.js +159 -0
  207. package/dist/browser/seo/rules/internal-linking.d.ts +2 -0
  208. package/dist/browser/seo/rules/internal-linking.js +394 -0
  209. package/dist/browser/seo/rules/links.d.ts +2 -0
  210. package/dist/browser/seo/rules/links.js +498 -0
  211. package/dist/browser/seo/rules/local.d.ts +2 -0
  212. package/dist/browser/seo/rules/local.js +289 -0
  213. package/dist/browser/seo/rules/meta.d.ts +2 -0
  214. package/dist/browser/seo/rules/meta.js +805 -0
  215. package/dist/browser/seo/rules/mobile.d.ts +2 -0
  216. package/dist/browser/seo/rules/mobile.js +161 -0
  217. package/dist/browser/seo/rules/performance.d.ts +2 -0
  218. package/dist/browser/seo/rules/performance.js +738 -0
  219. package/dist/browser/seo/rules/pwa.d.ts +2 -0
  220. package/dist/browser/seo/rules/pwa.js +299 -0
  221. package/dist/browser/seo/rules/readability.d.ts +2 -0
  222. package/dist/browser/seo/rules/readability.js +264 -0
  223. package/dist/browser/seo/rules/redirects.d.ts +16 -0
  224. package/dist/browser/seo/rules/redirects.js +199 -0
  225. package/dist/browser/seo/rules/resources.d.ts +2 -0
  226. package/dist/browser/seo/rules/resources.js +390 -0
  227. package/dist/browser/seo/rules/schema.d.ts +2 -0
  228. package/dist/browser/seo/rules/schema.js +379 -0
  229. package/dist/browser/seo/rules/security.d.ts +2 -0
  230. package/dist/browser/seo/rules/security.js +877 -0
  231. package/dist/browser/seo/rules/social.d.ts +2 -0
  232. package/dist/browser/seo/rules/social.js +603 -0
  233. package/dist/browser/seo/rules/structural.d.ts +2 -0
  234. package/dist/browser/seo/rules/structural.js +223 -0
  235. package/dist/browser/seo/rules/technical-advanced.d.ts +10 -0
  236. package/dist/browser/seo/rules/technical-advanced.js +289 -0
  237. package/dist/browser/seo/rules/technical.d.ts +2 -0
  238. package/dist/browser/seo/rules/technical.js +480 -0
  239. package/dist/browser/seo/rules/thresholds.d.ts +196 -0
  240. package/dist/browser/seo/rules/thresholds.js +118 -0
  241. package/dist/browser/seo/rules/types.d.ts +498 -0
  242. package/dist/browser/seo/rules/types.js +11 -0
  243. package/dist/browser/seo/types.d.ts +211 -0
  244. package/dist/browser/seo/types.js +1 -0
  245. package/dist/browser/transport/curl.d.ts +4 -0
  246. package/dist/browser/transport/curl.js +101 -0
  247. package/dist/browser/transport/undici.js +1 -2
  248. package/dist/browser/transport/worker.d.ts +18 -0
  249. package/dist/browser/transport/worker.js +278 -0
  250. package/dist/browser/types/index.d.ts +4 -1
  251. package/dist/browser/utils/binary-manager.d.ts +4 -0
  252. package/dist/browser/utils/binary-manager.js +72 -0
  253. package/dist/browser/utils/user-agent.js +2 -13
  254. package/dist/cache/indexed-db.d.ts +10 -0
  255. package/dist/cache/indexed-db.js +88 -0
  256. package/dist/cache/service-worker-cache.d.ts +18 -0
  257. package/dist/cache/service-worker-cache.js +103 -0
  258. package/dist/cli/commands/ai.d.ts +2 -0
  259. package/dist/cli/commands/ai.js +162 -0
  260. package/dist/cli/commands/bench.d.ts +2 -0
  261. package/dist/cli/commands/bench.js +51 -0
  262. package/dist/cli/commands/dns.d.ts +2 -0
  263. package/dist/cli/commands/dns.js +295 -0
  264. package/dist/cli/commands/har.d.ts +2 -0
  265. package/dist/cli/commands/har.js +171 -0
  266. package/dist/cli/commands/hls.d.ts +2 -0
  267. package/dist/cli/commands/hls.js +192 -0
  268. package/dist/cli/commands/network.d.ts +2 -0
  269. package/dist/cli/commands/network.js +288 -0
  270. package/dist/cli/commands/protocols.d.ts +2 -0
  271. package/dist/cli/commands/protocols.js +344 -0
  272. package/dist/cli/commands/scrape.d.ts +2 -0
  273. package/dist/cli/commands/scrape.js +176 -0
  274. package/dist/cli/commands/security.d.ts +2 -0
  275. package/dist/cli/commands/security.js +57 -0
  276. package/dist/cli/commands/seo.d.ts +2 -0
  277. package/dist/cli/commands/seo.js +125 -0
  278. package/dist/cli/commands/serve.d.ts +2 -0
  279. package/dist/cli/commands/serve.js +531 -0
  280. package/dist/cli/commands/spider.d.ts +3 -0
  281. package/dist/cli/commands/spider.js +456 -0
  282. package/dist/cli/commands/utils.d.ts +2 -0
  283. package/dist/cli/commands/utils.js +176 -0
  284. package/dist/cli/commands/vector.d.ts +2 -0
  285. package/dist/cli/commands/vector.js +158 -0
  286. package/dist/cli/handler.d.ts +2 -2
  287. package/dist/cli/handler.js +6 -6
  288. package/dist/cli/helpers.d.ts +7 -0
  289. package/dist/cli/helpers.js +128 -0
  290. package/dist/cli/index.js +96 -5228
  291. package/dist/cli/parser/help.d.ts +2 -0
  292. package/dist/cli/parser/help.js +52 -0
  293. package/dist/cli/parser/index.d.ts +3 -0
  294. package/dist/cli/parser/index.js +3 -0
  295. package/dist/cli/parser/parser.d.ts +4 -0
  296. package/dist/cli/parser/parser.js +146 -0
  297. package/dist/cli/parser/types.d.ts +41 -0
  298. package/dist/cli/parser/types.js +1 -0
  299. package/dist/cli/presets.d.ts +1 -1
  300. package/dist/cli/presets.js +1 -1
  301. package/dist/cli/router.d.ts +36 -0
  302. package/dist/cli/router.js +195 -0
  303. package/dist/cli/tui/ai-chat.js +1 -1
  304. package/dist/cli/tui/commands/context.d.ts +9 -0
  305. package/dist/cli/tui/commands/context.js +1 -0
  306. package/dist/cli/tui/commands/dns.d.ts +10 -0
  307. package/dist/cli/tui/commands/dns.js +461 -0
  308. package/dist/cli/tui/commands/hls.d.ts +2 -0
  309. package/dist/cli/tui/commands/hls.js +162 -0
  310. package/dist/cli/tui/commands/ip.d.ts +2 -0
  311. package/dist/cli/tui/commands/ip.js +45 -0
  312. package/dist/cli/tui/commands/network.d.ts +3 -0
  313. package/dist/cli/tui/commands/network.js +81 -0
  314. package/dist/cli/tui/commands/protocols.d.ts +6 -0
  315. package/dist/cli/tui/commands/protocols.js +531 -0
  316. package/dist/cli/tui/commands/security.d.ts +2 -0
  317. package/dist/cli/tui/commands/security.js +48 -0
  318. package/dist/cli/tui/commands/seo.d.ts +2 -0
  319. package/dist/cli/tui/commands/seo.js +74 -0
  320. package/dist/cli/tui/context.d.ts +12 -0
  321. package/dist/cli/tui/context.js +1 -0
  322. package/dist/cli/tui/shell.d.ts +11 -20
  323. package/dist/cli/tui/shell.js +216 -1873
  324. package/dist/constants/user-agents.d.ts +7 -0
  325. package/dist/constants/user-agents.js +7 -0
  326. package/dist/core/client.d.ts +2 -0
  327. package/dist/core/client.js +19 -1
  328. package/dist/index.d.ts +1 -0
  329. package/dist/index.js +1 -0
  330. package/dist/mcp/cli.js +2 -3
  331. package/dist/mcp/data/embeddings.json +1 -1
  332. package/dist/mcp/tools/network.js +298 -158
  333. package/dist/plugins/har-player.d.ts +23 -0
  334. package/dist/plugins/har-player.js +49 -0
  335. package/dist/plugins/har-recorder.d.ts +37 -3
  336. package/dist/plugins/har-recorder.js +116 -63
  337. package/dist/plugins/network-simulation.d.ts +7 -0
  338. package/dist/plugins/network-simulation.js +13 -0
  339. package/dist/presets/android.d.ts +2 -0
  340. package/dist/presets/android.js +16 -0
  341. package/dist/presets/chaturbate.d.ts +2 -0
  342. package/dist/presets/chaturbate.js +17 -0
  343. package/dist/presets/elevenlabs.d.ts +6 -0
  344. package/dist/presets/elevenlabs.js +20 -0
  345. package/dist/presets/enhancers.d.ts +20 -0
  346. package/dist/presets/enhancers.js +85 -0
  347. package/dist/presets/hubspot.d.ts +9 -0
  348. package/dist/presets/hubspot.js +28 -0
  349. package/dist/presets/index.d.ts +10 -0
  350. package/dist/presets/index.js +10 -0
  351. package/dist/presets/ios.d.ts +2 -0
  352. package/dist/presets/ios.js +13 -0
  353. package/dist/presets/pinecone.d.ts +8 -0
  354. package/dist/presets/pinecone.js +42 -0
  355. package/dist/presets/registry.js +60 -0
  356. package/dist/presets/sendgrid.d.ts +6 -0
  357. package/dist/presets/sendgrid.js +20 -0
  358. package/dist/presets/sentry.d.ts +11 -0
  359. package/dist/presets/sentry.js +48 -0
  360. package/dist/presets/square.d.ts +10 -0
  361. package/dist/presets/square.js +33 -0
  362. package/dist/recker.d.ts +3 -0
  363. package/dist/recker.js +4 -0
  364. package/dist/scrape/document.d.ts +5 -4
  365. package/dist/scrape/document.js +89 -76
  366. package/dist/scrape/element.d.ts +10 -8
  367. package/dist/scrape/element.js +295 -81
  368. package/dist/scrape/extractors.d.ts +11 -11
  369. package/dist/scrape/extractors.js +145 -113
  370. package/dist/scrape/index.d.ts +2 -0
  371. package/dist/scrape/index.js +1 -0
  372. package/dist/scrape/parser/back.d.ts +1 -0
  373. package/dist/scrape/parser/back.js +3 -0
  374. package/dist/scrape/parser/index.d.ts +20 -0
  375. package/dist/scrape/parser/index.js +19 -0
  376. package/dist/scrape/parser/matcher.d.ts +30 -0
  377. package/dist/scrape/parser/matcher.js +99 -0
  378. package/dist/scrape/parser/nodes/comment.d.ts +12 -0
  379. package/dist/scrape/parser/nodes/comment.js +21 -0
  380. package/dist/scrape/parser/nodes/html.d.ts +110 -0
  381. package/dist/scrape/parser/nodes/html.js +978 -0
  382. package/dist/scrape/parser/nodes/node.d.ts +18 -0
  383. package/dist/scrape/parser/nodes/node.js +31 -0
  384. package/dist/scrape/parser/nodes/text.d.ts +14 -0
  385. package/dist/scrape/parser/nodes/text.js +30 -0
  386. package/dist/scrape/parser/nodes/type.d.ts +6 -0
  387. package/dist/scrape/parser/nodes/type.js +7 -0
  388. package/dist/scrape/parser/parse.d.ts +1 -0
  389. package/dist/scrape/parser/parse.js +1 -0
  390. package/dist/scrape/parser/valid.d.ts +2 -0
  391. package/dist/scrape/parser/valid.js +5 -0
  392. package/dist/scrape/parser/void-tag.d.ts +7 -0
  393. package/dist/scrape/parser/void-tag.js +43 -0
  394. package/dist/scrape/spider.d.ts +19 -0
  395. package/dist/scrape/spider.js +28 -3
  396. package/dist/scrape/types.d.ts +7 -0
  397. package/dist/seo/analyzer.d.ts +15 -5
  398. package/dist/seo/analyzer.js +636 -175
  399. package/dist/seo/formatter.d.ts +16 -0
  400. package/dist/seo/formatter.js +228 -0
  401. package/dist/seo/index.d.ts +2 -0
  402. package/dist/seo/index.js +1 -0
  403. package/dist/seo/keywords.d.ts +16 -0
  404. package/dist/seo/keywords.js +55 -0
  405. package/dist/seo/rules/accessibility.js +96 -57
  406. package/dist/seo/rules/ai-search.js +44 -31
  407. package/dist/seo/rules/analytics.d.ts +2 -0
  408. package/dist/seo/rules/analytics.js +306 -0
  409. package/dist/seo/rules/best-practices.js +21 -14
  410. package/dist/seo/rules/canonical.js +53 -32
  411. package/dist/seo/rules/content.js +317 -31
  412. package/dist/seo/rules/crawl.js +55 -40
  413. package/dist/seo/rules/cwv.js +21 -15
  414. package/dist/seo/rules/ecommerce.js +82 -22
  415. package/dist/seo/rules/i18n.js +75 -36
  416. package/dist/seo/rules/images.js +109 -30
  417. package/dist/seo/rules/index.js +2 -0
  418. package/dist/seo/rules/internal-linking.js +58 -39
  419. package/dist/seo/rules/links.js +79 -52
  420. package/dist/seo/rules/local.js +49 -25
  421. package/dist/seo/rules/meta.js +339 -81
  422. package/dist/seo/rules/mobile.js +112 -2
  423. package/dist/seo/rules/performance.js +434 -66
  424. package/dist/seo/rules/pwa.js +36 -39
  425. package/dist/seo/rules/readability.js +31 -22
  426. package/dist/seo/rules/redirects.js +21 -15
  427. package/dist/seo/rules/resources.js +59 -42
  428. package/dist/seo/rules/schema.js +333 -8
  429. package/dist/seo/rules/security.js +142 -80
  430. package/dist/seo/rules/social.js +277 -47
  431. package/dist/seo/rules/structural.js +87 -19
  432. package/dist/seo/rules/technical-advanced.js +30 -24
  433. package/dist/seo/rules/technical.js +243 -42
  434. package/dist/seo/rules/types.d.ts +53 -1
  435. package/dist/seo/seo-spider.d.ts +22 -0
  436. package/dist/seo/seo-spider.js +77 -13
  437. package/dist/seo/types.d.ts +8 -1
  438. package/dist/seo/validators/llms-txt.js +19 -0
  439. package/dist/seo/validators/rss.d.ts +11 -0
  440. package/dist/seo/validators/rss.js +93 -0
  441. package/dist/seo/validators/sitemap.js +36 -26
  442. package/dist/transport/curl.d.ts +4 -0
  443. package/dist/transport/curl.js +101 -0
  444. package/dist/transport/udp.js +0 -1
  445. package/dist/transport/undici.js +1 -2
  446. package/dist/transport/worker.d.ts +18 -0
  447. package/dist/transport/worker.js +278 -0
  448. package/dist/types/index.d.ts +4 -1
  449. package/dist/utils/binary-manager.d.ts +4 -0
  450. package/dist/utils/binary-manager.js +72 -0
  451. package/dist/utils/optional-require.d.ts +7 -8
  452. package/dist/utils/optional-require.js +2 -21
  453. package/dist/utils/upload.d.ts +6 -0
  454. package/dist/utils/upload.js +11 -0
  455. package/dist/utils/user-agent.js +2 -13
  456. package/dist/version.js +1 -1
  457. package/package.json +12 -6
  458. package/dist/browser/utils/optional-require.d.ts +0 -19
  459. package/dist/browser/utils/optional-require.js +0 -105
@@ -1,176 +1,390 @@
1
+ import { is } from 'css-select';
2
+ import { NodeType, parse, } from './parser/index.js';
3
+ import Matcher from './parser/matcher.js';
1
4
  export class ScrapeElement {
2
- $el;
3
- $;
4
- constructor($el, $) {
5
- this.$el = $el;
6
- this.$ = $;
5
+ elements;
6
+ constructor(elements) {
7
+ if (Array.isArray(elements)) {
8
+ this.elements = elements.filter((el) => el.nodeType === NodeType.ELEMENT_NODE);
9
+ }
10
+ else {
11
+ this.elements =
12
+ elements.nodeType === NodeType.ELEMENT_NODE
13
+ ? [elements]
14
+ : [];
15
+ }
7
16
  }
8
17
  find(selector) {
9
- return new ScrapeElement(this.$el.find(selector), this.$);
18
+ const found = [];
19
+ this.elements.forEach((el) => {
20
+ found.push(...el.querySelectorAll(selector));
21
+ });
22
+ return new ScrapeElement(found);
10
23
  }
11
24
  parent(selector) {
12
- const parent = selector ? this.$el.parent(selector) : this.$el.parent();
13
- return new ScrapeElement(parent, this.$);
25
+ const parents = [];
26
+ this.elements.forEach((el) => {
27
+ const p = el.parentNode;
28
+ if (p && p.nodeType === NodeType.ELEMENT_NODE) {
29
+ if (!selector || is(p, selector, { adapter: Matcher })) {
30
+ if (!parents.includes(p)) {
31
+ parents.push(p);
32
+ }
33
+ }
34
+ }
35
+ });
36
+ return new ScrapeElement(parents);
14
37
  }
15
38
  children(selector) {
16
- const children = selector ? this.$el.children(selector) : this.$el.children();
17
- return new ScrapeElement(children, this.$);
39
+ const children = [];
40
+ this.elements.forEach((el) => {
41
+ el.childNodes.forEach((child) => {
42
+ if (child.nodeType === NodeType.ELEMENT_NODE) {
43
+ const childEl = child;
44
+ if (!selector || is(childEl, selector, { adapter: Matcher })) {
45
+ children.push(childEl);
46
+ }
47
+ }
48
+ });
49
+ });
50
+ return new ScrapeElement(children);
18
51
  }
19
52
  siblings(selector) {
20
- const siblings = selector ? this.$el.siblings(selector) : this.$el.siblings();
21
- return new ScrapeElement(siblings, this.$);
53
+ const siblings = [];
54
+ this.elements.forEach((el) => {
55
+ const parent = el.parentNode;
56
+ if (parent) {
57
+ parent.childNodes.forEach((child) => {
58
+ if (child !== el &&
59
+ child.nodeType === NodeType.ELEMENT_NODE) {
60
+ const childEl = child;
61
+ if (!selector || is(childEl, selector, { adapter: Matcher })) {
62
+ if (!siblings.includes(childEl)) {
63
+ siblings.push(childEl);
64
+ }
65
+ }
66
+ }
67
+ });
68
+ }
69
+ });
70
+ return new ScrapeElement(siblings);
22
71
  }
23
72
  next(selector) {
24
- const next = selector ? this.$el.next(selector) : this.$el.next();
25
- return new ScrapeElement(next, this.$);
73
+ const nexts = [];
74
+ this.elements.forEach((el) => {
75
+ let curr = el.nextElementSibling;
76
+ while (curr) {
77
+ if (!selector || is(curr, selector, { adapter: Matcher })) {
78
+ nexts.push(curr);
79
+ break;
80
+ }
81
+ break;
82
+ }
83
+ });
84
+ return new ScrapeElement(nexts);
26
85
  }
27
86
  prev(selector) {
28
- const prev = selector ? this.$el.prev(selector) : this.$el.prev();
29
- return new ScrapeElement(prev, this.$);
87
+ const prevs = [];
88
+ this.elements.forEach((el) => {
89
+ let curr = el.previousElementSibling;
90
+ if (curr) {
91
+ if (!selector || is(curr, selector, { adapter: Matcher })) {
92
+ prevs.push(curr);
93
+ }
94
+ }
95
+ });
96
+ return new ScrapeElement(prevs);
30
97
  }
31
98
  nextAll(selector) {
32
- const nextAll = selector ? this.$el.nextAll(selector) : this.$el.nextAll();
33
- return new ScrapeElement(nextAll, this.$);
99
+ const nexts = [];
100
+ this.elements.forEach((el) => {
101
+ let curr = el.nextElementSibling;
102
+ while (curr) {
103
+ if (!selector || is(curr, selector, { adapter: Matcher })) {
104
+ nexts.push(curr);
105
+ }
106
+ curr = curr.nextElementSibling;
107
+ }
108
+ });
109
+ return new ScrapeElement(nexts);
34
110
  }
35
111
  prevAll(selector) {
36
- const prevAll = selector ? this.$el.prevAll(selector) : this.$el.prevAll();
37
- return new ScrapeElement(prevAll, this.$);
112
+ const prevs = [];
113
+ this.elements.forEach((el) => {
114
+ let curr = el.previousElementSibling;
115
+ while (curr) {
116
+ if (!selector || is(curr, selector, { adapter: Matcher })) {
117
+ prevs.push(curr);
118
+ }
119
+ curr = curr.previousElementSibling;
120
+ }
121
+ });
122
+ return new ScrapeElement(prevs);
38
123
  }
39
124
  closest(selector) {
40
- return new ScrapeElement(this.$el.closest(selector), this.$);
125
+ const closests = [];
126
+ this.elements.forEach((el) => {
127
+ const found = el.closest(selector);
128
+ if (found) {
129
+ if (!closests.includes(found)) {
130
+ closests.push(found);
131
+ }
132
+ }
133
+ });
134
+ return new ScrapeElement(closests);
41
135
  }
42
136
  first() {
43
- return new ScrapeElement(this.$el.first(), this.$);
137
+ return new ScrapeElement(this.elements.slice(0, 1));
44
138
  }
45
139
  last() {
46
- return new ScrapeElement(this.$el.last(), this.$);
140
+ return new ScrapeElement(this.elements.slice(-1));
47
141
  }
48
142
  eq(index) {
49
- return new ScrapeElement(this.$el.eq(index), this.$);
50
- }
51
- filter(selector) {
52
- return new ScrapeElement(this.$el.filter(selector), this.$);
143
+ if (index < 0)
144
+ index = this.elements.length + index;
145
+ return new ScrapeElement(this.elements.slice(index, index + 1));
146
+ }
147
+ filter(selectorOrCallback) {
148
+ if (typeof selectorOrCallback === 'string') {
149
+ const filtered = this.elements.filter((el) => is(el, selectorOrCallback, { adapter: Matcher }));
150
+ return new ScrapeElement(filtered);
151
+ }
152
+ else {
153
+ const filtered = this.elements.filter((el, index) => selectorOrCallback(new ScrapeElement(el), index));
154
+ return new ScrapeElement(filtered);
155
+ }
53
156
  }
54
157
  not(selector) {
55
- return new ScrapeElement(this.$el.not(selector), this.$);
158
+ const filtered = this.elements.filter((el) => !is(el, selector, { adapter: Matcher }));
159
+ return new ScrapeElement(filtered);
56
160
  }
57
161
  has(selector) {
58
- return new ScrapeElement(this.$el.has(selector), this.$);
162
+ const has = this.elements.filter((el) => {
163
+ return el.querySelector(selector) !== null;
164
+ });
165
+ return new ScrapeElement(has);
59
166
  }
60
167
  add(selector) {
61
- return new ScrapeElement(this.$el.add(selector), this.$);
168
+ if (selector.trim().startsWith('<')) {
169
+ const parsed = parse(selector);
170
+ return new ScrapeElement([...this.elements, ...parsed.children]);
171
+ }
172
+ return this;
62
173
  }
63
174
  parents(selector) {
64
- const parents = selector ? this.$el.parents(selector) : this.$el.parents();
65
- return new ScrapeElement(parents, this.$);
175
+ const parents = [];
176
+ this.elements.forEach((el) => {
177
+ let p = el.parentNode;
178
+ while (p && p.nodeType === NodeType.ELEMENT_NODE) {
179
+ const pEl = p;
180
+ if (!selector || is(pEl, selector, { adapter: Matcher })) {
181
+ if (!parents.includes(pEl)) {
182
+ parents.push(pEl);
183
+ }
184
+ }
185
+ p = p.parentNode;
186
+ }
187
+ });
188
+ return new ScrapeElement(parents);
189
+ }
190
+ parentsUntil(selector) {
191
+ const parents = [];
192
+ this.elements.forEach((el) => {
193
+ let p = el.parentNode;
194
+ while (p && p.nodeType === NodeType.ELEMENT_NODE) {
195
+ const pEl = p;
196
+ if (is(pEl, selector, { adapter: Matcher })) {
197
+ break;
198
+ }
199
+ if (!parents.includes(pEl)) {
200
+ parents.push(pEl);
201
+ }
202
+ p = p.parentNode;
203
+ }
204
+ });
205
+ return new ScrapeElement(parents);
206
+ }
207
+ nextUntil(selector) {
208
+ const nexts = [];
209
+ this.elements.forEach((el) => {
210
+ let curr = el.nextElementSibling;
211
+ while (curr) {
212
+ if (is(curr, selector, { adapter: Matcher })) {
213
+ break;
214
+ }
215
+ nexts.push(curr);
216
+ curr = curr.nextElementSibling;
217
+ }
218
+ });
219
+ return new ScrapeElement(nexts);
220
+ }
221
+ prevUntil(selector) {
222
+ const prevs = [];
223
+ this.elements.forEach((el) => {
224
+ let curr = el.previousElementSibling;
225
+ while (curr) {
226
+ if (is(curr, selector, { adapter: Matcher })) {
227
+ break;
228
+ }
229
+ prevs.push(curr);
230
+ curr = curr.previousElementSibling;
231
+ }
232
+ });
233
+ return new ScrapeElement(prevs);
234
+ }
235
+ slice(start, end) {
236
+ return new ScrapeElement(this.elements.slice(start, end));
66
237
  }
67
238
  contents() {
68
- return new ScrapeElement(this.$el.contents(), this.$);
239
+ const contents = [];
240
+ this.elements.forEach(el => {
241
+ el.childNodes.forEach(child => {
242
+ if (child.nodeType === NodeType.ELEMENT_NODE) {
243
+ contents.push(child);
244
+ }
245
+ });
246
+ });
247
+ return new ScrapeElement(contents);
69
248
  }
70
249
  text() {
71
- return this.$el.text().trim();
250
+ return this.elements.map((el) => el.text).join('');
72
251
  }
73
252
  html() {
74
- return this.$el.html();
253
+ if (this.elements.length > 0) {
254
+ return this.elements[0].innerHTML;
255
+ }
256
+ return null;
75
257
  }
76
258
  outerHtml() {
77
- return this.$.html(this.$el) || '';
259
+ if (this.elements.length > 0) {
260
+ return this.elements[0].outerHTML;
261
+ }
262
+ return '';
78
263
  }
79
264
  attr(name) {
80
- return this.$el.attr(name);
265
+ if (this.elements.length > 0) {
266
+ return this.elements[0].getAttribute(name);
267
+ }
268
+ return undefined;
81
269
  }
82
270
  attrs() {
83
- const attributes = {};
84
- const el = this.$el.get(0);
85
- if (el && 'attribs' in el) {
86
- Object.assign(attributes, el.attribs);
271
+ if (this.elements.length > 0) {
272
+ return this.elements[0].attributes;
87
273
  }
88
- return attributes;
274
+ return {};
89
275
  }
90
276
  data(name) {
277
+ if (this.elements.length === 0)
278
+ return undefined;
279
+ const el = this.elements[0];
280
+ const attrs = el.attributes;
91
281
  if (name) {
92
- return this.$el.data(name);
282
+ return attrs[`data-${name}`];
283
+ }
284
+ const dataAttrs = {};
285
+ for (const key in attrs) {
286
+ if (key.startsWith('data-')) {
287
+ const shortKey = key.slice(5);
288
+ dataAttrs[shortKey] = attrs[key];
289
+ }
93
290
  }
94
- return this.$el.data();
291
+ return dataAttrs;
95
292
  }
96
293
  val() {
97
- return this.$el.val();
294
+ if (this.elements.length === 0)
295
+ return undefined;
296
+ const el = this.elements[0];
297
+ if (el.tagName === 'INPUT') {
298
+ return el.getAttribute('value');
299
+ }
300
+ if (el.tagName === 'TEXTAREA') {
301
+ return el.text;
302
+ }
303
+ if (el.tagName === 'SELECT') {
304
+ const option = el.querySelector('option[selected]') || el.querySelector('option');
305
+ return option ? option.getAttribute('value') ?? option.text : undefined;
306
+ }
307
+ return el.getAttribute('value');
98
308
  }
99
309
  prop(name) {
100
- return this.$el.prop(name);
310
+ if (this.elements.length === 0)
311
+ return undefined;
312
+ const el = this.elements[0];
313
+ if (name === 'tagName')
314
+ return el.tagName;
315
+ if (name in el)
316
+ return el[name];
317
+ return this.attr(name);
101
318
  }
102
319
  exists() {
103
- return this.$el.length > 0;
320
+ return this.elements.length > 0;
104
321
  }
105
322
  get length() {
106
- return this.$el.length;
323
+ return this.elements.length;
107
324
  }
108
325
  is(selector) {
109
- return this.$el.is(selector);
326
+ return this.elements.some((el) => is(el, selector, { adapter: Matcher }));
110
327
  }
111
328
  hasClass(className) {
112
- return this.$el.hasClass(className);
329
+ return this.elements.some((el) => el.classList.contains(className));
113
330
  }
114
331
  index(selector) {
115
- return selector ? this.$el.index(selector) : this.$el.index();
332
+ if (this.elements.length === 0)
333
+ return -1;
334
+ const el = this.elements[0];
335
+ const parent = el.parentNode;
336
+ if (!parent)
337
+ return 0;
338
+ const siblings = parent.childNodes.filter(n => n.nodeType === NodeType.ELEMENT_NODE);
339
+ if (selector) {
340
+ return siblings.findIndex(s => s === el);
341
+ }
342
+ return siblings.indexOf(el);
116
343
  }
117
344
  each(callback) {
118
- this.$el.each((index, element) => {
119
- callback(new ScrapeElement(this.$(element), this.$), index);
345
+ this.elements.forEach((el, index) => {
346
+ callback(new ScrapeElement(el), index);
120
347
  });
121
348
  return this;
122
349
  }
123
350
  map(callback) {
124
- const results = [];
125
- this.$el.each((index, element) => {
126
- results.push(callback(new ScrapeElement(this.$(element), this.$), index));
351
+ return this.elements.map((el, index) => {
352
+ return callback(new ScrapeElement(el), index);
127
353
  });
128
- return results;
129
354
  }
130
355
  toArray() {
131
- return this.$el.toArray().map((element) => new ScrapeElement(this.$(element), this.$));
356
+ return this.elements.map((el) => new ScrapeElement(el));
132
357
  }
133
358
  reduce(callback, initialValue) {
134
359
  let accumulator = initialValue;
135
- this.$el.each((index, element) => {
136
- accumulator = callback(accumulator, new ScrapeElement(this.$(element), this.$), index);
360
+ this.elements.forEach((el, index) => {
361
+ accumulator = callback(accumulator, new ScrapeElement(el), index);
137
362
  });
138
363
  return accumulator;
139
364
  }
140
365
  some(callback) {
141
- let found = false;
142
- this.$el.each((index, element) => {
143
- if (callback(new ScrapeElement(this.$(element), this.$), index)) {
144
- found = true;
145
- return false;
146
- }
147
- });
148
- return found;
366
+ return this.elements.some((el, index) => callback(new ScrapeElement(el), index));
149
367
  }
150
368
  every(callback) {
151
- let allMatch = true;
152
- this.$el.each((index, element) => {
153
- if (!callback(new ScrapeElement(this.$(element), this.$), index)) {
154
- allMatch = false;
155
- return false;
156
- }
157
- });
158
- return allMatch;
369
+ return this.elements.every((el, index) => callback(new ScrapeElement(el), index));
159
370
  }
160
371
  tagName() {
161
- const el = this.$el.get(0);
162
- return el ? el.tagName?.toLowerCase() : undefined;
372
+ if (this.elements.length > 0) {
373
+ return this.elements[0].tagName?.toLowerCase();
374
+ }
375
+ return undefined;
163
376
  }
164
377
  clone() {
165
- return new ScrapeElement(this.$el.clone(), this.$);
378
+ const clones = this.elements.map(el => el.clone());
379
+ return new ScrapeElement(clones);
166
380
  }
167
381
  toString() {
168
382
  return this.outerHtml();
169
383
  }
170
384
  get raw() {
171
- return this.$el;
385
+ return this.elements;
172
386
  }
173
387
  get(index = 0) {
174
- return this.$el.get(index);
388
+ return this.elements[index];
175
389
  }
176
390
  }
@@ -1,16 +1,16 @@
1
- import type { CheerioAPI } from 'cheerio';
1
+ import { HTMLElement } from './parser/index.js';
2
2
  import type { ExtractedLink, ExtractedImage, ExtractedMeta, OpenGraphData, TwitterCardData, JsonLdData, ExtractedForm, ExtractedTable, ExtractedScript, ExtractedStyle, LinkExtractionOptions, ImageExtractionOptions } from './types.js';
3
- export declare function extractLinks($: CheerioAPI, options?: LinkExtractionOptions & {
3
+ export declare function extractLinks(root: HTMLElement, options?: LinkExtractionOptions & {
4
4
  baseUrl?: string;
5
5
  }): ExtractedLink[];
6
- export declare function extractImages($: CheerioAPI, options?: ImageExtractionOptions & {
6
+ export declare function extractImages(root: HTMLElement, options?: ImageExtractionOptions & {
7
7
  baseUrl?: string;
8
8
  }): ExtractedImage[];
9
- export declare function extractMeta($: CheerioAPI): ExtractedMeta;
10
- export declare function extractOpenGraph($: CheerioAPI): OpenGraphData;
11
- export declare function extractTwitterCard($: CheerioAPI): TwitterCardData;
12
- export declare function extractJsonLd($: CheerioAPI): JsonLdData[];
13
- export declare function extractForms($: CheerioAPI, selector?: string): ExtractedForm[];
14
- export declare function extractTables($: CheerioAPI, selector?: string): ExtractedTable[];
15
- export declare function extractScripts($: CheerioAPI): ExtractedScript[];
16
- export declare function extractStyles($: CheerioAPI): ExtractedStyle[];
9
+ export declare function extractMeta(root: HTMLElement): ExtractedMeta;
10
+ export declare function extractOpenGraph(root: HTMLElement): OpenGraphData;
11
+ export declare function extractTwitterCard(root: HTMLElement): TwitterCardData;
12
+ export declare function extractJsonLd(root: HTMLElement): JsonLdData[];
13
+ export declare function extractForms(root: HTMLElement, selector?: string): ExtractedForm[];
14
+ export declare function extractTables(root: HTMLElement, selector?: string): ExtractedTable[];
15
+ export declare function extractScripts(root: HTMLElement): ExtractedScript[];
16
+ export declare function extractStyles(root: HTMLElement): ExtractedStyle[];