From 8126ee12b340a180446bcaa1bccbd03b57e97497 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 28 Dec 2022 14:17:43 +0100 Subject: [PATCH 1/4] Added the ability to specify label components that include label --- .../__tests__/form-control-has-label.test.ts | 16 +++++++++++++++- src/rules/form-control-has-label.ts | 12 ++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/rules/__tests__/form-control-has-label.test.ts b/src/rules/__tests__/form-control-has-label.test.ts index 2442afd3..9209b352 100644 --- a/src/rules/__tests__/form-control-has-label.test.ts +++ b/src/rules/__tests__/form-control-has-label.test.ts @@ -26,6 +26,10 @@ makeRuleTester("form-control-has-label", rule, { code: "text", options: [{ labelComponents: ["CustomLabel"] }] }, + { + code: "text", + options: [{ labelComponentsWithLabel: ["CustomLabel"] }] + }, "" ], invalid: [ @@ -36,6 +40,16 @@ makeRuleTester("form-control-has-label", rule, { code: "
", options: [{ controlComponents: ["b-form-input"] }], errors: [{ messageId: "default" }] - } + }, + { + code: "
", + options: [{ controlComponents: ["b-form-input"] }], + errors: [{ messageId: "default" }] + }, + { + code: "text", + options: [{ labelComponentsWithLabel: ["CustomLabel"] }], + errors: [{ messageId: "default" }] + }, ] }); diff --git a/src/rules/form-control-has-label.ts b/src/rules/form-control-has-label.ts index 9b147400..b79565b6 100644 --- a/src/rules/form-control-has-label.ts +++ b/src/rules/form-control-has-label.ts @@ -3,6 +3,7 @@ import type { AST } from "vue-eslint-parser"; interface FormControlHasLabelOptions { labelComponents: string[]; + labelComponentsWithLabel: string[]; } import { @@ -21,10 +22,17 @@ function isLabelElement( | AST.VDocumentFragment | AST.VText | AST.VExpressionContainer, - { labelComponents = [] }: FormControlHasLabelOptions + { labelComponents = [], labelComponentsWithLabel = [] }: FormControlHasLabelOptions ) { + if (!(node.type === "VElement")) return false; const allLabelComponents = labelComponents.concat("label"); - return isMatchingElement(node, allLabelComponents); + return ( + isMatchingElement(node, allLabelComponents) + || ( + isMatchingElement(node, labelComponentsWithLabel) + && (hasAriaLabel(node) || getElementAttributeValue(node, "label")) + ) + ); } function hasLabelElement( From b0406e3a03b2ed066b28b0607bc5841fbabd4539 Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 28 Dec 2022 14:35:14 +0100 Subject: [PATCH 2/4] Improved and fixed tests --- .../__tests__/form-control-has-label.test.ts | 11 +++++++--- src/rules/form-control-has-label.ts | 21 +++++++++++-------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/rules/__tests__/form-control-has-label.test.ts b/src/rules/__tests__/form-control-has-label.test.ts index 9209b352..86f8697c 100644 --- a/src/rules/__tests__/form-control-has-label.test.ts +++ b/src/rules/__tests__/form-control-has-label.test.ts @@ -27,7 +27,7 @@ makeRuleTester("form-control-has-label", rule, { options: [{ labelComponents: ["CustomLabel"] }] }, { - code: "text", + code: "", options: [{ labelComponentsWithLabel: ["CustomLabel"] }] }, "" @@ -42,12 +42,17 @@ makeRuleTester("form-control-has-label", rule, { errors: [{ messageId: "default" }] }, { - code: "
", + code: "
", options: [{ controlComponents: ["b-form-input"] }], errors: [{ messageId: "default" }] }, { - code: "text", + code: "", + options: [{ labelComponentsWithLabel: ["CustomLabel"] }], + errors: [{ messageId: "default" }] + }, + { + code: "label next to input", options: [{ labelComponentsWithLabel: ["CustomLabel"] }], errors: [{ messageId: "default" }] }, diff --git a/src/rules/form-control-has-label.ts b/src/rules/form-control-has-label.ts index b79565b6..a5e89a10 100644 --- a/src/rules/form-control-has-label.ts +++ b/src/rules/form-control-has-label.ts @@ -22,16 +22,19 @@ function isLabelElement( | AST.VDocumentFragment | AST.VText | AST.VExpressionContainer, - { labelComponents = [], labelComponentsWithLabel = [] }: FormControlHasLabelOptions + { labelComponents = [] }: FormControlHasLabelOptions ) { - if (!(node.type === "VElement")) return false; const allLabelComponents = labelComponents.concat("label"); - return ( - isMatchingElement(node, allLabelComponents) - || ( - isMatchingElement(node, labelComponentsWithLabel) - && (hasAriaLabel(node) || getElementAttributeValue(node, "label")) - ) + return isMatchingElement(node, allLabelComponents); +} + +function isElementWithLabel( + node: | AST.VElement, + { labelComponentsWithLabel = [] }: FormControlHasLabelOptions +) { + return Boolean( + isMatchingElement(node, labelComponentsWithLabel) + && (hasAriaLabel(node) || getElementAttributeValue(node, "label")) ); } @@ -45,7 +48,7 @@ function hasLabelElement( [parent, ...parent.children].some((node) => isLabelElement(node, options) ) || - (parent && parent.type === "VElement" && hasLabelElement(parent, options)) + (parent && parent.type === "VElement" && (isElementWithLabel(parent, options) || hasLabelElement(parent, options))) ); } From 11b955749bc73ae882dcf21479907ea725ee0f5b Mon Sep 17 00:00:00 2001 From: Lars van Hijfte Date: Wed, 28 Dec 2022 14:35:34 +0100 Subject: [PATCH 3/4] Added doc information --- docs/form-control-has-label.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/form-control-has-label.md b/docs/form-control-has-label.md index 82a03f89..a53ef618 100644 --- a/docs/form-control-has-label.md +++ b/docs/form-control-has-label.md @@ -16,6 +16,7 @@ This rule takes one optional object argument of type object: "vuejs-accessibility/form-control-has-label": [ "error", { + "labelComponentsWithLabel": ["CustomComponentWithLabelAttribute"], "labelComponents": ["CustomLabel"], "controlComponents": ["CustomInput"] } @@ -26,6 +27,8 @@ This rule takes one optional object argument of type object: For the `labelComponents` option, these strings determine which elements (**always including** `