@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
JSON
{
"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": {}