eslint-plugin-sonarjs 4.0.0 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/README.md +269 -268
  2. package/cjs/S100/rule.js +7 -5
  3. package/cjs/S101/rule.js +2 -2
  4. package/cjs/S104/rule.js +2 -2
  5. package/cjs/S105/rule.js +2 -2
  6. package/cjs/S1066/rule.js +5 -4
  7. package/cjs/S1067/rule.js +8 -6
  8. package/cjs/S1110/rule.js +7 -5
  9. package/cjs/S1119/rule.js +85 -7
  10. package/cjs/S1121/rule.js +4 -3
  11. package/cjs/S1125/rule.js +9 -8
  12. package/cjs/S1126/rule.js +2 -2
  13. package/cjs/S1128/rule.js +8 -5
  14. package/cjs/S1134/rule.js +2 -2
  15. package/cjs/S1135/rule.js +2 -2
  16. package/cjs/S1154/rule.js +6 -4
  17. package/cjs/S117/rule.js +6 -5
  18. package/cjs/S1172/rule.js +2 -2
  19. package/cjs/S1192/rule.js +5 -4
  20. package/cjs/S1219/rule.js +4 -3
  21. package/cjs/S1226/rule.js +6 -4
  22. package/cjs/S124/rule.js +2 -2
  23. package/cjs/S125/rule.js +9 -7
  24. package/cjs/S126/rule.js +2 -2
  25. package/cjs/S1264/rule.js +2 -2
  26. package/cjs/S128/rule.js +4 -3
  27. package/cjs/S1291/rule.js +2 -2
  28. package/cjs/S1301/rule.js +2 -2
  29. package/cjs/S1313/rule.js +2 -2
  30. package/cjs/S134/rule.js +7 -5
  31. package/cjs/S135/rule.js +5 -4
  32. package/cjs/S138/rule.js +9 -6
  33. package/cjs/S1439/rule.js +2 -2
  34. package/cjs/S1444/rule.js +2 -2
  35. package/cjs/S1451/rule.js +2 -2
  36. package/cjs/S1472/rule.js +2 -2
  37. package/cjs/S1479/rule.js +2 -2
  38. package/cjs/S1481/rule.js +2 -2
  39. package/cjs/S1488/generated-meta.js +1 -1
  40. package/cjs/S1488/rule.js +11 -7
  41. package/cjs/S1515/rule.js +10 -8
  42. package/cjs/{helpers/aws/index.js → S1523/generated-meta.js} +34 -18
  43. package/cjs/S1523/index.js +21 -0
  44. package/cjs/S1523/meta.js +21 -0
  45. package/cjs/S1523/rule.js +143 -0
  46. package/cjs/S1526/rule.js +5 -4
  47. package/cjs/S1527/rule.js +2 -2
  48. package/cjs/S1528/rule.js +2 -2
  49. package/cjs/S1529/generated-meta.js +1 -1
  50. package/cjs/S1529/rule.js +4 -3
  51. package/cjs/S1530/rule.js +5 -3
  52. package/cjs/S1533/rule.js +2 -2
  53. package/cjs/S1535/rule.js +2 -2
  54. package/cjs/S1541/rule.js +10 -7
  55. package/cjs/S1607/rule.js +22 -20
  56. package/cjs/S1764/rule.js +10 -7
  57. package/cjs/S1821/rule.js +2 -2
  58. package/cjs/S1848/rule.js +10 -7
  59. package/cjs/S1854/rule.js +18 -14
  60. package/cjs/S1862/rule.js +10 -8
  61. package/cjs/S1871/rule.js +21 -16
  62. package/cjs/S1874/rule.js +4 -3
  63. package/cjs/S1940/rule.js +2 -2
  64. package/cjs/S1994/rule.js +10 -7
  65. package/cjs/S2004/rule.js +9 -7
  66. package/cjs/S2068/rule.js +75 -12
  67. package/cjs/S2077/generated-meta.js +1 -1
  68. package/cjs/S2077/rule.js +10 -6
  69. package/cjs/S2092/rule.js +2 -2
  70. package/cjs/S2123/rule.js +2 -2
  71. package/cjs/S2137/rule.js +2 -2
  72. package/cjs/S2138/rule.js +4 -3
  73. package/cjs/S2187/rule.js +2 -2
  74. package/cjs/S2201/rule.js +47 -5
  75. package/cjs/S2208/rule.js +2 -2
  76. package/cjs/S2234/rule.js +58 -11
  77. package/cjs/S2245/rule.js +4 -3
  78. package/cjs/S2251/rule.js +5 -4
  79. package/cjs/S2255/rule.js +6 -5
  80. package/cjs/S2259/rule.js +14 -9
  81. package/cjs/S2301/rule.js +14 -9
  82. package/cjs/S2310/rule.js +80 -9
  83. package/cjs/S2392/rule.js +7 -5
  84. package/cjs/S2424/rule.js +2 -2
  85. package/cjs/S2428/rule.js +8 -6
  86. package/cjs/S2486/rule.js +4 -3
  87. package/cjs/S2589/rule.js +12 -10
  88. package/cjs/S2598/rule.js +17 -14
  89. package/cjs/S2612/generated-meta.js +1 -1
  90. package/cjs/S2612/rule.js +8 -6
  91. package/cjs/S2639/rule.js +2 -2
  92. package/cjs/S2681/rule.js +2 -2
  93. package/cjs/S2692/rule.js +6 -4
  94. package/cjs/S2699/generated-meta.js +1 -1
  95. package/cjs/S2699/rule.js +40 -31
  96. package/cjs/S2703/rule.js +2 -2
  97. package/cjs/S2737/rule.js +6 -4
  98. package/cjs/S2755/rule.js +9 -6
  99. package/cjs/S2757/rule.js +2 -2
  100. package/cjs/S2817/rule.js +10 -7
  101. package/cjs/S2819/rule.js +16 -12
  102. package/cjs/S2870/rule.js +8 -5
  103. package/cjs/S2871/rule.js +12 -9
  104. package/cjs/S2970/rule.js +9 -8
  105. package/cjs/S2990/rule.js +2 -2
  106. package/cjs/S2999/rule.js +10 -7
  107. package/cjs/S3001/rule.js +2 -2
  108. package/cjs/S3003/rule.js +10 -7
  109. package/cjs/S3317/rule.js +4 -3
  110. package/cjs/S3330/rule.js +2 -2
  111. package/cjs/S3358/rule.js +2 -2
  112. package/cjs/S3402/rule.js +14 -10
  113. package/cjs/S3403/rule.js +10 -7
  114. package/cjs/S3415/rule.js +16 -13
  115. package/cjs/S3499/rule.js +5 -4
  116. package/cjs/S3500/rule.js +5 -4
  117. package/cjs/S3513/rule.js +5 -4
  118. package/cjs/S3514/rule.js +10 -7
  119. package/cjs/S3516/rule.js +10 -7
  120. package/cjs/S3524/rule.js +2 -2
  121. package/cjs/S3525/rule.js +6 -4
  122. package/cjs/S3531/rule.js +5 -3
  123. package/cjs/S3533/rule.js +8 -7
  124. package/cjs/S3579/rule.js +6 -4
  125. package/cjs/S3616/rule.js +6 -4
  126. package/cjs/S3626/rule.js +4 -3
  127. package/cjs/S3686/rule.js +7 -5
  128. package/cjs/S3699/rule.js +4 -3
  129. package/cjs/S3735/rule.js +8 -5
  130. package/cjs/S3757/rule.js +8 -6
  131. package/cjs/S3758/rule.js +9 -7
  132. package/cjs/S3760/rule.js +24 -21
  133. package/cjs/S3776/rule.js +26 -22
  134. package/cjs/S3782/rule.js +6 -4
  135. package/cjs/S3785/rule.js +9 -6
  136. package/cjs/S3796/rule.js +12 -8
  137. package/cjs/S3798/rule.js +4 -3
  138. package/cjs/S3800/rule.js +22 -11
  139. package/cjs/S3801/generated-meta.js +1 -1
  140. package/cjs/S3801/rule.js +15 -11
  141. package/cjs/S3827/rule.js +9 -6
  142. package/cjs/S3923/rule.js +9 -6
  143. package/cjs/S3972/rule.js +5 -4
  144. package/cjs/S3973/rule.js +7 -5
  145. package/cjs/S3981/rule.js +4 -3
  146. package/cjs/S3984/rule.js +4 -3
  147. package/cjs/S4030/rule.js +10 -7
  148. package/cjs/S4036/rule.js +7 -5
  149. package/cjs/S4043/rule.js +12 -8
  150. package/cjs/S4139/rule.js +7 -5
  151. package/cjs/S4143/rule.js +12 -9
  152. package/cjs/S4144/rule.js +12 -9
  153. package/cjs/S4158/rule.js +11 -8
  154. package/cjs/S4165/rule.js +14 -12
  155. package/cjs/S4322/rule.js +8 -5
  156. package/cjs/S4323/rule.js +4 -3
  157. package/cjs/S4324/rule.js +7 -5
  158. package/cjs/S4328/rule.js +2 -2
  159. package/cjs/S4335/rule.js +6 -4
  160. package/cjs/S4423/rule.js +4 -3
  161. package/cjs/S4423/rule.lib.js +8 -7
  162. package/cjs/S4426/rule.js +11 -10
  163. package/cjs/S4502/rule.js +16 -13
  164. package/cjs/S4507/rule.js +8 -6
  165. package/cjs/S4524/rule.js +2 -2
  166. package/cjs/S4619/rule.js +6 -4
  167. package/cjs/S4621/rule.js +5 -4
  168. package/cjs/S4622/rule.js +5 -3
  169. package/cjs/S4623/rule.js +8 -5
  170. package/cjs/S4624/rule.js +6 -4
  171. package/cjs/S4634/rule.js +4 -3
  172. package/cjs/S4721/rule.js +7 -5
  173. package/cjs/S4782/rule.js +7 -5
  174. package/cjs/S4784/rule.js +5 -4
  175. package/cjs/S4787/rule.js +9 -7
  176. package/cjs/S4790/rule.js +7 -5
  177. package/cjs/S4798/rule.js +2 -2
  178. package/cjs/S4817/rule.js +10 -8
  179. package/cjs/S4818/rule.js +4 -3
  180. package/cjs/S4822/rule.js +13 -9
  181. package/cjs/S4823/rule.js +4 -3
  182. package/cjs/S4829/rule.js +4 -3
  183. package/cjs/S4830/rule.js +11 -8
  184. package/cjs/S5042/rule.js +9 -7
  185. package/cjs/S5122/rule.js +40 -36
  186. package/cjs/S5148/rule.js +9 -8
  187. package/cjs/S5247/rule.js +22 -18
  188. package/cjs/S5256/rule.js +5 -4
  189. package/cjs/S5257/rule.js +4 -3
  190. package/cjs/S5260/rule.js +4 -3
  191. package/cjs/S5264/rule.js +4 -3
  192. package/cjs/S5332/rule.js +4 -3
  193. package/cjs/S5332/rule.lib.js +19 -17
  194. package/cjs/S5443/rule.js +2 -2
  195. package/cjs/S5527/rule.js +18 -14
  196. package/cjs/S5542/rule.js +6 -4
  197. package/cjs/S5547/rule.js +6 -4
  198. package/cjs/S5604/rule.js +15 -14
  199. package/cjs/S5659/rule.js +15 -12
  200. package/cjs/S5689/rule.js +11 -8
  201. package/cjs/S5691/rule.js +7 -5
  202. package/cjs/S5693/rule.js +14 -12
  203. package/cjs/S5725/rule.js +9 -6
  204. package/cjs/S5728/rule.js +7 -4
  205. package/cjs/S5730/rule.js +9 -6
  206. package/cjs/S5732/rule.js +8 -5
  207. package/cjs/S5734/rule.js +7 -4
  208. package/cjs/S5736/rule.js +8 -5
  209. package/cjs/S5739/rule.js +11 -8
  210. package/cjs/S5742/rule.js +7 -4
  211. package/cjs/S5743/rule.js +8 -6
  212. package/cjs/S5757/rule.js +13 -10
  213. package/cjs/S5759/rule.js +10 -7
  214. package/cjs/S5842/rule.js +2 -2
  215. package/cjs/S5843/rule.js +22 -19
  216. package/cjs/S5850/rule.js +4 -3
  217. package/cjs/S5852/rule.js +2 -2
  218. package/cjs/S5856/rule.js +10 -7
  219. package/cjs/S5860/rule.js +30 -26
  220. package/cjs/S5863/rule.js +15 -11
  221. package/cjs/S5867/rule.js +8 -7
  222. package/cjs/S5868/rule.js +7 -5
  223. package/cjs/S5869/rule.js +6 -5
  224. package/cjs/S5876/rule.js +12 -8
  225. package/cjs/S5958/rule.js +12 -9
  226. package/cjs/S5973/rule.js +10 -7
  227. package/cjs/S6019/rule.js +4 -3
  228. package/cjs/S6035/rule.js +2 -2
  229. package/cjs/S6079/rule.js +9 -6
  230. package/cjs/S6080/rule.js +13 -10
  231. package/cjs/S6092/rule.js +9 -7
  232. package/cjs/S6245/rule.js +14 -9
  233. package/cjs/S6249/rule.js +7 -5
  234. package/cjs/S6252/rule.js +12 -8
  235. package/cjs/S6265/rule.js +27 -20
  236. package/cjs/S6268/rule.js +5 -4
  237. package/cjs/S6270/rule.js +12 -9
  238. package/cjs/S6275/rule.js +2 -2
  239. package/cjs/S6281/rule.js +22 -17
  240. package/cjs/S6299/rule.js +2 -2
  241. package/cjs/S6302/rule.js +6 -5
  242. package/cjs/S6303/rule.js +12 -10
  243. package/cjs/S6304/rule.js +6 -5
  244. package/cjs/S6308/rule.js +7 -5
  245. package/cjs/S6317/rule.js +5 -4
  246. package/cjs/S6319/rule.js +2 -2
  247. package/cjs/S6321/rule.js +25 -23
  248. package/cjs/S6323/rule.js +4 -3
  249. package/cjs/S6324/rule.js +2 -2
  250. package/cjs/S6326/rule.js +2 -2
  251. package/cjs/S6327/rule.js +2 -2
  252. package/cjs/S6328/rule.js +4 -3
  253. package/cjs/S6329/rule.js +7 -5
  254. package/cjs/S6330/rule.js +2 -2
  255. package/cjs/S6332/rule.js +2 -2
  256. package/cjs/S6333/rule.js +8 -6
  257. package/cjs/S6351/rule.js +22 -19
  258. package/cjs/S6353/rule.js +2 -2
  259. package/cjs/S6397/rule.js +2 -2
  260. package/cjs/S6418/config.js +1 -1
  261. package/cjs/S6418/rule.js +9 -24
  262. package/cjs/S6426/rule.js +5 -4
  263. package/cjs/S6437/rule.js +10 -7
  264. package/cjs/S6439/rule.js +9 -7
  265. package/cjs/S6442/rule.js +11 -8
  266. package/cjs/S6443/rule.js +9 -7
  267. package/cjs/S6486/rule.js +5 -4
  268. package/cjs/S6564/rule.js +4 -3
  269. package/cjs/S6594/rule.js +12 -8
  270. package/cjs/S6627/rule.js +6 -4
  271. package/cjs/S6759/rule.js +10 -6
  272. package/cjs/S6958/rule.js +2 -2
  273. package/cjs/S6959/rule.js +9 -6
  274. package/cjs/S7059/generated-meta.js +1 -1
  275. package/cjs/S7059/rule.js +8 -5
  276. package/cjs/S7639/generated-meta.js +1 -1
  277. package/cjs/S7639/rule.js +5 -4
  278. package/cjs/S7790/generated-meta.js +1 -1
  279. package/cjs/S7790/rule.js +7 -5
  280. package/cjs/S8441/generated-meta.js +1 -1
  281. package/cjs/S8441/rule.js +13 -9
  282. package/cjs/S881/rule.js +2 -2
  283. package/cjs/S888/rule.js +4 -3
  284. package/cjs/S930/rule.js +14 -12
  285. package/cjs/helpers/ast.js +11 -8
  286. package/cjs/helpers/aws/s3.js +9 -6
  287. package/cjs/helpers/chai.js +41 -43
  288. package/cjs/helpers/configs.js +92 -0
  289. package/cjs/helpers/cookie-flag-check.js +19 -17
  290. package/cjs/helpers/{decorators/index.js → entropy.js} +16 -17
  291. package/cjs/helpers/express.js +127 -128
  292. package/cjs/helpers/find-up/all-in-parent-dirs.js +0 -16
  293. package/cjs/helpers/mocha.js +50 -54
  294. package/cjs/helpers/regex/ast.js +7 -6
  295. package/cjs/helpers/regex/extract.js +11 -11
  296. package/cjs/helpers/regex/group.js +2 -2
  297. package/cjs/helpers/regex/location.js +2 -2
  298. package/cjs/helpers/regex/range.js +5 -4
  299. package/cjs/helpers/regex/rule-template.js +4 -3
  300. package/cjs/helpers/sinon.js +33 -36
  301. package/cjs/helpers/supertest.js +34 -37
  302. package/cjs/helpers/vitest.js +29 -32
  303. package/cjs/plugin-rules.js +452 -450
  304. package/docs/assertions-in-tests.md +2 -0
  305. package/docs/bitwise-operators.md +2 -0
  306. package/docs/code-eval.md +7 -0
  307. package/docs/file-permissions.md +1 -1
  308. package/docs/no-async-constructor.md +2 -0
  309. package/docs/no-inconsistent-returns.md +2 -0
  310. package/docs/prefer-immediate-return.md +2 -0
  311. package/docs/sql-queries.md +2 -0
  312. package/package.json +39 -1
  313. package/types/S1067/rule.d.ts +1 -1
  314. package/types/S1110/rule.d.ts +1 -1
  315. package/types/S1128/rule.d.ts +1 -1
  316. package/types/S1172/rule.d.ts +1 -1
  317. package/types/S1226/rule.d.ts +1 -1
  318. package/types/S134/rule.d.ts +1 -1
  319. package/types/S1472/rule.d.ts +1 -1
  320. package/types/S1481/rule.d.ts +1 -1
  321. package/types/S1488/generated-meta.d.ts +1 -1
  322. package/types/S1515/rule.d.ts +1 -1
  323. package/types/S1523/generated-meta.d.ts +17 -0
  324. package/types/S1523/index.d.ts +1 -0
  325. package/types/S1523/meta.d.ts +2 -0
  326. package/types/S1523/rule.d.ts +2 -0
  327. package/types/S1527/rule.d.ts +1 -1
  328. package/types/S1529/generated-meta.d.ts +1 -1
  329. package/types/S1541/rule.d.ts +1 -1
  330. package/types/S1862/rule.d.ts +1 -1
  331. package/types/S2077/generated-meta.d.ts +1 -1
  332. package/types/S2123/rule.d.ts +1 -1
  333. package/types/S2259/rule.d.ts +1 -1
  334. package/types/S2428/rule.d.ts +1 -1
  335. package/types/S2589/rule.d.ts +1 -1
  336. package/types/S2598/rule.d.ts +1 -1
  337. package/types/S2699/generated-meta.d.ts +1 -1
  338. package/types/S2699/rule.d.ts +1 -1
  339. package/types/S2737/rule.d.ts +1 -1
  340. package/types/S2757/rule.d.ts +1 -1
  341. package/types/S2819/rule.d.ts +1 -1
  342. package/types/S3001/rule.d.ts +1 -1
  343. package/types/S3317/rule.d.ts +1 -1
  344. package/types/S3500/rule.d.ts +1 -1
  345. package/types/S3513/rule.d.ts +1 -1
  346. package/types/S3686/rule.d.ts +1 -1
  347. package/types/S3801/generated-meta.d.ts +1 -1
  348. package/types/S3972/rule.d.ts +1 -1
  349. package/types/S3973/rule.d.ts +1 -1
  350. package/types/S4030/rule.d.ts +1 -1
  351. package/types/S4143/rule.d.ts +1 -1
  352. package/types/S4158/rule.d.ts +1 -1
  353. package/types/S4621/rule.d.ts +1 -1
  354. package/types/S4782/rule.d.ts +1 -1
  355. package/types/S5693/rule.d.ts +1 -1
  356. package/types/S5725/rule.d.ts +1 -1
  357. package/types/S5860/rule.d.ts +1 -1
  358. package/types/S5868/rule.d.ts +1 -1
  359. package/types/S5869/rule.d.ts +1 -1
  360. package/types/S6079/rule.d.ts +1 -1
  361. package/types/S6326/rule.d.ts +1 -1
  362. package/types/S6351/rule.d.ts +1 -1
  363. package/types/S6418/config.d.ts +1 -1
  364. package/types/S6443/rule.d.ts +1 -1
  365. package/types/S7059/generated-meta.d.ts +1 -1
  366. package/types/S7639/generated-meta.d.ts +1 -1
  367. package/types/S7790/generated-meta.d.ts +1 -1
  368. package/types/S8441/generated-meta.d.ts +1 -1
  369. package/types/S930/rule.d.ts +1 -1
  370. package/types/helpers/ancestor.d.ts +3 -3
  371. package/types/helpers/ast.d.ts +1 -1
  372. package/types/helpers/aws/iam.d.ts +2 -2
  373. package/types/helpers/aws/s3.d.ts +1 -1
  374. package/types/helpers/chai.d.ts +3 -5
  375. package/types/helpers/configs.d.ts +39 -1
  376. package/types/helpers/entropy.d.ts +1 -0
  377. package/types/helpers/equivalence.d.ts +1 -1
  378. package/types/helpers/express.d.ts +38 -43
  379. package/types/helpers/find-up/all-in-parent-dirs.d.ts +1 -1
  380. package/types/helpers/find-up/closest.d.ts +1 -1
  381. package/types/helpers/find-up/find-minimatch.d.ts +1 -1
  382. package/types/helpers/generate-meta.d.ts +1 -1
  383. package/types/helpers/mocha.d.ts +19 -21
  384. package/types/helpers/module.d.ts +1 -1
  385. package/types/helpers/package-jsons/all-in-parent-dirs.d.ts +1 -1
  386. package/types/helpers/package-jsons/dependencies.d.ts +1 -1
  387. package/types/helpers/recognizers/CodeRecognizer.d.ts +1 -1
  388. package/types/helpers/recognizers/JavaScriptFootPrint.d.ts +2 -2
  389. package/types/helpers/recognizers/LanguageFootprint.d.ts +1 -1
  390. package/types/helpers/regex/alternation.d.ts +1 -1
  391. package/types/helpers/regex/ast.d.ts +1 -1
  392. package/types/helpers/regex/location.d.ts +2 -2
  393. package/types/helpers/regex/range.d.ts +2 -2
  394. package/types/helpers/regex/rule-template.d.ts +1 -1
  395. package/types/helpers/result.d.ts +1 -1
  396. package/types/helpers/sinon.d.ts +4 -6
  397. package/types/helpers/sonar-runtime.d.ts +1 -1
  398. package/types/helpers/supertest.d.ts +4 -6
  399. package/types/helpers/type.d.ts +1 -1
  400. package/types/helpers/vitest.d.ts +4 -6
  401. package/types/plugin-rules.d.ts +1 -0
  402. package/cjs/helpers/decorators/interceptor.js +0 -88
  403. package/cjs/helpers/index.js +0 -60
  404. package/cjs/helpers/recognizers/index.js +0 -37
  405. package/cjs/helpers/rule-detect-react.js +0 -29
  406. package/cjs/helpers/validate-version.js +0 -94
  407. package/types/helpers/aws/index.d.ts +0 -3
  408. package/types/helpers/decorators/index.d.ts +0 -2
  409. package/types/helpers/decorators/interceptor.d.ts +0 -16
  410. package/types/helpers/index.d.ts +0 -28
  411. package/types/helpers/recognizers/index.d.ts +0 -2
  412. package/types/helpers/rule-detect-react.d.ts +0 -2
  413. package/types/helpers/validate-version.d.ts +0 -13
@@ -3,51 +3,49 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Chai = void 0;
7
- const index_js_1 = require("./index.js");
6
+ exports.isImported = isImported;
7
+ exports.isTSAssertion = isTSAssertion;
8
+ exports.isAssertion = isAssertion;
9
+ const module_js_1 = require("./module.js");
10
+ const module_ts_js_1 = require("./module-ts.js");
11
+ const ast_js_1 = require("./ast.js");
8
12
  const typescript_1 = __importDefault(require("typescript"));
9
- var Chai;
10
- (function (Chai) {
11
- function isImported(context) {
12
- return ((0, index_js_1.getRequireCalls)(context).some(r => r.arguments[0].type === 'Literal' && r.arguments[0].value === 'chai') || (0, index_js_1.getImportDeclarations)(context).some(i => i.source.value === 'chai'));
13
+ function isImported(context) {
14
+ return ((0, module_js_1.getRequireCalls)(context).some(r => r.arguments[0].type === 'Literal' && r.arguments[0].value === 'chai') || (0, module_js_1.getImportDeclarations)(context).some(i => i.source.value === 'chai'));
15
+ }
16
+ function isTSAssertion(services, node) {
17
+ if (node.kind !== typescript_1.default.SyntaxKind.CallExpression) {
18
+ return false;
13
19
  }
14
- Chai.isImported = isImported;
15
- function isTSAssertion(services, node) {
16
- if (node.kind !== typescript_1.default.SyntaxKind.CallExpression) {
17
- return false;
18
- }
19
- const fqn = (0, index_js_1.getFullyQualifiedNameTS)(services, node);
20
- if (!fqn) {
21
- return false;
22
- }
23
- return fqn.startsWith('chai.assert') || fqn.startsWith('chai.expect') || fqn.includes('should');
20
+ const fqn = (0, module_ts_js_1.getFullyQualifiedNameTS)(services, node);
21
+ if (!fqn) {
22
+ return false;
24
23
  }
25
- Chai.isTSAssertion = isTSAssertion;
26
- function isAssertion(context, node) {
27
- return isAssertUsage(context, node) || isExpectUsage(context, node) || isShouldUsage(node);
24
+ return fqn.startsWith('chai.assert') || fqn.startsWith('chai.expect') || fqn.includes('should');
25
+ }
26
+ function isAssertion(context, node) {
27
+ return isAssertUsage(context, node) || isExpectUsage(context, node) || isShouldUsage(node);
28
+ }
29
+ function isAssertUsage(context, node) {
30
+ // assert(), assert.<expr>(), chai.assert(), chai.assert.<expr>()
31
+ const fqn = extractFQNforCallExpression(context, node);
32
+ if (!fqn) {
33
+ return false;
28
34
  }
29
- Chai.isAssertion = isAssertion;
30
- function isAssertUsage(context, node) {
31
- // assert(), assert.<expr>(), chai.assert(), chai.assert.<expr>()
32
- const fqn = extractFQNforCallExpression(context, node);
33
- if (!fqn) {
34
- return false;
35
- }
36
- const names = fqn.split('.');
37
- return names[0] === 'chai' && names[1] === 'assert';
35
+ const names = fqn.split('.');
36
+ return names[0] === 'chai' && names[1] === 'assert';
37
+ }
38
+ function isExpectUsage(context, node) {
39
+ // expect(), chai.expect()
40
+ return extractFQNforCallExpression(context, node) === 'chai.expect';
41
+ }
42
+ function isShouldUsage(node) {
43
+ // <expr>.should.<expr>
44
+ return node.type === 'MemberExpression' && (0, ast_js_1.isIdentifier)(node.property, 'should');
45
+ }
46
+ function extractFQNforCallExpression(context, node) {
47
+ if (node.type !== 'CallExpression') {
48
+ return undefined;
38
49
  }
39
- function isExpectUsage(context, node) {
40
- // expect(), chai.expect()
41
- return extractFQNforCallExpression(context, node) === 'chai.expect';
42
- }
43
- function isShouldUsage(node) {
44
- // <expr>.should.<expr>
45
- return node.type === 'MemberExpression' && (0, index_js_1.isIdentifier)(node.property, 'should');
46
- }
47
- function extractFQNforCallExpression(context, node) {
48
- if (node.type !== 'CallExpression') {
49
- return undefined;
50
- }
51
- return (0, index_js_1.getFullyQualifiedName)(context, node);
52
- }
53
- })(Chai || (exports.Chai = Chai = {}));
50
+ return (0, module_js_1.getFullyQualifiedName)(context, node);
51
+ }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defaultOptions = defaultOptions;
4
+ exports.applyTransformations = applyTransformations;
4
5
  function defaultOptions(configuration) {
5
6
  return configuration?.map(element => {
6
7
  if (Array.isArray(element)) {
@@ -11,3 +12,94 @@ function defaultOptions(configuration) {
11
12
  }
12
13
  });
13
14
  }
15
+ /**
16
+ * Applies `customForConfiguration` transformations to merged configuration values.
17
+ *
18
+ * When SonarQube sends rule parameters, the values may not match what the underlying
19
+ * ESLint rule expects. For example, S1441 (quotes) exposes a boolean `singleQuotes`
20
+ * property in SonarQube, but the ESLint rule expects the string `"single"` or `"double"`.
21
+ * The `customForConfiguration` function on a field definition bridges this gap.
22
+ *
23
+ * This function walks the `mergedValues` array (the result of merging default options
24
+ * with user-provided configurations) and applies any `customForConfiguration` transform
25
+ * found in the corresponding `fields` element. It handles both configuration patterns:
26
+ *
27
+ * - **Primitive elements** (e.g., S1441's boolean → string mapping): the transform is
28
+ * called directly on the merged value.
29
+ * - **Object elements** (e.g., S6418's `randomnessSensibility` string → number): each
30
+ * named property within the object is checked individually, and only properties that
31
+ * define `customForConfiguration` are transformed.
32
+ *
33
+ * Values without a corresponding field definition or without `customForConfiguration`
34
+ * are passed through unchanged.
35
+ *
36
+ * @param fields - The rule's field definitions from its `config.ts` (may contain transforms)
37
+ * @param mergedValues - The merged configuration array (defaults + user overrides)
38
+ * @returns A new array with transformed values ready to pass to the ESLint rule
39
+ *
40
+ * @example
41
+ * // S1441: primitive transform (boolean → string)
42
+ * // fields[0] has customForConfiguration: (v) => v ? 'single' : 'double'
43
+ * applyTransformations(fields, [true, {avoidEscape: true}])
44
+ * // → ['single', {avoidEscape: true}]
45
+ *
46
+ * @example
47
+ * // S6418: object property transform (string → number)
48
+ * // fields[0][1] has customForConfiguration: (v) => Number(v)
49
+ * applyTransformations(fields, [{secretWords: 'api_key', randomnessSensibility: '5.0'}])
50
+ * // → [{secretWords: 'api_key', randomnessSensibility: 5}]
51
+ */
52
+ function applyTransformations(fields, mergedValues) {
53
+ if (!fields || !mergedValues) {
54
+ return mergedValues ?? [];
55
+ }
56
+ // Walk mergedValues in parallel with fields. Each position in the array
57
+ // corresponds to one element in the rule's config.ts `fields` definition.
58
+ // For example, S1441 fields = [primitive, object]:
59
+ // mergedValues[0] = true → fields[0] = { default: 'single', customForConfiguration: ... }
60
+ // mergedValues[1] = {avoidEscape} → fields[1] = [{field: 'avoidEscape', ...}, ...]
61
+ return mergedValues.map((mergedConfigEntry, index) => {
62
+ // Extra values beyond what fields defines (shouldn't happen, but safe to pass through)
63
+ if (index >= fields.length) {
64
+ return mergedConfigEntry;
65
+ }
66
+ const fieldDefinition = fields[index];
67
+ if (Array.isArray(fieldDefinition)) {
68
+ // ── Object config element ──
69
+ // fieldDefinition is an array of named properties: [{field, default, ...}, ...]
70
+ // mergedConfigEntry is an object: { fieldName: value, ... }
71
+ //
72
+ // Example — S6418 fields = [[ {field: 'secretWords', ...}, {field: 'randomnessSensibility', customForConfiguration: (v) => Number(v)} ]]
73
+ // mergedConfigEntry = { secretWords: 'api_key', randomnessSensibility: '5.0' }
74
+ // After transform: { secretWords: 'api_key', randomnessSensibility: 5 }
75
+ if (mergedConfigEntry &&
76
+ typeof mergedConfigEntry === 'object' &&
77
+ !Array.isArray(mergedConfigEntry)) {
78
+ const transformedEntry = { ...mergedConfigEntry };
79
+ for (const propertyDef of fieldDefinition) {
80
+ // Only transform properties that define customForConfiguration and are present in the object
81
+ if ('customForConfiguration' in propertyDef &&
82
+ typeof propertyDef.customForConfiguration === 'function' &&
83
+ propertyDef.field in transformedEntry) {
84
+ transformedEntry[propertyDef.field] = propertyDef.customForConfiguration(transformedEntry[propertyDef.field]);
85
+ }
86
+ }
87
+ return transformedEntry;
88
+ }
89
+ }
90
+ else if ('customForConfiguration' in fieldDefinition &&
91
+ typeof fieldDefinition.customForConfiguration === 'function') {
92
+ // ── Primitive config element with a transform ──
93
+ // fieldDefinition is a single property: { default, customForConfiguration, ... }
94
+ // mergedConfigEntry is a scalar value (string, number, boolean)
95
+ //
96
+ // Example — S1441 fieldDefinition = { default: 'single', customDefault: true, customForConfiguration: (v) => v ? 'single' : 'double' }
97
+ // mergedConfigEntry = true (boolean from SQ)
98
+ // After transform: 'single' (string expected by ESLint quotes rule)
99
+ return fieldDefinition.customForConfiguration(mergedConfigEntry);
100
+ }
101
+ // No transform defined for this element — pass through unchanged.
102
+ // This is the common case for most rules (e.g., S134 threshold, S100 format pattern).
103
+ return mergedConfigEntry;
104
+ });
105
+ }
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CookieFlagCheck = void 0;
4
- const index_js_1 = require("./index.js");
4
+ const location_js_1 = require("./location.js");
5
+ const ast_js_1 = require("./ast.js");
6
+ const module_js_1 = require("./module.js");
5
7
  class CookieFlagCheck {
6
8
  constructor(context, flag) {
7
9
  this.context = context;
@@ -13,7 +15,7 @@ class CookieFlagCheck {
13
15
  this.checkSensitiveCookieArgument(callExpression, 0);
14
16
  }
15
17
  checkCookiesMethodCall(callExpression) {
16
- if (!(0, index_js_1.isIdentifier)(callExpression.callee.property, 'set')) {
18
+ if (!(0, ast_js_1.isIdentifier)(callExpression.callee.property, 'set')) {
17
19
  return;
18
20
  }
19
21
  // Sensitive argument is third argument for "cookies.set" calls
@@ -25,12 +27,12 @@ class CookieFlagCheck {
25
27
  if (cookieProperty) {
26
28
  // csurf cookie property can be passed as a boolean literal,
27
29
  // in which case neither "secure" nor "httponly" are enabled by default
28
- const cookiePropertyLiteral = (0, index_js_1.getValueOfExpression)(this.context, cookieProperty.value, 'Literal');
30
+ const cookiePropertyLiteral = (0, ast_js_1.getValueOfExpression)(this.context, cookieProperty.value, 'Literal');
29
31
  if (cookiePropertyLiteral?.value === true) {
30
- (0, index_js_1.report)(this.context, {
32
+ (0, location_js_1.report)(this.context, {
31
33
  node: callExpression.callee,
32
34
  message: this.issueMessage,
33
- }, [(0, index_js_1.toSecondaryLocation)(cookiePropertyLiteral)]);
35
+ }, [(0, location_js_1.toSecondaryLocation)(cookiePropertyLiteral)]);
34
36
  }
35
37
  }
36
38
  }
@@ -43,7 +45,7 @@ class CookieFlagCheck {
43
45
  return;
44
46
  }
45
47
  const sensitiveArgument = callExpression.arguments[sensitiveArgumentIndex];
46
- const cookieObjectExpression = (0, index_js_1.getValueOfExpression)(this.context, sensitiveArgument, 'ObjectExpression');
48
+ const cookieObjectExpression = (0, ast_js_1.getValueOfExpression)(this.context, sensitiveArgument, 'ObjectExpression');
47
49
  if (!cookieObjectExpression) {
48
50
  return;
49
51
  }
@@ -54,15 +56,15 @@ class CookieFlagCheck {
54
56
  return;
55
57
  }
56
58
  const firstArgument = callExpression.arguments[argumentIndex];
57
- const objectExpression = (0, index_js_1.getValueOfExpression)(this.context, firstArgument, 'ObjectExpression');
59
+ const objectExpression = (0, ast_js_1.getValueOfExpression)(this.context, firstArgument, 'ObjectExpression');
58
60
  if (!objectExpression) {
59
61
  return;
60
62
  }
61
- const cookieProperty = (0, index_js_1.getProperty)(objectExpression, 'cookie', this.context);
63
+ const cookieProperty = (0, ast_js_1.getProperty)(objectExpression, 'cookie', this.context);
62
64
  if (!cookieProperty) {
63
65
  return;
64
66
  }
65
- const cookiePropertyValue = (0, index_js_1.getValueOfExpression)(this.context, cookieProperty.value, 'ObjectExpression');
67
+ const cookiePropertyValue = (0, ast_js_1.getValueOfExpression)(this.context, cookieProperty.value, 'ObjectExpression');
66
68
  if (cookiePropertyValue) {
67
69
  this.checkFlagOnCookieExpression(cookiePropertyValue, firstArgument, objectExpression, callExpression);
68
70
  return;
@@ -70,15 +72,15 @@ class CookieFlagCheck {
70
72
  return cookieProperty;
71
73
  }
72
74
  checkFlagOnCookieExpression(cookiePropertyValue, firstArgument, objectExpression, callExpression) {
73
- const flagProperty = (0, index_js_1.getProperty)(cookiePropertyValue, this.flag, this.context);
75
+ const flagProperty = (0, ast_js_1.getProperty)(cookiePropertyValue, this.flag, this.context);
74
76
  if (flagProperty) {
75
- const flagPropertyValue = (0, index_js_1.getValueOfExpression)(this.context, flagProperty.value, 'Literal');
77
+ const flagPropertyValue = (0, ast_js_1.getValueOfExpression)(this.context, flagProperty.value, 'Literal');
76
78
  if (flagPropertyValue?.value === false) {
77
- const secondaryLocations = [(0, index_js_1.toSecondaryLocation)(flagPropertyValue)];
79
+ const secondaryLocations = [(0, location_js_1.toSecondaryLocation)(flagPropertyValue)];
78
80
  if (firstArgument !== objectExpression) {
79
- secondaryLocations.push((0, index_js_1.toSecondaryLocation)(objectExpression));
81
+ secondaryLocations.push((0, location_js_1.toSecondaryLocation)(objectExpression));
80
82
  }
81
- (0, index_js_1.report)(this.context, {
83
+ (0, location_js_1.report)(this.context, {
82
84
  node: callExpression.callee,
83
85
  message: this.issueMessage,
84
86
  }, secondaryLocations);
@@ -88,7 +90,7 @@ class CookieFlagCheck {
88
90
  checkCookiesFromCallExpression(node) {
89
91
  const callExpression = node;
90
92
  const { callee } = callExpression;
91
- const fqn = (0, index_js_1.getFullyQualifiedName)(this.context, callee);
93
+ const fqn = (0, module_js_1.getFullyQualifiedName)(this.context, callee);
92
94
  if (fqn === 'cookie-session') {
93
95
  this.checkCookieSession(callExpression);
94
96
  return;
@@ -102,8 +104,8 @@ class CookieFlagCheck {
102
104
  return;
103
105
  }
104
106
  if (callee.type === 'MemberExpression') {
105
- const objectValue = (0, index_js_1.getValueOfExpression)(this.context, callee.object, 'NewExpression');
106
- if (objectValue && (0, index_js_1.getFullyQualifiedName)(this.context, objectValue.callee) === 'cookies') {
107
+ const objectValue = (0, ast_js_1.getValueOfExpression)(this.context, callee.object, 'NewExpression');
108
+ if (objectValue && (0, module_js_1.getFullyQualifiedName)(this.context, objectValue.callee) === 'cookies') {
107
109
  this.checkCookiesMethodCall(callExpression);
108
110
  }
109
111
  }
@@ -1,19 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
2
  /*
18
3
  * SonarQube JavaScript Plugin
19
4
  * Copyright (C) 2011-2025 SonarSource Sàrl
@@ -30,5 +15,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
30
15
  * You should have received a copy of the Sonar Source-Available License
31
16
  * along with this program; if not, see https://sonarsource.com/license/ssal/
32
17
  */
33
- __exportStar(require("./interceptor.js"), exports);
34
- __exportStar(require("./merger.js"), exports);
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.shannonEntropy = shannonEntropy;
20
+ function shannonEntropy(str) {
21
+ if (!str) {
22
+ return 0;
23
+ }
24
+ const len = str.length;
25
+ const occurrences = {};
26
+ for (const ch of str) {
27
+ occurrences[ch] = (occurrences[ch] ?? 0) + 1;
28
+ }
29
+ return (Object.values(occurrences)
30
+ .map(count => count / len)
31
+ .map(freq => -freq * Math.log(freq))
32
+ .reduce((acc, e) => acc + e, 0) / Math.log(2));
33
+ }
@@ -1,144 +1,143 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Express = void 0;
4
- const index_js_1 = require("./index.js");
3
+ exports.attemptFindAppInstantiation = attemptFindAppInstantiation;
4
+ exports.attemptFindAppInjection = attemptFindAppInjection;
5
+ exports.isUsingMiddleware = isUsingMiddleware;
6
+ exports.isMiddlewareInstance = isMiddlewareInstance;
7
+ exports.SensitiveMiddlewarePropertyRule = SensitiveMiddlewarePropertyRule;
8
+ const module_js_1 = require("./module.js");
9
+ const ast_js_1 = require("./ast.js");
10
+ const ancestor_js_1 = require("./ancestor.js");
11
+ const location_js_1 = require("./location.js");
5
12
  /**
6
13
  * This modules provides utilities for writing rules about Express.js.
7
14
  */
8
- var Express;
9
- (function (Express) {
10
- const EXPRESS = 'express';
11
- /**
12
- * Checks whether the declaration looks somewhat like `<id> = express()`
13
- * and returns `<id>` if it matches.
14
- */
15
- function attemptFindAppInstantiation(varDecl, context) {
16
- const rhs = varDecl.init;
17
- if (rhs?.type === 'CallExpression' && (0, index_js_1.getFullyQualifiedName)(context, rhs) === EXPRESS) {
18
- const pattern = varDecl.id;
19
- return pattern.type === 'Identifier' ? pattern : undefined;
20
- }
21
- return undefined;
15
+ const EXPRESS = 'express';
16
+ /**
17
+ * Checks whether the declaration looks somewhat like `<id> = express()`
18
+ * and returns `<id>` if it matches.
19
+ */
20
+ function attemptFindAppInstantiation(varDecl, context) {
21
+ const rhs = varDecl.init;
22
+ if (rhs?.type === 'CallExpression' && (0, module_js_1.getFullyQualifiedName)(context, rhs) === EXPRESS) {
23
+ const pattern = varDecl.id;
24
+ return pattern.type === 'Identifier' ? pattern : undefined;
22
25
  }
23
- Express.attemptFindAppInstantiation = attemptFindAppInstantiation;
24
- /**
25
- * Checks whether the function injects an instantiated app and is exported like `module.exports = function(app) {}`
26
- * or `module.exports.property = function(app) {}`, and returns app if it matches.
27
- */
28
- function attemptFindAppInjection(functionDef, context, node) {
29
- const app = functionDef.params.find(param => param.type === 'Identifier' && param.name === 'app');
30
- if (app) {
31
- const parent = (0, index_js_1.getParent)(context, node);
32
- if (parent?.type === 'AssignmentExpression') {
33
- const { left } = parent;
34
- if (left.type === 'MemberExpression' &&
35
- ((0, index_js_1.isModuleExports)(left) || (0, index_js_1.isModuleExports)(left.object))) {
36
- return app;
37
- }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * Checks whether the function injects an instantiated app and is exported like `module.exports = function(app) {}`
30
+ * or `module.exports.property = function(app) {}`, and returns app if it matches.
31
+ */
32
+ function attemptFindAppInjection(functionDef, context, node) {
33
+ const app = functionDef.params.find(param => param.type === 'Identifier' && param.name === 'app');
34
+ if (app) {
35
+ const parent = (0, ancestor_js_1.getParent)(context, node);
36
+ if (parent?.type === 'AssignmentExpression') {
37
+ const { left } = parent;
38
+ if (left.type === 'MemberExpression' &&
39
+ ((0, ast_js_1.isModuleExports)(left) || (0, ast_js_1.isModuleExports)(left.object))) {
40
+ return app;
38
41
  }
39
42
  }
40
- return undefined;
41
43
  }
42
- Express.attemptFindAppInjection = attemptFindAppInjection;
43
- /**
44
- * Checks whether the expression looks somewhat like `app.use(m1, [m2, m3], ..., mN)`,
45
- * where one of `mK`-nodes satisfies the given predicate.
46
- */
47
- function isUsingMiddleware(context, callExpression, app, middlewareNodePredicate) {
48
- if ((0, index_js_1.isMethodInvocation)(callExpression, app.name, 'use', 1)) {
49
- const flattenedArgs = (0, index_js_1.flattenArgs)(context, callExpression.arguments);
50
- return flattenedArgs.some(middlewareNodePredicate);
51
- }
52
- return false;
44
+ return undefined;
45
+ }
46
+ /**
47
+ * Checks whether the expression looks somewhat like `app.use(m1, [m2, m3], ..., mN)`,
48
+ * where one of `mK`-nodes satisfies the given predicate.
49
+ */
50
+ function isUsingMiddleware(context, callExpression, app, middlewareNodePredicate) {
51
+ if ((0, ast_js_1.isMethodInvocation)(callExpression, app.name, 'use', 1)) {
52
+ const flattenedArgs = (0, ast_js_1.flattenArgs)(context, callExpression.arguments);
53
+ return flattenedArgs.some(middlewareNodePredicate);
53
54
  }
54
- Express.isUsingMiddleware = isUsingMiddleware;
55
- /**
56
- * Checks whether a node looks somewhat like `require('m')()` for
57
- * some middleware `m` from the list of middlewares.
58
- */
59
- function isMiddlewareInstance(context, middlewares, n) {
60
- if (n.type === 'CallExpression') {
61
- const fqn = (0, index_js_1.getFullyQualifiedName)(context, n);
62
- return fqn !== null && middlewares.includes(fqn);
63
- }
64
- return false;
55
+ return false;
56
+ }
57
+ /**
58
+ * Checks whether a node looks somewhat like `require('m')()` for
59
+ * some middleware `m` from the list of middlewares.
60
+ */
61
+ function isMiddlewareInstance(context, middlewares, n) {
62
+ if (n.type === 'CallExpression') {
63
+ const fqn = (0, module_js_1.getFullyQualifiedName)(context, n);
64
+ return fqn !== null && middlewares.includes(fqn);
65
65
  }
66
- Express.isMiddlewareInstance = isMiddlewareInstance;
67
- /**
68
- * Rule factory for detecting sensitive settings that are passed to
69
- * middlewares eventually used by Express.js applications:
70
- *
71
- * app.use(
72
- * middleware(settings)
73
- * )
74
- *
75
- * or
76
- *
77
- * app.use(
78
- * middleware.method(settings)
79
- * )
80
- *
81
- * @param sensitivePropertyFinder - a function looking for a sensitive setting on a middleware call
82
- * @param message - the reported message when an issue is raised
83
- * @param meta - the rule metadata
84
- * @returns a rule module that raises issues when a sensitive property is found
85
- */
86
- function SensitiveMiddlewarePropertyRule(sensitivePropertyFinder, message, meta = {}) {
87
- return {
88
- meta,
89
- create(context) {
90
- let app;
91
- let sensitiveProperties;
92
- function isExposing(middlewareNode) {
93
- return Boolean(sensitiveProperties.push(...findSensitiveProperty(middlewareNode)));
94
- }
95
- function findSensitiveProperty(middlewareNode) {
96
- if (middlewareNode.type === 'CallExpression') {
97
- return sensitivePropertyFinder(context, middlewareNode);
98
- }
99
- return [];
66
+ return false;
67
+ }
68
+ /**
69
+ * Rule factory for detecting sensitive settings that are passed to
70
+ * middlewares eventually used by Express.js applications:
71
+ *
72
+ * app.use(
73
+ * middleware(settings)
74
+ * )
75
+ *
76
+ * or
77
+ *
78
+ * app.use(
79
+ * middleware.method(settings)
80
+ * )
81
+ *
82
+ * @param sensitivePropertyFinder - a function looking for a sensitive setting on a middleware call
83
+ * @param message - the reported message when an issue is raised
84
+ * @param meta - the rule metadata
85
+ * @returns a rule module that raises issues when a sensitive property is found
86
+ */
87
+ function SensitiveMiddlewarePropertyRule(sensitivePropertyFinder, message, meta = {}) {
88
+ return {
89
+ meta,
90
+ create(context) {
91
+ let app;
92
+ let sensitiveProperties;
93
+ function isExposing(middlewareNode) {
94
+ return Boolean(sensitiveProperties.push(...findSensitiveProperty(middlewareNode)));
95
+ }
96
+ function findSensitiveProperty(middlewareNode) {
97
+ if (middlewareNode.type === 'CallExpression') {
98
+ return sensitivePropertyFinder(context, middlewareNode);
100
99
  }
101
- return {
102
- Program: () => {
103
- app = null;
104
- sensitiveProperties = [];
105
- },
106
- CallExpression: (node) => {
107
- if (app) {
108
- const callExpr = node;
109
- const isSafe = !isUsingMiddleware(context, callExpr, app, isExposing);
110
- if (!isSafe) {
111
- for (const sensitive of sensitiveProperties) {
112
- (0, index_js_1.report)(context, {
113
- node: callExpr,
114
- message,
115
- }, [(0, index_js_1.toSecondaryLocation)(sensitive)]);
116
- }
117
- sensitiveProperties = [];
100
+ return [];
101
+ }
102
+ return {
103
+ Program: () => {
104
+ app = null;
105
+ sensitiveProperties = [];
106
+ },
107
+ CallExpression: (node) => {
108
+ if (app) {
109
+ const callExpr = node;
110
+ const isSafe = !isUsingMiddleware(context, callExpr, app, isExposing);
111
+ if (!isSafe) {
112
+ for (const sensitive of sensitiveProperties) {
113
+ (0, location_js_1.report)(context, {
114
+ node: callExpr,
115
+ message,
116
+ }, [(0, location_js_1.toSecondaryLocation)(sensitive)]);
118
117
  }
118
+ sensitiveProperties = [];
119
119
  }
120
- },
121
- VariableDeclarator: (node) => {
122
- if (!app) {
123
- const varDecl = node;
124
- const instantiatedApp = attemptFindAppInstantiation(varDecl, context);
125
- if (instantiatedApp) {
126
- app = instantiatedApp;
127
- }
120
+ }
121
+ },
122
+ VariableDeclarator: (node) => {
123
+ if (!app) {
124
+ const varDecl = node;
125
+ const instantiatedApp = attemptFindAppInstantiation(varDecl, context);
126
+ if (instantiatedApp) {
127
+ app = instantiatedApp;
128
128
  }
129
- },
130
- ':function': (node) => {
131
- if (!app) {
132
- const functionDef = node;
133
- const injectedApp = attemptFindAppInjection(functionDef, context, node);
134
- if (injectedApp) {
135
- app = injectedApp;
136
- }
129
+ }
130
+ },
131
+ ':function': (node) => {
132
+ if (!app) {
133
+ const functionDef = node;
134
+ const injectedApp = attemptFindAppInjection(functionDef, context, node);
135
+ if (injectedApp) {
136
+ app = injectedApp;
137
137
  }
138
- },
139
- };
140
- },
141
- };
142
- }
143
- Express.SensitiveMiddlewarePropertyRule = SensitiveMiddlewarePropertyRule;
144
- })(Express || (exports.Express = Express = {}));
138
+ }
139
+ },
140
+ };
141
+ },
142
+ };
143
+ }
@@ -4,22 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.patternInParentsCache = void 0;
7
- /*
8
- * SonarQube JavaScript Plugin
9
- * Copyright (C) 2011-2025 SonarSource Sàrl
10
- * mailto:info AT sonarsource DOT com
11
- *
12
- * This program is free software; you can redistribute it and/or
13
- * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA.
14
- *
15
- * This program is distributed in the hope that it will be useful,
16
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
- * See the Sonar Source-Available License for more details.
19
- *
20
- * You should have received a copy of the Sonar Source-Available License
21
- * along with this program; if not, see https://sonarsource.com/license/ssal/
22
- */
23
7
  const find_minimatch_js_1 = require("./find-minimatch.js");
24
8
  const files_js_1 = require("../files.js");
25
9
  const cache_js_1 = require("../cache.js");