// Type definitions for axe-core // Project: https://github.com/dequelabs/axe-core declare namespace axe { type ImpactValue = 'minor' | 'moderate' | 'serious' | 'critical' | null; type TagValue = string; type ReporterVersion = 'v1' | 'v2' | 'raw' | 'rawEnv' | 'no-passes'; type RunOnlyType = 'rule' | 'rules' | 'tag' | 'tags'; type resultGroups = 'inapplicable' | 'passes' | 'incomplete' | 'violations'; type AriaAttrsType = | 'boolean' | 'nmtoken' | 'mntokens' | 'idref' | 'idrefs' | 'string' | 'decimal' | 'int'; type AriaRolesType = 'abstract' | 'widget' | 'structure' | 'landmark'; type DpubRolesType = | 'section' | 'landmark' | 'link' | 'listitem' | 'img' | 'navigation' | 'note' | 'separator' | 'none' | 'sectionhead'; type HtmlContentTypes = | 'flow' | 'sectioning' | 'heading' | 'phrasing' | 'embedded' | 'interactive'; // Array of length 2 or greater type MultiArray = [T, T, ...T[]]; // Selectors within a frame type BaseSelector = string; type ShadowDomSelector = MultiArray; type CrossTreeSelector = BaseSelector | ShadowDomSelector; type LabelledShadowDomSelector = { fromShadowDom: ShadowDomSelector }; // Cross-frame selectors type FramesSelector = Array; type UnlabelledFrameSelector = CrossTreeSelector[]; type LabelledFramesSelector = { fromFrames: MultiArray }; /** * @deprecated Use UnlabelledFrameSelector instead */ type CrossFrameSelector = UnlabelledFrameSelector; // Context options type Selector = | Node | BaseSelector | LabelledShadowDomSelector | LabelledFramesSelector; type SelectorList = Array | NodeList; type ContextProp = Selector | SelectorList; type ContextObject = | { include: ContextProp; exclude?: ContextProp; } | { exclude: ContextProp; include?: ContextProp; }; type ContextSpec = ContextProp | ContextObject; /** Synonym to ContextSpec */ type ElementContext = ContextSpec; type SerialSelector = | BaseSelector | LabelledShadowDomSelector | LabelledFramesSelector; type SerialFrameSelector = SerialSelector | FramesSelector; type SerialSelectorList = Array; type SerialContextObject = | { include: SerialSelector | SerialSelectorList; exclude?: SerialSelector | SerialSelectorList; } | { exclude: SerialSelector | SerialSelectorList; include?: SerialSelector | SerialSelectorList; }; interface FrameContextObject { include: UnlabelledFrameSelector[]; exclude: UnlabelledFrameSelector[]; } type RunCallback = (error: Error, results: T) => void; interface TestEngine { name: string; version: string; } interface TestRunner { name: string; } interface TestEnvironment { userAgent: string; windowWidth: number; windowHeight: number; orientationAngle?: number; orientationType?: string; } interface RunOnly { type: RunOnlyType; values: TagValue[] | string[]; } interface RuleObject { [key: string]: { enabled: boolean; }; } interface RunOptions { runOnly?: RunOnly | TagValue[] | string[] | string; rules?: RuleObject; reporter?: ReporterVersion | string; resultTypes?: resultGroups[]; selectors?: boolean; ancestry?: boolean; xpath?: boolean; absolutePaths?: boolean; iframes?: boolean; elementRef?: boolean; frameWaitTime?: number; preload?: boolean; performanceTimer?: boolean; pingWaitTime?: number; } interface AxeResults extends EnvironmentData { toolOptions: RunOptions; passes: Result[]; violations: Result[]; incomplete: Result[]; inapplicable: Result[]; } interface Result { description: string; help: string; helpUrl: string; id: string; impact?: ImpactValue; tags: TagValue[]; nodes: NodeResult[]; } interface NodeResult { html: string; impact?: ImpactValue; target: UnlabelledFrameSelector; xpath?: string[]; ancestry?: UnlabelledFrameSelector; any: CheckResult[]; all: CheckResult[]; none: CheckResult[]; failureSummary?: string; element?: HTMLElement; } interface CheckResult { id: string; impact: string; message: string; data: any; relatedNodes?: RelatedNode[]; } interface RelatedNode { html: string; target: UnlabelledFrameSelector; xpath?: string[]; ancestry?: UnlabelledFrameSelector; element?: HTMLElement; } interface RuleLocale { [key: string]: { description: string; help: string; }; } interface CheckMessages { pass: string | { [key: string]: string }; fail: string | { [key: string]: string }; incomplete?: string | { [key: string]: string }; } interface CheckLocale { [key: string]: CheckMessages; } interface Locale { lang?: string; rules?: RuleLocale; checks?: CheckLocale; } interface AriaAttrs { type: AriaAttrsType; values?: string[]; allowEmpty?: boolean; global?: boolean; unsupported?: boolean; } interface AriaRoles { type: AriaRolesType | DpubRolesType; requiredContext?: string[]; requiredOwned?: string[]; requiredAttrs?: string[]; allowedAttrs?: string[]; nameFromContent?: boolean; unsupported?: boolean; } interface HtmlElmsVariant { contentTypes?: HtmlContentTypes[]; allowedRoles: boolean | string[]; noAriaAttrs?: boolean; shadowRoot?: boolean; implicitAttrs?: { [key: string]: string }; namingMethods?: string[]; } interface HtmlElms extends HtmlElmsVariant { variant?: { [key: string]: HtmlElmsVariant }; } interface Standards { ariaAttrs?: { [key: string]: AriaAttrs }; ariaRoles?: { [key: string]: AriaRoles }; htmlElms?: { [key: string]: HtmlElms }; cssColors?: { [key: string]: number[] }; } interface Spec { branding?: string | Branding; reporter?: ReporterVersion | string | AxeReporter; checks?: Check[]; rules?: Rule[]; standards?: Standards; locale?: Locale; disableOtherRules?: boolean; axeVersion?: string; noHtml?: boolean; allowedOrigins?: string[]; // Deprecated - do not use. ver?: string; } /** * @deprecated Use branding: string instead to set the application key in help URLs */ interface Branding { brand?: string; application?: string; } interface CheckHelper { async: () => (result: boolean | undefined | Error) => void; data: (data: unknown) => void; relatedNodes: (nodes: Element[]) => void; } interface AfterResult { id: string; data?: unknown; relatedNodes: SerialDqElement[]; result: boolean | undefined; node: SerialDqElement; } interface Check { id: string; evaluate?: | string | (( this: CheckHelper, node: Element, options: unknown, virtualNode: VirtualNode ) => boolean | undefined | void); after?: | string | ((results: AfterResult[], options: unknown) => AfterResult[]); options?: any; matches?: string; enabled?: boolean; metadata?: { impact?: ImpactValue; messages?: CheckMessages; }; } interface Rule { id: string; selector?: string; impact?: ImpactValue; excludeHidden?: boolean; enabled?: boolean; pageLevel?: boolean; any?: string[]; all?: string[]; none?: string[]; tags?: string[]; matches?: string | ((node: Element, virtualNode: VirtualNode) => boolean); reviewOnFail?: boolean; actIds?: string[]; metadata?: Omit; } interface AxePlugin { id: string; run(...args: any[]): any; commands: { id: string; callback(...args: any[]): void; }[]; cleanup?(callback: Function): void; } interface RuleMetadata { ruleId: string; description: string; help: string; helpUrl: string; tags: string[]; actIds?: string[]; } interface SerialDqElement { source: string; nodeIndexes: number[]; selector: UnlabelledFrameSelector; xpath: string[]; ancestry: UnlabelledFrameSelector; } interface DqElement extends SerialDqElement { element: Element; toJSON(): SerialDqElement; mergeSpecs( childSpec: SerialDqElement, parentSpec: SerialDqElement ): SerialDqElement; } interface PartialRuleResult { id: string; result: 'inapplicable'; pageLevel: boolean; impact: null; nodes: Array>; } interface PartialResult { frames: SerialDqElement[]; results: PartialRuleResult[]; environmentData?: EnvironmentData; } type PartialResults = Array; interface FrameContext { frameSelector: CrossTreeSelector; frameContext: FrameContextObject; } interface RawCheckResult extends Omit { relatedNodes?: Array; } interface RawNodeResult { node: SerialDqElement | DqElement; any: RawCheckResult[]; all: RawCheckResult[]; none: RawCheckResult[]; impact: ImpactValue | null; result: T; } interface RawResult extends Omit { inapplicable: Array; passes: RawNodeResult<'passed'>[]; incomplete: RawNodeResult<'incomplete'>[]; violations: RawNodeResult<'failed'>[]; pageLevel: boolean; result: 'failed' | 'passed' | 'incomplete' | 'inapplicable'; } type AxeReporter = ( rawResults: RawResult[], option: RunOptions, resolve: (report: T) => void, reject: (error: Error) => void ) => void; interface VirtualNode { actualNode?: Node; shadowId?: string; children?: VirtualNode[]; parent?: VirtualNode; attr(attr: string): string | null; hasAttr(attr: string): boolean; props: { [key: string]: unknown }; boundingClientRect: DOMRect; } interface Utils { getFrameContexts: ( context?: ElementContext, options?: RunOptions ) => FrameContext[]; shadowSelect: (selector: CrossTreeSelector) => Element | null; shadowSelectAll: (selector: CrossTreeSelector) => Element[]; getStandards(): Required; isContextSpec: (context: unknown) => context is ContextSpec; isContextObject: (context: unknown) => context is ContextObject; isContextProp: (context: unknown) => context is ContextProp; isLabelledFramesSelector: ( selector: unknown ) => selector is LabelledFramesSelector; isLabelledShadowDomSelector: ( selector: unknown ) => selector is LabelledShadowDomSelector; DqElement: new ( elm: Element, options?: { absolutePaths?: boolean } ) => DqElement; uuid: ( options?: { random?: Uint8Array | Array }, buf?: Uint8Array | Array, offset?: number ) => string | Uint8Array | Array; } interface Aria { getRoleType: (role: string | Element | VirtualNode | null) => string | null; } interface Dom { isFocusable: (node: Element | VirtualNode) => boolean; isNativelyFocusable: (node: Element | VirtualNode) => boolean; } type AccessibleTextOptions = { inControlContext?: boolean; inLabelledByContext?: boolean; }; interface Text { accessibleText: ( element: Element, options?: AccessibleTextOptions ) => string; } interface Commons { aria: Aria; dom: Dom; text: Text; } interface EnvironmentData { testEngine: TestEngine; testRunner: TestRunner; testEnvironment: TestEnvironment; url: string; timestamp: string; } let version: string; let plugins: any; let utils: Utils; let commons: Commons; /** * Source string to use as an injected script in Selenium */ let source: string; /** * Object for axe Results */ var AxeResults: AxeResults; /** * Runs a number of rules against the provided HTML page and returns the resulting issue list * * @param {ElementContext} context Optional The `Context` specification object @see Context * @param {RunOptions} options Optional Options passed into rules or checks, temporarily modifying them. * @param {RunCallback} callback Optional The function to invoke when analysis is complete. * @returns {Promise|void} If the callback was not defined, axe will return a Promise. */ function run(context?: ElementContext): Promise; function run(options: RunOptions): Promise; function run( callback: (error: Error, results: T) => void ): void; function run( context: ElementContext, callback: RunCallback ): void; function run( options: RunOptions, callback: RunCallback ): void; function run( context: ElementContext, options: RunOptions ): Promise; function run( context: ElementContext, options: RunOptions, callback: RunCallback ): void; /** * Method for configuring the data format used by axe. Helpful for adding new * rules, which must be registered with the library to execute. * @param {Spec} Spec Object with valid `branding`, `reporter`, `checks` and `rules` data */ function configure(spec: Spec): void; /** * Run axe in the current window only * @param {ElementContext} context Optional The `Context` specification object @see Context * @param {RunOptions} options Optional Options passed into rules or checks, temporarily modifying them. * @returns {Promise} Partial result, for use in axe.finishRun. */ function runPartial( context: ElementContext, options: RunOptions ): Promise; /** * Create a report from axe.runPartial results * @param {PartialResult[]} partialResults Results from axe.runPartial, calls in different frames on the page. * @param {RunOptions} options Optional Options passed into rules or checks, temporarily modifying them. */ function finishRun( partialResults: PartialResults, options: RunOptions ): Promise; /** * Searches and returns rules that contain a tag in the list of tags. * @param {Array} tags Optional array of tags * @return {Array} Array of rules */ function getRules(tags?: string[]): RuleMetadata[]; /** * Restores the default axe configuration */ function reset(): void; /** * Function to register a plugin configuration in document and its subframes * @param {Object} plugin A plugin configuration object */ function registerPlugin(plugin: AxePlugin): void; /** * Function to clean up plugin configuration in document and its subframes */ function cleanup(): void; /** * Set up alternative frame communication */ function frameMessenger(frameMessenger: FrameMessenger): void; /** * Setup axe-core so axe.common functions can work properly. */ function setup(node?: Element | Document): VirtualNode; /** * Clean up axe-core tree and caches. `axe.run` will call this function at the end of the run so there's no need to call it yourself afterwards. */ function teardown(): void; /** * Check if a reporter is registered */ function hasReporter(reporterName: string): boolean; /** * Get a reporter based the name it is registered with */ function getReporter(reporterName: string): AxeReporter; /** * Register a new reporter, optionally setting it as the default */ function addReporter( reporterName: string, reporter: AxeReporter, isDefault?: boolean ): void; // axe.frameMessenger type FrameMessenger = { open: (topicHandler: TopicHandler) => Close | void; post: ( frameWindow: Window, data: TopicData, replyHandler: ReplyHandler ) => boolean | void; }; type Close = Function; type TopicHandler = (data: TopicData, responder: Responder) => void; type ReplyHandler = ( message: any | Error, keepalive: boolean, responder: Responder ) => void; type Responder = ( message: any | Error, keepalive?: boolean, replyHandler?: ReplyHandler ) => void; type TopicData = { topic: string } & ReplyData; type ReplyData = { channelId: string; message: any; keepalive: boolean }; } export = axe;