geo-checker 1.0.0

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.

Potentially problematic release.


This version of geo-checker might be problematic. Click here for more details.

@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/data/ai-bots.ts","../src/analyzers/geo-score.ts","../src/analyzers/bot-access.ts","../src/analyzers/content-quality.ts","../src/analyzers/meta-tags.ts","../src/analyzers/structured-data.ts","../src/analyzers/technical.ts","../src/scoring/calculator.ts","../src/scanner/http.ts","../src/scanner/robots.ts","../src/scanner/page.ts","../src/index.ts","../src/reporters/json.ts","../src/reporters/terminal.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command, CommanderError } from \"commander\";\nimport { pathToFileURL } from \"node:url\";\nimport { geoCheckMany } from \"./index.js\";\nimport { formatJsonOutput } from \"./reporters/json.js\";\nimport { renderTerminalResults } from \"./reporters/terminal.js\";\n\ninterface CliIO {\n stdout: (message: string) => void;\n stderr: (message: string) => void;\n}\n\nconst defaultIO: CliIO = {\n stdout: (message) => console.log(message),\n stderr: (message) => console.error(message)\n};\n\nexport async function runCli(argv = process.argv, io: CliIO = defaultIO): Promise<number> {\n const program = new Command();\n\n program\n .name(\"geo-check\")\n .description(\"AI Visibility Scanner โ€” robots.txt AI bot access + GEO readiness score\")\n .argument(\"[urls...]\", \"Target URLs to scan\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"--robots-only\", \"Only run robots.txt checks\")\n .option(\"--geo-only\", \"Only output GEO score\")\n .option(\"--verbose\", \"Show all check details\")\n .showHelpAfterError();\n\n program.exitOverride();\n\n try {\n program.parse(argv);\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code !== \"commander.helpDisplayed\") {\n io.stderr(error.message);\n }\n return 2;\n }\n throw error;\n }\n\n const opts = program.opts<{\n json?: boolean;\n robotsOnly?: boolean;\n geoOnly?: boolean;\n verbose?: boolean;\n }>();\n\n const urls = program.args as string[];\n\n if (urls.length === 0) {\n io.stderr(\"Please provide at least one URL. Example: npx geo-check https://example.com\");\n return 2;\n }\n\n if (opts.robotsOnly && opts.geoOnly) {\n io.stderr(\"--robots-only and --geo-only cannot be used together.\");\n return 2;\n }\n\n const results = await geoCheckMany(urls, {\n robotsOnly: opts.robotsOnly,\n geoOnly: opts.geoOnly,\n verbose: opts.verbose,\n concurrency: 3\n });\n\n if (opts.json) {\n io.stdout(formatJsonOutput(results.length === 1 ? results[0]! : results));\n } else {\n io.stdout(renderTerminalResults(results, { verbose: Boolean(opts.verbose) }));\n }\n\n return results.some((result) => result.success) ? 0 : 1;\n}\n\nconst directInvocation = process.argv[1]\n ? import.meta.url === pathToFileURL(process.argv[1]).href\n : false;\n\nif (directInvocation) {\n runCli().then((code) => {\n process.exit(code);\n });\n}\n","import type { AIBot } from \"../types.js\";\n\nexport const aiBots: AIBot[] = [\n {\n name: \"GPTBot\",\n userAgent: \"GPTBot\",\n company: \"OpenAI\",\n purpose: \"Both\",\n docsUrl: \"https://platform.openai.com/docs/bots\"\n },\n {\n name: \"OAI-SearchBot\",\n userAgent: \"OAI-SearchBot\",\n company: \"OpenAI\",\n purpose: \"Search\",\n docsUrl: \"https://platform.openai.com/docs/bots\"\n },\n {\n name: \"ChatGPT-User\",\n userAgent: \"ChatGPT-User\",\n company: \"OpenAI\",\n purpose: \"Browse\",\n docsUrl: \"https://platform.openai.com/docs/bots\"\n },\n {\n name: \"ClaudeBot\",\n userAgent: \"ClaudeBot\",\n company: \"Anthropic\",\n purpose: \"Training\",\n docsUrl: \"https://support.anthropic.com/en/articles/8896518\" \n },\n {\n name: \"anthropic-ai\",\n userAgent: \"anthropic-ai\",\n company: \"Anthropic\",\n purpose: \"Training\",\n docsUrl: \"https://support.anthropic.com/en/articles/8896518\"\n },\n {\n name: \"PerplexityBot\",\n userAgent: \"PerplexityBot\",\n company: \"Perplexity\",\n purpose: \"Search\",\n docsUrl: \"https://docs.perplexity.ai/docs/perplexitybot\"\n },\n {\n name: \"Google-Extended\",\n userAgent: \"Google-Extended\",\n company: \"Google\",\n purpose: \"Training\",\n docsUrl: \"https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers\"\n },\n {\n name: \"Googlebot\",\n userAgent: \"Googlebot\",\n company: \"Google\",\n purpose: \"Reference\",\n docsUrl: \"https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers\"\n },\n {\n name: \"Bytespider\",\n userAgent: \"Bytespider\",\n company: \"ByteDance\",\n purpose: \"Training\",\n docsUrl: \"https://www.bytedance.com/en/robot\"\n },\n {\n name: \"CCBot\",\n userAgent: \"CCBot\",\n company: \"Common Crawl\",\n purpose: \"Training\",\n docsUrl: \"https://commoncrawl.org/ccbot\"\n },\n {\n name: \"FacebookBot\",\n userAgent: \"FacebookBot\",\n company: \"Meta\",\n purpose: \"Training\",\n docsUrl: \"https://developers.facebook.com/docs/sharing/webmasters/web-crawlers\"\n },\n {\n name: \"Meta-ExternalAgent\",\n userAgent: \"Meta-ExternalAgent\",\n company: \"Meta\",\n purpose: \"Training\",\n docsUrl: \"https://developers.facebook.com/docs/sharing/webmasters/web-crawlers\"\n },\n {\n name: \"Amazonbot\",\n userAgent: \"Amazonbot\",\n company: \"Amazon\",\n purpose: \"Training\",\n docsUrl: \"https://developer.amazon.com/support/amazonbot\"\n },\n {\n name: \"Cohere-ai\",\n userAgent: \"cohere-ai\",\n company: \"Cohere\",\n purpose: \"Training\",\n docsUrl: \"https://docs.cohere.com/docs/crawlers\"\n },\n {\n name: \"YouBot\",\n userAgent: \"YouBot\",\n company: \"You.com\",\n purpose: \"Search\",\n docsUrl: \"https://about.you.com/youbot/\"\n },\n {\n name: \"Applebot-Extended\",\n userAgent: \"Applebot-Extended\",\n company: \"Apple\",\n purpose: \"Training\",\n docsUrl: \"https://support.apple.com/en-us/119829\"\n },\n {\n name: \"Diffbot\",\n userAgent: \"Diffbot\",\n company: \"Diffbot\",\n purpose: \"Training\",\n docsUrl: \"https://docs.diffbot.com/docs/using-robots-txt\"\n }\n];\n","import { load } from \"cheerio\";\nimport type { GEOScore, RobotsAnalysis } from \"../types.js\";\nimport { buildBotAccessCheck, buildNotMentionedRecommendation, buildSitemapCheck } from \"./bot-access.js\";\nimport { analyzeContentQuality } from \"./content-quality.js\";\nimport { analyzeMetaTags } from \"./meta-tags.js\";\nimport { analyzeStructuredData } from \"./structured-data.js\";\nimport { analyzeTechnical } from \"./technical.js\";\nimport { calculateCategoryScore, calculateGrade, recommendationsFromChecks } from \"../scoring/calculator.js\";\n\nconst RELEVANT_SCHEMA_TYPES = [\"Article\", \"FAQPage\", \"HowTo\", \"Product\", \"Organization\"];\n\nfunction hasType(types: string[], target: string): boolean {\n return types.some((type) => type.toLowerCase() === target.toLowerCase());\n}\n\nfunction check(id: string, name: string, points: number, maxPoints: number, detail: string, fix: string) {\n return {\n id,\n name,\n passed: points >= maxPoints,\n points,\n maxPoints,\n detail,\n fix\n };\n}\n\nexport function analyzeGeoScore(input: {\n html: string;\n finalUrl: string;\n loadTimeMs: number;\n robots: RobotsAnalysis;\n}): GEOScore {\n const $ = load(input.html || \"\");\n\n const structured = analyzeStructuredData($);\n const meta = analyzeMetaTags($);\n const content = analyzeContentQuality($, input.finalUrl);\n const technical = analyzeTechnical({ finalUrl: input.finalUrl, loadTimeMs: input.loadTimeMs });\n\n const matchedSchemaCount = RELEVANT_SCHEMA_TYPES.filter((schemaType) =>\n hasType(structured.schemaTypes, schemaType)\n ).length;\n\n const structuredChecks = [\n check(\n \"structured.jsonld_present\",\n \"JSON-LD present\",\n structured.hasJsonLd ? 8 : 0,\n 8,\n structured.hasJsonLd ? \"Found JSON-LD script blocks.\" : \"No JSON-LD script detected.\",\n \"Add JSON-LD structured data to key pages.\"\n ),\n check(\n \"structured.schema_types\",\n \"Relevant Schema.org types\",\n Math.min(10, matchedSchemaCount * 5),\n 10,\n matchedSchemaCount > 0\n ? `Found relevant schema types: ${RELEVANT_SCHEMA_TYPES.filter((schemaType) => hasType(structured.schemaTypes, schemaType)).join(\", \")}`\n : \"No relevant schema types found (Article, FAQPage, HowTo, Product, Organization).\",\n \"Add relevant Schema.org types (Article, FAQPage, HowTo, Product, Organization).\"\n ),\n check(\n \"structured.jsonld_valid\",\n \"Valid JSON-LD syntax\",\n structured.validJsonLd ? 2 : 0,\n 2,\n structured.validJsonLd ? \"All JSON-LD blocks parsed successfully.\" : \"JSON-LD missing or contains parse errors.\",\n \"Validate JSON-LD with a schema validator and fix parse errors.\"\n ),\n check(\n \"structured.opengraph\",\n \"OpenGraph tags present\",\n meta.ogTagsPresent ? 5 : 0,\n 5,\n meta.ogTagsPresent\n ? \"Found core OpenGraph tags (title, description, image, type).\"\n : `Missing OpenGraph tags: ${meta.ogMissing.join(\", \")}`,\n \"Add complete OpenGraph tags: og:title, og:description, og:image, og:type.\"\n )\n ];\n\n const contentChecks = [\n check(\n \"content.h1_single\",\n \"Single H1 present\",\n content.h1Count === 1 ? 5 : 0,\n 5,\n content.h1Count === 1 ? \"Exactly one H1 found.\" : `Found ${content.h1Count} H1 elements.`,\n \"Ensure each page has exactly one descriptive H1.\"\n ),\n check(\n \"content.heading_hierarchy\",\n \"Logical heading hierarchy\",\n content.headingHierarchyLogical ? 5 : 0,\n 5,\n content.headingHierarchyLogical ? \"Heading levels are sequential.\" : \"Detected skipped heading levels (e.g., H2 to H4).\",\n \"Use sequential heading levels without skipping (H1 โ†’ H2 โ†’ H3).\"\n ),\n check(\n \"content.length_300_words\",\n \"Content length over 300 words\",\n content.wordCount > 300 ? 3 : 0,\n 3,\n `Detected ${content.wordCount} words.`,\n \"Expand the page content to exceed 300 words of useful text.\"\n ),\n check(\n \"content.short_paragraphs\",\n \"Average paragraph length under 150 words\",\n content.avgParagraphWords > 0 && content.avgParagraphWords < 150 ? 3 : 0,\n 3,\n `Average paragraph length is ${content.avgParagraphWords.toFixed(1)} words.`,\n \"Break long paragraphs into shorter blocks for readability.\"\n ),\n check(\n \"content.lists_present\",\n \"Bullet or numbered lists present\",\n content.hasLists ? 2 : 0,\n 2,\n content.hasLists ? \"Found list elements.\" : \"No bullet/numbered lists found.\",\n \"Use bullet or numbered lists to structure key points.\"\n ),\n check(\n \"content.tables_with_headers\",\n \"Tables with headers present\",\n content.hasTablesWithHeaders ? 2 : 0,\n 2,\n content.hasTablesWithHeaders ? \"Found table(s) with header cells.\" : \"No data tables with headers detected.\",\n \"Add tables with <th> headers when presenting structured comparisons.\"\n ),\n check(\n \"content.internal_links\",\n \"Internal links present\",\n content.internalLinks > 0 ? 3 : 0,\n 3,\n `Found ${content.internalLinks} internal links.`,\n \"Add links to relevant internal pages to improve crawl pathways.\"\n ),\n check(\n \"content.external_links\",\n \"External authoritative links present\",\n content.externalLinks > 0 ? 2 : 0,\n 2,\n `Found ${content.externalLinks} external links.`,\n \"Add links to authoritative external sources where relevant.\"\n )\n ];\n\n const authorityChecks = [\n check(\n \"authority.author_signal\",\n \"Author name or bio present\",\n content.hasAuthorSignal || meta.hasMetaAuthor || structured.hasAuthorProperty ? 6 : 0,\n 6,\n content.hasAuthorSignal || meta.hasMetaAuthor || structured.hasAuthorProperty\n ? \"Detected author signals in page markup.\"\n : \"No author information detected.\",\n \"Add an author name/bio and include structured author metadata.\"\n ),\n check(\n \"authority.publication_date\",\n \"Publication date present\",\n meta.publicationDate || structured.hasDatePublished ? 5 : 0,\n 5,\n meta.publicationDate || structured.hasDatePublished\n ? `Publication date detected${meta.publicationDate ? ` (${meta.publicationDate})` : \" in schema\"}.`\n : \"No publication date detected.\",\n \"Add datePublished in schema or article meta tags.\"\n ),\n check(\n \"authority.last_modified\",\n \"Last modified date present\",\n meta.modifiedDate || structured.hasDateModified ? 4 : 0,\n 4,\n meta.modifiedDate || structured.hasDateModified\n ? `Last modified date detected${meta.modifiedDate ? ` (${meta.modifiedDate})` : \" in schema\"}.`\n : \"No last modified date detected.\",\n \"Add dateModified / article:modified_time metadata.\"\n ),\n check(\n \"authority.canonical\",\n \"Canonical URL set\",\n meta.hasCanonical ? 4 : 0,\n 4,\n meta.hasCanonical ? `Canonical URL: ${meta.canonicalUrl}` : \"No canonical URL found.\",\n \"Add a canonical link tag to avoid duplicate-content ambiguity.\"\n ),\n check(\n \"authority.https\",\n \"HTTPS enabled\",\n technical.isHttps ? 3 : 0,\n 3,\n technical.isHttps ? \"Page is served via HTTPS.\" : \"Page is not served via HTTPS.\",\n \"Serve pages over HTTPS.\"\n ),\n check(\n \"authority.organization_schema\",\n \"Organization schema present\",\n structured.hasOrganizationSchema ? 3 : 0,\n 3,\n structured.hasOrganizationSchema ? \"Organization schema detected.\" : \"No Organization schema detected.\",\n \"Add Organization schema to establish publisher identity.\"\n )\n ];\n\n const aiChecks = [\n buildBotAccessCheck(input.robots),\n check(\n \"ai.no_noai_tags\",\n \"No noai/noimageai directives\",\n meta.hasNoAiDirectives ? 0 : 3,\n 3,\n meta.hasNoAiDirectives\n ? \"Detected noai/noimageai directives that may block AI usage.\"\n : \"No restrictive noai/noimageai directives found.\",\n \"Remove noai/noimageai directives if you want AI systems to cite your content.\"\n ),\n buildSitemapCheck(input.robots),\n check(\n \"ai.load_under_3s\",\n \"Page loads under 3 seconds\",\n technical.loadUnder3Seconds ? 3 : 0,\n 3,\n `Measured load time: ${input.loadTimeMs}ms.`,\n \"Improve server and asset performance to stay below 3 seconds.\"\n ),\n check(\n \"ai.viewport_meta\",\n \"Mobile viewport meta present\",\n meta.hasViewport ? 3 : 0,\n 3,\n meta.hasViewport ? \"Viewport meta tag present.\" : \"Viewport meta tag missing.\",\n \"Add <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\">.\"\n ),\n check(\n \"ai.meaningful_html_content\",\n \"Meaningful raw HTML content present\",\n content.hasMeaningfulHtmlContent ? 3 : 0,\n 3,\n content.hasMeaningfulHtmlContent\n ? `Raw HTML includes ${content.wordCount} words of visible text.`\n : \"Raw HTML has limited visible text and may rely on client-side rendering.\",\n \"Ensure important content is rendered in raw HTML, not only via JavaScript.\"\n )\n ];\n\n const structuredData = calculateCategoryScore(structuredChecks, 25);\n const contentStructure = calculateCategoryScore(contentChecks, 25);\n const authoritySignals = calculateCategoryScore(authorityChecks, 25);\n const aiAccessibility = calculateCategoryScore(aiChecks, 25);\n\n const total =\n structuredData.score + contentStructure.score + authoritySignals.score + aiAccessibility.score;\n\n const recommendations = recommendationsFromChecks([\n { category: \"Structured Data\", checks: structuredChecks },\n { category: \"Content Structure\", checks: contentChecks },\n { category: \"Authority Signals\", checks: authorityChecks },\n { category: \"AI Accessibility\", checks: aiChecks }\n ]);\n\n const notMentionedWarning = buildNotMentionedRecommendation(input.robots);\n if (notMentionedWarning) {\n recommendations.push(notMentionedWarning);\n }\n\n return {\n total,\n grade: calculateGrade(total),\n categories: {\n structuredData,\n contentStructure,\n authoritySignals,\n aiAccessibility\n },\n recommendations: recommendations.sort((left, right) => {\n const leftScore = Number.parseInt(left.impact.replace(/[^0-9]/g, \"\"), 10) || 0;\n const rightScore = Number.parseInt(right.impact.replace(/[^0-9]/g, \"\"), 10) || 0;\n if (leftScore !== rightScore) {\n return rightScore - leftScore;\n }\n\n const order = { high: 0, medium: 1, low: 2 };\n return order[left.priority] - order[right.priority];\n })\n };\n}\n","import type { Check, Recommendation, RobotsAnalysis } from \"../types.js\";\n\nexport function calculateBotAccessPoints(robots: RobotsAnalysis): number {\n const { allowed, notMentioned, partiallyBlocked, totalBots } = robots.summary;\n if (totalBots === 0) {\n return 0;\n }\n\n const ratio = (allowed + notMentioned + partiallyBlocked * 0.5) / totalBots;\n return Math.round(10 * ratio);\n}\n\nexport function buildBotAccessCheck(robots: RobotsAnalysis): Check {\n const points = calculateBotAccessPoints(robots);\n const allowedEquivalent = robots.summary.allowed + robots.summary.notMentioned + robots.summary.partiallyBlocked * 0.5;\n\n return {\n id: \"ai.bots_access\",\n name: \"AI bots allowed in robots.txt\",\n passed: points >= 7,\n points,\n maxPoints: 10,\n detail: `${allowedEquivalent.toFixed(1)} of ${robots.summary.totalBots} bots counted as allowed-equivalent`,\n fix: \"Allow strategic AI bots in robots.txt while explicitly documenting bot policy.\"\n };\n}\n\nexport function buildSitemapCheck(robots: RobotsAnalysis): Check {\n const hasSitemap = robots.sitemaps.length > 0;\n\n return {\n id: \"ai.sitemap_reference\",\n name: \"Sitemap.xml referenced in robots.txt\",\n passed: hasSitemap,\n points: hasSitemap ? 3 : 0,\n maxPoints: 3,\n detail: hasSitemap\n ? `Found ${robots.sitemaps.length} sitemap reference(s)`\n : \"No sitemap reference found in robots.txt\",\n fix: \"Add a Sitemap directive in robots.txt (e.g., Sitemap: https://example.com/sitemap.xml).\"\n };\n}\n\nexport function buildNotMentionedRecommendation(robots: RobotsAnalysis): Recommendation | null {\n if (robots.summary.notMentioned === 0) {\n return null;\n }\n\n return {\n priority: \"low\",\n category: \"AI Accessibility\",\n message: `${robots.summary.notMentioned} AI bot(s) are not explicitly mentioned in robots.txt. Add explicit rules to remove ambiguity.`,\n impact: \"No score impact\",\n checkId: \"ai.bots_explicit_policy\"\n };\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { ContentQualityAnalysis } from \"../types.js\";\n\nfunction countWords(text: string): number {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return 0;\n }\n return normalized.split(\" \").length;\n}\n\nfunction isHeadingHierarchyLogical($: CheerioAPI): boolean {\n const headings = $(\"h1,h2,h3,h4,h5,h6\").toArray();\n let lastLevel = 0;\n\n for (const heading of headings) {\n const tag = heading.tagName?.toLowerCase();\n if (!tag || !/^h[1-6]$/.test(tag)) {\n continue;\n }\n\n const currentLevel = Number(tag.slice(1));\n if (lastLevel > 0 && currentLevel > lastLevel + 1) {\n return false;\n }\n\n lastLevel = currentLevel;\n }\n\n return true;\n}\n\nfunction analyzeLinks($: CheerioAPI, pageUrl: string): { internal: number; external: number } {\n const currentHost = new URL(pageUrl).hostname;\n let internal = 0;\n let external = 0;\n\n for (const anchor of $(\"a[href]\").toArray()) {\n const href = $(anchor).attr(\"href\")?.trim();\n if (!href) {\n continue;\n }\n\n if (href.startsWith(\"#\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n continue;\n }\n\n try {\n const target = new URL(href, pageUrl);\n if (target.hostname === currentHost) {\n internal += 1;\n } else {\n external += 1;\n }\n } catch {\n continue;\n }\n }\n\n return { internal, external };\n}\n\nexport function analyzeContentQuality($: CheerioAPI, pageUrl: string): ContentQualityAnalysis {\n const bodyText = $(\"body\").text();\n const wordCount = countWords(bodyText);\n\n const paragraphWordCounts = $(\"p\")\n .toArray()\n .map((paragraph) => countWords($(paragraph).text()))\n .filter((words) => words > 0);\n\n const avgParagraphWords =\n paragraphWordCounts.length === 0\n ? 0\n : paragraphWordCounts.reduce((sum, words) => sum + words, 0) / paragraphWordCounts.length;\n\n const links = analyzeLinks($, pageUrl);\n\n const hasAuthorSignal =\n $(\"[rel='author']\").length > 0 ||\n $(\"[itemprop='author']\").length > 0 ||\n $(\"meta[name='author']\").length > 0 ||\n $(\"[class*='author' i]\").length > 0;\n\n const hasTablesWithHeaders = $(\"table\").toArray().some((table) => $(table).find(\"th\").length > 0);\n\n return {\n h1Count: $(\"h1\").length,\n headingHierarchyLogical: isHeadingHierarchyLogical($),\n wordCount,\n avgParagraphWords,\n hasLists: $(\"ul li,ol li\").length > 0,\n hasTablesWithHeaders,\n internalLinks: links.internal,\n externalLinks: links.external,\n hasAuthorSignal,\n hasMeaningfulHtmlContent: wordCount >= 120\n };\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { MetaTagsAnalysis } from \"../types.js\";\n\nconst REQUIRED_OG_TAGS = [\"og:title\", \"og:description\", \"og:image\", \"og:type\"];\n\nfunction getMetaContent($: CheerioAPI, selector: string): string | undefined {\n const value = $(selector).attr(\"content\")?.trim();\n return value || undefined;\n}\n\nfunction hasDirective(value: string | undefined, directive: string): boolean {\n if (!value) {\n return false;\n }\n return value\n .toLowerCase()\n .split(\",\")\n .map((entry) => entry.trim())\n .includes(directive);\n}\n\nexport function analyzeMetaTags($: CheerioAPI): MetaTagsAnalysis {\n const ogMissing = REQUIRED_OG_TAGS.filter((tag) => !getMetaContent($, `meta[property='${tag}']`));\n\n const canonicalUrl = $(\"link[rel='canonical']\").attr(\"href\")?.trim();\n const viewport = getMetaContent($, \"meta[name='viewport']\");\n\n const robots = getMetaContent($, \"meta[name='robots']\");\n const googleBot = getMetaContent($, \"meta[name='googlebot']\");\n const noaiMeta = getMetaContent($, \"meta[name='noai']\");\n const noImageAiMeta = getMetaContent($, \"meta[name='noimageai']\");\n\n const publicationDate =\n getMetaContent($, \"meta[property='article:published_time']\") ??\n getMetaContent($, \"meta[name='datePublished']\") ??\n $(\"time[datetime]\").first().attr(\"datetime\")?.trim();\n\n const modifiedDate =\n getMetaContent($, \"meta[property='article:modified_time']\") ??\n getMetaContent($, \"meta[name='last-modified']\") ??\n getMetaContent($, \"meta[name='dateModified']\");\n\n const hasMetaAuthor =\n !!getMetaContent($, \"meta[name='author']\") ||\n $(\"link[rel='author']\").length > 0 ||\n !!getMetaContent($, \"meta[property='article:author']\");\n\n return {\n ogTagsPresent: ogMissing.length === 0,\n ogMissing,\n hasCanonical: !!canonicalUrl,\n canonicalUrl,\n hasViewport: !!viewport,\n hasNoAiDirectives:\n hasDirective(robots, \"noai\") ||\n hasDirective(robots, \"noimageai\") ||\n hasDirective(googleBot, \"noai\") ||\n hasDirective(googleBot, \"noimageai\") ||\n !!noaiMeta ||\n !!noImageAiMeta,\n publicationDate,\n modifiedDate,\n hasMetaAuthor\n };\n}\n","import type { CheerioAPI } from \"cheerio\";\nimport type { StructuredDataAnalysis } from \"../types.js\";\n\nfunction normalizeType(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n return [];\n}\n\nfunction walkJsonLd(\n node: unknown,\n ctx: {\n types: Set<string>;\n hasOrganization: boolean;\n hasAuthor: boolean;\n hasDatePublished: boolean;\n hasDateModified: boolean;\n }\n): void {\n if (!node) {\n return;\n }\n\n if (Array.isArray(node)) {\n for (const child of node) {\n walkJsonLd(child, ctx);\n }\n return;\n }\n\n if (typeof node !== \"object\") {\n return;\n }\n\n const record = node as Record<string, unknown>;\n\n for (const typeName of normalizeType(record[\"@type\"])) {\n ctx.types.add(typeName);\n if (typeName.toLowerCase() === \"organization\") {\n ctx.hasOrganization = true;\n }\n }\n\n if (record.author !== undefined) {\n ctx.hasAuthor = true;\n }\n\n if (record.datePublished !== undefined) {\n ctx.hasDatePublished = true;\n }\n\n if (record.dateModified !== undefined || record.modifiedTime !== undefined) {\n ctx.hasDateModified = true;\n }\n\n for (const value of Object.values(record)) {\n walkJsonLd(value, ctx);\n }\n}\n\nexport function analyzeStructuredData($: CheerioAPI): StructuredDataAnalysis {\n const scripts = $(\"script[type='application/ld+json']\").toArray();\n const types = new Set<string>();\n\n let validCount = 0;\n let invalidCount = 0;\n\n const ctx = {\n types,\n hasOrganization: false,\n hasAuthor: false,\n hasDatePublished: false,\n hasDateModified: false\n };\n\n for (const script of scripts) {\n const payload = $(script).text().trim();\n if (!payload) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(payload);\n validCount += 1;\n walkJsonLd(parsed, ctx);\n } catch {\n invalidCount += 1;\n }\n }\n\n return {\n hasJsonLd: scripts.length > 0,\n validJsonLd: scripts.length > 0 && validCount > 0 && invalidCount === 0,\n schemaTypes: [...types].sort((a, b) => a.localeCompare(b)),\n hasOrganizationSchema: ctx.hasOrganization,\n hasAuthorProperty: ctx.hasAuthor,\n hasDatePublished: ctx.hasDatePublished,\n hasDateModified: ctx.hasDateModified\n };\n}\n","import type { TechnicalAnalysis } from \"../types.js\";\n\nexport function analyzeTechnical(input: { finalUrl: string; loadTimeMs: number }): TechnicalAnalysis {\n return {\n isHttps: input.finalUrl.startsWith(\"https://\"),\n loadUnder3Seconds: input.loadTimeMs < 3000\n };\n}\n","import type { CategoryScore, Check, Recommendation } from \"../types.js\";\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction priorityFromMissing(missingPoints: number): Recommendation[\"priority\"] {\n if (missingPoints >= 5) {\n return \"high\";\n }\n if (missingPoints >= 3) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function calculateCategoryScore(checks: Check[], maxScore: number): CategoryScore {\n const score = clamp(\n checks.reduce((sum, check) => sum + check.points, 0),\n 0,\n maxScore\n );\n\n return {\n score,\n maxScore,\n checks\n };\n}\n\nexport function calculateGrade(total: number): \"A+\" | \"A\" | \"B+\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (total >= 95) {\n return \"A+\";\n }\n if (total >= 90) {\n return \"A\";\n }\n if (total >= 80) {\n return \"B+\";\n }\n if (total >= 70) {\n return \"B\";\n }\n if (total >= 60) {\n return \"C\";\n }\n if (total >= 40) {\n return \"D\";\n }\n return \"F\";\n}\n\nexport function recommendationsFromChecks(\n checksByCategory: Array<{ category: string; checks: Check[] }>\n): Recommendation[] {\n const recommendations: Recommendation[] = [];\n\n for (const item of checksByCategory) {\n for (const check of item.checks) {\n const missingPoints = check.maxPoints - check.points;\n if (missingPoints <= 0) {\n continue;\n }\n\n recommendations.push({\n priority: priorityFromMissing(missingPoints),\n category: item.category,\n message: check.fix ?? `Improve ${check.name}.`,\n impact: `+${missingPoints} points`,\n checkId: check.id\n });\n }\n }\n\n return recommendations.sort((left, right) => {\n const leftImpact = Number.parseInt(left.impact.replace(/[^0-9]/g, \"\"), 10) || 0;\n const rightImpact = Number.parseInt(right.impact.replace(/[^0-9]/g, \"\"), 10) || 0;\n\n if (leftImpact !== rightImpact) {\n return rightImpact - leftImpact;\n }\n\n const order = { high: 0, medium: 1, low: 2 };\n return order[left.priority] - order[right.priority];\n });\n}\n","const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nexport interface FetchWithRedirectsOptions {\n fetchImpl?: typeof fetch;\n timeoutMs: number;\n maxRedirects: number;\n headers?: HeadersInit;\n}\n\nexport interface FetchWithRedirectsResult {\n response: Response;\n finalUrl: string;\n}\n\nexport async function fetchWithRedirects(\n initialUrl: string,\n options: FetchWithRedirectsOptions\n): Promise<FetchWithRedirectsResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n let currentUrl = initialUrl;\n\n for (let redirects = 0; redirects <= options.maxRedirects; redirects += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeoutMs);\n\n try {\n const response = await fetchImpl(currentUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: controller.signal,\n headers: {\n \"user-agent\": \"geo-check/1.0.0\",\n accept: \"text/html,text/plain,*/*\",\n ...options.headers\n }\n });\n\n if (!REDIRECT_STATUSES.has(response.status)) {\n return { response, finalUrl: currentUrl };\n }\n\n const location = response.headers.get(\"location\");\n if (!location) {\n return { response, finalUrl: currentUrl };\n }\n\n if (redirects === options.maxRedirects) {\n throw new Error(`Too many redirects (>${options.maxRedirects})`);\n }\n\n currentUrl = new URL(location, currentUrl).toString();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n throw new Error(`Too many redirects (>${options.maxRedirects})`);\n}\n","import { aiBots } from \"../data/ai-bots.js\";\nimport type { AIBot, BotAccessResult, BotStatus, RobotsAnalysis, RobotsSummary } from \"../types.js\";\nimport { fetchWithRedirects } from \"./http.js\";\n\ninterface RobotsRule {\n directive: \"allow\" | \"disallow\";\n path: string;\n}\n\ninterface RobotsGroup {\n userAgents: string[];\n rules: RobotsRule[];\n}\n\ninterface ParsedRobots {\n groups: RobotsGroup[];\n sitemaps: string[];\n}\n\ninterface MatchInfo {\n decision: \"allow\" | \"disallow\" | \"none\";\n matchedLength: number;\n}\n\nfunction normalizeLine(line: string): string {\n const hashIndex = line.indexOf(\"#\");\n const withoutComment = hashIndex >= 0 ? line.slice(0, hashIndex) : line;\n return withoutComment.trim();\n}\n\nfunction parseDirective(line: string): { key: string; value: string } | null {\n const colon = line.indexOf(\":\");\n if (colon <= 0) {\n return null;\n }\n\n const key = line.slice(0, colon).trim().toLowerCase();\n const value = line.slice(colon + 1).trim();\n if (!key) {\n return null;\n }\n\n return { key, value };\n}\n\nexport function parseRobotsTxt(content: string): ParsedRobots {\n const groups: RobotsGroup[] = [];\n const sitemaps: string[] = [];\n let currentGroup: RobotsGroup | null = null;\n let hasRuleInCurrentGroup = false;\n\n const lines = content.split(/\\r?\\n/);\n\n for (const rawLine of lines) {\n const line = normalizeLine(rawLine);\n if (!line) {\n continue;\n }\n\n const parsed = parseDirective(line);\n if (!parsed) {\n continue;\n }\n\n if (parsed.key === \"user-agent\") {\n const userAgent = parsed.value.toLowerCase();\n if (!userAgent) {\n continue;\n }\n\n if (!currentGroup || hasRuleInCurrentGroup) {\n currentGroup = { userAgents: [], rules: [] };\n groups.push(currentGroup);\n hasRuleInCurrentGroup = false;\n }\n\n currentGroup.userAgents.push(userAgent);\n continue;\n }\n\n if (parsed.key === \"allow\" || parsed.key === \"disallow\") {\n if (!currentGroup) {\n continue;\n }\n\n if (!parsed.value) {\n continue;\n }\n\n currentGroup.rules.push({ directive: parsed.key, path: parsed.value });\n hasRuleInCurrentGroup = true;\n continue;\n }\n\n if (parsed.key === \"sitemap\") {\n if (parsed.value) {\n sitemaps.push(parsed.value);\n }\n }\n }\n\n return { groups, sitemaps };\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction getMatchLength(targetPath: string, rulePath: string): number {\n if (!rulePath) {\n return 0;\n }\n\n if (!rulePath.includes(\"*\") && !rulePath.includes(\"$\")) {\n return targetPath.startsWith(rulePath) ? rulePath.length : -1;\n }\n\n const endsWithAnchor = rulePath.endsWith(\"$\");\n const patternBody = endsWithAnchor ? rulePath.slice(0, -1) : rulePath;\n const escaped = escapeRegex(patternBody).replace(/\\\\\\*/g, \".*\");\n const pattern = endsWithAnchor ? `^${escaped}$` : `^${escaped}`;\n const regex = new RegExp(pattern);\n const match = targetPath.match(regex);\n\n if (!match || !match[0]) {\n return -1;\n }\n\n return match[0].length;\n}\n\nfunction getDecisionForPath(path: string, rules: RobotsRule[]): MatchInfo {\n let bestDecision: \"allow\" | \"disallow\" | \"none\" = \"none\";\n let bestLength = -1;\n\n for (const rule of rules) {\n const matchLength = getMatchLength(path, rule.path);\n if (matchLength < 0) {\n continue;\n }\n\n if (matchLength > bestLength) {\n bestLength = matchLength;\n bestDecision = rule.directive;\n continue;\n }\n\n if (matchLength === bestLength && rule.directive === \"allow\") {\n bestDecision = \"allow\";\n }\n }\n\n return {\n decision: bestDecision,\n matchedLength: Math.max(bestLength, 0)\n };\n}\n\nfunction pathProbeFromRule(rulePath: string): string {\n const withoutAnchor = rulePath.endsWith(\"$\") ? rulePath.slice(0, -1) : rulePath;\n const withWildcardExpanded = withoutAnchor.replace(/\\*/g, \"sample\");\n if (!withWildcardExpanded.startsWith(\"/\")) {\n return `/${withWildcardExpanded}`;\n }\n return withWildcardExpanded || \"/\";\n}\n\nfunction classifyStatus(rules: RobotsRule[]): BotStatus {\n if (rules.length === 0) {\n return \"allowed\";\n }\n\n const hasDisallow = rules.some((rule) => rule.directive === \"disallow\");\n if (!hasDisallow) {\n return \"allowed\";\n }\n\n const rootDecision = getDecisionForPath(\"/\", rules).decision;\n\n if (rootDecision === \"disallow\") {\n const hasAllowedIsland = rules.some((rule) => {\n if (rule.directive !== \"allow\") {\n return false;\n }\n const probe = pathProbeFromRule(rule.path);\n return getDecisionForPath(probe, rules).decision === \"allow\";\n });\n\n return hasAllowedIsland ? \"partially_blocked\" : \"blocked\";\n }\n\n const blocksAnyPath = rules.some((rule) => {\n if (rule.directive !== \"disallow\") {\n return false;\n }\n const probe = pathProbeFromRule(rule.path);\n return getDecisionForPath(probe, rules).decision === \"disallow\";\n });\n\n return blocksAnyPath ? \"partially_blocked\" : \"allowed\";\n}\n\nfunction summarize(results: BotAccessResult[]): RobotsSummary {\n const summary: RobotsSummary = {\n totalBots: results.length,\n allowed: 0,\n blocked: 0,\n partiallyBlocked: 0,\n notMentioned: 0\n };\n\n for (const result of results) {\n if (result.status === \"allowed\") {\n summary.allowed += 1;\n } else if (result.status === \"blocked\") {\n summary.blocked += 1;\n } else if (result.status === \"partially_blocked\") {\n summary.partiallyBlocked += 1;\n } else {\n summary.notMentioned += 1;\n }\n }\n\n return summary;\n}\n\nfunction toRuleLines(rules: RobotsRule[]): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const rule of rules) {\n const line = `${rule.directive === \"allow\" ? \"Allow\" : \"Disallow\"}: ${rule.path}`;\n if (!seen.has(line)) {\n seen.add(line);\n lines.push(line);\n }\n }\n\n return lines;\n}\n\nfunction getApplicableRules(parsed: ParsedRobots, botUserAgent: string): { rules: RobotsRule[]; source: \"specific\" | \"wildcard\" | \"none\" } {\n const target = botUserAgent.toLowerCase();\n\n const specificGroups = parsed.groups.filter((group) =>\n group.userAgents.some((agent) => agent === target)\n );\n\n if (specificGroups.length > 0) {\n return {\n source: \"specific\",\n rules: specificGroups.flatMap((group) => group.rules)\n };\n }\n\n const wildcardGroups = parsed.groups.filter((group) =>\n group.userAgents.some((agent) => agent === \"*\")\n );\n\n if (wildcardGroups.length > 0) {\n return {\n source: \"wildcard\",\n rules: wildcardGroups.flatMap((group) => group.rules)\n };\n }\n\n return { source: \"none\", rules: [] };\n}\n\nexport function evaluateBotAccess(bot: AIBot, parsed: ParsedRobots): BotAccessResult {\n const applicable = getApplicableRules(parsed, bot.userAgent);\n\n if (applicable.source === \"none\") {\n return {\n bot,\n status: \"not_mentioned\",\n rules: []\n };\n }\n\n const status = classifyStatus(applicable.rules);\n\n return {\n bot,\n status,\n rules: toRuleLines(applicable.rules)\n };\n}\n\nfunction buildImplicitAllowAnalysis(\n robotsUrl: string,\n warning: string,\n bots: AIBot[]\n): RobotsAnalysis {\n const botResults = bots.map((bot) => ({\n bot,\n status: \"not_mentioned\" as const,\n rules: []\n }));\n\n return {\n url: robotsUrl,\n found: false,\n rawContent: \"\",\n botResults,\n summary: summarize(botResults),\n sitemaps: [],\n warnings: [warning]\n };\n}\n\nexport async function analyzeRobots(\n siteUrl: string,\n options?: {\n fetchImpl?: typeof fetch;\n timeoutMs?: number;\n maxRedirects?: number;\n bots?: AIBot[];\n }\n): Promise<RobotsAnalysis> {\n const bots = options?.bots ?? aiBots;\n const timeoutMs = options?.timeoutMs ?? 5000;\n const maxRedirects = options?.maxRedirects ?? 5;\n const robotsUrl = new URL(\"/robots.txt\", siteUrl).toString();\n\n try {\n const { response } = await fetchWithRedirects(robotsUrl, {\n fetchImpl: options?.fetchImpl,\n timeoutMs,\n maxRedirects\n });\n\n if (response.status === 404) {\n return buildImplicitAllowAnalysis(\n robotsUrl,\n \"No robots.txt found (404). AI bots are implicitly allowed.\",\n bots\n );\n }\n\n if (!response.ok) {\n return buildImplicitAllowAnalysis(\n robotsUrl,\n `Could not read robots.txt (${response.status}). AI bots are treated as implicitly allowed.`,\n bots\n );\n }\n\n const rawContent = await response.text();\n const parsed = parseRobotsTxt(rawContent);\n const botResults = bots.map((bot) => evaluateBotAccess(bot, parsed));\n\n return {\n url: robotsUrl,\n found: true,\n rawContent,\n botResults,\n summary: summarize(botResults),\n sitemaps: parsed.sitemaps,\n warnings: []\n };\n } catch (error) {\n return buildImplicitAllowAnalysis(\n robotsUrl,\n `Failed to fetch robots.txt: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n bots\n );\n }\n}\n","import type { PageScanResult } from \"../types.js\";\nimport { fetchWithRedirects } from \"./http.js\";\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const output: Record<string, string> = {};\n headers.forEach((value, key) => {\n output[key.toLowerCase()] = value;\n });\n return output;\n}\n\nexport async function fetchPage(\n url: string,\n options?: {\n fetchImpl?: typeof fetch;\n timeoutMs?: number;\n maxRedirects?: number;\n }\n): Promise<PageScanResult> {\n const timeoutMs = options?.timeoutMs ?? 8000;\n const maxRedirects = options?.maxRedirects ?? 5;\n const start = Date.now();\n\n try {\n const { response, finalUrl } = await fetchWithRedirects(url, {\n fetchImpl: options?.fetchImpl,\n timeoutMs,\n maxRedirects\n });\n\n const html = await response.text();\n\n return {\n requestedUrl: url,\n finalUrl,\n statusCode: response.status,\n ok: response.ok,\n html,\n headers: headersToObject(response.headers),\n loadTimeMs: Date.now() - start,\n error: response.ok ? undefined : `HTTP ${response.status}`\n };\n } catch (error) {\n return {\n requestedUrl: url,\n finalUrl: url,\n statusCode: null,\n ok: false,\n html: \"\",\n headers: {},\n loadTimeMs: Date.now() - start,\n error: error instanceof Error ? error.message : \"Unknown fetch error\"\n };\n }\n}\n","import { aiBots } from \"./data/ai-bots.js\";\nimport { analyzeGeoScore } from \"./analyzers/geo-score.js\";\nimport { analyzeRobots } from \"./scanner/robots.js\";\nimport { fetchPage } from \"./scanner/page.js\";\nimport type { GeoCheckOptions, GeoCheckResult, Recommendation } from \"./types.js\";\n\nconst SCHEMA_VERSION = \"1.0.0\" as const;\nconst MONITOR_URL = \"https://www.summalytics.ai\" as const;\n\nfunction normalizeUrl(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"URL is empty.\");\n }\n\n const withScheme = /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n const parsed = new URL(withScheme);\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Only http:// and https:// URLs are supported.\");\n }\n\n return parsed.toString();\n}\n\nfunction notMentionedWarningRecommendation(count: number): Recommendation | null {\n if (count <= 0) {\n return null;\n }\n\n return {\n priority: \"low\",\n category: \"AI Accessibility\",\n message: `${count} AI bot(s) are not explicitly mentioned in robots.txt. Add explicit directives for policy clarity.`,\n impact: \"No score impact\",\n checkId: \"ai.bots_explicit_policy\"\n };\n}\n\nexport async function geoCheck(url: string, options?: GeoCheckOptions): Promise<GeoCheckResult> {\n const startedAt = Date.now();\n const scannedAt = new Date().toISOString();\n const warnings: string[] = [];\n const errors: string[] = [];\n\n let targetUrl: string;\n\n try {\n targetUrl = normalizeUrl(url);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid URL\";\n return {\n schemaVersion: SCHEMA_VERSION,\n targetUrl: url,\n scannedAt,\n durationMs: Date.now() - startedAt,\n robots: null,\n geoScore: null,\n recommendations: [],\n monitor: MONITOR_URL,\n warnings,\n errors: [message],\n success: false\n };\n }\n\n const shouldFetchPage = !options?.robotsOnly;\n const shouldFetchRobots = true;\n\n const [robots, page] = await Promise.all([\n shouldFetchRobots\n ? analyzeRobots(targetUrl, {\n fetchImpl: options?.fetchImpl,\n timeoutMs: 5000,\n maxRedirects: 5,\n bots: aiBots\n })\n : Promise.resolve(null),\n shouldFetchPage\n ? fetchPage(targetUrl, {\n fetchImpl: options?.fetchImpl,\n timeoutMs: 8000,\n maxRedirects: 5\n })\n : Promise.resolve(null)\n ]);\n\n if (robots?.warnings.length) {\n warnings.push(...robots.warnings);\n }\n\n if (page?.error) {\n warnings.push(`Page fetch warning: ${page.error}`);\n }\n\n let geoScore = null;\n\n if (shouldFetchPage) {\n if (page && page.ok && page.html) {\n geoScore = analyzeGeoScore({\n html: page.html,\n finalUrl: page.finalUrl,\n loadTimeMs: page.loadTimeMs,\n robots: robots ?? {\n url: `${targetUrl.replace(/\\/$/, \"\")}/robots.txt`,\n found: false,\n rawContent: \"\",\n botResults: [],\n summary: {\n totalBots: 0,\n allowed: 0,\n blocked: 0,\n partiallyBlocked: 0,\n notMentioned: 0\n },\n sitemaps: [],\n warnings: []\n }\n });\n } else {\n errors.push(\"Could not fetch page HTML for GEO analysis.\");\n }\n }\n\n const recommendations: Recommendation[] = geoScore ? [...geoScore.recommendations] : [];\n\n if (!geoScore && robots) {\n const warningRec = notMentionedWarningRecommendation(robots.summary.notMentioned);\n if (warningRec) {\n recommendations.push(warningRec);\n }\n }\n\n const result: GeoCheckResult = {\n schemaVersion: SCHEMA_VERSION,\n targetUrl,\n scannedAt,\n durationMs: Date.now() - startedAt,\n robots: options?.geoOnly ? null : robots,\n geoScore: options?.robotsOnly ? null : geoScore,\n recommendations,\n monitor: MONITOR_URL,\n warnings,\n errors,\n success: errors.length === 0 || !!robots\n };\n\n return result;\n}\n\nasync function mapLimit<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>\n): Promise<R[]> {\n const output = new Array<R>(items.length);\n let nextIndex = 0;\n\n async function runner(): Promise<void> {\n while (true) {\n const current = nextIndex;\n nextIndex += 1;\n\n if (current >= items.length) {\n return;\n }\n\n output[current] = await worker(items[current] as T, current);\n }\n }\n\n const safeConcurrency = Math.max(1, Math.min(concurrency, items.length || 1));\n await Promise.all(Array.from({ length: safeConcurrency }, () => runner()));\n\n return output;\n}\n\nexport async function geoCheckMany(\n urls: string[],\n options?: GeoCheckOptions\n): Promise<GeoCheckResult[]> {\n const concurrency = options?.concurrency ?? 3;\n return mapLimit(urls, concurrency, (url) => geoCheck(url, options));\n}\n\nexport { aiBots } from \"./data/ai-bots.js\";\nexport type {\n AIBot,\n BotAccessResult,\n BotStatus,\n CategoryScore,\n Check,\n GEOScore,\n GeoCheckOptions,\n GeoCheckResult,\n Recommendation,\n RobotsAnalysis\n} from \"./types.js\";\n","import type { GeoCheckResult } from \"../types.js\";\n\nfunction serializeResult(result: GeoCheckResult): Record<string, unknown> {\n return {\n schemaVersion: result.schemaVersion,\n targetUrl: result.targetUrl,\n scannedAt: result.scannedAt,\n durationMs: result.durationMs,\n robots: result.robots,\n geoScore: result.geoScore,\n recommendations: result.recommendations,\n monitor: result.monitor,\n warnings: result.warnings,\n errors: result.errors,\n success: result.success\n };\n}\n\nexport function formatJsonOutput(result: GeoCheckResult | GeoCheckResult[]): string {\n const payload = Array.isArray(result)\n ? result.map((item) => serializeResult(item))\n : serializeResult(result);\n\n return JSON.stringify(payload, null, 2);\n}\n","import chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { BotAccessResult, GeoCheckResult, Recommendation } from \"../types.js\";\n\nconst PRIORITY_ICON: Record<Recommendation[\"priority\"], string> = {\n high: \"๐Ÿ”ด\",\n medium: \"๐ŸŸก\",\n low: \"๐ŸŸข\"\n};\n\nfunction statusBadge(status: BotAccessResult[\"status\"]): string {\n if (status === \"allowed\") {\n return `${chalk.green(\"โœ…\")} Allowed`;\n }\n if (status === \"blocked\") {\n return `${chalk.red(\"โŒ\")} Blocked`;\n }\n if (status === \"partially_blocked\") {\n return `${chalk.yellow(\"โš ๏ธ\")} Partially blocked`;\n }\n return `${chalk.yellow(\"โš ๏ธ\")} Not mentioned (implicitly allowed)`;\n}\n\nfunction bar(score: number, max: number, width = 12): string {\n const ratio = max === 0 ? 0 : score / max;\n const filled = Math.round(ratio * width);\n return `${\"โ–ˆ\".repeat(filled)}${\"โ–‘\".repeat(Math.max(0, width - filled))}`;\n}\n\nfunction headerBlock(): string {\n const lines = [\n \"โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”\",\n \"โ”‚ geo-check v1.0.0 โ”‚\",\n \"โ”‚ AI Visibility Scanner โ”‚\",\n \"โ”‚ https://www.summalytics.ai โ”‚\",\n \"โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\"\n ];\n\n return chalk.cyan(lines.join(\"\\n\"));\n}\n\nfunction renderBots(results: BotAccessResult[]): string {\n const table = new Table({\n head: [\"Bot\", \"Company\", \"Status\"],\n colWidths: [24, 16, 34],\n wordWrap: true\n });\n\n for (const result of results) {\n table.push([result.bot.name, result.bot.company, statusBadge(result.status)]);\n }\n\n return table.toString();\n}\n\nfunction renderRecommendations(recommendations: Recommendation[], verbose: boolean): string {\n const selected = verbose ? recommendations : recommendations.slice(0, 5);\n\n if (selected.length === 0) {\n return `${chalk.green(\"โœ…\")} No recommendations. GEO profile looks strong.`;\n }\n\n return selected\n .map((recommendation) => {\n const icon = PRIORITY_ICON[recommendation.priority];\n return ` ${icon} ${recommendation.priority.toUpperCase()}: ${recommendation.message} (${recommendation.impact})`;\n })\n .join(\"\\n\");\n}\n\nfunction partialBlockExplanation(results: BotAccessResult[]): string[] {\n const partialResults = results.filter((result) => result.status === \"partially_blocked\");\n if (partialResults.length === 0) {\n return [];\n }\n\n const ruleCounts = new Map<string, number>();\n for (const result of partialResults) {\n for (const rule of result.rules) {\n if (!rule.startsWith(\"Disallow:\")) {\n continue;\n }\n ruleCounts.set(rule, (ruleCounts.get(rule) ?? 0) + 1);\n }\n }\n\n const topRules = [...ruleCounts.entries()]\n .sort((left, right) => right[1] - left[1])\n .slice(0, 3)\n .map(([rule, count]) => `${rule} (${count})`);\n\n const lines = [\n `${chalk.yellow(\"โ„น๏ธ\")} Partially blocked means bots can crawl some paths but are blocked on others by robots.txt rules.`\n ];\n\n if (topRules.length > 0) {\n lines.push(` Top blocking rules: ${topRules.join(\" ยท \")}`);\n }\n\n return lines;\n}\n\nfunction renderSingleResult(result: GeoCheckResult, options: { verbose: boolean }): string {\n const lines: string[] = [];\n lines.push(headerBlock());\n lines.push(\"\");\n lines.push(`Scanning ${chalk.bold(result.targetUrl)} ...`);\n\n if (!result.success) {\n lines.push(chalk.red(\"Scan failed.\"));\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n lines.push(` ${chalk.red(\"โŒ\")} ${error}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n if (result.geoScore) {\n lines.push(\"\\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(\n `${chalk.bold(\"๐Ÿ“Š GEO READINESS SCORE\")}: ${chalk.bold(`${result.geoScore.total}/100`)} (${result.geoScore.grade})`\n );\n lines.push(\"โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n\n const { categories } = result.geoScore;\n lines.push(\n ` Structured Data ${bar(categories.structuredData.score, categories.structuredData.maxScore)} ${categories.structuredData.score}/${categories.structuredData.maxScore}`\n );\n lines.push(\n ` Content Structure ${bar(categories.contentStructure.score, categories.contentStructure.maxScore)} ${categories.contentStructure.score}/${categories.contentStructure.maxScore}`\n );\n lines.push(\n ` Authority Signals ${bar(categories.authoritySignals.score, categories.authoritySignals.maxScore)} ${categories.authoritySignals.score}/${categories.authoritySignals.maxScore}`\n );\n lines.push(\n ` AI Accessibility ${bar(categories.aiAccessibility.score, categories.aiAccessibility.maxScore)} ${categories.aiAccessibility.score}/${categories.aiAccessibility.maxScore}`\n );\n }\n\n if (result.robots) {\n lines.push(\"\\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(chalk.bold(\"๐Ÿค– AI BOT ACCESS\"));\n lines.push(\"โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(renderBots(result.robots.botResults));\n lines.push(\n `Summary: ${result.robots.summary.allowed} allowed ยท ${result.robots.summary.blocked} blocked ยท ${result.robots.summary.partiallyBlocked} partial ยท ${result.robots.summary.notMentioned} not mentioned`\n );\n lines.push(...partialBlockExplanation(result.robots.botResults));\n }\n\n lines.push(\"\\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(chalk.bold(\"๐Ÿ’ก TOP RECOMMENDATIONS\"));\n lines.push(\"โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(renderRecommendations(result.recommendations, options.verbose));\n\n if (result.warnings.length > 0) {\n lines.push(\"\\nWarnings:\");\n for (const warning of result.warnings) {\n lines.push(` ${chalk.yellow(\"โš ๏ธ\")} ${warning}`);\n }\n }\n\n if (options.verbose && result.geoScore) {\n lines.push(\"\\nVerbose checks:\");\n for (const [categoryName, category] of Object.entries(result.geoScore.categories)) {\n lines.push(` ${chalk.bold(categoryName)}: ${category.score}/${category.maxScore}`);\n for (const check of category.checks) {\n const marker = check.passed ? chalk.green(\"โœ…\") : chalk.red(\"โŒ\");\n lines.push(` ${marker} ${check.name} (${check.points}/${check.maxPoints}) - ${check.detail}`);\n }\n }\n }\n\n lines.push(\"\\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n lines.push(\"For ongoing monitoring and AI traffic analytics: https://www.summalytics.ai\");\n lines.push(\"โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\");\n\n return lines.join(\"\\n\");\n}\n\nexport function renderTerminalResults(\n results: GeoCheckResult[],\n options: { verbose: boolean }\n): string {\n return results.map((result) => renderSingleResult(result, options)).join(\"\\n\\n\");\n}\n"],"mappings":"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","names":["check","check"]}
@@ -0,0 +1 @@
1
+ export { f as aiBots } from '../ai-bots-DziNn7Mx.js';
@@ -0,0 +1,7 @@
1
+ import {
2
+ aiBots
3
+ } from "../chunk-3RPMJ2W2.js";
4
+ export {
5
+ aiBots
6
+ };
7
+ //# sourceMappingURL=ai-bots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ import { G as GeoCheckOptions, a as GeoCheckResult } from './ai-bots-DziNn7Mx.js';
2
+ export { A as AIBot, B as BotAccessResult, b as BotStatus, C as CategoryScore, c as Check, d as GEOScore, R as Recommendation, e as RobotsAnalysis, f as aiBots } from './ai-bots-DziNn7Mx.js';
3
+
4
+ declare function geoCheck(url: string, options?: GeoCheckOptions): Promise<GeoCheckResult>;
5
+ declare function geoCheckMany(urls: string[], options?: GeoCheckOptions): Promise<GeoCheckResult[]>;
6
+
7
+ export { GeoCheckOptions, GeoCheckResult, geoCheck, geoCheckMany };