source: frontend/node_modules/eslint-plugin-jsx-a11y/lib/rules/control-has-associated-label.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 2 weeks ago

Fix frontend appearance

  • Property mode set to 100644
File size: 4.4 KB
Line 
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = void 0;
7var _jsxAstUtils = require("jsx-ast-utils");
8var _arrayIncludes = _interopRequireDefault(require("array-includes"));
9var _schemas = require("../util/schemas");
10var _getElementType = _interopRequireDefault(require("../util/getElementType"));
11var _isDOMElement = _interopRequireDefault(require("../util/isDOMElement"));
12var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
13var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
14var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
15var _mayHaveAccessibleLabel = _interopRequireDefault(require("../util/mayHaveAccessibleLabel"));
16function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
17/**
18 * @fileoverview Enforce controls are associated with a text label.
19 * @author Jesse Beach
20 *
21 *
22 */
23
24// ----------------------------------------------------------------------------
25// Rule Definition
26// ----------------------------------------------------------------------------
27
28var errorMessage = 'A control must be associated with a text label.';
29var ignoreList = ['link'];
30var schema = (0, _schemas.generateObjSchema)({
31 labelAttributes: _schemas.arraySchema,
32 controlComponents: _schemas.arraySchema,
33 ignoreElements: _schemas.arraySchema,
34 ignoreRoles: _schemas.arraySchema,
35 depth: {
36 description: 'JSX tree depth limit to check for accessible label',
37 type: 'integer',
38 minimum: 0
39 }
40});
41var _default = exports["default"] = {
42 meta: {
43 docs: {
44 description: 'Enforce that a control (an interactive element) has a text label.',
45 url: 'https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/control-has-associated-label.md'
46 },
47 schema: [schema]
48 },
49 create: function create(context) {
50 var elementType = (0, _getElementType["default"])(context);
51 var options = context.options[0] || {};
52 var _options$labelAttribu = options.labelAttributes,
53 labelAttributes = _options$labelAttribu === void 0 ? [] : _options$labelAttribu,
54 _options$controlCompo = options.controlComponents,
55 controlComponents = _options$controlCompo === void 0 ? [] : _options$controlCompo,
56 _options$ignoreElemen = options.ignoreElements,
57 ignoreElements = _options$ignoreElemen === void 0 ? [] : _options$ignoreElemen,
58 _options$ignoreRoles = options.ignoreRoles,
59 ignoreRoles = _options$ignoreRoles === void 0 ? [] : _options$ignoreRoles;
60 var newIgnoreElements = new Set([].concat(ignoreElements, ignoreList));
61 var rule = function rule(node) {
62 var tag = elementType(node.openingElement);
63 var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.openingElement.attributes, 'role'));
64 // Ignore interactive elements that might get their label from a source
65 // that cannot be discerned from static analysis, like
66 // <label><input />Save</label>
67 if (newIgnoreElements.has(tag)) {
68 return;
69 }
70 // Ignore roles that are "interactive" but should not require a label.
71 if ((0, _arrayIncludes["default"])(ignoreRoles, role)) {
72 return;
73 }
74 var props = node.openingElement.attributes;
75 var nodeIsDOMElement = (0, _isDOMElement["default"])(tag);
76 var nodeIsHiddenFromScreenReader = (0, _isHiddenFromScreenReader["default"])(tag, props);
77 var nodeIsInteractiveElement = (0, _isInteractiveElement["default"])(tag, props);
78 var nodeIsInteractiveRole = (0, _isInteractiveRole["default"])(tag, props);
79 var nodeIsControlComponent = controlComponents.indexOf(tag) > -1;
80 if (nodeIsHiddenFromScreenReader) {
81 return;
82 }
83 var hasAccessibleLabel = true;
84 if (nodeIsInteractiveElement || nodeIsDOMElement && nodeIsInteractiveRole || nodeIsControlComponent) {
85 // Prevent crazy recursion.
86 var recursionDepth = Math.min(options.depth === undefined ? 2 : options.depth, 25);
87 hasAccessibleLabel = (0, _mayHaveAccessibleLabel["default"])(node, recursionDepth, labelAttributes, elementType, controlComponents);
88 }
89 if (!hasAccessibleLabel) {
90 context.report({
91 node: node.openingElement,
92 message: errorMessage
93 });
94 }
95 };
96
97 // Create visitor selectors.
98 return {
99 JSXElement: rule
100 };
101 }
102};
103module.exports = exports.default;
Note: See TracBrowser for help on using the repository browser.