text: 'use strict';
  
  var _ariaQuery = require('aria-query');
  
  var _jsxAstUtils = require('jsx-ast-utils');
  
  var _schemas = require('../util/schemas');
  
  function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /**
                                                                                                                                                                                                       * @fileoverview Enforce aria role attribute is valid.
                                                                                                                                                                                                       * @author Ethan Cohen
                                                                                                                                                                                                       */
  
  // ----------------------------------------------------------------------------
  // Rule Definition
  // ----------------------------------------------------------------------------
  
  var errorMessage = 'Elements with ARIA roles must use a valid, non-abstract ARIA role.';
  
  var schema = (0, _schemas.generateObjSchema)({
    ignoreNonDOM: {
      type: 'boolean',
      default: false
    }
  });
  
  module.exports = {
    meta: {
      docs: {
        url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-role.md'
      },
      schema: [schema]
    },
  
    create: function create(context) {
      return {
        JSXAttribute: function JSXAttribute(attribute) {
          // Determine if ignoreNonDOM is set to true
          // If true, then do not run rule.
          var options = context.options[0] || {};
          var ignoreNonDOM = !!options.ignoreNonDOM;
  
          if (ignoreNonDOM) {
            var type = (0, _jsxAstUtils.elementType)(attribute.parent);
            if (!_ariaQuery.dom.get(type)) {
              return;
            }
          }
  
          // Get prop name
          var name = (0, _jsxAstUtils.propName)(attribute).toUpperCase();
  
          if (name !== 'ROLE') {
            return;
          }
  
          var value = (0, _jsxAstUtils.getLiteralPropValue)(attribute);
  
          // If value is undefined, then the role attribute will be dropped in the DOM.
          // If value is null, then getLiteralAttributeValue is telling us that the
          // value isn't in the form of a literal.
          if (value === undefined || value === null) {
            return;
          }
  
          var normalizedValues = String(value).toLowerCase().split(' ');
          var validRoles = [].concat(_toConsumableArray(_ariaQuery.roles.keys())).filter(function (role) {
            return _ariaQuery.roles.get(role).abstract === false;
          });
          var isValid = normalizedValues.every(function (val) {
            return validRoles.indexOf(val) > -1;
          });
  
          if (isValid === true) {
            return;
          }
  
          context.report({
            node: attribute,
            message: errorMessage
          });
        }
      };
    }
  };