搜索

PythonReactSEOPDF
GitHub Skill

new-rule

Implement a new SonarJS rule from scratch. Use when creating a new rule, scaffolding rule files, or understanding the full rule implementation workflow.

SonarSource☆ 1,202 仓库 Stars192 仓库 Forks

安装与使用

请根据来源仓库和你的 AI 工具说明安装此技能。先阅读技能文件和依赖要求,再添加到工作流。

查看来源 ↗使用指南

技能说明

Overview

New rules follow the pattern: RSPEC description → scaffold → implement → test → ruling.

Step 1: Scaffold the Rule

npm run new-rule

This interactive script generates in packages/jsts/src/rules/SXXXX/:

  • index.ts — rule export
  • rule.ts — ESLint rule implementation (skeleton)
  • cb.fixture.js — empty comment-based test fixture
  • cb.test.js — test launcher

It also auto-generates (not tracked by git):

  • Java check class SXXXX.java
  • Updates rules/rules.ts and rules/plugin-rules.ts
  • Updates AllRules.java

Step 2: Configure the Java Check Class

In the generated Java class, verify:

  • @JavaScriptRule and/or @TypeScriptRule annotations match target languages
  • If rule has options, override configurations() method (see /rule-options skill)
  • If rule targets test files, extend TestFileCheck instead of Check

Step 3: Implement the Rule

File Structure

File Purpose
rule.ts ESLint rule implementation
meta.ts Manual metadata: implementation, eslintId, schema, re-exports fields
config.ts Option definitions with fields array (if rule has options)
generated-meta.ts Auto-generated from RSPEC — do not edit

Rule Template

import { generateMeta } from '../helpers/index.js';
import { meta } from './meta.js';

const messages = {
  errorKey: 'Error message to display',
};

export const rule: Rule.RuleModule = {
  meta: generateMeta(meta, { messages }),
  create(context: Rule.RuleContext) {
    return {
      Identifier(node: estree.Identifier) {
        if (/* violation detected */) {
          context.report({ messageId: 'errorKey', node });
        }
      },
    };
  },
};

Be Conservative

Never report when uncertain. False positives are worse than missed detections.

const services = context.sourceCode.parserServices;
if (!isRequiredParserServices(services)) {
  return; // No type info — don't report
}

When in doubt: skip.

Step 4: Check Shared Helpers

Before writing any utility code, check packages/jsts/src/rules/helpers/:

File Contains
ast.ts isFunctionNode, isIdentifier, hasTypePredicateReturn, AST traversal
module.ts isESModule, getImportDeclarations, getFullyQualifiedName
package-jsons/dependencies.ts getDependencies, getReactVersion
index.ts Re-exports all helpers — check here first

If a new utility would benefit multiple rules, add it to the appropriate helper file.

Step 5: Generate Metadata

After setting up meta.ts and optionally config.ts:

npm run generate-meta

This creates/updates generated-meta.ts with defaultOptions, sonarKey, scope, languages.

Step 6: Write Tests

See /test-rule skill for full testing documentation.

Quick start — write cb.fixture.js:

someCleanCode();                            // no issue raised

someFaultyCode(); // Noncompliant {{message}}
//  ^^^^^^^^^^

Run:

npx tsx --test packages/jsts/src/rules/S1234/**/*.test.ts

Step 7: Run Ruling

See /ruling skill. Required before merging new or modified rules.

Rule Implementation Patterns

Wrapping an ESLint Rule (decorated)

// meta.ts
export const implementation = 'decorated';
export const eslintId = 'no-magic-numbers';
export const externalRules = [
  { externalPlugin: 'typescript-eslint', externalRule: 'no-magic-numbers' },
];
export * from './config.js';

Original Rule

// meta.ts
export const implementation = 'original';
export const eslintId = 'function-name';
export * from './config.js';
import type { JSONSchema4 } from '@typescript-eslint/utils/json-schema';
export const schema = {
  type: 'array',
  items: [{ type: 'object', properties: { format: { type: 'string' } } }],
} as const satisfies JSONSchema4;

RSPEC Tags

When creating the RSPEC PR:

  • Tag type-dependent if the rule uses TypeScript type information
  • Add dependencies field if rule requires a specific import (e.g., 'react', 'jest')
  • Add compatibleLanguages: ['js', 'ts'] as appropriate

References

使用示例

查看来源仓库中的使用示例与配置说明。

查看来源 ↗

来源历史

收录时间
2026-03-11
索引更新时间
2026-03-11
Branch
main

收录与同步日期属于本站记录。源码修改历史请查看来源仓库。

GitHub ↗

chat Comments (0)

chat_bubble_outline

No comments yet. Be the first to share your thoughts!