suggestions.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.getSuggestedQuery = getSuggestedQuery;
  6. var _domAccessibilityApi = require("dom-accessibility-api");
  7. var _matches = require("./matches");
  8. var _getNodeText = require("./get-node-text");
  9. var _config = require("./config");
  10. var _roleHelpers = require("./role-helpers");
  11. var _labelHelpers = require("./label-helpers");
  12. const normalize = (0, _matches.getDefaultNormalizer)();
  13. function escapeRegExp(string) {
  14. return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
  15. }
  16. function getRegExpMatcher(string) {
  17. return new RegExp(escapeRegExp(string.toLowerCase()), 'i');
  18. }
  19. function makeSuggestion(queryName, element, content, {
  20. variant,
  21. name
  22. }) {
  23. let warning = '';
  24. const queryOptions = {};
  25. const queryArgs = [['Role', 'TestId'].includes(queryName) ? content : getRegExpMatcher(content)];
  26. if (name) {
  27. queryOptions.name = getRegExpMatcher(name);
  28. }
  29. if (queryName === 'Role' && (0, _roleHelpers.isInaccessible)(element)) {
  30. queryOptions.hidden = true;
  31. warning = `Element is inaccessible. This means that the element and all its children are invisible to screen readers.
  32. If you are using the aria-hidden prop, make sure this is the right choice for your case.
  33. `;
  34. }
  35. if (Object.keys(queryOptions).length > 0) {
  36. queryArgs.push(queryOptions);
  37. }
  38. const queryMethod = `${variant}By${queryName}`;
  39. return {
  40. queryName,
  41. queryMethod,
  42. queryArgs,
  43. variant,
  44. warning,
  45. toString() {
  46. if (warning) {
  47. console.warn(warning);
  48. }
  49. let [text, options] = queryArgs;
  50. text = typeof text === 'string' ? `'${text}'` : text;
  51. options = options ? `, { ${Object.entries(options).map(([k, v]) => `${k}: ${v}`).join(', ')} }` : '';
  52. return `${queryMethod}(${text}${options})`;
  53. }
  54. };
  55. }
  56. function canSuggest(currentMethod, requestedMethod, data) {
  57. return data && (!requestedMethod || requestedMethod.toLowerCase() === currentMethod.toLowerCase());
  58. }
  59. function getSuggestedQuery(element, variant = 'get', method) {
  60. var _element$getAttribute, _getImplicitAriaRoles;
  61. // don't create suggestions for script and style elements
  62. if (element.matches((0, _config.getConfig)().defaultIgnore)) {
  63. return undefined;
  64. }
  65. //We prefer to suggest something else if the role is generic
  66. const role = (_element$getAttribute = element.getAttribute('role')) != null ? _element$getAttribute : (_getImplicitAriaRoles = (0, _roleHelpers.getImplicitAriaRoles)(element)) == null ? void 0 : _getImplicitAriaRoles[0];
  67. if (role !== 'generic' && canSuggest('Role', method, role)) {
  68. return makeSuggestion('Role', element, role, {
  69. variant,
  70. name: (0, _domAccessibilityApi.computeAccessibleName)(element, {
  71. computedStyleSupportsPseudoElements: (0, _config.getConfig)().computedStyleSupportsPseudoElements
  72. })
  73. });
  74. }
  75. const labelText = (0, _labelHelpers.getLabels)(document, element).map(label => label.content).join(' ');
  76. if (canSuggest('LabelText', method, labelText)) {
  77. return makeSuggestion('LabelText', element, labelText, {
  78. variant
  79. });
  80. }
  81. const placeholderText = element.getAttribute('placeholder');
  82. if (canSuggest('PlaceholderText', method, placeholderText)) {
  83. return makeSuggestion('PlaceholderText', element, placeholderText, {
  84. variant
  85. });
  86. }
  87. const textContent = normalize((0, _getNodeText.getNodeText)(element));
  88. if (canSuggest('Text', method, textContent)) {
  89. return makeSuggestion('Text', element, textContent, {
  90. variant
  91. });
  92. }
  93. if (canSuggest('DisplayValue', method, element.value)) {
  94. return makeSuggestion('DisplayValue', element, normalize(element.value), {
  95. variant
  96. });
  97. }
  98. const alt = element.getAttribute('alt');
  99. if (canSuggest('AltText', method, alt)) {
  100. return makeSuggestion('AltText', element, alt, {
  101. variant
  102. });
  103. }
  104. const title = element.getAttribute('title');
  105. if (canSuggest('Title', method, title)) {
  106. return makeSuggestion('Title', element, title, {
  107. variant
  108. });
  109. }
  110. const testId = element.getAttribute((0, _config.getConfig)().testIdAttribute);
  111. if (canSuggest('TestId', method, testId)) {
  112. return makeSuggestion('TestId', element, testId, {
  113. variant
  114. });
  115. }
  116. return undefined;
  117. }