@herb-tools/linter 0.8.9 → 0.9.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 +5 -5
- package/dist/{src/cli → cli}/argument-parser.js +15 -2
- package/dist/cli/argument-parser.js.map +1 -0
- package/dist/{src/cli → cli}/file-processor.js +155 -9
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/file-url.js +6 -0
- package/dist/cli/file-url.js.map +1 -0
- package/dist/cli/formatters/base-formatter.js.map +1 -0
- package/dist/{src/cli → cli}/formatters/detailed-formatter.js +16 -19
- package/dist/cli/formatters/detailed-formatter.js.map +1 -0
- package/dist/cli/formatters/github-actions-formatter.js.map +1 -0
- package/dist/cli/formatters/index.js.map +1 -0
- package/dist/cli/formatters/json-formatter.js.map +1 -0
- package/dist/cli/formatters/simple-formatter.js +54 -0
- package/dist/cli/formatters/simple-formatter.js.map +1 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lint-worker.js +143 -0
- package/dist/cli/lint-worker.js.map +1 -0
- package/dist/cli/output-manager.js.map +1 -0
- package/dist/{src/cli → cli}/summary-reporter.js +13 -16
- package/dist/cli/summary-reporter.js.map +1 -0
- package/dist/{src/cli.js → cli.js} +5 -3
- package/dist/cli.js.map +1 -0
- package/dist/{src/custom-rule-loader.js → custom-rule-loader.js} +20 -4
- package/dist/custom-rule-loader.js.map +1 -0
- package/dist/herb-disable-comment-utils.js.map +1 -0
- package/dist/herb-lint.js +60648 -17513
- package/dist/herb-lint.js.map +1 -1
- package/dist/index.cjs +2621 -934
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2554 -873
- package/dist/index.js.map +1 -1
- package/dist/lint-worker.js +71462 -0
- package/dist/lint-worker.js.map +1 -0
- package/dist/linter-ignore.js.map +1 -0
- package/dist/{src/linter.js → linter.js} +89 -74
- package/dist/linter.js.map +1 -0
- package/dist/loader.cjs +31206 -7834
- package/dist/loader.cjs.map +1 -1
- package/dist/loader.js +31168 -7802
- package/dist/loader.js.map +1 -1
- package/dist/parse-cache.js +30 -0
- package/dist/parse-cache.js.map +1 -0
- package/dist/rules/actionview-no-silent-helper.js +45 -0
- package/dist/rules/actionview-no-silent-helper.js.map +1 -0
- package/dist/{src/rules → rules}/erb-comment-syntax.js +2 -2
- package/dist/rules/erb-comment-syntax.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-case-node-children.js +2 -2
- package/dist/rules/erb-no-case-node-children.js.map +1 -0
- package/dist/rules/erb-no-conditional-html-element.js +38 -0
- package/dist/rules/erb-no-conditional-html-element.js.map +1 -0
- package/dist/rules/erb-no-conditional-open-tag.js +24 -0
- package/dist/rules/erb-no-conditional-open-tag.js.map +1 -0
- package/dist/rules/erb-no-duplicate-branch-elements.js +245 -0
- package/dist/rules/erb-no-duplicate-branch-elements.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-empty-tags.js +2 -2
- package/dist/rules/erb-no-empty-tags.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-extra-newline.js +4 -21
- package/dist/rules/erb-no-extra-newline.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-extra-whitespace-inside-tags.js +39 -13
- package/dist/rules/erb-no-extra-whitespace-inside-tags.js.map +1 -0
- package/dist/rules/erb-no-inline-case-conditions.js +40 -0
- package/dist/rules/erb-no-inline-case-conditions.js.map +1 -0
- package/dist/rules/erb-no-instance-variables-in-partials.js +67 -0
- package/dist/rules/erb-no-instance-variables-in-partials.js.map +1 -0
- package/dist/rules/erb-no-interpolated-class-names.js +47 -0
- package/dist/rules/erb-no-interpolated-class-names.js.map +1 -0
- package/dist/rules/erb-no-javascript-tag-helper.js +34 -0
- package/dist/rules/erb-no-javascript-tag-helper.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-output-control-flow.js +9 -12
- package/dist/rules/erb-no-output-control-flow.js.map +1 -0
- package/dist/rules/erb-no-output-in-attribute-name.js +30 -0
- package/dist/rules/erb-no-output-in-attribute-name.js.map +1 -0
- package/dist/rules/erb-no-output-in-attribute-position.js +30 -0
- package/dist/rules/erb-no-output-in-attribute-position.js.map +1 -0
- package/dist/rules/erb-no-raw-output-in-attribute-value.js +35 -0
- package/dist/rules/erb-no-raw-output-in-attribute-value.js.map +1 -0
- package/dist/{src/rules → rules}/erb-no-silent-tag-in-attribute-name.js +2 -2
- package/dist/rules/erb-no-silent-tag-in-attribute-name.js.map +1 -0
- package/dist/rules/erb-no-statement-in-script.js +58 -0
- package/dist/rules/erb-no-statement-in-script.js.map +1 -0
- package/dist/rules/erb-no-then-in-control-flow.js +45 -0
- package/dist/rules/erb-no-then-in-control-flow.js.map +1 -0
- package/dist/rules/erb-no-trailing-whitespace.js +138 -0
- package/dist/rules/erb-no-trailing-whitespace.js.map +1 -0
- package/dist/rules/erb-no-unsafe-js-attribute.js +36 -0
- package/dist/rules/erb-no-unsafe-js-attribute.js.map +1 -0
- package/dist/rules/erb-no-unsafe-raw.js +63 -0
- package/dist/rules/erb-no-unsafe-raw.js.map +1 -0
- package/dist/rules/erb-no-unsafe-script-interpolation.js +54 -0
- package/dist/rules/erb-no-unsafe-script-interpolation.js.map +1 -0
- package/dist/{src/rules → rules}/erb-prefer-image-tag-helper.js +5 -4
- package/dist/rules/erb-prefer-image-tag-helper.js.map +1 -0
- package/dist/{src/rules → rules}/erb-require-trailing-newline.js +2 -2
- package/dist/rules/erb-require-trailing-newline.js.map +1 -0
- package/dist/{src/rules → rules}/erb-require-whitespace-inside-tags.js +39 -15
- package/dist/rules/erb-require-whitespace-inside-tags.js.map +1 -0
- package/dist/{src/rules → rules}/erb-right-trim.js +2 -2
- package/dist/rules/erb-right-trim.js.map +1 -0
- package/dist/{src/rules → rules}/erb-strict-locals-comment-syntax.js +5 -5
- package/dist/rules/erb-strict-locals-comment-syntax.js.map +1 -0
- package/dist/{src/rules → rules}/erb-strict-locals-required.js +2 -2
- package/dist/rules/erb-strict-locals-required.js.map +1 -0
- package/dist/rules/file-utils.js.map +1 -0
- package/dist/rules/herb-disable-comment-base.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-malformed.js +2 -2
- package/dist/rules/herb-disable-comment-malformed.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-missing-rules.js +2 -2
- package/dist/rules/herb-disable-comment-missing-rules.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-no-duplicate-rules.js +2 -2
- package/dist/rules/herb-disable-comment-no-duplicate-rules.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-no-redundant-all.js +2 -2
- package/dist/rules/herb-disable-comment-no-redundant-all.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-unnecessary.js +2 -2
- package/dist/rules/herb-disable-comment-unnecessary.js.map +1 -0
- package/dist/{src/rules → rules}/herb-disable-comment-valid-rule-name.js +2 -2
- package/dist/rules/herb-disable-comment-valid-rule-name.js.map +1 -0
- package/dist/rules/html-allowed-script-type.js +57 -0
- package/dist/rules/html-allowed-script-type.js.map +1 -0
- package/dist/rules/html-anchor-require-href.js +68 -0
- package/dist/rules/html-anchor-require-href.js.map +1 -0
- package/dist/{src/rules → rules}/html-aria-attribute-must-be-valid.js +3 -3
- package/dist/rules/html-aria-attribute-must-be-valid.js.map +1 -0
- package/dist/{src/rules → rules}/html-aria-label-is-well-formatted.js +3 -3
- package/dist/rules/html-aria-label-is-well-formatted.js.map +1 -0
- package/dist/{src/rules → rules}/html-aria-level-must-be-valid.js +3 -3
- package/dist/rules/html-aria-level-must-be-valid.js.map +1 -0
- package/dist/{src/rules → rules}/html-aria-role-heading-requires-level.js +5 -4
- package/dist/rules/html-aria-role-heading-requires-level.js.map +1 -0
- package/dist/{src/rules → rules}/html-aria-role-must-be-valid.js +3 -3
- package/dist/rules/html-aria-role-must-be-valid.js.map +1 -0
- package/dist/{src/rules → rules}/html-attribute-double-quotes.js +4 -4
- package/dist/rules/html-attribute-double-quotes.js.map +1 -0
- package/dist/{src/rules → rules}/html-attribute-equals-spacing.js +2 -2
- package/dist/rules/html-attribute-equals-spacing.js.map +1 -0
- package/dist/{src/rules → rules}/html-attribute-values-require-quotes.js +2 -2
- package/dist/rules/html-attribute-values-require-quotes.js.map +1 -0
- package/dist/{src/rules → rules}/html-avoid-both-disabled-and-aria-disabled.js +9 -9
- package/dist/rules/html-avoid-both-disabled-and-aria-disabled.js.map +1 -0
- package/dist/{src/rules → rules}/html-body-only-elements.js +5 -4
- package/dist/rules/html-body-only-elements.js.map +1 -0
- package/dist/{src/rules → rules}/html-boolean-attributes-no-value.js +4 -3
- package/dist/rules/html-boolean-attributes-no-value.js.map +1 -0
- package/dist/rules/html-details-has-summary.js +52 -0
- package/dist/rules/html-details-has-summary.js.map +1 -0
- package/dist/{src/rules → rules}/html-head-only-elements.js +6 -5
- package/dist/rules/html-head-only-elements.js.map +1 -0
- package/dist/{src/rules → rules}/html-iframe-has-title.js +8 -11
- package/dist/rules/html-iframe-has-title.js.map +1 -0
- package/dist/{src/rules → rules}/html-img-require-alt.js +11 -5
- package/dist/rules/html-img-require-alt.js.map +1 -0
- package/dist/{src/rules → rules}/html-input-require-autocomplete.js +7 -10
- package/dist/rules/html-input-require-autocomplete.js.map +1 -0
- package/dist/{src/rules → rules}/html-navigation-has-label.js +6 -5
- package/dist/rules/html-navigation-has-label.js.map +1 -0
- package/dist/rules/html-no-abstract-roles.js +29 -0
- package/dist/rules/html-no-abstract-roles.js.map +1 -0
- package/dist/rules/html-no-aria-hidden-on-body.js +42 -0
- package/dist/rules/html-no-aria-hidden-on-body.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-aria-hidden-on-focusable.js +6 -5
- package/dist/rules/html-no-aria-hidden-on-focusable.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-block-inside-inline.js +6 -9
- package/dist/rules/html-no-block-inside-inline.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-duplicate-attributes.js +4 -3
- package/dist/rules/html-no-duplicate-attributes.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-duplicate-ids.js +14 -11
- package/dist/rules/html-no-duplicate-ids.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-duplicate-meta-names.js +22 -20
- package/dist/rules/html-no-duplicate-meta-names.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-empty-attributes.js +2 -2
- package/dist/rules/html-no-empty-attributes.js.map +1 -0
- package/dist/rules/html-no-empty-headings.js +98 -0
- package/dist/rules/html-no-empty-headings.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-nested-links.js +23 -15
- package/dist/rules/html-no-nested-links.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-positive-tab-index.js +3 -3
- package/dist/rules/html-no-positive-tab-index.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-self-closing.js +4 -4
- package/dist/rules/html-no-self-closing.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-space-in-tag.js +4 -6
- package/dist/rules/html-no-space-in-tag.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-title-attribute.js +6 -5
- package/dist/rules/html-no-title-attribute.js.map +1 -0
- package/dist/{src/rules → rules}/html-no-underscores-in-attribute-names.js +2 -2
- package/dist/rules/html-no-underscores-in-attribute-names.js.map +1 -0
- package/dist/rules/html-require-closing-tags.js +29 -0
- package/dist/rules/html-require-closing-tags.js.map +1 -0
- package/dist/{src/rules → rules}/html-tag-name-lowercase.js +13 -9
- package/dist/rules/html-tag-name-lowercase.js.map +1 -0
- package/dist/{src/rules → rules}/index.js +19 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/{src/rules → rules}/parser-no-errors.js +3 -3
- package/dist/rules/parser-no-errors.js.map +1 -0
- package/dist/{src/rules → rules}/rule-utils.js +141 -219
- package/dist/rules/rule-utils.js.map +1 -0
- package/dist/rules/string-utils.js.map +1 -0
- package/dist/{src/rules → rules}/svg-tag-name-capitalization.js +7 -6
- package/dist/rules/svg-tag-name-capitalization.js.map +1 -0
- package/dist/rules/turbo-permanent-require-id.js +34 -0
- package/dist/rules/turbo-permanent-require-id.js.map +1 -0
- package/dist/{src/rules.js → rules.js} +56 -10
- package/dist/rules.js.map +1 -0
- package/dist/types/cli/argument-parser.d.ts +1 -0
- package/dist/types/cli/file-processor.d.ts +13 -0
- package/dist/types/cli/file-url.d.ts +1 -0
- package/dist/types/cli/index.d.ts +1 -0
- package/dist/types/cli/lint-worker.d.ts +34 -0
- package/dist/types/custom-rule-loader.d.ts +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/linter.d.ts +13 -6
- package/dist/types/parse-cache.d.ts +9 -0
- package/dist/types/{src/rules/html-aria-level-must-be-valid.d.ts → rules/actionview-no-silent-helper.d.ts} +4 -3
- package/dist/types/rules/erb-comment-syntax.d.ts +1 -1
- package/dist/types/rules/erb-no-case-node-children.d.ts +1 -1
- package/dist/types/{src/rules/herb-disable-comment-malformed.d.ts → rules/erb-no-conditional-html-element.d.ts} +3 -3
- package/dist/types/{src/rules/erb-prefer-image-tag-helper.d.ts → rules/erb-no-conditional-open-tag.d.ts} +3 -3
- package/dist/types/rules/erb-no-duplicate-branch-elements.d.ts +17 -0
- package/dist/types/rules/erb-no-empty-tags.d.ts +1 -1
- package/dist/types/rules/erb-no-extra-newline.d.ts +1 -1
- package/dist/types/rules/erb-no-extra-whitespace-inside-tags.d.ts +1 -1
- package/dist/types/{src/rules/html-no-duplicate-attributes.d.ts → rules/erb-no-inline-case-conditions.d.ts} +4 -3
- package/dist/types/rules/erb-no-instance-variables-in-partials.d.ts +10 -0
- package/dist/types/{src/rules/html-no-aria-hidden-on-focusable.d.ts → rules/erb-no-interpolated-class-names.d.ts} +2 -2
- package/dist/types/{src/rules/html-aria-attribute-must-be-valid.d.ts → rules/erb-no-javascript-tag-helper.d.ts} +2 -2
- package/dist/types/rules/erb-no-output-control-flow.d.ts +1 -1
- package/dist/types/{src/rules/erb-no-silent-tag-in-attribute-name.d.ts → rules/erb-no-output-in-attribute-name.d.ts} +2 -2
- package/dist/types/{src/rules/herb-disable-comment-missing-rules.d.ts → rules/erb-no-output-in-attribute-position.d.ts} +2 -2
- package/dist/types/{src/rules/erb-no-empty-tags.d.ts → rules/erb-no-raw-output-in-attribute-value.d.ts} +2 -2
- package/dist/types/rules/erb-no-silent-tag-in-attribute-name.d.ts +1 -1
- package/dist/types/{src/rules/html-navigation-has-label.d.ts → rules/erb-no-statement-in-script.d.ts} +2 -2
- package/dist/types/rules/erb-no-then-in-control-flow.d.ts +9 -0
- package/dist/types/rules/erb-no-trailing-whitespace.d.ts +19 -0
- package/dist/types/{src/rules/html-no-positive-tab-index.d.ts → rules/erb-no-unsafe-js-attribute.d.ts} +2 -2
- package/dist/types/{src/rules/erb-no-case-node-children.d.ts → rules/erb-no-unsafe-raw.d.ts} +2 -2
- package/dist/types/rules/erb-no-unsafe-script-interpolation.d.ts +8 -0
- package/dist/types/rules/erb-prefer-image-tag-helper.d.ts +1 -1
- package/dist/types/rules/erb-require-trailing-newline.d.ts +1 -1
- package/dist/types/rules/erb-require-whitespace-inside-tags.d.ts +1 -1
- package/dist/types/rules/erb-right-trim.d.ts +1 -1
- package/dist/types/rules/erb-strict-locals-comment-syntax.d.ts +1 -1
- package/dist/types/rules/erb-strict-locals-required.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-malformed.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-missing-rules.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-no-duplicate-rules.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-no-redundant-all.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-unnecessary.d.ts +1 -1
- package/dist/types/rules/herb-disable-comment-valid-rule-name.d.ts +1 -1
- package/dist/types/{src/rules/html-anchor-require-href.d.ts → rules/html-allowed-script-type.d.ts} +2 -2
- package/dist/types/rules/html-anchor-require-href.d.ts +3 -2
- package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +1 -1
- package/dist/types/rules/html-aria-label-is-well-formatted.d.ts +1 -1
- package/dist/types/rules/html-aria-level-must-be-valid.d.ts +1 -1
- package/dist/types/rules/html-aria-role-heading-requires-level.d.ts +1 -1
- package/dist/types/rules/html-aria-role-must-be-valid.d.ts +1 -1
- package/dist/types/rules/html-attribute-double-quotes.d.ts +1 -1
- package/dist/types/rules/html-attribute-equals-spacing.d.ts +1 -1
- package/dist/types/rules/html-attribute-values-require-quotes.d.ts +1 -1
- package/dist/types/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +1 -1
- package/dist/types/rules/html-body-only-elements.d.ts +1 -1
- package/dist/types/rules/html-boolean-attributes-no-value.d.ts +1 -1
- package/dist/types/{src/rules/html-no-empty-attributes.d.ts → rules/html-details-has-summary.d.ts} +4 -3
- package/dist/types/rules/html-head-only-elements.d.ts +1 -1
- package/dist/types/rules/html-iframe-has-title.d.ts +1 -1
- package/dist/types/rules/html-img-require-alt.d.ts +1 -1
- package/dist/types/rules/html-input-require-autocomplete.d.ts +1 -1
- package/dist/types/rules/html-navigation-has-label.d.ts +1 -1
- package/dist/types/{src/rules/html-no-empty-headings.d.ts → rules/html-no-abstract-roles.d.ts} +2 -2
- package/dist/types/{src/rules/erb-no-output-control-flow.d.ts → rules/html-no-aria-hidden-on-body.d.ts} +3 -3
- package/dist/types/rules/html-no-aria-hidden-on-focusable.d.ts +1 -1
- package/dist/types/rules/html-no-block-inside-inline.d.ts +1 -1
- package/dist/types/rules/html-no-duplicate-attributes.d.ts +1 -1
- package/dist/types/rules/html-no-duplicate-ids.d.ts +1 -1
- package/dist/types/rules/html-no-duplicate-meta-names.d.ts +1 -1
- package/dist/types/rules/html-no-empty-attributes.d.ts +1 -1
- package/dist/types/rules/html-no-empty-headings.d.ts +1 -1
- package/dist/types/rules/html-no-nested-links.d.ts +1 -1
- package/dist/types/rules/html-no-positive-tab-index.d.ts +1 -1
- package/dist/types/rules/html-no-self-closing.d.ts +1 -1
- package/dist/types/rules/html-no-space-in-tag.d.ts +1 -1
- package/dist/types/rules/html-no-title-attribute.d.ts +1 -1
- package/dist/types/rules/html-no-underscores-in-attribute-names.d.ts +1 -1
- package/dist/types/{src/rules/html-body-only-elements.d.ts → rules/html-require-closing-tags.d.ts} +4 -3
- package/dist/types/rules/html-tag-name-lowercase.d.ts +1 -1
- package/dist/types/rules/index.d.ts +19 -0
- package/dist/types/rules/parser-no-errors.d.ts +1 -1
- package/dist/types/rules/rule-utils.d.ts +35 -88
- package/dist/types/rules/svg-tag-name-capitalization.d.ts +1 -1
- package/dist/types/{src/rules/html-aria-role-must-be-valid.d.ts → rules/turbo-permanent-require-id.d.ts} +2 -2
- package/dist/types/types.d.ts +25 -7
- package/dist/types/urls.d.ts +1 -0
- package/dist/{src/types.js → types.js} +53 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.js +5 -0
- package/dist/urls.js.map +1 -0
- package/docs/rules/README.md +23 -2
- package/docs/rules/actionview-no-silent-helper.md +57 -0
- package/docs/rules/erb-no-conditional-html-element.md +90 -0
- package/docs/rules/erb-no-conditional-open-tag.md +130 -0
- package/docs/rules/erb-no-duplicate-branch-elements.md +98 -0
- package/docs/rules/erb-no-inline-case-conditions.md +85 -0
- package/docs/rules/erb-no-instance-variables-in-partials.md +43 -0
- package/docs/rules/erb-no-interpolated-class-names.md +57 -0
- package/docs/rules/erb-no-javascript-tag-helper.md +33 -0
- package/docs/rules/erb-no-output-in-attribute-name.md +38 -0
- package/docs/rules/erb-no-output-in-attribute-position.md +60 -0
- package/docs/rules/erb-no-raw-output-in-attribute-value.md +37 -0
- package/docs/rules/erb-no-statement-in-script.md +68 -0
- package/docs/rules/erb-no-then-in-control-flow.md +86 -0
- package/docs/rules/erb-no-trailing-whitespace.md +69 -0
- package/docs/rules/erb-no-unsafe-js-attribute.md +41 -0
- package/docs/rules/erb-no-unsafe-raw.md +47 -0
- package/docs/rules/erb-no-unsafe-script-interpolation.md +73 -0
- package/docs/rules/html-allowed-script-type.md +59 -0
- package/docs/rules/html-anchor-require-href.md +19 -6
- package/docs/rules/html-details-has-summary.md +46 -0
- package/docs/rules/html-img-require-alt.md +5 -3
- package/docs/rules/html-no-abstract-roles.md +74 -0
- package/docs/rules/html-no-aria-hidden-on-body.md +44 -0
- package/docs/rules/html-require-closing-tags.md +142 -0
- package/docs/rules/parser-no-errors.md +4 -17
- package/docs/rules/turbo-permanent-require-id.md +41 -0
- package/package.json +12 -11
- package/src/cli/argument-parser.ts +20 -2
- package/src/cli/file-processor.ts +189 -10
- package/src/cli/file-url.ts +6 -0
- package/src/cli/formatters/detailed-formatter.ts +19 -21
- package/src/cli/formatters/simple-formatter.ts +23 -13
- package/src/cli/index.ts +2 -0
- package/src/cli/lint-worker.ts +208 -0
- package/src/cli/summary-reporter.ts +14 -15
- package/src/cli.ts +5 -3
- package/src/custom-rule-loader.ts +20 -5
- package/src/herb-disable-comment-utils.ts +0 -3
- package/src/index.ts +1 -0
- package/src/linter.ts +98 -79
- package/src/parse-cache.ts +39 -0
- package/src/rules/actionview-no-silent-helper.ts +58 -0
- package/src/rules/erb-comment-syntax.ts +2 -2
- package/src/rules/erb-no-case-node-children.ts +2 -2
- package/src/rules/erb-no-conditional-html-element.ts +53 -0
- package/src/rules/erb-no-conditional-open-tag.ts +37 -0
- package/src/rules/erb-no-duplicate-branch-elements.ts +320 -0
- package/src/rules/erb-no-empty-tags.ts +2 -2
- package/src/rules/erb-no-extra-newline.ts +5 -25
- package/src/rules/erb-no-extra-whitespace-inside-tags.ts +45 -15
- package/src/rules/erb-no-inline-case-conditions.ts +54 -0
- package/src/rules/erb-no-instance-variables-in-partials.ts +101 -0
- package/src/rules/erb-no-interpolated-class-names.ts +65 -0
- package/src/rules/erb-no-javascript-tag-helper.ts +47 -0
- package/src/rules/erb-no-output-control-flow.ts +10 -10
- package/src/rules/erb-no-output-in-attribute-name.ts +39 -0
- package/src/rules/erb-no-output-in-attribute-position.ts +39 -0
- package/src/rules/erb-no-raw-output-in-attribute-value.ts +47 -0
- package/src/rules/erb-no-silent-tag-in-attribute-name.ts +2 -2
- package/src/rules/erb-no-statement-in-script.ts +82 -0
- package/src/rules/erb-no-then-in-control-flow.ts +62 -0
- package/src/rules/erb-no-trailing-whitespace.ts +187 -0
- package/src/rules/erb-no-unsafe-js-attribute.ts +47 -0
- package/src/rules/erb-no-unsafe-raw.ts +83 -0
- package/src/rules/erb-no-unsafe-script-interpolation.ts +76 -0
- package/src/rules/erb-prefer-image-tag-helper.ts +5 -4
- package/src/rules/erb-require-trailing-newline.ts +2 -2
- package/src/rules/erb-require-whitespace-inside-tags.ts +42 -18
- package/src/rules/erb-right-trim.ts +2 -2
- package/src/rules/erb-strict-locals-comment-syntax.ts +5 -5
- package/src/rules/erb-strict-locals-required.ts +2 -2
- package/src/rules/herb-disable-comment-malformed.ts +2 -2
- package/src/rules/herb-disable-comment-missing-rules.ts +2 -2
- package/src/rules/herb-disable-comment-no-duplicate-rules.ts +2 -2
- package/src/rules/herb-disable-comment-no-redundant-all.ts +2 -2
- package/src/rules/herb-disable-comment-unnecessary.ts +2 -2
- package/src/rules/herb-disable-comment-valid-rule-name.ts +2 -2
- package/src/rules/html-allowed-script-type.ts +84 -0
- package/src/rules/html-anchor-require-href.ts +73 -11
- package/src/rules/html-aria-attribute-must-be-valid.ts +3 -3
- package/src/rules/html-aria-label-is-well-formatted.ts +3 -3
- package/src/rules/html-aria-level-must-be-valid.ts +3 -3
- package/src/rules/html-aria-role-heading-requires-level.ts +5 -4
- package/src/rules/html-aria-role-must-be-valid.ts +3 -3
- package/src/rules/html-attribute-double-quotes.ts +4 -4
- package/src/rules/html-attribute-equals-spacing.ts +2 -2
- package/src/rules/html-attribute-values-require-quotes.ts +2 -2
- package/src/rules/html-avoid-both-disabled-and-aria-disabled.ts +10 -11
- package/src/rules/html-body-only-elements.ts +5 -4
- package/src/rules/html-boolean-attributes-no-value.ts +4 -3
- package/src/rules/html-details-has-summary.ts +69 -0
- package/src/rules/html-head-only-elements.ts +6 -5
- package/src/rules/html-iframe-has-title.ts +8 -11
- package/src/rules/html-img-require-alt.ts +16 -5
- package/src/rules/html-input-require-autocomplete.ts +7 -10
- package/src/rules/html-navigation-has-label.ts +6 -5
- package/src/rules/html-no-abstract-roles.ts +40 -0
- package/src/rules/html-no-aria-hidden-on-body.ts +58 -0
- package/src/rules/html-no-aria-hidden-on-focusable.ts +6 -5
- package/src/rules/html-no-block-inside-inline.ts +7 -13
- package/src/rules/html-no-duplicate-attributes.ts +4 -3
- package/src/rules/html-no-duplicate-ids.ts +16 -13
- package/src/rules/html-no-duplicate-meta-names.ts +20 -19
- package/src/rules/html-no-empty-attributes.ts +2 -2
- package/src/rules/html-no-empty-headings.ts +44 -58
- package/src/rules/html-no-nested-links.ts +25 -16
- package/src/rules/html-no-positive-tab-index.ts +3 -3
- package/src/rules/html-no-self-closing.ts +5 -5
- package/src/rules/html-no-space-in-tag.ts +5 -8
- package/src/rules/html-no-title-attribute.ts +6 -5
- package/src/rules/html-no-underscores-in-attribute-names.ts +2 -2
- package/src/rules/html-require-closing-tags.ts +41 -0
- package/src/rules/html-tag-name-lowercase.ts +14 -9
- package/src/rules/index.ts +19 -0
- package/src/rules/parser-no-errors.ts +3 -3
- package/src/rules/rule-utils.ts +162 -279
- package/src/rules/svg-tag-name-capitalization.ts +10 -10
- package/src/rules/turbo-permanent-require-id.ts +49 -0
- package/src/rules.ts +60 -10
- package/src/types.ts +76 -7
- package/src/urls.ts +5 -0
- package/dist/package.json +0 -65
- package/dist/src/cli/argument-parser.js.map +0 -1
- package/dist/src/cli/file-processor.js.map +0 -1
- package/dist/src/cli/formatters/base-formatter.js.map +0 -1
- package/dist/src/cli/formatters/detailed-formatter.js.map +0 -1
- package/dist/src/cli/formatters/github-actions-formatter.js.map +0 -1
- package/dist/src/cli/formatters/index.js.map +0 -1
- package/dist/src/cli/formatters/json-formatter.js.map +0 -1
- package/dist/src/cli/formatters/simple-formatter.js +0 -44
- package/dist/src/cli/formatters/simple-formatter.js.map +0 -1
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/output-manager.js.map +0 -1
- package/dist/src/cli/summary-reporter.js.map +0 -1
- package/dist/src/cli.js.map +0 -1
- package/dist/src/custom-rule-loader.js.map +0 -1
- package/dist/src/herb-disable-comment-utils.js.map +0 -1
- package/dist/src/herb-lint.js +0 -5
- package/dist/src/herb-lint.js.map +0 -1
- package/dist/src/index.js +0 -5
- package/dist/src/index.js.map +0 -1
- package/dist/src/linter-ignore.js.map +0 -1
- package/dist/src/linter.js.map +0 -1
- package/dist/src/loader.js +0 -17
- package/dist/src/loader.js.map +0 -1
- package/dist/src/rules/erb-comment-syntax.js.map +0 -1
- package/dist/src/rules/erb-no-case-node-children.js.map +0 -1
- package/dist/src/rules/erb-no-empty-tags.js.map +0 -1
- package/dist/src/rules/erb-no-extra-newline.js.map +0 -1
- package/dist/src/rules/erb-no-extra-whitespace-inside-tags.js.map +0 -1
- package/dist/src/rules/erb-no-output-control-flow.js.map +0 -1
- package/dist/src/rules/erb-no-silent-tag-in-attribute-name.js.map +0 -1
- package/dist/src/rules/erb-prefer-image-tag-helper.js.map +0 -1
- package/dist/src/rules/erb-require-trailing-newline.js.map +0 -1
- package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +0 -1
- package/dist/src/rules/erb-right-trim.js.map +0 -1
- package/dist/src/rules/erb-strict-locals-comment-syntax.js.map +0 -1
- package/dist/src/rules/erb-strict-locals-required.js.map +0 -1
- package/dist/src/rules/file-utils.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-base.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-malformed.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-missing-rules.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-no-duplicate-rules.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-no-redundant-all.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-unnecessary.js.map +0 -1
- package/dist/src/rules/herb-disable-comment-valid-rule-name.js.map +0 -1
- package/dist/src/rules/html-anchor-require-href.js +0 -32
- package/dist/src/rules/html-anchor-require-href.js.map +0 -1
- package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +0 -1
- package/dist/src/rules/html-aria-label-is-well-formatted.js.map +0 -1
- package/dist/src/rules/html-aria-level-must-be-valid.js.map +0 -1
- package/dist/src/rules/html-aria-role-heading-requires-level.js.map +0 -1
- package/dist/src/rules/html-aria-role-must-be-valid.js.map +0 -1
- package/dist/src/rules/html-attribute-double-quotes.js.map +0 -1
- package/dist/src/rules/html-attribute-equals-spacing.js.map +0 -1
- package/dist/src/rules/html-attribute-values-require-quotes.js.map +0 -1
- package/dist/src/rules/html-avoid-both-disabled-and-aria-disabled.js.map +0 -1
- package/dist/src/rules/html-body-only-elements.js.map +0 -1
- package/dist/src/rules/html-boolean-attributes-no-value.js.map +0 -1
- package/dist/src/rules/html-head-only-elements.js.map +0 -1
- package/dist/src/rules/html-iframe-has-title.js.map +0 -1
- package/dist/src/rules/html-img-require-alt.js.map +0 -1
- package/dist/src/rules/html-input-require-autocomplete.js.map +0 -1
- package/dist/src/rules/html-navigation-has-label.js.map +0 -1
- package/dist/src/rules/html-no-aria-hidden-on-focusable.js.map +0 -1
- package/dist/src/rules/html-no-block-inside-inline.js.map +0 -1
- package/dist/src/rules/html-no-duplicate-attributes.js.map +0 -1
- package/dist/src/rules/html-no-duplicate-ids.js.map +0 -1
- package/dist/src/rules/html-no-duplicate-meta-names.js.map +0 -1
- package/dist/src/rules/html-no-empty-attributes.js.map +0 -1
- package/dist/src/rules/html-no-empty-headings.js +0 -115
- package/dist/src/rules/html-no-empty-headings.js.map +0 -1
- package/dist/src/rules/html-no-nested-links.js.map +0 -1
- package/dist/src/rules/html-no-positive-tab-index.js.map +0 -1
- package/dist/src/rules/html-no-self-closing.js.map +0 -1
- package/dist/src/rules/html-no-space-in-tag.js.map +0 -1
- package/dist/src/rules/html-no-title-attribute.js.map +0 -1
- package/dist/src/rules/html-no-underscores-in-attribute-names.js.map +0 -1
- package/dist/src/rules/html-tag-name-lowercase.js.map +0 -1
- package/dist/src/rules/index.js.map +0 -1
- package/dist/src/rules/parser-no-errors.js.map +0 -1
- package/dist/src/rules/rule-utils.js.map +0 -1
- package/dist/src/rules/string-utils.js.map +0 -1
- package/dist/src/rules/svg-tag-name-capitalization.js.map +0 -1
- package/dist/src/rules.js.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types/src/cli/argument-parser.d.ts +0 -25
- package/dist/types/src/cli/file-processor.d.ts +0 -43
- package/dist/types/src/cli/formatters/base-formatter.d.ts +0 -6
- package/dist/types/src/cli/formatters/detailed-formatter.d.ts +0 -13
- package/dist/types/src/cli/formatters/github-actions-formatter.d.ts +0 -17
- package/dist/types/src/cli/formatters/index.d.ts +0 -5
- package/dist/types/src/cli/formatters/json-formatter.d.ts +0 -48
- package/dist/types/src/cli/formatters/simple-formatter.d.ts +0 -8
- package/dist/types/src/cli/index.d.ts +0 -5
- package/dist/types/src/cli/output-manager.d.ts +0 -32
- package/dist/types/src/cli/summary-reporter.d.ts +0 -28
- package/dist/types/src/cli.d.ts +0 -28
- package/dist/types/src/custom-rule-loader.d.ts +0 -62
- package/dist/types/src/herb-disable-comment-utils.d.ts +0 -69
- package/dist/types/src/herb-lint.d.ts +0 -2
- package/dist/types/src/index.d.ts +0 -4
- package/dist/types/src/linter-ignore.d.ts +0 -12
- package/dist/types/src/linter.d.ts +0 -133
- package/dist/types/src/loader.d.ts +0 -20
- package/dist/types/src/rules/erb-comment-syntax.d.ts +0 -14
- package/dist/types/src/rules/erb-no-extra-newline.d.ts +0 -14
- package/dist/types/src/rules/erb-no-extra-whitespace-inside-tags.d.ts +0 -18
- package/dist/types/src/rules/erb-require-trailing-newline.d.ts +0 -9
- package/dist/types/src/rules/erb-require-whitespace-inside-tags.d.ts +0 -18
- package/dist/types/src/rules/erb-right-trim.d.ts +0 -14
- package/dist/types/src/rules/erb-strict-locals-comment-syntax.d.ts +0 -9
- package/dist/types/src/rules/erb-strict-locals-required.d.ts +0 -9
- package/dist/types/src/rules/file-utils.d.ts +0 -13
- package/dist/types/src/rules/herb-disable-comment-base.d.ts +0 -37
- package/dist/types/src/rules/herb-disable-comment-no-duplicate-rules.d.ts +0 -8
- package/dist/types/src/rules/herb-disable-comment-no-redundant-all.d.ts +0 -8
- package/dist/types/src/rules/herb-disable-comment-unnecessary.d.ts +0 -8
- package/dist/types/src/rules/herb-disable-comment-valid-rule-name.d.ts +0 -8
- package/dist/types/src/rules/html-aria-label-is-well-formatted.d.ts +0 -8
- package/dist/types/src/rules/html-aria-role-heading-requires-level.d.ts +0 -8
- package/dist/types/src/rules/html-attribute-double-quotes.d.ts +0 -15
- package/dist/types/src/rules/html-attribute-equals-spacing.d.ts +0 -14
- package/dist/types/src/rules/html-attribute-values-require-quotes.d.ts +0 -15
- package/dist/types/src/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +0 -8
- package/dist/types/src/rules/html-boolean-attributes-no-value.d.ts +0 -14
- package/dist/types/src/rules/html-head-only-elements.d.ts +0 -9
- package/dist/types/src/rules/html-iframe-has-title.d.ts +0 -8
- package/dist/types/src/rules/html-img-require-alt.d.ts +0 -8
- package/dist/types/src/rules/html-input-require-autocomplete.d.ts +0 -8
- package/dist/types/src/rules/html-no-block-inside-inline.d.ts +0 -8
- package/dist/types/src/rules/html-no-duplicate-ids.d.ts +0 -8
- package/dist/types/src/rules/html-no-duplicate-meta-names.d.ts +0 -9
- package/dist/types/src/rules/html-no-nested-links.d.ts +0 -8
- package/dist/types/src/rules/html-no-self-closing.d.ts +0 -16
- package/dist/types/src/rules/html-no-space-in-tag.d.ts +0 -16
- package/dist/types/src/rules/html-no-title-attribute.d.ts +0 -8
- package/dist/types/src/rules/html-no-underscores-in-attribute-names.d.ts +0 -8
- package/dist/types/src/rules/html-tag-name-lowercase.d.ts +0 -18
- package/dist/types/src/rules/index.d.ts +0 -54
- package/dist/types/src/rules/parser-no-errors.d.ts +0 -9
- package/dist/types/src/rules/rule-utils.d.ts +0 -351
- package/dist/types/src/rules/string-utils.d.ts +0 -15
- package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +0 -16
- package/dist/types/src/rules.d.ts +0 -2
- package/dist/types/src/types.d.ts +0 -190
- /package/dist/{src/cli → cli}/formatters/base-formatter.js +0 -0
- /package/dist/{src/cli → cli}/formatters/github-actions-formatter.js +0 -0
- /package/dist/{src/cli → cli}/formatters/index.js +0 -0
- /package/dist/{src/cli → cli}/formatters/json-formatter.js +0 -0
- /package/dist/{src/cli → cli}/index.js +0 -0
- /package/dist/{src/cli → cli}/output-manager.js +0 -0
- /package/dist/{src/herb-disable-comment-utils.js → herb-disable-comment-utils.js} +0 -0
- /package/dist/{src/linter-ignore.js → linter-ignore.js} +0 -0
- /package/dist/{src/rules → rules}/file-utils.js +0 -0
- /package/dist/{src/rules → rules}/herb-disable-comment-base.js +0 -0
- /package/dist/{src/rules → rules}/string-utils.js +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BaseRuleVisitor } from "./rule-utils.js";
|
|
2
|
+
import { getAttribute } from "@herb-tools/core";
|
|
3
|
+
import { ParserRule } from "../types.js";
|
|
4
|
+
class TurboPermanentRequireIdVisitor extends BaseRuleVisitor {
|
|
5
|
+
visitHTMLOpenTagNode(node) {
|
|
6
|
+
this.checkTurboPermanent(node);
|
|
7
|
+
super.visitHTMLOpenTagNode(node);
|
|
8
|
+
}
|
|
9
|
+
checkTurboPermanent(node) {
|
|
10
|
+
const turboPermanentAttribute = getAttribute(node, "data-turbo-permanent");
|
|
11
|
+
if (!turboPermanentAttribute) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const idAttribute = getAttribute(node, "id");
|
|
15
|
+
if (!idAttribute) {
|
|
16
|
+
this.addOffense("Elements with `data-turbo-permanent` must have an `id` attribute. Without an `id`, Turbo can't track the element across page changes and the permanent behavior won't work as expected.", turboPermanentAttribute.location);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class TurboPermanentRequireIdRule extends ParserRule {
|
|
21
|
+
static ruleName = "turbo-permanent-require-id";
|
|
22
|
+
get defaultConfig() {
|
|
23
|
+
return {
|
|
24
|
+
enabled: true,
|
|
25
|
+
severity: "error"
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
check(result, context) {
|
|
29
|
+
const visitor = new TurboPermanentRequireIdVisitor(this.ruleName, context);
|
|
30
|
+
visitor.visit(result.value);
|
|
31
|
+
return visitor.offenses;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=turbo-permanent-require-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turbo-permanent-require-id.js","sourceRoot":"","sources":["../../src/rules/turbo-permanent-require-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,8BAA+B,SAAQ,eAAe;IAC1D,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAEO,mBAAmB,CAAC,IAAqB;QAC/C,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;QAE1E,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,CACb,yLAAyL,EACzL,uBAAuB,CAAC,QAAQ,CACjC,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,UAAU;IACzD,MAAM,CAAC,QAAQ,GAAG,4BAA4B,CAAA;IAE9C,IAAI,aAAa;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE1E,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC"}
|
|
@@ -1,22 +1,40 @@
|
|
|
1
|
+
import { ActionViewNoSilentHelperRule } from "./rules/actionview-no-silent-helper.js";
|
|
1
2
|
import { ERBCommentSyntax } from "./rules/erb-comment-syntax.js";
|
|
2
3
|
import { ERBNoCaseNodeChildrenRule } from "./rules/erb-no-case-node-children.js";
|
|
4
|
+
import { ERBNoConditionalHTMLElementRule } from "./rules/erb-no-conditional-html-element.js";
|
|
5
|
+
import { ERBNoConditionalOpenTagRule } from "./rules/erb-no-conditional-open-tag.js";
|
|
6
|
+
import { ERBNoDuplicateBranchElementsRule } from "./rules/erb-no-duplicate-branch-elements.js";
|
|
3
7
|
import { ERBNoEmptyTagsRule } from "./rules/erb-no-empty-tags.js";
|
|
4
8
|
import { ERBNoExtraNewLineRule } from "./rules/erb-no-extra-newline.js";
|
|
5
9
|
import { ERBNoExtraWhitespaceRule } from "./rules/erb-no-extra-whitespace-inside-tags.js";
|
|
10
|
+
import { ERBNoInlineCaseConditionsRule } from "./rules/erb-no-inline-case-conditions.js";
|
|
11
|
+
import { ERBNoInstanceVariablesInPartialsRule } from "./rules/erb-no-instance-variables-in-partials.js";
|
|
12
|
+
import { ERBNoInterpolatedClassNamesRule } from "./rules/erb-no-interpolated-class-names.js";
|
|
13
|
+
import { ERBNoJavascriptTagHelperRule } from "./rules/erb-no-javascript-tag-helper.js";
|
|
6
14
|
import { ERBNoOutputControlFlowRule } from "./rules/erb-no-output-control-flow.js";
|
|
15
|
+
import { ERBNoOutputInAttributeNameRule } from "./rules/erb-no-output-in-attribute-name.js";
|
|
16
|
+
import { ERBNoOutputInAttributePositionRule } from "./rules/erb-no-output-in-attribute-position.js";
|
|
17
|
+
import { ERBNoRawOutputInAttributeValueRule } from "./rules/erb-no-raw-output-in-attribute-value.js";
|
|
7
18
|
import { ERBNoSilentTagInAttributeNameRule } from "./rules/erb-no-silent-tag-in-attribute-name.js";
|
|
19
|
+
import { ERBNoStatementInScriptRule } from "./rules/erb-no-statement-in-script.js";
|
|
20
|
+
import { ERBNoThenInControlFlowRule } from "./rules/erb-no-then-in-control-flow.js";
|
|
21
|
+
import { ERBNoTrailingWhitespaceRule } from "./rules/erb-no-trailing-whitespace.js";
|
|
22
|
+
import { ERBNoUnsafeJSAttributeRule } from "./rules/erb-no-unsafe-js-attribute.js";
|
|
23
|
+
import { ERBNoUnsafeRawRule } from "./rules/erb-no-unsafe-raw.js";
|
|
24
|
+
import { ERBNoUnsafeScriptInterpolationRule } from "./rules/erb-no-unsafe-script-interpolation.js";
|
|
8
25
|
import { ERBPreferImageTagHelperRule } from "./rules/erb-prefer-image-tag-helper.js";
|
|
9
26
|
import { ERBRequireTrailingNewlineRule } from "./rules/erb-require-trailing-newline.js";
|
|
10
27
|
import { ERBRequireWhitespaceRule } from "./rules/erb-require-whitespace-inside-tags.js";
|
|
11
28
|
import { ERBRightTrimRule } from "./rules/erb-right-trim.js";
|
|
12
29
|
import { ERBStrictLocalsCommentSyntaxRule } from "./rules/erb-strict-locals-comment-syntax.js";
|
|
13
30
|
import { ERBStrictLocalsRequiredRule } from "./rules/erb-strict-locals-required.js";
|
|
14
|
-
import { HerbDisableCommentValidRuleNameRule } from "./rules/herb-disable-comment-valid-rule-name.js";
|
|
15
|
-
import { HerbDisableCommentNoRedundantAllRule } from "./rules/herb-disable-comment-no-redundant-all.js";
|
|
16
|
-
import { HerbDisableCommentNoDuplicateRulesRule } from "./rules/herb-disable-comment-no-duplicate-rules.js";
|
|
17
|
-
import { HerbDisableCommentMissingRulesRule } from "./rules/herb-disable-comment-missing-rules.js";
|
|
18
31
|
import { HerbDisableCommentMalformedRule } from "./rules/herb-disable-comment-malformed.js";
|
|
32
|
+
import { HerbDisableCommentMissingRulesRule } from "./rules/herb-disable-comment-missing-rules.js";
|
|
33
|
+
import { HerbDisableCommentNoDuplicateRulesRule } from "./rules/herb-disable-comment-no-duplicate-rules.js";
|
|
34
|
+
import { HerbDisableCommentNoRedundantAllRule } from "./rules/herb-disable-comment-no-redundant-all.js";
|
|
19
35
|
import { HerbDisableCommentUnnecessaryRule } from "./rules/herb-disable-comment-unnecessary.js";
|
|
36
|
+
import { HerbDisableCommentValidRuleNameRule } from "./rules/herb-disable-comment-valid-rule-name.js";
|
|
37
|
+
import { HTMLAllowedScriptTypeRule } from "./rules/html-allowed-script-type.js";
|
|
20
38
|
import { HTMLAnchorRequireHrefRule } from "./rules/html-anchor-require-href.js";
|
|
21
39
|
import { HTMLAriaAttributeMustBeValid } from "./rules/html-aria-attribute-must-be-valid.js";
|
|
22
40
|
import { HTMLAriaLabelIsWellFormattedRule } from "./rules/html-aria-label-is-well-formatted.js";
|
|
@@ -28,12 +46,15 @@ import { HTMLAttributeEqualsSpacingRule } from "./rules/html-attribute-equals-sp
|
|
|
28
46
|
import { HTMLAttributeValuesRequireQuotesRule } from "./rules/html-attribute-values-require-quotes.js";
|
|
29
47
|
import { HTMLAvoidBothDisabledAndAriaDisabledRule } from "./rules/html-avoid-both-disabled-and-aria-disabled.js";
|
|
30
48
|
import { HTMLBodyOnlyElementsRule } from "./rules/html-body-only-elements.js";
|
|
49
|
+
import { HTMLDetailsHasSummaryRule } from "./rules/html-details-has-summary.js";
|
|
31
50
|
import { HTMLBooleanAttributesNoValueRule } from "./rules/html-boolean-attributes-no-value.js";
|
|
32
51
|
import { HTMLHeadOnlyElementsRule } from "./rules/html-head-only-elements.js";
|
|
33
52
|
import { HTMLIframeHasTitleRule } from "./rules/html-iframe-has-title.js";
|
|
34
53
|
import { HTMLImgRequireAltRule } from "./rules/html-img-require-alt.js";
|
|
35
54
|
import { HTMLInputRequireAutocompleteRule } from "./rules/html-input-require-autocomplete.js";
|
|
36
55
|
import { HTMLNavigationHasLabelRule } from "./rules/html-navigation-has-label.js";
|
|
56
|
+
import { HTMLNoAbstractRolesRule } from "./rules/html-no-abstract-roles.js";
|
|
57
|
+
import { HTMLNoAriaHiddenOnBodyRule } from "./rules/html-no-aria-hidden-on-body.js";
|
|
37
58
|
import { HTMLNoAriaHiddenOnFocusableRule } from "./rules/html-no-aria-hidden-on-focusable.js";
|
|
38
59
|
import { HTMLNoBlockInsideInlineRule } from "./rules/html-no-block-inside-inline.js";
|
|
39
60
|
import { HTMLNoDuplicateAttributesRule } from "./rules/html-no-duplicate-attributes.js";
|
|
@@ -47,29 +68,49 @@ import { HTMLNoSelfClosingRule } from "./rules/html-no-self-closing.js";
|
|
|
47
68
|
import { HTMLNoSpaceInTagRule } from "./rules/html-no-space-in-tag.js";
|
|
48
69
|
import { HTMLNoTitleAttributeRule } from "./rules/html-no-title-attribute.js";
|
|
49
70
|
import { HTMLNoUnderscoresInAttributeNamesRule } from "./rules/html-no-underscores-in-attribute-names.js";
|
|
71
|
+
import { HTMLRequireClosingTagsRule } from "./rules/html-require-closing-tags.js";
|
|
50
72
|
import { HTMLTagNameLowercaseRule } from "./rules/html-tag-name-lowercase.js";
|
|
51
|
-
import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js";
|
|
52
73
|
import { ParserNoErrorsRule } from "./rules/parser-no-errors.js";
|
|
74
|
+
import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js";
|
|
75
|
+
import { TurboPermanentRequireIdRule } from "./rules/turbo-permanent-require-id.js";
|
|
53
76
|
export const rules = [
|
|
77
|
+
ActionViewNoSilentHelperRule,
|
|
54
78
|
ERBCommentSyntax,
|
|
55
79
|
ERBNoCaseNodeChildrenRule,
|
|
80
|
+
ERBNoConditionalHTMLElementRule,
|
|
81
|
+
ERBNoConditionalOpenTagRule,
|
|
82
|
+
ERBNoDuplicateBranchElementsRule,
|
|
56
83
|
ERBNoEmptyTagsRule,
|
|
57
84
|
ERBNoExtraNewLineRule,
|
|
58
85
|
ERBNoExtraWhitespaceRule,
|
|
86
|
+
ERBNoInlineCaseConditionsRule,
|
|
87
|
+
ERBNoInstanceVariablesInPartialsRule,
|
|
88
|
+
ERBNoInterpolatedClassNamesRule,
|
|
89
|
+
ERBNoJavascriptTagHelperRule,
|
|
59
90
|
ERBNoOutputControlFlowRule,
|
|
91
|
+
ERBNoOutputInAttributeNameRule,
|
|
92
|
+
ERBNoOutputInAttributePositionRule,
|
|
93
|
+
ERBNoRawOutputInAttributeValueRule,
|
|
60
94
|
ERBNoSilentTagInAttributeNameRule,
|
|
95
|
+
ERBNoStatementInScriptRule,
|
|
96
|
+
ERBNoThenInControlFlowRule,
|
|
97
|
+
ERBNoTrailingWhitespaceRule,
|
|
98
|
+
ERBNoUnsafeJSAttributeRule,
|
|
99
|
+
ERBNoUnsafeRawRule,
|
|
100
|
+
ERBNoUnsafeScriptInterpolationRule,
|
|
61
101
|
ERBPreferImageTagHelperRule,
|
|
62
102
|
ERBRequireTrailingNewlineRule,
|
|
63
103
|
ERBRequireWhitespaceRule,
|
|
64
104
|
ERBRightTrimRule,
|
|
65
105
|
ERBStrictLocalsCommentSyntaxRule,
|
|
66
106
|
ERBStrictLocalsRequiredRule,
|
|
67
|
-
HerbDisableCommentValidRuleNameRule,
|
|
68
|
-
HerbDisableCommentNoRedundantAllRule,
|
|
69
|
-
HerbDisableCommentNoDuplicateRulesRule,
|
|
70
|
-
HerbDisableCommentMissingRulesRule,
|
|
71
107
|
HerbDisableCommentMalformedRule,
|
|
108
|
+
HerbDisableCommentMissingRulesRule,
|
|
109
|
+
HerbDisableCommentNoDuplicateRulesRule,
|
|
110
|
+
HerbDisableCommentNoRedundantAllRule,
|
|
72
111
|
HerbDisableCommentUnnecessaryRule,
|
|
112
|
+
HerbDisableCommentValidRuleNameRule,
|
|
113
|
+
HTMLAllowedScriptTypeRule,
|
|
73
114
|
HTMLAnchorRequireHrefRule,
|
|
74
115
|
HTMLAriaAttributeMustBeValid,
|
|
75
116
|
HTMLAriaLabelIsWellFormattedRule,
|
|
@@ -81,12 +122,15 @@ export const rules = [
|
|
|
81
122
|
HTMLAttributeValuesRequireQuotesRule,
|
|
82
123
|
HTMLAvoidBothDisabledAndAriaDisabledRule,
|
|
83
124
|
HTMLBodyOnlyElementsRule,
|
|
125
|
+
HTMLDetailsHasSummaryRule,
|
|
84
126
|
HTMLBooleanAttributesNoValueRule,
|
|
85
127
|
HTMLHeadOnlyElementsRule,
|
|
86
128
|
HTMLIframeHasTitleRule,
|
|
87
129
|
HTMLImgRequireAltRule,
|
|
88
130
|
HTMLInputRequireAutocompleteRule,
|
|
89
131
|
HTMLNavigationHasLabelRule,
|
|
132
|
+
HTMLNoAbstractRolesRule,
|
|
133
|
+
HTMLNoAriaHiddenOnBodyRule,
|
|
90
134
|
HTMLNoAriaHiddenOnFocusableRule,
|
|
91
135
|
HTMLNoBlockInsideInlineRule,
|
|
92
136
|
HTMLNoDuplicateAttributesRule,
|
|
@@ -100,8 +144,10 @@ export const rules = [
|
|
|
100
144
|
HTMLNoSpaceInTagRule,
|
|
101
145
|
HTMLNoTitleAttributeRule,
|
|
102
146
|
HTMLNoUnderscoresInAttributeNamesRule,
|
|
147
|
+
HTMLRequireClosingTagsRule,
|
|
103
148
|
HTMLTagNameLowercaseRule,
|
|
104
|
-
SVGTagNameCapitalizationRule,
|
|
105
149
|
ParserNoErrorsRule,
|
|
150
|
+
SVGTagNameCapitalizationRule,
|
|
151
|
+
TurboPermanentRequireIdRule,
|
|
106
152
|
];
|
|
107
153
|
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export interface ProcessedFile {
|
|
|
10
10
|
}
|
|
11
11
|
export interface ProcessingContext {
|
|
12
12
|
projectPath?: string;
|
|
13
|
+
configPath?: string;
|
|
13
14
|
pattern?: string;
|
|
14
15
|
fix?: boolean;
|
|
15
16
|
fixUnsafe?: boolean;
|
|
@@ -17,6 +18,7 @@ export interface ProcessingContext {
|
|
|
17
18
|
linterConfig?: HerbConfigOptions['linter'];
|
|
18
19
|
config?: Config;
|
|
19
20
|
loadCustomRules?: boolean;
|
|
21
|
+
jobs?: number;
|
|
20
22
|
}
|
|
21
23
|
export interface ProcessingResult {
|
|
22
24
|
totalErrors: number;
|
|
@@ -40,4 +42,15 @@ export declare class FileProcessor {
|
|
|
40
42
|
private customRulesLoaded;
|
|
41
43
|
private isRuleAutocorrectable;
|
|
42
44
|
processFiles(files: string[], formatOption?: FormatOption, context?: ProcessingContext): Promise<ProcessingResult>;
|
|
45
|
+
private processFilesSequentially;
|
|
46
|
+
private processFilesInParallel;
|
|
47
|
+
private resolveWorkerPath;
|
|
48
|
+
private splitIntoChunks;
|
|
49
|
+
private runWorker;
|
|
50
|
+
private aggregateWorkerResults;
|
|
51
|
+
/**
|
|
52
|
+
* Returns the default number of parallel jobs based on available CPU cores.
|
|
53
|
+
* Returns 1 if parallelism detection fails.
|
|
54
|
+
*/
|
|
55
|
+
static defaultJobs(): number;
|
|
43
56
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function fileUrl(filePath: string): string;
|
|
@@ -2,4 +2,5 @@ export { ArgumentParser } from "./argument-parser.js";
|
|
|
2
2
|
export { FileProcessor } from "./file-processor.js";
|
|
3
3
|
export { SummaryReporter } from "./summary-reporter.js";
|
|
4
4
|
export { OutputManager } from "./output-manager.js";
|
|
5
|
+
export type { WorkerInput, WorkerResult, WorkerOffense } from "./lint-worker.js";
|
|
5
6
|
export * from "./formatters/index.js";
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Diagnostic } from "@herb-tools/core";
|
|
2
|
+
export interface WorkerInput {
|
|
3
|
+
files: string[];
|
|
4
|
+
projectPath: string;
|
|
5
|
+
configPath?: string;
|
|
6
|
+
fix: boolean;
|
|
7
|
+
fixUnsafe: boolean;
|
|
8
|
+
ignoreDisableComments: boolean;
|
|
9
|
+
loadCustomRules: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkerOffense {
|
|
12
|
+
filename: string;
|
|
13
|
+
offense: Diagnostic;
|
|
14
|
+
content: string;
|
|
15
|
+
autocorrectable: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkerResult {
|
|
18
|
+
totalErrors: number;
|
|
19
|
+
totalWarnings: number;
|
|
20
|
+
totalInfo: number;
|
|
21
|
+
totalHints: number;
|
|
22
|
+
totalIgnored: number;
|
|
23
|
+
totalWouldBeIgnored: number;
|
|
24
|
+
filesWithOffenses: number;
|
|
25
|
+
filesFixed: number;
|
|
26
|
+
ruleCount: number;
|
|
27
|
+
offenses: WorkerOffense[];
|
|
28
|
+
ruleOffenses: [string, {
|
|
29
|
+
count: number;
|
|
30
|
+
files: string[];
|
|
31
|
+
}][];
|
|
32
|
+
fixMessages: string[];
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
@@ -36,6 +36,10 @@ export declare class CustomRuleLoader {
|
|
|
36
36
|
* Type guard to check if an export is a valid rule class
|
|
37
37
|
*/
|
|
38
38
|
private isValidRuleClass;
|
|
39
|
+
/**
|
|
40
|
+
* Check for usage of deprecated 'name' property instead of 'static ruleName'
|
|
41
|
+
*/
|
|
42
|
+
private hasDeprecatedNameProperty;
|
|
39
43
|
/**
|
|
40
44
|
* Loads all custom rules from the project
|
|
41
45
|
*/
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/linter.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ParseCache } from "./parse-cache.js";
|
|
2
|
+
import type { RuleClass, ParserRuleClass, LexerRuleClass, SourceRuleClass, LintResult, LintOffense, UnboundLintOffense, LintContext, AutofixResult } from "./types.js";
|
|
2
3
|
import type { HerbBackend } from "@herb-tools/core";
|
|
3
4
|
import type { RuleConfig, Config } from "@herb-tools/config";
|
|
4
5
|
export interface LinterOptions {
|
|
@@ -27,9 +28,10 @@ export interface LinterOptions {
|
|
|
27
28
|
silentCustomRules?: boolean;
|
|
28
29
|
}
|
|
29
30
|
export declare class Linter {
|
|
30
|
-
|
|
31
|
+
rules: RuleClass[];
|
|
31
32
|
protected allAvailableRules: RuleClass[];
|
|
32
33
|
protected herb: HerbBackend;
|
|
34
|
+
protected parseCache: ParseCache;
|
|
33
35
|
protected offenses: LintOffense[];
|
|
34
36
|
protected config?: Config;
|
|
35
37
|
/**
|
|
@@ -85,14 +87,19 @@ export declare class Linter {
|
|
|
85
87
|
*/
|
|
86
88
|
protected get nonExcludableRules(): string[];
|
|
87
89
|
getRuleCount(): number;
|
|
90
|
+
protected findRuleClass(ruleName: string): RuleClass | undefined;
|
|
88
91
|
/**
|
|
89
|
-
* Type guard to check if a rule is a LexerRule
|
|
92
|
+
* Type guard to check if a rule class is a LexerRule class
|
|
90
93
|
*/
|
|
91
|
-
protected
|
|
94
|
+
protected isLexerRuleClass(ruleClass: RuleClass): ruleClass is LexerRuleClass;
|
|
92
95
|
/**
|
|
93
|
-
* Type guard to check if a rule is a SourceRule
|
|
96
|
+
* Type guard to check if a rule class is a SourceRule class
|
|
94
97
|
*/
|
|
95
|
-
protected
|
|
98
|
+
protected isSourceRuleClass(ruleClass: RuleClass): ruleClass is SourceRuleClass;
|
|
99
|
+
/**
|
|
100
|
+
* Type guard to check if a rule class is a ParserRule class
|
|
101
|
+
*/
|
|
102
|
+
protected isParserRuleClass(ruleClass: RuleClass): ruleClass is ParserRuleClass;
|
|
96
103
|
/**
|
|
97
104
|
* Execute a single rule and return its unbound offenses.
|
|
98
105
|
* Handles rule type checking (Lexer/Parser/Source) and isEnabled checks.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ParseResult, HerbBackend, ParserOptions } from "@herb-tools/core";
|
|
2
|
+
export declare class ParseCache {
|
|
3
|
+
private herb;
|
|
4
|
+
private cache;
|
|
5
|
+
constructor(herb: HerbBackend);
|
|
6
|
+
get(source: string, parserOptions?: Partial<ParserOptions>): ParseResult;
|
|
7
|
+
clear(): void;
|
|
8
|
+
resolveOptions(parserOptions: Partial<ParserOptions>): ParserOptions;
|
|
9
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
|
-
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
3
|
+
import type { ParseResult, ParserOptions } from "@herb-tools/core";
|
|
4
|
+
export declare class ActionViewNoSilentHelperRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
|
+
get parserOptions(): Partial<ParserOptions>;
|
|
7
8
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
9
|
}
|
|
@@ -6,7 +6,7 @@ interface ERBCommentSyntaxAutofixContext extends BaseAutofixContext {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class ERBCommentSyntax extends ParserRule<ERBCommentSyntaxAutofixContext> {
|
|
8
8
|
static autocorrectable: boolean;
|
|
9
|
-
|
|
9
|
+
static ruleName: string;
|
|
10
10
|
get defaultConfig(): FullRuleConfig;
|
|
11
11
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<ERBCommentSyntaxAutofixContext>[];
|
|
12
12
|
autofix(offense: LintOffense<ERBCommentSyntaxAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
|
|
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
|
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
4
|
export declare class ERBNoCaseNodeChildrenRule extends ParserRule {
|
|
5
|
-
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
|
-
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
2
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
4
|
+
export declare class ERBNoConditionalHTMLElementRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
|
-
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
2
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
4
|
+
export declare class ERBNoConditionalOpenTagRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ParserRule } from "../types.js";
|
|
2
|
+
import type { BaseAutofixContext, UnboundLintOffense, LintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
|
+
import type { ParseResult, ERBIfNode, ERBUnlessNode, ERBCaseNode } from "@herb-tools/core";
|
|
4
|
+
import type { Mutable } from "@herb-tools/rewriter";
|
|
5
|
+
type ConditionalNode = ERBIfNode | ERBUnlessNode | ERBCaseNode;
|
|
6
|
+
interface DuplicateBranchAutofixContext extends BaseAutofixContext {
|
|
7
|
+
node: Mutable<ConditionalNode>;
|
|
8
|
+
}
|
|
9
|
+
export declare class ERBNoDuplicateBranchElementsRule extends ParserRule<DuplicateBranchAutofixContext> {
|
|
10
|
+
static ruleName: string;
|
|
11
|
+
static autocorrectable: boolean;
|
|
12
|
+
static reindentAfterAutofix: boolean;
|
|
13
|
+
get defaultConfig(): FullRuleConfig;
|
|
14
|
+
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<DuplicateBranchAutofixContext>[];
|
|
15
|
+
autofix(offense: LintOffense<DuplicateBranchAutofixContext>, result: ParseResult): ParseResult | null;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
|
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
4
|
export declare class ERBNoEmptyTagsRule extends ParserRule {
|
|
5
|
-
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -6,7 +6,7 @@ interface ERBNoExtraNewLineAutofixContext extends BaseAutofixContext {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class ERBNoExtraNewLineRule extends SourceRule {
|
|
8
8
|
static autocorrectable: boolean;
|
|
9
|
-
|
|
9
|
+
static ruleName: string;
|
|
10
10
|
get defaultConfig(): FullRuleConfig;
|
|
11
11
|
check(source: string, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
12
12
|
autofix(offense: LintOffense<ERBNoExtraNewLineAutofixContext>, source: string, _context?: Partial<LintContext>): string | null;
|
|
@@ -10,7 +10,7 @@ interface ERBNoExtraWhitespaceAutofixContext extends BaseAutofixContext {
|
|
|
10
10
|
}
|
|
11
11
|
export declare class ERBNoExtraWhitespaceRule extends ParserRule<ERBNoExtraWhitespaceAutofixContext> {
|
|
12
12
|
static autocorrectable: boolean;
|
|
13
|
-
|
|
13
|
+
static ruleName: string;
|
|
14
14
|
get defaultConfig(): FullRuleConfig;
|
|
15
15
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<ERBNoExtraWhitespaceAutofixContext>[];
|
|
16
16
|
autofix(offense: LintOffense<ERBNoExtraWhitespaceAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
|
-
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
3
|
+
import type { ParseResult, ParserOptions } from "@herb-tools/core";
|
|
4
|
+
export declare class ERBNoInlineCaseConditionsRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
|
+
get parserOptions(): Partial<ParserOptions>;
|
|
7
8
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
9
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ParserRule } from "../types.js";
|
|
2
|
+
import type { ParseResult, ParserOptions } from "@herb-tools/core";
|
|
3
|
+
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
4
|
+
export declare class ERBNoInstanceVariablesInPartialsRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
|
+
get defaultConfig(): FullRuleConfig;
|
|
7
|
+
get parserOptions(): Partial<ParserOptions>;
|
|
8
|
+
isEnabled(_result: ParseResult, context?: Partial<LintContext>): boolean;
|
|
9
|
+
check(result: ParseResult, _context?: Partial<LintContext>): UnboundLintOffense[];
|
|
10
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoInterpolatedClassNamesRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoJavascriptTagHelperRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -2,7 +2,7 @@ import type { ParseResult } from "@herb-tools/core";
|
|
|
2
2
|
import { ParserRule } from "../types.js";
|
|
3
3
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
4
4
|
export declare class ERBNoOutputControlFlowRule extends ParserRule {
|
|
5
|
-
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoOutputInAttributeNameRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoOutputInAttributePositionRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoRawOutputInAttributeValueRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
|
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
4
|
export declare class ERBNoSilentTagInAttributeNameRule extends ParserRule {
|
|
5
|
-
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoStatementInScriptRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ParserRule } from "../types.js";
|
|
2
|
+
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
|
+
import type { ParseResult, ParserOptions } from "@herb-tools/core";
|
|
4
|
+
export declare class ERBNoThenInControlFlowRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
|
+
get defaultConfig(): FullRuleConfig;
|
|
7
|
+
get parserOptions(): Partial<ParserOptions>;
|
|
8
|
+
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
9
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ParserRule, Mutable, BaseAutofixContext } from "../types.js";
|
|
2
|
+
import type { UnboundLintOffense, LintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
|
+
import type { HTMLTextNode, LiteralNode, ParseResult } from "@herb-tools/core";
|
|
4
|
+
interface ERBNoTrailingWhitespaceAutofixContext extends BaseAutofixContext {
|
|
5
|
+
node: Mutable<HTMLTextNode> | Mutable<LiteralNode>;
|
|
6
|
+
}
|
|
7
|
+
export declare class ERBNoTrailingWhitespaceRule extends ParserRule<ERBNoTrailingWhitespaceAutofixContext> {
|
|
8
|
+
static autocorrectable: boolean;
|
|
9
|
+
static ruleName: string;
|
|
10
|
+
get defaultConfig(): FullRuleConfig;
|
|
11
|
+
check(result: ParseResult, _context?: Partial<LintContext>): UnboundLintOffense<ERBNoTrailingWhitespaceAutofixContext>[];
|
|
12
|
+
private findTrailingWhitespaceCandidates;
|
|
13
|
+
private collectSkipZones;
|
|
14
|
+
private isInSkipZone;
|
|
15
|
+
autofix(offense: LintOffense<ERBNoTrailingWhitespaceAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
|
|
16
|
+
private isOffenseAtEndOfContent;
|
|
17
|
+
private hasTrailingWhitespaceNotIndentation;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ParserRule } from "../types.js";
|
|
2
2
|
import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
|
|
3
3
|
import type { ParseResult } from "@herb-tools/core";
|
|
4
|
-
export declare class
|
|
5
|
-
|
|
4
|
+
export declare class ERBNoUnsafeJSAttributeRule extends ParserRule {
|
|
5
|
+
static ruleName: string;
|
|
6
6
|
get defaultConfig(): FullRuleConfig;
|
|
7
7
|
check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
|
|
8
8
|
}
|