diff --git a/javascript/packages/linter/README.md b/javascript/packages/linter/README.md index 009777293..40e8779e8 100644 --- a/javascript/packages/linter/README.md +++ b/javascript/packages/linter/README.md @@ -532,7 +532,7 @@ class NoDivTagsVisitor extends BaseRuleVisitor { } export default class NoDivTagsRule extends ParserRule { - name = "no-div-tags" + static ruleName = "no-div-tags" check(result, context) { const visitor = new NoDivTagsVisitor(this.name, context) @@ -566,7 +566,7 @@ class NoInlineStylesVisitor extends BaseRuleVisitor { } export default class NoInlineStylesRule { - name = "no-inline-styles" + static ruleName = "no-inline-styles" check(parseResult, context) { const visitor = new NoInlineStylesVisitor(this.name, context) @@ -590,7 +590,7 @@ You can override the `defaultConfig` getter to customize these defaults, as show **Rule Properties:** - `static type` - Optional, defaults to `"parser"`. Can be `"parser"`, `"lexer"`, or `"source"` -- `name` - Required, the rule identifier used in configuration and output +- `static ruleName` - Required, the rule identifier used in configuration and output - `check()` - Required, the method that checks for offenses - `defaultConfig` - Optional, returns the default configuration for the rule - `isEnabled()` - Optional, dynamically determines if the rule should run diff --git a/javascript/packages/linter/src/cli/file-processor.ts b/javascript/packages/linter/src/cli/file-processor.ts index 3d752f22f..cc498bea1 100644 --- a/javascript/packages/linter/src/cli/file-processor.ts +++ b/javascript/packages/linter/src/cli/file-processor.ts @@ -51,15 +51,13 @@ export class FileProcessor { private isRuleAutocorrectable(ruleName: string): boolean { if (!this.linter) return false - const RuleClass = (this.linter as any).rules.find((rule: any) => { - const instance = new rule() + const ruleClass = (this.linter as any).rules.find( + (rule: any) => rule.ruleName === ruleName + ) - return instance.name === ruleName - }) + if (!ruleClass) return false - if (!RuleClass) return false - - return RuleClass.autocorrectable === true + return ruleClass.autocorrectable === true } async processFiles(files: string[], formatOption: FormatOption = 'detailed', context?: ProcessingContext): Promise { diff --git a/javascript/packages/linter/src/custom-rule-loader.ts b/javascript/packages/linter/src/custom-rule-loader.ts index 8b2f92ce8..301b8df8f 100644 --- a/javascript/packages/linter/src/custom-rule-loader.ts +++ b/javascript/packages/linter/src/custom-rule-loader.ts @@ -75,10 +75,16 @@ export class CustomRuleLoader { const cacheBustedUrl = `${fileUrl}?t=${Date.now()}` const module = await import(cacheBustedUrl) - if (module.default && this.isValidRuleClass(module.default)) { + if (this.isValidRuleClass(module.default)) { return [module.default] } + if (this.hasDeprecatedNameProperty(module.default)) { + const name = new module.default().name + console.error(`Error: Custom rule in "${filePath}" sets 'name' as an instance property, which is no longer supported. Use 'static ruleName = "${name}"' instead.`) + process.exit(1) + } + if (!this.silent) { console.warn(`Warning: No valid default export found in "${filePath}". Custom rules must use default export.`) } @@ -96,12 +102,22 @@ export class CustomRuleLoader { * Type guard to check if an export is a valid rule class */ private isValidRuleClass(value: any): value is RuleClass { + if (!value) return false if (typeof value !== 'function') return false if (!value.prototype) return false - const instance = new value() + return typeof value.ruleName === 'string' && typeof value.prototype.check === 'function' + } - return typeof instance.check === 'function' && typeof instance.name === 'string' + /** + * Check for usage of deprecated 'name' property instead of 'static ruleName' + */ + private hasDeprecatedNameProperty(value: any): boolean { + if (!value) return false + if (typeof value !== 'function') return false + + const instance = new value() + return Object.prototype.hasOwnProperty.call(instance, 'name') } /** @@ -142,8 +158,7 @@ export class CustomRuleLoader { for (const filePath of ruleFiles) { const rules = await this.loadRuleFile(filePath) for (const RuleClass of rules) { - const instance = new RuleClass() - const ruleName = instance.name + const ruleName = RuleClass.ruleName if (seenNames.has(ruleName)) { const firstPath = seenNames.get(ruleName)! diff --git a/javascript/packages/linter/src/linter.ts b/javascript/packages/linter/src/linter.ts index 660f1f4b5..2a3b9a099 100644 --- a/javascript/packages/linter/src/linter.ts +++ b/javascript/packages/linter/src/linter.ts @@ -109,10 +109,9 @@ export class Linter { ): RuleClass[] { return allRules.filter(ruleClass => { const instance = new ruleClass() - const ruleName = instance.name const defaultEnabled = instance.defaultConfig?.enabled ?? DEFAULT_RULE_CONFIG.enabled - const userRuleConfig = userRulesConfig?.[ruleName] + const userRuleConfig = userRulesConfig?.[ruleClass.ruleName] if (userRuleConfig !== undefined) { return userRuleConfig.enabled !== false @@ -193,13 +192,15 @@ export class Linter { source: string, context?: Partial ): UnboundLintOffense[] { + const ruleName = rule.ruleName + if (this.config && context?.fileName) { - if (!this.config.isRuleEnabledForPath(rule.name, context.fileName)) { + if (!this.config.isRuleEnabledForPath(ruleName, context.fileName)) { return [] } } - if (context?.fileName && !this.config?.linter?.rules?.[rule.name]?.exclude) { + if (context?.fileName && !this.config?.linter?.rules?.[ruleName]?.exclude) { const defaultExclude = rule.defaultConfig?.exclude ?? DEFAULT_RULE_CONFIG.exclude if (defaultExclude && defaultExclude.length > 0) { @@ -335,7 +336,7 @@ export class Linter { const herbDisableCache = new Map() if (hasParserErrors) { - const hasParserRule = this.rules.find(RuleClass => (new RuleClass()).name === "parser-no-errors") + const hasParserRule = this.rules.find(RuleClass => RuleClass.ruleName === "parser-no-errors") if (hasParserRule) { const rule = new ParserNoErrorsRule() @@ -355,15 +356,11 @@ export class Linter { context = { ...context, - validRuleNames: this.getAvailableRules().map(RuleClass => new RuleClass().name), + validRuleNames: this.getAvailableRules().map(RuleClass => RuleClass.ruleName), ignoredOffensesByLine } - const regularRules = this.rules.filter(RuleClass => { - const rule = new RuleClass() - - return rule.name !== "herb-disable-comment-unnecessary" - }) + const regularRules = this.rules.filter(RuleClass => RuleClass.ruleName !== "herb-disable-comment-unnecessary") for (const RuleClass of regularRules) { const rule = new RuleClass() @@ -379,11 +376,11 @@ export class Linter { } const unboundOffenses = this.executeRule(rule, parseResult, lexResult, source, context) - const boundOffenses = this.bindSeverity(unboundOffenses, rule.name) + const boundOffenses = this.bindSeverity(unboundOffenses, RuleClass.ruleName) const { kept, ignored, wouldBeIgnored } = this.filterOffenses( boundOffenses, - rule.name, + RuleClass.ruleName, ignoredOffensesByLine, herbDisableCache, context?.ignoreDisableComments @@ -394,17 +391,13 @@ export class Linter { this.offenses.push(...kept) } - const unnecessaryRuleClass = this.rules.find(RuleClass => { - const rule = new RuleClass() - - return rule.name === "herb-disable-comment-unnecessary" - }) + const unnecessaryRuleClass = this.rules.find(RuleClass => RuleClass.ruleName === "herb-disable-comment-unnecessary") if (unnecessaryRuleClass) { const unnecessaryRule = new unnecessaryRuleClass() as ParserRule const parseResult = this.parseCache.get(source, unnecessaryRule.parserOptions) const unboundOffenses = unnecessaryRule.check(parseResult, context) - const boundOffenses = this.bindSeverity(unboundOffenses, unnecessaryRule.name) + const boundOffenses = this.bindSeverity(unboundOffenses, unnecessaryRuleClass.ruleName) this.offenses.push(...boundOffenses) } @@ -444,10 +437,7 @@ export class Linter { * @returns Array of offenses with severity bound */ protected bindSeverity(unboundOffenses: UnboundLintOffense[], ruleName: string): LintOffense[] { - const RuleClass = this.rules.find(rule => { - const instance = new rule() - return instance.name === ruleName - }) + const RuleClass = this.rules.find(rule => rule.ruleName === ruleName) if (!RuleClass) { return unboundOffenses.map(offense => ({ @@ -487,11 +477,7 @@ export class Linter { const sourceOffenses: LintOffense[] = [] for (const offense of lintResult.offenses) { - const RuleClass = this.rules.find(rule => { - const instance = new rule() - - return instance.name === offense.rule - }) + const RuleClass = this.rules.find(rule => rule.ruleName === offense.rule) if (!RuleClass) continue @@ -512,7 +498,7 @@ export class Linter { const parseResult = this.parseCache.get(currentSource) for (const offense of parserOffenses) { - const RuleClass = this.rules.find(rule => new rule().name === offense.rule) + const RuleClass = this.rules.find(rule => rule.ruleName === offense.rule) if (!RuleClass) { unfixed.push(offense) @@ -579,7 +565,7 @@ export class Linter { }) for (const offense of sortedSourceOffenses) { - const RuleClass = this.rules.find(rule => new rule().name === offense.rule) + const RuleClass = this.rules.find(rule => rule.ruleName === offense.rule) if (!RuleClass) { unfixed.push(offense) diff --git a/javascript/packages/linter/src/rules/erb-comment-syntax.ts b/javascript/packages/linter/src/rules/erb-comment-syntax.ts index 60dfcd7af..c4f46836a 100644 --- a/javascript/packages/linter/src/rules/erb-comment-syntax.ts +++ b/javascript/packages/linter/src/rules/erb-comment-syntax.ts @@ -34,7 +34,7 @@ class ERBCommentSyntaxVisitor extends BaseRuleVisitor { static autocorrectable = true - name = "erb-comment-syntax" + static ruleName = "erb-comment-syntax" get defaultConfig(): FullRuleConfig { return { @@ -44,7 +44,7 @@ export class ERBCommentSyntax extends ParserRule } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBCommentSyntaxVisitor(this.name, context) + const visitor = new ERBCommentSyntaxVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-case-node-children.ts b/javascript/packages/linter/src/rules/erb-no-case-node-children.ts index 58185715f..be0619ba4 100644 --- a/javascript/packages/linter/src/rules/erb-no-case-node-children.ts +++ b/javascript/packages/linter/src/rules/erb-no-case-node-children.ts @@ -49,7 +49,7 @@ class ERBNoCaseNodeChildrenVisitor extends BaseRuleVisitor { } export class ERBNoCaseNodeChildrenRule extends ParserRule { - name = "erb-no-case-node-children" + static ruleName = "erb-no-case-node-children" get defaultConfig(): FullRuleConfig { return { @@ -59,7 +59,7 @@ export class ERBNoCaseNodeChildrenRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoCaseNodeChildrenVisitor(this.name, context) + const visitor = new ERBNoCaseNodeChildrenVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-conditional-html-element.ts b/javascript/packages/linter/src/rules/erb-no-conditional-html-element.ts index 4419816d9..cd0edd63a 100644 --- a/javascript/packages/linter/src/rules/erb-no-conditional-html-element.ts +++ b/javascript/packages/linter/src/rules/erb-no-conditional-html-element.ts @@ -34,7 +34,7 @@ class ERBNoConditionalHTMLElementRuleVisitor extends BaseRuleVisitor { } export class ERBNoConditionalHTMLElementRule extends ParserRule { - name = "erb-no-conditional-html-element" + static ruleName = "erb-no-conditional-html-element" get defaultConfig(): FullRuleConfig { return { @@ -44,7 +44,7 @@ export class ERBNoConditionalHTMLElementRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoConditionalHTMLElementRuleVisitor(this.name, context) + const visitor = new ERBNoConditionalHTMLElementRuleVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-conditional-open-tag.ts b/javascript/packages/linter/src/rules/erb-no-conditional-open-tag.ts index adc3d4e1c..bbe792893 100644 --- a/javascript/packages/linter/src/rules/erb-no-conditional-open-tag.ts +++ b/javascript/packages/linter/src/rules/erb-no-conditional-open-tag.ts @@ -18,7 +18,7 @@ class ERBNoConditionalOpenTagRuleVisitor extends BaseRuleVisitor { } export class ERBNoConditionalOpenTagRule extends ParserRule { - name = "erb-no-conditional-open-tag" + static ruleName = "erb-no-conditional-open-tag" get defaultConfig(): FullRuleConfig { return { @@ -28,7 +28,7 @@ export class ERBNoConditionalOpenTagRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoConditionalOpenTagRuleVisitor(this.name, context) + const visitor = new ERBNoConditionalOpenTagRuleVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-empty-tags.ts b/javascript/packages/linter/src/rules/erb-no-empty-tags.ts index 15f5b4bfd..da0af6dbf 100644 --- a/javascript/packages/linter/src/rules/erb-no-empty-tags.ts +++ b/javascript/packages/linter/src/rules/erb-no-empty-tags.ts @@ -22,7 +22,7 @@ class ERBNoEmptyTagsVisitor extends BaseRuleVisitor { } export class ERBNoEmptyTagsRule extends ParserRule { - name = "erb-no-empty-tags" + static ruleName = "erb-no-empty-tags" get defaultConfig(): FullRuleConfig { return { @@ -32,7 +32,7 @@ export class ERBNoEmptyTagsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoEmptyTagsVisitor(this.name, context) + const visitor = new ERBNoEmptyTagsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-extra-newline.ts b/javascript/packages/linter/src/rules/erb-no-extra-newline.ts index 7117259f6..b3597709b 100644 --- a/javascript/packages/linter/src/rules/erb-no-extra-newline.ts +++ b/javascript/packages/linter/src/rules/erb-no-extra-newline.ts @@ -41,7 +41,7 @@ class ERBNoExtraNewLineVisitor extends BaseSourceRuleVisitor): UnboundLintOffense[] { - const visitor = new ERBNoExtraNewLineVisitor(this.name, context) + const visitor = new ERBNoExtraNewLineVisitor(this.ruleName, context) visitor.visit(source) diff --git a/javascript/packages/linter/src/rules/erb-no-extra-whitespace-inside-tags.ts b/javascript/packages/linter/src/rules/erb-no-extra-whitespace-inside-tags.ts index fd8855316..1880209d2 100644 --- a/javascript/packages/linter/src/rules/erb-no-extra-whitespace-inside-tags.ts +++ b/javascript/packages/linter/src/rules/erb-no-extra-whitespace-inside-tags.ts @@ -97,7 +97,7 @@ class ERBNoExtraWhitespaceInsideTagsVisitor extends BaseRuleVisitor { static autocorrectable = true - name = "erb-no-extra-whitespace-inside-tags" + static ruleName = "erb-no-extra-whitespace-inside-tags" get defaultConfig(): FullRuleConfig { return { @@ -107,7 +107,7 @@ export class ERBNoExtraWhitespaceRule extends ParserRule): UnboundLintOffense[] { - const visitor = new ERBNoExtraWhitespaceInsideTagsVisitor(this.name, context) + const visitor = new ERBNoExtraWhitespaceInsideTagsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-inline-case-conditions.ts b/javascript/packages/linter/src/rules/erb-no-inline-case-conditions.ts index 8c478ecba..24557b47a 100644 --- a/javascript/packages/linter/src/rules/erb-no-inline-case-conditions.ts +++ b/javascript/packages/linter/src/rules/erb-no-inline-case-conditions.ts @@ -31,7 +31,7 @@ class ERBNoInlineCaseConditionsVisitor extends BaseRuleVisitor { } export class ERBNoInlineCaseConditionsRule extends ParserRule { - name = "erb-no-inline-case-conditions" + static ruleName = "erb-no-inline-case-conditions" get defaultConfig(): FullRuleConfig { return { @@ -45,7 +45,7 @@ export class ERBNoInlineCaseConditionsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoInlineCaseConditionsVisitor(this.name, context) + const visitor = new ERBNoInlineCaseConditionsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-output-control-flow.ts b/javascript/packages/linter/src/rules/erb-no-output-control-flow.ts index c05aea6e5..bec617f47 100644 --- a/javascript/packages/linter/src/rules/erb-no-output-control-flow.ts +++ b/javascript/packages/linter/src/rules/erb-no-output-control-flow.ts @@ -50,7 +50,7 @@ class ERBNoOutputControlFlowRuleVisitor extends BaseRuleVisitor { } export class ERBNoOutputControlFlowRule extends ParserRule { - name = "erb-no-output-control-flow" + static ruleName = "erb-no-output-control-flow" get defaultConfig(): FullRuleConfig { return { @@ -60,7 +60,7 @@ export class ERBNoOutputControlFlowRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoOutputControlFlowRuleVisitor(this.name, context) + const visitor = new ERBNoOutputControlFlowRuleVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-silent-tag-in-attribute-name.ts b/javascript/packages/linter/src/rules/erb-no-silent-tag-in-attribute-name.ts index c7ce7f0de..b04ba53f0 100644 --- a/javascript/packages/linter/src/rules/erb-no-silent-tag-in-attribute-name.ts +++ b/javascript/packages/linter/src/rules/erb-no-silent-tag-in-attribute-name.ts @@ -27,7 +27,7 @@ class ERBNoSilentTagInAttributeNameVisitor extends BaseRuleVisitor { } export class ERBNoSilentTagInAttributeNameRule extends ParserRule { - name = "erb-no-silent-tag-in-attribute-name" + static ruleName = "erb-no-silent-tag-in-attribute-name" get defaultConfig(): FullRuleConfig { return { @@ -37,7 +37,7 @@ export class ERBNoSilentTagInAttributeNameRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBNoSilentTagInAttributeNameVisitor(this.name, context) + const visitor = new ERBNoSilentTagInAttributeNameVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-no-trailing-whitespace.ts b/javascript/packages/linter/src/rules/erb-no-trailing-whitespace.ts index 7d0b1c089..d774dbd79 100644 --- a/javascript/packages/linter/src/rules/erb-no-trailing-whitespace.ts +++ b/javascript/packages/linter/src/rules/erb-no-trailing-whitespace.ts @@ -65,7 +65,7 @@ class SkipZoneCollector extends Visitor { export class ERBNoTrailingWhitespaceRule extends ParserRule { static autocorrectable = true - name = "erb-no-trailing-whitespace" + static ruleName = "erb-no-trailing-whitespace" get defaultConfig(): FullRuleConfig { return { @@ -89,7 +89,7 @@ export class ERBNoTrailingWhitespaceRule extends ParserRule isHTMLTextNode(n) || isLiteralNode(n)) as HTMLTextNode | LiteralNode | null offenses.push({ - rule: this.name, + rule: this.ruleName, message: "Extra whitespace detected at end of line.", location, autofixContext: node ? { node } : undefined diff --git a/javascript/packages/linter/src/rules/erb-prefer-image-tag-helper.ts b/javascript/packages/linter/src/rules/erb-prefer-image-tag-helper.ts index e3dee4105..768ccdc66 100644 --- a/javascript/packages/linter/src/rules/erb-prefer-image-tag-helper.ts +++ b/javascript/packages/linter/src/rules/erb-prefer-image-tag-helper.ts @@ -90,7 +90,7 @@ class ERBPreferImageTagHelperVisitor extends BaseRuleVisitor { } export class ERBPreferImageTagHelperRule extends ParserRule { - name = "erb-prefer-image-tag-helper" + static ruleName = "erb-prefer-image-tag-helper" get defaultConfig(): FullRuleConfig { return { @@ -100,7 +100,7 @@ export class ERBPreferImageTagHelperRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBPreferImageTagHelperVisitor(this.name, context) + const visitor = new ERBPreferImageTagHelperVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/linter/src/rules/erb-require-trailing-newline.ts b/javascript/packages/linter/src/rules/erb-require-trailing-newline.ts index 541c82749..2f8e8e851 100644 --- a/javascript/packages/linter/src/rules/erb-require-trailing-newline.ts +++ b/javascript/packages/linter/src/rules/erb-require-trailing-newline.ts @@ -24,7 +24,7 @@ class ERBRequireTrailingNewlineVisitor extends BaseSourceRuleVisitor { export class ERBRequireTrailingNewlineRule extends SourceRule { static autocorrectable = true - name = "erb-require-trailing-newline" + static ruleName = "erb-require-trailing-newline" get defaultConfig(): FullRuleConfig { return { @@ -34,7 +34,7 @@ export class ERBRequireTrailingNewlineRule extends SourceRule { } check(source: string, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBRequireTrailingNewlineVisitor(this.name, context) + const visitor = new ERBRequireTrailingNewlineVisitor(this.ruleName, context) visitor.visit(source) diff --git a/javascript/packages/linter/src/rules/erb-require-whitespace-inside-tags.ts b/javascript/packages/linter/src/rules/erb-require-whitespace-inside-tags.ts index ec9ba7f6d..51f8b1edb 100644 --- a/javascript/packages/linter/src/rules/erb-require-whitespace-inside-tags.ts +++ b/javascript/packages/linter/src/rules/erb-require-whitespace-inside-tags.ts @@ -114,7 +114,7 @@ class RequireWhitespaceInsideTags extends BaseRuleVisitor { static autocorrectable = true - name = "erb-require-whitespace-inside-tags" + static ruleName = "erb-require-whitespace-inside-tags" get defaultConfig(): FullRuleConfig { return { @@ -124,7 +124,7 @@ export class ERBRequireWhitespaceRule extends ParserRule): UnboundLintOffense[] { - const visitor = new RequireWhitespaceInsideTags(this.name, context) + const visitor = new RequireWhitespaceInsideTags(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-right-trim.ts b/javascript/packages/linter/src/rules/erb-right-trim.ts index b49cd8fa8..5793ff154 100644 --- a/javascript/packages/linter/src/rules/erb-right-trim.ts +++ b/javascript/packages/linter/src/rules/erb-right-trim.ts @@ -26,7 +26,7 @@ class ERBRightTrimVisitor extends BaseRuleVisitor { export class ERBRightTrimRule extends ParserRule { static autocorrectable = true - name = "erb-right-trim" + static ruleName = "erb-right-trim" get defaultConfig(): FullRuleConfig { return { @@ -36,7 +36,7 @@ export class ERBRightTrimRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBRightTrimVisitor(this.name, context) + const visitor = new ERBRightTrimVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-strict-locals-comment-syntax.ts b/javascript/packages/linter/src/rules/erb-strict-locals-comment-syntax.ts index 91186399f..8b77f6814 100644 --- a/javascript/packages/linter/src/rules/erb-strict-locals-comment-syntax.ts +++ b/javascript/packages/linter/src/rules/erb-strict-locals-comment-syntax.ts @@ -264,7 +264,7 @@ class ERBStrictLocalsCommentSyntaxVisitor extends BaseRuleVisitor { } export class ERBStrictLocalsCommentSyntaxRule extends ParserRule { - name = "erb-strict-locals-comment-syntax" + static ruleName = "erb-strict-locals-comment-syntax" get defaultConfig(): FullRuleConfig { return { @@ -274,7 +274,7 @@ export class ERBStrictLocalsCommentSyntaxRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBStrictLocalsCommentSyntaxVisitor(this.name, context) + const visitor = new ERBStrictLocalsCommentSyntaxVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/erb-strict-locals-required.ts b/javascript/packages/linter/src/rules/erb-strict-locals-required.ts index 9b0c18587..2bf9700dc 100644 --- a/javascript/packages/linter/src/rules/erb-strict-locals-required.ts +++ b/javascript/packages/linter/src/rules/erb-strict-locals-required.ts @@ -29,7 +29,7 @@ class ERBStrictLocalsRequiredVisitor extends BaseSourceRuleVisitor { export class ERBStrictLocalsRequiredRule extends SourceRule { static unsafeAutocorrectable = true - name = "erb-strict-locals-required" + static ruleName = "erb-strict-locals-required" get defaultConfig(): FullRuleConfig { return { @@ -39,7 +39,7 @@ export class ERBStrictLocalsRequiredRule extends SourceRule { } check(source: string, context?: Partial): UnboundLintOffense[] { - const visitor = new ERBStrictLocalsRequiredVisitor(this.name, context) + const visitor = new ERBStrictLocalsRequiredVisitor(this.ruleName, context) visitor.visit(source) diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-malformed.ts b/javascript/packages/linter/src/rules/herb-disable-comment-malformed.ts index 47da20391..c55c58dd1 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-malformed.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-malformed.ts @@ -47,7 +47,7 @@ class HerbDisableCommentMalformedVisitor extends HerbDisableCommentBaseVisitor { } export class HerbDisableCommentMalformedRule extends ParserRule { - name = "herb-disable-comment-malformed" + static ruleName = "herb-disable-comment-malformed" get defaultConfig(): FullRuleConfig { return { @@ -57,7 +57,7 @@ export class HerbDisableCommentMalformedRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HerbDisableCommentMalformedVisitor(this.name, context) + const visitor = new HerbDisableCommentMalformedVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-missing-rules.ts b/javascript/packages/linter/src/rules/herb-disable-comment-missing-rules.ts index f6ab7191e..1b11750de 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-missing-rules.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-missing-rules.ts @@ -22,7 +22,7 @@ class HerbDisableCommentMissingRulesVisitor extends HerbDisableCommentBaseVisito } export class HerbDisableCommentMissingRulesRule extends ParserRule { - name = "herb-disable-comment-missing-rules" + static ruleName = "herb-disable-comment-missing-rules" get defaultConfig(): FullRuleConfig { return { @@ -32,7 +32,7 @@ export class HerbDisableCommentMissingRulesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HerbDisableCommentMissingRulesVisitor(this.name, context) + const visitor = new HerbDisableCommentMissingRulesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-no-duplicate-rules.ts b/javascript/packages/linter/src/rules/herb-disable-comment-no-duplicate-rules.ts index f4d371853..c6e824a8c 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-no-duplicate-rules.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-no-duplicate-rules.ts @@ -27,7 +27,7 @@ class HerbDisableCommentNoDuplicateRulesVisitor extends HerbDisableCommentParsed } export class HerbDisableCommentNoDuplicateRulesRule extends ParserRule { - name = "herb-disable-comment-no-duplicate-rules" + static ruleName = "herb-disable-comment-no-duplicate-rules" get defaultConfig(): FullRuleConfig { return { @@ -37,7 +37,7 @@ export class HerbDisableCommentNoDuplicateRulesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HerbDisableCommentNoDuplicateRulesVisitor(this.name, context) + const visitor = new HerbDisableCommentNoDuplicateRulesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-no-redundant-all.ts b/javascript/packages/linter/src/rules/herb-disable-comment-no-redundant-all.ts index fd2e582b2..7c7dfae65 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-no-redundant-all.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-no-redundant-all.ts @@ -21,7 +21,7 @@ class HerbDisableCommentNoRedundantAllVisitor extends HerbDisableCommentParsedVi } export class HerbDisableCommentNoRedundantAllRule extends ParserRule { - name = "herb-disable-comment-no-redundant-all" + static ruleName = "herb-disable-comment-no-redundant-all" get defaultConfig(): FullRuleConfig { return { @@ -31,7 +31,7 @@ export class HerbDisableCommentNoRedundantAllRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HerbDisableCommentNoRedundantAllVisitor(this.name, context) + const visitor = new HerbDisableCommentNoRedundantAllVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-unnecessary.ts b/javascript/packages/linter/src/rules/herb-disable-comment-unnecessary.ts index ad6b7e8e0..c280a8940 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-unnecessary.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-unnecessary.ts @@ -72,7 +72,7 @@ class HerbDisableCommentUnnecessaryVisitor extends HerbDisableCommentParsedVisit } export class HerbDisableCommentUnnecessaryRule extends ParserRule { - name = "herb-disable-comment-unnecessary" + static ruleName = "herb-disable-comment-unnecessary" get defaultConfig(): FullRuleConfig { return { @@ -90,7 +90,7 @@ export class HerbDisableCommentUnnecessaryRule extends ParserRule { if (!ignoredOffensesByLine) return [] const visitor = new HerbDisableCommentUnnecessaryVisitor( - this.name, + this.ruleName, ignoredOffensesByLine, validRuleNames, context diff --git a/javascript/packages/linter/src/rules/herb-disable-comment-valid-rule-name.ts b/javascript/packages/linter/src/rules/herb-disable-comment-valid-rule-name.ts index 7e85f7557..7326698cd 100644 --- a/javascript/packages/linter/src/rules/herb-disable-comment-valid-rule-name.ts +++ b/javascript/packages/linter/src/rules/herb-disable-comment-valid-rule-name.ts @@ -34,7 +34,7 @@ class HerbDisableCommentValidRuleNameVisitor extends HerbDisableCommentParsedVis } export class HerbDisableCommentValidRuleNameRule extends ParserRule { - name = "herb-disable-comment-valid-rule-name" + static ruleName = "herb-disable-comment-valid-rule-name" get defaultConfig(): FullRuleConfig { return { @@ -50,7 +50,7 @@ export class HerbDisableCommentValidRuleNameRule extends ParserRule { if (validRuleNames.length === 0) return [] const visitor = new HerbDisableCommentValidRuleNameVisitor( - this.name, + this.ruleName, validRuleNames, context ) diff --git a/javascript/packages/linter/src/rules/html-allowed-script-type.ts b/javascript/packages/linter/src/rules/html-allowed-script-type.ts index c01247ac5..cde185413 100644 --- a/javascript/packages/linter/src/rules/html-allowed-script-type.ts +++ b/javascript/packages/linter/src/rules/html-allowed-script-type.ts @@ -65,7 +65,7 @@ class AllowedScriptTypeVisitor extends BaseRuleVisitor { } export class HTMLAllowedScriptTypeRule extends ParserRule { - name = "html-allowed-script-type" + static ruleName = "html-allowed-script-type" get defaultConfig(): FullRuleConfig { return { @@ -75,7 +75,7 @@ export class HTMLAllowedScriptTypeRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AllowedScriptTypeVisitor(this.name, context) + const visitor = new AllowedScriptTypeVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-anchor-require-href.ts b/javascript/packages/linter/src/rules/html-anchor-require-href.ts index 595290220..6b11bc232 100644 --- a/javascript/packages/linter/src/rules/html-anchor-require-href.ts +++ b/javascript/packages/linter/src/rules/html-anchor-require-href.ts @@ -39,7 +39,7 @@ class AnchorRequireHrefVisitor extends BaseRuleVisitor { } export class HTMLAnchorRequireHrefRule extends ParserRule { - name = "html-anchor-require-href" + static ruleName = "html-anchor-require-href" get defaultConfig(): FullRuleConfig { return { @@ -49,7 +49,7 @@ export class HTMLAnchorRequireHrefRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AnchorRequireHrefVisitor(this.name, context) + const visitor = new AnchorRequireHrefVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-aria-attribute-must-be-valid.ts b/javascript/packages/linter/src/rules/html-aria-attribute-must-be-valid.ts index 7869b0385..5a2c9f2c3 100644 --- a/javascript/packages/linter/src/rules/html-aria-attribute-must-be-valid.ts +++ b/javascript/packages/linter/src/rules/html-aria-attribute-must-be-valid.ts @@ -25,7 +25,7 @@ class AriaAttributeMustBeValid extends AttributeVisitorMixin { } export class HTMLAriaAttributeMustBeValid extends ParserRule { - name = "html-aria-attribute-must-be-valid" + static ruleName = "html-aria-attribute-must-be-valid" get defaultConfig(): FullRuleConfig { return { @@ -35,7 +35,7 @@ export class HTMLAriaAttributeMustBeValid extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AriaAttributeMustBeValid(this.name, context) + const visitor = new AriaAttributeMustBeValid(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-aria-label-is-well-formatted.ts b/javascript/packages/linter/src/rules/html-aria-label-is-well-formatted.ts index 5d9bef6e5..fdc6c53f8 100644 --- a/javascript/packages/linter/src/rules/html-aria-label-is-well-formatted.ts +++ b/javascript/packages/linter/src/rules/html-aria-label-is-well-formatted.ts @@ -44,7 +44,7 @@ class AriaLabelIsWellFormattedVisitor extends AttributeVisitorMixin { } export class HTMLAriaLabelIsWellFormattedRule extends ParserRule { - name = "html-aria-label-is-well-formatted" + static ruleName = "html-aria-label-is-well-formatted" get defaultConfig(): FullRuleConfig { return { @@ -54,7 +54,7 @@ export class HTMLAriaLabelIsWellFormattedRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AriaLabelIsWellFormattedVisitor(this.name, context) + const visitor = new AriaLabelIsWellFormattedVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-aria-level-must-be-valid.ts b/javascript/packages/linter/src/rules/html-aria-level-must-be-valid.ts index 8f2466865..adcc911d0 100644 --- a/javascript/packages/linter/src/rules/html-aria-level-must-be-valid.ts +++ b/javascript/packages/linter/src/rules/html-aria-level-must-be-valid.ts @@ -63,7 +63,7 @@ class HTMLAriaLevelMustBeValidVisitor extends AttributeVisitorMixin { } export class HTMLAriaLevelMustBeValidRule extends ParserRule { - name = "html-aria-level-must-be-valid" + static ruleName = "html-aria-level-must-be-valid" get defaultConfig(): FullRuleConfig { return { @@ -73,7 +73,7 @@ export class HTMLAriaLevelMustBeValidRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HTMLAriaLevelMustBeValidVisitor(this.name, context) + const visitor = new HTMLAriaLevelMustBeValidVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-aria-role-heading-requires-level.ts b/javascript/packages/linter/src/rules/html-aria-role-heading-requires-level.ts index a526370de..703b3eb80 100644 --- a/javascript/packages/linter/src/rules/html-aria-role-heading-requires-level.ts +++ b/javascript/packages/linter/src/rules/html-aria-role-heading-requires-level.ts @@ -20,7 +20,7 @@ class AriaRoleHeadingRequiresLevel extends AttributeVisitorMixin { } export class HTMLAriaRoleHeadingRequiresLevelRule extends ParserRule { - name = "html-aria-role-heading-requires-level" + static ruleName = "html-aria-role-heading-requires-level" get defaultConfig(): FullRuleConfig { return { @@ -30,7 +30,7 @@ export class HTMLAriaRoleHeadingRequiresLevelRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AriaRoleHeadingRequiresLevel(this.name, context) + const visitor = new AriaRoleHeadingRequiresLevel(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-aria-role-must-be-valid.ts b/javascript/packages/linter/src/rules/html-aria-role-must-be-valid.ts index 67c80dbeb..a0df16f94 100644 --- a/javascript/packages/linter/src/rules/html-aria-role-must-be-valid.ts +++ b/javascript/packages/linter/src/rules/html-aria-role-must-be-valid.ts @@ -18,7 +18,7 @@ class AriaRoleMustBeValid extends AttributeVisitorMixin { } export class HTMLAriaRoleMustBeValidRule extends ParserRule { - name = "html-aria-role-must-be-valid" + static ruleName = "html-aria-role-must-be-valid" get defaultConfig(): FullRuleConfig { return { @@ -28,7 +28,7 @@ export class HTMLAriaRoleMustBeValidRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AriaRoleMustBeValid(this.name, context) + const visitor = new AriaRoleMustBeValid(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-attribute-double-quotes.ts b/javascript/packages/linter/src/rules/html-attribute-double-quotes.ts index 4ddc56cc6..8099ff62a 100644 --- a/javascript/packages/linter/src/rules/html-attribute-double-quotes.ts +++ b/javascript/packages/linter/src/rules/html-attribute-double-quotes.ts @@ -44,7 +44,7 @@ class AttributeDoubleQuotesVisitor extends AttributeVisitorMixin { static autocorrectable = true - name = "html-attribute-double-quotes" + static ruleName = "html-attribute-double-quotes" get defaultConfig(): FullRuleConfig { return { @@ -54,7 +54,7 @@ export class HTMLAttributeDoubleQuotesRule extends ParserRule): UnboundLintOffense[] { - const visitor = new AttributeDoubleQuotesVisitor(this.name, context) + const visitor = new AttributeDoubleQuotesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-attribute-equals-spacing.ts b/javascript/packages/linter/src/rules/html-attribute-equals-spacing.ts index 04e9be674..bfcb16848 100644 --- a/javascript/packages/linter/src/rules/html-attribute-equals-spacing.ts +++ b/javascript/packages/linter/src/rules/html-attribute-equals-spacing.ts @@ -34,7 +34,7 @@ class HTMLAttributeEqualsSpacingVisitor extends BaseRuleVisitor { static autocorrectable = true - name = "html-attribute-equals-spacing" + static ruleName = "html-attribute-equals-spacing" get defaultConfig(): FullRuleConfig { return { @@ -44,7 +44,7 @@ export class HTMLAttributeEqualsSpacingRule extends ParserRule): UnboundLintOffense[] { - const visitor = new HTMLAttributeEqualsSpacingVisitor(this.name, context) + const visitor = new HTMLAttributeEqualsSpacingVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-attribute-values-require-quotes.ts b/javascript/packages/linter/src/rules/html-attribute-values-require-quotes.ts index f351c1334..41f54a7ac 100644 --- a/javascript/packages/linter/src/rules/html-attribute-values-require-quotes.ts +++ b/javascript/packages/linter/src/rules/html-attribute-values-require-quotes.ts @@ -52,7 +52,7 @@ class AttributeValuesRequireQuotesVisitor extends AttributeVisitorMixin { static autocorrectable = true - name = "html-attribute-values-require-quotes" + static ruleName = "html-attribute-values-require-quotes" get defaultConfig(): FullRuleConfig { return { @@ -62,7 +62,7 @@ export class HTMLAttributeValuesRequireQuotesRule extends ParserRule): UnboundLintOffense[] { - const visitor = new AttributeValuesRequireQuotesVisitor(this.name, context) + const visitor = new AttributeValuesRequireQuotesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-avoid-both-disabled-and-aria-disabled.ts b/javascript/packages/linter/src/rules/html-avoid-both-disabled-and-aria-disabled.ts index 9d0f0edaa..c53e8af7d 100644 --- a/javascript/packages/linter/src/rules/html-avoid-both-disabled-and-aria-disabled.ts +++ b/javascript/packages/linter/src/rules/html-avoid-both-disabled-and-aria-disabled.ts @@ -52,7 +52,7 @@ class AvoidBothDisabledAndAriaDisabledVisitor extends BaseRuleVisitor { } export class HTMLAvoidBothDisabledAndAriaDisabledRule extends ParserRule { - name = "html-avoid-both-disabled-and-aria-disabled" + static ruleName = "html-avoid-both-disabled-and-aria-disabled" get defaultConfig(): FullRuleConfig { return { @@ -62,7 +62,7 @@ export class HTMLAvoidBothDisabledAndAriaDisabledRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AvoidBothDisabledAndAriaDisabledVisitor(this.name, context) + const visitor = new AvoidBothDisabledAndAriaDisabledVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-body-only-elements.ts b/javascript/packages/linter/src/rules/html-body-only-elements.ts index fd06fa983..1a98bbc1a 100644 --- a/javascript/packages/linter/src/rules/html-body-only-elements.ts +++ b/javascript/packages/linter/src/rules/html-body-only-elements.ts @@ -40,7 +40,7 @@ class HTMLBodyOnlyElementsVisitor extends BaseRuleVisitor { export class HTMLBodyOnlyElementsRule extends ParserRule { static autocorrectable = false - name = "html-body-only-elements" + static ruleName = "html-body-only-elements" get defaultConfig(): FullRuleConfig { return { @@ -51,7 +51,7 @@ export class HTMLBodyOnlyElementsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HTMLBodyOnlyElementsVisitor(this.name, context) + const visitor = new HTMLBodyOnlyElementsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-boolean-attributes-no-value.ts b/javascript/packages/linter/src/rules/html-boolean-attributes-no-value.ts index 181279a4b..486718b5a 100644 --- a/javascript/packages/linter/src/rules/html-boolean-attributes-no-value.ts +++ b/javascript/packages/linter/src/rules/html-boolean-attributes-no-value.ts @@ -34,7 +34,7 @@ class BooleanAttributesNoValueVisitor extends AttributeVisitorMixin { static autocorrectable = true - name = "html-boolean-attributes-no-value" + static ruleName = "html-boolean-attributes-no-value" get defaultConfig(): FullRuleConfig { return { @@ -44,7 +44,7 @@ export class HTMLBooleanAttributesNoValueRule extends ParserRule): UnboundLintOffense[] { - const visitor = new BooleanAttributesNoValueVisitor(this.name, context) + const visitor = new BooleanAttributesNoValueVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-head-only-elements.ts b/javascript/packages/linter/src/rules/html-head-only-elements.ts index f63e7dc46..9c7ad5749 100644 --- a/javascript/packages/linter/src/rules/html-head-only-elements.ts +++ b/javascript/packages/linter/src/rules/html-head-only-elements.ts @@ -51,7 +51,7 @@ class HeadOnlyElementsVisitor extends BaseRuleVisitor { export class HTMLHeadOnlyElementsRule extends ParserRule { static autocorrectable = false - name = "html-head-only-elements" + static ruleName = "html-head-only-elements" get defaultConfig(): FullRuleConfig { return { @@ -62,7 +62,7 @@ export class HTMLHeadOnlyElementsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HeadOnlyElementsVisitor(this.name, context) + const visitor = new HeadOnlyElementsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-iframe-has-title.ts b/javascript/packages/linter/src/rules/html-iframe-has-title.ts index 0741ebdce..7e6a3c0a2 100644 --- a/javascript/packages/linter/src/rules/html-iframe-has-title.ts +++ b/javascript/packages/linter/src/rules/html-iframe-has-title.ts @@ -48,7 +48,7 @@ class IframeHasTitleVisitor extends BaseRuleVisitor { } export class HTMLIframeHasTitleRule extends ParserRule { - name = "html-iframe-has-title" + static ruleName = "html-iframe-has-title" get defaultConfig(): FullRuleConfig { return { @@ -58,7 +58,7 @@ export class HTMLIframeHasTitleRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new IframeHasTitleVisitor(this.name, context) + const visitor = new IframeHasTitleVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-img-require-alt.ts b/javascript/packages/linter/src/rules/html-img-require-alt.ts index 5635e8d5a..9323a2334 100644 --- a/javascript/packages/linter/src/rules/html-img-require-alt.ts +++ b/javascript/packages/linter/src/rules/html-img-require-alt.ts @@ -27,7 +27,7 @@ class ImgRequireAltVisitor extends BaseRuleVisitor { } export class HTMLImgRequireAltRule extends ParserRule { - name = "html-img-require-alt" + static ruleName = "html-img-require-alt" get defaultConfig(): FullRuleConfig { return { @@ -37,7 +37,7 @@ export class HTMLImgRequireAltRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new ImgRequireAltVisitor(this.name, context) + const visitor = new ImgRequireAltVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/linter/src/rules/html-input-require-autocomplete.ts b/javascript/packages/linter/src/rules/html-input-require-autocomplete.ts index 81cdf74c0..eda23ab44 100644 --- a/javascript/packages/linter/src/rules/html-input-require-autocomplete.ts +++ b/javascript/packages/linter/src/rules/html-input-require-autocomplete.ts @@ -66,7 +66,7 @@ class HTMLInputRequireAutocompleteVisitor extends BaseRuleVisitor { } export class HTMLInputRequireAutocompleteRule extends ParserRule { - name = "html-input-require-autocomplete" + static ruleName = "html-input-require-autocomplete" get defaultConfig(): FullRuleConfig { return { @@ -76,7 +76,7 @@ export class HTMLInputRequireAutocompleteRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HTMLInputRequireAutocompleteVisitor(this.name, context) + const visitor = new HTMLInputRequireAutocompleteVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-navigation-has-label.ts b/javascript/packages/linter/src/rules/html-navigation-has-label.ts index f2ec8e20c..295f3f346 100644 --- a/javascript/packages/linter/src/rules/html-navigation-has-label.ts +++ b/javascript/packages/linter/src/rules/html-navigation-has-label.ts @@ -51,7 +51,7 @@ class NavigationHasLabelVisitor extends BaseRuleVisitor { } export class HTMLNavigationHasLabelRule extends ParserRule { - name = "html-navigation-has-label" + static ruleName = "html-navigation-has-label" get defaultConfig(): FullRuleConfig { return { @@ -61,7 +61,7 @@ export class HTMLNavigationHasLabelRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NavigationHasLabelVisitor(this.name, context) + const visitor = new NavigationHasLabelVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-abstract-roles.ts b/javascript/packages/linter/src/rules/html-no-abstract-roles.ts index 0466d405a..ae14bf13d 100644 --- a/javascript/packages/linter/src/rules/html-no-abstract-roles.ts +++ b/javascript/packages/linter/src/rules/html-no-abstract-roles.ts @@ -21,7 +21,7 @@ class NoAbstractRolesVisitor extends AttributeVisitorMixin { } export class HTMLNoAbstractRolesRule extends ParserRule { - name = "html-no-abstract-roles" + static ruleName = "html-no-abstract-roles" get defaultConfig(): FullRuleConfig { return { @@ -31,7 +31,7 @@ export class HTMLNoAbstractRolesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoAbstractRolesVisitor(this.name, context) + const visitor = new NoAbstractRolesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-aria-hidden-on-body.ts b/javascript/packages/linter/src/rules/html-no-aria-hidden-on-body.ts index 5845eb079..ebef528ef 100644 --- a/javascript/packages/linter/src/rules/html-no-aria-hidden-on-body.ts +++ b/javascript/packages/linter/src/rules/html-no-aria-hidden-on-body.ts @@ -38,7 +38,7 @@ class NoAriaHiddenBodyVisitor extends BaseRuleVisitor { } export class HTMLNoAriaHiddenOnBodyRule extends ParserRule { - name = "html-no-aria-hidden-on-body" + static ruleName = "html-no-aria-hidden-on-body" get defaultConfig(): FullRuleConfig { return { @@ -48,7 +48,7 @@ export class HTMLNoAriaHiddenOnBodyRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoAriaHiddenBodyVisitor(this.name, context) + const visitor = new NoAriaHiddenBodyVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-aria-hidden-on-focusable.ts b/javascript/packages/linter/src/rules/html-no-aria-hidden-on-focusable.ts index a6a5a7966..39a0f2f96 100644 --- a/javascript/packages/linter/src/rules/html-no-aria-hidden-on-focusable.ts +++ b/javascript/packages/linter/src/rules/html-no-aria-hidden-on-focusable.ts @@ -77,7 +77,7 @@ class NoAriaHiddenOnFocusableVisitor extends BaseRuleVisitor { } export class HTMLNoAriaHiddenOnFocusableRule extends ParserRule { - name = "html-no-aria-hidden-on-focusable" + static ruleName = "html-no-aria-hidden-on-focusable" get defaultConfig(): FullRuleConfig { return { @@ -87,7 +87,7 @@ export class HTMLNoAriaHiddenOnFocusableRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoAriaHiddenOnFocusableVisitor(this.name, context) + const visitor = new NoAriaHiddenOnFocusableVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-block-inside-inline.ts b/javascript/packages/linter/src/rules/html-no-block-inside-inline.ts index 8a672de4c..e4fce0c52 100644 --- a/javascript/packages/linter/src/rules/html-no-block-inside-inline.ts +++ b/javascript/packages/linter/src/rules/html-no-block-inside-inline.ts @@ -68,7 +68,7 @@ class BlockInsideInlineVisitor extends BaseRuleVisitor { } export class HTMLNoBlockInsideInlineRule extends ParserRule { - name = "html-no-block-inside-inline" + static ruleName = "html-no-block-inside-inline" get defaultConfig(): FullRuleConfig { return { @@ -78,7 +78,7 @@ export class HTMLNoBlockInsideInlineRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new BlockInsideInlineVisitor(this.name, context) + const visitor = new BlockInsideInlineVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/linter/src/rules/html-no-duplicate-attributes.ts b/javascript/packages/linter/src/rules/html-no-duplicate-attributes.ts index 1e8b0aab2..0c6c2c6b8 100644 --- a/javascript/packages/linter/src/rules/html-no-duplicate-attributes.ts +++ b/javascript/packages/linter/src/rules/html-no-duplicate-attributes.ts @@ -162,7 +162,7 @@ class NoDuplicateAttributesVisitor extends ControlFlowTrackingVisitor< } export class HTMLNoDuplicateAttributesRule extends ParserRule { - name = "html-no-duplicate-attributes" + static ruleName = "html-no-duplicate-attributes" get defaultConfig(): FullRuleConfig { return { @@ -172,7 +172,7 @@ export class HTMLNoDuplicateAttributesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoDuplicateAttributesVisitor(this.name, context) + const visitor = new NoDuplicateAttributesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-duplicate-ids.ts b/javascript/packages/linter/src/rules/html-no-duplicate-ids.ts index 4b4546b30..86936936e 100644 --- a/javascript/packages/linter/src/rules/html-no-duplicate-ids.ts +++ b/javascript/packages/linter/src/rules/html-no-duplicate-ids.ts @@ -199,7 +199,7 @@ class NoDuplicateIdsVisitor extends ControlFlowTrackingVisitor): UnboundLintOffense[] { - const visitor = new NoDuplicateIdsVisitor(this.name, context) + const visitor = new NoDuplicateIdsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-duplicate-meta-names.ts b/javascript/packages/linter/src/rules/html-no-duplicate-meta-names.ts index b8b25e6fe..dec425d50 100644 --- a/javascript/packages/linter/src/rules/html-no-duplicate-meta-names.ts +++ b/javascript/packages/linter/src/rules/html-no-duplicate-meta-names.ts @@ -183,7 +183,7 @@ class HTMLNoDuplicateMetaNamesVisitor extends ControlFlowTrackingVisitor): UnboundLintOffense[] { - const visitor = new HTMLNoDuplicateMetaNamesVisitor(this.name, context) + const visitor = new HTMLNoDuplicateMetaNamesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-empty-attributes.ts b/javascript/packages/linter/src/rules/html-no-empty-attributes.ts index 13088c4ef..754d9186e 100644 --- a/javascript/packages/linter/src/rules/html-no-empty-attributes.ts +++ b/javascript/packages/linter/src/rules/html-no-empty-attributes.ts @@ -120,7 +120,7 @@ class NoEmptyAttributesVisitor extends AttributeVisitorMixin { } export class HTMLNoEmptyAttributesRule extends ParserRule { - name = "html-no-empty-attributes" + static ruleName = "html-no-empty-attributes" get defaultConfig(): FullRuleConfig { return { @@ -130,7 +130,7 @@ export class HTMLNoEmptyAttributesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoEmptyAttributesVisitor(this.name, context) + const visitor = new NoEmptyAttributesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-empty-headings.ts b/javascript/packages/linter/src/rules/html-no-empty-headings.ts index 545bd1a94..95d7e39d3 100644 --- a/javascript/packages/linter/src/rules/html-no-empty-headings.ts +++ b/javascript/packages/linter/src/rules/html-no-empty-headings.ts @@ -125,7 +125,7 @@ class NoEmptyHeadingsVisitor extends BaseRuleVisitor { } export class HTMLNoEmptyHeadingsRule extends ParserRule { - name = "html-no-empty-headings" + static ruleName = "html-no-empty-headings" get defaultConfig(): FullRuleConfig { return { @@ -135,7 +135,7 @@ export class HTMLNoEmptyHeadingsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoEmptyHeadingsVisitor(this.name, context) + const visitor = new NoEmptyHeadingsVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/linter/src/rules/html-no-nested-links.ts b/javascript/packages/linter/src/rules/html-no-nested-links.ts index e43b8e2f6..6e09cb305 100644 --- a/javascript/packages/linter/src/rules/html-no-nested-links.ts +++ b/javascript/packages/linter/src/rules/html-no-nested-links.ts @@ -63,7 +63,7 @@ class NestedLinkVisitor extends BaseRuleVisitor { } export class HTMLNoNestedLinksRule extends ParserRule { - name = "html-no-nested-links" + static ruleName = "html-no-nested-links" get defaultConfig(): FullRuleConfig { return { @@ -73,7 +73,7 @@ export class HTMLNoNestedLinksRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NestedLinkVisitor(this.name, context) + const visitor = new NestedLinkVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/linter/src/rules/html-no-positive-tab-index.ts b/javascript/packages/linter/src/rules/html-no-positive-tab-index.ts index 565abbd93..29aa9ed81 100644 --- a/javascript/packages/linter/src/rules/html-no-positive-tab-index.ts +++ b/javascript/packages/linter/src/rules/html-no-positive-tab-index.ts @@ -20,7 +20,7 @@ class NoPositiveTabIndexVisitor extends AttributeVisitorMixin { } export class HTMLNoPositiveTabIndexRule extends ParserRule { - name = "html-no-positive-tab-index" + static ruleName = "html-no-positive-tab-index" get defaultConfig(): FullRuleConfig { return { @@ -30,7 +30,7 @@ export class HTMLNoPositiveTabIndexRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoPositiveTabIndexVisitor(this.name, context) + const visitor = new NoPositiveTabIndexVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-self-closing.ts b/javascript/packages/linter/src/rules/html-no-self-closing.ts index 563b20945..1a4e44c5a 100644 --- a/javascript/packages/linter/src/rules/html-no-self-closing.ts +++ b/javascript/packages/linter/src/rules/html-no-self-closing.ts @@ -40,7 +40,7 @@ class NoSelfClosingVisitor extends BaseRuleVisitor export class HTMLNoSelfClosingRule extends ParserRule { static autocorrectable = true - name = "html-no-self-closing" + static ruleName = "html-no-self-closing" get defaultConfig(): FullRuleConfig { return { @@ -51,7 +51,7 @@ export class HTMLNoSelfClosingRule extends ParserRule): UnboundLintOffense[] { - const visitor = new NoSelfClosingVisitor(this.name, context) + const visitor = new NoSelfClosingVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-space-in-tag.ts b/javascript/packages/linter/src/rules/html-no-space-in-tag.ts index 4e5d6beaa..aacaa1297 100644 --- a/javascript/packages/linter/src/rules/html-no-space-in-tag.ts +++ b/javascript/packages/linter/src/rules/html-no-space-in-tag.ts @@ -144,7 +144,7 @@ class HTMLNoSpaceInTagVisitor extends BaseRuleVisitor { // TODO: enable and fix autofix static autocorrectable = false - name = "html-no-space-in-tag" + static ruleName = "html-no-space-in-tag" get defaultConfig(): FullRuleConfig { return { @@ -154,7 +154,7 @@ export class HTMLNoSpaceInTagRule extends ParserRule): UnboundLintOffense[] { - const visitor = new HTMLNoSpaceInTagVisitor(this.name, context) + const visitor = new HTMLNoSpaceInTagVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-title-attribute.ts b/javascript/packages/linter/src/rules/html-no-title-attribute.ts index 6e5bd1fbc..0c472262d 100644 --- a/javascript/packages/linter/src/rules/html-no-title-attribute.ts +++ b/javascript/packages/linter/src/rules/html-no-title-attribute.ts @@ -29,7 +29,7 @@ class NoTitleAttributeVisitor extends BaseRuleVisitor { } export class HTMLNoTitleAttributeRule extends ParserRule { - name = "html-no-title-attribute" + static ruleName = "html-no-title-attribute" get defaultConfig(): FullRuleConfig { return { @@ -39,7 +39,7 @@ export class HTMLNoTitleAttributeRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new NoTitleAttributeVisitor(this.name, context) + const visitor = new NoTitleAttributeVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-no-underscores-in-attribute-names.ts b/javascript/packages/linter/src/rules/html-no-underscores-in-attribute-names.ts index ee8546f6f..97cbccefb 100644 --- a/javascript/packages/linter/src/rules/html-no-underscores-in-attribute-names.ts +++ b/javascript/packages/linter/src/rules/html-no-underscores-in-attribute-names.ts @@ -47,7 +47,7 @@ class HTMLNoUnderscoresInAttributeNamesVisitor extends AttributeVisitorMixin { } export class HTMLNoUnderscoresInAttributeNamesRule extends ParserRule { - name = "html-no-underscores-in-attribute-names" + static ruleName = "html-no-underscores-in-attribute-names" get defaultConfig(): FullRuleConfig { return { @@ -57,7 +57,7 @@ export class HTMLNoUnderscoresInAttributeNamesRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new HTMLNoUnderscoresInAttributeNamesVisitor(this.name, context) + const visitor = new HTMLNoUnderscoresInAttributeNamesVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-require-closing-tags.ts b/javascript/packages/linter/src/rules/html-require-closing-tags.ts index 3850afe90..90c4cb7e3 100644 --- a/javascript/packages/linter/src/rules/html-require-closing-tags.ts +++ b/javascript/packages/linter/src/rules/html-require-closing-tags.ts @@ -18,7 +18,7 @@ class RequireClosingTagsVisitor extends BaseRuleVisitor { export class HTMLRequireClosingTagsRule extends ParserRule { static autocorrectable = false - name = "html-require-closing-tags" + static ruleName = "html-require-closing-tags" get defaultConfig(): FullRuleConfig { return { @@ -32,7 +32,7 @@ export class HTMLRequireClosingTagsRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new RequireClosingTagsVisitor(this.name, context) + const visitor = new RequireClosingTagsVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/html-tag-name-lowercase.ts b/javascript/packages/linter/src/rules/html-tag-name-lowercase.ts index 142a0123b..5d687dd11 100644 --- a/javascript/packages/linter/src/rules/html-tag-name-lowercase.ts +++ b/javascript/packages/linter/src/rules/html-tag-name-lowercase.ts @@ -73,7 +73,7 @@ class TagNameLowercaseVisitor extends BaseRuleVisitor { export class HTMLTagNameLowercaseRule extends ParserRule { static autocorrectable = true - name = "html-tag-name-lowercase" + static ruleName = "html-tag-name-lowercase" get defaultConfig(): FullRuleConfig { return { @@ -84,7 +84,7 @@ export class HTMLTagNameLowercaseRule extends ParserRule } isEnabled(result: ParseResult, _context?: Partial): boolean { - const checker = new XMLDeclarationChecker(this.name) + const checker = new XMLDeclarationChecker(this.ruleName) checker.visit(result.value) @@ -92,7 +92,7 @@ export class HTMLTagNameLowercaseRule extends ParserRule } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new TagNameLowercaseVisitor(this.name, context) + const visitor = new TagNameLowercaseVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/parser-no-errors.ts b/javascript/packages/linter/src/rules/parser-no-errors.ts index dede343e4..003e617c7 100644 --- a/javascript/packages/linter/src/rules/parser-no-errors.ts +++ b/javascript/packages/linter/src/rules/parser-no-errors.ts @@ -4,7 +4,7 @@ import type { LintOffense, FullRuleConfig } from "../types.js" import type { ParseResult, HerbError } from "@herb-tools/core" export class ParserNoErrorsRule extends ParserRule { - name = "parser-no-errors" + static ruleName = "parser-no-errors" get defaultConfig(): FullRuleConfig { return { @@ -24,8 +24,8 @@ export class ParserNoErrorsRule extends ParserRule { message: `${error.message} (\`${error.type}\`)`, location: error.location, severity: error.severity, - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" } } diff --git a/javascript/packages/linter/src/rules/svg-tag-name-capitalization.ts b/javascript/packages/linter/src/rules/svg-tag-name-capitalization.ts index dae5e0fa7..d3d9be98b 100644 --- a/javascript/packages/linter/src/rules/svg-tag-name-capitalization.ts +++ b/javascript/packages/linter/src/rules/svg-tag-name-capitalization.ts @@ -69,7 +69,7 @@ class SVGTagNameCapitalizationVisitor extends BaseRuleVisitor { static autocorrectable = true - name = "svg-tag-name-capitalization" + static ruleName = "svg-tag-name-capitalization" get defaultConfig(): FullRuleConfig { return { @@ -79,7 +79,7 @@ export class SVGTagNameCapitalizationRule extends ParserRule): UnboundLintOffense[] { - const visitor = new SVGTagNameCapitalizationVisitor(this.name, context) + const visitor = new SVGTagNameCapitalizationVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/rules/turbo-permanent-require-id.ts b/javascript/packages/linter/src/rules/turbo-permanent-require-id.ts index dba4fd264..0eeac70e1 100644 --- a/javascript/packages/linter/src/rules/turbo-permanent-require-id.ts +++ b/javascript/packages/linter/src/rules/turbo-permanent-require-id.ts @@ -29,7 +29,7 @@ class TurboPermanentRequireIdVisitor extends BaseRuleVisitor { } export class TurboPermanentRequireIdRule extends ParserRule { - name = "turbo-permanent-require-id" + static ruleName = "turbo-permanent-require-id" get defaultConfig(): FullRuleConfig { return { @@ -39,7 +39,7 @@ export class TurboPermanentRequireIdRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new TurboPermanentRequireIdVisitor(this.name, context) + const visitor = new TurboPermanentRequireIdVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/linter/src/types.ts b/javascript/packages/linter/src/types.ts index d3ef9962a..2590067fe 100644 --- a/javascript/packages/linter/src/types.ts +++ b/javascript/packages/linter/src/types.ts @@ -17,9 +17,9 @@ export type FullRuleConfig = Required> /** * Automatically inferred union type of all available linter rule names. - * This type extracts the 'name' property from each rule class instance. + * This type extracts the 'ruleName' property from each rule class. */ -export type LinterRule = InstanceType['name'] +export type LinterRule = (typeof rules[number])['ruleName'] /** @@ -87,11 +87,15 @@ export const DEFAULT_RULE_CONFIG: FullRuleConfig = { */ export abstract class ParserRule { static type = "parser" as const + static ruleName: string /** Indicates whether this rule supports autofix. Defaults to false. */ static autocorrectable = false /** Indicates whether this rule supports unsafe autofix (requires --fix-unsafely). Defaults to false. */ static unsafeAutocorrectable = false - abstract name: string + + get ruleName(): string { + return (this.constructor as typeof ParserRule).ruleName + } get defaultConfig(): FullRuleConfig { return DEFAULT_RULE_CONFIG @@ -128,11 +132,15 @@ export abstract class ParserRule { static type = "lexer" as const + static ruleName: string /** Indicates whether this rule supports autofix. Defaults to false. */ static autocorrectable = false /** Indicates whether this rule supports unsafe autofix (requires --fix-unsafely). Defaults to false. */ static unsafeAutocorrectable = false - abstract name: string + + get ruleName(): string { + return (this.constructor as typeof LexerRule).ruleName + } get defaultConfig(): FullRuleConfig { return DEFAULT_RULE_CONFIG @@ -162,6 +170,7 @@ export abstract class LexerRule { static type = "source" as const + static ruleName: string /** Indicates whether this rule supports autofix. Defaults to false. */ static autocorrectable = false /** Indicates whether this rule supports unsafe autofix (requires --fix-unsafely). Defaults to false. */ static unsafeAutocorrectable = false - abstract name: string + + get ruleName(): string { + return (this.constructor as typeof SourceRule).ruleName + } get defaultConfig(): FullRuleConfig { return DEFAULT_RULE_CONFIG @@ -221,6 +234,7 @@ export abstract class SourceRule ParserRule) & { type?: "parser" + ruleName: string } export type LexerRuleClass = LexerRuleConstructor diff --git a/javascript/packages/linter/test/cli.test.ts b/javascript/packages/linter/test/cli.test.ts index b454f582d..ddedbdabf 100644 --- a/javascript/packages/linter/test/cli.test.ts +++ b/javascript/packages/linter/test/cli.test.ts @@ -649,7 +649,7 @@ describe("CLI Output Formatting", () => { writeFileSync(join(tempDir, ".herb/rules/no-hello-world.mjs"), dedent` export default class NoHelloWorldRule { - name = "no-hello-world" + static ruleName = "no-hello-world" check(document, context) { const errors = [] @@ -685,5 +685,40 @@ describe("CLI Output Formatting", () => { } } }) + + test("exits with an error when a custom rule uses the deprecated 'name' instance property", () => { + try { + mkdirSync(join(tempDir, ".herb/rules"), { recursive: true }) + mkdirSync(join(tempDir, "app/views"), { recursive: true }) + + writeFileSync(join(tempDir, ".herb.yml"), dedent` + version: 0.8.10 + linter: + enabled: true + `) + + writeFileSync(join(tempDir, ".herb/rules/deprecated-rule.mjs"), dedent` + export default class DeprecatedRule { + name = "deprecated-rule" + + check(document, context) { + return [] + } + } + `) + + writeFileSync(join(tempDir, "app/views/test.html.erb"), "
") + + const { output, exitCode } = runLinterFromPath(join(tempDir, "app/views/test.html.erb")) + + expect(output).toContain("sets 'name' as an instance property") + expect(output).toContain("static ruleName = \"deprecated-rule\"") + expect(exitCode).toBe(1) + } finally { + if (existsSync(tempDir)) { + rmSync(tempDir, { recursive: true, force: true }) + } + } + }) }) }) diff --git a/javascript/packages/linter/test/helpers/linter-test-helper.ts b/javascript/packages/linter/test/helpers/linter-test-helper.ts index a78cc772b..b6edad290 100644 --- a/javascript/packages/linter/test/helpers/linter-test-helper.ts +++ b/javascript/packages/linter/test/helpers/linter-test-helper.ts @@ -71,7 +71,7 @@ export function createLinterTest(rules: RuleClass | RuleClass[], configOverride? const ruleClasses = Array.isArray(rules) ? rules : [rules] const primaryRuleClass = ruleClasses[0] const ruleInstance = new primaryRuleClass() - const isParserNoErrorsRule = ruleInstance.name === "parser-no-errors" + const isParserNoErrorsRule = primaryRuleClass.ruleName === "parser-no-errors" const ruleParserOptions = ruleInstance instanceof ParserRule ? ruleInstance.parserOptions : {} const parseCache = new ParseCache(Herb) const ruleConfigOverride = configOverride @@ -135,8 +135,8 @@ export function createLinterTest(rules: RuleClass | RuleClass[], configOverride? ruleClasses.forEach(ruleClass => { const instance = new ruleClass() - const isPrimary = instance.name === ruleInstance.name - rulesConfig[instance.name] = isPrimary && ruleConfigOverride + const isPrimary = ruleClass.ruleName === primaryRuleClass.ruleName + rulesConfig[ruleClass.ruleName] = isPrimary && ruleConfigOverride ? { ...instance.defaultConfig, ...ruleConfigOverride } : instance.defaultConfig }) @@ -150,7 +150,7 @@ export function createLinterTest(rules: RuleClass | RuleClass[], configOverride? const linter = new Linter(Herb, ruleClasses, config) const lintResult = linter.lint(html, context) - const ruleName = ruleInstance.name + const ruleName = primaryRuleClass.ruleName const primaryOffenses = lintResult.offenses.filter(offense => offense.rule === ruleName) expect(primaryOffenses).toHaveLength(0) @@ -214,8 +214,8 @@ export function createLinterTest(rules: RuleClass | RuleClass[], configOverride? ruleClasses.forEach(ruleClass => { const instance = new ruleClass() - const isPrimary = instance.name === ruleInstance.name - rulesConfig[instance.name] = isPrimary && ruleConfigOverride + const isPrimary = ruleClass.ruleName === primaryRuleClass.ruleName + rulesConfig[ruleClass.ruleName] = isPrimary && ruleConfigOverride ? { ...instance.defaultConfig, ...ruleConfigOverride } : instance.defaultConfig }) @@ -228,7 +228,7 @@ export function createLinterTest(rules: RuleClass | RuleClass[], configOverride? const linter = new Linter(Herb, ruleClasses, config) const lintResult = linter.lint(html, context) - const ruleName = ruleInstance.name + const ruleName = primaryRuleClass.ruleName const primaryOffenses = lintResult.offenses.filter(o => o.rule === ruleName) const primaryErrors = primaryOffenses.filter(o => o.severity === "error") diff --git a/javascript/packages/linter/test/linter.test.ts b/javascript/packages/linter/test/linter.test.ts index 577465034..c4d2525a7 100644 --- a/javascript/packages/linter/test/linter.test.ts +++ b/javascript/packages/linter/test/linter.test.ts @@ -88,7 +88,7 @@ describe("@herb-tools/linter", () => { describe("Rule enablement", () => { class EnabledParserRule extends ParserRule { - name = "enabled-parser-rule" + static ruleName = "enabled-parser-rule" get defaultConfig() { return { enabled: true, severity: "error" as const } @@ -98,15 +98,15 @@ describe("@herb-tools/linter", () => { return [{ message: "Test offense", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } } class DisabledParserRule extends ParserRule { - name = "disabled-parser-rule" + static ruleName = "disabled-parser-rule" get defaultConfig() { return { enabled: true, severity: "error" as const } @@ -120,15 +120,15 @@ describe("@herb-tools/linter", () => { return [{ message: "This should never appear", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } } class FileBasedRule extends SourceRule { - name = "file-based-rule" + static ruleName = "file-based-rule" get defaultConfig() { return { enabled: true, severity: "info" as const } @@ -142,15 +142,15 @@ describe("@herb-tools/linter", () => { return [{ message: "ERB file detected", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } } class ContentBasedRule extends ParserRule { - name = "content-based-rule" + static ruleName = "content-based-rule" get defaultConfig() { return { enabled: true, severity: "info" as const } @@ -164,8 +164,8 @@ describe("@herb-tools/linter", () => { return [{ message: "Div found", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } @@ -384,7 +384,7 @@ describe("@herb-tools/linter", () => { test("filters rules based on default config", () => { class EnabledByDefaultRule extends ParserRule { - name = "enabled-by-default-rule" + static ruleName = "enabled-by-default-rule" get defaultConfig(): FullRuleConfig { return { @@ -397,15 +397,15 @@ describe("@herb-tools/linter", () => { return [{ message: "Enabled rule triggered", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } } class DisabledByDefaultRule extends ParserRule { - name = "disabled-by-default-rule" + static ruleName = "disabled-by-default-rule" get defaultConfig(): FullRuleConfig { return { @@ -418,8 +418,8 @@ describe("@herb-tools/linter", () => { return [{ message: "This should not appear", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } @@ -436,7 +436,7 @@ describe("@herb-tools/linter", () => { test("user config can enable a disabled-by-default rule", () => { class DisabledByDefaultRule extends ParserRule { - name = "disabled-by-default-rule" + static ruleName = "disabled-by-default-rule" get defaultConfig(): FullRuleConfig { return { @@ -449,8 +449,8 @@ describe("@herb-tools/linter", () => { return [{ message: "Rule enabled by user", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } @@ -555,7 +555,7 @@ describe("@herb-tools/linter", () => { test("Linter.from() with config enables and overrides severity", () => { class TestRule extends ParserRule { - name = "test-rule" + static ruleName = "test-rule" get defaultConfig(): FullRuleConfig { return { @@ -568,8 +568,8 @@ describe("@herb-tools/linter", () => { return [{ message: "Test offense", location: Location.from(1, 1, 1, 1), - rule: this.name, - code: this.name, + rule: this.ruleName, + code: this.ruleName, source: "linter" }] } @@ -613,7 +613,7 @@ describe("@herb-tools/linter", () => { test("Linter.filterRulesByConfig with empty config returns default enabled", () => { class EnabledRule extends ParserRule { - name = "enabled-rule" + static ruleName = "enabled-rule" get defaultConfig(): FullRuleConfig { return { enabled: true, severity: "error" } @@ -623,7 +623,7 @@ describe("@herb-tools/linter", () => { } class DisabledRule extends ParserRule { - name = "disabled-rule" + static ruleName = "disabled-rule" get defaultConfig(): FullRuleConfig { return { enabled: false, severity: "error" } @@ -635,12 +635,12 @@ describe("@herb-tools/linter", () => { const filtered = Linter.filterRulesByConfig([EnabledRule, DisabledRule]) expect(filtered).toHaveLength(1) - expect(new filtered[0]().name).toBe("enabled-rule") + expect(filtered[0].ruleName).toBe("enabled-rule") }) test("Linter.filterRulesByConfig respects user config", () => { class EnabledRule extends ParserRule { - name = "enabled-rule" + static ruleName = "enabled-rule" get defaultConfig(): FullRuleConfig { return { enabled: true, severity: "error" } @@ -650,7 +650,7 @@ describe("@herb-tools/linter", () => { } class DisabledRule extends ParserRule { - name = "disabled-rule" + static ruleName = "disabled-rule" get defaultConfig(): FullRuleConfig { return { enabled: false, severity: "error" } @@ -667,7 +667,7 @@ describe("@herb-tools/linter", () => { const filtered = Linter.filterRulesByConfig([EnabledRule, DisabledRule], config) expect(filtered).toHaveLength(1) - expect(new filtered[0]().name).toBe("disabled-rule") + expect(filtered[0].ruleName).toBe("disabled-rule") }) }) }) diff --git a/javascript/packages/stimulus-lint/src/rules/stimulus-attribute-format.ts b/javascript/packages/stimulus-lint/src/rules/stimulus-attribute-format.ts index 9d724d4bc..0b2fc4812 100644 --- a/javascript/packages/stimulus-lint/src/rules/stimulus-attribute-format.ts +++ b/javascript/packages/stimulus-lint/src/rules/stimulus-attribute-format.ts @@ -82,7 +82,7 @@ export class AttributeFormatVisitor extends AttributeVisitorMixin { } export class StimulusAttributeFormatRule extends ParserRule { - name = "stimulus-attribute-format" + static ruleName = "stimulus-attribute-format" get defaultConfig(): FullRuleConfig { return { @@ -92,7 +92,7 @@ export class StimulusAttributeFormatRule extends ParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new AttributeFormatVisitor(this.name, context) + const visitor = new AttributeFormatVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/stimulus-lint/src/rules/stimulus-data-action-valid.ts b/javascript/packages/stimulus-lint/src/rules/stimulus-data-action-valid.ts index 565060fbb..5ac5b7025 100644 --- a/javascript/packages/stimulus-lint/src/rules/stimulus-data-action-valid.ts +++ b/javascript/packages/stimulus-lint/src/rules/stimulus-data-action-valid.ts @@ -52,7 +52,7 @@ class DataActionValidVisitor extends StimulusRuleVisitor { } export class StimulusDataActionValidRule extends HerbParserRule { - name = "stimulus-data-action-valid" + static ruleName = "stimulus-data-action-valid" get defaultConfig(): FullRuleConfig { return { @@ -62,7 +62,7 @@ export class StimulusDataActionValidRule extends HerbParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new DataActionValidVisitor(this.name, context) + const visitor = new DataActionValidVisitor(this.ruleName, context) visitor.visit(result.value) return visitor.offenses } diff --git a/javascript/packages/stimulus-lint/src/rules/stimulus-data-controller-valid.ts b/javascript/packages/stimulus-lint/src/rules/stimulus-data-controller-valid.ts index 48ce1e8c5..81441063c 100644 --- a/javascript/packages/stimulus-lint/src/rules/stimulus-data-controller-valid.ts +++ b/javascript/packages/stimulus-lint/src/rules/stimulus-data-controller-valid.ts @@ -29,7 +29,7 @@ class DataControllerValidVisitor extends StimulusRuleVisitor { } export class StimulusDataControllerValidRule extends HerbParserRule { - name = "stimulus-data-controller-valid" + static ruleName = "stimulus-data-controller-valid" get defaultConfig(): FullRuleConfig { return { @@ -39,7 +39,7 @@ export class StimulusDataControllerValidRule extends HerbParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new DataControllerValidVisitor(this.name, context) + const visitor = new DataControllerValidVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/stimulus-lint/src/rules/stimulus-data-target-valid.ts b/javascript/packages/stimulus-lint/src/rules/stimulus-data-target-valid.ts index 6b4b8f075..d3b61bdfb 100644 --- a/javascript/packages/stimulus-lint/src/rules/stimulus-data-target-valid.ts +++ b/javascript/packages/stimulus-lint/src/rules/stimulus-data-target-valid.ts @@ -43,7 +43,7 @@ class DataTargetValidVisitor extends StimulusRuleVisitor { } export class StimulusDataTargetValidRule extends HerbParserRule { - name = "stimulus-data-target-valid" + static ruleName = "stimulus-data-target-valid" get defaultConfig(): FullRuleConfig { return { @@ -53,7 +53,7 @@ export class StimulusDataTargetValidRule extends HerbParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new DataTargetValidVisitor(this.name, context) + const visitor = new DataTargetValidVisitor(this.ruleName, context) visitor.visit(result.value) diff --git a/javascript/packages/stimulus-lint/src/rules/stimulus-data-value-valid.ts b/javascript/packages/stimulus-lint/src/rules/stimulus-data-value-valid.ts index 689ba6695..0e2788536 100644 --- a/javascript/packages/stimulus-lint/src/rules/stimulus-data-value-valid.ts +++ b/javascript/packages/stimulus-lint/src/rules/stimulus-data-value-valid.ts @@ -115,7 +115,7 @@ export class DataValueValidVisitor extends StimulusRuleVisitor { } export class StimulusDataValueValidRule extends HerbParserRule { - name = 'stimulus-data-value-valid' + static ruleName = 'stimulus-data-value-valid' get defaultConfig(): FullRuleConfig { return { @@ -125,7 +125,7 @@ export class StimulusDataValueValidRule extends HerbParserRule { } check(result: ParseResult, context?: Partial): UnboundLintOffense[] { - const visitor = new DataValueValidVisitor(this.name, context) + const visitor = new DataValueValidVisitor(this.ruleName, context) visitor.visit(result.value)