a11yanalyze
Version:
A command-line tool for developers and QA engineers to test web pages and websites for WCAG 2.2 AA accessibility compliance
270 lines • 7.33 kB
TypeScript
import { ScanResult } from '../types';
import { WCAGLevel } from '../types/wcag';
import { CrawlSession } from '../types/crawler';
/**
* Scoring algorithm configuration
*/
export interface ScoringConfig {
/** Scoring profile to use */
profile: ScoringProfile;
/** WCAG level weights (higher = more important) */
wcagLevelWeights: Record<WCAGLevel, number>;
/** Severity penalty multipliers */
severityPenalties: Record<string, number>;
/** Maximum penalty per issue type */
maxPenaltyPerIssue: number;
/** Minimum possible score */
minScore: number;
/** Maximum possible score */
maxScore: number;
/** Enable bonus scoring */
enableBonuses: boolean;
/** Enable penalty systems */
enablePenalties: boolean;
/** Scoring transparency level */
transparencyLevel: 'basic' | 'detailed' | 'debug';
}
/**
* Predefined scoring profiles for different use cases
*/
export type ScoringProfile = 'strict' | 'balanced' | 'lenient' | 'enterprise' | 'custom';
/**
* Detailed score breakdown for transparency
*/
export interface ScoreBreakdown {
/** Final calculated score */
finalScore: number;
/** Base score before adjustments */
baseScore: number;
/** Issue-based deductions */
issueDeductions: IssueDeduction[];
/** Performance bonuses applied */
bonuses: ScoreBonus[];
/** System penalties applied */
penalties: ScorePenalty[];
/** Coverage assessment */
coverage: CoverageAssessment;
/** Calculation metadata */
metadata: ScoreMetadata;
}
/**
* Individual issue deduction details
*/
export interface IssueDeduction {
/** Issue ID */
issueId: string;
/** WCAG reference */
wcagReference: string;
/** Issue severity */
severity: string;
/** WCAG level */
level: WCAGLevel;
/** Points deducted */
pointsDeducted: number;
/** Weight applied */
weight: number;
/** Reason for deduction */
reason: string;
}
/**
* Bonus points awarded
*/
export interface ScoreBonus {
/** Bonus type */
type: 'performance' | 'coverage' | 'bestPractices' | 'accessibility';
/** Points awarded */
points: number;
/** Description */
description: string;
/** Criteria met */
criteria: string;
}
/**
* System penalties applied
*/
export interface ScorePenalty {
/** Penalty type */
type: 'timeout' | 'error' | 'coverage' | 'critical';
/** Points deducted */
points: number;
/** Description */
description: string;
/** Affected element/area */
affectedArea?: string;
}
/**
* Coverage assessment details
*/
export interface CoverageAssessment {
/** Percentage of page successfully tested */
testCoverage: number;
/** Total elements on page */
totalElements: number;
/** Elements successfully tested */
testedElements: number;
/** Elements that failed to test */
failedElements: number;
/** Coverage quality score */
qualityScore: number;
/** Areas not covered */
uncoveredAreas: string[];
}
/**
* Score calculation metadata
*/
export interface ScoreMetadata {
/** Scoring algorithm version */
algorithmVersion: string;
/** Profile used */
profile: ScoringProfile;
/** Calculation timestamp */
calculatedAt: string;
/** Total calculation time (ms) */
calculationTime: number;
/** Configuration checksum */
configChecksum: string;
}
/**
* Site-wide scoring aggregation
*/
export interface SiteScore {
/** Overall site score */
overallScore: number;
/** Individual page scores */
pageScores: PageScore[];
/** Aggregation method used */
aggregationMethod: 'weighted' | 'average' | 'median' | 'worst';
/** Site-wide bonuses/penalties */
siteWideBonuses: ScoreBonus[];
/** Score distribution statistics */
distribution: ScoreDistribution;
/** Consistency metrics */
consistency: ConsistencyMetrics;
}
/**
* Individual page score summary
*/
export interface PageScore {
/** Page URL */
url: string;
/** Page score */
score: number;
/** Page weight in site calculation */
weight: number;
/** Issues contributing to score */
issueCount: number;
/** Page importance level */
importance: 'critical' | 'high' | 'medium' | 'low';
}
/**
* Score distribution across site
*/
export interface ScoreDistribution {
/** Average score */
average: number;
/** Median score */
median: number;
/** Minimum score */
minimum: number;
/** Maximum score */
maximum: number;
/** Standard deviation */
standardDeviation: number;
/** Score ranges */
ranges: {
excellent: number;
good: number;
fair: number;
poor: number;
critical: number;
};
}
/**
* Site consistency metrics
*/
export interface ConsistencyMetrics {
/** Consistency score (0-100) */
consistencyScore: number;
/** Pages with scores significantly below average */
outlierPages: string[];
/** Most common issues across site */
commonIssues: string[];
/** Score variance between pages */
scoreVariance: number;
}
/**
* Comprehensive accessibility scoring algorithm
*/
export declare class AccessibilityScorer {
private config;
private static readonly SCORING_PROFILES;
constructor(config?: Partial<ScoringConfig>);
/**
* Calculate accessibility score for a single page
*/
calculatePageScore(scanResult: ScanResult): ScoreBreakdown;
/**
* Calculate site-wide accessibility score
*/
calculateSiteScore(crawlSession: CrawlSession, scanResults: ScanResult[], aggregationMethod?: SiteScore['aggregationMethod']): SiteScore;
/**
* Get scoring configuration
*/
getConfig(): ScoringConfig;
/**
* Update scoring configuration
*/
updateConfig(newConfig: Partial<ScoringConfig>): void;
/**
* Calculate issue deductions
* @private
*/
private calculateIssueDeductions;
/**
* Calculate performance and quality bonuses
* @private
*/
private calculateBonuses;
/**
* Calculate system penalties
* @private
*/
private calculatePenalties;
/**
* Assess test coverage quality
* @private
*/
private assessCoverage;
/**
* Helper methods for scoring calculations
* @private
*/
private getIssueTypeMultiplier;
private calculatePageWeight;
private determinePageImportance;
private isImportantPage;
private aggregateScores;
private calculateSiteWideBonuses;
private calculateScoreDistribution;
private calculateConsistencyMetrics;
private calculateVariance;
private identifyUncoveredAreas;
private mergeWithProfile;
private generateConfigChecksum;
/**
* Static utility methods
*/
/**
* Get all available scoring profiles
*/
static getAvailableProfiles(): ScoringProfile[];
/**
* Get profile configuration
*/
static getProfileConfig(profile: ScoringProfile): Partial<ScoringConfig>;
/**
* Create scorer with predefined profile
*/
static withProfile(profile: ScoringProfile, overrides?: Partial<ScoringConfig>): AccessibilityScorer;
}
//# sourceMappingURL=accessibility-scorer.d.ts.map