UNPKG

a11yanalyze

Version:

A command-line tool for developers and QA engineers to test web pages and websites for WCAG 2.2 AA accessibility compliance

635 lines (603 loc) 14 kB
/** * Output and reporting type definitions * Comprehensive JSON report schema for accessibility results */ import { WCAGLevel } from './wcag'; import { ScanResult } from './index'; import { CrawlSession, CrawlStats } from './crawler'; /** * Main accessibility report structure */ export interface AccessibilityReport { /** Report metadata */ metadata: ReportMetadata; /** Executive summary */ summary: ExecutiveSummary; /** Single page results (for page reports) */ page?: PageReport; /** Multi-page results (for site reports) */ site?: SiteReport; /** Technical details and configuration */ technical: TechnicalDetails; /** Report generation errors */ errors: ReportError[]; } /** * Report metadata and identification */ export interface ReportMetadata { /** Report format version */ version: string; /** Report type */ type: 'page' | 'site'; /** Generation timestamp */ generatedAt: string; /** Report generation duration (ms) */ generationTime: number; /** Target URL(s) */ target: string | string[]; /** Report title */ title: string; /** Optional report description */ description?: string; /** Tool information */ tool: { name: string; version: string; userAgent: string; }; } /** * Executive summary for quick overview */ export interface ExecutiveSummary { /** Overall accessibility score (0-100) */ overallScore: number; /** Overall compliance status */ compliant: boolean; /** WCAG compliance level achieved */ achievedLevel: WCAGLevel | 'None'; /** Total pages scanned */ pagesScanned: number; /** Total issues found */ totalIssues: number; /** Issues by severity */ issuesBySeverity: SeverityBreakdown; /** WCAG level breakdown */ wcagLevelBreakdown: WCAGLevelBreakdown; /** Key recommendations */ keyRecommendations: string[]; /** Completion status */ status: 'completed' | 'partial' | 'failed'; } /** * Issue severity breakdown */ export interface SeverityBreakdown { critical: number; serious: number; moderate: number; minor: number; warning: number; } /** * WCAG level breakdown */ export interface WCAGLevelBreakdown { A: number; AA: number; AAA: number; ARIA: number; } /** * Single page report details */ export interface PageReport { /** Page URL */ url: string; /** Page title */ title: string; /** Page accessibility score */ score: number; /** Page compliance status */ compliant: boolean; /** Issues found on this page */ issues: ReportIssue[]; /** Page metadata */ metadata: PageMetadata; /** Page performance metrics */ performance: PerformanceMetrics; /** Page screenshots (if enabled) */ screenshots?: ScreenshotData[]; } /** * Multi-page site report details */ export interface SiteReport { /** Site base URL */ baseUrl: string; /** Crawl session information */ crawlInfo: CrawlInfo; /** Site-wide statistics */ statistics: SiteStatistics; /** Page results */ pages: PageSummary[]; /** Site-wide issues analysis */ issuesAnalysis: IssuesAnalysis; /** Compliance analysis */ complianceAnalysis: ComplianceAnalysis; /** Domain breakdown (if multi-domain) */ domainBreakdown?: DomainBreakdown[]; } /** * Crawl session information */ export interface CrawlInfo { /** Session ID */ sessionId: string; /** Start URLs */ startUrls: string[]; /** Crawl start time */ startTime: string; /** Crawl end time */ endTime: string; /** Total crawl duration (ms) */ duration: number; /** Crawl configuration */ config: { maxDepth: number; maxPages: number; allowedDomains: string[]; excludedPaths: string[]; }; /** Crawl status */ status: 'completed' | 'partial' | 'failed' | 'cancelled'; } /** * Site-wide statistics */ export interface SiteStatistics { /** Total pages discovered */ pagesDiscovered: number; /** Pages successfully scanned */ pagesScanned: number; /** Pages failed to scan */ pagesFailed: number; /** Pages skipped */ pagesSkipped: number; /** Average page score */ averageScore: number; /** Score distribution */ scoreDistribution: ScoreDistribution; /** Response time statistics */ responseTimeStats: ResponseTimeStats; } /** * Score distribution across pages */ export interface ScoreDistribution { /** Excellent (90-100) */ excellent: number; /** Good (80-89) */ good: number; /** Fair (70-79) */ fair: number; /** Poor (60-69) */ poor: number; /** Critical (<60) */ critical: number; } /** * Response time statistics */ export interface ResponseTimeStats { /** Average page load time (ms) */ averageLoadTime: number; /** Fastest page load time (ms) */ fastestLoadTime: number; /** Slowest page load time (ms) */ slowestLoadTime: number; /** Average scan time (ms) */ averageScanTime: number; } /** * Page summary for site reports */ export interface PageSummary { /** Page URL */ url: string; /** Page title */ title: string; /** Accessibility score */ score: number; /** Compliance status */ compliant: boolean; /** Issue count by severity */ issuesBySeverity: SeverityBreakdown; /** Page load time */ loadTime: number; /** Scan time */ scanTime: number; /** Crawl depth */ depth: number; /** Any errors encountered */ errors: string[]; } /** * Detailed issue information */ export interface ReportIssue { /** Unique issue identifier */ id: string; /** WCAG success criterion reference */ wcagReference: string; /** WCAG conformance level */ level: WCAGLevel; /** Issue severity */ severity: 'critical' | 'serious' | 'moderate' | 'minor' | 'warning'; /** Issue category */ category: IssueCategory; /** Brief issue title */ title: string; /** Detailed description */ description: string; /** Impact on users */ impact: string; /** Remediation guidance */ remediation: string; /** Additional help resources */ helpUrl?: string; /** Number of occurrences */ occurrences: number; /** Affected elements */ elements: AffectedElement[]; /** Pages where this issue occurs (site reports) */ affectedPages?: string[]; } /** * Issue categories for organization */ export type IssueCategory = | 'images' | 'forms' | 'navigation' | 'content' | 'color' | 'keyboard' | 'focus' | 'aria' | 'structure' | 'multimedia' | 'timing' | 'input' | 'error' | 'other'; /** * Affected element details */ export interface AffectedElement { /** CSS selector */ selector: string; /** Element HTML snippet */ html: string; /** Element text content (if any) */ text?: string; /** Element position information */ position?: ElementPosition; /** Additional context */ context?: string; } /** * Element position on page */ export interface ElementPosition { /** X coordinate */ x: number; /** Y coordinate */ y: number; /** Element width */ width: number; /** Element height */ height: number; } /** * Site-wide issues analysis */ export interface IssuesAnalysis { /** Most common issues across site */ mostCommonIssues: CommonIssue[]; /** Issues by category */ issuesByCategory: Record<IssueCategory, number>; /** Critical issues requiring immediate attention */ criticalIssues: ReportIssue[]; /** Pattern analysis */ patterns: IssuePattern[]; } /** * Common issue summary */ export interface CommonIssue { /** Issue identifier */ id: string; /** Issue title */ title: string; /** WCAG reference */ wcagReference: string; /** Number of occurrences */ occurrences: number; /** Number of affected pages */ affectedPages: number; /** Percentage of pages affected */ affectedPercentage: number; } /** * Issue pattern analysis */ export interface IssuePattern { /** Pattern description */ pattern: string; /** Pattern type */ type: 'template' | 'component' | 'systematic' | 'content'; /** Affected URLs */ affectedUrls: string[]; /** Recommended fix approach */ recommendation: string; } /** * WCAG compliance analysis */ export interface ComplianceAnalysis { /** Compliance by WCAG level */ levelCompliance: { A: ComplianceLevel; AA: ComplianceLevel; AAA: ComplianceLevel; }; /** Success criteria analysis */ successCriteria: SuccessCriteriaAnalysis[]; /** Compliance trends (if historical data available) */ trends?: ComplianceTrend[]; } /** * Compliance level details */ export interface ComplianceLevel { /** Is this level achieved? */ compliant: boolean; /** Compliance percentage */ percentage: number; /** Number of passing pages */ passingPages: number; /** Number of failing pages */ failingPages: number; /** Blocking issues */ blockingIssues: string[]; } /** * Success criteria analysis */ export interface SuccessCriteriaAnalysis { /** Success criterion number */ criterion: string; /** WCAG level */ level: WCAGLevel; /** Title */ title: string; /** Compliance status */ status: 'pass' | 'fail' | 'partial'; /** Number of passing pages */ passingPages: number; /** Number of failing pages */ failingPages: number; /** Related issues */ relatedIssues: string[]; } /** * Compliance trend data */ export interface ComplianceTrend { /** Date */ date: string; /** Overall score */ score: number; /** Issue count */ issueCount: number; /** Compliance status */ compliant: boolean; } /** * Domain breakdown for multi-domain sites */ export interface DomainBreakdown { /** Domain name */ domain: string; /** Number of pages */ pageCount: number; /** Average score */ averageScore: number; /** Compliance status */ compliant: boolean; /** Issues by severity */ issuesBySeverity: SeverityBreakdown; /** Most common issues */ commonIssues: string[]; } /** * Page metadata */ export interface PageMetadata { /** Page title */ title: string; /** Meta description */ description?: string; /** Page language */ language: string; /** Viewport configuration */ viewport: string; /** Character encoding */ charset: string; /** Page size information */ size: { /** Total elements */ totalElements: number; /** Interactive elements */ interactiveElements: number; /** Images */ images: number; /** Links */ links: number; /** Form controls */ formControls: number; /** Headings */ headings: number; }; /** Accessibility features detected */ accessibilityFeatures: string[]; } /** * Performance metrics */ export interface PerformanceMetrics { /** Page load time (ms) */ loadTime: number; /** Time to interactive (ms) */ timeToInteractive?: number; /** Scan duration (ms) */ scanTime: number; /** Total processing time (ms) */ totalTime: number; /** Resource loading stats */ resources: { /** Total requests */ total: number; /** Failed requests */ failed: number; /** Total size (bytes) */ totalSize: number; }; } /** * Screenshot data */ export interface ScreenshotData { /** Screenshot type */ type: 'full' | 'viewport' | 'element'; /** Base64 encoded image data */ data: string; /** Image format */ format: 'png' | 'jpeg'; /** Viewport size when taken */ viewport: { width: number; height: number; }; /** Timestamp */ timestamp: string; } /** * Technical details and configuration */ export interface TechnicalDetails { /** Scan configuration */ scanConfig: { /** WCAG level tested */ wcagLevel: WCAGLevel; /** Include AAA issues as warnings */ includeAAA: boolean; /** Include ARIA issues */ includeARIA: boolean; /** Browser configuration */ browser: { name: string; version: string; headless: boolean; viewport: { width: number; height: number; }; }; }; /** Rules executed */ rulesExecuted: RuleExecutionInfo[]; /** Environment information */ environment: { /** Tool version */ toolVersion: string; /** Node.js version */ nodeVersion: string; /** Platform */ platform: string; /** Architecture */ arch: string; }; /** Processing statistics */ processing: { /** Total rules executed */ totalRules: number; /** Rules passed */ rulesPassed: number; /** Rules failed */ rulesFailed: number; /** Custom rules used */ customRules: number; }; } /** * Rule execution information */ export interface RuleExecutionInfo { /** Rule identifier */ ruleId: string; /** Rule name */ name: string; /** WCAG reference */ wcagReference: string; /** Execution status */ status: 'passed' | 'failed' | 'inapplicable' | 'cantTell'; /** Execution time (ms) */ executionTime: number; /** Number of violations found */ violations: number; } /** * Report generation errors */ export interface ReportError { /** Error type */ type: 'scan' | 'crawl' | 'generation' | 'validation'; /** Error severity */ severity: 'critical' | 'error' | 'warning' | 'info'; /** Error message */ message: string; /** Error details */ details?: string; /** Affected URL (if applicable) */ url?: string; /** Timestamp */ timestamp: string; /** Stack trace (for critical errors) */ stack?: string; } /** * Report generation options */ export interface ReportOptions { /** Include screenshots */ includeScreenshots: boolean; /** Include raw scan data */ includeRawData: boolean; /** Include historical trends */ includeTrends: boolean; /** Minimum severity to include */ minSeverity: 'critical' | 'serious' | 'moderate' | 'minor' | 'warning'; /** Group issues by type */ groupIssues: boolean; /** Include remediation guidance */ includeRemediation: boolean; /** Report format version */ version: string; /** Custom report title */ title?: string; /** Custom report description */ description?: string; }