@herb-tools/linter 0.7.5 → 0.8.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 +253 -13
- package/dist/herb-lint.js +26023 -3424
- package/dist/herb-lint.js.map +1 -1
- package/dist/index.cjs +5759 -1583
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5727 -1584
- package/dist/index.js.map +1 -1
- package/dist/loader.cjs +17010 -0
- package/dist/loader.cjs.map +1 -0
- package/dist/loader.js +16879 -0
- package/dist/loader.js.map +1 -0
- package/dist/package.json +13 -5
- package/dist/src/cli/argument-parser.js +38 -33
- package/dist/src/cli/argument-parser.js.map +1 -1
- package/dist/src/cli/file-processor.js +124 -23
- package/dist/src/cli/file-processor.js.map +1 -1
- package/dist/src/cli/formatters/detailed-formatter.js +18 -3
- package/dist/src/cli/formatters/detailed-formatter.js.map +1 -1
- package/dist/src/cli/formatters/github-actions-formatter.js +15 -1
- package/dist/src/cli/formatters/github-actions-formatter.js.map +1 -1
- package/dist/src/cli/formatters/json-formatter.js +3 -0
- package/dist/src/cli/formatters/json-formatter.js.map +1 -1
- package/dist/src/cli/formatters/simple-formatter.js +20 -7
- package/dist/src/cli/formatters/simple-formatter.js.map +1 -1
- package/dist/src/cli/output-manager.js +22 -3
- package/dist/src/cli/output-manager.js.map +1 -1
- package/dist/src/cli/summary-reporter.js +26 -3
- package/dist/src/cli/summary-reporter.js.map +1 -1
- package/dist/src/cli.js +107 -42
- package/dist/src/cli.js.map +1 -1
- package/dist/src/custom-rule-loader.js +139 -0
- package/dist/src/custom-rule-loader.js.map +1 -0
- package/dist/src/herb-disable-comment-utils.js +129 -0
- package/dist/src/herb-disable-comment-utils.js.map +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/linter.js +369 -34
- package/dist/src/linter.js.map +1 -1
- package/dist/src/loader.js +17 -0
- package/dist/src/loader.js.map +1 -0
- package/dist/src/rules/erb-comment-syntax.js +31 -2
- package/dist/src/rules/erb-comment-syntax.js.map +1 -1
- package/dist/src/rules/erb-no-case-node-children.js +52 -0
- package/dist/src/rules/erb-no-case-node-children.js.map +1 -0
- package/dist/src/rules/erb-no-empty-tags.js +7 -1
- package/dist/src/rules/erb-no-empty-tags.js.map +1 -1
- package/dist/src/rules/erb-no-extra-newline.js +65 -0
- package/dist/src/rules/erb-no-extra-newline.js.map +1 -0
- package/dist/src/rules/erb-no-extra-whitespace-inside-tags.js +95 -0
- package/dist/src/rules/erb-no-extra-whitespace-inside-tags.js.map +1 -0
- package/dist/src/rules/erb-no-output-control-flow.js +7 -1
- package/dist/src/rules/erb-no-output-control-flow.js.map +1 -1
- package/dist/src/rules/erb-no-silent-tag-in-attribute-name.js +7 -1
- package/dist/src/rules/erb-no-silent-tag-in-attribute-name.js.map +1 -1
- package/dist/src/rules/erb-prefer-image-tag-helper.js +7 -1
- package/dist/src/rules/erb-prefer-image-tag-helper.js.map +1 -1
- package/dist/src/rules/erb-require-trailing-newline.js +35 -0
- package/dist/src/rules/erb-require-trailing-newline.js.map +1 -0
- package/dist/src/rules/erb-require-whitespace-inside-tags.js +69 -11
- package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +1 -1
- package/dist/src/rules/erb-right-trim.js +26 -9
- package/dist/src/rules/erb-right-trim.js.map +1 -1
- package/dist/src/rules/herb-disable-comment-base.js +51 -0
- package/dist/src/rules/herb-disable-comment-base.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-malformed.js +51 -0
- package/dist/src/rules/herb-disable-comment-malformed.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-missing-rules.js +29 -0
- package/dist/src/rules/herb-disable-comment-missing-rules.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-no-duplicate-rules.js +32 -0
- package/dist/src/rules/herb-disable-comment-no-duplicate-rules.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-no-redundant-all.js +31 -0
- package/dist/src/rules/herb-disable-comment-no-redundant-all.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-unnecessary.js +65 -0
- package/dist/src/rules/herb-disable-comment-unnecessary.js.map +1 -0
- package/dist/src/rules/herb-disable-comment-valid-rule-name.js +44 -0
- package/dist/src/rules/herb-disable-comment-valid-rule-name.js.map +1 -0
- package/dist/src/rules/html-anchor-require-href.js +7 -1
- package/dist/src/rules/html-anchor-require-href.js.map +1 -1
- package/dist/src/rules/html-aria-attribute-must-be-valid.js +7 -1
- package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +1 -1
- package/dist/src/rules/html-aria-label-is-well-formatted.js +9 -3
- package/dist/src/rules/html-aria-label-is-well-formatted.js.map +1 -1
- package/dist/src/rules/html-aria-level-must-be-valid.js +6 -0
- package/dist/src/rules/html-aria-level-must-be-valid.js.map +1 -1
- package/dist/src/rules/html-aria-role-heading-requires-level.js +7 -1
- 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 +7 -1
- package/dist/src/rules/html-aria-role-must-be-valid.js.map +1 -1
- package/dist/src/rules/html-attribute-double-quotes.js +29 -2
- package/dist/src/rules/html-attribute-double-quotes.js.map +1 -1
- package/dist/src/rules/html-attribute-equals-spacing.js +18 -2
- package/dist/src/rules/html-attribute-equals-spacing.js.map +1 -1
- package/dist/src/rules/html-attribute-values-require-quotes.js +39 -3
- package/dist/src/rules/html-attribute-values-require-quotes.js.map +1 -1
- package/dist/src/rules/html-avoid-both-disabled-and-aria-disabled.js +7 -1
- package/dist/src/rules/html-avoid-both-disabled-and-aria-disabled.js.map +1 -1
- package/dist/src/rules/html-body-only-elements.js +46 -0
- package/dist/src/rules/html-body-only-elements.js.map +1 -0
- package/dist/src/rules/html-boolean-attributes-no-value.js +18 -1
- package/dist/src/rules/html-boolean-attributes-no-value.js.map +1 -1
- package/dist/src/rules/html-head-only-elements.js +51 -0
- package/dist/src/rules/html-head-only-elements.js.map +1 -0
- package/dist/src/rules/html-iframe-has-title.js +8 -2
- package/dist/src/rules/html-iframe-has-title.js.map +1 -1
- package/dist/src/rules/html-img-require-alt.js +7 -1
- package/dist/src/rules/html-img-require-alt.js.map +1 -1
- package/dist/src/rules/html-input-require-autocomplete.js +70 -0
- package/dist/src/rules/html-input-require-autocomplete.js.map +1 -0
- package/dist/src/rules/html-navigation-has-label.js +7 -1
- package/dist/src/rules/html-navigation-has-label.js.map +1 -1
- package/dist/src/rules/html-no-aria-hidden-on-focusable.js +7 -1
- package/dist/src/rules/html-no-aria-hidden-on-focusable.js.map +1 -1
- package/dist/src/rules/html-no-block-inside-inline.js +7 -1
- package/dist/src/rules/html-no-block-inside-inline.js.map +1 -1
- package/dist/src/rules/html-no-duplicate-attributes.js +7 -1
- package/dist/src/rules/html-no-duplicate-attributes.js.map +1 -1
- package/dist/src/rules/html-no-duplicate-ids.js +9 -3
- package/dist/src/rules/html-no-duplicate-ids.js.map +1 -1
- package/dist/src/rules/html-no-duplicate-meta-names.js +136 -0
- package/dist/src/rules/html-no-duplicate-meta-names.js.map +1 -0
- package/dist/src/rules/html-no-empty-attributes.js +45 -7
- package/dist/src/rules/html-no-empty-attributes.js.map +1 -1
- package/dist/src/rules/html-no-empty-headings.js +7 -6
- package/dist/src/rules/html-no-empty-headings.js.map +1 -1
- package/dist/src/rules/html-no-nested-links.js +7 -1
- package/dist/src/rules/html-no-nested-links.js.map +1 -1
- package/dist/src/rules/html-no-positive-tab-index.js +7 -1
- package/dist/src/rules/html-no-positive-tab-index.js.map +1 -1
- package/dist/src/rules/html-no-self-closing.js +48 -3
- package/dist/src/rules/html-no-self-closing.js.map +1 -1
- package/dist/src/rules/html-no-space-in-tag.js +173 -0
- package/dist/src/rules/html-no-space-in-tag.js.map +1 -0
- package/dist/src/rules/html-no-title-attribute.js +7 -1
- package/dist/src/rules/html-no-title-attribute.js.map +1 -1
- package/dist/src/rules/html-no-underscores-in-attribute-names.js +7 -1
- package/dist/src/rules/html-no-underscores-in-attribute-names.js.map +1 -1
- package/dist/src/rules/html-tag-name-lowercase.js +23 -5
- package/dist/src/rules/html-tag-name-lowercase.js.map +1 -1
- package/dist/src/rules/index.js +19 -3
- package/dist/src/rules/index.js.map +1 -1
- package/dist/src/rules/parser-no-errors.js +6 -0
- package/dist/src/rules/parser-no-errors.js.map +1 -1
- package/dist/src/rules/rule-utils.js +211 -31
- package/dist/src/rules/rule-utils.js.map +1 -1
- package/dist/src/rules/svg-tag-name-capitalization.js +22 -2
- package/dist/src/rules/svg-tag-name-capitalization.js.map +1 -1
- package/dist/src/{default-rules.js → rules.js} +44 -16
- package/dist/src/rules.js.map +1 -0
- package/dist/src/types.js +34 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/cli/argument-parser.d.ts +8 -2
- package/dist/types/cli/file-processor.d.ts +15 -0
- package/dist/types/cli/formatters/json-formatter.d.ts +6 -0
- package/dist/types/cli/formatters/simple-formatter.d.ts +1 -0
- package/dist/types/cli/summary-reporter.d.ts +6 -0
- package/dist/types/cli.d.ts +9 -4
- package/dist/types/custom-rule-loader.d.ts +62 -0
- package/dist/types/herb-disable-comment-utils.d.ts +69 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/linter.d.ts +99 -3
- package/dist/types/loader.d.ts +20 -0
- package/dist/types/rules/erb-comment-syntax.d.ts +12 -5
- package/dist/types/rules/erb-no-case-node-children.d.ts +8 -0
- package/dist/types/rules/erb-no-empty-tags.d.ts +3 -2
- package/dist/types/rules/erb-no-extra-newline.d.ts +14 -0
- package/dist/types/rules/erb-no-extra-whitespace-inside-tags.d.ts +18 -0
- package/dist/types/rules/erb-no-output-control-flow.d.ts +3 -2
- package/dist/types/rules/erb-no-silent-tag-in-attribute-name.d.ts +3 -2
- package/dist/types/rules/erb-prefer-image-tag-helper.d.ts +3 -2
- package/dist/types/rules/erb-require-trailing-newline.d.ts +9 -0
- package/dist/types/rules/erb-require-whitespace-inside-tags.d.ts +16 -5
- package/dist/types/rules/erb-right-trim.d.ts +12 -5
- package/dist/types/rules/herb-disable-comment-base.d.ts +37 -0
- package/dist/types/rules/herb-disable-comment-malformed.d.ts +8 -0
- package/dist/types/rules/herb-disable-comment-missing-rules.d.ts +8 -0
- package/dist/types/rules/herb-disable-comment-no-duplicate-rules.d.ts +8 -0
- package/dist/types/rules/herb-disable-comment-no-redundant-all.d.ts +8 -0
- package/dist/types/rules/herb-disable-comment-unnecessary.d.ts +8 -0
- package/dist/types/rules/herb-disable-comment-valid-rule-name.d.ts +8 -0
- package/dist/types/rules/html-anchor-require-href.d.ts +3 -2
- package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +3 -2
- package/dist/types/rules/html-aria-label-is-well-formatted.d.ts +3 -2
- package/dist/types/rules/html-aria-level-must-be-valid.d.ts +3 -2
- package/dist/types/rules/html-aria-role-heading-requires-level.d.ts +3 -2
- package/dist/types/rules/html-aria-role-must-be-valid.d.ts +3 -2
- package/dist/types/rules/html-attribute-double-quotes.d.ts +13 -5
- package/dist/types/rules/html-attribute-equals-spacing.d.ts +12 -5
- package/dist/types/rules/html-attribute-values-require-quotes.d.ts +13 -5
- package/dist/types/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +3 -2
- package/dist/types/rules/html-body-only-elements.d.ts +9 -0
- package/dist/types/rules/html-boolean-attributes-no-value.d.ts +12 -5
- package/dist/types/rules/html-head-only-elements.d.ts +9 -0
- package/dist/types/rules/html-iframe-has-title.d.ts +3 -2
- package/dist/types/rules/html-img-require-alt.d.ts +3 -2
- package/dist/types/rules/html-input-require-autocomplete.d.ts +8 -0
- package/dist/types/rules/html-navigation-has-label.d.ts +3 -2
- package/dist/types/rules/html-no-aria-hidden-on-focusable.d.ts +3 -2
- package/dist/types/rules/html-no-block-inside-inline.d.ts +3 -2
- package/dist/types/rules/html-no-duplicate-attributes.d.ts +3 -2
- package/dist/types/rules/html-no-duplicate-ids.d.ts +3 -2
- package/dist/types/rules/html-no-duplicate-meta-names.d.ts +9 -0
- package/dist/types/rules/html-no-empty-attributes.d.ts +3 -2
- package/dist/types/rules/html-no-empty-headings.d.ts +3 -2
- package/dist/types/rules/html-no-nested-links.d.ts +3 -2
- package/dist/types/rules/html-no-positive-tab-index.d.ts +3 -2
- package/dist/types/rules/html-no-self-closing.d.ts +14 -5
- package/dist/types/rules/html-no-space-in-tag.d.ts +16 -0
- package/dist/types/rules/html-no-title-attribute.d.ts +3 -2
- package/dist/types/rules/html-no-underscores-in-attribute-names.d.ts +3 -2
- package/dist/types/rules/html-tag-name-lowercase.d.ts +16 -6
- package/dist/types/rules/index.d.ts +19 -3
- package/dist/types/rules/parser-no-errors.d.ts +2 -1
- package/dist/types/rules/rule-utils.d.ts +72 -25
- package/dist/types/rules/svg-tag-name-capitalization.d.ts +13 -4
- package/dist/types/rules.d.ts +2 -0
- package/dist/types/src/cli/argument-parser.d.ts +8 -2
- package/dist/types/src/cli/file-processor.d.ts +15 -0
- package/dist/types/src/cli/formatters/json-formatter.d.ts +6 -0
- package/dist/types/src/cli/formatters/simple-formatter.d.ts +1 -0
- package/dist/types/src/cli/summary-reporter.d.ts +6 -0
- package/dist/types/src/cli.d.ts +9 -4
- package/dist/types/src/custom-rule-loader.d.ts +62 -0
- package/dist/types/src/herb-disable-comment-utils.d.ts +69 -0
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/linter.d.ts +99 -3
- package/dist/types/src/loader.d.ts +20 -0
- package/dist/types/src/rules/erb-comment-syntax.d.ts +12 -5
- package/dist/types/src/rules/erb-no-case-node-children.d.ts +8 -0
- package/dist/types/src/rules/erb-no-empty-tags.d.ts +3 -2
- package/dist/types/src/rules/erb-no-extra-newline.d.ts +14 -0
- package/dist/types/src/rules/erb-no-extra-whitespace-inside-tags.d.ts +18 -0
- package/dist/types/src/rules/erb-no-output-control-flow.d.ts +3 -2
- package/dist/types/src/rules/erb-no-silent-tag-in-attribute-name.d.ts +3 -2
- package/dist/types/src/rules/erb-prefer-image-tag-helper.d.ts +3 -2
- package/dist/types/src/rules/erb-require-trailing-newline.d.ts +9 -0
- package/dist/types/src/rules/erb-require-whitespace-inside-tags.d.ts +16 -5
- package/dist/types/src/rules/erb-right-trim.d.ts +12 -5
- package/dist/types/src/rules/herb-disable-comment-base.d.ts +37 -0
- package/dist/types/src/rules/herb-disable-comment-malformed.d.ts +8 -0
- package/dist/types/src/rules/herb-disable-comment-missing-rules.d.ts +8 -0
- package/dist/types/src/rules/herb-disable-comment-no-duplicate-rules.d.ts +8 -0
- package/dist/types/src/rules/herb-disable-comment-no-redundant-all.d.ts +8 -0
- package/dist/types/src/rules/herb-disable-comment-unnecessary.d.ts +8 -0
- package/dist/types/src/rules/herb-disable-comment-valid-rule-name.d.ts +8 -0
- package/dist/types/src/rules/html-anchor-require-href.d.ts +3 -2
- package/dist/types/src/rules/html-aria-attribute-must-be-valid.d.ts +3 -2
- package/dist/types/src/rules/html-aria-label-is-well-formatted.d.ts +3 -2
- package/dist/types/src/rules/html-aria-level-must-be-valid.d.ts +3 -2
- package/dist/types/src/rules/html-aria-role-heading-requires-level.d.ts +3 -2
- package/dist/types/src/rules/html-aria-role-must-be-valid.d.ts +3 -2
- package/dist/types/src/rules/html-attribute-double-quotes.d.ts +13 -5
- package/dist/types/src/rules/html-attribute-equals-spacing.d.ts +12 -5
- package/dist/types/src/rules/html-attribute-values-require-quotes.d.ts +13 -5
- package/dist/types/src/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +3 -2
- package/dist/types/src/rules/html-body-only-elements.d.ts +9 -0
- package/dist/types/src/rules/html-boolean-attributes-no-value.d.ts +12 -5
- package/dist/types/src/rules/html-head-only-elements.d.ts +9 -0
- package/dist/types/src/rules/html-iframe-has-title.d.ts +3 -2
- package/dist/types/src/rules/html-img-require-alt.d.ts +3 -2
- package/dist/types/src/rules/html-input-require-autocomplete.d.ts +8 -0
- package/dist/types/src/rules/html-navigation-has-label.d.ts +3 -2
- package/dist/types/src/rules/html-no-aria-hidden-on-focusable.d.ts +3 -2
- package/dist/types/src/rules/html-no-block-inside-inline.d.ts +3 -2
- package/dist/types/src/rules/html-no-duplicate-attributes.d.ts +3 -2
- package/dist/types/src/rules/html-no-duplicate-ids.d.ts +3 -2
- package/dist/types/src/rules/html-no-duplicate-meta-names.d.ts +9 -0
- package/dist/types/src/rules/html-no-empty-attributes.d.ts +3 -2
- package/dist/types/src/rules/html-no-empty-headings.d.ts +3 -2
- package/dist/types/src/rules/html-no-nested-links.d.ts +3 -2
- package/dist/types/src/rules/html-no-positive-tab-index.d.ts +3 -2
- package/dist/types/src/rules/html-no-self-closing.d.ts +14 -5
- package/dist/types/src/rules/html-no-space-in-tag.d.ts +16 -0
- package/dist/types/src/rules/html-no-title-attribute.d.ts +3 -2
- package/dist/types/src/rules/html-no-underscores-in-attribute-names.d.ts +3 -2
- package/dist/types/src/rules/html-tag-name-lowercase.d.ts +16 -6
- package/dist/types/src/rules/index.d.ts +19 -3
- package/dist/types/src/rules/parser-no-errors.d.ts +2 -1
- package/dist/types/src/rules/rule-utils.d.ts +72 -25
- package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +13 -4
- package/dist/types/src/rules.d.ts +2 -0
- package/dist/types/src/types.d.ts +102 -11
- package/dist/types/types.d.ts +102 -11
- package/docs/rules/README.md +16 -2
- package/docs/rules/erb-no-case-node-children.md +50 -0
- package/docs/rules/erb-no-extra-newline.md +74 -0
- package/docs/rules/erb-no-extra-whitespace-inside-tags.md +39 -0
- package/docs/rules/{erb-requires-trailing-newline.md → erb-require-trailing-newline.md} +1 -1
- package/docs/rules/erb-right-trim.md +5 -10
- package/docs/rules/herb-disable-comment-malformed.md +45 -0
- package/docs/rules/herb-disable-comment-missing-rules.md +60 -0
- package/docs/rules/herb-disable-comment-no-duplicate-rules.md +49 -0
- package/docs/rules/herb-disable-comment-no-redundant-all.md +53 -0
- package/docs/rules/herb-disable-comment-unnecessary.md +44 -0
- package/docs/rules/herb-disable-comment-valid-rule-name.md +41 -0
- package/docs/rules/html-aria-attribute-must-be-valid.md +2 -5
- package/docs/rules/html-aria-label-is-well-formatted.md +1 -1
- package/docs/rules/html-attribute-double-quotes.md +2 -2
- package/docs/rules/html-attribute-equals-spacing.md +2 -2
- package/docs/rules/html-attribute-values-require-quotes.md +3 -3
- package/docs/rules/html-avoid-both-disabled-and-aria-disabled.md +2 -2
- package/docs/rules/html-body-only-elements.md +99 -0
- package/docs/rules/html-boolean-attributes-no-value.md +2 -2
- package/docs/rules/html-head-only-elements.md +81 -0
- package/docs/rules/html-input-require-autocomplete.md +64 -0
- package/docs/rules/html-no-aria-hidden-on-focusable.md +2 -2
- package/docs/rules/html-no-duplicate-attributes.md +2 -2
- package/docs/rules/html-no-duplicate-meta-names.md +64 -0
- package/docs/rules/html-no-empty-attributes.md +3 -3
- package/docs/rules/html-no-empty-headings.md +4 -26
- package/docs/rules/html-no-positive-tab-index.md +1 -2
- package/docs/rules/html-no-self-closing.md +17 -2
- package/docs/rules/html-no-space-in-tag.md +66 -0
- package/docs/rules/html-no-title-attribute.md +2 -2
- package/docs/rules/html-no-underscores-in-attribute-names.md +2 -2
- package/docs/rules/html-tag-name-lowercase.md +2 -2
- package/package.json +13 -5
- package/src/cli/argument-parser.ts +46 -37
- package/src/cli/file-processor.ts +159 -28
- package/src/cli/formatters/detailed-formatter.ts +21 -3
- package/src/cli/formatters/github-actions-formatter.ts +17 -1
- package/src/cli/formatters/json-formatter.ts +9 -0
- package/src/cli/formatters/simple-formatter.ts +24 -8
- package/src/cli/output-manager.ts +23 -3
- package/src/cli/summary-reporter.ts +40 -3
- package/src/cli.ts +134 -51
- package/src/custom-rule-loader.ts +189 -0
- package/src/herb-disable-comment-utils.ts +175 -0
- package/src/index.ts +2 -0
- package/src/linter.ts +501 -36
- package/src/loader.ts +30 -0
- package/src/rules/erb-comment-syntax.ts +53 -10
- package/src/rules/erb-no-case-node-children.ts +68 -0
- package/src/rules/erb-no-empty-tags.ts +9 -3
- package/src/rules/erb-no-extra-newline.ts +91 -0
- package/src/rules/erb-no-extra-whitespace-inside-tags.ts +147 -0
- package/src/rules/erb-no-output-control-flow.ts +9 -3
- package/src/rules/erb-no-silent-tag-in-attribute-name.ts +9 -3
- package/src/rules/erb-prefer-image-tag-helper.ts +9 -3
- package/src/rules/erb-require-trailing-newline.ts +47 -0
- package/src/rules/erb-require-whitespace-inside-tags.ts +94 -16
- package/src/rules/erb-right-trim.ts +45 -22
- package/src/rules/herb-disable-comment-base.ts +76 -0
- package/src/rules/herb-disable-comment-malformed.ts +66 -0
- package/src/rules/herb-disable-comment-missing-rules.ts +41 -0
- package/src/rules/herb-disable-comment-no-duplicate-rules.ts +46 -0
- package/src/rules/herb-disable-comment-no-redundant-all.ts +40 -0
- package/src/rules/herb-disable-comment-unnecessary.ts +103 -0
- package/src/rules/herb-disable-comment-valid-rule-name.ts +62 -0
- package/src/rules/html-anchor-require-href.ts +9 -3
- package/src/rules/html-aria-attribute-must-be-valid.ts +9 -3
- package/src/rules/html-aria-label-is-well-formatted.ts +9 -5
- package/src/rules/html-aria-level-must-be-valid.ts +9 -2
- package/src/rules/html-aria-role-heading-requires-level.ts +9 -3
- package/src/rules/html-aria-role-must-be-valid.ts +9 -3
- package/src/rules/html-attribute-double-quotes.ts +42 -8
- package/src/rules/html-attribute-equals-spacing.ts +31 -7
- package/src/rules/html-attribute-values-require-quotes.ts +56 -10
- package/src/rules/html-avoid-both-disabled-and-aria-disabled.ts +9 -3
- package/src/rules/html-body-only-elements.ts +60 -0
- package/src/rules/html-boolean-attributes-no-value.ts +31 -6
- package/src/rules/html-head-only-elements.ts +65 -0
- package/src/rules/html-iframe-has-title.ts +9 -4
- package/src/rules/html-img-require-alt.ts +10 -4
- package/src/rules/html-input-require-autocomplete.ts +85 -0
- package/src/rules/html-navigation-has-label.ts +9 -3
- package/src/rules/html-no-aria-hidden-on-focusable.ts +9 -3
- package/src/rules/html-no-block-inside-inline.ts +9 -3
- package/src/rules/html-no-duplicate-attributes.ts +9 -3
- package/src/rules/html-no-duplicate-ids.ts +11 -7
- package/src/rules/html-no-duplicate-meta-names.ts +188 -0
- package/src/rules/html-no-empty-attributes.ts +58 -10
- package/src/rules/html-no-empty-headings.ts +10 -8
- package/src/rules/html-no-nested-links.ts +10 -4
- package/src/rules/html-no-positive-tab-index.ts +9 -3
- package/src/rules/html-no-self-closing.ts +69 -9
- package/src/rules/html-no-space-in-tag.ts +221 -0
- package/src/rules/html-no-title-attribute.ts +9 -3
- package/src/rules/html-no-underscores-in-attribute-names.ts +12 -4
- package/src/rules/html-tag-name-lowercase.ts +41 -10
- package/src/rules/index.ts +23 -3
- package/src/rules/parser-no-errors.ts +8 -1
- package/src/rules/rule-utils.ts +248 -42
- package/src/rules/svg-tag-name-capitalization.ts +39 -6
- package/src/{default-rules.ts → rules.ts} +51 -15
- package/src/types.ts +133 -15
- package/dist/src/default-rules.js.map +0 -1
- package/dist/src/rules/erb-requires-trailing-newline.js +0 -22
- package/dist/src/rules/erb-requires-trailing-newline.js.map +0 -1
- package/dist/types/default-rules.d.ts +0 -2
- package/dist/types/rules/erb-requires-trailing-newline.d.ts +0 -6
- package/dist/types/src/default-rules.d.ts +0 -2
- package/dist/types/src/rules/erb-requires-trailing-newline.d.ts +0 -6
- package/src/rules/erb-requires-trailing-newline.ts +0 -29
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import type { RuleClass } from "./types.js"
|
|
2
2
|
|
|
3
3
|
import { ERBCommentSyntax } from "./rules/erb-comment-syntax.js";
|
|
4
|
+
import { ERBNoCaseNodeChildrenRule } from "./rules/erb-no-case-node-children.js"
|
|
4
5
|
import { ERBNoEmptyTagsRule } from "./rules/erb-no-empty-tags.js"
|
|
6
|
+
import { ERBNoExtraNewLineRule } from "./rules/erb-no-extra-newline.js"
|
|
7
|
+
import { ERBNoExtraWhitespaceRule } from "./rules/erb-no-extra-whitespace-inside-tags.js"
|
|
5
8
|
import { ERBNoOutputControlFlowRule } from "./rules/erb-no-output-control-flow.js"
|
|
6
9
|
import { ERBNoSilentTagInAttributeNameRule } from "./rules/erb-no-silent-tag-in-attribute-name.js"
|
|
7
10
|
import { ERBPreferImageTagHelperRule } from "./rules/erb-prefer-image-tag-helper.js"
|
|
8
|
-
import {
|
|
11
|
+
import { ERBRequireTrailingNewlineRule } from "./rules/erb-require-trailing-newline.js"
|
|
9
12
|
import { ERBRequireWhitespaceRule } from "./rules/erb-require-whitespace-inside-tags.js"
|
|
13
|
+
import { ERBRightTrimRule } from "./rules/erb-right-trim.js"
|
|
14
|
+
|
|
15
|
+
import { HerbDisableCommentValidRuleNameRule } from "./rules/herb-disable-comment-valid-rule-name.js"
|
|
16
|
+
import { HerbDisableCommentNoRedundantAllRule } from "./rules/herb-disable-comment-no-redundant-all.js"
|
|
17
|
+
import { HerbDisableCommentNoDuplicateRulesRule } from "./rules/herb-disable-comment-no-duplicate-rules.js"
|
|
18
|
+
import { HerbDisableCommentMissingRulesRule } from "./rules/herb-disable-comment-missing-rules.js"
|
|
19
|
+
import { HerbDisableCommentMalformedRule } from "./rules/herb-disable-comment-malformed.js"
|
|
20
|
+
import { HerbDisableCommentUnnecessaryRule } from "./rules/herb-disable-comment-unnecessary.js"
|
|
21
|
+
|
|
10
22
|
import { HTMLAnchorRequireHrefRule } from "./rules/html-anchor-require-href.js"
|
|
11
23
|
import { HTMLAriaAttributeMustBeValid } from "./rules/html-aria-attribute-must-be-valid.js"
|
|
12
24
|
import { HTMLAriaLabelIsWellFormattedRule } from "./rules/html-aria-label-is-well-formatted.js"
|
|
@@ -17,34 +29,52 @@ import { HTMLAttributeDoubleQuotesRule } from "./rules/html-attribute-double-quo
|
|
|
17
29
|
import { HTMLAttributeEqualsSpacingRule } from "./rules/html-attribute-equals-spacing.js"
|
|
18
30
|
import { HTMLAttributeValuesRequireQuotesRule } from "./rules/html-attribute-values-require-quotes.js"
|
|
19
31
|
import { HTMLAvoidBothDisabledAndAriaDisabledRule } from "./rules/html-avoid-both-disabled-and-aria-disabled.js"
|
|
32
|
+
import { HTMLBodyOnlyElementsRule } from "./rules/html-body-only-elements.js"
|
|
20
33
|
import { HTMLBooleanAttributesNoValueRule } from "./rules/html-boolean-attributes-no-value.js"
|
|
34
|
+
import { HTMLHeadOnlyElementsRule } from "./rules/html-head-only-elements.js"
|
|
21
35
|
import { HTMLIframeHasTitleRule } from "./rules/html-iframe-has-title.js"
|
|
22
36
|
import { HTMLImgRequireAltRule } from "./rules/html-img-require-alt.js"
|
|
23
|
-
|
|
37
|
+
import { HTMLInputRequireAutocompleteRule } from "./rules/html-input-require-autocomplete.js"
|
|
38
|
+
import { HTMLNavigationHasLabelRule } from "./rules/html-navigation-has-label.js"
|
|
24
39
|
import { HTMLNoAriaHiddenOnFocusableRule } from "./rules/html-no-aria-hidden-on-focusable.js"
|
|
25
|
-
|
|
40
|
+
import { HTMLNoBlockInsideInlineRule } from "./rules/html-no-block-inside-inline.js"
|
|
26
41
|
import { HTMLNoDuplicateAttributesRule } from "./rules/html-no-duplicate-attributes.js"
|
|
27
42
|
import { HTMLNoDuplicateIdsRule } from "./rules/html-no-duplicate-ids.js"
|
|
43
|
+
import { HTMLNoDuplicateMetaNamesRule } from "./rules/html-no-duplicate-meta-names.js"
|
|
28
44
|
import { HTMLNoEmptyAttributesRule } from "./rules/html-no-empty-attributes.js"
|
|
29
45
|
import { HTMLNoEmptyHeadingsRule } from "./rules/html-no-empty-headings.js"
|
|
30
46
|
import { HTMLNoNestedLinksRule } from "./rules/html-no-nested-links.js"
|
|
31
47
|
import { HTMLNoPositiveTabIndexRule } from "./rules/html-no-positive-tab-index.js"
|
|
32
48
|
import { HTMLNoSelfClosingRule } from "./rules/html-no-self-closing.js"
|
|
33
|
-
|
|
49
|
+
import { HTMLNoSpaceInTagRule } from "./rules/html-no-space-in-tag.js"
|
|
50
|
+
import { HTMLNoTitleAttributeRule } from "./rules/html-no-title-attribute.js"
|
|
51
|
+
import { HTMLNoUnderscoresInAttributeNamesRule } from "./rules/html-no-underscores-in-attribute-names.js"
|
|
34
52
|
import { HTMLTagNameLowercaseRule } from "./rules/html-tag-name-lowercase.js"
|
|
35
|
-
|
|
53
|
+
|
|
36
54
|
import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js"
|
|
37
|
-
import { HTMLNoUnderscoresInAttributeNamesRule } from "./rules/html-no-underscores-in-attribute-names.js"
|
|
38
|
-
import { ERBRightTrimRule } from "./rules/erb-right-trim.js"
|
|
39
55
|
|
|
40
|
-
|
|
56
|
+
import { ParserNoErrorsRule } from "./rules/parser-no-errors.js"
|
|
57
|
+
|
|
58
|
+
export const rules: RuleClass[] = [
|
|
41
59
|
ERBCommentSyntax,
|
|
60
|
+
ERBNoCaseNodeChildrenRule,
|
|
42
61
|
ERBNoEmptyTagsRule,
|
|
62
|
+
ERBNoExtraNewLineRule,
|
|
63
|
+
ERBNoExtraWhitespaceRule,
|
|
43
64
|
ERBNoOutputControlFlowRule,
|
|
44
65
|
ERBNoSilentTagInAttributeNameRule,
|
|
45
66
|
ERBPreferImageTagHelperRule,
|
|
46
|
-
|
|
67
|
+
ERBRequireTrailingNewlineRule,
|
|
47
68
|
ERBRequireWhitespaceRule,
|
|
69
|
+
ERBRightTrimRule,
|
|
70
|
+
|
|
71
|
+
HerbDisableCommentValidRuleNameRule,
|
|
72
|
+
HerbDisableCommentNoRedundantAllRule,
|
|
73
|
+
HerbDisableCommentNoDuplicateRulesRule,
|
|
74
|
+
HerbDisableCommentMissingRulesRule,
|
|
75
|
+
HerbDisableCommentMalformedRule,
|
|
76
|
+
HerbDisableCommentUnnecessaryRule,
|
|
77
|
+
|
|
48
78
|
HTMLAnchorRequireHrefRule,
|
|
49
79
|
HTMLAriaAttributeMustBeValid,
|
|
50
80
|
HTMLAriaLabelIsWellFormattedRule,
|
|
@@ -55,23 +85,29 @@ export const defaultRules: RuleClass[] = [
|
|
|
55
85
|
HTMLAttributeEqualsSpacingRule,
|
|
56
86
|
HTMLAttributeValuesRequireQuotesRule,
|
|
57
87
|
HTMLAvoidBothDisabledAndAriaDisabledRule,
|
|
88
|
+
HTMLBodyOnlyElementsRule,
|
|
58
89
|
HTMLBooleanAttributesNoValueRule,
|
|
90
|
+
HTMLHeadOnlyElementsRule,
|
|
59
91
|
HTMLIframeHasTitleRule,
|
|
60
92
|
HTMLImgRequireAltRule,
|
|
61
|
-
|
|
93
|
+
HTMLInputRequireAutocompleteRule,
|
|
94
|
+
HTMLNavigationHasLabelRule,
|
|
62
95
|
HTMLNoAriaHiddenOnFocusableRule,
|
|
63
|
-
|
|
96
|
+
HTMLNoBlockInsideInlineRule,
|
|
64
97
|
HTMLNoDuplicateAttributesRule,
|
|
65
98
|
HTMLNoDuplicateIdsRule,
|
|
99
|
+
HTMLNoDuplicateMetaNamesRule,
|
|
66
100
|
HTMLNoEmptyAttributesRule,
|
|
67
101
|
HTMLNoEmptyHeadingsRule,
|
|
68
102
|
HTMLNoNestedLinksRule,
|
|
69
103
|
HTMLNoPositiveTabIndexRule,
|
|
70
104
|
HTMLNoSelfClosingRule,
|
|
71
|
-
|
|
105
|
+
HTMLNoSpaceInTagRule,
|
|
106
|
+
HTMLNoTitleAttributeRule,
|
|
107
|
+
HTMLNoUnderscoresInAttributeNamesRule,
|
|
72
108
|
HTMLTagNameLowercaseRule,
|
|
73
|
-
|
|
109
|
+
|
|
74
110
|
SVGTagNameCapitalizationRule,
|
|
75
|
-
|
|
76
|
-
|
|
111
|
+
|
|
112
|
+
ParserNoErrorsRule,
|
|
77
113
|
]
|
package/src/types.ts
CHANGED
|
@@ -1,30 +1,97 @@
|
|
|
1
1
|
import { Diagnostic, LexResult, ParseResult } from "@herb-tools/core"
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import type { rules } from "./rules.js"
|
|
4
|
+
import type { Node } from "@herb-tools/core"
|
|
5
|
+
import type { RuleConfig } from "@herb-tools/config"
|
|
6
|
+
import type { Mutable } from "@herb-tools/rewriter"
|
|
7
|
+
|
|
8
|
+
export type { Mutable } from "@herb-tools/rewriter"
|
|
3
9
|
|
|
4
10
|
export type LintSeverity = "error" | "warning" | "info" | "hint"
|
|
5
11
|
|
|
12
|
+
export type FullRuleConfig = Required<Pick<RuleConfig, 'enabled' | 'severity'>> & Omit<RuleConfig, 'enabled' | 'severity'>
|
|
13
|
+
|
|
6
14
|
/**
|
|
7
15
|
* Automatically inferred union type of all available linter rule names.
|
|
8
16
|
* This type extracts the 'name' property from each rule class instance.
|
|
9
17
|
*/
|
|
10
|
-
export type LinterRule = InstanceType<typeof
|
|
18
|
+
export type LinterRule = InstanceType<typeof rules[number]>['name']
|
|
11
19
|
|
|
12
|
-
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Base context for autofix operations. Contains the offending node.
|
|
23
|
+
* Rules can extend this interface to include rule-specific autofix data.
|
|
24
|
+
* Note: The node is typed as Mutable to allow direct mutation in autofix methods.
|
|
25
|
+
*/
|
|
26
|
+
export interface BaseAutofixContext {
|
|
27
|
+
/** The AST node, token, or data structure that caused the offense (mutable) */
|
|
28
|
+
node: Mutable<Node>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A lint offense without severity bound. Rules produce these, and the Linter
|
|
33
|
+
* binds severity based on the rule's defaultConfig and user config overrides.
|
|
34
|
+
*/
|
|
35
|
+
export interface UnboundLintOffense<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> extends Omit<Diagnostic, 'severity'> {
|
|
13
36
|
rule: LinterRule
|
|
37
|
+
/** Context data for autofix, including the offending node and rule-specific data */
|
|
38
|
+
autofixContext?: TAutofixContext
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* A lint offense with severity bound. The Linter produces these by binding
|
|
43
|
+
* severity to UnboundLintOffenses based on rule configuration.
|
|
44
|
+
*/
|
|
45
|
+
export interface LintOffense<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> extends UnboundLintOffense<TAutofixContext> {
|
|
14
46
|
severity: LintSeverity
|
|
15
47
|
}
|
|
16
48
|
|
|
17
|
-
export interface LintResult {
|
|
18
|
-
offenses: LintOffense[]
|
|
49
|
+
export interface LintResult<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> {
|
|
50
|
+
offenses: LintOffense<TAutofixContext>[]
|
|
19
51
|
errors: number
|
|
20
52
|
warnings: number
|
|
53
|
+
info: number
|
|
54
|
+
hints: number
|
|
55
|
+
ignored: number
|
|
56
|
+
wouldBeIgnored?: number
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Result of applying autofixes to source code
|
|
61
|
+
*/
|
|
62
|
+
export interface AutofixResult<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> {
|
|
63
|
+
/** The corrected source code with all fixes applied */
|
|
64
|
+
source: string
|
|
65
|
+
/** Offenses that were successfully fixed */
|
|
66
|
+
fixed: LintOffense<TAutofixContext>[]
|
|
67
|
+
/** Offenses that could not be automatically fixed */
|
|
68
|
+
unfixed: LintOffense<TAutofixContext>[]
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Default configuration for rules when defaultConfig is not specified.
|
|
73
|
+
* Custom rules can omit defaultConfig and will use these defaults.
|
|
74
|
+
*/
|
|
75
|
+
export const DEFAULT_RULE_CONFIG: FullRuleConfig = {
|
|
76
|
+
enabled: true,
|
|
77
|
+
severity: "error",
|
|
78
|
+
exclude: []
|
|
21
79
|
}
|
|
22
80
|
|
|
23
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Base class for parser rules.
|
|
83
|
+
*/
|
|
84
|
+
export abstract class ParserRule<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> {
|
|
24
85
|
static type = "parser" as const
|
|
86
|
+
/** Indicates whether this rule supports autofix. Defaults to false. */
|
|
87
|
+
static autocorrectable = false
|
|
25
88
|
abstract name: string
|
|
26
|
-
|
|
27
|
-
|
|
89
|
+
|
|
90
|
+
get defaultConfig(): FullRuleConfig {
|
|
91
|
+
return DEFAULT_RULE_CONFIG
|
|
92
|
+
}
|
|
93
|
+
abstract check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<TAutofixContext>[]
|
|
94
|
+
|
|
28
95
|
/**
|
|
29
96
|
* Optional method to determine if this rule should run.
|
|
30
97
|
* If not implemented, rule is always enabled.
|
|
@@ -33,13 +100,32 @@ export abstract class ParserRule {
|
|
|
33
100
|
* @returns true if rule should run, false to skip
|
|
34
101
|
*/
|
|
35
102
|
isEnabled?(result: ParseResult, context?: Partial<LintContext>): boolean
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Optional method to automatically fix an offense by mutating the AST.
|
|
106
|
+
* If not implemented, the rule does not support autofix.
|
|
107
|
+
* @param offense - The offense to fix (includes autofixContext with node and rule-specific data)
|
|
108
|
+
* @param result - The parse result containing the AST (mutate it directly and return it)
|
|
109
|
+
* @param context - Optional context for linting
|
|
110
|
+
* @returns The mutated ParseResult if fixed, or null if the offense could not be fixed
|
|
111
|
+
*/
|
|
112
|
+
autofix?(offense: LintOffense<TAutofixContext>, result: ParseResult, context?: Partial<LintContext>): ParseResult | null
|
|
36
113
|
}
|
|
37
114
|
|
|
38
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Base class for lexer rules.
|
|
117
|
+
*/
|
|
118
|
+
export abstract class LexerRule<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> {
|
|
39
119
|
static type = "lexer" as const
|
|
120
|
+
/** Indicates whether this rule supports autofix. Defaults to false. */
|
|
121
|
+
static autocorrectable = false
|
|
40
122
|
abstract name: string
|
|
41
|
-
|
|
42
|
-
|
|
123
|
+
|
|
124
|
+
get defaultConfig(): FullRuleConfig {
|
|
125
|
+
return DEFAULT_RULE_CONFIG
|
|
126
|
+
}
|
|
127
|
+
abstract check(lexResult: LexResult, context?: Partial<LintContext>): UnboundLintOffense<TAutofixContext>[]
|
|
128
|
+
|
|
43
129
|
/**
|
|
44
130
|
* Optional method to determine if this rule should run.
|
|
45
131
|
* If not implemented, rule is always enabled.
|
|
@@ -48,6 +134,16 @@ export abstract class LexerRule {
|
|
|
48
134
|
* @returns true if rule should run, false to skip
|
|
49
135
|
*/
|
|
50
136
|
isEnabled?(lexResult: LexResult, context?: Partial<LintContext>): boolean
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Optional method to automatically fix an offense by mutating tokens.
|
|
140
|
+
* If not implemented, the rule does not support autofix.
|
|
141
|
+
* @param offense - The offense to fix (includes autofixContext with node and rule-specific data)
|
|
142
|
+
* @param lexResult - The lex result containing tokens (mutate them directly and return)
|
|
143
|
+
* @param context - Optional context for linting
|
|
144
|
+
* @returns The mutated LexResult if fixed, or null if the offense could not be fixed
|
|
145
|
+
*/
|
|
146
|
+
autofix?(offense: LintOffense<TAutofixContext>, lexResult: LexResult, context?: Partial<LintContext>): LexResult | null
|
|
51
147
|
}
|
|
52
148
|
|
|
53
149
|
export interface LexerRuleConstructor {
|
|
@@ -61,20 +157,32 @@ export interface LexerRuleConstructor {
|
|
|
61
157
|
*/
|
|
62
158
|
export interface LintContext {
|
|
63
159
|
fileName: string | undefined
|
|
160
|
+
validRuleNames: string[] | undefined
|
|
161
|
+
ignoredOffensesByLine: Map<number, Set<string>> | undefined
|
|
162
|
+
ignoreDisableComments: boolean | undefined
|
|
64
163
|
}
|
|
65
164
|
|
|
66
165
|
/**
|
|
67
166
|
* Default context object with all keys defined but set to undefined
|
|
68
167
|
*/
|
|
69
168
|
export const DEFAULT_LINT_CONTEXT: LintContext = {
|
|
70
|
-
fileName: undefined
|
|
169
|
+
fileName: undefined,
|
|
170
|
+
validRuleNames: undefined,
|
|
171
|
+
ignoredOffensesByLine: undefined,
|
|
172
|
+
ignoreDisableComments: undefined
|
|
71
173
|
} as const
|
|
72
174
|
|
|
73
|
-
export abstract class SourceRule {
|
|
175
|
+
export abstract class SourceRule<TAutofixContext extends BaseAutofixContext = BaseAutofixContext> {
|
|
74
176
|
static type = "source" as const
|
|
177
|
+
/** Indicates whether this rule supports autofix. Defaults to false. */
|
|
178
|
+
static autocorrectable = false
|
|
75
179
|
abstract name: string
|
|
76
|
-
|
|
77
|
-
|
|
180
|
+
|
|
181
|
+
get defaultConfig(): FullRuleConfig {
|
|
182
|
+
return DEFAULT_RULE_CONFIG
|
|
183
|
+
}
|
|
184
|
+
abstract check(source: string, context?: Partial<LintContext>): UnboundLintOffense<TAutofixContext>[]
|
|
185
|
+
|
|
78
186
|
/**
|
|
79
187
|
* Optional method to determine if this rule should run.
|
|
80
188
|
* If not implemented, rule is always enabled.
|
|
@@ -83,6 +191,16 @@ export abstract class SourceRule {
|
|
|
83
191
|
* @returns true if rule should run, false to skip
|
|
84
192
|
*/
|
|
85
193
|
isEnabled?(source: string, context?: Partial<LintContext>): boolean
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Optional method to automatically fix an offense.
|
|
197
|
+
* If not implemented, the rule does not support autofix.
|
|
198
|
+
* @param offense - The offense to fix (includes autofixContext with node and rule-specific data)
|
|
199
|
+
* @param source - The original source code
|
|
200
|
+
* @param context - Optional context for linting
|
|
201
|
+
* @returns The corrected source if the offense can be fixed, null otherwise
|
|
202
|
+
*/
|
|
203
|
+
autofix?(offense: LintOffense<TAutofixContext>, source: string, context?: Partial<LintContext>): string | null
|
|
86
204
|
}
|
|
87
205
|
|
|
88
206
|
export interface SourceRuleConstructor {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-rules.js","sourceRoot":"","sources":["../../src/default-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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,6 +0,0 @@
|
|
|
1
|
-
import { SourceRule } from "../types.js";
|
|
2
|
-
import type { LintOffense, LintContext } from "../types.js";
|
|
3
|
-
export declare class ERBRequiresTrailingNewlineRule extends SourceRule {
|
|
4
|
-
name: string;
|
|
5
|
-
check(source: string, context?: Partial<LintContext>): LintOffense[];
|
|
6
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { SourceRule } from "../types.js";
|
|
2
|
-
import type { LintOffense, LintContext } from "../types.js";
|
|
3
|
-
export declare class ERBRequiresTrailingNewlineRule extends SourceRule {
|
|
4
|
-
name: string;
|
|
5
|
-
check(source: string, context?: Partial<LintContext>): LintOffense[];
|
|
6
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { BaseSourceRuleVisitor, createEndOfFileLocation } from "./rule-utils.js"
|
|
2
|
-
import { SourceRule } from "../types.js"
|
|
3
|
-
import type { LintOffense, LintContext } from "../types.js"
|
|
4
|
-
|
|
5
|
-
class ERBRequiresTrailingNewlineVisitor extends BaseSourceRuleVisitor {
|
|
6
|
-
protected visitSource(source: string): void {
|
|
7
|
-
if (source.length === 0) return
|
|
8
|
-
if (source.endsWith('\n')) return
|
|
9
|
-
if (!this.context.fileName) return
|
|
10
|
-
|
|
11
|
-
this.addOffense(
|
|
12
|
-
"File must end with trailing newline",
|
|
13
|
-
createEndOfFileLocation(source),
|
|
14
|
-
"error"
|
|
15
|
-
)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class ERBRequiresTrailingNewlineRule extends SourceRule {
|
|
20
|
-
name = "erb-requires-trailing-newline"
|
|
21
|
-
|
|
22
|
-
check(source: string, context?: Partial<LintContext>): LintOffense[] {
|
|
23
|
-
const visitor = new ERBRequiresTrailingNewlineVisitor(this.name, context)
|
|
24
|
-
|
|
25
|
-
visitor.visit(source)
|
|
26
|
-
|
|
27
|
-
return visitor.offenses
|
|
28
|
-
}
|
|
29
|
-
}
|