@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.
Files changed (54) hide show
  1. package/README.md +2 -4
  2. package/dist/herb-lint.js +292 -107
  3. package/dist/herb-lint.js.map +1 -1
  4. package/dist/index.cjs +351 -77
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.js +348 -78
  7. package/dist/index.js.map +1 -1
  8. package/dist/package.json +4 -4
  9. package/dist/src/default-rules.js +10 -2
  10. package/dist/src/default-rules.js.map +1 -1
  11. package/dist/src/rules/erb-require-whitespace-inside-tags.js +18 -2
  12. package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +1 -1
  13. package/dist/src/rules/html-aria-attribute-must-be-valid.js +24 -0
  14. package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +1 -0
  15. package/dist/src/rules/html-aria-role-must-be-valid.js +21 -0
  16. package/dist/src/rules/html-aria-role-must-be-valid.js.map +1 -0
  17. package/dist/src/rules/html-no-duplicate-ids.js +25 -0
  18. package/dist/src/rules/html-no-duplicate-ids.js.map +1 -0
  19. package/dist/src/rules/html-tag-name-lowercase.js +17 -8
  20. package/dist/src/rules/html-tag-name-lowercase.js.map +1 -1
  21. package/dist/src/rules/index.js +4 -0
  22. package/dist/src/rules/index.js.map +1 -1
  23. package/dist/src/rules/rule-utils.js +126 -8
  24. package/dist/src/rules/rule-utils.js.map +1 -1
  25. package/dist/src/rules/svg-tag-name-capitalization.js +57 -0
  26. package/dist/src/rules/svg-tag-name-capitalization.js.map +1 -0
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +6 -0
  29. package/dist/types/rules/html-aria-role-must-be-valid.d.ts +6 -0
  30. package/dist/types/rules/html-no-duplicate-ids.d.ts +6 -0
  31. package/dist/types/rules/index.d.ts +4 -0
  32. package/dist/types/rules/rule-utils.d.ts +11 -0
  33. package/dist/types/rules/svg-tag-name-capitalization.d.ts +6 -0
  34. package/dist/types/src/rules/html-aria-attribute-must-be-valid.d.ts +6 -0
  35. package/dist/types/src/rules/html-aria-role-must-be-valid.d.ts +6 -0
  36. package/dist/types/src/rules/html-no-duplicate-ids.d.ts +6 -0
  37. package/dist/types/src/rules/index.d.ts +4 -0
  38. package/dist/types/src/rules/rule-utils.d.ts +11 -0
  39. package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +6 -0
  40. package/docs/rules/README.md +5 -0
  41. package/docs/rules/html-aria-attribute-must-be-valid.md +45 -0
  42. package/docs/rules/html-aria-role-must-be-valid.md +45 -0
  43. package/docs/rules/html-no-duplicate-ids.md +49 -0
  44. package/docs/rules/svg-tag-name-capitalization.md +57 -0
  45. package/package.json +4 -4
  46. package/src/default-rules.ts +10 -2
  47. package/src/rules/erb-require-whitespace-inside-tags.ts +33 -2
  48. package/src/rules/html-aria-attribute-must-be-valid.ts +42 -0
  49. package/src/rules/html-aria-role-must-be-valid.ts +30 -0
  50. package/src/rules/html-no-duplicate-ids.ts +39 -0
  51. package/src/rules/html-tag-name-lowercase.ts +24 -9
  52. package/src/rules/index.ts +4 -0
  53. package/src/rules/rule-utils.ts +145 -17
  54. 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,2BAA2B,EAAE,MAAM,wCAAwC,CAAA;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,kBAAkB;IAClB,0BAA0B;IAC1B,wBAAwB;IACxB,yBAAyB;IACzB,oCAAoC;IACpC,6BAA6B;IAC7B,oCAAoC;IACpC,gCAAgC;IAChC,qBAAqB;IACrB,2BAA2B;IAC3B,6BAA6B;IAC7B,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;CACzB,CAAA"}
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
- this.checkOpenTagWhitespace(openTag, value);
20
- this.checkCloseTagWhitespace(closeTag, value);
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;QAC3C,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC/C,CAAC;IAEO,sBAAsB,CAAC,OAAc,EAAE,OAAc;QAC3D,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CACb,0BAA0B,OAAO,CAAC,KAAK,KAAK,EAC5C,OAAO,CAAC,QAAQ,EAChB,OAAO,CACR,CAAA;IACH,CAAC;IAEO,uBAAuB,CAAC,QAAe,EAAE,OAAc;QAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CACb,2BAA2B,QAAQ,CAAC,KAAK,KAAK,EAC9C,QAAQ,CAAC,QAAQ,EACjB,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,wBAAwB;IACnC,IAAI,GAAG,oCAAoC,CAAA;IAC3C,KAAK,CAAC,IAAU;QACd,MAAM,OAAO,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
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
- visitHTMLOpenTagNode(node) {
4
- this.checkTagName(node);
5
- this.visitChildNodes(node);
6
- }
7
- visitHTMLCloseTagNode(node) {
8
- this.checkTagName(node);
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
- if (tagName !== tagName.toLowerCase()) {
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 \`${tagName.toLowerCase()}\` instead.`, node.tag_name.location, "error");
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,YAAY,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,qBAAqB,CAAC,IAAsB;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5B,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;QACpC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,IAAI,OAAO,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACtC,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,OAAO,CAAC,WAAW,EAAE,aAAa,EAChG,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"}
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"}
@@ -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
- if (attributeNode.value?.type === "AST_HTML_ATTRIBUTE_VALUE_NODE") {
61
- const valueNode = attributeNode.value;
62
- if (valueNode.children && valueNode.children.length > 0) {
63
- return valueNode.children
64
- .filter(child => child.type === "AST_LITERAL_NODE")
65
- .map(child => child.content)
66
- .join("");
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 null;
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":"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"}
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"}
@@ -0,0 +1,6 @@
1
+ import type { LintOffense, Rule } from "../types.js";
2
+ import type { Node } from "@herb-tools/core";
3
+ export declare class HTMLAriaAttributeMustBeValid implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Rule, LintOffense } from "../types.js";
2
+ import type { Node } from "@herb-tools/core";
3
+ export declare class HTMLAriaRoleMustBeValidRule implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Node } from "@herb-tools/core";
2
+ import type { LintOffense, Rule } from "../types";
3
+ export declare class HTMLNoDuplicateIdsRule implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -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
  */
@@ -0,0 +1,6 @@
1
+ import type { Rule, LintOffense } from "../types.js";
2
+ import type { Node } from "@herb-tools/core";
3
+ export declare class SVGTagNameCapitalizationRule implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { LintOffense, Rule } from "../types.js";
2
+ import type { Node } from "@herb-tools/core";
3
+ export declare class HTMLAriaAttributeMustBeValid implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Rule, LintOffense } from "../types.js";
2
+ import type { Node } from "@herb-tools/core";
3
+ export declare class HTMLAriaRoleMustBeValidRule implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Node } from "@herb-tools/core";
2
+ import type { LintOffense, Rule } from "../types";
3
+ export declare class HTMLNoDuplicateIdsRule implements Rule {
4
+ name: string;
5
+ check(node: Node): LintOffense[];
6
+ }
@@ -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";