import { type FreshnessConfig } from "../utils/content-freshness.js"; import { type AuthConfig } from "../utils/auth-detection.js"; import type { BrokenLink, ValidationResult } from "../types/config.js"; import type { MarkdownLink, ParsedMarkdownFile } from "../types/links.js"; import type { WikilinkResolution } from "./obsidian-vault.js"; /** * Configuration options for link validation operations. * * Controls which types of links are validated and how validation is performed, including external * link checking, timeout settings, and strictness levels. * * @category Core */ export interface LinkValidatorOptions { /** Check external links (http/https) */ checkExternal?: boolean; /** Timeout for external link checks in milliseconds */ externalTimeout?: number; /** Treat missing files as errors */ strictInternal?: boolean; /** Check Claude import links */ checkClaudeImports?: boolean; /** Enable content freshness detection for external links */ checkContentFreshness?: boolean; /** Configuration for content freshness detection */ freshnessConfig?: Partial; /** Enable authentication-aware link validation */ enableAuthDetection?: boolean; /** Configuration for authentication detection */ authConfig?: Partial; /** Treat auth-required links as valid (not broken) */ allowAuthRequired?: boolean; /** Check Obsidian wikilinks against the vault */ checkWikilinks?: boolean; /** External-link hostnames excluded from checking entirely (known problematic sites) */ skipDomains?: string[]; /** Extra attempts for transient external failures (network errors, 5xx, 429) */ externalRetries?: number; /** Resolver for wikilink targets against the whole vault file set */ wikilinkResolver?: (target: string) => WikilinkResolution; } /** * Validates markdown links and identifies broken or problematic references. * * The LinkValidator checks various types of links including internal file references, external * URLs, and Claude import syntax. It provides comprehensive reporting of validation issues and * supports different validation modes for different use cases. * * @category Core * * @example * Basic link validation * ```typescript * const validator = new LinkValidator({ * checkExternal: true, * strictInternal: true, * externalTimeout: 10000 * }); * * const result = await validator.validateFile('docs/api.md'); * * if (!result.isValid) { * console.log(`Found ${result.brokenLinks.length} broken links`); * result.brokenLinks.forEach(link => { * console.log(`- ${link.href} (line ${link.line}): ${link.reason}`); * }); * } * ``` * * @example * Batch validation * ```typescript * const validator = new LinkValidator(); * const files = ['docs/guide.md', 'docs/api.md', 'docs/examples.md']; * * const results = await validator.validateFiles(files); * const totalBroken = results.reduce((sum, r) => sum + r.brokenLinks.length, 0); * console.log(`Found ${totalBroken} broken links across ${files.length} files`); * ``` */ export declare class LinkValidator { private options; private freshnessDetector?; private authDetector?; constructor(options?: LinkValidatorOptions); validateFiles(files: ParsedMarkdownFile[]): Promise; validateFile(file: ParsedMarkdownFile): Promise; validateLink(link: MarkdownLink, sourceFile: string): Promise; private validateInternalLink; private validateClaudeImportLink; private validateExternalLink; private validateImageLink; validateLinkIntegrity(files: ParsedMarkdownFile[]): Promise<{ valid: boolean; circularReferences: string[][]; brokenLinks: BrokenLink[]; warnings: string[]; }>; /** * Validates a specific array of links from a single file. * * @param links - Array of links to validate * @param sourceFile - Path to the source file containing the links * * @returns Promise resolving to validation result with broken links */ validateLinks(links: MarkdownLink[], sourceFile: string): Promise<{ brokenLinks: BrokenLink[]; }>; /** * Check for circular references - overloaded method that supports both parsed files and file * paths. */ checkCircularReferences(files: ParsedMarkdownFile[]): Promise; checkCircularReferences(files: string[]): Promise<{ hasCircularReferences: boolean; circularPaths?: string[] | undefined; }>; /** * Validates anchor links by checking if the target heading exists in the file. * * @param link - The anchor link to validate * @param sourceFile - Path to the file containing the link * * @returns Promise resolving to BrokenLink if invalid, null if valid */ private validateWikilinkLink; private validateAnchorLink; } //# sourceMappingURL=link-validator.d.ts.map