/** * JS twin of the `fragment_url` SQL predicate below. * * Google does not index fragments as distinct entities — a `#anchor` URL always * resolves to its parent document — so inspecting one can never return a useful * verdict, and counting one inflates every per-URL total by a phantom row. Write * paths reject these; read paths exclude them. * * Kept beside {@link INDEXING_ISSUE_FILTERS} so the JS and SQL sides of the rule * cannot drift; call sites must use this rather than re-deriving `includes('#')`. */ declare function isFragmentUrl(url: string): boolean; declare const INDEXING_ISSUE_FILTERS: { readonly canonical_mismatch: "canonical_mismatch_kind = 'path'"; readonly canonical_cross_domain: "canonical_mismatch_kind = 'cross_domain'"; readonly canonical_formatting: "canonical_mismatch_kind = 'formatting'"; readonly stale_crawl: "last_crawl_time < datetime('now', '-30 days')"; readonly very_stale_crawl: "last_crawl_time < datetime('now', '-60 days')"; readonly not_indexed: "verdict IN ('FAIL', 'PARTIAL', 'NEUTRAL')"; readonly unknown_to_google: "coverage_state = 'URL is unknown to Google'"; readonly crawled_not_indexed: "coverage_state = 'Crawled - currently not indexed'"; readonly discovered_not_indexed: "coverage_state = 'Discovered - currently not indexed'"; readonly not_found: "page_fetch_state = 'NOT_FOUND' OR coverage_state = 'Not found (404)'"; readonly soft_404: "page_fetch_state = 'SOFT_404' OR coverage_state = 'Soft 404'"; readonly server_error: "page_fetch_state = 'SERVER_ERROR' OR coverage_state = 'Server error (5xx)'"; readonly access_forbidden: "page_fetch_state = 'ACCESS_FORBIDDEN' OR coverage_state = 'Blocked due to access forbidden (403)'"; readonly access_denied: "page_fetch_state = 'ACCESS_DENIED' OR coverage_state = 'Blocked due to unauthorized request (401)'"; readonly blocked_4xx: "page_fetch_state = 'BLOCKED_4XX' OR coverage_state = 'Blocked due to other 4xx issue'"; readonly redirect_error: "page_fetch_state = 'REDIRECT_ERROR' OR coverage_state = 'Redirect error'"; readonly crawl_error: "page_fetch_state IN ('INTERNAL_CRAWL_ERROR', 'INVALID_URL')"; readonly blocked_robots: "robots_txt_state = 'DISALLOWED'"; readonly noindex: "indexing_state LIKE '%noindex%' OR coverage_state LIKE '%noindex%'"; readonly redirect: "coverage_state = 'Page with redirect'"; readonly sitemap_redirect: "coverage_state = 'Page with redirect' AND sitemaps IS NOT NULL AND sitemaps != '[]'"; readonly alternate_canonical: "coverage_state = 'Alternate page with proper canonical tag'"; readonly duplicate_no_canonical: "coverage_state = 'Duplicate without user-selected canonical'"; readonly indexed_consider_canonical: "coverage_state = 'Indexed; consider marking as canonical'"; readonly page_removed: "coverage_state = 'Blocked by page removal tool'"; readonly fragment_url: "url LIKE '%#%'"; readonly mobile_fail: "mobile_verdict IN ('FAIL', 'PARTIAL')"; readonly rich_results_fail: "rich_results_verdict = 'FAIL'"; readonly rich_results_warning: "rich_results_verdict = 'PARTIAL'"; readonly rich_results_pass: "rich_results_verdict = 'PASS'"; }; type IndexingIssueType = keyof typeof INDEXING_ISSUE_FILTERS; declare const INDEXING_ISSUE_LABELS: Record; declare const INDEXING_ISSUE_SEVERITY: Record; /** * Every `pageFetchState` the URL Inspection API documents. `SUCCESSFUL` and the * `_UNSPECIFIED` sentinel are non-faults; the rest each map to a filter above. */ declare const KNOWN_PAGE_FETCH_STATES: ReadonlySet; /** * Every `coverageState` string we have a bucket for, plus the indexed-state strings * that are not faults. Google is free to invent new prose here at any time — that's * exactly what {@link unmappedInspectionReasons} exists to catch. */ declare const KNOWN_COVERAGE_STATES: ReadonlySet; interface UnmappedInspectionReasons { coverageStates: string[]; pageFetchStates: string[]; } /** * Which reason strings in this batch of inspection results we have no bucket for. * * Pure, allocation-cheap, and safe to call on every ingest batch. A non-empty * result means Google reports a state the filter map cannot see — the URLs are * still counted in `not_indexed`, but nothing narrower, so the product will * under-report exactly the way it did for `ACCESS_FORBIDDEN` before this existed. */ declare function unmappedInspectionReasons(rows: ReadonlyArray<{ coverageState?: string | null; pageFetchState?: string | null; }>): UnmappedInspectionReasons; export { INDEXING_ISSUE_FILTERS, INDEXING_ISSUE_LABELS, INDEXING_ISSUE_SEVERITY, IndexingIssueType, KNOWN_COVERAGE_STATES, KNOWN_PAGE_FETCH_STATES, UnmappedInspectionReasons, isFragmentUrl, unmappedInspectionReasons };