aria-query — это специализированная библиотека для
работы с спецификацией WAI-ARIA в контексте веб-разработки. Основное
назначение — предоставление инструментов для валидации и анализа
комбинаций ролей и атрибутов элементов DOM. Библиотека обеспечивает
строгую проверку соответствия элементов их ролям, а также поддерживает
динамическую генерацию допустимых атрибутов для каждой роли.
Библиотека экспортирует несколько ключевых структур данных:
roles — коллекция всех известных
ARIA-ролей с их свойствами и поддерживаемыми атрибутами.attributes — список всех
ARIA-атрибутов с типами и допустимыми значениями.elementRoles — связывает HTML-элементы
с рекомендуемыми и разрешёнными ARIA-ролями.Эти структуры позволяют проводить детальный анализ элементов на соответствие спецификации ARIA, что критично для обеспечения доступности веб-приложений.
Валидация роли и атрибутов заключается в проверке, корректно ли
применены атрибуты к элементу с определённой ролью. В
aria-query эта проверка строится на основе двух
принципов:
<button>,
<input> и т.д.). Нарушение этой привязки может
привести к некорректной интерпретации роли скринридерами.Пример структуры роли в aria-query:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.props);
Результат:
{
"aria-pressed": { "type": "boolean" },
"aria-expanded": { "type": "boolean" }
}
Это показывает, какие ARIA-атрибуты корректны для роли
button. Любой другой атрибут будет считаться
некорректным.
Для динамической проверки можно использовать метод перебора допустимых атрибутов:
function validateAttributes(roleName, elementAttrs) {
const role = roles.get(roleName);
const allowedAttrs = new Set(Object.keys(role.props));
return Object.keys(elementAttrs).every(attr => allowedAttrs.has(attr));
}
Пример использования:
const attrs = { "aria-pressed": true, "aria-hidden": false };
console.log(validateAttributes('button', attrs)); // false, aria-hidden не разрешён
Такой подход позволяет создавать системы автоматической валидации и линтинга, интегрированные в сборку фронтенд-приложений.
Не все роли подходят для любого HTML-элемента.
aria-query содержит информацию о рекомендуемых тегах для
каждой роли через коллекцию elementRoles:
import { elementRoles } from 'aria-query';
const buttonElements = elementRoles.get('button');
console.log(buttonElements); // Set { 'button', 'input[type="button"]', 'a' }
Это позволяет валидировать не только атрибуты, но и корректность
привязки роли к конкретному элементу. Например,
<div role="button"> допустим, но не всегда оптимален
с точки зрения доступности.
В ARIA есть роли, которые могут содержать дочерние элементы с
собственными ролями. Валидация таких иерархий требует понимания
контекста родителя и допустимых дочерних ролей.
aria-query предоставляет методы для проверки
ARIA-деревьев:
isAbstractRole(roleName) — проверяет,
является ли роль абстрактной (не может быть использована напрямую в
DOM).getAllowedChildRoles(roleName) —
возвращает набор ролей, которые могут быть вложены в элемент с заданной
ролью.Пример:
import { roles } from 'aria-query';
const listRole = roles.get('list');
console.log(listRole['childRoles']); // ['listitem']
Это гарантирует, что <ul role="list"> будет
содержать только <li role="listitem"> или их
допустимые аналоги.
aria-query не генерирует ошибки напрямую, но
предоставляет все данные для собственной реализации системы
линтинга:
function lintElement(roleName, attrs, childrenRoles = []) {
const role = roles.get(roleName);
const invalidAttrs = Object.keys(attrs).filter(attr => !role.props[attr]);
const invalidChildren = childrenRoles.filter(child => !role.childRoles.includes(child));
return { invalidAttrs, invalidChildren };
}
Пример:
const result = lintElement('list', { 'aria-checked': true }, ['listitem', 'button']);
console.log(result);
// { invalidAttrs: ['aria-checked'], invalidChildren: ['button'] }
Такой механизм позволяет интегрировать валидацию ARIA прямо в процессы CI/CD, предотвращая ошибки доступности на раннем этапе разработки.
Кроме ролей, существует набор глобальных
ARIA-атрибутов, которые допустимы для всех ролей
(aria-hidden, aria-label и т.д.). В
aria-query они представлены в отдельной коллекции
ariaGlobalAttributes. При проверке комбинации роль-атрибут
необходимо учитывать эти атрибуты:
import { aria } from 'aria-query';
const globalAttrs = new Set(Object.keys(aria));
Это предотвращает ложные срабатывания при применении атрибутов вроде
aria-hidden к любому элементу.
Библиотека aria-query широко используется для:
eslint-plugin-jsx-a11y).Комбинация строгой схемы ролей, проверки атрибутов и контекста
дочерних элементов делает aria-query ключевым инструментом
для обеспечения корректной доступности веб-приложений.
Хотите, я могу подготовить подробную схему использования
aria-query с примерами в React, включая
динамическую генерацию атрибутов и проверку дерева компонентов?