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.
- package/README.md +47 -0
- package/dist/bin/recker-linux-x64 +0 -0
- package/dist/bin/recker-macos-x64 +0 -0
- package/dist/bin/recker-win-x64.exe +0 -0
- package/dist/bin/rek.cjs +85152 -100207
- package/dist/browser/ai/adaptive-timeout.d.ts +50 -0
- package/dist/browser/ai/adaptive-timeout.js +208 -0
- package/dist/browser/ai/client.d.ts +22 -0
- package/dist/browser/ai/client.js +294 -0
- package/dist/browser/ai/index.d.ts +14 -0
- package/dist/browser/ai/index.js +11 -0
- package/dist/browser/ai/providers/anthropic.d.ts +63 -0
- package/dist/browser/ai/providers/anthropic.js +370 -0
- package/dist/browser/ai/providers/base.d.ts +48 -0
- package/dist/browser/ai/providers/base.js +150 -0
- package/dist/browser/ai/providers/google.d.ts +59 -0
- package/dist/browser/ai/providers/google.js +305 -0
- package/dist/browser/ai/providers/ollama.d.ts +44 -0
- package/dist/browser/ai/providers/ollama.js +240 -0
- package/dist/browser/ai/providers/openai.d.ts +64 -0
- package/dist/browser/ai/providers/openai.js +298 -0
- package/dist/browser/ai/rate-limiter.d.ts +43 -0
- package/dist/browser/ai/rate-limiter.js +215 -0
- package/dist/browser/ai/vector/index.d.ts +2 -0
- package/dist/browser/ai/vector/index.js +2 -0
- package/dist/browser/ai/vector/similarity.d.ts +2 -0
- package/dist/browser/ai/vector/similarity.js +27 -0
- package/dist/browser/ai/vector/store.d.ts +27 -0
- package/dist/browser/ai/vector/store.js +82 -0
- package/dist/browser/browser/cache.d.ts +2 -40
- package/dist/browser/browser/cache.js +2 -199
- package/dist/browser/browser/index.d.ts +8 -0
- package/dist/browser/browser/index.js +8 -0
- package/dist/browser/browser/recker.d.ts +8 -1
- package/dist/browser/browser/recker.js +8 -2
- package/dist/browser/cache/indexed-db.d.ts +10 -0
- package/dist/browser/cache/indexed-db.js +88 -0
- package/dist/browser/cache/service-worker-cache.d.ts +18 -0
- package/dist/browser/cache/service-worker-cache.js +103 -0
- package/dist/browser/cache.d.ts +2 -40
- package/dist/browser/cache.js +2 -199
- package/dist/browser/constants/user-agents.d.ts +7 -0
- package/dist/browser/constants/user-agents.js +7 -0
- package/dist/browser/core/client.d.ts +2 -0
- package/dist/browser/core/client.js +19 -1
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.js +8 -0
- package/dist/browser/plugins/har-recorder.d.ts +40 -0
- package/dist/browser/plugins/har-recorder.js +120 -0
- package/dist/browser/plugins/network-simulation.d.ts +7 -0
- package/dist/browser/plugins/network-simulation.js +13 -0
- package/dist/browser/presets/android.d.ts +2 -0
- package/dist/browser/presets/android.js +16 -0
- package/dist/browser/presets/anthropic.d.ts +8 -0
- package/dist/browser/presets/anthropic.js +27 -0
- package/dist/browser/presets/aws.d.ts +19 -0
- package/dist/browser/presets/aws.js +68 -0
- package/dist/browser/presets/azure-openai.d.ts +10 -0
- package/dist/browser/presets/azure-openai.js +35 -0
- package/dist/browser/presets/azure.d.ts +41 -0
- package/dist/browser/presets/azure.js +104 -0
- package/dist/browser/presets/chaturbate.d.ts +2 -0
- package/dist/browser/presets/chaturbate.js +17 -0
- package/dist/browser/presets/cloudflare.d.ts +12 -0
- package/dist/browser/presets/cloudflare.js +39 -0
- package/dist/browser/presets/cohere.d.ts +7 -0
- package/dist/browser/presets/cohere.js +22 -0
- package/dist/browser/presets/deepseek.d.ts +7 -0
- package/dist/browser/presets/deepseek.js +22 -0
- package/dist/browser/presets/digitalocean.d.ts +5 -0
- package/dist/browser/presets/digitalocean.js +16 -0
- package/dist/browser/presets/discord.d.ts +6 -0
- package/dist/browser/presets/discord.js +17 -0
- package/dist/browser/presets/elevenlabs.d.ts +6 -0
- package/dist/browser/presets/elevenlabs.js +20 -0
- package/dist/browser/presets/enhancers.d.ts +20 -0
- package/dist/browser/presets/enhancers.js +85 -0
- package/dist/browser/presets/fireworks.d.ts +7 -0
- package/dist/browser/presets/fireworks.js +22 -0
- package/dist/browser/presets/gcp.d.ts +34 -0
- package/dist/browser/presets/gcp.js +91 -0
- package/dist/browser/presets/gemini.d.ts +7 -0
- package/dist/browser/presets/gemini.js +23 -0
- package/dist/browser/presets/github.d.ts +6 -0
- package/dist/browser/presets/github.js +17 -0
- package/dist/browser/presets/gitlab.d.ts +6 -0
- package/dist/browser/presets/gitlab.js +16 -0
- package/dist/browser/presets/groq.d.ts +7 -0
- package/dist/browser/presets/groq.js +22 -0
- package/dist/browser/presets/hubspot.d.ts +9 -0
- package/dist/browser/presets/hubspot.js +28 -0
- package/dist/browser/presets/huggingface.d.ts +7 -0
- package/dist/browser/presets/huggingface.js +23 -0
- package/dist/browser/presets/index.d.ts +47 -0
- package/dist/browser/presets/index.js +47 -0
- package/dist/browser/presets/ios.d.ts +2 -0
- package/dist/browser/presets/ios.js +13 -0
- package/dist/browser/presets/linear.d.ts +5 -0
- package/dist/browser/presets/linear.js +16 -0
- package/dist/browser/presets/mailgun.d.ts +7 -0
- package/dist/browser/presets/mailgun.js +20 -0
- package/dist/browser/presets/meta.d.ts +10 -0
- package/dist/browser/presets/meta.js +33 -0
- package/dist/browser/presets/mistral.d.ts +7 -0
- package/dist/browser/presets/mistral.js +22 -0
- package/dist/browser/presets/notion.d.ts +6 -0
- package/dist/browser/presets/notion.js +17 -0
- package/dist/browser/presets/openai.d.ts +9 -0
- package/dist/browser/presets/openai.js +30 -0
- package/dist/browser/presets/oracle.d.ts +19 -0
- package/dist/browser/presets/oracle.js +117 -0
- package/dist/browser/presets/perplexity.d.ts +7 -0
- package/dist/browser/presets/perplexity.js +22 -0
- package/dist/browser/presets/pinecone.d.ts +8 -0
- package/dist/browser/presets/pinecone.js +42 -0
- package/dist/browser/presets/registry.d.ts +23 -0
- package/dist/browser/presets/registry.js +519 -0
- package/dist/browser/presets/replicate.d.ts +7 -0
- package/dist/browser/presets/replicate.js +23 -0
- package/dist/browser/presets/sendgrid.d.ts +6 -0
- package/dist/browser/presets/sendgrid.js +20 -0
- package/dist/browser/presets/sentry.d.ts +11 -0
- package/dist/browser/presets/sentry.js +48 -0
- package/dist/browser/presets/sinch.d.ts +9 -0
- package/dist/browser/presets/sinch.js +39 -0
- package/dist/browser/presets/slack.d.ts +5 -0
- package/dist/browser/presets/slack.js +16 -0
- package/dist/browser/presets/square.d.ts +10 -0
- package/dist/browser/presets/square.js +33 -0
- package/dist/browser/presets/stripe.d.ts +7 -0
- package/dist/browser/presets/stripe.js +23 -0
- package/dist/browser/presets/supabase.d.ts +6 -0
- package/dist/browser/presets/supabase.js +18 -0
- package/dist/browser/presets/tiktok.d.ts +10 -0
- package/dist/browser/presets/tiktok.js +38 -0
- package/dist/browser/presets/together.d.ts +7 -0
- package/dist/browser/presets/together.js +22 -0
- package/dist/browser/presets/twilio.d.ts +6 -0
- package/dist/browser/presets/twilio.js +17 -0
- package/dist/browser/presets/vercel.d.ts +6 -0
- package/dist/browser/presets/vercel.js +23 -0
- package/dist/browser/presets/vultr.d.ts +5 -0
- package/dist/browser/presets/vultr.js +16 -0
- package/dist/browser/presets/xai.d.ts +8 -0
- package/dist/browser/presets/xai.js +23 -0
- package/dist/browser/presets/youtube.d.ts +5 -0
- package/dist/browser/presets/youtube.js +20 -0
- package/dist/browser/recker.d.ts +8 -1
- package/dist/browser/recker.js +8 -2
- package/dist/browser/scrape/document.d.ts +5 -4
- package/dist/browser/scrape/document.js +89 -76
- package/dist/browser/scrape/element.d.ts +10 -8
- package/dist/browser/scrape/element.js +295 -81
- package/dist/browser/scrape/extractors.d.ts +11 -11
- package/dist/browser/scrape/extractors.js +145 -113
- package/dist/browser/scrape/parser/back.d.ts +1 -0
- package/dist/browser/scrape/parser/back.js +3 -0
- package/dist/browser/scrape/parser/index.d.ts +20 -0
- package/dist/browser/scrape/parser/index.js +19 -0
- package/dist/browser/scrape/parser/matcher.d.ts +30 -0
- package/dist/browser/scrape/parser/matcher.js +99 -0
- package/dist/browser/scrape/parser/nodes/comment.d.ts +12 -0
- package/dist/browser/scrape/parser/nodes/comment.js +21 -0
- package/dist/browser/scrape/parser/nodes/html.d.ts +110 -0
- package/dist/browser/scrape/parser/nodes/html.js +978 -0
- package/dist/browser/scrape/parser/nodes/node.d.ts +18 -0
- package/dist/browser/scrape/parser/nodes/node.js +31 -0
- package/dist/browser/scrape/parser/nodes/text.d.ts +14 -0
- package/dist/browser/scrape/parser/nodes/text.js +30 -0
- package/dist/browser/scrape/parser/nodes/type.d.ts +6 -0
- package/dist/browser/scrape/parser/nodes/type.js +7 -0
- package/dist/browser/scrape/parser/parse.d.ts +1 -0
- package/dist/browser/scrape/parser/parse.js +1 -0
- package/dist/browser/scrape/parser/valid.d.ts +2 -0
- package/dist/browser/scrape/parser/valid.js +5 -0
- package/dist/browser/scrape/parser/void-tag.d.ts +7 -0
- package/dist/browser/scrape/parser/void-tag.js +43 -0
- package/dist/browser/scrape/types.d.ts +7 -0
- package/dist/browser/seo/analyzer.d.ts +59 -0
- package/dist/browser/seo/analyzer.js +1399 -0
- package/dist/browser/seo/keywords.d.ts +16 -0
- package/dist/browser/seo/keywords.js +55 -0
- package/dist/browser/seo/rules/accessibility.d.ts +2 -0
- package/dist/browser/seo/rules/accessibility.js +733 -0
- package/dist/browser/seo/rules/ai-search.d.ts +2 -0
- package/dist/browser/seo/rules/ai-search.js +436 -0
- package/dist/browser/seo/rules/analytics.d.ts +2 -0
- package/dist/browser/seo/rules/analytics.js +306 -0
- package/dist/browser/seo/rules/best-practices.d.ts +2 -0
- package/dist/browser/seo/rules/best-practices.js +195 -0
- package/dist/browser/seo/rules/canonical.d.ts +12 -0
- package/dist/browser/seo/rules/canonical.js +270 -0
- package/dist/browser/seo/rules/content.d.ts +2 -0
- package/dist/browser/seo/rules/content.js +522 -0
- package/dist/browser/seo/rules/crawl.d.ts +2 -0
- package/dist/browser/seo/rules/crawl.js +435 -0
- package/dist/browser/seo/rules/cwv.d.ts +2 -0
- package/dist/browser/seo/rules/cwv.js +248 -0
- package/dist/browser/seo/rules/ecommerce.d.ts +2 -0
- package/dist/browser/seo/rules/ecommerce.js +312 -0
- package/dist/browser/seo/rules/i18n.d.ts +2 -0
- package/dist/browser/seo/rules/i18n.js +288 -0
- package/dist/browser/seo/rules/images.d.ts +2 -0
- package/dist/browser/seo/rules/images.js +255 -0
- package/dist/browser/seo/rules/index.d.ts +52 -0
- package/dist/browser/seo/rules/index.js +159 -0
- package/dist/browser/seo/rules/internal-linking.d.ts +2 -0
- package/dist/browser/seo/rules/internal-linking.js +394 -0
- package/dist/browser/seo/rules/links.d.ts +2 -0
- package/dist/browser/seo/rules/links.js +498 -0
- package/dist/browser/seo/rules/local.d.ts +2 -0
- package/dist/browser/seo/rules/local.js +289 -0
- package/dist/browser/seo/rules/meta.d.ts +2 -0
- package/dist/browser/seo/rules/meta.js +805 -0
- package/dist/browser/seo/rules/mobile.d.ts +2 -0
- package/dist/browser/seo/rules/mobile.js +161 -0
- package/dist/browser/seo/rules/performance.d.ts +2 -0
- package/dist/browser/seo/rules/performance.js +738 -0
- package/dist/browser/seo/rules/pwa.d.ts +2 -0
- package/dist/browser/seo/rules/pwa.js +299 -0
- package/dist/browser/seo/rules/readability.d.ts +2 -0
- package/dist/browser/seo/rules/readability.js +264 -0
- package/dist/browser/seo/rules/redirects.d.ts +16 -0
- package/dist/browser/seo/rules/redirects.js +199 -0
- package/dist/browser/seo/rules/resources.d.ts +2 -0
- package/dist/browser/seo/rules/resources.js +390 -0
- package/dist/browser/seo/rules/schema.d.ts +2 -0
- package/dist/browser/seo/rules/schema.js +379 -0
- package/dist/browser/seo/rules/security.d.ts +2 -0
- package/dist/browser/seo/rules/security.js +877 -0
- package/dist/browser/seo/rules/social.d.ts +2 -0
- package/dist/browser/seo/rules/social.js +603 -0
- package/dist/browser/seo/rules/structural.d.ts +2 -0
- package/dist/browser/seo/rules/structural.js +223 -0
- package/dist/browser/seo/rules/technical-advanced.d.ts +10 -0
- package/dist/browser/seo/rules/technical-advanced.js +289 -0
- package/dist/browser/seo/rules/technical.d.ts +2 -0
- package/dist/browser/seo/rules/technical.js +480 -0
- package/dist/browser/seo/rules/thresholds.d.ts +196 -0
- package/dist/browser/seo/rules/thresholds.js +118 -0
- package/dist/browser/seo/rules/types.d.ts +498 -0
- package/dist/browser/seo/rules/types.js +11 -0
- package/dist/browser/seo/types.d.ts +211 -0
- package/dist/browser/seo/types.js +1 -0
- package/dist/browser/transport/curl.d.ts +4 -0
- package/dist/browser/transport/curl.js +101 -0
- package/dist/browser/transport/undici.js +1 -2
- package/dist/browser/transport/worker.d.ts +18 -0
- package/dist/browser/transport/worker.js +278 -0
- package/dist/browser/types/index.d.ts +4 -1
- package/dist/browser/utils/binary-manager.d.ts +4 -0
- package/dist/browser/utils/binary-manager.js +72 -0
- package/dist/browser/utils/user-agent.js +2 -13
- package/dist/cache/indexed-db.d.ts +10 -0
- package/dist/cache/indexed-db.js +88 -0
- package/dist/cache/service-worker-cache.d.ts +18 -0
- package/dist/cache/service-worker-cache.js +103 -0
- package/dist/cli/commands/ai.d.ts +2 -0
- package/dist/cli/commands/ai.js +162 -0
- package/dist/cli/commands/bench.d.ts +2 -0
- package/dist/cli/commands/bench.js +51 -0
- package/dist/cli/commands/dns.d.ts +2 -0
- package/dist/cli/commands/dns.js +295 -0
- package/dist/cli/commands/har.d.ts +2 -0
- package/dist/cli/commands/har.js +171 -0
- package/dist/cli/commands/hls.d.ts +2 -0
- package/dist/cli/commands/hls.js +192 -0
- package/dist/cli/commands/network.d.ts +2 -0
- package/dist/cli/commands/network.js +288 -0
- package/dist/cli/commands/protocols.d.ts +2 -0
- package/dist/cli/commands/protocols.js +344 -0
- package/dist/cli/commands/scrape.d.ts +2 -0
- package/dist/cli/commands/scrape.js +176 -0
- package/dist/cli/commands/security.d.ts +2 -0
- package/dist/cli/commands/security.js +57 -0
- package/dist/cli/commands/seo.d.ts +2 -0
- package/dist/cli/commands/seo.js +125 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.js +531 -0
- package/dist/cli/commands/spider.d.ts +3 -0
- package/dist/cli/commands/spider.js +456 -0
- package/dist/cli/commands/utils.d.ts +2 -0
- package/dist/cli/commands/utils.js +176 -0
- package/dist/cli/commands/vector.d.ts +2 -0
- package/dist/cli/commands/vector.js +158 -0
- package/dist/cli/handler.d.ts +2 -2
- package/dist/cli/handler.js +6 -6
- package/dist/cli/helpers.d.ts +7 -0
- package/dist/cli/helpers.js +128 -0
- package/dist/cli/index.js +96 -5228
- package/dist/cli/parser/help.d.ts +2 -0
- package/dist/cli/parser/help.js +52 -0
- package/dist/cli/parser/index.d.ts +3 -0
- package/dist/cli/parser/index.js +3 -0
- package/dist/cli/parser/parser.d.ts +4 -0
- package/dist/cli/parser/parser.js +146 -0
- package/dist/cli/parser/types.d.ts +41 -0
- package/dist/cli/parser/types.js +1 -0
- package/dist/cli/presets.d.ts +1 -1
- package/dist/cli/presets.js +1 -1
- package/dist/cli/router.d.ts +36 -0
- package/dist/cli/router.js +195 -0
- package/dist/cli/tui/ai-chat.js +1 -1
- package/dist/cli/tui/commands/context.d.ts +9 -0
- package/dist/cli/tui/commands/context.js +1 -0
- package/dist/cli/tui/commands/dns.d.ts +10 -0
- package/dist/cli/tui/commands/dns.js +461 -0
- package/dist/cli/tui/commands/hls.d.ts +2 -0
- package/dist/cli/tui/commands/hls.js +162 -0
- package/dist/cli/tui/commands/ip.d.ts +2 -0
- package/dist/cli/tui/commands/ip.js +45 -0
- package/dist/cli/tui/commands/network.d.ts +3 -0
- package/dist/cli/tui/commands/network.js +81 -0
- package/dist/cli/tui/commands/protocols.d.ts +6 -0
- package/dist/cli/tui/commands/protocols.js +531 -0
- package/dist/cli/tui/commands/security.d.ts +2 -0
- package/dist/cli/tui/commands/security.js +48 -0
- package/dist/cli/tui/commands/seo.d.ts +2 -0
- package/dist/cli/tui/commands/seo.js +74 -0
- package/dist/cli/tui/context.d.ts +12 -0
- package/dist/cli/tui/context.js +1 -0
- package/dist/cli/tui/shell.d.ts +11 -20
- package/dist/cli/tui/shell.js +216 -1873
- package/dist/constants/user-agents.d.ts +7 -0
- package/dist/constants/user-agents.js +7 -0
- package/dist/core/client.d.ts +2 -0
- package/dist/core/client.js +19 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/mcp/cli.js +2 -3
- package/dist/mcp/data/embeddings.json +1 -1
- package/dist/mcp/tools/network.js +298 -158
- package/dist/plugins/har-player.d.ts +23 -0
- package/dist/plugins/har-player.js +49 -0
- package/dist/plugins/har-recorder.d.ts +37 -3
- package/dist/plugins/har-recorder.js +116 -63
- package/dist/plugins/network-simulation.d.ts +7 -0
- package/dist/plugins/network-simulation.js +13 -0
- package/dist/presets/android.d.ts +2 -0
- package/dist/presets/android.js +16 -0
- package/dist/presets/chaturbate.d.ts +2 -0
- package/dist/presets/chaturbate.js +17 -0
- package/dist/presets/elevenlabs.d.ts +6 -0
- package/dist/presets/elevenlabs.js +20 -0
- package/dist/presets/enhancers.d.ts +20 -0
- package/dist/presets/enhancers.js +85 -0
- package/dist/presets/hubspot.d.ts +9 -0
- package/dist/presets/hubspot.js +28 -0
- package/dist/presets/index.d.ts +10 -0
- package/dist/presets/index.js +10 -0
- package/dist/presets/ios.d.ts +2 -0
- package/dist/presets/ios.js +13 -0
- package/dist/presets/pinecone.d.ts +8 -0
- package/dist/presets/pinecone.js +42 -0
- package/dist/presets/registry.js +60 -0
- package/dist/presets/sendgrid.d.ts +6 -0
- package/dist/presets/sendgrid.js +20 -0
- package/dist/presets/sentry.d.ts +11 -0
- package/dist/presets/sentry.js +48 -0
- package/dist/presets/square.d.ts +10 -0
- package/dist/presets/square.js +33 -0
- package/dist/recker.d.ts +3 -0
- package/dist/recker.js +4 -0
- package/dist/scrape/document.d.ts +5 -4
- package/dist/scrape/document.js +89 -76
- package/dist/scrape/element.d.ts +10 -8
- package/dist/scrape/element.js +295 -81
- package/dist/scrape/extractors.d.ts +11 -11
- package/dist/scrape/extractors.js +145 -113
- package/dist/scrape/index.d.ts +2 -0
- package/dist/scrape/index.js +1 -0
- package/dist/scrape/parser/back.d.ts +1 -0
- package/dist/scrape/parser/back.js +3 -0
- package/dist/scrape/parser/index.d.ts +20 -0
- package/dist/scrape/parser/index.js +19 -0
- package/dist/scrape/parser/matcher.d.ts +30 -0
- package/dist/scrape/parser/matcher.js +99 -0
- package/dist/scrape/parser/nodes/comment.d.ts +12 -0
- package/dist/scrape/parser/nodes/comment.js +21 -0
- package/dist/scrape/parser/nodes/html.d.ts +110 -0
- package/dist/scrape/parser/nodes/html.js +978 -0
- package/dist/scrape/parser/nodes/node.d.ts +18 -0
- package/dist/scrape/parser/nodes/node.js +31 -0
- package/dist/scrape/parser/nodes/text.d.ts +14 -0
- package/dist/scrape/parser/nodes/text.js +30 -0
- package/dist/scrape/parser/nodes/type.d.ts +6 -0
- package/dist/scrape/parser/nodes/type.js +7 -0
- package/dist/scrape/parser/parse.d.ts +1 -0
- package/dist/scrape/parser/parse.js +1 -0
- package/dist/scrape/parser/valid.d.ts +2 -0
- package/dist/scrape/parser/valid.js +5 -0
- package/dist/scrape/parser/void-tag.d.ts +7 -0
- package/dist/scrape/parser/void-tag.js +43 -0
- package/dist/scrape/spider.d.ts +19 -0
- package/dist/scrape/spider.js +28 -3
- package/dist/scrape/types.d.ts +7 -0
- package/dist/seo/analyzer.d.ts +15 -5
- package/dist/seo/analyzer.js +636 -175
- package/dist/seo/formatter.d.ts +16 -0
- package/dist/seo/formatter.js +228 -0
- package/dist/seo/index.d.ts +2 -0
- package/dist/seo/index.js +1 -0
- package/dist/seo/keywords.d.ts +16 -0
- package/dist/seo/keywords.js +55 -0
- package/dist/seo/rules/accessibility.js +96 -57
- package/dist/seo/rules/ai-search.js +44 -31
- package/dist/seo/rules/analytics.d.ts +2 -0
- package/dist/seo/rules/analytics.js +306 -0
- package/dist/seo/rules/best-practices.js +21 -14
- package/dist/seo/rules/canonical.js +53 -32
- package/dist/seo/rules/content.js +317 -31
- package/dist/seo/rules/crawl.js +55 -40
- package/dist/seo/rules/cwv.js +21 -15
- package/dist/seo/rules/ecommerce.js +82 -22
- package/dist/seo/rules/i18n.js +75 -36
- package/dist/seo/rules/images.js +109 -30
- package/dist/seo/rules/index.js +2 -0
- package/dist/seo/rules/internal-linking.js +58 -39
- package/dist/seo/rules/links.js +79 -52
- package/dist/seo/rules/local.js +49 -25
- package/dist/seo/rules/meta.js +339 -81
- package/dist/seo/rules/mobile.js +112 -2
- package/dist/seo/rules/performance.js +434 -66
- package/dist/seo/rules/pwa.js +36 -39
- package/dist/seo/rules/readability.js +31 -22
- package/dist/seo/rules/redirects.js +21 -15
- package/dist/seo/rules/resources.js +59 -42
- package/dist/seo/rules/schema.js +333 -8
- package/dist/seo/rules/security.js +142 -80
- package/dist/seo/rules/social.js +277 -47
- package/dist/seo/rules/structural.js +87 -19
- package/dist/seo/rules/technical-advanced.js +30 -24
- package/dist/seo/rules/technical.js +243 -42
- package/dist/seo/rules/types.d.ts +53 -1
- package/dist/seo/seo-spider.d.ts +22 -0
- package/dist/seo/seo-spider.js +77 -13
- package/dist/seo/types.d.ts +8 -1
- package/dist/seo/validators/llms-txt.js +19 -0
- package/dist/seo/validators/rss.d.ts +11 -0
- package/dist/seo/validators/rss.js +93 -0
- package/dist/seo/validators/sitemap.js +36 -26
- package/dist/transport/curl.d.ts +4 -0
- package/dist/transport/curl.js +101 -0
- package/dist/transport/udp.js +0 -1
- package/dist/transport/undici.js +1 -2
- package/dist/transport/worker.d.ts +18 -0
- package/dist/transport/worker.js +278 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/utils/binary-manager.d.ts +4 -0
- package/dist/utils/binary-manager.js +72 -0
- package/dist/utils/optional-require.d.ts +7 -8
- package/dist/utils/optional-require.js +2 -21
- package/dist/utils/upload.d.ts +6 -0
- package/dist/utils/upload.js +11 -0
- package/dist/utils/user-agent.js +2 -13
- package/dist/version.js +1 -1
- package/package.json +12 -6
- package/dist/browser/utils/optional-require.d.ts +0 -19
- package/dist/browser/utils/optional-require.js +0 -105
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { createResult } from './types.js';
|
|
2
|
+
export const localRules = [
|
|
3
|
+
{
|
|
4
|
+
id: 'local-business-schema',
|
|
5
|
+
name: 'LocalBusiness Schema',
|
|
6
|
+
category: 'structured-data',
|
|
7
|
+
severity: 'info',
|
|
8
|
+
description: 'Local businesses should have LocalBusiness schema',
|
|
9
|
+
check: (ctx) => {
|
|
10
|
+
const localBusinessTypes = [
|
|
11
|
+
'LocalBusiness', 'Restaurant', 'Store', 'MedicalBusiness',
|
|
12
|
+
'FinancialService', 'FoodEstablishment', 'HealthAndBeautyBusiness',
|
|
13
|
+
'HomeAndConstructionBusiness', 'LegalService', 'RealEstateAgent',
|
|
14
|
+
'SportingGoodsStore', 'AutoDealer', 'AutoRepair', 'Bakery',
|
|
15
|
+
'BarOrPub', 'BeautySalon', 'CafeOrCoffeeShop', 'Dentist',
|
|
16
|
+
'DryCleaningOrLaundry', 'Florist', 'GasStation', 'GroceryStore',
|
|
17
|
+
'HairSalon', 'HardwareStore', 'Hospital', 'Hotel', 'InsuranceAgency',
|
|
18
|
+
'LodgingBusiness', 'MovingCompany', 'Pharmacy', 'Physician',
|
|
19
|
+
'PlaceOfWorship', 'Plumber', 'RealEstateAgent', 'ShoppingCenter',
|
|
20
|
+
];
|
|
21
|
+
const hasLocalBusiness = ctx.jsonLdTypes?.some(t => localBusinessTypes.includes(t));
|
|
22
|
+
if (hasLocalBusiness) {
|
|
23
|
+
const foundTypes = ctx.jsonLdTypes.filter(t => localBusinessTypes.includes(t));
|
|
24
|
+
return createResult({ id: 'local-business-schema', name: 'LocalBusiness Schema', category: 'structured-data', severity: 'info' }, 'pass', `LocalBusiness schema found: ${foundTypes.join(', ')}`);
|
|
25
|
+
}
|
|
26
|
+
if (ctx.hasLocalBusinessSignals) {
|
|
27
|
+
return createResult({ id: 'local-business-schema', name: 'LocalBusiness Schema', category: 'structured-data', severity: 'info' }, 'info', 'Page may benefit from LocalBusiness schema', {
|
|
28
|
+
recommendation: 'Add LocalBusiness structured data for local search visibility',
|
|
29
|
+
evidence: {
|
|
30
|
+
expected: 'LocalBusiness schema with name, address, phone, hours',
|
|
31
|
+
example: `{
|
|
32
|
+
"@type": "LocalBusiness",
|
|
33
|
+
"name": "Business Name",
|
|
34
|
+
"address": {
|
|
35
|
+
"@type": "PostalAddress",
|
|
36
|
+
"streetAddress": "123 Main St",
|
|
37
|
+
"addressLocality": "City",
|
|
38
|
+
"addressRegion": "State",
|
|
39
|
+
"postalCode": "12345"
|
|
40
|
+
},
|
|
41
|
+
"telephone": "+1-234-567-8900"
|
|
42
|
+
}`,
|
|
43
|
+
learnMore: 'https://developers.google.com/search/docs/appearance/structured-data/local-business',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return createResult({ id: 'local-business-schema', name: 'LocalBusiness Schema', category: 'structured-data', severity: 'info' }, 'info', 'No LocalBusiness schema detected', {
|
|
48
|
+
recommendation: 'Add LocalBusiness schema if this is a local business page',
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'local-business-address',
|
|
54
|
+
name: 'Business Address',
|
|
55
|
+
category: 'structured-data',
|
|
56
|
+
severity: 'warning',
|
|
57
|
+
description: 'LocalBusiness schema should include complete address',
|
|
58
|
+
check: (ctx) => {
|
|
59
|
+
if (!ctx.localBusinessSchema) {
|
|
60
|
+
return createResult({ id: 'local-business-address', name: 'Business Address', category: 'structured-data', severity: 'warning' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
61
|
+
recommendation: 'Add LocalBusiness schema first, then include address',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const address = ctx.localBusinessSchema.address;
|
|
65
|
+
if (!address) {
|
|
66
|
+
return createResult({ id: 'local-business-address', name: 'Business Address', category: 'structured-data', severity: 'warning' }, 'warn', 'LocalBusiness schema missing address', {
|
|
67
|
+
recommendation: 'Add PostalAddress for Google Maps and local search',
|
|
68
|
+
evidence: {
|
|
69
|
+
expected: 'address with streetAddress, addressLocality, addressRegion, postalCode',
|
|
70
|
+
impact: 'Businesses without address may not appear in local pack results',
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const missingFields = [];
|
|
75
|
+
if (!address.streetAddress)
|
|
76
|
+
missingFields.push('streetAddress');
|
|
77
|
+
if (!address.addressLocality)
|
|
78
|
+
missingFields.push('addressLocality (city)');
|
|
79
|
+
if (!address.addressRegion)
|
|
80
|
+
missingFields.push('addressRegion (state)');
|
|
81
|
+
if (!address.postalCode)
|
|
82
|
+
missingFields.push('postalCode');
|
|
83
|
+
if (missingFields.length > 0) {
|
|
84
|
+
return createResult({ id: 'local-business-address', name: 'Business Address', category: 'structured-data', severity: 'warning' }, 'warn', `Address incomplete: missing ${missingFields.join(', ')}`, {
|
|
85
|
+
recommendation: 'Complete address for better local SEO',
|
|
86
|
+
evidence: {
|
|
87
|
+
found: Object.keys(address).join(', '),
|
|
88
|
+
expected: 'streetAddress, addressLocality, addressRegion, postalCode, addressCountry',
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return createResult({ id: 'local-business-address', name: 'Business Address', category: 'structured-data', severity: 'warning' }, 'pass', 'Complete address in LocalBusiness schema');
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: 'local-business-phone',
|
|
97
|
+
name: 'Business Phone',
|
|
98
|
+
category: 'structured-data',
|
|
99
|
+
severity: 'warning',
|
|
100
|
+
description: 'LocalBusiness schema should include phone number',
|
|
101
|
+
check: (ctx) => {
|
|
102
|
+
if (!ctx.localBusinessSchema) {
|
|
103
|
+
return createResult({ id: 'local-business-phone', name: 'Business Phone', category: 'structured-data', severity: 'warning' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
104
|
+
recommendation: 'Add LocalBusiness schema first, then include phone',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const phone = ctx.localBusinessSchema.telephone;
|
|
108
|
+
if (!phone) {
|
|
109
|
+
return createResult({ id: 'local-business-phone', name: 'Business Phone', category: 'structured-data', severity: 'warning' }, 'warn', 'LocalBusiness schema missing phone number', {
|
|
110
|
+
recommendation: 'Add telephone for click-to-call functionality',
|
|
111
|
+
evidence: {
|
|
112
|
+
expected: 'telephone in E.164 format: +1-234-567-8900',
|
|
113
|
+
impact: 'Phone number is crucial for local search and mobile users',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const phoneStr = String(phone);
|
|
118
|
+
const hasCountryCode = phoneStr.startsWith('+');
|
|
119
|
+
if (!hasCountryCode) {
|
|
120
|
+
return createResult({ id: 'local-business-phone', name: 'Business Phone', category: 'structured-data', severity: 'warning' }, 'info', 'Phone number should include country code', {
|
|
121
|
+
evidence: {
|
|
122
|
+
found: phoneStr,
|
|
123
|
+
expected: 'E.164 format with country code: +1-234-567-8900',
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return createResult({ id: 'local-business-phone', name: 'Business Phone', category: 'structured-data', severity: 'warning' }, 'pass', `Phone: ${phoneStr}`);
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 'local-business-hours',
|
|
132
|
+
name: 'Business Hours',
|
|
133
|
+
category: 'structured-data',
|
|
134
|
+
severity: 'info',
|
|
135
|
+
description: 'LocalBusiness schema should include opening hours',
|
|
136
|
+
check: (ctx) => {
|
|
137
|
+
if (!ctx.localBusinessSchema) {
|
|
138
|
+
return createResult({ id: 'local-business-hours', name: 'Business Hours', category: 'structured-data', severity: 'info' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
139
|
+
recommendation: 'Add LocalBusiness schema first, then include hours',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const hours = ctx.localBusinessSchema.openingHoursSpecification ||
|
|
143
|
+
ctx.localBusinessSchema.openingHours;
|
|
144
|
+
if (!hours) {
|
|
145
|
+
return createResult({ id: 'local-business-hours', name: 'Business Hours', category: 'structured-data', severity: 'info' }, 'info', 'LocalBusiness schema missing opening hours', {
|
|
146
|
+
recommendation: 'Add openingHoursSpecification for "open now" filters',
|
|
147
|
+
evidence: {
|
|
148
|
+
example: `"openingHoursSpecification": [{
|
|
149
|
+
"@type": "OpeningHoursSpecification",
|
|
150
|
+
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
|
151
|
+
"opens": "09:00",
|
|
152
|
+
"closes": "17:00"
|
|
153
|
+
}]`,
|
|
154
|
+
impact: 'Opening hours help users find open businesses',
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return createResult({ id: 'local-business-hours', name: 'Business Hours', category: 'structured-data', severity: 'info' }, 'pass', 'Opening hours specified');
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: 'local-business-geo',
|
|
163
|
+
name: 'Business Coordinates',
|
|
164
|
+
category: 'structured-data',
|
|
165
|
+
severity: 'info',
|
|
166
|
+
description: 'LocalBusiness schema should include geo coordinates',
|
|
167
|
+
check: (ctx) => {
|
|
168
|
+
if (!ctx.localBusinessSchema) {
|
|
169
|
+
return createResult({ id: 'local-business-geo', name: 'Business Coordinates', category: 'structured-data', severity: 'info' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
170
|
+
recommendation: 'Add LocalBusiness schema first, then include geo coordinates',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const geo = ctx.localBusinessSchema.geo;
|
|
174
|
+
if (!geo) {
|
|
175
|
+
return createResult({ id: 'local-business-geo', name: 'Business Coordinates', category: 'structured-data', severity: 'info' }, 'info', 'LocalBusiness schema missing geo coordinates', {
|
|
176
|
+
recommendation: 'Add latitude/longitude for precise map placement',
|
|
177
|
+
evidence: {
|
|
178
|
+
example: `"geo": {
|
|
179
|
+
"@type": "GeoCoordinates",
|
|
180
|
+
"latitude": "40.7128",
|
|
181
|
+
"longitude": "-74.0060"
|
|
182
|
+
}`,
|
|
183
|
+
impact: 'Coordinates ensure accurate Google Maps integration',
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const lat = geo.latitude;
|
|
188
|
+
const lng = geo.longitude;
|
|
189
|
+
if (!lat || !lng) {
|
|
190
|
+
return createResult({ id: 'local-business-geo', name: 'Business Coordinates', category: 'structured-data', severity: 'info' }, 'warn', 'Geo coordinates incomplete', {
|
|
191
|
+
evidence: {
|
|
192
|
+
found: `lat: ${lat}, lng: ${lng}`,
|
|
193
|
+
expected: 'Both latitude and longitude required',
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return createResult({ id: 'local-business-geo', name: 'Business Coordinates', category: 'structured-data', severity: 'info' }, 'pass', `Geo: ${lat}, ${lng}`);
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: 'local-nap-presence',
|
|
202
|
+
name: 'NAP Presence',
|
|
203
|
+
category: 'content',
|
|
204
|
+
severity: 'info',
|
|
205
|
+
description: 'Local business pages should display Name, Address, Phone (NAP)',
|
|
206
|
+
check: (ctx) => {
|
|
207
|
+
if (!ctx.hasLocalBusinessSignals) {
|
|
208
|
+
return createResult({ id: 'local-nap-presence', name: 'NAP Presence', category: 'content', severity: 'info' }, 'info', 'No local business signals detected', {
|
|
209
|
+
recommendation: 'Add NAP information if this is a local business page',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const missing = [];
|
|
213
|
+
if (!ctx.hasPhoneOnPage)
|
|
214
|
+
missing.push('Phone');
|
|
215
|
+
if (!ctx.hasAddressOnPage)
|
|
216
|
+
missing.push('Address');
|
|
217
|
+
if (missing.length > 0) {
|
|
218
|
+
return createResult({ id: 'local-nap-presence', name: 'NAP Presence', category: 'content', severity: 'info' }, 'info', `Missing visible NAP elements: ${missing.join(', ')}`, {
|
|
219
|
+
recommendation: 'Display business name, address, and phone prominently on page',
|
|
220
|
+
evidence: {
|
|
221
|
+
issue: 'NAP should be visible to users, not just in schema',
|
|
222
|
+
impact: 'Visible NAP improves trust and local SEO consistency',
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return createResult({ id: 'local-nap-presence', name: 'NAP Presence', category: 'content', severity: 'info' }, 'pass', 'NAP information visible on page');
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
id: 'local-service-area',
|
|
231
|
+
name: 'Service Area',
|
|
232
|
+
category: 'structured-data',
|
|
233
|
+
severity: 'info',
|
|
234
|
+
description: 'Service area businesses should specify their coverage',
|
|
235
|
+
check: (ctx) => {
|
|
236
|
+
if (!ctx.localBusinessSchema) {
|
|
237
|
+
return createResult({ id: 'local-service-area', name: 'Service Area', category: 'structured-data', severity: 'info' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
238
|
+
recommendation: 'Add LocalBusiness schema first, then include service area if applicable',
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
const isServiceArea = ctx.localBusinessSchema['@type'] === 'ServiceAreaBusiness' ||
|
|
242
|
+
ctx.localBusinessSchema.areaServed !== undefined;
|
|
243
|
+
if (!isServiceArea) {
|
|
244
|
+
return createResult({ id: 'local-service-area', name: 'Service Area', category: 'structured-data', severity: 'info' }, 'info', 'Not a service area business', {
|
|
245
|
+
recommendation: 'Add areaServed if you serve customers at their location',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
const areaServed = ctx.localBusinessSchema.areaServed;
|
|
249
|
+
if (!areaServed) {
|
|
250
|
+
return createResult({ id: 'local-service-area', name: 'Service Area', category: 'structured-data', severity: 'info' }, 'info', 'Service area business missing areaServed', {
|
|
251
|
+
recommendation: 'Define the geographic area you serve',
|
|
252
|
+
evidence: {
|
|
253
|
+
example: `"areaServed": {
|
|
254
|
+
"@type": "GeoCircle",
|
|
255
|
+
"geoMidpoint": { "latitude": "40.7128", "longitude": "-74.0060" },
|
|
256
|
+
"geoRadius": "50 mi"
|
|
257
|
+
}`,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return createResult({ id: 'local-service-area', name: 'Service Area', category: 'structured-data', severity: 'info' }, 'pass', 'Service area defined');
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
id: 'local-pricerange',
|
|
266
|
+
name: 'Price Range',
|
|
267
|
+
category: 'structured-data',
|
|
268
|
+
severity: 'info',
|
|
269
|
+
description: 'LocalBusiness can include price range for user expectations',
|
|
270
|
+
check: (ctx) => {
|
|
271
|
+
if (!ctx.localBusinessSchema) {
|
|
272
|
+
return createResult({ id: 'local-pricerange', name: 'Price Range', category: 'structured-data', severity: 'info' }, 'info', 'Not applicable (no LocalBusiness schema)', {
|
|
273
|
+
recommendation: 'Add LocalBusiness schema first, then include price range',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const priceRange = ctx.localBusinessSchema.priceRange;
|
|
277
|
+
if (!priceRange) {
|
|
278
|
+
return createResult({ id: 'local-pricerange', name: 'Price Range', category: 'structured-data', severity: 'info' }, 'info', 'LocalBusiness missing price range', {
|
|
279
|
+
recommendation: 'Add priceRange (e.g., "$$", "$$$") for user expectations',
|
|
280
|
+
evidence: {
|
|
281
|
+
example: '"priceRange": "$$" (uses $ symbols: $, $$, $$$, $$$$)',
|
|
282
|
+
impact: 'Helps users filter by budget in search results',
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return createResult({ id: 'local-pricerange', name: 'Price Range', category: 'structured-data', severity: 'info' }, 'pass', `Price range: ${priceRange}`);
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
];
|