@sun-asterisk/sunlint 1.2.2 → 1.3.1

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