@herb-tools/linter 0.4.2 → 0.5.0
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 +221 -10
- package/dist/herb-lint.js +817 -292
- package/dist/herb-lint.js.map +1 -1
- package/dist/index.cjs +360 -81
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +355 -83
- package/dist/index.js.map +1 -1
- package/dist/package.json +4 -4
- package/dist/src/cli/argument-parser.js +28 -18
- package/dist/src/cli/argument-parser.js.map +1 -1
- package/dist/src/cli/file-processor.js +21 -17
- package/dist/src/cli/file-processor.js.map +1 -1
- package/dist/src/cli/formatters/detailed-formatter.js +9 -9
- package/dist/src/cli/formatters/detailed-formatter.js.map +1 -1
- package/dist/src/cli/formatters/github-actions-formatter.js +50 -0
- package/dist/src/cli/formatters/github-actions-formatter.js.map +1 -0
- package/dist/src/cli/formatters/index.js +2 -0
- package/dist/src/cli/formatters/index.js.map +1 -1
- package/dist/src/cli/formatters/json-formatter.js +58 -0
- package/dist/src/cli/formatters/json-formatter.js.map +1 -0
- package/dist/src/cli/formatters/simple-formatter.js +15 -15
- package/dist/src/cli/formatters/simple-formatter.js.map +1 -1
- package/dist/src/cli/output-manager.js +120 -0
- package/dist/src/cli/output-manager.js.map +1 -0
- package/dist/src/cli/summary-reporter.js +22 -22
- package/dist/src/cli/summary-reporter.js.map +1 -1
- package/dist/src/cli.js +41 -26
- package/dist/src/cli.js.map +1 -1
- package/dist/src/default-rules.js +8 -0
- package/dist/src/default-rules.js.map +1 -1
- package/dist/src/linter.js +37 -6
- package/dist/src/linter.js.map +1 -1
- package/dist/src/rules/erb-no-empty-tags.js +5 -4
- package/dist/src/rules/erb-no-empty-tags.js.map +1 -1
- package/dist/src/rules/erb-no-output-control-flow.js +5 -4
- package/dist/src/rules/erb-no-output-control-flow.js.map +1 -1
- package/dist/src/rules/erb-prefer-image-tag-helper.js +93 -0
- package/dist/src/rules/erb-prefer-image-tag-helper.js.map +1 -0
- package/dist/src/rules/erb-require-whitespace-inside-tags.js +5 -4
- package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +1 -1
- package/dist/src/rules/erb-requires-trailing-newline.js +22 -0
- package/dist/src/rules/erb-requires-trailing-newline.js.map +1 -0
- package/dist/src/rules/html-anchor-require-href.js +5 -4
- package/dist/src/rules/html-anchor-require-href.js.map +1 -1
- package/dist/src/rules/html-aria-attribute-must-be-valid.js +5 -4
- package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +1 -1
- package/dist/src/rules/html-aria-level-must-be-valid.js +27 -0
- package/dist/src/rules/html-aria-level-must-be-valid.js.map +1 -0
- package/dist/src/rules/html-aria-role-heading-requires-level.js +5 -4
- package/dist/src/rules/html-aria-role-heading-requires-level.js.map +1 -1
- package/dist/src/rules/html-aria-role-must-be-valid.js +5 -4
- package/dist/src/rules/html-aria-role-must-be-valid.js.map +1 -1
- package/dist/src/rules/html-attribute-double-quotes.js +5 -4
- package/dist/src/rules/html-attribute-double-quotes.js.map +1 -1
- package/dist/src/rules/html-attribute-values-require-quotes.js +5 -4
- package/dist/src/rules/html-attribute-values-require-quotes.js.map +1 -1
- package/dist/src/rules/html-boolean-attributes-no-value.js +5 -4
- package/dist/src/rules/html-boolean-attributes-no-value.js.map +1 -1
- package/dist/src/rules/html-img-require-alt.js +5 -4
- package/dist/src/rules/html-img-require-alt.js.map +1 -1
- package/dist/src/rules/html-no-block-inside-inline.js +7 -6
- package/dist/src/rules/html-no-block-inside-inline.js.map +1 -1
- package/dist/src/rules/html-no-duplicate-attributes.js +5 -4
- package/dist/src/rules/html-no-duplicate-attributes.js.map +1 -1
- package/dist/src/rules/html-no-duplicate-ids.js +5 -4
- package/dist/src/rules/html-no-duplicate-ids.js.map +1 -1
- package/dist/src/rules/html-no-empty-headings.js +5 -4
- package/dist/src/rules/html-no-empty-headings.js.map +1 -1
- package/dist/src/rules/html-no-nested-links.js +5 -4
- package/dist/src/rules/html-no-nested-links.js.map +1 -1
- package/dist/src/rules/html-tag-name-lowercase.js +5 -4
- package/dist/src/rules/html-tag-name-lowercase.js.map +1 -1
- package/dist/src/rules/index.js +3 -0
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/parser-no-errors.js +18 -0
- package/dist/src/rules/parser-no-errors.js.map +1 -0
- package/dist/src/rules/rule-utils.js +125 -2
- package/dist/src/rules/rule-utils.js.map +1 -1
- package/dist/src/rules/svg-tag-name-capitalization.js +5 -4
- package/dist/src/rules/svg-tag-name-capitalization.js.map +1 -1
- package/dist/src/types.js +15 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/cli/argument-parser.d.ts +2 -1
- package/dist/types/cli/file-processor.d.ts +6 -5
- package/dist/types/cli/formatters/base-formatter.d.ts +2 -2
- package/dist/types/cli/formatters/detailed-formatter.d.ts +2 -2
- package/dist/types/cli/formatters/github-actions-formatter.d.ts +12 -0
- package/dist/types/cli/formatters/index.d.ts +2 -0
- package/dist/types/cli/formatters/json-formatter.d.ts +42 -0
- package/dist/types/cli/formatters/simple-formatter.d.ts +2 -2
- package/dist/types/cli/output-manager.d.ts +31 -0
- package/dist/types/cli/summary-reporter.d.ts +3 -3
- package/dist/types/cli.d.ts +3 -1
- package/dist/types/linter.d.ts +20 -5
- package/dist/types/rules/erb-no-empty-tags.d.ts +5 -4
- package/dist/types/rules/erb-no-output-control-flow.d.ts +5 -4
- package/dist/types/rules/erb-prefer-image-tag-helper.d.ts +7 -0
- package/dist/types/rules/erb-require-whitespace-inside-tags.d.ts +5 -4
- package/dist/types/rules/erb-requires-trailing-newline.d.ts +6 -0
- package/dist/types/rules/html-anchor-require-href.d.ts +5 -4
- package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +5 -4
- package/dist/types/rules/html-aria-level-must-be-valid.d.ts +7 -0
- package/dist/types/rules/html-aria-role-heading-requires-level.d.ts +5 -4
- package/dist/types/rules/html-aria-role-must-be-valid.d.ts +5 -4
- package/dist/types/rules/html-attribute-double-quotes.d.ts +5 -4
- package/dist/types/rules/html-attribute-values-require-quotes.d.ts +5 -4
- package/dist/types/rules/html-boolean-attributes-no-value.d.ts +5 -4
- package/dist/types/rules/html-img-require-alt.d.ts +5 -4
- package/dist/types/rules/html-no-block-inside-inline.d.ts +5 -4
- package/dist/types/rules/html-no-duplicate-attributes.d.ts +5 -4
- package/dist/types/rules/html-no-duplicate-ids.d.ts +5 -4
- package/dist/types/rules/html-no-empty-headings.d.ts +5 -4
- package/dist/types/rules/html-no-nested-links.d.ts +5 -4
- package/dist/types/rules/html-tag-name-lowercase.d.ts +5 -4
- package/dist/types/rules/index.d.ts +3 -0
- package/dist/types/rules/parser-no-errors.d.ts +8 -0
- package/dist/types/rules/rule-utils.d.ts +73 -4
- package/dist/types/rules/svg-tag-name-capitalization.d.ts +5 -4
- package/dist/types/src/cli/argument-parser.d.ts +2 -1
- package/dist/types/src/cli/file-processor.d.ts +6 -5
- package/dist/types/src/cli/formatters/base-formatter.d.ts +2 -2
- package/dist/types/src/cli/formatters/detailed-formatter.d.ts +2 -2
- package/dist/types/src/cli/formatters/github-actions-formatter.d.ts +12 -0
- package/dist/types/src/cli/formatters/index.d.ts +2 -0
- package/dist/types/src/cli/formatters/json-formatter.d.ts +42 -0
- package/dist/types/src/cli/formatters/simple-formatter.d.ts +2 -2
- package/dist/types/src/cli/output-manager.d.ts +31 -0
- package/dist/types/src/cli/summary-reporter.d.ts +3 -3
- package/dist/types/src/cli.d.ts +3 -1
- package/dist/types/src/linter.d.ts +20 -5
- package/dist/types/src/rules/erb-no-empty-tags.d.ts +5 -4
- package/dist/types/src/rules/erb-no-output-control-flow.d.ts +5 -4
- package/dist/types/src/rules/erb-prefer-image-tag-helper.d.ts +7 -0
- package/dist/types/src/rules/erb-require-whitespace-inside-tags.d.ts +5 -4
- package/dist/types/src/rules/erb-requires-trailing-newline.d.ts +6 -0
- package/dist/types/src/rules/html-anchor-require-href.d.ts +5 -4
- package/dist/types/src/rules/html-aria-attribute-must-be-valid.d.ts +5 -4
- package/dist/types/src/rules/html-aria-level-must-be-valid.d.ts +7 -0
- package/dist/types/src/rules/html-aria-role-heading-requires-level.d.ts +5 -4
- package/dist/types/src/rules/html-aria-role-must-be-valid.d.ts +5 -4
- package/dist/types/src/rules/html-attribute-double-quotes.d.ts +5 -4
- package/dist/types/src/rules/html-attribute-values-require-quotes.d.ts +5 -4
- package/dist/types/src/rules/html-boolean-attributes-no-value.d.ts +5 -4
- package/dist/types/src/rules/html-img-require-alt.d.ts +5 -4
- package/dist/types/src/rules/html-no-block-inside-inline.d.ts +5 -4
- package/dist/types/src/rules/html-no-duplicate-attributes.d.ts +5 -4
- package/dist/types/src/rules/html-no-duplicate-ids.d.ts +5 -4
- package/dist/types/src/rules/html-no-empty-headings.d.ts +5 -4
- package/dist/types/src/rules/html-no-nested-links.d.ts +5 -4
- package/dist/types/src/rules/html-tag-name-lowercase.d.ts +5 -4
- package/dist/types/src/rules/index.d.ts +3 -0
- package/dist/types/src/rules/parser-no-errors.d.ts +8 -0
- package/dist/types/src/rules/rule-utils.d.ts +73 -4
- package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +5 -4
- package/dist/types/src/types.d.ts +50 -7
- package/dist/types/types.d.ts +50 -7
- package/docs/rules/README.md +5 -1
- package/docs/rules/erb-prefer-image-tag-helper.md +65 -0
- package/docs/rules/erb-requires-trailing-newline.md +37 -0
- package/docs/rules/html-anchor-require-href.md +1 -1
- package/docs/rules/html-aria-level-must-be-valid.md +37 -0
- package/docs/rules/parser-no-errors.md +84 -0
- package/package.json +4 -4
- package/src/cli/argument-parser.ts +33 -19
- package/src/cli/file-processor.ts +27 -21
- package/src/cli/formatters/base-formatter.ts +2 -2
- package/src/cli/formatters/detailed-formatter.ts +9 -9
- package/src/cli/formatters/github-actions-formatter.ts +70 -0
- package/src/cli/formatters/index.ts +2 -0
- package/src/cli/formatters/json-formatter.ts +107 -0
- package/src/cli/formatters/simple-formatter.ts +15 -15
- package/src/cli/output-manager.ts +143 -0
- package/src/cli/summary-reporter.ts +24 -24
- package/src/cli.ts +48 -31
- package/src/default-rules.ts +8 -0
- package/src/linter.ts +42 -8
- package/src/rules/erb-no-empty-tags.ts +7 -6
- package/src/rules/erb-no-output-control-flow.ts +8 -6
- package/src/rules/erb-prefer-image-tag-helper.ts +124 -0
- package/src/rules/erb-require-whitespace-inside-tags.ts +7 -6
- package/src/rules/erb-requires-trailing-newline.ts +29 -0
- package/src/rules/html-anchor-require-href.ts +7 -6
- package/src/rules/html-aria-attribute-must-be-valid.ts +7 -7
- package/src/rules/html-aria-level-must-be-valid.ts +42 -0
- package/src/rules/html-aria-role-heading-requires-level.ts +7 -6
- package/src/rules/html-aria-role-must-be-valid.ts +7 -6
- package/src/rules/html-attribute-double-quotes.ts +7 -6
- package/src/rules/html-attribute-values-require-quotes.ts +7 -6
- package/src/rules/html-boolean-attributes-no-value.ts +7 -6
- package/src/rules/html-img-require-alt.ts +7 -6
- package/src/rules/html-no-block-inside-inline.ts +9 -8
- package/src/rules/html-no-duplicate-attributes.ts +7 -6
- package/src/rules/html-no-duplicate-ids.ts +7 -7
- package/src/rules/html-no-empty-headings.ts +7 -6
- package/src/rules/html-no-nested-links.ts +7 -6
- package/src/rules/html-tag-name-lowercase.ts +7 -6
- package/src/rules/index.ts +3 -0
- package/src/rules/parser-no-errors.ts +25 -0
- package/src/rules/rule-utils.ts +156 -4
- package/src/rules/svg-tag-name-capitalization.ts +7 -6
- package/src/types.ts +61 -7
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { BaseRuleVisitor, getTagName, findAttributeByName, getAttributes } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
3
|
+
class ERBPreferImageTagHelperVisitor extends BaseRuleVisitor {
|
|
4
|
+
visitHTMLOpenTagNode(node) {
|
|
5
|
+
this.checkImgTag(node);
|
|
6
|
+
super.visitHTMLOpenTagNode(node);
|
|
7
|
+
}
|
|
8
|
+
visitHTMLSelfCloseTagNode(node) {
|
|
9
|
+
this.checkImgTag(node);
|
|
10
|
+
super.visitHTMLSelfCloseTagNode(node);
|
|
11
|
+
}
|
|
12
|
+
checkImgTag(node) {
|
|
13
|
+
const tagName = getTagName(node);
|
|
14
|
+
if (tagName !== "img") {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const attributes = getAttributes(node);
|
|
18
|
+
const srcAttribute = findAttributeByName(attributes, "src");
|
|
19
|
+
if (!srcAttribute) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!srcAttribute.value) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const valueNode = srcAttribute.value;
|
|
26
|
+
const hasERBContent = this.containsERBContent(valueNode);
|
|
27
|
+
if (hasERBContent) {
|
|
28
|
+
const suggestedExpression = this.buildSuggestedExpression(valueNode);
|
|
29
|
+
this.addOffense(`Prefer \`image_tag\` helper over manual \`<img>\` with dynamic ERB expressions. Use \`<%= image_tag ${suggestedExpression}, alt: "..." %>\` instead.`, srcAttribute.location, "warning");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
containsERBContent(valueNode) {
|
|
33
|
+
if (!valueNode.children)
|
|
34
|
+
return false;
|
|
35
|
+
return valueNode.children.some(child => child.type === "AST_ERB_CONTENT_NODE");
|
|
36
|
+
}
|
|
37
|
+
buildSuggestedExpression(valueNode) {
|
|
38
|
+
if (!valueNode.children)
|
|
39
|
+
return "expression";
|
|
40
|
+
let hasText = false;
|
|
41
|
+
let hasERB = false;
|
|
42
|
+
for (const child of valueNode.children) {
|
|
43
|
+
if (child.type === "AST_ERB_CONTENT_NODE") {
|
|
44
|
+
hasERB = true;
|
|
45
|
+
}
|
|
46
|
+
else if (child.type === "AST_LITERAL_NODE") {
|
|
47
|
+
const literalNode = child;
|
|
48
|
+
if (literalNode.content && literalNode.content.trim()) {
|
|
49
|
+
hasText = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (hasText && hasERB) {
|
|
54
|
+
let result = '"';
|
|
55
|
+
for (const child of valueNode.children) {
|
|
56
|
+
if (child.type === "AST_ERB_CONTENT_NODE") {
|
|
57
|
+
const erbNode = child;
|
|
58
|
+
result += `#{${(erbNode.content?.value || "").trim()}}`;
|
|
59
|
+
}
|
|
60
|
+
else if (child.type === "AST_LITERAL_NODE") {
|
|
61
|
+
const literalNode = child;
|
|
62
|
+
result += literalNode.content || "";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
result += '"';
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
if (hasERB && !hasText) {
|
|
69
|
+
const erbNodes = valueNode.children.filter(child => child.type === "AST_ERB_CONTENT_NODE");
|
|
70
|
+
if (erbNodes.length === 1) {
|
|
71
|
+
return (erbNodes[0].content?.value || "").trim();
|
|
72
|
+
}
|
|
73
|
+
else if (erbNodes.length > 1) {
|
|
74
|
+
let result = '"';
|
|
75
|
+
for (const erbNode of erbNodes) {
|
|
76
|
+
result += `#{${(erbNode.content?.value || "").trim()}}`;
|
|
77
|
+
}
|
|
78
|
+
result += '"';
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return "expression";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class ERBPreferImageTagHelperRule extends ParserRule {
|
|
86
|
+
name = "erb-prefer-image-tag-helper";
|
|
87
|
+
check(result, context) {
|
|
88
|
+
const visitor = new ERBPreferImageTagHelperVisitor(this.name, context);
|
|
89
|
+
visitor.visit(result.value);
|
|
90
|
+
return visitor.offenses;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=erb-prefer-image-tag-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erb-prefer-image-tag-helper.js","sourceRoot":"","sources":["../../../src/rules/erb-prefer-image-tag-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isERBNode } from "@herb-tools/core";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
import { BaseRuleVisitor } from "./rule-utils.js";
|
|
3
4
|
class RequireWhitespaceInsideTags extends BaseRuleVisitor {
|
|
4
5
|
visitChildNodes(node) {
|
|
@@ -48,11 +49,11 @@ class RequireWhitespaceInsideTags extends BaseRuleVisitor {
|
|
|
48
49
|
this.addOffense(`Add whitespace before \`${closeTag.value}\`.`, closeTag.location, "error");
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
export class ERBRequireWhitespaceRule {
|
|
52
|
+
export class ERBRequireWhitespaceRule extends ParserRule {
|
|
52
53
|
name = "erb-require-whitespace-inside-tags";
|
|
53
|
-
check(
|
|
54
|
-
const visitor = new RequireWhitespaceInsideTags(this.name);
|
|
55
|
-
visitor.visit(
|
|
54
|
+
check(result, context) {
|
|
55
|
+
const visitor = new RequireWhitespaceInsideTags(this.name, context);
|
|
56
|
+
visitor.visit(result.value);
|
|
56
57
|
return visitor.offenses;
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -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;
|
|
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,22 @@
|
|
|
1
|
+
import { BaseSourceRuleVisitor, createEndOfFileLocation } from "./rule-utils.js";
|
|
2
|
+
import { SourceRule } from "../types.js";
|
|
3
|
+
class ERBRequiresTrailingNewlineVisitor extends BaseSourceRuleVisitor {
|
|
4
|
+
visitSource(source) {
|
|
5
|
+
if (source.length === 0)
|
|
6
|
+
return;
|
|
7
|
+
if (source.endsWith('\n'))
|
|
8
|
+
return;
|
|
9
|
+
if (!this.context.fileName)
|
|
10
|
+
return;
|
|
11
|
+
this.addOffense("File must end with trailing newline", createEndOfFileLocation(source), "error");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class ERBRequiresTrailingNewlineRule extends SourceRule {
|
|
15
|
+
name = "erb-requires-trailing-newline";
|
|
16
|
+
check(source, context) {
|
|
17
|
+
const visitor = new ERBRequiresTrailingNewlineVisitor(this.name, context);
|
|
18
|
+
visitor.visit(source);
|
|
19
|
+
return visitor.offenses;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=erb-requires-trailing-newline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erb-requires-trailing-newline.js","sourceRoot":"","sources":["../../../src/rules/erb-requires-trailing-newline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,iCAAkC,SAAQ,qBAAqB;IACzD,WAAW,CAAC,MAAc;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAM;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAM;QAElC,IAAI,CAAC,UAAU,CACb,qCAAqC,EACrC,uBAAuB,CAAC,MAAM,CAAC,EAC/B,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,UAAU;IAC5D,IAAI,GAAG,+BAA+B,CAAA;IAEtC,KAAK,CAAC,MAAc,EAAE,OAA8B;QAClD,MAAM,OAAO,GAAG,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEzE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAErB,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseRuleVisitor, getTagName, hasAttribute } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AnchorRechireHrefVisitor extends BaseRuleVisitor {
|
|
3
4
|
visitHTMLOpenTagNode(node) {
|
|
4
5
|
this.checkATag(node);
|
|
@@ -14,11 +15,11 @@ class AnchorRechireHrefVisitor extends BaseRuleVisitor {
|
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
|
-
export class HTMLAnchorRequireHrefRule {
|
|
18
|
+
export class HTMLAnchorRequireHrefRule extends ParserRule {
|
|
18
19
|
name = "html-anchor-require-href";
|
|
19
|
-
check(
|
|
20
|
-
const visitor = new AnchorRechireHrefVisitor(this.name);
|
|
21
|
-
visitor.visit(
|
|
20
|
+
check(result, context) {
|
|
21
|
+
const visitor = new AnchorRechireHrefVisitor(this.name, context);
|
|
22
|
+
visitor.visit(result.value);
|
|
22
23
|
return visitor.offenses;
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-anchor-require-href.js","sourceRoot":"","sources":["../../../src/rules/html-anchor-require-href.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-anchor-require-href.js","sourceRoot":"","sources":["../../../src/rules/html-anchor-require-href.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,wBAAyB,SAAQ,eAAe;IACpD,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACpB,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAEO,SAAS,CAAC,IAAqB;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CACb,4EAA4E,EAC5E,IAAI,CAAC,QAAS,CAAC,QAAQ,EACvB,OAAO,CACR,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,UAAU;IACvD,IAAI,GAAG,0BAA0B,CAAA;IAEjC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEhE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ARIA_ATTRIBUTES, AttributeVisitorMixin, } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AriaAttributeMustBeValid extends AttributeVisitorMixin {
|
|
3
4
|
checkAttribute(attributeName, _attributeValue, attributeNode, _parentNode) {
|
|
4
5
|
if (!attributeName.startsWith("aria-"))
|
|
@@ -13,11 +14,11 @@ class AriaAttributeMustBeValid extends AttributeVisitorMixin {
|
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
|
-
export class HTMLAriaAttributeMustBeValid {
|
|
17
|
+
export class HTMLAriaAttributeMustBeValid extends ParserRule {
|
|
17
18
|
name = "html-aria-attribute-must-be-valid";
|
|
18
|
-
check(
|
|
19
|
-
const visitor = new AriaAttributeMustBeValid(this.name);
|
|
20
|
-
visitor.visit(
|
|
19
|
+
check(result, context) {
|
|
20
|
+
const visitor = new AriaAttributeMustBeValid(this.name, context);
|
|
21
|
+
visitor.visit(result.value);
|
|
21
22
|
return visitor.offenses;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -1 +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;
|
|
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;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,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,4BAA6B,SAAQ,UAAU;IAC1D,IAAI,GAAG,mCAAmC,CAAC;IAE3C,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AttributeVisitorMixin } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
3
|
+
class HTMLAriaLevelMustBeValidVisitor extends AttributeVisitorMixin {
|
|
4
|
+
checkAttribute(attributeName, attributeValue, attributeNode, _parentNode) {
|
|
5
|
+
if (attributeName !== "aria-level")
|
|
6
|
+
return;
|
|
7
|
+
if (attributeValue !== null && attributeValue.includes("<%"))
|
|
8
|
+
return;
|
|
9
|
+
if (attributeValue === null || attributeValue === "") {
|
|
10
|
+
this.addOffense(`The \`aria-level\` attribute must be an integer between 1 and 6, got an empty value.`, attributeNode.location);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const number = parseInt(attributeValue);
|
|
14
|
+
if (isNaN(number) || number < 1 || number > 6 || attributeValue !== number.toString()) {
|
|
15
|
+
this.addOffense(`The \`aria-level\` attribute must be an integer between 1 and 6, got \`${attributeValue}\`.`, attributeNode.location);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class HTMLAriaLevelMustBeValidRule extends ParserRule {
|
|
20
|
+
name = "html-aria-level-must-be-valid";
|
|
21
|
+
check(result, context) {
|
|
22
|
+
const visitor = new HTMLAriaLevelMustBeValidVisitor(this.name, context);
|
|
23
|
+
visitor.visit(result.value);
|
|
24
|
+
return visitor.offenses;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=html-aria-level-must-be-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-aria-level-must-be-valid.js","sourceRoot":"","sources":["../../../src/rules/html-aria-level-must-be-valid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKxC,MAAM,+BAAgC,SAAQ,qBAAqB;IACvD,cAAc,CAAC,aAAqB,EAAE,cAA6B,EAAE,aAAgC,EAAE,WAAmD;QAClK,IAAI,aAAa,KAAK,YAAY;YAAE,OAAM;QAC1C,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAM;QAEpE,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,UAAU,CACb,sFAAsF,EACtF,aAAa,CAAC,QAAQ,CACvB,CAAA;YAED,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;QAEvC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,cAAc,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YACtF,IAAI,CAAC,UAAU,CACb,0EAA0E,cAAc,KAAK,EAC7F,aAAa,CAAC,QAAQ,CACvB,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,UAAU;IAC1D,IAAI,GAAG,+BAA+B,CAAA;IAEtC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEvE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin, getAttributeName, getAttributes } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AriaRoleHeadingRequiresLevel extends AttributeVisitorMixin {
|
|
3
4
|
// We want to check 2 attributes here:
|
|
4
5
|
// 1. role="heading"
|
|
@@ -15,11 +16,11 @@ class AriaRoleHeadingRequiresLevel extends AttributeVisitorMixin {
|
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
|
-
export class HTMLAriaRoleHeadingRequiresLevelRule {
|
|
19
|
+
export class HTMLAriaRoleHeadingRequiresLevelRule extends ParserRule {
|
|
19
20
|
name = "html-aria-role-heading-requires-level";
|
|
20
|
-
check(
|
|
21
|
-
const visitor = new AriaRoleHeadingRequiresLevel(this.name);
|
|
22
|
-
visitor.visit(
|
|
21
|
+
check(result, context) {
|
|
22
|
+
const visitor = new AriaRoleHeadingRequiresLevel(this.name, context);
|
|
23
|
+
visitor.visit(result.value);
|
|
23
24
|
return visitor.offenses;
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-aria-role-heading-requires-level.js","sourceRoot":"","sources":["../../../src/rules/html-aria-role-heading-requires-level.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-aria-role-heading-requires-level.js","sourceRoot":"","sources":["../../../src/rules/html-aria-role-heading-requires-level.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAExF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,4BAA6B,SAAQ,qBAAqB;IAE9D,sCAAsC;IACtC,oBAAoB;IACpB,0DAA0D;IAC1D,cAAc,CACZ,aAAqB,EACrB,cAA6B,EAC7B,aAAgC,EAChC,UAAkD;QAGlD,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM,IAAI,cAAc,KAAK,SAAS,CAAC,EAAE,CAAC;YAChE,OAAM;QACR,CAAC;QAED,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QAE/C,4DAA4D;QAC5D,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,CAAA;QACzF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,CACb,wEAAwE,EACxE,aAAa,CAAC,QAAQ,EACtB,OAAO,CACR,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,oCAAqC,SAAQ,UAAU;IAClE,IAAI,GAAG,uCAAuC,CAAA;IAE9C,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin, VALID_ARIA_ROLES } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AriaRoleMustBeValid extends AttributeVisitorMixin {
|
|
3
4
|
checkAttribute(attributeName, attributeValue, attributeNode) {
|
|
4
5
|
if (attributeName !== "role")
|
|
@@ -10,11 +11,11 @@ class AriaRoleMustBeValid extends AttributeVisitorMixin {
|
|
|
10
11
|
this.addOffense(`The \`role\` attribute must be a valid ARIA role. Role \`${attributeValue}\` is not recognized.`, attributeNode.location, "error");
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
export class HTMLAriaRoleMustBeValidRule {
|
|
14
|
+
export class HTMLAriaRoleMustBeValidRule extends ParserRule {
|
|
14
15
|
name = "html-aria-role-must-be-valid";
|
|
15
|
-
check(
|
|
16
|
-
const visitor = new AriaRoleMustBeValid(this.name);
|
|
17
|
-
visitor.visit(
|
|
16
|
+
check(result, context) {
|
|
17
|
+
const visitor = new AriaRoleMustBeValid(this.name, context);
|
|
18
|
+
visitor.visit(result.value);
|
|
18
19
|
return visitor.offenses;
|
|
19
20
|
}
|
|
20
21
|
}
|
|
@@ -1 +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;
|
|
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;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,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,2BAA4B,SAAQ,UAAU;IACzD,IAAI,GAAG,8BAA8B,CAAA;IAErC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAE3D,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin, getAttributeValueQuoteType, hasAttributeValue } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AttributeDoubleQuotesVisitor extends AttributeVisitorMixin {
|
|
3
4
|
checkAttribute(attributeName, attributeValue, attributeNode) {
|
|
4
5
|
if (!hasAttributeValue(attributeNode))
|
|
@@ -10,11 +11,11 @@ class AttributeDoubleQuotesVisitor extends AttributeVisitorMixin {
|
|
|
10
11
|
this.addOffense(`Attribute \`${attributeName}\` uses single quotes. Prefer double quotes for HTML attribute values: \`${attributeName}="value"\`.`, attributeNode.value.location, "warning");
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
export class HTMLAttributeDoubleQuotesRule {
|
|
14
|
+
export class HTMLAttributeDoubleQuotesRule extends ParserRule {
|
|
14
15
|
name = "html-attribute-double-quotes";
|
|
15
|
-
check(
|
|
16
|
-
const visitor = new AttributeDoubleQuotesVisitor(this.name);
|
|
17
|
-
visitor.visit(
|
|
16
|
+
check(result, context) {
|
|
17
|
+
const visitor = new AttributeDoubleQuotesVisitor(this.name, context);
|
|
18
|
+
visitor.visit(result.value);
|
|
18
19
|
return visitor.offenses;
|
|
19
20
|
}
|
|
20
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-attribute-double-quotes.js","sourceRoot":"","sources":["../../../src/rules/html-attribute-double-quotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-attribute-double-quotes.js","sourceRoot":"","sources":["../../../src/rules/html-attribute-double-quotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEtG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,4BAA6B,SAAQ,qBAAqB;IACpD,cAAc,CAAC,aAAqB,EAAE,cAA6B,EAAE,aAAgC;QAC7G,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;YAAE,OAAM;QAC7C,IAAI,0BAA0B,CAAC,aAAa,CAAC,KAAK,QAAQ;YAAE,OAAM;QAClE,IAAI,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAM,CAAC,6DAA6D;QAEvG,IAAI,CAAC,UAAU,CACb,eAAe,aAAa,4EAA4E,aAAa,aAAa,EAClI,aAAa,CAAC,KAAM,CAAC,QAAQ,EAC7B,SAAS,CACV,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,6BAA8B,SAAQ,UAAU;IAC3D,IAAI,GAAG,8BAA8B,CAAA;IAErC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class AttributeValuesRequireQuotesVisitor extends AttributeVisitorMixin {
|
|
3
4
|
checkAttribute(attributeName, _attributeValue, attributeNode) {
|
|
4
5
|
if (attributeNode.value?.type !== "AST_HTML_ATTRIBUTE_VALUE_NODE")
|
|
@@ -11,11 +12,11 @@ class AttributeValuesRequireQuotesVisitor extends AttributeVisitorMixin {
|
|
|
11
12
|
`Attribute value should be quoted: \`${attributeName}="value"\`. Always wrap attribute values in quotes.`, valueNode.location, "error");
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
|
-
export class HTMLAttributeValuesRequireQuotesRule {
|
|
15
|
+
export class HTMLAttributeValuesRequireQuotesRule extends ParserRule {
|
|
15
16
|
name = "html-attribute-values-require-quotes";
|
|
16
|
-
check(
|
|
17
|
-
const visitor = new AttributeValuesRequireQuotesVisitor(this.name);
|
|
18
|
-
visitor.visit(
|
|
17
|
+
check(result, context) {
|
|
18
|
+
const visitor = new AttributeValuesRequireQuotesVisitor(this.name, context);
|
|
19
|
+
visitor.visit(result.value);
|
|
19
20
|
return visitor.offenses;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-attribute-values-require-quotes.js","sourceRoot":"","sources":["../../../src/rules/html-attribute-values-require-quotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-attribute-values-require-quotes.js","sourceRoot":"","sources":["../../../src/rules/html-attribute-values-require-quotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,mCAAoC,SAAQ,qBAAqB;IAC3D,cAAc,CAAC,aAAqB,EAAE,eAA8B,EAAE,aAAgC;QAC9G,IAAI,aAAa,CAAC,KAAK,EAAE,IAAI,KAAK,+BAA+B;YAAE,OAAM;QAEzE,MAAM,SAAS,GAAG,aAAa,CAAC,KAA+B,CAAA;QAC/D,IAAI,SAAS,CAAC,MAAM;YAAE,OAAM;QAE5B,IAAI,CAAC,UAAU;QACb,gDAAgD;QAChD,uCAAuC,aAAa,qDAAqD,EACzG,SAAS,CAAC,QAAQ,EAClB,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,oCAAqC,SAAQ,UAAU;IAClE,IAAI,GAAG,sCAAsC,CAAA;IAE7C,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3E,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin, isBooleanAttribute, hasAttributeValue } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class BooleanAttributesNoValueVisitor extends AttributeVisitorMixin {
|
|
3
4
|
checkAttribute(attributeName, _attributeValue, attributeNode) {
|
|
4
5
|
if (!isBooleanAttribute(attributeName))
|
|
@@ -8,11 +9,11 @@ class BooleanAttributesNoValueVisitor extends AttributeVisitorMixin {
|
|
|
8
9
|
this.addOffense(`Boolean attribute \`${attributeName}\` should not have a value. Use \`${attributeName}\` instead of \`${attributeName}="${attributeName}"\`.`, attributeNode.value.location, "error");
|
|
9
10
|
}
|
|
10
11
|
}
|
|
11
|
-
export class HTMLBooleanAttributesNoValueRule {
|
|
12
|
+
export class HTMLBooleanAttributesNoValueRule extends ParserRule {
|
|
12
13
|
name = "html-boolean-attributes-no-value";
|
|
13
|
-
check(
|
|
14
|
-
const visitor = new BooleanAttributesNoValueVisitor(this.name);
|
|
15
|
-
visitor.visit(
|
|
14
|
+
check(result, context) {
|
|
15
|
+
const visitor = new BooleanAttributesNoValueVisitor(this.name, context);
|
|
16
|
+
visitor.visit(result.value);
|
|
16
17
|
return visitor.offenses;
|
|
17
18
|
}
|
|
18
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-boolean-attributes-no-value.js","sourceRoot":"","sources":["../../../src/rules/html-boolean-attributes-no-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-boolean-attributes-no-value.js","sourceRoot":"","sources":["../../../src/rules/html-boolean-attributes-no-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,+BAAgC,SAAQ,qBAAqB;IACvD,cAAc,CAAC,aAAqB,EAAE,eAA8B,EAAE,aAAgC;QAC9G,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC;YAAE,OAAM;QAC9C,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;YAAE,OAAM;QAE7C,IAAI,CAAC,UAAU,CACb,uBAAuB,aAAa,qCAAqC,aAAa,mBAAmB,aAAa,KAAK,aAAa,MAAM,EAC9I,aAAa,CAAC,KAAM,CAAC,QAAQ,EAC7B,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,UAAU;IAC9D,IAAI,GAAG,kCAAkC,CAAA;IAEzC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACvE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseRuleVisitor, getTagName, hasAttribute } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class ImgRequireAltVisitor extends BaseRuleVisitor {
|
|
3
4
|
visitHTMLOpenTagNode(node) {
|
|
4
5
|
this.checkImgTag(node);
|
|
@@ -18,11 +19,11 @@ class ImgRequireAltVisitor extends BaseRuleVisitor {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
export class HTMLImgRequireAltRule {
|
|
22
|
+
export class HTMLImgRequireAltRule extends ParserRule {
|
|
22
23
|
name = "html-img-require-alt";
|
|
23
|
-
check(
|
|
24
|
-
const visitor = new ImgRequireAltVisitor(this.name);
|
|
25
|
-
visitor.visit(
|
|
24
|
+
check(result, context) {
|
|
25
|
+
const visitor = new ImgRequireAltVisitor(this.name, context);
|
|
26
|
+
visitor.visit(result.value);
|
|
26
27
|
return visitor.offenses;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-img-require-alt.js","sourceRoot":"","sources":["../../../src/rules/html-img-require-alt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-img-require-alt.js","sourceRoot":"","sources":["../../../src/rules/html-img-require-alt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,oBAAqB,SAAQ,eAAe;IAChD,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACtB,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,yBAAyB,CAAC,IAA0B;QAClD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACtB,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAEO,WAAW,CAAC,IAA4C;QAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAEhC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CACb,oIAAoI,EACpI,IAAI,CAAC,QAAS,CAAC,QAAQ,EACvB,OAAO,CACR,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IACnD,IAAI,GAAG,sBAAsB,CAAA;IAE7B,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC5D,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseRuleVisitor, isInlineElement, isBlockElement } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class BlockInsideInlineVisitor extends BaseRuleVisitor {
|
|
3
4
|
inlineStack = [];
|
|
4
5
|
isValidHTMLOpenTag(node) {
|
|
@@ -10,7 +11,7 @@ class BlockInsideInlineVisitor extends BaseRuleVisitor {
|
|
|
10
11
|
const isUnknown = !isInline && !isBlock;
|
|
11
12
|
return { isInline, isBlock, isUnknown };
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
addOffenseMessage(tagName, isBlock, openTag) {
|
|
14
15
|
const parentInline = this.inlineStack[this.inlineStack.length - 1];
|
|
15
16
|
const elementType = isBlock ? "Block-level" : "Unknown";
|
|
16
17
|
this.addOffense(`${elementType} element \`<${tagName}>\` cannot be placed inside inline element \`<${parentInline}>\`.`, openTag.tag_name.location, "error");
|
|
@@ -39,7 +40,7 @@ class BlockInsideInlineVisitor extends BaseRuleVisitor {
|
|
|
39
40
|
}
|
|
40
41
|
const { isInline, isBlock, isUnknown } = this.getElementType(tagName);
|
|
41
42
|
if ((isBlock || isUnknown) && this.inlineStack.length > 0) {
|
|
42
|
-
this.
|
|
43
|
+
this.addOffenseMessage(tagName, isBlock, openTag);
|
|
43
44
|
}
|
|
44
45
|
if (isInline) {
|
|
45
46
|
this.visitInlineElement(node, tagName);
|
|
@@ -48,11 +49,11 @@ class BlockInsideInlineVisitor extends BaseRuleVisitor {
|
|
|
48
49
|
this.visitBlockElement(node);
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
export class HTMLNoBlockInsideInlineRule {
|
|
52
|
+
export class HTMLNoBlockInsideInlineRule extends ParserRule {
|
|
52
53
|
name = "html-no-block-inside-inline";
|
|
53
|
-
check(
|
|
54
|
-
const visitor = new BlockInsideInlineVisitor(this.name);
|
|
55
|
-
visitor.visit(
|
|
54
|
+
check(result, context) {
|
|
55
|
+
const visitor = new BlockInsideInlineVisitor(this.name, context);
|
|
56
|
+
visitor.visit(result.value);
|
|
56
57
|
return visitor.offenses;
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-no-block-inside-inline.js","sourceRoot":"","sources":["../../../src/rules/html-no-block-inside-inline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-no-block-inside-inline.js","sourceRoot":"","sources":["../../../src/rules/html-no-block-inside-inline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseRuleVisitor, forEachAttribute } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class NoDuplicateAttributesVisitor extends BaseRuleVisitor {
|
|
3
4
|
visitHTMLOpenTagNode(node) {
|
|
4
5
|
this.checkDuplicateAttributes(node);
|
|
@@ -32,11 +33,11 @@ class NoDuplicateAttributesVisitor extends BaseRuleVisitor {
|
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
export class HTMLNoDuplicateAttributesRule {
|
|
36
|
+
export class HTMLNoDuplicateAttributesRule extends ParserRule {
|
|
36
37
|
name = "html-no-duplicate-attributes";
|
|
37
|
-
check(
|
|
38
|
-
const visitor = new NoDuplicateAttributesVisitor(this.name);
|
|
39
|
-
visitor.visit(
|
|
38
|
+
check(result, context) {
|
|
39
|
+
const visitor = new NoDuplicateAttributesVisitor(this.name, context);
|
|
40
|
+
visitor.visit(result.value);
|
|
40
41
|
return visitor.offenses;
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-no-duplicate-attributes.js","sourceRoot":"","sources":["../../../src/rules/html-no-duplicate-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-no-duplicate-attributes.js","sourceRoot":"","sources":["../../../src/rules/html-no-duplicate-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,4BAA6B,SAAQ,eAAe;IACxD,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,yBAAyB,CAAC,IAA0B;QAClD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAA;QACnC,KAAK,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAEO,wBAAwB,CAAC,IAA4C;QAC3E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmC,CAAA;QAEjE,gBAAgB,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,EAAE;YACvC,IAAI,aAAa,CAAC,IAAI,EAAE,IAAI,KAAK,8BAA8B;gBAAE,OAAM;YAEvE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAA6B,CAAA;YAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI;gBAAE,OAAM;YAE1B,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA,CAAC,uCAAuC;YAE/F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACvC,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;YACvC,CAAC;YAED,cAAc,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,cAAc,EAAE,CAAC;YACxD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;oBAE7B,IAAI,CAAC,UAAU,CACb,yBAAyB,aAAa,mDAAmD,EACzF,QAAQ,CAAC,QAAQ,EACjB,OAAO,CACR,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,6BAA8B,SAAQ,UAAU;IAC3D,IAAI,GAAG,8BAA8B,CAAA;IAErC,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AttributeVisitorMixin } from "./rule-utils";
|
|
2
|
+
import { ParserRule } from "../types";
|
|
2
3
|
class NoDuplicateIdsVisitor extends AttributeVisitorMixin {
|
|
3
4
|
documentIds = new Set();
|
|
4
5
|
checkAttribute(attributeName, attributeValue, attributeNode) {
|
|
@@ -14,11 +15,11 @@ class NoDuplicateIdsVisitor extends AttributeVisitorMixin {
|
|
|
14
15
|
this.documentIds.add(id);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
|
-
export class HTMLNoDuplicateIdsRule {
|
|
18
|
+
export class HTMLNoDuplicateIdsRule extends ParserRule {
|
|
18
19
|
name = "html-no-duplicate-ids";
|
|
19
|
-
check(
|
|
20
|
-
const visitor = new NoDuplicateIdsVisitor(this.name);
|
|
21
|
-
visitor.visit(
|
|
20
|
+
check(result, context) {
|
|
21
|
+
const visitor = new NoDuplicateIdsVisitor(this.name, context);
|
|
22
|
+
visitor.visit(result.value);
|
|
22
23
|
return visitor.offenses;
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -1 +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;
|
|
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;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAIrC,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,sBAAuB,SAAQ,UAAU;IACpD,IAAI,GAAG,uBAAuB,CAAA;IAE9B,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAE7D,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseRuleVisitor, getTagName, getAttributes, findAttributeByName, getAttributeValue, HEADING_TAGS } from "./rule-utils.js";
|
|
2
|
+
import { ParserRule } from "../types.js";
|
|
2
3
|
class NoEmptyHeadingsVisitor extends BaseRuleVisitor {
|
|
3
4
|
visitHTMLElementNode(node) {
|
|
4
5
|
this.checkHeadingElement(node);
|
|
@@ -137,11 +138,11 @@ class NoEmptyHeadingsVisitor extends BaseRuleVisitor {
|
|
|
137
138
|
return false;
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
|
-
export class HTMLNoEmptyHeadingsRule {
|
|
141
|
+
export class HTMLNoEmptyHeadingsRule extends ParserRule {
|
|
141
142
|
name = "html-no-empty-headings";
|
|
142
|
-
check(
|
|
143
|
-
const visitor = new NoEmptyHeadingsVisitor(this.name);
|
|
144
|
-
visitor.visit(
|
|
143
|
+
check(result, context) {
|
|
144
|
+
const visitor = new NoEmptyHeadingsVisitor(this.name, context);
|
|
145
|
+
visitor.visit(result.value);
|
|
145
146
|
return visitor.offenses;
|
|
146
147
|
}
|
|
147
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-no-empty-headings.js","sourceRoot":"","sources":["../../../src/rules/html-no-empty-headings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"html-no-empty-headings.js","sourceRoot":"","sources":["../../../src/rules/html-no-empty-headings.ts"],"names":[],"mappings":"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"}
|