aria-query — это JavaScript-библиотека, предназначенная
для работы с спецификацией ARIA (Accessible Rich Internet Applications)
и анализа элементов веб-страниц с точки зрения доступности. Она
предоставляет структурированные данные о ARIA ролях, свойствах и
состояниях, а также их допустимых контекстах. Библиотека
особенно полезна при интеграции с инструментами автоматизированного
тестирования доступности, такими как
axe-core.
Ключевой объект библиотеки — это набор карточек ролей и атрибутов, которые позволяют определять:
aria-queryБиблиотека поставляется с несколькими основными коллекциями:
Roles Roles представляет собой
карту всех стандартных ARIA-ролей, например, button,
checkbox, dialog. Каждый объект роли
содержит:
name: уникальное имя роли;superClass: родительские роли, от которых наследуются
свойства;props: список поддерживаемых ARIA-свойств и их
допустимых значений;requiredContextRole: контекстные ограничения на
использование роли;requiredOwnedElements: список обязательных дочерних
ролей.Пример получения роли button и её свойств:
const { roles } = require('aria-query');
const buttonRole = roles.get('button');
console.log(buttonRole.props);Elements Elements связывает
HTML-теги с ARIA-ролями, показывая, какие теги могут использоваться с
какими ролями. Например:
<button> автоматически получает роль
button;<input type="checkbox"> автоматически получает
роль checkbox.Проверка ролей для тега div:
const { dom } = require('aria-query');
const divRoles = dom.get('div');
console.log(divRoles); // Set { 'button', 'dialog', 'tabpanel', ... }Attributes Attributes содержит все
ARIA-атрибуты (aria-label, aria-hidden,
aria-expanded и т.д.) с описанием допустимых типов значений
и ролей, к которым они применимы.
Пример проверки атрибута aria-checked:
const { aria } = require('aria-query');
const checkedAttr = aria.get('aria-checked');
console.log(checkedAttr.type); // 'tristate'
console.log(checkedAttr.allowedRoles); // Set { 'checkbox', 'menuitemcheckbox', 'radio' }aria-query в axe-coreaxe-core использует aria-query для проверки
доступности элементов веб-страницы, анализируя соответствие:
Пример интеграции с axe-core:
const axe = require('axe-core');
const { roles } = require('aria-query');
function validateAriaRoles(node) {
const role = node.getAttribute('role');
if (!roles.has(role)) {
return [`Роль "${role}" не соответствует спецификации ARIA.`];
}
return [];
}
// Применение на DOM-узлах
const results = Array.from(document.querySelectorAll('[role]'))
.flatMap(validateAriaRoles);
console.log(results);
Внутри axe-core библиотека позволяет:
aria-query;<div role="button"> допустим,
<span role="main"> может иметь ограничения;aria-disabled, aria-checked и другие должны
использоваться только с ролями, которые их поддерживают;list должен
содержать listitem.aria-query позволяет создавать динамические правила
проверки доступности, что полезно при кастомных компонентах. Например,
можно реализовать проверку:
combobox и
option;aria-labelledby и
aria-describedby;Пример проверки обязательных дочерних элементов:
const { roles } = require('aria-query');
function checkRequiredChildren(node) {
const roleData = roles.get(node.getAttribute('role'));
if (!roleData || !roleData.requiredOwnedElements) return [];
const errors = [];
roleData.requiredOwnedElements.forEach(requiredRole => {
const hasChild = Array.from(node.children)
.some(child => child.getAttribute('role') === requiredRole);
if (!hasChild) {
errors.push(`Элемент с ролью "${roleData.name}" должен содержать "${requiredRole}".`);
}
});
return errors;
}
Такой подход делает анализ доступности гибким и детализированным, позволяя обнаруживать нарушения ARIA на ранних стадиях разработки интерфейсов.
aria-query для статической
валидации ролей и атрибутов, что сокращает количество ошибок,
которые может выявить axe-core.roles и attributes, чтобы поддерживать
совместимость с ARIA.Эти возможности делают aria-query незаменимым
инструментом для интеграции с axe-core и построения
доступных веб-интерфейсов, где каждая роль и атрибут проверяется на
соответствие стандартам.