UNPKG

@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
{ "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",