@herb-tools/linter 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -4
- package/dist/herb-lint.js +292 -107
- package/dist/herb-lint.js.map +1 -1
- package/dist/index.cjs +351 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +348 -78
- package/dist/index.js.map +1 -1
- package/dist/package.json +4 -4
- package/dist/src/default-rules.js +10 -2
- package/dist/src/default-rules.js.map +1 -1
- package/dist/src/rules/erb-require-whitespace-inside-tags.js +18 -2
- package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +1 -1
- package/dist/src/rules/html-aria-attribute-must-be-valid.js +24 -0
- package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +1 -0
- package/dist/src/rules/html-aria-role-must-be-valid.js +21 -0
- package/dist/src/rules/html-aria-role-must-be-valid.js.map +1 -0
- package/dist/src/rules/html-no-duplicate-ids.js +25 -0
- package/dist/src/rules/html-no-duplicate-ids.js.map +1 -0
- package/dist/src/rules/html-tag-name-lowercase.js +17 -8
- package/dist/src/rules/html-tag-name-lowercase.js.map +1 -1
- package/dist/src/rules/index.js +4 -0
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/rule-utils.js +126 -8
- package/dist/src/rules/rule-utils.js.map +1 -1
- package/dist/src/rules/svg-tag-name-capitalization.js +57 -0
- package/dist/src/rules/svg-tag-name-capitalization.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +6 -0
- package/dist/types/rules/html-aria-role-must-be-valid.d.ts +6 -0
- package/dist/types/rules/html-no-duplicate-ids.d.ts +6 -0
- package/dist/types/rules/index.d.ts +4 -0
- package/dist/types/rules/rule-utils.d.ts +11 -0
- package/dist/types/rules/svg-tag-name-capitalization.d.ts +6 -0
- package/dist/types/src/rules/html-aria-attribute-must-be-valid.d.ts +6 -0
- package/dist/types/src/rules/html-aria-role-must-be-valid.d.ts +6 -0
- package/dist/types/src/rules/html-no-duplicate-ids.d.ts +6 -0
- package/dist/types/src/rules/index.d.ts +4 -0
- package/dist/types/src/rules/rule-utils.d.ts +11 -0
- package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +6 -0
- package/docs/rules/README.md +5 -0
- package/docs/rules/html-aria-attribute-must-be-valid.md +45 -0
- package/docs/rules/html-aria-role-must-be-valid.md +45 -0
- package/docs/rules/html-no-duplicate-ids.md +49 -0
- package/docs/rules/svg-tag-name-capitalization.md +57 -0
- package/package.json +4 -4
- package/src/default-rules.ts +10 -2
- package/src/rules/erb-require-whitespace-inside-tags.ts +33 -2
- package/src/rules/html-aria-attribute-must-be-valid.ts +42 -0
- package/src/rules/html-aria-role-must-be-valid.ts +30 -0
- package/src/rules/html-no-duplicate-ids.ts +39 -0
- package/src/rules/html-tag-name-lowercase.ts +24 -9
- package/src/rules/index.ts +4 -0
- package/src/rules/rule-utils.ts +145 -17
- package/src/rules/svg-tag-name-capitalization.ts +73 -0
|
@@ -2,30 +2,38 @@ import { ERBNoEmptyTagsRule } from "./rules/erb-no-empty-tags.js";
|
|
|
2
2
|
import { ERBNoOutputControlFlowRule } from "./rules/erb-no-output-control-flow.js";
|
|
3
3
|
import { ERBRequireWhitespaceRule } from "./rules/erb-require-whitespace-inside-tags.js";
|
|
4
4
|
import { HTMLAnchorRequireHrefRule } from "./rules/html-anchor-require-href.js";
|
|
5
|
+
import { HTMLAriaAttributeMustBeValid } from "./rules/html-aria-attribute-must-be-valid.js";
|
|
5
6
|
import { HTMLAriaRoleHeadingRequiresLevelRule } from "./rules/html-aria-role-heading-requires-level.js";
|
|
7
|
+
import { HTMLAriaRoleMustBeValidRule } from "./rules/html-aria-role-must-be-valid.js";
|
|
6
8
|
import { HTMLAttributeDoubleQuotesRule } from "./rules/html-attribute-double-quotes.js";
|
|
7
9
|
import { HTMLAttributeValuesRequireQuotesRule } from "./rules/html-attribute-values-require-quotes.js";
|
|
8
10
|
import { HTMLBooleanAttributesNoValueRule } from "./rules/html-boolean-attributes-no-value.js";
|
|
9
11
|
import { HTMLImgRequireAltRule } from "./rules/html-img-require-alt.js";
|
|
10
|
-
import { HTMLNoBlockInsideInlineRule } from "./rules/html-no-block-inside-inline.js"
|
|
12
|
+
// import { HTMLNoBlockInsideInlineRule } from "./rules/html-no-block-inside-inline.js"
|
|
11
13
|
import { HTMLNoDuplicateAttributesRule } from "./rules/html-no-duplicate-attributes.js";
|
|
14
|
+
import { HTMLNoDuplicateIdsRule } from "./rules/html-no-duplicate-ids.js";
|
|
12
15
|
import { HTMLNoEmptyHeadingsRule } from "./rules/html-no-empty-headings.js";
|
|
13
16
|
import { HTMLNoNestedLinksRule } from "./rules/html-no-nested-links.js";
|
|
14
17
|
import { HTMLTagNameLowercaseRule } from "./rules/html-tag-name-lowercase.js";
|
|
18
|
+
import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js";
|
|
15
19
|
export const defaultRules = [
|
|
16
20
|
ERBNoEmptyTagsRule,
|
|
17
21
|
ERBNoOutputControlFlowRule,
|
|
18
22
|
ERBRequireWhitespaceRule,
|
|
19
23
|
HTMLAnchorRequireHrefRule,
|
|
24
|
+
HTMLAriaAttributeMustBeValid,
|
|
20
25
|
HTMLAriaRoleHeadingRequiresLevelRule,
|
|
26
|
+
HTMLAriaRoleMustBeValidRule,
|
|
21
27
|
HTMLAttributeDoubleQuotesRule,
|
|
22
28
|
HTMLAttributeValuesRequireQuotesRule,
|
|
23
29
|
HTMLBooleanAttributesNoValueRule,
|
|
24
30
|
HTMLImgRequireAltRule,
|
|
25
|
-
HTMLNoBlockInsideInlineRule,
|
|
31
|
+
// HTMLNoBlockInsideInlineRule,
|
|
26
32
|
HTMLNoDuplicateAttributesRule,
|
|
33
|
+
HTMLNoDuplicateIdsRule,
|
|
27
34
|
HTMLNoEmptyHeadingsRule,
|
|
28
35
|
HTMLNoNestedLinksRule,
|
|
29
36
|
HTMLTagNameLowercaseRule,
|
|
37
|
+
SVGTagNameCapitalizationRule,
|
|
30
38
|
];
|
|
31
39
|
//# sourceMappingURL=default-rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-rules.js","sourceRoot":"","sources":["../../src/default-rules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,oCAAoC,EAAE,MAAM,kDAAkD,CAAA;AACvG,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,oCAAoC,EAAE,MAAM,iDAAiD,CAAA;AACtG,OAAO,EAAE,gCAAgC,EAAE,MAAM,6CAA6C,CAAA;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"default-rules.js","sourceRoot":"","sources":["../../src/default-rules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAA;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,8CAA8C,CAAA;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,kDAAkD,CAAA;AACvG,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAA;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,oCAAoC,EAAE,MAAM,iDAAiD,CAAA;AACtG,OAAO,EAAE,gCAAgC,EAAE,MAAM,6CAA6C,CAAA;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,uFAAuF;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AAErF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,kBAAkB;IAClB,0BAA0B;IAC1B,wBAAwB;IACxB,yBAAyB;IACzB,4BAA4B;IAC5B,oCAAoC;IACpC,2BAA2B;IAC3B,6BAA6B;IAC7B,oCAAoC;IACpC,gCAAgC;IAChC,qBAAqB;IACrB,+BAA+B;IAC/B,6BAA6B;IAC7B,sBAAsB;IACtB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;IACxB,4BAA4B;CAC7B,CAAA"}
|
|
@@ -16,8 +16,24 @@ class RequireWhitespaceInsideTags extends BaseRuleVisitor {
|
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
const value = content.value;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
if (openTag.value === "<%#") {
|
|
20
|
+
this.checkCommentTagWhitespace(openTag, closeTag, value);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
this.checkOpenTagWhitespace(openTag, value);
|
|
24
|
+
this.checkCloseTagWhitespace(closeTag, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
checkCommentTagWhitespace(openTag, closeTag, content) {
|
|
28
|
+
if (!content.startsWith(" ") && !content.startsWith("\n") && !content.startsWith("=")) {
|
|
29
|
+
this.addOffense(`Add whitespace after \`${openTag.value}\`.`, openTag.location, "error");
|
|
30
|
+
}
|
|
31
|
+
else if (content.startsWith("=") && content.length > 1 && !content[1].match(/\s/)) {
|
|
32
|
+
this.addOffense(`Add whitespace after \`<%#=\`.`, openTag.location, "error");
|
|
33
|
+
}
|
|
34
|
+
if (!content.endsWith(" ") && !content.endsWith("\n")) {
|
|
35
|
+
this.addOffense(`Add whitespace before \`${closeTag.value}\`.`, closeTag.location, "error");
|
|
36
|
+
}
|
|
21
37
|
}
|
|
22
38
|
checkOpenTagWhitespace(openTag, content) {
|
|
23
39
|
if (content.startsWith(" ") || content.startsWith("\n")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erb-require-whitespace-inside-tags.js","sourceRoot":"","sources":["../../../src/rules/erb-require-whitespace-inside-tags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,2BAA4B,SAAQ,eAAe;IAEvD,eAAe,CAAC,IAAU;QACxB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC1B,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAEO,eAAe,CAAC,IAAU;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAE3B,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"erb-require-whitespace-inside-tags.js","sourceRoot":"","sources":["../../../src/rules/erb-require-whitespace-inside-tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ARIA_ATTRIBUTES, AttributeVisitorMixin, } from "./rule-utils.js";
|
|
2
|
+
class AriaAttributeMustBeValid extends AttributeVisitorMixin {
|
|
3
|
+
checkAttribute(attributeName, _attributeValue, attributeNode, _parentNode) {
|
|
4
|
+
if (!attributeName.startsWith("aria-"))
|
|
5
|
+
return;
|
|
6
|
+
if (!ARIA_ATTRIBUTES.has(attributeName)) {
|
|
7
|
+
this.offenses.push({
|
|
8
|
+
message: `The attribute \`${attributeName}\` is not a valid ARIA attribute. ARIA attributes must match the WAI-ARIA specification.`,
|
|
9
|
+
severity: "error",
|
|
10
|
+
location: attributeNode.location,
|
|
11
|
+
rule: this.ruleName,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class HTMLAriaAttributeMustBeValid {
|
|
17
|
+
name = "html-aria-attribute-must-be-valid";
|
|
18
|
+
check(node) {
|
|
19
|
+
const visitor = new AriaAttributeMustBeValid(this.name);
|
|
20
|
+
visitor.visit(node);
|
|
21
|
+
return visitor.offenses;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=html-aria-attribute-must-be-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-aria-attribute-must-be-valid.js","sourceRoot":"","sources":["../../../src/rules/html-aria-attribute-must-be-valid.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAUzB,MAAM,wBAAyB,SAAQ,qBAAqB;IAC1D,cAAc,CACZ,aAAqB,EACrB,eAA8B,EAC9B,aAAgC,EAChC,WAAmD;QAEnD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QAE/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjB,OAAO,EAAE,mBAAmB,aAAa,0FAA0F;gBACnI,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,aAAa,CAAC,QAAQ;gBAChC,IAAI,EAAE,IAAI,CAAC,QAAQ;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,4BAA4B;IACvC,IAAI,GAAG,mCAAmC,CAAC;IAE3C,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AttributeVisitorMixin, VALID_ARIA_ROLES } from "./rule-utils.js";
|
|
2
|
+
class AriaRoleMustBeValid extends AttributeVisitorMixin {
|
|
3
|
+
checkAttribute(attributeName, attributeValue, attributeNode) {
|
|
4
|
+
if (attributeName !== "role")
|
|
5
|
+
return;
|
|
6
|
+
if (attributeValue === null)
|
|
7
|
+
return;
|
|
8
|
+
if (VALID_ARIA_ROLES.has(attributeValue))
|
|
9
|
+
return;
|
|
10
|
+
this.addOffense(`The \`role\` attribute must be a valid ARIA role. Role \`${attributeValue}\` is not recognized.`, attributeNode.location, "error");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class HTMLAriaRoleMustBeValidRule {
|
|
14
|
+
name = "html-aria-role-must-be-valid";
|
|
15
|
+
check(node) {
|
|
16
|
+
const visitor = new AriaRoleMustBeValid(this.name);
|
|
17
|
+
visitor.visit(node);
|
|
18
|
+
return visitor.offenses;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=html-aria-role-must-be-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-aria-role-must-be-valid.js","sourceRoot":"","sources":["../../../src/rules/html-aria-role-must-be-valid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAKzE,MAAM,mBAAoB,SAAQ,qBAAqB;IACrD,cAAc,CAAC,aAAqB,EAAE,cAA6B,EAAE,aAAgC;QACnG,IAAI,aAAa,KAAK,MAAM;YAAE,OAAM;QACpC,IAAI,cAAc,KAAK,IAAI;YAAE,OAAM;QACnC,IAAI,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,OAAM;QAEhD,IAAI,CAAC,UAAU,CACb,4DAA4D,cAAc,uBAAuB,EACjG,aAAa,CAAC,QAAQ,EACtB,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,2BAA2B;IACtC,IAAI,GAAG,8BAA8B,CAAA;IAErC,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAElD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEnB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AttributeVisitorMixin } from "./rule-utils";
|
|
2
|
+
class NoDuplicateIdsVisitor extends AttributeVisitorMixin {
|
|
3
|
+
documentIds = new Set();
|
|
4
|
+
checkAttribute(attributeName, attributeValue, attributeNode) {
|
|
5
|
+
if (attributeName.toLowerCase() !== "id")
|
|
6
|
+
return;
|
|
7
|
+
if (!attributeValue)
|
|
8
|
+
return;
|
|
9
|
+
const id = attributeValue.trim();
|
|
10
|
+
if (this.documentIds.has(id)) {
|
|
11
|
+
this.addOffense(`Duplicate ID \`${id}\` found. IDs must be unique within a document.`, attributeNode.location, "error");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
this.documentIds.add(id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class HTMLNoDuplicateIdsRule {
|
|
18
|
+
name = "html-no-duplicate-ids";
|
|
19
|
+
check(node) {
|
|
20
|
+
const visitor = new NoDuplicateIdsVisitor(this.name);
|
|
21
|
+
visitor.visit(node);
|
|
22
|
+
return visitor.offenses;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=html-no-duplicate-ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-no-duplicate-ids.js","sourceRoot":"","sources":["../../../src/rules/html-no-duplicate-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAKpD,MAAM,qBAAsB,SAAQ,qBAAqB;IAC/C,WAAW,GAAgB,IAAI,GAAG,EAAU,CAAA;IAE1C,cAAc,CAAC,aAAqB,EAAE,cAA6B,EAAE,aAAmB;QAChG,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAM;QAChD,IAAI,CAAC,cAAc;YAAE,OAAM;QAE3B,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,CAAA;QAEhC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CACb,kBAAkB,EAAE,iDAAiD,EACrE,aAAa,CAAC,QAAQ,EACtB,OAAO,CACR,CAAA;YAED,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IACjC,IAAI,GAAG,uBAAuB,CAAA;IAE9B,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEnB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { BaseRuleVisitor } from "./rule-utils.js";
|
|
2
2
|
class TagNameLowercaseVisitor extends BaseRuleVisitor {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
visitHTMLElementNode(node) {
|
|
4
|
+
const tagName = node.tag_name?.value;
|
|
5
|
+
if (node.open_tag) {
|
|
6
|
+
this.checkTagName(node.open_tag);
|
|
7
|
+
}
|
|
8
|
+
if (tagName && ["svg"].includes(tagName.toLowerCase())) {
|
|
9
|
+
if (node.close_tag) {
|
|
10
|
+
this.checkTagName(node.close_tag);
|
|
11
|
+
}
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
9
14
|
this.visitChildNodes(node);
|
|
15
|
+
if (node.close_tag) {
|
|
16
|
+
this.checkTagName(node.close_tag);
|
|
17
|
+
}
|
|
10
18
|
}
|
|
11
19
|
visitHTMLSelfCloseTagNode(node) {
|
|
12
20
|
this.checkTagName(node);
|
|
@@ -16,7 +24,8 @@ class TagNameLowercaseVisitor extends BaseRuleVisitor {
|
|
|
16
24
|
const tagName = node.tag_name?.value;
|
|
17
25
|
if (!tagName)
|
|
18
26
|
return;
|
|
19
|
-
|
|
27
|
+
const lowercaseTagName = tagName.toLowerCase();
|
|
28
|
+
if (tagName !== lowercaseTagName) {
|
|
20
29
|
let type = node.type;
|
|
21
30
|
if (node.type == "AST_HTML_OPEN_TAG_NODE")
|
|
22
31
|
type = "Opening";
|
|
@@ -24,7 +33,7 @@ class TagNameLowercaseVisitor extends BaseRuleVisitor {
|
|
|
24
33
|
type = "Closing";
|
|
25
34
|
if (node.type == "AST_HTML_SELF_CLOSE_TAG_NODE")
|
|
26
35
|
type = "Self-closing";
|
|
27
|
-
this.addOffense(`${type} tag name \`${tagName}\` should be lowercase. Use \`${
|
|
36
|
+
this.addOffense(`${type} tag name \`${tagName}\` should be lowercase. Use \`${lowercaseTagName}\` instead.`, node.tag_name.location, "error");
|
|
28
37
|
}
|
|
29
38
|
}
|
|
30
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-tag-name-lowercase.js","sourceRoot":"","sources":["../../../src/rules/html-tag-name-lowercase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAKjD,MAAM,uBAAwB,SAAQ,eAAe;IACnD,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"html-tag-name-lowercase.js","sourceRoot":"","sources":["../../../src/rules/html-tag-name-lowercase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAKjD,MAAM,uBAAwB,SAAQ,eAAe;IACnD,oBAAoB,CAAC,IAAqB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;QAEpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAA2B,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAA6B,CAAC,CAAA;YACvD,CAAC;YAED,OAAM;QACR,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAE1B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAA6B,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,yBAAyB,CAAC,IAA0B;QAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAEO,YAAY,CAAC,IAA+D;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;QAEpC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAE9C,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACjC,IAAI,IAAI,GAAW,IAAI,CAAC,IAAI,CAAA;YAE5B,IAAI,IAAI,CAAC,IAAI,IAAI,wBAAwB;gBAAE,IAAI,GAAG,SAAS,CAAA;YAC3D,IAAI,IAAI,CAAC,IAAI,IAAI,yBAAyB;gBAAE,IAAI,GAAG,SAAS,CAAA;YAC5D,IAAI,IAAI,CAAC,IAAI,IAAI,8BAA8B;gBAAE,IAAI,GAAG,cAAc,CAAA;YAEtE,IAAI,CAAC,UAAU,CACb,GAAG,IAAI,eAAe,OAAO,iCAAiC,gBAAgB,aAAa,EAC3F,IAAI,CAAC,QAAS,CAAC,QAAQ,EACvB,OAAO,CACR,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,wBAAwB;IACnC,IAAI,GAAG,yBAAyB,CAAA;IAEhC,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
package/dist/src/rules/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
export * from "./erb-no-empty-tags.js";
|
|
2
2
|
export * from "./erb-no-output-control-flow.js";
|
|
3
3
|
export * from "./html-anchor-require-href.js";
|
|
4
|
+
export * from "./html-aria-role-heading-requires-level.js";
|
|
5
|
+
export * from "./html-aria-role-must-be-valid.js";
|
|
4
6
|
export * from "./html-attribute-double-quotes.js";
|
|
5
7
|
export * from "./html-attribute-values-require-quotes.js";
|
|
6
8
|
export * from "./html-boolean-attributes-no-value.js";
|
|
7
9
|
export * from "./html-img-require-alt.js";
|
|
8
10
|
export * from "./html-no-block-inside-inline.js";
|
|
9
11
|
export * from "./html-no-duplicate-attributes.js";
|
|
12
|
+
export * from "./html-no-duplicate-ids.js";
|
|
10
13
|
export * from "./html-no-empty-headings.js";
|
|
11
14
|
export * from "./html-no-nested-links.js";
|
|
12
15
|
export * from "./html-tag-name-lowercase.js";
|
|
16
|
+
export * from "./svg-tag-name-capitalization.js";
|
|
13
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,mCAAmC,CAAA;AACjD,cAAc,2CAA2C,CAAA;AACzD,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AACzC,cAAc,kCAAkC,CAAA;AAChD,cAAc,mCAAmC,CAAA;AACjD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4CAA4C,CAAA;AAC1D,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,2CAA2C,CAAA;AACzD,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AACzC,cAAc,kCAAkC,CAAA;AAChD,cAAc,mCAAmC,CAAA;AACjD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA"}
|
|
@@ -57,16 +57,29 @@ export function getAttributeName(attributeNode) {
|
|
|
57
57
|
* Gets the attribute value content from an HTMLAttributeValueNode
|
|
58
58
|
*/
|
|
59
59
|
export function getAttributeValue(attributeNode) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
const valueNode = attributeNode.value;
|
|
61
|
+
if (valueNode === null)
|
|
62
|
+
return null;
|
|
63
|
+
if (valueNode.type !== "AST_HTML_ATTRIBUTE_VALUE_NODE" || !valueNode.children?.length) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
let result = "";
|
|
67
|
+
for (const child of valueNode.children) {
|
|
68
|
+
switch (child.type) {
|
|
69
|
+
case "AST_ERB_CONTENT_NODE": {
|
|
70
|
+
const erbNode = child;
|
|
71
|
+
if (erbNode.content) {
|
|
72
|
+
result += `${erbNode.tag_opening?.value}${erbNode.content.value}${erbNode.tag_closing?.value}`;
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case "AST_LITERAL_NODE": {
|
|
77
|
+
result += child.content;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
67
80
|
}
|
|
68
81
|
}
|
|
69
|
-
return
|
|
82
|
+
return result;
|
|
70
83
|
}
|
|
71
84
|
/**
|
|
72
85
|
* Checks if an attribute has a value
|
|
@@ -132,6 +145,111 @@ export const HTML_BOOLEAN_ATTRIBUTES = new Set([
|
|
|
132
145
|
"noresize", "noshade", "nowrap", "sortable", "truespeed", "typemustmatch"
|
|
133
146
|
]);
|
|
134
147
|
export const HEADING_TAGS = new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
|
|
148
|
+
/**
|
|
149
|
+
* SVG elements that use camelCase naming
|
|
150
|
+
*/
|
|
151
|
+
export const SVG_CAMEL_CASE_ELEMENTS = new Set([
|
|
152
|
+
"animateMotion",
|
|
153
|
+
"animateTransform",
|
|
154
|
+
"clipPath",
|
|
155
|
+
"feBlend",
|
|
156
|
+
"feColorMatrix",
|
|
157
|
+
"feComponentTransfer",
|
|
158
|
+
"feComposite",
|
|
159
|
+
"feConvolveMatrix",
|
|
160
|
+
"feDiffuseLighting",
|
|
161
|
+
"feDisplacementMap",
|
|
162
|
+
"feDistantLight",
|
|
163
|
+
"feDropShadow",
|
|
164
|
+
"feFlood",
|
|
165
|
+
"feFuncA",
|
|
166
|
+
"feFuncB",
|
|
167
|
+
"feFuncG",
|
|
168
|
+
"feFuncR",
|
|
169
|
+
"feGaussianBlur",
|
|
170
|
+
"feImage",
|
|
171
|
+
"feMerge",
|
|
172
|
+
"feMergeNode",
|
|
173
|
+
"feMorphology",
|
|
174
|
+
"feOffset",
|
|
175
|
+
"fePointLight",
|
|
176
|
+
"feSpecularLighting",
|
|
177
|
+
"feSpotLight",
|
|
178
|
+
"feTile",
|
|
179
|
+
"feTurbulence",
|
|
180
|
+
"foreignObject",
|
|
181
|
+
"glyphRef",
|
|
182
|
+
"linearGradient",
|
|
183
|
+
"radialGradient",
|
|
184
|
+
"textPath"
|
|
185
|
+
]);
|
|
186
|
+
/**
|
|
187
|
+
* Mapping from lowercase SVG element names to their correct camelCase versions
|
|
188
|
+
* Generated dynamically from SVG_CAMEL_CASE_ELEMENTS
|
|
189
|
+
*/
|
|
190
|
+
export const SVG_LOWERCASE_TO_CAMELCASE = new Map(Array.from(SVG_CAMEL_CASE_ELEMENTS).map(element => [element.toLowerCase(), element]));
|
|
191
|
+
export const VALID_ARIA_ROLES = new Set([
|
|
192
|
+
"banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search",
|
|
193
|
+
"article", "cell", "columnheader", "definition", "directory", "document", "feed", "figure",
|
|
194
|
+
"group", "heading", "img", "list", "listitem", "math", "none", "note", "presentation",
|
|
195
|
+
"row", "rowgroup", "rowheader", "separator", "table", "term", "tooltip",
|
|
196
|
+
"alert", "alertdialog", "button", "checkbox", "combobox", "dialog", "grid", "gridcell", "link",
|
|
197
|
+
"listbox", "menu", "menubar", "menuitem", "menuitemcheckbox", "menuitemradio", "option",
|
|
198
|
+
"progressbar", "radio", "radiogroup", "scrollbar", "searchbox", "slider", "spinbutton",
|
|
199
|
+
"status", "switch", "tab", "tablist", "tabpanel", "textbox", "timer", "toolbar", "tree",
|
|
200
|
+
"treegrid", "treeitem",
|
|
201
|
+
"log", "marquee"
|
|
202
|
+
]);
|
|
203
|
+
export const ARIA_ATTRIBUTES = new Set([
|
|
204
|
+
'aria-activedescendant',
|
|
205
|
+
'aria-atomic',
|
|
206
|
+
'aria-autocomplete',
|
|
207
|
+
'aria-busy',
|
|
208
|
+
'aria-checked',
|
|
209
|
+
'aria-colcount',
|
|
210
|
+
'aria-colindex',
|
|
211
|
+
'aria-colspan',
|
|
212
|
+
'aria-controls',
|
|
213
|
+
'aria-current',
|
|
214
|
+
'aria-describedby',
|
|
215
|
+
'aria-details',
|
|
216
|
+
'aria-disabled',
|
|
217
|
+
'aria-dropeffect',
|
|
218
|
+
'aria-errormessage',
|
|
219
|
+
'aria-expanded',
|
|
220
|
+
'aria-flowto',
|
|
221
|
+
'aria-grabbed',
|
|
222
|
+
'aria-haspopup',
|
|
223
|
+
'aria-hidden',
|
|
224
|
+
'aria-invalid',
|
|
225
|
+
'aria-keyshortcuts',
|
|
226
|
+
'aria-label',
|
|
227
|
+
'aria-labelledby',
|
|
228
|
+
'aria-level',
|
|
229
|
+
'aria-live',
|
|
230
|
+
'aria-modal',
|
|
231
|
+
'aria-multiline',
|
|
232
|
+
'aria-multiselectable',
|
|
233
|
+
'aria-orientation',
|
|
234
|
+
'aria-owns',
|
|
235
|
+
'aria-placeholder',
|
|
236
|
+
'aria-posinset',
|
|
237
|
+
'aria-pressed',
|
|
238
|
+
'aria-readonly',
|
|
239
|
+
'aria-relevant',
|
|
240
|
+
'aria-required',
|
|
241
|
+
'aria-roledescription',
|
|
242
|
+
'aria-rowcount',
|
|
243
|
+
'aria-rowindex',
|
|
244
|
+
'aria-rowspan',
|
|
245
|
+
'aria-selected',
|
|
246
|
+
'aria-setsize',
|
|
247
|
+
'aria-sort',
|
|
248
|
+
'aria-valuemax',
|
|
249
|
+
'aria-valuemin',
|
|
250
|
+
'aria-valuenow',
|
|
251
|
+
'aria-valuetext',
|
|
252
|
+
]);
|
|
135
253
|
/**
|
|
136
254
|
* Checks if an element is inline
|
|
137
255
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-utils.js","sourceRoot":"","sources":["../../../src/rules/rule-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACR,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"rule-utils.js","sourceRoot":"","sources":["../../../src/rules/rule-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { BaseRuleVisitor, SVG_CAMEL_CASE_ELEMENTS, SVG_LOWERCASE_TO_CAMELCASE } from "./rule-utils.js";
|
|
2
|
+
class SVGTagNameCapitalizationVisitor extends BaseRuleVisitor {
|
|
3
|
+
insideSVG = false;
|
|
4
|
+
visitHTMLElementNode(node) {
|
|
5
|
+
const tagName = node.tag_name?.value;
|
|
6
|
+
if (tagName && ["svg"].includes(tagName.toLowerCase())) {
|
|
7
|
+
const wasInsideSVG = this.insideSVG;
|
|
8
|
+
this.insideSVG = true;
|
|
9
|
+
this.visitChildNodes(node);
|
|
10
|
+
this.insideSVG = wasInsideSVG;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (this.insideSVG) {
|
|
14
|
+
if (node.open_tag) {
|
|
15
|
+
this.checkTagName(node.open_tag);
|
|
16
|
+
}
|
|
17
|
+
if (node.close_tag) {
|
|
18
|
+
this.checkTagName(node.close_tag);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
this.visitChildNodes(node);
|
|
22
|
+
}
|
|
23
|
+
visitHTMLSelfCloseTagNode(node) {
|
|
24
|
+
if (this.insideSVG) {
|
|
25
|
+
this.checkTagName(node);
|
|
26
|
+
}
|
|
27
|
+
this.visitChildNodes(node);
|
|
28
|
+
}
|
|
29
|
+
checkTagName(node) {
|
|
30
|
+
const tagName = node.tag_name?.value;
|
|
31
|
+
if (!tagName)
|
|
32
|
+
return;
|
|
33
|
+
if (SVG_CAMEL_CASE_ELEMENTS.has(tagName))
|
|
34
|
+
return;
|
|
35
|
+
const lowercaseTagName = tagName.toLowerCase();
|
|
36
|
+
const correctCamelCase = SVG_LOWERCASE_TO_CAMELCASE.get(lowercaseTagName);
|
|
37
|
+
if (correctCamelCase && tagName !== correctCamelCase) {
|
|
38
|
+
let type = node.type;
|
|
39
|
+
if (node.type == "AST_HTML_OPEN_TAG_NODE")
|
|
40
|
+
type = "Opening";
|
|
41
|
+
if (node.type == "AST_HTML_CLOSE_TAG_NODE")
|
|
42
|
+
type = "Closing";
|
|
43
|
+
if (node.type == "AST_HTML_SELF_CLOSE_TAG_NODE")
|
|
44
|
+
type = "Self-closing";
|
|
45
|
+
this.addOffense(`${type} SVG tag name \`${tagName}\` should use proper capitalization. Use \`${correctCamelCase}\` instead.`, node.tag_name.location, "error");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class SVGTagNameCapitalizationRule {
|
|
50
|
+
name = "svg-tag-name-capitalization";
|
|
51
|
+
check(node) {
|
|
52
|
+
const visitor = new SVGTagNameCapitalizationVisitor(this.name);
|
|
53
|
+
visitor.visit(node);
|
|
54
|
+
return visitor.offenses;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=svg-tag-name-capitalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-tag-name-capitalization.js","sourceRoot":"","sources":["../../../src/rules/svg-tag-name-capitalization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAKtG,MAAM,+BAAgC,SAAQ,eAAe;IACnD,SAAS,GAAG,KAAK,CAAA;IAEzB,oBAAoB,CAAC,IAAqB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;QAEpC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAA;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;YACrB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,SAAS,GAAG,YAAY,CAAA;YAC7B,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAA2B,CAAC,CAAA;YACrD,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAA6B,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,yBAAyB,CAAC,IAA0B;QAClD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAEO,YAAY,CAAC,IAA+D;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;QAEpC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAM;QAEhD,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;QAC9C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAEzE,IAAI,gBAAgB,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACrD,IAAI,IAAI,GAAW,IAAI,CAAC,IAAI,CAAA;YAE5B,IAAI,IAAI,CAAC,IAAI,IAAI,wBAAwB;gBAAE,IAAI,GAAG,SAAS,CAAA;YAC3D,IAAI,IAAI,CAAC,IAAI,IAAI,yBAAyB;gBAAE,IAAI,GAAG,SAAS,CAAA;YAC5D,IAAI,IAAI,CAAC,IAAI,IAAI,8BAA8B;gBAAE,IAAI,GAAG,cAAc,CAAA;YAEtE,IAAI,CAAC,UAAU,CACb,GAAG,IAAI,mBAAmB,OAAO,8CAA8C,gBAAgB,aAAa,EAC5G,IAAI,CAAC,QAAS,CAAC,QAAQ,EACvB,OAAO,CACR,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,4BAA4B;IACvC,IAAI,GAAG,6BAA6B,CAAA;IAEpC,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/cli.ts","../src/default-rules.ts","../src/herb-lint.ts","../src/index.ts","../src/linter.ts","../src/types.ts","../src/cli/argument-parser.ts","../src/cli/file-processor.ts","../src/cli/index.ts","../src/cli/summary-reporter.ts","../src/cli/formatters/base-formatter.ts","../src/cli/formatters/detailed-formatter.ts","../src/cli/formatters/index.ts","../src/cli/formatters/simple-formatter.ts","../src/rules/erb-no-empty-tags.ts","../src/rules/erb-no-output-control-flow.ts","../src/rules/erb-require-whitespace-inside-tags.ts","../src/rules/html-anchor-require-href.ts","../src/rules/html-aria-role-heading-requires-level.ts","../src/rules/html-attribute-double-quotes.ts","../src/rules/html-attribute-values-require-quotes.ts","../src/rules/html-boolean-attributes-no-value.ts","../src/rules/html-img-require-alt.ts","../src/rules/html-no-block-inside-inline.ts","../src/rules/html-no-duplicate-attributes.ts","../src/rules/html-no-empty-headings.ts","../src/rules/html-no-nested-links.ts","../src/rules/html-tag-name-lowercase.ts","../src/rules/index.ts","../src/rules/rule-utils.ts"],"version":"5.8.3"}
|
|
1
|
+
{"root":["../src/cli.ts","../src/default-rules.ts","../src/herb-lint.ts","../src/index.ts","../src/linter.ts","../src/types.ts","../src/cli/argument-parser.ts","../src/cli/file-processor.ts","../src/cli/index.ts","../src/cli/summary-reporter.ts","../src/cli/formatters/base-formatter.ts","../src/cli/formatters/detailed-formatter.ts","../src/cli/formatters/index.ts","../src/cli/formatters/simple-formatter.ts","../src/rules/erb-no-empty-tags.ts","../src/rules/erb-no-output-control-flow.ts","../src/rules/erb-require-whitespace-inside-tags.ts","../src/rules/html-anchor-require-href.ts","../src/rules/html-aria-attribute-must-be-valid.ts","../src/rules/html-aria-role-heading-requires-level.ts","../src/rules/html-aria-role-must-be-valid.ts","../src/rules/html-attribute-double-quotes.ts","../src/rules/html-attribute-values-require-quotes.ts","../src/rules/html-boolean-attributes-no-value.ts","../src/rules/html-img-require-alt.ts","../src/rules/html-no-block-inside-inline.ts","../src/rules/html-no-duplicate-attributes.ts","../src/rules/html-no-duplicate-ids.ts","../src/rules/html-no-empty-headings.ts","../src/rules/html-no-nested-links.ts","../src/rules/html-tag-name-lowercase.ts","../src/rules/index.ts","../src/rules/rule-utils.ts","../src/rules/svg-tag-name-capitalization.ts"],"version":"5.8.3"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export * from "./erb-no-empty-tags.js";
|
|
2
2
|
export * from "./erb-no-output-control-flow.js";
|
|
3
3
|
export * from "./html-anchor-require-href.js";
|
|
4
|
+
export * from "./html-aria-role-heading-requires-level.js";
|
|
5
|
+
export * from "./html-aria-role-must-be-valid.js";
|
|
4
6
|
export * from "./html-attribute-double-quotes.js";
|
|
5
7
|
export * from "./html-attribute-values-require-quotes.js";
|
|
6
8
|
export * from "./html-boolean-attributes-no-value.js";
|
|
7
9
|
export * from "./html-img-require-alt.js";
|
|
8
10
|
export * from "./html-no-block-inside-inline.js";
|
|
9
11
|
export * from "./html-no-duplicate-attributes.js";
|
|
12
|
+
export * from "./html-no-duplicate-ids.js";
|
|
10
13
|
export * from "./html-no-empty-headings.js";
|
|
11
14
|
export * from "./html-no-nested-links.js";
|
|
12
15
|
export * from "./html-tag-name-lowercase.js";
|
|
16
|
+
export * from "./svg-tag-name-capitalization.js";
|
|
@@ -56,6 +56,17 @@ export declare const HTML_INLINE_ELEMENTS: Set<string>;
|
|
|
56
56
|
export declare const HTML_BLOCK_ELEMENTS: Set<string>;
|
|
57
57
|
export declare const HTML_BOOLEAN_ATTRIBUTES: Set<string>;
|
|
58
58
|
export declare const HEADING_TAGS: Set<string>;
|
|
59
|
+
/**
|
|
60
|
+
* SVG elements that use camelCase naming
|
|
61
|
+
*/
|
|
62
|
+
export declare const SVG_CAMEL_CASE_ELEMENTS: Set<string>;
|
|
63
|
+
/**
|
|
64
|
+
* Mapping from lowercase SVG element names to their correct camelCase versions
|
|
65
|
+
* Generated dynamically from SVG_CAMEL_CASE_ELEMENTS
|
|
66
|
+
*/
|
|
67
|
+
export declare const SVG_LOWERCASE_TO_CAMELCASE: Map<string, string>;
|
|
68
|
+
export declare const VALID_ARIA_ROLES: Set<string>;
|
|
69
|
+
export declare const ARIA_ATTRIBUTES: Set<string>;
|
|
59
70
|
/**
|
|
60
71
|
* Checks if an element is inline
|
|
61
72
|
*/
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export * from "./erb-no-empty-tags.js";
|
|
2
2
|
export * from "./erb-no-output-control-flow.js";
|
|
3
3
|
export * from "./html-anchor-require-href.js";
|
|
4
|
+
export * from "./html-aria-role-heading-requires-level.js";
|
|
5
|
+
export * from "./html-aria-role-must-be-valid.js";
|
|
4
6
|
export * from "./html-attribute-double-quotes.js";
|
|
5
7
|
export * from "./html-attribute-values-require-quotes.js";
|
|
6
8
|
export * from "./html-boolean-attributes-no-value.js";
|
|
7
9
|
export * from "./html-img-require-alt.js";
|
|
8
10
|
export * from "./html-no-block-inside-inline.js";
|
|
9
11
|
export * from "./html-no-duplicate-attributes.js";
|
|
12
|
+
export * from "./html-no-duplicate-ids.js";
|
|
10
13
|
export * from "./html-no-empty-headings.js";
|
|
11
14
|
export * from "./html-no-nested-links.js";
|
|
12
15
|
export * from "./html-tag-name-lowercase.js";
|
|
16
|
+
export * from "./svg-tag-name-capitalization.js";
|