@sun-asterisk/sunlint 1.0.5

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 (192) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/LICENSE +21 -0
  3. package/README.md +490 -0
  4. package/cli-legacy.js +355 -0
  5. package/cli.js +35 -0
  6. package/config/default.json +22 -0
  7. package/config/presets/beginner.json +36 -0
  8. package/config/presets/ci.json +46 -0
  9. package/config/presets/recommended.json +24 -0
  10. package/config/presets/strict.json +32 -0
  11. package/config/rules-registry.json +681 -0
  12. package/config/sunlint-schema.json +166 -0
  13. package/config/typescript/custom-rules-new.js +0 -0
  14. package/config/typescript/custom-rules.js +9 -0
  15. package/config/typescript/eslint.config.js +110 -0
  16. package/config/typescript/package-lock.json +1585 -0
  17. package/config/typescript/package.json +13 -0
  18. package/config/typescript/security-rules/index.js +90 -0
  19. package/config/typescript/security-rules/s005-no-origin-auth.js +95 -0
  20. package/config/typescript/security-rules/s006-activation-recovery-secret-not-plaintext.js +69 -0
  21. package/config/typescript/security-rules/s008-crypto-agility.js +62 -0
  22. package/config/typescript/security-rules/s009-no-insecure-crypto.js +103 -0
  23. package/config/typescript/security-rules/s010-no-insecure-random-in-sensitive-context.js +123 -0
  24. package/config/typescript/security-rules/s011-no-insecure-uuid.js +66 -0
  25. package/config/typescript/security-rules/s012-hardcode-secret.js +71 -0
  26. package/config/typescript/security-rules/s014-insecure-tls-version.js +50 -0
  27. package/config/typescript/security-rules/s015-insecure-tls-certificate.js +43 -0
  28. package/config/typescript/security-rules/s016-sensitive-query-parameter.js +59 -0
  29. package/config/typescript/security-rules/s017-no-sql-injection.js +193 -0
  30. package/config/typescript/security-rules/s018-positive-input-validation.js +56 -0
  31. package/config/typescript/security-rules/s019-no-raw-user-input-in-email.js +113 -0
  32. package/config/typescript/security-rules/s020-no-eval-dynamic-execution.js +89 -0
  33. package/config/typescript/security-rules/s022-output-encoding.js +78 -0
  34. package/config/typescript/security-rules/s023-no-json-injection.js +300 -0
  35. package/config/typescript/security-rules/s025-server-side-input-validation.js +217 -0
  36. package/config/typescript/security-rules/s026-json-schema-validation.js +68 -0
  37. package/config/typescript/security-rules/s027-no-hardcoded-secrets.js +80 -0
  38. package/config/typescript/security-rules/s029-require-csrf-protection.js +79 -0
  39. package/config/typescript/security-rules/s030-no-directory-browsing.js +78 -0
  40. package/config/typescript/security-rules/s033-require-samesite-cookie.js +80 -0
  41. package/config/typescript/security-rules/s034-require-host-cookie-prefix.js +77 -0
  42. package/config/typescript/security-rules/s035-cookie-specific-path.js +74 -0
  43. package/config/typescript/security-rules/s036-no-unsafe-file-include.js +68 -0
  44. package/config/typescript/security-rules/s037-require-anti-cache-headers.js +70 -0
  45. package/config/typescript/security-rules/s038-no-version-disclosure.js +74 -0
  46. package/config/typescript/security-rules/s039-no-session-token-in-url.js +63 -0
  47. package/config/typescript/security-rules/s041-require-session-invalidate-on-logout.js +211 -0
  48. package/config/typescript/security-rules/s042-require-periodic-reauthentication.js +294 -0
  49. package/config/typescript/security-rules/s043-terminate-sessions-on-password-change.js +254 -0
  50. package/config/typescript/security-rules/s044-require-full-session-for-sensitive-operations.js +292 -0
  51. package/config/typescript/security-rules/s045-anti-automation-controls.js +46 -0
  52. package/config/typescript/security-rules/s046-secure-notification-on-auth-change.js +44 -0
  53. package/config/typescript/security-rules/s048-password-credential-recovery.js +54 -0
  54. package/config/typescript/security-rules/s050-session-token-weak-hash.js +94 -0
  55. package/config/typescript/security-rules/s052-secure-random-authentication-code.js +66 -0
  56. package/config/typescript/security-rules/s054-verification-default-account.js +109 -0
  57. package/config/typescript/security-rules/s057-utc-logging.js +54 -0
  58. package/config/typescript/security-rules/s058-no-ssrf.js +73 -0
  59. package/config/typescript/test-s005-working.ts +22 -0
  60. package/config/typescript/tsconfig.json +29 -0
  61. package/core/ai-analyzer.js +169 -0
  62. package/core/analysis-orchestrator.js +705 -0
  63. package/core/cli-action-handler.js +230 -0
  64. package/core/cli-program.js +106 -0
  65. package/core/config-manager.js +396 -0
  66. package/core/config-merger.js +136 -0
  67. package/core/config-override-processor.js +74 -0
  68. package/core/config-preset-resolver.js +65 -0
  69. package/core/config-source-loader.js +152 -0
  70. package/core/config-validator.js +126 -0
  71. package/core/dependency-manager.js +105 -0
  72. package/core/eslint-engine-service.js +312 -0
  73. package/core/eslint-instance-manager.js +104 -0
  74. package/core/eslint-integration-service.js +363 -0
  75. package/core/git-utils.js +170 -0
  76. package/core/multi-rule-runner.js +239 -0
  77. package/core/output-service.js +250 -0
  78. package/core/report-generator.js +320 -0
  79. package/core/rule-mapping-service.js +309 -0
  80. package/core/rule-selection-service.js +121 -0
  81. package/core/sunlint-engine-service.js +23 -0
  82. package/core/typescript-analyzer.js +262 -0
  83. package/core/typescript-engine.js +313 -0
  84. package/docs/AI.md +163 -0
  85. package/docs/ARCHITECTURE.md +78 -0
  86. package/docs/CI-CD-GUIDE.md +315 -0
  87. package/docs/COMMAND-EXAMPLES.md +256 -0
  88. package/docs/DEBUG.md +86 -0
  89. package/docs/DISTRIBUTION.md +153 -0
  90. package/docs/ESLINT-INTEGRATION-STRATEGY.md +392 -0
  91. package/docs/ESLINT_INTEGRATION.md +238 -0
  92. package/docs/FOLDER_STRUCTURE.md +59 -0
  93. package/docs/HEURISTIC_VS_AI.md +113 -0
  94. package/docs/README.md +32 -0
  95. package/docs/RELEASE_GUIDE.md +230 -0
  96. package/docs/RULE-RESPONSIBILITY-MATRIX.md +204 -0
  97. package/eslint-integration/.eslintrc.js +98 -0
  98. package/eslint-integration/cli.js +35 -0
  99. package/eslint-integration/eslint-plugin-custom/c002-no-duplicate-code.js +204 -0
  100. package/eslint-integration/eslint-plugin-custom/c003-no-vague-abbreviations.js +246 -0
  101. package/eslint-integration/eslint-plugin-custom/c006-function-name-verb-noun.js +207 -0
  102. package/eslint-integration/eslint-plugin-custom/c010-limit-block-nesting.js +90 -0
  103. package/eslint-integration/eslint-plugin-custom/c013-no-dead-code.js +43 -0
  104. package/eslint-integration/eslint-plugin-custom/c014-abstract-dependency-preferred.js +38 -0
  105. package/eslint-integration/eslint-plugin-custom/c017-limit-constructor-logic.js +39 -0
  106. package/eslint-integration/eslint-plugin-custom/c018-no-generic-throw.js +335 -0
  107. package/eslint-integration/eslint-plugin-custom/c023-no-duplicate-variable-name-in-scope.js +142 -0
  108. package/eslint-integration/eslint-plugin-custom/c027-limit-function-nesting.js +50 -0
  109. package/eslint-integration/eslint-plugin-custom/c029-catch-block-logging.js +80 -0
  110. package/eslint-integration/eslint-plugin-custom/c030-use-custom-error-classes.js +294 -0
  111. package/eslint-integration/eslint-plugin-custom/c034-no-implicit-return.js +34 -0
  112. package/eslint-integration/eslint-plugin-custom/c035-no-empty-catch.js +32 -0
  113. package/eslint-integration/eslint-plugin-custom/c041-no-config-inline.js +64 -0
  114. package/eslint-integration/eslint-plugin-custom/c042-boolean-name-prefix.js +406 -0
  115. package/eslint-integration/eslint-plugin-custom/c043-no-console-or-print.js +300 -0
  116. package/eslint-integration/eslint-plugin-custom/c047-no-duplicate-retry-logic.js +239 -0
  117. package/eslint-integration/eslint-plugin-custom/c048-no-var-declaration.js +31 -0
  118. package/eslint-integration/eslint-plugin-custom/c076-one-assert-per-test.js +184 -0
  119. package/eslint-integration/eslint-plugin-custom/index.js +155 -0
  120. package/eslint-integration/eslint-plugin-custom/package.json +13 -0
  121. package/eslint-integration/eslint-plugin-custom/package.json.bak +9 -0
  122. package/eslint-integration/eslint-plugin-custom/s003-no-unvalidated-redirect.js +86 -0
  123. package/eslint-integration/eslint-plugin-custom/s005-no-origin-auth.js +95 -0
  124. package/eslint-integration/eslint-plugin-custom/s006-activation-recovery-secret-not-plaintext.js +69 -0
  125. package/eslint-integration/eslint-plugin-custom/s008-crypto-agility.js +62 -0
  126. package/eslint-integration/eslint-plugin-custom/s009-no-insecure-crypto.js +103 -0
  127. package/eslint-integration/eslint-plugin-custom/s010-no-insecure-random-in-sensitive-context.js +123 -0
  128. package/eslint-integration/eslint-plugin-custom/s011-no-insecure-uuid.js +66 -0
  129. package/eslint-integration/eslint-plugin-custom/s012-hardcode-secret.js +71 -0
  130. package/eslint-integration/eslint-plugin-custom/s014-insecure-tls-version.js +50 -0
  131. package/eslint-integration/eslint-plugin-custom/s015-insecure-tls-certificate.js +43 -0
  132. package/eslint-integration/eslint-plugin-custom/s016-sensitive-query-parameter.js +59 -0
  133. package/eslint-integration/eslint-plugin-custom/s017-no-sql-injection.js +193 -0
  134. package/eslint-integration/eslint-plugin-custom/s018-positive-input-validation.js +56 -0
  135. package/eslint-integration/eslint-plugin-custom/s019-no-raw-user-input-in-email.js +113 -0
  136. package/eslint-integration/eslint-plugin-custom/s020-no-eval-dynamic-execution.js +89 -0
  137. package/eslint-integration/eslint-plugin-custom/s022-output-encoding.js +78 -0
  138. package/eslint-integration/eslint-plugin-custom/s023-no-json-injection.js +300 -0
  139. package/eslint-integration/eslint-plugin-custom/s025-server-side-input-validation.js +217 -0
  140. package/eslint-integration/eslint-plugin-custom/s026-json-schema-validation.js +68 -0
  141. package/eslint-integration/eslint-plugin-custom/s027-no-hardcoded-secrets.js +80 -0
  142. package/eslint-integration/eslint-plugin-custom/s029-require-csrf-protection.js +79 -0
  143. package/eslint-integration/eslint-plugin-custom/s030-no-directory-browsing.js +78 -0
  144. package/eslint-integration/eslint-plugin-custom/s033-require-samesite-cookie.js +80 -0
  145. package/eslint-integration/eslint-plugin-custom/s034-require-host-cookie-prefix.js +77 -0
  146. package/eslint-integration/eslint-plugin-custom/s035-cookie-specific-path.js +74 -0
  147. package/eslint-integration/eslint-plugin-custom/s036-no-unsafe-file-include.js +68 -0
  148. package/eslint-integration/eslint-plugin-custom/s037-require-anti-cache-headers.js +70 -0
  149. package/eslint-integration/eslint-plugin-custom/s038-no-version-disclosure.js +74 -0
  150. package/eslint-integration/eslint-plugin-custom/s039-no-session-token-in-url.js +63 -0
  151. package/eslint-integration/eslint-plugin-custom/s041-require-session-invalidate-on-logout.js +211 -0
  152. package/eslint-integration/eslint-plugin-custom/s042-require-periodic-reauthentication.js +294 -0
  153. package/eslint-integration/eslint-plugin-custom/s043-terminate-sessions-on-password-change.js +254 -0
  154. package/eslint-integration/eslint-plugin-custom/s044-require-full-session-for-sensitive-operations.js +292 -0
  155. package/eslint-integration/eslint-plugin-custom/s045-anti-automation-controls.js +46 -0
  156. package/eslint-integration/eslint-plugin-custom/s046-secure-notification-on-auth-change.js +44 -0
  157. package/eslint-integration/eslint-plugin-custom/s047-secure-random-passwords.js +108 -0
  158. package/eslint-integration/eslint-plugin-custom/s048-password-credential-recovery.js +54 -0
  159. package/eslint-integration/eslint-plugin-custom/s050-session-token-weak-hash.js +94 -0
  160. package/eslint-integration/eslint-plugin-custom/s052-secure-random-authentication-code.js +66 -0
  161. package/eslint-integration/eslint-plugin-custom/s054-verification-default-account.js +109 -0
  162. package/eslint-integration/eslint-plugin-custom/s055-verification-rest-check-the-incoming-content-type.js +143 -0
  163. package/eslint-integration/eslint-plugin-custom/s057-utc-logging.js +54 -0
  164. package/eslint-integration/eslint-plugin-custom/s058-no-ssrf.js +73 -0
  165. package/eslint-integration/eslint-plugin-custom/t002-interface-prefix-i.js +42 -0
  166. package/eslint-integration/eslint-plugin-custom/t003-ts-ignore-reason.js +48 -0
  167. package/eslint-integration/eslint-plugin-custom/t004-interface-public-only.js +160 -0
  168. package/eslint-integration/eslint-plugin-custom/t007-no-fn-in-constructor.js +52 -0
  169. package/eslint-integration/eslint-plugin-custom/t011-no-real-time-dependency.js +175 -0
  170. package/eslint-integration/eslint-plugin-custom/t019-no-empty-type.js +95 -0
  171. package/eslint-integration/eslint-plugin-custom/t025-no-nested-union-tuple.js +48 -0
  172. package/eslint-integration/eslint-plugin-custom/t026-limit-nested-generics.js +377 -0
  173. package/eslint-integration/eslint.config.js +125 -0
  174. package/eslint-integration/eslint.config.simple.js +24 -0
  175. package/eslint-integration/node_modules/eslint-plugin-custom/package.json +0 -0
  176. package/eslint-integration/package.json +23 -0
  177. package/eslint-integration/sample.ts +53 -0
  178. package/eslint-integration/test-s003.js +5 -0
  179. package/eslint-integration/tsconfig.json +27 -0
  180. package/examples/.github/workflows/code-quality.yml +111 -0
  181. package/examples/.sunlint.json +42 -0
  182. package/examples/README.md +47 -0
  183. package/examples/package.json +33 -0
  184. package/package.json +100 -0
  185. package/rules/C006_function_naming/analyzer.js +338 -0
  186. package/rules/C006_function_naming/config.json +86 -0
  187. package/rules/C019_log_level_usage/analyzer.js +359 -0
  188. package/rules/C019_log_level_usage/config.json +121 -0
  189. package/rules/C029_catch_block_logging/analyzer.js +339 -0
  190. package/rules/C029_catch_block_logging/config.json +59 -0
  191. package/rules/C031_validation_separation/README.md +72 -0
  192. package/rules/C031_validation_separation/analyzer.js +186 -0
@@ -0,0 +1,681 @@
1
+ {
2
+ "rules": {
3
+ "C019": {
4
+ "name": "Log Level Usage",
5
+ "description": "Không sử dụng log mức error cho lỗi không nghiêm trọng",
6
+ "category": "logging",
7
+ "severity": "warning",
8
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
9
+ "analyzer": "./rules/C019_log_level_usage/analyzer.js",
10
+ "config": "./rules/C019_log_level_usage/config.json",
11
+ "version": "1.0.0",
12
+ "status": "stable",
13
+ "tags": ["logging", "error-handling", "severity"]
14
+ },
15
+ "C006": {
16
+ "name": "Function Naming Convention",
17
+ "description": "Tên hàm phải là động từ/verb-noun pattern",
18
+ "category": "naming",
19
+ "severity": "warning",
20
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
21
+ "analyzer": "./rules/C006_function_naming/analyzer.js",
22
+ "config": "./rules/C006_function_naming/config.json",
23
+ "version": "1.0.0",
24
+ "status": "activated",
25
+ "tags": ["naming", "convention", "readability"]
26
+ },
27
+ "C029": {
28
+ "name": "Catch Block Error Logging",
29
+ "description": "Mọi catch block phải log nguyên nhân lỗi đầy đủ",
30
+ "category": "error-handling",
31
+ "severity": "error",
32
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
33
+ "analyzer": "./rules/C029_catch_block_logging/analyzer.js",
34
+ "config": "./rules/C029_catch_block_logging/config.json",
35
+ "version": "1.0.0",
36
+ "status": "activated",
37
+ "tags": ["error-handling", "logging", "debugging", "monitoring"]
38
+ },
39
+ "C031": {
40
+ "name": "Validation Logic Separation",
41
+ "description": "Logic kiểm tra dữ liệu (validate) phải nằm riêng biệt",
42
+ "category": "validation",
43
+ "severity": "error",
44
+ "languages": ["typescript", "dart", "kotlin", "javascript"],
45
+ "analyzer": "./rules/C031_validation_separation/analyzer.js",
46
+ "config": "./rules/C031_validation_separation/config.json",
47
+ "version": "1.0.0",
48
+ "status": "experimental",
49
+ "tags": ["validation", "separation", "architecture"]
50
+ },
51
+ "S003": {
52
+ "name": "No Unvalidated Redirect",
53
+ "description": "Prevent unvalidated redirects and forwards",
54
+ "category": "security",
55
+ "severity": "error",
56
+ "languages": ["typescript", "javascript"],
57
+ "analyzer": "eslint",
58
+ "eslintRule": "custom/typescript_s003",
59
+ "version": "1.0.0",
60
+ "status": "stable",
61
+ "tags": ["security", "redirect", "validation"]
62
+ },
63
+ "S005": {
64
+ "name": "No Origin Header Authentication",
65
+ "description": "Do not use Origin header for authentication/access control",
66
+ "category": "security",
67
+ "severity": "error",
68
+ "languages": ["typescript", "javascript"],
69
+ "analyzer": "eslint",
70
+ "eslintRule": "custom/typescript_s005",
71
+ "version": "1.0.0",
72
+ "status": "stable",
73
+ "tags": ["security", "authentication", "headers"]
74
+ },
75
+ "S006": {
76
+ "name": "Activation Recovery Secret Not Plaintext",
77
+ "description": "Activation recovery secret must not be in plaintext",
78
+ "category": "security",
79
+ "severity": "error",
80
+ "languages": ["typescript", "javascript"],
81
+ "analyzer": "eslint",
82
+ "eslintRule": "custom/typescript_s006",
83
+ "version": "1.0.0",
84
+ "status": "stable",
85
+ "tags": ["security", "secrets", "encryption"]
86
+ },
87
+ "S008": {
88
+ "name": "Crypto Agility",
89
+ "description": "Ensure cryptographic agility and algorithm flexibility",
90
+ "category": "security",
91
+ "severity": "error",
92
+ "languages": ["typescript", "javascript"],
93
+ "analyzer": "eslint",
94
+ "eslintRule": "custom/typescript_s008",
95
+ "version": "1.0.0",
96
+ "status": "stable",
97
+ "tags": ["security", "cryptography", "agility"]
98
+ },
99
+ "S009": {
100
+ "name": "No Insecure Crypto",
101
+ "description": "Prevent usage of insecure cryptographic methods",
102
+ "category": "security",
103
+ "severity": "error",
104
+ "languages": ["typescript", "javascript"],
105
+ "analyzer": "eslint",
106
+ "eslintRule": "custom/typescript_s009",
107
+ "version": "1.0.0",
108
+ "status": "stable",
109
+ "tags": ["security", "cryptography", "insecure"]
110
+ },
111
+ "S010": {
112
+ "name": "No Insecure Random in Sensitive Context",
113
+ "description": "Prevent insecure random generator usage in sensitive contexts",
114
+ "category": "security",
115
+ "severity": "error",
116
+ "languages": ["typescript", "javascript"],
117
+ "analyzer": "eslint",
118
+ "eslintRule": "custom/typescript_s010",
119
+ "version": "1.0.0",
120
+ "status": "stable",
121
+ "tags": ["security", "random", "sensitive"]
122
+ },
123
+ "S011": {
124
+ "name": "No Insecure UUID",
125
+ "description": "UUID must be version 4 and use CSPRNG",
126
+ "category": "security",
127
+ "severity": "error",
128
+ "languages": ["typescript", "javascript"],
129
+ "analyzer": "eslint",
130
+ "eslintRule": "custom/typescript_s011",
131
+ "version": "1.0.0",
132
+ "status": "stable",
133
+ "tags": ["security", "uuid", "random"]
134
+ },
135
+ "S012": {
136
+ "name": "No Hardcoded Secrets",
137
+ "description": "Prevent hardcoded secrets in source code",
138
+ "category": "security",
139
+ "severity": "error",
140
+ "languages": ["typescript", "javascript"],
141
+ "analyzer": "eslint",
142
+ "eslintRule": "custom/typescript_s012",
143
+ "version": "1.0.0",
144
+ "status": "stable",
145
+ "tags": ["security", "secrets", "hardcoded"]
146
+ },
147
+ "S014": {
148
+ "name": "Insecure TLS Version",
149
+ "description": "Prevent usage of insecure TLS versions",
150
+ "category": "security",
151
+ "severity": "error",
152
+ "languages": ["typescript", "javascript"],
153
+ "analyzer": "eslint",
154
+ "eslintRule": "custom/typescript_s014",
155
+ "version": "1.0.0",
156
+ "status": "stable",
157
+ "tags": ["security", "tls", "encryption"]
158
+ },
159
+ "S015": {
160
+ "name": "Insecure TLS Certificate",
161
+ "description": "Prevent usage of insecure TLS certificate configurations",
162
+ "category": "security",
163
+ "severity": "error",
164
+ "languages": ["typescript", "javascript"],
165
+ "analyzer": "eslint",
166
+ "eslintRule": "custom/typescript_s015",
167
+ "version": "1.0.0",
168
+ "status": "stable",
169
+ "tags": ["security", "tls", "certificates"]
170
+ },
171
+ "S016": {
172
+ "name": "Sensitive Query Parameter",
173
+ "description": "Prevent sensitive data in URL query parameters",
174
+ "category": "security",
175
+ "severity": "error",
176
+ "languages": ["typescript", "javascript"],
177
+ "analyzer": "eslint",
178
+ "eslintRule": "custom/typescript_s016",
179
+ "version": "1.0.0",
180
+ "status": "stable",
181
+ "tags": ["security", "sensitive-data", "url"]
182
+ },
183
+ "S017": {
184
+ "name": "No SQL Injection",
185
+ "description": "Prevent SQL injection vulnerabilities",
186
+ "category": "security",
187
+ "severity": "error",
188
+ "languages": ["typescript", "javascript"],
189
+ "analyzer": "eslint",
190
+ "eslintRule": "custom/typescript_s017",
191
+ "version": "1.0.0",
192
+ "status": "stable",
193
+ "tags": ["security", "sql-injection", "database"]
194
+ },
195
+ "S018": {
196
+ "name": "Positive Input Validation",
197
+ "description": "Ensure positive input validation patterns",
198
+ "category": "security",
199
+ "severity": "error",
200
+ "languages": ["typescript", "javascript"],
201
+ "analyzer": "eslint",
202
+ "eslintRule": "custom/typescript_s018",
203
+ "version": "1.0.0",
204
+ "status": "stable",
205
+ "tags": ["security", "validation", "input"]
206
+ },
207
+ "S019": {
208
+ "name": "No Raw User Input in Email",
209
+ "description": "Prevent raw user input in email content",
210
+ "category": "security",
211
+ "severity": "error",
212
+ "languages": ["typescript", "javascript"],
213
+ "analyzer": "eslint",
214
+ "eslintRule": "custom/typescript_s019",
215
+ "version": "1.0.0",
216
+ "status": "stable",
217
+ "tags": ["security", "email", "injection"]
218
+ },
219
+ "S020": {
220
+ "name": "No Eval Dynamic Execution",
221
+ "description": "Prevent eval and dynamic code execution",
222
+ "category": "security",
223
+ "severity": "error",
224
+ "languages": ["typescript", "javascript"],
225
+ "analyzer": "eslint",
226
+ "eslintRule": "custom/typescript_s020",
227
+ "version": "1.0.0",
228
+ "status": "stable",
229
+ "tags": ["security", "eval", "dynamic-execution"]
230
+ },
231
+ "S022": {
232
+ "name": "Output Encoding Required",
233
+ "description": "Require output encoding for user input",
234
+ "category": "security",
235
+ "severity": "error",
236
+ "languages": ["typescript", "javascript"],
237
+ "analyzer": "eslint",
238
+ "eslintRule": "custom/typescript_s022",
239
+ "version": "1.0.0",
240
+ "status": "stable",
241
+ "tags": ["security", "encoding", "xss"]
242
+ },
243
+ "S023": {
244
+ "name": "No JSON Injection",
245
+ "description": "Prevent JSON injection vulnerabilities",
246
+ "category": "security",
247
+ "severity": "error",
248
+ "languages": ["typescript", "javascript"],
249
+ "analyzer": "eslint",
250
+ "eslintRule": "custom/typescript_s023",
251
+ "version": "1.0.0",
252
+ "status": "stable",
253
+ "tags": ["security", "json", "injection"]
254
+ },
255
+ "S025": {
256
+ "name": "Server Side Input Validation",
257
+ "description": "Require server-side input validation",
258
+ "category": "security",
259
+ "severity": "error",
260
+ "languages": ["typescript", "javascript"],
261
+ "analyzer": "eslint",
262
+ "eslintRule": "custom/typescript_s025",
263
+ "version": "1.0.0",
264
+ "status": "stable",
265
+ "tags": ["security", "validation", "server-side"]
266
+ },
267
+ "S026": {
268
+ "name": "JSON Schema Validation",
269
+ "description": "Require JSON schema validation",
270
+ "category": "security",
271
+ "severity": "warning",
272
+ "languages": ["typescript", "javascript"],
273
+ "analyzer": "eslint",
274
+ "eslintRule": "custom/typescript_s026",
275
+ "version": "1.0.0",
276
+ "status": "stable",
277
+ "tags": ["security", "validation", "json-schema"]
278
+ },
279
+ "S027": {
280
+ "name": "No Hardcoded Secrets Advanced",
281
+ "description": "Advanced detection of hardcoded secrets",
282
+ "category": "security",
283
+ "severity": "error",
284
+ "languages": ["typescript", "javascript"],
285
+ "analyzer": "eslint",
286
+ "eslintRule": "custom/typescript_s027",
287
+ "version": "1.0.0",
288
+ "status": "stable",
289
+ "tags": ["security", "secrets", "hardcoded"]
290
+ },
291
+ "S029": {
292
+ "name": "Require CSRF Protection",
293
+ "description": "Require CSRF protection for state-changing operations",
294
+ "category": "security",
295
+ "severity": "error",
296
+ "languages": ["typescript", "javascript"],
297
+ "analyzer": "eslint",
298
+ "eslintRule": "custom/typescript_s029",
299
+ "version": "1.0.0",
300
+ "status": "stable",
301
+ "tags": ["security", "csrf", "protection"]
302
+ },
303
+ "S030": {
304
+ "name": "No Directory Browsing",
305
+ "description": "Prevent directory browsing vulnerabilities",
306
+ "category": "security",
307
+ "severity": "error",
308
+ "languages": ["typescript", "javascript"],
309
+ "analyzer": "eslint",
310
+ "eslintRule": "custom/typescript_s030",
311
+ "version": "1.0.0",
312
+ "status": "stable",
313
+ "tags": ["security", "directory-browsing", "information-disclosure"]
314
+ },
315
+ "S033": {
316
+ "name": "Require SameSite Cookie",
317
+ "description": "Require SameSite attribute for cookies",
318
+ "category": "security",
319
+ "severity": "error",
320
+ "languages": ["typescript", "javascript"],
321
+ "analyzer": "eslint",
322
+ "eslintRule": "custom/typescript_s033",
323
+ "version": "1.0.0",
324
+ "status": "stable",
325
+ "tags": ["security", "cookies", "samesite"]
326
+ },
327
+ "S034": {
328
+ "name": "Require Host Cookie Prefix",
329
+ "description": "Require __Host- prefix for secure cookies",
330
+ "category": "security",
331
+ "severity": "error",
332
+ "languages": ["typescript", "javascript"],
333
+ "analyzer": "eslint",
334
+ "eslintRule": "custom/typescript_s034",
335
+ "version": "1.0.0",
336
+ "status": "stable",
337
+ "tags": ["security", "cookies", "host-prefix"]
338
+ },
339
+ "S035": {
340
+ "name": "Cookie Specific Path",
341
+ "description": "Require specific path for sensitive cookies",
342
+ "category": "security",
343
+ "severity": "error",
344
+ "languages": ["typescript", "javascript"],
345
+ "analyzer": "eslint",
346
+ "eslintRule": "custom/typescript_s035",
347
+ "version": "1.0.0",
348
+ "status": "stable",
349
+ "tags": ["security", "cookies", "path"]
350
+ },
351
+ "S036": {
352
+ "name": "No Unsafe File Include",
353
+ "description": "Prevent unsafe file inclusion vulnerabilities",
354
+ "category": "security",
355
+ "severity": "error",
356
+ "languages": ["typescript", "javascript"],
357
+ "analyzer": "eslint",
358
+ "eslintRule": "custom/typescript_s036",
359
+ "version": "1.0.0",
360
+ "status": "stable",
361
+ "tags": ["security", "file-inclusion", "path-traversal"]
362
+ },
363
+ "S037": {
364
+ "name": "Require Anti Cache Headers",
365
+ "description": "Require anti-cache headers for sensitive content",
366
+ "category": "security",
367
+ "severity": "warning",
368
+ "languages": ["typescript", "javascript"],
369
+ "analyzer": "eslint",
370
+ "eslintRule": "custom/typescript_s037",
371
+ "version": "1.0.0",
372
+ "status": "stable",
373
+ "tags": ["security", "caching", "headers"]
374
+ },
375
+ "S038": {
376
+ "name": "No Version Disclosure",
377
+ "description": "Prevent version information disclosure",
378
+ "category": "security",
379
+ "severity": "warning",
380
+ "languages": ["typescript", "javascript"],
381
+ "analyzer": "eslint",
382
+ "eslintRule": "custom/typescript_s038",
383
+ "version": "1.0.0",
384
+ "status": "stable",
385
+ "tags": ["security", "information-disclosure", "version"]
386
+ },
387
+ "S039": {
388
+ "name": "No Session Token in URL",
389
+ "description": "Prevent session tokens in URL parameters",
390
+ "category": "security",
391
+ "severity": "error",
392
+ "languages": ["typescript", "javascript"],
393
+ "analyzer": "eslint",
394
+ "eslintRule": "custom/typescript_s039",
395
+ "version": "1.0.0",
396
+ "status": "stable",
397
+ "tags": ["security", "session", "url"]
398
+ },
399
+ "S041": {
400
+ "name": "Require Session Invalidate on Logout",
401
+ "description": "Require session invalidation on logout",
402
+ "category": "security",
403
+ "severity": "error",
404
+ "languages": ["typescript", "javascript"],
405
+ "analyzer": "eslint",
406
+ "eslintRule": "custom/typescript_s041",
407
+ "version": "1.0.0",
408
+ "status": "stable",
409
+ "tags": ["security", "session", "logout"]
410
+ },
411
+ "S042": {
412
+ "name": "Require Periodic Reauthentication",
413
+ "description": "Require periodic re-authentication for sensitive operations",
414
+ "category": "security",
415
+ "severity": "error",
416
+ "languages": ["typescript", "javascript"],
417
+ "analyzer": "eslint",
418
+ "eslintRule": "custom/typescript_s042",
419
+ "version": "1.0.0",
420
+ "status": "stable",
421
+ "tags": ["security", "authentication", "periodic"]
422
+ },
423
+ "S043": {
424
+ "name": "Terminate Sessions on Password Change",
425
+ "description": "Terminate all sessions when password changes",
426
+ "category": "security",
427
+ "severity": "error",
428
+ "languages": ["typescript", "javascript"],
429
+ "analyzer": "eslint",
430
+ "eslintRule": "custom/typescript_s043",
431
+ "version": "1.0.0",
432
+ "status": "stable",
433
+ "tags": ["security", "session", "password"]
434
+ },
435
+ "S044": {
436
+ "name": "Require Full Session for Sensitive Operations",
437
+ "description": "Require full session validation for sensitive operations",
438
+ "category": "security",
439
+ "severity": "error",
440
+ "languages": ["typescript", "javascript"],
441
+ "analyzer": "eslint",
442
+ "eslintRule": "custom/typescript_s044",
443
+ "version": "1.0.0",
444
+ "status": "stable",
445
+ "tags": ["security", "session", "validation"]
446
+ },
447
+ "S045": {
448
+ "name": "Anti Automation Controls",
449
+ "description": "Implement anti-automation controls",
450
+ "category": "security",
451
+ "severity": "warning",
452
+ "languages": ["typescript", "javascript"],
453
+ "analyzer": "eslint",
454
+ "eslintRule": "custom/typescript_s045",
455
+ "version": "1.0.0",
456
+ "status": "stable",
457
+ "tags": ["security", "automation", "protection"]
458
+ },
459
+ "S046": {
460
+ "name": "Secure Notification on Auth Change",
461
+ "description": "Require secure notification on authentication changes",
462
+ "category": "security",
463
+ "severity": "warning",
464
+ "languages": ["typescript", "javascript"],
465
+ "analyzer": "eslint",
466
+ "eslintRule": "custom/typescript_s046",
467
+ "version": "1.0.0",
468
+ "status": "stable",
469
+ "tags": ["security", "notification", "authentication"]
470
+ },
471
+ "S047": {
472
+ "name": "Secure Random Password Generation",
473
+ "description": "Require secure and random initial password generation",
474
+ "category": "security",
475
+ "severity": "error",
476
+ "languages": ["typescript", "javascript"],
477
+ "analyzer": "eslint",
478
+ "eslintRule": "custom/typescript_s047",
479
+ "version": "1.0.0",
480
+ "status": "stable",
481
+ "tags": ["security", "password", "random"]
482
+ },
483
+ "S048": {
484
+ "name": "Password Credential Recovery",
485
+ "description": "Secure password credential recovery process",
486
+ "category": "security",
487
+ "severity": "error",
488
+ "languages": ["typescript", "javascript"],
489
+ "analyzer": "eslint",
490
+ "eslintRule": "custom/typescript_s048",
491
+ "version": "1.0.0",
492
+ "status": "stable",
493
+ "tags": ["security", "password", "recovery"]
494
+ },
495
+ "S050": {
496
+ "name": "Session Token Weak Hash",
497
+ "description": "Prevent weak hashing for session tokens",
498
+ "category": "security",
499
+ "severity": "error",
500
+ "languages": ["typescript", "javascript"],
501
+ "analyzer": "eslint",
502
+ "eslintRule": "custom/typescript_s050",
503
+ "version": "1.0.0",
504
+ "status": "stable",
505
+ "tags": ["security", "session", "hashing"]
506
+ },
507
+ "S052": {
508
+ "name": "Secure Random Authentication Code",
509
+ "description": "Require secure random number generation for authentication codes",
510
+ "category": "security",
511
+ "severity": "error",
512
+ "languages": ["typescript", "javascript"],
513
+ "analyzer": "eslint",
514
+ "eslintRule": "custom/typescript_s052",
515
+ "version": "1.0.0",
516
+ "status": "stable",
517
+ "tags": ["security", "random", "authentication"]
518
+ },
519
+ "S054": {
520
+ "name": "Verification Default Account",
521
+ "description": "Verify and secure default accounts",
522
+ "category": "security",
523
+ "severity": "error",
524
+ "languages": ["typescript", "javascript"],
525
+ "analyzer": "eslint",
526
+ "eslintRule": "custom/typescript_s054",
527
+ "version": "1.0.0",
528
+ "status": "stable",
529
+ "tags": ["security", "accounts", "default"]
530
+ },
531
+ "S055": {
532
+ "name": "REST Content-Type Verification",
533
+ "description": "Verify incoming Content-Type in REST API endpoints",
534
+ "category": "security",
535
+ "severity": "error",
536
+ "languages": ["typescript", "javascript"],
537
+ "analyzer": "eslint",
538
+ "eslintRule": "custom/typescript_s055",
539
+ "version": "1.0.0",
540
+ "status": "stable",
541
+ "tags": ["security", "rest", "content-type"]
542
+ },
543
+ "S057": {
544
+ "name": "UTC Logging",
545
+ "description": "Enforce UTC usage in time formatting and logging",
546
+ "category": "security",
547
+ "severity": "warning",
548
+ "languages": ["typescript", "javascript"],
549
+ "analyzer": "eslint",
550
+ "eslintRule": "custom/typescript_s057",
551
+ "version": "1.0.0",
552
+ "status": "stable",
553
+ "tags": ["security", "logging", "timezone"]
554
+ },
555
+ "S058": {
556
+ "name": "No SSRF",
557
+ "description": "Detect SSRF vulnerabilities via unvalidated user-controlled URLs",
558
+ "category": "security",
559
+ "severity": "error",
560
+ "languages": ["typescript", "javascript"],
561
+ "analyzer": "eslint",
562
+ "eslintRule": "custom/typescript_s058",
563
+ "version": "1.0.0",
564
+ "status": "stable",
565
+ "tags": ["security", "ssrf", "url-validation"]
566
+ }
567
+ },
568
+ "categories": {
569
+ "quality": {
570
+ "name": "Code Quality",
571
+ "description": "Rules for code quality improvement",
572
+ "rules": ["C002", "C003", "C006", "C010", "C013", "C014", "C017", "C018", "C019", "C023", "C027", "C029", "C030", "C031", "C034", "C035", "C041", "C042", "C043", "C047", "C048", "C076", "T002", "T003", "T004", "T007", "T011", "T019", "T025", "T026"],
573
+ "severity": "warning"
574
+ },
575
+ "security": {
576
+ "name": "Security",
577
+ "description": "Rules for security best practices",
578
+ "rules": ["S003", "S005", "S006", "S008", "S009", "S010", "S011", "S012", "S014", "S015", "S016", "S017", "S018", "S019", "S020", "S022", "S023", "S025", "S026", "S027", "S029", "S030", "S033", "S034", "S035", "S036", "S037", "S038", "S039", "S041", "S042", "S043", "S044", "S045", "S046", "S047", "S048", "S050", "S052", "S054", "S055", "S057", "S058"],
579
+ "severity": "error"
580
+ },
581
+ "logging": {
582
+ "name": "Logging Standards",
583
+ "description": "Rules related to logging practices",
584
+ "rules": ["C019", "S057"],
585
+ "severity": "warning"
586
+ },
587
+ "naming": {
588
+ "name": "Naming Conventions",
589
+ "description": "Rules for consistent naming patterns",
590
+ "rules": ["C006"],
591
+ "severity": "warning"
592
+ },
593
+ "design": {
594
+ "name": "Design Principles",
595
+ "description": "Rules for software design best practices",
596
+ "rules": ["C006"],
597
+ "severity": "warning"
598
+ },
599
+ "validation": {
600
+ "name": "Data Validation",
601
+ "description": "Rules for proper data validation practices",
602
+ "rules": ["C031", "S018", "S025", "S026"],
603
+ "severity": "error"
604
+ },
605
+ "architecture": {
606
+ "name": "Architecture Guidelines",
607
+ "description": "Rules for system architecture best practices",
608
+ "rules": ["C014", "C033"],
609
+ "severity": "error"
610
+ }
611
+ },
612
+ "presets": {
613
+ "recommended": {
614
+ "name": "Recommended Rules",
615
+ "description": "Essential rules for code quality",
616
+ "rules": {
617
+ "C019": "warning",
618
+ "C006": "warning",
619
+ "C029": "error",
620
+ "C031": "error"
621
+ }
622
+ },
623
+ "strict": {
624
+ "name": "Strict Rules",
625
+ "description": "All rules with maximum enforcement",
626
+ "rules": {
627
+ "C019": "error",
628
+ "C006": "error",
629
+ "C029": "error",
630
+ "C031": "error"
631
+ }
632
+ },
633
+ "beginner": {
634
+ "name": "Beginner Friendly",
635
+ "description": "Basic rules for learning",
636
+ "rules": {
637
+ "C019": "info",
638
+ "C006": "warning",
639
+ "C029": "warning"
640
+ }
641
+ }
642
+ },
643
+ "languages": {
644
+ "typescript": {
645
+ "extensions": [".ts", ".tsx"],
646
+ "analyzer": "ast",
647
+ "parser": "@typescript-eslint/parser"
648
+ },
649
+ "javascript": {
650
+ "extensions": [".js", ".jsx"],
651
+ "analyzer": "ast",
652
+ "parser": "@typescript-eslint/parser"
653
+ },
654
+ "dart": {
655
+ "extensions": [".dart"],
656
+ "analyzer": "pattern",
657
+ "parser": "regex"
658
+ },
659
+ "kotlin": {
660
+ "extensions": [".kt", ".kts"],
661
+ "analyzer": "ast",
662
+ "parser": "kotlin-parser"
663
+ }
664
+ },
665
+ "metadata": {
666
+ "version": "1.0.4",
667
+ "lastUpdated": "2025-07-08",
668
+ "totalRules": 44,
669
+ "qualityRules": 4,
670
+ "securityRules": 40,
671
+ "stableRules": 43,
672
+ "experimentalRules": 1,
673
+ "supportedLanguages": 4,
674
+ "features": [
675
+ "Security rules integration",
676
+ "Category-based rule filtering",
677
+ "Dynamic rule configuration",
678
+ "ESLint integration enhancement"
679
+ ]
680
+ }
681
+ }