isNonInteractiveRole.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports["default"] = void 0;
  7. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  8. var _ariaQuery = require("aria-query");
  9. var _jsxAstUtils = require("jsx-ast-utils");
  10. var _arrayIncludes = _interopRequireDefault(require("array-includes"));
  11. var _arrayPrototype = _interopRequireDefault(require("array.prototype.flatmap"));
  12. var nonInteractiveRoles = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys()).filter(function (name) {
  13. return !_ariaQuery.roles.get(name)["abstract"] && !_ariaQuery.roles.get(name).superClass.some(function (klasses) {
  14. return (0, _arrayIncludes["default"])(klasses, 'widget');
  15. });
  16. });
  17. /**
  18. * Returns boolean indicating whether the given element has a role
  19. * that is associated with a non-interactive component. Non-interactive roles
  20. * include `listitem`, `article`, or `dialog`. These are roles that indicate
  21. * for the most part containers.
  22. *
  23. * Elements with these roles should not respond or handle user interactions.
  24. * For example, an `onClick` handler should not be assigned to an element with
  25. * the role `listitem`. An element inside the `listitem`, like a button or a
  26. * link, should handle the click.
  27. *
  28. * This utility returns true for elements that are assigned a non-interactive
  29. * role. It will return false for elements that do not have a role. So whereas
  30. * a `div` might be considered non-interactive, for the purpose of this utility,
  31. * it is considered neither interactive nor non-interactive -- a determination
  32. * cannot be made in this case and false is returned.
  33. */
  34. var isNonInteractiveRole = function isNonInteractiveRole(tagName, attributes) {
  35. // Do not test higher level JSX components, as we do not know what
  36. // low-level DOM element this maps to.
  37. if (!_ariaQuery.dom.has(tagName)) {
  38. return false;
  39. }
  40. var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role'));
  41. var isNonInteractive = false;
  42. var normalizedValues = String(role).toLowerCase().split(' ');
  43. var validRoles = (0, _arrayPrototype["default"])(normalizedValues, function (name) {
  44. return _ariaQuery.roles.has(name) ? [name] : [];
  45. });
  46. if (validRoles.length > 0) {
  47. // The first role value is a series takes precedence.
  48. isNonInteractive = (0, _arrayIncludes["default"])(nonInteractiveRoles, validRoles[0]);
  49. }
  50. return isNonInteractive;
  51. };
  52. var _default = exports["default"] = isNonInteractiveRole;
  53. module.exports = exports.default;