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
|
@@ -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://') ||
|
|
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://') ||
|
|
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(
|
|
45
|
+
export function extractLinks(root, options) {
|
|
41
46
|
const selector = options?.selector || 'a[href]';
|
|
42
47
|
const links = [];
|
|
43
|
-
|
|
44
|
-
|
|
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:
|
|
52
|
-
rel:
|
|
53
|
-
target:
|
|
54
|
-
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(
|
|
72
|
+
export function extractImages(root, options) {
|
|
61
73
|
const selector = options?.selector || 'img[src]';
|
|
62
74
|
const images = [];
|
|
63
|
-
|
|
64
|
-
|
|
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 =
|
|
70
|
-
const height =
|
|
80
|
+
const width = element.getAttribute('width');
|
|
81
|
+
const height = element.getAttribute('height');
|
|
71
82
|
images.push({
|
|
72
83
|
src,
|
|
73
|
-
alt:
|
|
74
|
-
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:
|
|
78
|
-
loading:
|
|
79
|
-
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
|
-
|
|
87
|
-
|
|
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
|
|
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
|
|
101
|
-
if (
|
|
102
|
-
meta.canonical =
|
|
115
|
+
const canonicalEl = root.querySelector('link[rel="canonical"]');
|
|
116
|
+
if (canonicalEl) {
|
|
117
|
+
meta.canonical = canonicalEl.getAttribute('href');
|
|
103
118
|
}
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
const
|
|
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
|
|
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
|
-
|
|
136
|
-
const
|
|
137
|
-
const
|
|
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
|
-
|
|
179
|
-
const
|
|
180
|
-
const
|
|
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
|
-
|
|
213
|
-
const content =
|
|
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(
|
|
248
|
+
export function extractForms(root, selector) {
|
|
234
249
|
const forms = [];
|
|
235
250
|
const formSelector = selector || 'form';
|
|
236
|
-
|
|
237
|
-
const $form = $(formElement);
|
|
251
|
+
root.querySelectorAll(formSelector).forEach((formElement) => {
|
|
238
252
|
const fields = [];
|
|
239
|
-
|
|
240
|
-
const $field = $(fieldElement);
|
|
253
|
+
formElement.querySelectorAll('input, select, textarea').forEach((fieldElement) => {
|
|
241
254
|
const tagName = fieldElement.tagName?.toLowerCase();
|
|
242
|
-
const type =
|
|
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:
|
|
266
|
+
name: fieldElement.getAttribute('name'),
|
|
245
267
|
type,
|
|
246
|
-
value:
|
|
247
|
-
placeholder:
|
|
248
|
-
required:
|
|
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
|
-
|
|
253
|
-
const $option = $(optionElement);
|
|
274
|
+
fieldElement.querySelectorAll('option').forEach((optionElement) => {
|
|
254
275
|
field.options.push({
|
|
255
|
-
value:
|
|
256
|
-
text:
|
|
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:
|
|
264
|
-
method:
|
|
265
|
-
name:
|
|
266
|
-
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(
|
|
297
|
+
export function extractTables(root, selector) {
|
|
273
298
|
const tables = [];
|
|
274
299
|
const tableSelector = selector || 'table';
|
|
275
|
-
|
|
276
|
-
const $table = $(tableElement);
|
|
300
|
+
root.querySelectorAll(tableSelector).forEach((tableElement) => {
|
|
277
301
|
const headers = [];
|
|
278
302
|
const rows = [];
|
|
279
|
-
const
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
287
|
-
|
|
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
|
-
|
|
290
|
-
row.push(
|
|
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
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
322
|
-
const
|
|
323
|
-
const
|
|
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:
|
|
330
|
-
async:
|
|
331
|
-
defer:
|
|
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
|
-
|
|
340
|
-
const $el = $(element);
|
|
373
|
+
root.querySelectorAll('link[rel="stylesheet"]').forEach((element) => {
|
|
341
374
|
styles.push({
|
|
342
|
-
href:
|
|
343
|
-
media:
|
|
375
|
+
href: element.getAttribute('href'),
|
|
376
|
+
media: element.getAttribute('media'),
|
|
344
377
|
});
|
|
345
378
|
});
|
|
346
|
-
|
|
347
|
-
const
|
|
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:
|
|
383
|
+
media: element.getAttribute('media'),
|
|
352
384
|
inline,
|
|
353
385
|
});
|
|
354
386
|
}
|
package/dist/scrape/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export { parse as parseHtmlSync, HTMLElement, TextNode, CommentNode, Node, NodeType, valid, } from './parser/index.js';
|
|
2
|
+
export type { Options as ParserOptions } from './parser/index.js';
|
|
1
3
|
export { ScrapeDocument } from './document.js';
|
|
2
4
|
export { ScrapeElement } from './element.js';
|
|
3
5
|
export { Spider, spider } from './spider.js';
|
package/dist/scrape/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function arr_back<T>(arr: T[]): T;
|
|
@@ -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
|
+
}
|