From a1b3f230bfd77f4f24af9f0b30f0df853a727a13 Mon Sep 17 00:00:00 2001 From: TMaszko Date: Sat, 25 Oct 2025 23:58:13 +0200 Subject: [PATCH 1/2] fix: remove title from the anchor has content rule --- __tests__/src/rules/anchor-has-content-test.js | 2 +- docs/rules/anchor-has-content.md | 3 +-- src/rules/anchor-has-content.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/__tests__/src/rules/anchor-has-content-test.js b/__tests__/src/rules/anchor-has-content-test.js index 346eea5cf..8812de611 100644 --- a/__tests__/src/rules/anchor-has-content-test.js +++ b/__tests__/src/rules/anchor-has-content-test.js @@ -37,7 +37,6 @@ ruleTester.run('anchor-has-content', rule, { code: 'foo', settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, - { code: '' }, { code: '' }, { code: '' }, )).map(parserOptionsMapper), @@ -45,6 +44,7 @@ ruleTester.run('anchor-has-content', rule, { { code: '', errors: [expectedError] }, { code: '', errors: [expectedError] }, { code: '{undefined}', errors: [expectedError] }, + { code: '', errors: [expectedError] }, { code: '', errors: [expectedError], diff --git a/docs/rules/anchor-has-content.md b/docs/rules/anchor-has-content.md index 03082fbb9..46e4aee5a 100644 --- a/docs/rules/anchor-has-content.md +++ b/docs/rules/anchor-has-content.md @@ -6,7 +6,7 @@ Enforce that anchors have content and that the content is accessible to screen readers. Accessible means that it is not hidden using the `aria-hidden` prop. Refer to the references to learn about why this is important. -Alternatively, you may use the `title` prop or the `aria-label` prop. +Alternatively, you may use the `aria-label` prop. ## Rule options @@ -47,7 +47,6 @@ return ( Anchor Content! - ``` diff --git a/src/rules/anchor-has-content.js b/src/rules/anchor-has-content.js index 3381b4f6b..6d2436778 100644 --- a/src/rules/anchor-has-content.js +++ b/src/rules/anchor-has-content.js @@ -7,7 +7,7 @@ // Rule Definition // ---------------------------------------------------------------------------- -import { hasAnyProp } from 'jsx-ast-utils'; +import { hasProp } from 'jsx-ast-utils'; import getElementType from '../util/getElementType'; import { arraySchema, generateObjSchema } from '../util/schemas'; @@ -42,7 +42,7 @@ export default { if (hasAccessibleChild(node.parent, elementType)) { return; } - if (hasAnyProp(node.attributes, ['title', 'aria-label'])) { + if (hasProp(node.attributes, 'aria-label')) { return; } From 43eeb95c359017ebf1894e171a08a7b32ad4e8ba Mon Sep 17 00:00:00 2001 From: TMaszko Date: Wed, 5 Nov 2025 23:09:41 +0100 Subject: [PATCH 2/2] fix: make sure that title cannot be passed alongside the aria-label --- __tests__/src/rules/anchor-has-content-test.js | 2 +- src/rules/anchor-has-content.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/src/rules/anchor-has-content-test.js b/__tests__/src/rules/anchor-has-content-test.js index 8812de611..114c6b4a2 100644 --- a/__tests__/src/rules/anchor-has-content-test.js +++ b/__tests__/src/rules/anchor-has-content-test.js @@ -38,13 +38,13 @@ ruleTester.run('anchor-has-content', rule, { settings: { 'jsx-a11y': { components: { Link: 'a' } } }, }, { code: '' }, - { code: '' }, )).map(parserOptionsMapper), invalid: parsers.all([].concat( { code: '', errors: [expectedError] }, { code: '', errors: [expectedError] }, { code: '{undefined}', errors: [expectedError] }, { code: '', errors: [expectedError] }, + { code: '', errors: [expectedError] }, { code: '', errors: [expectedError], diff --git a/src/rules/anchor-has-content.js b/src/rules/anchor-has-content.js index 6d2436778..b28a41a74 100644 --- a/src/rules/anchor-has-content.js +++ b/src/rules/anchor-has-content.js @@ -42,7 +42,7 @@ export default { if (hasAccessibleChild(node.parent, elementType)) { return; } - if (hasProp(node.attributes, 'aria-label')) { + if (hasProp(node.attributes, 'aria-label') && !hasProp(node.attributes, 'title')) { return; }