Библиотека Aria-query предназначена для работы с ARIA-атрибутами и ролями в DOM, предоставляя инструменты для валидации и сопоставления элементов с соответствующими ARIA-спецификациями. Она использует данные официальной спецификации WAI-ARIA и позволяет программно проверять корректность структуры доступности веб-страниц.
В центре внимания библиотеки находятся следующие ключевые сущности:
button, checkbox, region и
т.д.).aria-label,
aria-hidden, aria-checked).Для работы с библиотекой в Node.js или в современных сборщиках используется стандартный импорт:
import { roles, elements, elementRoles } from 'aria-query';
Пример проверки, может ли <button> иметь роль
button:
import { elementRoles } from 'aria-query';
const buttonRoles = elementRoles.get('button');
console.log(buttonRoles.has('button')); // true
В ARIA спецификации существует понятие владеющих элементов
(owned elements) — дочерних компонентов, которые управляются
или логически принадлежат родительской роли. Например, list
владеет listitem, а grid владеет
row.
Aria-query предоставляет возможность программно
проверять такие отношения через свойства ролей. Каждая роль имеет поле
ownedElements, содержащее список ролей дочерних элементов,
которые она может содержать.
import { roles } from 'aria-query';
const listRole = roles.get('list');
console.log(listRole.ownedElements); // Set { 'listitem' }
Для валидации структуры DOM можно пройтись по элементам и сопоставить их роли с ожидаемыми:
function validateOwnedElements(parentRoleName, childRoleName) {
const parentRole = roles.get(parentRoleName);
return parentRole.ownedElements.has(childRoleName);
}
console.log(validateOwnedElements('list', 'listitem')); // true
console.log(validateOwnedElements('list', 'button')); // false
Это позволяет строить динамическую проверку корректности вложенности элементов в интерфейсе, особенно полезно при разработке сложных виджетов и компонентов с ARIA.
Сопоставление ролей и конкретных HTML-элементов
осуществляется через elementRoles. Эта структура хранит все
роли, которые можно назначить конкретному элементу, включая дефолтные и
разрешённые через role атрибут.
import { elementRoles } from 'aria-query';
const ulRoles = elementRoles.get('ul');
console.log(ulRoles); // Set { 'list' }
Чтобы проверить, можно ли вложить конкретный элемент в родительский:
function canNest(parentTag, childTag) {
const parentRoles = elementRoles.get(parentTag);
const childRoles = elementRoles.get(childTag);
for (let parentRole of parentRoles) {
const owned = roles.get(parentRole).ownedElements;
for (let childRole of childRoles) {
if (owned.has(childRole)) return true;
}
}
return false;
}
console.log(canNest('ul', 'li')); // true
console.log(canNest('ul', 'button')); // false
grid → row →
cell) или меню (menu →
menuitem).roles.ownedElements для быстрого поиска и проверки.elementRoles.Aria-query часто используется совместно с testing-library или инструментами для статического анализа DOM, чтобы создавать правила проверки доступности, валидировать пользовательские интерфейсы и автоматически строить отчёты о нарушениях ARIA.
import { getByRole } from '@testing-library/dom';
import { roles } from 'aria-query';
const roleSet = roles.get('menu').ownedElements;
// Можно сверять элементы, найденные через getByRole, с ожидаемыми ownedElements
Это позволяет объединять статическую информацию о ролях и динамическую проверку реального DOM, создавая мощные инструменты для тестирования доступности интерфейсов.