@sun-asterisk/sunlint 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +115 -1
  2. package/CONTRIBUTING.md +249 -605
  3. package/README.md +3 -4
  4. package/config/ci-cd.json +54 -0
  5. package/config/development.json +56 -0
  6. package/config/large-project.json +143 -0
  7. package/config/presets/all.json +0 -1
  8. package/config/release.json +70 -0
  9. package/config/rule-analysis-strategies.js +38 -3
  10. package/config/rules/enhanced-rules-registry.json +474 -1179
  11. package/config/rules/rules-registry-generated.json +3 -3
  12. package/core/cli-action-handler.js +24 -30
  13. package/core/cli-program.js +11 -3
  14. package/core/config-merger.js +29 -2
  15. package/core/enhanced-rules-registry.js +3 -2
  16. package/core/semantic-engine.js +129 -19
  17. package/core/semantic-rule-base.js +4 -2
  18. package/core/unified-rule-registry.js +1 -1
  19. package/docs/COMMAND-EXAMPLES.md +134 -0
  20. package/docs/LARGE-PROJECT-GUIDE.md +324 -0
  21. package/engines/heuristic-engine.js +135 -16
  22. package/integrations/eslint/plugin/index.js +0 -2
  23. package/integrations/eslint/plugin/rules/common/c003-no-vague-abbreviations.js +59 -1
  24. package/integrations/eslint/plugin/rules/common/c006-function-name-verb-noun.js +26 -1
  25. package/integrations/eslint/plugin/rules/common/c030-use-custom-error-classes.js +54 -19
  26. package/origin-rules/common-en.md +19 -15
  27. package/package.json +1 -1
  28. package/rules/common/C002_no_duplicate_code/analyzer.js +334 -36
  29. package/rules/common/C003_no_vague_abbreviations/analyzer.js +220 -35
  30. package/rules/common/C006_function_naming/analyzer.js +29 -3
  31. package/rules/common/C010_limit_block_nesting/analyzer.js +181 -337
  32. package/rules/common/C010_limit_block_nesting/config.json +64 -0
  33. package/rules/common/C010_limit_block_nesting/regex-based-analyzer.js +379 -0
  34. package/rules/common/C010_limit_block_nesting/symbol-based-analyzer.js +231 -0
  35. package/rules/common/C013_no_dead_code/analyzer.js +75 -177
  36. package/rules/common/C013_no_dead_code/config.json +61 -0
  37. package/rules/common/C013_no_dead_code/regex-based-analyzer.js +345 -0
  38. package/rules/common/C013_no_dead_code/symbol-based-analyzer.js +640 -0
  39. package/rules/common/C014_dependency_injection/analyzer.js +48 -313
  40. package/rules/common/C014_dependency_injection/config.json +26 -0
  41. package/rules/common/C014_dependency_injection/symbol-based-analyzer.js +751 -0
  42. package/rules/common/C017_constructor_logic/analyzer.js +254 -17
  43. package/rules/common/C017_constructor_logic/semantic-analyzer.js +340 -0
  44. package/rules/common/C018_no_throw_generic_error/analyzer.js +232 -0
  45. package/rules/common/C018_no_throw_generic_error/config.json +50 -0
  46. package/rules/common/C018_no_throw_generic_error/regex-based-analyzer.js +387 -0
  47. package/rules/common/C018_no_throw_generic_error/symbol-based-analyzer.js +314 -0
  48. package/rules/common/C019_log_level_usage/analyzer.js +110 -317
  49. package/rules/common/C019_log_level_usage/pattern-analyzer.js +88 -0
  50. package/rules/common/C019_log_level_usage/system-log-analyzer.js +1267 -0
  51. package/rules/common/C023_no_duplicate_variable/analyzer.js +180 -0
  52. package/rules/common/C023_no_duplicate_variable/config.json +50 -0
  53. package/rules/common/C023_no_duplicate_variable/symbol-based-analyzer.js +158 -0
  54. package/rules/common/C024_no_scatter_hardcoded_constants/analyzer.js +180 -0
  55. package/rules/common/C024_no_scatter_hardcoded_constants/config.json +50 -0
  56. package/rules/common/C024_no_scatter_hardcoded_constants/symbol-based-analyzer.js +181 -0
  57. package/rules/common/C030_use_custom_error_classes/analyzer.js +200 -0
  58. package/rules/common/C033_separate_service_repository/README.md +78 -0
  59. package/rules/common/C033_separate_service_repository/analyzer.js +160 -0
  60. package/rules/common/C033_separate_service_repository/config.json +50 -0
  61. package/rules/common/C033_separate_service_repository/regex-based-analyzer.js +585 -0
  62. package/rules/common/C033_separate_service_repository/symbol-based-analyzer.js +368 -0
  63. package/rules/common/C035_error_logging_context/STRATEGY.md +99 -0
  64. package/rules/common/C035_error_logging_context/analyzer.js +232 -0
  65. package/rules/common/C035_error_logging_context/config.json +54 -0
  66. package/rules/common/C035_error_logging_context/regex-based-analyzer.js +299 -0
  67. package/rules/common/C035_error_logging_context/symbol-based-analyzer.js +454 -0
  68. package/rules/common/C040_centralized_validation/analyzer.js +165 -0
  69. package/rules/common/C040_centralized_validation/config.json +46 -0
  70. package/rules/common/C040_centralized_validation/regex-based-analyzer.js +243 -0
  71. package/rules/common/C040_centralized_validation/symbol-based-analyzer.js +416 -0
  72. package/rules/common/{C076_single_test_behavior → C072_single_test_behavior}/analyzer.js +6 -6
  73. package/rules/common/C076_explicit_function_types/README.md +30 -0
  74. package/rules/common/C076_explicit_function_types/analyzer.js +172 -0
  75. package/rules/common/C076_explicit_function_types/config.json +15 -0
  76. package/rules/common/C076_explicit_function_types/semantic-analyzer.js +341 -0
  77. package/rules/index.js +6 -1
  78. package/rules/parser/rule-parser.js +13 -2
  79. package/rules/security/S005_no_origin_auth/README.md +226 -0
  80. package/rules/security/S005_no_origin_auth/analyzer.js +184 -0
  81. package/rules/security/S005_no_origin_auth/ast-analyzer.js +406 -0
  82. package/rules/security/S005_no_origin_auth/config.json +85 -0
  83. package/rules/security/S006_no_plaintext_recovery_codes/README.md +139 -0
  84. package/rules/security/S006_no_plaintext_recovery_codes/analyzer.js +306 -0
  85. package/rules/security/S006_no_plaintext_recovery_codes/config.json +48 -0
  86. package/rules/security/S007_no_plaintext_otp/README.md +198 -0
  87. package/rules/security/S007_no_plaintext_otp/analyzer.js +406 -0
  88. package/rules/security/S007_no_plaintext_otp/config.json +79 -0
  89. package/rules/security/S007_no_plaintext_otp/semantic-analyzer.js +609 -0
  90. package/rules/security/S007_no_plaintext_otp/semantic-config.json +195 -0
  91. package/rules/security/S007_no_plaintext_otp/semantic-wrapper.js +280 -0
  92. package/rules/security/S009_no_insecure_encryption/README.md +158 -0
  93. package/rules/security/S009_no_insecure_encryption/analyzer.js +319 -0
  94. package/rules/security/S009_no_insecure_encryption/config.json +55 -0
  95. package/rules/security/S010_no_insecure_encryption/README.md +224 -0
  96. package/rules/security/S010_no_insecure_encryption/analyzer.js +493 -0
  97. package/rules/security/S010_no_insecure_encryption/config.json +48 -0
  98. package/rules/security/S016_no_sensitive_querystring/STRATEGY.md +149 -0
  99. package/rules/security/S016_no_sensitive_querystring/analyzer.js +276 -0
  100. package/rules/security/S016_no_sensitive_querystring/config.json +127 -0
  101. package/rules/security/S016_no_sensitive_querystring/regex-based-analyzer.js +258 -0
  102. package/rules/security/S016_no_sensitive_querystring/symbol-based-analyzer.js +495 -0
  103. package/rules/security/S027_no_hardcoded_secrets/analyzer.js +180 -366
  104. package/rules/security/S027_no_hardcoded_secrets/categories.json +153 -0
  105. package/rules/security/S027_no_hardcoded_secrets/categorized-analyzer.js +250 -0
  106. package/rules/security/S048_no_current_password_in_reset/README.md +222 -0
  107. package/rules/security/S048_no_current_password_in_reset/analyzer.js +366 -0
  108. package/rules/security/S048_no_current_password_in_reset/config.json +48 -0
  109. package/rules/security/S055_content_type_validation/README.md +176 -0
  110. package/rules/security/S055_content_type_validation/analyzer.js +312 -0
  111. package/rules/security/S055_content_type_validation/config.json +48 -0
  112. package/rules/utils/rule-helpers.js +140 -1
  113. package/scripts/consolidate-config.js +116 -0
  114. package/scripts/prepare-release.sh +1 -1
  115. package/config/rules/rules-registry.json +0 -765
  116. package/docs/ESLINT-INTEGRATION-STRATEGY.md +0 -392
  117. package/docs/FUTURE_PACKAGES.md +0 -83
  118. package/docs/HEURISTIC_VS_AI.md +0 -113
  119. package/docs/PRODUCTION_DEPLOYMENT_ANALYSIS.md +0 -112
  120. package/docs/PRODUCTION_SIZE_IMPACT.md +0 -183
  121. package/docs/RELEASE_GUIDE.md +0 -230
  122. package/docs/STANDARDIZED-CATEGORY-FILTERING.md +0 -156
  123. package/integrations/eslint/plugin/rules/common/c076-single-behavior-per-test.js +0 -254
  124. package/rules/common/C006_function_naming/smart-analyzer.js +0 -503
@@ -5,26 +5,14 @@
5
5
  "description": "Each function should do one thing only",
6
6
  "category": "design",
7
7
  "severity": "warning",
8
- "languages": [
9
- "typescript",
10
- "javascript",
11
- "dart",
12
- "kotlin"
13
- ],
8
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
14
9
  "analyzer": "./rules/common/C005_single_responsibility/analyzer.js",
15
10
  "config": "./rules/common/C005_single_responsibility/config.json",
16
11
  "version": "1.0.0",
17
12
  "status": "stable",
18
- "tags": [
19
- "design",
20
- "responsibility",
21
- "maintainability"
22
- ],
13
+ "tags": ["design", "responsibility", "maintainability"],
23
14
  "engineMappings": {
24
- "eslint": [
25
- "max-statements-per-line",
26
- "complexity"
27
- ]
15
+ "eslint": ["max-statements-per-line", "complexity"]
28
16
  }
29
17
  },
30
18
  "C019": {
@@ -32,26 +20,20 @@
32
20
  "description": "Không sử dụng log mức error cho lỗi không nghiêm trọng",
33
21
  "category": "logging",
34
22
  "severity": "warning",
35
- "languages": [
36
- "typescript",
37
- "dart",
38
- "kotlin",
39
- "javascript"
40
- ],
41
- "analyzer": "./rules/C019_log_level_usage/analyzer.js",
42
- "config": "./rules/C019_log_level_usage/config.json",
23
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
24
+ "analyzer": "./rules/common/C019_log_level_usage/analyzer.js",
25
+ "config": "./rules/common/C019_log_level_usage/config.json",
43
26
  "version": "1.0.0",
44
27
  "status": "stable",
45
- "tags": [
46
- "logging",
47
- "error-handling",
48
- "severity"
49
- ],
28
+ "tags": ["logging", "error-handling", "severity"],
50
29
  "engineMappings": {
51
30
  "eslint": [
52
31
  "no-console",
53
32
  "no-alert",
54
33
  "no-debugger"
34
+ ],
35
+ "heuristic": [
36
+ "rules/common/C019_log_level_usage/analyzer.js"
55
37
  ]
56
38
  }
57
39
  },
@@ -60,21 +42,12 @@
60
42
  "description": "Tên hàm phải là động từ/verb-noun pattern",
61
43
  "category": "naming",
62
44
  "severity": "warning",
63
- "languages": [
64
- "typescript",
65
- "dart",
66
- "kotlin",
67
- "javascript"
68
- ],
45
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
69
46
  "analyzer": "./rules/C006_function_naming/analyzer.js",
70
47
  "config": "./rules/C006_function_naming/config.json",
71
48
  "version": "1.0.0",
72
49
  "status": "activated",
73
- "tags": [
74
- "naming",
75
- "convention",
76
- "readability"
77
- ],
50
+ "tags": ["naming", "convention", "readability"],
78
51
  "engineMappings": {
79
52
  "eslint": [
80
53
  "func-names",
@@ -88,21 +61,12 @@
88
61
  "description": "Avoid comments that just describe the code",
89
62
  "category": "documentation",
90
63
  "severity": "info",
91
- "languages": [
92
- "typescript",
93
- "javascript",
94
- "dart",
95
- "kotlin"
96
- ],
64
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
97
65
  "analyzer": "./rules/common/C007_meaningful_comments/analyzer.js",
98
66
  "config": "./rules/common/C007_meaningful_comments/config.json",
99
67
  "version": "1.0.0",
100
68
  "status": "stable",
101
- "tags": [
102
- "documentation",
103
- "comments",
104
- "maintainability"
105
- ],
69
+ "tags": ["documentation", "comments", "maintainability"],
106
70
  "engineMappings": {
107
71
  "eslint": [
108
72
  "spaced-comment",
@@ -116,31 +80,48 @@
116
80
  "description": "Limit nested blocks (if/for/while/switch) to maximum 3 levels for readability",
117
81
  "category": "complexity",
118
82
  "severity": "warning",
119
- "languages": [
120
- "typescript",
121
- "javascript",
122
- "dart",
123
- "kotlin"
124
- ],
83
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
125
84
  "analyzer": "./rules/common/C010_limit_block_nesting/analyzer.js",
85
+ "config": "./rules/common/C010_limit_block_nesting/config.json",
86
+ "version": "1.0.0",
87
+ "status": "stable",
88
+ "tags": ["complexity", "readability", "nesting", "maintainability"],
89
+ "strategy": {
90
+ "preferred": "ast",
91
+ "fallbacks": ["ast", "regex"],
92
+ "accuracy": {
93
+ "ast": 95,
94
+ "regex": 75
95
+ }
96
+ }
97
+ },
98
+ "C013": {
99
+ "name": "No Dead Code",
100
+ "description": "Detect and remove commented out code, unused variables/functions, and unreachable code",
101
+ "category": "maintainability",
102
+ "severity": "warning",
103
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
104
+ "analyzer": "./rules/common/C013_no_dead_code/analyzer.js",
105
+ "config": "./rules/common/C013_no_dead_code/config.json",
126
106
  "version": "1.0.0",
127
107
  "status": "stable",
128
108
  "tags": [
129
- "complexity",
130
- "readability",
131
- "nesting",
109
+ "dead-code",
110
+ "commented-code",
111
+ "unreachable-code",
112
+ "cleanup",
132
113
  "maintainability"
133
114
  ],
134
115
  "strategy": {
135
116
  "preferred": "ast",
136
- "fallbacks": [
137
- "ast",
138
- "regex"
139
- ],
117
+ "fallbacks": ["ast", "regex"],
140
118
  "accuracy": {
141
- "ast": 95,
142
- "regex": 75
119
+ "ast": 90,
120
+ "regex": 70
143
121
  }
122
+ },
123
+ "engineMappings": {
124
+ "eslint": ["no-unreachable", "no-unused-vars", "no-unused-expressions"]
144
125
  }
145
126
  },
146
127
  "C012": {
@@ -148,21 +129,12 @@
148
129
  "description": "Separate Command and Query operations (CQS principle)",
149
130
  "category": "design",
150
131
  "severity": "warning",
151
- "languages": [
152
- "typescript",
153
- "javascript",
154
- "dart",
155
- "kotlin"
156
- ],
132
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
157
133
  "analyzer": "./rules/common/C012_command_query_separation/analyzer.js",
158
134
  "config": "./rules/common/C012_command_query_separation/config.json",
159
135
  "version": "1.0.0",
160
136
  "status": "stable",
161
- "tags": [
162
- "design",
163
- "separation",
164
- "maintainability"
165
- ],
137
+ "tags": ["design", "separation", "maintainability"],
166
138
  "engineMappings": {
167
139
  "eslint": [
168
140
  "consistent-return",
@@ -176,26 +148,59 @@
176
148
  "description": "Use domain language in class/function names",
177
149
  "category": "naming",
178
150
  "severity": "warning",
179
- "languages": [
180
- "typescript",
181
- "javascript",
182
- "dart",
183
- "kotlin"
184
- ],
151
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
185
152
  "analyzer": "./rules/common/C015_domain_language/analyzer.js",
186
153
  "config": "./rules/common/C015_domain_language/config.json",
187
154
  "version": "1.0.0",
188
155
  "status": "stable",
189
- "tags": [
190
- "naming",
191
- "domain",
192
- "readability"
193
- ],
156
+ "tags": ["naming", "domain", "readability"],
194
157
  "engineMappings": {
195
- "eslint": [
196
- "@typescript-eslint/naming-convention",
197
- "camelcase"
198
- ]
158
+ "eslint": ["@typescript-eslint/naming-convention", "camelcase"]
159
+ }
160
+ },
161
+ "C018": {
162
+ "name": "Do not throw generic errors",
163
+ "description": "Always provide detailed messages and context.",
164
+ "category": "naming",
165
+ "severity": "warning",
166
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
167
+ "analyzer": "./rules/common/C018_no_throw_generic_error/analyzer.js",
168
+ "config": "./rules/common/C018_no_throw_generic_error/config.json",
169
+ "version": "1.0.0",
170
+ "status": "stable",
171
+ "tags": ["naming", "domain", "readability"],
172
+ "engineMappings": {
173
+ "eslint": ["@typescript-eslint/naming-convention", "camelcase"]
174
+ }
175
+ },
176
+ "C023": {
177
+ "name": "Do not declare duplicate variable",
178
+ "description": "Do not declare duplicate variable names in the same scope",
179
+ "category": "naming",
180
+ "severity": "warning",
181
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
182
+ "analyzer": "./rules/common/C023_no_duplicate_variable/analyzer.js",
183
+ "config": "./rules/common/C023_no_duplicate_variable/config.json",
184
+ "version": "1.0.0",
185
+ "status": "stable",
186
+ "tags": ["naming", "domain", "readability"],
187
+ "engineMappings": {
188
+ "eslint": ["@typescript-eslint/naming-convention", "camelcase"]
189
+ }
190
+ },
191
+ "C024": {
192
+ "name": "Do not scatter hardcoded constants throughout the logic",
193
+ "description": "The rule prevents scattering hardcoded constants throughout the logic. Instead, constants should be defined in a single place to improve maintainability and readability.",
194
+ "category": "naming",
195
+ "severity": "warning",
196
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
197
+ "analyzer": "./rules/common/C024_no_scatter_hardcoded_constants/analyzer.js",
198
+ "config": "./rules/common/C024_no_scatter_hardcoded_constants/config.json",
199
+ "version": "1.0.0",
200
+ "status": "stable",
201
+ "tags": ["naming", "domain", "readability"],
202
+ "engineMappings": {
203
+ "eslint": ["@typescript-eslint/naming-convention", "camelcase"]
199
204
  }
200
205
  },
201
206
  "C029": {
@@ -203,43 +208,24 @@
203
208
  "description": "Mọi catch block phải log nguyên nhân lỗi đầy đủ",
204
209
  "category": "error-handling",
205
210
  "severity": "error",
206
- "languages": [
207
- "typescript",
208
- "dart",
209
- "kotlin",
210
- "javascript"
211
- ],
211
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
212
212
  "analyzer": "./rules/C029_catch_block_logging/analyzer.js",
213
213
  "config": "./rules/C029_catch_block_logging/config.json",
214
214
  "version": "1.0.0",
215
215
  "status": "activated",
216
- "tags": [
217
- "error-handling",
218
- "logging",
219
- "debugging",
220
- "monitoring"
221
- ]
216
+ "tags": ["error-handling", "logging", "debugging", "monitoring"]
222
217
  },
223
218
  "C031": {
224
219
  "name": "Validation Logic Separation",
225
220
  "description": "Logic kiểm tra dữ liệu (validate) phải nằm riêng biệt",
226
221
  "category": "validation",
227
222
  "severity": "error",
228
- "languages": [
229
- "typescript",
230
- "dart",
231
- "kotlin",
232
- "javascript"
233
- ],
223
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
234
224
  "analyzer": "./rules/C031_validation_separation/analyzer.js",
235
225
  "config": "./rules/C031_validation_separation/config.json",
236
226
  "version": "1.0.0",
237
227
  "status": "experimental",
238
- "tags": [
239
- "validation",
240
- "separation",
241
- "architecture"
242
- ],
228
+ "tags": ["validation", "separation", "architecture"],
243
229
  "engineMappings": {
244
230
  "eslint": [
245
231
  "no-implicit-coercion",
@@ -253,21 +239,12 @@
253
239
  "description": "Don't call external APIs in constructors or static blocks",
254
240
  "category": "design",
255
241
  "severity": "error",
256
- "languages": [
257
- "typescript",
258
- "javascript",
259
- "dart",
260
- "kotlin"
261
- ],
242
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
262
243
  "analyzer": "./rules/common/C032_no_constructor_api/analyzer.js",
263
244
  "config": "./rules/common/C032_no_constructor_api/config.json",
264
245
  "version": "1.0.0",
265
246
  "status": "stable",
266
- "tags": [
267
- "design",
268
- "constructor",
269
- "initialization"
270
- ],
247
+ "tags": ["design", "constructor", "initialization"],
271
248
  "engineMappings": {
272
249
  "eslint": [
273
250
  "no-new",
@@ -281,21 +258,12 @@
281
258
  "description": "Separate processing logic and data queries in service layer",
282
259
  "category": "architecture",
283
260
  "severity": "warning",
284
- "languages": [
285
- "typescript",
286
- "javascript",
287
- "dart",
288
- "kotlin"
289
- ],
261
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
290
262
  "analyzer": "./rules/common/C033_separate_logic_data/analyzer.js",
291
263
  "config": "./rules/common/C033_separate_logic_data/config.json",
292
264
  "version": "1.0.0",
293
265
  "status": "stable",
294
- "tags": [
295
- "architecture",
296
- "separation",
297
- "service"
298
- ],
266
+ "tags": ["architecture", "separation", "service"],
299
267
  "engineMappings": {
300
268
  "eslint": [
301
269
  "prefer-const",
@@ -309,21 +277,12 @@
309
277
  "description": "Limit direct access to global state in domain logic",
310
278
  "category": "architecture",
311
279
  "severity": "warning",
312
- "languages": [
313
- "typescript",
314
- "javascript",
315
- "dart",
316
- "kotlin"
317
- ],
280
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
318
281
  "analyzer": "./rules/common/C034_limit_global_state/analyzer.js",
319
282
  "config": "./rules/common/C034_limit_global_state/config.json",
320
283
  "version": "1.0.0",
321
284
  "status": "stable",
322
- "tags": [
323
- "architecture",
324
- "global-state",
325
- "design"
326
- ],
285
+ "tags": ["architecture", "global-state", "design"],
327
286
  "engineMappings": {
328
287
  "eslint": [
329
288
  "no-global-assign",
@@ -332,26 +291,32 @@
332
291
  ]
333
292
  }
334
293
  },
294
+ "C035": {
295
+ "name": "Log all relevant context when handling errors",
296
+ "description": "When handling errors, must log full information related - structured logging with context",
297
+ "category": "error-handling",
298
+ "severity": "warning",
299
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
300
+ "analyzer": "./rules/common/C035_error_logging_context/analyzer.js",
301
+ "config": "./rules/common/C035_error_logging_context/config.json",
302
+ "version": "1.0.0",
303
+ "status": "stable",
304
+ "tags": ["logging", "error-handling", "observability", "debugging"],
305
+ "engineMappings": {
306
+ "eslint": ["no-empty-catch", "@typescript-eslint/no-unused-vars"]
307
+ }
308
+ },
335
309
  "C037": {
336
310
  "name": "Standard Response Objects",
337
311
  "description": "API handlers should return standard response objects (not raw strings)",
338
312
  "category": "api",
339
313
  "severity": "warning",
340
- "languages": [
341
- "typescript",
342
- "javascript",
343
- "dart",
344
- "kotlin"
345
- ],
314
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
346
315
  "analyzer": "./rules/common/C037_standard_response/analyzer.js",
347
316
  "config": "./rules/common/C037_standard_response/config.json",
348
317
  "version": "1.0.0",
349
318
  "status": "stable",
350
- "tags": [
351
- "api",
352
- "response",
353
- "standardization"
354
- ],
319
+ "tags": ["api", "response", "standardization"],
355
320
  "engineMappings": {
356
321
  "eslint": [
357
322
  "consistent-return",
@@ -365,21 +330,12 @@
365
330
  "description": "Avoid logic depending on file/module loading order",
366
331
  "category": "architecture",
367
332
  "severity": "warning",
368
- "languages": [
369
- "typescript",
370
- "javascript",
371
- "dart",
372
- "kotlin"
373
- ],
333
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
374
334
  "analyzer": "./rules/common/C038_no_loading_order/analyzer.js",
375
335
  "config": "./rules/common/C038_no_loading_order/config.json",
376
336
  "version": "1.0.0",
377
337
  "status": "stable",
378
- "tags": [
379
- "architecture",
380
- "loading",
381
- "dependency"
382
- ],
338
+ "tags": ["architecture", "loading", "dependency"],
383
339
  "engineMappings": {
384
340
  "eslint": [
385
341
  "import/no-dynamic-require",
@@ -393,21 +349,12 @@
393
349
  "description": "Don't scatter validation logic across multiple classes",
394
350
  "category": "validation",
395
351
  "severity": "warning",
396
- "languages": [
397
- "typescript",
398
- "javascript",
399
- "dart",
400
- "kotlin"
401
- ],
352
+ "languages": ["typescript", "javascript", "dart", "kotlin"],
402
353
  "analyzer": "./rules/common/C040_centralized_validation/analyzer.js",
403
354
  "config": "./rules/common/C040_centralized_validation/config.json",
404
355
  "version": "1.0.0",
405
356
  "status": "stable",
406
- "tags": [
407
- "validation",
408
- "centralization",
409
- "architecture"
410
- ],
357
+ "tags": ["validation", "centralization", "architecture"],
411
358
  "engineMappings": {
412
359
  "eslint": [
413
360
  "no-duplicate-imports",
@@ -421,73 +368,33 @@
421
368
  "description": "Do not use console.log or print in production code",
422
369
  "category": "logging",
423
370
  "severity": "warning",
424
- "languages": [
425
- "typescript",
426
- "javascript",
427
- "dart"
428
- ],
371
+ "languages": ["typescript", "javascript", "dart"],
429
372
  "analyzer": "./rules/common/C043_no_console_or_print/analyzer.js",
430
373
  "version": "1.0.0",
431
374
  "status": "stable",
432
- "tags": [
433
- "logging",
434
- "production",
435
- "debugging",
436
- "console"
437
- ],
375
+ "tags": ["logging", "production", "debugging", "console"],
438
376
  "strategy": {
439
377
  "preferred": "regex",
440
- "fallbacks": [
441
- "regex"
442
- ],
378
+ "fallbacks": ["regex"],
443
379
  "accuracy": {
444
380
  "regex": 90
445
381
  }
446
382
  }
447
383
  },
448
- "C076": {
449
- "name": "One Assert Per Test",
450
- "description": "Each test should assert only one behavior (Single Assert Rule)",
451
- "category": "testing",
452
- "severity": "warning",
453
- "languages": [
454
- "typescript",
455
- "javascript"
456
- ],
457
- "analyzer": "eslint",
458
- "eslintRule": "custom/c076",
459
- "version": "1.0.0",
460
- "status": "stable",
461
- "tags": [
462
- "testing",
463
- "unit-test",
464
- "assertion"
465
- ]
466
- },
467
384
  "S001": {
468
385
  "name": "Fail Securely",
469
386
  "description": "Verify that if there is an error in access control, the system fails securely",
470
387
  "category": "security",
471
388
  "severity": "error",
472
- "languages": [
473
- "typescript",
474
- "javascript"
475
- ],
389
+ "languages": ["typescript", "javascript"],
476
390
  "analyzer": "eslint",
477
391
  "eslintRule": "custom/typescript_s001",
478
392
  "version": "1.0.0",
479
393
  "status": "stable",
480
- "tags": [
481
- "security",
482
- "access-control",
483
- "fail-safe"
484
- ],
394
+ "tags": ["security", "access-control", "fail-safe"],
485
395
  "strategy": {
486
396
  "preferred": "regex",
487
- "fallbacks": [
488
- "regex",
489
- "ast"
490
- ],
397
+ "fallbacks": ["regex", "ast"],
491
398
  "accuracy": {
492
399
  "regex": 85,
493
400
  "ast": 90
@@ -499,76 +406,65 @@
499
406
  "description": "Insecure Direct Object Reference prevention",
500
407
  "category": "security",
501
408
  "severity": "error",
502
- "languages": [
503
- "typescript",
504
- "javascript"
505
- ],
409
+ "languages": ["typescript", "javascript"],
506
410
  "analyzer": "eslint",
507
411
  "eslintRule": "custom/typescript_s002",
508
412
  "version": "1.0.0",
509
413
  "status": "stable",
510
- "tags": [
511
- "security",
512
- "idor",
513
- "access-control"
514
- ]
414
+ "tags": ["security", "idor", "access-control"]
515
415
  },
516
416
  "S003": {
517
417
  "name": "No Unvalidated Redirect",
518
418
  "description": "Prevent unvalidated redirects and forwards",
519
419
  "category": "security",
520
420
  "severity": "error",
521
- "languages": [
522
- "typescript",
523
- "javascript"
524
- ],
421
+ "languages": ["typescript", "javascript"],
525
422
  "analyzer": "eslint",
526
423
  "eslintRule": "custom/typescript_s003",
527
424
  "version": "1.0.0",
528
425
  "status": "stable",
529
- "tags": [
530
- "security",
531
- "redirect",
532
- "validation"
533
- ]
426
+ "tags": ["security", "redirect", "validation"]
534
427
  },
535
428
  "S005": {
536
429
  "name": "No Origin Header Authentication",
537
430
  "description": "Do not use Origin header for authentication/access control",
538
431
  "category": "security",
539
432
  "severity": "error",
540
- "languages": [
541
- "typescript",
542
- "javascript"
543
- ],
544
- "analyzer": "eslint",
545
- "eslintRule": "custom/typescript_s005",
433
+ "languages": ["typescript", "javascript"],
434
+ "analyzer": "./rules/security/S005_no_origin_auth/analyzer.js",
546
435
  "version": "1.0.0",
547
436
  "status": "stable",
548
- "tags": [
549
- "security",
550
- "authentication",
551
- "headers"
552
- ]
437
+ "tags": ["security", "authentication", "headers"],
438
+ "strategy": {
439
+ "preferred": "ast",
440
+ "fallbacks": ["ast", "regex"],
441
+ "accuracy": {
442
+ "ast": 95,
443
+ "regex": 85
444
+ }
445
+ },
446
+ "engineMappings": {
447
+ "eslint": ["custom/typescript_s005"]
448
+ }
553
449
  },
554
450
  "S006": {
555
- "name": "Activation Recovery Secret Not Plaintext",
556
- "description": "Activation recovery secret must not be in plaintext",
451
+ "name": "No Plaintext Recovery/Activation Codes",
452
+ "description": "Do not send recovery or activation codes in plaintext",
557
453
  "category": "security",
558
454
  "severity": "error",
559
- "languages": [
560
- "typescript",
561
- "javascript"
562
- ],
563
- "analyzer": "eslint",
564
- "eslintRule": "custom/typescript_s006",
455
+ "languages": ["All languages"],
456
+ "analyzer": "./rules/security/S006_no_plaintext_recovery_codes/analyzer.js",
457
+ "config": "./rules/security/S006_no_plaintext_recovery_codes/config.json",
565
458
  "version": "1.0.0",
566
459
  "status": "stable",
567
- "tags": [
568
- "security",
569
- "secrets",
570
- "encryption"
571
- ]
460
+ "tags": ["security", "owasp", "cryptographic-failures", "authentication"],
461
+ "strategy": {
462
+ "preferred": "regex",
463
+ "fallback": "heuristic"
464
+ },
465
+ "engineMappings": {
466
+ "heuristic": "S006_no_plaintext_recovery_codes"
467
+ }
572
468
  },
573
469
  "S007": {
574
470
  "name": "No Plaintext OTP",
@@ -577,175 +473,136 @@
577
473
  "severity": "error",
578
474
  "languages": [
579
475
  "typescript",
580
- "javascript"
476
+ "javascript",
477
+ "dart",
478
+ "kotlin",
479
+ "java",
480
+ "python",
481
+ "go",
482
+ "swift"
581
483
  ],
582
- "analyzer": "eslint",
583
- "eslintRule": "custom/typescript_s007",
484
+ "analyzer": "./rules/security/S007_no_plaintext_otp/analyzer.js",
485
+ "config": "./rules/security/S007_no_plaintext_otp/config.json",
584
486
  "version": "1.0.0",
585
487
  "status": "stable",
586
488
  "tags": [
587
489
  "security",
588
490
  "otp",
589
- "encryption"
590
- ]
491
+ "encryption",
492
+ "owasp",
493
+ "cryptographic-failures",
494
+ "authentication"
495
+ ],
496
+ "strategy": {
497
+ "preferred": "heuristic",
498
+ "fallbacks": ["heuristic", "regex"],
499
+ "accuracy": {
500
+ "heuristic": 90,
501
+ "regex": 75
502
+ }
503
+ },
504
+ "engineMappings": {
505
+ "heuristic": "S007_no_plaintext_otp"
506
+ }
591
507
  },
592
508
  "S008": {
593
509
  "name": "Crypto Agility",
594
510
  "description": "Ensure cryptographic agility and algorithm flexibility",
595
511
  "category": "security",
596
512
  "severity": "error",
597
- "languages": [
598
- "typescript",
599
- "javascript"
600
- ],
513
+ "languages": ["typescript", "javascript"],
601
514
  "analyzer": "eslint",
602
515
  "eslintRule": "custom/typescript_s008",
603
516
  "version": "1.0.0",
604
517
  "status": "stable",
605
- "tags": [
606
- "security",
607
- "cryptography",
608
- "agility"
609
- ]
518
+ "tags": ["security", "cryptography", "agility"]
610
519
  },
611
520
  "S009": {
612
521
  "name": "No Insecure Crypto",
613
522
  "description": "Prevent usage of insecure cryptographic methods",
614
523
  "category": "security",
615
524
  "severity": "error",
616
- "languages": [
617
- "typescript",
618
- "javascript"
619
- ],
525
+ "languages": ["typescript", "javascript"],
620
526
  "analyzer": "eslint",
621
527
  "eslintRule": "custom/typescript_s009",
622
528
  "version": "1.0.0",
623
529
  "status": "stable",
624
- "tags": [
625
- "security",
626
- "cryptography",
627
- "insecure"
628
- ]
530
+ "tags": ["security", "cryptography", "insecure"]
629
531
  },
630
532
  "S010": {
631
533
  "name": "No Insecure Random in Sensitive Context",
632
534
  "description": "Prevent insecure random generator usage in sensitive contexts",
633
535
  "category": "security",
634
536
  "severity": "error",
635
- "languages": [
636
- "typescript",
637
- "javascript"
638
- ],
537
+ "languages": ["typescript", "javascript"],
639
538
  "analyzer": "eslint",
640
539
  "eslintRule": "custom/typescript_s010",
641
540
  "version": "1.0.0",
642
541
  "status": "stable",
643
- "tags": [
644
- "security",
645
- "random",
646
- "sensitive"
647
- ]
542
+ "tags": ["security", "random", "sensitive"]
648
543
  },
649
544
  "S011": {
650
545
  "name": "No Insecure UUID",
651
546
  "description": "UUID must be version 4 and use CSPRNG",
652
547
  "category": "security",
653
548
  "severity": "error",
654
- "languages": [
655
- "typescript",
656
- "javascript"
657
- ],
549
+ "languages": ["typescript", "javascript"],
658
550
  "analyzer": "eslint",
659
551
  "eslintRule": "custom/typescript_s011",
660
552
  "version": "1.0.0",
661
553
  "status": "stable",
662
- "tags": [
663
- "security",
664
- "uuid",
665
- "random"
666
- ]
554
+ "tags": ["security", "uuid", "random"]
667
555
  },
668
556
  "S012": {
669
557
  "name": "No Hardcoded Secrets",
670
558
  "description": "Prevent hardcoded secrets in source code",
671
559
  "category": "security",
672
560
  "severity": "error",
673
- "languages": [
674
- "typescript",
675
- "javascript"
676
- ],
561
+ "languages": ["typescript", "javascript"],
677
562
  "analyzer": "eslint",
678
563
  "eslintRule": "custom/typescript_s012",
679
564
  "version": "1.0.0",
680
565
  "status": "stable",
681
- "tags": [
682
- "security",
683
- "secrets",
684
- "hardcoded"
685
- ]
566
+ "tags": ["security", "secrets", "hardcoded"]
686
567
  },
687
568
  "S013": {
688
569
  "name": "Verify TLS Connection",
689
570
  "description": "Verify that TLS connections are properly established and validated",
690
571
  "category": "security",
691
572
  "severity": "error",
692
- "languages": [
693
- "typescript",
694
- "javascript"
695
- ],
573
+ "languages": ["typescript", "javascript"],
696
574
  "analyzer": "eslint",
697
575
  "eslintRule": "custom/typescript_s013",
698
576
  "version": "1.0.0",
699
577
  "status": "stable",
700
- "tags": [
701
- "security",
702
- "tls",
703
- "connection"
704
- ]
578
+ "tags": ["security", "tls", "connection"]
705
579
  },
706
580
  "S014": {
707
581
  "name": "Insecure TLS Version",
708
582
  "description": "Prevent usage of insecure TLS versions",
709
583
  "category": "security",
710
584
  "severity": "error",
711
- "languages": [
712
- "typescript",
713
- "javascript"
714
- ],
585
+ "languages": ["typescript", "javascript"],
715
586
  "analyzer": "eslint",
716
587
  "eslintRule": "custom/typescript_s014",
717
588
  "version": "1.0.0",
718
589
  "status": "stable",
719
- "tags": [
720
- "security",
721
- "tls",
722
- "encryption"
723
- ]
590
+ "tags": ["security", "tls", "encryption"]
724
591
  },
725
592
  "S015": {
726
593
  "name": "Insecure TLS Certificate",
727
594
  "description": "Prevent usage of insecure TLS certificate configurations",
728
595
  "category": "security",
729
596
  "severity": "error",
730
- "languages": [
731
- "typescript",
732
- "javascript"
733
- ],
597
+ "languages": ["typescript", "javascript"],
734
598
  "analyzer": "eslint",
735
599
  "eslintRule": "custom/typescript_s015",
736
600
  "version": "1.0.0",
737
601
  "status": "stable",
738
- "tags": [
739
- "security",
740
- "tls",
741
- "certificates"
742
- ],
602
+ "tags": ["security", "tls", "certificates"],
743
603
  "strategy": {
744
604
  "preferred": "ast",
745
- "fallbacks": [
746
- "ast",
747
- "regex"
748
- ],
605
+ "fallbacks": ["ast", "regex"],
749
606
  "accuracy": {
750
607
  "ast": 95,
751
608
  "regex": 80
@@ -757,139 +614,95 @@
757
614
  "description": "Prevent sensitive data in URL query parameters",
758
615
  "category": "security",
759
616
  "severity": "error",
760
- "languages": [
761
- "typescript",
762
- "javascript"
763
- ],
764
- "analyzer": "eslint",
765
- "eslintRule": "custom/typescript_s016",
617
+ "languages": ["typescript", "javascript"],
618
+ "analyzer": "./rules/security/S016_no_sensitive_querystring/analyzer.js",
619
+ "config": "./rules/security/S016_no_sensitive_querystring/config.json",
766
620
  "version": "1.0.0",
767
621
  "status": "stable",
768
- "tags": [
769
- "security",
770
- "sensitive-data",
771
- "url"
772
- ]
622
+ "tags": ["security", "sensitive-data", "url"],
623
+ "strategy": {
624
+ "preferred": "ast",
625
+ "fallbacks": ["ast", "regex"],
626
+ "accuracy": {
627
+ "ast": 95,
628
+ "regex": 80
629
+ }
630
+ }
773
631
  },
774
632
  "S017": {
775
633
  "name": "No SQL Injection",
776
634
  "description": "Prevent SQL injection vulnerabilities",
777
635
  "category": "security",
778
636
  "severity": "error",
779
- "languages": [
780
- "typescript",
781
- "javascript"
782
- ],
637
+ "languages": ["typescript", "javascript"],
783
638
  "analyzer": "eslint",
784
639
  "eslintRule": "custom/typescript_s017",
785
640
  "version": "1.0.0",
786
641
  "status": "stable",
787
- "tags": [
788
- "security",
789
- "sql-injection",
790
- "database"
791
- ]
642
+ "tags": ["security", "sql-injection", "database"]
792
643
  },
793
644
  "S018": {
794
645
  "name": "Positive Input Validation",
795
646
  "description": "Ensure positive input validation patterns",
796
647
  "category": "security",
797
648
  "severity": "error",
798
- "languages": [
799
- "typescript",
800
- "javascript"
801
- ],
649
+ "languages": ["typescript", "javascript"],
802
650
  "analyzer": "eslint",
803
651
  "eslintRule": "custom/typescript_s018",
804
652
  "version": "1.0.0",
805
653
  "status": "stable",
806
- "tags": [
807
- "security",
808
- "validation",
809
- "input"
810
- ]
654
+ "tags": ["security", "validation", "input"]
811
655
  },
812
656
  "S019": {
813
657
  "name": "No Raw User Input in Email",
814
658
  "description": "Prevent raw user input in email content",
815
659
  "category": "security",
816
660
  "severity": "error",
817
- "languages": [
818
- "typescript",
819
- "javascript"
820
- ],
661
+ "languages": ["typescript", "javascript"],
821
662
  "analyzer": "eslint",
822
663
  "eslintRule": "custom/typescript_s019",
823
664
  "version": "1.0.0",
824
665
  "status": "stable",
825
- "tags": [
826
- "security",
827
- "email",
828
- "injection"
829
- ]
666
+ "tags": ["security", "email", "injection"]
830
667
  },
831
668
  "S020": {
832
669
  "name": "No Eval Dynamic Execution",
833
670
  "description": "Prevent eval and dynamic code execution",
834
671
  "category": "security",
835
672
  "severity": "error",
836
- "languages": [
837
- "typescript",
838
- "javascript"
839
- ],
673
+ "languages": ["typescript", "javascript"],
840
674
  "analyzer": "eslint",
841
675
  "eslintRule": "custom/typescript_s020",
842
676
  "version": "1.0.0",
843
677
  "status": "stable",
844
- "tags": [
845
- "security",
846
- "eval",
847
- "dynamic-execution"
848
- ]
678
+ "tags": ["security", "eval", "dynamic-execution"]
849
679
  },
850
680
  "S022": {
851
681
  "name": "Output Encoding Required",
852
682
  "description": "Require output encoding for user input",
853
683
  "category": "security",
854
684
  "severity": "error",
855
- "languages": [
856
- "typescript",
857
- "javascript"
858
- ],
685
+ "languages": ["typescript", "javascript"],
859
686
  "analyzer": "eslint",
860
687
  "eslintRule": "custom/typescript_s022",
861
688
  "version": "1.0.0",
862
689
  "status": "stable",
863
- "tags": [
864
- "security",
865
- "encoding",
866
- "xss"
867
- ]
690
+ "tags": ["security", "encoding", "xss"]
868
691
  },
869
692
  "S023": {
870
693
  "name": "No JSON Injection",
871
694
  "description": "Prevent JSON injection vulnerabilities",
872
695
  "category": "security",
873
696
  "severity": "error",
874
- "languages": [
875
- "typescript",
876
- "javascript"
877
- ],
697
+ "languages": ["typescript", "javascript"],
878
698
  "analyzer": "eslint",
879
699
  "eslintRule": "custom/typescript_s023",
880
700
  "version": "1.0.0",
881
701
  "status": "stable",
882
- "tags": [
883
- "security",
884
- "json",
885
- "injection"
886
- ],
702
+ "tags": ["security", "json", "injection"],
887
703
  "strategy": {
888
704
  "preferred": "ast",
889
- "fallbacks": [
890
- "ast",
891
- "regex"
892
- ],
705
+ "fallbacks": ["ast", "regex"],
893
706
  "accuracy": {
894
707
  "ast": 95,
895
708
  "regex": 60
@@ -901,494 +714,312 @@
901
714
  "description": "Require server-side input validation",
902
715
  "category": "security",
903
716
  "severity": "error",
904
- "languages": [
905
- "typescript",
906
- "javascript"
907
- ],
717
+ "languages": ["typescript", "javascript"],
908
718
  "analyzer": "eslint",
909
719
  "eslintRule": "custom/typescript_s025",
910
720
  "version": "1.0.0",
911
721
  "status": "stable",
912
- "tags": [
913
- "security",
914
- "validation",
915
- "server-side"
916
- ]
722
+ "tags": ["security", "validation", "server-side"]
917
723
  },
918
724
  "S026": {
919
725
  "name": "JSON Schema Validation",
920
726
  "description": "Require JSON schema validation",
921
727
  "category": "security",
922
728
  "severity": "warning",
923
- "languages": [
924
- "typescript",
925
- "javascript"
926
- ],
729
+ "languages": ["typescript", "javascript"],
927
730
  "analyzer": "eslint",
928
731
  "eslintRule": "custom/typescript_s026",
929
732
  "version": "1.0.0",
930
733
  "status": "stable",
931
- "tags": [
932
- "security",
933
- "validation",
934
- "json-schema"
935
- ]
734
+ "tags": ["security", "validation", "json-schema"]
936
735
  },
937
736
  "S027": {
938
737
  "name": "No Hardcoded Secrets Advanced",
939
738
  "description": "Advanced detection of hardcoded secrets",
940
739
  "category": "security",
941
740
  "severity": "error",
942
- "languages": [
943
- "typescript",
944
- "javascript"
945
- ],
741
+ "languages": ["typescript", "javascript"],
946
742
  "analyzer": "eslint",
947
743
  "eslintRule": "custom/typescript_s027",
948
744
  "version": "1.0.0",
949
745
  "status": "stable",
950
- "tags": [
951
- "security",
952
- "secrets",
953
- "hardcoded"
954
- ]
746
+ "tags": ["security", "secrets", "hardcoded"]
955
747
  },
956
748
  "S029": {
957
749
  "name": "Require CSRF Protection",
958
750
  "description": "Require CSRF protection for state-changing operations",
959
751
  "category": "security",
960
752
  "severity": "error",
961
- "languages": [
962
- "typescript",
963
- "javascript"
964
- ],
753
+ "languages": ["typescript", "javascript"],
965
754
  "analyzer": "eslint",
966
755
  "eslintRule": "custom/typescript_s029",
967
756
  "version": "1.0.0",
968
757
  "status": "stable",
969
- "tags": [
970
- "security",
971
- "csrf",
972
- "protection"
973
- ]
758
+ "tags": ["security", "csrf", "protection"]
974
759
  },
975
760
  "S030": {
976
761
  "name": "No Directory Browsing",
977
762
  "description": "Prevent directory browsing vulnerabilities",
978
763
  "category": "security",
979
764
  "severity": "error",
980
- "languages": [
981
- "typescript",
982
- "javascript"
983
- ],
765
+ "languages": ["typescript", "javascript"],
984
766
  "analyzer": "eslint",
985
767
  "eslintRule": "custom/typescript_s030",
986
768
  "version": "1.0.0",
987
769
  "status": "stable",
988
- "tags": [
989
- "security",
990
- "directory-browsing",
991
- "information-disclosure"
992
- ]
770
+ "tags": ["security", "directory-browsing", "information-disclosure"]
993
771
  },
994
772
  "S033": {
995
773
  "name": "Require SameSite Cookie",
996
774
  "description": "Require SameSite attribute for cookies",
997
775
  "category": "security",
998
776
  "severity": "error",
999
- "languages": [
1000
- "typescript",
1001
- "javascript"
1002
- ],
777
+ "languages": ["typescript", "javascript"],
1003
778
  "analyzer": "eslint",
1004
779
  "eslintRule": "custom/typescript_s033",
1005
780
  "version": "1.0.0",
1006
781
  "status": "stable",
1007
- "tags": [
1008
- "security",
1009
- "cookies",
1010
- "samesite"
1011
- ]
782
+ "tags": ["security", "cookies", "samesite"]
1012
783
  },
1013
784
  "S034": {
1014
785
  "name": "Require Host Cookie Prefix",
1015
786
  "description": "Require __Host- prefix for secure cookies",
1016
787
  "category": "security",
1017
788
  "severity": "error",
1018
- "languages": [
1019
- "typescript",
1020
- "javascript"
1021
- ],
789
+ "languages": ["typescript", "javascript"],
1022
790
  "analyzer": "eslint",
1023
791
  "eslintRule": "custom/typescript_s034",
1024
792
  "version": "1.0.0",
1025
793
  "status": "stable",
1026
- "tags": [
1027
- "security",
1028
- "cookies",
1029
- "host-prefix"
1030
- ]
794
+ "tags": ["security", "cookies", "host-prefix"]
1031
795
  },
1032
796
  "S035": {
1033
797
  "name": "Cookie Specific Path",
1034
798
  "description": "Require specific path for sensitive cookies",
1035
799
  "category": "security",
1036
800
  "severity": "error",
1037
- "languages": [
1038
- "typescript",
1039
- "javascript"
1040
- ],
801
+ "languages": ["typescript", "javascript"],
1041
802
  "analyzer": "eslint",
1042
803
  "eslintRule": "custom/typescript_s035",
1043
804
  "version": "1.0.0",
1044
805
  "status": "stable",
1045
- "tags": [
1046
- "security",
1047
- "cookies",
1048
- "path"
1049
- ]
806
+ "tags": ["security", "cookies", "path"]
1050
807
  },
1051
808
  "S036": {
1052
809
  "name": "No Unsafe File Include",
1053
810
  "description": "Prevent unsafe file inclusion vulnerabilities",
1054
811
  "category": "security",
1055
812
  "severity": "error",
1056
- "languages": [
1057
- "typescript",
1058
- "javascript"
1059
- ],
813
+ "languages": ["typescript", "javascript"],
1060
814
  "analyzer": "eslint",
1061
815
  "eslintRule": "custom/typescript_s036",
1062
816
  "version": "1.0.0",
1063
817
  "status": "stable",
1064
- "tags": [
1065
- "security",
1066
- "file-inclusion",
1067
- "path-traversal"
1068
- ]
818
+ "tags": ["security", "file-inclusion", "path-traversal"]
1069
819
  },
1070
820
  "S037": {
1071
821
  "name": "Require Anti Cache Headers",
1072
822
  "description": "Require anti-cache headers for sensitive content",
1073
823
  "category": "security",
1074
824
  "severity": "warning",
1075
- "languages": [
1076
- "typescript",
1077
- "javascript"
1078
- ],
825
+ "languages": ["typescript", "javascript"],
1079
826
  "analyzer": "eslint",
1080
827
  "eslintRule": "custom/typescript_s037",
1081
828
  "version": "1.0.0",
1082
829
  "status": "stable",
1083
- "tags": [
1084
- "security",
1085
- "caching",
1086
- "headers"
1087
- ]
830
+ "tags": ["security", "caching", "headers"]
1088
831
  },
1089
832
  "S038": {
1090
833
  "name": "No Version Disclosure",
1091
834
  "description": "Prevent version information disclosure",
1092
835
  "category": "security",
1093
836
  "severity": "warning",
1094
- "languages": [
1095
- "typescript",
1096
- "javascript"
1097
- ],
837
+ "languages": ["typescript", "javascript"],
1098
838
  "analyzer": "eslint",
1099
839
  "eslintRule": "custom/typescript_s038",
1100
840
  "version": "1.0.0",
1101
841
  "status": "stable",
1102
- "tags": [
1103
- "security",
1104
- "information-disclosure",
1105
- "version"
1106
- ]
842
+ "tags": ["security", "information-disclosure", "version"]
1107
843
  },
1108
844
  "S039": {
1109
845
  "name": "No Session Token in URL",
1110
846
  "description": "Prevent session tokens in URL parameters",
1111
847
  "category": "security",
1112
848
  "severity": "error",
1113
- "languages": [
1114
- "typescript",
1115
- "javascript"
1116
- ],
849
+ "languages": ["typescript", "javascript"],
1117
850
  "analyzer": "eslint",
1118
851
  "eslintRule": "custom/typescript_s039",
1119
852
  "version": "1.0.0",
1120
853
  "status": "stable",
1121
- "tags": [
1122
- "security",
1123
- "session",
1124
- "url"
1125
- ]
854
+ "tags": ["security", "session", "url"]
1126
855
  },
1127
856
  "S041": {
1128
857
  "name": "Require Session Invalidate on Logout",
1129
858
  "description": "Require session invalidation on logout",
1130
859
  "category": "security",
1131
860
  "severity": "error",
1132
- "languages": [
1133
- "typescript",
1134
- "javascript"
1135
- ],
861
+ "languages": ["typescript", "javascript"],
1136
862
  "analyzer": "eslint",
1137
863
  "eslintRule": "custom/typescript_s041",
1138
864
  "version": "1.0.0",
1139
865
  "status": "stable",
1140
- "tags": [
1141
- "security",
1142
- "session",
1143
- "logout"
1144
- ]
866
+ "tags": ["security", "session", "logout"]
1145
867
  },
1146
868
  "S042": {
1147
869
  "name": "Require Periodic Reauthentication",
1148
870
  "description": "Require periodic re-authentication for sensitive operations",
1149
871
  "category": "security",
1150
872
  "severity": "error",
1151
- "languages": [
1152
- "typescript",
1153
- "javascript"
1154
- ],
873
+ "languages": ["typescript", "javascript"],
1155
874
  "analyzer": "eslint",
1156
875
  "eslintRule": "custom/typescript_s042",
1157
876
  "version": "1.0.0",
1158
877
  "status": "stable",
1159
- "tags": [
1160
- "security",
1161
- "authentication",
1162
- "periodic"
1163
- ]
878
+ "tags": ["security", "authentication", "periodic"]
1164
879
  },
1165
880
  "S043": {
1166
881
  "name": "Terminate Sessions on Password Change",
1167
882
  "description": "Terminate all sessions when password changes",
1168
883
  "category": "security",
1169
884
  "severity": "error",
1170
- "languages": [
1171
- "typescript",
1172
- "javascript"
1173
- ],
885
+ "languages": ["typescript", "javascript"],
1174
886
  "analyzer": "eslint",
1175
887
  "eslintRule": "custom/typescript_s043",
1176
888
  "version": "1.0.0",
1177
889
  "status": "stable",
1178
- "tags": [
1179
- "security",
1180
- "session",
1181
- "password"
1182
- ]
890
+ "tags": ["security", "session", "password"]
1183
891
  },
1184
892
  "S044": {
1185
893
  "name": "Require Full Session for Sensitive Operations",
1186
894
  "description": "Require full session validation for sensitive operations",
1187
895
  "category": "security",
1188
896
  "severity": "error",
1189
- "languages": [
1190
- "typescript",
1191
- "javascript"
1192
- ],
897
+ "languages": ["typescript", "javascript"],
1193
898
  "analyzer": "eslint",
1194
899
  "eslintRule": "custom/typescript_s044",
1195
900
  "version": "1.0.0",
1196
901
  "status": "stable",
1197
- "tags": [
1198
- "security",
1199
- "session",
1200
- "validation"
1201
- ]
902
+ "tags": ["security", "session", "validation"]
1202
903
  },
1203
904
  "S045": {
1204
905
  "name": "Anti Automation Controls",
1205
906
  "description": "Implement anti-automation controls",
1206
907
  "category": "security",
1207
908
  "severity": "warning",
1208
- "languages": [
1209
- "typescript",
1210
- "javascript"
1211
- ],
909
+ "languages": ["typescript", "javascript"],
1212
910
  "analyzer": "eslint",
1213
911
  "eslintRule": "custom/typescript_s045",
1214
912
  "version": "1.0.0",
1215
913
  "status": "stable",
1216
- "tags": [
1217
- "security",
1218
- "automation",
1219
- "protection"
1220
- ]
914
+ "tags": ["security", "automation", "protection"]
1221
915
  },
1222
916
  "S046": {
1223
917
  "name": "Secure Notification on Auth Change",
1224
918
  "description": "Require secure notification on authentication changes",
1225
919
  "category": "security",
1226
920
  "severity": "warning",
1227
- "languages": [
1228
- "typescript",
1229
- "javascript"
1230
- ],
921
+ "languages": ["typescript", "javascript"],
1231
922
  "analyzer": "eslint",
1232
923
  "eslintRule": "custom/typescript_s046",
1233
924
  "version": "1.0.0",
1234
925
  "status": "stable",
1235
- "tags": [
1236
- "security",
1237
- "notification",
1238
- "authentication"
1239
- ]
926
+ "tags": ["security", "notification", "authentication"]
1240
927
  },
1241
928
  "S047": {
1242
929
  "name": "Secure Random Password Generation",
1243
930
  "description": "Require secure and random initial password generation",
1244
931
  "category": "security",
1245
932
  "severity": "error",
1246
- "languages": [
1247
- "typescript",
1248
- "javascript"
1249
- ],
933
+ "languages": ["typescript", "javascript"],
1250
934
  "analyzer": "eslint",
1251
935
  "eslintRule": "custom/typescript_s047",
1252
936
  "version": "1.0.0",
1253
937
  "status": "stable",
1254
- "tags": [
1255
- "security",
1256
- "password",
1257
- "random"
1258
- ]
938
+ "tags": ["security", "password", "random"]
1259
939
  },
1260
940
  "S048": {
1261
941
  "name": "Password Credential Recovery",
1262
942
  "description": "Secure password credential recovery process",
1263
943
  "category": "security",
1264
944
  "severity": "error",
1265
- "languages": [
1266
- "typescript",
1267
- "javascript"
1268
- ],
945
+ "languages": ["typescript", "javascript"],
1269
946
  "analyzer": "eslint",
1270
947
  "eslintRule": "custom/typescript_s048",
1271
948
  "version": "1.0.0",
1272
949
  "status": "stable",
1273
- "tags": [
1274
- "security",
1275
- "password",
1276
- "recovery"
1277
- ]
950
+ "tags": ["security", "password", "recovery"]
1278
951
  },
1279
952
  "S050": {
1280
953
  "name": "Session Token Weak Hash",
1281
954
  "description": "Prevent weak hashing for session tokens",
1282
955
  "category": "security",
1283
956
  "severity": "error",
1284
- "languages": [
1285
- "typescript",
1286
- "javascript"
1287
- ],
957
+ "languages": ["typescript", "javascript"],
1288
958
  "analyzer": "eslint",
1289
959
  "eslintRule": "custom/typescript_s050",
1290
960
  "version": "1.0.0",
1291
961
  "status": "stable",
1292
- "tags": [
1293
- "security",
1294
- "session",
1295
- "hashing"
1296
- ]
962
+ "tags": ["security", "session", "hashing"]
1297
963
  },
1298
964
  "S052": {
1299
965
  "name": "Secure Random Authentication Code",
1300
966
  "description": "Require secure random number generation for authentication codes",
1301
967
  "category": "security",
1302
968
  "severity": "error",
1303
- "languages": [
1304
- "typescript",
1305
- "javascript"
1306
- ],
969
+ "languages": ["typescript", "javascript"],
1307
970
  "analyzer": "eslint",
1308
971
  "eslintRule": "custom/typescript_s052",
1309
972
  "version": "1.0.0",
1310
973
  "status": "stable",
1311
- "tags": [
1312
- "security",
1313
- "random",
1314
- "authentication"
1315
- ]
974
+ "tags": ["security", "random", "authentication"]
1316
975
  },
1317
976
  "S054": {
1318
977
  "name": "Verification Default Account",
1319
978
  "description": "Verify and secure default accounts",
1320
979
  "category": "security",
1321
980
  "severity": "error",
1322
- "languages": [
1323
- "typescript",
1324
- "javascript"
1325
- ],
981
+ "languages": ["typescript", "javascript"],
1326
982
  "analyzer": "eslint",
1327
983
  "eslintRule": "custom/typescript_s054",
1328
984
  "version": "1.0.0",
1329
985
  "status": "stable",
1330
- "tags": [
1331
- "security",
1332
- "accounts",
1333
- "default"
1334
- ]
986
+ "tags": ["security", "accounts", "default"]
1335
987
  },
1336
988
  "S055": {
1337
989
  "name": "REST Content-Type Verification",
1338
990
  "description": "Verify incoming Content-Type in REST API endpoints",
1339
991
  "category": "security",
1340
992
  "severity": "error",
1341
- "languages": [
1342
- "typescript",
1343
- "javascript"
1344
- ],
993
+ "languages": ["typescript", "javascript"],
1345
994
  "analyzer": "eslint",
1346
995
  "eslintRule": "custom/typescript_s055",
1347
996
  "version": "1.0.0",
1348
997
  "status": "stable",
1349
- "tags": [
1350
- "security",
1351
- "rest",
1352
- "content-type"
1353
- ]
998
+ "tags": ["security", "rest", "content-type"]
1354
999
  },
1355
1000
  "S057": {
1356
1001
  "name": "UTC Logging",
1357
1002
  "description": "Enforce UTC usage in time formatting and logging",
1358
1003
  "category": "security",
1359
1004
  "severity": "warning",
1360
- "languages": [
1361
- "typescript",
1362
- "javascript"
1363
- ],
1005
+ "languages": ["typescript", "javascript"],
1364
1006
  "analyzer": "eslint",
1365
1007
  "eslintRule": "custom/typescript_s057",
1366
1008
  "version": "1.0.0",
1367
1009
  "status": "stable",
1368
- "tags": [
1369
- "security",
1370
- "logging",
1371
- "timezone"
1372
- ]
1010
+ "tags": ["security", "logging", "timezone"]
1373
1011
  },
1374
1012
  "S058": {
1375
1013
  "name": "No SSRF",
1376
1014
  "description": "Detect SSRF vulnerabilities via unvalidated user-controlled URLs",
1377
1015
  "category": "security",
1378
1016
  "severity": "error",
1379
- "languages": [
1380
- "typescript",
1381
- "javascript"
1382
- ],
1017
+ "languages": ["typescript", "javascript"],
1383
1018
  "analyzer": "eslint",
1384
1019
  "eslintRule": "custom/typescript_s058",
1385
1020
  "version": "1.0.0",
1386
1021
  "status": "stable",
1387
- "tags": [
1388
- "security",
1389
- "ssrf",
1390
- "url-validation"
1391
- ]
1022
+ "tags": ["security", "ssrf", "url-validation"]
1392
1023
  },
1393
1024
  "C002": {
1394
1025
  "id": "C002",
@@ -1396,25 +1027,16 @@
1396
1027
  "description": "Auto-migrated rule C002 from ESLint mapping",
1397
1028
  "category": "general",
1398
1029
  "severity": "warning",
1399
- "languages": [
1400
- "typescript",
1401
- "javascript"
1402
- ],
1030
+ "languages": ["typescript", "javascript"],
1403
1031
  "version": "1.0.0",
1404
1032
  "status": "migrated",
1405
- "tags": [
1406
- "migrated"
1407
- ],
1033
+ "tags": ["migrated"],
1408
1034
  "engineMappings": {
1409
- "eslint": [
1410
- "custom/no-duplicate-code"
1411
- ]
1035
+ "eslint": ["custom/no-duplicate-code"]
1412
1036
  },
1413
1037
  "strategy": {
1414
1038
  "preferred": "regex",
1415
- "fallbacks": [
1416
- "regex"
1417
- ],
1039
+ "fallbacks": ["regex"],
1418
1040
  "accuracy": {}
1419
1041
  }
1420
1042
  },
@@ -1424,228 +1046,96 @@
1424
1046
  "description": "Auto-migrated rule C003 from ESLint mapping",
1425
1047
  "category": "general",
1426
1048
  "severity": "warning",
1427
- "languages": [
1428
- "typescript",
1429
- "javascript"
1430
- ],
1431
- "version": "1.0.0",
1432
- "status": "migrated",
1433
- "tags": [
1434
- "migrated"
1435
- ],
1436
- "engineMappings": {
1437
- "eslint": [
1438
- "custom/no-vague-abbreviations"
1439
- ]
1440
- },
1441
- "strategy": {
1442
- "preferred": "regex",
1443
- "fallbacks": [
1444
- "regex"
1445
- ],
1446
- "accuracy": {}
1447
- }
1448
- },
1449
- "C013": {
1450
- "id": "C013",
1451
- "name": "Rule C013",
1452
- "description": "Auto-migrated rule C013 from ESLint mapping",
1453
- "category": "general",
1454
- "severity": "warning",
1455
- "languages": [
1456
- "typescript",
1457
- "javascript"
1458
- ],
1049
+ "languages": ["typescript", "javascript"],
1459
1050
  "version": "1.0.0",
1460
- "status": "migrated",
1461
- "tags": [
1462
- "migrated"
1463
- ],
1464
- "engineMappings": {
1465
- "eslint": [
1466
- "custom/no-dead-code"
1467
- ]
1468
- },
1469
- "strategy": {
1470
- "preferred": "regex",
1471
- "fallbacks": [
1472
- "regex"
1473
- ],
1474
- "accuracy": {}
1475
- }
1476
- },
1477
- "C014": {
1478
- "id": "C014",
1479
- "name": "Rule C014",
1480
- "description": "Auto-migrated rule C014 from ESLint mapping",
1481
- "category": "general",
1482
- "severity": "warning",
1483
- "languages": [
1484
- "typescript",
1485
- "javascript"
1486
- ],
1487
- "version": "1.0.0",
1488
- "status": "migrated",
1489
- "tags": [
1490
- "migrated"
1491
- ],
1492
- "engineMappings": {
1493
- "eslint": [
1494
- "no-new",
1495
- "no-new-wrappers",
1496
- "@typescript-eslint/no-unnecessary-constructor"
1497
- ]
1498
- },
1499
- "strategy": {
1500
- "preferred": "regex",
1501
- "fallbacks": [
1502
- "regex"
1503
- ],
1504
- "accuracy": {}
1505
- }
1506
- },
1507
- "C017": {
1508
- "id": "C017",
1509
- "name": "Rule C017",
1510
- "description": "Auto-migrated rule C017 from ESLint mapping",
1511
- "category": "general",
1512
- "severity": "warning",
1513
- "languages": [
1514
- "typescript",
1515
- "javascript"
1516
- ],
1517
- "version": "1.0.0",
1518
- "status": "migrated",
1519
- "tags": [
1520
- "migrated"
1521
- ],
1522
- "engineMappings": {
1523
- "eslint": [
1524
- "custom/limit-constructor-logic"
1525
- ]
1526
- },
1527
- "strategy": {
1528
- "preferred": "ast",
1529
- "fallbacks": [
1530
- "ast",
1531
- "regex"
1532
- ],
1533
- "accuracy": {
1534
- "ast": 90,
1535
- "regex": 70
1536
- }
1537
- }
1538
- },
1539
- "C018": {
1540
- "id": "C018",
1541
- "name": "Rule C018",
1542
- "description": "Auto-migrated rule C018 from ESLint mapping",
1543
- "category": "general",
1544
- "severity": "warning",
1545
- "languages": [
1546
- "typescript",
1547
- "javascript"
1548
- ],
1549
- "version": "1.0.0",
1550
- "status": "migrated",
1551
- "tags": [
1552
- "migrated"
1553
- ],
1554
- "engineMappings": {
1555
- "eslint": [
1556
- "custom/no-generic-throw"
1557
- ]
1558
- },
1559
- "strategy": {
1560
- "preferred": "regex",
1561
- "fallbacks": [
1562
- "regex"
1563
- ],
1564
- "accuracy": {}
1565
- }
1566
- },
1567
- "C023": {
1568
- "id": "C023",
1569
- "name": "Rule C023",
1570
- "description": "Auto-migrated rule C023 from ESLint mapping",
1571
- "category": "general",
1572
- "severity": "warning",
1573
- "languages": [
1574
- "typescript",
1575
- "javascript"
1576
- ],
1577
- "version": "1.0.0",
1578
- "status": "migrated",
1579
- "tags": [
1580
- "migrated"
1581
- ],
1051
+ "status": "migrated",
1052
+ "tags": ["migrated"],
1582
1053
  "engineMappings": {
1583
- "eslint": [
1584
- "custom/no-duplicate-variable-name-in-scope"
1585
- ]
1054
+ "eslint": ["custom/no-vague-abbreviations"]
1586
1055
  },
1587
1056
  "strategy": {
1588
1057
  "preferred": "regex",
1589
- "fallbacks": [
1590
- "regex"
1591
- ],
1058
+ "fallbacks": ["regex"],
1592
1059
  "accuracy": {}
1593
1060
  }
1594
1061
  },
1595
- "C030": {
1596
- "id": "C030",
1597
- "name": "Rule C030",
1598
- "description": "Auto-migrated rule C030 from ESLint mapping",
1599
- "category": "general",
1062
+ "C014": {
1063
+ "name": "Dependency Injection Pattern",
1064
+ "description": "Use Dependency Injection instead of direct instantiation in business logic. Increases testability and reduces coupling.",
1065
+ "category": "design",
1600
1066
  "severity": "warning",
1601
- "languages": [
1602
- "typescript",
1603
- "javascript"
1604
- ],
1067
+ "languages": ["typescript", "javascript"],
1068
+ "analyzer": "./rules/common/C014_dependency_injection/analyzer.js",
1069
+ "config": "./rules/common/C014_dependency_injection/config.json",
1605
1070
  "version": "1.0.0",
1606
- "status": "migrated",
1071
+ "status": "stable",
1607
1072
  "tags": [
1608
- "migrated"
1073
+ "design",
1074
+ "dependency-injection",
1075
+ "testability",
1076
+ "coupling",
1077
+ "SOLID"
1609
1078
  ],
1079
+ "strategy": {
1080
+ "preferred": "ast",
1081
+ "fallbacks": [],
1082
+ "accuracy": {
1083
+ "ast": 95
1084
+ },
1085
+ "requirements": {
1086
+ "ast": {
1087
+ "semanticEngine": true,
1088
+ "description": "C014 requires symbol-based analysis for accurate dependency injection pattern detection"
1089
+ }
1090
+ }
1091
+ },
1610
1092
  "engineMappings": {
1611
1093
  "eslint": [
1612
- "custom/use-custom-error-classes"
1094
+ "no-new",
1095
+ "no-new-wrappers",
1096
+ "@typescript-eslint/no-unnecessary-constructor"
1613
1097
  ]
1098
+ }
1099
+ },
1100
+ "C017": {
1101
+ "id": "C017",
1102
+ "name": "Rule C017",
1103
+ "description": "Auto-migrated rule C017 from ESLint mapping",
1104
+ "category": "general",
1105
+ "severity": "warning",
1106
+ "languages": ["typescript", "javascript"],
1107
+ "version": "1.0.0",
1108
+ "status": "migrated",
1109
+ "tags": ["migrated"],
1110
+ "engineMappings": {
1111
+ "eslint": ["custom/limit-constructor-logic"]
1614
1112
  },
1615
1113
  "strategy": {
1616
- "preferred": "regex",
1617
- "fallbacks": [
1618
- "regex"
1619
- ],
1620
- "accuracy": {}
1114
+ "preferred": "semantic",
1115
+ "fallbacks": ["semantic", "ast", "regex"],
1116
+ "accuracy": {
1117
+ "semantic": 95,
1118
+ "ast": 85,
1119
+ "regex": 70
1120
+ }
1621
1121
  }
1622
1122
  },
1623
- "C035": {
1624
- "id": "C035",
1625
- "name": "Rule C035",
1626
- "description": "Auto-migrated rule C035 from ESLint mapping",
1123
+ "C030": {
1124
+ "id": "C030",
1125
+ "name": "Rule C030",
1126
+ "description": "Auto-migrated rule C030 from ESLint mapping",
1627
1127
  "category": "general",
1628
1128
  "severity": "warning",
1629
- "languages": [
1630
- "typescript",
1631
- "javascript"
1632
- ],
1129
+ "languages": ["typescript", "javascript"],
1633
1130
  "version": "1.0.0",
1634
1131
  "status": "migrated",
1635
- "tags": [
1636
- "migrated"
1637
- ],
1132
+ "tags": ["migrated"],
1638
1133
  "engineMappings": {
1639
- "eslint": [
1640
- "no-empty-catch",
1641
- "@typescript-eslint/no-unused-vars"
1642
- ]
1134
+ "eslint": ["custom/use-custom-error-classes"]
1643
1135
  },
1644
1136
  "strategy": {
1645
1137
  "preferred": "regex",
1646
- "fallbacks": [
1647
- "regex"
1648
- ],
1138
+ "fallbacks": ["regex"],
1649
1139
  "accuracy": {}
1650
1140
  }
1651
1141
  },
@@ -1655,25 +1145,16 @@
1655
1145
  "description": "Auto-migrated rule C041 from ESLint mapping",
1656
1146
  "category": "general",
1657
1147
  "severity": "warning",
1658
- "languages": [
1659
- "typescript",
1660
- "javascript"
1661
- ],
1148
+ "languages": ["typescript", "javascript"],
1662
1149
  "version": "1.0.0",
1663
1150
  "status": "migrated",
1664
- "tags": [
1665
- "migrated"
1666
- ],
1151
+ "tags": ["migrated"],
1667
1152
  "engineMappings": {
1668
- "eslint": [
1669
- "custom/no-config-inline"
1670
- ]
1153
+ "eslint": ["custom/no-config-inline"]
1671
1154
  },
1672
1155
  "strategy": {
1673
1156
  "preferred": "regex",
1674
- "fallbacks": [
1675
- "regex"
1676
- ],
1157
+ "fallbacks": ["regex"],
1677
1158
  "accuracy": {}
1678
1159
  }
1679
1160
  },
@@ -1683,25 +1164,16 @@
1683
1164
  "description": "Auto-migrated rule C042 from ESLint mapping",
1684
1165
  "category": "general",
1685
1166
  "severity": "warning",
1686
- "languages": [
1687
- "typescript",
1688
- "javascript"
1689
- ],
1167
+ "languages": ["typescript", "javascript"],
1690
1168
  "version": "1.0.0",
1691
1169
  "status": "migrated",
1692
- "tags": [
1693
- "migrated"
1694
- ],
1170
+ "tags": ["migrated"],
1695
1171
  "engineMappings": {
1696
- "eslint": [
1697
- "custom/boolean-name-prefix"
1698
- ]
1172
+ "eslint": ["custom/boolean-name-prefix"]
1699
1173
  },
1700
1174
  "strategy": {
1701
1175
  "preferred": "regex",
1702
- "fallbacks": [
1703
- "regex"
1704
- ],
1176
+ "fallbacks": ["regex"],
1705
1177
  "accuracy": {}
1706
1178
  }
1707
1179
  },
@@ -1711,53 +1183,36 @@
1711
1183
  "description": "Auto-migrated rule C047 from ESLint mapping",
1712
1184
  "category": "general",
1713
1185
  "severity": "warning",
1714
- "languages": [
1715
- "typescript",
1716
- "javascript"
1717
- ],
1186
+ "languages": ["typescript", "javascript"],
1718
1187
  "version": "1.0.0",
1719
1188
  "status": "migrated",
1720
- "tags": [
1721
- "migrated"
1722
- ],
1189
+ "tags": ["migrated"],
1723
1190
  "engineMappings": {
1724
- "eslint": [
1725
- "custom/no-duplicate-retry-logic"
1726
- ]
1191
+ "eslint": ["custom/no-duplicate-retry-logic"]
1727
1192
  },
1728
1193
  "strategy": {
1729
1194
  "preferred": "regex",
1730
- "fallbacks": [
1731
- "regex"
1732
- ],
1195
+ "fallbacks": ["regex"],
1733
1196
  "accuracy": {}
1734
1197
  }
1735
1198
  },
1736
1199
  "C072": {
1737
1200
  "id": "C072",
1738
- "name": "Rule C072",
1739
- "description": "Auto-migrated rule C072 from ESLint mapping",
1740
- "category": "general",
1201
+ "name": "Single Test Behavior",
1202
+ "description": "Each test should assert only one behavior",
1203
+ "category": "testing",
1741
1204
  "severity": "warning",
1742
- "languages": [
1743
- "typescript",
1744
- "javascript"
1745
- ],
1205
+ "languages": ["typescript", "javascript"],
1746
1206
  "version": "1.0.0",
1747
- "status": "migrated",
1748
- "tags": [
1749
- "migrated"
1750
- ],
1207
+ "status": "stable",
1208
+ "tags": ["testing", "unit-test", "single-behavior"],
1751
1209
  "engineMappings": {
1752
- "eslint": [
1753
- "custom/one-assert-per-test"
1754
- ]
1210
+ "eslint": ["custom/c072-one-assert-per-test"],
1211
+ "heuristic": ["rules/common/C072_single_test_behavior/analyzer.js"]
1755
1212
  },
1756
1213
  "strategy": {
1757
1214
  "preferred": "regex",
1758
- "fallbacks": [
1759
- "regex"
1760
- ],
1215
+ "fallbacks": ["regex"],
1761
1216
  "accuracy": {}
1762
1217
  }
1763
1218
  },
@@ -1767,25 +1222,37 @@
1767
1222
  "description": "Auto-migrated rule C075 from ESLint mapping",
1768
1223
  "category": "general",
1769
1224
  "severity": "warning",
1770
- "languages": [
1771
- "typescript",
1772
- "javascript"
1773
- ],
1225
+ "languages": ["typescript", "javascript"],
1774
1226
  "version": "1.0.0",
1775
1227
  "status": "migrated",
1776
- "tags": [
1777
- "migrated"
1778
- ],
1228
+ "tags": ["migrated"],
1779
1229
  "engineMappings": {
1780
- "eslint": [
1781
- "custom/explicit-function-return-types"
1782
- ]
1230
+ "eslint": ["custom/explicit-function-return-types"]
1783
1231
  },
1784
1232
  "strategy": {
1785
1233
  "preferred": "regex",
1786
- "fallbacks": [
1787
- "regex"
1788
- ],
1234
+ "fallbacks": ["regex"],
1235
+ "accuracy": {}
1236
+ }
1237
+ },
1238
+ "C076": {
1239
+ "id": "C076",
1240
+ "name": "Explicit Function Argument Types",
1241
+ "description": "All public functions must declare explicit types for arguments",
1242
+ "category": "type-safety",
1243
+ "severity": "error",
1244
+ "languages": ["typescript", "javascript"],
1245
+ "version": "1.0.0",
1246
+ "status": "stable",
1247
+ "tags": ["type-safety", "public-api", "explicit-types"],
1248
+ "engineMappings": {
1249
+ "heuristic": [
1250
+ "rules/common/C076_explicit_function_types/semantic-analyzer.js"
1251
+ ]
1252
+ },
1253
+ "strategy": {
1254
+ "preferred": "symbol",
1255
+ "fallbacks": ["symbol"],
1789
1256
  "accuracy": {}
1790
1257
  }
1791
1258
  },
@@ -1795,25 +1262,16 @@
1795
1262
  "description": "Auto-migrated rule T002 from ESLint mapping",
1796
1263
  "category": "typescript",
1797
1264
  "severity": "warning",
1798
- "languages": [
1799
- "typescript",
1800
- "javascript"
1801
- ],
1265
+ "languages": ["typescript", "javascript"],
1802
1266
  "version": "1.0.0",
1803
1267
  "status": "migrated",
1804
- "tags": [
1805
- "migrated"
1806
- ],
1268
+ "tags": ["migrated"],
1807
1269
  "engineMappings": {
1808
- "eslint": [
1809
- "custom/interface-prefix-i"
1810
- ]
1270
+ "eslint": ["custom/interface-prefix-i"]
1811
1271
  },
1812
1272
  "strategy": {
1813
1273
  "preferred": "regex",
1814
- "fallbacks": [
1815
- "regex"
1816
- ],
1274
+ "fallbacks": ["regex"],
1817
1275
  "accuracy": {}
1818
1276
  }
1819
1277
  },
@@ -1823,25 +1281,16 @@
1823
1281
  "description": "Auto-migrated rule T003 from ESLint mapping",
1824
1282
  "category": "typescript",
1825
1283
  "severity": "warning",
1826
- "languages": [
1827
- "typescript",
1828
- "javascript"
1829
- ],
1284
+ "languages": ["typescript", "javascript"],
1830
1285
  "version": "1.0.0",
1831
1286
  "status": "migrated",
1832
- "tags": [
1833
- "migrated"
1834
- ],
1287
+ "tags": ["migrated"],
1835
1288
  "engineMappings": {
1836
- "eslint": [
1837
- "custom/ts-ignore-reason"
1838
- ]
1289
+ "eslint": ["custom/ts-ignore-reason"]
1839
1290
  },
1840
1291
  "strategy": {
1841
1292
  "preferred": "regex",
1842
- "fallbacks": [
1843
- "regex"
1844
- ],
1293
+ "fallbacks": ["regex"],
1845
1294
  "accuracy": {}
1846
1295
  }
1847
1296
  },
@@ -1851,25 +1300,16 @@
1851
1300
  "description": "Auto-migrated rule T004 from ESLint mapping",
1852
1301
  "category": "typescript",
1853
1302
  "severity": "warning",
1854
- "languages": [
1855
- "typescript",
1856
- "javascript"
1857
- ],
1303
+ "languages": ["typescript", "javascript"],
1858
1304
  "version": "1.0.0",
1859
1305
  "status": "migrated",
1860
- "tags": [
1861
- "migrated"
1862
- ],
1306
+ "tags": ["migrated"],
1863
1307
  "engineMappings": {
1864
- "eslint": [
1865
- "custom/no-empty-type"
1866
- ]
1308
+ "eslint": ["custom/no-empty-type"]
1867
1309
  },
1868
1310
  "strategy": {
1869
1311
  "preferred": "regex",
1870
- "fallbacks": [
1871
- "regex"
1872
- ],
1312
+ "fallbacks": ["regex"],
1873
1313
  "accuracy": {}
1874
1314
  }
1875
1315
  },
@@ -1879,25 +1319,16 @@
1879
1319
  "description": "Auto-migrated rule T007 from ESLint mapping",
1880
1320
  "category": "typescript",
1881
1321
  "severity": "warning",
1882
- "languages": [
1883
- "typescript",
1884
- "javascript"
1885
- ],
1322
+ "languages": ["typescript", "javascript"],
1886
1323
  "version": "1.0.0",
1887
1324
  "status": "migrated",
1888
- "tags": [
1889
- "migrated"
1890
- ],
1325
+ "tags": ["migrated"],
1891
1326
  "engineMappings": {
1892
- "eslint": [
1893
- "custom/no-fn-in-constructor"
1894
- ]
1327
+ "eslint": ["custom/no-fn-in-constructor"]
1895
1328
  },
1896
1329
  "strategy": {
1897
1330
  "preferred": "regex",
1898
- "fallbacks": [
1899
- "regex"
1900
- ],
1331
+ "fallbacks": ["regex"],
1901
1332
  "accuracy": {}
1902
1333
  }
1903
1334
  },
@@ -1907,25 +1338,16 @@
1907
1338
  "description": "Auto-migrated rule T010 from ESLint mapping",
1908
1339
  "category": "typescript",
1909
1340
  "severity": "warning",
1910
- "languages": [
1911
- "typescript",
1912
- "javascript"
1913
- ],
1341
+ "languages": ["typescript", "javascript"],
1914
1342
  "version": "1.0.0",
1915
1343
  "status": "migrated",
1916
- "tags": [
1917
- "migrated"
1918
- ],
1344
+ "tags": ["migrated"],
1919
1345
  "engineMappings": {
1920
- "eslint": [
1921
- "custom/no-nested-union-tuple"
1922
- ]
1346
+ "eslint": ["custom/no-nested-union-tuple"]
1923
1347
  },
1924
1348
  "strategy": {
1925
1349
  "preferred": "regex",
1926
- "fallbacks": [
1927
- "regex"
1928
- ],
1350
+ "fallbacks": ["regex"],
1929
1351
  "accuracy": {}
1930
1352
  }
1931
1353
  },
@@ -1935,25 +1357,16 @@
1935
1357
  "description": "Auto-migrated rule T019 from ESLint mapping",
1936
1358
  "category": "typescript",
1937
1359
  "severity": "warning",
1938
- "languages": [
1939
- "typescript",
1940
- "javascript"
1941
- ],
1360
+ "languages": ["typescript", "javascript"],
1942
1361
  "version": "1.0.0",
1943
1362
  "status": "migrated",
1944
- "tags": [
1945
- "migrated"
1946
- ],
1363
+ "tags": ["migrated"],
1947
1364
  "engineMappings": {
1948
- "eslint": [
1949
- "custom/no-this-assign"
1950
- ]
1365
+ "eslint": ["custom/no-this-assign"]
1951
1366
  },
1952
1367
  "strategy": {
1953
1368
  "preferred": "regex",
1954
- "fallbacks": [
1955
- "regex"
1956
- ],
1369
+ "fallbacks": ["regex"],
1957
1370
  "accuracy": {}
1958
1371
  }
1959
1372
  },
@@ -1963,25 +1376,16 @@
1963
1376
  "description": "Auto-migrated rule T020 from ESLint mapping",
1964
1377
  "category": "typescript",
1965
1378
  "severity": "warning",
1966
- "languages": [
1967
- "typescript",
1968
- "javascript"
1969
- ],
1379
+ "languages": ["typescript", "javascript"],
1970
1380
  "version": "1.0.0",
1971
1381
  "status": "migrated",
1972
- "tags": [
1973
- "migrated"
1974
- ],
1382
+ "tags": ["migrated"],
1975
1383
  "engineMappings": {
1976
- "eslint": [
1977
- "custom/no-default-multi-export"
1978
- ]
1384
+ "eslint": ["custom/no-default-multi-export"]
1979
1385
  },
1980
1386
  "strategy": {
1981
1387
  "preferred": "regex",
1982
- "fallbacks": [
1983
- "regex"
1984
- ],
1388
+ "fallbacks": ["regex"],
1985
1389
  "accuracy": {}
1986
1390
  }
1987
1391
  },
@@ -1991,25 +1395,16 @@
1991
1395
  "description": "Auto-migrated rule T021 from ESLint mapping",
1992
1396
  "category": "typescript",
1993
1397
  "severity": "warning",
1994
- "languages": [
1995
- "typescript",
1996
- "javascript"
1997
- ],
1398
+ "languages": ["typescript", "javascript"],
1998
1399
  "version": "1.0.0",
1999
1400
  "status": "migrated",
2000
- "tags": [
2001
- "migrated"
2002
- ],
1401
+ "tags": ["migrated"],
2003
1402
  "engineMappings": {
2004
- "eslint": [
2005
- "custom/limit-nested-generics"
2006
- ]
1403
+ "eslint": ["custom/limit-nested-generics"]
2007
1404
  },
2008
1405
  "strategy": {
2009
1406
  "preferred": "regex",
2010
- "fallbacks": [
2011
- "regex"
2012
- ],
1407
+ "fallbacks": ["regex"],
2013
1408
  "accuracy": {}
2014
1409
  }
2015
1410
  },
@@ -2019,15 +1414,10 @@
2019
1414
  "description": "Auto-migrated rule R001 from ESLint mapping",
2020
1415
  "category": "react",
2021
1416
  "severity": "warning",
2022
- "languages": [
2023
- "typescript",
2024
- "javascript"
2025
- ],
1417
+ "languages": ["typescript", "javascript"],
2026
1418
  "version": "1.0.0",
2027
1419
  "status": "migrated",
2028
- "tags": [
2029
- "migrated"
2030
- ],
1420
+ "tags": ["migrated"],
2031
1421
  "engineMappings": {
2032
1422
  "eslint": [
2033
1423
  "react/no-this-in-sfc",
@@ -2038,9 +1428,7 @@
2038
1428
  },
2039
1429
  "strategy": {
2040
1430
  "preferred": "regex",
2041
- "fallbacks": [
2042
- "regex"
2043
- ],
1431
+ "fallbacks": ["regex"],
2044
1432
  "accuracy": {}
2045
1433
  }
2046
1434
  },
@@ -2050,15 +1438,10 @@
2050
1438
  "description": "Auto-migrated rule R002 from ESLint mapping",
2051
1439
  "category": "react",
2052
1440
  "severity": "warning",
2053
- "languages": [
2054
- "typescript",
2055
- "javascript"
2056
- ],
1441
+ "languages": ["typescript", "javascript"],
2057
1442
  "version": "1.0.0",
2058
1443
  "status": "migrated",
2059
- "tags": [
2060
- "migrated"
2061
- ],
1444
+ "tags": ["migrated"],
2062
1445
  "engineMappings": {
2063
1446
  "eslint": [
2064
1447
  "react-hooks/rules-of-hooks",
@@ -2069,9 +1452,7 @@
2069
1452
  },
2070
1453
  "strategy": {
2071
1454
  "preferred": "regex",
2072
- "fallbacks": [
2073
- "regex"
2074
- ],
1455
+ "fallbacks": ["regex"],
2075
1456
  "accuracy": {}
2076
1457
  }
2077
1458
  },
@@ -2081,15 +1462,10 @@
2081
1462
  "description": "Auto-migrated rule R003 from ESLint mapping",
2082
1463
  "category": "react",
2083
1464
  "severity": "warning",
2084
- "languages": [
2085
- "typescript",
2086
- "javascript"
2087
- ],
1465
+ "languages": ["typescript", "javascript"],
2088
1466
  "version": "1.0.0",
2089
1467
  "status": "migrated",
2090
- "tags": [
2091
- "migrated"
2092
- ],
1468
+ "tags": ["migrated"],
2093
1469
  "engineMappings": {
2094
1470
  "eslint": [
2095
1471
  "react/no-direct-mutation-state",
@@ -2099,9 +1475,7 @@
2099
1475
  },
2100
1476
  "strategy": {
2101
1477
  "preferred": "regex",
2102
- "fallbacks": [
2103
- "regex"
2104
- ],
1478
+ "fallbacks": ["regex"],
2105
1479
  "accuracy": {}
2106
1480
  }
2107
1481
  },
@@ -2111,26 +1485,16 @@
2111
1485
  "description": "Auto-migrated rule R004 from ESLint mapping",
2112
1486
  "category": "react",
2113
1487
  "severity": "warning",
2114
- "languages": [
2115
- "typescript",
2116
- "javascript"
2117
- ],
1488
+ "languages": ["typescript", "javascript"],
2118
1489
  "version": "1.0.0",
2119
1490
  "status": "migrated",
2120
- "tags": [
2121
- "migrated"
2122
- ],
1491
+ "tags": ["migrated"],
2123
1492
  "engineMappings": {
2124
- "eslint": [
2125
- "no-param-reassign",
2126
- "react/forbid-foreign-prop-types"
2127
- ]
1493
+ "eslint": ["no-param-reassign", "react/forbid-foreign-prop-types"]
2128
1494
  },
2129
1495
  "strategy": {
2130
1496
  "preferred": "regex",
2131
- "fallbacks": [
2132
- "regex"
2133
- ],
1497
+ "fallbacks": ["regex"],
2134
1498
  "accuracy": {}
2135
1499
  }
2136
1500
  },
@@ -2140,25 +1504,16 @@
2140
1504
  "description": "Auto-migrated rule R005 from ESLint mapping",
2141
1505
  "category": "react",
2142
1506
  "severity": "warning",
2143
- "languages": [
2144
- "typescript",
2145
- "javascript"
2146
- ],
1507
+ "languages": ["typescript", "javascript"],
2147
1508
  "version": "1.0.0",
2148
1509
  "status": "migrated",
2149
- "tags": [
2150
- "migrated"
2151
- ],
1510
+ "tags": ["migrated"],
2152
1511
  "engineMappings": {
2153
- "eslint": [
2154
- "react/jsx-no-bind"
2155
- ]
1512
+ "eslint": ["react/jsx-no-bind"]
2156
1513
  },
2157
1514
  "strategy": {
2158
1515
  "preferred": "regex",
2159
- "fallbacks": [
2160
- "regex"
2161
- ],
1516
+ "fallbacks": ["regex"],
2162
1517
  "accuracy": {}
2163
1518
  }
2164
1519
  },
@@ -2168,15 +1523,10 @@
2168
1523
  "description": "Auto-migrated rule R006 from ESLint mapping",
2169
1524
  "category": "react",
2170
1525
  "severity": "warning",
2171
- "languages": [
2172
- "typescript",
2173
- "javascript"
2174
- ],
1526
+ "languages": ["typescript", "javascript"],
2175
1527
  "version": "1.0.0",
2176
1528
  "status": "migrated",
2177
- "tags": [
2178
- "migrated"
2179
- ],
1529
+ "tags": ["migrated"],
2180
1530
  "engineMappings": {
2181
1531
  "eslint": [
2182
1532
  "react/jsx-pascal-case",
@@ -2186,9 +1536,7 @@
2186
1536
  },
2187
1537
  "strategy": {
2188
1538
  "preferred": "regex",
2189
- "fallbacks": [
2190
- "regex"
2191
- ],
1539
+ "fallbacks": ["regex"],
2192
1540
  "accuracy": {}
2193
1541
  }
2194
1542
  },
@@ -2198,25 +1546,16 @@
2198
1546
  "description": "Auto-migrated rule R007 from ESLint mapping",
2199
1547
  "category": "react",
2200
1548
  "severity": "warning",
2201
- "languages": [
2202
- "typescript",
2203
- "javascript"
2204
- ],
1549
+ "languages": ["typescript", "javascript"],
2205
1550
  "version": "1.0.0",
2206
1551
  "status": "migrated",
2207
- "tags": [
2208
- "migrated"
2209
- ],
1552
+ "tags": ["migrated"],
2210
1553
  "engineMappings": {
2211
- "eslint": [
2212
- "react-hooks/rules-of-hooks"
2213
- ]
1554
+ "eslint": ["react-hooks/rules-of-hooks"]
2214
1555
  },
2215
1556
  "strategy": {
2216
1557
  "preferred": "regex",
2217
- "fallbacks": [
2218
- "regex"
2219
- ],
1558
+ "fallbacks": ["regex"],
2220
1559
  "accuracy": {}
2221
1560
  }
2222
1561
  },
@@ -2226,25 +1565,16 @@
2226
1565
  "description": "Auto-migrated rule R008 from ESLint mapping",
2227
1566
  "category": "react",
2228
1567
  "severity": "warning",
2229
- "languages": [
2230
- "typescript",
2231
- "javascript"
2232
- ],
1568
+ "languages": ["typescript", "javascript"],
2233
1569
  "version": "1.0.0",
2234
1570
  "status": "migrated",
2235
- "tags": [
2236
- "migrated"
2237
- ],
1571
+ "tags": ["migrated"],
2238
1572
  "engineMappings": {
2239
- "eslint": [
2240
- "react-hooks/rules-of-hooks"
2241
- ]
1573
+ "eslint": ["react-hooks/rules-of-hooks"]
2242
1574
  },
2243
1575
  "strategy": {
2244
1576
  "preferred": "regex",
2245
- "fallbacks": [
2246
- "regex"
2247
- ],
1577
+ "fallbacks": ["regex"],
2248
1578
  "accuracy": {}
2249
1579
  }
2250
1580
  },
@@ -2254,25 +1584,16 @@
2254
1584
  "description": "Auto-migrated rule R009 from ESLint mapping",
2255
1585
  "category": "react",
2256
1586
  "severity": "warning",
2257
- "languages": [
2258
- "typescript",
2259
- "javascript"
2260
- ],
1587
+ "languages": ["typescript", "javascript"],
2261
1588
  "version": "1.0.0",
2262
1589
  "status": "migrated",
2263
- "tags": [
2264
- "migrated"
2265
- ],
1590
+ "tags": ["migrated"],
2266
1591
  "engineMappings": {
2267
- "eslint": [
2268
- "react-hooks/rules-of-hooks"
2269
- ]
1592
+ "eslint": ["react-hooks/rules-of-hooks"]
2270
1593
  },
2271
1594
  "strategy": {
2272
1595
  "preferred": "regex",
2273
- "fallbacks": [
2274
- "regex"
2275
- ],
1596
+ "fallbacks": ["regex"],
2276
1597
  "accuracy": {}
2277
1598
  }
2278
1599
  }
@@ -2300,7 +1621,6 @@
2300
1621
  "C047",
2301
1622
  "C072",
2302
1623
  "C075",
2303
- "C076",
2304
1624
  "T002",
2305
1625
  "T003",
2306
1626
  "T004",
@@ -2375,46 +1695,31 @@
2375
1695
  "logging": {
2376
1696
  "name": "Logging Standards",
2377
1697
  "description": "Rules related to logging practices",
2378
- "rules": [
2379
- "C019",
2380
- "S057"
2381
- ],
1698
+ "rules": ["C019", "S057"],
2382
1699
  "severity": "warning"
2383
1700
  },
2384
1701
  "naming": {
2385
1702
  "name": "Naming Conventions",
2386
1703
  "description": "Rules for consistent naming patterns",
2387
- "rules": [
2388
- "C006"
2389
- ],
1704
+ "rules": ["C006"],
2390
1705
  "severity": "warning"
2391
1706
  },
2392
1707
  "design": {
2393
1708
  "name": "Design Principles",
2394
1709
  "description": "Rules for software design best practices",
2395
- "rules": [
2396
- "C006"
2397
- ],
1710
+ "rules": ["C006"],
2398
1711
  "severity": "warning"
2399
1712
  },
2400
1713
  "validation": {
2401
1714
  "name": "Data Validation",
2402
1715
  "description": "Rules for proper data validation practices",
2403
- "rules": [
2404
- "C031",
2405
- "S018",
2406
- "S025",
2407
- "S026"
2408
- ],
1716
+ "rules": ["C031", "S018", "S025", "S026"],
2409
1717
  "severity": "error"
2410
1718
  },
2411
1719
  "architecture": {
2412
1720
  "name": "Architecture Guidelines",
2413
1721
  "description": "Rules for system architecture best practices",
2414
- "rules": [
2415
- "C014",
2416
- "C033"
2417
- ],
1722
+ "rules": ["C014", "C033"],
2418
1723
  "severity": "error"
2419
1724
  }
2420
1725
  },
@@ -2451,41 +1756,30 @@
2451
1756
  },
2452
1757
  "languages": {
2453
1758
  "typescript": {
2454
- "extensions": [
2455
- ".ts",
2456
- ".tsx"
2457
- ],
1759
+ "extensions": [".ts", ".tsx"],
2458
1760
  "analyzer": "ast",
2459
1761
  "parser": "@typescript-eslint/parser"
2460
1762
  },
2461
1763
  "javascript": {
2462
- "extensions": [
2463
- ".js",
2464
- ".jsx"
2465
- ],
1764
+ "extensions": [".js", ".jsx"],
2466
1765
  "analyzer": "ast",
2467
1766
  "parser": "@typescript-eslint/parser"
2468
1767
  },
2469
1768
  "dart": {
2470
- "extensions": [
2471
- ".dart"
2472
- ],
1769
+ "extensions": [".dart"],
2473
1770
  "analyzer": "pattern",
2474
1771
  "parser": "regex"
2475
1772
  },
2476
1773
  "kotlin": {
2477
- "extensions": [
2478
- ".kt",
2479
- ".kts"
2480
- ],
1774
+ "extensions": [".kt", ".kts"],
2481
1775
  "analyzer": "ast",
2482
1776
  "parser": "kotlin-parser"
2483
1777
  }
2484
1778
  },
2485
1779
  "metadata": {
2486
1780
  "version": "1.1.6",
2487
- "lastUpdated": "2025-07-24",
2488
- "totalRules": 44,
1781
+ "lastUpdated": "2025-08-19",
1782
+ "totalRules": 95,
2489
1783
  "qualityRules": 33,
2490
1784
  "securityRules": 47,
2491
1785
  "stableRules": 43,
@@ -2498,6 +1792,7 @@
2498
1792
  "ESLint 9.x integration",
2499
1793
  "React rules integration",
2500
1794
  "Memory leak fixes"
2501
- ]
1795
+ ],
1796
+ "consolidatedFrom": "/Users/bach.ngoc.hoai/Docs/ee/coding-quality/extensions/sunlint/config/rules/rules-registry.json"
2502
1797
  }
2503
- }
1798
+ }