@sun-asterisk/sunlint
Version:
☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards
1,944 lines (1,943 loc) • 90.1 kB
JSON
{
"rules": {
"C002": {
"id": "C002",
"name": "Rule C002",
"description": "Auto-migrated rule C002 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/no-duplicate-code"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C003": {
"id": "C003",
"name": "Rule C003",
"description": "Auto-migrated rule C003 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/no-vague-abbreviations"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C005": {
"name": "Single Responsibility Principle",
"description": "Each function should do one thing only",
"category": "design",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C005_single_responsibility/analyzer.js",
"config": "./rules/common/C005_single_responsibility/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"design",
"responsibility",
"maintainability"
],
"engineMappings": {
"eslint": [
"max-statements-per-line",
"complexity"
]
}
},
"C006": {
"name": "Function Naming Convention",
"description": "Tên hàm phải là động từ/verb-noun pattern",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"dart",
"kotlin",
"javascript"
],
"analyzer": "./rules/C006_function_naming/analyzer.js",
"config": "./rules/C006_function_naming/config.json",
"version": "1.0.0",
"status": "activated",
"tags": [
"naming",
"convention",
"readability"
],
"engineMappings": {
"eslint": [
"func-names",
"func-name-matching",
"@typescript-eslint/naming-convention"
]
}
},
"C007": {
"name": "Meaningful Comments",
"description": "Avoid comments that just describe the code",
"category": "documentation",
"severity": "info",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C007_meaningful_comments/analyzer.js",
"config": "./rules/common/C007_meaningful_comments/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"documentation",
"comments",
"maintainability"
],
"engineMappings": {
"eslint": [
"spaced-comment",
"no-inline-comments",
"no-warning-comments"
]
}
},
"C008": {
"name": "Minimize Variable Scope - Declare Near Usage",
"description": "Variables should be declared as close as possible to where they are first used",
"category": "code-quality",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "rules/common/C008_variable_declaration_locality/analyzer.js",
"config": "rules/common/C008_variable_declaration_locality/config.json",
"version": "1.0.0",
"status": "active",
"tags": [
"readability",
"maintainability",
"scope",
"best-practice"
],
"strategy": {
"preferred": "semantic",
"fallbacks": [
"semantic",
"ast"
],
"accuracy": {
"semantic": 95,
"ast": 90
}
},
"engineMappings": {
"semantic": [
"rules/common/C008_variable_declaration_locality/analyzer.js"
]
}
},
"C010": {
"name": "Limit Block Nesting",
"description": "Limit nested blocks (if/for/while/switch) to maximum 3 levels for readability",
"category": "complexity",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C010_limit_block_nesting/analyzer.js",
"config": "./rules/common/C010_limit_block_nesting/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"complexity",
"readability",
"nesting",
"maintainability"
],
"strategy": {
"preferred": "ast",
"fallbacks": [
"ast",
"regex"
],
"accuracy": {
"ast": 95,
"regex": 75
}
}
},
"C012": {
"name": "Command Query Separation",
"description": "Separate Command and Query operations (CQS principle)",
"category": "design",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C012_command_query_separation/analyzer.js",
"config": "./rules/common/C012_command_query_separation/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"design",
"separation",
"maintainability"
],
"engineMappings": {
"eslint": [
"consistent-return",
"no-void",
"@typescript-eslint/no-confusing-void-expression"
]
}
},
"C013": {
"name": "No Dead Code",
"description": "Detect and remove commented out code, unused variables/functions, and unreachable code",
"category": "maintainability",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C013_no_dead_code/analyzer.js",
"config": "./rules/common/C013_no_dead_code/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"dead-code",
"commented-code",
"unreachable-code",
"cleanup",
"maintainability"
],
"strategy": {
"preferred": "ast",
"fallbacks": [
"ast",
"regex"
],
"accuracy": {
"ast": 90,
"regex": 70
}
},
"engineMappings": {
"eslint": [
"no-unreachable",
"no-unused-vars",
"no-unused-expressions"
]
}
},
"C014": {
"name": "Dependency Injection Pattern",
"description": "Use Dependency Injection instead of direct instantiation in business logic. Increases testability and reduces coupling.",
"category": "design",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/common/C014_dependency_injection/analyzer.js",
"config": "./rules/common/C014_dependency_injection/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"design",
"dependency-injection",
"testability",
"coupling",
"SOLID"
],
"strategy": {
"preferred": "ast",
"fallbacks": [],
"accuracy": {
"ast": 95
},
"requirements": {
"ast": {
"semanticEngine": true,
"description": "C014 requires symbol-based analysis for accurate dependency injection pattern detection"
}
}
},
"engineMappings": {
"eslint": [
"no-new",
"no-new-wrappers",
"@typescript-eslint/no-unnecessary-constructor"
]
}
},
"C015": {
"name": "Domain Language",
"description": "Use domain language in class/function names",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C015_domain_language/analyzer.js",
"config": "./rules/common/C015_domain_language/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C017": {
"id": "C017",
"name": "Rule C017",
"description": "Auto-migrated rule C017 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/common/C017_constructor_logic/analyzer.js",
"config": "./rules/common/C017_constructor_logic/config.json",
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/limit-constructor-logic"
]
},
"strategy": {
"preferred": "semantic",
"fallbacks": [
"semantic",
"ast",
"regex"
],
"accuracy": {
"semantic": 95,
"ast": 85,
"regex": 70
}
}
},
"C018": {
"name": "Do not throw generic errors",
"description": "Always provide detailed messages and context.",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C018_no_throw_generic_error/analyzer.js",
"config": "./rules/common/C018_no_throw_generic_error/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C019": {
"name": "Log Level Usage",
"description": "Không sử dụng log mức error cho lỗi không nghiêm trọng",
"category": "logging",
"severity": "warning",
"languages": [
"typescript",
"dart",
"kotlin",
"javascript"
],
"analyzer": "./rules/common/C019_log_level_usage/analyzer.js",
"config": "./rules/common/C019_log_level_usage/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"logging",
"error-handling",
"severity"
],
"engineMappings": {
"eslint": [
"no-console",
"no-alert",
"no-debugger"
],
"heuristic": [
"rules/common/C019_log_level_usage/analyzer.js"
]
}
},
"C020": {
"name": "Unused Imports",
"description": "Không import các module hoặc symbol không sử dụng",
"category": "code-quality",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/common/C020_unused_imports/analyzer.js",
"config": "./rules/common/C020_unused_imports/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"imports",
"cleanup",
"unused-code"
],
"engineMappings": {
"eslint": [
"no-unused-vars",
"@typescript-eslint/no-unused-vars"
],
"heuristic": [
"rules/common/C020_unused_imports/analyzer.js"
]
}
},
"C021": {
"name": "Import Organization",
"description": "Tổ chức và sắp xếp imports theo nhóm và thứ tự alphabet",
"category": "code-quality",
"severity": "info",
"languages": [
"typescript",
"javascript"
],
"analyzer": "./rules/common/C021_import_organization/analyzer.js",
"config": "./rules/common/C021_import_organization/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"imports",
"organization",
"readability"
],
"engineMappings": {
"eslint": [
"import/order",
"sort-imports"
],
"heuristic": [
"rules/common/C021_import_organization/analyzer.js"
]
}
},
"C023": {
"name": "Do not declare duplicate variable",
"description": "Do not declare duplicate variable names in the same scope",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C023_no_duplicate_variable/analyzer.js",
"config": "./rules/common/C023_no_duplicate_variable/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C024": {
"name": "Do not scatter hardcoded constants throughout the logic",
"description": "The rule prevents scattering hardcoded constants throughout the logic. Instead, constants should be defined in a single place to improve maintainability and readability.",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C024_no_scatter_hardcoded_constants/analyzer.js",
"config": "./rules/common/C024_no_scatter_hardcoded_constants/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C029": {
"name": "Catch Block Error Logging",
"description": "Mọi catch block phải log nguyên nhân lỗi đầy đủ",
"category": "error-handling",
"severity": "error",
"languages": [
"typescript",
"dart",
"kotlin",
"javascript"
],
"analyzer": "./rules/C029_catch_block_logging/analyzer.js",
"config": "./rules/C029_catch_block_logging/config.json",
"version": "1.0.0",
"status": "activated",
"tags": [
"error-handling",
"logging",
"debugging",
"monitoring"
]
},
"C030": {
"id": "C030",
"name": "Rule C030",
"description": "Auto-migrated rule C030 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/use-custom-error-classes"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C031": {
"name": "Validation Logic Separation",
"description": "Logic kiểm tra dữ liệu (validate) phải nằm riêng biệt",
"category": "validation",
"severity": "error",
"languages": [
"typescript",
"dart",
"kotlin",
"javascript"
],
"analyzer": "./rules/C031_validation_separation/analyzer.js",
"config": "./rules/C031_validation_separation/config.json",
"version": "1.0.0",
"status": "experimental",
"tags": [
"validation",
"separation",
"architecture"
],
"engineMappings": {
"eslint": [
"no-implicit-coercion",
"eqeqeq",
"@typescript-eslint/strict-boolean-expressions"
]
}
},
"C032": {
"name": "No External APIs in Constructors",
"description": "Don't call external APIs in constructors or static blocks",
"category": "design",
"severity": "error",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C032_no_constructor_api/analyzer.js",
"config": "./rules/common/C032_no_constructor_api/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"design",
"constructor",
"initialization"
],
"engineMappings": {
"eslint": [
"no-new",
"@typescript-eslint/no-floating-promises",
"no-constructor-return"
]
}
},
"C033": {
"name": "Separate Processing Logic and Data Queries",
"description": "Separate processing logic and data queries in service layer",
"category": "architecture",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C033_separate_logic_data/analyzer.js",
"config": "./rules/common/C033_separate_logic_data/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"architecture",
"separation",
"service"
],
"engineMappings": {
"eslint": [
"prefer-const",
"no-var",
"@typescript-eslint/prefer-readonly"
]
}
},
"C034": {
"name": "Limit Direct Access to Global State",
"description": "Limit direct access to global state in domain logic",
"category": "architecture",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C034_limit_global_state/analyzer.js",
"config": "./rules/common/C034_limit_global_state/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"architecture",
"global-state",
"design"
],
"engineMappings": {
"eslint": [
"no-global-assign",
"no-implicit-globals",
"@typescript-eslint/no-namespace"
]
}
},
"C035": {
"name": "Log all relevant context when handling errors",
"description": "When handling errors, must log full information related - structured logging with context",
"category": "error-handling",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C035_error_logging_context/analyzer.js",
"config": "./rules/common/C035_error_logging_context/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"logging",
"error-handling",
"observability",
"debugging"
],
"engineMappings": {
"eslint": [
"no-empty-catch",
"@typescript-eslint/no-unused-vars"
]
}
},
"C037": {
"name": "Standard Response Objects",
"description": "API handlers should return standard response objects (not raw strings)",
"category": "api",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C037_standard_response/analyzer.js",
"config": "./rules/common/C037_standard_response/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"api",
"response",
"standardization"
],
"engineMappings": {
"eslint": [
"consistent-return",
"@typescript-eslint/explicit-function-return-type",
"@typescript-eslint/explicit-module-boundary-types"
]
}
},
"C038": {
"name": "No File Loading Order Dependency",
"description": "Avoid logic depending on file/module loading order",
"category": "architecture",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C038_no_loading_order/analyzer.js",
"config": "./rules/common/C038_no_loading_order/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"architecture",
"loading",
"dependency"
],
"engineMappings": {
"eslint": [
"import/no-dynamic-require",
"import/order",
"@typescript-eslint/no-var-requires"
]
}
},
"C040": {
"name": "Centralized Validation Logic",
"description": "Don't scatter validation logic across multiple classes",
"category": "validation",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C040_centralized_validation/analyzer.js",
"config": "./rules/common/C040_centralized_validation/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"validation",
"centralization",
"architecture"
],
"engineMappings": {
"eslint": [
"no-duplicate-imports",
"import/no-duplicates",
"@typescript-eslint/no-duplicate-imports"
]
}
},
"C041": {
"name": "Do not hardcode or push sensitive information (token, API key, secret, URL) into the repo",
"description": "Protect sensitive application data, avoid security risks, and comply with security standards. Exposing sensitive information can lead to serious security and privacy issues.",
"category": "security",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C041_no_sensitive_hardcode/analyzer.js",
"config": "./rules/common/C041_no_sensitive_hardcode/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C042": {
"id": "C042",
"name": "Rule C042",
"description": "Auto-migrated rule C042 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/boolean-name-prefix"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C043": {
"name": "No Console Or Print",
"description": "Do not use console.log or print in production code",
"category": "logging",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/common/C043_no_console_or_print/analyzer.js",
"version": "1.0.0",
"status": "stable",
"tags": [
"logging",
"production",
"debugging",
"console"
],
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {
"regex": 90
}
}
},
"C047": {
"id": "C047",
"name": "Rule C047",
"description": "Auto-migrated rule C047 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/no-duplicate-retry-logic"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C048": {
"name": "Do not bypass architectural layers (controller/service/repository)",
"description": "Maintain a clear layered architecture, ensuring logic and data flow are well-structured and maintainable.",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C048_no_bypass_architectural_layers/analyzer.js",
"config": "./rules/common/C048_no_bypass_architectural_layers/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C052": {
"name": "Parsing or data transformation logic must be separated from controllers",
"description": "Enforce separation of concerns — controllers should only handle requests and delegate processing, improving testability, maintainability, and reuse.",
"category": "naming",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C052_parsing_or_data_transformation/analyzer.js",
"config": "./rules/common/C052_parsing_or_data_transformation/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"naming",
"domain",
"readability"
],
"engineMappings": {
"eslint": [
"@typescript-eslint/naming-convention",
"camelcase"
]
}
},
"C060": {
"name": "Do not override superclass methods and ignore critical logic",
"description": "Preserve important behavior or lifecycle logic defined in the superclass to ensure correctness and prevent silent errors.",
"category": "logging",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/common/C060_no_override_superclass/analyzer.js",
"version": "1.0.0",
"status": "stable",
"tags": [
"logging",
"production",
"debugging",
"console"
],
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {
"regex": 90
}
}
},
"C065": {
"name": "One Behavior per Test (AAA Pattern)",
"description": "Enforce single behavior testing - each test should verify exactly one action/behavior with clear Arrange-Act-Assert structure",
"category": "common",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"java",
"csharp",
"swift",
"kotlin",
"python"
],
"analyzer": "./rules/common/C065_one_behavior_per_test/analyzer.js",
"config": "./rules/common/C065_one_behavior_per_test/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"testing",
"aaa",
"behavior",
"maintainability",
"clarity"
],
"engineMappings": {
"heuristic": [
"./rules/common/C065_one_behavior_per_test/analyzer.js"
]
}
},
"C067": {
"name": "No Hardcoded Configuration",
"description": "Improve configurability, reduce risk when changing environments, and make configuration management flexible and maintainable.",
"category": "configuration",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin"
],
"analyzer": "./rules/common/C067_no_hardcoded_config/analyzer.js",
"config": "./rules/common/C067_no_hardcoded_config/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"configuration",
"hardcode",
"environment",
"maintainability",
"security"
],
"strategy": {
"preferred": "ast",
"fallbacks": [
"ast"
],
"accuracy": {
"ast": 90
}
},
"engineMappings": {
"heuristic": [
"rules/common/C067_no_hardcoded_config/analyzer.js"
]
}
},
"C070": {
"name": "No Real Time Tests",
"description": "Tests should not depend on real time delays or sleeps. Use fake timers, clock injection, or condition-based waits to improve test reliability and speed.",
"category": "testing",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "../rules/common/C070_no_real_time_tests/regex-analyzer.js",
"config": "../rules/common/C070_no_real_time_tests/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"testing",
"flaky-tests",
"timing",
"fake-timers",
"reliability"
],
"strategy": {
"preferred": "ast",
"fallbacks": [
"regex"
],
"accuracy": {
"ast": 95,
"regex": 88
}
},
"engineMappings": {
"heuristic": [
"../rules/common/C070_no_real_time_tests/regex-analyzer.js"
]
}
},
"C072": {
"id": "C072",
"name": "Single Test Behavior",
"description": "Each test should assert only one behavior",
"category": "testing",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "stable",
"tags": [
"testing",
"unit-test",
"single-behavior"
],
"engineMappings": {
"eslint": [
"custom/c072-one-assert-per-test"
],
"heuristic": [
"rules/common/C072_single_test_behavior/analyzer.js"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C073": {
"id": "C073",
"name": "Validate Required Configuration on Startup",
"description": "C073 - Validate mandatory configuration at startup and fail fast on invalid/missing values",
"category": "configuration",
"severity": "error",
"languages": [
"typescript",
"javascript",
"java",
"go"
],
"version": "1.0.0",
"status": "stable",
"tags": [
"configuration",
"validation",
"startup",
"fail-fast"
],
"engineMappings": {
"heuristic": [
"rules/common/C073_validate_required_config_on_startup/analyzer.js"
],
"semantic": [
"rules/common/C073_validate_required_config_on_startup/symbol-based-analyzer.js"
]
},
"strategy": {
"preferred": "semantic",
"fallbacks": [
"heuristic"
],
"accuracy": {
"semantic": 0.9,
"heuristic": 0.7
}
}
},
"C075": {
"id": "C075",
"name": "Rule C075",
"description": "Auto-migrated rule C075 from ESLint mapping",
"category": "general",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"custom/explicit-function-return-types"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"C076": {
"id": "C076",
"name": "Explicit Function Argument Types",
"description": "All public functions must declare explicit types for arguments",
"category": "type-safety",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "stable",
"tags": [
"type-safety",
"public-api",
"explicit-types"
],
"engineMappings": {
"heuristic": [
"rules/common/C076_explicit_function_types/semantic-analyzer.js"
]
},
"strategy": {
"preferred": "symbol",
"fallbacks": [
"symbol"
],
"accuracy": {}
}
},
"R001": {
"id": "R001",
"name": "Rule R001",
"description": "Auto-migrated rule R001 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react/no-this-in-sfc",
"no-param-reassign",
"react/function-component-definition",
"react/forbid-component-props"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R002": {
"id": "R002",
"name": "Rule R002",
"description": "Auto-migrated rule R002 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react-hooks/rules-of-hooks",
"react-hooks/exhaustive-deps",
"react/no-did-mount-set-state",
"react/no-did-update-set-state"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R003": {
"id": "R003",
"name": "Rule R003",
"description": "Auto-migrated rule R003 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react/no-direct-mutation-state",
"react/jsx-no-constructed-context-values",
"react/forbid-dom-props"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R004": {
"id": "R004",
"name": "Rule R004",
"description": "Auto-migrated rule R004 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"no-param-reassign",
"react/forbid-foreign-prop-types"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R005": {
"id": "R005",
"name": "Rule R005",
"description": "Auto-migrated rule R005 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react/jsx-no-bind"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R006": {
"id": "R006",
"name": "Rule R006",
"description": "Auto-migrated rule R006 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react/jsx-pascal-case",
"react/jsx-uses-react",
"react/jsx-uses-vars"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R007": {
"id": "R007",
"name": "Rule R007",
"description": "Auto-migrated rule R007 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react-hooks/rules-of-hooks"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R008": {
"id": "R008",
"name": "Rule R008",
"description": "Auto-migrated rule R008 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react-hooks/rules-of-hooks"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"R009": {
"id": "R009",
"name": "Rule R009",
"description": "Auto-migrated rule R009 from ESLint mapping",
"category": "react",
"severity": "warning",
"languages": [
"typescript",
"javascript"
],
"version": "1.0.0",
"status": "migrated",
"tags": [
"migrated"
],
"engineMappings": {
"eslint": [
"react-hooks/rules-of-hooks"
]
},
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex"
],
"accuracy": {}
}
},
"S001": {
"name": "Fail Securely",
"description": "Verify that if there is an error in access control, the system fails securely",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s001",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"access-control",
"fail-safe"
],
"strategy": {
"preferred": "regex",
"fallbacks": [
"regex",
"ast"
],
"accuracy": {
"regex": 85,
"ast": 90
}
}
},
"S002": {
"name": "IDOR Check",
"description": "Insecure Direct Object Reference prevention",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s002",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"idor",
"access-control"
]
},
"S003": {
"name": "Open Redirect Protection",
"description": "URL redirects must validate against an allow list to prevent open redirect vulnerabilities",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/security/S003_open_redirect_protection/index.js",
"config": "./rules/security/S003_open_redirect_protection/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"owasp",
"injection",
"open-redirect",
"phishing",
"url-validation"
],
"strategy": {
"preferred": "heuristic",
"fallbacks": [
"heuristic"
],
"accuracy": {
"heuristic": 95
}
},
"engineMappings": {
"heuristic": [
"rules/security/S003_open_redirect_protection/index.js"
]
},
"metadata": {
"owaspCategory": "A03:2021 - Injection",
"cweId": "CWE-601",
"frameworks": [
"Express",
"NestJS",
"Next.js",
"Nuxt.js",
"Spring Boot"
],
"detectionPatterns": 28,
"testCases": 118
}
},
"S004": {
"name": "Sensitive Data Logging Protection",
"description": "Prevent logging of sensitive information like passwords, tokens, and payment data without proper redaction",
"category": "security",
"severity": "warning",
"languages": [
"typescript",
"javascript",
"dart"
],
"analyzer": "./rules/security/S004_sensitive_data_logging/analyzer.js",
"config": "./rules/security/S004_sensitive_data_logging/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"owasp",
"logging",
"sensitive-data",
"pii",
"credentials",
"data-exposure"
],
"strategy": {
"preferred": "heuristic",
"fallbacks": [
"heuristic"
],
"accuracy": {
"heuristic": 90
}
},
"engineMappings": {
"heuristic": [
"rules/security/S004_sensitive_data_logging/analyzer.js"
]
},
"metadata": {
"owaspCategory": "A09:2021 - Security Logging and Monitoring Failures",
"cweId": "CWE-532",
"frameworks": [
"Express",
"NestJS",
"Next.js",
"Nuxt.js",
"Spring Boot",
"Winston",
"Pino",
"Bunyan"
],
"detectionPatterns": 90,
"testCases": 45
}
},
"S005": {
"name": "No Origin Header Authentication",
"description": "Do not use Origin header for authentication/access control",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "./rules/security/S005_no_origin_auth/analyzer.js",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"authentication",
"headers"
],
"strategy": {
"preferred": "ast",
"fallbacks": [
"ast",
"regex"
],
"accuracy": {
"ast": 95,
"regex": 85
}
},
"engineMappings": {
"eslint": [
"custom/typescript_s005"
]
}
},
"S006": {
"name": "No Plaintext Recovery/Activation Codes",
"description": "Do not send recovery or activation codes in plaintext",
"category": "security",
"severity": "error",
"languages": [
"All languages"
],
"analyzer": "./rules/security/S006_no_plaintext_recovery_codes/analyzer.js",
"config": "./rules/security/S006_no_plaintext_recovery_codes/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"owasp",
"cryptographic-failures",
"authentication"
],
"strategy": {
"preferred": "regex",
"fallback": "heuristic"
},
"engineMappings": {
"heuristic": "S006_no_plaintext_recovery_codes"
}
},
"S007": {
"name": "No Plaintext OTP",
"description": "One-Time Passwords must not be stored in plaintext",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript",
"dart",
"kotlin",
"java",
"python",
"go",
"swift"
],
"analyzer": "./rules/security/S007_no_plaintext_otp/analyzer.js",
"config": "./rules/security/S007_no_plaintext_otp/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"otp",
"encryption",
"owasp",
"cryptographic-failures",
"authentication"
],
"strategy": {
"preferred": "heuristic",
"fallbacks": [
"heuristic",
"regex"
],
"accuracy": {
"heuristic": 90,
"regex": 75
}
},
"engineMappings": {
"heuristic": "S007_no_plaintext_otp"
}
},
"S008": {
"name": "Crypto Agility",
"description": "Ensure cryptographic agility and algorithm flexibility",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s008",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"cryptography",
"agility"
]
},
"S009": {
"name": "No Insecure Crypto",
"description": "Prevent usage of insecure cryptographic methods",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s009",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"cryptography",
"insecure"
]
},
"S010": {
"name": "No Insecure Random in Sensitive Context",
"description": "Prevent insecure random generator usage in sensitive contexts",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s010",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"random",
"sensitive"
]
},
"S011": {
"name": "No Insecure UUID",
"description": "UUID must be version 4 and use CSPRNG",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s011",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"uuid",
"random"
]
},
"S012": {
"name": "Hardcoded Secrets Protection",
"description": "Detects hardcoded secrets, API keys, passwords, tokens, and credentials in source code to prevent accidental exposure through version control",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "./rules/security/S012_hardcoded_secrets/analyzer.js",
"config": "./rules/security/S012_hardcoded_secrets/config.json",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"owasp",
"secrets",
"credentials",
"cryptographic-failures",
"hardcoded-secrets",
"api-keys",
"passwords",
"tokens"
],
"strategy": {
"preferred": "heuristic",
"fallbacks": [
"heuristic"
],
"accuracy": {
"heuristic": 92
}
},
"engineMappings": {
"heuristic": [
"rules/security/S012_hardcoded_secrets/analyzer.js"
]
},
"metadata": {
"owaspCategory": "A02:2021 - Cryptographic Failures",
"cweId": "CWE-798",
"frameworks": [
"Node.js",
"Express",
"NestJS",
"Next.js",
"React",
"Vue",
"Angular"
],
"secretTypes": [
"API Keys",
"Passwords",
"Access Tokens",
"Private Keys",
"JWT Secrets",
"Database Credentials",
"OAuth Secrets",
"AWS Keys",
"GitHub Tokens",
"Slack Tokens"
],
"detectionPatterns": 50,
"testCases": 30
}
},
"S013": {
"name": "Verify TLS Connection",
"description": "Verify that TLS connections are properly established and validated",
"category": "security",
"severity": "error",
"languages": [
"typescript",
"javascript"
],
"analyzer": "eslint",
"eslintRule": "custom/typescript_s013",
"version": "1.0.0",
"status": "stable",
"tags": [
"security",
"tls",
"connection"
]
},
"S014": {
"name": "Insecure TLS Version",
"description": "Prevent usage of insecure TLS versions",
"category": "security",