recker 1.0.43 → 1.0.44-next.084c2ef

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 (464) 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 +85617 -99560
  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 +163 -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/manifest.d.ts +2 -0
  214. package/dist/browser/seo/rules/manifest.js +621 -0
  215. package/dist/browser/seo/rules/meta.d.ts +2 -0
  216. package/dist/browser/seo/rules/meta.js +805 -0
  217. package/dist/browser/seo/rules/mobile.d.ts +2 -0
  218. package/dist/browser/seo/rules/mobile.js +161 -0
  219. package/dist/browser/seo/rules/performance.d.ts +2 -0
  220. package/dist/browser/seo/rules/performance.js +738 -0
  221. package/dist/browser/seo/rules/pwa.d.ts +2 -0
  222. package/dist/browser/seo/rules/pwa.js +299 -0
  223. package/dist/browser/seo/rules/readability.d.ts +2 -0
  224. package/dist/browser/seo/rules/readability.js +264 -0
  225. package/dist/browser/seo/rules/redirects.d.ts +16 -0
  226. package/dist/browser/seo/rules/redirects.js +199 -0
  227. package/dist/browser/seo/rules/resources.d.ts +2 -0
  228. package/dist/browser/seo/rules/resources.js +390 -0
  229. package/dist/browser/seo/rules/schema.d.ts +2 -0
  230. package/dist/browser/seo/rules/schema.js +379 -0
  231. package/dist/browser/seo/rules/security.d.ts +2 -0
  232. package/dist/browser/seo/rules/security.js +877 -0
  233. package/dist/browser/seo/rules/social.d.ts +2 -0
  234. package/dist/browser/seo/rules/social.js +603 -0
  235. package/dist/browser/seo/rules/structural.d.ts +2 -0
  236. package/dist/browser/seo/rules/structural.js +223 -0
  237. package/dist/browser/seo/rules/technical-advanced.d.ts +10 -0
  238. package/dist/browser/seo/rules/technical-advanced.js +289 -0
  239. package/dist/browser/seo/rules/technical.d.ts +3 -0
  240. package/dist/browser/seo/rules/technical.js +509 -0
  241. package/dist/browser/seo/rules/thresholds.d.ts +196 -0
  242. package/dist/browser/seo/rules/thresholds.js +118 -0
  243. package/dist/browser/seo/rules/types.d.ts +518 -0
  244. package/dist/browser/seo/rules/types.js +11 -0
  245. package/dist/browser/seo/types.d.ts +211 -0
  246. package/dist/browser/seo/types.js +1 -0
  247. package/dist/browser/transport/curl.d.ts +4 -0
  248. package/dist/browser/transport/curl.js +101 -0
  249. package/dist/browser/transport/undici.js +1 -2
  250. package/dist/browser/transport/worker.d.ts +18 -0
  251. package/dist/browser/transport/worker.js +278 -0
  252. package/dist/browser/types/index.d.ts +4 -1
  253. package/dist/browser/utils/binary-manager.d.ts +4 -0
  254. package/dist/browser/utils/binary-manager.js +72 -0
  255. package/dist/browser/utils/user-agent.js +2 -13
  256. package/dist/cache/indexed-db.d.ts +10 -0
  257. package/dist/cache/indexed-db.js +88 -0
  258. package/dist/cache/service-worker-cache.d.ts +18 -0
  259. package/dist/cache/service-worker-cache.js +103 -0
  260. package/dist/cli/commands/ai.d.ts +2 -0
  261. package/dist/cli/commands/ai.js +162 -0
  262. package/dist/cli/commands/bench.d.ts +2 -0
  263. package/dist/cli/commands/bench.js +51 -0
  264. package/dist/cli/commands/dns.d.ts +2 -0
  265. package/dist/cli/commands/dns.js +295 -0
  266. package/dist/cli/commands/har.d.ts +2 -0
  267. package/dist/cli/commands/har.js +171 -0
  268. package/dist/cli/commands/hls.d.ts +2 -0
  269. package/dist/cli/commands/hls.js +192 -0
  270. package/dist/cli/commands/network.d.ts +2 -0
  271. package/dist/cli/commands/network.js +288 -0
  272. package/dist/cli/commands/protocols.d.ts +2 -0
  273. package/dist/cli/commands/protocols.js +344 -0
  274. package/dist/cli/commands/scrape.d.ts +2 -0
  275. package/dist/cli/commands/scrape.js +176 -0
  276. package/dist/cli/commands/security.d.ts +2 -0
  277. package/dist/cli/commands/security.js +57 -0
  278. package/dist/cli/commands/seo.d.ts +2 -0
  279. package/dist/cli/commands/seo.js +125 -0
  280. package/dist/cli/commands/serve.d.ts +2 -0
  281. package/dist/cli/commands/serve.js +531 -0
  282. package/dist/cli/commands/spider.d.ts +3 -0
  283. package/dist/cli/commands/spider.js +478 -0
  284. package/dist/cli/commands/utils.d.ts +2 -0
  285. package/dist/cli/commands/utils.js +176 -0
  286. package/dist/cli/commands/vector.d.ts +2 -0
  287. package/dist/cli/commands/vector.js +158 -0
  288. package/dist/cli/handler.d.ts +2 -2
  289. package/dist/cli/handler.js +6 -6
  290. package/dist/cli/helpers.d.ts +7 -0
  291. package/dist/cli/helpers.js +128 -0
  292. package/dist/cli/index.js +96 -5228
  293. package/dist/cli/parser/help.d.ts +2 -0
  294. package/dist/cli/parser/help.js +52 -0
  295. package/dist/cli/parser/index.d.ts +3 -0
  296. package/dist/cli/parser/index.js +3 -0
  297. package/dist/cli/parser/parser.d.ts +4 -0
  298. package/dist/cli/parser/parser.js +146 -0
  299. package/dist/cli/parser/types.d.ts +41 -0
  300. package/dist/cli/parser/types.js +1 -0
  301. package/dist/cli/presets.d.ts +1 -1
  302. package/dist/cli/presets.js +1 -1
  303. package/dist/cli/router.d.ts +36 -0
  304. package/dist/cli/router.js +195 -0
  305. package/dist/cli/tui/ai-chat.js +1 -1
  306. package/dist/cli/tui/commands/context.d.ts +9 -0
  307. package/dist/cli/tui/commands/context.js +1 -0
  308. package/dist/cli/tui/commands/dns.d.ts +10 -0
  309. package/dist/cli/tui/commands/dns.js +461 -0
  310. package/dist/cli/tui/commands/hls.d.ts +2 -0
  311. package/dist/cli/tui/commands/hls.js +162 -0
  312. package/dist/cli/tui/commands/ip.d.ts +2 -0
  313. package/dist/cli/tui/commands/ip.js +45 -0
  314. package/dist/cli/tui/commands/network.d.ts +3 -0
  315. package/dist/cli/tui/commands/network.js +81 -0
  316. package/dist/cli/tui/commands/protocols.d.ts +6 -0
  317. package/dist/cli/tui/commands/protocols.js +531 -0
  318. package/dist/cli/tui/commands/security.d.ts +2 -0
  319. package/dist/cli/tui/commands/security.js +48 -0
  320. package/dist/cli/tui/commands/seo.d.ts +2 -0
  321. package/dist/cli/tui/commands/seo.js +74 -0
  322. package/dist/cli/tui/context.d.ts +12 -0
  323. package/dist/cli/tui/context.js +1 -0
  324. package/dist/cli/tui/shell.d.ts +11 -20
  325. package/dist/cli/tui/shell.js +216 -1873
  326. package/dist/constants/user-agents.d.ts +7 -0
  327. package/dist/constants/user-agents.js +7 -0
  328. package/dist/core/client.d.ts +2 -0
  329. package/dist/core/client.js +19 -1
  330. package/dist/index.d.ts +1 -0
  331. package/dist/index.js +1 -0
  332. package/dist/mcp/cli.js +2 -3
  333. package/dist/mcp/data/embeddings.json +1 -1
  334. package/dist/mcp/tools/network.js +298 -158
  335. package/dist/plugins/har-player.d.ts +23 -0
  336. package/dist/plugins/har-player.js +49 -0
  337. package/dist/plugins/har-recorder.d.ts +37 -3
  338. package/dist/plugins/har-recorder.js +116 -63
  339. package/dist/plugins/network-simulation.d.ts +7 -0
  340. package/dist/plugins/network-simulation.js +13 -0
  341. package/dist/presets/android.d.ts +2 -0
  342. package/dist/presets/android.js +16 -0
  343. package/dist/presets/chaturbate.d.ts +2 -0
  344. package/dist/presets/chaturbate.js +17 -0
  345. package/dist/presets/elevenlabs.d.ts +6 -0
  346. package/dist/presets/elevenlabs.js +20 -0
  347. package/dist/presets/enhancers.d.ts +20 -0
  348. package/dist/presets/enhancers.js +85 -0
  349. package/dist/presets/hubspot.d.ts +9 -0
  350. package/dist/presets/hubspot.js +28 -0
  351. package/dist/presets/index.d.ts +10 -0
  352. package/dist/presets/index.js +10 -0
  353. package/dist/presets/ios.d.ts +2 -0
  354. package/dist/presets/ios.js +13 -0
  355. package/dist/presets/pinecone.d.ts +8 -0
  356. package/dist/presets/pinecone.js +42 -0
  357. package/dist/presets/registry.js +60 -0
  358. package/dist/presets/sendgrid.d.ts +6 -0
  359. package/dist/presets/sendgrid.js +20 -0
  360. package/dist/presets/sentry.d.ts +11 -0
  361. package/dist/presets/sentry.js +48 -0
  362. package/dist/presets/square.d.ts +10 -0
  363. package/dist/presets/square.js +33 -0
  364. package/dist/recker.d.ts +3 -0
  365. package/dist/recker.js +4 -0
  366. package/dist/scrape/document.d.ts +5 -4
  367. package/dist/scrape/document.js +89 -76
  368. package/dist/scrape/element.d.ts +10 -8
  369. package/dist/scrape/element.js +295 -81
  370. package/dist/scrape/extractors.d.ts +11 -11
  371. package/dist/scrape/extractors.js +145 -113
  372. package/dist/scrape/index.d.ts +2 -0
  373. package/dist/scrape/index.js +1 -0
  374. package/dist/scrape/parser/back.d.ts +1 -0
  375. package/dist/scrape/parser/back.js +3 -0
  376. package/dist/scrape/parser/index.d.ts +20 -0
  377. package/dist/scrape/parser/index.js +19 -0
  378. package/dist/scrape/parser/matcher.d.ts +30 -0
  379. package/dist/scrape/parser/matcher.js +99 -0
  380. package/dist/scrape/parser/nodes/comment.d.ts +12 -0
  381. package/dist/scrape/parser/nodes/comment.js +21 -0
  382. package/dist/scrape/parser/nodes/html.d.ts +110 -0
  383. package/dist/scrape/parser/nodes/html.js +978 -0
  384. package/dist/scrape/parser/nodes/node.d.ts +18 -0
  385. package/dist/scrape/parser/nodes/node.js +31 -0
  386. package/dist/scrape/parser/nodes/text.d.ts +14 -0
  387. package/dist/scrape/parser/nodes/text.js +30 -0
  388. package/dist/scrape/parser/nodes/type.d.ts +6 -0
  389. package/dist/scrape/parser/nodes/type.js +7 -0
  390. package/dist/scrape/parser/parse.d.ts +1 -0
  391. package/dist/scrape/parser/parse.js +1 -0
  392. package/dist/scrape/parser/valid.d.ts +2 -0
  393. package/dist/scrape/parser/valid.js +5 -0
  394. package/dist/scrape/parser/void-tag.d.ts +7 -0
  395. package/dist/scrape/parser/void-tag.js +43 -0
  396. package/dist/scrape/spider.d.ts +19 -0
  397. package/dist/scrape/spider.js +28 -3
  398. package/dist/scrape/types.d.ts +7 -0
  399. package/dist/seo/analyzer.d.ts +15 -5
  400. package/dist/seo/analyzer.js +636 -175
  401. package/dist/seo/formatter.d.ts +16 -0
  402. package/dist/seo/formatter.js +228 -0
  403. package/dist/seo/index.d.ts +2 -0
  404. package/dist/seo/index.js +1 -0
  405. package/dist/seo/keywords.d.ts +16 -0
  406. package/dist/seo/keywords.js +55 -0
  407. package/dist/seo/rules/accessibility.js +96 -57
  408. package/dist/seo/rules/ai-search.js +44 -31
  409. package/dist/seo/rules/analytics.d.ts +2 -0
  410. package/dist/seo/rules/analytics.js +306 -0
  411. package/dist/seo/rules/best-practices.js +21 -14
  412. package/dist/seo/rules/canonical.js +53 -32
  413. package/dist/seo/rules/content.js +317 -31
  414. package/dist/seo/rules/crawl.js +55 -40
  415. package/dist/seo/rules/cwv.js +21 -15
  416. package/dist/seo/rules/ecommerce.js +82 -22
  417. package/dist/seo/rules/i18n.js +75 -36
  418. package/dist/seo/rules/images.js +109 -30
  419. package/dist/seo/rules/index.js +7 -1
  420. package/dist/seo/rules/internal-linking.js +58 -39
  421. package/dist/seo/rules/links.js +79 -52
  422. package/dist/seo/rules/local.js +49 -25
  423. package/dist/seo/rules/manifest.d.ts +2 -0
  424. package/dist/seo/rules/manifest.js +621 -0
  425. package/dist/seo/rules/meta.js +339 -81
  426. package/dist/seo/rules/mobile.js +112 -2
  427. package/dist/seo/rules/performance.js +434 -66
  428. package/dist/seo/rules/pwa.js +36 -39
  429. package/dist/seo/rules/readability.js +31 -22
  430. package/dist/seo/rules/redirects.js +21 -15
  431. package/dist/seo/rules/resources.js +59 -42
  432. package/dist/seo/rules/schema.js +333 -8
  433. package/dist/seo/rules/security.js +142 -80
  434. package/dist/seo/rules/social.js +277 -47
  435. package/dist/seo/rules/structural.js +87 -19
  436. package/dist/seo/rules/technical-advanced.js +30 -24
  437. package/dist/seo/rules/technical.d.ts +1 -0
  438. package/dist/seo/rules/technical.js +272 -42
  439. package/dist/seo/rules/types.d.ts +74 -2
  440. package/dist/seo/seo-spider.d.ts +35 -0
  441. package/dist/seo/seo-spider.js +152 -13
  442. package/dist/seo/types.d.ts +8 -1
  443. package/dist/seo/validators/llms-txt.js +19 -0
  444. package/dist/seo/validators/rss.d.ts +11 -0
  445. package/dist/seo/validators/rss.js +93 -0
  446. package/dist/seo/validators/sitemap.js +36 -26
  447. package/dist/transport/curl.d.ts +4 -0
  448. package/dist/transport/curl.js +101 -0
  449. package/dist/transport/udp.js +0 -1
  450. package/dist/transport/undici.js +1 -2
  451. package/dist/transport/worker.d.ts +18 -0
  452. package/dist/transport/worker.js +278 -0
  453. package/dist/types/index.d.ts +4 -1
  454. package/dist/utils/binary-manager.d.ts +4 -0
  455. package/dist/utils/binary-manager.js +72 -0
  456. package/dist/utils/optional-require.d.ts +7 -8
  457. package/dist/utils/optional-require.js +2 -21
  458. package/dist/utils/upload.d.ts +6 -0
  459. package/dist/utils/upload.js +11 -0
  460. package/dist/utils/user-agent.js +2 -13
  461. package/dist/version.js +1 -1
  462. package/package.json +12 -6
  463. package/dist/browser/utils/optional-require.d.ts +0 -19
  464. package/dist/browser/utils/optional-require.js +0 -105
@@ -0,0 +1,288 @@
1
+ import colors from '../../utils/colors.js';
2
+ import { RekArgs, generateHelp } from '../parser/index.js';
3
+ const ipSchema = {
4
+ name: 'ip',
5
+ description: 'Look up geolocation and ISP info for an IP address.\nUses local MaxMind GeoLite2 database (downloaded automatically).',
6
+ examples: [
7
+ { cmd: 'rek ip 8.8.8.8', desc: 'Google DNS' },
8
+ { cmd: 'rek ip 1.1.1.1', desc: 'Cloudflare DNS' }
9
+ ]
10
+ };
11
+ const tlsSchema = {
12
+ name: 'tls',
13
+ description: 'Inspect TLS/SSL certificate of a host.\nShows issuer, validity, fingerprints, and subject alternative names.',
14
+ examples: [
15
+ { cmd: 'rek tls google.com', desc: 'Inspect Google cert' },
16
+ { cmd: 'rek tls example.com 8443', desc: 'Custom port' },
17
+ { cmd: 'rek tls 192.168.1.1', desc: 'Check IP directly' }
18
+ ]
19
+ };
20
+ const whoisSchema = {
21
+ name: 'whois',
22
+ description: 'Look up domain registration and ownership info.\nQueries WHOIS servers for registrar, dates, and nameservers.',
23
+ flags: {
24
+ raw: { description: 'Show raw WHOIS response', default: false }
25
+ },
26
+ examples: [
27
+ { cmd: 'rek whois github.com', desc: 'Domain info' },
28
+ { cmd: 'rek whois google.com --raw', desc: 'Raw response' }
29
+ ]
30
+ };
31
+ const rdapSchema = {
32
+ name: 'rdap',
33
+ description: 'RDAP lookup (modern WHOIS with JSON).\nStandardized replacement for WHOIS with structured data.',
34
+ examples: [
35
+ { cmd: 'rek rdap github.com', desc: 'Domain info' }
36
+ ]
37
+ };
38
+ const pingSchema = {
39
+ name: 'ping',
40
+ description: 'Test TCP connectivity to host:port.\nMeasures connection latency (not ICMP).',
41
+ params: {
42
+ count: { type: 'number', default: 4, description: 'Number of pings' }
43
+ },
44
+ examples: [
45
+ { cmd: 'rek ping google.com', desc: 'Test HTTPS (443)' },
46
+ { cmd: 'rek ping google.com 80', desc: 'Test HTTP (80)' },
47
+ { cmd: 'rek ping redis.local 6379 count=10', desc: '10 pings to Redis' }
48
+ ]
49
+ };
50
+ export function registerNetworkCommands(program) {
51
+ program.command('ip').alias('geo').alias('geoip')
52
+ .description('Look up geolocation and ISP info for an IP address')
53
+ .argument('<address>', 'IP address to lookup')
54
+ .addHelpText('after', generateHelp(ipSchema))
55
+ .action(async (address) => {
56
+ const { getIpInfo, isGeoIPAvailable } = await import('../../mcp/ip-intel.js');
57
+ if (!isGeoIPAvailable()) {
58
+ console.log(colors.gray(`Downloading GeoLite2 database...`));
59
+ }
60
+ try {
61
+ const info = await getIpInfo(address);
62
+ if (info.bogon) {
63
+ console.log(colors.yellow(`\n⚠ ${address} is a Bogon/Private IP.`));
64
+ console.log(colors.gray(` Type: ${info.bogonType}`));
65
+ return;
66
+ }
67
+ console.log(`
68
+ ${colors.bold(colors.cyan('🌍 IP Intelligence Report'))}
69
+
70
+ ${colors.bold('Location:')}
71
+ ${colors.gray('City:')} ${info.city || 'N/A'}
72
+ ${colors.gray('Region:')} ${info.region || 'N/A'}
73
+ ${colors.gray('Country:')} ${info.country || 'N/A'} ${info.countryCode ? `(${info.countryCode})` : ''}
74
+ ${colors.gray('Continent:')} ${info.continent || 'N/A'}
75
+ ${colors.gray('Timezone:')} ${info.timezone || 'N/A'}
76
+ ${colors.gray('Coords:')} ${info.loc ? colors.cyan(info.loc) : 'N/A'}
77
+ ${colors.gray('Accuracy:')} ${info.accuracy ? `~${info.accuracy} km` : 'N/A'}
78
+
79
+ ${colors.bold('Network:')}
80
+ ${colors.gray('IP:')} ${info.ip}
81
+ ${colors.gray('Type:')} ${info.isIPv6 ? 'IPv6' : 'IPv4'}
82
+ ${colors.gray('Postal:')} ${info.postal || 'N/A'}
83
+ `);
84
+ }
85
+ catch (err) {
86
+ console.error(colors.red(`IP Lookup Failed: ${err.message}`));
87
+ process.exit(1);
88
+ }
89
+ });
90
+ program.command('tls').alias('ssl').alias('cert')
91
+ .description('Inspect TLS/SSL certificate of a host')
92
+ .argument('<host>', 'Hostname or IP address')
93
+ .argument('[port]', 'Port number (default: 443)', '443')
94
+ .addHelpText('after', generateHelp(tlsSchema))
95
+ .action(async (host, port) => {
96
+ const { inspectTLS } = await import('../../utils/tls-inspector.js');
97
+ console.log(colors.gray(`Inspecting TLS certificate for ${host}:${port}...`));
98
+ try {
99
+ const info = await inspectTLS(host, parseInt(port));
100
+ let daysColor = colors.green;
101
+ if (info.daysRemaining < 30)
102
+ daysColor = colors.red;
103
+ else if (info.daysRemaining < 90)
104
+ daysColor = colors.yellow;
105
+ const validIcon = info.valid ? colors.green('✔ Valid') : colors.red('✖ Expired');
106
+ const authIcon = info.authorized ? colors.green('✔ Trusted') : colors.yellow('⚠ Self-signed/Untrusted');
107
+ console.log(`
108
+ ${colors.bold(colors.cyan('🔒 TLS Certificate Report'))}
109
+
110
+ ${colors.bold('Status:')}
111
+ ${validIcon}
112
+ ${authIcon}
113
+ ${colors.gray('Days Remaining:')} ${daysColor(info.daysRemaining.toString())}
114
+
115
+ ${colors.bold('Certificate:')}
116
+ ${colors.gray('Subject:')} ${info.subject?.CN || info.subject?.O || 'N/A'}
117
+ ${colors.gray('Issuer:')} ${info.issuer?.CN || info.issuer?.O || 'N/A'}
118
+ ${colors.gray('Valid From:')} ${info.validFrom.toISOString().split('T')[0]}
119
+ ${colors.gray('Valid To:')} ${info.validTo.toISOString().split('T')[0]}
120
+ ${colors.gray('Serial:')} ${info.serialNumber}
121
+
122
+ ${colors.bold('Security:')}
123
+ ${colors.gray('Protocol:')} ${info.protocol || 'N/A'}
124
+ ${colors.gray('Cipher:')} ${info.cipher?.name || 'N/A'}
125
+ ${colors.gray('Key:')} ${info.pubkey ? `${info.pubkey.algo.toUpperCase()} ${info.pubkey.size}-bit` : 'N/A'}
126
+
127
+ ${colors.bold('Fingerprints:')}
128
+ ${colors.gray('SHA-1:')} ${info.fingerprint}
129
+ ${colors.gray('SHA-256:')} ${info.fingerprint256?.slice(0, 40)}...
130
+ `);
131
+ if (info.altNames && info.altNames.length > 0) {
132
+ console.log(`${colors.bold('Subject Alternative Names:')}`);
133
+ info.altNames.slice(0, 10).forEach(san => console.log(` ${colors.gray('•')} ${san}`));
134
+ if (info.altNames.length > 10)
135
+ console.log(` ${colors.gray(`... and ${info.altNames.length - 10} more`)}`);
136
+ console.log('');
137
+ }
138
+ }
139
+ catch (err) {
140
+ console.error(colors.red(`TLS Inspection Failed: ${err.message}`));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ program.command('whois')
145
+ .description('Look up domain registration and ownership info')
146
+ .argument('<query>', 'Domain name or IP address')
147
+ .argument('[args...]', 'Options: raw')
148
+ .addHelpText('after', generateHelp(whoisSchema))
149
+ .action(async (query, rawArgs) => {
150
+ const { options } = RekArgs.parse(rawArgs, whoisSchema);
151
+ const { whois } = await import('../../utils/whois.js');
152
+ console.log(colors.gray(`Looking up WHOIS for ${query}...`));
153
+ try {
154
+ const result = await whois(query);
155
+ if (options.raw) {
156
+ console.log(result.raw);
157
+ return;
158
+ }
159
+ console.log(`
160
+ ${colors.bold(colors.cyan('📋 WHOIS Report'))}
161
+
162
+ ${colors.bold('Query:')} ${result.query}
163
+ ${colors.bold('Server:')} ${result.server}
164
+ `);
165
+ if (result.data && Object.keys(result.data).length > 0) {
166
+ console.log(colors.bold('Parsed Data:'));
167
+ const importantKeys = ['Domain Name', 'Registrar', 'Creation Date', 'Expiration Date', 'Updated Date', 'Name Server', 'Status'];
168
+ for (const key of importantKeys) {
169
+ const value = result.data[key];
170
+ if (value) {
171
+ if (Array.isArray(value)) {
172
+ console.log(` ${colors.cyan(key)}:`);
173
+ value.forEach((v) => console.log(` ${colors.gray('•')} ${v}`));
174
+ }
175
+ else {
176
+ console.log(` ${colors.cyan(key)}: ${value}`);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ console.log('');
182
+ }
183
+ catch (err) {
184
+ console.error(colors.red(`WHOIS Lookup Failed: ${err.message}`));
185
+ process.exit(1);
186
+ }
187
+ });
188
+ program.command('rdap')
189
+ .description('RDAP lookup (modern WHOIS with JSON)')
190
+ .argument('<domain>', 'Domain name to lookup')
191
+ .addHelpText('after', generateHelp(rdapSchema))
192
+ .action(async (domain) => {
193
+ const { rdap } = await import('../../utils/rdap.js');
194
+ const { Client } = await import('../../core/client.js');
195
+ console.log(colors.gray(`Looking up RDAP for ${domain}...`));
196
+ try {
197
+ const client = new Client();
198
+ const result = await rdap(client, domain);
199
+ console.log(`
200
+ ${colors.bold(colors.cyan('📋 RDAP Report'))}
201
+
202
+ ${colors.bold('Domain:')} ${result.ldhName || domain}
203
+ ${colors.bold('Handle:')} ${result.handle || 'N/A'}
204
+ ${colors.bold('Status:')} ${result.status?.join(', ') || 'N/A'}
205
+ `);
206
+ if (result.events?.length) {
207
+ console.log(`${colors.bold('Events:')}`);
208
+ result.events.forEach((event) => {
209
+ const date = event.eventDate ? new Date(event.eventDate).toISOString().split('T')[0] : 'N/A';
210
+ console.log(` ${colors.gray(event.eventAction + ':')} ${date}`);
211
+ });
212
+ console.log('');
213
+ }
214
+ if (result.entities?.length) {
215
+ console.log(`${colors.bold('Entities:')}`);
216
+ result.entities.slice(0, 5).forEach((entity) => {
217
+ const roles = entity.roles?.join(', ') || 'N/A';
218
+ console.log(` ${colors.gray(roles + ':')} ${entity.handle || 'Unknown'}`);
219
+ });
220
+ console.log('');
221
+ }
222
+ }
223
+ catch (err) {
224
+ console.error(colors.red(`RDAP Lookup Failed: ${err.message}`));
225
+ process.exit(1);
226
+ }
227
+ });
228
+ program.command('ping')
229
+ .description('Test TCP connectivity to host:port')
230
+ .argument('<host>', 'Hostname or IP address')
231
+ .argument('[args...]', 'Port and options: [port] count=4')
232
+ .addHelpText('after', generateHelp(pingSchema))
233
+ .action(async (host, rawArgs) => {
234
+ const { data, args: posArgs } = RekArgs.parse(rawArgs, pingSchema);
235
+ const net = await import('node:net');
236
+ let port = 443;
237
+ if (posArgs.length > 0 && typeof posArgs[0] === 'number') {
238
+ port = posArgs[0];
239
+ }
240
+ else if (posArgs.length > 0 && /^\d+$/.test(String(posArgs[0]))) {
241
+ port = parseInt(String(posArgs[0]));
242
+ }
243
+ const count = data.count || 4;
244
+ const results = [];
245
+ console.log(colors.gray(`Pinging ${host}:${port}...`));
246
+ console.log('');
247
+ for (let i = 0; i < count; i++) {
248
+ const start = performance.now();
249
+ try {
250
+ await new Promise((resolve, reject) => {
251
+ const socket = net.connect(port, host, () => {
252
+ socket.destroy();
253
+ resolve();
254
+ });
255
+ socket.setTimeout(5000);
256
+ socket.on('timeout', () => {
257
+ socket.destroy();
258
+ reject(new Error('Timeout'));
259
+ });
260
+ socket.on('error', reject);
261
+ });
262
+ const elapsed = performance.now() - start;
263
+ results.push(elapsed);
264
+ console.log(`${colors.green('✔')} Connected to ${host}:${port} - ${colors.cyan(elapsed.toFixed(2) + 'ms')}`);
265
+ }
266
+ catch (err) {
267
+ console.log(`${colors.red('✖')} Failed to connect: ${err.message}`);
268
+ }
269
+ if (i < count - 1) {
270
+ await new Promise(r => setTimeout(r, 1000));
271
+ }
272
+ }
273
+ if (results.length > 0) {
274
+ const avg = results.reduce((a, b) => a + b, 0) / results.length;
275
+ const min = Math.min(...results);
276
+ const max = Math.max(...results);
277
+ console.log(`
278
+ ${colors.bold('Statistics:')}
279
+ ${colors.gray('Sent:')} ${count}
280
+ ${colors.gray('Received:')} ${results.length}
281
+ ${colors.gray('Lost:')} ${count - results.length} (${((count - results.length) / count * 100).toFixed(0)}%)
282
+ ${colors.gray('Min:')} ${min.toFixed(2)}ms
283
+ ${colors.gray('Avg:')} ${avg.toFixed(2)}ms
284
+ ${colors.gray('Max:')} ${max.toFixed(2)}ms
285
+ `);
286
+ }
287
+ });
288
+ }
@@ -0,0 +1,2 @@
1
+ import { RekCommand as Command } from '../router.js';
2
+ export declare function registerProtocolCommands(program: Command): void;
@@ -0,0 +1,344 @@
1
+ import colors from '../../utils/colors.js';
2
+ import { RekArgs, generateHelp } from '../parser/index.js';
3
+ import { promises as fs } from 'node:fs';
4
+ import pathMod from 'node:path';
5
+ const ftpSchema = {
6
+ name: 'ftp',
7
+ description: 'FTP client operations',
8
+ params: {
9
+ user: { type: 'string', default: 'anonymous', description: 'Username' },
10
+ pass: { type: 'string', default: 'anonymous@', description: 'Password' },
11
+ port: { type: 'number', default: 21, description: 'Port' },
12
+ },
13
+ flags: {
14
+ secure: { description: 'Use FTPS (explicit TLS)', default: false },
15
+ implicit: { description: 'Use implicit FTPS (port 990)', default: false }
16
+ },
17
+ examples: [
18
+ { cmd: 'rek ftp ls ftp.example.com', desc: 'List files' },
19
+ { cmd: 'rek ftp get ftp.example.com /file.txt', desc: 'Download file' }
20
+ ]
21
+ };
22
+ const telnetSchema = {
23
+ name: 'telnet',
24
+ description: 'Connect to a Telnet server',
25
+ params: {
26
+ timeout: { type: 'number', default: 30000, description: 'Timeout in ms' }
27
+ },
28
+ examples: [
29
+ { cmd: 'rek telnet towel.blinkenlights.nl', desc: 'Star Wars' },
30
+ { cmd: 'rek telnet localhost 23', desc: 'Local server' }
31
+ ]
32
+ };
33
+ const graphqlSchema = {
34
+ name: 'graphql',
35
+ description: 'Execute GraphQL queries and mutations',
36
+ params: {
37
+ query: { type: 'string', description: 'Inline query' },
38
+ file: { type: 'string', description: 'Query file path' },
39
+ variables: { type: 'json', description: 'Variables JSON' },
40
+ 'var-file': { type: 'string', description: 'Variables file path' }
41
+ },
42
+ examples: [
43
+ { cmd: 'rek graphql api.com/graphql query="{ me { name } }"', desc: 'Simple query' }
44
+ ]
45
+ };
46
+ const jsonRpcSchema = {
47
+ name: 'jsonrpc',
48
+ description: 'Make JSON-RPC 2.0 calls',
49
+ params: {
50
+ method: { type: 'string', description: 'RPC Method' },
51
+ params: { type: 'json', description: 'RPC Params (array or object)' }
52
+ },
53
+ examples: [
54
+ { cmd: 'rek jsonrpc api.com/rpc method=sum params=[1,2]', desc: 'Call method' }
55
+ ]
56
+ };
57
+ const soapSchema = {
58
+ name: 'soap',
59
+ description: 'Make a SOAP request',
60
+ params: {
61
+ namespace: { type: 'string', description: 'SOAP namespace' },
62
+ envelope: { type: 'string', default: '1.1', description: 'SOAP envelope version' },
63
+ },
64
+ examples: [
65
+ { cmd: 'rek soap api.com/ws GetWeather city="New York"', desc: 'SOAP Action' }
66
+ ]
67
+ };
68
+ const odataSchema = {
69
+ name: 'odata',
70
+ description: 'Query an OData service',
71
+ params: {
72
+ select: { type: 'string', description: 'Select fields' },
73
+ filter: { type: 'string', description: 'Filter expression' },
74
+ orderby: { type: 'string', description: 'Order by' },
75
+ top: { type: 'number', description: 'Limit results' },
76
+ skip: { type: 'number', description: 'Skip results' },
77
+ expand: { type: 'string', description: 'Expand navigation' },
78
+ },
79
+ examples: [
80
+ { cmd: 'rek odata api.com/odata Customers top=10', desc: 'Query' }
81
+ ]
82
+ };
83
+ export function registerProtocolCommands(program) {
84
+ const ftpCmd = program.command('ftp')
85
+ .description('FTP client operations')
86
+ .addHelpText('after', generateHelp(ftpSchema));
87
+ ftpCmd.command('ls')
88
+ .description('List files')
89
+ .argument('<host>', 'FTP Host')
90
+ .argument('[args...]', 'Path and options')
91
+ .action(async (host, rawArgs) => {
92
+ const { data, args } = RekArgs.parse(rawArgs, ftpSchema);
93
+ const path = args[0] || '/';
94
+ const secure = data.implicit ? 'implicit' : !!data.secure;
95
+ const { createFTP } = await import('../../protocols/ftp.js');
96
+ const client = createFTP({ host, port: data.port, user: data.user, password: data.pass, secure });
97
+ console.log(colors.gray(`Connecting to ${host}...`));
98
+ try {
99
+ const connectResult = await client.connect();
100
+ if (!connectResult.success)
101
+ throw new Error(connectResult.message);
102
+ console.log(colors.green('Connected'));
103
+ const result = await client.list(path);
104
+ if (!result.success || !result.data)
105
+ throw new Error(result.message);
106
+ console.log(`\n${colors.bold(`Contents of ${path}:`)}\n`);
107
+ for (const item of result.data) {
108
+ const typeChar = item.type === 'directory' ? 'd' : item.type === 'link' ? 'l' : '-';
109
+ const nameColor = item.type === 'directory' ? colors.blue : colors.white;
110
+ console.log(`${typeChar}${item.permissions || 'rwxr-xr-x'} ${item.size.toString().padStart(10)} ${item.rawModifiedAt || ''} ${nameColor(item.name)}`);
111
+ }
112
+ await client.close();
113
+ }
114
+ catch (err) {
115
+ console.error(colors.red(`FTP Error: ${err.message}`));
116
+ process.exit(1);
117
+ }
118
+ });
119
+ ftpCmd.command('get')
120
+ .description('Download file')
121
+ .argument('<host>', 'FTP Host')
122
+ .argument('<remote>', 'Remote path')
123
+ .argument('[args...]', 'Local path and options')
124
+ .action(async (host, remote, rawArgs) => {
125
+ const { data, args } = RekArgs.parse(rawArgs, ftpSchema);
126
+ const local = args[0] || pathMod.basename(remote);
127
+ const secure = data.implicit ? 'implicit' : !!data.secure;
128
+ const { createFTP } = await import('../../protocols/ftp.js');
129
+ const client = createFTP({ host, port: data.port, user: data.user, password: data.pass, secure });
130
+ console.log(colors.gray(`Connecting to ${host}...`));
131
+ try {
132
+ if (!(await client.connect()).success)
133
+ throw new Error('Connection failed');
134
+ console.log(colors.gray(`Downloading ${remote} -> ${local}...`));
135
+ let lastProgress = 0;
136
+ client.progress((p) => {
137
+ if (p.bytesOverall - lastProgress > 100000) {
138
+ process.stdout.write(`\r ${colors.cyan((p.bytesOverall / 1024 / 1024).toFixed(2) + ' MB')} downloaded...`);
139
+ lastProgress = p.bytesOverall;
140
+ }
141
+ });
142
+ const result = await client.download(remote, local);
143
+ console.log('');
144
+ if (!result.success)
145
+ throw new Error(result.message);
146
+ console.log(colors.green(`✔ Downloaded to ${local}`));
147
+ await client.close();
148
+ }
149
+ catch (err) {
150
+ console.error(colors.red(`FTP Error: ${err.message}`));
151
+ process.exit(1);
152
+ }
153
+ });
154
+ ftpCmd.command('put')
155
+ .description('Upload file')
156
+ .argument('<host>', 'FTP Host')
157
+ .argument('<local>', 'Local path')
158
+ .argument('[args...]', 'Remote path and options')
159
+ .action(async (host, local, rawArgs) => {
160
+ const { data, args } = RekArgs.parse(rawArgs, ftpSchema);
161
+ const remote = args[0] || '/' + pathMod.basename(local);
162
+ const secure = data.implicit ? 'implicit' : !!data.secure;
163
+ const { createFTP } = await import('../../protocols/ftp.js');
164
+ const client = createFTP({ host, port: data.port, user: data.user, password: data.pass, secure });
165
+ console.log(colors.gray(`Connecting to ${host}...`));
166
+ try {
167
+ if (!(await client.connect()).success)
168
+ throw new Error('Connection failed');
169
+ console.log(colors.gray(`Uploading ${local} -> ${remote}...`));
170
+ let lastProgress = 0;
171
+ client.progress((p) => {
172
+ if (p.bytesOverall - lastProgress > 100000) {
173
+ process.stdout.write(`\r ${colors.cyan((p.bytesOverall / 1024 / 1024).toFixed(2) + ' MB')} uploaded...`);
174
+ lastProgress = p.bytesOverall;
175
+ }
176
+ });
177
+ const result = await client.upload(local, remote);
178
+ console.log('');
179
+ if (!result.success)
180
+ throw new Error(result.message);
181
+ console.log(colors.green(`✔ Uploaded to ${remote}`));
182
+ await client.close();
183
+ }
184
+ catch (err) {
185
+ console.error(colors.red(`FTP Error: ${err.message}`));
186
+ process.exit(1);
187
+ }
188
+ });
189
+ program.command('telnet')
190
+ .description(telnetSchema.description)
191
+ .argument('<host>', 'Hostname')
192
+ .argument('[args...]', 'Port and options')
193
+ .addHelpText('after', generateHelp(telnetSchema))
194
+ .action(async (host, rawArgs) => {
195
+ const { data, args } = RekArgs.parse(rawArgs, telnetSchema);
196
+ let port = 23;
197
+ if (args.length > 0)
198
+ port = parseInt(String(args[0]));
199
+ const { createTelnet } = await import('../../protocols/telnet.js');
200
+ console.log(colors.gray(`Connecting to ${host}:${port}...`));
201
+ const client = createTelnet({ host, port, timeout: data.timeout });
202
+ try {
203
+ await client.connect();
204
+ console.log(colors.green(`Connected to ${host}:${port}`));
205
+ if (process.stdin.isTTY)
206
+ process.stdin.setRawMode(true);
207
+ process.stdin.resume();
208
+ process.stdin.on('data', async (d) => {
209
+ if (d[0] === 0x03) {
210
+ await client.close();
211
+ process.exit(0);
212
+ }
213
+ await client.send(d.toString());
214
+ });
215
+ client.on('data', (d) => process.stdout.write(d));
216
+ client.on('close', () => process.exit(0));
217
+ client.on('error', (e) => { console.error(colors.red(e.message)); process.exit(1); });
218
+ }
219
+ catch (err) {
220
+ console.error(colors.red(`Telnet Error: ${err.message}`));
221
+ process.exit(1);
222
+ }
223
+ });
224
+ program.command('graphql').alias('gql')
225
+ .description(graphqlSchema.description)
226
+ .argument('<url>', 'GraphQL Endpoint')
227
+ .argument('[args...]', 'Options')
228
+ .addHelpText('after', generateHelp(graphqlSchema))
229
+ .action(async (url, rawArgs) => {
230
+ const { data, headers } = RekArgs.parse(rawArgs, graphqlSchema);
231
+ let query = data.query;
232
+ let variables = data.variables || {};
233
+ if (data.file)
234
+ query = await fs.readFile(data.file, 'utf-8');
235
+ if (data['var-file'])
236
+ variables = JSON.parse(await fs.readFile(data['var-file'], 'utf-8'));
237
+ if (!query) {
238
+ console.error(colors.red('Error: Query is required via query= or file='));
239
+ process.exit(1);
240
+ }
241
+ if (!url.startsWith('http'))
242
+ url = `https://${url}`;
243
+ const { graphql } = await import('../../plugins/graphql.js');
244
+ const { createClient } = await import('../../core/client.js');
245
+ try {
246
+ const client = createClient({ baseUrl: url, headers: { 'Content-Type': 'application/json', ...headers } });
247
+ const result = await graphql(client, query, variables);
248
+ console.log(JSON.stringify(result, null, 2));
249
+ }
250
+ catch (err) {
251
+ console.error(colors.red(`GraphQL Error: ${err.message}`));
252
+ process.exit(1);
253
+ }
254
+ });
255
+ program.command('jsonrpc')
256
+ .description(jsonRpcSchema.description)
257
+ .argument('<url>', 'Endpoint')
258
+ .argument('<method>', 'Method')
259
+ .argument('[args...]', 'Params and options')
260
+ .addHelpText('after', generateHelp(jsonRpcSchema))
261
+ .action(async (url, method, rawArgs) => {
262
+ const { data, headers, args } = RekArgs.parse(rawArgs, jsonRpcSchema);
263
+ let params = data.params;
264
+ if (!params && args.length > 0) {
265
+ params = args;
266
+ }
267
+ if (!url.startsWith('http'))
268
+ url = `https://${url}`;
269
+ const { createJsonRpcClient } = await import('../../plugins/jsonrpc.js');
270
+ const { createClient } = await import('../../core/client.js');
271
+ try {
272
+ const client = createClient({ baseUrl: url, headers });
273
+ const rpc = createJsonRpcClient(client, { endpoint: url });
274
+ const result = await rpc.call(method, params);
275
+ console.log(JSON.stringify(result, null, 2));
276
+ }
277
+ catch (err) {
278
+ console.error(colors.red(`RPC Error: ${err.message}`));
279
+ process.exit(1);
280
+ }
281
+ });
282
+ program.command('soap')
283
+ .description(soapSchema.description)
284
+ .argument('<url>', 'SOAP Endpoint')
285
+ .argument('<action>', 'Action/Operation')
286
+ .argument('[args...]', 'Parameters')
287
+ .addHelpText('after', generateHelp(soapSchema))
288
+ .action(async (url, action, rawArgs) => {
289
+ const { data, headers } = RekArgs.parse(rawArgs, soapSchema);
290
+ if (!url.startsWith('http'))
291
+ url = `https://${url}`;
292
+ const { createClient } = await import('../../core/client.js');
293
+ const { createSoapClient } = await import('../../plugins/soap.js');
294
+ try {
295
+ const httpClient = createClient({ headers });
296
+ const soap = createSoapClient(httpClient, { endpoint: url, namespace: data.namespace });
297
+ const body = { ...data };
298
+ delete body.namespace;
299
+ delete body.envelope;
300
+ const result = await soap.call(action, body);
301
+ console.log(JSON.stringify(result, null, 2));
302
+ }
303
+ catch (err) {
304
+ console.error(colors.red(`SOAP Error: ${err.message}`));
305
+ process.exit(1);
306
+ }
307
+ });
308
+ program.command('odata')
309
+ .description(odataSchema.description)
310
+ .argument('<url>', 'OData Service URL')
311
+ .argument('<entity>', 'Entity Set')
312
+ .argument('[args...]', 'Query Options')
313
+ .addHelpText('after', generateHelp(odataSchema))
314
+ .action(async (url, entity, rawArgs) => {
315
+ const { data, headers } = RekArgs.parse(rawArgs, odataSchema);
316
+ if (!url.startsWith('http'))
317
+ url = `https://${url}`;
318
+ const { createClient } = await import('../../core/client.js');
319
+ const { createODataClient } = await import('../../plugins/odata.js');
320
+ try {
321
+ const httpClient = createClient({ headers });
322
+ const odata = createODataClient(httpClient, { serviceRoot: url });
323
+ let query = odata.query(entity);
324
+ if (data.select)
325
+ query = query.select(...data.select.split(','));
326
+ if (data.filter)
327
+ query = query.filter(data.filter);
328
+ if (data.orderby)
329
+ query = query.orderBy(data.orderby);
330
+ if (data.top)
331
+ query = query.top(data.top);
332
+ if (data.skip)
333
+ query = query.skip(data.skip);
334
+ if (data.expand)
335
+ query = query.expand(data.expand);
336
+ const results = await query.get();
337
+ console.log(JSON.stringify(results, null, 2));
338
+ }
339
+ catch (err) {
340
+ console.error(colors.red(`OData Error: ${err.message}`));
341
+ process.exit(1);
342
+ }
343
+ });
344
+ }
@@ -0,0 +1,2 @@
1
+ import { RekCommand as Command } from '../router.js';
2
+ export declare function registerScrapeCommand(program: Command): void;