@herb-tools/linter 0.7.4 → 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 +26087 -3414
- package/dist/herb-lint.js.map +1 -1
- package/dist/index.cjs +5783 -1568
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5749 -1569
- 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 +42 -35
- 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 +109 -43
- 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 +48 -0
- package/dist/src/rules/erb-comment-syntax.js.map +1 -0
- 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 +70 -20
- package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +1 -1
- package/dist/src/rules/erb-right-trim.js +45 -0
- package/dist/src/rules/erb-right-trim.js.map +1 -0
- 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 +20 -2
- 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} +46 -14
- 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 +14 -0
- 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 +14 -0
- 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 +20 -2
- 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 +14 -0
- 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 +14 -0
- 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 +20 -2
- 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 +19 -3
- package/docs/rules/erb-comment-syntax.md +44 -0
- 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 +52 -0
- 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 +50 -39
- 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 +137 -52
- 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 +73 -0
- 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 +96 -26
- package/src/rules/erb-right-trim.ts +67 -0
- 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 +24 -2
- package/src/rules/parser-no-errors.ts +8 -1
- package/src/rules/rule-utils.ts +250 -44
- package/src/rules/svg-tag-name-capitalization.ts +39 -6
- package/src/{default-rules.ts → rules.ts} +53 -13
- 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
|
@@ -6,7 +6,8 @@ export class OutputManager {
|
|
|
6
6
|
* Output successful lint results
|
|
7
7
|
*/
|
|
8
8
|
async outputResults(results, options) {
|
|
9
|
-
const { allOffenses, files, totalErrors, totalWarnings, filesWithOffenses, ruleCount, ruleOffenses } = results;
|
|
9
|
+
const { allOffenses, files, totalErrors, totalWarnings, totalInfo, totalHints, totalIgnored, totalWouldBeIgnored, filesWithOffenses, ruleCount, ruleOffenses, context } = results;
|
|
10
|
+
const autofixableCount = allOffenses.filter(offense => offense.autocorrectable).length;
|
|
10
11
|
if (options.useGitHubActions) {
|
|
11
12
|
const githubFormatter = new GitHubActionsFormatter(options.wrapLines, options.truncateLines);
|
|
12
13
|
await githubFormatter.formatAnnotations(allOffenses);
|
|
@@ -20,12 +21,18 @@ export class OutputManager {
|
|
|
20
21
|
files,
|
|
21
22
|
totalErrors,
|
|
22
23
|
totalWarnings,
|
|
24
|
+
totalInfo,
|
|
25
|
+
totalHints,
|
|
26
|
+
totalIgnored,
|
|
27
|
+
totalWouldBeIgnored,
|
|
23
28
|
filesWithOffenses,
|
|
24
29
|
ruleCount,
|
|
25
30
|
startTime: options.startTime,
|
|
26
31
|
startDate: options.startDate,
|
|
27
32
|
showTiming: options.showTiming,
|
|
28
|
-
ruleOffenses
|
|
33
|
+
ruleOffenses,
|
|
34
|
+
autofixableCount,
|
|
35
|
+
ignoreDisableComments: context?.ignoreDisableComments,
|
|
29
36
|
});
|
|
30
37
|
}
|
|
31
38
|
}
|
|
@@ -44,6 +51,9 @@ export class OutputManager {
|
|
|
44
51
|
filesWithOffenses,
|
|
45
52
|
totalErrors,
|
|
46
53
|
totalWarnings,
|
|
54
|
+
totalInfo,
|
|
55
|
+
totalHints,
|
|
56
|
+
totalIgnored,
|
|
47
57
|
totalOffenses: totalErrors + totalWarnings,
|
|
48
58
|
ruleCount
|
|
49
59
|
},
|
|
@@ -69,12 +79,18 @@ export class OutputManager {
|
|
|
69
79
|
files,
|
|
70
80
|
totalErrors,
|
|
71
81
|
totalWarnings,
|
|
82
|
+
totalInfo,
|
|
83
|
+
totalHints,
|
|
84
|
+
totalIgnored,
|
|
85
|
+
totalWouldBeIgnored,
|
|
72
86
|
filesWithOffenses,
|
|
73
87
|
ruleCount,
|
|
74
88
|
startTime: options.startTime,
|
|
75
89
|
startDate: options.startDate,
|
|
76
90
|
showTiming: options.showTiming,
|
|
77
|
-
ruleOffenses
|
|
91
|
+
ruleOffenses,
|
|
92
|
+
autofixableCount,
|
|
93
|
+
ignoreDisableComments: context?.ignoreDisableComments,
|
|
78
94
|
});
|
|
79
95
|
}
|
|
80
96
|
}
|
|
@@ -93,6 +109,9 @@ export class OutputManager {
|
|
|
93
109
|
filesWithOffenses: 0,
|
|
94
110
|
totalErrors: 0,
|
|
95
111
|
totalWarnings: 0,
|
|
112
|
+
totalInfo: 0,
|
|
113
|
+
totalHints: 0,
|
|
114
|
+
totalIgnored: 0,
|
|
96
115
|
totalOffenses: 0,
|
|
97
116
|
ruleCount: 0
|
|
98
117
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../../src/cli/output-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAmB,MAAM,uBAAuB,CAAA;AAqBnH,MAAM,OAAO,aAAa;IAChB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IAE/C;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAoB,EAAE,OAAsB;QAC9D,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../../src/cli/output-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ export class SummaryReporter {
|
|
|
4
4
|
return count === 1 ? singular : (plural || `${singular}s`);
|
|
5
5
|
}
|
|
6
6
|
displaySummary(data) {
|
|
7
|
-
const { files, totalErrors, totalWarnings, filesWithOffenses, ruleCount, startTime, startDate, showTiming } = data;
|
|
7
|
+
const { files, totalErrors, totalWarnings, totalInfo = 0, totalHints = 0, totalIgnored, totalWouldBeIgnored, filesWithOffenses, ruleCount, startTime, startDate, showTiming, autofixableCount, ignoreDisableComments } = data;
|
|
8
8
|
console.log("\n");
|
|
9
9
|
console.log(` ${colorize("Summary:", "bold")}`);
|
|
10
10
|
const labelWidth = 12;
|
|
@@ -40,19 +40,42 @@ export class SummaryReporter {
|
|
|
40
40
|
else if (totalErrors > 0) {
|
|
41
41
|
parts.push(colorize(colorize(`${totalWarnings} ${this.pluralize(totalWarnings, "warning")}`, "green"), "bold"));
|
|
42
42
|
}
|
|
43
|
+
if (totalInfo > 0) {
|
|
44
|
+
parts.push(colorize(colorize(`${totalInfo} info`, "brightBlue"), "bold"));
|
|
45
|
+
}
|
|
46
|
+
if (totalHints > 0) {
|
|
47
|
+
parts.push(colorize(colorize(`${totalHints} ${this.pluralize(totalHints, "hint")}`, "gray"), "bold"));
|
|
48
|
+
}
|
|
49
|
+
if (totalIgnored > 0) {
|
|
50
|
+
parts.push(colorize(colorize(`${totalIgnored} ignored`, "gray"), "bold"));
|
|
51
|
+
}
|
|
43
52
|
if (parts.length === 0) {
|
|
44
53
|
offensesSummary = colorize(colorize("0 offenses", "green"), "bold");
|
|
45
54
|
}
|
|
46
55
|
else {
|
|
47
56
|
offensesSummary = parts.join(" | ");
|
|
48
57
|
let detailText = "";
|
|
49
|
-
const totalOffenses = totalErrors + totalWarnings;
|
|
58
|
+
const totalOffenses = totalErrors + totalWarnings + totalInfo + totalHints;
|
|
50
59
|
if (filesWithOffenses > 0) {
|
|
51
60
|
detailText = `${totalOffenses} ${this.pluralize(totalOffenses, "offense")} across ${filesWithOffenses} ${this.pluralize(filesWithOffenses, "file")}`;
|
|
52
61
|
}
|
|
53
|
-
|
|
62
|
+
if (detailText) {
|
|
63
|
+
offensesSummary += ` ${colorize(colorize(`(${detailText})`, "gray"), "dim")}`;
|
|
64
|
+
}
|
|
54
65
|
}
|
|
55
66
|
console.log(` ${colorize(pad("Offenses"), "gray")} ${offensesSummary}`);
|
|
67
|
+
if (ignoreDisableComments && totalWouldBeIgnored && totalWouldBeIgnored > 0) {
|
|
68
|
+
const message = `${colorize(colorize(`${totalWouldBeIgnored} additional ${this.pluralize(totalWouldBeIgnored, "offense")} reported (would have been ignored)`, "cyan"), "bold")}`;
|
|
69
|
+
console.log(` ${colorize(pad("Note"), "gray")} ${message}`);
|
|
70
|
+
}
|
|
71
|
+
const totalOffenses = totalErrors + totalWarnings + totalInfo + totalHints;
|
|
72
|
+
if (autofixableCount > 0 || totalOffenses > 0) {
|
|
73
|
+
let fixableLine = `${colorize(colorize(`${totalOffenses} ${this.pluralize(totalOffenses, "offense")}`, "brightRed"), "bold")}`;
|
|
74
|
+
if (autofixableCount > 0) {
|
|
75
|
+
fixableLine += ` | ${colorize(colorize(`${autofixableCount} autocorrectable using \`--fix\``, "green"), "bold")}`;
|
|
76
|
+
}
|
|
77
|
+
console.log(` ${colorize(pad("Fixable"), "gray")} ${fixableLine}`);
|
|
78
|
+
}
|
|
56
79
|
if (showTiming) {
|
|
57
80
|
const duration = Date.now() - startTime;
|
|
58
81
|
const timeString = startDate.toTimeString().split(' ')[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-reporter.js","sourceRoot":"","sources":["../../../src/cli/summary-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"summary-reporter.js","sourceRoot":"","sources":["../../../src/cli/summary-reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { glob } from "glob";
|
|
2
2
|
import { Herb } from "@herb-tools/node-wasm";
|
|
3
|
+
import { Config, addHerbExtensionRecommendation, getExtensionsJsonRelativePath } from "@herb-tools/config";
|
|
3
4
|
import { existsSync, statSync } from "fs";
|
|
4
5
|
import { dirname, resolve, relative } from "path";
|
|
5
6
|
import { ArgumentParser } from "./cli/argument-parser.js";
|
|
6
7
|
import { FileProcessor } from "./cli/file-processor.js";
|
|
7
8
|
import { OutputManager } from "./cli/output-manager.js";
|
|
9
|
+
import { version } from "../package.json";
|
|
8
10
|
export * from "./cli/index.js";
|
|
9
11
|
export class CLI {
|
|
10
12
|
argumentParser = new ArgumentParser();
|
|
@@ -14,37 +16,6 @@ export class CLI {
|
|
|
14
16
|
getProjectPath() {
|
|
15
17
|
return this.projectPath;
|
|
16
18
|
}
|
|
17
|
-
findProjectRoot(startPath) {
|
|
18
|
-
let currentPath = resolve(startPath);
|
|
19
|
-
if (existsSync(currentPath) && statSync(currentPath).isFile()) {
|
|
20
|
-
currentPath = dirname(currentPath);
|
|
21
|
-
}
|
|
22
|
-
const projectIndicators = [
|
|
23
|
-
'package.json',
|
|
24
|
-
'Gemfile',
|
|
25
|
-
'.git',
|
|
26
|
-
'tsconfig.json',
|
|
27
|
-
'composer.json',
|
|
28
|
-
'pyproject.toml',
|
|
29
|
-
'requirements.txt',
|
|
30
|
-
'.herb.yml'
|
|
31
|
-
];
|
|
32
|
-
while (currentPath !== '/') {
|
|
33
|
-
for (const indicator of projectIndicators) {
|
|
34
|
-
if (existsSync(resolve(currentPath, indicator))) {
|
|
35
|
-
return currentPath;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
const parentPath = dirname(currentPath);
|
|
39
|
-
if (parentPath === currentPath) {
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
currentPath = parentPath;
|
|
43
|
-
}
|
|
44
|
-
return existsSync(startPath) && statSync(startPath).isDirectory()
|
|
45
|
-
? startPath
|
|
46
|
-
: dirname(startPath);
|
|
47
|
-
}
|
|
48
19
|
exitWithError(message, formatOption, exitCode = 1) {
|
|
49
20
|
this.outputManager.outputError(message, {
|
|
50
21
|
formatOption,
|
|
@@ -72,7 +43,8 @@ export class CLI {
|
|
|
72
43
|
this.outputManager.outputInfo(message, outputOptions);
|
|
73
44
|
process.exit(exitCode);
|
|
74
45
|
}
|
|
75
|
-
determineProjectPath(
|
|
46
|
+
determineProjectPath(patterns) {
|
|
47
|
+
const pattern = patterns[0];
|
|
76
48
|
if (pattern) {
|
|
77
49
|
const resolvedPattern = resolve(pattern);
|
|
78
50
|
if (existsSync(resolvedPattern)) {
|
|
@@ -81,20 +53,20 @@ export class CLI {
|
|
|
81
53
|
this.projectPath = resolvedPattern;
|
|
82
54
|
}
|
|
83
55
|
else {
|
|
84
|
-
this.projectPath =
|
|
56
|
+
this.projectPath = dirname(resolvedPattern);
|
|
85
57
|
}
|
|
86
58
|
}
|
|
87
59
|
}
|
|
88
60
|
}
|
|
89
|
-
adjustPattern(pattern) {
|
|
61
|
+
adjustPattern(pattern, configGlobPattern) {
|
|
90
62
|
if (!pattern) {
|
|
91
|
-
return
|
|
63
|
+
return configGlobPattern;
|
|
92
64
|
}
|
|
93
65
|
const resolvedPattern = resolve(pattern);
|
|
94
66
|
if (existsSync(resolvedPattern)) {
|
|
95
67
|
const stats = statSync(resolvedPattern);
|
|
96
68
|
if (stats.isDirectory()) {
|
|
97
|
-
return
|
|
69
|
+
return configGlobPattern;
|
|
98
70
|
}
|
|
99
71
|
else if (stats.isFile()) {
|
|
100
72
|
return relative(this.projectPath, resolvedPattern);
|
|
@@ -102,18 +74,68 @@ export class CLI {
|
|
|
102
74
|
}
|
|
103
75
|
return pattern;
|
|
104
76
|
}
|
|
77
|
+
async resolvePatternToFiles(pattern, config, force) {
|
|
78
|
+
const resolvedPattern = resolve(pattern);
|
|
79
|
+
const isExplicitFile = existsSync(resolvedPattern) && statSync(resolvedPattern).isFile();
|
|
80
|
+
let explicitFile;
|
|
81
|
+
if (isExplicitFile) {
|
|
82
|
+
explicitFile = pattern;
|
|
83
|
+
}
|
|
84
|
+
const filesConfig = config.getFilesConfigForTool('linter');
|
|
85
|
+
const configGlobPattern = filesConfig.include && filesConfig.include.length > 0
|
|
86
|
+
? (filesConfig.include.length === 1 ? filesConfig.include[0] : `{${filesConfig.include.join(',')}}`)
|
|
87
|
+
: '**/*.html.erb';
|
|
88
|
+
const adjustedPattern = this.adjustPattern(pattern, configGlobPattern);
|
|
89
|
+
let files = await glob(adjustedPattern, {
|
|
90
|
+
cwd: this.projectPath,
|
|
91
|
+
ignore: filesConfig.exclude || []
|
|
92
|
+
});
|
|
93
|
+
if (explicitFile && files.length === 0) {
|
|
94
|
+
if (!force) {
|
|
95
|
+
console.error(`⚠️ File ${explicitFile} is excluded by configuration patterns.`);
|
|
96
|
+
console.error(` Use --force to lint it anyway.\n`);
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(`⚠️ Forcing linter on excluded file: ${explicitFile}`);
|
|
101
|
+
console.log();
|
|
102
|
+
files = [adjustedPattern];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { files, explicitFile };
|
|
106
|
+
}
|
|
105
107
|
async beforeProcess() {
|
|
106
|
-
|
|
108
|
+
// Hook for subclasses to add custom output before processing
|
|
107
109
|
}
|
|
108
110
|
async afterProcess(_results, _outputOptions) {
|
|
109
111
|
// Hook for subclasses to add custom output after processing
|
|
110
112
|
}
|
|
111
113
|
async run() {
|
|
114
|
+
await Herb.load();
|
|
112
115
|
const startTime = Date.now();
|
|
113
116
|
const startDate = new Date();
|
|
114
|
-
let {
|
|
115
|
-
this.determineProjectPath(
|
|
116
|
-
|
|
117
|
+
let { patterns, configFile, formatOption, showTiming, theme, wrapLines, truncateLines, useGitHubActions, fix, ignoreDisableComments, force, init, loadCustomRules } = this.argumentParser.parse(process.argv);
|
|
118
|
+
this.determineProjectPath(patterns);
|
|
119
|
+
if (init) {
|
|
120
|
+
const configPath = configFile || this.projectPath;
|
|
121
|
+
if (Config.exists(configPath)) {
|
|
122
|
+
const fullPath = configFile || Config.configPathFromProjectPath(this.projectPath);
|
|
123
|
+
console.error(`\n✗ Configuration file already exists at ${fullPath}`);
|
|
124
|
+
console.error(` Use --config-file to specify a different location.\n`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const config = await Config.loadForCLI(configPath, version, true);
|
|
128
|
+
const extensionAdded = addHerbExtensionRecommendation(this.projectPath);
|
|
129
|
+
console.log(`\n✓ Configuration initialized at ${config.path}`);
|
|
130
|
+
if (extensionAdded) {
|
|
131
|
+
console.log(`✓ VSCode extension recommended in ${getExtensionsJsonRelativePath()}`);
|
|
132
|
+
}
|
|
133
|
+
console.log(` Edit this file to customize linter and formatter settings.\n`);
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
136
|
+
const silent = formatOption === 'json';
|
|
137
|
+
const config = await Config.load(configFile || this.projectPath, { version, exitOnError: true, createIfMissing: false, silent });
|
|
138
|
+
const linterConfig = config.options.linter || {};
|
|
117
139
|
const outputOptions = {
|
|
118
140
|
formatOption,
|
|
119
141
|
theme,
|
|
@@ -126,13 +148,57 @@ export class CLI {
|
|
|
126
148
|
};
|
|
127
149
|
try {
|
|
128
150
|
await this.beforeProcess();
|
|
129
|
-
|
|
151
|
+
if (linterConfig.enabled === false && !force) {
|
|
152
|
+
this.exitWithInfo("Linter is disabled in .herb.yml configuration. Use --force to lint anyway.", formatOption, 0, { startTime, startDate, showTiming });
|
|
153
|
+
}
|
|
154
|
+
if (force && linterConfig.enabled === false) {
|
|
155
|
+
console.log("⚠️ Forcing linter run (disabled in .herb.yml)");
|
|
156
|
+
console.log();
|
|
157
|
+
}
|
|
158
|
+
let files;
|
|
159
|
+
let explicitFiles = [];
|
|
160
|
+
if (patterns.length === 0) {
|
|
161
|
+
files = await config.findFilesForTool('linter', this.projectPath);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const allFiles = [];
|
|
165
|
+
for (const pattern of patterns) {
|
|
166
|
+
const { files: patternFiles, explicitFile } = await this.resolvePatternToFiles(pattern, config, force);
|
|
167
|
+
if (patternFiles.length === 0) {
|
|
168
|
+
console.error(`✗ No files found matching pattern: ${pattern}`);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
allFiles.push(...patternFiles);
|
|
172
|
+
if (explicitFile) {
|
|
173
|
+
explicitFiles.push(explicitFile);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
files = [...new Set(allFiles)];
|
|
177
|
+
}
|
|
130
178
|
if (files.length === 0) {
|
|
131
|
-
this.exitWithInfo(`No files found matching
|
|
179
|
+
this.exitWithInfo(`No files found matching patterns: ${patterns.join(', ') || 'from config'}`, formatOption, 0, { startTime, startDate, showTiming });
|
|
180
|
+
}
|
|
181
|
+
let processingConfig = config;
|
|
182
|
+
if (force && explicitFiles.length > 0) {
|
|
183
|
+
const modifiedConfig = Object.create(Object.getPrototypeOf(config));
|
|
184
|
+
Object.assign(modifiedConfig, config);
|
|
185
|
+
modifiedConfig.config = {
|
|
186
|
+
...config.config,
|
|
187
|
+
linter: {
|
|
188
|
+
...config.config.linter,
|
|
189
|
+
exclude: []
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
processingConfig = modifiedConfig;
|
|
132
193
|
}
|
|
133
194
|
const context = {
|
|
134
195
|
projectPath: this.projectPath,
|
|
135
|
-
pattern:
|
|
196
|
+
pattern: patterns.join(' '),
|
|
197
|
+
fix,
|
|
198
|
+
ignoreDisableComments,
|
|
199
|
+
linterConfig,
|
|
200
|
+
config: processingConfig,
|
|
201
|
+
loadCustomRules
|
|
136
202
|
};
|
|
137
203
|
const results = await this.fileProcessor.processFiles(files, formatOption, context);
|
|
138
204
|
await this.outputManager.outputResults({ ...results, files }, outputOptions);
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAEjD,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { pathToFileURL } from "url";
|
|
2
|
+
import { glob } from "glob";
|
|
3
|
+
const DEFAULT_PATTERNS = [
|
|
4
|
+
".herb/rules/**/*.mjs",
|
|
5
|
+
];
|
|
6
|
+
/**
|
|
7
|
+
* Loads custom linter rules from the user's project
|
|
8
|
+
*/
|
|
9
|
+
export class CustomRuleLoader {
|
|
10
|
+
baseDir;
|
|
11
|
+
patterns;
|
|
12
|
+
silent;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.baseDir = options.baseDir || process.cwd();
|
|
15
|
+
this.patterns = options.patterns || DEFAULT_PATTERNS;
|
|
16
|
+
this.silent = options.silent || false;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Discovers custom rule files in the project
|
|
20
|
+
*/
|
|
21
|
+
async discoverRuleFiles() {
|
|
22
|
+
const allFiles = [];
|
|
23
|
+
for (const pattern of this.patterns) {
|
|
24
|
+
try {
|
|
25
|
+
const files = await glob(pattern, {
|
|
26
|
+
cwd: this.baseDir,
|
|
27
|
+
absolute: true,
|
|
28
|
+
nodir: true
|
|
29
|
+
});
|
|
30
|
+
allFiles.push(...files);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (!this.silent) {
|
|
34
|
+
console.warn(`Warning: Failed to search pattern "${pattern}": ${error}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [...new Set(allFiles)];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Loads a single rule file
|
|
42
|
+
*/
|
|
43
|
+
async loadRuleFile(filePath) {
|
|
44
|
+
try {
|
|
45
|
+
const fileUrl = pathToFileURL(filePath).href;
|
|
46
|
+
const cacheBustedUrl = `${fileUrl}?t=${Date.now()}`;
|
|
47
|
+
const module = await import(cacheBustedUrl);
|
|
48
|
+
if (module.default && this.isValidRuleClass(module.default)) {
|
|
49
|
+
return [module.default];
|
|
50
|
+
}
|
|
51
|
+
if (!this.silent) {
|
|
52
|
+
console.warn(`Warning: No valid default export found in "${filePath}". Custom rules must use default export.`);
|
|
53
|
+
}
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (!this.silent) {
|
|
58
|
+
console.error(`Error loading rule file "${filePath}": ${error}`);
|
|
59
|
+
}
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Type guard to check if an export is a valid rule class
|
|
65
|
+
*/
|
|
66
|
+
isValidRuleClass(value) {
|
|
67
|
+
if (typeof value !== 'function')
|
|
68
|
+
return false;
|
|
69
|
+
if (!value.prototype)
|
|
70
|
+
return false;
|
|
71
|
+
const instance = new value();
|
|
72
|
+
return typeof instance.check === 'function' && typeof instance.name === 'string';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Loads all custom rules from the project
|
|
76
|
+
*/
|
|
77
|
+
async loadRules() {
|
|
78
|
+
const ruleFiles = await this.discoverRuleFiles();
|
|
79
|
+
if (ruleFiles.length === 0) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const allRules = [];
|
|
83
|
+
for (const filePath of ruleFiles) {
|
|
84
|
+
const rules = await this.loadRuleFile(filePath);
|
|
85
|
+
allRules.push(...rules);
|
|
86
|
+
}
|
|
87
|
+
return allRules;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Loads all custom rules and returns detailed information about each rule
|
|
91
|
+
*/
|
|
92
|
+
async loadRulesWithInfo() {
|
|
93
|
+
const ruleFiles = await this.discoverRuleFiles();
|
|
94
|
+
if (ruleFiles.length === 0) {
|
|
95
|
+
return { rules: [], ruleInfo: [], duplicateWarnings: [] };
|
|
96
|
+
}
|
|
97
|
+
const allRules = [];
|
|
98
|
+
const ruleInfo = [];
|
|
99
|
+
const duplicateWarnings = [];
|
|
100
|
+
const seenNames = new Map();
|
|
101
|
+
for (const filePath of ruleFiles) {
|
|
102
|
+
const rules = await this.loadRuleFile(filePath);
|
|
103
|
+
for (const RuleClass of rules) {
|
|
104
|
+
const instance = new RuleClass();
|
|
105
|
+
const ruleName = instance.name;
|
|
106
|
+
if (seenNames.has(ruleName)) {
|
|
107
|
+
const firstPath = seenNames.get(ruleName);
|
|
108
|
+
duplicateWarnings.push(`Custom rule "${ruleName}" is defined in multiple files: "${firstPath}" and "${filePath}". The later one will be used.`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
seenNames.set(ruleName, filePath);
|
|
112
|
+
}
|
|
113
|
+
allRules.push(RuleClass);
|
|
114
|
+
ruleInfo.push({
|
|
115
|
+
name: ruleName,
|
|
116
|
+
path: filePath
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { rules: allRules, ruleInfo, duplicateWarnings };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Static helper to check if custom rules exist in a project
|
|
124
|
+
*/
|
|
125
|
+
static async hasCustomRules(baseDir = process.cwd()) {
|
|
126
|
+
const loader = new CustomRuleLoader({ baseDir, silent: true });
|
|
127
|
+
const files = await loader.discoverRuleFiles();
|
|
128
|
+
return files.length > 0;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Static helper to load custom rules and merge with default rules
|
|
132
|
+
*/
|
|
133
|
+
static async loadAndMergeRules(defaultRules, options = {}) {
|
|
134
|
+
const loader = new CustomRuleLoader(options);
|
|
135
|
+
const customRules = await loader.loadRules();
|
|
136
|
+
return [...defaultRules, ...customRules];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=custom-rule-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-rule-loader.js","sourceRoot":"","sources":["../../src/custom-rule-loader.ts"],"names":[],"mappings":"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"}
|