UNPKG

@sun-asterisk/sunlint

Version:

☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards

1,518 lines (1,517 loc) 56.6 kB
{ "rules": { "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"] } }, "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" ] } }, "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" ] } }, "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 } } }, "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"] } }, "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" ] } }, "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"] } }, "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"] } }, "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"] }, "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" ] } }, "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 } } }, "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": "No Unvalidated Redirect", "description": "Prevent unvalidated redirects and forwards", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s003", "version": "1.0.0", "status": "stable", "tags": ["security", "redirect", "validation"] }, "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": "No Hardcoded Secrets", "description": "Prevent hardcoded secrets in source code", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s012", "version": "1.0.0", "status": "stable", "tags": ["security", "secrets", "hardcoded"] }, "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", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s014", "version": "1.0.0", "status": "stable", "tags": ["security", "tls", "encryption"] }, "S015": { "name": "Insecure TLS Certificate", "description": "Prevent usage of insecure TLS certificate configurations", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s015", "version": "1.0.0", "status": "stable", "tags": ["security", "tls", "certificates"], "strategy": { "preferred": "ast", "fallbacks": ["ast", "regex"], "accuracy": { "ast": 95, "regex": 80 } } }, "S016": { "name": "Sensitive Query Parameter", "description": "Prevent sensitive data in URL query parameters", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "./rules/security/S016_no_sensitive_querystring/analyzer.js", "config": "./rules/security/S016_no_sensitive_querystring/config.json", "version": "1.0.0", "status": "stable", "tags": ["security", "sensitive-data", "url"], "strategy": { "preferred": "ast", "fallbacks": ["ast", "regex"], "accuracy": { "ast": 95, "regex": 80 } } }, "S017": { "name": "No SQL Injection", "description": "Prevent SQL injection vulnerabilities", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s017", "version": "1.0.0", "status": "stable", "tags": ["security", "sql-injection", "database"] }, "S018": { "name": "Positive Input Validation", "description": "Ensure positive input validation patterns", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s018", "version": "1.0.0", "status": "stable", "tags": ["security", "validation", "input"] }, "S019": { "name": "No Raw User Input in Email", "description": "Prevent raw user input in email content", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s019", "version": "1.0.0", "status": "stable", "tags": ["security", "email", "injection"] }, "S020": { "name": "No Eval Dynamic Execution", "description": "Prevent eval and dynamic code execution", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s020", "version": "1.0.0", "status": "stable", "tags": ["security", "eval", "dynamic-execution"] }, "S022": { "name": "Output Encoding Required", "description": "Require output encoding for user input", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s022", "version": "1.0.0", "status": "stable", "tags": ["security", "encoding", "xss"] }, "S023": { "name": "No JSON Injection", "description": "Prevent JSON injection vulnerabilities", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s023", "version": "1.0.0", "status": "stable", "tags": ["security", "json", "injection"], "strategy": { "preferred": "ast", "fallbacks": ["ast", "regex"], "accuracy": { "ast": 95, "regex": 60 } } }, "S025": { "name": "Server Side Input Validation", "description": "Require server-side input validation", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s025", "version": "1.0.0", "status": "stable", "tags": ["security", "validation", "server-side"] }, "S026": { "name": "JSON Schema Validation", "description": "Require JSON schema validation", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s026", "version": "1.0.0", "status": "stable", "tags": ["security", "validation", "json-schema"] }, "S027": { "name": "No Hardcoded Secrets Advanced", "description": "Advanced detection of hardcoded secrets", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s027", "version": "1.0.0", "status": "stable", "tags": ["security", "secrets", "hardcoded"] }, "S029": { "name": "Require CSRF Protection", "description": "Require CSRF protection for state-changing operations", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s029", "version": "1.0.0", "status": "stable", "tags": ["security", "csrf", "protection"] }, "S030": { "name": "No Directory Browsing", "description": "Prevent directory browsing vulnerabilities", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s030", "version": "1.0.0", "status": "stable", "tags": ["security", "directory-browsing", "information-disclosure"] }, "S033": { "name": "Require SameSite Cookie", "description": "Require SameSite attribute for cookies", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s033", "version": "1.0.0", "status": "stable", "tags": ["security", "cookies", "samesite"] }, "S034": { "name": "Require Host Cookie Prefix", "description": "Require __Host- prefix for secure cookies", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s034", "version": "1.0.0", "status": "stable", "tags": ["security", "cookies", "host-prefix"] }, "S035": { "name": "Cookie Specific Path", "description": "Require specific path for sensitive cookies", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s035", "version": "1.0.0", "status": "stable", "tags": ["security", "cookies", "path"] }, "S036": { "name": "No Unsafe File Include", "description": "Prevent unsafe file inclusion vulnerabilities", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s036", "version": "1.0.0", "status": "stable", "tags": ["security", "file-inclusion", "path-traversal"] }, "S037": { "name": "Require Anti Cache Headers", "description": "Require anti-cache headers for sensitive content", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s037", "version": "1.0.0", "status": "stable", "tags": ["security", "caching", "headers"] }, "S038": { "name": "No Version Disclosure", "description": "Prevent version information disclosure", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s038", "version": "1.0.0", "status": "stable", "tags": ["security", "information-disclosure", "version"] }, "S039": { "name": "No Session Token in URL", "description": "Prevent session tokens in URL parameters", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s039", "version": "1.0.0", "status": "stable", "tags": ["security", "session", "url"] }, "S041": { "name": "Require Session Invalidate on Logout", "description": "Require session invalidation on logout", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s041", "version": "1.0.0", "status": "stable", "tags": ["security", "session", "logout"] }, "S042": { "name": "Require Periodic Reauthentication", "description": "Require periodic re-authentication for sensitive operations", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s042", "version": "1.0.0", "status": "stable", "tags": ["security", "authentication", "periodic"] }, "S043": { "name": "Terminate Sessions on Password Change", "description": "Terminate all sessions when password changes", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s043", "version": "1.0.0", "status": "stable", "tags": ["security", "session", "password"] }, "S044": { "name": "Require Full Session for Sensitive Operations", "description": "Require full session validation for sensitive operations", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s044", "version": "1.0.0", "status": "stable", "tags": ["security", "session", "validation"] }, "S045": { "name": "Anti Automation Controls", "description": "Implement anti-automation controls", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s045", "version": "1.0.0", "status": "stable", "tags": ["security", "automation", "protection"] }, "S046": { "name": "Secure Notification on Auth Change", "description": "Require secure notification on authentication changes", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s046", "version": "1.0.0", "status": "stable", "tags": ["security", "notification", "authentication"] }, "S047": { "name": "Secure Random Password Generation", "description": "Require secure and random initial password generation", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s047", "version": "1.0.0", "status": "stable", "tags": ["security", "password", "random"] }, "S048": { "name": "Password Credential Recovery", "description": "Secure password credential recovery process", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s048", "version": "1.0.0", "status": "stable", "tags": ["security", "password", "recovery"] }, "S050": { "name": "Session Token Weak Hash", "description": "Prevent weak hashing for session tokens", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s050", "version": "1.0.0", "status": "stable", "tags": ["security", "session", "hashing"] }, "S052": { "name": "Secure Random Authentication Code", "description": "Require secure random number generation for authentication codes", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s052", "version": "1.0.0", "status": "stable", "tags": ["security", "random", "authentication"] }, "S054": { "name": "Verification Default Account", "description": "Verify and secure default accounts", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s054", "version": "1.0.0", "status": "stable", "tags": ["security", "accounts", "default"] }, "S055": { "name": "REST Content-Type Verification", "description": "Verify incoming Content-Type in REST API endpoints", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s055", "version": "1.0.0", "status": "stable", "tags": ["security", "rest", "content-type"] }, "S057": { "name": "UTC Logging", "description": "Enforce UTC usage in time formatting and logging", "category": "security", "severity": "warning", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s057", "version": "1.0.0", "status": "stable", "tags": ["security", "logging", "timezone"] }, "S058": { "name": "No SSRF", "description": "Detect SSRF vulnerabilities via unvalidated user-controlled URLs", "category": "security", "severity": "error", "languages": ["typescript", "javascript"], "analyzer": "eslint", "eslintRule": "custom/typescript_s058", "version": "1.0.0", "status": "stable", "tags": ["security", "ssrf", "url-validation"] }, "C002": { "id": "C002", "name": "Rule C002", "description": "Auto-migrated rule C002 from ESLint mapping", "category": "general", "severity": "warning", "languages": ["typescript", "javascript"], "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"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-vague-abbreviations"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "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"], "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" ] } }, "C017": { "id": "C017", "name": "Rule C017", "description": "Auto-migrated rule C017 from ESLint mapping", "category": "general", "severity": "warning", "languages": ["typescript", "javascript"], "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 } } }, "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": {} } }, "C041": { "id": "C041", "name": "Rule C041", "description": "Auto-migrated rule C041 from ESLint mapping", "category": "general", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-config-inline"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "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": {} } }, "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": {} } }, "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": {} } }, "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": {} } }, "T002": { "id": "T002", "name": "Rule T002", "description": "Auto-migrated rule T002 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/interface-prefix-i"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T003": { "id": "T003", "name": "Rule T003", "description": "Auto-migrated rule T003 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/ts-ignore-reason"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T004": { "id": "T004", "name": "Rule T004", "description": "Auto-migrated rule T004 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-empty-type"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T007": { "id": "T007", "name": "Rule T007", "description": "Auto-migrated rule T007 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-fn-in-constructor"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T010": { "id": "T010", "name": "Rule T010", "description": "Auto-migrated rule T010 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-nested-union-tuple"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T019": { "id": "T019", "name": "Rule T019", "description": "Auto-migrated rule T019 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-this-assign"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T020": { "id": "T020", "name": "Rule T020", "description": "Auto-migrated rule T020 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/no-default-multi-export"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "accuracy": {} } }, "T021": { "id": "T021", "name": "Rule T021", "description": "Auto-migrated rule T021 from ESLint mapping", "category": "typescript", "severity": "warning", "languages": ["typescript", "javascript"], "version": "1.0.0", "status": "migrated", "tags": ["migrated"], "engineMappings": { "eslint": ["custom/limit-nested-generics"] }, "strategy": { "preferred": "regex", "fallbacks": ["regex"], "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": {}