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,10 +1,13 @@
1
+ import { NodeType } from './parser/index.js';
1
2
  function resolveUrl(url, baseUrl) {
2
3
  if (!url)
3
4
  return '';
4
5
  if (!baseUrl)
5
6
  return url;
6
7
  try {
7
- if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) {
8
+ if (url.startsWith('http://') ||
9
+ url.startsWith('https://') ||
10
+ url.startsWith('//')) {
8
11
  return url;
9
12
  }
10
13
  return new URL(url, baseUrl).href;
@@ -32,64 +35,76 @@ function classifyLinkType(href, baseUrl) {
32
35
  return undefined;
33
36
  }
34
37
  }
35
- if (href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//')) {
38
+ if (href.startsWith('http://') ||
39
+ href.startsWith('https://') ||
40
+ href.startsWith('//')) {
36
41
  return 'external';
37
42
  }
38
43
  return 'internal';
39
44
  }
40
- export function extractLinks($, options) {
45
+ export function extractLinks(root, options) {
41
46
  const selector = options?.selector || 'a[href]';
42
47
  const links = [];
43
- $(selector).each((_, element) => {
44
- const $el = $(element);
45
- let href = $el.attr('href') || '';
48
+ root.querySelectorAll(selector).forEach((element) => {
49
+ let href = element.getAttribute('href') || '';
46
50
  if (options?.absolute && options?.baseUrl) {
47
51
  href = resolveUrl(href, options.baseUrl);
48
52
  }
53
+ const imgs = element.querySelectorAll('img');
54
+ const svgs = element.querySelectorAll('svg');
49
55
  links.push({
50
56
  href,
51
- text: $el.text().trim(),
52
- rel: $el.attr('rel'),
53
- target: $el.attr('target'),
54
- title: $el.attr('title'),
57
+ text: element.text.trim(),
58
+ rel: element.getAttribute('rel'),
59
+ target: element.getAttribute('target'),
60
+ title: element.getAttribute('title'),
55
61
  type: classifyLinkType(href, options?.baseUrl),
62
+ hasImage: imgs.length > 0,
63
+ hasImageWithAlt: imgs.filter((img) => !!img.getAttribute('alt')?.trim()).length > 0,
64
+ hasSvg: svgs.length > 0,
65
+ hasSvgWithTitle: svgs.filter((svg) => svg.querySelectorAll('title').length > 0 ||
66
+ !!svg.getAttribute('aria-label')).length > 0,
67
+ ariaLabel: element.getAttribute('aria-label'),
56
68
  });
57
69
  });
58
70
  return links;
59
71
  }
60
- export function extractImages($, options) {
72
+ export function extractImages(root, options) {
61
73
  const selector = options?.selector || 'img[src]';
62
74
  const images = [];
63
- $(selector).each((_, element) => {
64
- const $el = $(element);
65
- let src = $el.attr('src') || '';
75
+ root.querySelectorAll(selector).forEach((element) => {
76
+ let src = element.getAttribute('src') || '';
66
77
  if (options?.absolute && options?.baseUrl) {
67
78
  src = resolveUrl(src, options.baseUrl);
68
79
  }
69
- const width = $el.attr('width');
70
- const height = $el.attr('height');
80
+ const width = element.getAttribute('width');
81
+ const height = element.getAttribute('height');
71
82
  images.push({
72
83
  src,
73
- alt: $el.attr('alt'),
74
- title: $el.attr('title'),
84
+ alt: element.getAttribute('alt'),
85
+ title: element.getAttribute('title'),
75
86
  width: width ? parseInt(width, 10) : undefined,
76
87
  height: height ? parseInt(height, 10) : undefined,
77
- srcset: $el.attr('srcset'),
78
- loading: $el.attr('loading'),
79
- decoding: $el.attr('decoding'),
88
+ srcset: element.getAttribute('srcset'),
89
+ loading: element.getAttribute('loading'),
90
+ decoding: element.getAttribute('decoding'),
80
91
  });
81
92
  });
82
93
  return images;
83
94
  }
84
- export function extractMeta($) {
95
+ export function extractMeta(root) {
85
96
  const meta = {};
86
- meta.title = $('title').first().text().trim() || undefined;
87
- const charsetMeta = $('meta[charset]').attr('charset');
97
+ const titleEl = root.querySelector('title');
98
+ meta.title = titleEl ? titleEl.text.trim() || undefined : undefined;
99
+ const charsetMeta = root.querySelector('meta[charset]');
88
100
  if (charsetMeta) {
89
- meta.charset = charsetMeta;
101
+ meta.charset = charsetMeta.getAttribute('charset');
90
102
  }
91
103
  else {
92
- const contentType = $('meta[http-equiv="Content-Type"]').attr('content');
104
+ const contentTypeMeta = root.querySelector('meta[http-equiv="Content-Type"]');
105
+ const contentType = contentTypeMeta
106
+ ? contentTypeMeta.getAttribute('content')
107
+ : null;
93
108
  if (contentType) {
94
109
  const charsetMatch = contentType.match(/charset=([^;]+)/i);
95
110
  if (charsetMatch) {
@@ -97,14 +112,13 @@ export function extractMeta($) {
97
112
  }
98
113
  }
99
114
  }
100
- const canonical = $('link[rel="canonical"]').attr('href');
101
- if (canonical) {
102
- meta.canonical = canonical;
115
+ const canonicalEl = root.querySelector('link[rel="canonical"]');
116
+ if (canonicalEl) {
117
+ meta.canonical = canonicalEl.getAttribute('href');
103
118
  }
104
- $('meta[name]').each((_, element) => {
105
- const $el = $(element);
106
- const name = $el.attr('name')?.toLowerCase();
107
- const content = $el.attr('content');
119
+ root.querySelectorAll('meta[name]').forEach((element) => {
120
+ const name = element.getAttribute('name')?.toLowerCase();
121
+ const content = element.getAttribute('content');
108
122
  if (!name || !content)
109
123
  return;
110
124
  switch (name) {
@@ -112,7 +126,10 @@ export function extractMeta($) {
112
126
  meta.description = content;
113
127
  break;
114
128
  case 'keywords':
115
- meta.keywords = content.split(',').map((k) => k.trim()).filter(Boolean);
129
+ meta.keywords = content
130
+ .split(',')
131
+ .map((k) => k.trim())
132
+ .filter(Boolean);
116
133
  break;
117
134
  case 'author':
118
135
  meta.author = content;
@@ -129,13 +146,12 @@ export function extractMeta($) {
129
146
  });
130
147
  return meta;
131
148
  }
132
- export function extractOpenGraph($) {
149
+ export function extractOpenGraph(root) {
133
150
  const og = {};
134
151
  const images = [];
135
- $('meta[property^="og:"]').each((_, element) => {
136
- const $el = $(element);
137
- const property = $el.attr('property');
138
- const content = $el.attr('content');
152
+ root.querySelectorAll('meta[property^="og:"]').forEach((element) => {
153
+ const property = element.getAttribute('property');
154
+ const content = element.getAttribute('content');
139
155
  if (!property || !content)
140
156
  return;
141
157
  const key = property.replace('og:', '');
@@ -173,12 +189,11 @@ export function extractOpenGraph($) {
173
189
  }
174
190
  return og;
175
191
  }
176
- export function extractTwitterCard($) {
192
+ export function extractTwitterCard(root) {
177
193
  const twitter = {};
178
- $('meta[name^="twitter:"]').each((_, element) => {
179
- const $el = $(element);
180
- const name = $el.attr('name');
181
- const content = $el.attr('content');
194
+ root.querySelectorAll('meta[name^="twitter:"]').forEach((element) => {
195
+ const name = element.getAttribute('name');
196
+ const content = element.getAttribute('content');
182
197
  if (!name || !content)
183
198
  return;
184
199
  const key = name.replace('twitter:', '');
@@ -207,10 +222,10 @@ export function extractTwitterCard($) {
207
222
  });
208
223
  return twitter;
209
224
  }
210
- export function extractJsonLd($) {
225
+ export function extractJsonLd(root) {
211
226
  const results = [];
212
- $('script[type="application/ld+json"]').each((_, element) => {
213
- const content = $(element).html();
227
+ root.querySelectorAll('script[type="application/ld+json"]').forEach((element) => {
228
+ const content = element.innerHTML;
214
229
  if (!content)
215
230
  return;
216
231
  try {
@@ -230,125 +245,142 @@ export function extractJsonLd($) {
230
245
  });
231
246
  return results;
232
247
  }
233
- export function extractForms($, selector) {
248
+ export function extractForms(root, selector) {
234
249
  const forms = [];
235
250
  const formSelector = selector || 'form';
236
- $(formSelector).each((_, formElement) => {
237
- const $form = $(formElement);
251
+ root.querySelectorAll(formSelector).forEach((formElement) => {
238
252
  const fields = [];
239
- $form.find('input, select, textarea').each((_, fieldElement) => {
240
- const $field = $(fieldElement);
253
+ formElement.querySelectorAll('input, select, textarea').forEach((fieldElement) => {
241
254
  const tagName = fieldElement.tagName?.toLowerCase();
242
- const type = $field.attr('type') || (tagName === 'textarea' ? 'textarea' : tagName === 'select' ? 'select' : 'text');
255
+ const type = fieldElement.getAttribute('type') ||
256
+ (tagName === 'textarea'
257
+ ? 'textarea'
258
+ : tagName === 'select'
259
+ ? 'select'
260
+ : 'text');
261
+ let value = fieldElement.getAttribute('value');
262
+ if (tagName === 'textarea') {
263
+ value = fieldElement.text;
264
+ }
243
265
  const field = {
244
- name: $field.attr('name'),
266
+ name: fieldElement.getAttribute('name'),
245
267
  type,
246
- value: $field.val(),
247
- placeholder: $field.attr('placeholder'),
248
- required: $field.attr('required') !== undefined,
268
+ value: value,
269
+ placeholder: fieldElement.getAttribute('placeholder'),
270
+ required: fieldElement.hasAttribute('required'),
249
271
  };
250
272
  if (tagName === 'select') {
251
273
  field.options = [];
252
- $field.find('option').each((_, optionElement) => {
253
- const $option = $(optionElement);
274
+ fieldElement.querySelectorAll('option').forEach((optionElement) => {
254
275
  field.options.push({
255
- value: $option.attr('value') || $option.text(),
256
- text: $option.text().trim(),
276
+ value: optionElement.getAttribute('value') || optionElement.text,
277
+ text: optionElement.text.trim(),
257
278
  });
258
279
  });
280
+ const selected = fieldElement.querySelector('option[selected]');
281
+ if (selected) {
282
+ field.value = selected.getAttribute('value') || selected.text;
283
+ }
259
284
  }
260
285
  fields.push(field);
261
286
  });
262
287
  forms.push({
263
- action: $form.attr('action'),
264
- method: $form.attr('method')?.toUpperCase(),
265
- name: $form.attr('name'),
266
- id: $form.attr('id'),
288
+ action: formElement.getAttribute('action'),
289
+ method: formElement.getAttribute('method')?.toUpperCase(),
290
+ name: formElement.getAttribute('name'),
291
+ id: formElement.getAttribute('id'),
267
292
  fields,
268
293
  });
269
294
  });
270
295
  return forms;
271
296
  }
272
- export function extractTables($, selector) {
297
+ export function extractTables(root, selector) {
273
298
  const tables = [];
274
299
  const tableSelector = selector || 'table';
275
- $(tableSelector).each((_, tableElement) => {
276
- const $table = $(tableElement);
300
+ root.querySelectorAll(tableSelector).forEach((tableElement) => {
277
301
  const headers = [];
278
302
  const rows = [];
279
- const caption = $table.find('caption').first().text().trim() || undefined;
280
- const $headerCells = $table.find('thead th, thead td, tr:first-child th');
281
- if ($headerCells.length > 0) {
282
- $headerCells.each((_, th) => {
283
- headers.push($(th).text().trim());
303
+ const captionEl = tableElement.querySelector('caption');
304
+ const caption = captionEl ? captionEl.text.trim() || undefined : undefined;
305
+ let headerRow = null;
306
+ const thead = tableElement.querySelector('thead');
307
+ if (thead) {
308
+ thead.querySelectorAll('th, td').forEach(cell => {
309
+ headers.push(cell.text.trim());
284
310
  });
285
311
  }
286
- const $rows = $table.find('tbody tr, tr').not(':has(th):not(:first-child)');
287
- $rows.each((_, tr) => {
312
+ if (headers.length === 0) {
313
+ const tr = tableElement.querySelector('tr');
314
+ if (tr) {
315
+ tr.childNodes.forEach(child => {
316
+ if (child.nodeType === NodeType.ELEMENT_NODE) {
317
+ const el = child;
318
+ if (['TH', 'TD'].includes(el.tagName)) {
319
+ headers.push(el.text.trim());
320
+ }
321
+ }
322
+ });
323
+ if (headers.length > 0) {
324
+ headerRow = tr;
325
+ }
326
+ }
327
+ }
328
+ const allRows = tableElement.querySelectorAll('tr');
329
+ allRows.forEach((tr) => {
330
+ if (tr.parentNode && tr.parentNode.tagName === 'THEAD') {
331
+ return;
332
+ }
333
+ if (tr === headerRow) {
334
+ return;
335
+ }
288
336
  const row = [];
289
- $(tr).find('td').each((_, td) => {
290
- row.push($(td).text().trim());
337
+ tr.querySelectorAll('td, th').forEach(cell => {
338
+ row.push(cell.text.trim());
291
339
  });
292
340
  if (row.length > 0) {
293
341
  rows.push(row);
294
342
  }
295
343
  });
296
- if (headers.length === 0 && rows.length > 0) {
297
- const $firstRowCells = $table.find('tr:first-child td, tr:first-child th');
298
- if ($firstRowCells.length > 0) {
299
- $firstRowCells.each((_, cell) => {
300
- headers.push($(cell).text().trim());
301
- });
302
- if ($table.find('tr:first-child th').length > 0) {
303
- }
304
- else {
305
- const firstRow = [];
306
- $table.find('tr:first-child td').each((_, td) => {
307
- firstRow.push($(td).text().trim());
308
- });
309
- if (firstRow.length > 0 && !rows.some(r => r.join('') === firstRow.join(''))) {
310
- rows.unshift(firstRow);
311
- }
312
- }
313
- }
344
+ if (headers.length > 0 || rows.length > 0) {
345
+ tables.push({
346
+ caption,
347
+ headers,
348
+ rows,
349
+ });
314
350
  }
315
- tables.push({ headers, rows, caption });
316
351
  });
317
352
  return tables;
318
353
  }
319
- export function extractScripts($) {
354
+ export function extractScripts(root) {
320
355
  const scripts = [];
321
- $('script').each((_, element) => {
322
- const $el = $(element);
323
- const src = $el.attr('src');
324
- const inline = !src ? $el.html()?.trim() : undefined;
356
+ root.querySelectorAll('script').forEach((element) => {
357
+ const src = element.getAttribute('src');
358
+ const inline = !src ? element.innerHTML?.trim() : undefined;
325
359
  if (!src && !inline)
326
360
  return;
327
361
  scripts.push({
328
362
  src,
329
- type: $el.attr('type'),
330
- async: $el.attr('async') !== undefined,
331
- defer: $el.attr('defer') !== undefined,
363
+ type: element.getAttribute('type'),
364
+ async: element.hasAttribute('async'),
365
+ defer: element.hasAttribute('defer'),
332
366
  inline,
333
367
  });
334
368
  });
335
369
  return scripts;
336
370
  }
337
- export function extractStyles($) {
371
+ export function extractStyles(root) {
338
372
  const styles = [];
339
- $('link[rel="stylesheet"]').each((_, element) => {
340
- const $el = $(element);
373
+ root.querySelectorAll('link[rel="stylesheet"]').forEach((element) => {
341
374
  styles.push({
342
- href: $el.attr('href'),
343
- media: $el.attr('media'),
375
+ href: element.getAttribute('href'),
376
+ media: element.getAttribute('media'),
344
377
  });
345
378
  });
346
- $('style').each((_, element) => {
347
- const $el = $(element);
348
- const inline = $el.html()?.trim();
379
+ root.querySelectorAll('style').forEach((element) => {
380
+ const inline = element.innerHTML?.trim();
349
381
  if (inline) {
350
382
  styles.push({
351
- media: $el.attr('media'),
383
+ media: element.getAttribute('media'),
352
384
  inline,
353
385
  });
354
386
  }
@@ -0,0 +1 @@
1
+ export default function arr_back<T>(arr: T[]): T;
@@ -0,0 +1,3 @@
1
+ export default function arr_back(arr) {
2
+ return arr[arr.length - 1];
3
+ }
@@ -0,0 +1,20 @@
1
+ import CommentNode from './nodes/comment.js';
2
+ import HTMLElement, { Options } from './nodes/html.js';
3
+ import Node from './nodes/node.js';
4
+ import TextNode from './nodes/text.js';
5
+ import NodeType from './nodes/type.js';
6
+ import baseParse from './parse.js';
7
+ import valid from './valid.js';
8
+ export type { Options } from './nodes/html.js';
9
+ export { HTMLElement, CommentNode, valid, Node, TextNode, NodeType };
10
+ export declare function parse(data: string, options?: Partial<Options>): HTMLElement;
11
+ export declare namespace parse {
12
+ var parse: typeof baseParse;
13
+ var HTMLElement: typeof import("./nodes/html.js").default;
14
+ var CommentNode: typeof import("./nodes/comment.js").default;
15
+ var valid: typeof import("./valid.js").default;
16
+ var Node: typeof import("./nodes/node.js").default;
17
+ var TextNode: typeof import("./nodes/text.js").default;
18
+ var NodeType: typeof import("./nodes/type.js").default;
19
+ }
20
+ export default parse;
@@ -0,0 +1,19 @@
1
+ import CommentNode from './nodes/comment.js';
2
+ import HTMLElement from './nodes/html.js';
3
+ import Node from './nodes/node.js';
4
+ import TextNode from './nodes/text.js';
5
+ import NodeType from './nodes/type.js';
6
+ import baseParse from './parse.js';
7
+ import valid from './valid.js';
8
+ export { HTMLElement, CommentNode, valid, Node, TextNode, NodeType };
9
+ export function parse(data, options = {}) {
10
+ return baseParse(data, options);
11
+ }
12
+ export default parse;
13
+ parse.parse = baseParse;
14
+ parse.HTMLElement = HTMLElement;
15
+ parse.CommentNode = CommentNode;
16
+ parse.valid = valid;
17
+ parse.Node = Node;
18
+ parse.TextNode = TextNode;
19
+ parse.NodeType = NodeType;
@@ -0,0 +1,30 @@
1
+ import type HTMLElement from './nodes/html.js';
2
+ import type Node from './nodes/node.js';
3
+ export declare type Predicate = (node: Node) => node is HTMLElement;
4
+ declare function isTag(node: Node): node is HTMLElement;
5
+ declare function getAttributeValue(elem: HTMLElement, name: string): string | undefined;
6
+ declare function getName(elem: HTMLElement): string;
7
+ declare function getChildren(node: Node): Node[];
8
+ declare function getParent(node: Node): HTMLElement | null;
9
+ declare function getText(node: Node): string;
10
+ declare function removeSubsets(nodes: Node[]): Node[];
11
+ declare function existsOne(test: Predicate, elems: Node[]): boolean;
12
+ declare function getSiblings(node: Node): Node[];
13
+ declare function hasAttrib(elem: HTMLElement, name: string): boolean;
14
+ declare function findOne(test: Predicate, elems: Node[]): HTMLElement | null;
15
+ declare function findAll(test: Predicate, nodes: Node[]): Node[];
16
+ declare const _default: {
17
+ isTag: typeof isTag;
18
+ getAttributeValue: typeof getAttributeValue;
19
+ getName: typeof getName;
20
+ getChildren: typeof getChildren;
21
+ getParent: typeof getParent;
22
+ getText: typeof getText;
23
+ removeSubsets: typeof removeSubsets;
24
+ existsOne: typeof existsOne;
25
+ getSiblings: typeof getSiblings;
26
+ hasAttrib: typeof hasAttrib;
27
+ findOne: typeof findOne;
28
+ findAll: typeof findAll;
29
+ };
30
+ export default _default;
@@ -0,0 +1,99 @@
1
+ import NodeType from './nodes/type.js';
2
+ function isTag(node) {
3
+ return !!node && node.nodeType === NodeType.ELEMENT_NODE;
4
+ }
5
+ function getAttributeValue(elem, name) {
6
+ return isTag(elem) ? elem.getAttribute(name) : undefined;
7
+ }
8
+ function getName(elem) {
9
+ return ((elem && elem.rawTagName) || '').toLowerCase();
10
+ }
11
+ function getChildren(node) {
12
+ return node && node.childNodes;
13
+ }
14
+ function getParent(node) {
15
+ return node ? node.parentNode : null;
16
+ }
17
+ function getText(node) {
18
+ return node.text;
19
+ }
20
+ function removeSubsets(nodes) {
21
+ let idx = nodes.length;
22
+ let node;
23
+ let ancestor;
24
+ let replace;
25
+ while (--idx > -1) {
26
+ node = ancestor = nodes[idx];
27
+ nodes[idx] = null;
28
+ replace = true;
29
+ while (ancestor) {
30
+ if (nodes.indexOf(ancestor) > -1) {
31
+ replace = false;
32
+ nodes.splice(idx, 1);
33
+ break;
34
+ }
35
+ ancestor = getParent(ancestor);
36
+ }
37
+ if (replace) {
38
+ nodes[idx] = node;
39
+ }
40
+ }
41
+ return nodes;
42
+ }
43
+ function existsOne(test, elems) {
44
+ return elems.some((elem) => {
45
+ return isTag(elem)
46
+ ? test(elem) || existsOne(test, getChildren(elem))
47
+ : false;
48
+ });
49
+ }
50
+ function getSiblings(node) {
51
+ const parent = getParent(node);
52
+ return parent ? getChildren(parent) : [];
53
+ }
54
+ function hasAttrib(elem, name) {
55
+ return getAttributeValue(elem, name) !== undefined;
56
+ }
57
+ function findOne(test, elems) {
58
+ let elem = null;
59
+ for (let i = 0, l = elems?.length; i < l && !elem; i++) {
60
+ const el = elems[i];
61
+ if (test(el)) {
62
+ elem = el;
63
+ }
64
+ else {
65
+ const childs = getChildren(el);
66
+ if (childs && childs.length > 0) {
67
+ elem = findOne(test, childs);
68
+ }
69
+ }
70
+ }
71
+ return elem;
72
+ }
73
+ function findAll(test, nodes) {
74
+ let result = [];
75
+ for (let i = 0, j = nodes.length; i < j; i++) {
76
+ if (!isTag(nodes[i]))
77
+ continue;
78
+ if (test(nodes[i]))
79
+ result.push(nodes[i]);
80
+ const childs = getChildren(nodes[i]);
81
+ if (childs)
82
+ result = result.concat(findAll(test, childs));
83
+ }
84
+ return result;
85
+ }
86
+ export default {
87
+ isTag,
88
+ getAttributeValue,
89
+ getName,
90
+ getChildren,
91
+ getParent,
92
+ getText,
93
+ removeSubsets,
94
+ existsOne,
95
+ getSiblings,
96
+ hasAttrib,
97
+ findOne,
98
+ findAll,
99
+ };
@@ -0,0 +1,12 @@
1
+ import type HTMLElement from './html.js';
2
+ import Node from './node.js';
3
+ import NodeType from './type.js';
4
+ export default class CommentNode extends Node {
5
+ rawText: string;
6
+ rawTagName: string;
7
+ clone(): CommentNode;
8
+ constructor(rawText: string, parentNode?: HTMLElement | null, range?: [number, number], rawTagName?: string);
9
+ nodeType: NodeType;
10
+ get text(): string;
11
+ toString(): string;
12
+ }
@@ -0,0 +1,21 @@
1
+ import Node from './node.js';
2
+ import NodeType from './type.js';
3
+ export default class CommentNode extends Node {
4
+ rawText;
5
+ rawTagName;
6
+ clone() {
7
+ return new CommentNode(this.rawText, null, undefined, this.rawTagName);
8
+ }
9
+ constructor(rawText, parentNode = null, range, rawTagName = '!--') {
10
+ super(parentNode, range);
11
+ this.rawText = rawText;
12
+ this.rawTagName = rawTagName;
13
+ }
14
+ nodeType = NodeType.COMMENT_NODE;
15
+ get text() {
16
+ return this.rawText;
17
+ }
18
+ toString() {
19
+ return `<!--${this.rawText}-->`;
20
+ }
21
+ }