- Install Jest for unit testing with React Testing Library - Install Playwright for end-to-end testing - Configure Jest with proper TypeScript support and module mapping - Create test setup files and utilities for both unit and e2e tests Components: * Jest configuration with coverage thresholds * Playwright configuration with browser automation * Unit tests for LoginForm, AuthContext, and useSocketIO hook * E2E tests for authentication, dashboard, and agents workflows * GitHub Actions workflow for automated testing * Mock data and API utilities for consistent testing * Test documentation with best practices Testing features: - Unit tests with 70% coverage threshold - E2E tests with API mocking and user journey testing - CI/CD integration for automated test runs - Cross-browser testing support with Playwright - Authentication system testing end-to-end 🚀 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
63 lines
2.6 KiB
JavaScript
63 lines
2.6 KiB
JavaScript
/**
|
|
* Partial implementation https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion
|
|
* which should only be used for elements with a non-presentational role i.e.
|
|
* `role="none"` and `role="presentation"` will not be excluded.
|
|
*
|
|
* Implements aria-hidden semantics (i.e. parent overrides child)
|
|
* Ignores "Child Presentational: True" characteristics
|
|
*
|
|
* @param element
|
|
* @param options
|
|
* @returns {boolean} true if excluded, otherwise false
|
|
*/
|
|
export function isInaccessible(element) {
|
|
var _element$ownerDocumen;
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
var _options$getComputedS = options.getComputedStyle,
|
|
getComputedStyle = _options$getComputedS === void 0 ? (_element$ownerDocumen = element.ownerDocument.defaultView) === null || _element$ownerDocumen === void 0 ? void 0 : _element$ownerDocumen.getComputedStyle : _options$getComputedS,
|
|
_options$isSubtreeIna = options.isSubtreeInaccessible,
|
|
isSubtreeInaccessibleImpl = _options$isSubtreeIna === void 0 ? isSubtreeInaccessible : _options$isSubtreeIna;
|
|
if (typeof getComputedStyle !== "function") {
|
|
throw new TypeError("Owner document of the element needs to have an associated window.");
|
|
}
|
|
// since visibility is inherited we can exit early
|
|
if (getComputedStyle(element).visibility === "hidden") {
|
|
return true;
|
|
}
|
|
var currentElement = element;
|
|
while (currentElement) {
|
|
if (isSubtreeInaccessibleImpl(currentElement, {
|
|
getComputedStyle: getComputedStyle
|
|
})) {
|
|
return true;
|
|
}
|
|
currentElement = currentElement.parentElement;
|
|
}
|
|
return false;
|
|
}
|
|
/**
|
|
*
|
|
* @param element
|
|
* @param options
|
|
* @returns {boolean} - `true` if every child of the element is inaccessible
|
|
*/
|
|
export function isSubtreeInaccessible(element) {
|
|
var _element$ownerDocumen2;
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
var _options$getComputedS2 = options.getComputedStyle,
|
|
getComputedStyle = _options$getComputedS2 === void 0 ? (_element$ownerDocumen2 = element.ownerDocument.defaultView) === null || _element$ownerDocumen2 === void 0 ? void 0 : _element$ownerDocumen2.getComputedStyle : _options$getComputedS2;
|
|
if (typeof getComputedStyle !== "function") {
|
|
throw new TypeError("Owner document of the element needs to have an associated window.");
|
|
}
|
|
if (element.hidden === true) {
|
|
return true;
|
|
}
|
|
if (element.getAttribute("aria-hidden") === "true") {
|
|
return true;
|
|
}
|
|
if (getComputedStyle(element).display === "none") {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
//# sourceMappingURL=is-inaccessible.mjs.map
|