Библиотека aria-query предназначена для работы с доступностью веб-компонентов, предоставляя готовые словари ARIA-ролей, свойств и их соответствий. Она позволяет программно проверять корректность использования ARIA, а также создавать утилиты для анализа DOM с точки зрения доступности.
aria-query экспортирует два основных набора данных:
Каждая роль хранится в виде ключа с объектом, который содержит:
abstract — булевое значение, указывающее, является ли
роль абстрактной.baseConcepts — массив, описывающий элементы HTML и их
свойства, соответствующие роли.allowedProps — список свойств ARIA, допустимых для
роли.requiredProps — свойства, обязательные для корректной
работы роли.childrenPresentational — флаг, указывающий, что
дочерние элементы не должны влиять на доступность.requiredContextRole — роль родителя, необходимая для
корректного использования.superClass — массив с предками роли для наследования
свойств.Простейший пример применения — проверка, допустимо ли использовать определённую роль для элемента:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.allowedProps.has('aria-pressed')); // true
console.log(buttonRole.requiredProps); // Set {} если нет обязательных свойств
Здесь roles.get('button') возвращает объект с полной
информацией о роли button. С помощью
allowedProps можно определить, какие атрибуты можно
применять к элементу, а requiredProps позволяет убедиться в
наличии обязательных ARIA-свойств.
Объект Attributes предоставляет полное описание ARIA-атрибутов:
true/false или массивы.Пример проверки допустимого значения атрибута:
import { attributes } from 'aria-query';
const ariaChecked = attributes.get('aria-checked');
console.log(ariaChecked.valueSet); // ['true', 'false', 'mixed', undefined]
При интеграции aria-query в существующие проекты важно учитывать несколько аспектов:
Старые теги и роли Некоторые legacy-компоненты используют устаревшие ARIA-атрибуты или нестандартные роли. Библиотека позволяет:
Проверка контекста Старый код часто не учитывает
требуемую иерархию ролей. Использование requiredContextRole
помогает выявить потенциальные ошибки:
const listItemRole = roles.get('listitem');
console.log(listItemRole.requiredContextRole); // Set { 'list', 'group', 'menu' }
Это позволяет построить автоматические скрипты для проверки соответствия DOM иерархии ARIA-ролей.
aria-query использует структуры Map и
Set, что позволяет:
roles.has('button'))allowedProps.has('aria-label'))superClass)Пример объединения свойств родительской и дочерней роли:
const menuRole = roles.get('menu');
const menuItemRole = roles.get('menuitem');
const inheritedProps = new Set([
...menuRole.allowedProps,
...menuItemRole.allowedProps
]);
console.log(inheritedProps.has('aria-disabled')); // true
Для поддержки legacy-кода полезно использовать aria-query вместе с тестовыми фреймворками:
Пример теста роли:
import { roles } from 'aria-query';
test('role button поддерживает aria-pressed', () => {
const buttonRole = roles.get('button');
expect(buttonRole.allowedProps.has('aria-pressed')).toBe(true);
});
requiredContextRole.Map и Set для
эффективной валидации и объединения свойств.Такая системная работа с aria-query позволяет постепенно приводить legacy-код к современным стандартам доступности без полной переписки приложения.