Библиотека Aria-query предназначена для работы с ARIA-ролями, состояниями и свойствами в JavaScript, предоставляя стандартизированные структуры данных и схемы. Одним из критических аспектов работы с любой библиотекой, особенно при её обновлениях, является обработка breaking changes — изменений, которые могут нарушить совместимость с существующим кодом.
Aria-query строится на двух основных структурах:
Roles Map Объект, где ключ — это название ARIA-роли, а значение — описание с атрибутами, их типами и допустимыми значениями.
Properties Map Карта атрибутов ARIA с информацией о типе, допустимых значениях и том, к каким ролям они применимы.
Breaking changes чаще всего затрагивают эти структуры:
boolean →
string).Пример потенциально сломавшейся функции:
import { roles } from 'aria-query';
function getButtonRoleAttributes() {
return roles.get('button').props;
}
Если в новой версии button будет переименована или её
структура изменится, этот код вызовет ошибки или вернёт неожиданные
данные.
1. Сравнение версий через JSON-дамп
Для автоматической проверки изменений можно сохранить текущую версию
roles и props в JSON и сравнивать с новой
версией библиотеки:
import { roles, aria } from 'aria-query';
import fs from 'fs';
fs.writeFileSync('roles-v1.json', JSON.stringify([...roles.entries()]));
fs.writeFileSync('props-v1.json', JSON.stringify([...aria.entries()]));
После обновления библиотеки создаётся новый дамп и выполняется diff с предыдущим.
2. Использование TypeScript для типизации
Типизация позволяет обнаруживать изменения на уровне компиляции:
import { AriaRoleDefinition } from 'aria-query';
const buttonProps: AriaRoleDefinition['props'] = roles.get('button')?.props;
Если структура props изменилась, TypeScript укажет на
несоответствие типов, предотвращая runtime-ошибки.
3. Встроенные методы библиотеки
Некоторые версии Aria-query предоставляют функции для проверки валидности ролей и атрибутов:
import { isAbstractRole, isNonAbstractRole } from 'aria-query';
console.log(isAbstractRole('presentation')); // true
console.log(isNonAbstractRole('button')); // true
Изменение поведения этих функций может сигнализировать о breaking change.
Замораживание версии библиотеки Использование точной
версии (npm install aria-query@6.0.0) предотвращает
непредсказуемые изменения.
Создание адаптерного слоя Реализация собственного
слоя абстракции над roles и props позволяет
централизованно обрабатывать изменения:
function getRoleSafe(roleName) {
const role = roles.get(roleName);
if (!role) throw new Error(`Role ${roleName} not found in current ARIA schema`);
return role;
}
Автоматическое тестирование на изменения Написание тестов, проверяющих наличие ключевых ролей и атрибутов:
import { roles } from 'aria-query';
import assert from 'assert';
assert(roles.has('button'), 'Button role must exist');
assert(roles.get('button').props.has('aria-pressed'), 'Button should have aria-pressed attribute');
Тесты сразу покажут, если роль была удалена или изменена.
Иногда библиотека не удаляет роли, а помечает их как устаревшие. В
aria-query это может отражаться через поле
deprecated:
const dialogRole = roles.get('dialog');
if (dialogRole.deprecated) {
console.warn('Роль dialog помечена как устаревшая');
}
Это позволяет создавать предупреждения на этапе разработки и планировать миграцию без прерывания работы приложения.
При обнаружении breaking changes необходимо:
roles и
props).Особое внимание стоит уделять:
import { roles } from 'aria-query';
const expectedRoles = ['button', 'checkbox', 'radio'];
expectedRoles.forEach(role => {
if (!roles.has(role)) {
console.error(`Breaking change: роль ${role} отсутствует в новой версии`);
}
});
Такой простой скрипт позволяет мгновенно выявлять ключевые сломы после обновления библиотеки.
Эти подходы позволяют минимизировать риски, связанные с breaking changes, и поддерживать стабильность кода при работе с Aria-query.