UNPKG

@jsxtools/eslint-plugin-jsx-a11y

Version:

Static AST checker for accessibility rules on JSX elements for flat ESLint Config.

66 lines (63 loc) 2.09 kB
const ariaQuery = require('aria-query'); const index = require('../index-BnNhLopb.cjs'); const jsxAstUtils = require('../util/module/jsx-ast-utils.cjs'); const getElementType = require('../util/getElementType.cjs'); const schemas = require('../util/schemas.cjs'); const errorMessage = "Elements with ARIA roles must use a valid, non-abstract ARIA role."; const schema = schemas.generateObjSchema({ allowedInvalidRoles: { items: { type: "string" }, type: "array", uniqueItems: true }, ignoreNonDOM: { type: "boolean", default: false } }); const validRoles = new Set(index.filter(index.iterFrom(ariaQuery.roles.keys()), (role) => ariaQuery.roles.get(role).abstract === false)); const ruleOfAriaRole = { meta: { docs: { url: "https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-role.md", description: "Enforce that elements with ARIA roles must use a valid, non-abstract ARIA role." }, schema: [schema] }, create: (context) => { const options = context.options[0] || {}; const ignoreNonDOM = !!options.ignoreNonDOM; const allowedInvalidRoles = new Set(options.allowedInvalidRoles || []); const elementType = getElementType(context); return { JSXAttribute: (attribute) => { if (ignoreNonDOM) { const type = elementType(attribute.parent); if (!ariaQuery.dom.get(type)) { return; } } const name = jsxAstUtils.propName(attribute).toUpperCase(); if (name !== "ROLE") { return; } const value = jsxAstUtils.getLiteralPropValue(attribute); if (value === void 0 || value === null) { return; } const values = String(value).split(" "); const isValid = values.every((val) => allowedInvalidRoles.has(val) || validRoles.has(val)); if (isValid === true) { return; } context.report({ node: attribute, message: errorMessage }); } }; } }; module.exports = ruleOfAriaRole;