eslint-plugin-secure-coding 2.3.3 → 2.4.0

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 (337) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +2 -2
  3. package/package.json +1 -1
  4. package/src/index.d.ts +32 -0
  5. package/src/index.js +416 -0
  6. package/src/rules/detect-child-process/index.d.ts +11 -0
  7. package/src/rules/detect-child-process/index.js +529 -0
  8. package/src/rules/detect-eval-with-expression/index.d.ts +9 -0
  9. package/src/rules/detect-eval-with-expression/index.js +392 -0
  10. package/src/rules/detect-mixed-content/index.d.ts +8 -0
  11. package/src/rules/detect-mixed-content/index.js +44 -0
  12. package/src/rules/detect-non-literal-fs-filename/index.d.ts +7 -0
  13. package/src/rules/detect-non-literal-fs-filename/index.js +454 -0
  14. package/src/rules/detect-non-literal-regexp/index.d.ts +9 -0
  15. package/src/rules/detect-non-literal-regexp/index.js +403 -0
  16. package/src/rules/detect-object-injection/index.d.ts +11 -0
  17. package/src/rules/detect-object-injection/index.js +560 -0
  18. package/src/rules/detect-suspicious-dependencies/index.d.ts +8 -0
  19. package/src/rules/detect-suspicious-dependencies/index.js +71 -0
  20. package/src/rules/detect-weak-password-validation/index.d.ts +6 -0
  21. package/src/rules/detect-weak-password-validation/index.js +58 -0
  22. package/src/rules/no-allow-arbitrary-loads/index.d.ts +8 -0
  23. package/src/rules/no-allow-arbitrary-loads/index.js +47 -0
  24. package/src/rules/no-arbitrary-file-access/index.d.ts +13 -0
  25. package/src/rules/no-arbitrary-file-access/index.js +195 -0
  26. package/src/rules/no-buffer-overread/index.d.ts +29 -0
  27. package/src/rules/no-buffer-overread/index.js +606 -0
  28. package/src/rules/no-clickjacking/index.d.ts +10 -0
  29. package/src/rules/no-clickjacking/index.js +396 -0
  30. package/src/rules/no-client-side-auth-logic/index.d.ts +6 -0
  31. package/src/rules/no-client-side-auth-logic/index.js +69 -0
  32. package/src/rules/no-credentials-in-query-params/index.d.ts +8 -0
  33. package/src/rules/no-credentials-in-query-params/index.js +57 -0
  34. package/src/rules/no-data-in-temp-storage/index.d.ts +6 -0
  35. package/src/rules/no-data-in-temp-storage/index.js +64 -0
  36. package/src/rules/no-debug-code-in-production/index.d.ts +8 -0
  37. package/src/rules/no-debug-code-in-production/index.js +51 -0
  38. package/src/rules/no-directive-injection/index.d.ts +12 -0
  39. package/src/rules/no-directive-injection/index.js +457 -0
  40. package/src/rules/no-disabled-certificate-validation/index.d.ts +6 -0
  41. package/src/rules/no-disabled-certificate-validation/index.js +61 -0
  42. package/src/rules/no-dynamic-dependency-loading/index.d.ts +8 -0
  43. package/src/rules/no-dynamic-dependency-loading/index.js +51 -0
  44. package/src/rules/no-electron-security-issues/index.d.ts +10 -0
  45. package/src/rules/no-electron-security-issues/index.js +423 -0
  46. package/src/rules/no-exposed-debug-endpoints/index.d.ts +6 -0
  47. package/src/rules/no-exposed-debug-endpoints/index.js +62 -0
  48. package/src/rules/no-exposed-sensitive-data/index.d.ts +11 -0
  49. package/src/rules/no-exposed-sensitive-data/index.js +340 -0
  50. package/src/rules/no-format-string-injection/index.d.ts +17 -0
  51. package/src/rules/no-format-string-injection/index.js +660 -0
  52. package/src/rules/no-graphql-injection/index.d.ts +12 -0
  53. package/src/rules/no-graphql-injection/index.js +411 -0
  54. package/src/rules/no-hardcoded-credentials/index.d.ts +26 -0
  55. package/src/rules/no-hardcoded-credentials/index.js +376 -0
  56. package/src/rules/no-hardcoded-session-tokens/index.d.ts +6 -0
  57. package/src/rules/no-hardcoded-session-tokens/index.js +59 -0
  58. package/src/rules/no-http-urls/index.d.ts +12 -0
  59. package/src/rules/no-http-urls/index.js +114 -0
  60. package/src/rules/no-improper-sanitization/index.d.ts +12 -0
  61. package/src/rules/no-improper-sanitization/index.js +411 -0
  62. package/src/rules/no-improper-type-validation/index.d.ts +10 -0
  63. package/src/rules/no-improper-type-validation/index.js +475 -0
  64. package/src/rules/no-insecure-comparison/index.d.ts +7 -0
  65. package/src/rules/no-insecure-comparison/index.js +193 -0
  66. package/src/rules/no-insecure-redirects/index.d.ts +7 -0
  67. package/src/rules/no-insecure-redirects/index.js +216 -0
  68. package/src/rules/no-insecure-websocket/index.d.ts +6 -0
  69. package/src/rules/no-insecure-websocket/index.js +61 -0
  70. package/src/rules/no-ldap-injection/index.d.ts +10 -0
  71. package/src/rules/no-ldap-injection/index.js +455 -0
  72. package/src/rules/no-missing-authentication/index.d.ts +13 -0
  73. package/src/rules/no-missing-authentication/index.js +333 -0
  74. package/src/rules/no-missing-cors-check/index.d.ts +9 -0
  75. package/src/rules/no-missing-cors-check/index.js +399 -0
  76. package/src/rules/no-missing-csrf-protection/index.d.ts +11 -0
  77. package/src/rules/no-missing-csrf-protection/index.js +180 -0
  78. package/src/rules/no-missing-security-headers/index.d.ts +7 -0
  79. package/src/rules/no-missing-security-headers/index.js +218 -0
  80. package/src/rules/no-password-in-url/index.d.ts +8 -0
  81. package/src/rules/no-password-in-url/index.js +54 -0
  82. package/src/rules/no-permissive-cors/index.d.ts +8 -0
  83. package/src/rules/no-permissive-cors/index.js +65 -0
  84. package/src/rules/no-pii-in-logs/index.d.ts +8 -0
  85. package/src/rules/no-pii-in-logs/index.js +70 -0
  86. package/src/rules/no-privilege-escalation/index.d.ts +13 -0
  87. package/src/rules/no-privilege-escalation/index.js +321 -0
  88. package/src/rules/no-redos-vulnerable-regex/index.d.ts +7 -0
  89. package/src/rules/no-redos-vulnerable-regex/index.js +306 -0
  90. package/src/rules/no-sensitive-data-exposure/index.d.ts +11 -0
  91. package/src/rules/no-sensitive-data-exposure/index.js +250 -0
  92. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +8 -0
  93. package/src/rules/no-sensitive-data-in-analytics/index.js +62 -0
  94. package/src/rules/no-sensitive-data-in-cache/index.d.ts +8 -0
  95. package/src/rules/no-sensitive-data-in-cache/index.js +52 -0
  96. package/src/rules/no-toctou-vulnerability/index.d.ts +7 -0
  97. package/src/rules/no-toctou-vulnerability/index.js +208 -0
  98. package/src/rules/no-tracking-without-consent/index.d.ts +6 -0
  99. package/src/rules/no-tracking-without-consent/index.js +67 -0
  100. package/src/rules/no-unchecked-loop-condition/index.d.ts +12 -0
  101. package/src/rules/no-unchecked-loop-condition/index.js +646 -0
  102. package/src/rules/no-unencrypted-transmission/index.d.ts +11 -0
  103. package/src/rules/no-unencrypted-transmission/index.js +236 -0
  104. package/src/rules/no-unescaped-url-parameter/index.d.ts +9 -0
  105. package/src/rules/no-unescaped-url-parameter/index.js +355 -0
  106. package/src/rules/no-unlimited-resource-allocation/index.d.ts +12 -0
  107. package/src/rules/no-unlimited-resource-allocation/index.js +643 -0
  108. package/src/rules/no-unsafe-deserialization/index.d.ts +10 -0
  109. package/src/rules/no-unsafe-deserialization/index.js +491 -0
  110. package/src/rules/no-unsafe-dynamic-require/index.d.ts +5 -0
  111. package/src/rules/no-unsafe-dynamic-require/index.js +106 -0
  112. package/src/rules/no-unsafe-regex-construction/index.d.ts +9 -0
  113. package/src/rules/no-unsafe-regex-construction/index.js +291 -0
  114. package/src/rules/no-unvalidated-deeplinks/index.d.ts +6 -0
  115. package/src/rules/no-unvalidated-deeplinks/index.js +62 -0
  116. package/src/rules/no-unvalidated-user-input/index.d.ts +9 -0
  117. package/src/rules/no-unvalidated-user-input/index.js +420 -0
  118. package/src/rules/no-verbose-error-messages/index.d.ts +8 -0
  119. package/src/rules/no-verbose-error-messages/index.js +68 -0
  120. package/src/rules/no-weak-password-recovery/index.d.ts +12 -0
  121. package/src/rules/no-weak-password-recovery/index.js +424 -0
  122. package/src/rules/no-xpath-injection/index.d.ts +10 -0
  123. package/src/rules/no-xpath-injection/index.js +487 -0
  124. package/src/rules/no-xxe-injection/index.d.ts +7 -0
  125. package/src/rules/no-xxe-injection/index.js +266 -0
  126. package/src/rules/no-zip-slip/index.d.ts +9 -0
  127. package/src/rules/no-zip-slip/index.js +445 -0
  128. package/src/rules/require-backend-authorization/index.d.ts +6 -0
  129. package/src/rules/require-backend-authorization/index.js +60 -0
  130. package/src/rules/require-code-minification/index.d.ts +8 -0
  131. package/src/rules/require-code-minification/index.js +47 -0
  132. package/src/rules/require-csp-headers/index.d.ts +6 -0
  133. package/src/rules/require-csp-headers/index.js +64 -0
  134. package/src/rules/require-data-minimization/index.d.ts +8 -0
  135. package/src/rules/require-data-minimization/index.js +53 -0
  136. package/src/rules/require-dependency-integrity/index.d.ts +6 -0
  137. package/src/rules/require-dependency-integrity/index.js +64 -0
  138. package/src/rules/require-https-only/index.d.ts +8 -0
  139. package/src/rules/require-https-only/index.js +62 -0
  140. package/src/rules/require-mime-type-validation/index.d.ts +6 -0
  141. package/src/rules/require-mime-type-validation/index.js +66 -0
  142. package/src/rules/require-network-timeout/index.d.ts +8 -0
  143. package/src/rules/require-network-timeout/index.js +50 -0
  144. package/src/rules/require-package-lock/index.d.ts +8 -0
  145. package/src/rules/require-package-lock/index.js +63 -0
  146. package/src/rules/require-secure-credential-storage/index.d.ts +8 -0
  147. package/src/rules/require-secure-credential-storage/index.js +50 -0
  148. package/src/rules/require-secure-defaults/index.d.ts +8 -0
  149. package/src/rules/require-secure-defaults/index.js +47 -0
  150. package/src/rules/require-secure-deletion/index.d.ts +8 -0
  151. package/src/rules/require-secure-deletion/index.js +44 -0
  152. package/src/rules/require-storage-encryption/index.d.ts +8 -0
  153. package/src/rules/require-storage-encryption/index.js +50 -0
  154. package/src/rules/require-url-validation/index.d.ts +6 -0
  155. package/src/rules/require-url-validation/index.js +72 -0
  156. package/src/types/index.d.ts +106 -0
  157. package/src/types/index.js +16 -0
  158. package/src/index.ts +0 -605
  159. package/src/rules/__tests__/integration-demo.test.ts +0 -290
  160. package/src/rules/__tests__/integration-llm.test.ts +0 -89
  161. package/src/rules/database-injection/database-injection.test.ts +0 -456
  162. package/src/rules/database-injection/index.ts +0 -488
  163. package/src/rules/detect-child-process/detect-child-process.test.ts +0 -207
  164. package/src/rules/detect-child-process/index.ts +0 -634
  165. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +0 -416
  166. package/src/rules/detect-eval-with-expression/index.ts +0 -463
  167. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +0 -28
  168. package/src/rules/detect-mixed-content/index.ts +0 -52
  169. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +0 -269
  170. package/src/rules/detect-non-literal-fs-filename/index.ts +0 -551
  171. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +0 -189
  172. package/src/rules/detect-non-literal-regexp/index.ts +0 -490
  173. package/src/rules/detect-object-injection/detect-object-injection.test.ts +0 -440
  174. package/src/rules/detect-object-injection/index.ts +0 -674
  175. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +0 -32
  176. package/src/rules/detect-suspicious-dependencies/index.ts +0 -84
  177. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +0 -31
  178. package/src/rules/detect-weak-password-validation/index.ts +0 -68
  179. package/src/rules/no-allow-arbitrary-loads/index.ts +0 -54
  180. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +0 -28
  181. package/src/rules/no-arbitrary-file-access/index.ts +0 -238
  182. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +0 -119
  183. package/src/rules/no-buffer-overread/index.ts +0 -724
  184. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +0 -313
  185. package/src/rules/no-clickjacking/index.ts +0 -481
  186. package/src/rules/no-clickjacking/no-clickjacking.test.ts +0 -253
  187. package/src/rules/no-client-side-auth-logic/index.ts +0 -81
  188. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +0 -33
  189. package/src/rules/no-credentials-in-query-params/index.ts +0 -69
  190. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +0 -33
  191. package/src/rules/no-credentials-in-storage-api/index.ts +0 -64
  192. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +0 -31
  193. package/src/rules/no-data-in-temp-storage/index.ts +0 -75
  194. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +0 -33
  195. package/src/rules/no-debug-code-in-production/index.ts +0 -59
  196. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +0 -26
  197. package/src/rules/no-directive-injection/index.ts +0 -551
  198. package/src/rules/no-directive-injection/no-directive-injection.test.ts +0 -305
  199. package/src/rules/no-disabled-certificate-validation/index.ts +0 -72
  200. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +0 -33
  201. package/src/rules/no-document-cookie/index.ts +0 -113
  202. package/src/rules/no-document-cookie/no-document-cookie.test.ts +0 -382
  203. package/src/rules/no-dynamic-dependency-loading/index.ts +0 -60
  204. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +0 -27
  205. package/src/rules/no-electron-security-issues/index.ts +0 -504
  206. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +0 -324
  207. package/src/rules/no-exposed-debug-endpoints/index.ts +0 -73
  208. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +0 -40
  209. package/src/rules/no-exposed-sensitive-data/index.ts +0 -428
  210. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +0 -75
  211. package/src/rules/no-format-string-injection/index.ts +0 -801
  212. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +0 -437
  213. package/src/rules/no-graphql-injection/index.ts +0 -508
  214. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +0 -371
  215. package/src/rules/no-hardcoded-credentials/index.ts +0 -478
  216. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +0 -639
  217. package/src/rules/no-hardcoded-session-tokens/index.ts +0 -69
  218. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +0 -42
  219. package/src/rules/no-http-urls/index.ts +0 -131
  220. package/src/rules/no-http-urls/no-http-urls.test.ts +0 -60
  221. package/src/rules/no-improper-sanitization/index.ts +0 -502
  222. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +0 -156
  223. package/src/rules/no-improper-type-validation/index.ts +0 -572
  224. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +0 -372
  225. package/src/rules/no-insecure-comparison/index.ts +0 -232
  226. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +0 -218
  227. package/src/rules/no-insecure-cookie-settings/index.ts +0 -391
  228. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +0 -409
  229. package/src/rules/no-insecure-jwt/index.ts +0 -467
  230. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +0 -259
  231. package/src/rules/no-insecure-redirects/index.ts +0 -267
  232. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +0 -108
  233. package/src/rules/no-insecure-websocket/index.ts +0 -72
  234. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +0 -42
  235. package/src/rules/no-insufficient-postmessage-validation/index.ts +0 -497
  236. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +0 -360
  237. package/src/rules/no-insufficient-random/index.ts +0 -288
  238. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +0 -246
  239. package/src/rules/no-ldap-injection/index.ts +0 -547
  240. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +0 -317
  241. package/src/rules/no-missing-authentication/index.ts +0 -408
  242. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +0 -350
  243. package/src/rules/no-missing-cors-check/index.ts +0 -453
  244. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +0 -392
  245. package/src/rules/no-missing-csrf-protection/index.ts +0 -229
  246. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +0 -222
  247. package/src/rules/no-missing-security-headers/index.ts +0 -266
  248. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +0 -98
  249. package/src/rules/no-password-in-url/index.ts +0 -64
  250. package/src/rules/no-password-in-url/no-password-in-url.test.ts +0 -27
  251. package/src/rules/no-permissive-cors/index.ts +0 -78
  252. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +0 -28
  253. package/src/rules/no-pii-in-logs/index.ts +0 -83
  254. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +0 -26
  255. package/src/rules/no-postmessage-origin-wildcard/index.ts +0 -67
  256. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +0 -27
  257. package/src/rules/no-privilege-escalation/index.ts +0 -403
  258. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +0 -306
  259. package/src/rules/no-redos-vulnerable-regex/index.ts +0 -379
  260. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +0 -83
  261. package/src/rules/no-sensitive-data-exposure/index.ts +0 -294
  262. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +0 -262
  263. package/src/rules/no-sensitive-data-in-analytics/index.ts +0 -73
  264. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +0 -42
  265. package/src/rules/no-sensitive-data-in-cache/index.ts +0 -59
  266. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +0 -32
  267. package/src/rules/no-sql-injection/index.ts +0 -424
  268. package/src/rules/no-sql-injection/no-sql-injection.test.ts +0 -303
  269. package/src/rules/no-timing-attack/index.ts +0 -552
  270. package/src/rules/no-timing-attack/no-timing-attack.test.ts +0 -348
  271. package/src/rules/no-toctou-vulnerability/index.ts +0 -250
  272. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +0 -60
  273. package/src/rules/no-tracking-without-consent/index.ts +0 -78
  274. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +0 -34
  275. package/src/rules/no-unchecked-loop-condition/index.ts +0 -781
  276. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +0 -459
  277. package/src/rules/no-unencrypted-local-storage/index.ts +0 -73
  278. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +0 -41
  279. package/src/rules/no-unencrypted-transmission/index.ts +0 -296
  280. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +0 -287
  281. package/src/rules/no-unescaped-url-parameter/index.ts +0 -424
  282. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +0 -263
  283. package/src/rules/no-unlimited-resource-allocation/index.ts +0 -767
  284. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +0 -544
  285. package/src/rules/no-unsafe-deserialization/index.ts +0 -593
  286. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +0 -310
  287. package/src/rules/no-unsafe-dynamic-require/index.ts +0 -125
  288. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +0 -151
  289. package/src/rules/no-unsafe-regex-construction/index.ts +0 -370
  290. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +0 -181
  291. package/src/rules/no-unsanitized-html/index.ts +0 -400
  292. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +0 -488
  293. package/src/rules/no-unvalidated-deeplinks/index.ts +0 -73
  294. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +0 -29
  295. package/src/rules/no-unvalidated-user-input/index.ts +0 -498
  296. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +0 -463
  297. package/src/rules/no-verbose-error-messages/index.ts +0 -83
  298. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +0 -34
  299. package/src/rules/no-weak-crypto/index.ts +0 -447
  300. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +0 -297
  301. package/src/rules/no-weak-password-recovery/index.ts +0 -509
  302. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +0 -184
  303. package/src/rules/no-xpath-injection/index.ts +0 -596
  304. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +0 -405
  305. package/src/rules/no-xxe-injection/index.ts +0 -342
  306. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +0 -122
  307. package/src/rules/no-zip-slip/index.ts +0 -526
  308. package/src/rules/no-zip-slip/no-zip-slip.test.ts +0 -305
  309. package/src/rules/require-backend-authorization/index.ts +0 -71
  310. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +0 -31
  311. package/src/rules/require-code-minification/index.ts +0 -54
  312. package/src/rules/require-code-minification/require-code-minification.test.ts +0 -30
  313. package/src/rules/require-csp-headers/index.ts +0 -74
  314. package/src/rules/require-csp-headers/require-csp-headers.test.ts +0 -34
  315. package/src/rules/require-data-minimization/index.ts +0 -65
  316. package/src/rules/require-data-minimization/require-data-minimization.test.ts +0 -31
  317. package/src/rules/require-dependency-integrity/index.ts +0 -78
  318. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +0 -44
  319. package/src/rules/require-https-only/index.ts +0 -75
  320. package/src/rules/require-https-only/require-https-only.test.ts +0 -26
  321. package/src/rules/require-mime-type-validation/index.ts +0 -77
  322. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +0 -32
  323. package/src/rules/require-network-timeout/index.ts +0 -58
  324. package/src/rules/require-network-timeout/require-network-timeout.test.ts +0 -26
  325. package/src/rules/require-package-lock/index.ts +0 -75
  326. package/src/rules/require-package-lock/require-package-lock.test.ts +0 -27
  327. package/src/rules/require-secure-credential-storage/index.ts +0 -60
  328. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +0 -26
  329. package/src/rules/require-secure-defaults/index.ts +0 -54
  330. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +0 -26
  331. package/src/rules/require-secure-deletion/index.ts +0 -52
  332. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +0 -29
  333. package/src/rules/require-storage-encryption/index.ts +0 -60
  334. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +0 -26
  335. package/src/rules/require-url-validation/index.ts +0 -85
  336. package/src/rules/require-url-validation/require-url-validation.test.ts +0 -32
  337. package/src/types/index.ts +0 -235
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noUnvalidatedUserInput = void 0;
4
+ const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
+ const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
+ /**
7
+ * Patterns that indicate unvalidated user input
8
+ */
9
+ const UNVALIDATED_INPUT_PATTERNS = [
10
+ // Express/Node.js patterns
11
+ { pattern: /\breq\.body\b/, name: 'req.body', context: 'Express request body' },
12
+ { pattern: /\breq\.query\b/, name: 'req.query', context: 'Express query parameters' },
13
+ { pattern: /\breq\.params\b/, name: 'req.params', context: 'Express route parameters' },
14
+ { pattern: /\breq\.headers\b/, name: 'req.headers', context: 'Express headers' },
15
+ { pattern: /\breq\.cookies\b/, name: 'req.cookies', context: 'Express cookies' },
16
+ // Fastify patterns
17
+ { pattern: /\brequest\.body\b/, name: 'request.body', context: 'Fastify request body' },
18
+ { pattern: /\brequest\.query\b/, name: 'request.query', context: 'Fastify query parameters' },
19
+ { pattern: /\brequest\.params\b/, name: 'request.params', context: 'Fastify route parameters' },
20
+ // Next.js patterns
21
+ { pattern: /\bsearchParams\b/, name: 'searchParams', context: 'Next.js search params' },
22
+ // Generic patterns - ONLY flag clearly user-related patterns
23
+ // Removed 'input' as it's too generic and causes many false positives
24
+ { pattern: /\buserInput\b/, name: 'userInput', context: 'Generic user input' },
25
+ { pattern: /\bunsafeInput\b/, name: 'unsafeInput', context: 'Explicitly unsafe input' },
26
+ { pattern: /\brawInput\b/, name: 'rawInput', context: 'Raw/unprocessed input' },
27
+ ];
28
+ /**
29
+ * Check if a node is inside a validation function call
30
+ */
31
+ function isInsideValidationCall(node, sourceCode, trustedLibraries) {
32
+ let current = node;
33
+ while (current) {
34
+ // Check if current is an argument to a CallExpression
35
+ if (current.parent && current.parent.type === 'CallExpression') {
36
+ const callExpr = current.parent;
37
+ // Verify that current is actually an argument of this call
38
+ const isArgument = callExpr.arguments.some((arg) => arg === current);
39
+ if (!isArgument) {
40
+ // Not an argument, continue traversing
41
+ if ('parent' in current && current.parent) {
42
+ current = current.parent;
43
+ continue;
44
+ }
45
+ else {
46
+ break;
47
+ }
48
+ }
49
+ const callee = callExpr.callee;
50
+ // Check if it's a validation library call (e.g., schema.parse(), schema.validate())
51
+ if (callee.type === 'MemberExpression') {
52
+ const property = callee.property;
53
+ if (property.type === 'Identifier') {
54
+ const methodName = property.name.toLowerCase();
55
+ // Check for validation methods (including async variants)
56
+ // Note: safeParse is one word, not two
57
+ if (['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(methodName)) {
58
+ return true;
59
+ }
60
+ }
61
+ // Check if the object is a validation library
62
+ const object = callee.object;
63
+ if (object.type === 'Identifier') {
64
+ const objectName = object.name.toLowerCase();
65
+ if (trustedLibraries.some(lib => objectName.includes(lib.toLowerCase()))) {
66
+ return true;
67
+ }
68
+ }
69
+ }
70
+ // Check if it's a direct validation function call (e.g., validate(), plainToClass())
71
+ if (callee.type === 'Identifier') {
72
+ const calleeName = callee.name.toLowerCase();
73
+ if (['validate', 'plaintoclass', 'transform'].includes(calleeName)) {
74
+ return true;
75
+ }
76
+ if (trustedLibraries.some(lib => calleeName.includes(lib.toLowerCase()))) {
77
+ return true;
78
+ }
79
+ }
80
+ }
81
+ // Traverse up the AST
82
+ if ('parent' in current && current.parent) {
83
+ current = current.parent;
84
+ }
85
+ else {
86
+ break;
87
+ }
88
+ }
89
+ return false;
90
+ }
91
+ /**
92
+ * Check if a string matches any ignore pattern
93
+ */
94
+ function matchesIgnorePattern(text, ignorePatterns) {
95
+ return ignorePatterns.some(pattern => {
96
+ try {
97
+ const regex = new RegExp(pattern, 'i');
98
+ return regex.test(text);
99
+ }
100
+ catch {
101
+ // Invalid regex - treat as literal string match
102
+ return text.toLowerCase().includes(pattern.toLowerCase());
103
+ }
104
+ });
105
+ }
106
+ exports.noUnvalidatedUserInput = (0, eslint_devkit_2.createRule)({
107
+ name: 'no-unvalidated-user-input',
108
+ meta: {
109
+ type: 'problem',
110
+ docs: {
111
+ description: 'Detects unvalidated user input usage (req.body, req.query, etc.)',
112
+ },
113
+ hasSuggestions: true,
114
+ messages: {
115
+ unvalidatedInput: (0, eslint_devkit_1.formatLLMMessage)({
116
+ icon: eslint_devkit_1.MessageIcons.SECURITY,
117
+ issueName: 'Unvalidated User Input',
118
+ cwe: 'CWE-20',
119
+ description: 'Unvalidated user input detected: {{inputSource}}',
120
+ severity: 'HIGH',
121
+ fix: 'Use validation library: {{validationExample}}',
122
+ documentationLink: 'https://cwe.mitre.org/data/definitions/20.html',
123
+ }),
124
+ useValidationLibrary: (0, eslint_devkit_1.formatLLMMessage)({
125
+ icon: eslint_devkit_1.MessageIcons.INFO,
126
+ issueName: 'Use Validation Library',
127
+ description: 'Use validation library',
128
+ severity: 'LOW',
129
+ fix: 'Use Zod, Joi, Yup, or class-validator',
130
+ documentationLink: 'https://zod.dev/',
131
+ }),
132
+ useZod: (0, eslint_devkit_1.formatLLMMessage)({
133
+ icon: eslint_devkit_1.MessageIcons.INFO,
134
+ issueName: 'Use Zod',
135
+ description: 'Use Zod for validation',
136
+ severity: 'LOW',
137
+ fix: 'const data = z.object({ name: z.string() }).parse(req.body)',
138
+ documentationLink: 'https://zod.dev/',
139
+ }),
140
+ useJoi: (0, eslint_devkit_1.formatLLMMessage)({
141
+ icon: eslint_devkit_1.MessageIcons.INFO,
142
+ issueName: 'Use Joi',
143
+ description: 'Use Joi for validation',
144
+ severity: 'LOW',
145
+ fix: 'Joi.object({ name: Joi.string() }).validate(req.body)',
146
+ documentationLink: 'https://joi.dev/',
147
+ }),
148
+ },
149
+ schema: [
150
+ {
151
+ type: 'object',
152
+ properties: {
153
+ allowInTests: {
154
+ type: 'boolean',
155
+ default: false,
156
+ description: 'Allow unvalidated input in test files',
157
+ },
158
+ trustedLibraries: {
159
+ type: 'array',
160
+ items: { type: 'string' },
161
+ default: ['zod', 'joi', 'yup', 'class-validator'],
162
+ description: 'Trusted validation libraries',
163
+ },
164
+ ignorePatterns: {
165
+ type: 'array',
166
+ items: { type: 'string' },
167
+ default: [],
168
+ description: 'Additional safe patterns to ignore',
169
+ },
170
+ },
171
+ additionalProperties: false,
172
+ },
173
+ ],
174
+ },
175
+ defaultOptions: [
176
+ {
177
+ allowInTests: false,
178
+ trustedLibraries: ['zod', 'joi', 'yup', 'class-validator'],
179
+ ignorePatterns: ['^safe', '^sanitized', '^validated', '^clean'],
180
+ },
181
+ ],
182
+ create(context, [options = {}]) {
183
+ const { allowInTests = false, trustedLibraries = ['zod', 'joi', 'yup', 'class-validator'], ignorePatterns = ['^safe', '^sanitized', '^validated', '^clean'], } = options;
184
+ const filename = context.getFilename();
185
+ const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
186
+ const sourceCode = context.sourceCode || context.sourceCode;
187
+ function checkMemberExpression(node) {
188
+ if (isTestFile) {
189
+ return;
190
+ }
191
+ const text = sourceCode.getText(node);
192
+ // Check if the variable name (if in assignment) matches ignore pattern
193
+ // For cases like: const safeInput = req.body;
194
+ if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.id.type === 'Identifier') {
195
+ const varName = node.parent.id.name;
196
+ if (matchesIgnorePattern(varName, ignorePatterns)) {
197
+ return;
198
+ }
199
+ }
200
+ // Check if it matches any ignore pattern
201
+ if (matchesIgnorePattern(text, ignorePatterns)) {
202
+ return;
203
+ }
204
+ // Check if it matches unvalidated input patterns
205
+ // For nested member expressions like req.body.name, check the base (req.body)
206
+ let baseText = text;
207
+ if (node.object.type === 'MemberExpression') {
208
+ baseText = sourceCode.getText(node.object);
209
+ }
210
+ const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => p.pattern.test(text) || p.pattern.test(baseText));
211
+ if (matchedPattern) {
212
+ // Skip if this is a nested member expression and the parent also matches
213
+ // This prevents double reporting for cases like req.query.id
214
+ // We only want to report on the outermost matching expression
215
+ if (node.object.type === 'MemberExpression') {
216
+ const parentText = sourceCode.getText(node.object);
217
+ const parentMatches = UNVALIDATED_INPUT_PATTERNS.some(p => p.pattern.test(parentText));
218
+ if (parentMatches) {
219
+ // Parent also matches, skip this nested one - it will be reported when we visit the parent
220
+ return;
221
+ }
222
+ }
223
+ // Skip if this is in a destructuring assignment - checkObjectPattern will handle it
224
+ // This prevents double reporting for cases like: const { email } = req.body;
225
+ if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.id.type === 'ObjectPattern') {
226
+ return; // checkObjectPattern will report on the init instead
227
+ }
228
+ // Check if it's inside a validation call
229
+ if (isInsideValidationCall(node, sourceCode, trustedLibraries)) {
230
+ return;
231
+ }
232
+ // Determine validation example based on context
233
+ let validationExample = 'const schema = z.object({ field: z.string() }); const data = schema.parse(req.body);';
234
+ if (text.includes('query')) {
235
+ validationExample = 'const schema = z.object({ id: z.string() }); const data = schema.parse(req.query);';
236
+ }
237
+ else if (text.includes('params')) {
238
+ validationExample = 'const schema = z.object({ id: z.string() }); const data = schema.parse(req.params);';
239
+ }
240
+ // Build suggestions - provide same code as output for test framework recognition
241
+ const suggestions = [
242
+ {
243
+ messageId: 'useZod',
244
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
245
+ fix: (_fixer) => {
246
+ // This is a suggestion, not an auto-fix, so we return null
247
+ return null;
248
+ },
249
+ },
250
+ {
251
+ messageId: 'useJoi',
252
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
253
+ fix: (_fixer) => {
254
+ return null;
255
+ },
256
+ },
257
+ ];
258
+ context.report({
259
+ node,
260
+ messageId: 'unvalidatedInput',
261
+ data: {
262
+ inputSource: matchedPattern.name,
263
+ validationExample,
264
+ },
265
+ suggest: suggestions,
266
+ });
267
+ }
268
+ }
269
+ function checkIdentifier(node) {
270
+ if (isTestFile) {
271
+ return;
272
+ }
273
+ const text = node.name;
274
+ // Check if it matches any ignore pattern
275
+ if (matchesIgnorePattern(text, ignorePatterns)) {
276
+ return;
277
+ }
278
+ // Skip if this identifier is assigned from a user input source (MemberExpression)
279
+ // For cases like: const userInput = req.body;
280
+ // We should only report on req.body, not on userInput
281
+ // But don't skip if the init is the same identifier (e.g., const data = input;)
282
+ if (node.parent && node.parent.type === 'VariableDeclarator' && node.parent.init) {
283
+ const init = node.parent.init;
284
+ // Only skip if init is a MemberExpression (like req.body) that will be caught by checkMemberExpression
285
+ // Don't skip if init is the same identifier (like input) - we want to report on it
286
+ if (init.type === 'MemberExpression') {
287
+ const initText = sourceCode.getText(init);
288
+ // Check if init matches any user input pattern
289
+ const initMatchesPattern = UNVALIDATED_INPUT_PATTERNS.some(p => p.pattern.test(initText));
290
+ if (initMatchesPattern) {
291
+ return; // Skip - the init (e.g., req.body) will be reported by checkMemberExpression
292
+ }
293
+ }
294
+ }
295
+ // Check for generic input patterns (userInput, unsafeInput, rawInput)
296
+ const genericInputPatternNames = ['userInput', 'unsafeInput', 'rawInput'];
297
+ const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => genericInputPatternNames.includes(p.name) && p.pattern.test(text));
298
+ if (matchedPattern) {
299
+ // Check if it's inside a validation call
300
+ if (isInsideValidationCall(node, sourceCode, trustedLibraries)) {
301
+ return;
302
+ }
303
+ context.report({
304
+ node,
305
+ messageId: 'unvalidatedInput',
306
+ data: {
307
+ inputSource: matchedPattern.name,
308
+ validationExample: 'const schema = z.object({ field: z.string() }); const data = schema.parse(input);',
309
+ },
310
+ suggest: [
311
+ {
312
+ messageId: 'useZod',
313
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
314
+ fix: (_fixer) => null,
315
+ },
316
+ {
317
+ messageId: 'useJoi',
318
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
319
+ fix: (_fixer) => null,
320
+ },
321
+ ],
322
+ });
323
+ }
324
+ }
325
+ function checkObjectPattern(node) {
326
+ if (isTestFile) {
327
+ return;
328
+ }
329
+ // Check destructuring patterns like: const { page, limit } = req.query;
330
+ if (node.parent && node.parent.type === eslint_devkit_1.AST_NODE_TYPES.VariableDeclarator && node.parent.init) {
331
+ const init = node.parent.init;
332
+ const initText = sourceCode.getText(init);
333
+ // If init is a CallExpression, check if it's a validation call
334
+ // If so, the input is being validated, so skip
335
+ if (init.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression) {
336
+ const callee = init.callee;
337
+ if (callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression && callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
338
+ const methodName = callee.property.name.toLowerCase();
339
+ if (['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(methodName)) {
340
+ return; // It's a validation call, skip
341
+ }
342
+ }
343
+ if (callee.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
344
+ const calleeName = callee.name.toLowerCase();
345
+ if (['validate', 'plaintoclass', 'transform'].includes(calleeName)) {
346
+ return; // It's a validation call, skip
347
+ }
348
+ }
349
+ }
350
+ // Check if the right side matches unvalidated input patterns
351
+ const matchedPattern = UNVALIDATED_INPUT_PATTERNS.find(p => p.pattern.test(initText));
352
+ if (matchedPattern) {
353
+ // For CallExpressions, check the arguments to see if they're validated
354
+ // The init itself being a validation call was already checked above
355
+ if (init.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression) {
356
+ // Check each argument to see if it's validated
357
+ // If init is a validation call (like schema.validate(req.body)),
358
+ // then req.body is validated, so skip
359
+ const callee = init.callee;
360
+ const isValidationCall = (callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression && callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
361
+ ['parse', 'validate', 'safeparse', 'parseasync', 'validateasync', 'safe_parse'].includes(callee.property.name.toLowerCase())) ||
362
+ (callee.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
363
+ ['validate', 'plaintoclass', 'transform'].includes(callee.name.toLowerCase()));
364
+ if (isValidationCall) {
365
+ return; // The init is a validation call, so the input is validated
366
+ }
367
+ // If init is not a validation call, check if arguments are validated
368
+ const hasValidatedArg = init.arguments.some((arg) => {
369
+ if (arg.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression || arg.type === eslint_devkit_1.AST_NODE_TYPES.Identifier) {
370
+ return isInsideValidationCall(arg, sourceCode, trustedLibraries);
371
+ }
372
+ return false;
373
+ });
374
+ if (hasValidatedArg) {
375
+ return; // At least one argument is validated
376
+ }
377
+ }
378
+ else {
379
+ // For non-call expressions, check if init itself is inside a validation call
380
+ if (isInsideValidationCall(init, sourceCode, trustedLibraries)) {
381
+ return;
382
+ }
383
+ }
384
+ // Check if variable name matches ignore pattern
385
+ if (node.parent.id.type === eslint_devkit_1.AST_NODE_TYPES.ObjectPattern) {
386
+ const varText = sourceCode.getText(node.parent.id);
387
+ if (matchesIgnorePattern(varText, ignorePatterns)) {
388
+ return;
389
+ }
390
+ }
391
+ context.report({
392
+ node: init,
393
+ messageId: 'unvalidatedInput',
394
+ data: {
395
+ inputSource: matchedPattern.name,
396
+ validationExample: 'const schema = z.object({ page: z.string(), limit: z.string() }); const { page, limit } = schema.parse(req.query);',
397
+ },
398
+ suggest: [
399
+ {
400
+ messageId: 'useZod',
401
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
402
+ fix: (_fixer) => null,
403
+ },
404
+ {
405
+ messageId: 'useJoi',
406
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
407
+ fix: (_fixer) => null,
408
+ },
409
+ ],
410
+ });
411
+ }
412
+ }
413
+ }
414
+ return {
415
+ MemberExpression: checkMemberExpression,
416
+ Identifier: checkIdentifier,
417
+ ObjectPattern: checkObjectPattern,
418
+ };
419
+ },
420
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Prevent exposing stack traces to users
3
+ * @see https://owasp.org/www-project-mobile-top-10/
4
+ * @see https://cwe.mitre.org/data/definitions/209.html
5
+ */
6
+ export interface Options {
7
+ }
8
+ export declare const noVerboseErrorMessages: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Prevent exposing stack traces to users
4
+ * @see https://owasp.org/www-project-mobile-top-10/
5
+ * @see https://cwe.mitre.org/data/definitions/209.html
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.noVerboseErrorMessages = void 0;
9
+ const eslint_devkit_1 = require("@interlace/eslint-devkit");
10
+ exports.noVerboseErrorMessages = (0, eslint_devkit_1.createRule)({
11
+ name: 'no-verbose-error-messages',
12
+ meta: {
13
+ type: 'problem',
14
+ docs: {
15
+ description: 'Prevent exposing stack traces to users',
16
+ },
17
+ messages: {
18
+ violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
19
+ icon: eslint_devkit_1.MessageIcons.SECURITY,
20
+ issueName: 'violation Detected',
21
+ cwe: 'CWE-209',
22
+ description: 'Prevent exposing stack traces to users detected - this is a security risk',
23
+ severity: 'MEDIUM',
24
+ fix: 'Review and apply secure practices',
25
+ documentationLink: 'https://cwe.mitre.org/data/definitions/209.html',
26
+ })
27
+ },
28
+ schema: [],
29
+ },
30
+ defaultOptions: [],
31
+ create(context) {
32
+ function report(node) {
33
+ context.report({
34
+ node,
35
+ messageId: 'violationDetected',
36
+ });
37
+ }
38
+ return {
39
+ CallExpression(node) {
40
+ // Check res.send/res.json with error.stack
41
+ if (node.type === eslint_devkit_1.AST_NODE_TYPES.CallExpression &&
42
+ node.callee.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
43
+ node.callee.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
44
+ ['send', 'json'].includes(node.callee.property.name)) {
45
+ const arg = node.arguments[0];
46
+ // Check for error.stack or err.stack
47
+ if (arg?.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
48
+ arg.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
49
+ arg.property.name === 'stack') {
50
+ report(node);
51
+ }
52
+ // Check for { stack: error.stack } in object
53
+ if (arg?.type === eslint_devkit_1.AST_NODE_TYPES.ObjectExpression) {
54
+ const stackProp = arg.properties.find(p => p.type === eslint_devkit_1.AST_NODE_TYPES.Property &&
55
+ p.key.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
56
+ (p.key.name === 'stack' ||
57
+ (p.value.type === eslint_devkit_1.AST_NODE_TYPES.MemberExpression &&
58
+ p.value.property.type === eslint_devkit_1.AST_NODE_TYPES.Identifier &&
59
+ p.value.property.name === 'stack')));
60
+ if (stackProp) {
61
+ report(node);
62
+ }
63
+ }
64
+ }
65
+ },
66
+ };
67
+ },
68
+ });
@@ -0,0 +1,12 @@
1
+ import { type SecurityRuleOptions } from '@interlace/eslint-devkit';
2
+ export interface Options extends SecurityRuleOptions {
3
+ /** Minimum token entropy bits */
4
+ minTokenEntropy?: number;
5
+ /** Maximum token lifetime in hours */
6
+ maxTokenLifetimeHours?: number;
7
+ /** Recovery-related keywords */
8
+ recoveryKeywords?: string[];
9
+ /** Secure token generation functions */
10
+ secureTokenFunctions?: string[];
11
+ }
12
+ export declare const noWeakPasswordRecovery: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;